0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
0050: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 .** This file is
0060: 20 61 6e 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e an amalgamation
0070: 20 6f 66 20 6d 61 6e 79 20 73 65 70 61 72 61 74 of many separat
0080: 65 20 43 20 73 6f 75 72 63 65 20 66 69 6c 65 73 e C source files
0090: 20 66 72 6f 6d 20 53 51 4c 69 74 65 0d 0a 2a 2a from SQLite..**
00a0: 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 31 30 2e version 3.7.10.
00b0: 20 20 42 79 20 63 6f 6d 62 69 6e 69 6e 67 20 61 By combining a
00c0: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 ll the individua
00d0: 6c 20 43 20 63 6f 64 65 20 66 69 6c 65 73 20 69 l C code files i
00e0: 6e 74 6f 20 74 68 69 73 20 0d 0a 2a 2a 20 73 69 nto this ..** si
00f0: 6e 67 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 2c ngle large file,
0100: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 64 65 the entire code
0110: 20 63 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65 64 can be compiled
0120: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 74 72 61 as a single tra
0130: 6e 73 6c 61 74 69 6f 6e 0d 0a 2a 2a 20 75 6e 69 nslation..** uni
0140: 74 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 t. This allows
0150: 6d 61 6e 79 20 63 6f 6d 70 69 6c 65 72 73 20 74 many compilers t
0160: 6f 20 64 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f o do optimizatio
0170: 6e 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f ns that would no
0180: 74 20 62 65 0d 0a 2a 2a 20 70 6f 73 73 69 62 6c t be..** possibl
0190: 65 20 69 66 20 74 68 65 20 66 69 6c 65 73 20 77 e if the files w
01a0: 65 72 65 20 63 6f 6d 70 69 6c 65 64 20 73 65 70 ere compiled sep
01b0: 61 72 61 74 65 6c 79 2e 20 20 50 65 72 66 6f 72 arately. Perfor
01c0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e mance improvemen
01d0: 74 73 0d 0a 2a 2a 20 6f 66 20 35 25 20 6f 72 20 ts..** of 5% or
01e0: 6d 6f 72 65 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c more are commonl
01f0: 79 20 73 65 65 6e 20 77 68 65 6e 20 53 51 4c 69 y seen when SQLi
0200: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61 te is compiled a
0210: 73 20 61 20 73 69 6e 67 6c 65 0d 0a 2a 2a 20 74 s a single..** t
0220: 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 2e ranslation unit.
0230: 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 ..**..** This fi
0240: 6c 65 20 69 73 20 61 6c 6c 20 79 6f 75 20 6e 65 le is all you ne
0250: 65 64 20 74 6f 20 63 6f 6d 70 69 6c 65 20 53 51 ed to compile SQ
0260: 4c 69 74 65 2e 20 20 54 6f 20 75 73 65 20 53 51 Lite. To use SQ
0270: 4c 69 74 65 20 69 6e 20 6f 74 68 65 72 0d 0a 2a Lite in other..*
0280: 2a 20 70 72 6f 67 72 61 6d 73 2c 20 79 6f 75 20 * programs, you
0290: 6e 65 65 64 20 74 68 69 73 20 66 69 6c 65 20 61 need this file a
02a0: 6e 64 20 74 68 65 20 22 73 71 6c 69 74 65 33 2e nd the "sqlite3.
02b0: 68 22 20 68 65 61 64 65 72 20 66 69 6c 65 20 74 h" header file t
02c0: 68 61 74 20 64 65 66 69 6e 65 73 0d 0a 2a 2a 20 hat defines..**
02d0: 74 68 65 20 70 72 6f 67 72 61 6d 6d 69 6e 67 20 the programming
02e0: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 interface to the
02f0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e SQLite library.
0300: 20 20 28 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 (If you do not
0310: 20 68 61 76 65 20 0d 0a 2a 2a 20 74 68 65 20 22 have ..** the "
0320: 73 71 6c 69 74 65 33 2e 68 22 20 68 65 61 64 65 sqlite3.h" heade
0330: 72 20 66 69 6c 65 20 61 74 20 68 61 6e 64 2c 20 r file at hand,
0340: 79 6f 75 20 77 69 6c 6c 20 66 69 6e 64 20 61 20 you will find a
0350: 63 6f 70 79 20 65 6d 62 65 64 64 65 64 20 77 69 copy embedded wi
0360: 74 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 74 65 78 thin..** the tex
0370: 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 20 t of this file.
0380: 20 53 65 61 72 63 68 20 66 6f 72 20 22 42 65 67 Search for "Beg
0390: 69 6e 20 66 69 6c 65 20 73 71 6c 69 74 65 33 2e in file sqlite3.
03a0: 68 22 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 h" to find the s
03b0: 74 61 72 74 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 tart..** of the
03c0: 65 6d 62 65 64 64 65 64 20 73 71 6c 69 74 65 33 embedded sqlite3
03d0: 2e 68 20 68 65 61 64 65 72 20 66 69 6c 65 2e 29 .h header file.)
03e0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 Additional code
03f0: 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 65 files may be ne
0400: 65 64 65 64 0d 0a 2a 2a 20 69 66 20 79 6f 75 20 eded..** if you
0410: 77 61 6e 74 20 61 20 77 72 61 70 70 65 72 20 74 want a wrapper t
0420: 6f 20 69 6e 74 65 72 66 61 63 65 20 53 51 4c 69 o interface SQLi
0430: 74 65 20 77 69 74 68 20 79 6f 75 72 20 63 68 6f te with your cho
0440: 69 63 65 20 6f 66 20 70 72 6f 67 72 61 6d 6d 69 ice of programmi
0450: 6e 67 0d 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 2e ng..** language.
0460: 20 54 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 The code for th
0470: 65 20 22 73 71 6c 69 74 65 33 22 20 63 6f 6d 6d e "sqlite3" comm
0480: 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 20 69 and-line shell i
0490: 73 20 61 6c 73 6f 20 69 6e 20 61 0d 0a 2a 2a 20 s also in a..**
04a0: 73 65 70 61 72 61 74 65 20 66 69 6c 65 2e 20 54 separate file. T
04b0: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e his file contain
04c0: 73 20 6f 6e 6c 79 20 63 6f 64 65 20 66 6f 72 20 s only code for
04d0: 74 68 65 20 63 6f 72 65 20 53 51 4c 69 74 65 20 the core SQLite
04e0: 6c 69 62 72 61 72 79 2e 0d 0a 2a 2f 0d 0a 23 64 library...*/..#d
04f0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 4f 52 efine SQLITE_COR
0500: 45 20 31 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c E 1..#define SQL
0510: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e ITE_AMALGAMATION
0520: 20 31 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 1..#ifndef SQLI
0530: 54 45 5f 50 52 49 56 41 54 45 0d 0a 23 20 64 65 TE_PRIVATE..# de
0540: 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 52 49 56 fine SQLITE_PRIV
0550: 41 54 45 20 73 74 61 74 69 63 0d 0a 23 65 6e 64 ATE static..#end
0560: 69 66 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 if..#ifndef SQLI
0570: 54 45 5f 41 50 49 0d 0a 23 20 64 65 66 69 6e 65 TE_API..# define
0580: 20 53 51 4c 49 54 45 5f 41 50 49 0d 0a 23 65 6e SQLITE_API..#en
0590: 64 69 66 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a dif../**********
05a0: 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
05b0: 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a sqliteInt.h ****
05c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
05d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
05e0: 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
05f0: 31 20 53 65 70 74 65 6d 62 65 72 20 31 35 0d 0a 1 September 15..
0600: 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f **..** The autho
0610: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 r disclaims copy
0620: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f right to this so
0630: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 urce code. In p
0640: 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 lace of..** a le
0650: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 gal notice, here
0660: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d is a blessing:.
0670: 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 .**..** May y
0680: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e ou do good and n
0690: 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 ot evil...**
06a0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 May you find for
06b0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 giveness for you
06c0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 rself and forgiv
06d0: 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 e others...**
06e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 May you share f
06f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b reely, never tak
0700: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f ing more than yo
0710: 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a u give...**..***
0720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0760: 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 ******..** Inter
0770: 6e 61 6c 20 69 6e 74 65 72 66 61 63 65 20 64 65 nal interface de
0780: 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 53 51 finitions for SQ
0790: 4c 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 23 Lite...**..*/..#
07a0: 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 45 49 4e ifndef _SQLITEIN
07b0: 54 5f 48 5f 0d 0a 23 64 65 66 69 6e 65 20 5f 53 T_H_..#define _S
07c0: 51 4c 49 54 45 49 4e 54 5f 48 5f 0d 0a 0d 0a 2f QLITEINT_H_..../
07d0: 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 *..** These #def
07e0: 69 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 ines should enab
07f0: 6c 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 le >2GB file sup
0800: 70 6f 72 74 20 6f 6e 20 50 4f 53 49 58 20 69 66 port on POSIX if
0810: 20 74 68 65 0d 0a 2a 2a 20 75 6e 64 65 72 6c 79 the..** underly
0820: 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 ing operating sy
0830: 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 stem supports it
0840: 2e 20 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 . If the OS lac
0850: 6b 73 0d 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c ks..** large fil
0860: 65 20 73 75 70 70 6f 72 74 2c 20 6f 72 20 69 66 e support, or if
0870: 20 74 68 65 20 4f 53 20 69 73 20 77 69 6e 64 6f the OS is windo
0880: 77 73 2c 20 74 68 65 73 65 20 73 68 6f 75 6c 64 ws, these should
0890: 20 62 65 20 6e 6f 2d 6f 70 73 2e 0d 0a 2a 2a 0d be no-ops...**.
08a0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 37 33 39 .** Ticket #2739
08b0: 3a 20 20 54 68 65 20 5f 4c 41 52 47 45 46 49 4c : The _LARGEFIL
08c0: 45 5f 53 4f 55 52 43 45 20 6d 61 63 72 6f 20 6d E_SOURCE macro m
08d0: 75 73 74 20 61 70 70 65 61 72 20 62 65 66 6f 72 ust appear befor
08e0: 65 20 61 6e 79 0d 0a 2a 2a 20 73 79 73 74 65 6d e any..** system
08f0: 20 23 69 6e 63 6c 75 64 65 73 2e 20 20 48 65 6e #includes. Hen
0900: 63 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f ce, this block o
0910: 66 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 74 f code must be t
0920: 68 65 20 76 65 72 79 20 66 69 72 73 74 0d 0a 2a he very first..*
0930: 2a 20 63 6f 64 65 20 69 6e 20 61 6c 6c 20 73 6f * code in all so
0940: 75 72 63 65 20 66 69 6c 65 73 2e 0d 0a 2a 2a 0d urce files...**.
0950: 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 .** Large file s
0960: 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 upport can be di
0970: 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 sabled using the
0980: 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c -DSQLITE_DISABL
0990: 45 5f 4c 46 53 20 73 77 69 74 63 68 0d 0a 2a 2a E_LFS switch..**
09a0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 on the compiler
09b0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 command line.
09c0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 This is necessar
09d0: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d y if you are com
09e0: 70 69 6c 69 6e 67 0d 0a 2a 2a 20 6f 6e 20 61 20 piling..** on a
09f0: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 recent machine (
0a00: 65 78 3a 20 52 65 64 20 48 61 74 20 37 2e 32 29 ex: Red Hat 7.2)
0a10: 20 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f but you want yo
0a20: 75 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0d ur code to work.
0a30: 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 .** on an older
0a40: 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 machine (ex: Red
0a50: 20 48 61 74 20 36 2e 30 29 2e 20 20 49 66 20 79 Hat 6.0). If y
0a60: 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 ou compile on Re
0a70: 64 20 48 61 74 20 37 2e 32 0d 0a 2a 2a 20 77 69 d Hat 7.2..** wi
0a80: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f thout this optio
0a90: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65 n, LFS is enable
0aa0: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20 . But LFS does
0ab0: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65 not exist in the
0ac0: 20 6b 65 72 6e 65 6c 0d 0a 2a 2a 20 69 6e 20 52 kernel..** in R
0ad0: 65 64 20 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 ed Hat 6.0, so t
0ae0: 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f he code won't wo
0af0: 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 rk. Hence, for
0b00: 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79 0d 0a maximum binary..
0b10: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 79 ** portability y
0b20: 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c ou should omit L
0b30: 46 53 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 69 6d 69 FS...**..** Simi
0b40: 6c 61 72 20 69 73 20 74 72 75 65 20 66 6f 72 20 lar is true for
0b50: 4d 61 63 20 4f 53 20 58 2e 20 20 4c 46 53 20 69 Mac OS X. LFS i
0b60: 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 s only supported
0b70: 20 6f 6e 20 4d 61 63 20 4f 53 20 58 20 39 20 61 on Mac OS X 9 a
0b80: 6e 64 20 6c 61 74 65 72 2e 0d 0a 2a 2f 0d 0a 23 nd later...*/..#
0b90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 ifndef SQLITE_DI
0ba0: 53 41 42 4c 45 5f 4c 46 53 0d 0a 23 20 64 65 66 SABLE_LFS..# def
0bb0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 ine _LARGE_FILE
0bc0: 20 20 20 20 20 20 31 0d 0a 23 20 69 66 6e 64 65 1..# ifnde
0bd0: 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 f _FILE_OFFSET_B
0be0: 49 54 53 0d 0a 23 20 20 20 64 65 66 69 6e 65 20 ITS..# define
0bf0: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 _FILE_OFFSET_BIT
0c00: 53 20 36 34 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 S 64..# endif..#
0c10: 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 define _LARGEFI
0c20: 4c 45 5f 53 4f 55 52 43 45 20 31 0d 0a 23 65 6e LE_SOURCE 1..#en
0c30: 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e dif..../*..** In
0c40: 63 6c 75 64 65 20 74 68 65 20 63 6f 6e 66 69 67 clude the config
0c50: 75 72 61 74 69 6f 6e 20 68 65 61 64 65 72 20 6f uration header o
0c60: 75 74 70 75 74 20 62 79 20 27 63 6f 6e 66 69 67 utput by 'config
0c70: 75 72 65 27 20 69 66 20 77 65 27 72 65 20 75 73 ure' if we're us
0c80: 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 61 75 74 6f ing the..** auto
0c90: 63 6f 6e 66 2d 62 61 73 65 64 20 62 75 69 6c 64 conf-based build
0ca0: 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 5f 48 41 ..*/..#ifdef _HA
0cb0: 56 45 5f 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 VE_SQLITE_CONFIG
0cc0: 5f 48 0d 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f _H..#include "co
0cd0: 6e 66 69 67 2e 68 22 0d 0a 23 65 6e 64 69 66 0d nfig.h"..#endif.
0ce0: 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
0cf0: 2a 2a 20 49 6e 63 6c 75 64 65 20 73 71 6c 69 74 ** Include sqlit
0d00: 65 4c 69 6d 69 74 2e 68 20 69 6e 20 74 68 65 20 eLimit.h in the
0d10: 6d 69 64 64 6c 65 20 6f 66 20 73 71 6c 69 74 65 middle of sqlite
0d20: 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a Int.h **********
0d30: 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */../***********
0d40: 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 73 *** Begin file s
0d50: 71 6c 69 74 65 4c 69 6d 69 74 2e 68 20 2a 2a 2a qliteLimit.h ***
0d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d80: 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 37 **/../*..** 2007
0d90: 20 4d 61 79 20 37 0d 0a 2a 2a 0d 0a 2a 2a 20 54 May 7..**..** T
0da0: 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 he author discla
0db0: 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f ims copyright to
0dc0: 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 this source cod
0dd0: 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d e. In place of.
0de0: 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 .** a legal noti
0df0: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c ce, here is a bl
0e00: 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 essing:..**..**
0e10: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f May you do go
0e20: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e od and not evil.
0e30: 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
0e40: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 find forgiveness
0e50: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e for yourself an
0e60: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 d forgive others
0e70: 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
0e80: 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e share freely, n
0e90: 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 ever taking more
0ea0: 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d than you give..
0eb0: 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .**..***********
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a **************..
0f00: 2a 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c ** ..** This fil
0f10: 65 20 64 65 66 69 6e 65 73 20 76 61 72 69 6f 75 e defines variou
0f20: 73 20 6c 69 6d 69 74 73 20 6f 66 20 77 68 61 74 s limits of what
0f30: 20 53 51 4c 69 74 65 20 63 61 6e 20 70 72 6f 63 SQLite can proc
0f40: 65 73 73 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a ess...*/..../*..
0f50: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c ** The maximum l
0f60: 65 6e 67 74 68 20 6f 66 20 61 20 54 45 58 54 20 ength of a TEXT
0f70: 6f 72 20 42 4c 4f 42 20 69 6e 20 62 79 74 65 73 or BLOB in bytes
0f80: 2e 20 20 20 54 68 69 73 20 61 6c 73 6f 0d 0a 2a . This also..*
0f90: 2a 20 6c 69 6d 69 74 73 20 74 68 65 20 73 69 7a * limits the siz
0fa0: 65 20 6f 66 20 61 20 72 6f 77 20 69 6e 20 61 20 e of a row in a
0fb0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0d table or index..
0fc0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 68 61 72 64 .**..** The hard
0fd0: 20 6c 69 6d 69 74 20 69 73 20 74 68 65 20 61 62 limit is the ab
0fe0: 69 6c 69 74 79 20 6f 66 20 61 20 33 32 2d 62 69 ility of a 32-bi
0ff0: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 t signed integer
1000: 0d 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 74 68 ..** to count th
1010: 65 20 73 69 7a 65 3a 20 32 5e 33 31 2d 31 20 6f e size: 2^31-1 o
1020: 72 20 32 31 34 37 34 38 33 36 34 37 2e 0d 0a 2a r 2147483647...*
1030: 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
1040: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0d 0a 23 20 E_MAX_LENGTH..#
1050: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 define SQLITE_MA
1060: 58 5f 4c 45 4e 47 54 48 20 31 30 30 30 30 30 30 X_LENGTH 1000000
1070: 30 30 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 000..#endif..../
1080: 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 *..** This is th
1090: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 e maximum number
10a0: 20 6f 66 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 2a of..**..** *
10b0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 74 61 Columns in a ta
10c0: 62 6c 65 0d 0a 2a 2a 20 20 20 20 2a 20 43 6f 6c ble..** * Col
10d0: 75 6d 6e 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 umns in an index
10e0: 0d 0a 2a 2a 20 20 20 20 2a 20 43 6f 6c 75 6d 6e ..** * Column
10f0: 73 20 69 6e 20 61 20 76 69 65 77 0d 0a 2a 2a 20 s in a view..**
1100: 20 20 20 2a 20 54 65 72 6d 73 20 69 6e 20 74 68 * Terms in th
1110: 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20 e SET clause of
1120: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d an UPDATE statem
1130: 65 6e 74 0d 0a 2a 2a 20 20 20 20 2a 20 54 65 72 ent..** * Ter
1140: 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ms in the result
1150: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 set of a SELECT
1160: 20 73 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 20 statement..**
1170: 20 20 2a 20 54 65 72 6d 73 20 69 6e 20 74 68 65 * Terms in the
1180: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 4f 52 44 GROUP BY or ORD
1190: 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 6f 66 ER BY clauses of
11a0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d a SELECT statem
11b0: 65 6e 74 2e 0d 0a 2a 2a 20 20 20 20 2a 20 54 65 ent...** * Te
11c0: 72 6d 73 20 69 6e 20 74 68 65 20 56 41 4c 55 45 rms in the VALUE
11d0: 53 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 49 S clause of an I
11e0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 0d NSERT statement.
11f0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 68 61 72 64 .**..** The hard
1200: 20 75 70 70 65 72 20 6c 69 6d 69 74 20 68 65 72 upper limit her
1210: 65 20 69 73 20 33 32 36 37 36 2e 20 20 4d 6f 73 e is 32676. Mos
1220: 74 20 64 61 74 61 62 61 73 65 20 70 65 6f 70 6c t database peopl
1230: 65 20 77 69 6c 6c 0d 0a 2a 2a 20 74 65 6c 6c 20 e will..** tell
1240: 79 6f 75 20 74 68 61 74 20 69 6e 20 61 20 77 65 you that in a we
1250: 6c 6c 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 64 61 ll-normalized da
1260: 74 61 62 61 73 65 2c 20 79 6f 75 20 75 73 75 61 tabase, you usua
1270: 6c 6c 79 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 6e lly should..** n
1280: 6f 74 20 68 61 76 65 20 6d 6f 72 65 20 74 68 61 ot have more tha
1290: 6e 20 61 20 64 6f 7a 65 6e 20 6f 72 20 73 6f 20 n a dozen or so
12a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6e 79 20 74 columns in any t
12b0: 61 62 6c 65 2e 20 20 41 6e 64 20 69 66 0d 0a 2a able. And if..*
12c0: 2a 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 * that is the ca
12d0: 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 se, there is no
12e0: 70 6f 69 6e 74 20 69 6e 20 68 61 76 69 6e 67 20 point in having
12f0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 66 65 77 0d more than a few.
1300: 0a 2a 2a 20 64 6f 7a 65 6e 20 76 61 6c 75 65 73 .** dozen values
1310: 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f in any of the o
1320: 74 68 65 72 20 73 69 74 75 61 74 69 6f 6e 73 20 ther situations
1330: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e described above.
1340: 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 ..*/..#ifndef SQ
1350: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0d LITE_MAX_COLUMN.
1360: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 .# define SQLITE
1370: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 32 30 30 30 _MAX_COLUMN 2000
1380: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
1390: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c ** The maximum l
13a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 69 6e 67 6c ength of a singl
13b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 e SQL statement
13c0: 69 6e 20 62 79 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a in bytes...**..*
13d0: 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 * It used to be
13e0: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 73 65 the case that se
13f0: 74 74 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 tting this value
1400: 20 74 6f 20 7a 65 72 6f 20 77 6f 75 6c 64 0d 0a to zero would..
1410: 2a 2a 20 74 75 72 6e 20 74 68 65 20 6c 69 6d 69 ** turn the limi
1420: 74 20 6f 66 66 2e 20 20 54 68 61 74 20 69 73 20 t off. That is
1430: 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 65 2e 20 no longer true.
1440: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 It is not possi
1450: 62 6c 65 0d 0a 2a 2a 20 74 6f 20 74 75 72 6e 20 ble..** to turn
1460: 74 68 69 73 20 6c 69 6d 69 74 20 6f 66 66 2e 0d this limit off..
1470: 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
1480: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 ITE_MAX_SQL_LENG
1490: 54 48 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c TH..# define SQL
14a0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 ITE_MAX_SQL_LENG
14b0: 54 48 20 31 30 30 30 30 30 30 30 30 30 0d 0a 23 TH 1000000000..#
14c0: 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
14d0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70 74 The maximum dept
14e0: 68 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 h of an expressi
14f0: 6f 6e 20 74 72 65 65 2e 20 54 68 69 73 20 69 73 on tree. This is
1500: 20 6c 69 6d 69 74 65 64 20 74 6f 20 0d 0a 2a 2a limited to ..**
1510: 20 73 6f 6d 65 20 65 78 74 65 6e 74 20 62 79 20 some extent by
1520: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c SQLITE_MAX_SQL_L
1530: 45 4e 47 54 48 2e 20 42 75 74 20 73 6f 6d 65 74 ENGTH. But somet
1540: 69 6d 65 20 79 6f 75 20 6d 69 67 68 74 20 0d 0a ime you might ..
1550: 2a 2a 20 77 61 6e 74 20 74 6f 20 70 6c 61 63 65 ** want to place
1560: 20 6d 6f 72 65 20 73 65 76 65 72 65 20 6c 69 6d more severe lim
1570: 69 74 73 20 6f 6e 20 74 68 65 20 63 6f 6d 70 6c its on the compl
1580: 65 78 69 74 79 20 6f 66 20 61 6e 20 0d 0a 2a 2a exity of an ..**
1590: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0d 0a 2a 2a expression...**
15a0: 0d 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 ..** A value of
15b0: 30 20 75 73 65 64 20 74 6f 20 6d 65 61 6e 20 74 0 used to mean t
15c0: 68 61 74 20 74 68 65 20 6c 69 6d 69 74 20 77 61 hat the limit wa
15d0: 73 20 6e 6f 74 20 65 6e 66 6f 72 63 65 64 2e 0d s not enforced..
15e0: 0a 2a 2a 20 42 75 74 20 74 68 61 74 20 69 73 20 .** But that is
15f0: 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 65 2e 20 no longer true.
1600: 20 54 68 65 20 6c 69 6d 69 74 20 69 73 20 6e 6f The limit is no
1610: 77 20 73 74 72 69 63 74 6c 79 20 65 6e 66 6f 72 w strictly enfor
1620: 63 65 64 0d 0a 2a 2a 20 61 74 20 61 6c 6c 20 74 ced..** at all t
1630: 69 6d 65 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 imes...*/..#ifnd
1640: 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 ef SQLITE_MAX_EX
1650: 50 52 5f 44 45 50 54 48 0d 0a 23 20 64 65 66 69 PR_DEPTH..# defi
1660: 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 ne SQLITE_MAX_EX
1670: 50 52 5f 44 45 50 54 48 20 31 30 30 30 0d 0a 23 PR_DEPTH 1000..#
1680: 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
1690: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 The maximum numb
16a0: 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 er of terms in a
16b0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 compound SELECT
16c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2a 20 statement...**
16d0: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 The code generat
16e0: 6f 72 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 or for compound
16f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 SELECT statement
1700: 73 20 64 6f 65 73 20 6f 6e 65 0d 0a 2a 2a 20 6c s does one..** l
1710: 65 76 65 6c 20 6f 66 20 72 65 63 75 72 73 69 6f evel of recursio
1720: 6e 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 2e n for each term.
1730: 20 20 41 20 73 74 61 63 6b 20 6f 76 65 72 66 6c A stack overfl
1740: 6f 77 20 63 61 6e 20 72 65 73 75 6c 74 0d 0a 2a ow can result..*
1750: 2a 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 * if the number
1760: 6f 66 20 74 65 72 6d 73 20 69 73 20 74 6f 6f 20 of terms is too
1770: 6c 61 72 67 65 2e 20 20 49 6e 20 70 72 61 63 74 large. In pract
1780: 69 63 65 2c 20 6d 6f 73 74 20 53 51 4c 0d 0a 2a ice, most SQL..*
1790: 2a 20 6e 65 76 65 72 20 68 61 73 20 6d 6f 72 65 * never has more
17a0: 20 74 68 61 6e 20 33 20 6f 72 20 34 20 74 65 72 than 3 or 4 ter
17b0: 6d 73 2e 20 20 55 73 65 20 61 20 76 61 6c 75 65 ms. Use a value
17c0: 20 6f 66 20 30 20 74 6f 20 64 69 73 61 62 6c 65 of 0 to disable
17d0: 0d 0a 2a 2a 20 61 6e 79 20 6c 69 6d 69 74 20 6f ..** any limit o
17e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
17f0: 74 65 72 6d 73 20 69 6e 20 61 20 63 6f 6d 70 6f terms in a compo
1800: 75 6e 74 20 53 45 4c 45 43 54 2e 0d 0a 2a 2f 0d unt SELECT...*/.
1810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
1820: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c MAX_COMPOUND_SEL
1830: 45 43 54 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 ECT..# define SQ
1840: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e LITE_MAX_COMPOUN
1850: 44 5f 53 45 4c 45 43 54 20 35 30 30 0d 0a 23 65 D_SELECT 500..#e
1860: 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ndif..../*..** T
1870: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 he maximum numbe
1880: 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 69 6e 20 r of opcodes in
1890: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0d a VDBE program..
18a0: 0a 2a 2a 20 4e 6f 74 20 63 75 72 72 65 6e 74 6c .** Not currentl
18b0: 79 20 65 6e 66 6f 72 63 65 64 2e 0d 0a 2a 2f 0d y enforced...*/.
18c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
18d0: 4d 41 58 5f 56 44 42 45 5f 4f 50 0d 0a 23 20 64 MAX_VDBE_OP..# d
18e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 efine SQLITE_MAX
18f0: 5f 56 44 42 45 5f 4f 50 20 32 35 30 30 30 0d 0a _VDBE_OP 25000..
1900: 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
1910: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d The maximum num
1920: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
1930: 20 74 6f 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 to an SQL funct
1940: 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 ion...*/..#ifnde
1950: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e f SQLITE_MAX_FUN
1960: 43 54 49 4f 4e 5f 41 52 47 0d 0a 23 20 64 65 66 CTION_ARG..# def
1970: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 ine SQLITE_MAX_F
1980: 55 4e 43 54 49 4f 4e 5f 41 52 47 20 31 32 37 0d UNCTION_ARG 127.
1990: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
19a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 * The maximum nu
19b0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 mber of in-memor
19c0: 79 20 70 61 67 65 73 20 74 6f 20 75 73 65 20 66 y pages to use f
19d0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 or the main data
19e0: 62 61 73 65 0d 0a 2a 2a 20 74 61 62 6c 65 20 61 base..** table a
19f0: 6e 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 nd for temporary
1a00: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 53 51 tables. The SQ
1a10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 LITE_DEFAULT_CAC
1a20: 48 45 5f 53 49 5a 45 0d 0a 2a 2f 0d 0a 23 69 66 HE_SIZE..*/..#if
1a30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 ndef SQLITE_DEFA
1a40: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 0d 0a ULT_CACHE_SIZE..
1a50: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f # define SQLITE_
1a60: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 DEFAULT_CACHE_SI
1a70: 5a 45 20 20 32 30 30 30 0d 0a 23 65 6e 64 69 66 ZE 2000..#endif
1a80: 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1a90: 5f 44 45 46 41 55 4c 54 5f 54 45 4d 50 5f 43 41 _DEFAULT_TEMP_CA
1aa0: 43 48 45 5f 53 49 5a 45 0d 0a 23 20 64 65 66 69 CHE_SIZE..# defi
1ab0: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ne SQLITE_DEFAUL
1ac0: 54 5f 54 45 4d 50 5f 43 41 43 48 45 5f 53 49 5a T_TEMP_CACHE_SIZ
1ad0: 45 20 20 35 30 30 0d 0a 23 65 6e 64 69 66 0d 0a E 500..#endif..
1ae0: 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 64 65 66 ../*..** The def
1af0: 61 75 6c 74 20 6e 75 6d 62 65 72 20 6f 66 20 66 ault number of f
1b00: 72 61 6d 65 73 20 74 6f 20 61 63 63 75 6d 75 6c rames to accumul
1b10: 61 74 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 ate in the log f
1b20: 69 6c 65 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 63 ile before..** c
1b30: 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 heckpointing the
1b40: 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c database in WAL
1b50: 20 6d 6f 64 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e mode...*/..#ifn
1b60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 def SQLITE_DEFAU
1b70: 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b LT_WAL_AUTOCHECK
1b80: 50 4f 49 4e 54 0d 0a 23 20 64 65 66 69 6e 65 20 POINT..# define
1b90: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 SQLITE_DEFAULT_W
1ba0: 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e AL_AUTOCHECKPOIN
1bb0: 54 20 20 31 30 30 30 0d 0a 23 65 6e 64 69 66 0d T 1000..#endif.
1bc0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 6d 61 .../*..** The ma
1bd0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 ximum number of
1be0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 attached databas
1bf0: 65 73 2e 20 20 54 68 69 73 20 6d 75 73 74 20 62 es. This must b
1c00: 65 20 62 65 74 77 65 65 6e 20 30 0d 0a 2a 2a 20 e between 0..**
1c10: 61 6e 64 20 36 32 2e 20 20 54 68 65 20 75 70 70 and 62. The upp
1c20: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 36 32 20 69 er bound on 62 i
1c30: 73 20 62 65 63 61 75 73 65 20 61 20 36 34 2d 62 s because a 64-b
1c40: 69 74 20 69 6e 74 65 67 65 72 20 62 69 74 6d 61 it integer bitma
1c50: 70 0d 0a 2a 2a 20 69 73 20 75 73 65 64 20 69 6e p..** is used in
1c60: 74 65 72 6e 61 6c 6c 79 20 74 6f 20 74 72 61 63 ternally to trac
1c70: 6b 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 k attached datab
1c80: 61 73 65 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 ases...*/..#ifnd
1c90: 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 ef SQLITE_MAX_AT
1ca0: 54 41 43 48 45 44 0d 0a 23 20 64 65 66 69 6e 65 TACHED..# define
1cb0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 SQLITE_MAX_ATTA
1cc0: 43 48 45 44 20 31 30 0d 0a 23 65 6e 64 69 66 0d CHED 10..#endif.
1cd0: 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 ...../*..** The
1ce0: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 maximum value of
1cf0: 20 61 20 3f 6e 6e 6e 20 77 69 6c 64 63 61 72 64 a ?nnn wildcard
1d00: 20 74 68 61 74 20 74 68 65 20 70 61 72 73 65 72 that the parser
1d10: 20 77 69 6c 6c 20 61 63 63 65 70 74 2e 0d 0a 2a will accept...*
1d20: 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
1d30: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e E_MAX_VARIABLE_N
1d40: 55 4d 42 45 52 0d 0a 23 20 64 65 66 69 6e 65 20 UMBER..# define
1d50: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 SQLITE_MAX_VARIA
1d60: 42 4c 45 5f 4e 55 4d 42 45 52 20 39 39 39 0d 0a BLE_NUMBER 999..
1d70: 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 4d 61 78 #endif..../* Max
1d80: 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 2e 20 imum page size.
1d90: 20 54 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 The upper bound
1da0: 20 6f 6e 20 74 68 69 73 20 76 61 6c 75 65 20 69 on this value i
1db0: 73 20 36 35 35 33 36 2e 20 20 54 68 69 73 20 61 s 65536. This a
1dc0: 20 6c 69 6d 69 74 0d 0a 2a 2a 20 69 6d 70 6f 73 limit..** impos
1dd0: 65 64 20 62 79 20 74 68 65 20 75 73 65 20 6f 66 ed by the use of
1de0: 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 73 20 16-bit offsets
1df0: 77 69 74 68 69 6e 20 65 61 63 68 20 70 61 67 65 within each page
1e00: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 61 72 6c 69 65 ...**..** Earlie
1e10: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 r versions of SQ
1e20: 4c 69 74 65 20 61 6c 6c 6f 77 65 64 20 74 68 65 Lite allowed the
1e30: 20 75 73 65 72 20 74 6f 20 63 68 61 6e 67 65 20 user to change
1e40: 74 68 69 73 20 76 61 6c 75 65 20 61 74 0d 0a 2a this value at..*
1e50: 2a 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 * compile time.
1e60: 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 This is no longe
1e70: 72 20 70 65 72 6d 69 74 74 65 64 2c 20 6f 6e 20 r permitted, on
1e80: 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 the grounds that
1e90: 20 69 74 20 63 72 65 61 74 65 73 0d 0a 2a 2a 20 it creates..**
1ea0: 61 20 6c 69 62 72 61 72 79 20 74 68 61 74 20 69 a library that i
1eb0: 73 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 69 6e s technically in
1ec0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 compatible with
1ed0: 61 6e 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 an SQLite librar
1ee0: 79 20 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 y ..** compiled
1ef0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 with a different
1f00: 20 6c 69 6d 69 74 2e 20 49 66 20 61 20 70 72 6f limit. If a pro
1f10: 63 65 73 73 20 6f 70 65 72 61 74 69 6e 67 20 6f cess operating o
1f20: 6e 20 61 20 64 61 74 61 62 61 73 65 20 0d 0a 2a n a database ..*
1f30: 2a 20 77 69 74 68 20 61 20 70 61 67 65 2d 73 69 * with a page-si
1f40: 7a 65 20 6f 66 20 36 35 35 33 36 20 62 79 74 65 ze of 65536 byte
1f50: 73 20 63 72 61 73 68 65 73 2c 20 74 68 65 6e 20 s crashes, then
1f60: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 53 an instance of S
1f70: 51 4c 69 74 65 20 0d 0a 2a 2a 20 63 6f 6d 70 69 QLite ..** compi
1f80: 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 65 66 led with the def
1f90: 61 75 6c 74 20 70 61 67 65 2d 73 69 7a 65 20 6c ault page-size l
1fa0: 69 6d 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 imit will not be
1fb0: 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 able to rollbac
1fc0: 6b 20 0d 0a 2a 2a 20 74 68 65 20 61 62 6f 72 74 k ..** the abort
1fd0: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 ed transaction.
1fe0: 54 68 69 73 20 63 6f 75 6c 64 20 6c 65 61 64 20 This could lead
1ff0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 to database corr
2000: 75 70 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 uption...*/..#if
2010: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 def SQLITE_MAX_P
2020: 41 47 45 5f 53 49 5a 45 0d 0a 23 20 75 6e 64 65 AGE_SIZE..# unde
2030: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 f SQLITE_MAX_PAG
2040: 45 5f 53 49 5a 45 0d 0a 23 65 6e 64 69 66 0d 0a E_SIZE..#endif..
2050: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d #define SQLITE_M
2060: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 36 35 35 AX_PAGE_SIZE 655
2070: 33 36 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 36....../*..** T
2080: 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 he default size
2090: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 of a database pa
20a0: 67 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 ge...*/..#ifndef
20b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f SQLITE_DEFAULT_
20c0: 50 41 47 45 5f 53 49 5a 45 0d 0a 23 20 64 65 66 PAGE_SIZE..# def
20d0: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 ine SQLITE_DEFAU
20e0: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 31 30 32 LT_PAGE_SIZE 102
20f0: 34 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 53 4..#endif..#if S
2100: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 QLITE_DEFAULT_PA
2110: 47 45 5f 53 49 5a 45 3e 53 51 4c 49 54 45 5f 4d GE_SIZE>SQLITE_M
2120: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0d 0a 23 20 AX_PAGE_SIZE..#
2130: 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 undef SQLITE_DEF
2140: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 0d 0a AULT_PAGE_SIZE..
2150: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f # define SQLITE_
2160: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a DEFAULT_PAGE_SIZ
2170: 45 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 E SQLITE_MAX_PAG
2180: 45 5f 53 49 5a 45 0d 0a 23 65 6e 64 69 66 0d 0a E_SIZE..#endif..
2190: 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 72 64 69 6e 61 72 ../*..** Ordinar
21a0: 69 6c 79 2c 20 69 66 20 6e 6f 20 76 61 6c 75 65 ily, if no value
21b0: 20 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 70 is explicitly p
21c0: 72 6f 76 69 64 65 64 2c 20 53 51 4c 69 74 65 20 rovided, SQLite
21d0: 63 72 65 61 74 65 73 20 64 61 74 61 62 61 73 65 creates database
21e0: 73 0d 0a 2a 2a 20 77 69 74 68 20 70 61 67 65 20 s..** with page
21f0: 73 69 7a 65 20 53 51 4c 49 54 45 5f 44 45 46 41 size SQLITE_DEFA
2200: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2e 20 48 ULT_PAGE_SIZE. H
2210: 6f 77 65 76 65 72 2c 20 62 61 73 65 64 20 6f 6e owever, based on
2220: 20 63 65 72 74 61 69 6e 0d 0a 2a 2a 20 64 65 76 certain..** dev
2230: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 ice characterist
2240: 69 63 73 20 28 73 65 63 74 6f 72 2d 73 69 7a 65 ics (sector-size
2250: 20 61 6e 64 20 61 74 6f 6d 69 63 20 77 72 69 74 and atomic writ
2260: 65 28 29 20 73 75 70 70 6f 72 74 29 2c 0d 0a 2a e() support),..*
2270: 2a 20 53 51 4c 69 74 65 20 6d 61 79 20 63 68 6f * SQLite may cho
2280: 6f 73 65 20 61 20 6c 61 72 67 65 72 20 76 61 6c ose a larger val
2290: 75 65 2e 20 54 68 69 73 20 63 6f 6e 73 74 61 6e ue. This constan
22a0: 74 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d t is the maximum
22b0: 20 76 61 6c 75 65 0d 0a 2a 2a 20 53 51 4c 69 74 value..** SQLit
22c0: 65 20 77 69 6c 6c 20 63 68 6f 6f 73 65 20 6f 6e e will choose on
22d0: 20 69 74 73 20 6f 77 6e 2e 0d 0a 2a 2f 0d 0a 23 its own...*/..#
22e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 ifndef SQLITE_MA
22f0: 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 X_DEFAULT_PAGE_S
2300: 49 5a 45 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 IZE..# define SQ
2310: 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 LITE_MAX_DEFAULT
2320: 5f 50 41 47 45 5f 53 49 5a 45 20 38 31 39 32 0d _PAGE_SIZE 8192.
2330: 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 53 51 4c .#endif..#if SQL
2340: 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f ITE_MAX_DEFAULT_
2350: 50 41 47 45 5f 53 49 5a 45 3e 53 51 4c 49 54 45 PAGE_SIZE>SQLITE
2360: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0d 0a _MAX_PAGE_SIZE..
2370: 23 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d # undef SQLITE_M
2380: 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f AX_DEFAULT_PAGE_
2390: 53 49 5a 45 0d 0a 23 20 64 65 66 69 6e 65 20 53 SIZE..# define S
23a0: 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c QLITE_MAX_DEFAUL
23b0: 54 5f 50 41 47 45 5f 53 49 5a 45 20 53 51 4c 49 T_PAGE_SIZE SQLI
23c0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 TE_MAX_PAGE_SIZE
23d0: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a ..#endif....../*
23e0: 0d 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d ..** Maximum num
23f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 ber of pages in
2400: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c one database fil
2410: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 e...**..** This
2420: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 is really just t
2430: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 he default value
2440: 20 66 6f 72 20 74 68 65 20 6d 61 78 5f 70 61 67 for the max_pag
2450: 65 5f 63 6f 75 6e 74 20 70 72 61 67 6d 61 2e 0d e_count pragma..
2460: 0a 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 63 .** This value c
2470: 61 6e 20 62 65 20 6c 6f 77 65 72 65 64 20 28 6f an be lowered (o
2480: 72 20 72 61 69 73 65 64 29 20 61 74 20 72 75 6e r raised) at run
2490: 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 61 74 -time using that
24a0: 20 74 68 65 0d 0a 2a 2a 20 6d 61 78 5f 70 61 67 the..** max_pag
24b0: 65 5f 63 6f 75 6e 74 20 6d 61 63 72 6f 2e 0d 0a e_count macro...
24c0: 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
24d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e TE_MAX_PAGE_COUN
24e0: 54 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 T..# define SQLI
24f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e TE_MAX_PAGE_COUN
2500: 54 20 31 30 37 33 37 34 31 38 32 33 0d 0a 23 65 T 1073741823..#e
2510: 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d ndif..../*..** M
2520: 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 28 69 aximum length (i
2530: 6e 20 62 79 74 65 73 29 20 6f 66 20 74 68 65 20 n bytes) of the
2540: 70 61 74 74 65 72 6e 20 69 6e 20 61 20 4c 49 4b pattern in a LIK
2550: 45 20 6f 72 20 47 4c 4f 42 0d 0a 2a 2a 20 6f 70 E or GLOB..** op
2560: 65 72 61 74 6f 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 erator...*/..#if
2570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f ndef SQLITE_MAX_
2580: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e LIKE_PATTERN_LEN
2590: 47 54 48 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 GTH..# define SQ
25a0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 LITE_MAX_LIKE_PA
25b0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 35 30 30 TTERN_LENGTH 500
25c0: 30 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 00..#endif..../*
25d0: 0d 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 64 65 70 ..** Maximum dep
25e0: 74 68 20 6f 66 20 72 65 63 75 72 73 69 6f 6e 20 th of recursion
25f0: 66 6f 72 20 74 72 69 67 67 65 72 73 2e 0d 0a 2a for triggers...*
2600: 2a 0d 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 *..** A value of
2610: 20 31 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 1 means that a
2620: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 trigger program
2630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 will not be able
2640: 20 74 6f 20 69 74 73 65 6c 66 0d 0a 2a 2a 20 66 to itself..** f
2650: 69 72 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 ire any triggers
2660: 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d . A value of 0 m
2670: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 69 eans that no tri
2680: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 61 74 gger programs at
2690: 20 61 6c 6c 20 0d 0a 2a 2a 20 6d 61 79 20 62 65 all ..** may be
26a0: 20 65 78 65 63 75 74 65 64 2e 0d 0a 2a 2f 0d 0a executed...*/..
26b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d #ifndef SQLITE_M
26c0: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 AX_TRIGGER_DEPTH
26d0: 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 ..# define SQLIT
26e0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 E_MAX_TRIGGER_DE
26f0: 50 54 48 20 31 30 30 30 0d 0a 23 65 6e 64 69 66 PTH 1000..#endif
2700: 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
2710: 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 *** End of sqlit
2720: 65 4c 69 6d 69 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a eLimit.h *******
2730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2750: 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
2760: 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 **** Continuing
2770: 77 68 65 72 65 20 77 65 20 6c 65 66 74 20 6f 66 where we left of
2780: 66 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 f in sqliteInt.h
2790: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
27a0: 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 20 44 69 73 61 62 ***/..../* Disab
27b0: 6c 65 20 6e 75 69 73 61 6e 63 65 20 77 61 72 6e le nuisance warn
27c0: 69 6e 67 73 20 6f 6e 20 42 6f 72 6c 61 6e 64 20 ings on Borland
27d0: 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0d 0a 23 69 compilers */..#i
27e0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 42 4f 52 4c f defined(__BORL
27f0: 41 4e 44 43 5f 5f 29 0d 0a 23 70 72 61 67 6d 61 ANDC__)..#pragma
2800: 20 77 61 72 6e 20 2d 72 63 68 20 2f 2a 20 75 6e warn -rch /* un
2810: 72 65 61 63 68 61 62 6c 65 20 63 6f 64 65 20 2a reachable code *
2820: 2f 0d 0a 23 70 72 61 67 6d 61 20 77 61 72 6e 20 /..#pragma warn
2830: 2d 63 63 63 20 2f 2a 20 43 6f 6e 64 69 74 69 6f -ccc /* Conditio
2840: 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 n is always true
2850: 20 6f 72 20 66 61 6c 73 65 20 2a 2f 0d 0a 23 70 or false */..#p
2860: 72 61 67 6d 61 20 77 61 72 6e 20 2d 61 75 73 20 ragma warn -aus
2870: 2f 2a 20 41 73 73 69 67 6e 65 64 20 76 61 6c 75 /* Assigned valu
2880: 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 e is never used
2890: 2a 2f 0d 0a 23 70 72 61 67 6d 61 20 77 61 72 6e */..#pragma warn
28a0: 20 2d 63 73 75 20 2f 2a 20 43 6f 6d 70 61 72 69 -csu /* Compari
28b0: 6e 67 20 73 69 67 6e 65 64 20 61 6e 64 20 75 6e ng signed and un
28c0: 73 69 67 6e 65 64 20 2a 2f 0d 0a 23 70 72 61 67 signed */..#prag
28d0: 6d 61 20 77 61 72 6e 20 2d 73 70 61 20 2f 2a 20 ma warn -spa /*
28e0: 53 75 73 70 69 63 69 6f 75 73 20 70 6f 69 6e 74 Suspicious point
28f0: 65 72 20 61 72 69 74 68 6d 65 74 69 63 20 2a 2f er arithmetic */
2900: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 4e ..#endif..../* N
2910: 65 65 64 65 64 20 66 6f 72 20 76 61 72 69 6f 75 eeded for variou
2920: 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 2e 2e s definitions...
2930: 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 47 4e */..#ifndef _GN
2940: 55 5f 53 4f 55 52 43 45 0d 0a 23 20 64 65 66 69 U_SOURCE..# defi
2950: 6e 65 20 5f 47 4e 55 5f 53 4f 55 52 43 45 0d 0a ne _GNU_SOURCE..
2960: 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
2970: 20 49 6e 63 6c 75 64 65 20 73 74 61 6e 64 61 72 Include standar
2980: 64 20 68 65 61 64 65 72 20 66 69 6c 65 73 20 61 d header files a
2990: 73 20 6e 65 63 65 73 73 61 72 79 0d 0a 2a 2f 0d s necessary..*/.
29a0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 54 44 .#ifdef HAVE_STD
29b0: 49 4e 54 5f 48 0d 0a 23 69 6e 63 6c 75 64 65 20 INT_H..#include
29c0: 3c 73 74 64 69 6e 74 2e 68 3e 0d 0a 23 65 6e 64 <stdint.h>..#end
29d0: 69 66 0d 0a 23 69 66 64 65 66 20 48 41 56 45 5f if..#ifdef HAVE_
29e0: 49 4e 54 54 59 50 45 53 5f 48 0d 0a 23 69 6e 63 INTTYPES_H..#inc
29f0: 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73 2e 68 lude <inttypes.h
2a00: 3e 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d >..#endif..../*.
2a10: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
2a20: 67 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 g macros are use
2a30: 64 20 74 6f 20 63 61 73 74 20 70 6f 69 6e 74 65 d to cast pointe
2a40: 72 73 20 74 6f 20 69 6e 74 65 67 65 72 73 20 61 rs to integers a
2a50: 6e 64 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 73 20 nd..** integers
2a60: 74 6f 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 to pointers. Th
2a70: 65 20 77 61 79 20 79 6f 75 20 64 6f 20 74 68 69 e way you do thi
2a80: 73 20 76 61 72 69 65 73 20 66 72 6f 6d 20 6f 6e s varies from on
2a90: 65 20 63 6f 6d 70 69 6c 65 72 0d 0a 2a 2a 20 74 e compiler..** t
2aa0: 6f 20 74 68 65 20 6e 65 78 74 2c 20 73 6f 20 77 o the next, so w
2ab0: 65 20 68 61 76 65 20 64 65 76 65 6c 6f 70 65 64 e have developed
2ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
2ad0: 65 74 20 6f 66 20 23 69 66 20 73 74 61 74 65 6d et of #if statem
2ae0: 65 6e 74 73 0d 0a 2a 2a 20 74 6f 20 67 65 6e 65 ents..** to gene
2af0: 72 61 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 rate appropriate
2b00: 20 6d 61 63 72 6f 73 20 66 6f 72 20 61 20 77 69 macros for a wi
2b10: 64 65 20 72 61 6e 67 65 20 6f 66 20 63 6f 6d 70 de range of comp
2b20: 69 6c 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ilers...**..** T
2b30: 68 65 20 63 6f 72 72 65 63 74 20 22 41 4e 53 49 he correct "ANSI
2b40: 22 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69 73 " way to do this
2b50: 20 69 73 20 74 6f 20 75 73 65 20 74 68 65 20 69 is to use the i
2b60: 6e 74 70 74 72 5f 74 20 74 79 70 65 2e 20 0d 0a ntptr_t type. ..
2b70: 2a 2a 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 ** Unfortunately
2b80: 2c 20 74 68 61 74 20 74 79 70 65 64 65 66 20 69 , that typedef i
2b90: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 s not available
2ba0: 6f 6e 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 72 73 on all compilers
2bb0: 2c 20 6f 72 0d 0a 2a 2a 20 69 66 20 69 74 20 69 , or..** if it i
2bc0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 s available, it
2bd0: 72 65 71 75 69 72 65 73 20 61 6e 20 23 69 6e 63 requires an #inc
2be0: 6c 75 64 65 20 6f 66 20 73 70 65 63 69 66 69 63 lude of specific
2bf0: 20 68 65 61 64 65 72 73 0d 0a 2a 2a 20 74 68 61 headers..** tha
2c00: 74 20 76 61 72 79 20 66 72 6f 6d 20 6f 6e 65 20 t vary from one
2c10: 6d 61 63 68 69 6e 65 20 74 6f 20 74 68 65 20 6e machine to the n
2c20: 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 69 63 ext...**..** Tic
2c30: 6b 65 74 20 23 33 38 36 30 3a 20 20 54 68 65 20 ket #3860: The
2c40: 6c 6c 76 6d 2d 67 63 63 2d 34 2e 32 20 63 6f 6d llvm-gcc-4.2 com
2c50: 70 69 6c 65 72 20 66 72 6f 6d 20 41 70 70 6c 65 piler from Apple
2c60: 20 63 68 6f 6b 65 73 20 6f 6e 0d 0a 2a 2a 20 74 chokes on..** t
2c70: 68 65 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 he ((void*)&((ch
2c80: 61 72 2a 29 30 29 5b 58 5d 29 20 63 6f 6e 73 74 ar*)0)[X]) const
2c90: 72 75 63 74 2e 20 20 42 75 74 20 4d 53 56 43 20 ruct. But MSVC
2ca0: 63 68 6f 6b 65 73 20 6f 6e 20 28 28 76 6f 69 64 chokes on ((void
2cb0: 2a 29 28 58 29 29 2e 0d 0a 2a 2a 20 53 6f 20 77 *)(X))...** So w
2cc0: 65 20 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65 e have to define
2cd0: 20 74 68 65 20 6d 61 63 72 6f 73 20 69 6e 20 64 the macros in d
2ce0: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 64 65 ifferent ways de
2cf0: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0d 0a pending on the..
2d00: 2a 2a 20 63 6f 6d 70 69 6c 65 72 2e 0d 0a 2a 2f ** compiler...*/
2d10: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ..#if defined(__
2d20: 50 54 52 44 49 46 46 5f 54 59 50 45 5f 5f 29 20 PTRDIFF_TYPE__)
2d30: 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 73 68 /* This case sh
2d40: 6f 75 6c 64 20 77 6f 72 6b 20 66 6f 72 20 47 43 ould work for GC
2d50: 43 20 2a 2f 0d 0a 23 20 64 65 66 69 6e 65 20 53 C */..# define S
2d60: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 QLITE_INT_TO_PTR
2d70: 28 58 29 20 20 28 28 76 6f 69 64 2a 29 28 5f 5f (X) ((void*)(__
2d80: 50 54 52 44 49 46 46 5f 54 59 50 45 5f 5f 29 28 PTRDIFF_TYPE__)(
2d90: 58 29 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 X))..# define SQ
2da0: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 LITE_PTR_TO_INT(
2db0: 58 29 20 20 28 28 69 6e 74 29 28 5f 5f 50 54 52 X) ((int)(__PTR
2dc0: 44 49 46 46 5f 54 59 50 45 5f 5f 29 28 58 29 29 DIFF_TYPE__)(X))
2dd0: 0d 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 ..#elif !defined
2de0: 28 5f 5f 47 4e 55 43 5f 5f 29 20 20 20 20 20 20 (__GNUC__)
2df0: 20 2f 2a 20 57 6f 72 6b 73 20 66 6f 72 20 63 6f /* Works for co
2e00: 6d 70 69 6c 65 72 73 20 6f 74 68 65 72 20 74 68 mpilers other th
2e10: 61 6e 20 4c 4c 56 4d 20 2a 2f 0d 0a 23 20 64 65 an LLVM */..# de
2e20: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 5f fine SQLITE_INT_
2e30: 54 4f 5f 50 54 52 28 58 29 20 20 28 28 76 6f 69 TO_PTR(X) ((voi
2e40: 64 2a 29 26 28 28 63 68 61 72 2a 29 30 29 5b 58 d*)&((char*)0)[X
2e50: 5d 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c ])..# define SQL
2e60: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 58 ITE_PTR_TO_INT(X
2e70: 29 20 20 28 28 69 6e 74 29 28 28 28 63 68 61 72 ) ((int)(((char
2e80: 2a 29 58 29 2d 28 63 68 61 72 2a 29 30 29 29 0d *)X)-(char*)0)).
2e90: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 .#elif defined(H
2ea0: 41 56 45 5f 53 54 44 49 4e 54 5f 48 29 20 20 20 AVE_STDINT_H)
2eb0: 2f 2a 20 55 73 65 20 74 68 69 73 20 63 61 73 65 /* Use this case
2ec0: 20 69 66 20 77 65 20 68 61 76 65 20 41 4e 53 49 if we have ANSI
2ed0: 20 68 65 61 64 65 72 73 20 2a 2f 0d 0a 23 20 64 headers */..# d
2ee0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 efine SQLITE_INT
2ef0: 5f 54 4f 5f 50 54 52 28 58 29 20 20 28 28 76 6f _TO_PTR(X) ((vo
2f00: 69 64 2a 29 28 69 6e 74 70 74 72 5f 74 29 28 58 id*)(intptr_t)(X
2f10: 29 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c ))..# define SQL
2f20: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 58 ITE_PTR_TO_INT(X
2f30: 29 20 20 28 28 69 6e 74 29 28 69 6e 74 70 74 72 ) ((int)(intptr
2f40: 5f 74 29 28 58 29 29 0d 0a 23 65 6c 73 65 20 20 _t)(X))..#else
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f60: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 /* Gener
2f70: 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 20 2d ates a warning -
2f80: 20 62 75 74 20 69 74 20 61 6c 77 61 79 73 20 77 but it always w
2f90: 6f 72 6b 73 20 2a 2f 0d 0a 23 20 64 65 66 69 6e orks */..# defin
2fa0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f e SQLITE_INT_TO_
2fb0: 50 54 52 28 58 29 20 20 28 28 76 6f 69 64 2a 29 PTR(X) ((void*)
2fc0: 28 58 29 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 (X))..# define S
2fd0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 QLITE_PTR_TO_INT
2fe0: 28 58 29 20 20 28 28 69 6e 74 29 28 58 29 29 0d (X) ((int)(X)).
2ff0: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
3000: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 54 48 52 * The SQLITE_THR
3010: 45 41 44 53 41 46 45 20 6d 61 63 72 6f 20 6d 75 EADSAFE macro mu
3020: 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 73 st be defined as
3030: 20 30 2c 20 31 2c 20 6f 72 20 32 2e 0d 0a 2a 2a 0, 1, or 2...**
3040: 20 30 20 6d 65 61 6e 73 20 6d 75 74 65 78 65 73 0 means mutexes
3050: 20 61 72 65 20 70 65 72 6d 61 6e 65 6e 74 6c 79 are permanently
3060: 20 64 69 73 61 62 6c 65 20 61 6e 64 20 74 68 65 disable and the
3070: 20 6c 69 62 72 61 72 79 20 69 73 20 6e 65 76 65 library is neve
3080: 72 0d 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 r..** threadsafe
3090: 2e 20 20 31 20 6d 65 61 6e 73 20 74 68 65 20 6c . 1 means the l
30a0: 69 62 72 61 72 79 20 69 73 20 73 65 72 69 61 6c ibrary is serial
30b0: 69 7a 65 64 20 77 68 69 63 68 20 69 73 20 74 68 ized which is th
30c0: 65 20 68 69 67 68 65 73 74 0d 0a 2a 2a 20 6c 65 e highest..** le
30d0: 76 65 6c 20 6f 66 20 74 68 72 65 61 64 73 61 66 vel of threadsaf
30e0: 65 74 79 2e 20 20 32 20 6d 65 61 6e 73 20 74 68 ety. 2 means th
30f0: 65 20 6c 69 62 61 72 79 20 69 73 20 6d 75 6c 74 e libary is mult
3100: 69 74 68 72 65 61 64 65 64 20 2d 20 6d 75 6c 74 ithreaded - mult
3110: 69 70 6c 65 0d 0a 2a 2a 20 74 68 72 65 61 64 73 iple..** threads
3120: 20 63 61 6e 20 75 73 65 20 53 51 4c 69 74 65 20 can use SQLite
3130: 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 20 74 77 as long as no tw
3140: 6f 20 74 68 72 65 61 64 73 20 74 72 79 20 74 6f o threads try to
3150: 20 75 73 65 20 74 68 65 20 73 61 6d 65 0d 0a 2a use the same..*
3160: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 * database conne
3170: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 73 61 6d ction at the sam
3180: 65 20 74 69 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 e time...**..**
3190: 4f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f Older versions o
31a0: 66 20 53 51 4c 69 74 65 20 75 73 65 64 20 61 6e f SQLite used an
31b0: 20 6f 70 74 69 6f 6e 61 6c 20 54 48 52 45 41 44 optional THREAD
31c0: 53 41 46 45 20 6d 61 63 72 6f 2e 0d 0a 2a 2a 20 SAFE macro...**
31d0: 57 65 20 73 75 70 70 6f 72 74 20 74 68 61 74 20 We support that
31e0: 66 6f 72 20 6c 65 67 61 63 79 2e 0d 0a 2a 2f 0d for legacy...*/.
31f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 .#if !defined(SQ
3200: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 LITE_THREADSAFE)
3210: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 48 ..#if defined(TH
3220: 52 45 41 44 53 41 46 45 29 0d 0a 23 20 64 65 66 READSAFE)..# def
3230: 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 ine SQLITE_THREA
3240: 44 53 41 46 45 20 54 48 52 45 41 44 53 41 46 45 DSAFE THREADSAFE
3250: 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
3260: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 e SQLITE_THREADS
3270: 41 46 45 20 31 20 2f 2a 20 49 4d 50 3a 20 52 2d AFE 1 /* IMP: R-
3280: 30 37 32 37 32 2d 32 32 33 30 39 20 2a 2f 0d 0a 07272-22309 */..
3290: 23 65 6e 64 69 66 0d 0a 23 65 6e 64 69 66 0d 0a #endif..#endif..
32a0: 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 77 65 72 73 61 ../*..** Powersa
32b0: 66 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 fe overwrite is
32c0: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 on by default.
32d0: 42 75 74 20 63 61 6e 20 62 65 20 74 75 72 6e 65 But can be turne
32e0: 64 20 6f 66 66 20 75 73 69 6e 67 0d 0a 2a 2a 20 d off using..**
32f0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 50 4f 57 the -DSQLITE_POW
3300: 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 ERSAFE_OVERWRITE
3310: 3d 30 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 =0 command-line
3320: 6f 70 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 option...*/..#if
3330: 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 4f 57 45 ndef SQLITE_POWE
3340: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 0d RSAFE_OVERWRITE.
3350: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 .# define SQLITE
3360: 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 _POWERSAFE_OVERW
3370: 52 49 54 45 20 31 0d 0a 23 65 6e 64 69 66 0d 0a RITE 1..#endif..
3380: 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 53 51 4c ../*..** The SQL
3390: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 45 4d 53 ITE_DEFAULT_MEMS
33a0: 54 41 54 55 53 20 6d 61 63 72 6f 20 6d 75 73 74 TATUS macro must
33b0: 20 62 65 20 64 65 66 69 6e 65 64 20 61 73 20 65 be defined as e
33c0: 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0d 0a 2a ither 0 or 1...*
33d0: 2a 20 49 74 20 64 65 74 65 72 6d 69 6e 65 73 20 * It determines
33e0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 whether or not t
33f0: 68 65 20 66 65 61 74 75 72 65 73 20 72 65 6c 61 he features rela
3400: 74 65 64 20 74 6f 20 0d 0a 2a 2a 20 53 51 4c 49 ted to ..** SQLI
3410: 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 TE_CONFIG_MEMSTA
3420: 54 55 53 20 61 72 65 20 61 76 61 69 6c 61 62 6c TUS are availabl
3430: 65 20 62 79 20 64 65 66 61 75 6c 74 20 6f 72 20 e by default or
3440: 6e 6f 74 2e 20 54 68 69 73 20 76 61 6c 75 65 20 not. This value
3450: 63 61 6e 0d 0a 2a 2a 20 62 65 20 6f 76 65 72 72 can..** be overr
3460: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 idden at runtime
3470: 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 using the sqlit
3480: 65 33 5f 63 6f 6e 66 69 67 28 29 20 41 50 49 2e e3_config() API.
3490: 0d 0a 2a 2f 0d 0a 23 69 66 20 21 64 65 66 69 6e ..*/..#if !defin
34a0: 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ed(SQLITE_DEFAUL
34b0: 54 5f 4d 45 4d 53 54 41 54 55 53 29 0d 0a 23 20 T_MEMSTATUS)..#
34c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 define SQLITE_DE
34d0: 46 41 55 4c 54 5f 4d 45 4d 53 54 41 54 55 53 20 FAULT_MEMSTATUS
34e0: 31 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 1..#endif..../*.
34f0: 0a 2a 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 .** Exactly one
3500: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 of the following
3510: 20 6d 61 63 72 6f 73 20 6d 75 73 74 20 62 65 20 macros must be
3520: 64 65 66 69 6e 65 64 20 69 6e 20 6f 72 64 65 72 defined in order
3530: 20 74 6f 0d 0a 2a 2a 20 73 70 65 63 69 66 79 20 to..** specify
3540: 77 68 69 63 68 20 6d 65 6d 6f 72 79 20 61 6c 6c which memory all
3550: 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 ocation subsyste
3560: 6d 20 74 6f 20 75 73 65 2e 0d 0a 2a 2a 0d 0a 2a m to use...**..*
3570: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 53 59 53 * SQLITE_SYS
3580: 54 45 4d 5f 4d 41 4c 4c 4f 43 20 20 20 20 20 20 TEM_MALLOC
3590: 20 20 20 20 2f 2f 20 55 73 65 20 6e 6f 72 6d 61 // Use norma
35a0: 6c 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 l system malloc(
35b0: 29 0d 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 )..** SQLITE
35c0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 20 20 _WIN32_MALLOC
35d0: 20 20 20 20 20 20 20 20 2f 2f 20 55 73 65 20 57 // Use W
35e0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 in32 native heap
35f0: 20 41 50 49 0d 0a 2a 2a 20 20 20 20 20 53 51 4c API..** SQL
3600: 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 20 20 20 ITE_MEMDEBUG
3610: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44 65 // De
3620: 62 75 67 67 69 6e 67 20 76 65 72 73 69 6f 6e 20 bugging version
3630: 6f 66 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 of system malloc
3640: 28 29 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6e 20 57 69 ()..**..** On Wi
3650: 6e 64 6f 77 73 2c 20 69 66 20 74 68 65 20 53 51 ndows, if the SQ
3660: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f LITE_WIN32_MALLO
3670: 43 5f 56 41 4c 49 44 41 54 45 20 6d 61 63 72 6f C_VALIDATE macro
3680: 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20 is defined and
3690: 74 68 65 0d 0a 2a 2a 20 61 73 73 65 72 74 28 29 the..** assert()
36a0: 20 6d 61 63 72 6f 20 69 73 20 65 6e 61 62 6c 65 macro is enable
36b0: 64 2c 20 65 61 63 68 20 63 61 6c 6c 20 69 6e 74 d, each call int
36c0: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 o the Win32 nati
36d0: 76 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 ve heap subsyste
36e0: 6d 0d 0a 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 m..** will cause
36f0: 20 48 65 61 70 56 61 6c 69 64 61 74 65 20 74 6f HeapValidate to
3700: 20 62 65 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 be called. If
3710: 68 65 61 70 20 76 61 6c 69 64 61 74 69 6f 6e 20 heap validation
3720: 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20 61 6e 0d should fail, an.
3730: 0a 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 77 69 .** assertion wi
3740: 6c 6c 20 62 65 20 74 72 69 67 67 65 72 65 64 2e ll be triggered.
3750: 0d 0a 2a 2a 0d 0a 2a 2a 20 28 48 69 73 74 6f 72 ..**..** (Histor
3760: 69 63 61 6c 20 6e 6f 74 65 3a 20 20 54 68 65 72 ical note: Ther
3770: 65 20 75 73 65 64 20 74 6f 20 62 65 20 73 65 76 e used to be sev
3780: 65 72 61 6c 20 6f 74 68 65 72 20 6f 70 74 69 6f eral other optio
3790: 6e 73 2c 20 62 75 74 20 77 65 27 76 65 0d 0a 2a ns, but we've..*
37a0: 2a 20 70 61 72 65 64 20 69 74 20 64 6f 77 6e 20 * pared it down
37b0: 74 6f 20 6a 75 73 74 20 74 68 65 73 65 20 74 68 to just these th
37c0: 72 65 65 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 ree.)..**..** If
37d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f none of the abo
37e0: 76 65 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 ve are defined,
37f0: 74 68 65 6e 20 73 65 74 20 53 51 4c 49 54 45 5f then set SQLITE_
3800: 53 59 53 54 45 4d 5f 4d 41 4c 4c 4f 43 20 61 73 SYSTEM_MALLOC as
3810: 0d 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 ..** the default
3820: 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69 6e ...*/..#if defin
3830: 65 64 28 53 51 4c 49 54 45 5f 53 59 53 54 45 4d ed(SQLITE_SYSTEM
3840: 5f 4d 41 4c 4c 4f 43 29 2b 64 65 66 69 6e 65 64 _MALLOC)+defined
3850: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 (SQLITE_WIN32_MA
3860: 4c 4c 4f 43 29 2b 64 65 66 69 6e 65 64 28 53 51 LLOC)+defined(SQ
3870: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 29 3e 31 LITE_MEMDEBUG)>1
3880: 0d 0a 23 20 65 72 72 6f 72 20 22 41 74 20 6d 6f ..# error "At mo
3890: 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f st one of the fo
38a0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 70 69 6c 65 2d llowing compile-
38b0: 74 69 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 time configurati
38c0: 6f 6e 20 6f 70 74 69 6f 6e 73 5c 0d 0a 20 69 73 on options\.. is
38d0: 20 61 6c 6c 6f 77 73 3a 20 53 51 4c 49 54 45 5f allows: SQLITE_
38e0: 53 59 53 54 45 4d 5f 4d 41 4c 4c 4f 43 2c 20 53 SYSTEM_MALLOC, S
38f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c QLITE_WIN32_MALL
3900: 4f 43 2c 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 OC, SQLITE_MEMDE
3910: 42 55 47 22 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 BUG"..#endif..#i
3920: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
3930: 5f 53 59 53 54 45 4d 5f 4d 41 4c 4c 4f 43 29 2b _SYSTEM_MALLOC)+
3940: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
3950: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 2b 64 65 66 IN32_MALLOC)+def
3960: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d 44 ined(SQLITE_MEMD
3970: 45 42 55 47 29 3d 3d 30 0d 0a 23 20 64 65 66 69 EBUG)==0..# defi
3980: 6e 65 20 53 51 4c 49 54 45 5f 53 59 53 54 45 4d ne SQLITE_SYSTEM
3990: 5f 4d 41 4c 4c 4f 43 20 31 0d 0a 23 65 6e 64 69 _MALLOC 1..#endi
39a0: 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 53 f..../*..** If S
39b0: 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 QLITE_MALLOC_SOF
39c0: 54 5f 4c 49 4d 49 54 20 69 73 20 6e 6f 74 20 7a T_LIMIT is not z
39d0: 65 72 6f 2c 20 74 68 65 6e 20 74 72 79 20 74 6f ero, then try to
39e0: 20 6b 65 65 70 20 74 68 65 0d 0a 2a 2a 20 73 69 keep the..** si
39f0: 7a 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c zes of memory al
3a00: 6c 6f 63 61 74 69 6f 6e 73 20 62 65 6c 6f 77 20 locations below
3a10: 74 68 69 73 20 76 61 6c 75 65 20 77 68 65 72 65 this value where
3a20: 20 70 6f 73 73 69 62 6c 65 2e 0d 0a 2a 2f 0d 0a possible...*/..
3a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c #if !defined(SQL
3a40: 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f ITE_MALLOC_SOFT_
3a50: 4c 49 4d 49 54 29 0d 0a 23 20 64 65 66 69 6e 65 LIMIT)..# define
3a60: 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 SQLITE_MALLOC_S
3a70: 4f 46 54 5f 4c 49 4d 49 54 20 31 30 32 34 0d 0a OFT_LIMIT 1024..
3a80: 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
3a90: 20 57 65 20 6e 65 65 64 20 74 6f 20 64 65 66 69 We need to defi
3aa0: 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 ne _XOPEN_SOURCE
3ab0: 20 61 73 20 66 6f 6c 6c 6f 77 73 20 69 6e 20 6f as follows in o
3ac0: 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 0d 0a rder to enable..
3ad0: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 ** recursive mut
3ae0: 65 78 65 73 20 6f 6e 20 6d 6f 73 74 20 55 6e 69 exes on most Uni
3af0: 78 20 73 79 73 74 65 6d 73 2e 20 20 42 75 74 20 x systems. But
3b00: 4d 61 63 20 4f 53 20 58 20 69 73 20 64 69 66 66 Mac OS X is diff
3b10: 65 72 65 6e 74 2e 0d 0a 2a 2a 20 54 68 65 20 5f erent...** The _
3b20: 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 64 65 66 XOPEN_SOURCE def
3b30: 69 6e 65 20 63 61 75 73 65 73 20 70 72 6f 62 6c ine causes probl
3b40: 65 6d 73 20 66 6f 72 20 4d 61 63 20 4f 53 20 58 ems for Mac OS X
3b50: 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 0d 0a 2a we are told,..*
3b60: 2a 20 73 6f 20 69 74 20 69 73 20 6f 6d 69 74 74 * so it is omitt
3b70: 65 64 20 74 68 65 72 65 2e 20 20 53 65 65 20 74 ed there. See t
3b80: 69 63 6b 65 74 20 23 32 36 37 33 2e 0d 0a 2a 2a icket #2673...**
3b90: 0d 0a 2a 2a 20 4c 61 74 65 72 20 77 65 20 6c 65 ..** Later we le
3ba0: 61 72 6e 20 74 68 61 74 20 5f 58 4f 50 45 4e 5f arn that _XOPEN_
3bb0: 53 4f 55 52 43 45 20 69 73 20 70 6f 6f 72 6c 79 SOURCE is poorly
3bc0: 20 6f 72 20 69 6e 63 6f 72 72 65 63 74 6c 79 0d or incorrectly.
3bd0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 .** implemented
3be0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e on some systems.
3bf0: 20 20 53 6f 20 77 65 20 61 76 6f 69 64 20 64 65 So we avoid de
3c00: 66 69 6e 69 6e 67 20 69 74 20 61 74 20 61 6c 6c fining it at all
3c10: 0d 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61 6c ..** if it is al
3c20: 72 65 61 64 79 20 64 65 66 69 6e 65 64 20 6f 72 ready defined or
3c30: 20 69 66 20 69 74 20 69 73 20 75 6e 6e 65 65 64 if it is unneed
3c40: 65 64 20 62 65 63 61 75 73 65 20 77 65 20 61 72 ed because we ar
3c50: 65 0d 0a 2a 2a 20 6e 6f 74 20 64 6f 69 6e 67 20 e..** not doing
3c60: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 a threadsafe bui
3c70: 6c 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 38 ld. Ticket #268
3c80: 31 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 1...**..** See a
3c90: 6c 73 6f 20 74 69 63 6b 65 74 20 23 32 37 34 31 lso ticket #2741
3ca0: 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 21 64 65 66 69 ...*/..#if !defi
3cb0: 6e 65 64 28 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 ned(_XOPEN_SOURC
3cc0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f E) && !defined(_
3cd0: 5f 44 41 52 57 49 4e 5f 5f 29 20 26 26 20 21 64 _DARWIN__) && !d
3ce0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f efined(__APPLE__
3cf0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 ) && SQLITE_THRE
3d00: 41 44 53 41 46 45 0d 0a 23 20 20 64 65 66 69 6e ADSAFE..# defin
3d10: 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 e _XOPEN_SOURCE
3d20: 35 30 30 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 500 /* Needed t
3d30: 6f 20 65 6e 61 62 6c 65 20 70 74 68 72 65 61 64 o enable pthread
3d40: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 recursive mutex
3d50: 65 73 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 0d es */..#endif...
3d60: 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 54 43 4c 20 ./*..** The TCL
3d70: 68 65 61 64 65 72 73 20 61 72 65 20 6f 6e 6c 79 headers are only
3d80: 20 6e 65 65 64 65 64 20 77 68 65 6e 20 63 6f 6d needed when com
3d90: 70 69 6c 69 6e 67 20 74 68 65 20 54 43 4c 20 62 piling the TCL b
3da0: 69 6e 64 69 6e 67 73 2e 0d 0a 2a 2f 0d 0a 23 69 indings...*/..#i
3db0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
3dc0: 5f 54 43 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 _TCL) || defined
3dd0: 28 54 43 4c 53 48 29 0d 0a 23 20 69 6e 63 6c 75 (TCLSH)..# inclu
3de0: 64 65 20 3c 74 63 6c 2e 68 3e 0d 0a 23 65 6e 64 de <tcl.h>..#end
3df0: 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6e if..../*..** Man
3e00: 79 20 70 65 6f 70 6c 65 20 61 72 65 20 66 61 69 y people are fai
3e10: 6c 69 6e 67 20 74 6f 20 73 65 74 20 2d 44 4e 44 ling to set -DND
3e20: 45 42 55 47 3d 31 20 77 68 65 6e 20 63 6f 6d 70 EBUG=1 when comp
3e30: 69 6c 69 6e 67 20 53 51 4c 69 74 65 2e 0d 0a 2a iling SQLite...*
3e40: 2a 20 53 65 74 74 69 6e 67 20 4e 44 45 42 55 47 * Setting NDEBUG
3e50: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 makes the code
3e60: 73 6d 61 6c 6c 65 72 20 61 6e 64 20 72 75 6e 20 smaller and run
3e70: 66 61 73 74 65 72 2e 20 20 53 6f 20 74 68 65 20 faster. So the
3e80: 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 6c 69 following..** li
3e90: 6e 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f nes are added to
3ea0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 automatically s
3eb0: 65 74 20 4e 44 45 42 55 47 20 75 6e 6c 65 73 73 et NDEBUG unless
3ec0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 45 the -DSQLITE_DE
3ed0: 42 55 47 3d 31 0d 0a 2a 2a 20 6f 70 74 69 6f 6e BUG=1..** option
3ee0: 20 69 73 20 73 65 74 2e 20 20 54 68 75 73 20 4e is set. Thus N
3ef0: 44 45 42 55 47 20 62 65 63 6f 6d 65 73 20 61 6e DEBUG becomes an
3f00: 20 6f 70 74 2d 69 6e 20 72 61 74 68 65 72 20 74 opt-in rather t
3f10: 68 61 6e 20 61 6e 20 6f 70 74 2d 6f 75 74 0d 0a han an opt-out..
3f20: 2a 2a 20 66 65 61 74 75 72 65 2e 0d 0a 2a 2f 0d ** feature...*/.
3f30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 .#if !defined(ND
3f40: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 EBUG) && !define
3f50: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 d(SQLITE_DEBUG)
3f60: 0d 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55 ..# define NDEBU
3f70: 47 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f G 1..#endif..../
3f80: 2a 0d 0a 2a 2a 20 54 68 65 20 74 65 73 74 63 61 *..** The testca
3f90: 73 65 28 29 20 6d 61 63 72 6f 20 69 73 20 75 73 se() macro is us
3fa0: 65 64 20 74 6f 20 61 69 64 20 69 6e 20 63 6f 76 ed to aid in cov
3fb0: 65 72 61 67 65 20 74 65 73 74 69 6e 67 2e 20 20 erage testing.
3fc0: 57 68 65 6e 20 0d 0a 2a 2a 20 64 6f 69 6e 67 20 When ..** doing
3fd0: 63 6f 76 65 72 61 67 65 20 74 65 73 74 69 6e 67 coverage testing
3fe0: 2c 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 , the condition
3ff0: 69 6e 73 69 64 65 20 74 68 65 20 61 72 67 75 6d inside the argum
4000: 65 6e 74 20 74 6f 0d 0a 2a 2a 20 74 65 73 74 63 ent to..** testc
4010: 61 73 65 28 29 20 6d 75 73 74 20 62 65 20 65 76 ase() must be ev
4020: 61 6c 75 61 74 65 64 20 62 6f 74 68 20 74 72 75 aluated both tru
4030: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 6e 20 6f e and false in o
4040: 72 64 65 72 20 74 6f 0d 0a 2a 2a 20 67 65 74 20 rder to..** get
4050: 66 75 6c 6c 20 62 72 61 6e 63 68 20 63 6f 76 65 full branch cove
4060: 72 61 67 65 2e 20 20 54 68 65 20 74 65 73 74 63 rage. The testc
4070: 61 73 65 28 29 20 6d 61 63 72 6f 20 69 73 20 69 ase() macro is i
4080: 6e 73 65 72 74 65 64 0d 0a 2a 2a 20 74 6f 20 68 nserted..** to h
4090: 65 6c 70 20 65 6e 73 75 72 65 20 61 64 65 71 75 elp ensure adequ
40a0: 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 ate test coverag
40b0: 65 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 e in places wher
40c0: 65 20 73 69 6d 70 6c 65 0d 0a 2a 2a 20 63 6f 6e e simple..** con
40d0: 64 69 74 69 6f 6e 2f 64 65 63 69 73 69 6f 6e 20 dition/decision
40e0: 63 6f 76 65 72 61 67 65 20 69 73 20 69 6e 61 64 coverage is inad
40f0: 65 71 75 61 74 65 2e 20 20 46 6f 72 20 65 78 61 equate. For exa
4100: 6d 70 6c 65 2c 20 74 65 73 74 63 61 73 65 28 29 mple, testcase()
4110: 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 ..** can be used
4120: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 62 6f to make sure bo
4130: 75 6e 64 61 72 79 20 76 61 6c 75 65 73 20 61 72 undary values ar
4140: 65 20 74 65 73 74 65 64 2e 20 20 46 6f 72 0d 0a e tested. For..
4150: 2a 2a 20 62 69 74 6d 61 73 6b 20 74 65 73 74 73 ** bitmask tests
4160: 2c 20 74 65 73 74 63 61 73 65 28 29 20 63 61 6e , testcase() can
4170: 20 62 65 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 be used to make
4180: 20 73 75 72 65 20 65 61 63 68 20 62 69 74 0d 0a sure each bit..
4190: 2a 2a 20 69 73 20 73 69 67 6e 69 66 69 63 61 6e ** is significan
41a0: 74 20 61 6e 64 20 75 73 65 64 20 61 74 20 6c 65 t and used at le
41b0: 61 73 74 20 6f 6e 63 65 2e 20 20 4f 6e 20 73 77 ast once. On sw
41c0: 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 73 0d itch statements.
41d0: 0a 2a 2a 20 77 68 65 72 65 20 6d 75 6c 74 69 70 .** where multip
41e0: 6c 65 20 63 61 73 65 73 20 67 6f 20 74 6f 20 74 le cases go to t
41f0: 68 65 20 73 61 6d 65 20 62 6c 6f 63 6b 20 6f 66 he same block of
4200: 20 63 6f 64 65 2c 20 74 65 73 74 63 61 73 65 28 code, testcase(
4210: 29 0d 0a 2a 2a 20 63 61 6e 20 69 6e 73 75 72 65 )..** can insure
4220: 20 74 68 61 74 20 61 6c 6c 20 63 61 73 65 73 20 that all cases
4230: 61 72 65 20 65 76 61 6c 75 61 74 65 64 2e 0d 0a are evaluated...
4240: 2a 2a 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 **..*/..#ifdef S
4250: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 QLITE_COVERAGE_T
4260: 45 53 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 EST..SQLITE_PRIV
4270: 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
4280: 65 33 43 6f 76 65 72 61 67 65 28 69 6e 74 29 3b e3Coverage(int);
4290: 0d 0a 23 20 64 65 66 69 6e 65 20 74 65 73 74 63 ..# define testc
42a0: 61 73 65 28 58 29 20 20 69 66 28 20 58 20 29 7b ase(X) if( X ){
42b0: 20 73 71 6c 69 74 65 33 43 6f 76 65 72 61 67 65 sqlite3Coverage
42c0: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 7d 0d 0a 23 (__LINE__); }..#
42d0: 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 74 else..# define t
42e0: 65 73 74 63 61 73 65 28 58 29 0d 0a 23 65 6e 64 estcase(X)..#end
42f0: 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 if..../*..** The
4300: 20 54 45 53 54 4f 4e 4c 59 20 6d 61 63 72 6f 20 TESTONLY macro
4310: 69 73 20 75 73 65 64 20 74 6f 20 65 6e 63 6c 6f is used to enclo
4320: 73 65 20 76 61 72 69 61 62 6c 65 20 64 65 63 6c se variable decl
4330: 61 72 61 74 69 6f 6e 73 20 6f 72 0d 0a 2a 2a 20 arations or..**
4340: 6f 74 68 65 72 20 62 69 74 73 20 6f 66 20 63 6f other bits of co
4350: 64 65 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 de that are need
4360: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 ed to support th
4370: 65 20 61 72 67 75 6d 65 6e 74 73 0d 0a 2a 2a 20 e arguments..**
4380: 77 69 74 68 69 6e 20 74 65 73 74 63 61 73 65 28 within testcase(
4390: 29 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 6d ) and assert() m
43a0: 61 63 72 6f 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 acros...*/..#if
43b0: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 !defined(NDEBUG)
43c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 || defined(SQLI
43d0: 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 TE_COVERAGE_TEST
43e0: 29 0d 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 )..# define TEST
43f0: 4f 4e 4c 59 28 58 29 20 20 58 0d 0a 23 65 6c 73 ONLY(X) X..#els
4400: 65 0d 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 e..# define TEST
4410: 4f 4e 4c 59 28 58 29 0d 0a 23 65 6e 64 69 66 0d ONLY(X)..#endif.
4420: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 6f 6d 65 74 69 .../*..** Someti
4430: 6d 65 73 20 77 65 20 6e 65 65 64 20 61 20 73 6d mes we need a sm
4440: 61 6c 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f all amount of co
4450: 64 65 20 73 75 63 68 20 61 73 20 61 20 76 61 72 de such as a var
4460: 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 iable initializa
4470: 74 69 6f 6e 0d 0a 2a 2a 20 74 6f 20 73 65 74 75 tion..** to setu
4480: 70 20 66 6f 72 20 61 20 6c 61 74 65 72 20 61 73 p for a later as
4490: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 sert() statement
44a0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e . We do not wan
44b0: 74 20 74 68 69 73 20 63 6f 64 65 20 74 6f 0d 0a t this code to..
44c0: 2a 2a 20 61 70 70 65 61 72 20 77 68 65 6e 20 61 ** appear when a
44d0: 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 ssert() is disab
44e0: 6c 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 led. The follow
44f0: 69 6e 67 20 6d 61 63 72 6f 20 69 73 20 74 68 65 ing macro is the
4500: 72 65 66 6f 72 65 0d 0a 2a 2a 20 75 73 65 64 20 refore..** used
4510: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 61 74 20 to contain that
4520: 73 65 74 75 70 20 63 6f 64 65 2e 20 20 54 68 65 setup code. The
4530: 20 22 56 56 41 22 20 61 63 72 6f 6e 79 6d 20 73 "VVA" acronym s
4540: 74 61 6e 64 73 20 66 6f 72 0d 0a 2a 2a 20 22 56 tands for..** "V
4550: 65 72 69 66 69 63 61 74 69 6f 6e 2c 20 56 61 6c erification, Val
4560: 69 64 61 74 69 6f 6e 2c 20 61 6e 64 20 41 63 63 idation, and Acc
4570: 72 65 64 69 74 61 74 69 6f 6e 22 2e 20 20 49 6e reditation". In
4580: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 other words, th
4590: 65 0d 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 69 e..** code withi
45a0: 6e 20 56 56 41 5f 4f 4e 4c 59 28 29 20 77 69 6c n VVA_ONLY() wil
45b0: 6c 20 6f 6e 6c 79 20 72 75 6e 20 64 75 72 69 6e l only run durin
45c0: 67 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 g verification p
45d0: 72 6f 63 65 73 73 65 73 2e 0d 0a 2a 2f 0d 0a 23 rocesses...*/..#
45e0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 23 ifndef NDEBUG..#
45f0: 20 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 define VVA_ONLY
4600: 28 58 29 20 20 58 0d 0a 23 65 6c 73 65 0d 0a 23 (X) X..#else..#
4610: 20 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 define VVA_ONLY
4620: 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f (X)..#endif..../
4630: 2a 0d 0a 2a 2a 20 54 68 65 20 41 4c 57 41 59 53 *..** The ALWAYS
4640: 20 61 6e 64 20 4e 45 56 45 52 20 6d 61 63 72 6f and NEVER macro
4650: 73 20 73 75 72 72 6f 75 6e 64 20 62 6f 6f 6c 65 s surround boole
4660: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 an expressions w
4670: 68 69 63 68 20 0d 0a 2a 2a 20 61 72 65 20 69 6e hich ..** are in
4680: 74 65 6e 64 65 64 20 74 6f 20 61 6c 77 61 79 73 tended to always
4690: 20 62 65 20 74 72 75 65 20 6f 72 20 66 61 6c 73 be true or fals
46a0: 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e e, respectively.
46b0: 20 20 53 75 63 68 0d 0a 2a 2a 20 65 78 70 72 65 Such..** expre
46c0: 73 73 69 6f 6e 73 20 63 6f 75 6c 64 20 62 65 20 ssions could be
46d0: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 omitted from the
46e0: 20 63 6f 64 65 20 63 6f 6d 70 6c 65 74 65 6c 79 code completely
46f0: 2e 20 20 42 75 74 20 74 68 65 79 0d 0a 2a 2a 20 . But they..**
4700: 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 are included in
4710: 61 20 66 65 77 20 63 61 73 65 73 20 69 6e 20 6f a few cases in o
4720: 72 64 65 72 20 74 6f 20 65 6e 68 61 6e 63 65 20 rder to enhance
4730: 74 68 65 20 72 65 73 69 6c 69 65 6e 63 65 0d 0a the resilience..
4740: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 ** of SQLite to
4750: 75 6e 65 78 70 65 63 74 65 64 20 62 65 68 61 76 unexpected behav
4760: 69 6f 72 20 2d 20 74 6f 20 6d 61 6b 65 20 74 68 ior - to make th
4770: 65 20 63 6f 64 65 20 22 73 65 6c 66 2d 68 65 61 e code "self-hea
4780: 6c 69 6e 67 22 0d 0a 2a 2a 20 6f 72 20 22 64 75 ling"..** or "du
4790: 63 74 69 6c 65 22 20 72 61 74 68 65 72 20 74 68 ctile" rather th
47a0: 61 6e 20 62 65 69 6e 67 20 22 62 72 69 74 74 6c an being "brittl
47b0: 65 22 20 61 6e 64 20 63 72 61 73 68 69 6e 67 20 e" and crashing
47c0: 61 74 20 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a at the first..**
47d0: 20 68 69 6e 74 20 6f 66 20 75 6e 70 6c 61 6e 6e hint of unplann
47e0: 65 64 20 62 65 68 61 76 69 6f 72 2e 0d 0a 2a 2a ed behavior...**
47f0: 0d 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f ..** In other wo
4800: 72 64 73 2c 20 41 4c 57 41 59 53 20 61 6e 64 20 rds, ALWAYS and
4810: 4e 45 56 45 52 20 61 72 65 20 61 64 64 65 64 20 NEVER are added
4820: 66 6f 72 20 64 65 66 65 6e 73 69 76 65 20 63 6f for defensive co
4830: 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e de...**..** When
4840: 20 64 6f 69 6e 67 20 63 6f 76 65 72 61 67 65 20 doing coverage
4850: 74 65 73 74 69 6e 67 20 41 4c 57 41 59 53 20 61 testing ALWAYS a
4860: 6e 64 20 4e 45 56 45 52 20 61 72 65 20 68 61 72 nd NEVER are har
4870: 64 2d 63 6f 64 65 64 20 74 6f 0d 0a 2a 2a 20 62 d-coded to..** b
4880: 65 20 74 72 75 65 20 61 6e 64 20 66 61 6c 73 65 e true and false
4890: 20 73 6f 20 74 68 61 74 20 74 68 65 20 75 6e 72 so that the unr
48a0: 65 61 63 68 61 62 6c 65 20 63 6f 64 65 20 74 68 eachable code th
48b0: 65 6e 20 73 70 65 63 69 66 79 20 77 69 6c 6c 0d en specify will.
48c0: 0a 2a 2a 20 6e 6f 74 20 62 65 20 63 6f 75 6e 74 .** not be count
48d0: 65 64 20 61 73 20 75 6e 74 65 73 74 65 64 20 63 ed as untested c
48e0: 6f 64 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 ode...*/..#if de
48f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 fined(SQLITE_COV
4900: 45 52 41 47 45 5f 54 45 53 54 29 0d 0a 23 20 64 ERAGE_TEST)..# d
4910: 65 66 69 6e 65 20 41 4c 57 41 59 53 28 58 29 20 efine ALWAYS(X)
4920: 20 20 20 20 20 28 31 29 0d 0a 23 20 64 65 66 69 (1)..# defi
4930: 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20 20 20 ne NEVER(X)
4940: 20 20 28 30 29 0d 0a 23 65 6c 69 66 20 21 64 65 (0)..#elif !de
4950: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0d 0a 23 fined(NDEBUG)..#
4960: 20 64 65 66 69 6e 65 20 41 4c 57 41 59 53 28 58 define ALWAYS(X
4970: 29 20 20 20 20 20 20 28 28 58 29 3f 31 3a 28 61 ) ((X)?1:(a
4980: 73 73 65 72 74 28 30 29 2c 30 29 29 0d 0a 23 20 ssert(0),0))..#
4990: 64 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20 define NEVER(X)
49a0: 20 20 20 20 20 20 28 28 58 29 3f 28 61 73 73 65 ((X)?(asse
49b0: 72 74 28 30 29 2c 31 29 3a 30 29 0d 0a 23 65 6c rt(0),1):0)..#el
49c0: 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 se..# define ALW
49d0: 41 59 53 28 58 29 20 20 20 20 20 20 28 58 29 0d AYS(X) (X).
49e0: 0a 23 20 64 65 66 69 6e 65 20 4e 45 56 45 52 28 .# define NEVER(
49f0: 58 29 20 20 20 20 20 20 20 28 58 29 0d 0a 23 65 X) (X)..#e
4a00: 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ndif..../*..** R
4a10: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d eturn true (non-
4a20: 7a 65 72 6f 29 20 69 66 20 74 68 65 20 69 6e 70 zero) if the inp
4a30: 75 74 20 69 73 20 61 20 69 6e 74 65 67 65 72 20 ut is a integer
4a40: 74 68 61 74 20 69 73 20 74 6f 6f 20 6c 61 72 67 that is too larg
4a50: 65 0d 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 e..** to fit in
4a60: 33 32 2d 62 69 74 73 2e 20 20 54 68 69 73 20 6d 32-bits. This m
4a70: 61 63 72 6f 20 69 73 20 75 73 65 64 20 69 6e 73 acro is used ins
4a80: 69 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 74 ide of various t
4a90: 65 73 74 63 61 73 65 28 29 0d 0a 2a 2a 20 6d 61 estcase()..** ma
4aa0: 63 72 6f 73 20 74 6f 20 76 65 72 69 66 79 20 74 cros to verify t
4ab0: 68 61 74 20 77 65 20 68 61 76 65 20 74 65 73 74 hat we have test
4ac0: 65 64 20 53 51 4c 69 74 65 20 66 6f 72 20 6c 61 ed SQLite for la
4ad0: 72 67 65 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 rge-file support
4ae0: 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 49 ...*/..#define I
4af0: 53 5f 42 49 47 5f 49 4e 54 28 58 29 20 20 28 28 S_BIG_INT(X) ((
4b00: 28 58 29 26 7e 28 69 36 34 29 30 78 66 66 66 66 (X)&~(i64)0xffff
4b10: 66 66 66 66 29 21 3d 30 29 0d 0a 0d 0a 2f 2a 0d ffff)!=0)..../*.
4b20: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 75 6e .** The macro un
4b30: 6c 69 6b 65 6c 79 28 29 20 69 73 20 61 20 68 69 likely() is a hi
4b40: 6e 74 20 74 68 61 74 20 73 75 72 72 6f 75 6e 64 nt that surround
4b50: 73 20 61 20 62 6f 6f 6c 65 61 6e 0d 0a 2a 2a 20 s a boolean..**
4b60: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 expression that
4b70: 69 73 20 75 73 75 61 6c 6c 79 20 66 61 6c 73 65 is usually false
4b80: 2e 20 20 4d 61 63 72 6f 20 6c 69 6b 65 6c 79 28 . Macro likely(
4b90: 29 20 73 75 72 72 6f 75 6e 64 73 0d 0a 2a 2a 20 ) surrounds..**
4ba0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 a boolean expres
4bb0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 75 73 75 sion that is usu
4bc0: 61 6c 6c 79 20 74 72 75 65 2e 20 20 47 43 43 20 ally true. GCC
4bd0: 69 73 20 61 62 6c 65 20 74 6f 0d 0a 2a 2a 20 75 is able to..** u
4be0: 73 65 20 74 68 65 73 65 20 68 69 6e 74 73 20 74 se these hints t
4bf0: 6f 20 67 65 6e 65 72 61 74 65 20 62 65 74 74 65 o generate bette
4c00: 72 20 63 6f 64 65 2c 20 73 6f 6d 65 74 69 6d 65 r code, sometime
4c10: 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69 s...*/..#if defi
4c20: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26 26 ned(__GNUC__) &&
4c30: 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 6c 69 6b 0..# define lik
4c40: 65 6c 79 28 58 29 20 20 20 20 5f 5f 62 75 69 6c ely(X) __buil
4c50: 74 69 6e 5f 65 78 70 65 63 74 28 28 58 29 2c 31 tin_expect((X),1
4c60: 29 0d 0a 23 20 64 65 66 69 6e 65 20 75 6e 6c 69 )..# define unli
4c70: 6b 65 6c 79 28 58 29 20 20 5f 5f 62 75 69 6c 74 kely(X) __built
4c80: 69 6e 5f 65 78 70 65 63 74 28 28 58 29 2c 30 29 in_expect((X),0)
4c90: 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
4ca0: 65 20 6c 69 6b 65 6c 79 28 58 29 20 20 20 20 21 e likely(X) !
4cb0: 21 28 58 29 0d 0a 23 20 64 65 66 69 6e 65 20 75 !(X)..# define u
4cc0: 6e 6c 69 6b 65 6c 79 28 58 29 20 20 21 21 28 58 nlikely(X) !!(X
4cd0: 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 2a )..#endif..../**
4ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 ************ Inc
4cf0: 6c 75 64 65 20 73 71 6c 69 74 65 33 2e 68 20 69 lude sqlite3.h i
4d00: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 n the middle of
4d10: 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a sqliteInt.h ****
4d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a ***********/../*
4d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 ************* Be
4d40: 67 69 6e 20 66 69 6c 65 20 73 71 6c 69 74 65 33 gin file sqlite3
4d50: 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .h *************
4d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
4d80: 2a 0d 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 *..** 2001 Septe
4d90: 6d 62 65 72 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 mber 15..**..**
4da0: 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c The author discl
4db0: 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 aims copyright t
4dc0: 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f o this source co
4dd0: 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 de. In place of
4de0: 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 ..** a legal not
4df0: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 ice, here is a b
4e00: 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a lessing:..**..**
4e10: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 May you do g
4e20: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c ood and not evil
4e30: 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
4e40: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 find forgivenes
4e50: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 s for yourself a
4e60: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 nd forgive other
4e70: 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f s...** May yo
4e80: 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 u share freely,
4e90: 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 never taking mor
4ea0: 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e e than you give.
4eb0: 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**..**********
4ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
4f00: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 .** This header
4f10: 66 69 6c 65 20 64 65 66 69 6e 65 73 20 74 68 65 file defines the
4f20: 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 20 interface that
4f30: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 the SQLite libra
4f40: 72 79 0d 0a 2a 2a 20 70 72 65 73 65 6e 74 73 20 ry..** presents
4f50: 74 6f 20 63 6c 69 65 6e 74 20 70 72 6f 67 72 61 to client progra
4f60: 6d 73 2e 20 20 49 66 20 61 20 43 2d 66 75 6e 63 ms. If a C-func
4f70: 74 69 6f 6e 2c 20 73 74 72 75 63 74 75 72 65 2c tion, structure,
4f80: 20 64 61 74 61 74 79 70 65 2c 0d 0a 2a 2a 20 6f datatype,..** o
4f90: 72 20 63 6f 6e 73 74 61 6e 74 20 64 65 66 69 6e r constant defin
4fa0: 69 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 ition does not a
4fb0: 70 70 65 61 72 20 69 6e 20 74 68 69 73 20 66 69 ppear in this fi
4fc0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0d 0a le, then it is..
4fd0: 2a 2a 20 6e 6f 74 20 61 20 70 75 62 6c 69 73 68 ** not a publish
4fe0: 65 64 20 41 50 49 20 6f 66 20 53 51 4c 69 74 65 ed API of SQLite
4ff0: 2c 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 , is subject to
5000: 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 0d 0a change without..
5010: 2a 2a 20 6e 6f 74 69 63 65 2c 20 61 6e 64 20 73 ** notice, and s
5020: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 66 hould not be ref
5030: 65 72 65 6e 63 65 64 20 62 79 20 70 72 6f 67 72 erenced by progr
5040: 61 6d 73 20 74 68 61 74 20 75 73 65 20 53 51 4c ams that use SQL
5050: 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f 6d ite...**..** Som
5060: 65 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 e of the definit
5070: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e ions that are in
5080: 20 74 68 69 73 20 66 69 6c 65 20 61 72 65 20 6d this file are m
5090: 61 72 6b 65 64 20 61 73 0d 0a 2a 2a 20 22 65 78 arked as..** "ex
50a0: 70 65 72 69 6d 65 6e 74 61 6c 22 2e 20 20 45 78 perimental". Ex
50b0: 70 65 72 69 6d 65 6e 74 61 6c 20 69 6e 74 65 72 perimental inter
50c0: 66 61 63 65 73 20 61 72 65 20 6e 6f 72 6d 61 6c faces are normal
50d0: 6c 79 20 6e 65 77 0d 0a 2a 2a 20 66 65 61 74 75 ly new..** featu
50e0: 72 65 73 20 72 65 63 65 6e 74 6c 79 20 61 64 64 res recently add
50f0: 65 64 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 57 ed to SQLite. W
5100: 65 20 64 6f 20 6e 6f 74 20 61 6e 74 69 63 69 70 e do not anticip
5110: 61 74 65 20 63 68 61 6e 67 65 73 0d 0a 2a 2a 20 ate changes..**
5120: 74 6f 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 20 to experimental
5130: 69 6e 74 65 72 66 61 63 65 73 20 62 75 74 20 72 interfaces but r
5140: 65 73 65 72 76 65 20 74 68 65 20 72 69 67 68 74 eserve the right
5150: 20 74 6f 20 6d 61 6b 65 20 6d 69 6e 6f 72 20 63 to make minor c
5160: 68 61 6e 67 65 73 0d 0a 2a 2a 20 69 66 20 65 78 hanges..** if ex
5170: 70 65 72 69 65 6e 63 65 20 66 72 6f 6d 20 75 73 perience from us
5180: 65 20 22 69 6e 20 74 68 65 20 77 69 6c 64 22 20 e "in the wild"
5190: 73 75 67 67 65 73 74 20 73 75 63 68 20 63 68 61 suggest such cha
51a0: 6e 67 65 73 20 61 72 65 20 70 72 75 64 65 6e 74 nges are prudent
51b0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f 66 ...**..** The of
51c0: 66 69 63 69 61 6c 20 43 2d 6c 61 6e 67 75 61 67 ficial C-languag
51d0: 65 20 41 50 49 20 64 6f 63 75 6d 65 6e 74 61 74 e API documentat
51e0: 69 6f 6e 20 66 6f 72 20 53 51 4c 69 74 65 20 69 ion for SQLite i
51f0: 73 20 64 65 72 69 76 65 64 0d 0a 2a 2a 20 66 72 s derived..** fr
5200: 6f 6d 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 om comments in t
5210: 68 69 73 20 66 69 6c 65 2e 20 20 54 68 69 73 20 his file. This
5220: 66 69 6c 65 20 69 73 20 74 68 65 20 61 75 74 68 file is the auth
5230: 6f 72 69 74 61 74 69 76 65 20 73 6f 75 72 63 65 oritative source
5240: 0d 0a 2a 2a 20 6f 6e 20 68 6f 77 20 53 51 4c 69 ..** on how SQLi
5250: 74 65 20 69 6e 74 65 72 66 61 63 65 73 20 61 72 te interfaces ar
5260: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 6f 70 65 e suppose to ope
5270: 72 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 rate...**..** Th
5280: 65 20 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 e name of this f
5290: 69 6c 65 20 75 6e 64 65 72 20 63 6f 6e 66 69 67 ile under config
52a0: 75 72 61 74 69 6f 6e 20 6d 61 6e 61 67 65 6d 65 uration manageme
52b0: 6e 74 20 69 73 20 22 73 71 6c 69 74 65 2e 68 2e nt is "sqlite.h.
52c0: 69 6e 22 2e 0d 0a 2a 2a 20 54 68 65 20 6d 61 6b in"...** The mak
52d0: 65 66 69 6c 65 20 6d 61 6b 65 73 20 73 6f 6d 65 efile makes some
52e0: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 minor changes t
52f0: 6f 20 74 68 69 73 20 66 69 6c 65 20 28 73 75 63 o this file (suc
5300: 68 20 61 73 20 69 6e 73 65 72 74 69 6e 67 0d 0a h as inserting..
5310: 2a 2a 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e ** the version n
5320: 75 6d 62 65 72 29 20 61 6e 64 20 63 68 61 6e 67 umber) and chang
5330: 65 73 20 69 74 73 20 6e 61 6d 65 20 74 6f 20 22 es its name to "
5340: 73 71 6c 69 74 65 33 2e 68 22 20 61 73 0d 0a 2a sqlite3.h" as..*
5350: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 75 * part of the bu
5360: 69 6c 64 20 70 72 6f 63 65 73 73 2e 0d 0a 2a 2f ild process...*/
5370: 0d 0a 23 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 ..#ifndef _SQLIT
5380: 45 33 5f 48 5f 0d 0a 23 64 65 66 69 6e 65 20 5f E3_H_..#define _
5390: 53 51 4c 49 54 45 33 5f 48 5f 0d 0a 23 69 6e 63 SQLITE3_H_..#inc
53a0: 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 20 lude <stdarg.h>
53b0: 20 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f /* Needed fo
53c0: 72 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e r the definition
53d0: 20 6f 66 20 76 61 5f 6c 69 73 74 20 2a 2f 0d 0a of va_list */..
53e0: 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 20 73 75 ../*..** Make su
53f0: 72 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 re we can call t
5400: 68 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 his stuff from C
5410: 2b 2b 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 30 0d 0a ++...*/..#if 0..
5420: 65 78 74 65 72 6e 20 22 43 22 20 7b 0d 0a 23 65 extern "C" {..#e
5430: 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ndif....../*..**
5440: 20 41 64 64 20 74 68 65 20 61 62 69 6c 69 74 79 Add the ability
5450: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 27 65 78 to override 'ex
5460: 74 65 72 6e 27 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 tern'..*/..#ifnd
5470: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 45 52 4e ef SQLITE_EXTERN
5480: 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 ..# define SQLIT
5490: 45 5f 45 58 54 45 52 4e 20 65 78 74 65 72 6e 0d E_EXTERN extern.
54a0: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 .#endif....#ifnd
54b0: 65 66 20 53 51 4c 49 54 45 5f 41 50 49 0d 0a 23 ef SQLITE_API..#
54c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 define SQLITE_A
54d0: 50 49 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a PI..#endif......
54e0: 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 6e 6f 2d /*..** These no-
54f0: 6f 70 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 op macros are us
5500: 65 64 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 69 ed in front of i
5510: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 6d 61 72 nterfaces to mar
5520: 6b 20 74 68 6f 73 65 0d 0a 2a 2a 20 69 6e 74 65 k those..** inte
5530: 72 66 61 63 65 73 20 61 73 20 65 69 74 68 65 72 rfaces as either
5540: 20 64 65 70 72 65 63 61 74 65 64 20 6f 72 20 65 deprecated or e
5550: 78 70 65 72 69 6d 65 6e 74 61 6c 2e 20 20 4e 65 xperimental. Ne
5560: 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0d 0a w applications..
5570: 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 75 73 ** should not us
5580: 65 20 64 65 70 72 65 63 61 74 65 64 20 69 6e 74 e deprecated int
5590: 65 72 66 61 63 65 73 20 2d 20 74 68 65 79 20 61 erfaces - they a
55a0: 72 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 62 re support for b
55b0: 61 63 6b 77 61 72 64 73 0d 0a 2a 2a 20 63 6f 6d ackwards..** com
55c0: 70 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e patibility only.
55d0: 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 77 72 Application wr
55e0: 69 74 65 72 73 20 73 68 6f 75 6c 64 20 62 65 20 iters should be
55f0: 61 77 61 72 65 20 74 68 61 74 0d 0a 2a 2a 20 65 aware that..** e
5600: 78 70 65 72 69 6d 65 6e 74 61 6c 20 69 6e 74 65 xperimental inte
5610: 72 66 61 63 65 73 20 61 72 65 20 73 75 62 6a 65 rfaces are subje
5620: 63 74 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 20 ct to change in
5630: 70 6f 69 6e 74 20 72 65 6c 65 61 73 65 73 2e 0d point releases..
5640: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 6d 61 .**..** These ma
5650: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 72 65 73 cros used to res
5660: 6f 6c 76 65 20 74 6f 20 76 61 72 69 6f 75 73 20 olve to various
5670: 6b 69 6e 64 73 20 6f 66 20 63 6f 6d 70 69 6c 65 kinds of compile
5680: 72 20 6d 61 67 69 63 20 74 68 61 74 0d 0a 2a 2a r magic that..**
5690: 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 would generate
56a0: 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 73 warning messages
56b0: 20 77 68 65 6e 20 74 68 65 79 20 77 65 72 65 20 when they were
56c0: 75 73 65 64 2e 20 20 42 75 74 20 74 68 61 74 0d used. But that.
56d0: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 6d 61 67 .** compiler mag
56e0: 69 63 20 65 6e 64 65 64 20 75 70 20 67 65 6e 65 ic ended up gene
56f0: 72 61 74 69 6e 67 20 73 75 63 68 20 61 20 66 6c rating such a fl
5700: 75 72 72 79 20 6f 66 20 62 75 67 20 72 65 70 6f urry of bug repo
5710: 72 74 73 0d 0a 2a 2a 20 74 68 61 74 20 77 65 20 rts..** that we
5720: 68 61 76 65 20 74 61 6b 65 6e 20 69 74 20 61 6c have taken it al
5730: 6c 20 6f 75 74 20 61 6e 64 20 67 6f 6e 65 20 62 l out and gone b
5740: 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 73 69 6d ack to using sim
5750: 70 6c 65 0d 0a 2a 2a 20 6e 6f 6f 70 20 6d 61 63 ple..** noop mac
5760: 72 6f 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e ros...*/..#defin
5770: 65 20 53 51 4c 49 54 45 5f 44 45 50 52 45 43 41 e SQLITE_DEPRECA
5780: 54 45 44 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c TED..#define SQL
5790: 49 54 45 5f 45 58 50 45 52 49 4d 45 4e 54 41 4c ITE_EXPERIMENTAL
57a0: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 73 75 72 ..../*..** Ensur
57b0: 65 20 74 68 65 73 65 20 73 79 6d 62 6f 6c 73 20 e these symbols
57c0: 77 65 72 65 20 6e 6f 74 20 64 65 66 69 6e 65 64 were not defined
57d0: 20 62 79 20 73 6f 6d 65 20 70 72 65 76 69 6f 75 by some previou
57e0: 73 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0d 0a s header file...
57f0: 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
5800: 45 5f 56 45 52 53 49 4f 4e 0d 0a 23 20 75 6e 64 E_VERSION..# und
5810: 65 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f ef SQLITE_VERSIO
5820: 4e 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 N..#endif..#ifde
5830: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e f SQLITE_VERSION
5840: 5f 4e 55 4d 42 45 52 0d 0a 23 20 75 6e 64 65 66 _NUMBER..# undef
5850: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f SQLITE_VERSION_
5860: 4e 55 4d 42 45 52 0d 0a 23 65 6e 64 69 66 0d 0a NUMBER..#endif..
5870: 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
5880: 46 3a 20 43 6f 6d 70 69 6c 65 2d 54 69 6d 65 20 F: Compile-Time
5890: 4c 69 62 72 61 72 79 20 56 65 72 73 69 6f 6e 20 Library Version
58a0: 4e 75 6d 62 65 72 73 0d 0a 2a 2a 0d 0a 2a 2a 20 Numbers..**..**
58b0: 5e 28 54 68 65 20 5b 53 51 4c 49 54 45 5f 56 45 ^(The [SQLITE_VE
58c0: 52 53 49 4f 4e 5d 20 43 20 70 72 65 70 72 6f 63 RSION] C preproc
58d0: 65 73 73 6f 72 20 6d 61 63 72 6f 20 69 6e 20 74 essor macro in t
58e0: 68 65 20 73 71 6c 69 74 65 33 2e 68 20 68 65 61 he sqlite3.h hea
58f0: 64 65 72 0d 0a 2a 2a 20 65 76 61 6c 75 61 74 65 der..** evaluate
5900: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6c 69 s to a string li
5910: 74 65 72 61 6c 20 74 68 61 74 20 69 73 20 74 68 teral that is th
5920: 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e e SQLite version
5930: 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 66 6f 72 6d in the..** form
5940: 61 74 20 22 58 2e 59 2e 5a 22 20 77 68 65 72 65 at "X.Y.Z" where
5950: 20 58 20 69 73 20 74 68 65 20 6d 61 6a 6f 72 20 X is the major
5960: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 28 version number (
5970: 61 6c 77 61 79 73 20 33 20 66 6f 72 0d 0a 2a 2a always 3 for..**
5980: 20 53 51 4c 69 74 65 33 29 20 61 6e 64 20 59 20 SQLite3) and Y
5990: 69 73 20 74 68 65 20 6d 69 6e 6f 72 20 76 65 72 is the minor ver
59a0: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 sion number and
59b0: 5a 20 69 73 20 74 68 65 20 72 65 6c 65 61 73 65 Z is the release
59c0: 20 6e 75 6d 62 65 72 2e 29 5e 0d 0a 2a 2a 20 5e number.)^..** ^
59d0: 28 54 68 65 20 5b 53 51 4c 49 54 45 5f 56 45 52 (The [SQLITE_VER
59e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 5d 20 43 20 70 SION_NUMBER] C p
59f0: 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 reprocessor macr
5a00: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 6e o resolves to an
5a10: 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 77 69 74 integer..** wit
5a20: 68 20 74 68 65 20 76 61 6c 75 65 20 28 58 2a 31 h the value (X*1
5a30: 30 30 30 30 30 30 20 2b 20 59 2a 31 30 30 30 20 000000 + Y*1000
5a40: 2b 20 5a 29 20 77 68 65 72 65 20 58 2c 20 59 2c + Z) where X, Y,
5a50: 20 61 6e 64 20 5a 20 61 72 65 20 74 68 65 20 73 and Z are the s
5a60: 61 6d 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 ame..** numbers
5a70: 75 73 65 64 20 69 6e 20 5b 53 51 4c 49 54 45 5f used in [SQLITE_
5a80: 56 45 52 53 49 4f 4e 5d 2e 29 5e 0d 0a 2a 2a 20 VERSION].)^..**
5a90: 54 68 65 20 53 51 4c 49 54 45 5f 56 45 52 53 49 The SQLITE_VERSI
5aa0: 4f 4e 5f 4e 55 4d 42 45 52 20 66 6f 72 20 61 6e ON_NUMBER for an
5ab0: 79 20 67 69 76 65 6e 20 72 65 6c 65 61 73 65 20 y given release
5ac0: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 61 of SQLite will a
5ad0: 6c 73 6f 0d 0a 2a 2a 20 62 65 20 6c 61 72 67 65 lso..** be large
5ae0: 72 20 74 68 61 6e 20 74 68 65 20 72 65 6c 65 61 r than the relea
5af0: 73 65 20 66 72 6f 6d 20 77 68 69 63 68 20 69 74 se from which it
5b00: 20 69 73 20 64 65 72 69 76 65 64 2e 20 20 45 69 is derived. Ei
5b10: 74 68 65 72 20 59 20 77 69 6c 6c 0d 0a 2a 2a 20 ther Y will..**
5b20: 62 65 20 68 65 6c 64 20 63 6f 6e 73 74 61 6e 74 be held constant
5b30: 20 61 6e 64 20 5a 20 77 69 6c 6c 20 62 65 20 69 and Z will be i
5b40: 6e 63 72 65 6d 65 6e 74 65 64 20 6f 72 20 65 6c ncremented or el
5b50: 73 65 20 59 20 77 69 6c 6c 20 62 65 20 69 6e 63 se Y will be inc
5b60: 72 65 6d 65 6e 74 65 64 0d 0a 2a 2a 20 61 6e 64 remented..** and
5b70: 20 5a 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74 Z will be reset
5b80: 20 74 6f 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a to zero...**..*
5b90: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 * Since version
5ba0: 33 2e 36 2e 31 38 2c 20 53 51 4c 69 74 65 20 73 3.6.18, SQLite s
5bb0: 6f 75 72 63 65 20 63 6f 64 65 20 68 61 73 20 62 ource code has b
5bc0: 65 65 6e 20 73 74 6f 72 65 64 20 69 6e 20 74 68 een stored in th
5bd0: 65 0d 0a 2a 2a 20 3c 61 20 68 72 65 66 3d 22 68 e..** <a href="h
5be0: 74 74 70 3a 2f 2f 77 77 77 2e 66 6f 73 73 69 6c ttp://www.fossil
5bf0: 2d 73 63 6d 2e 6f 72 67 2f 22 3e 46 6f 73 73 69 -scm.org/">Fossi
5c00: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 l configuration
5c10: 6d 61 6e 61 67 65 6d 65 6e 74 0d 0a 2a 2a 20 73 management..** s
5c20: 79 73 74 65 6d 3c 2f 61 3e 2e 20 20 5e 54 68 65 ystem</a>. ^The
5c30: 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 SQLITE_SOURCE_I
5c40: 44 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74 65 D macro evaluate
5c50: 73 20 74 6f 0d 0a 2a 2a 20 61 20 73 74 72 69 6e s to..** a strin
5c60: 67 20 77 68 69 63 68 20 69 64 65 6e 74 69 66 69 g which identifi
5c70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 es a particular
5c80: 63 68 65 63 6b 2d 69 6e 20 6f 66 20 53 51 4c 69 check-in of SQLi
5c90: 74 65 0d 0a 2a 2a 20 77 69 74 68 69 6e 20 69 74 te..** within it
5ca0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 s configuration
5cb0: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 79 73 74 65 management syste
5cc0: 6d 2e 20 20 5e 54 68 65 20 53 51 4c 49 54 45 5f m. ^The SQLITE_
5cd0: 53 4f 55 52 43 45 5f 49 44 0d 0a 2a 2a 20 73 74 SOURCE_ID..** st
5ce0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 74 68 ring contains th
5cf0: 65 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 e date and time
5d00: 6f 66 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 of the check-in
5d10: 28 55 54 43 29 20 61 6e 64 20 61 6e 20 53 48 41 (UTC) and an SHA
5d20: 31 0d 0a 2a 2a 20 68 61 73 68 20 6f 66 20 74 68 1..** hash of th
5d30: 65 20 65 6e 74 69 72 65 20 73 6f 75 72 63 65 20 e entire source
5d40: 74 72 65 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 tree...**..** Se
5d50: 65 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 33 e also: [sqlite3
5d60: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 5d 2c 0d _libversion()],.
5d70: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 6c 69 62 .** [sqlite3_lib
5d80: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 version_number()
5d90: 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 73 6f 75 72 ], [sqlite3_sour
5da0: 63 65 69 64 28 29 5d 2c 0d 0a 2a 2a 20 5b 73 71 ceid()],..** [sq
5db0: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29 5d 20 lite_version()]
5dc0: 61 6e 64 20 5b 73 71 6c 69 74 65 5f 73 6f 75 72 and [sqlite_sour
5dd0: 63 65 5f 69 64 28 29 5d 2e 0d 0a 2a 2f 0d 0a 23 ce_id()]...*/..#
5de0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 56 45 define SQLITE_VE
5df0: 52 53 49 4f 4e 20 20 20 20 20 20 20 20 22 33 2e RSION "3.
5e00: 37 2e 31 30 22 0d 0a 23 64 65 66 69 6e 65 20 53 7.10"..#define S
5e10: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 QLITE_VERSION_NU
5e20: 4d 42 45 52 20 33 30 30 37 30 31 30 0d 0a 23 64 MBER 3007010..#d
5e30: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 4f 55 efine SQLITE_SOU
5e40: 52 43 45 5f 49 44 20 20 20 20 20 20 22 32 30 31 RCE_ID "201
5e50: 32 2d 30 31 2d 31 36 20 31 33 3a 32 38 3a 34 30 2-01-16 13:28:40
5e60: 20 65 62 64 30 31 61 38 64 65 66 66 62 35 30 32 ebd01a8deffb502
5e70: 34 61 35 64 37 34 39 34 65 65 66 38 30 30 64 32 4a5d7494eef800d2
5e80: 33 36 36 64 39 37 32 30 34 22 0d 0a 0d 0a 2f 2a 366d97204"..../*
5e90: 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 52 ..** CAPI3REF: R
5ea0: 75 6e 2d 54 69 6d 65 20 4c 69 62 72 61 72 79 20 un-Time Library
5eb0: 56 65 72 73 69 6f 6e 20 4e 75 6d 62 65 72 73 0d Version Numbers.
5ec0: 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 73 71 .** KEYWORDS: sq
5ed0: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20 73 lite3_version, s
5ee0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 0d qlite3_sourceid.
5ef0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 69 6e .**..** These in
5f00: 74 65 72 66 61 63 65 73 20 70 72 6f 76 69 64 65 terfaces provide
5f10: 20 74 68 65 20 73 61 6d 65 20 69 6e 66 6f 72 6d the same inform
5f20: 61 74 69 6f 6e 20 61 73 20 74 68 65 20 5b 53 51 ation as the [SQ
5f30: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5d 2c 0d 0a LITE_VERSION],..
5f40: 2a 2a 20 5b 53 51 4c 49 54 45 5f 56 45 52 53 49 ** [SQLITE_VERSI
5f50: 4f 4e 5f 4e 55 4d 42 45 52 5d 2c 20 61 6e 64 20 ON_NUMBER], and
5f60: 5b 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 [SQLITE_SOURCE_I
5f70: 44 5d 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f D] C preprocesso
5f80: 72 20 6d 61 63 72 6f 73 0d 0a 2a 2a 20 62 75 74 r macros..** but
5f90: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 are associated
5fa0: 77 69 74 68 20 74 68 65 20 6c 69 62 72 61 72 79 with the library
5fb0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 instead of the
5fc0: 68 65 61 64 65 72 20 66 69 6c 65 2e 20 20 5e 28 header file. ^(
5fd0: 43 61 75 74 69 6f 75 73 0d 0a 2a 2a 20 70 72 6f Cautious..** pro
5fe0: 67 72 61 6d 6d 65 72 73 20 6d 69 67 68 74 20 69 grammers might i
5ff0: 6e 63 6c 75 64 65 20 61 73 73 65 72 74 28 29 20 nclude assert()
6000: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 statements in th
6010: 65 69 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 eir application
6020: 74 6f 0d 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 to..** verify th
6030: 61 74 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e at values return
6040: 65 64 20 62 79 20 74 68 65 73 65 20 69 6e 74 65 ed by these inte
6050: 72 66 61 63 65 73 20 6d 61 74 63 68 20 74 68 65 rfaces match the
6060: 20 6d 61 63 72 6f 73 20 69 6e 0d 0a 2a 2a 20 74 macros in..** t
6070: 68 65 20 68 65 61 64 65 72 2c 20 61 6e 64 20 74 he header, and t
6080: 68 75 73 20 69 6e 73 75 72 65 20 74 68 61 74 20 hus insure that
6090: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 the application
60a0: 69 73 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 is..** compiled
60b0: 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 6c 69 with matching li
60c0: 62 72 61 72 79 20 61 6e 64 20 68 65 61 64 65 72 brary and header
60d0: 20 66 69 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 files...**..**
60e0: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 <blockquote><pre
60f0: 3e 0d 0a 2a 2a 20 61 73 73 65 72 74 28 20 73 71 >..** assert( sq
6100: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e lite3_libversion
6110: 5f 6e 75 6d 62 65 72 28 29 3d 3d 53 51 4c 49 54 _number()==SQLIT
6120: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 E_VERSION_NUMBER
6130: 20 29 3b 0d 0a 2a 2a 20 61 73 73 65 72 74 28 20 );..** assert(
6140: 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 73 strcmp(sqlite3_s
6150: 6f 75 72 63 65 69 64 28 29 2c 53 51 4c 49 54 45 ourceid(),SQLITE
6160: 5f 53 4f 55 52 43 45 5f 49 44 29 3d 3d 30 20 29 _SOURCE_ID)==0 )
6170: 3b 0d 0a 2a 2a 20 61 73 73 65 72 74 28 20 73 74 ;..** assert( st
6180: 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 6c 69 62 rcmp(sqlite3_lib
6190: 76 65 72 73 69 6f 6e 28 29 2c 53 51 4c 49 54 45 version(),SQLITE
61a0: 5f 56 45 52 53 49 4f 4e 29 3d 3d 30 20 29 3b 0d _VERSION)==0 );.
61b0: 0a 2a 2a 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 .** </pre></bloc
61c0: 6b 71 75 6f 74 65 3e 29 5e 0d 0a 2a 2a 0d 0a 2a kquote>)^..**..*
61d0: 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 76 * ^The sqlite3_v
61e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 ersion[] string
61f0: 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 74 61 69 6e constant contain
6200: 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 5b 53 s the text of [S
6210: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5d 0d 0a QLITE_VERSION]..
6220: 2a 2a 20 6d 61 63 72 6f 2e 20 20 5e 54 68 65 20 ** macro. ^The
6230: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 sqlite3_libversi
6240: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 on() function re
6250: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 turns a pointer
6260: 74 6f 20 74 68 65 0d 0a 2a 2a 20 74 6f 20 74 68 to the..** to th
6270: 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f e sqlite3_versio
6280: 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 n[] string const
6290: 61 6e 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65 ant. The sqlite
62a0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 0d 0a 3_libversion()..
62b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 ** function is p
62c0: 72 6f 76 69 64 65 64 20 66 6f 72 20 75 73 65 20 rovided for use
62d0: 69 6e 20 44 4c 4c 73 20 73 69 6e 63 65 20 44 4c in DLLs since DL
62e0: 4c 20 75 73 65 72 73 20 75 73 75 61 6c 6c 79 20 L users usually
62f0: 64 6f 20 6e 6f 74 20 68 61 76 65 0d 0a 2a 2a 20 do not have..**
6300: 64 69 72 65 63 74 20 61 63 63 65 73 73 20 74 6f direct access to
6310: 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 string constant
6320: 73 20 77 69 74 68 69 6e 20 74 68 65 20 44 4c 4c s within the DLL
6330: 2e 20 20 5e 54 68 65 0d 0a 2a 2a 20 73 71 6c 69 . ^The..** sqli
6340: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e te3_libversion_n
6350: 75 6d 62 65 72 28 29 20 66 75 6e 63 74 69 6f 6e umber() function
6360: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 returns an inte
6370: 67 65 72 20 65 71 75 61 6c 20 74 6f 0d 0a 2a 2a ger equal to..**
6380: 20 5b 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e [SQLITE_VERSION
6390: 5f 4e 55 4d 42 45 52 5d 2e 20 20 5e 54 68 65 20 _NUMBER]. ^The
63a0: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 sqlite3_sourceid
63b0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 () function retu
63c0: 72 6e 73 20 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 rns ..** a point
63d0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 er to a string c
63e0: 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65 20 76 61 onstant whose va
63f0: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 lue is the same
6400: 61 73 20 74 68 65 20 0d 0a 2a 2a 20 5b 53 51 4c as the ..** [SQL
6410: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 5d 20 43 ITE_SOURCE_ID] C
6420: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 preprocessor ma
6430: 63 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 cro...**..** See
6440: 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 5f 76 also: [sqlite_v
6450: 65 72 73 69 6f 6e 28 29 5d 20 61 6e 64 20 5b 73 ersion()] and [s
6460: 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 qlite_source_id(
6470: 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f )]...*/..SQLITE_
6480: 41 50 49 20 63 6f 6e 73 74 20 63 68 61 72 20 73 API const char s
6490: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d qlite3_version[]
64a0: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f = SQLITE_VERSIO
64b0: 4e 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 N;..SQLITE_API c
64c0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 onst char *sqlit
64d0: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f e3_libversion(vo
64e0: 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 id);..SQLITE_API
64f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c const char *sql
6500: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f ite3_sourceid(vo
6510: 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 id);..SQLITE_API
6520: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 int sqlite3_lib
6530: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 version_number(v
6540: 6f 69 64 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 oid);..../*..**
6550: 43 41 50 49 33 52 45 46 3a 20 52 75 6e 2d 54 69 CAPI3REF: Run-Ti
6560: 6d 65 20 4c 69 62 72 61 72 79 20 43 6f 6d 70 69 me Library Compi
6570: 6c 61 74 69 6f 6e 20 4f 70 74 69 6f 6e 73 20 44 lation Options D
6580: 69 61 67 6e 6f 73 74 69 63 73 0d 0a 2a 2a 0d 0a iagnostics..**..
6590: 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
65a0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 compileoption_us
65b0: 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 ed() function re
65c0: 74 75 72 6e 73 20 30 20 6f 72 20 31 20 0d 0a 2a turns 0 or 1 ..*
65d0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 * indicating whe
65e0: 74 68 65 72 20 74 68 65 20 73 70 65 63 69 66 69 ther the specifi
65f0: 65 64 20 6f 70 74 69 6f 6e 20 77 61 73 20 64 65 ed option was de
6600: 66 69 6e 65 64 20 61 74 20 0d 0a 2a 2a 20 63 6f fined at ..** co
6610: 6d 70 69 6c 65 20 74 69 6d 65 2e 20 20 5e 54 68 mpile time. ^Th
6620: 65 20 53 51 4c 49 54 45 5f 20 70 72 65 66 69 78 e SQLITE_ prefix
6630: 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 may be omitted
6640: 66 72 6f 6d 20 74 68 65 20 0d 0a 2a 2a 20 6f 70 from the ..** op
6650: 74 69 6f 6e 20 6e 61 6d 65 20 70 61 73 73 65 64 tion name passed
6660: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 to sqlite3_comp
6670: 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 ileoption_used()
6680: 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 . ..**..** ^The
6690: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 sqlite3_compile
66a0: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 66 75 6e option_get() fun
66b0: 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 69 74 65 ction allows ite
66c0: 72 61 74 69 6e 67 0d 0a 2a 2a 20 6f 76 65 72 20 rating..** over
66d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 the list of opti
66e0: 6f 6e 73 20 74 68 61 74 20 77 65 72 65 20 64 65 ons that were de
66f0: 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 fined at compile
6700: 20 74 69 6d 65 20 62 79 0d 0a 2a 2a 20 72 65 74 time by..** ret
6710: 75 72 6e 69 6e 67 20 74 68 65 20 4e 2d 74 68 20 urning the N-th
6720: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 compile time opt
6730: 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 5e 49 66 ion string. ^If
6740: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e N is out of ran
6750: 67 65 2c 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f ge,..** sqlite3_
6760: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 compileoption_ge
6770: 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 4e 55 t() returns a NU
6780: 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 20 5e 54 68 LL pointer. ^Th
6790: 65 20 53 51 4c 49 54 45 5f 20 0d 0a 2a 2a 20 70 e SQLITE_ ..** p
67a0: 72 65 66 69 78 20 69 73 20 6f 6d 69 74 74 65 64 refix is omitted
67b0: 20 66 72 6f 6d 20 61 6e 79 20 73 74 72 69 6e 67 from any string
67c0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 0d 0a s returned by ..
67d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 ** sqlite3_compi
67e0: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 2e 0d leoption_get()..
67f0: 0a 2a 2a 0d 0a 2a 2a 20 5e 53 75 70 70 6f 72 74 .**..** ^Support
6800: 20 66 6f 72 20 74 68 65 20 64 69 61 67 6e 6f 73 for the diagnos
6810: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 tic functions sq
6820: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 lite3_compileopt
6830: 69 6f 6e 5f 75 73 65 64 28 29 0d 0a 2a 2a 20 61 ion_used()..** a
6840: 6e 64 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 nd sqlite3_compi
6850: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 6d leoption_get() m
6860: 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 62 79 ay be omitted by
6870: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 specifying the
6880: 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 4f 4d 49 ..** [SQLITE_OMI
6890: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f T_COMPILEOPTION_
68a0: 44 49 41 47 53 5d 20 6f 70 74 69 6f 6e 20 61 74 DIAGS] option at
68b0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 0d 0a compile time...
68c0: 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a **..** See also:
68d0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 5b SQL functions [
68e0: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 sqlite_compileop
68f0: 74 69 6f 6e 5f 75 73 65 64 28 29 5d 20 61 6e 64 tion_used()] and
6900: 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 5f 63 6f 6d ..** [sqlite_com
6910: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 pileoption_get()
6920: 5d 20 61 6e 64 20 74 68 65 20 5b 63 6f 6d 70 69 ] and the [compi
6930: 6c 65 5f 6f 70 74 69 6f 6e 73 20 70 72 61 67 6d le_options pragm
6940: 61 5d 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 a]...*/..#ifndef
6950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d SQLITE_OMIT_COM
6960: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 PILEOPTION_DIAGS
6970: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
6980: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 sqlite3_compile
6990: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 option_used(cons
69a0: 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 t char *zOptName
69b0: 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 );..SQLITE_API c
69c0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 onst char *sqlit
69d0: 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e e3_compileoption
69e0: 5f 67 65 74 28 69 6e 74 20 4e 29 3b 0d 0a 23 65 _get(int N);..#e
69f0: 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ndif..../*..** C
6a00: 41 50 49 33 52 45 46 3a 20 54 65 73 74 20 54 6f API3REF: Test To
6a10: 20 53 65 65 20 49 66 20 54 68 65 20 4c 69 62 72 See If The Libr
6a20: 61 72 79 20 49 73 20 54 68 72 65 61 64 73 61 66 ary Is Threadsaf
6a30: 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 e..**..** ^The s
6a40: 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 qlite3_threadsaf
6a50: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 e() function ret
6a60: 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 61 6e 64 urns zero if and
6a70: 20 6f 6e 6c 79 20 69 66 0d 0a 2a 2a 20 53 51 4c only if..** SQL
6a80: 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 ite was compiled
6a90: 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 with mutexing c
6aa0: 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 ode omitted due
6ab0: 74 6f 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 4c 49 to the..** [SQLI
6ac0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 5d 20 63 TE_THREADSAFE] c
6ad0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 ompile-time opti
6ae0: 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 on being set to
6af0: 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 69 74 0...**..** SQLit
6b00: 65 20 63 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65 e can be compile
6b10: 64 20 77 69 74 68 20 6f 72 20 77 69 74 68 6f 75 d with or withou
6b20: 74 20 6d 75 74 65 78 65 73 2e 20 20 57 68 65 6e t mutexes. When
6b30: 0d 0a 2a 2a 20 74 68 65 20 5b 53 51 4c 49 54 45 ..** the [SQLITE
6b40: 5f 54 48 52 45 41 44 53 41 46 45 5d 20 43 20 70 _THREADSAFE] C p
6b50: 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 reprocessor macr
6b60: 6f 20 69 73 20 31 20 6f 72 20 32 2c 20 6d 75 74 o is 1 or 2, mut
6b70: 65 78 65 73 0d 0a 2a 2a 20 61 72 65 20 65 6e 61 exes..** are ena
6b80: 62 6c 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 bled and SQLite
6b90: 69 73 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 is threadsafe.
6ba0: 57 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 When the..** [SQ
6bb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 5d LITE_THREADSAFE]
6bc0: 20 6d 61 63 72 6f 20 69 73 20 30 2c 20 0d 0a 2a macro is 0, ..*
6bd0: 2a 20 74 68 65 20 6d 75 74 65 78 65 73 20 61 72 * the mutexes ar
6be0: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 69 74 68 e omitted. With
6bf0: 6f 75 74 20 74 68 65 20 6d 75 74 65 78 65 73 2c out the mutexes,
6c00: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0d it is not safe.
6c10: 0a 2a 2a 20 74 6f 20 75 73 65 20 53 51 4c 69 74 .** to use SQLit
6c20: 65 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 66 e concurrently f
6c30: 72 6f 6d 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e rom more than on
6c40: 65 20 74 68 72 65 61 64 2e 0d 0a 2a 2a 0d 0a 2a e thread...**..*
6c50: 2a 20 45 6e 61 62 6c 69 6e 67 20 6d 75 74 65 78 * Enabling mutex
6c60: 65 73 20 69 6e 63 75 72 73 20 61 20 6d 65 61 73 es incurs a meas
6c70: 75 72 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e urable performan
6c80: 63 65 20 70 65 6e 61 6c 74 79 2e 0d 0a 2a 2a 20 ce penalty...**
6c90: 53 6f 20 69 66 20 73 70 65 65 64 20 69 73 20 6f So if speed is o
6ca0: 66 20 75 74 6d 6f 73 74 20 69 6d 70 6f 72 74 61 f utmost importa
6cb0: 6e 63 65 2c 20 69 74 20 6d 61 6b 65 73 20 73 65 nce, it makes se
6cc0: 6e 73 65 20 74 6f 20 64 69 73 61 62 6c 65 0d 0a nse to disable..
6cd0: 2a 2a 20 74 68 65 20 6d 75 74 65 78 65 73 2e 20 ** the mutexes.
6ce0: 20 42 75 74 20 66 6f 72 20 6d 61 78 69 6d 75 6d But for maximum
6cf0: 20 73 61 66 65 74 79 2c 20 6d 75 74 65 78 65 73 safety, mutexes
6d00: 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c should be enabl
6d10: 65 64 2e 0d 0a 2a 2a 20 5e 54 68 65 20 64 65 66 ed...** ^The def
6d20: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 69 73 ault behavior is
6d30: 20 66 6f 72 20 6d 75 74 65 78 65 73 20 74 6f 20 for mutexes to
6d40: 62 65 20 65 6e 61 62 6c 65 64 2e 0d 0a 2a 2a 0d be enabled...**.
6d50: 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 .** This interfa
6d60: 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 62 ce can be used b
6d70: 79 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e y an application
6d80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
6d90: 61 74 20 74 68 65 0d 0a 2a 2a 20 76 65 72 73 69 at the..** versi
6da0: 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 74 68 61 on of SQLite tha
6db0: 74 20 69 74 20 69 73 20 6c 69 6e 6b 69 6e 67 20 t it is linking
6dc0: 61 67 61 69 6e 73 74 20 77 61 73 20 63 6f 6d 70 against was comp
6dd0: 69 6c 65 64 20 77 69 74 68 0d 0a 2a 2a 20 74 68 iled with..** th
6de0: 65 20 64 65 73 69 72 65 64 20 73 65 74 74 69 6e e desired settin
6df0: 67 20 6f 66 20 74 68 65 20 5b 53 51 4c 49 54 45 g of the [SQLITE
6e00: 5f 54 48 52 45 41 44 53 41 46 45 5d 20 6d 61 63 _THREADSAFE] mac
6e10: 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 ro...**..** This
6e20: 20 69 6e 74 65 72 66 61 63 65 20 6f 6e 6c 79 20 interface only
6e30: 72 65 70 6f 72 74 73 20 6f 6e 20 74 68 65 20 63 reports on the c
6e40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 75 74 65 ompile-time mute
6e50: 78 20 73 65 74 74 69 6e 67 0d 0a 2a 2a 20 6f 66 x setting..** of
6e60: 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 54 48 52 the [SQLITE_THR
6e70: 45 41 44 53 41 46 45 5d 20 66 6c 61 67 2e 20 20 EADSAFE] flag.
6e80: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d If SQLite is com
6e90: 70 69 6c 65 64 20 77 69 74 68 0d 0a 2a 2a 20 53 piled with..** S
6ea0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 QLITE_THREADSAFE
6eb0: 3d 31 20 6f 72 20 3d 32 20 74 68 65 6e 20 6d 75 =1 or =2 then mu
6ec0: 74 65 78 65 73 20 61 72 65 20 65 6e 61 62 6c 65 texes are enable
6ed0: 64 20 62 79 20 64 65 66 61 75 6c 74 20 62 75 74 d by default but
6ee0: 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 66 75 6c 6c ..** can be full
6ef0: 79 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 64 y or partially d
6f00: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 61 20 isabled using a
6f10: 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 call to [sqlite3
6f20: 5f 63 6f 6e 66 69 67 28 29 5d 0d 0a 2a 2a 20 77 _config()]..** w
6f30: 69 74 68 20 74 68 65 20 76 65 72 62 73 20 5b 53 ith the verbs [S
6f40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e QLITE_CONFIG_SIN
6f50: 47 4c 45 54 48 52 45 41 44 5d 2c 20 5b 53 51 4c GLETHREAD], [SQL
6f60: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 ITE_CONFIG_MULTI
6f70: 54 48 52 45 41 44 5d 2c 0d 0a 2a 2a 20 6f 72 20 THREAD],..** or
6f80: 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d [SQLITE_CONFIG_M
6f90: 55 54 45 58 5d 2e 20 20 5e 28 54 68 65 20 72 65 UTEX]. ^(The re
6fa0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 turn value of th
6fb0: 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 68 e..** sqlite3_th
6fc0: 72 65 61 64 73 61 66 65 28 29 20 66 75 6e 63 74 readsafe() funct
6fd0: 69 6f 6e 20 73 68 6f 77 73 20 6f 6e 6c 79 20 74 ion shows only t
6fe0: 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 he compile-time
6ff0: 73 65 74 74 69 6e 67 20 6f 66 0d 0a 2a 2a 20 74 setting of..** t
7000: 68 72 65 61 64 20 73 61 66 65 74 79 2c 20 6e 6f hread safety, no
7010: 74 20 61 6e 79 20 72 75 6e 2d 74 69 6d 65 20 63 t any run-time c
7020: 68 61 6e 67 65 73 20 74 6f 20 74 68 61 74 20 73 hanges to that s
7030: 65 74 74 69 6e 67 20 6d 61 64 65 20 62 79 0d 0a etting made by..
7040: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 ** sqlite3_confi
7050: 67 28 29 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f g(). In other wo
7060: 72 64 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 rds, the return
7070: 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 value from sqlit
7080: 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29 0d e3_threadsafe().
7090: 0a 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 .** is unchanged
70a0: 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c by calls to sql
70b0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2e 29 5e ite3_config().)^
70c0: 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 74 68 65 ..**..** See the
70d0: 20 5b 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 [threading mode
70e0: 5d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 ] documentation
70f0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 for additional i
7100: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d nformation...*/.
7110: 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
7120: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 sqlite3_threadsa
7130: 66 65 28 76 6f 69 64 29 3b 0d 0a 0d 0a 2f 2a 0d fe(void);..../*.
7140: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 61 .** CAPI3REF: Da
7150: 74 61 62 61 73 65 20 43 6f 6e 6e 65 63 74 69 6f tabase Connectio
7160: 6e 20 48 61 6e 64 6c 65 0d 0a 2a 2a 20 4b 45 59 n Handle..** KEY
7170: 57 4f 52 44 53 3a 20 7b 64 61 74 61 62 61 73 65 WORDS: {database
7180: 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7b 64 61 connection} {da
7190: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
71a0: 6e 73 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 45 61 63 68 ns}..**..** Each
71b0: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 open SQLite dat
71c0: 61 62 61 73 65 20 69 73 20 72 65 70 72 65 73 65 abase is represe
71d0: 6e 74 65 64 20 62 79 20 61 20 70 6f 69 6e 74 65 nted by a pointe
71e0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 r to an instance
71f0: 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 6f 70 61 71 of..** the opaq
7200: 75 65 20 73 74 72 75 63 74 75 72 65 20 6e 61 6d ue structure nam
7210: 65 64 20 22 73 71 6c 69 74 65 33 22 2e 20 20 49 ed "sqlite3". I
7220: 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 74 t is useful to t
7230: 68 69 6e 6b 20 6f 66 20 61 6e 20 73 71 6c 69 74 hink of an sqlit
7240: 65 33 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 e3..** pointer a
7250: 73 20 61 6e 20 6f 62 6a 65 63 74 2e 20 20 54 68 s an object. Th
7260: 65 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 e [sqlite3_open(
7270: 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 )], [sqlite3_ope
7280: 6e 31 36 28 29 5d 2c 20 61 6e 64 0d 0a 2a 2a 20 n16()], and..**
7290: 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 [sqlite3_open_v2
72a0: 28 29 5d 20 69 6e 74 65 72 66 61 63 65 73 20 61 ()] interfaces a
72b0: 72 65 20 69 74 73 20 63 6f 6e 73 74 72 75 63 74 re its construct
72c0: 6f 72 73 2c 20 61 6e 64 20 5b 73 71 6c 69 74 65 ors, and [sqlite
72d0: 33 5f 63 6c 6f 73 65 28 29 5d 0d 0a 2a 2a 20 69 3_close()]..** i
72e0: 73 20 69 74 73 20 64 65 73 74 72 75 63 74 6f 72 s its destructor
72f0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 6d 61 6e . There are man
7300: 79 20 6f 74 68 65 72 20 69 6e 74 65 72 66 61 63 y other interfac
7310: 65 73 20 28 73 75 63 68 20 61 73 0d 0a 2a 2a 20 es (such as..**
7320: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 [sqlite3_prepare
7330: 5f 76 32 28 29 5d 2c 20 5b 73 71 6c 69 74 65 33 _v2()], [sqlite3
7340: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e _create_function
7350: 28 29 5d 2c 20 61 6e 64 0d 0a 2a 2a 20 5b 73 71 ()], and..** [sq
7360: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f lite3_busy_timeo
7370: 75 74 28 29 5d 20 74 6f 20 6e 61 6d 65 20 62 75 ut()] to name bu
7380: 74 20 74 68 72 65 65 29 20 74 68 61 74 20 61 72 t three) that ar
7390: 65 20 6d 65 74 68 6f 64 73 20 6f 6e 20 61 6e 0d e methods on an.
73a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 .** sqlite3 obje
73b0: 63 74 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 ct...*/..typedef
73c0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 20 struct sqlite3
73d0: 73 71 6c 69 74 65 33 3b 0d 0a 0d 0a 2f 2a 0d 0a sqlite3;..../*..
73e0: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 36 34 2d ** CAPI3REF: 64-
73f0: 42 69 74 20 49 6e 74 65 67 65 72 20 54 79 70 65 Bit Integer Type
7400: 73 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 s..** KEYWORDS:
7410: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c sqlite_int64 sql
7420: 69 74 65 5f 75 69 6e 74 36 34 0d 0a 2a 2a 0d 0a ite_uint64..**..
7430: 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 72 65 ** Because there
7440: 20 69 73 20 6e 6f 20 63 72 6f 73 73 2d 70 6c 61 is no cross-pla
7450: 74 66 6f 72 6d 20 77 61 79 20 74 6f 20 73 70 65 tform way to spe
7460: 63 69 66 79 20 36 34 2d 62 69 74 20 69 6e 74 65 cify 64-bit inte
7470: 67 65 72 20 74 79 70 65 73 0d 0a 2a 2a 20 53 51 ger types..** SQ
7480: 4c 69 74 65 20 69 6e 63 6c 75 64 65 73 20 74 79 Lite includes ty
7490: 70 65 64 65 66 73 20 66 6f 72 20 36 34 2d 62 69 pedefs for 64-bi
74a0: 74 20 73 69 67 6e 65 64 20 61 6e 64 20 75 6e 73 t signed and uns
74b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 0d igned integers..
74c0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 .**..** The sqli
74d0: 74 65 33 5f 69 6e 74 36 34 20 61 6e 64 20 73 71 te3_int64 and sq
74e0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 61 72 65 lite3_uint64 are
74f0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 74 the preferred t
7500: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e ype definitions.
7510: 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f ..** The sqlite_
7520: 69 6e 74 36 34 20 61 6e 64 20 73 71 6c 69 74 65 int64 and sqlite
7530: 5f 75 69 6e 74 36 34 20 74 79 70 65 73 20 61 72 _uint64 types ar
7540: 65 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 e supported for
7550: 62 61 63 6b 77 61 72 64 73 0d 0a 2a 2a 20 63 6f backwards..** co
7560: 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 mpatibility only
7570: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 ...**..** ^The s
7580: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6e 64 qlite3_int64 and
7590: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 74 79 sqlite_int64 ty
75a0: 70 65 73 20 63 61 6e 20 73 74 6f 72 65 20 69 6e pes can store in
75b0: 74 65 67 65 72 20 76 61 6c 75 65 73 0d 0a 2a 2a teger values..**
75c0: 20 62 65 74 77 65 65 6e 20 2d 39 32 32 33 33 37 between -922337
75d0: 32 30 33 36 38 35 34 37 37 35 38 30 38 20 61 6e 2036854775808 an
75e0: 64 20 2b 39 32 32 33 33 37 32 30 33 36 38 35 34 d +9223372036854
75f0: 37 37 35 38 30 37 20 69 6e 63 6c 75 73 69 76 65 775807 inclusive
7600: 2e 20 20 5e 54 68 65 0d 0a 2a 2a 20 73 71 6c 69 . ^The..** sqli
7610: 74 65 33 5f 75 69 6e 74 36 34 20 61 6e 64 20 73 te3_uint64 and s
7620: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 79 70 qlite_uint64 typ
7630: 65 73 20 63 61 6e 20 73 74 6f 72 65 20 69 6e 74 es can store int
7640: 65 67 65 72 20 76 61 6c 75 65 73 20 0d 0a 2a 2a eger values ..**
7650: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 2b between 0 and +
7660: 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35 1844674407370955
7670: 31 36 31 35 20 69 6e 63 6c 75 73 69 76 65 2e 0d 1615 inclusive..
7680: 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 .*/..#ifdef SQLI
7690: 54 45 5f 49 4e 54 36 34 5f 54 59 50 45 0d 0a 20 TE_INT64_TYPE..
76a0: 20 74 79 70 65 64 65 66 20 53 51 4c 49 54 45 5f typedef SQLITE_
76b0: 49 4e 54 36 34 5f 54 59 50 45 20 73 71 6c 69 74 INT64_TYPE sqlit
76c0: 65 5f 69 6e 74 36 34 3b 0d 0a 20 20 74 79 70 65 e_int64;.. type
76d0: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 53 51 4c def unsigned SQL
76e0: 49 54 45 5f 49 4e 54 36 34 5f 54 59 50 45 20 73 ITE_INT64_TYPE s
76f0: 71 6c 69 74 65 5f 75 69 6e 74 36 34 3b 0d 0a 23 qlite_uint64;..#
7700: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 elif defined(_MS
7710: 43 5f 56 45 52 29 20 7c 7c 20 64 65 66 69 6e 65 C_VER) || define
7720: 64 28 5f 5f 42 4f 52 4c 41 4e 44 43 5f 5f 29 0d d(__BORLANDC__).
7730: 0a 20 20 74 79 70 65 64 65 66 20 5f 5f 69 6e 74 . typedef __int
7740: 36 34 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 3b 64 sqlite_int64;
7750: 0d 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 .. typedef unsi
7760: 67 6e 65 64 20 5f 5f 69 6e 74 36 34 20 73 71 6c gned __int64 sql
7770: 69 74 65 5f 75 69 6e 74 36 34 3b 0d 0a 23 65 6c ite_uint64;..#el
7780: 73 65 0d 0a 20 20 74 79 70 65 64 65 66 20 6c 6f se.. typedef lo
7790: 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 73 71 6c 69 ng long int sqli
77a0: 74 65 5f 69 6e 74 36 34 3b 0d 0a 20 20 74 79 70 te_int64;.. typ
77b0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 6c 6f edef unsigned lo
77c0: 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 73 71 6c 69 ng long int sqli
77d0: 74 65 5f 75 69 6e 74 36 34 3b 0d 0a 23 65 6e 64 te_uint64;..#end
77e0: 69 66 0d 0a 74 79 70 65 64 65 66 20 73 71 6c 69 if..typedef sqli
77f0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 te_int64 sqlite3
7800: 5f 69 6e 74 36 34 3b 0d 0a 74 79 70 65 64 65 66 _int64;..typedef
7810: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 73 sqlite_uint64 s
7820: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 3b 0d 0a qlite3_uint64;..
7830: 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 63 6f 6d 70 ../*..** If comp
7840: 69 6c 69 6e 67 20 66 6f 72 20 61 20 70 72 6f 63 iling for a proc
7850: 65 73 73 6f 72 20 74 68 61 74 20 6c 61 63 6b 73 essor that lacks
7860: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
7870: 73 75 70 70 6f 72 74 2c 0d 0a 2a 2a 20 73 75 62 support,..** sub
7880: 73 74 69 74 75 74 65 20 69 6e 74 65 67 65 72 20 stitute integer
7890: 66 6f 72 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 for floating-poi
78a0: 6e 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 nt...*/..#ifdef
78b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 SQLITE_OMIT_FLOA
78c0: 54 49 4e 47 5f 50 4f 49 4e 54 0d 0a 23 20 64 65 TING_POINT..# de
78d0: 66 69 6e 65 20 64 6f 75 62 6c 65 20 73 71 6c 69 fine double sqli
78e0: 74 65 33 5f 69 6e 74 36 34 0d 0a 23 65 6e 64 69 te3_int64..#endi
78f0: 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 f..../*..** CAPI
7900: 33 52 45 46 3a 20 43 6c 6f 73 69 6e 67 20 41 20 3REF: Closing A
7910: 44 61 74 61 62 61 73 65 20 43 6f 6e 6e 65 63 74 Database Connect
7920: 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 ion..**..** ^The
7930: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 sqlite3_close()
7940: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 routine is the
7950: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 destructor for t
7960: 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 6f 62 6a he [sqlite3] obj
7970: 65 63 74 2e 0d 0a 2a 2a 20 5e 43 61 6c 6c 73 20 ect...** ^Calls
7980: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 to sqlite3_close
7990: 28 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 () return SQLITE
79a0: 5f 4f 4b 20 69 66 20 74 68 65 20 5b 73 71 6c 69 _OK if the [sqli
79b0: 74 65 33 5d 20 6f 62 6a 65 63 74 20 69 73 0d 0a te3] object is..
79c0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 ** successfully
79d0: 64 65 73 74 72 6f 79 65 64 20 61 6e 64 20 61 6c destroyed and al
79e0: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 l associated res
79f0: 6f 75 72 63 65 73 20 61 72 65 20 64 65 61 6c 6c ources are deall
7a00: 6f 63 61 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ocated...**..**
7a10: 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 6d 75 73 Applications mus
7a20: 74 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c t [sqlite3_final
7a30: 69 7a 65 20 7c 20 66 69 6e 61 6c 69 7a 65 5d 20 ize | finalize]
7a40: 61 6c 6c 20 5b 70 72 65 70 61 72 65 64 20 73 74 all [prepared st
7a50: 61 74 65 6d 65 6e 74 73 5d 0d 0a 2a 2a 20 61 6e atements]..** an
7a60: 64 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f d [sqlite3_blob_
7a70: 63 6c 6f 73 65 20 7c 20 63 6c 6f 73 65 5d 20 61 close | close] a
7a80: 6c 6c 20 5b 42 4c 4f 42 20 68 61 6e 64 6c 65 73 ll [BLOB handles
7a90: 5d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 ] associated wit
7aa0: 68 0d 0a 2a 2a 20 74 68 65 20 5b 73 71 6c 69 74 h..** the [sqlit
7ab0: 65 33 5d 20 6f 62 6a 65 63 74 20 70 72 69 6f 72 e3] object prior
7ac0: 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 74 to attempting t
7ad0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 6f 62 6a 65 o close the obje
7ae0: 63 74 2e 20 20 5e 49 66 0d 0a 2a 2a 20 73 71 6c ct. ^If..** sql
7af0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 69 73 20 ite3_close() is
7b00: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 5b 64 61 74 called on a [dat
7b10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
7b20: 5d 20 74 68 61 74 20 73 74 69 6c 6c 20 68 61 73 ] that still has
7b30: 0d 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 ..** outstanding
7b40: 20 5b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 [prepared state
7b50: 6d 65 6e 74 73 5d 20 6f 72 20 5b 42 4c 4f 42 20 ments] or [BLOB
7b60: 68 61 6e 64 6c 65 73 5d 2c 20 74 68 65 6e 20 69 handles], then i
7b70: 74 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 53 51 t returns..** SQ
7b80: 4c 49 54 45 5f 42 55 53 59 2e 0d 0a 2a 2a 0d 0a LITE_BUSY...**..
7b90: 2a 2a 20 5e 49 66 20 5b 73 71 6c 69 74 65 33 5f ** ^If [sqlite3_
7ba0: 63 6c 6f 73 65 28 29 5d 20 69 73 20 69 6e 76 6f close()] is invo
7bb0: 6b 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e ked while a tran
7bc0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c saction is open,
7bd0: 0d 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 ..** the transac
7be0: 74 69 6f 6e 20 69 73 20 61 75 74 6f 6d 61 74 69 tion is automati
7bf0: 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 cally rolled bac
7c00: 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 43 k...**..** The C
7c10: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 5b 73 parameter to [s
7c20: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 43 29 5d qlite3_close(C)]
7c30: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
7c40: 61 20 4e 55 4c 4c 0d 0a 2a 2a 20 70 6f 69 6e 74 a NULL..** point
7c50: 65 72 20 6f 72 20 61 6e 20 5b 73 71 6c 69 74 65 er or an [sqlite
7c60: 33 5d 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 3] object pointe
7c70: 72 20 6f 62 74 61 69 6e 65 64 0d 0a 2a 2a 20 66 r obtained..** f
7c80: 72 6f 6d 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 rom [sqlite3_ope
7c90: 6e 28 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 6f n()], [sqlite3_o
7ca0: 70 65 6e 31 36 28 29 5d 2c 20 6f 72 0d 0a 2a 2a pen16()], or..**
7cb0: 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 [sqlite3_open_v
7cc0: 32 28 29 5d 2c 20 61 6e 64 20 6e 6f 74 20 70 72 2()], and not pr
7cd0: 65 76 69 6f 75 73 6c 79 20 63 6c 6f 73 65 64 2e eviously closed.
7ce0: 0d 0a 2a 2a 20 5e 43 61 6c 6c 69 6e 67 20 73 71 ..** ^Calling sq
7cf0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 77 69 lite3_close() wi
7d00: 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 th a NULL pointe
7d10: 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 r argument is a
7d20: 0d 0a 2a 2a 20 68 61 72 6d 6c 65 73 73 20 6e 6f ..** harmless no
7d30: 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 -op...*/..SQLITE
7d40: 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
7d50: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a _close(sqlite3 *
7d60: 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 );..../*..** The
7d70: 20 74 79 70 65 20 66 6f 72 20 61 20 63 61 6c 6c type for a call
7d80: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a back function...
7d90: 2a 2a 20 54 68 69 73 20 69 73 20 6c 65 67 61 63 ** This is legac
7da0: 79 20 61 6e 64 20 64 65 70 72 65 63 61 74 65 64 y and deprecated
7db0: 2e 20 20 49 74 20 69 73 20 69 6e 63 6c 75 64 65 . It is include
7dc0: 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c d for historical
7dd0: 0d 0a 2a 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69 ..** compatibili
7de0: 74 79 20 61 6e 64 20 69 73 20 6e 6f 74 20 64 6f ty and is not do
7df0: 63 75 6d 65 6e 74 65 64 2e 0d 0a 2a 2f 0d 0a 74 cumented...*/..t
7e00: 79 70 65 64 65 66 20 69 6e 74 20 28 2a 73 71 6c ypedef int (*sql
7e10: 69 74 65 33 5f 63 61 6c 6c 62 61 63 6b 29 28 76 ite3_callback)(v
7e20: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c oid*,int,char**,
7e30: 20 63 68 61 72 2a 2a 29 3b 0d 0a 0d 0a 2f 2a 0d char**);..../*.
7e40: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 6e .** CAPI3REF: On
7e50: 65 2d 53 74 65 70 20 51 75 65 72 79 20 45 78 65 e-Step Query Exe
7e60: 63 75 74 69 6f 6e 20 49 6e 74 65 72 66 61 63 65 cution Interface
7e70: 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c ..**..** The sql
7e80: 69 74 65 33 5f 65 78 65 63 28 29 20 69 6e 74 65 ite3_exec() inte
7e90: 72 66 61 63 65 20 69 73 20 61 20 63 6f 6e 76 65 rface is a conve
7ea0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 nience wrapper a
7eb0: 72 6f 75 6e 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 round..** [sqlit
7ec0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 5d e3_prepare_v2()]
7ed0: 2c 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 , [sqlite3_step(
7ee0: 29 5d 2c 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 )], and [sqlite3
7ef0: 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2c 0d 0a 2a _finalize()],..*
7f00: 2a 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 61 6e * that allows an
7f10: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 application to
7f20: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 73 74 61 run multiple sta
7f30: 74 65 6d 65 6e 74 73 20 6f 66 20 53 51 4c 0d 0a tements of SQL..
7f40: 2a 2a 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e ** without havin
7f50: 67 20 74 6f 20 75 73 65 20 61 20 6c 6f 74 20 6f g to use a lot o
7f60: 66 20 43 20 63 6f 64 65 2e 20 0d 0a 2a 2a 0d 0a f C code. ..**..
7f70: 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
7f80: 65 78 65 63 28 29 20 69 6e 74 65 72 66 61 63 65 exec() interface
7f90: 20 72 75 6e 73 20 7a 65 72 6f 20 6f 72 20 6d 6f runs zero or mo
7fa0: 72 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 re UTF-8 encoded
7fb0: 2c 0d 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 2d ,..** semicolon-
7fc0: 73 65 70 61 72 61 74 65 20 53 51 4c 20 73 74 61 separate SQL sta
7fd0: 74 65 6d 65 6e 74 73 20 70 61 73 73 65 64 20 69 tements passed i
7fe0: 6e 74 6f 20 69 74 73 20 32 6e 64 20 61 72 67 75 nto its 2nd argu
7ff0: 6d 65 6e 74 2c 0d 0a 2a 2a 20 69 6e 20 74 68 65 ment,..** in the
8000: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 context of the
8010: 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
8020: 74 69 6f 6e 5d 20 70 61 73 73 65 64 20 69 6e 20 tion] passed in
8030: 61 73 20 69 74 73 20 31 73 74 0d 0a 2a 2a 20 61 as its 1st..** a
8040: 72 67 75 6d 65 6e 74 2e 20 20 5e 49 66 20 74 68 rgument. ^If th
8050: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 e callback funct
8060: 69 6f 6e 20 6f 66 20 74 68 65 20 33 72 64 20 61 ion of the 3rd a
8070: 72 67 75 6d 65 6e 74 20 74 6f 0d 0a 2a 2a 20 73 rgument to..** s
8080: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 69 73 qlite3_exec() is
8090: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 not NULL, then
80a0: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f it is invoked fo
80b0: 72 20 65 61 63 68 20 72 65 73 75 6c 74 20 72 6f r each result ro
80c0: 77 0d 0a 2a 2a 20 63 6f 6d 69 6e 67 20 6f 75 74 w..** coming out
80d0: 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 65 of the evaluate
80e0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 d SQL statements
80f0: 2e 20 20 5e 54 68 65 20 34 74 68 20 61 72 67 75 . ^The 4th argu
8100: 6d 65 6e 74 20 74 6f 0d 0a 2a 2a 20 73 71 6c 69 ment to..** sqli
8110: 74 65 33 5f 65 78 65 63 28 29 20 69 73 20 72 65 te3_exec() is re
8120: 6c 61 79 65 64 20 74 68 72 6f 75 67 68 20 74 6f layed through to
8130: 20 74 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e the 1st argumen
8140: 74 20 6f 66 20 65 61 63 68 0d 0a 2a 2a 20 63 61 t of each..** ca
8150: 6c 6c 62 61 63 6b 20 69 6e 76 6f 63 61 74 69 6f llback invocatio
8160: 6e 2e 20 20 5e 49 66 20 74 68 65 20 63 61 6c 6c n. ^If the call
8170: 62 61 63 6b 20 70 6f 69 6e 74 65 72 20 74 6f 20 back pointer to
8180: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0d 0a sqlite3_exec()..
8190: 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e ** is NULL, then
81a0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 no callback is
81b0: 65 76 65 72 20 69 6e 76 6f 6b 65 64 20 61 6e 64 ever invoked and
81c0: 20 72 65 73 75 6c 74 20 72 6f 77 73 20 61 72 65 result rows are
81d0: 0d 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 0d 0a 2a ..** ignored...*
81e0: 2a 0d 0a 2a 2a 20 5e 49 66 20 61 6e 20 65 72 72 *..** ^If an err
81f0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 or occurs while
8200: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 53 evaluating the S
8210: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 QL statements pa
8220: 73 73 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 73 71 ssed into..** sq
8230: 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20 74 68 lite3_exec(), th
8240: 65 6e 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 en execution of
8250: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 the current stat
8260: 65 6d 65 6e 74 20 73 74 6f 70 73 20 61 6e 64 0d ement stops and.
8270: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 73 .** subsequent s
8280: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 73 6b tatements are sk
8290: 69 70 70 65 64 2e 20 20 5e 49 66 20 74 68 65 20 ipped. ^If the
82a0: 35 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 5th parameter to
82b0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0d sqlite3_exec().
82c0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 .** is not NULL
82d0: 74 68 65 6e 20 61 6e 79 20 65 72 72 6f 72 20 6d then any error m
82e0: 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 essage is writte
82f0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 n into memory ob
8300: 74 61 69 6e 65 64 0d 0a 2a 2a 20 66 72 6f 6d 20 tained..** from
8310: 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 [sqlite3_malloc(
8320: 29 5d 20 61 6e 64 20 70 61 73 73 65 64 20 62 61 )] and passed ba
8330: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 35 ck through the 5
8340: 74 68 20 70 61 72 61 6d 65 74 65 72 2e 0d 0a 2a th parameter...*
8350: 2a 20 54 6f 20 61 76 6f 69 64 20 6d 65 6d 6f 72 * To avoid memor
8360: 79 20 6c 65 61 6b 73 2c 20 74 68 65 20 61 70 70 y leaks, the app
8370: 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 lication should
8380: 69 6e 76 6f 6b 65 20 5b 73 71 6c 69 74 65 33 5f invoke [sqlite3_
8390: 66 72 65 65 28 29 5d 0d 0a 2a 2a 20 6f 6e 20 65 free()]..** on e
83a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 rror message str
83b0: 69 6e 67 73 20 72 65 74 75 72 6e 65 64 20 74 68 ings returned th
83c0: 72 6f 75 67 68 20 74 68 65 20 35 74 68 20 70 61 rough the 5th pa
83d0: 72 61 6d 65 74 65 72 20 6f 66 0d 0a 2a 2a 20 6f rameter of..** o
83e0: 66 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 f sqlite3_exec()
83f0: 20 61 66 74 65 72 20 74 68 65 20 65 72 72 6f 72 after the error
8400: 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 message string
8410: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 is no longer nee
8420: 64 65 64 2e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 ded...** ^If the
8430: 20 35 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 5th parameter t
8440: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 o sqlite3_exec()
8450: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 is not NULL and
8460: 20 6e 6f 20 65 72 72 6f 72 73 0d 0a 2a 2a 20 6f no errors..** o
8470: 63 63 75 72 2c 20 74 68 65 6e 20 73 71 6c 69 74 ccur, then sqlit
8480: 65 33 5f 65 78 65 63 28 29 20 73 65 74 73 20 74 e3_exec() sets t
8490: 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69 74 he pointer in it
84a0: 73 20 35 74 68 20 70 61 72 61 6d 65 74 65 72 20 s 5th parameter
84b0: 74 6f 0d 0a 2a 2a 20 4e 55 4c 4c 20 62 65 66 6f to..** NULL befo
84c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a re returning...*
84d0: 2a 0d 0a 2a 2a 20 5e 49 66 20 61 6e 20 73 71 6c *..** ^If an sql
84e0: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c ite3_exec() call
84f0: 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e back returns non
8500: 2d 7a 65 72 6f 2c 20 74 68 65 20 73 71 6c 69 74 -zero, the sqlit
8510: 65 33 5f 65 78 65 63 28 29 0d 0a 2a 2a 20 72 6f e3_exec()..** ro
8520: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 utine returns SQ
8530: 4c 49 54 45 5f 41 42 4f 52 54 20 77 69 74 68 6f LITE_ABORT witho
8540: 75 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 ut invoking the
8550: 63 61 6c 6c 62 61 63 6b 20 61 67 61 69 6e 20 61 callback again a
8560: 6e 64 0d 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 nd..** without r
8570: 75 6e 6e 69 6e 67 20 61 6e 79 20 73 75 62 73 65 unning any subse
8580: 71 75 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d quent SQL statem
8590: 65 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 ents...**..** ^T
85a0: 68 65 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 he 2nd argument
85b0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 to the sqlite3_e
85c0: 78 65 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 xec() callback f
85d0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0d 0a unction is the..
85e0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c ** number of col
85f0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 umns in the resu
8600: 6c 74 2e 20 20 5e 54 68 65 20 33 72 64 20 61 72 lt. ^The 3rd ar
8610: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 71 gument to the sq
8620: 6c 69 74 65 33 5f 65 78 65 63 28 29 0d 0a 2a 2a lite3_exec()..**
8630: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 6e 20 callback is an
8640: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 array of pointer
8650: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 6f 62 74 s to strings obt
8660: 61 69 6e 65 64 20 61 73 20 69 66 20 66 72 6f 6d ained as if from
8670: 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f ..** [sqlite3_co
8680: 6c 75 6d 6e 5f 74 65 78 74 28 29 5d 2c 20 6f 6e lumn_text()], on
8690: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d e for each colum
86a0: 6e 2e 20 20 5e 49 66 20 61 6e 20 65 6c 65 6d 65 n. ^If an eleme
86b0: 6e 74 20 6f 66 20 61 0d 0a 2a 2a 20 72 65 73 75 nt of a..** resu
86c0: 6c 74 20 72 6f 77 20 69 73 20 4e 55 4c 4c 20 74 lt row is NULL t
86d0: 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f hen the correspo
86e0: 6e 64 69 6e 67 20 73 74 72 69 6e 67 20 70 6f 69 nding string poi
86f0: 6e 74 65 72 20 66 6f 72 20 74 68 65 0d 0a 2a 2a nter for the..**
8700: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 sqlite3_exec()
8710: 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 4e 55 callback is a NU
8720: 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 20 5e 54 68 LL pointer. ^Th
8730: 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 e 4th argument t
8740: 6f 20 74 68 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 o the..** sqlite
8750: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 62 61 63 3_exec() callbac
8760: 6b 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 k is an array of
8770: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 pointers to str
8780: 69 6e 67 73 20 77 68 65 72 65 20 65 61 63 68 0d ings where each.
8790: 0a 2a 2a 20 65 6e 74 72 79 20 72 65 70 72 65 73 .** entry repres
87a0: 65 6e 74 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 ents the name of
87b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 corresponding r
87c0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 61 73 20 esult column as
87d0: 6f 62 74 61 69 6e 65 64 0d 0a 2a 2a 20 66 72 6f obtained..** fro
87e0: 6d 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d m [sqlite3_colum
87f0: 6e 5f 6e 61 6d 65 28 29 5d 2e 0d 0a 2a 2a 0d 0a n_name()]...**..
8800: 2a 2a 20 5e 49 66 20 74 68 65 20 32 6e 64 20 70 ** ^If the 2nd p
8810: 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 arameter to sqli
8820: 74 65 33 5f 65 78 65 63 28 29 20 69 73 20 61 20 te3_exec() is a
8830: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 61 20 NULL pointer, a
8840: 70 6f 69 6e 74 65 72 0d 0a 2a 2a 20 74 6f 20 61 pointer..** to a
8850: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 n empty string,
8860: 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 or a pointer tha
8870: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 t contains only
8880: 77 68 69 74 65 73 70 61 63 65 20 61 6e 64 2f 6f whitespace and/o
8890: 72 20 0d 0a 2a 2a 20 53 51 4c 20 63 6f 6d 6d 65 r ..** SQL comme
88a0: 6e 74 73 2c 20 74 68 65 6e 20 6e 6f 20 53 51 4c nts, then no SQL
88b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 statements are
88c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 evaluated and th
88d0: 65 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 69 e database..** i
88e0: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2e 0d 0a s not changed...
88f0: 2a 2a 0d 0a 2a 2a 20 52 65 73 74 72 69 63 74 69 **..** Restricti
8900: 6f 6e 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c ons:..**..** <ul
8910: 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65 20 61 >..** <li> The a
8920: 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74 20 pplication must
8930: 69 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 insure that the
8940: 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 1st parameter to
8950: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0d sqlite3_exec().
8960: 0a 2a 2a 20 20 20 20 20 20 69 73 20 61 20 76 61 .** is a va
8970: 6c 69 64 20 61 6e 64 20 6f 70 65 6e 20 5b 64 61 lid and open [da
8980: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
8990: 6e 5d 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65 n]...** <li> The
89a0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 application mus
89b0: 74 20 6e 6f 74 20 63 6c 6f 73 65 20 5b 64 61 74 t not close [dat
89c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
89d0: 5d 20 73 70 65 63 69 66 69 65 64 20 62 79 0d 0a ] specified by..
89e0: 2a 2a 20 20 20 20 20 20 74 68 65 20 31 73 74 20 ** the 1st
89f0: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c parameter to sql
8a00: 69 74 65 33 5f 65 78 65 63 28 29 20 77 68 69 6c ite3_exec() whil
8a10: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 e sqlite3_exec()
8a20: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0d 0a 2a 2a is running...**
8a30: 20 3c 6c 69 3e 20 54 68 65 20 61 70 70 6c 69 63 <li> The applic
8a40: 61 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 6d ation must not m
8a50: 6f 64 69 66 79 20 74 68 65 20 53 51 4c 20 73 74 odify the SQL st
8a60: 61 74 65 6d 65 6e 74 20 74 65 78 74 20 70 61 73 atement text pas
8a70: 73 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 20 20 20 sed into..**
8a80: 20 20 74 68 65 20 32 6e 64 20 70 61 72 61 6d 65 the 2nd parame
8a90: 74 65 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 65 ter of sqlite3_e
8aa0: 78 65 63 28 29 20 77 68 69 6c 65 20 73 71 6c 69 xec() while sqli
8ab0: 74 65 33 5f 65 78 65 63 28 29 20 69 73 20 72 75 te3_exec() is ru
8ac0: 6e 6e 69 6e 67 2e 0d 0a 2a 2a 20 3c 2f 75 6c 3e nning...** </ul>
8ad0: 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
8ae0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 int sqlite3_exe
8af0: 63 28 0d 0a 20 20 73 71 6c 69 74 65 33 2a 2c 20 c(.. sqlite3*,
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8b20: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 /* An open data
8b30: 62 61 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 base */.. const
8b40: 20 63 68 61 72 20 2a 73 71 6c 2c 20 20 20 20 20 char *sql,
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8b60: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 /* SQL to
8b70: 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0d be evaluated */.
8b80: 0a 20 20 69 6e 74 20 28 2a 63 61 6c 6c 62 61 63 . int (*callbac
8b90: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 k)(void*,int,cha
8ba0: 72 2a 2a 2c 63 68 61 72 2a 2a 29 2c 20 20 2f 2a r**,char**), /*
8bb0: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 Callback functi
8bc0: 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 2c on */.. void *,
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8bf0: 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75 6d /* 1st argum
8c00: 65 6e 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 ent to callback
8c10: 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 65 72 72 */.. char **err
8c20: 6d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 msg
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8c40: 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 /* Error msg wr
8c50: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0d 0a 29 itten here */..)
8c60: 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
8c70: 33 52 45 46 3a 20 52 65 73 75 6c 74 20 43 6f 64 3REF: Result Cod
8c80: 65 73 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a es..** KEYWORDS:
8c90: 20 53 51 4c 49 54 45 5f 4f 4b 20 7b 65 72 72 6f SQLITE_OK {erro
8ca0: 72 20 63 6f 64 65 7d 20 7b 65 72 72 6f 72 20 63 r code} {error c
8cb0: 6f 64 65 73 7d 0d 0a 2a 2a 20 4b 45 59 57 4f 52 odes}..** KEYWOR
8cc0: 44 53 3a 20 7b 72 65 73 75 6c 74 20 63 6f 64 65 DS: {result code
8cd0: 7d 20 7b 72 65 73 75 6c 74 20 63 6f 64 65 73 7d } {result codes}
8ce0: 0d 0a 2a 2a 0d 0a 2a 2a 20 4d 61 6e 79 20 53 51 ..**..** Many SQ
8cf0: 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 72 Lite functions r
8d00: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
8d10: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f result code fro
8d20: 6d 20 74 68 65 20 73 65 74 20 73 68 6f 77 6e 0d m the set shown.
8d30: 0a 2a 2a 20 68 65 72 65 20 69 6e 20 6f 72 64 65 .** here in orde
8d40: 72 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73 75 r to indicate su
8d50: 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 ccess or failure
8d60: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 65 77 20 65 72 ...**..** New er
8d70: 72 6f 72 20 63 6f 64 65 73 20 6d 61 79 20 62 65 ror codes may be
8d80: 20 61 64 64 65 64 20 69 6e 20 66 75 74 75 72 65 added in future
8d90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c versions of SQL
8da0: 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 ite...**..** See
8db0: 20 61 6c 73 6f 3a 20 5b 53 51 4c 49 54 45 5f 49 also: [SQLITE_I
8dc0: 4f 45 52 52 5f 52 45 41 44 20 7c 20 65 78 74 65 OERR_READ | exte
8dd0: 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 nded result code
8de0: 73 5d 2c 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 s],..** [sqlite3
8df0: 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 _vtab_on_conflic
8e00: 74 28 29 5d 20 5b 53 51 4c 49 54 45 5f 52 4f 4c t()] [SQLITE_ROL
8e10: 4c 42 41 43 4b 20 7c 20 72 65 73 75 6c 74 20 63 LBACK | result c
8e20: 6f 64 65 73 5d 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 odes]...*/..#def
8e30: 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 ine SQLITE_OK
8e40: 20 20 20 20 20 20 20 20 30 20 20 20 2f 2a 20 53 0 /* S
8e50: 75 63 63 65 73 73 66 75 6c 20 72 65 73 75 6c 74 uccessful result
8e60: 20 2a 2f 0d 0a 2f 2a 20 62 65 67 69 6e 6e 69 6e */../* beginnin
8e70: 67 2d 6f 66 2d 65 72 72 6f 72 2d 63 6f 64 65 73 g-of-error-codes
8e80: 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
8e90: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 ITE_ERROR
8ea0: 20 31 20 20 20 2f 2a 20 53 51 4c 20 65 72 72 6f 1 /* SQL erro
8eb0: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 r or missing dat
8ec0: 61 62 61 73 65 20 2a 2f 0d 0a 23 64 65 66 69 6e abase */..#defin
8ed0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 e SQLITE_INTERNA
8ee0: 4c 20 20 20 20 20 32 20 20 20 2f 2a 20 49 6e 74 L 2 /* Int
8ef0: 65 72 6e 61 6c 20 6c 6f 67 69 63 20 65 72 72 6f ernal logic erro
8f00: 72 20 69 6e 20 53 51 4c 69 74 65 20 2a 2f 0d 0a r in SQLite */..
8f10: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 #define SQLITE_P
8f20: 45 52 4d 20 20 20 20 20 20 20 20 20 33 20 20 20 ERM 3
8f30: 2f 2a 20 41 63 63 65 73 73 20 70 65 72 6d 69 73 /* Access permis
8f40: 73 69 6f 6e 20 64 65 6e 69 65 64 20 2a 2f 0d 0a sion denied */..
8f50: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 #define SQLITE_A
8f60: 42 4f 52 54 20 20 20 20 20 20 20 20 34 20 20 20 BORT 4
8f70: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 72 6f 75 74 /* Callback rout
8f80: 69 6e 65 20 72 65 71 75 65 73 74 65 64 20 61 6e ine requested an
8f90: 20 61 62 6f 72 74 20 2a 2f 0d 0a 23 64 65 66 69 abort */..#defi
8fa0: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 ne SQLITE_BUSY
8fb0: 20 20 20 20 20 20 20 35 20 20 20 2f 2a 20 54 68 5 /* Th
8fc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
8fd0: 69 73 20 6c 6f 63 6b 65 64 20 2a 2f 0d 0a 23 64 is locked */..#d
8fe0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 efine SQLITE_LOC
8ff0: 4b 45 44 20 20 20 20 20 20 20 36 20 20 20 2f 2a KED 6 /*
9000: 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 A table in the
9010: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b database is lock
9020: 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ed */..#define S
9030: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 QLITE_NOMEM
9040: 20 20 20 37 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 7 /* A mall
9050: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0d 0a oc() failed */..
9060: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 #define SQLITE_R
9070: 45 41 44 4f 4e 4c 59 20 20 20 20 20 38 20 20 20 EADONLY 8
9080: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 77 72 /* Attempt to wr
9090: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 ite a readonly d
90a0: 61 74 61 62 61 73 65 20 2a 2f 0d 0a 23 64 65 66 atabase */..#def
90b0: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 ine SQLITE_INTER
90c0: 52 55 50 54 20 20 20 20 39 20 20 20 2f 2a 20 4f RUPT 9 /* O
90d0: 70 65 72 61 74 69 6f 6e 20 74 65 72 6d 69 6e 61 peration termina
90e0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 69 ted by sqlite3_i
90f0: 6e 74 65 72 72 75 70 74 28 29 2a 2f 0d 0a 23 64 nterrupt()*/..#d
9100: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 45 efine SQLITE_IOE
9110: 52 52 20 20 20 20 20 20 20 31 30 20 20 20 2f 2a RR 10 /*
9120: 20 53 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 64 69 Some kind of di
9130: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 sk I/O error occ
9140: 75 72 72 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e urred */..#defin
9150: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 e SQLITE_CORRUPT
9160: 20 20 20 20 20 31 31 20 20 20 2f 2a 20 54 68 65 11 /* The
9170: 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 database disk i
9180: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 mage is malforme
9190: 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 d */..#define SQ
91a0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 LITE_NOTFOUND
91b0: 20 31 32 20 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 12 /* Unknown
91c0: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 opcode in sqlit
91d0: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 e3_file_control(
91e0: 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 ) */..#define SQ
91f0: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 LITE_FULL
9200: 20 31 33 20 20 20 2f 2a 20 49 6e 73 65 72 74 69 13 /* Inserti
9210: 6f 6e 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 on failed becaus
9220: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 75 e database is fu
9230: 6c 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ll */..#define S
9240: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 QLITE_CANTOPEN
9250: 20 20 31 34 20 20 20 2f 2a 20 55 6e 61 62 6c 65 14 /* Unable
9260: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 to open the dat
9270: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 23 abase file */..#
9280: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 52 define SQLITE_PR
9290: 4f 54 4f 43 4f 4c 20 20 20 20 31 35 20 20 20 2f OTOCOL 15 /
92a0: 2a 20 44 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 * Database lock
92b0: 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a protocol error *
92c0: 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
92d0: 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 31 36 E_EMPTY 16
92e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 /* Database i
92f0: 73 20 65 6d 70 74 79 20 2a 2f 0d 0a 23 64 65 66 s empty */..#def
9300: 69 6e 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d ine SQLITE_SCHEM
9310: 41 20 20 20 20 20 20 31 37 20 20 20 2f 2a 20 54 A 17 /* T
9320: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 he database sche
9330: 6d 61 20 63 68 61 6e 67 65 64 20 2a 2f 0d 0a 23 ma changed */..#
9340: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 4f define SQLITE_TO
9350: 4f 42 49 47 20 20 20 20 20 20 31 38 20 20 20 2f OBIG 18 /
9360: 2a 20 53 74 72 69 6e 67 20 6f 72 20 42 4c 4f 42 * String or BLOB
9370: 20 65 78 63 65 65 64 73 20 73 69 7a 65 20 6c 69 exceeds size li
9380: 6d 69 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 mit */..#define
9390: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
93a0: 54 20 20 31 39 20 20 20 2f 2a 20 41 62 6f 72 74 T 19 /* Abort
93b0: 20 64 75 65 20 74 6f 20 63 6f 6e 73 74 72 61 69 due to constrai
93c0: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 2a 2f 0d nt violation */.
93d0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
93e0: 4d 49 53 4d 41 54 43 48 20 20 20 20 32 30 20 20 MISMATCH 20
93f0: 20 2f 2a 20 44 61 74 61 20 74 79 70 65 20 6d 69 /* Data type mi
9400: 73 6d 61 74 63 68 20 2a 2f 0d 0a 23 64 65 66 69 smatch */..#defi
9410: 6e 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 ne SQLITE_MISUSE
9420: 20 20 20 20 20 20 32 31 20 20 20 2f 2a 20 4c 69 21 /* Li
9430: 62 72 61 72 79 20 75 73 65 64 20 69 6e 63 6f 72 brary used incor
9440: 72 65 63 74 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 rectly */..#defi
9450: 6e 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 ne SQLITE_NOLFS
9460: 20 20 20 20 20 20 32 32 20 20 20 2f 2a 20 55 73 22 /* Us
9470: 65 73 20 4f 53 20 66 65 61 74 75 72 65 73 20 6e es OS features n
9480: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 ot supported on
9490: 68 6f 73 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 host */..#define
94a0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 SQLITE_AUTH
94b0: 20 20 20 20 32 33 20 20 20 2f 2a 20 41 75 74 68 23 /* Auth
94c0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 orization denied
94d0: 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
94e0: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 ITE_FORMAT
94f0: 32 34 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72 24 /* Auxiliar
9500: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 y database forma
9510: 74 20 65 72 72 6f 72 20 2a 2f 0d 0a 23 64 65 66 t error */..#def
9520: 69 6e 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 ine SQLITE_RANGE
9530: 20 20 20 20 20 20 20 32 35 20 20 20 2f 2a 20 32 25 /* 2
9540: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 nd parameter to
9550: 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 6f 75 74 sqlite3_bind out
9560: 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0d 0a 23 64 of range */..#d
9570: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 4f 54 efine SQLITE_NOT
9580: 41 44 42 20 20 20 20 20 20 32 36 20 20 20 2f 2a ADB 26 /*
9590: 20 46 69 6c 65 20 6f 70 65 6e 65 64 20 74 68 61 File opened tha
95a0: 74 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 t is not a datab
95b0: 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 23 64 65 ase file */..#de
95c0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 4f 57 20 fine SQLITE_ROW
95d0: 20 20 20 20 20 20 20 20 31 30 30 20 20 2f 2a 20 100 /*
95e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 68 sqlite3_step() h
95f0: 61 73 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 72 as another row r
9600: 65 61 64 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 eady */..#define
9610: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 SQLITE_DONE
9620: 20 20 20 20 31 30 31 20 20 2f 2a 20 73 71 6c 69 101 /* sqli
9630: 74 65 33 5f 73 74 65 70 28 29 20 68 61 73 20 66 te3_step() has f
9640: 69 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e inished executin
9650: 67 20 2a 2f 0d 0a 2f 2a 20 65 6e 64 2d 6f 66 2d g */../* end-of-
9660: 65 72 72 6f 72 2d 63 6f 64 65 73 20 2a 2f 0d 0a error-codes */..
9670: 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
9680: 46 3a 20 45 78 74 65 6e 64 65 64 20 52 65 73 75 F: Extended Resu
9690: 6c 74 20 43 6f 64 65 73 0d 0a 2a 2a 20 4b 45 59 lt Codes..** KEY
96a0: 57 4f 52 44 53 3a 20 7b 65 78 74 65 6e 64 65 64 WORDS: {extended
96b0: 20 65 72 72 6f 72 20 63 6f 64 65 7d 20 7b 65 78 error code} {ex
96c0: 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 tended error cod
96d0: 65 73 7d 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 es}..** KEYWORDS
96e0: 3a 20 7b 65 78 74 65 6e 64 65 64 20 72 65 73 75 : {extended resu
96f0: 6c 74 20 63 6f 64 65 7d 20 7b 65 78 74 65 6e 64 lt code} {extend
9700: 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 7d ed result codes}
9710: 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 69 74 73 20 ..**..** In its
9720: 64 65 66 61 75 6c 74 20 63 6f 6e 66 69 67 75 72 default configur
9730: 61 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 41 50 ation, SQLite AP
9740: 49 20 72 6f 75 74 69 6e 65 73 20 72 65 74 75 72 I routines retur
9750: 6e 20 6f 6e 65 20 6f 66 20 32 36 20 69 6e 74 65 n one of 26 inte
9760: 67 65 72 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f ger..** [SQLITE_
9770: 4f 4b 20 7c 20 72 65 73 75 6c 74 20 63 6f 64 65 OK | result code
9780: 73 5d 2e 20 20 48 6f 77 65 76 65 72 2c 20 65 78 s]. However, ex
9790: 70 65 72 69 65 6e 63 65 20 68 61 73 20 73 68 6f perience has sho
97a0: 77 6e 20 74 68 61 74 20 6d 61 6e 79 20 6f 66 0d wn that many of.
97b0: 0a 2a 2a 20 74 68 65 73 65 20 72 65 73 75 6c 74 .** these result
97c0: 20 63 6f 64 65 73 20 61 72 65 20 74 6f 6f 20 63 codes are too c
97d0: 6f 61 72 73 65 2d 67 72 61 69 6e 65 64 2e 20 20 oarse-grained.
97e0: 54 68 65 79 20 64 6f 20 6e 6f 74 20 70 72 6f 76 They do not prov
97f0: 69 64 65 20 61 73 0d 0a 2a 2a 20 6d 75 63 68 20 ide as..** much
9800: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 information abou
9810: 74 20 70 72 6f 62 6c 65 6d 73 20 61 73 20 70 72 t problems as pr
9820: 6f 67 72 61 6d 6d 65 72 73 20 6d 69 67 68 74 20 ogrammers might
9830: 6c 69 6b 65 2e 20 20 49 6e 20 61 6e 20 65 66 66 like. In an eff
9840: 6f 72 74 20 74 6f 0d 0a 2a 2a 20 61 64 64 72 65 ort to..** addre
9850: 73 73 20 74 68 69 73 2c 20 6e 65 77 65 72 20 76 ss this, newer v
9860: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 ersions of SQLit
9870: 65 20 28 76 65 72 73 69 6f 6e 20 33 2e 33 2e 38 e (version 3.3.8
9880: 20 61 6e 64 20 6c 61 74 65 72 29 20 69 6e 63 6c and later) incl
9890: 75 64 65 0d 0a 2a 2a 20 73 75 70 70 6f 72 74 20 ude..** support
98a0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 for additional r
98b0: 65 73 75 6c 74 20 63 6f 64 65 73 20 74 68 61 74 esult codes that
98c0: 20 70 72 6f 76 69 64 65 20 6d 6f 72 65 20 64 65 provide more de
98d0: 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d 61 74 69 tailed informati
98e0: 6f 6e 0d 0a 2a 2a 20 61 62 6f 75 74 20 65 72 72 on..** about err
98f0: 6f 72 73 2e 20 54 68 65 20 65 78 74 65 6e 64 65 ors. The extende
9900: 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 20 61 d result codes a
9910: 72 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64 69 re enabled or di
9920: 73 61 62 6c 65 64 0d 0a 2a 2a 20 6f 6e 20 61 20 sabled..** on a
9930: 70 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e per database con
9940: 6e 65 63 74 69 6f 6e 20 62 61 73 69 73 20 75 73 nection basis us
9950: 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 6c ing the..** [sql
9960: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 ite3_extended_re
9970: 73 75 6c 74 5f 63 6f 64 65 73 28 29 5d 20 41 50 sult_codes()] AP
9980: 49 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f 6d 65 20 I...**..** Some
9990: 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 of the available
99a0: 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 extended result
99b0: 20 63 6f 64 65 73 20 61 72 65 20 6c 69 73 74 65 codes are liste
99c0: 64 20 68 65 72 65 2e 0d 0a 2a 2a 20 4f 6e 65 20 d here...** One
99d0: 6d 61 79 20 65 78 70 65 63 74 20 74 68 65 20 6e may expect the n
99e0: 75 6d 62 65 72 20 6f 66 20 65 78 74 65 6e 64 65 umber of extende
99f0: 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 20 77 d result codes w
9a00: 69 6c 6c 20 62 65 20 65 78 70 61 6e 64 0d 0a 2a ill be expand..*
9a10: 2a 20 6f 76 65 72 20 74 69 6d 65 2e 20 20 53 6f * over time. So
9a20: 66 74 77 61 72 65 20 74 68 61 74 20 75 73 65 73 ftware that uses
9a30: 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 extended result
9a40: 20 63 6f 64 65 73 20 73 68 6f 75 6c 64 20 65 78 codes should ex
9a50: 70 65 63 74 0d 0a 2a 2a 20 74 6f 20 73 65 65 20 pect..** to see
9a60: 6e 65 77 20 72 65 73 75 6c 74 20 63 6f 64 65 73 new result codes
9a70: 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 in future relea
9a80: 73 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0d 0a ses of SQLite...
9a90: 2a 2a 0d 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 **..** The SQLIT
9aa0: 45 5f 4f 4b 20 72 65 73 75 6c 74 20 63 6f 64 65 E_OK result code
9ab0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 65 will never be e
9ac0: 78 74 65 6e 64 65 64 2e 20 20 49 74 20 77 69 6c xtended. It wil
9ad0: 6c 20 61 6c 77 61 79 73 0d 0a 2a 2a 20 62 65 20 l always..** be
9ae0: 65 78 61 63 74 6c 79 20 7a 65 72 6f 2e 0d 0a 2a exactly zero...*
9af0: 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
9b00: 45 5f 49 4f 45 52 52 5f 52 45 41 44 20 20 20 20 E_IOERR_READ
9b10: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9b20: 45 5f 49 4f 45 52 52 20 7c 20 28 31 3c 3c 38 29 E_IOERR | (1<<8)
9b30: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9b40: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 E_IOERR_SHORT_RE
9b50: 41 44 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 AD (SQLIT
9b60: 45 5f 49 4f 45 52 52 20 7c 20 28 32 3c 3c 38 29 E_IOERR | (2<<8)
9b70: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9b80: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 20 20 20 E_IOERR_WRITE
9b90: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9ba0: 45 5f 49 4f 45 52 52 20 7c 20 28 33 3c 3c 38 29 E_IOERR | (3<<8)
9bb0: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9bc0: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 20 20 20 E_IOERR_FSYNC
9bd0: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9be0: 45 5f 49 4f 45 52 52 20 7c 20 28 34 3c 3c 38 29 E_IOERR | (4<<8)
9bf0: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9c00: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e E_IOERR_DIR_FSYN
9c10: 43 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 C (SQLIT
9c20: 45 5f 49 4f 45 52 52 20 7c 20 28 35 3c 3c 38 29 E_IOERR | (5<<8)
9c30: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9c40: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 E_IOERR_TRUNCATE
9c50: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9c60: 45 5f 49 4f 45 52 52 20 7c 20 28 36 3c 3c 38 29 E_IOERR | (6<<8)
9c70: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9c80: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 20 20 20 E_IOERR_FSTAT
9c90: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9ca0: 45 5f 49 4f 45 52 52 20 7c 20 28 37 3c 3c 38 29 E_IOERR | (7<<8)
9cb0: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9cc0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20 20 E_IOERR_UNLOCK
9cd0: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9ce0: 45 5f 49 4f 45 52 52 20 7c 20 28 38 3c 3c 38 29 E_IOERR | (8<<8)
9cf0: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9d00: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 20 20 E_IOERR_RDLOCK
9d10: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9d20: 45 5f 49 4f 45 52 52 20 7c 20 28 39 3c 3c 38 29 E_IOERR | (9<<8)
9d30: 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 )..#define SQLIT
9d40: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 20 20 E_IOERR_DELETE
9d50: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 (SQLIT
9d60: 45 5f 49 4f 45 52 52 20 7c 20 28 31 30 3c 3c 38 E_IOERR | (10<<8
9d70: 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 ))..#define SQLI
9d80: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 TE_IOERR_BLOCKED
9d90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 (SQLI
9da0: 54 45 5f 49 4f 45 52 52 20 7c 20 28 31 31 3c 3c TE_IOERR | (11<<
9db0: 38 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 8))..#define SQL
9dc0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 ITE_IOERR_NOMEM
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c (SQL
9de0: 49 54 45 5f 49 4f 45 52 52 20 7c 20 28 31 32 3c ITE_IOERR | (12<
9df0: 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 <8))..#define SQ
9e00: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 LITE_IOERR_ACCES
9e10: 53 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 S (SQ
9e20: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 20 28 31 33 LITE_IOERR | (13
9e30: 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 <<8))..#define S
9e40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 QLITE_IOERR_CHEC
9e50: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 20 28 53 KRESERVEDLOCK (S
9e60: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 20 28 31 QLITE_IOERR | (1
9e70: 34 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 20 4<<8))..#define
9e80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 SQLITE_IOERR_LOC
9e90: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 K (
9ea0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 20 28 SQLITE_IOERR | (
9eb0: 31 35 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 15<<8))..#define
9ec0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c SQLITE_IOERR_CL
9ed0: 4f 53 45 20 20 20 20 20 20 20 20 20 20 20 20 20 OSE
9ee0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 20 (SQLITE_IOERR |
9ef0: 28 31 36 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e (16<<8))..#defin
9f00: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 e SQLITE_IOERR_D
9f10: 49 52 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 20 IR_CLOSE
9f20: 20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c (SQLITE_IOERR |
9f30: 20 28 31 37 3c 3c 38 29 29 0d 0a 23 64 65 66 69 (17<<8))..#defi
9f40: 6e 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f ne SQLITE_IOERR_
9f50: 53 48 4d 4f 50 45 4e 20 20 20 20 20 20 20 20 20 SHMOPEN
9f60: 20 20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 (SQLITE_IOERR
9f70: 7c 20 28 31 38 3c 3c 38 29 29 0d 0a 23 64 65 66 | (18<<8))..#def
9f80: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 ine SQLITE_IOERR
9f90: 5f 53 48 4d 53 49 5a 45 20 20 20 20 20 20 20 20 _SHMSIZE
9fa0: 20 20 20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 (SQLITE_IOERR
9fb0: 20 7c 20 28 31 39 3c 3c 38 29 29 0d 0a 23 64 65 | (19<<8))..#de
9fc0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 fine SQLITE_IOER
9fd0: 52 5f 53 48 4d 4c 4f 43 4b 20 20 20 20 20 20 20 R_SHMLOCK
9fe0: 20 20 20 20 28 53 51 4c 49 54 45 5f 49 4f 45 52 (SQLITE_IOER
9ff0: 52 20 7c 20 28 32 30 3c 3c 38 29 29 0d 0a 23 64 R | (20<<8))..#d
a000: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 45 efine SQLITE_IOE
a010: 52 52 5f 53 48 4d 4d 41 50 20 20 20 20 20 20 20 RR_SHMMAP
a020: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 49 4f 45 (SQLITE_IOE
a030: 52 52 20 7c 20 28 32 31 3c 3c 38 29 29 0d 0a 23 RR | (21<<8))..#
a040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f define SQLITE_IO
a050: 45 52 52 5f 53 45 45 4b 20 20 20 20 20 20 20 20 ERR_SEEK
a060: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 49 4f (SQLITE_IO
a070: 45 52 52 20 7c 20 28 32 32 3c 3c 38 29 29 0d 0a ERR | (22<<8))..
a080: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c #define SQLITE_L
a090: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 OCKED_SHAREDCACH
a0a0: 45 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4c E (SQLITE_L
a0b0: 4f 43 4b 45 44 20 7c 20 20 28 31 3c 3c 38 29 29 OCKED | (1<<8))
a0c0: 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
a0d0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 20 20 _BUSY_RECOVERY
a0e0: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 (SQLITE
a0f0: 5f 42 55 53 59 20 20 20 7c 20 20 28 31 3c 3c 38 _BUSY | (1<<8
a100: 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 ))..#define SQLI
a110: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 TE_CANTOPEN_NOTE
a120: 4d 50 44 49 52 20 20 20 20 20 20 28 53 51 4c 49 MPDIR (SQLI
a130: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 7c 20 28 31 TE_CANTOPEN | (1
a140: 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 <<8))..#define S
a150: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 QLITE_CORRUPT_VT
a160: 41 42 20 20 20 20 20 20 20 20 20 20 20 20 28 53 AB (S
a170: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 20 QLITE_CORRUPT |
a180: 28 31 3c 3c 38 29 29 0d 0a 23 64 65 66 69 6e 65 (1<<8))..#define
a190: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 SQLITE_READONLY
a1a0: 5f 52 45 43 4f 56 45 52 59 20 20 20 20 20 20 20 _RECOVERY
a1b0: 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 (SQLITE_READONLY
a1c0: 20 7c 20 28 31 3c 3c 38 29 29 0d 0a 23 64 65 66 | (1<<8))..#def
a1d0: 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f ine SQLITE_READO
a1e0: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 20 20 20 20 NLY_CANTLOCK
a1f0: 20 20 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f (SQLITE_READO
a200: 4e 4c 59 20 7c 20 28 32 3c 3c 38 29 29 0d 0a 0d NLY | (2<<8))...
a210: 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
a220: 3a 20 46 6c 61 67 73 20 46 6f 72 20 46 69 6c 65 : Flags For File
a230: 20 4f 70 65 6e 20 4f 70 65 72 61 74 69 6f 6e 73 Open Operations
a240: 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 62 ..**..** These b
a250: 69 74 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e it values are in
a260: 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 tended for use i
a270: 6e 20 74 68 65 0d 0a 2a 2a 20 33 72 64 20 70 61 n the..** 3rd pa
a280: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 5b rameter to the [
a290: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 sqlite3_open_v2(
a2a0: 29 5d 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 )] interface and
a2b0: 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 34 74 68 20 ..** in the 4th
a2c0: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 parameter to the
a2d0: 20 5b 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f [sqlite3_vfs.xO
a2e0: 70 65 6e 5d 20 6d 65 74 68 6f 64 2e 0d 0a 2a 2f pen] method...*/
a2f0: 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
a300: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 _OPEN_READONLY
a310: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 0x0000000
a320: 31 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 6c 1 /* Ok for sql
a330: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 2a ite3_open_v2() *
a340: 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
a350: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 E_OPEN_READWRITE
a360: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 0x000000
a370: 30 32 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 02 /* Ok for sq
a380: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 lite3_open_v2()
a390: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
a3a0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 TE_OPEN_CREATE
a3b0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
a3c0: 30 30 34 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 004 /* Ok for s
a3d0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 qlite3_open_v2()
a3e0: 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
a3f0: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f ITE_OPEN_DELETEO
a400: 4e 43 4c 4f 53 45 20 20 20 20 30 78 30 30 30 30 NCLOSE 0x0000
a410: 30 30 30 38 20 20 2f 2a 20 56 46 53 20 6f 6e 6c 0008 /* VFS onl
a420: 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 y */..#define SQ
a430: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 LITE_OPEN_EXCLUS
a440: 49 56 45 20 20 20 20 20 20 20 20 30 78 30 30 30 IVE 0x000
a450: 30 30 30 31 30 20 20 2f 2a 20 56 46 53 20 6f 6e 00010 /* VFS on
a460: 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ly */..#define S
a470: 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 QLITE_OPEN_AUTOP
a480: 52 4f 58 59 20 20 20 20 20 20 20 20 30 78 30 30 ROXY 0x00
a490: 30 30 30 30 32 30 20 20 2f 2a 20 56 46 53 20 6f 000020 /* VFS o
a4a0: 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 nly */..#define
a4b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 SQLITE_OPEN_URI
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
a4d0: 30 30 30 30 30 34 30 20 20 2f 2a 20 4f 6b 20 66 0000040 /* Ok f
a4e0: 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f or sqlite3_open_
a4f0: 76 32 28 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 v2() */..#define
a500: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 SQLITE_OPEN_MAI
a510: 4e 5f 44 42 20 20 20 20 20 20 20 20 20 20 30 78 N_DB 0x
a520: 30 30 30 30 30 31 30 30 20 20 2f 2a 20 56 46 53 00000100 /* VFS
a530: 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e only */..#defin
a540: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 e SQLITE_OPEN_TE
a550: 4d 50 5f 44 42 20 20 20 20 20 20 20 20 20 20 30 MP_DB 0
a560: 78 30 30 30 30 30 32 30 30 20 20 2f 2a 20 56 46 x00000200 /* VF
a570: 53 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 S only */..#defi
a580: 6e 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 ne SQLITE_OPEN_T
a590: 52 41 4e 53 49 45 4e 54 5f 44 42 20 20 20 20 20 RANSIENT_DB
a5a0: 30 78 30 30 30 30 30 34 30 30 20 20 2f 2a 20 56 0x00000400 /* V
a5b0: 46 53 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 FS only */..#def
a5c0: 69 6e 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f ine SQLITE_OPEN_
a5d0: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 20 20 20 MAIN_JOURNAL
a5e0: 20 30 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20 0x00000800 /*
a5f0: 56 46 53 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 VFS only */..#de
a600: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e fine SQLITE_OPEN
a610: 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 20 20 _TEMP_JOURNAL
a620: 20 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 0x00001000 /*
a630: 20 56 46 53 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 VFS only */..#d
a640: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 50 45 efine SQLITE_OPE
a650: 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 20 N_SUBJOURNAL
a660: 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 0x00002000 /
a670: 2a 20 56 46 53 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 * VFS only */..#
a680: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 50 define SQLITE_OP
a690: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 EN_MASTER_JOURNA
a6a0: 4c 20 20 20 30 78 30 30 30 30 34 30 30 30 20 20 L 0x00004000
a6b0: 2f 2a 20 56 46 53 20 6f 6e 6c 79 20 2a 2f 0d 0a /* VFS only */..
a6c0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f #define SQLITE_O
a6d0: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 20 20 20 20 PEN_NOMUTEX
a6e0: 20 20 20 20 20 30 78 30 30 30 30 38 30 30 30 20 0x00008000
a6f0: 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 6c 69 74 /* Ok for sqlit
a700: 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 2a 2f 0d e3_open_v2() */.
a710: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
a720: 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 20 OPEN_FULLMUTEX
a730: 20 20 20 20 20 20 30 78 30 30 30 31 30 30 30 30 0x00010000
a740: 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 6c 69 /* Ok for sqli
a750: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 2a 2f te3_open_v2() */
a760: 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
a770: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 _OPEN_SHAREDCACH
a780: 45 20 20 20 20 20 20 30 78 30 30 30 32 30 30 30 E 0x0002000
a790: 30 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 6c 0 /* Ok for sql
a7a0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 2a ite3_open_v2() *
a7b0: 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
a7c0: 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 E_OPEN_PRIVATECA
a7d0: 43 48 45 20 20 20 20 20 30 78 30 30 30 34 30 30 CHE 0x000400
a7e0: 30 30 20 20 2f 2a 20 4f 6b 20 66 6f 72 20 73 71 00 /* Ok for sq
a7f0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 lite3_open_v2()
a800: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
a810: 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 20 20 20 20 TE_OPEN_WAL
a820: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 38 30 0x00080
a830: 30 30 30 20 20 2f 2a 20 56 46 53 20 6f 6e 6c 79 000 /* VFS only
a840: 20 2a 2f 0d 0a 0d 0a 2f 2a 20 52 65 73 65 72 76 */..../* Reserv
a850: 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 ed:
a860: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 0x00
a870: 46 30 30 30 30 30 20 2a 2f 0d 0a 0d 0a 2f 2a 0d F00000 */..../*.
a880: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 .** CAPI3REF: De
a890: 76 69 63 65 20 43 68 61 72 61 63 74 65 72 69 73 vice Characteris
a8a0: 74 69 63 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 tics..**..** The
a8b0: 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 xDeviceCharacte
a8c0: 72 69 73 74 69 63 73 20 6d 65 74 68 6f 64 20 6f ristics method o
a8d0: 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 69 f the [sqlite3_i
a8e0: 6f 5f 6d 65 74 68 6f 64 73 5d 0d 0a 2a 2a 20 6f o_methods]..** o
a8f0: 62 6a 65 63 74 20 72 65 74 75 72 6e 73 20 61 6e bject returns an
a900: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 integer which i
a910: 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 74 68 s a vector of th
a920: 65 20 74 68 65 73 65 0d 0a 2a 2a 20 62 69 74 20 e these..** bit
a930: 76 61 6c 75 65 73 20 65 78 70 72 65 73 73 69 6e values expressin
a940: 67 20 49 2f 4f 20 63 68 61 72 61 63 74 65 72 69 g I/O characteri
a950: 73 74 69 63 73 20 6f 66 20 74 68 65 20 6d 61 73 stics of the mas
a960: 73 20 73 74 6f 72 61 67 65 0d 0a 2a 2a 20 64 65 s storage..** de
a970: 76 69 63 65 20 74 68 61 74 20 68 6f 6c 64 73 20 vice that holds
a980: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 74 68 the file that th
a990: 65 20 5b 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 e [sqlite3_io_me
a9a0: 74 68 6f 64 73 5d 0d 0a 2a 2a 20 72 65 66 65 72 thods]..** refer
a9b0: 73 20 74 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 s to...**..** Th
a9c0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 e SQLITE_IOCAP_A
a9d0: 54 4f 4d 49 43 20 70 72 6f 70 65 72 74 79 20 6d TOMIC property m
a9e0: 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 77 72 eans that all wr
a9f0: 69 74 65 73 20 6f 66 0d 0a 2a 2a 20 61 6e 79 20 ites of..** any
aa00: 73 69 7a 65 20 61 72 65 20 61 74 6f 6d 69 63 2e size are atomic.
aa10: 20 20 54 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 The SQLITE_IOC
aa20: 41 50 5f 41 54 4f 4d 49 43 6e 6e 6e 20 76 61 6c AP_ATOMICnnn val
aa30: 75 65 73 0d 0a 2a 2a 20 6d 65 61 6e 20 74 68 61 ues..** mean tha
aa40: 74 20 77 72 69 74 65 73 20 6f 66 20 62 6c 6f 63 t writes of bloc
aa50: 6b 73 20 74 68 61 74 20 61 72 65 20 6e 6e 6e 20 ks that are nnn
aa60: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 61 6e bytes in size an
aa70: 64 0d 0a 2a 2a 20 61 72 65 20 61 6c 69 67 6e 65 d..** are aligne
aa80: 64 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 d to an address
aa90: 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 74 65 which is an inte
aaa0: 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 0d ger multiple of.
aab0: 0a 2a 2a 20 6e 6e 6e 20 61 72 65 20 61 74 6f 6d .** nnn are atom
aac0: 69 63 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f ic. The SQLITE_
aad0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e IOCAP_SAFE_APPEN
aae0: 44 20 76 61 6c 75 65 20 6d 65 61 6e 73 0d 0a 2a D value means..*
aaf0: 2a 20 74 68 61 74 20 77 68 65 6e 20 64 61 74 61 * that when data
ab00: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 is appended to
ab10: 61 20 66 69 6c 65 2c 20 74 68 65 20 64 61 74 61 a file, the data
ab20: 20 69 73 20 61 70 70 65 6e 64 65 64 0d 0a 2a 2a is appended..**
ab30: 20 66 69 72 73 74 20 74 68 65 6e 20 74 68 65 20 first then the
ab40: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 size of the file
ab50: 20 69 73 20 65 78 74 65 6e 64 65 64 2c 20 6e 65 is extended, ne
ab60: 76 65 72 20 74 68 65 20 6f 74 68 65 72 0d 0a 2a ver the other..*
ab70: 2a 20 77 61 79 20 61 72 6f 75 6e 64 2e 20 20 54 * way around. T
ab80: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f he SQLITE_IOCAP_
ab90: 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 SEQUENTIAL prope
aba0: 72 74 79 20 6d 65 61 6e 73 20 74 68 61 74 0d 0a rty means that..
abb0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 ** information i
abc0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 s written to dis
abd0: 6b 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 k in the same or
abe0: 64 65 72 20 61 73 20 63 61 6c 6c 73 0d 0a 2a 2a der as calls..**
abf0: 20 74 6f 20 78 57 72 69 74 65 28 29 2e 20 20 54 to xWrite(). T
ac00: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f he SQLITE_IOCAP_
ac10: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 POWERSAFE_OVERWR
ac20: 49 54 45 20 70 72 6f 70 65 72 74 79 20 6d 65 61 ITE property mea
ac30: 6e 73 20 74 68 61 74 0d 0a 2a 2a 20 61 66 74 65 ns that..** afte
ac40: 72 20 72 65 62 6f 6f 74 20 66 6f 6c 6c 6f 77 69 r reboot followi
ac50: 6e 67 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f ng a crash or po
ac60: 77 65 72 20 6c 6f 73 73 2c 20 74 68 65 20 6f 6e wer loss, the on
ac70: 6c 79 20 62 79 74 65 73 20 69 6e 20 61 0d 0a 2a ly bytes in a..*
ac80: 2a 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 * file that were
ac90: 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 65 20 written at the
aca0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c 65 76 65 application leve
acb0: 6c 20 6d 69 67 68 74 20 68 61 76 65 20 63 68 61 l might have cha
acc0: 6e 67 65 64 0d 0a 2a 2a 20 61 6e 64 20 74 68 61 nged..** and tha
acd0: 74 20 61 64 6a 61 63 65 6e 74 20 62 79 74 65 73 t adjacent bytes
ace0: 2c 20 65 76 65 6e 20 62 79 74 65 73 20 77 69 74 , even bytes wit
acf0: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 hin the same sec
ad00: 74 6f 72 20 61 72 65 0d 0a 2a 2a 20 67 75 61 72 tor are..** guar
ad10: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 anteed to be unc
ad20: 68 61 6e 67 65 64 2e 0d 0a 2a 2f 0d 0a 23 64 65 hanged...*/..#de
ad30: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
ad40: 50 5f 41 54 4f 4d 49 43 20 20 20 20 20 20 20 20 P_ATOMIC
ad50: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
ad60: 30 30 31 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 001..#define SQL
ad70: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
ad80: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 512
ad90: 20 30 78 30 30 30 30 30 30 30 32 0d 0a 23 64 65 0x00000002..#de
ada0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
adb0: 50 5f 41 54 4f 4d 49 43 31 4b 20 20 20 20 20 20 P_ATOMIC1K
adc0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
add0: 30 30 34 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 004..#define SQL
ade0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
adf0: 32 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2K
ae00: 20 30 78 30 30 30 30 30 30 30 38 0d 0a 23 64 65 0x00000008..#de
ae10: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
ae20: 50 5f 41 54 4f 4d 49 43 34 4b 20 20 20 20 20 20 P_ATOMIC4K
ae30: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
ae40: 30 31 30 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 010..#define SQL
ae50: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
ae60: 38 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 8K
ae70: 20 30 78 30 30 30 30 30 30 32 30 0d 0a 23 64 65 0x00000020..#de
ae80: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
ae90: 50 5f 41 54 4f 4d 49 43 31 36 4b 20 20 20 20 20 P_ATOMIC16K
aea0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
aeb0: 30 34 30 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 040..#define SQL
aec0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
aed0: 33 32 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 32K
aee0: 20 30 78 30 30 30 30 30 30 38 30 0d 0a 23 64 65 0x00000080..#de
aef0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
af00: 50 5f 41 54 4f 4d 49 43 36 34 4b 20 20 20 20 20 P_ATOMIC64K
af10: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
af20: 31 30 30 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 100..#define SQL
af30: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 ITE_IOCAP_SAFE_A
af40: 50 50 45 4e 44 20 20 20 20 20 20 20 20 20 20 20 PPEND
af50: 20 30 78 30 30 30 30 30 32 30 30 0d 0a 23 64 65 0x00000200..#de
af60: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
af70: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 20 20 20 P_SEQUENTIAL
af80: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 0x00000
af90: 34 30 30 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 400..#define SQL
afa0: 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 ITE_IOCAP_UNDELE
afb0: 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 TABLE_WHEN_OPEN
afc0: 20 30 78 30 30 30 30 30 38 30 30 0d 0a 23 64 65 0x00000800..#de
afd0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 fine SQLITE_IOCA
afe0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 P_POWERSAFE_OVER
aff0: 57 52 49 54 45 20 20 20 20 30 78 30 30 30 30 31 WRITE 0x00001
b000: 30 30 30 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 000..../*..** CA
b010: 50 49 33 52 45 46 3a 20 46 69 6c 65 20 4c 6f 63 PI3REF: File Loc
b020: 6b 69 6e 67 20 4c 65 76 65 6c 73 0d 0a 2a 2a 0d king Levels..**.
b030: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20 .** SQLite uses
b040: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 69 6e 74 one of these int
b050: 65 67 65 72 20 76 61 6c 75 65 73 20 61 73 20 74 eger values as t
b060: 68 65 20 73 65 63 6f 6e 64 0d 0a 2a 2a 20 61 72 he second..** ar
b070: 67 75 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 73 20 gument to calls
b080: 69 74 20 6d 61 6b 65 73 20 74 6f 20 74 68 65 20 it makes to the
b090: 78 4c 6f 63 6b 28 29 20 61 6e 64 20 78 55 6e 6c xLock() and xUnl
b0a0: 6f 63 6b 28 29 20 6d 65 74 68 6f 64 73 0d 0a 2a ock() methods..*
b0b0: 2a 20 6f 66 20 61 6e 20 5b 73 71 6c 69 74 65 33 * of an [sqlite3
b0c0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 5d 20 6f 62 6a _io_methods] obj
b0d0: 65 63 74 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e ect...*/..#defin
b0e0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f e SQLITE_LOCK_NO
b0f0: 4e 45 20 20 20 20 20 20 20 20 20 20 30 0d 0a 23 NE 0..#
b100: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f define SQLITE_LO
b110: 43 4b 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 CK_SHARED
b120: 20 31 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 1..#define SQLI
b130: 54 45 5f 4c 4f 43 4b 5f 52 45 53 45 52 56 45 44 TE_LOCK_RESERVED
b140: 20 20 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 2..#define
b150: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 50 45 4e SQLITE_LOCK_PEN
b160: 44 49 4e 47 20 20 20 20 20 20 20 33 0d 0a 23 64 DING 3..#d
b170: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 efine SQLITE_LOC
b180: 4b 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 K_EXCLUSIVE
b190: 34 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 4..../*..** CAPI
b1a0: 33 52 45 46 3a 20 53 79 6e 63 68 72 6f 6e 69 7a 3REF: Synchroniz
b1b0: 61 74 69 6f 6e 20 54 79 70 65 20 46 6c 61 67 73 ation Type Flags
b1c0: 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 53 51 ..**..** When SQ
b1d0: 4c 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 Lite invokes the
b1e0: 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 20 xSync() method
b1f0: 6f 66 20 61 6e 0d 0a 2a 2a 20 5b 73 71 6c 69 74 of an..** [sqlit
b200: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 5d 20 6f e3_io_methods] o
b210: 62 6a 65 63 74 20 69 74 20 75 73 65 73 20 61 20 bject it uses a
b220: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0d 0a combination of..
b230: 2a 2a 20 74 68 65 73 65 20 69 6e 74 65 67 65 72 ** these integer
b240: 20 76 61 6c 75 65 73 20 61 73 20 74 68 65 20 73 values as the s
b250: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0d econd argument..
b260: 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 68 65 .**..** When the
b270: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 SQLITE_SYNC_DAT
b280: 41 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 75 73 AONLY flag is us
b290: 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 ed, it means tha
b2a0: 74 20 74 68 65 0d 0a 2a 2a 20 73 79 6e 63 20 6f t the..** sync o
b2b0: 70 65 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 6e 65 peration only ne
b2c0: 65 64 73 20 74 6f 20 66 6c 75 73 68 20 64 61 74 eds to flush dat
b2d0: 61 20 74 6f 20 6d 61 73 73 20 73 74 6f 72 61 67 a to mass storag
b2e0: 65 2e 20 20 49 6e 6f 64 65 0d 0a 2a 2a 20 69 6e e. Inode..** in
b2f0: 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 20 6e formation need n
b300: 6f 74 20 62 65 20 66 6c 75 73 68 65 64 2e 20 49 ot be flushed. I
b310: 66 20 74 68 65 20 6c 6f 77 65 72 20 66 6f 75 72 f the lower four
b320: 20 62 69 74 73 20 6f 66 20 74 68 65 20 66 6c 61 bits of the fla
b330: 67 0d 0a 2a 2a 20 65 71 75 61 6c 20 53 51 4c 49 g..** equal SQLI
b340: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 2c 20 TE_SYNC_NORMAL,
b350: 74 68 61 74 20 6d 65 61 6e 73 20 74 6f 20 75 73 that means to us
b360: 65 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 e normal fsync()
b370: 20 73 65 6d 61 6e 74 69 63 73 2e 0d 0a 2a 2a 20 semantics...**
b380: 49 66 20 74 68 65 20 6c 6f 77 65 72 20 66 6f 75 If the lower fou
b390: 72 20 62 69 74 73 20 65 71 75 61 6c 20 53 51 4c r bits equal SQL
b3a0: 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2c 20 74 ITE_SYNC_FULL, t
b3b0: 68 61 74 20 6d 65 61 6e 73 0d 0a 2a 2a 20 74 6f hat means..** to
b3c0: 20 75 73 65 20 4d 61 63 20 4f 53 20 58 20 73 74 use Mac OS X st
b3d0: 79 6c 65 20 66 75 6c 6c 73 79 6e 63 20 69 6e 73 yle fullsync ins
b3e0: 74 65 61 64 20 6f 66 20 66 73 79 6e 63 28 29 2e tead of fsync().
b3f0: 0d 0a 2a 2a 0d 0a 2a 2a 20 44 6f 20 6e 6f 74 20 ..**..** Do not
b400: 63 6f 6e 66 75 73 65 20 74 68 65 20 53 51 4c 49 confuse the SQLI
b410: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 61 TE_SYNC_NORMAL a
b420: 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 nd SQLITE_SYNC_F
b430: 55 4c 4c 20 66 6c 61 67 73 0d 0a 2a 2a 20 77 69 ULL flags..** wi
b440: 74 68 20 74 68 65 20 5b 50 52 41 47 4d 41 20 73 th the [PRAGMA s
b450: 79 6e 63 68 72 6f 6e 6f 75 73 5d 3d 4e 4f 52 4d ynchronous]=NORM
b460: 41 4c 20 61 6e 64 20 5b 50 52 41 47 4d 41 20 73 AL and [PRAGMA s
b470: 79 6e 63 68 72 6f 6e 6f 75 73 5d 3d 46 55 4c 4c ynchronous]=FULL
b480: 0d 0a 2a 2a 20 73 65 74 74 69 6e 67 73 2e 20 20 ..** settings.
b490: 54 68 65 20 5b 73 79 6e 63 68 72 6f 6e 6f 75 73 The [synchronous
b4a0: 20 70 72 61 67 6d 61 5d 20 64 65 74 65 72 6d 69 pragma] determi
b4b0: 6e 65 73 20 77 68 65 6e 20 63 61 6c 6c 73 20 74 nes when calls t
b4c0: 6f 20 74 68 65 0d 0a 2a 2a 20 78 53 79 6e 63 20 o the..** xSync
b4d0: 56 46 53 20 6d 65 74 68 6f 64 20 6f 63 63 75 72 VFS method occur
b4e0: 20 61 6e 64 20 61 70 70 6c 69 65 73 20 75 6e 69 and applies uni
b4f0: 66 6f 72 6d 6c 79 20 61 63 72 6f 73 73 20 61 6c formly across al
b500: 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0d 0a 2a 2a l platforms...**
b510: 20 54 68 65 20 53 51 4c 49 54 45 5f 53 59 4e 43 The SQLITE_SYNC
b520: 5f 4e 4f 52 4d 41 4c 20 61 6e 64 20 53 51 4c 49 _NORMAL and SQLI
b530: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 66 6c 61 TE_SYNC_FULL fla
b540: 67 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 gs determine how
b550: 0d 0a 2a 2a 20 65 6e 65 72 67 65 74 69 63 20 6f ..** energetic o
b560: 72 20 72 69 67 6f 72 6f 75 73 20 6f 72 20 66 6f r rigorous or fo
b570: 72 63 65 66 75 6c 20 74 68 65 20 73 79 6e 63 20 rceful the sync
b580: 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 operations are a
b590: 6e 64 0d 0a 2a 2a 20 6f 6e 6c 79 20 6d 61 6b 65 nd..** only make
b5a0: 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 6f 6e a difference on
b5b0: 20 4d 61 63 20 4f 53 58 20 66 6f 72 20 74 68 65 Mac OSX for the
b5c0: 20 64 65 66 61 75 6c 74 20 53 51 4c 69 74 65 20 default SQLite
b5d0: 63 6f 64 65 2e 0d 0a 2a 2a 20 28 54 68 69 72 64 code...** (Third
b5e0: 2d 70 61 72 74 79 20 56 46 53 20 69 6d 70 6c 65 -party VFS imple
b5f0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6d 69 67 68 74 mentations might
b600: 20 61 6c 73 6f 20 6d 61 6b 65 20 74 68 65 20 64 also make the d
b610: 69 73 74 69 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 62 istinction..** b
b620: 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 etween SQLITE_SY
b630: 4e 43 5f 4e 4f 52 4d 41 4c 20 61 6e 64 20 53 51 NC_NORMAL and SQ
b640: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2c 20 LITE_SYNC_FULL,
b650: 62 75 74 20 61 6d 6f 6e 67 20 74 68 65 0d 0a 2a but among the..*
b660: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 * operating syst
b670: 65 6d 73 20 6e 61 74 69 76 65 6c 79 20 73 75 70 ems natively sup
b680: 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 ported by SQLite
b690: 2c 20 6f 6e 6c 79 20 4d 61 63 20 4f 53 58 0d 0a , only Mac OSX..
b6a0: 2a 2a 20 63 61 72 65 73 20 61 62 6f 75 74 20 74 ** cares about t
b6b0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 29 0d he difference.).
b6c0: 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c .*/..#define SQL
b6d0: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 ITE_SYNC_NORMAL
b6e0: 20 20 20 20 20 20 20 30 78 30 30 30 30 32 0d 0a 0x00002..
b6f0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 #define SQLITE_S
b700: 59 4e 43 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 YNC_FULL
b710: 20 20 30 78 30 30 30 30 33 0d 0a 23 64 65 66 69 0x00003..#defi
b720: 6e 65 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 ne SQLITE_SYNC_D
b730: 41 54 41 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 ATAONLY 0x0
b740: 30 30 31 30 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 0010..../*..** C
b750: 41 50 49 33 52 45 46 3a 20 4f 53 20 49 6e 74 65 API3REF: OS Inte
b760: 72 66 61 63 65 20 4f 70 65 6e 20 46 69 6c 65 20 rface Open File
b770: 48 61 6e 64 6c 65 0d 0a 2a 2a 0d 0a 2a 2a 20 41 Handle..**..** A
b780: 6e 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 5d n [sqlite3_file]
b790: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e object represen
b7a0: 74 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 ts an open file
b7b0: 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 5b 73 71 6c in the ..** [sql
b7c0: 69 74 65 33 5f 76 66 73 20 7c 20 4f 53 20 69 6e ite3_vfs | OS in
b7d0: 74 65 72 66 61 63 65 20 6c 61 79 65 72 5d 2e 20 terface layer].
b7e0: 20 49 6e 64 69 76 69 64 75 61 6c 20 4f 53 20 69 Individual OS i
b7f0: 6e 74 65 72 66 61 63 65 0d 0a 2a 2a 20 69 6d 70 nterface..** imp
b800: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 77 69 6c lementations wil
b810: 6c 0d 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 73 75 l..** want to su
b820: 62 63 6c 61 73 73 20 74 68 69 73 20 6f 62 6a 65 bclass this obje
b830: 63 74 20 62 79 20 61 70 70 65 6e 64 69 6e 67 20 ct by appending
b840: 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64 additional field
b850: 73 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 69 72 20 s..** for their
b860: 6f 77 6e 20 75 73 65 2e 20 20 54 68 65 20 70 4d own use. The pM
b870: 65 74 68 6f 64 73 20 65 6e 74 72 79 20 69 73 20 ethods entry is
b880: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 0d a pointer to an.
b890: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 69 6f 5f .** [sqlite3_io_
b8a0: 6d 65 74 68 6f 64 73 5d 20 6f 62 6a 65 63 74 20 methods] object
b8b0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 6d 65 74 that defines met
b8c0: 68 6f 64 73 20 66 6f 72 20 70 65 72 66 6f 72 6d hods for perform
b8d0: 69 6e 67 0d 0a 2a 2a 20 49 2f 4f 20 6f 70 65 72 ing..** I/O oper
b8e0: 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 6f 70 ations on the op
b8f0: 65 6e 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 74 79 en file...*/..ty
b900: 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c pedef struct sql
b910: 69 74 65 33 5f 66 69 6c 65 20 73 71 6c 69 74 65 ite3_file sqlite
b920: 33 5f 66 69 6c 65 3b 0d 0a 73 74 72 75 63 74 20 3_file;..struct
b930: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 7b 0d 0a sqlite3_file {..
b940: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 const struct s
b950: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 qlite3_io_method
b960: 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 2f 2a s *pMethods; /*
b970: 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 61 6e 20 Methods for an
b980: 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0d 0a 7d 3b open file */..};
b990: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
b9a0: 52 45 46 3a 20 4f 53 20 49 6e 74 65 72 66 61 63 REF: OS Interfac
b9b0: 65 20 46 69 6c 65 20 56 69 72 74 75 61 6c 20 4d e File Virtual M
b9c0: 65 74 68 6f 64 73 20 4f 62 6a 65 63 74 0d 0a 2a ethods Object..*
b9d0: 2a 0d 0a 2a 2a 20 45 76 65 72 79 20 66 69 6c 65 *..** Every file
b9e0: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b opened by the [
b9f0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 sqlite3_vfs.xOpe
ba00: 6e 5d 20 6d 65 74 68 6f 64 20 70 6f 70 75 6c 61 n] method popula
ba10: 74 65 73 20 61 6e 0d 0a 2a 2a 20 5b 73 71 6c 69 tes an..** [sqli
ba20: 74 65 33 5f 66 69 6c 65 5d 20 6f 62 6a 65 63 74 te3_file] object
ba30: 20 28 6f 72 2c 20 6d 6f 72 65 20 63 6f 6d 6d 6f (or, more commo
ba40: 6e 6c 79 2c 20 61 20 73 75 62 63 6c 61 73 73 20 nly, a subclass
ba50: 6f 66 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 of the..** [sqli
ba60: 74 65 33 5f 66 69 6c 65 5d 20 6f 62 6a 65 63 74 te3_file] object
ba70: 29 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 ) with a pointer
ba80: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 to an instance
ba90: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 0d of this object..
baa0: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 .** This object
bab0: 64 65 66 69 6e 65 73 20 74 68 65 20 6d 65 74 68 defines the meth
bac0: 6f 64 73 20 75 73 65 64 20 74 6f 20 70 65 72 66 ods used to perf
bad0: 6f 72 6d 20 76 61 72 69 6f 75 73 20 6f 70 65 72 orm various oper
bae0: 61 74 69 6f 6e 73 0d 0a 2a 2a 20 61 67 61 69 6e ations..** again
baf0: 73 74 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 st the open file
bb00: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 represented by
bb10: 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c the [sqlite3_fil
bb20: 65 5d 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a e] object...**..
bb30: 2a 2a 20 49 66 20 74 68 65 20 5b 73 71 6c 69 74 ** If the [sqlit
bb40: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 5d 20 6d 65 e3_vfs.xOpen] me
bb50: 74 68 6f 64 20 73 65 74 73 20 74 68 65 20 73 71 thod sets the sq
bb60: 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 lite3_file.pMeth
bb70: 6f 64 73 20 65 6c 65 6d 65 6e 74 20 0d 0a 2a 2a ods element ..**
bb80: 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 to a non-NULL p
bb90: 6f 69 6e 74 65 72 2c 20 74 68 65 6e 20 74 68 65 ointer, then the
bba0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 sqlite3_io_meth
bbb0: 6f 64 73 2e 78 43 6c 6f 73 65 20 6d 65 74 68 6f ods.xClose metho
bbc0: 64 0d 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 d..** may be inv
bbd0: 6f 6b 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 oked even if the
bbe0: 20 5b 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f [sqlite3_vfs.xO
bbf0: 70 65 6e 5d 20 72 65 70 6f 72 74 65 64 20 74 68 pen] reported th
bc00: 61 74 20 69 74 20 66 61 69 6c 65 64 2e 20 20 54 at it failed. T
bc10: 68 65 0d 0a 2a 2a 20 6f 6e 6c 79 20 77 61 79 20 he..** only way
bc20: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 63 61 6c to prevent a cal
bc30: 6c 20 74 6f 20 78 43 6c 6f 73 65 20 66 6f 6c 6c l to xClose foll
bc40: 6f 77 69 6e 67 20 61 20 66 61 69 6c 65 64 20 5b owing a failed [
bc50: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 sqlite3_vfs.xOpe
bc60: 6e 5d 0d 0a 2a 2a 20 69 73 20 66 6f 72 20 74 68 n]..** is for th
bc70: 65 20 5b 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 e [sqlite3_vfs.x
bc80: 4f 70 65 6e 5d 20 74 6f 20 73 65 74 20 74 68 65 Open] to set the
bc90: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d sqlite3_file.pM
bca0: 65 74 68 6f 64 73 20 65 6c 65 6d 65 6e 74 0d 0a ethods element..
bcb0: 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d ** to NULL...**.
bcc0: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 .** The flags ar
bcd0: 67 75 6d 65 6e 74 20 74 6f 20 78 53 79 6e 63 20 gument to xSync
bce0: 6d 61 79 20 62 65 20 6f 6e 65 20 6f 66 20 5b 53 may be one of [S
bcf0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 QLITE_SYNC_NORMA
bd00: 4c 5d 20 6f 72 0d 0a 2a 2a 20 5b 53 51 4c 49 54 L] or..** [SQLIT
bd10: 45 5f 53 59 4e 43 5f 46 55 4c 4c 5d 2e 20 20 54 E_SYNC_FULL]. T
bd20: 68 65 20 66 69 72 73 74 20 63 68 6f 69 63 65 20 he first choice
bd30: 69 73 20 74 68 65 20 6e 6f 72 6d 61 6c 20 66 73 is the normal fs
bd40: 79 6e 63 28 29 2e 0d 0a 2a 2a 20 54 68 65 20 73 ync()...** The s
bd50: 65 63 6f 6e 64 20 63 68 6f 69 63 65 20 69 73 20 econd choice is
bd60: 61 20 4d 61 63 20 4f 53 20 58 20 73 74 79 6c 65 a Mac OS X style
bd70: 20 66 75 6c 6c 73 79 6e 63 2e 20 20 54 68 65 20 fullsync. The
bd80: 5b 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 [SQLITE_SYNC_DAT
bd90: 41 4f 4e 4c 59 5d 0d 0a 2a 2a 20 66 6c 61 67 20 AONLY]..** flag
bda0: 6d 61 79 20 62 65 20 4f 52 65 64 20 69 6e 20 74 may be ORed in t
bdb0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 o indicate that
bdc0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 6f 66 only the data of
bdd0: 20 74 68 65 20 66 69 6c 65 0d 0a 2a 2a 20 61 6e the file..** an
bde0: 64 20 6e 6f 74 20 69 74 73 20 69 6e 6f 64 65 20 d not its inode
bdf0: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 needs to be sync
be00: 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ed...**..** The
be10: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 integer values t
be20: 6f 20 78 4c 6f 63 6b 28 29 20 61 6e 64 20 78 55 o xLock() and xU
be30: 6e 6c 6f 63 6b 28 29 20 61 72 65 20 6f 6e 65 20 nlock() are one
be40: 6f 66 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 of..** <ul>..**
be50: 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 <li> [SQLITE_LOC
be60: 4b 5f 4e 4f 4e 45 5d 2c 0d 0a 2a 2a 20 3c 6c 69 K_NONE],..** <li
be70: 3e 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 > [SQLITE_LOCK_S
be80: 48 41 52 45 44 5d 2c 0d 0a 2a 2a 20 3c 6c 69 3e HARED],..** <li>
be90: 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 52 45 [SQLITE_LOCK_RE
bea0: 53 45 52 56 45 44 5d 2c 0d 0a 2a 2a 20 3c 6c 69 SERVED],..** <li
beb0: 3e 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 50 > [SQLITE_LOCK_P
bec0: 45 4e 44 49 4e 47 5d 2c 20 6f 72 0d 0a 2a 2a 20 ENDING], or..**
bed0: 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 <li> [SQLITE_LOC
bee0: 4b 5f 45 58 43 4c 55 53 49 56 45 5d 2e 0d 0a 2a K_EXCLUSIVE]...*
bef0: 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 20 78 4c 6f 63 * </ul>..** xLoc
bf00: 6b 28 29 20 69 6e 63 72 65 61 73 65 73 20 74 68 k() increases th
bf10: 65 20 6c 6f 63 6b 2e 20 78 55 6e 6c 6f 63 6b 28 e lock. xUnlock(
bf20: 29 20 64 65 63 72 65 61 73 65 73 20 74 68 65 20 ) decreases the
bf30: 6c 6f 63 6b 2e 0d 0a 2a 2a 20 54 68 65 20 78 43 lock...** The xC
bf40: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b heckReservedLock
bf50: 28 29 20 6d 65 74 68 6f 64 20 63 68 65 63 6b 73 () method checks
bf60: 20 77 68 65 74 68 65 72 20 61 6e 79 20 64 61 74 whether any dat
bf70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
bf80: 2c 0d 0a 2a 2a 20 65 69 74 68 65 72 20 69 6e 20 ,..** either in
bf90: 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 this process or
bfa0: 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 in some other pr
bfb0: 6f 63 65 73 73 2c 20 69 73 20 68 6f 6c 64 69 6e ocess, is holdin
bfc0: 67 20 61 20 52 45 53 45 52 56 45 44 2c 0d 0a 2a g a RESERVED,..*
bfd0: 2a 20 50 45 4e 44 49 4e 47 2c 20 6f 72 20 45 58 * PENDING, or EX
bfe0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 CLUSIVE lock on
bff0: 74 68 65 20 66 69 6c 65 2e 20 20 49 74 20 72 65 the file. It re
c000: 74 75 72 6e 73 20 74 72 75 65 0d 0a 2a 2a 20 69 turns true..** i
c010: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 65 78 f such a lock ex
c020: 69 73 74 73 20 61 6e 64 20 66 61 6c 73 65 20 6f ists and false o
c030: 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 0d 0a 2a therwise...**..*
c040: 2a 20 54 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 * The xFileContr
c050: 6f 6c 28 29 20 6d 65 74 68 6f 64 20 69 73 20 61 ol() method is a
c060: 20 67 65 6e 65 72 69 63 20 69 6e 74 65 72 66 61 generic interfa
c070: 63 65 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 63 ce that allows c
c080: 75 73 74 6f 6d 0d 0a 2a 2a 20 56 46 53 20 69 6d ustom..** VFS im
c090: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 6f plementations to
c0a0: 20 64 69 72 65 63 74 6c 79 20 63 6f 6e 74 72 6f directly contro
c0b0: 6c 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 75 l an open file u
c0c0: 73 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 sing the..** [sq
c0d0: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 lite3_file_contr
c0e0: 6f 6c 28 29 5d 20 69 6e 74 65 72 66 61 63 65 2e ol()] interface.
c0f0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 22 6f 70 The second "op
c100: 22 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e " argument is an
c110: 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6f 70 63 ..** integer opc
c120: 6f 64 65 2e 20 20 54 68 65 20 74 68 69 72 64 20 ode. The third
c130: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 67 65 argument is a ge
c140: 6e 65 72 69 63 20 70 6f 69 6e 74 65 72 20 69 6e neric pointer in
c150: 74 65 6e 64 65 64 20 74 6f 0d 0a 2a 2a 20 70 6f tended to..** po
c160: 69 6e 74 20 74 6f 20 61 20 73 74 72 75 63 74 75 int to a structu
c170: 72 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 re that may cont
c180: 61 69 6e 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 ain arguments or
c190: 20 73 70 61 63 65 20 69 6e 20 77 68 69 63 68 20 space in which
c1a0: 74 6f 0d 0a 2a 2a 20 77 72 69 74 65 20 72 65 74 to..** write ret
c1b0: 75 72 6e 20 76 61 6c 75 65 73 2e 20 20 50 6f 74 urn values. Pot
c1c0: 65 6e 74 69 61 6c 20 75 73 65 73 20 66 6f 72 20 ential uses for
c1d0: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 29 20 6d xFileControl() m
c1e0: 69 67 68 74 20 62 65 0d 0a 2a 2a 20 66 75 6e 63 ight be..** func
c1f0: 74 69 6f 6e 73 20 74 6f 20 65 6e 61 62 6c 65 20 tions to enable
c200: 62 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 73 20 77 blocking locks w
c210: 69 74 68 20 74 69 6d 65 6f 75 74 73 2c 20 74 6f ith timeouts, to
c220: 20 63 68 61 6e 67 65 20 74 68 65 0d 0a 2a 2a 20 change the..**
c230: 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 locking strategy
c240: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f (for example to
c250: 20 75 73 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f use dot-file lo
c260: 63 6b 73 29 2c 20 74 6f 20 69 6e 71 75 69 72 65 cks), to inquire
c270: 0d 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 73 ..** about the s
c280: 74 61 74 75 73 20 6f 66 20 61 20 6c 6f 63 6b 2c tatus of a lock,
c290: 20 6f 72 20 74 6f 20 62 72 65 61 6b 20 73 74 61 or to break sta
c2a0: 6c 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 53 le locks. The S
c2b0: 51 4c 69 74 65 0d 0a 2a 2a 20 63 6f 72 65 20 72 QLite..** core r
c2c0: 65 73 65 72 76 65 73 20 61 6c 6c 20 6f 70 63 6f eserves all opco
c2d0: 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 30 des less than 10
c2e0: 30 20 66 6f 72 20 69 74 73 20 6f 77 6e 20 75 73 0 for its own us
c2f0: 65 2e 0d 0a 2a 2a 20 41 20 5b 53 51 4c 49 54 45 e...** A [SQLITE
c300: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 _FCNTL_LOCKSTATE
c310: 20 7c 20 6c 69 73 74 20 6f 66 20 6f 70 63 6f 64 | list of opcod
c320: 65 73 5d 20 6c 65 73 73 20 74 68 61 6e 20 31 30 es] less than 10
c330: 30 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0 is available..
c340: 0a 2a 2a 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 .** Applications
c350: 20 74 68 61 74 20 64 65 66 69 6e 65 20 61 20 63 that define a c
c360: 75 73 74 6f 6d 20 78 46 69 6c 65 43 6f 6e 74 72 ustom xFileContr
c370: 6f 6c 20 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64 ol method should
c380: 20 75 73 65 20 6f 70 63 6f 64 65 73 0d 0a 2a 2a use opcodes..**
c390: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 30 greater than 10
c3a0: 30 20 74 6f 20 61 76 6f 69 64 20 63 6f 6e 66 6c 0 to avoid confl
c3b0: 69 63 74 73 2e 20 20 56 46 53 20 69 6d 70 6c 65 icts. VFS imple
c3c0: 6d 65 6e 74 61 74 69 6f 6e 73 20 73 68 6f 75 6c mentations shoul
c3d0: 64 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 5b 53 51 d..** return [SQ
c3e0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5d 20 66 LITE_NOTFOUND] f
c3f0: 6f 72 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 or file control
c400: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 74 68 65 opcodes that the
c410: 79 20 64 6f 20 6e 6f 74 0d 0a 2a 2a 20 72 65 63 y do not..** rec
c420: 6f 67 6e 69 7a 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ognize...**..**
c430: 54 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 The xSectorSize(
c440: 29 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 ) method returns
c450: 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 the sector size
c460: 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 64 65 76 69 of the..** devi
c470: 63 65 20 74 68 61 74 20 75 6e 64 65 72 6c 69 65 ce that underlie
c480: 73 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 s the file. The
c490: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 sector size is
c4a0: 74 68 65 0d 0a 2a 2a 20 6d 69 6e 69 6d 75 6d 20 the..** minimum
c4b0: 77 72 69 74 65 20 74 68 61 74 20 63 61 6e 20 62 write that can b
c4c0: 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 e performed with
c4d0: 6f 75 74 20 64 69 73 74 75 72 62 69 6e 67 0d 0a out disturbing..
c4e0: 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 69 ** other bytes i
c4f0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 n the file. The
c500: 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 xDeviceCharacte
c510: 72 69 73 74 69 63 73 28 29 0d 0a 2a 2a 20 6d 65 ristics()..** me
c520: 74 68 6f 64 20 72 65 74 75 72 6e 73 20 61 20 62 thod returns a b
c530: 69 74 20 76 65 63 74 6f 72 20 64 65 73 63 72 69 it vector descri
c540: 62 69 6e 67 20 62 65 68 61 76 69 6f 72 73 20 6f bing behaviors o
c550: 66 20 74 68 65 0d 0a 2a 2a 20 75 6e 64 65 72 6c f the..** underl
c560: 79 69 6e 67 20 64 65 76 69 63 65 3a 0d 0a 2a 2a ying device:..**
c570: 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c ..** <ul>..** <l
c580: 69 3e 20 5b 53 51 4c 49 54 45 5f 49 4f 43 41 50 i> [SQLITE_IOCAP
c590: 5f 41 54 4f 4d 49 43 5d 0d 0a 2a 2a 20 3c 6c 69 _ATOMIC]..** <li
c5a0: 3e 20 5b 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f > [SQLITE_IOCAP_
c5b0: 41 54 4f 4d 49 43 35 31 32 5d 0d 0a 2a 2a 20 3c ATOMIC512]..** <
c5c0: 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 49 4f 43 41 li> [SQLITE_IOCA
c5d0: 50 5f 41 54 4f 4d 49 43 31 4b 5d 0d 0a 2a 2a 20 P_ATOMIC1K]..**
c5e0: 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 49 4f 43 <li> [SQLITE_IOC
c5f0: 41 50 5f 41 54 4f 4d 49 43 32 4b 5d 0d 0a 2a 2a AP_ATOMIC2K]..**
c600: 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 49 4f <li> [SQLITE_IO
c610: 43 41 50 5f 41 54 4f 4d 49 43 34 4b 5d 0d 0a 2a CAP_ATOMIC4K]..*
c620: 2a 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 49 * <li> [SQLITE_I
c630: 4f 43 41 50 5f 41 54 4f 4d 49 43 38 4b 5d 0d 0a OCAP_ATOMIC8K]..
c640: 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f ** <li> [SQLITE_
c650: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 31 36 4b 5d IOCAP_ATOMIC16K]
c660: 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 ..** <li> [SQLIT
c670: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 33 32 E_IOCAP_ATOMIC32
c680: 4b 5d 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c K]..** <li> [SQL
c690: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
c6a0: 36 34 4b 5d 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 64K]..** <li> [S
c6b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 QLITE_IOCAP_SAFE
c6c0: 5f 41 50 50 45 4e 44 5d 0d 0a 2a 2a 20 3c 6c 69 _APPEND]..** <li
c6d0: 3e 20 5b 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f > [SQLITE_IOCAP_
c6e0: 53 45 51 55 45 4e 54 49 41 4c 5d 0d 0a 2a 2a 20 SEQUENTIAL]..**
c6f0: 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 </ul>..**..** Th
c700: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 e SQLITE_IOCAP_A
c710: 54 4f 4d 49 43 20 70 72 6f 70 65 72 74 79 20 6d TOMIC property m
c720: 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 77 72 eans that all wr
c730: 69 74 65 73 20 6f 66 0d 0a 2a 2a 20 61 6e 79 20 ites of..** any
c740: 73 69 7a 65 20 61 72 65 20 61 74 6f 6d 69 63 2e size are atomic.
c750: 20 20 54 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 The SQLITE_IOC
c760: 41 50 5f 41 54 4f 4d 49 43 6e 6e 6e 20 76 61 6c AP_ATOMICnnn val
c770: 75 65 73 0d 0a 2a 2a 20 6d 65 61 6e 20 74 68 61 ues..** mean tha
c780: 74 20 77 72 69 74 65 73 20 6f 66 20 62 6c 6f 63 t writes of bloc
c790: 6b 73 20 74 68 61 74 20 61 72 65 20 6e 6e 6e 20 ks that are nnn
c7a0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 61 6e bytes in size an
c7b0: 64 0d 0a 2a 2a 20 61 72 65 20 61 6c 69 67 6e 65 d..** are aligne
c7c0: 64 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 d to an address
c7d0: 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 74 65 which is an inte
c7e0: 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 0d ger multiple of.
c7f0: 0a 2a 2a 20 6e 6e 6e 20 61 72 65 20 61 74 6f 6d .** nnn are atom
c800: 69 63 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f ic. The SQLITE_
c810: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e IOCAP_SAFE_APPEN
c820: 44 20 76 61 6c 75 65 20 6d 65 61 6e 73 0d 0a 2a D value means..*
c830: 2a 20 74 68 61 74 20 77 68 65 6e 20 64 61 74 61 * that when data
c840: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 is appended to
c850: 61 20 66 69 6c 65 2c 20 74 68 65 20 64 61 74 61 a file, the data
c860: 20 69 73 20 61 70 70 65 6e 64 65 64 0d 0a 2a 2a is appended..**
c870: 20 66 69 72 73 74 20 74 68 65 6e 20 74 68 65 20 first then the
c880: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 size of the file
c890: 20 69 73 20 65 78 74 65 6e 64 65 64 2c 20 6e 65 is extended, ne
c8a0: 76 65 72 20 74 68 65 20 6f 74 68 65 72 0d 0a 2a ver the other..*
c8b0: 2a 20 77 61 79 20 61 72 6f 75 6e 64 2e 20 20 54 * way around. T
c8c0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f he SQLITE_IOCAP_
c8d0: 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 SEQUENTIAL prope
c8e0: 72 74 79 20 6d 65 61 6e 73 20 74 68 61 74 0d 0a rty means that..
c8f0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 ** information i
c900: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 s written to dis
c910: 6b 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 k in the same or
c920: 64 65 72 20 61 73 20 63 61 6c 6c 73 0d 0a 2a 2a der as calls..**
c930: 20 74 6f 20 78 57 72 69 74 65 28 29 2e 0d 0a 2a to xWrite()...*
c940: 2a 0d 0a 2a 2a 20 49 66 20 78 52 65 61 64 28 29 *..** If xRead()
c950: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f returns SQLITE_
c960: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 IOERR_SHORT_READ
c970: 20 69 74 20 6d 75 73 74 20 61 6c 73 6f 20 66 69 it must also fi
c980: 6c 6c 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 75 6e ll..** in the un
c990: 72 65 61 64 20 70 6f 72 74 69 6f 6e 73 20 6f 66 read portions of
c9a0: 20 74 68 65 20 62 75 66 66 65 72 20 77 69 74 68 the buffer with
c9b0: 20 7a 65 72 6f 73 2e 20 20 41 20 56 46 53 20 74 zeros. A VFS t
c9c0: 68 61 74 0d 0a 2a 2a 20 66 61 69 6c 73 20 74 6f hat..** fails to
c9d0: 20 7a 65 72 6f 2d 66 69 6c 6c 20 73 68 6f 72 74 zero-fill short
c9e0: 20 72 65 61 64 73 20 6d 69 67 68 74 20 73 65 65 reads might see
c9f0: 6d 20 74 6f 20 77 6f 72 6b 2e 20 20 48 6f 77 65 m to work. Howe
ca00: 76 65 72 2c 0d 0a 2a 2a 20 66 61 69 6c 75 72 65 ver,..** failure
ca10: 20 74 6f 20 7a 65 72 6f 2d 66 69 6c 6c 20 73 68 to zero-fill sh
ca20: 6f 72 74 20 72 65 61 64 73 20 77 69 6c 6c 20 65 ort reads will e
ca30: 76 65 6e 74 75 61 6c 6c 79 20 6c 65 61 64 20 74 ventually lead t
ca40: 6f 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 o..** database c
ca50: 6f 72 72 75 70 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a orruption...*/..
ca60: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 typedef struct s
ca70: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 qlite3_io_method
ca80: 73 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 s sqlite3_io_met
ca90: 68 6f 64 73 3b 0d 0a 73 74 72 75 63 74 20 73 71 hods;..struct sq
caa0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
cab0: 20 7b 0d 0a 20 20 69 6e 74 20 69 56 65 72 73 69 {.. int iVersi
cac0: 6f 6e 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6c on;.. int (*xCl
cad0: 6f 73 65 29 28 73 71 6c 69 74 65 33 5f 66 69 6c ose)(sqlite3_fil
cae0: 65 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 52 e*);.. int (*xR
caf0: 65 61 64 29 28 73 71 6c 69 74 65 33 5f 66 69 6c ead)(sqlite3_fil
cb00: 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 e*, void*, int i
cb10: 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 Amt, sqlite3_int
cb20: 36 34 20 69 4f 66 73 74 29 3b 0d 0a 20 20 69 6e 64 iOfst);.. in
cb30: 74 20 28 2a 78 57 72 69 74 65 29 28 73 71 6c 69 t (*xWrite)(sqli
cb40: 74 65 33 5f 66 69 6c 65 2a 2c 20 63 6f 6e 73 74 te3_file*, const
cb50: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 void*, int iAmt
cb60: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 , sqlite3_int64
cb70: 69 4f 66 73 74 29 3b 0d 0a 20 20 69 6e 74 20 28 iOfst);.. int (
cb80: 2a 78 54 72 75 6e 63 61 74 65 29 28 73 71 6c 69 *xTruncate)(sqli
cb90: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 te3_file*, sqlit
cba0: 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b 0d e3_int64 size);.
cbb0: 0a 20 20 69 6e 74 20 28 2a 78 53 79 6e 63 29 28 . int (*xSync)(
cbc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 sqlite3_file*, i
cbd0: 6e 74 20 66 6c 61 67 73 29 3b 0d 0a 20 20 69 6e nt flags);.. in
cbe0: 74 20 28 2a 78 46 69 6c 65 53 69 7a 65 29 28 73 t (*xFileSize)(s
cbf0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 qlite3_file*, sq
cc00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 lite3_int64 *pSi
cc10: 7a 65 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 4c ze);.. int (*xL
cc20: 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c ock)(sqlite3_fil
cc30: 65 2a 2c 20 69 6e 74 29 3b 0d 0a 20 20 69 6e 74 e*, int);.. int
cc40: 20 28 2a 78 55 6e 6c 6f 63 6b 29 28 73 71 6c 69 (*xUnlock)(sqli
cc50: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b te3_file*, int);
cc60: 0d 0a 20 20 69 6e 74 20 28 2a 78 43 68 65 63 6b .. int (*xCheck
cc70: 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 28 73 71 ReservedLock)(sq
cc80: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 lite3_file*, int
cc90: 20 2a 70 52 65 73 4f 75 74 29 3b 0d 0a 20 20 69 *pResOut);.. i
cca0: 6e 74 20 28 2a 78 46 69 6c 65 43 6f 6e 74 72 6f nt (*xFileContro
ccb0: 6c 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a l)(sqlite3_file*
ccc0: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a , int op, void *
ccd0: 70 41 72 67 29 3b 0d 0a 20 20 69 6e 74 20 28 2a pArg);.. int (*
cce0: 78 53 65 63 74 6f 72 53 69 7a 65 29 28 73 71 6c xSectorSize)(sql
ccf0: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0d 0a 20 20 ite3_file*);..
cd00: 69 6e 74 20 28 2a 78 44 65 76 69 63 65 43 68 61 int (*xDeviceCha
cd10: 72 61 63 74 65 72 69 73 74 69 63 73 29 28 73 71 racteristics)(sq
cd20: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0d 0a 20 lite3_file*);..
cd30: 20 2f 2a 20 4d 65 74 68 6f 64 73 20 61 62 6f 76 /* Methods abov
cd40: 65 20 61 72 65 20 76 61 6c 69 64 20 66 6f 72 20 e are valid for
cd50: 76 65 72 73 69 6f 6e 20 31 20 2a 2f 0d 0a 20 20 version 1 */..
cd60: 69 6e 74 20 28 2a 78 53 68 6d 4d 61 70 29 28 73 int (*xShmMap)(s
cd70: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e qlite3_file*, in
cd80: 74 20 69 50 67 2c 20 69 6e 74 20 70 67 73 7a 2c t iPg, int pgsz,
cd90: 20 69 6e 74 2c 20 76 6f 69 64 20 76 6f 6c 61 74 int, void volat
cda0: 69 6c 65 2a 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 ile**);.. int (
cdb0: 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 *xShmLock)(sqlit
cdc0: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f 66 e3_file*, int of
cdd0: 66 73 65 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 fset, int n, int
cde0: 20 66 6c 61 67 73 29 3b 0d 0a 20 20 76 6f 69 64 flags);.. void
cdf0: 20 28 2a 78 53 68 6d 42 61 72 72 69 65 72 29 28 (*xShmBarrier)(
ce00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0d sqlite3_file*);.
ce10: 0a 20 20 69 6e 74 20 28 2a 78 53 68 6d 55 6e 6d . int (*xShmUnm
ce20: 61 70 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ap)(sqlite3_file
ce30: 2a 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 *, int deleteFla
ce40: 67 29 3b 0d 0a 20 20 2f 2a 20 4d 65 74 68 6f 64 g);.. /* Method
ce50: 73 20 61 62 6f 76 65 20 61 72 65 20 76 61 6c 69 s above are vali
ce60: 64 20 66 6f 72 20 76 65 72 73 69 6f 6e 20 32 20 d for version 2
ce70: 2a 2f 0d 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f */.. /* Additio
ce80: 6e 61 6c 20 6d 65 74 68 6f 64 73 20 6d 61 79 20 nal methods may
ce90: 62 65 20 61 64 64 65 64 20 69 6e 20 66 75 74 75 be added in futu
cea0: 72 65 20 72 65 6c 65 61 73 65 73 20 2a 2f 0d 0a re releases */..
ceb0: 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 };..../*..** CAP
cec0: 49 33 52 45 46 3a 20 53 74 61 6e 64 61 72 64 20 I3REF: Standard
ced0: 46 69 6c 65 20 43 6f 6e 74 72 6f 6c 20 4f 70 63 File Control Opc
cee0: 6f 64 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 odes..**..** The
cef0: 73 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 se integer const
cf00: 61 6e 74 73 20 61 72 65 20 6f 70 63 6f 64 65 73 ants are opcodes
cf10: 20 66 6f 72 20 74 68 65 20 78 46 69 6c 65 43 6f for the xFileCo
cf20: 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 0d 0a 2a 2a ntrol method..**
cf30: 20 6f 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 of the [sqlite3
cf40: 5f 69 6f 5f 6d 65 74 68 6f 64 73 5d 20 6f 62 6a _io_methods] obj
cf50: 65 63 74 20 61 6e 64 20 66 6f 72 20 74 68 65 20 ect and for the
cf60: 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f [sqlite3_file_co
cf70: 6e 74 72 6f 6c 28 29 5d 0d 0a 2a 2a 20 69 6e 74 ntrol()]..** int
cf80: 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 erface...**..**
cf90: 54 68 65 20 5b 53 51 4c 49 54 45 5f 46 43 4e 54 The [SQLITE_FCNT
cfa0: 4c 5f 4c 4f 43 4b 53 54 41 54 45 5d 20 6f 70 63 L_LOCKSTATE] opc
cfb0: 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 ode is used for
cfc0: 64 65 62 75 67 67 69 6e 67 2e 20 20 54 68 69 73 debugging. This
cfd0: 0d 0a 2a 2a 20 6f 70 63 6f 64 65 20 63 61 75 73 ..** opcode caus
cfe0: 65 73 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 es the xFileCont
cff0: 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 77 72 rol method to wr
d000: 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 ite the current
d010: 73 74 61 74 65 20 6f 66 0d 0a 2a 2a 20 74 68 65 state of..** the
d020: 20 6c 6f 63 6b 20 28 6f 6e 65 20 6f 66 20 5b 53 lock (one of [S
d030: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 5d QLITE_LOCK_NONE]
d040: 2c 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 , [SQLITE_LOCK_S
d050: 48 41 52 45 44 5d 2c 0d 0a 2a 2a 20 5b 53 51 4c HARED],..** [SQL
d060: 49 54 45 5f 4c 4f 43 4b 5f 52 45 53 45 52 56 45 ITE_LOCK_RESERVE
d070: 44 5d 2c 20 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b D], [SQLITE_LOCK
d080: 5f 50 45 4e 44 49 4e 47 5d 2c 20 6f 72 20 5b 53 _PENDING], or [S
d090: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 QLITE_LOCK_EXCLU
d0a0: 53 49 56 45 5d 29 0d 0a 2a 2a 20 69 6e 74 6f 20 SIVE])..** into
d0b0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 an integer that
d0c0: 74 68 65 20 70 41 72 67 20 61 72 67 75 6d 65 6e the pArg argumen
d0d0: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 54 68 69 t points to. Thi
d0e0: 73 20 63 61 70 61 62 69 6c 69 74 79 0d 0a 2a 2a s capability..**
d0f0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 is used during
d100: 74 65 73 74 69 6e 67 20 61 6e 64 20 6f 6e 6c 79 testing and only
d110: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 75 70 needs to be sup
d120: 70 6f 72 74 65 64 20 77 68 65 6e 20 53 51 4c 49 ported when SQLI
d130: 54 45 5f 54 45 53 54 0d 0a 2a 2a 20 69 73 20 64 TE_TEST..** is d
d140: 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 efined...**..**
d150: 54 68 65 20 5b 53 51 4c 49 54 45 5f 46 43 4e 54 The [SQLITE_FCNT
d160: 4c 5f 53 49 5a 45 5f 48 49 4e 54 5d 20 6f 70 63 L_SIZE_HINT] opc
d170: 6f 64 65 20 69 73 20 75 73 65 64 20 62 79 20 53 ode is used by S
d180: 51 4c 69 74 65 20 74 6f 20 67 69 76 65 20 74 68 QLite to give th
d190: 65 20 56 46 53 0d 0a 2a 2a 20 6c 61 79 65 72 20 e VFS..** layer
d1a0: 61 20 68 69 6e 74 20 6f 66 20 68 6f 77 20 6c 61 a hint of how la
d1b0: 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 rge the database
d1c0: 20 66 69 6c 65 20 77 69 6c 6c 20 67 72 6f 77 20 file will grow
d1d0: 74 6f 20 62 65 20 64 75 72 69 6e 67 20 74 68 65 to be during the
d1e0: 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 ..** current tra
d1f0: 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 nsaction. This
d200: 68 69 6e 74 20 69 73 20 6e 6f 74 20 67 75 61 72 hint is not guar
d210: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 63 63 anteed to be acc
d220: 75 72 61 74 65 20 62 75 74 20 69 74 0d 0a 2a 2a urate but it..**
d230: 20 69 73 20 6f 66 74 65 6e 20 63 6c 6f 73 65 2e is often close.
d240: 20 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 The underlying
d250: 20 56 46 53 20 6d 69 67 68 74 20 63 68 6f 6f 73 VFS might choos
d260: 65 20 74 6f 20 70 72 65 61 6c 6c 6f 63 61 74 65 e to preallocate
d270: 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 66 69 database..** fi
d280: 6c 65 20 73 70 61 63 65 20 62 61 73 65 64 20 6f le space based o
d290: 6e 20 74 68 69 73 20 68 69 6e 74 20 69 6e 20 6f n this hint in o
d2a0: 72 64 65 72 20 74 6f 20 68 65 6c 70 20 77 72 69 rder to help wri
d2b0: 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 tes to the datab
d2c0: 61 73 65 0d 0a 2a 2a 20 66 69 6c 65 20 72 75 6e ase..** file run
d2d0: 20 66 61 73 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a faster...**..**
d2e0: 20 54 68 65 20 5b 53 51 4c 49 54 45 5f 46 43 4e The [SQLITE_FCN
d2f0: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 5d 20 6f TL_CHUNK_SIZE] o
d300: 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f pcode is used to
d310: 20 72 65 71 75 65 73 74 20 74 68 61 74 20 74 68 request that th
d320: 65 20 56 46 53 0d 0a 2a 2a 20 65 78 74 65 6e 64 e VFS..** extend
d330: 73 20 61 6e 64 20 74 72 75 6e 63 61 74 65 73 20 s and truncates
d340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
d350: 65 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20 61 e in chunks of a
d360: 20 73 69 7a 65 20 73 70 65 63 69 66 69 65 64 0d size specified.
d370: 0a 2a 2a 20 62 79 20 74 68 65 20 75 73 65 72 2e .** by the user.
d380: 20 54 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 The fourth argu
d390: 6d 65 6e 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 ment to [sqlite3
d3a0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 5d _file_control()]
d3b0: 20 73 68 6f 75 6c 64 20 0d 0a 2a 2a 20 70 6f 69 should ..** poi
d3c0: 6e 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 nt to an integer
d3d0: 20 28 74 79 70 65 20 69 6e 74 29 20 63 6f 6e 74 (type int) cont
d3e0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20 63 aining the new c
d3f0: 68 75 6e 6b 2d 73 69 7a 65 20 74 6f 20 75 73 65 hunk-size to use
d400: 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6e 6f 6d ..** for the nom
d410: 69 6e 61 74 65 64 20 64 61 74 61 62 61 73 65 2e inated database.
d420: 20 41 6c 6c 6f 63 61 74 69 6e 67 20 64 61 74 61 Allocating data
d430: 62 61 73 65 20 66 69 6c 65 20 73 70 61 63 65 20 base file space
d440: 69 6e 20 6c 61 72 67 65 0d 0a 2a 2a 20 63 68 75 in large..** chu
d450: 6e 6b 73 20 28 73 61 79 20 31 4d 42 20 61 74 20 nks (say 1MB at
d460: 61 20 74 69 6d 65 29 2c 20 6d 61 79 20 72 65 64 a time), may red
d470: 75 63 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 uce file-system
d480: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 61 6e fragmentation an
d490: 64 0d 0a 2a 2a 20 69 6d 70 72 6f 76 65 20 70 65 d..** improve pe
d4a0: 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 73 6f 6d rformance on som
d4b0: 65 20 73 79 73 74 65 6d 73 2e 0d 0a 2a 2a 0d 0a e systems...**..
d4c0: 2a 2a 20 54 68 65 20 5b 53 51 4c 49 54 45 5f 46 ** The [SQLITE_F
d4d0: 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 CNTL_FILE_POINTE
d4e0: 52 5d 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 R] opcode is use
d4f0: 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f d to obtain a po
d500: 69 6e 74 65 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 inter..** to the
d510: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 5d 20 [sqlite3_file]
d520: 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 object associate
d530: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75 d with a particu
d540: 6c 61 72 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a lar database..**
d550: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 53 65 connection. Se
d560: 65 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 66 e the [sqlite3_f
d570: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 5d 20 64 ile_control()] d
d580: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
d590: 0d 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 ..** additional
d5a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2a information...**
d5b0: 0d 0a 2a 2a 20 5e 28 54 68 65 20 5b 53 51 4c 49 ..** ^(The [SQLI
d5c0: 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d TE_FCNTL_SYNC_OM
d5d0: 49 54 54 45 44 5d 20 6f 70 63 6f 64 65 20 69 73 ITTED] opcode is
d5e0: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65 72 generated inter
d5f0: 6e 61 6c 6c 79 20 62 79 0d 0a 2a 2a 20 53 51 4c nally by..** SQL
d600: 69 74 65 20 61 6e 64 20 73 65 6e 74 20 74 6f 20 ite and sent to
d610: 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 70 6c 61 all VFSes in pla
d620: 63 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f 20 ce of a call to
d630: 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 the xSync method
d640: 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 ..** when the da
d650: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
d660: 6e 20 68 61 73 20 5b 50 52 41 47 4d 41 20 73 79 n has [PRAGMA sy
d670: 6e 63 68 72 6f 6e 6f 75 73 5d 20 73 65 74 20 74 nchronous] set t
d680: 6f 20 4f 46 46 2e 29 5e 0d 0a 2a 2a 20 53 6f 6d o OFF.)^..** Som
d690: 65 20 73 70 65 63 69 61 6c 69 7a 65 64 20 56 46 e specialized VF
d6a0: 53 65 73 20 6e 65 65 64 20 74 68 69 73 20 73 69 Ses need this si
d6b0: 67 6e 61 6c 20 69 6e 20 6f 72 64 65 72 20 74 6f gnal in order to
d6c0: 20 6f 70 65 72 61 74 65 20 63 6f 72 72 65 63 74 operate correct
d6d0: 6c 79 0d 0a 2a 2a 20 77 68 65 6e 20 5b 50 52 41 ly..** when [PRA
d6e0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 GMA synchronous
d6f0: 7c 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f | PRAGMA synchro
d700: 6e 6f 75 73 3d 4f 46 46 5d 20 69 73 20 73 65 74 nous=OFF] is set
d710: 2c 20 62 75 74 20 6d 6f 73 74 20 0d 0a 2a 2a 20 , but most ..**
d720: 56 46 53 65 73 20 64 6f 20 6e 6f 74 20 6e 65 65 VFSes do not nee
d730: 64 20 74 68 69 73 20 73 69 67 6e 61 6c 20 61 6e d this signal an
d740: 64 20 73 68 6f 75 6c 64 20 73 69 6c 65 6e 74 6c d should silentl
d750: 79 20 69 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 y ignore this op
d760: 63 6f 64 65 2e 0d 0a 2a 2a 20 41 70 70 6c 69 63 code...** Applic
d770: 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f ations should no
d780: 74 20 63 61 6c 6c 20 5b 73 71 6c 69 74 65 33 5f t call [sqlite3_
d790: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 5d 20 file_control()]
d7a0: 77 69 74 68 20 74 68 69 73 0d 0a 2a 2a 20 6f 70 with this..** op
d7b0: 63 6f 64 65 20 61 73 20 64 6f 69 6e 67 20 73 6f code as doing so
d7c0: 20 6d 61 79 20 64 69 73 72 75 70 74 20 74 68 65 may disrupt the
d7d0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 operation of th
d7e0: 65 20 73 70 65 63 69 61 6c 69 7a 65 64 20 56 46 e specialized VF
d7f0: 53 65 73 0d 0a 2a 2a 20 74 68 61 74 20 64 6f 20 Ses..** that do
d800: 72 65 71 75 69 72 65 20 69 74 2e 20 20 0d 0a 2a require it. ..*
d810: 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b 53 51 4c 49 *..** ^The [SQLI
d820: 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 TE_FCNTL_WIN32_A
d830: 56 5f 52 45 54 52 59 5d 20 6f 70 63 6f 64 65 20 V_RETRY] opcode
d840: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 66 69 is used to confi
d850: 67 75 72 65 20 61 75 74 6f 6d 61 74 69 63 0d 0a gure automatic..
d860: 2a 2a 20 72 65 74 72 79 20 63 6f 75 6e 74 73 20 ** retry counts
d870: 61 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 66 6f and intervals fo
d880: 72 20 63 65 72 74 61 69 6e 20 64 69 73 6b 20 49 r certain disk I
d890: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f /O operations fo
d8a0: 72 20 74 68 65 0d 0a 2a 2a 20 77 69 6e 64 6f 77 r the..** window
d8b0: 73 20 5b 56 46 53 5d 20 69 6e 20 6f 72 64 65 72 s [VFS] in order
d8c0: 20 74 6f 20 70 72 6f 76 69 64 65 20 72 6f 62 75 to provide robu
d8d0: 73 74 6e 65 73 73 20 69 6e 20 74 68 65 20 70 72 stness in the pr
d8e0: 65 73 65 6e 63 65 20 6f 66 0d 0a 2a 2a 20 61 6e esence of..** an
d8f0: 74 69 2d 76 69 72 75 73 20 70 72 6f 67 72 61 6d ti-virus program
d900: 73 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 s. By default,
d910: 74 68 65 20 77 69 6e 64 6f 77 73 20 56 46 53 20 the windows VFS
d920: 77 69 6c 6c 20 72 65 74 72 79 20 66 69 6c 65 20 will retry file
d930: 72 65 61 64 2c 0d 0a 2a 2a 20 66 69 6c 65 20 77 read,..** file w
d940: 72 69 74 65 2c 20 61 6e 64 20 66 69 6c 65 20 64 rite, and file d
d950: 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 elete operations
d960: 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73 2c up to 10 times,
d970: 20 77 69 74 68 20 61 20 64 65 6c 61 79 0d 0a 2a with a delay..*
d980: 2a 20 6f 66 20 32 35 20 6d 69 6c 6c 69 73 65 63 * of 25 millisec
d990: 6f 6e 64 73 20 62 65 66 6f 72 65 20 74 68 65 20 onds before the
d9a0: 66 69 72 73 74 20 72 65 74 72 79 20 61 6e 64 20 first retry and
d9b0: 77 69 74 68 20 74 68 65 20 64 65 6c 61 79 20 69 with the delay i
d9c0: 6e 63 72 65 61 73 69 6e 67 0d 0a 2a 2a 20 62 79 ncreasing..** by
d9d0: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 32 an additional 2
d9e0: 35 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 77 5 milliseconds w
d9f0: 69 74 68 20 65 61 63 68 20 73 75 62 73 65 71 75 ith each subsequ
da00: 65 6e 74 20 72 65 74 72 79 2e 20 20 54 68 69 73 ent retry. This
da10: 0d 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f ..** opcode allo
da20: 77 73 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c ws these two val
da30: 75 65 73 20 28 31 30 20 72 65 74 72 69 65 73 20 ues (10 retries
da40: 61 6e 64 20 32 35 20 6d 69 6c 6c 69 73 65 63 6f and 25 milliseco
da50: 6e 64 73 20 6f 66 20 64 65 6c 61 79 29 0d 0a 2a nds of delay)..*
da60: 2a 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 * to be adjusted
da70: 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 61 72 . The values ar
da80: 65 20 63 68 61 6e 67 65 64 20 66 6f 72 20 61 6c e changed for al
da90: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 l database conne
daa0: 63 74 69 6f 6e 73 0d 0a 2a 2a 20 77 69 74 68 69 ctions..** withi
dab0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 n the same proce
dac0: 73 73 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e ss. The argumen
dad0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 t is a pointer t
dae0: 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 77 o an array of tw
daf0: 6f 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 73 20 77 o..** integers w
db00: 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 69 here the first i
db10: 6e 74 65 67 65 72 20 69 20 74 68 65 20 6e 65 77 nteger i the new
db20: 20 72 65 74 72 79 20 63 6f 75 6e 74 20 61 6e 64 retry count and
db30: 20 74 68 65 20 73 65 63 6f 6e 64 0d 0a 2a 2a 20 the second..**
db40: 69 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 64 integer is the d
db50: 65 6c 61 79 2e 20 20 49 66 20 65 69 74 68 65 72 elay. If either
db60: 20 69 6e 74 65 67 65 72 20 69 73 20 6e 65 67 61 integer is nega
db70: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 73 tive, then the s
db80: 65 74 74 69 6e 67 0d 0a 2a 2a 20 69 73 20 6e 6f etting..** is no
db90: 74 20 63 68 61 6e 67 65 64 20 62 75 74 20 69 6e t changed but in
dba0: 73 74 65 61 64 20 74 68 65 20 70 72 69 6f 72 20 stead the prior
dbb0: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65 value of that se
dbc0: 74 74 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e tting is written
dbd0: 0d 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 72 ..** into the ar
dbe0: 72 61 79 20 65 6e 74 72 79 2c 20 61 6c 6c 6f 77 ray entry, allow
dbf0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 ing the current
dc00: 72 65 74 72 79 20 73 65 74 74 69 6e 67 73 20 74 retry settings t
dc10: 6f 20 62 65 0d 0a 2a 2a 20 69 6e 74 65 72 72 6f o be..** interro
dc20: 67 61 74 65 64 2e 20 20 54 68 65 20 7a 44 62 4e gated. The zDbN
dc30: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 ame parameter is
dc40: 20 69 67 6e 6f 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a ignored...**..*
dc50: 2a 20 5e 54 68 65 20 5b 53 51 4c 49 54 45 5f 46 * ^The [SQLITE_F
dc60: 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c CNTL_PERSIST_WAL
dc70: 5d 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 ] opcode is used
dc80: 20 74 6f 20 73 65 74 20 6f 72 20 71 75 65 72 79 to set or query
dc90: 20 74 68 65 0d 0a 2a 2a 20 70 65 72 73 69 73 74 the..** persist
dca0: 65 6e 74 20 5b 57 41 4c 20 7c 20 57 72 69 74 65 ent [WAL | Write
dcb0: 20 41 48 65 61 64 20 4c 6f 67 5d 20 73 65 74 74 AHead Log] sett
dcc0: 69 6e 67 2e 20 20 42 79 20 64 65 66 61 75 6c 74 ing. By default
dcd0: 2c 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0d , the auxiliary.
dce0: 0a 2a 2a 20 77 72 69 74 65 20 61 68 65 61 64 20 .** write ahead
dcf0: 6c 6f 67 20 61 6e 64 20 73 68 61 72 65 64 20 6d log and shared m
dd00: 65 6d 6f 72 79 20 66 69 6c 65 73 20 75 73 65 64 emory files used
dd10: 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e for transaction
dd20: 20 63 6f 6e 74 72 6f 6c 0d 0a 2a 2a 20 61 72 65 control..** are
dd30: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 automatically d
dd40: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 eleted when the
dd50: 6c 61 74 65 73 74 20 63 6f 6e 6e 65 63 74 69 6f latest connectio
dd60: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 n to the databas
dd70: 65 0d 0a 2a 2a 20 63 6c 6f 73 65 73 2e 20 20 53 e..** closes. S
dd80: 65 74 74 69 6e 67 20 70 65 72 73 69 73 74 65 6e etting persisten
dd90: 74 20 57 41 4c 20 6d 6f 64 65 20 63 61 75 73 65 t WAL mode cause
dda0: 73 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f s those files to
ddb0: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 0d 0a persist after..
ddc0: 2a 2a 20 63 6c 6f 73 65 2e 20 20 50 65 72 73 69 ** close. Persi
ddd0: 73 74 69 6e 67 20 74 68 65 20 66 69 6c 65 73 20 sting the files
dde0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 6f is useful when o
ddf0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 ther processes t
de00: 68 61 74 20 64 6f 20 6e 6f 74 0d 0a 2a 2a 20 68 hat do not..** h
de10: 61 76 65 20 77 72 69 74 65 20 70 65 72 6d 69 73 ave write permis
de20: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 64 69 72 65 sion on the dire
de30: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 ctory containing
de40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
de50: 6c 65 20 77 61 6e 74 0d 0a 2a 2a 20 74 6f 20 72 le want..** to r
de60: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 ead the database
de70: 20 66 69 6c 65 2c 20 61 73 20 74 68 65 20 57 41 file, as the WA
de80: 4c 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d L and shared mem
de90: 6f 72 79 20 66 69 6c 65 73 20 6d 75 73 74 20 65 ory files must e
dea0: 78 69 73 74 0d 0a 2a 2a 20 69 6e 20 6f 72 64 65 xist..** in orde
deb0: 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 r for the databa
dec0: 73 65 20 74 6f 20 62 65 20 72 65 61 64 61 62 6c se to be readabl
ded0: 65 2e 20 20 54 68 65 20 66 6f 75 72 74 68 20 70 e. The fourth p
dee0: 61 72 61 6d 65 74 65 72 20 74 6f 0d 0a 2a 2a 20 arameter to..**
def0: 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f [sqlite3_file_co
df00: 6e 74 72 6f 6c 28 29 5d 20 66 6f 72 20 74 68 69 ntrol()] for thi
df10: 73 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 s opcode should
df20: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 be a pointer to
df30: 61 6e 20 69 6e 74 65 67 65 72 2e 0d 0a 2a 2a 20 an integer...**
df40: 54 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 That integer is
df50: 30 20 74 6f 20 64 69 73 61 62 6c 65 20 70 65 72 0 to disable per
df60: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 sistent WAL mode
df70: 20 6f 72 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 or 1 to enable
df80: 70 65 72 73 69 73 74 65 6e 74 0d 0a 2a 2a 20 57 persistent..** W
df90: 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 AL mode. If the
dfa0: 20 69 6e 74 65 67 65 72 20 69 73 20 2d 31 2c 20 integer is -1,
dfb0: 74 68 65 6e 20 69 74 20 69 73 20 6f 76 65 72 77 then it is overw
dfc0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 ritten with the
dfd0: 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 57 41 4c 20 current..** WAL
dfe0: 70 65 72 73 69 73 74 65 6e 63 65 20 73 65 74 74 persistence sett
dff0: 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ing...**..** ^Th
e000: 65 20 5b 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f e [SQLITE_FCNTL_
e010: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 POWERSAFE_OVERWR
e020: 49 54 45 5d 20 6f 70 63 6f 64 65 20 69 73 20 75 ITE] opcode is u
e030: 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20 71 75 sed to set or qu
e040: 65 72 79 20 74 68 65 0d 0a 2a 2a 20 70 65 72 73 ery the..** pers
e050: 69 73 74 65 6e 74 20 22 70 6f 77 65 72 73 61 66 istent "powersaf
e060: 65 2d 6f 76 65 72 77 72 69 74 65 22 20 6f 72 20 e-overwrite" or
e070: 22 50 53 4f 57 22 20 73 65 74 74 69 6e 67 2e 20 "PSOW" setting.
e080: 20 54 68 65 20 50 53 4f 57 20 73 65 74 74 69 6e The PSOW settin
e090: 67 0d 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 g..** determines
e0a0: 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 49 4f 43 the [SQLITE_IOC
e0b0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 AP_POWERSAFE_OVE
e0c0: 52 57 52 49 54 45 5d 20 62 69 74 20 6f 66 20 74 RWRITE] bit of t
e0d0: 68 65 0d 0a 2a 2a 20 78 44 65 76 69 63 65 43 68 he..** xDeviceCh
e0e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6d 65 aracteristics me
e0f0: 74 68 6f 64 73 2e 20 54 68 65 20 66 6f 75 72 74 thods. The fourt
e100: 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0d 0a h parameter to..
e110: 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 ** [sqlite3_file
e120: 5f 63 6f 6e 74 72 6f 6c 28 29 5d 20 66 6f 72 20 _control()] for
e130: 74 68 69 73 20 6f 70 63 6f 64 65 20 73 68 6f 75 this opcode shou
e140: 6c 64 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 ld be a pointer
e150: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0d 0a to an integer...
e160: 2a 2a 20 54 68 61 74 20 69 6e 74 65 67 65 72 20 ** That integer
e170: 69 73 20 30 20 74 6f 20 64 69 73 61 62 6c 65 20 is 0 to disable
e180: 7a 65 72 6f 2d 64 61 6d 61 67 65 20 6d 6f 64 65 zero-damage mode
e190: 20 6f 72 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 or 1 to enable
e1a0: 7a 65 72 6f 2d 64 61 6d 61 67 65 0d 0a 2a 2a 20 zero-damage..**
e1b0: 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 69 6e mode. If the in
e1c0: 74 65 67 65 72 20 69 73 20 2d 31 2c 20 74 68 65 teger is -1, the
e1d0: 6e 20 69 74 20 69 73 20 6f 76 65 72 77 72 69 74 n it is overwrit
e1e0: 74 65 6e 20 77 69 74 68 20 74 68 65 20 63 75 72 ten with the cur
e1f0: 72 65 6e 74 0d 0a 2a 2a 20 7a 65 72 6f 2d 64 61 rent..** zero-da
e200: 6d 61 67 65 20 6d 6f 64 65 20 73 65 74 74 69 6e mage mode settin
e210: 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 g...**..** ^The
e220: 5b 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4f 56 [SQLITE_FCNTL_OV
e230: 45 52 57 52 49 54 45 5d 20 6f 70 63 6f 64 65 20 ERWRITE] opcode
e240: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 53 51 is invoked by SQ
e250: 4c 69 74 65 20 61 66 74 65 72 20 6f 70 65 6e 69 Lite after openi
e260: 6e 67 0d 0a 2a 2a 20 61 20 77 72 69 74 65 20 74 ng..** a write t
e270: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 69 6e ransaction to in
e280: 64 69 63 61 74 65 20 74 68 61 74 2c 20 75 6e 6c dicate that, unl
e290: 65 73 73 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 ess it is rolled
e2a0: 20 62 61 63 6b 20 66 6f 72 20 73 6f 6d 65 0d 0a back for some..
e2b0: 2a 2a 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 65 ** reason, the e
e2c0: 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 66 ntire database f
e2d0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 ile will be over
e2e0: 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 63 written by the c
e2f0: 75 72 72 65 6e 74 20 0d 0a 2a 2a 20 74 72 61 6e urrent ..** tran
e300: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 69 73 saction. This is
e310: 20 75 73 65 64 20 62 79 20 56 41 43 55 55 4d 20 used by VACUUM
e320: 6f 70 65 72 61 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d operations...**.
e330: 0a 2a 2a 20 5e 54 68 65 20 5b 53 51 4c 49 54 45 .** ^The [SQLITE
e340: 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 5d 20 _FCNTL_VFSNAME]
e350: 6f 70 63 6f 64 65 20 63 61 6e 20 62 65 20 75 73 opcode can be us
e360: 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 ed to obtain the
e370: 20 6e 61 6d 65 73 20 6f 66 0d 0a 2a 2a 20 61 6c names of..** al
e380: 6c 20 5b 56 46 53 65 73 5d 20 69 6e 20 74 68 65 l [VFSes] in the
e390: 20 56 46 53 20 73 74 61 63 6b 2e 20 20 54 68 65 VFS stack. The
e3a0: 20 6e 61 6d 65 73 20 61 72 65 20 6f 66 20 61 6c names are of al
e3b0: 6c 20 56 46 53 20 73 68 69 6d 73 20 61 6e 64 20 l VFS shims and
e3c0: 74 68 65 0d 0a 2a 2a 20 66 69 6e 61 6c 20 62 6f the..** final bo
e3d0: 74 74 6f 6d 2d 6c 65 76 65 6c 20 56 46 53 20 61 ttom-level VFS a
e3e0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 re written into
e3f0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 memory obtained
e400: 66 72 6f 6d 20 0d 0a 2a 2a 20 5b 73 71 6c 69 74 from ..** [sqlit
e410: 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 20 61 6e 64 e3_malloc()] and
e420: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 the result is s
e430: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 68 61 tored in the cha
e440: 72 2a 20 76 61 72 69 61 62 6c 65 0d 0a 2a 2a 20 r* variable..**
e450: 74 68 61 74 20 74 68 65 20 66 6f 75 72 74 68 20 that the fourth
e460: 70 61 72 61 6d 65 74 65 72 20 6f 66 20 5b 73 71 parameter of [sq
e470: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 lite3_file_contr
e480: 6f 6c 28 29 5d 20 70 6f 69 6e 74 73 20 74 6f 2e ol()] points to.
e490: 0d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 ..** The caller
e4a0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 is responsible f
e4b0: 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d or freeing the m
e4c0: 65 6d 6f 72 79 20 77 68 65 6e 20 64 6f 6e 65 2e emory when done.
e4d0: 20 20 41 73 20 77 69 74 68 0d 0a 2a 2a 20 61 6c As with..** al
e4e0: 6c 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 61 l file-control a
e4f0: 63 74 69 6f 6e 73 2c 20 74 68 65 72 65 20 69 73 ctions, there is
e500: 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 no guarantee th
e510: 61 74 20 74 68 69 73 20 77 69 6c 6c 20 61 63 74 at this will act
e520: 75 61 6c 6c 79 0d 0a 2a 2a 20 64 6f 20 61 6e 79 ually..** do any
e530: 74 68 69 6e 67 2e 20 20 43 61 6c 6c 65 72 73 20 thing. Callers
e540: 73 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a should initializ
e550: 65 20 74 68 65 20 63 68 61 72 2a 20 76 61 72 69 e the char* vari
e560: 61 62 6c 65 20 74 6f 20 61 20 4e 55 4c 4c 0d 0a able to a NULL..
e570: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 63 61 ** pointer in ca
e580: 73 65 20 74 68 69 73 20 66 69 6c 65 2d 63 6f 6e se this file-con
e590: 74 72 6f 6c 20 69 73 20 6e 6f 74 20 69 6d 70 6c trol is not impl
e5a0: 65 6d 65 6e 74 65 64 2e 20 20 54 68 69 73 20 66 emented. This f
e5b0: 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0d 0a 2a 2a 20 ile-control..**
e5c0: 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 is intended for
e5d0: 64 69 61 67 6e 6f 73 74 69 63 20 75 73 65 20 6f diagnostic use o
e5e0: 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e nly...*/..#defin
e5f0: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c e SQLITE_FCNTL_L
e600: 4f 43 4b 53 54 41 54 45 20 20 20 20 20 20 20 20 OCKSTATE
e610: 20 20 20 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 1..#defin
e620: 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 e SQLITE_GET_LOC
e630: 4b 50 52 4f 58 59 46 49 4c 45 20 20 20 20 20 20 KPROXYFILE
e640: 20 20 20 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 2..#defin
e650: 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 e SQLITE_SET_LOC
e660: 4b 50 52 4f 58 59 46 49 4c 45 20 20 20 20 20 20 KPROXYFILE
e670: 20 20 20 20 20 20 20 33 0d 0a 23 64 65 66 69 6e 3..#defin
e680: 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 e SQLITE_LAST_ER
e690: 52 4e 4f 20 20 20 20 20 20 20 20 20 20 20 20 20 RNO
e6a0: 20 20 20 20 20 20 20 34 0d 0a 23 64 65 66 69 6e 4..#defin
e6b0: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 e SQLITE_FCNTL_S
e6c0: 49 5a 45 5f 48 49 4e 54 20 20 20 20 20 20 20 20 IZE_HINT
e6d0: 20 20 20 20 20 20 20 35 0d 0a 23 64 65 66 69 6e 5..#defin
e6e0: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 e SQLITE_FCNTL_C
e6f0: 48 55 4e 4b 5f 53 49 5a 45 20 20 20 20 20 20 20 HUNK_SIZE
e700: 20 20 20 20 20 20 20 36 0d 0a 23 64 65 66 69 6e 6..#defin
e710: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 e SQLITE_FCNTL_F
e720: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 20 20 20 20 ILE_POINTER
e730: 20 20 20 20 20 20 20 37 0d 0a 23 64 65 66 69 6e 7..#defin
e740: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 e SQLITE_FCNTL_S
e750: 59 4e 43 5f 4f 4d 49 54 54 45 44 20 20 20 20 20 YNC_OMITTED
e760: 20 20 20 20 20 20 20 38 0d 0a 23 64 65 66 69 6e 8..#defin
e770: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 e SQLITE_FCNTL_W
e780: 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 20 20 20 IN32_AV_RETRY
e790: 20 20 20 20 20 20 20 39 0d 0a 23 64 65 66 69 6e 9..#defin
e7a0: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 e SQLITE_FCNTL_P
e7b0: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 20 ERSIST_WAL
e7c0: 20 20 20 20 20 20 31 30 0d 0a 23 64 65 66 69 6e 10..#defin
e7d0: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4f e SQLITE_FCNTL_O
e7e0: 56 45 52 57 52 49 54 45 20 20 20 20 20 20 20 20 VERWRITE
e7f0: 20 20 20 20 20 20 31 31 0d 0a 23 64 65 66 69 6e 11..#defin
e800: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 e SQLITE_FCNTL_V
e810: 46 53 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 FSNAME
e820: 20 20 20 20 20 20 31 32 0d 0a 23 64 65 66 69 6e 12..#defin
e830: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 e SQLITE_FCNTL_P
e840: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 OWERSAFE_OVERWRI
e850: 54 45 20 20 20 20 31 33 0d 0a 0d 0a 2f 2a 0d 0a TE 13..../*..
e860: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4d 75 74 ** CAPI3REF: Mut
e870: 65 78 20 48 61 6e 64 6c 65 0d 0a 2a 2a 0d 0a 2a ex Handle..**..*
e880: 2a 20 54 68 65 20 6d 75 74 65 78 20 6d 6f 64 75 * The mutex modu
e890: 6c 65 20 77 69 74 68 69 6e 20 53 51 4c 69 74 65 le within SQLite
e8a0: 20 64 65 66 69 6e 65 73 20 5b 73 71 6c 69 74 65 defines [sqlite
e8b0: 33 5f 6d 75 74 65 78 5d 20 74 6f 20 62 65 20 61 3_mutex] to be a
e8c0: 6e 0d 0a 2a 2a 20 61 62 73 74 72 61 63 74 20 74 n..** abstract t
e8d0: 79 70 65 20 66 6f 72 20 61 20 6d 75 74 65 78 20 ype for a mutex
e8e0: 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 53 51 4c object. The SQL
e8f0: 69 74 65 20 63 6f 72 65 20 6e 65 76 65 72 20 6c ite core never l
e900: 6f 6f 6b 73 0d 0a 2a 2a 20 61 74 20 74 68 65 20 ooks..** at the
e910: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
e920: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 5b 73 ntation of an [s
e930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5d 2e 20 20 qlite3_mutex].
e940: 49 74 20 6f 6e 6c 79 0d 0a 2a 2a 20 64 65 61 6c It only..** deal
e950: 73 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 s with pointers
e960: 74 6f 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f to the [sqlite3_
e970: 6d 75 74 65 78 5d 20 6f 62 6a 65 63 74 2e 0d 0a mutex] object...
e980: 2a 2a 0d 0a 2a 2a 20 4d 75 74 65 78 65 73 20 61 **..** Mutexes a
e990: 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 re created using
e9a0: 20 5b 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f [sqlite3_mutex_
e9b0: 61 6c 6c 6f 63 28 29 5d 2e 0d 0a 2a 2f 0d 0a 74 alloc()]...*/..t
e9c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71 ypedef struct sq
e9d0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 73 71 6c 69 lite3_mutex sqli
e9e0: 74 65 33 5f 6d 75 74 65 78 3b 0d 0a 0d 0a 2f 2a te3_mutex;..../*
e9f0: 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f ..** CAPI3REF: O
ea00: 53 20 49 6e 74 65 72 66 61 63 65 20 4f 62 6a 65 S Interface Obje
ea10: 63 74 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6e 20 69 6e ct..**..** An in
ea20: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 71 stance of the sq
ea30: 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 lite3_vfs object
ea40: 20 64 65 66 69 6e 65 73 20 74 68 65 20 69 6e 74 defines the int
ea50: 65 72 66 61 63 65 20 62 65 74 77 65 65 6e 0d 0a erface between..
ea60: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f ** the SQLite co
ea70: 72 65 20 61 6e 64 20 74 68 65 20 75 6e 64 65 72 re and the under
ea80: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 lying operating
ea90: 73 79 73 74 65 6d 2e 20 20 54 68 65 20 22 76 66 system. The "vf
eaa0: 73 22 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 6e 61 s"..** in the na
eab0: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 me of the object
eac0: 20 73 74 61 6e 64 73 20 66 6f 72 20 22 76 69 72 stands for "vir
ead0: 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d tual file system
eae0: 22 2e 20 20 53 65 65 0d 0a 2a 2a 20 74 68 65 20 ". See..** the
eaf0: 5b 56 46 53 20 7c 20 56 46 53 20 64 6f 63 75 6d [VFS | VFS docum
eb00: 65 6e 74 61 74 69 6f 6e 5d 20 66 6f 72 20 66 75 entation] for fu
eb10: 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f rther informatio
eb20: 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 76 n...**..** The v
eb30: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 56 65 72 alue of the iVer
eb40: 73 69 6f 6e 20 66 69 65 6c 64 20 69 73 20 69 6e sion field is in
eb50: 69 74 69 61 6c 6c 79 20 31 20 62 75 74 20 6d 61 itially 1 but ma
eb60: 79 20 62 65 20 6c 61 72 67 65 72 20 69 6e 0d 0a y be larger in..
eb70: 2a 2a 20 66 75 74 75 72 65 20 76 65 72 73 69 6f ** future versio
eb80: 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 41 ns of SQLite. A
eb90: 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 dditional fields
eba0: 20 6d 61 79 20 62 65 20 61 70 70 65 6e 64 65 64 may be appended
ebb0: 20 74 6f 20 74 68 69 73 0d 0a 2a 2a 20 6f 62 6a to this..** obj
ebc0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 69 56 65 ect when the iVe
ebd0: 72 73 69 6f 6e 20 76 61 6c 75 65 20 69 73 20 69 rsion value is i
ebe0: 6e 63 72 65 61 73 65 64 2e 20 20 4e 6f 74 65 20 ncreased. Note
ebf0: 74 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 that the structu
ec00: 72 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71 re..** of the sq
ec10: 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 lite3_vfs object
ec20: 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 changes in the
ec30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 74 77 transaction betw
ec40: 65 65 6e 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 76 een..** SQLite v
ec50: 65 72 73 69 6f 6e 20 33 2e 35 2e 39 20 61 6e 64 ersion 3.5.9 and
ec60: 20 33 2e 36 2e 30 20 61 6e 64 20 79 65 74 20 74 3.6.0 and yet t
ec70: 68 65 20 69 56 65 72 73 69 6f 6e 20 66 69 65 6c he iVersion fiel
ec80: 64 20 77 61 73 20 6e 6f 74 0d 0a 2a 2a 20 6d 6f d was not..** mo
ec90: 64 69 66 69 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 dified...**..**
eca0: 54 68 65 20 73 7a 4f 73 46 69 6c 65 20 66 69 65 The szOsFile fie
ecb0: 6c 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f ld is the size o
ecc0: 66 20 74 68 65 20 73 75 62 63 6c 61 73 73 65 64 f the subclassed
ecd0: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 5d 0d [sqlite3_file].
ece0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 75 73 .** structure us
ecf0: 65 64 20 62 79 20 74 68 69 73 20 56 46 53 2e 20 ed by this VFS.
ed00: 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 74 mxPathname is t
ed10: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 he maximum lengt
ed20: 68 20 6f 66 0d 0a 2a 2a 20 61 20 70 61 74 68 6e h of..** a pathn
ed30: 61 6d 65 20 69 6e 20 74 68 69 73 20 56 46 53 2e ame in this VFS.
ed40: 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 67 69 73 74 65 ..**..** Registe
ed50: 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73 20 red sqlite3_vfs
ed60: 6f 62 6a 65 63 74 73 20 61 72 65 20 6b 65 70 74 objects are kept
ed70: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 on a linked lis
ed80: 74 20 66 6f 72 6d 65 64 20 62 79 0d 0a 2a 2a 20 t formed by..**
ed90: 74 68 65 20 70 4e 65 78 74 20 70 6f 69 6e 74 65 the pNext pointe
eda0: 72 2e 20 20 54 68 65 20 5b 73 71 6c 69 74 65 33 r. The [sqlite3
edb0: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29 5d _vfs_register()]
edc0: 0d 0a 2a 2a 20 61 6e 64 20 5b 73 71 6c 69 74 65 ..** and [sqlite
edd0: 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 3_vfs_unregister
ede0: 28 29 5d 20 69 6e 74 65 72 66 61 63 65 73 20 6d ()] interfaces m
edf0: 61 6e 61 67 65 20 74 68 69 73 20 6c 69 73 74 0d anage this list.
ee00: 0a 2a 2a 20 69 6e 20 61 20 74 68 72 65 61 64 2d .** in a thread-
ee10: 73 61 66 65 20 77 61 79 2e 20 20 54 68 65 20 5b safe way. The [
ee20: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 sqlite3_vfs_find
ee30: 28 29 5d 20 69 6e 74 65 72 66 61 63 65 0d 0a 2a ()] interface..*
ee40: 2a 20 73 65 61 72 63 68 65 73 20 74 68 65 20 6c * searches the l
ee50: 69 73 74 2e 20 20 4e 65 69 74 68 65 72 20 74 68 ist. Neither th
ee60: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 6f e application co
ee70: 64 65 20 6e 6f 72 20 74 68 65 20 56 46 53 0d 0a de nor the VFS..
ee80: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ** implementatio
ee90: 6e 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 n should use the
eea0: 20 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 2e 0d pNext pointer..
eeb0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 4e 65 78 .**..** The pNex
eec0: 74 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 6f t field is the o
eed0: 6e 6c 79 20 66 69 65 6c 64 20 69 6e 20 74 68 65 nly field in the
eee0: 20 73 71 6c 69 74 65 33 5f 76 66 73 0d 0a 2a 2a sqlite3_vfs..**
eef0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 structure that
ef00: 53 51 4c 69 74 65 20 77 69 6c 6c 20 65 76 65 72 SQLite will ever
ef10: 20 6d 6f 64 69 66 79 2e 20 20 53 51 4c 69 74 65 modify. SQLite
ef20: 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 63 63 65 73 will only acces
ef30: 73 0d 0a 2a 2a 20 6f 72 20 6d 6f 64 69 66 79 20 s..** or modify
ef40: 74 68 69 73 20 66 69 65 6c 64 20 77 68 69 6c 65 this field while
ef50: 20 68 6f 6c 64 69 6e 67 20 61 20 70 61 72 74 69 holding a parti
ef60: 63 75 6c 61 72 20 73 74 61 74 69 63 20 6d 75 74 cular static mut
ef70: 65 78 2e 0d 0a 2a 2a 20 54 68 65 20 61 70 70 6c ex...** The appl
ef80: 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e ication should n
ef90: 65 76 65 72 20 6d 6f 64 69 66 79 20 61 6e 79 74 ever modify anyt
efa0: 68 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 hing within the
efb0: 73 71 6c 69 74 65 33 5f 76 66 73 0d 0a 2a 2a 20 sqlite3_vfs..**
efc0: 6f 62 6a 65 63 74 20 6f 6e 63 65 20 74 68 65 20 object once the
efd0: 6f 62 6a 65 63 74 20 68 61 73 20 62 65 65 6e 20 object has been
efe0: 72 65 67 69 73 74 65 72 65 64 2e 0d 0a 2a 2a 0d registered...**.
eff0: 0a 2a 2a 20 54 68 65 20 7a 4e 61 6d 65 20 66 69 .** The zName fi
f000: 65 6c 64 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 eld holds the na
f010: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 6d 6f me of the VFS mo
f020: 64 75 6c 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 dule. The name
f030: 6d 75 73 74 0d 0a 2a 2a 20 62 65 20 75 6e 69 71 must..** be uniq
f040: 75 65 20 61 63 72 6f 73 73 20 61 6c 6c 20 56 46 ue across all VF
f050: 53 20 6d 6f 64 75 6c 65 73 2e 0d 0a 2a 2a 0d 0a S modules...**..
f060: 2a 2a 20 5b 5b 73 71 6c 69 74 65 33 5f 76 66 73 ** [[sqlite3_vfs
f070: 2e 78 4f 70 65 6e 5d 5d 0d 0a 2a 2a 20 5e 53 51 .xOpen]]..** ^SQ
f080: 4c 69 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 Lite guarantees
f090: 74 68 61 74 20 74 68 65 20 7a 46 69 6c 65 6e 61 that the zFilena
f0a0: 6d 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 me parameter to
f0b0: 78 4f 70 65 6e 0d 0a 2a 2a 20 69 73 20 65 69 74 xOpen..** is eit
f0c0: 68 65 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 her a NULL point
f0d0: 65 72 20 6f 72 20 73 74 72 69 6e 67 20 6f 62 74 er or string obt
f0e0: 61 69 6e 65 64 0d 0a 2a 2a 20 66 72 6f 6d 20 78 ained..** from x
f0f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 77 FullPathname() w
f100: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 ith an optional
f110: 73 75 66 66 69 78 20 61 64 64 65 64 2e 0d 0a 2a suffix added...*
f120: 2a 20 5e 49 66 20 61 20 73 75 66 66 69 78 20 69 * ^If a suffix i
f130: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 7a s added to the z
f140: 46 69 6c 65 6e 61 6d 65 20 70 61 72 61 6d 65 74 Filename paramet
f150: 65 72 2c 20 69 74 20 77 69 6c 6c 0d 0a 2a 2a 20 er, it will..**
f160: 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e consist of a sin
f170: 67 6c 65 20 22 2d 22 20 63 68 61 72 61 63 74 65 gle "-" characte
f180: 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 6f r followed by no
f190: 20 6d 6f 72 65 20 74 68 61 6e 0d 0a 2a 2a 20 31 more than..** 1
f1a0: 31 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 61 1 alphanumeric a
f1b0: 6e 64 2f 6f 72 20 22 2d 22 20 63 68 61 72 61 63 nd/or "-" charac
f1c0: 74 65 72 73 2e 0d 0a 2a 2a 20 5e 53 51 4c 69 74 ters...** ^SQLit
f1d0: 65 20 66 75 72 74 68 65 72 20 67 75 61 72 61 6e e further guaran
f1e0: 74 65 65 73 20 74 68 61 74 0d 0a 2a 2a 20 74 68 tees that..** th
f1f0: 65 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 e string will be
f200: 20 76 61 6c 69 64 20 61 6e 64 20 75 6e 63 68 61 valid and uncha
f210: 6e 67 65 64 20 75 6e 74 69 6c 20 78 43 6c 6f 73 nged until xClos
f220: 65 28 29 20 69 73 0d 0a 2a 2a 20 63 61 6c 6c 65 e() is..** calle
f230: 64 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 d. Because of th
f240: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 e previous sente
f250: 6e 63 65 2c 0d 0a 2a 2a 20 74 68 65 20 5b 73 71 nce,..** the [sq
f260: 6c 69 74 65 33 5f 66 69 6c 65 5d 20 63 61 6e 20 lite3_file] can
f270: 73 61 66 65 6c 79 20 73 74 6f 72 65 20 61 20 70 safely store a p
f280: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0d 0a 2a ointer to the..*
f290: 2a 20 66 69 6c 65 6e 61 6d 65 20 69 66 20 69 74 * filename if it
f2a0: 20 6e 65 65 64 73 20 74 6f 20 72 65 6d 65 6d 62 needs to rememb
f2b0: 65 72 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 er the filename
f2c0: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 2e for some reason.
f2d0: 0d 0a 2a 2a 20 49 66 20 74 68 65 20 7a 46 69 6c ..** If the zFil
f2e0: 65 6e 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 ename parameter
f2f0: 74 6f 20 78 4f 70 65 6e 20 69 73 20 61 20 4e 55 to xOpen is a NU
f300: 4c 4c 20 70 6f 69 6e 74 65 72 20 74 68 65 6e 20 LL pointer then
f310: 78 4f 70 65 6e 0d 0a 2a 2a 20 6d 75 73 74 20 69 xOpen..** must i
f320: 6e 76 65 6e 74 20 69 74 73 20 6f 77 6e 20 74 65 nvent its own te
f330: 6d 70 6f 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 mporary name for
f340: 20 74 68 65 20 66 69 6c 65 2e 20 20 5e 57 68 65 the file. ^Whe
f350: 6e 65 76 65 72 20 74 68 65 20 0d 0a 2a 2a 20 78 never the ..** x
f360: 46 69 6c 65 6e 61 6d 65 20 70 61 72 61 6d 65 74 Filename paramet
f370: 65 72 20 69 73 20 4e 55 4c 4c 20 69 74 20 77 69 er is NULL it wi
f380: 6c 6c 20 61 6c 73 6f 20 62 65 20 74 68 65 20 63 ll also be the c
f390: 61 73 65 20 74 68 61 74 20 74 68 65 0d 0a 2a 2a ase that the..**
f3a0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 flags parameter
f3b0: 20 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 5b 53 will include [S
f3c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 QLITE_OPEN_DELET
f3d0: 45 4f 4e 43 4c 4f 53 45 5d 2e 0d 0a 2a 2a 0d 0a EONCLOSE]...**..
f3e0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 ** The flags arg
f3f0: 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 ument to xOpen()
f400: 20 69 6e 63 6c 75 64 65 73 20 61 6c 6c 20 62 69 includes all bi
f410: 74 73 20 73 65 74 20 69 6e 0d 0a 2a 2a 20 74 68 ts set in..** th
f420: 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 e flags argument
f430: 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 to [sqlite3_ope
f440: 6e 5f 76 32 28 29 5d 2e 20 20 4f 72 20 69 66 20 n_v2()]. Or if
f450: 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 5d [sqlite3_open()]
f460: 0d 0a 2a 2a 20 6f 72 20 5b 73 71 6c 69 74 65 33 ..** or [sqlite3
f470: 5f 6f 70 65 6e 31 36 28 29 5d 20 69 73 20 75 73 _open16()] is us
f480: 65 64 2c 20 74 68 65 6e 20 66 6c 61 67 73 20 69 ed, then flags i
f490: 6e 63 6c 75 64 65 73 20 61 74 20 6c 65 61 73 74 ncludes at least
f4a0: 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 4f 50 45 ..** [SQLITE_OPE
f4b0: 4e 5f 52 45 41 44 57 52 49 54 45 5d 20 7c 20 5b N_READWRITE] | [
f4c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
f4d0: 54 45 5d 2e 20 0d 0a 2a 2a 20 49 66 20 78 4f 70 TE]. ..** If xOp
f4e0: 65 6e 28 29 20 6f 70 65 6e 73 20 61 20 66 69 6c en() opens a fil
f4f0: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 6e e read-only then
f500: 20 69 74 20 73 65 74 73 20 2a 70 4f 75 74 46 6c it sets *pOutFl
f510: 61 67 73 20 74 6f 0d 0a 2a 2a 20 69 6e 63 6c 75 ags to..** inclu
f520: 64 65 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f de [SQLITE_OPEN_
f530: 52 45 41 44 4f 4e 4c 59 5d 2e 20 20 4f 74 68 65 READONLY]. Othe
f540: 72 20 62 69 74 73 20 69 6e 20 2a 70 4f 75 74 46 r bits in *pOutF
f550: 6c 61 67 73 20 6d 61 79 20 62 65 20 73 65 74 2e lags may be set.
f560: 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 53 51 4c 69 74 ..**..** ^(SQLit
f570: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 61 64 64 20 e will also add
f580: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f one of the follo
f590: 77 69 6e 67 20 66 6c 61 67 73 20 74 6f 20 74 68 wing flags to th
f5a0: 65 20 78 4f 70 65 6e 28 29 0d 0a 2a 2a 20 63 61 e xOpen()..** ca
f5b0: 6c 6c 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e ll, depending on
f5c0: 20 74 68 65 20 6f 62 6a 65 63 74 20 62 65 69 6e the object bein
f5d0: 67 20 6f 70 65 6e 65 64 3a 0d 0a 2a 2a 0d 0a 2a g opened:..**..*
f5e0: 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 * <ul>..** <li>
f5f0: 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 [SQLITE_OPEN_MA
f600: 49 4e 5f 44 42 5d 0d 0a 2a 2a 20 3c 6c 69 3e 20 IN_DB]..** <li>
f610: 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 [SQLITE_OPEN_MA
f620: 49 4e 5f 4a 4f 55 52 4e 41 4c 5d 0d 0a 2a 2a 20 IN_JOURNAL]..**
f630: 3c 6c 69 3e 20 20 5b 53 51 4c 49 54 45 5f 4f 50 <li> [SQLITE_OP
f640: 45 4e 5f 54 45 4d 50 5f 44 42 5d 0d 0a 2a 2a 20 EN_TEMP_DB]..**
f650: 3c 6c 69 3e 20 20 5b 53 51 4c 49 54 45 5f 4f 50 <li> [SQLITE_OP
f660: 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 5d EN_TEMP_JOURNAL]
f670: 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 5b 53 51 4c 49 ..** <li> [SQLI
f680: 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e TE_OPEN_TRANSIEN
f690: 54 5f 44 42 5d 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 T_DB]..** <li>
f6a0: 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 [SQLITE_OPEN_SUB
f6b0: 4a 4f 55 52 4e 41 4c 5d 0d 0a 2a 2a 20 3c 6c 69 JOURNAL]..** <li
f6c0: 3e 20 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f > [SQLITE_OPEN_
f6d0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 5d 0d MASTER_JOURNAL].
f6e0: 0a 2a 2a 20 3c 6c 69 3e 20 20 5b 53 51 4c 49 54 .** <li> [SQLIT
f6f0: 45 5f 4f 50 45 4e 5f 57 41 4c 5d 0d 0a 2a 2a 20 E_OPEN_WAL]..**
f700: 3c 2f 75 6c 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 </ul>)^..**..**
f710: 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 69 6d 70 The file I/O imp
f720: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20 lementation can
f730: 75 73 65 20 74 68 65 20 6f 62 6a 65 63 74 20 74 use the object t
f740: 79 70 65 20 66 6c 61 67 73 20 74 6f 0d 0a 2a 2a ype flags to..**
f750: 20 63 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 change the way
f760: 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 it deals with fi
f770: 6c 65 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c les. For exampl
f780: 65 2c 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f e, an applicatio
f790: 6e 0d 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 n..** that does
f7a0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 63 not care about c
f7b0: 72 61 73 68 20 72 65 63 6f 76 65 72 79 20 6f 72 rash recovery or
f7c0: 20 72 6f 6c 6c 62 61 63 6b 20 6d 69 67 68 74 20 rollback might
f7d0: 6d 61 6b 65 0d 0a 2a 2a 20 74 68 65 20 6f 70 65 make..** the ope
f7e0: 6e 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 n of a journal f
f7f0: 69 6c 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 57 72 ile a no-op. Wr
f800: 69 74 65 73 20 74 6f 20 74 68 69 73 20 6a 6f 75 ites to this jou
f810: 72 6e 61 6c 20 77 6f 75 6c 64 0d 0a 2a 2a 20 61 rnal would..** a
f820: 6c 73 6f 20 62 65 20 6e 6f 2d 6f 70 73 2c 20 61 lso be no-ops, a
f830: 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 nd any attempt t
f840: 6f 20 72 65 61 64 20 74 68 65 20 6a 6f 75 72 6e o read the journ
f850: 61 6c 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 0d al would return.
f860: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 .** SQLITE_IOERR
f870: 2e 20 20 4f 72 20 74 68 65 20 69 6d 70 6c 65 6d . Or the implem
f880: 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 20 72 entation might r
f890: 65 63 6f 67 6e 69 7a 65 20 74 68 61 74 20 61 20 ecognize that a
f8a0: 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 66 69 6c database..** fil
f8b0: 65 20 77 69 6c 6c 20 62 65 20 64 6f 69 6e 67 20 e will be doing
f8c0: 70 61 67 65 2d 61 6c 69 67 6e 65 64 20 73 65 63 page-aligned sec
f8d0: 74 6f 72 20 72 65 61 64 73 20 61 6e 64 20 77 72 tor reads and wr
f8e0: 69 74 65 73 20 69 6e 20 61 20 72 61 6e 64 6f 6d ites in a random
f8f0: 0d 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64 20 73 ..** order and s
f900: 65 74 20 75 70 20 69 74 73 20 49 2f 4f 20 73 75 et up its I/O su
f910: 62 73 79 73 74 65 6d 20 61 63 63 6f 72 64 69 6e bsystem accordin
f920: 67 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c gly...**..** SQL
f930: 69 74 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 61 ite might also a
f940: 64 64 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f dd one of the fo
f950: 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 73 20 74 6f llowing flags to
f960: 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f the xOpen metho
f970: 64 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d d:..**..** <ul>.
f980: 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 .** <li> [SQLITE
f990: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c _OPEN_DELETEONCL
f9a0: 4f 53 45 5d 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 OSE]..** <li> [S
f9b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 QLITE_OPEN_EXCLU
f9c0: 53 49 56 45 5d 0d 0a 2a 2a 20 3c 2f 75 6c 3e 0d SIVE]..** </ul>.
f9d0: 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 5b 53 51 4c .**..** The [SQL
f9e0: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f ITE_OPEN_DELETEO
f9f0: 4e 43 4c 4f 53 45 5d 20 66 6c 61 67 20 6d 65 61 NCLOSE] flag mea
fa00: 6e 73 20 74 68 65 20 66 69 6c 65 20 73 68 6f 75 ns the file shou
fa10: 6c 64 20 62 65 0d 0a 2a 2a 20 64 65 6c 65 74 65 ld be..** delete
fa20: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f d when it is clo
fa30: 73 65 64 2e 20 20 5e 54 68 65 20 5b 53 51 4c 49 sed. ^The [SQLI
fa40: 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e TE_OPEN_DELETEON
fa50: 43 4c 4f 53 45 5d 0d 0a 2a 2a 20 77 69 6c 6c 20 CLOSE]..** will
fa60: 62 65 20 73 65 74 20 66 6f 72 20 54 45 4d 50 20 be set for TEMP
fa70: 64 61 74 61 62 61 73 65 73 20 61 6e 64 20 74 68 databases and th
fa80: 65 69 72 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 72 eir journals, tr
fa90: 61 6e 73 69 65 6e 74 0d 0a 2a 2a 20 64 61 74 61 ansient..** data
faa0: 62 61 73 65 73 2c 20 61 6e 64 20 73 75 62 6a 6f bases, and subjo
fab0: 75 72 6e 61 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 urnals...**..**
fac0: 5e 54 68 65 20 5b 53 51 4c 49 54 45 5f 4f 50 45 ^The [SQLITE_OPE
fad0: 4e 5f 45 58 43 4c 55 53 49 56 45 5d 20 66 6c 61 N_EXCLUSIVE] fla
fae0: 67 20 69 73 20 61 6c 77 61 79 73 20 75 73 65 64 g is always used
faf0: 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 0d in conjunction.
fb00: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 5b 53 51 .** with the [SQ
fb10: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 LITE_OPEN_CREATE
fb20: 5d 20 66 6c 61 67 2c 20 77 68 69 63 68 20 61 72 ] flag, which ar
fb30: 65 20 62 6f 74 68 20 64 69 72 65 63 74 6c 79 0d e both directly.
fb40: 0a 2a 2a 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f .** analogous to
fb50: 20 74 68 65 20 4f 5f 45 58 43 4c 20 61 6e 64 20 the O_EXCL and
fb60: 4f 5f 43 52 45 41 54 20 66 6c 61 67 73 20 6f 66 O_CREAT flags of
fb70: 20 74 68 65 20 50 4f 53 49 58 20 6f 70 65 6e 28 the POSIX open(
fb80: 29 0d 0a 2a 2a 20 41 50 49 2e 20 20 54 68 65 20 )..** API. The
fb90: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c SQLITE_OPEN_EXCL
fba0: 55 53 49 56 45 20 66 6c 61 67 2c 20 77 68 65 6e USIVE flag, when
fbb0: 20 70 61 69 72 65 64 20 77 69 74 68 20 74 68 65 paired with the
fbc0: 20 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 ..** SQLITE_OPE
fbd0: 4e 5f 43 52 45 41 54 45 2c 20 69 73 20 75 73 65 N_CREATE, is use
fbe0: 64 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 d to indicate th
fbf0: 61 74 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 61 at file should a
fc00: 6c 77 61 79 73 0d 0a 2a 2a 20 62 65 20 63 72 65 lways..** be cre
fc10: 61 74 65 64 2c 20 61 6e 64 20 74 68 61 74 20 69 ated, and that i
fc20: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 t is an error if
fc30: 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 it already exis
fc40: 74 73 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 3c 69 ts...** It is <i
fc50: 3e 6e 6f 74 3c 2f 69 3e 20 75 73 65 64 20 74 6f >not</i> used to
fc60: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 66 69 indicate the fi
fc70: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 le should be ope
fc80: 6e 65 64 20 0d 0a 2a 2a 20 66 6f 72 20 65 78 63 ned ..** for exc
fc90: 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 0d 0a lusive access...
fca0: 2a 2a 0d 0a 2a 2a 20 5e 41 74 20 6c 65 61 73 74 **..** ^At least
fcb0: 20 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 20 szOsFile bytes
fcc0: 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 61 6c of memory are al
fcd0: 6c 6f 63 61 74 65 64 20 62 79 20 53 51 4c 69 74 located by SQLit
fce0: 65 0d 0a 2a 2a 20 74 6f 20 68 6f 6c 64 20 74 68 e..** to hold th
fcf0: 65 20 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 e [sqlite3_file
fd00: 5d 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 ] structure pass
fd10: 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 0d ed as the third.
fd20: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 .** argument to
fd30: 78 4f 70 65 6e 2e 20 20 54 68 65 20 78 4f 70 65 xOpen. The xOpe
fd40: 6e 20 6d 65 74 68 6f 64 20 64 6f 65 73 20 6e 6f n method does no
fd50: 74 20 68 61 76 65 20 74 6f 0d 0a 2a 2a 20 61 6c t have to..** al
fd60: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63 locate the struc
fd70: 74 75 72 65 3b 20 69 74 20 73 68 6f 75 6c 64 20 ture; it should
fd80: 6a 75 73 74 20 66 69 6c 6c 20 69 74 20 69 6e 2e just fill it in.
fd90: 20 20 4e 6f 74 65 20 74 68 61 74 0d 0a 2a 2a 20 Note that..**
fda0: 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 the xOpen method
fdb0: 20 6d 75 73 74 20 73 65 74 20 74 68 65 20 73 71 must set the sq
fdc0: 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 lite3_file.pMeth
fdd0: 6f 64 73 20 74 6f 20 65 69 74 68 65 72 0d 0a 2a ods to either..*
fde0: 2a 20 61 20 76 61 6c 69 64 20 5b 73 71 6c 69 74 * a valid [sqlit
fdf0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 5d 20 6f e3_io_methods] o
fe00: 62 6a 65 63 74 20 6f 72 20 74 6f 20 4e 55 4c 4c bject or to NULL
fe10: 2e 20 20 78 4f 70 65 6e 20 6d 75 73 74 20 64 6f . xOpen must do
fe20: 0d 0a 2a 2a 20 74 68 69 73 20 65 76 65 6e 20 69 ..** this even i
fe30: 66 20 74 68 65 20 6f 70 65 6e 20 66 61 69 6c 73 f the open fails
fe40: 2e 20 20 53 51 4c 69 74 65 20 65 78 70 65 63 74 . SQLite expect
fe50: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 s that the sqlit
fe60: 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 e3_file.pMethods
fe70: 0d 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 77 69 6c ..** element wil
fe80: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72 l be valid after
fe90: 20 78 4f 70 65 6e 20 72 65 74 75 72 6e 73 20 72 xOpen returns r
fea0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 egardless of the
feb0: 20 73 75 63 63 65 73 73 0d 0a 2a 2a 20 6f 72 20 success..** or
fec0: 66 61 69 6c 75 72 65 20 6f 66 20 74 68 65 20 78 failure of the x
fed0: 4f 70 65 6e 20 63 61 6c 6c 2e 0d 0a 2a 2a 0d 0a Open call...**..
fee0: 2a 2a 20 5b 5b 73 71 6c 69 74 65 33 5f 76 66 73 ** [[sqlite3_vfs
fef0: 2e 78 41 63 63 65 73 73 5d 5d 0d 0a 2a 2a 20 5e .xAccess]]..** ^
ff00: 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 The flags argume
ff10: 6e 74 20 74 6f 20 78 41 63 63 65 73 73 28 29 20 nt to xAccess()
ff20: 6d 61 79 20 62 65 20 5b 53 51 4c 49 54 45 5f 41 may be [SQLITE_A
ff30: 43 43 45 53 53 5f 45 58 49 53 54 53 5d 0d 0a 2a CCESS_EXISTS]..*
ff40: 2a 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74 68 * to test for th
ff50: 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 e existence of a
ff60: 20 66 69 6c 65 2c 20 6f 72 20 5b 53 51 4c 49 54 file, or [SQLIT
ff70: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 E_ACCESS_READWRI
ff80: 54 45 5d 20 74 6f 0d 0a 2a 2a 20 74 65 73 74 20 TE] to..** test
ff90: 77 68 65 74 68 65 72 20 61 20 66 69 6c 65 20 69 whether a file i
ffa0: 73 20 72 65 61 64 61 62 6c 65 20 61 6e 64 20 77 s readable and w
ffb0: 72 69 74 61 62 6c 65 2c 20 6f 72 20 5b 53 51 4c ritable, or [SQL
ffc0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 5d ITE_ACCESS_READ]
ffd0: 0d 0a 2a 2a 20 74 6f 20 74 65 73 74 20 77 68 65 ..** to test whe
ffe0: 74 68 65 72 20 61 20 66 69 6c 65 20 69 73 20 61 ther a file is a
fff0: 74 20 6c 65 61 73 74 20 72 65 61 64 61 62 6c 65 t least readable
10000 2e 20 20 20 54 68 65 20 66 69 6c 65 20 63 61 6e . The file can
10010 20 62 65 20 61 0d 0a 2a 2a 20 64 69 72 65 63 74 be a..** direct
10020 6f 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 ory...**..** ^SQ
10030 4c 69 74 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 Lite will always
10040 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 6c 65 61 allocate at lea
10050 73 74 20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 st mxPathname+1
10060 62 79 74 65 73 20 66 6f 72 20 74 68 65 0d 0a 2a bytes for the..*
10070 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 * output buffer
10080 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2e 20 20 xFullPathname.
10090 54 68 65 20 65 78 61 63 74 20 73 69 7a 65 20 6f The exact size o
100a0 66 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 f the output buf
100b0 66 65 72 0d 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 fer..** is also
100c0 70 61 73 73 65 64 20 61 73 20 61 20 70 61 72 61 passed as a para
100d0 6d 65 74 65 72 20 74 6f 20 62 6f 74 68 20 20 6d meter to both m
100e0 65 74 68 6f 64 73 2e 20 49 66 20 74 68 65 20 6f ethods. If the o
100f0 75 74 70 75 74 20 62 75 66 66 65 72 0d 0a 2a 2a utput buffer..**
10100 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e is not large en
10110 6f 75 67 68 2c 20 5b 53 51 4c 49 54 45 5f 43 41 ough, [SQLITE_CA
10120 4e 54 4f 50 45 4e 5d 20 73 68 6f 75 6c 64 20 62 NTOPEN] should b
10130 65 20 72 65 74 75 72 6e 65 64 2e 20 53 69 6e 63 e returned. Sinc
10140 65 20 74 68 69 73 20 69 73 0d 0a 2a 2a 20 68 61 e this is..** ha
10150 6e 64 6c 65 64 20 61 73 20 61 20 66 61 74 61 6c ndled as a fatal
10160 20 65 72 72 6f 72 20 62 79 20 53 51 4c 69 74 65 error by SQLite
10170 2c 20 76 66 73 20 69 6d 70 6c 65 6d 65 6e 74 61 , vfs implementa
10180 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 65 6e 64 tions should end
10190 65 61 76 6f 72 0d 0a 2a 2a 20 74 6f 20 70 72 65 eavor..** to pre
101a0 76 65 6e 74 20 74 68 69 73 20 62 79 20 73 65 74 vent this by set
101b0 74 69 6e 67 20 6d 78 50 61 74 68 6e 61 6d 65 20 ting mxPathname
101c0 74 6f 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c to a sufficientl
101d0 79 20 6c 61 72 67 65 20 76 61 6c 75 65 2e 0d 0a y large value...
101e0 2a 2a 0d 0a 2a 2a 20 54 68 65 20 78 52 61 6e 64 **..** The xRand
101f0 6f 6d 6e 65 73 73 28 29 2c 20 78 53 6c 65 65 70 omness(), xSleep
10200 28 29 2c 20 78 43 75 72 72 65 6e 74 54 69 6d 65 (), xCurrentTime
10210 28 29 2c 20 61 6e 64 20 78 43 75 72 72 65 6e 74 (), and xCurrent
10220 54 69 6d 65 49 6e 74 36 34 28 29 0d 0a 2a 2a 20 TimeInt64()..**
10230 69 6e 74 65 72 66 61 63 65 73 20 61 72 65 20 6e interfaces are n
10240 6f 74 20 73 74 72 69 63 74 6c 79 20 61 20 70 61 ot strictly a pa
10250 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 73 79 rt of the filesy
10260 73 74 65 6d 2c 20 62 75 74 20 74 68 65 79 20 61 stem, but they a
10270 72 65 0d 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 re..** included
10280 69 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63 in the VFS struc
10290 74 75 72 65 20 66 6f 72 20 63 6f 6d 70 6c 65 74 ture for complet
102a0 65 6e 65 73 73 2e 0d 0a 2a 2a 20 54 68 65 20 78 eness...** The x
102b0 52 61 6e 64 6f 6d 6e 65 73 73 28 29 20 66 75 6e Randomness() fun
102c0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 ction attempts t
102d0 6f 20 72 65 74 75 72 6e 20 6e 42 79 74 65 73 20 o return nBytes
102e0 62 79 74 65 73 0d 0a 2a 2a 20 6f 66 20 67 6f 6f bytes..** of goo
102f0 64 2d 71 75 61 6c 69 74 79 20 72 61 6e 64 6f 6d d-quality random
10300 6e 65 73 73 20 69 6e 74 6f 20 7a 4f 75 74 2e 20 ness into zOut.
10310 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 The return valu
10320 65 20 69 73 0d 0a 2a 2a 20 74 68 65 20 61 63 74 e is..** the act
10330 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 ual number of by
10340 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 tes of randomnes
10350 73 20 6f 62 74 61 69 6e 65 64 2e 0d 0a 2a 2a 20 s obtained...**
10360 54 68 65 20 78 53 6c 65 65 70 28 29 20 6d 65 74 The xSleep() met
10370 68 6f 64 20 63 61 75 73 65 73 20 74 68 65 20 63 hod causes the c
10380 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 74 6f alling thread to
10390 20 73 6c 65 65 70 20 66 6f 72 20 61 74 0d 0a 2a sleep for at..*
103a0 2a 20 6c 65 61 73 74 20 74 68 65 20 6e 75 6d 62 * least the numb
103b0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e er of microsecon
103c0 64 73 20 67 69 76 65 6e 2e 20 20 5e 54 68 65 20 ds given. ^The
103d0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 29 0d 0a xCurrentTime()..
103e0 2a 2a 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e ** method return
103f0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e s a Julian Day N
10400 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 75 umber for the cu
10410 72 72 65 6e 74 20 64 61 74 65 20 61 6e 64 20 74 rrent date and t
10420 69 6d 65 20 61 73 0d 0a 2a 2a 20 61 20 66 6c 6f ime as..** a flo
10430 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 ating point valu
10440 65 2e 0d 0a 2a 2a 20 5e 54 68 65 20 78 43 75 72 e...** ^The xCur
10450 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 29 20 rentTimeInt64()
10460 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 2c 20 method returns,
10470 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 as an integer, t
10480 68 65 20 4a 75 6c 69 61 6e 0d 0a 2a 2a 20 44 61 he Julian..** Da
10490 79 20 4e 75 6d 62 65 72 20 6d 75 6c 74 69 70 6c y Number multipl
104a0 69 65 64 20 62 79 20 38 36 34 30 30 30 30 30 20 ied by 86400000
104b0 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d (the number of m
104c0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 69 6e 20 0d illiseconds in .
104d0 0a 2a 2a 20 61 20 32 34 2d 68 6f 75 72 20 64 61 .** a 24-hour da
104e0 79 29 2e 20 20 0d 0a 2a 2a 20 5e 53 51 4c 69 74 y). ..** ^SQLit
104f0 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 78 e will use the x
10500 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 CurrentTimeInt64
10510 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 67 65 74 () method to get
10520 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 2a 2a the current..**
10530 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 69 date and time i
10540 66 20 74 68 61 74 20 6d 65 74 68 6f 64 20 69 73 f that method is
10550 20 61 76 61 69 6c 61 62 6c 65 20 28 69 66 20 69 available (if i
10560 56 65 72 73 69 6f 6e 20 69 73 20 32 20 6f 72 20 Version is 2 or
10570 0d 0a 2a 2a 20 67 72 65 61 74 65 72 20 61 6e 64 ..** greater and
10580 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f the function po
10590 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c inter is not NUL
105a0 4c 29 20 61 6e 64 20 77 69 6c 6c 20 66 61 6c 6c L) and will fall
105b0 20 62 61 63 6b 0d 0a 2a 2a 20 74 6f 20 78 43 75 back..** to xCu
105c0 72 72 65 6e 74 54 69 6d 65 28 29 20 69 66 20 78 rrentTime() if x
105d0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 CurrentTimeInt64
105e0 28 29 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c () is unavailabl
105f0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 e...**..** ^The
10600 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 xSetSystemCall()
10610 2c 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c , xGetSystemCall
10620 28 29 2c 20 61 6e 64 20 78 4e 65 73 74 53 79 73 (), and xNestSys
10630 74 65 6d 43 61 6c 6c 28 29 20 69 6e 74 65 72 66 temCall() interf
10640 61 63 65 73 0d 0a 2a 2a 20 61 72 65 20 6e 6f 74 aces..** are not
10650 20 75 73 65 64 20 62 79 20 74 68 65 20 53 51 4c used by the SQL
10660 69 74 65 20 63 6f 72 65 2e 20 20 54 68 65 73 65 ite core. These
10670 20 6f 70 74 69 6f 6e 61 6c 20 69 6e 74 65 72 66 optional interf
10680 61 63 65 73 20 61 72 65 20 70 72 6f 76 69 64 65 aces are provide
10690 64 0d 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 56 46 d..** by some VF
106a0 53 65 73 20 74 6f 20 66 61 63 69 6c 69 74 61 74 Ses to facilitat
106b0 65 20 74 65 73 74 69 6e 67 20 6f 66 20 74 68 65 e testing of the
106c0 20 56 46 53 20 63 6f 64 65 2e 20 42 79 20 6f 76 VFS code. By ov
106d0 65 72 72 69 64 69 6e 67 20 0d 0a 2a 2a 20 73 79 erriding ..** sy
106e0 73 74 65 6d 20 63 61 6c 6c 73 20 77 69 74 68 20 stem calls with
106f0 66 75 6e 63 74 69 6f 6e 73 20 75 6e 64 65 72 20 functions under
10700 69 74 73 20 63 6f 6e 74 72 6f 6c 2c 20 61 20 74 its control, a t
10710 65 73 74 20 70 72 6f 67 72 61 6d 20 63 61 6e 0d est program can.
10720 0a 2a 2a 20 73 69 6d 75 6c 61 74 65 20 66 61 75 .** simulate fau
10730 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 20 63 6f lts and error co
10740 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 77 6f nditions that wo
10750 75 6c 64 20 6f 74 68 65 72 77 69 73 65 20 62 65 uld otherwise be
10760 20 64 69 66 66 69 63 75 6c 74 0d 0a 2a 2a 20 6f difficult..** o
10770 72 20 69 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 r impossible to
10780 69 6e 64 75 63 65 2e 20 20 54 68 65 20 73 65 74 induce. The set
10790 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 of system calls
107a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 6f 76 65 that can be ove
107b0 72 72 69 64 64 65 6e 0d 0a 2a 2a 20 76 61 72 69 rridden..** vari
107c0 65 73 20 66 72 6f 6d 20 6f 6e 65 20 56 46 53 20 es from one VFS
107d0 74 6f 20 61 6e 6f 74 68 65 72 2c 20 61 6e 64 20 to another, and
107e0 66 72 6f 6d 20 6f 6e 65 20 76 65 72 73 69 6f 6e from one version
107f0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 56 46 53 of the same VFS
10800 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 6e 65 78 74 to the..** next
10810 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 . Applications
10820 74 68 61 74 20 75 73 65 20 74 68 65 73 65 20 69 that use these i
10830 6e 74 65 72 66 61 63 65 73 20 6d 75 73 74 20 62 nterfaces must b
10840 65 20 70 72 65 70 61 72 65 64 20 66 6f 72 20 61 e prepared for a
10850 6e 79 0d 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f 66 ny..** or all of
10860 20 74 68 65 73 65 20 69 6e 74 65 72 66 61 63 65 these interface
10870 73 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 s to be NULL or
10880 66 6f 72 20 74 68 65 69 72 20 62 65 68 61 76 69 for their behavi
10890 6f 72 20 74 6f 20 63 68 61 6e 67 65 0d 0a 2a 2a or to change..**
108a0 20 66 72 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 from one releas
108b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 e to the next.
108c0 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 6d 75 73 Applications mus
108d0 74 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f t not attempt to
108e0 20 61 63 63 65 73 73 0d 0a 2a 2a 20 61 6e 79 20 access..** any
108f0 6f 66 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 of these methods
10900 20 69 66 20 74 68 65 20 69 56 65 72 73 69 6f 6e if the iVersion
10910 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 6c of the VFS is l
10920 65 73 73 20 74 68 61 6e 20 33 2e 0d 0a 2a 2f 0d ess than 3...*/.
10930 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
10940 73 71 6c 69 74 65 33 5f 76 66 73 20 73 71 6c 69 sqlite3_vfs sqli
10950 74 65 33 5f 76 66 73 3b 0d 0a 74 79 70 65 64 65 te3_vfs;..typede
10960 66 20 76 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 f void (*sqlite3
10970 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 28 76 6f _syscall_ptr)(vo
10980 69 64 29 3b 0d 0a 73 74 72 75 63 74 20 73 71 6c id);..struct sql
10990 69 74 65 33 5f 76 66 73 20 7b 0d 0a 20 20 69 6e ite3_vfs {.. in
109a0 74 20 69 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 t iVersion;
109b0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 /* Struct
109c0 75 72 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 ure version numb
109d0 65 72 20 28 63 75 72 72 65 6e 74 6c 79 20 33 29 er (currently 3)
109e0 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 4f 73 46 */.. int szOsF
109f0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ile;
10a00 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 62 63 6c /* Size of subcl
10a10 61 73 73 65 64 20 73 71 6c 69 74 65 33 5f 66 69 assed sqlite3_fi
10a20 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6d 78 50 le */.. int mxP
10a30 61 74 68 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 athname;
10a40 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 66 69 6c /* Maximum fil
10a50 65 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 e pathname lengt
10a60 68 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f h */.. sqlite3_
10a70 76 66 73 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 vfs *pNext;
10a80 20 2f 2a 20 4e 65 78 74 20 72 65 67 69 73 74 65 /* Next registe
10a90 72 65 64 20 56 46 53 20 2a 2f 0d 0a 20 20 63 6f red VFS */.. co
10aa0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b nst char *zName;
10ab0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f /* Name o
10ac0 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 66 f this virtual f
10ad0 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0d 0a 20 ile system */..
10ae0 20 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 3b void *pAppData;
10af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 /* Poi
10b00 6e 74 65 72 20 74 6f 20 61 70 70 6c 69 63 61 74 nter to applicat
10b10 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 64 61 74 ion-specific dat
10b20 61 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 4f a */.. int (*xO
10b30 70 65 6e 29 28 73 71 6c 69 74 65 33 5f 76 66 73 pen)(sqlite3_vfs
10b40 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a *, const char *z
10b50 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 66 69 Name, sqlite3_fi
10b60 6c 65 2a 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 le*,..
10b70 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 int flags,
10b80 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 29 3b int *pOutFlags);
10b90 0d 0a 20 20 69 6e 74 20 28 2a 78 44 65 6c 65 74 .. int (*xDelet
10ba0 65 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c e)(sqlite3_vfs*,
10bb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
10bc0 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29 me, int syncDir)
10bd0 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 41 63 63 65 ;.. int (*xAcce
10be0 73 73 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a ss)(sqlite3_vfs*
10bf0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e , const char *zN
10c00 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 ame, int flags,
10c10 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 3b 0d 0a int *pResOut);..
10c20 20 20 69 6e 74 20 28 2a 78 46 75 6c 6c 50 61 74 int (*xFullPat
10c30 68 6e 61 6d 65 29 28 73 71 6c 69 74 65 33 5f 76 hname)(sqlite3_v
10c40 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 fs*, const char
10c50 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4f 75 74 *zName, int nOut
10c60 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0d 0a , char *zOut);..
10c70 20 20 76 6f 69 64 20 2a 28 2a 78 44 6c 4f 70 65 void *(*xDlOpe
10c80 6e 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c n)(sqlite3_vfs*,
10c90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 const char *zFi
10ca0 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 76 6f 69 64 lename);.. void
10cb0 20 28 2a 78 44 6c 45 72 72 6f 72 29 28 73 71 6c (*xDlError)(sql
10cc0 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e ite3_vfs*, int n
10cd0 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 Byte, char *zErr
10ce0 4d 73 67 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a Msg);.. void (*
10cf0 28 2a 78 44 6c 53 79 6d 29 28 73 71 6c 69 74 65 (*xDlSym)(sqlite
10d00 33 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 3_vfs*,void*, co
10d10 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f nst char *zSymbo
10d20 6c 29 29 28 76 6f 69 64 29 3b 0d 0a 20 20 76 6f l))(void);.. vo
10d30 69 64 20 28 2a 78 44 6c 43 6c 6f 73 65 29 28 73 id (*xDlClose)(s
10d40 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f 69 qlite3_vfs*, voi
10d50 64 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 52 d*);.. int (*xR
10d60 61 6e 64 6f 6d 6e 65 73 73 29 28 73 71 6c 69 74 andomness)(sqlit
10d70 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 e3_vfs*, int nBy
10d80 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b te, char *zOut);
10d90 0d 0a 20 20 69 6e 74 20 28 2a 78 53 6c 65 65 70 .. int (*xSleep
10da0 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 )(sqlite3_vfs*,
10db0 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 int microseconds
10dc0 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 75 72 );.. int (*xCur
10dd0 72 65 6e 74 54 69 6d 65 29 28 73 71 6c 69 74 65 rentTime)(sqlite
10de0 33 5f 76 66 73 2a 2c 20 64 6f 75 62 6c 65 2a 29 3_vfs*, double*)
10df0 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 47 65 74 4c ;.. int (*xGetL
10e00 61 73 74 45 72 72 6f 72 29 28 73 71 6c 69 74 65 astError)(sqlite
10e10 33 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63 68 61 3_vfs*, int, cha
10e20 72 20 2a 29 3b 0d 0a 20 20 2f 2a 0d 0a 20 20 2a r *);.. /*.. *
10e30 2a 20 54 68 65 20 6d 65 74 68 6f 64 73 20 61 62 * The methods ab
10e40 6f 76 65 20 61 72 65 20 69 6e 20 76 65 72 73 69 ove are in versi
10e50 6f 6e 20 31 20 6f 66 20 74 68 65 20 73 71 6c 69 on 1 of the sqli
10e60 74 65 5f 76 66 73 20 6f 62 6a 65 63 74 0d 0a 20 te_vfs object..
10e70 20 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 ** definition.
10e80 20 54 68 6f 73 65 20 74 68 61 74 20 66 6f 6c 6c Those that foll
10e90 6f 77 20 61 72 65 20 61 64 64 65 64 20 69 6e 20 ow are added in
10ea0 76 65 72 73 69 6f 6e 20 32 20 6f 72 20 6c 61 74 version 2 or lat
10eb0 65 72 0d 0a 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 er.. */.. int
10ec0 28 2a 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e (*xCurrentTimeIn
10ed0 74 36 34 29 28 73 71 6c 69 74 65 33 5f 76 66 73 t64)(sqlite3_vfs
10ee0 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 *, sqlite3_int64
10ef0 2a 29 3b 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 *);.. /*.. **
10f00 54 68 65 20 6d 65 74 68 6f 64 73 20 61 62 6f 76 The methods abov
10f10 65 20 61 72 65 20 69 6e 20 76 65 72 73 69 6f 6e e are in version
10f20 73 20 31 20 61 6e 64 20 32 20 6f 66 20 74 68 65 s 1 and 2 of the
10f30 20 73 71 6c 69 74 65 5f 76 66 73 20 6f 62 6a 65 sqlite_vfs obje
10f40 63 74 2e 0d 0a 20 20 2a 2a 20 54 68 6f 73 65 20 ct... ** Those
10f50 62 65 6c 6f 77 20 61 72 65 20 66 6f 72 20 76 65 below are for ve
10f60 72 73 69 6f 6e 20 33 20 61 6e 64 20 67 72 65 61 rsion 3 and grea
10f70 74 65 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 6e ter... */.. in
10f80 74 20 28 2a 78 53 65 74 53 79 73 74 65 6d 43 61 t (*xSetSystemCa
10f90 6c 6c 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a ll)(sqlite3_vfs*
10fa0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e , const char *zN
10fb0 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 73 79 73 ame, sqlite3_sys
10fc0 63 61 6c 6c 5f 70 74 72 29 3b 0d 0a 20 20 73 71 call_ptr);.. sq
10fd0 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 lite3_syscall_pt
10fe0 72 20 28 2a 78 47 65 74 53 79 73 74 65 6d 43 61 r (*xGetSystemCa
10ff0 6c 6c 29 28 73 71 6c 69 74 65 33 5f 76 66 73 2a ll)(sqlite3_vfs*
11000 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e , const char *zN
11010 61 6d 65 29 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 ame);.. const c
11020 68 61 72 20 2a 28 2a 78 4e 65 78 74 53 79 73 74 har *(*xNextSyst
11030 65 6d 43 61 6c 6c 29 28 73 71 6c 69 74 65 33 5f emCall)(sqlite3_
11040 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 vfs*, const char
11050 20 2a 7a 4e 61 6d 65 29 3b 0d 0a 20 20 2f 2a 0d *zName);.. /*.
11060 0a 20 20 2a 2a 20 54 68 65 20 6d 65 74 68 6f 64 . ** The method
11070 73 20 61 62 6f 76 65 20 61 72 65 20 69 6e 20 76 s above are in v
11080 65 72 73 69 6f 6e 73 20 31 20 74 68 72 6f 75 67 ersions 1 throug
11090 68 20 33 20 6f 66 20 74 68 65 20 73 71 6c 69 74 h 3 of the sqlit
110a0 65 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0d 0a 20 e_vfs object...
110b0 20 2a 2a 20 4e 65 77 20 66 69 65 6c 64 73 20 6d ** New fields m
110c0 61 79 20 62 65 20 61 70 70 65 6e 64 65 64 20 69 ay be appended i
110d0 6e 20 66 69 67 75 72 65 20 76 65 72 73 69 6f 6e n figure version
110e0 73 2e 20 20 54 68 65 20 69 56 65 72 73 69 6f 6e s. The iVersion
110f0 0d 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77 69 6c .. ** value wil
11100 6c 20 69 6e 63 72 65 6d 65 6e 74 20 77 68 65 6e l increment when
11110 65 76 65 72 20 74 68 69 73 20 68 61 70 70 65 6e ever this happen
11120 73 2e 20 0d 0a 20 20 2a 2f 0d 0a 7d 3b 0d 0a 0d s. .. */..};...
11130 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
11140 3a 20 46 6c 61 67 73 20 66 6f 72 20 74 68 65 20 : Flags for the
11150 78 41 63 63 65 73 73 20 56 46 53 20 6d 65 74 68 xAccess VFS meth
11160 6f 64 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 od..**..** These
11170 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e integer constan
11180 74 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 ts can be used a
11190 73 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 s the third para
111a0 6d 65 74 65 72 20 74 6f 0d 0a 2a 2a 20 74 68 65 meter to..** the
111b0 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 xAccess method
111c0 6f 66 20 61 6e 20 5b 73 71 6c 69 74 65 33 5f 76 of an [sqlite3_v
111d0 66 73 5d 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 fs] object. The
111e0 79 20 64 65 74 65 72 6d 69 6e 65 0d 0a 2a 2a 20 y determine..**
111f0 77 68 61 74 20 6b 69 6e 64 20 6f 66 20 70 65 72 what kind of per
11200 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 78 41 63 missions the xAc
11210 63 65 73 73 20 6d 65 74 68 6f 64 20 69 73 20 6c cess method is l
11220 6f 6f 6b 69 6e 67 20 66 6f 72 2e 0d 0a 2a 2a 20 ooking for...**
11230 57 69 74 68 20 53 51 4c 49 54 45 5f 41 43 43 45 With SQLITE_ACCE
11240 53 53 5f 45 58 49 53 54 53 2c 20 74 68 65 20 78 SS_EXISTS, the x
11250 41 63 63 65 73 73 20 6d 65 74 68 6f 64 0d 0a 2a Access method..*
11260 2a 20 73 69 6d 70 6c 79 20 63 68 65 63 6b 73 20 * simply checks
11270 77 68 65 74 68 65 72 20 74 68 65 20 66 69 6c 65 whether the file
11280 20 65 78 69 73 74 73 2e 0d 0a 2a 2a 20 57 69 74 exists...** Wit
11290 68 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f h SQLITE_ACCESS_
112a0 52 45 41 44 57 52 49 54 45 2c 20 74 68 65 20 78 READWRITE, the x
112b0 41 63 63 65 73 73 20 6d 65 74 68 6f 64 0d 0a 2a Access method..*
112c0 2a 20 63 68 65 63 6b 73 20 77 68 65 74 68 65 72 * checks whether
112d0 20 74 68 65 20 6e 61 6d 65 64 20 64 69 72 65 63 the named direc
112e0 74 6f 72 79 20 69 73 20 62 6f 74 68 20 72 65 61 tory is both rea
112f0 64 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62 dable and writab
11300 6c 65 0d 0a 2a 2a 20 28 69 6e 20 6f 74 68 65 72 le..** (in other
11310 20 77 6f 72 64 73 2c 20 69 66 20 66 69 6c 65 73 words, if files
11320 20 63 61 6e 20 62 65 20 61 64 64 65 64 2c 20 72 can be added, r
11330 65 6d 6f 76 65 64 2c 20 61 6e 64 20 72 65 6e 61 emoved, and rena
11340 6d 65 64 20 77 69 74 68 69 6e 0d 0a 2a 2a 20 74 med within..** t
11350 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0d 0a he directory)...
11360 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 43 ** The SQLITE_AC
11370 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 63 CESS_READWRITE c
11380 6f 6e 73 74 61 6e 74 20 69 73 20 63 75 72 72 65 onstant is curre
11390 6e 74 6c 79 20 75 73 65 64 20 6f 6e 6c 79 20 62 ntly used only b
113a0 79 20 74 68 65 0d 0a 2a 2a 20 5b 74 65 6d 70 5f y the..** [temp_
113b0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 store_directory
113c0 70 72 61 67 6d 61 5d 2c 20 74 68 6f 75 67 68 20 pragma], though
113d0 74 68 69 73 20 63 6f 75 6c 64 20 63 68 61 6e 67 this could chang
113e0 65 20 69 6e 20 61 20 66 75 74 75 72 65 0d 0a 2a e in a future..*
113f0 2a 20 72 65 6c 65 61 73 65 20 6f 66 20 53 51 4c * release of SQL
11400 69 74 65 2e 0d 0a 2a 2a 20 57 69 74 68 20 53 51 ite...** With SQ
11410 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 LITE_ACCESS_READ
11420 2c 20 74 68 65 20 78 41 63 63 65 73 73 20 6d 65 , the xAccess me
11430 74 68 6f 64 0d 0a 2a 2a 20 63 68 65 63 6b 73 20 thod..** checks
11440 77 68 65 74 68 65 72 20 74 68 65 20 66 69 6c 65 whether the file
11450 20 69 73 20 72 65 61 64 61 62 6c 65 2e 20 20 54 is readable. T
11460 68 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 he SQLITE_ACCESS
11470 5f 52 45 41 44 20 63 6f 6e 73 74 61 6e 74 20 69 _READ constant i
11480 73 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 s..** currently
11490 75 6e 75 73 65 64 2c 20 74 68 6f 75 67 68 20 69 unused, though i
114a0 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 t might be used
114b0 69 6e 20 61 20 66 75 74 75 72 65 20 72 65 6c 65 in a future rele
114c0 61 73 65 20 6f 66 0d 0a 2a 2a 20 53 51 4c 69 74 ase of..** SQLit
114d0 65 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 e...*/..#define
114e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 SQLITE_ACCESS_EX
114f0 49 53 54 53 20 20 20 20 30 0d 0a 23 64 65 66 69 ISTS 0..#defi
11500 6e 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 ne SQLITE_ACCESS
11510 5f 52 45 41 44 57 52 49 54 45 20 31 20 20 20 2f _READWRITE 1 /
11520 2a 20 55 73 65 64 20 62 79 20 50 52 41 47 4d 41 * Used by PRAGMA
11530 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 temp_store_dire
11540 63 74 6f 72 79 20 2a 2f 0d 0a 23 64 65 66 69 6e ctory */..#defin
11550 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f e SQLITE_ACCESS_
11560 52 45 41 44 20 20 20 20 20 20 32 20 20 20 2f 2a READ 2 /*
11570 20 55 6e 75 73 65 64 20 2a 2f 0d 0a 0d 0a 2f 2a Unused */..../*
11580 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 46 ..** CAPI3REF: F
11590 6c 61 67 73 20 66 6f 72 20 74 68 65 20 78 53 68 lags for the xSh
115a0 6d 4c 6f 63 6b 20 56 46 53 20 6d 65 74 68 6f 64 mLock VFS method
115b0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 69 ..**..** These i
115c0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 nteger constants
115d0 20 64 65 66 69 6e 65 20 74 68 65 20 76 61 72 69 define the vari
115e0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 ous locking oper
115f0 61 74 69 6f 6e 73 0d 0a 2a 2a 20 61 6c 6c 6f 77 ations..** allow
11600 65 64 20 62 79 20 74 68 65 20 78 53 68 6d 4c 6f ed by the xShmLo
11610 63 6b 20 6d 65 74 68 6f 64 20 6f 66 20 5b 73 71 ck method of [sq
11620 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
11630 5d 2e 20 20 54 68 65 0d 0a 2a 2a 20 66 6f 6c 6c ]. The..** foll
11640 6f 77 69 6e 67 20 61 72 65 20 74 68 65 20 6f 6e owing are the on
11650 6c 79 20 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 ly legal combina
11660 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 20 74 tions of flags t
11670 6f 20 74 68 65 0d 0a 2a 2a 20 78 53 68 6d 4c 6f o the..** xShmLo
11680 63 6b 20 6d 65 74 68 6f 64 3a 0d 0a 2a 2a 0d 0a ck method:..**..
11690 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e ** <ul>..** <li>
116a0 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 SQLITE_SHM_LOC
116b0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 K | SQLITE_SHM_S
116c0 48 41 52 45 44 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 HARED..** <li>
116d0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 SQLITE_SHM_LOCK
116e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 | SQLITE_SHM_EXC
116f0 4c 55 53 49 56 45 0d 0a 2a 2a 20 3c 6c 69 3e 20 LUSIVE..** <li>
11700 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f SQLITE_SHM_UNLO
11710 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f CK | SQLITE_SHM_
11720 53 48 41 52 45 44 0d 0a 2a 2a 20 3c 6c 69 3e 20 SHARED..** <li>
11730 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f SQLITE_SHM_UNLO
11740 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f CK | SQLITE_SHM_
11750 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 3c 2f EXCLUSIVE..** </
11760 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e ul>..**..** When
11770 20 75 6e 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20 unlocking, the
11780 73 61 6d 65 20 53 48 41 52 45 44 20 6f 72 20 45 same SHARED or E
11790 58 43 4c 55 53 49 56 45 20 66 6c 61 67 20 6d 75 XCLUSIVE flag mu
117a0 73 74 20 62 65 20 73 75 70 70 6c 69 65 64 20 61 st be supplied a
117b0 73 0d 0a 2a 2a 20 77 61 73 20 67 69 76 65 6e 20 s..** was given
117c0 6e 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e no the correspon
117d0 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 0d 0a 2a 2a ding lock. ..**
117e0 0d 0a 2a 2a 20 54 68 65 20 78 53 68 6d 4c 6f 63 ..** The xShmLoc
117f0 6b 20 6d 65 74 68 6f 64 20 63 61 6e 20 74 72 61 k method can tra
11800 6e 73 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 nsition between
11810 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 53 48 41 unlocked and SHA
11820 52 45 44 20 6f 72 0d 0a 2a 2a 20 62 65 74 77 65 RED or..** betwe
11830 65 6e 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 en unlocked and
11840 45 58 43 4c 55 53 49 56 45 2e 20 20 49 74 20 63 EXCLUSIVE. It c
11850 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e annot transition
11860 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 44 0d between SHARED.
11870 0a 2a 2a 20 61 6e 64 20 45 58 43 4c 55 53 49 56 .** and EXCLUSIV
11880 45 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 E...*/..#define
11890 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 SQLITE_SHM_UNLOC
118a0 4b 20 20 20 20 20 20 20 31 0d 0a 23 64 65 66 69 K 1..#defi
118b0 6e 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f ne SQLITE_SHM_LO
118c0 43 4b 20 20 20 20 20 20 20 20 20 32 0d 0a 23 64 CK 2..#d
118d0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 48 4d efine SQLITE_SHM
118e0 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 34 0d _SHARED 4.
118f0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
11900 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 20 20 20 SHM_EXCLUSIVE
11910 20 38 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 8..../*..** CAP
11920 49 33 52 45 46 3a 20 4d 61 78 69 6d 75 6d 20 78 I3REF: Maximum x
11930 53 68 6d 4c 6f 63 6b 20 69 6e 64 65 78 0d 0a 2a ShmLock index..*
11940 2a 0d 0a 2a 2a 20 54 68 65 20 78 53 68 6d 4c 6f *..** The xShmLo
11950 63 6b 20 6d 65 74 68 6f 64 20 6f 6e 20 5b 73 71 ck method on [sq
11960 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
11970 5d 20 6d 61 79 20 75 73 65 20 76 61 6c 75 65 73 ] may use values
11980 0d 0a 2a 2a 20 62 65 74 77 65 65 6e 20 30 20 61 ..** between 0 a
11990 6e 64 20 74 68 69 73 20 75 70 70 65 72 20 62 6f nd this upper bo
119a0 75 6e 64 20 61 73 20 69 74 73 20 22 6f 66 66 73 und as its "offs
119b0 65 74 22 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a et" argument...*
119c0 2a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 * The SQLite cor
119d0 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 74 74 e will never att
119e0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 empt to acquire
119f0 6f 72 20 72 65 6c 65 61 73 65 20 61 0d 0a 2a 2a or release a..**
11a00 20 6c 6f 63 6b 20 6f 75 74 73 69 64 65 20 6f 66 lock outside of
11a10 20 74 68 69 73 20 72 61 6e 67 65 0d 0a 2a 2f 0d this range..*/.
11a20 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
11a30 53 48 4d 5f 4e 4c 4f 43 4b 20 20 20 20 20 20 20 SHM_NLOCK
11a40 20 38 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 8....../*..** C
11a50 41 50 49 33 52 45 46 3a 20 49 6e 69 74 69 61 6c API3REF: Initial
11a60 69 7a 65 20 54 68 65 20 53 51 4c 69 74 65 20 4c ize The SQLite L
11a70 69 62 72 61 72 79 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ibrary..**..** ^
11a80 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 The sqlite3_init
11a90 69 61 6c 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 ialize() routine
11aa0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 initializes the
11ab0 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 6c 69 62 72 ..** SQLite libr
11ac0 61 72 79 2e 20 20 5e 54 68 65 20 73 71 6c 69 74 ary. ^The sqlit
11ad0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 72 6f e3_shutdown() ro
11ae0 75 74 69 6e 65 0d 0a 2a 2a 20 64 65 61 6c 6c 6f utine..** deallo
11af0 63 61 74 65 73 20 61 6e 79 20 72 65 73 6f 75 72 cates any resour
11b00 63 65 73 20 74 68 61 74 20 77 65 72 65 20 61 6c ces that were al
11b10 6c 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 located by sqlit
11b20 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e e3_initialize().
11b30 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 ..** These routi
11b40 6e 65 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 nes are designed
11b50 20 74 6f 20 61 69 64 20 69 6e 20 70 72 6f 63 65 to aid in proce
11b60 73 73 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ss initializatio
11b70 6e 20 61 6e 64 0d 0a 2a 2a 20 73 68 75 74 64 6f n and..** shutdo
11b80 77 6e 20 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 wn on embedded s
11b90 79 73 74 65 6d 73 2e 20 20 57 6f 72 6b 73 74 61 ystems. Worksta
11ba0 74 69 6f 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e tion application
11bb0 73 20 75 73 69 6e 67 0d 0a 2a 2a 20 53 51 4c 69 s using..** SQLi
11bc0 74 65 20 6e 6f 72 6d 61 6c 6c 79 20 64 6f 20 6e te normally do n
11bd0 6f 74 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b ot need to invok
11be0 65 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 e either of thes
11bf0 65 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a 2a 0d e routines...**.
11c00 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 73 71 .** A call to sq
11c10 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 lite3_initialize
11c20 28 29 20 69 73 20 61 6e 20 22 65 66 66 65 63 74 () is an "effect
11c30 69 76 65 22 20 63 61 6c 6c 20 69 66 20 69 74 20 ive" call if it
11c40 69 73 0d 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 is..** the first
11c50 20 74 69 6d 65 20 73 71 6c 69 74 65 33 5f 69 6e time sqlite3_in
11c60 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 69 6e itialize() is in
11c70 76 6f 6b 65 64 20 64 75 72 69 6e 67 20 74 68 65 voked during the
11c80 20 6c 69 66 65 74 69 6d 65 20 6f 66 0d 0a 2a 2a lifetime of..**
11c90 20 74 68 65 20 70 72 6f 63 65 73 73 2c 20 6f 72 the process, or
11ca0 20 69 66 20 69 74 20 69 73 20 74 68 65 20 66 69 if it is the fi
11cb0 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 rst time sqlite3
11cc0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 _initialize() is
11cd0 20 69 6e 76 6f 6b 65 64 0d 0a 2a 2a 20 66 6f 6c invoked..** fol
11ce0 6c 6f 77 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f lowing a call to
11cf0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 sqlite3_shutdow
11d00 6e 28 29 2e 20 20 5e 28 4f 6e 6c 79 20 61 6e 20 n(). ^(Only an
11d10 65 66 66 65 63 74 69 76 65 20 63 61 6c 6c 0d 0a effective call..
11d20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e ** of sqlite3_in
11d30 69 74 69 61 6c 69 7a 65 28 29 20 64 6f 65 73 20 itialize() does
11d40 61 6e 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 any initializati
11d50 6f 6e 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 63 on. All other c
11d60 61 6c 6c 73 0d 0a 2a 2a 20 61 72 65 20 68 61 72 alls..** are har
11d70 6d 6c 65 73 73 20 6e 6f 2d 6f 70 73 2e 29 5e 0d mless no-ops.)^.
11d80 0a 2a 2a 0d 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 .**..** A call t
11d90 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f o sqlite3_shutdo
11da0 77 6e 28 29 20 69 73 20 61 6e 20 22 65 66 66 65 wn() is an "effe
11db0 63 74 69 76 65 22 20 63 61 6c 6c 20 69 66 20 69 ctive" call if i
11dc0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 0d 0a t is the first..
11dd0 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 ** call to sqlit
11de0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 73 69 e3_shutdown() si
11df0 6e 63 65 20 74 68 65 20 6c 61 73 74 20 73 71 6c nce the last sql
11e00 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 ite3_initialize(
11e10 29 2e 20 20 5e 28 4f 6e 6c 79 0d 0a 2a 2a 20 61 ). ^(Only..** a
11e20 6e 20 65 66 66 65 63 74 69 76 65 20 63 61 6c 6c n effective call
11e30 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 to sqlite3_shut
11e40 64 6f 77 6e 28 29 20 64 6f 65 73 20 61 6e 79 20 down() does any
11e50 64 65 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e deinitialization
11e60 2e 0d 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 ...** All other
11e70 76 61 6c 69 64 20 63 61 6c 6c 73 20 74 6f 20 73 valid calls to s
11e80 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 qlite3_shutdown(
11e90 29 20 61 72 65 20 68 61 72 6d 6c 65 73 73 20 6e ) are harmless n
11ea0 6f 2d 6f 70 73 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a o-ops.)^..**..**
11eb0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 The sqlite3_ini
11ec0 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 tialize() interf
11ed0 61 63 65 20 69 73 20 74 68 72 65 61 64 73 61 66 ace is threadsaf
11ee0 65 2c 20 62 75 74 20 73 71 6c 69 74 65 33 5f 73 e, but sqlite3_s
11ef0 68 75 74 64 6f 77 6e 28 29 0d 0a 2a 2a 20 69 73 hutdown()..** is
11f00 20 6e 6f 74 2e 20 20 54 68 65 20 73 71 6c 69 74 not. The sqlit
11f10 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 69 6e e3_shutdown() in
11f20 74 65 72 66 61 63 65 20 6d 75 73 74 20 6f 6e 6c terface must onl
11f30 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d y be called from
11f40 20 61 0d 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 a..** single th
11f50 72 65 61 64 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 read. All open
11f60 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
11f70 74 69 6f 6e 73 5d 20 6d 75 73 74 20 62 65 20 63 tions] must be c
11f80 6c 6f 73 65 64 20 61 6e 64 20 61 6c 6c 0d 0a 2a losed and all..*
11f90 2a 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 72 * other SQLite r
11fa0 65 73 6f 75 72 63 65 73 20 6d 75 73 74 20 62 65 esources must be
11fb0 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 70 72 69 deallocated pri
11fc0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 0d 0a or to invoking..
11fd0 2a 2a 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 ** sqlite3_shutd
11fe0 6f 77 6e 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 own()...**..** A
11ff0 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 mong other thing
12000 73 2c 20 5e 73 71 6c 69 74 65 33 5f 69 6e 69 74 s, ^sqlite3_init
12010 69 61 6c 69 7a 65 28 29 20 77 69 6c 6c 20 69 6e ialize() will in
12020 76 6f 6b 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 voke..** sqlite3
12030 5f 6f 73 5f 69 6e 69 74 28 29 2e 20 20 53 69 6d _os_init(). Sim
12040 69 6c 61 72 6c 79 2c 20 5e 73 71 6c 69 74 65 33 ilarly, ^sqlite3
12050 5f 73 68 75 74 64 6f 77 6e 28 29 0d 0a 2a 2a 20 _shutdown()..**
12060 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 73 71 6c 69 will invoke sqli
12070 74 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0d 0a 2a te3_os_end()...*
12080 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 *..** ^The sqlit
12090 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 e3_initialize()
120a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 routine returns
120b0 5b 53 51 4c 49 54 45 5f 4f 4b 5d 20 6f 6e 20 73 [SQLITE_OK] on s
120c0 75 63 63 65 73 73 2e 0d 0a 2a 2a 20 5e 49 66 20 uccess...** ^If
120d0 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 2c for some reason,
120e0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
120f0 69 7a 65 28 29 20 69 73 20 75 6e 61 62 6c 65 20 ize() is unable
12100 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0d 0a 2a to initialize..*
12110 2a 20 74 68 65 20 6c 69 62 72 61 72 79 20 28 70 * the library (p
12120 65 72 68 61 70 73 20 69 74 20 69 73 20 75 6e 61 erhaps it is una
12130 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 ble to allocate
12140 61 20 6e 65 65 64 65 64 20 72 65 73 6f 75 72 63 a needed resourc
12150 65 20 73 75 63 68 0d 0a 2a 2a 20 61 73 20 61 20 e such..** as a
12160 6d 75 74 65 78 29 20 69 74 20 72 65 74 75 72 6e mutex) it return
12170 73 20 61 6e 20 5b 65 72 72 6f 72 20 63 6f 64 65 s an [error code
12180 5d 20 6f 74 68 65 72 20 74 68 61 6e 20 5b 53 51 ] other than [SQ
12190 4c 49 54 45 5f 4f 4b 5d 2e 0d 0a 2a 2a 0d 0a 2a LITE_OK]...**..*
121a0 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 69 * ^The sqlite3_i
121b0 6e 69 74 69 61 6c 69 7a 65 28 29 20 72 6f 75 74 nitialize() rout
121c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 6e ine is called in
121d0 74 65 72 6e 61 6c 6c 79 20 62 79 20 6d 61 6e 79 ternally by many
121e0 20 6f 74 68 65 72 0d 0a 2a 2a 20 53 51 4c 69 74 other..** SQLit
121f0 65 20 69 6e 74 65 72 66 61 63 65 73 20 73 6f 20 e interfaces so
12200 74 68 61 74 20 61 6e 20 61 70 70 6c 69 63 61 74 that an applicat
12210 69 6f 6e 20 75 73 75 61 6c 6c 79 20 64 6f 65 73 ion usually does
12220 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0d 0a 2a 2a not need to..**
12230 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f invoke sqlite3_
12240 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 64 69 72 initialize() dir
12250 65 63 74 6c 79 2e 20 20 46 6f 72 20 65 78 61 6d ectly. For exam
12260 70 6c 65 2c 20 5b 73 71 6c 69 74 65 33 5f 6f 70 ple, [sqlite3_op
12270 65 6e 28 29 5d 0d 0a 2a 2a 20 63 61 6c 6c 73 20 en()]..** calls
12280 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 sqlite3_initiali
12290 7a 65 28 29 20 73 6f 20 74 68 65 20 53 51 4c 69 ze() so the SQLi
122a0 74 65 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 te library will
122b0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 be automatically
122c0 0d 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 ..** initialized
122d0 20 77 68 65 6e 20 5b 73 71 6c 69 74 65 33 5f 6f when [sqlite3_o
122e0 70 65 6e 28 29 5d 20 69 73 20 63 61 6c 6c 65 64 pen()] is called
122f0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 if it has not b
12300 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 0d 0a 2a e initialized..*
12310 2a 20 61 6c 72 65 61 64 79 2e 20 20 5e 48 6f 77 * already. ^How
12320 65 76 65 72 2c 20 69 66 20 53 51 4c 69 74 65 20 ever, if SQLite
12330 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 is compiled with
12340 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 4f 4d 49 the [SQLITE_OMI
12350 54 5f 41 55 54 4f 49 4e 49 54 5d 0d 0a 2a 2a 20 T_AUTOINIT]..**
12360 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 compile-time opt
12370 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 75 ion, then the au
12380 74 6f 6d 61 74 69 63 20 63 61 6c 6c 73 20 74 6f tomatic calls to
12390 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
123a0 69 7a 65 28 29 0d 0a 2a 2a 20 61 72 65 20 6f 6d ize()..** are om
123b0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 61 70 itted and the ap
123c0 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74 20 63 plication must c
123d0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 all sqlite3_init
123e0 69 61 6c 69 7a 65 28 29 20 64 69 72 65 63 74 6c ialize() directl
123f0 79 0d 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 y..** prior to u
12400 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 53 sing any other S
12410 51 4c 69 74 65 20 69 6e 74 65 72 66 61 63 65 2e QLite interface.
12420 20 20 46 6f 72 20 6d 61 78 69 6d 75 6d 20 70 6f For maximum po
12430 72 74 61 62 69 6c 69 74 79 2c 0d 0a 2a 2a 20 69 rtability,..** i
12440 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 t is recommended
12450 20 74 68 61 74 20 61 70 70 6c 69 63 61 74 69 6f that applicatio
12460 6e 73 20 61 6c 77 61 79 73 20 69 6e 76 6f 6b 65 ns always invoke
12470 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
12480 69 7a 65 28 29 0d 0a 2a 2a 20 64 69 72 65 63 74 ize()..** direct
12490 6c 79 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e ly prior to usin
124a0 67 20 61 6e 79 20 6f 74 68 65 72 20 53 51 4c 69 g any other SQLi
124b0 74 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 46 te interface. F
124c0 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 0d 0a uture releases..
124d0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 6d 61 79 ** of SQLite may
124e0 20 72 65 71 75 69 72 65 20 74 68 69 73 2e 20 20 require this.
124f0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 In other words,
12500 74 68 65 20 62 65 68 61 76 69 6f 72 20 65 78 68 the behavior exh
12510 69 62 69 74 65 64 0d 0a 2a 2a 20 77 68 65 6e 20 ibited..** when
12520 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c SQLite is compil
12530 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f ed with [SQLITE_
12540 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 5d 20 6d OMIT_AUTOINIT] m
12550 69 67 68 74 20 62 65 63 6f 6d 65 20 74 68 65 0d ight become the.
12560 0a 2a 2a 20 64 65 66 61 75 6c 74 20 62 65 68 61 .** default beha
12570 76 69 6f 72 20 69 6e 20 73 6f 6d 65 20 66 75 74 vior in some fut
12580 75 72 65 20 72 65 6c 65 61 73 65 20 6f 66 20 53 ure release of S
12590 51 4c 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 QLite...**..** T
125a0 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e he sqlite3_os_in
125b0 69 74 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 it() routine doe
125c0 73 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 s operating-syst
125d0 65 6d 20 73 70 65 63 69 66 69 63 0d 0a 2a 2a 20 em specific..**
125e0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f initialization o
125f0 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 f the SQLite lib
12600 72 61 72 79 2e 20 20 54 68 65 20 73 71 6c 69 74 rary. The sqlit
12610 65 33 5f 6f 73 5f 65 6e 64 28 29 0d 0a 2a 2a 20 e3_os_end()..**
12620 72 6f 75 74 69 6e 65 20 75 6e 64 6f 65 73 20 74 routine undoes t
12630 68 65 20 65 66 66 65 63 74 20 6f 66 20 73 71 6c he effect of sql
12640 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 2e 20 ite3_os_init().
12650 20 54 79 70 69 63 61 6c 20 74 61 73 6b 73 0d 0a Typical tasks..
12660 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 ** performed by
12670 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 these routines i
12680 6e 63 6c 75 64 65 20 61 6c 6c 6f 63 61 74 69 6f nclude allocatio
12690 6e 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f n or deallocatio
126a0 6e 0d 0a 2a 2a 20 6f 66 20 73 74 61 74 69 63 20 n..** of static
126b0 72 65 73 6f 75 72 63 65 73 2c 20 69 6e 69 74 69 resources, initi
126c0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 67 6c 6f alization of glo
126d0 62 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 0d 0a bal variables,..
126e0 2a 2a 20 73 65 74 74 69 6e 67 20 75 70 20 61 20 ** setting up a
126f0 64 65 66 61 75 6c 74 20 5b 73 71 6c 69 74 65 33 default [sqlite3
12700 5f 76 66 73 5d 20 6d 6f 64 75 6c 65 2c 20 6f 72 _vfs] module, or
12710 20 73 65 74 74 69 6e 67 20 75 70 0d 0a 2a 2a 20 setting up..**
12720 61 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 69 67 a default config
12730 75 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 5b 73 uration using [s
12740 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 5d qlite3_config()]
12750 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 70 ...**..** The ap
12760 70 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 plication should
12770 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 65 69 never invoke ei
12780 74 68 65 72 20 73 71 6c 69 74 65 33 5f 6f 73 5f ther sqlite3_os_
12790 69 6e 69 74 28 29 0d 0a 2a 2a 20 6f 72 20 73 71 init()..** or sq
127a0 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 64 lite3_os_end() d
127b0 69 72 65 63 74 6c 79 2e 20 20 54 68 65 20 61 70 irectly. The ap
127c0 70 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 plication should
127d0 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 0d 0a 2a 2a only invoke..**
127e0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
127f0 69 7a 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 ize() and sqlite
12800 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 20 54 3_shutdown(). T
12810 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e he sqlite3_os_in
12820 69 74 28 29 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 it()..** interfa
12830 63 65 20 69 73 20 63 61 6c 6c 65 64 20 61 75 74 ce is called aut
12840 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 73 71 omatically by sq
12850 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 lite3_initialize
12860 28 29 20 61 6e 64 0d 0a 2a 2a 20 73 71 6c 69 74 () and..** sqlit
12870 65 33 5f 6f 73 5f 65 6e 64 28 29 20 69 73 20 63 e3_os_end() is c
12880 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 alled by sqlite3
12890 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 20 41 70 _shutdown(). Ap
128a0 70 72 6f 70 72 69 61 74 65 0d 0a 2a 2a 20 69 6d propriate..** im
128b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f plementations fo
128c0 72 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 r sqlite3_os_ini
128d0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f t() and sqlite3_
128e0 6f 73 5f 65 6e 64 28 29 0d 0a 2a 2a 20 61 72 65 os_end()..** are
128f0 20 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 built into SQLi
12900 74 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6f te when it is co
12910 6d 70 69 6c 65 64 20 66 6f 72 20 55 6e 69 78 2c mpiled for Unix,
12920 20 57 69 6e 64 6f 77 73 2c 20 6f 72 20 4f 53 2f Windows, or OS/
12930 32 2e 0d 0a 2a 2a 20 57 68 65 6e 20 5b 63 75 73 2...** When [cus
12940 74 6f 6d 20 62 75 69 6c 64 73 20 7c 20 62 75 69 tom builds | bui
12950 6c 74 20 66 6f 72 20 6f 74 68 65 72 20 70 6c 61 lt for other pla
12960 74 66 6f 72 6d 73 5d 0d 0a 2a 2a 20 28 75 73 69 tforms]..** (usi
12970 6e 67 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 4f ng the [SQLITE_O
12980 53 5f 4f 54 48 45 52 3d 31 5d 20 63 6f 6d 70 69 S_OTHER=1] compi
12990 6c 65 2d 74 69 6d 65 0d 0a 2a 2a 20 6f 70 74 69 le-time..** opti
129a0 6f 6e 29 20 74 68 65 20 61 70 70 6c 69 63 61 74 on) the applicat
129b0 69 6f 6e 20 6d 75 73 74 20 73 75 70 70 6c 79 20 ion must supply
129c0 61 20 73 75 69 74 61 62 6c 65 20 69 6d 70 6c 65 a suitable imple
129d0 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0d 0a 2a mentation for..*
129e0 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 * sqlite3_os_ini
129f0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f t() and sqlite3_
12a00 6f 73 5f 65 6e 64 28 29 2e 20 20 41 6e 20 61 70 os_end(). An ap
12a10 70 6c 69 63 61 74 69 6f 6e 2d 73 75 70 70 6c 69 plication-suppli
12a20 65 64 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 ed..** implement
12a30 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 ation of sqlite3
12a40 5f 6f 73 5f 69 6e 69 74 28 29 20 6f 72 20 73 71 _os_init() or sq
12a50 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 0d 0a lite3_os_end()..
12a60 2a 2a 20 6d 75 73 74 20 72 65 74 75 72 6e 20 5b ** must return [
12a70 53 51 4c 49 54 45 5f 4f 4b 5d 20 6f 6e 20 73 75 SQLITE_OK] on su
12a80 63 63 65 73 73 20 61 6e 64 20 73 6f 6d 65 20 6f ccess and some o
12a90 74 68 65 72 20 5b 65 72 72 6f 72 20 63 6f 64 65 ther [error code
12aa0 5d 20 75 70 6f 6e 0d 0a 2a 2a 20 66 61 69 6c 75 ] upon..** failu
12ab0 72 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f re...*/..SQLITE_
12ac0 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
12ad0 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 initialize(void)
12ae0 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e ;..SQLITE_API in
12af0 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f t sqlite3_shutdo
12b00 77 6e 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 wn(void);..SQLIT
12b10 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
12b20 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 3b 3_os_init(void);
12b30 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
12b40 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 sqlite3_os_end(
12b50 76 6f 69 64 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a void);..../*..**
12b60 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 66 69 CAPI3REF: Confi
12b70 67 75 72 69 6e 67 20 54 68 65 20 53 51 4c 69 74 guring The SQLit
12b80 65 20 4c 69 62 72 61 72 79 0d 0a 2a 2a 0d 0a 2a e Library..**..*
12b90 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6f * The sqlite3_co
12ba0 6e 66 69 67 28 29 20 69 6e 74 65 72 66 61 63 65 nfig() interface
12bb0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 is used to make
12bc0 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 global configur
12bd0 61 74 69 6f 6e 0d 0a 2a 2a 20 63 68 61 6e 67 65 ation..** change
12be0 73 20 74 6f 20 53 51 4c 69 74 65 20 69 6e 20 6f s to SQLite in o
12bf0 72 64 65 72 20 74 6f 20 74 75 6e 65 20 53 51 4c rder to tune SQL
12c00 69 74 65 20 74 6f 20 74 68 65 20 73 70 65 63 69 ite to the speci
12c10 66 69 63 20 6e 65 65 64 73 20 6f 66 0d 0a 2a 2a fic needs of..**
12c20 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
12c30 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 . The default c
12c40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 onfiguration is
12c50 72 65 63 6f 6d 6d 65 6e 64 65 64 20 66 6f 72 20 recommended for
12c60 6d 6f 73 74 0d 0a 2a 2a 20 61 70 70 6c 69 63 61 most..** applica
12c70 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 74 68 69 tions and so thi
12c80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 s routine is usu
12c90 61 6c 6c 79 20 6e 6f 74 20 6e 65 63 65 73 73 61 ally not necessa
12ca0 72 79 2e 20 20 49 74 20 69 73 0d 0a 2a 2a 20 70 ry. It is..** p
12cb0 72 6f 76 69 64 65 64 20 74 6f 20 73 75 70 70 6f rovided to suppo
12cc0 72 74 20 72 61 72 65 20 61 70 70 6c 69 63 61 74 rt rare applicat
12cd0 69 6f 6e 73 20 77 69 74 68 20 75 6e 75 73 75 61 ions with unusua
12ce0 6c 20 6e 65 65 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a l needs...**..**
12cf0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e The sqlite3_con
12d00 66 69 67 28 29 20 69 6e 74 65 72 66 61 63 65 20 fig() interface
12d10 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 is not threadsaf
12d20 65 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74 e. The applicat
12d30 69 6f 6e 0d 0a 2a 2a 20 6d 75 73 74 20 69 6e 73 ion..** must ins
12d40 75 72 65 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 ure that no othe
12d50 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 61 r SQLite interfa
12d60 63 65 73 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 ces are invoked
12d70 62 79 20 6f 74 68 65 72 0d 0a 2a 2a 20 74 68 72 by other..** thr
12d80 65 61 64 73 20 77 68 69 6c 65 20 73 71 6c 69 74 eads while sqlit
12d90 65 33 5f 63 6f 6e 66 69 67 28 29 20 69 73 20 72 e3_config() is r
12da0 75 6e 6e 69 6e 67 2e 20 20 46 75 72 74 68 65 72 unning. Further
12db0 6d 6f 72 65 2c 20 73 71 6c 69 74 65 33 5f 63 6f more, sqlite3_co
12dc0 6e 66 69 67 28 29 0d 0a 2a 2a 20 6d 61 79 20 6f nfig()..** may o
12dd0 6e 6c 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 nly be invoked p
12de0 72 69 6f 72 20 74 6f 20 6c 69 62 72 61 72 79 20 rior to library
12df0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 initialization u
12e00 73 69 6e 67 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 sing..** [sqlite
12e10 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 5d 20 3_initialize()]
12e20 6f 72 20 61 66 74 65 72 20 73 68 75 74 64 6f 77 or after shutdow
12e30 6e 20 62 79 20 5b 73 71 6c 69 74 65 33 5f 73 68 n by [sqlite3_sh
12e40 75 74 64 6f 77 6e 28 29 5d 2e 0d 0a 2a 2a 20 5e utdown()]...** ^
12e50 49 66 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 If sqlite3_confi
12e60 67 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 66 g() is called af
12e70 74 65 72 20 5b 73 71 6c 69 74 65 33 5f 69 6e 69 ter [sqlite3_ini
12e80 74 69 61 6c 69 7a 65 28 29 5d 20 61 6e 64 20 62 tialize()] and b
12e90 65 66 6f 72 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 efore..** [sqlit
12ea0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 5d 20 74 e3_shutdown()] t
12eb0 68 65 6e 20 69 74 20 77 69 6c 6c 20 72 65 74 75 hen it will retu
12ec0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 rn SQLITE_MISUSE
12ed0 2e 0d 0a 2a 2a 20 4e 6f 74 65 2c 20 68 6f 77 65 ...** Note, howe
12ee0 76 65 72 2c 20 74 68 61 74 20 5e 73 71 6c 69 74 ver, that ^sqlit
12ef0 65 33 5f 63 6f 6e 66 69 67 28 29 20 63 61 6e 20 e3_config() can
12f00 62 65 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 be called as par
12f10 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 69 6d 70 t of the..** imp
12f20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 lementation of a
12f30 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 n application-de
12f40 66 69 6e 65 64 20 5b 73 71 6c 69 74 65 33 5f 6f fined [sqlite3_o
12f50 73 5f 69 6e 69 74 28 29 5d 2e 0d 0a 2a 2a 0d 0a s_init()]...**..
12f60 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 ** The first arg
12f70 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 ument to sqlite3
12f80 5f 63 6f 6e 66 69 67 28 29 20 69 73 20 61 6e 20 _config() is an
12f90 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 5b 63 6f 6e integer..** [con
12fa0 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f figuration optio
12fb0 6e 5d 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e n] that determin
12fc0 65 73 0d 0a 2a 2a 20 77 68 61 74 20 70 72 6f 70 es..** what prop
12fd0 65 72 74 79 20 6f 66 20 53 51 4c 69 74 65 20 69 erty of SQLite i
12fe0 73 20 74 6f 20 62 65 20 63 6f 6e 66 69 67 75 72 s to be configur
12ff0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 ed. Subsequent
13000 61 72 67 75 6d 65 6e 74 73 0d 0a 2a 2a 20 76 61 arguments..** va
13010 72 79 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 ry depending on
13020 74 68 65 20 5b 63 6f 6e 66 69 67 75 72 61 74 69 the [configurati
13030 6f 6e 20 6f 70 74 69 6f 6e 5d 0d 0a 2a 2a 20 69 on option]..** i
13040 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 n the first argu
13050 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 57 ment...**..** ^W
13060 68 65 6e 20 61 20 63 6f 6e 66 69 67 75 72 61 74 hen a configurat
13070 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 73 20 73 65 ion option is se
13080 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 t, sqlite3_confi
13090 67 28 29 20 72 65 74 75 72 6e 73 20 5b 53 51 4c g() returns [SQL
130a0 49 54 45 5f 4f 4b 5d 2e 0d 0a 2a 2a 20 5e 49 66 ITE_OK]...** ^If
130b0 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 the option is u
130c0 6e 6b 6e 6f 77 6e 20 6f 72 20 53 51 4c 69 74 65 nknown or SQLite
130d0 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 73 65 is unable to se
130e0 74 20 74 68 65 20 6f 70 74 69 6f 6e 0d 0a 2a 2a t the option..**
130f0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 then this routi
13100 6e 65 20 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e ne returns a non
13110 2d 7a 65 72 6f 20 5b 65 72 72 6f 72 20 63 6f 64 -zero [error cod
13120 65 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f e]...*/..SQLITE_
13130 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
13140 63 6f 6e 66 69 67 28 69 6e 74 2c 20 2e 2e 2e 29 config(int, ...)
13150 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
13160 33 52 45 46 3a 20 43 6f 6e 66 69 67 75 72 65 20 3REF: Configure
13170 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
13180 69 6f 6e 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ions..**..** The
13190 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 sqlite3_db_conf
131a0 69 67 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 ig() interface i
131b0 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 63 s used to make c
131c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 2a 2a onfiguration..**
131d0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 5b 64 changes to a [d
131e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
131f0 6f 6e 5d 2e 20 20 54 68 65 20 69 6e 74 65 72 66 on]. The interf
13200 61 63 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 ace is similar t
13210 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 o..** [sqlite3_c
13220 6f 6e 66 69 67 28 29 5d 20 65 78 63 65 70 74 20 onfig()] except
13230 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 that the changes
13240 20 61 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67 apply to a sing
13250 6c 65 0d 0a 2a 2a 20 5b 64 61 74 61 62 61 73 65 le..** [database
13260 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 28 73 70 connection] (sp
13270 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 66 ecified in the f
13280 69 72 73 74 20 61 72 67 75 6d 65 6e 74 29 2e 0d irst argument)..
13290 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 65 63 6f .**..** The seco
132a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 nd argument to s
132b0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 qlite3_db_config
132c0 28 44 2c 56 2c 2e 2e 2e 29 20 20 69 73 20 74 68 (D,V,...) is th
132d0 65 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 44 42 e..** [SQLITE_DB
132e0 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 CONFIG_LOOKASIDE
132f0 20 7c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e | configuration
13300 20 76 65 72 62 5d 20 2d 20 61 6e 20 69 6e 74 65 verb] - an inte
13310 67 65 72 20 63 6f 64 65 20 0d 0a 2a 2a 20 74 68 ger code ..** th
13320 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 68 61 at indicates wha
13330 74 20 61 73 70 65 63 74 20 6f 66 20 74 68 65 20 t aspect of the
13340 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
13350 74 69 6f 6e 5d 20 69 73 20 62 65 69 6e 67 20 63 tion] is being c
13360 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 2a 2a 20 53 onfigured...** S
13370 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 ubsequent argume
13380 6e 74 73 20 76 61 72 79 20 64 65 70 65 6e 64 69 nts vary dependi
13390 6e 67 20 6f 6e 20 74 68 65 20 63 6f 6e 66 69 67 ng on the config
133a0 75 72 61 74 69 6f 6e 20 76 65 72 62 2e 0d 0a 2a uration verb...*
133b0 2a 0d 0a 2a 2a 20 5e 43 61 6c 6c 73 20 74 6f 20 *..** ^Calls to
133c0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 sqlite3_db_confi
133d0 67 28 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 g() return SQLIT
133e0 45 5f 4f 4b 20 69 66 20 61 6e 64 20 6f 6e 6c 79 E_OK if and only
133f0 20 69 66 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c if..** the call
13400 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 73 is considered s
13410 75 63 63 65 73 73 66 75 6c 2e 0d 0a 2a 2f 0d 0a uccessful...*/..
13420 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
13430 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 qlite3_db_config
13440 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 20 6f (sqlite3*, int o
13450 70 2c 20 2e 2e 2e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a p, ...);..../*..
13460 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4d 65 6d ** CAPI3REF: Mem
13470 6f 72 79 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 52 ory Allocation R
13480 6f 75 74 69 6e 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 outines..**..**
13490 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 An instance of t
134a0 68 69 73 20 6f 62 6a 65 63 74 20 64 65 66 69 6e his object defin
134b0 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 es the interface
134c0 20 62 65 74 77 65 65 6e 20 53 51 4c 69 74 65 0d between SQLite.
134d0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 2d 6c 65 76 65 .** and low-leve
134e0 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 l memory allocat
134f0 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a ion routines...*
13500 2a 0d 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 *..** This objec
13510 74 20 69 73 20 75 73 65 64 20 69 6e 20 6f 6e 6c t is used in onl
13520 79 20 6f 6e 65 20 70 6c 61 63 65 20 69 6e 20 74 y one place in t
13530 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 he SQLite interf
13540 61 63 65 2e 0d 0a 2a 2a 20 41 20 70 6f 69 6e 74 ace...** A point
13550 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 er to an instanc
13560 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 e of this object
13570 20 69 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 is the argument
13580 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 to..** [sqlite3
13590 5f 63 6f 6e 66 69 67 28 29 5d 20 77 68 65 6e 20 _config()] when
135a0 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f the configuratio
135b0 6e 20 6f 70 74 69 6f 6e 20 69 73 0d 0a 2a 2a 20 n option is..**
135c0 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d [SQLITE_CONFIG_M
135d0 41 4c 4c 4f 43 5d 20 6f 72 20 5b 53 51 4c 49 54 ALLOC] or [SQLIT
135e0 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c E_CONFIG_GETMALL
135f0 4f 43 5d 2e 20 20 0d 0a 2a 2a 20 42 79 20 63 72 OC]. ..** By cr
13600 65 61 74 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e eating an instan
13610 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 ce of this objec
13620 74 0d 0a 2a 2a 20 61 6e 64 20 70 61 73 73 69 6e t..** and passin
13630 67 20 69 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 g it to [sqlite3
13640 5f 63 6f 6e 66 69 67 5d 28 5b 53 51 4c 49 54 45 _config]([SQLITE
13650 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 5d 29 _CONFIG_MALLOC])
13660 0d 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6e 66 ..** during conf
13670 69 67 75 72 61 74 69 6f 6e 2c 20 61 6e 20 61 70 iguration, an ap
13680 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e 20 73 70 plication can sp
13690 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 ecify an alterna
136a0 74 69 76 65 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 tive..** memory
136b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 allocation subsy
136c0 73 74 65 6d 20 66 6f 72 20 53 51 4c 69 74 65 20 stem for SQLite
136d0 74 6f 20 75 73 65 20 66 6f 72 20 61 6c 6c 20 6f to use for all o
136e0 66 20 69 74 73 0d 0a 2a 2a 20 64 79 6e 61 6d 69 f its..** dynami
136f0 63 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 2e 0d c memory needs..
13700 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 .**..** Note tha
13710 74 20 53 51 4c 69 74 65 20 63 6f 6d 65 73 20 77 t SQLite comes w
13720 69 74 68 20 73 65 76 65 72 61 6c 20 5b 62 75 69 ith several [bui
13730 6c 74 2d 69 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c lt-in memory all
13740 6f 63 61 74 6f 72 73 5d 0d 0a 2a 2a 20 74 68 61 ocators]..** tha
13750 74 20 61 72 65 20 70 65 72 66 65 63 74 6c 79 20 t are perfectly
13760 61 64 65 71 75 61 74 65 20 66 6f 72 20 74 68 65 adequate for the
13770 20 6f 76 65 72 77 68 65 6c 6d 69 6e 67 20 6d 61 overwhelming ma
13780 6a 6f 72 69 74 79 20 6f 66 20 61 70 70 6c 69 63 jority of applic
13790 61 74 69 6f 6e 73 0d 0a 2a 2a 20 61 6e 64 20 74 ations..** and t
137a0 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 hat this object
137b0 69 73 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 74 is only useful t
137c0 6f 20 61 20 74 69 6e 79 20 6d 69 6e 6f 72 69 74 o a tiny minorit
137d0 79 20 6f 66 20 61 70 70 6c 69 63 61 74 69 6f 6e y of application
137e0 73 0d 0a 2a 2a 20 77 69 74 68 20 73 70 65 63 69 s..** with speci
137f0 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 20 61 6c alized memory al
13800 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65 location require
13810 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 6f 62 6a ments. This obj
13820 65 63 74 20 69 73 0d 0a 2a 2a 20 61 6c 73 6f 20 ect is..** also
13830 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 used during test
13840 69 6e 67 20 6f 66 20 53 51 4c 69 74 65 20 69 6e ing of SQLite in
13850 20 6f 72 64 65 72 20 74 6f 20 73 70 65 63 69 66 order to specif
13860 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 y an alternative
13870 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f ..** memory allo
13880 63 61 74 6f 72 20 74 68 61 74 20 73 69 6d 75 6c cator that simul
13890 61 74 65 73 20 6d 65 6d 6f 72 79 20 6f 75 74 2d ates memory out-
138a0 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 of-memory condit
138b0 69 6f 6e 73 20 69 6e 0d 0a 2a 2a 20 6f 72 64 65 ions in..** orde
138c0 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 r to verify that
138d0 20 53 51 4c 69 74 65 20 72 65 63 6f 76 65 72 73 SQLite recovers
138e0 20 67 72 61 63 65 66 75 6c 6c 79 20 66 72 6f 6d gracefully from
138f0 20 73 75 63 68 0d 0a 2a 2a 20 63 6f 6e 64 69 74 such..** condit
13900 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 ions...**..** Th
13910 65 20 78 4d 61 6c 6c 6f 63 2c 20 78 52 65 61 6c e xMalloc, xReal
13920 6c 6f 63 2c 20 61 6e 64 20 78 46 72 65 65 20 6d loc, and xFree m
13930 65 74 68 6f 64 73 20 6d 75 73 74 20 77 6f 72 6b ethods must work
13940 20 6c 69 6b 65 20 74 68 65 0d 0a 2a 2a 20 6d 61 like the..** ma
13950 6c 6c 6f 63 28 29 2c 20 72 65 61 6c 6c 6f 63 28 lloc(), realloc(
13960 29 20 61 6e 64 20 66 72 65 65 28 29 20 66 75 6e ) and free() fun
13970 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 ctions from the
13980 73 74 61 6e 64 61 72 64 20 43 20 6c 69 62 72 61 standard C libra
13990 72 79 2e 0d 0a 2a 2a 20 5e 53 51 4c 69 74 65 20 ry...** ^SQLite
139a0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 guarantees that
139b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
139c0 65 6e 74 20 74 6f 0d 0a 2a 2a 20 78 52 65 61 6c ent to..** xReal
139d0 6c 6f 63 20 69 73 20 61 6c 77 61 79 73 20 61 20 loc is always a
139e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 value returned b
139f0 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 y a prior call t
13a00 6f 20 78 52 6f 75 6e 64 75 70 2e 0d 0a 2a 2a 0d o xRoundup...**.
13a10 0a 2a 2a 20 78 53 69 7a 65 20 73 68 6f 75 6c 64 .** xSize should
13a20 20 72 65 74 75 72 6e 20 74 68 65 20 61 6c 6c 6f return the allo
13a30 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 20 cated size of a
13a40 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
13a50 6e 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 n..** previously
13a60 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 obtained from x
13a70 4d 61 6c 6c 6f 63 20 6f 72 20 78 52 65 61 6c 6c Malloc or xReall
13a80 6f 63 2e 20 20 54 68 65 20 61 6c 6c 6f 63 61 74 oc. The allocat
13a90 65 64 20 73 69 7a 65 0d 0a 2a 2a 20 69 73 20 61 ed size..** is a
13aa0 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 61 lways at least a
13ab0 73 20 62 69 67 20 61 73 20 74 68 65 20 72 65 71 s big as the req
13ac0 75 65 73 74 65 64 20 73 69 7a 65 20 62 75 74 20 uested size but
13ad0 6d 61 79 20 62 65 20 6c 61 72 67 65 72 2e 0d 0a may be larger...
13ae0 2a 2a 0d 0a 2a 2a 20 54 68 65 20 78 52 6f 75 6e **..** The xRoun
13af0 64 75 70 20 6d 65 74 68 6f 64 20 72 65 74 75 72 dup method retur
13b00 6e 73 20 77 68 61 74 20 77 6f 75 6c 64 20 62 65 ns what would be
13b10 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 the allocated s
13b20 69 7a 65 20 6f 66 0d 0a 2a 2a 20 61 20 6d 65 6d ize of..** a mem
13b30 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 ory allocation g
13b40 69 76 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 iven a particula
13b50 72 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 r requested size
13b60 2e 20 20 4d 6f 73 74 20 6d 65 6d 6f 72 79 0d 0a . Most memory..
13b70 2a 2a 20 61 6c 6c 6f 63 61 74 6f 72 73 20 72 6f ** allocators ro
13b80 75 6e 64 20 75 70 20 6d 65 6d 6f 72 79 20 61 6c und up memory al
13b90 6c 6f 63 61 74 69 6f 6e 73 20 61 74 20 6c 65 61 locations at lea
13ba0 73 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d st to the next m
13bb0 75 6c 74 69 70 6c 65 0d 0a 2a 2a 20 6f 66 20 38 ultiple..** of 8
13bc0 2e 20 20 53 6f 6d 65 20 61 6c 6c 6f 63 61 74 6f . Some allocato
13bd0 72 73 20 72 6f 75 6e 64 20 75 70 20 74 6f 20 61 rs round up to a
13be0 20 6c 61 72 67 65 72 20 6d 75 6c 74 69 70 6c 65 larger multiple
13bf0 20 6f 72 20 74 6f 20 61 20 70 6f 77 65 72 20 6f or to a power o
13c00 66 20 32 2e 0d 0a 2a 2a 20 45 76 65 72 79 20 6d f 2...** Every m
13c10 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
13c20 20 72 65 71 75 65 73 74 20 63 6f 6d 69 6e 67 20 request coming
13c30 69 6e 20 74 68 72 6f 75 67 68 20 5b 73 71 6c 69 in through [sqli
13c40 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 0d 0a 2a te3_malloc()]..*
13c50 2a 20 6f 72 20 5b 73 71 6c 69 74 65 33 5f 72 65 * or [sqlite3_re
13c60 61 6c 6c 6f 63 28 29 5d 20 66 69 72 73 74 20 63 alloc()] first c
13c70 61 6c 6c 73 20 78 52 6f 75 6e 64 75 70 2e 20 20 alls xRoundup.
13c80 49 66 20 78 52 6f 75 6e 64 75 70 20 72 65 74 75 If xRoundup retu
13c90 72 6e 73 20 30 2c 20 0d 0a 2a 2a 20 74 68 61 74 rns 0, ..** that
13ca0 20 63 61 75 73 65 73 20 74 68 65 20 63 6f 72 72 causes the corr
13cb0 65 73 70 6f 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 esponding memory
13cc0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 66 allocation to f
13cd0 61 69 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ail...**..** The
13ce0 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 69 6e xInit method in
13cf0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 6d 65 itializes the me
13d00 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 2e 20 mory allocator.
13d10 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0d 0a (For example,..
13d20 2a 2a 20 69 74 20 6d 69 67 68 74 20 61 6c 6c 6f ** it might allo
13d30 63 61 74 65 20 61 6e 79 20 72 65 71 75 69 72 65 cate any require
13d40 20 6d 75 74 65 78 65 73 20 6f 72 20 69 6e 69 74 mutexes or init
13d50 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61 6c 20 ialize internal
13d60 64 61 74 61 0d 0a 2a 2a 20 73 74 72 75 63 74 75 data..** structu
13d70 72 65 73 2e 20 20 54 68 65 20 78 53 68 75 74 64 res. The xShutd
13d80 6f 77 6e 20 6d 65 74 68 6f 64 20 69 73 20 69 6e own method is in
13d90 76 6f 6b 65 64 20 28 69 6e 64 69 72 65 63 74 6c voked (indirectl
13da0 79 29 20 62 79 0d 0a 2a 2a 20 5b 73 71 6c 69 74 y) by..** [sqlit
13db0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 5d 20 61 e3_shutdown()] a
13dc0 6e 64 20 73 68 6f 75 6c 64 20 64 65 61 6c 6c 6f nd should deallo
13dd0 63 61 74 65 20 61 6e 79 20 72 65 73 6f 75 72 63 cate any resourc
13de0 65 73 20 61 63 71 75 69 72 65 64 0d 0a 2a 2a 20 es acquired..**
13df0 62 79 20 78 49 6e 69 74 2e 20 20 54 68 65 20 70 by xInit. The p
13e00 41 70 70 44 61 74 61 20 70 6f 69 6e 74 65 72 20 AppData pointer
13e10 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 6f is used as the o
13e20 6e 6c 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f nly parameter to
13e30 0d 0a 2a 2a 20 78 49 6e 69 74 20 61 6e 64 20 78 ..** xInit and x
13e40 53 68 75 74 64 6f 77 6e 2e 0d 0a 2a 2a 0d 0a 2a Shutdown...**..*
13e50 2a 20 53 51 4c 69 74 65 20 68 6f 6c 64 73 20 74 * SQLite holds t
13e60 68 65 20 5b 53 51 4c 49 54 45 5f 4d 55 54 45 58 he [SQLITE_MUTEX
13e70 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 5d 20 _STATIC_MASTER]
13e80 6d 75 74 65 78 20 77 68 65 6e 20 69 74 20 69 6e mutex when it in
13e90 76 6f 6b 65 73 0d 0a 2a 2a 20 74 68 65 20 78 49 vokes..** the xI
13ea0 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 nit method, so t
13eb0 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 he xInit method
13ec0 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 need not be thre
13ed0 61 64 73 61 66 65 2e 20 20 54 68 65 0d 0a 2a 2a adsafe. The..**
13ee0 20 78 53 68 75 74 64 6f 77 6e 20 6d 65 74 68 6f xShutdown metho
13ef0 64 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 d is only called
13f00 20 66 72 6f 6d 20 5b 73 71 6c 69 74 65 33 5f 73 from [sqlite3_s
13f10 68 75 74 64 6f 77 6e 28 29 5d 20 73 6f 20 69 74 hutdown()] so it
13f20 20 64 6f 65 73 0d 0a 2a 2a 20 6e 6f 74 20 6e 65 does..** not ne
13f30 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 ed to be threads
13f40 61 66 65 20 65 69 74 68 65 72 2e 20 20 46 6f 72 afe either. For
13f50 20 61 6c 6c 20 6f 74 68 65 72 20 6d 65 74 68 6f all other metho
13f60 64 73 2c 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 68 ds, SQLite..** h
13f70 6f 6c 64 73 20 74 68 65 20 5b 53 51 4c 49 54 45 olds the [SQLITE
13f80 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 _MUTEX_STATIC_ME
13f90 4d 5d 20 6d 75 74 65 78 20 61 73 20 6c 6f 6e 67 M] mutex as long
13fa0 20 61 73 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 4c as the..** [SQL
13fb0 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 ITE_CONFIG_MEMST
13fc0 41 54 55 53 5d 20 63 6f 6e 66 69 67 75 72 61 74 ATUS] configurat
13fd0 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 73 20 74 75 ion option is tu
13fe0 72 6e 65 64 20 6f 6e 20 28 77 68 69 63 68 0d 0a rned on (which..
13ff0 2a 2a 20 69 74 20 69 73 20 62 79 20 64 65 66 61 ** it is by defa
14000 75 6c 74 29 20 61 6e 64 20 73 6f 20 74 68 65 20 ult) and so the
14010 6d 65 74 68 6f 64 73 20 61 72 65 20 61 75 74 6f methods are auto
14020 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c matically serial
14030 69 7a 65 64 2e 0d 0a 2a 2a 20 48 6f 77 65 76 65 ized...** Howeve
14040 72 2c 20 69 66 20 5b 53 51 4c 49 54 45 5f 43 4f r, if [SQLITE_CO
14050 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 5d 20 NFIG_MEMSTATUS]
14060 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 is disabled, the
14070 6e 20 74 68 65 20 6f 74 68 65 72 0d 0a 2a 2a 20 n the other..**
14080 6d 65 74 68 6f 64 73 20 6d 75 73 74 20 62 65 20 methods must be
14090 74 68 72 65 61 64 73 61 66 65 20 6f 72 20 65 6c threadsafe or el
140a0 73 65 20 6d 61 6b 65 20 74 68 65 69 72 20 6f 77 se make their ow
140b0 6e 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 66 n arrangements f
140c0 6f 72 0d 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 61 or..** serializa
140d0 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 tion...**..** SQ
140e0 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 Lite will never
140f0 69 6e 76 6f 6b 65 20 78 49 6e 69 74 28 29 20 6d invoke xInit() m
14100 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 ore than once wi
14110 74 68 6f 75 74 20 61 6e 20 69 6e 74 65 72 76 65 thout an interve
14120 6e 69 6e 67 0d 0a 2a 2a 20 63 61 6c 6c 20 74 6f ning..** call to
14130 20 78 53 68 75 74 64 6f 77 6e 28 29 2e 0d 0a 2a xShutdown()...*
14140 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
14150 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 t sqlite3_mem_me
14160 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 thods sqlite3_me
14170 6d 5f 6d 65 74 68 6f 64 73 3b 0d 0a 73 74 72 75 m_methods;..stru
14180 63 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d ct sqlite3_mem_m
14190 65 74 68 6f 64 73 20 7b 0d 0a 20 20 76 6f 69 64 ethods {.. void
141a0 20 2a 28 2a 78 4d 61 6c 6c 6f 63 29 28 69 6e 74 *(*xMalloc)(int
141b0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 ); /* Me
141c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
141d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 76 function */.. v
141e0 6f 69 64 20 28 2a 78 46 72 65 65 29 28 76 6f 69 oid (*xFree)(voi
141f0 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a d*); /*
14200 20 46 72 65 65 20 61 20 70 72 69 6f 72 20 61 6c Free a prior al
14210 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 76 location */.. v
14220 6f 69 64 20 2a 28 2a 78 52 65 61 6c 6c 6f 63 29 oid *(*xRealloc)
14230 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 2f 2a (void*,int); /*
14240 20 52 65 73 69 7a 65 20 61 6e 20 61 6c 6c 6f 63 Resize an alloc
14250 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 ation */.. int
14260 28 2a 78 53 69 7a 65 29 28 76 6f 69 64 2a 29 3b (*xSize)(void*);
14270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
14280 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 turn the size of
14290 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a an allocation *
142a0 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 52 6f 75 6e /.. int (*xRoun
142b0 64 75 70 29 28 69 6e 74 29 3b 20 20 20 20 20 20 dup)(int);
142c0 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 /* Round up
142d0 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 request size to
142e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 allocation size
142f0 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 49 6e 69 */.. int (*xIni
14300 74 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 t)(void*);
14310 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 /* Initiali
14320 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c ze the memory al
14330 6c 6f 63 61 74 6f 72 20 2a 2f 0d 0a 20 20 76 6f locator */.. vo
14340 69 64 20 28 2a 78 53 68 75 74 64 6f 77 6e 29 28 id (*xShutdown)(
14350 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 2f 2a 20 void*); /*
14360 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 Deinitialize the
14370 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f memory allocato
14380 72 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 41 r */.. void *pA
14390 70 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 ppData;
143a0 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 /* Argume
143b0 6e 74 20 74 6f 20 78 49 6e 69 74 28 29 20 61 6e nt to xInit() an
143c0 64 20 78 53 68 75 74 64 6f 77 6e 28 29 20 2a 2f d xShutdown() */
143d0 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ..};..../*..** C
143e0 41 50 49 33 52 45 46 3a 20 43 6f 6e 66 69 67 75 API3REF: Configu
143f0 72 61 74 69 6f 6e 20 4f 70 74 69 6f 6e 73 0d 0a ration Options..
14400 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 7b 63 6f ** KEYWORDS: {co
14410 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 nfiguration opti
14420 6f 6e 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 on}..**..** Thes
14430 65 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 e constants are
14440 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e the available in
14450 74 65 67 65 72 20 63 6f 6e 66 69 67 75 72 61 74 teger configurat
14460 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 ion options that
14470 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 70 61 73 73 ..** can be pass
14480 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ed as the first
14490 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 argument to the
144a0 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 [sqlite3_config(
144b0 29 5d 20 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a )] interface...*
144c0 2a 0d 0a 2a 2a 20 4e 65 77 20 63 6f 6e 66 69 67 *..** New config
144d0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 uration options
144e0 6d 61 79 20 62 65 20 61 64 64 65 64 20 69 6e 20 may be added in
144f0 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 20 future releases
14500 6f 66 20 53 51 4c 69 74 65 2e 0d 0a 2a 2a 20 45 of SQLite...** E
14510 78 69 73 74 69 6e 67 20 63 6f 6e 66 69 67 75 72 xisting configur
14520 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 6d 69 ation options mi
14530 67 68 74 20 62 65 20 64 69 73 63 6f 6e 74 69 6e ght be discontin
14540 75 65 64 2e 20 20 41 70 70 6c 69 63 61 74 69 6f ued. Applicatio
14550 6e 73 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 68 ns..** should ch
14560 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 eck the return c
14570 6f 64 65 20 66 72 6f 6d 20 5b 73 71 6c 69 74 65 ode from [sqlite
14580 33 5f 63 6f 6e 66 69 67 28 29 5d 20 74 6f 20 6d 3_config()] to m
14590 61 6b 65 20 73 75 72 65 20 74 68 61 74 0d 0a 2a ake sure that..*
145a0 2a 20 74 68 65 20 63 61 6c 6c 20 77 6f 72 6b 65 * the call worke
145b0 64 2e 20 20 54 68 65 20 5b 73 71 6c 69 74 65 33 d. The [sqlite3
145c0 5f 63 6f 6e 66 69 67 28 29 5d 20 69 6e 74 65 72 _config()] inter
145d0 66 61 63 65 20 77 69 6c 6c 20 72 65 74 75 72 6e face will return
145e0 20 61 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 a..** non-zero
145f0 5b 65 72 72 6f 72 20 63 6f 64 65 5d 20 69 66 20 [error code] if
14600 61 20 64 69 73 63 6f 6e 74 69 6e 75 65 64 20 6f a discontinued o
14610 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 63 6f r unsupported co
14620 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 nfiguration opti
14630 6f 6e 0d 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 on..** is invoke
14640 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 64 6c 3e 0d d...**..** <dl>.
14650 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e .** [[SQLITE_CON
14660 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 FIG_SINGLETHREAD
14670 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f ]] <dt>SQLITE_CO
14680 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 NFIG_SINGLETHREA
14690 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 D</dt>..** <dd>T
146a0 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 here are no argu
146b0 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 6f 70 ments to this op
146c0 74 69 6f 6e 2e 20 20 5e 54 68 69 73 20 6f 70 74 tion. ^This opt
146d0 69 6f 6e 20 73 65 74 73 20 74 68 65 0d 0a 2a 2a ion sets the..**
146e0 20 5b 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 [threading mode
146f0 5d 20 74 6f 20 53 69 6e 67 6c 65 2d 74 68 72 65 ] to Single-thre
14700 61 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f ad. In other wo
14710 72 64 73 2c 20 69 74 20 64 69 73 61 62 6c 65 73 rds, it disables
14720 0d 0a 2a 2a 20 61 6c 6c 20 6d 75 74 65 78 69 6e ..** all mutexin
14730 67 20 61 6e 64 20 70 75 74 73 20 53 51 4c 69 74 g and puts SQLit
14740 65 20 69 6e 74 6f 20 61 20 6d 6f 64 65 20 77 68 e into a mode wh
14750 65 72 65 20 69 74 20 63 61 6e 20 6f 6e 6c 79 20 ere it can only
14760 62 65 20 75 73 65 64 0d 0a 2a 2a 20 62 79 20 61 be used..** by a
14770 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 single thread.
14780 20 20 5e 49 66 20 53 51 4c 69 74 65 20 69 73 20 ^If SQLite is
14790 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 2a compiled with..*
147a0 2a 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 54 48 * the [SQLITE_TH
147b0 52 45 41 44 53 41 46 45 20 7c 20 53 51 4c 49 54 READSAFE | SQLIT
147c0 45 5f 54 48 52 45 41 44 53 41 46 45 3d 30 5d 20 E_THREADSAFE=0]
147d0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 compile-time opt
147e0 69 6f 6e 20 74 68 65 6e 0d 0a 2a 2a 20 69 74 20 ion then..** it
147f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 is not possible
14800 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 5b 74 to change the [t
14810 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 5d 20 66 hreading mode] f
14820 72 6f 6d 20 69 74 73 20 64 65 66 61 75 6c 74 0d rom its default.
14830 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 53 69 6e .** value of Sin
14840 67 6c 65 2d 74 68 72 65 61 64 20 61 6e 64 20 73 gle-thread and s
14850 6f 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 o [sqlite3_confi
14860 67 28 29 5d 20 77 69 6c 6c 20 72 65 74 75 72 6e g()] will return
14870 20 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 45 52 ..** [SQLITE_ER
14880 52 4f 52 5d 20 69 66 20 63 61 6c 6c 65 64 20 77 ROR] if called w
14890 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 43 ith the SQLITE_C
148a0 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 ONFIG_SINGLETHRE
148b0 41 44 0d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 AD..** configura
148c0 74 69 6f 6e 20 6f 70 74 69 6f 6e 2e 3c 2f 64 64 tion option.</dd
148d0 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 >..**..** [[SQLI
148e0 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 TE_CONFIG_MULTIT
148f0 48 52 45 41 44 5d 5d 20 3c 64 74 3e 53 51 4c 49 HREAD]] <dt>SQLI
14900 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 TE_CONFIG_MULTIT
14910 48 52 45 41 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c HREAD</dt>..** <
14920 64 64 3e 54 68 65 72 65 20 61 72 65 20 6e 6f 20 dd>There are no
14930 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 arguments to thi
14940 73 20 6f 70 74 69 6f 6e 2e 20 20 5e 54 68 69 73 s option. ^This
14950 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 option sets the
14960 0d 0a 2a 2a 20 5b 74 68 72 65 61 64 69 6e 67 20 ..** [threading
14970 6d 6f 64 65 5d 20 74 6f 20 4d 75 6c 74 69 2d 74 mode] to Multi-t
14980 68 72 65 61 64 2e 20 20 49 6e 20 6f 74 68 65 72 hread. In other
14990 20 77 6f 72 64 73 2c 20 69 74 20 64 69 73 61 62 words, it disab
149a0 6c 65 73 0d 0a 2a 2a 20 6d 75 74 65 78 69 6e 67 les..** mutexing
149b0 20 6f 6e 20 5b 64 61 74 61 62 61 73 65 20 63 6f on [database co
149c0 6e 6e 65 63 74 69 6f 6e 5d 20 61 6e 64 20 5b 70 nnection] and [p
149d0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
149e0 74 5d 20 6f 62 6a 65 63 74 73 2e 0d 0a 2a 2a 20 t] objects...**
149f0 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 The application
14a00 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 is responsible f
14a10 6f 72 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 61 or serializing a
14a20 63 63 65 73 73 20 74 6f 0d 0a 2a 2a 20 5b 64 61 ccess to..** [da
14a30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
14a40 6e 73 5d 20 61 6e 64 20 5b 70 72 65 70 61 72 65 ns] and [prepare
14a50 64 20 73 74 61 74 65 6d 65 6e 74 73 5d 2e 20 20 d statements].
14a60 42 75 74 20 6f 74 68 65 72 20 6d 75 74 65 78 65 But other mutexe
14a70 73 0d 0a 2a 2a 20 61 72 65 20 65 6e 61 62 6c 65 s..** are enable
14a80 64 20 73 6f 20 74 68 61 74 20 53 51 4c 69 74 65 d so that SQLite
14a90 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f will be safe to
14aa0 20 75 73 65 20 69 6e 20 61 20 6d 75 6c 74 69 2d use in a multi-
14ab0 74 68 72 65 61 64 65 64 0d 0a 2a 2a 20 65 6e 76 threaded..** env
14ac0 69 72 6f 6e 6d 65 6e 74 20 61 73 20 6c 6f 6e 67 ironment as long
14ad0 20 61 73 20 6e 6f 20 74 77 6f 20 74 68 72 65 61 as no two threa
14ae0 64 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 ds attempt to us
14af0 65 20 74 68 65 20 73 61 6d 65 0d 0a 2a 2a 20 5b e the same..** [
14b00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
14b10 69 6f 6e 5d 20 61 74 20 74 68 65 20 73 61 6d 65 ion] at the same
14b20 20 74 69 6d 65 2e 20 20 5e 49 66 20 53 51 4c 69 time. ^If SQLi
14b30 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 te is compiled w
14b40 69 74 68 0d 0a 2a 2a 20 74 68 65 20 5b 53 51 4c ith..** the [SQL
14b50 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 7c ITE_THREADSAFE |
14b60 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 SQLITE_THREADSA
14b70 46 45 3d 30 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 FE=0] compile-ti
14b80 6d 65 20 6f 70 74 69 6f 6e 20 74 68 65 6e 0d 0a me option then..
14b90 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 ** it is not pos
14ba0 73 69 62 6c 65 20 74 6f 20 73 65 74 20 74 68 65 sible to set the
14bb0 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 20 5b 74 Multi-thread [t
14bc0 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 5d 20 61 hreading mode] a
14bd0 6e 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f nd..** [sqlite3_
14be0 63 6f 6e 66 69 67 28 29 5d 20 77 69 6c 6c 20 72 config()] will r
14bf0 65 74 75 72 6e 20 5b 53 51 4c 49 54 45 5f 45 52 eturn [SQLITE_ER
14c00 52 4f 52 5d 20 69 66 20 63 61 6c 6c 65 64 20 77 ROR] if called w
14c10 69 74 68 20 74 68 65 0d 0a 2a 2a 20 53 51 4c 49 ith the..** SQLI
14c20 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 TE_CONFIG_MULTIT
14c30 48 52 45 41 44 20 63 6f 6e 66 69 67 75 72 61 74 HREAD configurat
14c40 69 6f 6e 20 6f 70 74 69 6f 6e 2e 3c 2f 64 64 3e ion option.</dd>
14c50 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 ..**..** [[SQLIT
14c60 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 E_CONFIG_SERIALI
14c70 5a 45 44 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 ZED]] <dt>SQLITE
14c80 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a _CONFIG_SERIALIZ
14c90 45 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e ED</dt>..** <dd>
14ca0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72 67 There are no arg
14cb0 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 6f uments to this o
14cc0 70 74 69 6f 6e 2e 20 20 5e 54 68 69 73 20 6f 70 ption. ^This op
14cd0 74 69 6f 6e 20 73 65 74 73 20 74 68 65 0d 0a 2a tion sets the..*
14ce0 2a 20 5b 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 * [threading mod
14cf0 65 5d 20 74 6f 20 53 65 72 69 61 6c 69 7a 65 64 e] to Serialized
14d00 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 . In other words
14d10 2c 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 65 6e , this option en
14d20 61 62 6c 65 73 0d 0a 2a 2a 20 61 6c 6c 20 6d 75 ables..** all mu
14d30 74 65 78 65 73 20 69 6e 63 6c 75 64 69 6e 67 20 texes including
14d40 74 68 65 20 72 65 63 75 72 73 69 76 65 0d 0a 2a the recursive..*
14d50 2a 20 6d 75 74 65 78 65 73 20 6f 6e 20 5b 64 61 * mutexes on [da
14d60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
14d70 6e 5d 20 61 6e 64 20 5b 70 72 65 70 61 72 65 64 n] and [prepared
14d80 20 73 74 61 74 65 6d 65 6e 74 5d 20 6f 62 6a 65 statement] obje
14d90 63 74 73 2e 0d 0a 2a 2a 20 49 6e 20 74 68 69 73 cts...** In this
14da0 20 6d 6f 64 65 20 28 77 68 69 63 68 20 69 73 20 mode (which is
14db0 74 68 65 20 64 65 66 61 75 6c 74 20 77 68 65 6e the default when
14dc0 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 SQLite is compi
14dd0 6c 65 64 20 77 69 74 68 0d 0a 2a 2a 20 5b 53 51 led with..** [SQ
14de0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d LITE_THREADSAFE=
14df0 31 5d 29 20 74 68 65 20 53 51 4c 69 74 65 20 6c 1]) the SQLite l
14e00 69 62 72 61 72 79 20 77 69 6c 6c 20 69 74 73 65 ibrary will itse
14e10 6c 66 20 73 65 72 69 61 6c 69 7a 65 20 61 63 63 lf serialize acc
14e20 65 73 73 0d 0a 2a 2a 20 74 6f 20 5b 64 61 74 61 ess..** to [data
14e30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 base connections
14e40 5d 20 61 6e 64 20 5b 70 72 65 70 61 72 65 64 20 ] and [prepared
14e50 73 74 61 74 65 6d 65 6e 74 73 5d 20 73 6f 20 74 statements] so t
14e60 68 61 74 20 74 68 65 0d 0a 2a 2a 20 61 70 70 6c hat the..** appl
14e70 69 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 ication is free
14e80 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 to use the same
14e90 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
14ea0 74 69 6f 6e 5d 20 6f 72 20 74 68 65 0d 0a 2a 2a tion] or the..**
14eb0 20 73 61 6d 65 20 5b 70 72 65 70 61 72 65 64 20 same [prepared
14ec0 73 74 61 74 65 6d 65 6e 74 5d 20 69 6e 20 64 69 statement] in di
14ed0 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73 20 fferent threads
14ee0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 at the same time
14ef0 2e 0d 0a 2a 2a 20 5e 49 66 20 53 51 4c 69 74 65 ...** ^If SQLite
14f00 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 is compiled wit
14f10 68 0d 0a 2a 2a 20 74 68 65 20 5b 53 51 4c 49 54 h..** the [SQLIT
14f20 45 5f 54 48 52 45 41 44 53 41 46 45 20 7c 20 53 E_THREADSAFE | S
14f30 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 QLITE_THREADSAFE
14f40 3d 30 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 =0] compile-time
14f50 20 6f 70 74 69 6f 6e 20 74 68 65 6e 0d 0a 2a 2a option then..**
14f60 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 it is not possi
14f70 62 6c 65 20 74 6f 20 73 65 74 20 74 68 65 20 53 ble to set the S
14f80 65 72 69 61 6c 69 7a 65 64 20 5b 74 68 72 65 61 erialized [threa
14f90 64 69 6e 67 20 6d 6f 64 65 5d 20 61 6e 64 0d 0a ding mode] and..
14fa0 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 ** [sqlite3_conf
14fb0 69 67 28 29 5d 20 77 69 6c 6c 20 72 65 74 75 72 ig()] will retur
14fc0 6e 20 5b 53 51 4c 49 54 45 5f 45 52 52 4f 52 5d n [SQLITE_ERROR]
14fd0 20 69 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 if called with
14fe0 74 68 65 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 the..** SQLITE_C
14ff0 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 ONFIG_SERIALIZED
15000 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f configuration o
15010 70 74 69 6f 6e 2e 3c 2f 64 64 3e 0d 0a 2a 2a 0d ption.</dd>..**.
15020 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e .** [[SQLITE_CON
15030 46 49 47 5f 4d 41 4c 4c 4f 43 5d 5d 20 3c 64 74 FIG_MALLOC]] <dt
15040 3e 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d >SQLITE_CONFIG_M
15050 41 4c 4c 4f 43 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c ALLOC</dt>..** <
15060 64 64 3e 20 5e 28 54 68 69 73 20 6f 70 74 69 6f dd> ^(This optio
15070 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 n takes a single
15080 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 argument which
15090 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
150a0 61 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 an..** instance
150b0 6f 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f of the [sqlite3_
150c0 6d 65 6d 5f 6d 65 74 68 6f 64 73 5d 20 73 74 72 mem_methods] str
150d0 75 63 74 75 72 65 2e 20 20 54 68 65 20 61 72 67 ucture. The arg
150e0 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 0d ument specifies.
150f0 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 .** alternative
15100 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 low-level memory
15110 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 allocation rout
15120 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 ines to be used
15130 69 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 in place of..**
15140 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 the memory alloc
15150 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 ation routines b
15160 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 uilt into SQLite
15170 2e 29 5e 20 5e 53 51 4c 69 74 65 20 6d 61 6b 65 .)^ ^SQLite make
15180 73 0d 0a 2a 2a 20 69 74 73 20 6f 77 6e 20 70 72 s..** its own pr
15190 69 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 ivate copy of th
151a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 e content of the
151b0 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 [sqlite3_mem_me
151c0 74 68 6f 64 73 5d 20 73 74 72 75 63 74 75 72 65 thods] structure
151d0 0d 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 ..** before the
151e0 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 [sqlite3_config(
151f0 29 5d 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e )] call returns.
15200 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b </dd>..**..** [[
15210 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 SQLITE_CONFIG_GE
15220 54 4d 41 4c 4c 4f 43 5d 5d 20 3c 64 74 3e 53 51 TMALLOC]] <dt>SQ
15230 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d LITE_CONFIG_GETM
15240 41 4c 4c 4f 43 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c ALLOC</dt>..** <
15250 64 64 3e 20 5e 28 54 68 69 73 20 6f 70 74 69 6f dd> ^(This optio
15260 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 n takes a single
15270 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 argument which
15280 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
15290 61 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 an..** instance
152a0 6f 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f of the [sqlite3_
152b0 6d 65 6d 5f 6d 65 74 68 6f 64 73 5d 20 73 74 72 mem_methods] str
152c0 75 63 74 75 72 65 2e 20 20 54 68 65 20 5b 73 71 ucture. The [sq
152d0 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 lite3_mem_method
152e0 73 5d 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 s]..** structure
152f0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 is filled with
15300 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 the currently de
15310 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c fined memory all
15320 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 ocation routines
15330 2e 29 5e 0d 0a 2a 2a 20 54 68 69 73 20 6f 70 74 .)^..** This opt
15340 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 ion can be used
15350 74 6f 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 to overload the
15360 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 default memory a
15370 6c 6c 6f 63 61 74 69 6f 6e 0d 0a 2a 2a 20 72 6f llocation..** ro
15380 75 74 69 6e 65 73 20 77 69 74 68 20 61 20 77 72 utines with a wr
15390 61 70 70 65 72 20 74 68 61 74 20 73 69 6d 75 6c apper that simul
153a0 61 74 69 6f 6e 73 20 6d 65 6d 6f 72 79 20 61 6c ations memory al
153b0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 location failure
153c0 20 6f 72 0d 0a 2a 2a 20 74 72 61 63 6b 73 20 6d or..** tracks m
153d0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 66 6f 72 emory usage, for
153e0 20 65 78 61 6d 70 6c 65 2e 20 3c 2f 64 64 3e 0d example. </dd>.
153f0 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 .**..** [[SQLITE
15400 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 _CONFIG_MEMSTATU
15410 53 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 S]] <dt>SQLITE_C
15420 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3c ONFIG_MEMSTATUS<
15430 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 54 /dt>..** <dd> ^T
15440 68 69 73 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 his option takes
15450 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 single argument
15460 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69 6e of type int, in
15470 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 0d terpreted as a .
15480 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 .** boolean, whi
15490 63 68 20 65 6e 61 62 6c 65 73 20 6f 72 20 64 69 ch enables or di
154a0 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65 sables the colle
154b0 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 ction of memory
154c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 0d 0a 2a 2a 20 allocation ..**
154d0 73 74 61 74 69 73 74 69 63 73 2e 20 5e 28 57 68 statistics. ^(Wh
154e0 65 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 en memory alloca
154f0 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 20 tion statistics
15500 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 are disabled, th
15510 65 20 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 e ..** following
15520 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 61 63 SQLite interfac
15530 65 73 20 62 65 63 6f 6d 65 20 6e 6f 6e 2d 6f 70 es become non-op
15540 65 72 61 74 69 6f 6e 61 6c 3a 0d 0a 2a 2a 20 20 erational:..**
15550 20 3c 75 6c 3e 0d 0a 2a 2a 20 20 20 3c 6c 69 3e <ul>..** <li>
15560 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 [sqlite3_memory
15570 5f 75 73 65 64 28 29 5d 0d 0a 2a 2a 20 20 20 3c _used()]..** <
15580 6c 69 3e 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d li> [sqlite3_mem
15590 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 29 5d ory_highwater()]
155a0 0d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c ..** <li> [sql
155b0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c ite3_soft_heap_l
155c0 69 6d 69 74 36 34 28 29 5d 0d 0a 2a 2a 20 20 20 imit64()]..**
155d0 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 5f 73 74 <li> [sqlite3_st
155e0 61 74 75 73 28 29 5d 0d 0a 2a 2a 20 20 20 3c 2f atus()]..** </
155f0 75 6c 3e 29 5e 0d 0a 2a 2a 20 5e 4d 65 6d 6f 72 ul>)^..** ^Memor
15600 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 y allocation sta
15610 74 69 73 74 69 63 73 20 61 72 65 20 65 6e 61 62 tistics are enab
15620 6c 65 64 20 62 79 20 64 65 66 61 75 6c 74 20 75 led by default u
15630 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 0d nless SQLite is.
15640 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 .** compiled wit
15650 68 20 5b 53 51 4c 49 54 45 5f 44 45 46 41 55 4c h [SQLITE_DEFAUL
15660 54 5f 4d 45 4d 53 54 41 54 55 53 5d 3d 30 20 69 T_MEMSTATUS]=0 i
15670 6e 20 77 68 69 63 68 20 63 61 73 65 20 6d 65 6d n which case mem
15680 6f 72 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 ory..** allocati
15690 6f 6e 20 73 74 61 74 69 73 74 69 63 73 20 61 72 on statistics ar
156a0 65 20 64 69 73 61 62 6c 65 64 20 62 79 20 64 65 e disabled by de
156b0 66 61 75 6c 74 2e 0d 0a 2a 2a 20 3c 2f 64 64 3e fault...** </dd>
156c0 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 ..**..** [[SQLIT
156d0 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 E_CONFIG_SCRATCH
156e0 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f ]] <dt>SQLITE_CO
156f0 4e 46 49 47 5f 53 43 52 41 54 43 48 3c 2f 64 74 NFIG_SCRATCH</dt
15700 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 54 68 69 73 >..** <dd> ^This
15710 20 6f 70 74 69 6f 6e 20 73 70 65 63 69 66 69 65 option specifie
15720 73 20 61 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 s a static memor
15730 79 20 62 75 66 66 65 72 20 74 68 61 74 20 53 51 y buffer that SQ
15740 4c 69 74 65 20 63 61 6e 20 75 73 65 20 66 6f 72 Lite can use for
15750 0d 0a 2a 2a 20 73 63 72 61 74 63 68 20 6d 65 6d ..** scratch mem
15760 6f 72 79 2e 20 20 54 68 65 72 65 20 61 72 65 20 ory. There are
15770 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 3a three arguments:
15780 20 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 A pointer an 8
15790 2d 62 79 74 65 0d 0a 2a 2a 20 61 6c 69 67 6e 65 -byte..** aligne
157a0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 d memory buffer
157b0 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 73 from which the s
157c0 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f cratch allocatio
157d0 6e 73 20 77 69 6c 6c 20 62 65 0d 0a 2a 2a 20 64 ns will be..** d
157e0 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f rawn, the size o
157f0 66 20 65 61 63 68 20 73 63 72 61 74 63 68 20 61 f each scratch a
15800 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 0d llocation (sz),.
15810 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 78 69 .** and the maxi
15820 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 63 mum number of sc
15830 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e ratch allocation
15840 73 20 28 4e 29 2e 20 20 54 68 65 20 73 7a 0d 0a s (N). The sz..
15850 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 ** argument must
15860 20 62 65 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f be a multiple o
15870 66 20 31 36 2e 0d 0a 2a 2a 20 54 68 65 20 66 69 f 16...** The fi
15880 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 rst argument mus
15890 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 t be a pointer t
158a0 6f 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 o an 8-byte alig
158b0 6e 65 64 20 62 75 66 66 65 72 0d 0a 2a 2a 20 6f ned buffer..** o
158c0 66 20 61 74 20 6c 65 61 73 74 20 73 7a 2a 4e 20 f at least sz*N
158d0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e bytes of memory.
158e0 0d 0a 2a 2a 20 5e 53 51 4c 69 74 65 20 77 69 6c ..** ^SQLite wil
158f0 6c 20 75 73 65 20 6e 6f 20 6d 6f 72 65 20 74 68 l use no more th
15900 61 6e 20 74 77 6f 20 73 63 72 61 74 63 68 20 62 an two scratch b
15910 75 66 66 65 72 73 20 70 65 72 20 74 68 72 65 61 uffers per threa
15920 64 2e 20 20 53 6f 0d 0a 2a 2a 20 4e 20 73 68 6f d. So..** N sho
15930 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74 77 uld be set to tw
15940 69 63 65 20 74 68 65 20 65 78 70 65 63 74 65 64 ice the expected
15950 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 maximum number
15960 6f 66 20 74 68 72 65 61 64 73 2e 0d 0a 2a 2a 20 of threads...**
15970 5e 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 ^SQLite will nev
15980 65 72 20 72 65 71 75 69 72 65 20 61 20 73 63 72 er require a scr
15990 61 74 63 68 20 62 75 66 66 65 72 20 74 68 61 74 atch buffer that
159a0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 36 0d is more than 6.
159b0 0a 2a 2a 20 74 69 6d 65 73 20 74 68 65 20 64 61 .** times the da
159c0 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 tabase page size
159d0 2e 20 5e 49 66 20 53 51 4c 69 74 65 20 6e 65 65 . ^If SQLite nee
159e0 64 73 20 6e 65 65 64 73 20 61 64 64 69 74 69 6f ds needs additio
159f0 6e 61 6c 0d 0a 2a 2a 20 73 63 72 61 74 63 68 20 nal..** scratch
15a00 6d 65 6d 6f 72 79 20 62 65 79 6f 6e 64 20 77 68 memory beyond wh
15a10 61 74 20 69 73 20 70 72 6f 76 69 64 65 64 20 62 at is provided b
15a20 79 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 y this configura
15a30 74 69 6f 6e 20 6f 70 74 69 6f 6e 2c 20 74 68 65 tion option, the
15a40 6e 20 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f n ..** [sqlite3_
15a50 6d 61 6c 6c 6f 63 28 29 5d 20 77 69 6c 6c 20 62 malloc()] will b
15a60 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e e used to obtain
15a70 20 74 68 65 20 6d 65 6d 6f 72 79 20 6e 65 65 64 the memory need
15a80 65 64 2e 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a ed.</dd>..**..**
15a90 20 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 [[SQLITE_CONFIG
15aa0 5f 50 41 47 45 43 41 43 48 45 5d 5d 20 3c 64 74 _PAGECACHE]] <dt
15ab0 3e 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 >SQLITE_CONFIG_P
15ac0 41 47 45 43 41 43 48 45 3c 2f 64 74 3e 0d 0a 2a AGECACHE</dt>..*
15ad0 2a 20 3c 64 64 3e 20 5e 54 68 69 73 20 6f 70 74 * <dd> ^This opt
15ae0 69 6f 6e 20 73 70 65 63 69 66 69 65 73 20 61 20 ion specifies a
15af0 73 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 62 75 static memory bu
15b00 66 66 65 72 20 74 68 61 74 20 53 51 4c 69 74 65 ffer that SQLite
15b10 20 63 61 6e 20 75 73 65 20 66 6f 72 0d 0a 2a 2a can use for..**
15b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 the database pa
15b30 67 65 20 63 61 63 68 65 20 77 69 74 68 20 74 68 ge cache with th
15b40 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 63 e default page c
15b50 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 ache implementat
15b60 69 6f 6e 2e 20 20 0d 0a 2a 2a 20 54 68 69 73 20 ion. ..** This
15b70 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 68 configuration sh
15b80 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 ould not be used
15b90 20 69 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69 if an applicati
15ba0 6f 6e 2d 64 65 66 69 6e 65 20 70 61 67 65 0d 0a on-define page..
15bb0 2a 2a 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 ** cache impleme
15bc0 6e 74 61 74 69 6f 6e 20 69 73 20 6c 6f 61 64 65 ntation is loade
15bd0 64 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c 49 d using the SQLI
15be0 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 TE_CONFIG_PCACHE
15bf0 32 20 6f 70 74 69 6f 6e 2e 0d 0a 2a 2a 20 54 68 2 option...** Th
15c00 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 ere are three ar
15c10 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 guments to this
15c20 6f 70 74 69 6f 6e 3a 20 41 20 70 6f 69 6e 74 65 option: A pointe
15c30 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 r to 8-byte alig
15c40 6e 65 64 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 2c 20 ned..** memory,
15c50 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 the size of each
15c60 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a page buffer (sz
15c70 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 ), and the numbe
15c80 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 0d r of pages (N)..
15c90 0a 2a 2a 20 54 68 65 20 73 7a 20 61 72 67 75 6d .** The sz argum
15ca0 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 ent should be th
15cb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 e size of the la
15cc0 72 67 65 73 74 20 64 61 74 61 62 61 73 65 20 70 rgest database p
15cd0 61 67 65 0d 0a 2a 2a 20 28 61 20 70 6f 77 65 72 age..** (a power
15ce0 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 of two between
15cf0 35 31 32 20 61 6e 64 20 33 32 37 36 38 29 20 70 512 and 32768) p
15d00 6c 75 73 20 61 20 6c 69 74 74 6c 65 20 65 78 74 lus a little ext
15d10 72 61 20 66 6f 72 20 65 61 63 68 0d 0a 2a 2a 20 ra for each..**
15d20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 5e 54 page header. ^T
15d30 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 73 he page header s
15d40 69 7a 65 20 69 73 20 32 30 20 74 6f 20 34 30 20 ize is 20 to 40
15d50 62 79 74 65 73 20 64 65 70 65 6e 64 69 6e 67 20 bytes depending
15d60 6f 6e 0d 0a 2a 2a 20 74 68 65 20 68 6f 73 74 20 on..** the host
15d70 61 72 63 68 69 74 65 63 74 75 72 65 2e 20 20 5e architecture. ^
15d80 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 2c 20 It is harmless,
15d90 61 70 61 72 74 20 66 72 6f 6d 20 74 68 65 20 77 apart from the w
15da0 61 73 74 65 64 20 6d 65 6d 6f 72 79 2c 0d 0a 2a asted memory,..*
15db0 2a 20 74 6f 20 6d 61 6b 65 20 73 7a 20 61 20 6c * to make sz a l
15dc0 69 74 74 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e ittle too large.
15dd0 20 20 54 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 The first..**
15de0 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 argument should
15df0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 6c 6c 6f point to an allo
15e00 63 61 74 69 6f 6e 20 6f 66 20 61 74 20 6c 65 61 cation of at lea
15e10 73 74 20 73 7a 2a 4e 20 62 79 74 65 73 20 6f 66 st sz*N bytes of
15e20 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a 20 5e 53 51 memory...** ^SQ
15e30 4c 69 74 65 20 77 69 6c 6c 20 75 73 65 20 74 68 Lite will use th
15e40 65 20 6d 65 6d 6f 72 79 20 70 72 6f 76 69 64 65 e memory provide
15e50 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 d by the first a
15e60 72 67 75 6d 65 6e 74 20 74 6f 20 73 61 74 69 73 rgument to satis
15e70 66 79 20 69 74 73 0d 0a 2a 2a 20 6d 65 6d 6f 72 fy its..** memor
15e80 79 20 6e 65 65 64 73 20 66 6f 72 20 74 68 65 20 y needs for the
15e90 66 69 72 73 74 20 4e 20 70 61 67 65 73 20 74 68 first N pages th
15ea0 61 74 20 69 74 20 61 64 64 73 20 74 6f 20 63 61 at it adds to ca
15eb0 63 68 65 2e 20 20 5e 49 66 20 61 64 64 69 74 69 che. ^If additi
15ec0 6f 6e 61 6c 0d 0a 2a 2a 20 70 61 67 65 20 63 61 onal..** page ca
15ed0 63 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 che memory is ne
15ee0 65 64 65 64 20 62 65 79 6f 6e 64 20 77 68 61 74 eded beyond what
15ef0 20 69 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 is provided by
15f00 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 74 68 65 this option, the
15f10 6e 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 67 6f 65 n..** SQLite goe
15f20 73 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 6d 61 s to [sqlite3_ma
15f30 6c 6c 6f 63 28 29 5d 20 66 6f 72 20 74 68 65 20 lloc()] for the
15f40 61 64 64 69 74 69 6f 6e 61 6c 20 73 74 6f 72 61 additional stora
15f50 67 65 20 73 70 61 63 65 2e 0d 0a 2a 2a 20 54 68 ge space...** Th
15f60 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 e pointer in the
15f70 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 first argument
15f80 6d 75 73 74 0d 0a 2a 2a 20 62 65 20 61 6c 69 67 must..** be alig
15f90 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 ned to an 8-byte
15fa0 20 62 6f 75 6e 64 61 72 79 20 6f 72 20 73 75 62 boundary or sub
15fb0 73 65 71 75 65 6e 74 20 62 65 68 61 76 69 6f 72 sequent behavior
15fc0 20 6f 66 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 77 of SQLite..** w
15fd0 69 6c 6c 20 62 65 20 75 6e 64 65 66 69 6e 65 64 ill be undefined
15fe0 2e 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b .</dd>..**..** [
15ff0 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 [SQLITE_CONFIG_H
16000 45 41 50 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 EAP]] <dt>SQLITE
16010 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3c 2f 64 74 _CONFIG_HEAP</dt
16020 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 54 68 69 73 >..** <dd> ^This
16030 20 6f 70 74 69 6f 6e 20 73 70 65 63 69 66 69 65 option specifie
16040 73 20 61 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 s a static memor
16050 79 20 62 75 66 66 65 72 20 74 68 61 74 20 53 51 y buffer that SQ
16060 4c 69 74 65 20 77 69 6c 6c 20 75 73 65 0d 0a 2a Lite will use..*
16070 2a 20 66 6f 72 20 61 6c 6c 20 6f 66 20 69 74 73 * for all of its
16080 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 dynamic memory
16090 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64 73 allocation needs
160a0 20 62 65 79 6f 6e 64 20 74 68 6f 73 65 20 70 72 beyond those pr
160b0 6f 76 69 64 65 64 0d 0a 2a 2a 20 66 6f 72 20 62 ovided..** for b
160c0 79 20 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 y [SQLITE_CONFIG
160d0 5f 53 43 52 41 54 43 48 5d 20 61 6e 64 20 5b 53 _SCRATCH] and [S
160e0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 QLITE_CONFIG_PAG
160f0 45 43 41 43 48 45 5d 2e 0d 0a 2a 2a 20 54 68 65 ECACHE]...** The
16100 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 re are three arg
16110 75 6d 65 6e 74 73 3a 20 41 6e 20 38 2d 62 79 74 uments: An 8-byt
16120 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 e aligned pointe
16130 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c r to the memory,
16140 0d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 ..** the number
16150 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 of bytes in the
16160 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 memory buffer, a
16170 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 nd the minimum a
16180 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0d llocation size..
16190 0a 2a 2a 20 5e 49 66 20 74 68 65 20 66 69 72 73 .** ^If the firs
161a0 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d t pointer (the m
161b0 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 20 69 emory pointer) i
161c0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c s NULL, then SQL
161d0 69 74 65 20 72 65 76 65 72 74 73 0d 0a 2a 2a 20 ite reverts..**
161e0 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65 66 to using its def
161f0 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f ault memory allo
16200 63 61 74 6f 72 20 28 74 68 65 20 73 79 73 74 65 cator (the syste
16210 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 m malloc() imple
16220 6d 65 6e 74 61 74 69 6f 6e 29 2c 0d 0a 2a 2a 20 mentation),..**
16230 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f undoing any prio
16240 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 r invocation of
16250 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d [SQLITE_CONFIG_M
16260 41 4c 4c 4f 43 5d 2e 20 20 5e 49 66 20 74 68 65 ALLOC]. ^If the
16270 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 70 6f 69 6e ..** memory poin
16280 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 ter is not NULL
16290 61 6e 64 20 65 69 74 68 65 72 20 5b 53 51 4c 49 and either [SQLI
162a0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 TE_ENABLE_MEMSYS
162b0 33 5d 20 6f 72 0d 0a 2a 2a 20 5b 53 51 4c 49 54 3] or..** [SQLIT
162c0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 E_ENABLE_MEMSYS5
162d0 5d 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 ] are defined, t
162e0 68 65 6e 20 74 68 65 20 61 6c 74 65 72 6e 61 74 hen the alternat
162f0 69 76 65 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 61 ive memory..** a
16300 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e 67 61 llocator is enga
16310 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c ged to handle al
16320 6c 20 6f 66 20 53 51 4c 69 74 65 73 20 6d 65 6d l of SQLites mem
16330 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e ory allocation n
16340 65 65 64 73 2e 0d 0a 2a 2a 20 54 68 65 20 66 69 eeds...** The fi
16350 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 rst pointer (the
16360 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 memory pointer)
16370 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 must be aligned
16380 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 0d 0a 2a to an 8-byte..*
16390 2a 20 62 6f 75 6e 64 61 72 79 20 6f 72 20 73 75 * boundary or su
163a0 62 73 65 71 75 65 6e 74 20 62 65 68 61 76 69 6f bsequent behavio
163b0 72 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c r of SQLite will
163c0 20 62 65 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a be undefined...
163d0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 61 ** The minimum a
163e0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 69 llocation size i
163f0 73 20 63 61 70 70 65 64 20 61 74 20 32 2a 2a 31 s capped at 2**1
16400 32 2e 20 52 65 61 73 6f 6e 61 62 6c 65 20 76 61 2. Reasonable va
16410 6c 75 65 73 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 lues..** for the
16420 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 minimum allocat
16430 69 6f 6e 20 73 69 7a 65 20 61 72 65 20 32 2a 2a ion size are 2**
16440 35 20 74 68 72 6f 75 67 68 20 32 2a 2a 38 2e 3c 5 through 2**8.<
16450 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 /dd>..**..** [[S
16460 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 QLITE_CONFIG_MUT
16470 45 58 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f EX]] <dt>SQLITE_
16480 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3c 2f 64 74 CONFIG_MUTEX</dt
16490 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 28 54 68 69 >..** <dd> ^(Thi
164a0 73 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 s option takes a
164b0 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 single argument
164c0 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e which is a poin
164d0 74 65 72 20 74 6f 20 61 6e 0d 0a 2a 2a 20 69 6e ter to an..** in
164e0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 5b 73 stance of the [s
164f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 qlite3_mutex_met
16500 68 6f 64 73 5d 20 73 74 72 75 63 74 75 72 65 2e hods] structure.
16510 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 The argument s
16520 70 65 63 69 66 69 65 73 0d 0a 2a 2a 20 61 6c 74 pecifies..** alt
16530 65 72 6e 61 74 69 76 65 20 6c 6f 77 2d 6c 65 76 ernative low-lev
16540 65 6c 20 6d 75 74 65 78 20 72 6f 75 74 69 6e 65 el mutex routine
16550 73 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 s to be used in
16560 70 6c 61 63 65 0d 0a 2a 2a 20 74 68 65 20 6d 75 place..** the mu
16570 74 65 78 20 72 6f 75 74 69 6e 65 73 20 62 75 69 tex routines bui
16580 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 29 lt into SQLite.)
16590 5e 20 20 5e 53 51 4c 69 74 65 20 6d 61 6b 65 73 ^ ^SQLite makes
165a0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0d 0a a copy of the..
165b0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 ** content of th
165c0 65 20 5b 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 e [sqlite3_mutex
165d0 5f 6d 65 74 68 6f 64 73 5d 20 73 74 72 75 63 74 _methods] struct
165e0 75 72 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 ure before the c
165f0 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 all to..** [sqli
16600 74 65 33 5f 63 6f 6e 66 69 67 28 29 5d 20 72 65 te3_config()] re
16610 74 75 72 6e 73 2e 20 5e 49 66 20 53 51 4c 69 74 turns. ^If SQLit
16620 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 e is compiled wi
16630 74 68 0d 0a 2a 2a 20 74 68 65 20 5b 53 51 4c 49 th..** the [SQLI
16640 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 7c 20 TE_THREADSAFE |
16650 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
16660 45 3d 30 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d E=0] compile-tim
16670 65 20 6f 70 74 69 6f 6e 20 74 68 65 6e 0d 0a 2a e option then..*
16680 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 75 74 * the entire mut
16690 65 78 69 6e 67 20 73 75 62 73 79 73 74 65 6d 20 exing subsystem
166a0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 is omitted from
166b0 74 68 65 20 62 75 69 6c 64 20 61 6e 64 20 68 65 the build and he
166c0 6e 63 65 20 63 61 6c 6c 73 20 74 6f 0d 0a 2a 2a nce calls to..**
166d0 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 [sqlite3_config
166e0 28 29 5d 20 77 69 74 68 20 74 68 65 20 53 51 4c ()] with the SQL
166f0 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 ITE_CONFIG_MUTEX
16700 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f configuration o
16710 70 74 69 6f 6e 20 77 69 6c 6c 0d 0a 2a 2a 20 72 ption will..** r
16720 65 74 75 72 6e 20 5b 53 51 4c 49 54 45 5f 45 52 eturn [SQLITE_ER
16730 52 4f 52 5d 2e 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a ROR].</dd>..**..
16740 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 ** [[SQLITE_CONF
16750 49 47 5f 47 45 54 4d 55 54 45 58 5d 5d 20 3c 64 IG_GETMUTEX]] <d
16760 74 3e 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f t>SQLITE_CONFIG_
16770 47 45 54 4d 55 54 45 58 3c 2f 64 74 3e 0d 0a 2a GETMUTEX</dt>..*
16780 2a 20 3c 64 64 3e 20 5e 28 54 68 69 73 20 6f 70 * <dd> ^(This op
16790 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e tion takes a sin
167a0 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 gle argument whi
167b0 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 ch is a pointer
167c0 74 6f 20 61 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e to an..** instan
167d0 63 65 20 6f 66 20 74 68 65 20 5b 73 71 6c 69 74 ce of the [sqlit
167e0 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 e3_mutex_methods
167f0 5d 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 ] structure. Th
16800 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 6d e..** [sqlite3_m
16810 75 74 65 78 5f 6d 65 74 68 6f 64 73 5d 0d 0a 2a utex_methods]..*
16820 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20 66 * structure is f
16830 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 illed with the c
16840 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 urrently defined
16850 20 6d 75 74 65 78 20 72 6f 75 74 69 6e 65 73 2e mutex routines.
16860 29 5e 0d 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69 )^..** This opti
16870 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 on can be used t
16880 6f 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 64 o overload the d
16890 65 66 61 75 6c 74 20 6d 75 74 65 78 20 61 6c 6c efault mutex all
168a0 6f 63 61 74 69 6f 6e 0d 0a 2a 2a 20 72 6f 75 74 ocation..** rout
168b0 69 6e 65 73 20 77 69 74 68 20 61 20 77 72 61 70 ines with a wrap
168c0 70 65 72 20 75 73 65 64 20 74 6f 20 74 72 61 63 per used to trac
168d0 6b 20 6d 75 74 65 78 20 75 73 61 67 65 20 66 6f k mutex usage fo
168e0 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 0d 0a 2a r performance..*
168f0 2a 20 70 72 6f 66 69 6c 69 6e 67 20 6f 72 20 74 * profiling or t
16900 65 73 74 69 6e 67 2c 20 66 6f 72 20 65 78 61 6d esting, for exam
16910 70 6c 65 2e 20 20 20 5e 49 66 20 53 51 4c 69 74 ple. ^If SQLit
16920 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 e is compiled wi
16930 74 68 0d 0a 2a 2a 20 74 68 65 20 5b 53 51 4c 49 th..** the [SQLI
16940 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 7c 20 TE_THREADSAFE |
16950 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
16960 45 3d 30 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d E=0] compile-tim
16970 65 20 6f 70 74 69 6f 6e 20 74 68 65 6e 0d 0a 2a e option then..*
16980 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 75 74 * the entire mut
16990 65 78 69 6e 67 20 73 75 62 73 79 73 74 65 6d 20 exing subsystem
169a0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 is omitted from
169b0 74 68 65 20 62 75 69 6c 64 20 61 6e 64 20 68 65 the build and he
169c0 6e 63 65 20 63 61 6c 6c 73 20 74 6f 0d 0a 2a 2a nce calls to..**
169d0 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 [sqlite3_config
169e0 28 29 5d 20 77 69 74 68 20 74 68 65 20 53 51 4c ()] with the SQL
169f0 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 ITE_CONFIG_GETMU
16a00 54 45 58 20 63 6f 6e 66 69 67 75 72 61 74 69 6f TEX configuratio
16a10 6e 20 6f 70 74 69 6f 6e 20 77 69 6c 6c 0d 0a 2a n option will..*
16a20 2a 20 72 65 74 75 72 6e 20 5b 53 51 4c 49 54 45 * return [SQLITE
16a30 5f 45 52 52 4f 52 5d 2e 3c 2f 64 64 3e 0d 0a 2a _ERROR].</dd>..*
16a40 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 *..** [[SQLITE_C
16a50 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 5d ONFIG_LOOKASIDE]
16a60 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f 4e ] <dt>SQLITE_CON
16a70 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3c 2f 64 FIG_LOOKASIDE</d
16a80 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 28 54 68 t>..** <dd> ^(Th
16a90 69 73 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 is option takes
16aa0 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 68 two arguments th
16ab0 61 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 at determine the
16ac0 20 64 65 66 61 75 6c 74 0d 0a 2a 2a 20 6d 65 6d default..** mem
16ad0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 ory allocation f
16ae0 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 or the lookaside
16af0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f memory allocato
16b00 72 20 6f 6e 20 65 61 63 68 0d 0a 2a 2a 20 5b 64 r on each..** [d
16b10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
16b20 6f 6e 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 on]. The first
16b30 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0d argument is the.
16b40 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 65 61 63 68 .** size of each
16b50 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 lookaside buffe
16b60 72 20 73 6c 6f 74 20 61 6e 64 20 74 68 65 20 73 r slot and the s
16b70 65 63 6f 6e 64 20 69 73 20 74 68 65 20 6e 75 6d econd is the num
16b80 62 65 72 20 6f 66 0d 0a 2a 2a 20 73 6c 6f 74 73 ber of..** slots
16b90 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 65 61 allocated to ea
16ba0 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e ch database conn
16bb0 65 63 74 69 6f 6e 2e 29 5e 20 20 5e 28 54 68 69 ection.)^ ^(Thi
16bc0 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 s option sets th
16bd0 65 0d 0a 2a 2a 20 3c 69 3e 64 65 66 61 75 6c 74 e..** <i>default
16be0 3c 2f 69 3e 20 6c 6f 6f 6b 61 73 69 64 65 20 73 </i> lookaside s
16bf0 69 7a 65 2e 20 54 68 65 20 5b 53 51 4c 49 54 45 ize. The [SQLITE
16c00 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 _DBCONFIG_LOOKAS
16c10 49 44 45 5d 0d 0a 2a 2a 20 76 65 72 62 20 74 6f IDE]..** verb to
16c20 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e [sqlite3_db_con
16c30 66 69 67 28 29 5d 20 63 61 6e 20 62 65 20 75 73 fig()] can be us
16c40 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 ed to change the
16c50 20 6c 6f 6f 6b 61 73 69 64 65 0d 0a 2a 2a 20 63 lookaside..** c
16c60 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 6e 20 onfiguration on
16c70 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e 6e 65 individual conne
16c80 63 74 69 6f 6e 73 2e 29 5e 20 3c 2f 64 64 3e 0d ctions.)^ </dd>.
16c90 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 .**..** [[SQLITE
16ca0 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 5d _CONFIG_PCACHE2]
16cb0 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f 4e ] <dt>SQLITE_CON
16cc0 46 49 47 5f 50 43 41 43 48 45 32 3c 2f 64 74 3e FIG_PCACHE2</dt>
16cd0 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 28 54 68 69 73 ..** <dd> ^(This
16ce0 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 option takes a
16cf0 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 single argument
16d00 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 which is a point
16d10 65 72 20 74 6f 0d 0a 2a 2a 20 61 6e 20 5b 73 71 er to..** an [sq
16d20 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 lite3_pcache_met
16d30 68 6f 64 73 32 5d 20 6f 62 6a 65 63 74 2e 20 20 hods2] object.
16d40 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 This object spec
16d50 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 ifies the interf
16d60 61 63 65 0d 0a 2a 2a 20 74 6f 20 61 20 63 75 73 ace..** to a cus
16d70 74 6f 6d 20 70 61 67 65 20 63 61 63 68 65 20 69 tom page cache i
16d80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 29 5e mplementation.)^
16d90 20 20 5e 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 ^SQLite makes
16da0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0d 0a 2a a copy of the..*
16db0 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 75 73 65 * object and use
16dc0 73 20 69 74 20 66 6f 72 20 70 61 67 65 20 63 61 s it for page ca
16dd0 63 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 che memory alloc
16de0 61 74 69 6f 6e 73 2e 3c 2f 64 64 3e 0d 0a 2a 2a ations.</dd>..**
16df0 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 4f ..** [[SQLITE_CO
16e00 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 5d NFIG_GETPCACHE2]
16e10 5d 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f 4e ] <dt>SQLITE_CON
16e20 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3c 2f FIG_GETPCACHE2</
16e30 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 28 54 dt>..** <dd> ^(T
16e40 68 69 73 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 his option takes
16e50 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 a single argume
16e60 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f nt which is a po
16e70 69 6e 74 65 72 20 74 6f 20 61 6e 0d 0a 2a 2a 20 inter to an..**
16e80 5b 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f [sqlite3_pcache_
16e90 6d 65 74 68 6f 64 73 32 5d 20 6f 62 6a 65 63 74 methods2] object
16ea0 2e 20 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73 . SQLite copies
16eb0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0d of the current.
16ec0 0a 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 69 .** page cache i
16ed0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e mplementation in
16ee0 74 6f 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 29 to that object.)
16ef0 5e 20 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 ^ </dd>..**..**
16f00 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f [[SQLITE_CONFIG_
16f10 4c 4f 47 5d 5d 20 3c 64 74 3e 53 51 4c 49 54 45 LOG]] <dt>SQLITE
16f20 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3c 2f 64 74 3e _CONFIG_LOG</dt>
16f30 0d 0a 2a 2a 20 3c 64 64 3e 20 5e 54 68 65 20 53 ..** <dd> ^The S
16f40 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 QLITE_CONFIG_LOG
16f50 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 74 77 option takes tw
16f60 6f 20 61 72 67 75 6d 65 6e 74 73 3a 20 61 20 70 o arguments: a p
16f70 6f 69 6e 74 65 72 20 74 6f 20 61 0d 0a 2a 2a 20 ointer to a..**
16f80 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 function with a
16f90 63 61 6c 6c 20 73 69 67 6e 61 74 75 72 65 20 6f call signature o
16fa0 66 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c f void(*)(void*,
16fb0 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 int,const char*)
16fc0 2c 20 0d 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 , ..** and a poi
16fd0 6e 74 65 72 20 74 6f 20 76 6f 69 64 2e 20 5e 49 nter to void. ^I
16fe0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 f the function p
16ff0 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 ointer is not NU
17000 4c 4c 2c 20 69 74 20 69 73 0d 0a 2a 2a 20 69 6e LL, it is..** in
17010 76 6f 6b 65 64 20 62 79 20 5b 73 71 6c 69 74 65 voked by [sqlite
17020 33 5f 6c 6f 67 28 29 5d 20 74 6f 20 70 72 6f 63 3_log()] to proc
17030 65 73 73 20 65 61 63 68 20 6c 6f 67 67 69 6e 67 ess each logging
17040 20 65 76 65 6e 74 2e 20 20 5e 49 66 20 74 68 65 event. ^If the
17050 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f ..** function po
17060 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 inter is NULL, t
17070 68 65 20 5b 73 71 6c 69 74 65 33 5f 6c 6f 67 28 he [sqlite3_log(
17080 29 5d 20 69 6e 74 65 72 66 61 63 65 20 62 65 63 )] interface bec
17090 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a omes a no-op...*
170a0 2a 20 5e 54 68 65 20 76 6f 69 64 20 70 6f 69 6e * ^The void poin
170b0 74 65 72 20 74 68 61 74 20 69 73 20 74 68 65 20 ter that is the
170c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
170d0 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 to SQLITE_CONFIG
170e0 5f 4c 4f 47 20 69 73 0d 0a 2a 2a 20 70 61 73 73 _LOG is..** pass
170f0 65 64 20 74 68 72 6f 75 67 68 20 61 73 20 74 68 ed through as th
17100 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 e first paramete
17110 72 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 r to the applica
17120 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 6f 67 tion-defined log
17130 67 65 72 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e ger..** function
17140 20 77 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 whenever that f
17150 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b unction is invok
17160 65 64 2e 20 20 5e 54 68 65 20 73 65 63 6f 6e 64 ed. ^The second
17170 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0d 0a 2a parameter to..*
17180 2a 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e * the logger fun
17190 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20 ction is a copy
171a0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 72 of the first par
171b0 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 63 6f ameter to the co
171c0 72 72 65 73 70 6f 6e 64 69 6e 67 0d 0a 2a 2a 20 rresponding..**
171d0 5b 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 5d 20 [sqlite3_log()]
171e0 63 61 6c 6c 20 61 6e 64 20 69 73 20 69 6e 74 65 call and is inte
171f0 6e 64 65 64 20 74 6f 20 62 65 20 61 20 5b 72 65 nded to be a [re
17200 73 75 6c 74 20 63 6f 64 65 5d 20 6f 72 20 61 6e sult code] or an
17210 0d 0a 2a 2a 20 5b 65 78 74 65 6e 64 65 64 20 72 ..** [extended r
17220 65 73 75 6c 74 20 63 6f 64 65 5d 2e 20 20 5e 54 esult code]. ^T
17230 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 he third paramet
17240 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 er passed to the
17250 20 6c 6f 67 67 65 72 20 69 73 0d 0a 2a 2a 20 6c logger is..** l
17260 6f 67 20 6d 65 73 73 61 67 65 20 61 66 74 65 72 og message after
17270 20 66 6f 72 6d 61 74 74 69 6e 67 20 76 69 61 20 formatting via
17280 5b 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 [sqlite3_snprint
17290 66 28 29 5d 2e 0d 0a 2a 2a 20 54 68 65 20 53 51 f()]...** The SQ
172a0 4c 69 74 65 20 6c 6f 67 67 69 6e 67 20 69 6e 74 Lite logging int
172b0 65 72 66 61 63 65 20 69 73 20 6e 6f 74 20 72 65 erface is not re
172c0 65 6e 74 72 61 6e 74 3b 20 74 68 65 20 6c 6f 67 entrant; the log
172d0 67 65 72 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a ger function..**
172e0 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 supplied by the
172f0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 application mus
17300 74 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 61 6e 79 t not invoke any
17310 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 61 63 SQLite interfac
17320 65 2e 0d 0a 2a 2a 20 49 6e 20 61 20 6d 75 6c 74 e...** In a mult
17330 69 2d 74 68 72 65 61 64 65 64 20 61 70 70 6c 69 i-threaded appli
17340 63 61 74 69 6f 6e 2c 20 74 68 65 20 61 70 70 6c cation, the appl
17350 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 ication-defined
17360 6c 6f 67 67 65 72 0d 0a 2a 2a 20 66 75 6e 63 74 logger..** funct
17370 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 72 65 ion must be thre
17380 61 64 73 61 66 65 2e 20 3c 2f 64 64 3e 0d 0a 2a adsafe. </dd>..*
17390 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 43 *..** [[SQLITE_C
173a0 4f 4e 46 49 47 5f 55 52 49 5d 5d 20 3c 64 74 3e ONFIG_URI]] <dt>
173b0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 SQLITE_CONFIG_UR
173c0 49 0d 0a 2a 2a 20 3c 64 64 3e 20 54 68 69 73 20 I..** <dd> This
173d0 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 option takes a s
173e0 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f ingle argument o
173f0 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e f type int. If n
17400 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 0d 0a 2a on-zero, then..*
17410 2a 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 * URI handling i
17420 73 20 67 6c 6f 62 61 6c 6c 79 20 65 6e 61 62 6c s globally enabl
17430 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d ed. If the param
17440 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 eter is zero, th
17450 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 0d en URI handling.
17460 0a 2a 2a 20 69 73 20 67 6c 6f 62 61 6c 6c 79 20 .** is globally
17470 64 69 73 61 62 6c 65 64 2e 20 49 66 20 55 52 49 disabled. If URI
17480 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f handling is glo
17490 62 61 6c 6c 79 20 65 6e 61 62 6c 65 64 2c 20 61 bally enabled, a
174a0 6c 6c 20 66 69 6c 65 6e 61 6d 65 73 0d 0a 2a 2a ll filenames..**
174b0 20 70 61 73 73 65 64 20 74 6f 20 5b 73 71 6c 69 passed to [sqli
174c0 74 65 33 5f 6f 70 65 6e 28 29 5d 2c 20 5b 73 71 te3_open()], [sq
174d0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 5d lite3_open_v2()]
174e0 2c 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 , [sqlite3_open1
174f0 36 28 29 5d 20 6f 72 0d 0a 2a 2a 20 73 70 65 63 6()] or..** spec
17500 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 ified as part of
17510 20 5b 41 54 54 41 43 48 5d 20 63 6f 6d 6d 61 6e [ATTACH] comman
17520 64 73 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 ds are interpret
17530 65 64 20 61 73 20 55 52 49 73 2c 20 72 65 67 61 ed as URIs, rega
17540 72 64 6c 65 73 73 0d 0a 2a 2a 20 6f 66 20 77 68 rdless..** of wh
17550 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 ether or not the
17560 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 [SQLITE_OPEN_UR
17570 49 5d 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 I] flag is set w
17580 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 hen the database
17590 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ..** connection
175a0 69 73 20 6f 70 65 6e 65 64 2e 20 49 66 20 69 74 is opened. If it
175b0 20 69 73 20 67 6c 6f 62 61 6c 6c 79 20 64 69 73 is globally dis
175c0 61 62 6c 65 64 2c 20 66 69 6c 65 6e 61 6d 65 73 abled, filenames
175d0 20 61 72 65 0d 0a 2a 2a 20 6f 6e 6c 79 20 69 6e are..** only in
175e0 74 65 72 70 72 65 74 65 64 20 61 73 20 55 52 49 terpreted as URI
175f0 73 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f s if the SQLITE_
17600 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 OPEN_URI flag is
17610 20 73 65 74 20 77 68 65 6e 20 74 68 65 0d 0a 2a set when the..*
17620 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 * database conne
17630 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e ction is opened.
17640 20 42 79 20 64 65 66 61 75 6c 74 2c 20 55 52 49 By default, URI
17650 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f handling is glo
17660 62 61 6c 6c 79 0d 0a 2a 2a 20 64 69 73 61 62 6c bally..** disabl
17670 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 ed. The default
17680 76 61 6c 75 65 20 6d 61 79 20 62 65 20 63 68 61 value may be cha
17690 6e 67 65 64 20 62 79 20 63 6f 6d 70 69 6c 69 6e nged by compilin
176a0 67 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 5b g with the..** [
176b0 53 51 4c 49 54 45 5f 55 53 45 5f 55 52 49 5d 20 SQLITE_USE_URI]
176c0 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2e 0d symbol defined..
176d0 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 .**..** [[SQLITE
176e0 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5d 5d _CONFIG_PCACHE]]
176f0 20 5b 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 [[SQLITE_CONFIG
17700 5f 47 45 54 50 43 41 43 48 45 5d 5d 0d 0a 2a 2a _GETPCACHE]]..**
17710 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 4f 4e 46 <dt>SQLITE_CONF
17720 49 47 5f 50 43 41 43 48 45 20 61 6e 64 20 53 51 IG_PCACHE and SQ
17730 4c 49 54 45 5f 43 4f 4e 46 4e 49 47 5f 47 45 54 LITE_CONFNIG_GET
17740 50 43 41 43 48 45 0d 0a 2a 2a 20 3c 64 64 3e 20 PCACHE..** <dd>
17750 54 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 These options ar
17760 65 20 6f 62 73 6f 6c 65 74 65 20 61 6e 64 20 73 e obsolete and s
17770 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 hould not be use
17780 64 20 62 79 20 6e 65 77 20 63 6f 64 65 2e 0d 0a d by new code...
17790 2a 2a 20 54 68 65 79 20 61 72 65 20 72 65 74 61 ** They are reta
177a0 69 6e 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 ined for backwar
177b0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 ds compatibility
177c0 20 62 75 74 20 61 72 65 20 6e 6f 77 20 6e 6f 2d but are now no-
177d0 6f 70 73 2e 0d 0a 2a 2a 20 3c 2f 64 6c 3e 0d 0a ops...** </dl>..
177e0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
177f0 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 TE_CONFIG_SINGLE
17800 54 48 52 45 41 44 20 20 31 20 20 2f 2a 20 6e 69 THREAD 1 /* ni
17810 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 l */..#define SQ
17820 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 LITE_CONFIG_MULT
17830 49 54 48 52 45 41 44 20 20 20 32 20 20 2f 2a 20 ITHREAD 2 /*
17840 6e 69 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 nil */..#define
17850 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 SQLITE_CONFIG_SE
17860 52 49 41 4c 49 5a 45 44 20 20 20 20 33 20 20 2f RIALIZED 3 /
17870 2a 20 6e 69 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e * nil */..#defin
17880 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f e SQLITE_CONFIG_
17890 4d 41 4c 4c 4f 43 20 20 20 20 20 20 20 20 34 20 MALLOC 4
178a0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f /* sqlite3_mem_
178b0 6d 65 74 68 6f 64 73 2a 20 2a 2f 0d 0a 23 64 65 methods* */..#de
178c0 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 fine SQLITE_CONF
178d0 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 20 20 20 IG_GETMALLOC
178e0 20 35 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 6d 5 /* sqlite3_m
178f0 65 6d 5f 6d 65 74 68 6f 64 73 2a 20 2a 2f 0d 0a em_methods* */..
17900 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
17910 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 20 20 20 ONFIG_SCRATCH
17920 20 20 20 20 36 20 20 2f 2a 20 76 6f 69 64 2a 2c 6 /* void*,
17930 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 4e 20 2a int sz, int N *
17940 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
17950 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 E_CONFIG_PAGECAC
17960 48 45 20 20 20 20 20 37 20 20 2f 2a 20 76 6f 69 HE 7 /* voi
17970 64 2a 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 d*, int sz, int
17980 4e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 N */..#define SQ
17990 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 LITE_CONFIG_HEAP
179a0 20 20 20 20 20 20 20 20 20 20 38 20 20 2f 2a 20 8 /*
179b0 76 6f 69 64 2a 2c 20 69 6e 74 20 6e 42 79 74 65 void*, int nByte
179c0 2c 20 69 6e 74 20 6d 69 6e 20 2a 2f 0d 0a 23 64 , int min */..#d
179d0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 4f 4e efine SQLITE_CON
179e0 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20 20 20 FIG_MEMSTATUS
179f0 20 20 39 20 20 2f 2a 20 62 6f 6f 6c 65 61 6e 20 9 /* boolean
17a00 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
17a10 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 20 TE_CONFIG_MUTEX
17a20 20 20 20 20 20 20 20 31 30 20 20 2f 2a 20 73 71 10 /* sq
17a30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 lite3_mutex_meth
17a40 6f 64 73 2a 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ods* */..#define
17a50 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 SQLITE_CONFIG_G
17a60 45 54 4d 55 54 45 58 20 20 20 20 20 31 31 20 20 ETMUTEX 11
17a70 2f 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 /* sqlite3_mutex
17a80 5f 6d 65 74 68 6f 64 73 2a 20 2a 2f 0d 0a 2f 2a _methods* */../*
17a90 20 70 72 65 76 69 6f 75 73 6c 79 20 53 51 4c 49 previously SQLI
17aa0 54 45 5f 43 4f 4e 46 49 47 5f 43 48 55 4e 4b 41 TE_CONFIG_CHUNKA
17ab0 4c 4c 4f 43 20 31 32 20 77 68 69 63 68 20 69 73 LLOC 12 which is
17ac0 20 6e 6f 77 20 75 6e 75 73 65 64 2e 20 2a 2f 20 now unused. */
17ad0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
17ae0 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 _CONFIG_LOOKASID
17af0 45 20 20 20 20 31 33 20 20 2f 2a 20 69 6e 74 20 E 13 /* int
17b00 69 6e 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 int */..#define
17b10 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 SQLITE_CONFIG_PC
17b20 41 43 48 45 20 20 20 20 20 20 20 31 34 20 20 2f ACHE 14 /
17b30 2a 20 6e 6f 2d 6f 70 20 2a 2f 0d 0a 23 64 65 66 * no-op */..#def
17b40 69 6e 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 ine SQLITE_CONFI
17b50 47 5f 47 45 54 50 43 41 43 48 45 20 20 20 20 31 G_GETPCACHE 1
17b60 35 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0d 0a 5 /* no-op */..
17b70 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
17b80 4f 4e 46 49 47 5f 4c 4f 47 20 20 20 20 20 20 20 ONFIG_LOG
17b90 20 20 20 31 36 20 20 2f 2a 20 78 46 75 6e 63 2c 16 /* xFunc,
17ba0 20 76 6f 69 64 2a 20 2a 2f 0d 0a 23 64 65 66 69 void* */..#defi
17bb0 6e 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ne SQLITE_CONFIG
17bc0 5f 55 52 49 20 20 20 20 20 20 20 20 20 20 31 37 _URI 17
17bd0 20 20 2f 2a 20 69 6e 74 20 2a 2f 0d 0a 23 64 65 /* int */..#de
17be0 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 fine SQLITE_CONF
17bf0 49 47 5f 50 43 41 43 48 45 32 20 20 20 20 20 20 IG_PCACHE2
17c00 31 38 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 70 18 /* sqlite3_p
17c10 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 20 cache_methods2*
17c20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
17c30 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 TE_CONFIG_GETPCA
17c40 43 48 45 32 20 20 20 31 39 20 20 2f 2a 20 73 71 CHE2 19 /* sq
17c50 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 lite3_pcache_met
17c60 68 6f 64 73 32 2a 20 2a 2f 0d 0a 0d 0a 2f 2a 0d hods2* */..../*.
17c70 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 61 .** CAPI3REF: Da
17c80 74 61 62 61 73 65 20 43 6f 6e 6e 65 63 74 69 6f tabase Connectio
17c90 6e 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 n Configuration
17ca0 4f 70 74 69 6f 6e 73 0d 0a 2a 2a 0d 0a 2a 2a 20 Options..**..**
17cb0 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 These constants
17cc0 61 72 65 20 74 68 65 20 61 76 61 69 6c 61 62 6c are the availabl
17cd0 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 66 69 67 e integer config
17ce0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 uration options
17cf0 74 68 61 74 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 that..** can be
17d00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 passed as the se
17d10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f cond argument to
17d20 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 64 62 the [sqlite3_db
17d30 5f 63 6f 6e 66 69 67 28 29 5d 20 69 6e 74 65 72 _config()] inter
17d40 66 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 65 face...**..** Ne
17d50 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 w configuration
17d60 6f 70 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 61 options may be a
17d70 64 64 65 64 20 69 6e 20 66 75 74 75 72 65 20 72 dded in future r
17d80 65 6c 65 61 73 65 73 20 6f 66 20 53 51 4c 69 74 eleases of SQLit
17d90 65 2e 0d 0a 2a 2a 20 45 78 69 73 74 69 6e 67 20 e...** Existing
17da0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 configuration op
17db0 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 64 tions might be d
17dc0 69 73 63 6f 6e 74 69 6e 75 65 64 2e 20 20 41 70 iscontinued. Ap
17dd0 70 6c 69 63 61 74 69 6f 6e 73 0d 0a 2a 2a 20 73 plications..** s
17de0 68 6f 75 6c 64 20 63 68 65 63 6b 20 74 68 65 20 hould check the
17df0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d return code from
17e00 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e [sqlite3_db_con
17e10 66 69 67 28 29 5d 20 74 6f 20 6d 61 6b 65 20 73 fig()] to make s
17e20 75 72 65 20 74 68 61 74 0d 0a 2a 2a 20 74 68 65 ure that..** the
17e30 20 63 61 6c 6c 20 77 6f 72 6b 65 64 2e 20 20 5e call worked. ^
17e40 54 68 65 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f The [sqlite3_db_
17e50 63 6f 6e 66 69 67 28 29 5d 20 69 6e 74 65 72 66 config()] interf
17e60 61 63 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 ace will return
17e70 61 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 5b a..** non-zero [
17e80 65 72 72 6f 72 20 63 6f 64 65 5d 20 69 66 20 61 error code] if a
17e90 20 64 69 73 63 6f 6e 74 69 6e 75 65 64 20 6f 72 discontinued or
17ea0 20 75 6e 73 75 70 70 6f 72 74 65 64 20 63 6f 6e unsupported con
17eb0 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f figuration optio
17ec0 6e 0d 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 n..** is invoked
17ed0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 64 6c 3e 0d 0a ...**..** <dl>..
17ee0 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 44 42 ** <dt>SQLITE_DB
17ef0 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 CONFIG_LOOKASIDE
17f00 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 20 5e </dt>..** <dd> ^
17f10 54 68 69 73 20 6f 70 74 69 6f 6e 20 74 61 6b 65 This option take
17f20 73 20 74 68 72 65 65 20 61 64 64 69 74 69 6f 6e s three addition
17f30 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 al arguments tha
17f40 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 t determine the
17f50 0d 0a 2a 2a 20 5b 6c 6f 6f 6b 61 73 69 64 65 20 ..** [lookaside
17f60 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 memory allocator
17f70 5d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 ] configuration
17f80 66 6f 72 20 74 68 65 20 5b 64 61 74 61 62 61 73 for the [databas
17f90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 2e 0d 0a e connection]...
17fa0 2a 2a 20 5e 54 68 65 20 66 69 72 73 74 20 61 72 ** ^The first ar
17fb0 67 75 6d 65 6e 74 20 28 74 68 65 20 74 68 69 72 gument (the thir
17fc0 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 5b d parameter to [
17fd0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 sqlite3_db_confi
17fe0 67 28 29 5d 20 69 73 20 61 0d 0a 2a 2a 20 70 6f g()] is a..** po
17ff0 69 6e 74 65 72 20 74 6f 20 61 20 6d 65 6d 6f 72 inter to a memor
18000 79 20 62 75 66 66 65 72 20 74 6f 20 75 73 65 20 y buffer to use
18010 66 6f 72 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 for lookaside me
18020 6d 6f 72 79 2e 0d 0a 2a 2a 20 5e 54 68 65 20 66 mory...** ^The f
18030 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 66 irst argument af
18040 74 65 72 20 74 68 65 20 53 51 4c 49 54 45 5f 44 ter the SQLITE_D
18050 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 BCONFIG_LOOKASID
18060 45 20 76 65 72 62 0d 0a 2a 2a 20 6d 61 79 20 62 E verb..** may b
18070 65 20 4e 55 4c 4c 20 69 6e 20 77 68 69 63 68 20 e NULL in which
18080 63 61 73 65 20 53 51 4c 69 74 65 20 77 69 6c 6c case SQLite will
18090 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 0d 0a 2a allocate the..*
180a0 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 * lookaside buff
180b0 65 72 20 69 74 73 65 6c 66 20 75 73 69 6e 67 20 er itself using
180c0 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 [sqlite3_malloc(
180d0 29 5d 2e 20 5e 54 68 65 20 73 65 63 6f 6e 64 20 )]. ^The second
180e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0d argument is the.
180f0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 65 61 63 68 .** size of each
18100 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 lookaside buffe
18110 72 20 73 6c 6f 74 2e 20 20 5e 54 68 65 20 74 68 r slot. ^The th
18120 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 ird argument is
18130 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d 0a 2a the number of..*
18140 2a 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 73 69 * slots. The si
18150 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 ze of the buffer
18160 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 in the first ar
18170 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 67 gument must be g
18180 72 65 61 74 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 reater than..**
18190 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 or equal to the
181a0 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 20 73 product of the s
181b0 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 econd and third
181c0 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 arguments. The
181d0 62 75 66 66 65 72 0d 0a 2a 2a 20 6d 75 73 74 20 buffer..** must
181e0 62 65 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e be aligned to an
181f0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 8-byte boundary
18200 2e 20 20 5e 49 66 20 74 68 65 20 73 65 63 6f 6e . ^If the secon
18210 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 0d 0a 2a d argument to..*
18220 2a 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 * SQLITE_DBCONFI
18230 47 5f 4c 4f 4f 4b 41 53 49 44 45 20 69 73 20 6e G_LOOKASIDE is n
18240 6f 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 ot a multiple of
18250 20 38 2c 20 69 74 20 69 73 20 69 6e 74 65 72 6e 8, it is intern
18260 61 6c 6c 79 0d 0a 2a 2a 20 72 6f 75 6e 64 65 64 ally..** rounded
18270 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 78 down to the nex
18280 74 20 73 6d 61 6c 6c 65 72 20 6d 75 6c 74 69 70 t smaller multip
18290 6c 65 20 6f 66 20 38 2e 20 20 5e 28 54 68 65 20 le of 8. ^(The
182a0 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 lookaside memory
182b0 0d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 ..** configurati
182c0 6f 6e 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 on for a databas
182d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e e connection can
182e0 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 only be changed
182f0 20 77 68 65 6e 20 74 68 61 74 0d 0a 2a 2a 20 63 when that..** c
18300 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6e 6f 74 onnection is not
18310 20 63 75 72 72 65 6e 74 6c 79 20 75 73 69 6e 67 currently using
18320 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 lookaside memor
18330 79 2c 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 77 y, or in other w
18340 6f 72 64 73 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 ords..** when th
18350 65 20 22 63 75 72 72 65 6e 74 20 76 61 6c 75 65 e "current value
18360 22 20 72 65 74 75 72 6e 65 64 20 62 79 0d 0a 2a " returned by..*
18370 2a 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 * [sqlite3_db_st
18380 61 74 75 73 5d 28 44 2c 5b 53 51 4c 49 54 45 5f atus](D,[SQLITE_
18390 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 CONFIG_LOOKASIDE
183a0 5d 2c 2e 2e 2e 29 20 69 73 20 7a 65 72 6f 2e 0d ],...) is zero..
183b0 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 .** Any attempt
183c0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 6f to change the lo
183d0 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 63 okaside memory c
183e0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 65 onfiguration whe
183f0 6e 20 6c 6f 6f 6b 61 73 69 64 65 0d 0a 2a 2a 20 n lookaside..**
18400 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 75 73 65 memory is in use
18410 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 66 leaves the conf
18420 69 67 75 72 61 74 69 6f 6e 20 75 6e 63 68 61 6e iguration unchan
18430 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 73 20 ged and returns
18440 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 42 55 53 ..** [SQLITE_BUS
18450 59 5d 2e 29 5e 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a Y].)^</dd>..**..
18460 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 44 42 ** <dt>SQLITE_DB
18470 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b CONFIG_ENABLE_FK
18480 45 59 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e EY</dt>..** <dd>
18490 20 5e 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 ^This option is
184a0 20 75 73 65 64 20 74 6f 20 65 6e 61 62 6c 65 20 used to enable
184b0 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 or disable the e
184c0 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 0d 0a 2a nforcement of..*
184d0 2a 20 5b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 * [foreign key c
184e0 6f 6e 73 74 72 61 69 6e 74 73 5d 2e 20 20 54 68 onstraints]. Th
184f0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 77 ere should be tw
18500 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 72 67 o additional arg
18510 75 6d 65 6e 74 73 2e 0d 0a 2a 2a 20 54 68 65 20 uments...** The
18520 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 first argument i
18530 73 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 s an integer whi
18540 63 68 20 69 73 20 30 20 74 6f 20 64 69 73 61 62 ch is 0 to disab
18550 6c 65 20 46 4b 20 65 6e 66 6f 72 63 65 6d 65 6e le FK enforcemen
18560 74 2c 0d 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 t,..** positive
18570 74 6f 20 65 6e 61 62 6c 65 20 46 4b 20 65 6e 66 to enable FK enf
18580 6f 72 63 65 6d 65 6e 74 20 6f 72 20 6e 65 67 61 orcement or nega
18590 74 69 76 65 20 74 6f 20 6c 65 61 76 65 20 46 4b tive to leave FK
185a0 20 65 6e 66 6f 72 63 65 6d 65 6e 74 0d 0a 2a 2a enforcement..**
185b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 unchanged. The
185c0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 second paramete
185d0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 r is a pointer t
185e0 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 o an integer int
185f0 6f 20 77 68 69 63 68 0d 0a 2a 2a 20 69 73 20 77 o which..** is w
18600 72 69 74 74 65 6e 20 30 20 6f 72 20 31 20 74 6f ritten 0 or 1 to
18610 20 69 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 indicate whethe
18620 72 20 46 4b 20 65 6e 66 6f 72 63 65 6d 65 6e 74 r FK enforcement
18630 20 69 73 20 6f 66 66 20 6f 72 20 6f 6e 0d 0a 2a is off or on..*
18640 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 * following this
18650 20 63 61 6c 6c 2e 20 20 54 68 65 20 73 65 63 6f call. The seco
18660 6e 64 20 70 61 72 61 6d 65 74 65 72 20 6d 61 79 nd parameter may
18670 20 62 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 be a NULL point
18680 65 72 2c 20 69 6e 0d 0a 2a 2a 20 77 68 69 63 68 er, in..** which
18690 20 63 61 73 65 20 74 68 65 20 46 4b 20 65 6e 66 case the FK enf
186a0 6f 72 63 65 6d 65 6e 74 20 73 65 74 74 69 6e 67 orcement setting
186b0 20 69 73 20 6e 6f 74 20 72 65 70 6f 72 74 65 64 is not reported
186c0 20 62 61 63 6b 2e 20 3c 2f 64 64 3e 0d 0a 2a 2a back. </dd>..**
186d0 0d 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f ..** <dt>SQLITE_
186e0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f DBCONFIG_ENABLE_
186f0 54 52 49 47 47 45 52 3c 2f 64 74 3e 0d 0a 2a 2a TRIGGER</dt>..**
18700 20 3c 64 64 3e 20 5e 54 68 69 73 20 6f 70 74 69 <dd> ^This opti
18710 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e on is used to en
18720 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 able or disable
18730 5b 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 [CREATE TRIGGER
18740 7c 20 74 72 69 67 67 65 72 73 5d 2e 0d 0a 2a 2a | triggers]...**
18750 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 There should be
18760 20 74 77 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 two additional
18770 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a 2a 20 54 arguments...** T
18780 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e he first argumen
18790 74 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 t is an integer
187a0 77 68 69 63 68 20 69 73 20 30 20 74 6f 20 64 69 which is 0 to di
187b0 73 61 62 6c 65 20 74 72 69 67 67 65 72 73 2c 0d sable triggers,.
187c0 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 74 6f 20 .** positive to
187d0 65 6e 61 62 6c 65 20 74 72 69 67 67 65 72 73 20 enable triggers
187e0 6f 72 20 6e 65 67 61 74 69 76 65 20 74 6f 20 6c or negative to l
187f0 65 61 76 65 20 74 68 65 20 73 65 74 74 69 6e 67 eave the setting
18800 20 75 6e 63 68 61 6e 67 65 64 2e 0d 0a 2a 2a 20 unchanged...**
18810 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d The second param
18820 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 eter is a pointe
18830 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 r to an integer
18840 69 6e 74 6f 20 77 68 69 63 68 0d 0a 2a 2a 20 69 into which..** i
18850 73 20 77 72 69 74 74 65 6e 20 30 20 6f 72 20 31 s written 0 or 1
18860 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 to indicate whe
18870 74 68 65 72 20 74 72 69 67 67 65 72 73 20 61 72 ther triggers ar
18880 65 20 64 69 73 61 62 6c 65 64 20 6f 72 20 65 6e e disabled or en
18890 61 62 6c 65 64 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 abled..** follow
188a0 69 6e 67 20 74 68 69 73 20 63 61 6c 6c 2e 20 20 ing this call.
188b0 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d The second param
188c0 65 74 65 72 20 6d 61 79 20 62 65 20 61 20 4e 55 eter may be a NU
188d0 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 69 6e 0d 0a LL pointer, in..
188e0 2a 2a 20 77 68 69 63 68 20 63 61 73 65 20 74 68 ** which case th
188f0 65 20 74 72 69 67 67 65 72 20 73 65 74 74 69 6e e trigger settin
18900 67 20 69 73 20 6e 6f 74 20 72 65 70 6f 72 74 65 g is not reporte
18910 64 20 62 61 63 6b 2e 20 3c 2f 64 64 3e 0d 0a 2a d back. </dd>..*
18920 2a 0d 0a 2a 2a 20 3c 2f 64 6c 3e 0d 0a 2a 2f 0d *..** </dl>..*/.
18930 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
18940 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 DBCONFIG_LOOKASI
18950 44 45 20 20 20 20 20 20 20 31 30 30 31 20 20 2f DE 1001 /
18960 2a 20 76 6f 69 64 2a 20 69 6e 74 20 69 6e 74 20 * void* int int
18970 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
18980 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 TE_DBCONFIG_ENAB
18990 4c 45 5f 46 4b 45 59 20 20 20 20 20 31 30 30 32 LE_FKEY 1002
189a0 20 20 2f 2a 20 69 6e 74 20 69 6e 74 2a 20 2a 2f /* int int* */
189b0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
189c0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 _DBCONFIG_ENABLE
189d0 5f 54 52 49 47 47 45 52 20 20 31 30 30 33 20 20 _TRIGGER 1003
189e0 2f 2a 20 69 6e 74 20 69 6e 74 2a 20 2a 2f 0d 0a /* int int* */..
189f0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
18a00 52 45 46 3a 20 45 6e 61 62 6c 65 20 4f 72 20 44 REF: Enable Or D
18a10 69 73 61 62 6c 65 20 45 78 74 65 6e 64 65 64 20 isable Extended
18a20 52 65 73 75 6c 74 20 43 6f 64 65 73 0d 0a 2a 2a Result Codes..**
18a30 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 ..** ^The sqlite
18a40 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 3_extended_resul
18a50 74 5f 63 6f 64 65 73 28 29 20 72 6f 75 74 69 6e t_codes() routin
18a60 65 20 65 6e 61 62 6c 65 73 20 6f 72 20 64 69 73 e enables or dis
18a70 61 62 6c 65 73 20 74 68 65 0d 0a 2a 2a 20 5b 65 ables the..** [e
18a80 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 xtended result c
18a90 6f 64 65 73 5d 20 66 65 61 74 75 72 65 20 6f 66 odes] feature of
18aa0 20 53 51 4c 69 74 65 2e 20 5e 54 68 65 20 65 78 SQLite. ^The ex
18ab0 74 65 6e 64 65 64 20 72 65 73 75 6c 74 0d 0a 2a tended result..*
18ac0 2a 20 63 6f 64 65 73 20 61 72 65 20 64 69 73 61 * codes are disa
18ad0 62 6c 65 64 20 62 79 20 64 65 66 61 75 6c 74 20 bled by default
18ae0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 for historical c
18af0 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0d 0a 2a ompatibility...*
18b00 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
18b10 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 t sqlite3_extend
18b20 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 ed_result_codes(
18b30 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 20 6f 6e sqlite3*, int on
18b40 6f 66 66 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 off);..../*..**
18b50 43 41 50 49 33 52 45 46 3a 20 4c 61 73 74 20 49 CAPI3REF: Last I
18b60 6e 73 65 72 74 20 52 6f 77 69 64 0d 0a 2a 2a 0d nsert Rowid..**.
18b70 0a 2a 2a 20 5e 45 61 63 68 20 65 6e 74 72 79 20 .** ^Each entry
18b80 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 74 61 62 in an SQLite tab
18b90 6c 65 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 le has a unique
18ba0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 0d 0a 2a 64-bit signed..*
18bb0 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 61 * integer key ca
18bc0 6c 6c 65 64 20 74 68 65 20 5b 52 4f 57 49 44 20 lled the [ROWID
18bd0 7c 20 22 72 6f 77 69 64 22 5d 2e 20 5e 54 68 65 | "rowid"]. ^The
18be0 20 72 6f 77 69 64 20 69 73 20 61 6c 77 61 79 73 rowid is always
18bf0 20 61 76 61 69 6c 61 62 6c 65 0d 0a 2a 2a 20 61 available..** a
18c00 73 20 61 6e 20 75 6e 64 65 63 6c 61 72 65 64 20 s an undeclared
18c10 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 52 4f 57 column named ROW
18c20 49 44 2c 20 4f 49 44 2c 20 6f 72 20 5f 52 4f 57 ID, OID, or _ROW
18c30 49 44 5f 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 ID_ as long as t
18c40 68 6f 73 65 0d 0a 2a 2a 20 6e 61 6d 65 73 20 61 hose..** names a
18c50 72 65 20 6e 6f 74 20 61 6c 73 6f 20 75 73 65 64 re not also used
18c60 20 62 79 20 65 78 70 6c 69 63 69 74 6c 79 20 64 by explicitly d
18c70 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 2e eclared columns.
18c80 20 5e 49 66 0d 0a 2a 2a 20 74 68 65 20 74 61 62 ^If..** the tab
18c90 6c 65 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 le has a column
18ca0 6f 66 20 74 79 70 65 20 5b 49 4e 54 45 47 45 52 of type [INTEGER
18cb0 20 50 52 49 4d 41 52 59 20 4b 45 59 5d 20 74 68 PRIMARY KEY] th
18cc0 65 6e 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0d 0a en that column..
18cd0 2a 2a 20 69 73 20 61 6e 6f 74 68 65 72 20 61 6c ** is another al
18ce0 69 61 73 20 66 6f 72 20 74 68 65 20 72 6f 77 69 ias for the rowi
18cf0 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 d...**..** ^This
18d00 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
18d10 20 74 68 65 20 5b 72 6f 77 69 64 5d 20 6f 66 20 the [rowid] of
18d20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0d the most recent.
18d30 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 5b .** successful [
18d40 49 4e 53 45 52 54 5d 20 69 6e 74 6f 20 74 68 65 INSERT] into the
18d50 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 74 database from t
18d60 68 65 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e he [database con
18d70 6e 65 63 74 69 6f 6e 5d 0d 0a 2a 2a 20 69 6e 20 nection]..** in
18d80 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
18d90 6e 74 2e 20 20 5e 41 73 20 6f 66 20 53 51 4c 69 nt. ^As of SQLi
18da0 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 37 te version 3.7.7
18db0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 0d , this routines.
18dc0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 .** records the
18dd0 6c 61 73 74 20 69 6e 73 65 72 74 20 72 6f 77 69 last insert rowi
18de0 64 20 6f 66 20 62 6f 74 68 20 6f 72 64 69 6e 61 d of both ordina
18df0 72 79 20 74 61 62 6c 65 73 20 61 6e 64 20 5b 76 ry tables and [v
18e00 69 72 74 75 61 6c 20 74 61 62 6c 65 73 5d 2e 0d irtual tables]..
18e10 0a 2a 2a 20 5e 49 66 20 6e 6f 20 73 75 63 63 65 .** ^If no succe
18e20 73 73 66 75 6c 20 5b 49 4e 53 45 52 54 5d 73 0d ssful [INSERT]s.
18e30 0a 2a 2a 20 68 61 76 65 20 65 76 65 72 20 6f 63 .** have ever oc
18e40 63 75 72 72 65 64 20 6f 6e 20 74 68 61 74 20 64 curred on that d
18e50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
18e60 6f 6e 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 on, zero is retu
18e70 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 rned...**..** ^(
18e80 49 66 20 61 6e 20 5b 49 4e 53 45 52 54 5d 20 6f If an [INSERT] o
18e90 63 63 75 72 73 20 77 69 74 68 69 6e 20 61 20 74 ccurs within a t
18ea0 72 69 67 67 65 72 20 6f 72 20 77 69 74 68 69 6e rigger or within
18eb0 20 61 20 5b 76 69 72 74 75 61 6c 20 74 61 62 6c a [virtual tabl
18ec0 65 5d 0d 0a 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 e]..** method, t
18ed0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 hen this routine
18ee0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 will return the
18ef0 20 5b 72 6f 77 69 64 5d 20 6f 66 20 74 68 65 20 [rowid] of the
18f00 69 6e 73 65 72 74 65 64 0d 0a 2a 2a 20 72 6f 77 inserted..** row
18f10 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 as long as the
18f20 74 72 69 67 67 65 72 20 6f 72 20 76 69 72 74 75 trigger or virtu
18f30 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 al table method
18f40 69 73 20 72 75 6e 6e 69 6e 67 2e 0d 0a 2a 2a 20 is running...**
18f50 42 75 74 20 6f 6e 63 65 20 74 68 65 20 74 72 69 But once the tri
18f60 67 67 65 72 20 6f 72 20 76 69 72 74 75 61 6c 20 gger or virtual
18f70 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 65 6e 64 table method end
18f80 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 s, the value ret
18f90 75 72 6e 65 64 20 0d 0a 2a 2a 20 62 79 20 74 68 urned ..** by th
18fa0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 76 65 72 is routine rever
18fb0 74 73 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 ts to what it wa
18fc0 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 69 s before the tri
18fd0 67 67 65 72 20 6f 72 20 76 69 72 74 75 61 6c 0d gger or virtual.
18fe0 0a 2a 2a 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 .** table method
18ff0 20 62 65 67 61 6e 2e 29 5e 0d 0a 2a 2a 0d 0a 2a began.)^..**..*
19000 2a 20 5e 41 6e 20 5b 49 4e 53 45 52 54 5d 20 74 * ^An [INSERT] t
19010 68 61 74 20 66 61 69 6c 73 20 64 75 65 20 74 6f hat fails due to
19020 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 a constraint vi
19030 6f 6c 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 olation is not a
19040 0d 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 ..** successful
19050 5b 49 4e 53 45 52 54 5d 20 61 6e 64 20 64 6f 65 [INSERT] and doe
19060 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 s not change the
19070 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 value returned
19080 62 79 20 74 68 69 73 0d 0a 2a 2a 20 72 6f 75 74 by this..** rout
19090 69 6e 65 2e 20 20 5e 54 68 75 73 20 49 4e 53 45 ine. ^Thus INSE
190a0 52 54 20 4f 52 20 46 41 49 4c 2c 20 49 4e 53 45 RT OR FAIL, INSE
190b0 52 54 20 4f 52 20 49 47 4e 4f 52 45 2c 20 49 4e RT OR IGNORE, IN
190c0 53 45 52 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b SERT OR ROLLBACK
190d0 2c 0d 0a 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 ,..** and INSERT
190e0 20 4f 52 20 41 42 4f 52 54 20 6d 61 6b 65 20 6e OR ABORT make n
190f0 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 o changes to the
19100 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 return value of
19110 20 74 68 69 73 0d 0a 2a 2a 20 72 6f 75 74 69 6e this..** routin
19120 65 20 77 68 65 6e 20 74 68 65 69 72 20 69 6e 73 e when their ins
19130 65 72 74 69 6f 6e 20 66 61 69 6c 73 2e 20 20 5e ertion fails. ^
19140 28 57 68 65 6e 20 49 4e 53 45 52 54 20 4f 52 20 (When INSERT OR
19150 52 45 50 4c 41 43 45 0d 0a 2a 2a 20 65 6e 63 6f REPLACE..** enco
19160 75 6e 74 65 72 73 20 61 20 63 6f 6e 73 74 72 61 unters a constra
19170 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2c 20 69 int violation, i
19180 74 20 64 6f 65 73 20 6e 6f 74 20 66 61 69 6c 2e t does not fail.
19190 20 20 54 68 65 0d 0a 2a 2a 20 49 4e 53 45 52 54 The..** INSERT
191a0 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 63 6f continues to co
191b0 6d 70 6c 65 74 69 6f 6e 20 61 66 74 65 72 20 64 mpletion after d
191c0 65 6c 65 74 69 6e 67 20 72 6f 77 73 20 74 68 61 eleting rows tha
191d0 74 20 63 61 75 73 65 64 0d 0a 2a 2a 20 74 68 65 t caused..** the
191e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72 6f 62 constraint prob
191f0 6c 65 6d 20 73 6f 20 49 4e 53 45 52 54 20 4f 52 lem so INSERT OR
19200 20 52 45 50 4c 41 43 45 20 77 69 6c 6c 20 61 6c REPLACE will al
19210 77 61 79 73 20 63 68 61 6e 67 65 0d 0a 2a 2a 20 ways change..**
19220 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
19230 20 6f 66 20 74 68 69 73 20 69 6e 74 65 72 66 61 of this interfa
19240 63 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 46 ce.)^..**..** ^F
19250 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 or the purposes
19260 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c of this routine,
19270 20 61 6e 20 5b 49 4e 53 45 52 54 5d 20 69 73 20 an [INSERT] is
19280 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 0d 0a 2a considered to..*
19290 2a 20 62 65 20 73 75 63 63 65 73 73 66 75 6c 20 * be successful
192a0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 73 75 even if it is su
192b0 62 73 65 71 75 65 6e 74 6c 79 20 72 6f 6c 6c 65 bsequently rolle
192c0 64 20 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 d back...**..**
192d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
192e0 20 61 63 63 65 73 73 69 62 6c 65 20 74 6f 20 53 accessible to S
192f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 76 69 QL statements vi
19300 61 20 74 68 65 0d 0a 2a 2a 20 5b 6c 61 73 74 5f a the..** [last_
19310 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53 insert_rowid() S
19320 51 4c 20 66 75 6e 63 74 69 6f 6e 5d 2e 0d 0a 2a QL function]...*
19330 2a 0d 0a 2a 2a 20 49 66 20 61 20 73 65 70 61 72 *..** If a separ
19340 61 74 65 20 74 68 72 65 61 64 20 70 65 72 66 6f ate thread perfo
19350 72 6d 73 20 61 20 6e 65 77 20 5b 49 4e 53 45 52 rms a new [INSER
19360 54 5d 20 6f 6e 20 74 68 65 20 73 61 6d 65 0d 0a T] on the same..
19370 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e ** database conn
19380 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 ection while the
19390 20 5b 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 [sqlite3_last_i
193a0 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 5d 0d 0a nsert_rowid()]..
193b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 ** function is r
193c0 75 6e 6e 69 6e 67 20 61 6e 64 20 74 68 75 73 20 unning and thus
193d0 63 68 61 6e 67 65 73 20 74 68 65 20 6c 61 73 74 changes the last
193e0 20 69 6e 73 65 72 74 20 5b 72 6f 77 69 64 5d 2c insert [rowid],
193f0 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 ..** then the va
19400 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 lue returned by
19410 5b 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e [sqlite3_last_in
19420 73 65 72 74 5f 72 6f 77 69 64 28 29 5d 20 69 73 sert_rowid()] is
19430 0d 0a 2a 2a 20 75 6e 70 72 65 64 69 63 74 61 62 ..** unpredictab
19440 6c 65 20 61 6e 64 20 6d 69 67 68 74 20 6e 6f 74 le and might not
19450 20 65 71 75 61 6c 20 65 69 74 68 65 72 20 74 68 equal either th
19460 65 20 6f 6c 64 20 6f 72 20 74 68 65 20 6e 65 77 e old or the new
19470 0d 0a 2a 2a 20 6c 61 73 74 20 69 6e 73 65 72 74 ..** last insert
19480 20 5b 72 6f 77 69 64 5d 2e 0d 0a 2a 2f 0d 0a 53 [rowid]...*/..S
19490 51 4c 49 54 45 5f 41 50 49 20 73 71 6c 69 74 65 QLITE_API sqlite
194a0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 3_int64 sqlite3_
194b0 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 last_insert_rowi
194c0 64 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a d(sqlite3*);....
194d0 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
194e0 20 43 6f 75 6e 74 20 54 68 65 20 4e 75 6d 62 65 Count The Numbe
194f0 72 20 4f 66 20 52 6f 77 73 20 4d 6f 64 69 66 69 r Of Rows Modifi
19500 65 64 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 ed..**..** ^This
19510 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
19520 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
19530 64 61 74 61 62 61 73 65 20 72 6f 77 73 20 74 68 database rows th
19540 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64 0d at were changed.
19550 0a 2a 2a 20 6f 72 20 69 6e 73 65 72 74 65 64 20 .** or inserted
19560 6f 72 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 or deleted by th
19570 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 e most recently
19580 63 6f 6d 70 6c 65 74 65 64 20 53 51 4c 20 73 74 completed SQL st
19590 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 6f 6e 20 74 atement..** on t
195a0 68 65 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e he [database con
195b0 6e 65 63 74 69 6f 6e 5d 20 73 70 65 63 69 66 69 nection] specifi
195c0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 ed by the first
195d0 70 61 72 61 6d 65 74 65 72 2e 0d 0a 2a 2a 20 5e parameter...** ^
195e0 28 4f 6e 6c 79 20 63 68 61 6e 67 65 73 20 74 68 (Only changes th
195f0 61 74 20 61 72 65 20 64 69 72 65 63 74 6c 79 20 at are directly
19600 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 specified by the
19610 20 5b 49 4e 53 45 52 54 5d 2c 20 5b 55 50 44 41 [INSERT], [UPDA
19620 54 45 5d 2c 0d 0a 2a 2a 20 6f 72 20 5b 44 45 4c TE],..** or [DEL
19630 45 54 45 5d 20 73 74 61 74 65 6d 65 6e 74 20 61 ETE] statement a
19640 72 65 20 63 6f 75 6e 74 65 64 2e 20 20 41 75 78 re counted. Aux
19650 69 6c 69 61 72 79 20 63 68 61 6e 67 65 73 20 63 iliary changes c
19660 61 75 73 65 64 20 62 79 0d 0a 2a 2a 20 74 72 69 aused by..** tri
19670 67 67 65 72 73 20 6f 72 20 5b 66 6f 72 65 69 67 ggers or [foreig
19680 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 5d 20 61 n key actions] a
19690 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 29 re not counted.)
196a0 5e 20 55 73 65 20 74 68 65 0d 0a 2a 2a 20 5b 73 ^ Use the..** [s
196b0 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 qlite3_total_cha
196c0 6e 67 65 73 28 29 5d 20 66 75 6e 63 74 69 6f 6e nges()] function
196d0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 74 6f 74 to find the tot
196e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 al number of cha
196f0 6e 67 65 73 0d 0a 2a 2a 20 69 6e 63 6c 75 64 69 nges..** includi
19700 6e 67 20 63 68 61 6e 67 65 73 20 63 61 75 73 65 ng changes cause
19710 64 20 62 79 20 74 72 69 67 67 65 72 73 20 61 6e d by triggers an
19720 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 d foreign key ac
19730 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e tions...**..** ^
19740 43 68 61 6e 67 65 73 20 74 6f 20 61 20 76 69 65 Changes to a vie
19750 77 20 74 68 61 74 20 61 72 65 20 73 69 6d 75 6c w that are simul
19760 61 74 65 64 20 62 79 20 61 6e 20 5b 49 4e 53 54 ated by an [INST
19770 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 5d 0d EAD OF trigger].
19780 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e .** are not coun
19790 74 65 64 2e 20 20 4f 6e 6c 79 20 72 65 61 6c 20 ted. Only real
197a0 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 72 table changes ar
197b0 65 20 63 6f 75 6e 74 65 64 2e 0d 0a 2a 2a 0d 0a e counted...**..
197c0 2a 2a 20 5e 28 41 20 22 72 6f 77 20 63 68 61 6e ** ^(A "row chan
197d0 67 65 22 20 69 73 20 61 20 63 68 61 6e 67 65 20 ge" is a change
197e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 to a single row
197f0 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c of a single tabl
19800 65 0d 0a 2a 2a 20 63 61 75 73 65 64 20 62 79 20 e..** caused by
19810 61 6e 20 49 4e 53 45 52 54 2c 20 44 45 4c 45 54 an INSERT, DELET
19820 45 2c 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 E, or UPDATE sta
19830 74 65 6d 65 6e 74 2e 20 20 52 6f 77 73 20 74 68 tement. Rows th
19840 61 74 0d 0a 2a 2a 20 61 72 65 20 63 68 61 6e 67 at..** are chang
19850 65 64 20 61 73 20 73 69 64 65 20 65 66 66 65 63 ed as side effec
19860 74 73 20 6f 66 20 5b 52 45 50 4c 41 43 45 5d 20 ts of [REPLACE]
19870 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 73 6f 6c constraint resol
19880 75 74 69 6f 6e 2c 0d 0a 2a 2a 20 72 6f 6c 6c 62 ution,..** rollb
19890 61 63 6b 2c 20 41 42 4f 52 54 20 70 72 6f 63 65 ack, ABORT proce
198a0 73 73 69 6e 67 2c 20 5b 44 52 4f 50 20 54 41 42 ssing, [DROP TAB
198b0 4c 45 5d 2c 20 6f 72 20 62 79 20 61 6e 79 20 6f LE], or by any o
198c0 74 68 65 72 0d 0a 2a 2a 20 6d 65 63 68 61 6e 69 ther..** mechani
198d0 73 6d 73 20 64 6f 20 6e 6f 74 20 63 6f 75 6e 74 sms do not count
198e0 20 61 73 20 64 69 72 65 63 74 20 72 6f 77 20 63 as direct row c
198f0 68 61 6e 67 65 73 2e 29 5e 0d 0a 2a 2a 0d 0a 2a hanges.)^..**..*
19900 2a 20 41 20 22 74 72 69 67 67 65 72 20 63 6f 6e * A "trigger con
19910 74 65 78 74 22 20 69 73 20 61 20 73 63 6f 70 65 text" is a scope
19920 20 6f 66 20 65 78 65 63 75 74 69 6f 6e 20 74 68 of execution th
19930 61 74 20 62 65 67 69 6e 73 20 61 6e 64 0d 0a 2a at begins and..*
19940 2a 20 65 6e 64 73 20 77 69 74 68 20 74 68 65 20 * ends with the
19950 73 63 72 69 70 74 20 6f 66 20 61 20 5b 43 52 45 script of a [CRE
19960 41 54 45 20 54 52 49 47 47 45 52 20 7c 20 74 72 ATE TRIGGER | tr
19970 69 67 67 65 72 5d 2e 20 0d 0a 2a 2a 20 4d 6f 73 igger]. ..** Mos
19980 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 t SQL statements
19990 20 61 72 65 0d 0a 2a 2a 20 65 76 61 6c 75 61 74 are..** evaluat
199a0 65 64 20 6f 75 74 73 69 64 65 20 6f 66 20 61 6e ed outside of an
199b0 79 20 74 72 69 67 67 65 72 2e 20 20 54 68 69 73 y trigger. This
199c0 20 69 73 20 74 68 65 20 22 74 6f 70 20 6c 65 76 is the "top lev
199d0 65 6c 22 0d 0a 2a 2a 20 74 72 69 67 67 65 72 20 el"..** trigger
199e0 63 6f 6e 74 65 78 74 2e 20 20 49 66 20 61 20 74 context. If a t
199f0 72 69 67 67 65 72 20 66 69 72 65 73 20 66 72 6f rigger fires fro
19a00 6d 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2c m the top level,
19a10 20 61 0d 0a 2a 2a 20 6e 65 77 20 74 72 69 67 67 a..** new trigg
19a20 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 65 6e er context is en
19a30 74 65 72 65 64 20 66 6f 72 20 74 68 65 20 64 75 tered for the du
19a40 72 61 74 69 6f 6e 20 6f 66 20 74 68 61 74 20 6f ration of that o
19a50 6e 65 0d 0a 2a 2a 20 74 72 69 67 67 65 72 2e 20 ne..** trigger.
19a60 20 53 75 62 74 72 69 67 67 65 72 73 20 63 72 65 Subtriggers cre
19a70 61 74 65 20 73 75 62 63 6f 6e 74 65 78 74 73 20 ate subcontexts
19a80 66 6f 72 20 74 68 65 69 72 20 64 75 72 61 74 69 for their durati
19a90 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 43 61 6c on...**..** ^Cal
19aa0 6c 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 65 78 ling [sqlite3_ex
19ab0 65 63 28 29 5d 20 6f 72 20 5b 73 71 6c 69 74 65 ec()] or [sqlite
19ac0 33 5f 73 74 65 70 28 29 5d 20 72 65 63 75 72 73 3_step()] recurs
19ad0 69 76 65 6c 79 20 64 6f 65 73 0d 0a 2a 2a 20 6e ively does..** n
19ae0 6f 74 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 ot create a new
19af0 74 72 69 67 67 65 72 20 63 6f 6e 74 65 78 74 2e trigger context.
19b00 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 20 66 ..**..** ^This f
19b10 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
19b20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 the number of di
19b30 72 65 63 74 20 72 6f 77 20 63 68 61 6e 67 65 73 rect row changes
19b40 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 6d 6f 73 74 in the..** most
19b50 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 recent INSERT,
19b60 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 UPDATE, or DELET
19b70 45 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 E statement with
19b80 69 6e 20 74 68 65 20 73 61 6d 65 0d 0a 2a 2a 20 in the same..**
19b90 74 72 69 67 67 65 72 20 63 6f 6e 74 65 78 74 2e trigger context.
19ba0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 75 73 2c 20 ..**..** ^Thus,
19bb0 77 68 65 6e 20 63 61 6c 6c 65 64 20 66 72 6f 6d when called from
19bc0 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2c 20 the top level,
19bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 this function re
19be0 74 75 72 6e 73 20 74 68 65 0d 0a 2a 2a 20 6e 75 turns the..** nu
19bf0 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 mber of changes
19c00 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 in the most rece
19c10 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 nt INSERT, UPDAT
19c20 45 2c 20 6f 72 20 44 45 4c 45 54 45 0d 0a 2a 2a E, or DELETE..**
19c30 20 74 68 61 74 20 61 6c 73 6f 20 6f 63 63 75 72 that also occur
19c40 72 65 64 20 61 74 20 74 68 65 20 74 6f 70 20 6c red at the top l
19c50 65 76 65 6c 2e 20 20 5e 28 57 69 74 68 69 6e 20 evel. ^(Within
19c60 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 74 72 the body of a tr
19c70 69 67 67 65 72 2c 0d 0a 2a 2a 20 74 68 65 20 73 igger,..** the s
19c80 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 qlite3_changes()
19c90 20 69 6e 74 65 72 66 61 63 65 20 63 61 6e 20 62 interface can b
19ca0 65 20 63 61 6c 6c 65 64 20 74 6f 20 66 69 6e 64 e called to find
19cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d 0a the number of..
19cc0 2a 2a 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 ** changes in th
19cd0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 e most recently
19ce0 63 6f 6d 70 6c 65 74 65 64 20 49 4e 53 45 52 54 completed INSERT
19cf0 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c , UPDATE, or DEL
19d00 45 54 45 0d 0a 2a 2a 20 73 74 61 74 65 6d 65 6e ETE..** statemen
19d10 74 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 t within the bod
19d20 79 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 y of the same tr
19d30 69 67 67 65 72 2e 0d 0a 2a 2a 20 48 6f 77 65 76 igger...** Howev
19d40 65 72 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 72 er, the number r
19d50 65 74 75 72 6e 65 64 20 64 6f 65 73 20 6e 6f 74 eturned does not
19d60 20 69 6e 63 6c 75 64 65 20 63 68 61 6e 67 65 73 include changes
19d70 0d 0a 2a 2a 20 63 61 75 73 65 64 20 62 79 20 73 ..** caused by s
19d80 75 62 74 72 69 67 67 65 72 73 20 73 69 6e 63 65 ubtriggers since
19d90 20 74 68 6f 73 65 20 68 61 76 65 20 74 68 65 69 those have thei
19da0 72 20 6f 77 6e 20 63 6f 6e 74 65 78 74 2e 29 5e r own context.)^
19db0 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 ..**..** See als
19dc0 6f 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 74 o the [sqlite3_t
19dd0 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 5d 20 otal_changes()]
19de0 69 6e 74 65 72 66 61 63 65 2c 20 74 68 65 0d 0a interface, the..
19df0 2a 2a 20 5b 63 6f 75 6e 74 5f 63 68 61 6e 67 65 ** [count_change
19e00 73 20 70 72 61 67 6d 61 5d 2c 20 61 6e 64 20 74 s pragma], and t
19e10 68 65 20 5b 63 68 61 6e 67 65 73 28 29 20 53 51 he [changes() SQ
19e20 4c 20 66 75 6e 63 74 69 6f 6e 5d 2e 0d 0a 2a 2a L function]...**
19e30 0d 0a 2a 2a 20 49 66 20 61 20 73 65 70 61 72 61 ..** If a separa
19e40 74 65 20 74 68 72 65 61 64 20 6d 61 6b 65 73 20 te thread makes
19e50 63 68 61 6e 67 65 73 20 6f 6e 20 74 68 65 20 73 changes on the s
19e60 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e ame database con
19e70 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 77 68 69 6c nection..** whil
19e80 65 20 5b 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 e [sqlite3_chang
19e90 65 73 28 29 5d 20 69 73 20 72 75 6e 6e 69 6e 67 es()] is running
19ea0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 then the value
19eb0 72 65 74 75 72 6e 65 64 0d 0a 2a 2a 20 69 73 20 returned..** is
19ec0 75 6e 70 72 65 64 69 63 74 61 62 6c 65 20 61 6e unpredictable an
19ed0 64 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c d not meaningful
19ee0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
19ef0 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 I int sqlite3_ch
19f00 61 6e 67 65 73 28 73 71 6c 69 74 65 33 2a 29 3b anges(sqlite3*);
19f10 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
19f20 52 45 46 3a 20 54 6f 74 61 6c 20 4e 75 6d 62 65 REF: Total Numbe
19f30 72 20 4f 66 20 52 6f 77 73 20 4d 6f 64 69 66 69 r Of Rows Modifi
19f40 65 64 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 ed..**..** ^This
19f50 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
19f60 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
19f70 72 6f 77 20 63 68 61 6e 67 65 73 20 63 61 75 73 row changes caus
19f80 65 64 20 62 79 20 5b 49 4e 53 45 52 54 5d 2c 0d ed by [INSERT],.
19f90 0a 2a 2a 20 5b 55 50 44 41 54 45 5d 20 6f 72 20 .** [UPDATE] or
19fa0 5b 44 45 4c 45 54 45 5d 20 73 74 61 74 65 6d 65 [DELETE] stateme
19fb0 6e 74 73 20 73 69 6e 63 65 20 74 68 65 20 5b 64 nts since the [d
19fc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
19fd0 6f 6e 5d 20 77 61 73 20 6f 70 65 6e 65 64 2e 0d on] was opened..
19fe0 0a 2a 2a 20 5e 28 54 68 65 20 63 6f 75 6e 74 20 .** ^(The count
19ff0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 returned by sqli
1a000 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 te3_total_change
1a010 73 28 29 20 69 6e 63 6c 75 64 65 73 20 61 6c 6c s() includes all
1a020 20 63 68 61 6e 67 65 73 0d 0a 2a 2a 20 66 72 6f changes..** fro
1a030 6d 20 61 6c 6c 20 5b 43 52 45 41 54 45 20 54 52 m all [CREATE TR
1a040 49 47 47 45 52 20 7c 20 74 72 69 67 67 65 72 5d IGGER | trigger]
1a050 20 63 6f 6e 74 65 78 74 73 20 61 6e 64 20 63 68 contexts and ch
1a060 61 6e 67 65 73 20 6d 61 64 65 20 62 79 0d 0a 2a anges made by..*
1a070 2a 20 5b 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 * [foreign key a
1a080 63 74 69 6f 6e 73 5d 2e 20 48 6f 77 65 76 65 72 ctions]. However
1a090 2c 0d 0a 2a 2a 20 74 68 65 20 63 6f 75 6e 74 20 ,..** the count
1a0a0 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 does not include
1a0b0 20 63 68 61 6e 67 65 73 20 75 73 65 64 20 74 6f changes used to
1a0c0 20 69 6d 70 6c 65 6d 65 6e 74 20 5b 52 45 50 4c implement [REPL
1a0d0 41 43 45 5d 20 63 6f 6e 73 74 72 61 69 6e 74 73 ACE] constraints
1a0e0 2c 0d 0a 2a 2a 20 64 6f 20 72 6f 6c 6c 62 61 63 ,..** do rollbac
1a0f0 6b 73 20 6f 72 20 41 42 4f 52 54 20 70 72 6f 63 ks or ABORT proc
1a100 65 73 73 69 6e 67 2c 20 6f 72 20 5b 44 52 4f 50 essing, or [DROP
1a110 20 54 41 42 4c 45 5d 20 70 72 6f 63 65 73 73 69 TABLE] processi
1a120 6e 67 2e 20 20 54 68 65 0d 0a 2a 2a 20 63 6f 75 ng. The..** cou
1a130 6e 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c nt does not incl
1a140 75 64 65 20 72 6f 77 73 20 6f 66 20 76 69 65 77 ude rows of view
1a150 73 20 74 68 61 74 20 66 69 72 65 20 61 6e 20 5b s that fire an [
1a160 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 INSTEAD OF trigg
1a170 65 72 5d 2c 0d 0a 2a 2a 20 74 68 6f 75 67 68 20 er],..** though
1a180 69 66 20 74 68 65 20 49 4e 53 54 45 41 44 20 4f if the INSTEAD O
1a190 46 20 74 72 69 67 67 65 72 20 6d 61 6b 65 73 20 F trigger makes
1a1a0 63 68 61 6e 67 65 73 20 6f 66 20 69 74 73 20 6f changes of its o
1a1b0 77 6e 2c 20 74 68 6f 73 65 20 63 68 61 6e 67 65 wn, those change
1a1c0 73 20 0d 0a 2a 2a 20 61 72 65 20 63 6f 75 6e 74 s ..** are count
1a1d0 65 64 2e 29 5e 0d 0a 2a 2a 20 5e 54 68 65 20 73 ed.)^..** ^The s
1a1e0 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 qlite3_total_cha
1a1f0 6e 67 65 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 nges() function
1a200 63 6f 75 6e 74 73 20 74 68 65 20 63 68 61 6e 67 counts the chang
1a210 65 73 20 61 73 20 73 6f 6f 6e 20 61 73 0d 0a 2a es as soon as..*
1a220 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 * the statement
1a230 74 68 61 74 20 6d 61 6b 65 73 20 74 68 65 6d 20 that makes them
1a240 69 73 20 63 6f 6d 70 6c 65 74 65 64 20 28 77 68 is completed (wh
1a250 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 en the statement
1a260 20 68 61 6e 64 6c 65 0d 0a 2a 2a 20 69 73 20 70 handle..** is p
1a270 61 73 73 65 64 20 74 6f 20 5b 73 71 6c 69 74 65 assed to [sqlite
1a280 33 5f 72 65 73 65 74 28 29 5d 20 6f 72 20 5b 73 3_reset()] or [s
1a290 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 qlite3_finalize(
1a2a0 29 5d 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 )])...**..** See
1a2b0 20 61 6c 73 6f 20 74 68 65 20 5b 73 71 6c 69 74 also the [sqlit
1a2c0 65 33 5f 63 68 61 6e 67 65 73 28 29 5d 20 69 6e e3_changes()] in
1a2d0 74 65 72 66 61 63 65 2c 20 74 68 65 0d 0a 2a 2a terface, the..**
1a2e0 20 5b 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 [count_changes
1a2f0 70 72 61 67 6d 61 5d 2c 20 61 6e 64 20 74 68 65 pragma], and the
1a300 20 5b 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 [total_changes(
1a310 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 5d 2e ) SQL function].
1a320 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 73 65 ..**..** If a se
1a330 70 61 72 61 74 65 20 74 68 72 65 61 64 20 6d 61 parate thread ma
1a340 6b 65 73 20 63 68 61 6e 67 65 73 20 6f 6e 20 74 kes changes on t
1a350 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 he same database
1a360 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 connection..**
1a370 77 68 69 6c 65 20 5b 73 71 6c 69 74 65 33 5f 74 while [sqlite3_t
1a380 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 5d 20 otal_changes()]
1a390 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 65 6e 20 is running then
1a3a0 74 68 65 20 76 61 6c 75 65 0d 0a 2a 2a 20 72 65 the value..** re
1a3b0 74 75 72 6e 65 64 20 69 73 20 75 6e 70 72 65 64 turned is unpred
1a3c0 69 63 74 61 62 6c 65 20 61 6e 64 20 6e 6f 74 20 ictable and not
1a3d0 6d 65 61 6e 69 6e 67 66 75 6c 2e 0d 0a 2a 2f 0d meaningful...*/.
1a3e0 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
1a3f0 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 sqlite3_total_ch
1a400 61 6e 67 65 73 28 73 71 6c 69 74 65 33 2a 29 3b anges(sqlite3*);
1a410 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
1a420 52 45 46 3a 20 49 6e 74 65 72 72 75 70 74 20 41 REF: Interrupt A
1a430 20 4c 6f 6e 67 2d 52 75 6e 6e 69 6e 67 20 51 75 Long-Running Qu
1a440 65 72 79 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 ery..**..** ^Thi
1a450 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 75 73 65 s function cause
1a460 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 s any pending da
1a470 74 61 62 61 73 65 20 6f 70 65 72 61 74 69 6f 6e tabase operation
1a480 20 74 6f 20 61 62 6f 72 74 20 61 6e 64 0d 0a 2a to abort and..*
1a490 2a 20 72 65 74 75 72 6e 20 61 74 20 69 74 73 20 * return at its
1a4a0 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 earliest opportu
1a4b0 6e 69 74 79 2e 20 54 68 69 73 20 72 6f 75 74 69 nity. This routi
1a4c0 6e 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79 0d ne is typically.
1a4d0 0a 2a 2a 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 .** called in re
1a4e0 73 70 6f 6e 73 65 20 74 6f 20 61 20 75 73 65 72 sponse to a user
1a4f0 20 61 63 74 69 6f 6e 20 73 75 63 68 20 61 73 20 action such as
1a500 70 72 65 73 73 69 6e 67 20 22 43 61 6e 63 65 6c pressing "Cancel
1a510 22 0d 0a 2a 2a 20 6f 72 20 43 74 72 6c 2d 43 20 "..** or Ctrl-C
1a520 77 68 65 72 65 20 74 68 65 20 75 73 65 72 20 77 where the user w
1a530 61 6e 74 73 20 61 20 6c 6f 6e 67 20 71 75 65 72 ants a long quer
1a540 79 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 68 y operation to h
1a550 61 6c 74 0d 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 alt..** immediat
1a560 65 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 74 ely...**..** ^It
1a570 20 69 73 20 73 61 66 65 20 74 6f 20 63 61 6c 6c is safe to call
1a580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 this routine fr
1a590 6f 6d 20 61 20 74 68 72 65 61 64 20 64 69 66 66 om a thread diff
1a5a0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 0d 0a erent from the..
1a5b0 2a 2a 20 74 68 72 65 61 64 20 74 68 61 74 20 69 ** thread that i
1a5c0 73 20 63 75 72 72 65 6e 74 6c 79 20 72 75 6e 6e s currently runn
1a5d0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 ing the database
1a5e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 operation. But
1a5f0 20 69 74 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 it..** is not s
1a600 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 afe to call this
1a610 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 routine with a
1a620 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
1a630 74 69 6f 6e 5d 20 74 68 61 74 0d 0a 2a 2a 20 69 tion] that..** i
1a640 73 20 63 6c 6f 73 65 64 20 6f 72 20 6d 69 67 68 s closed or migh
1a650 74 20 63 6c 6f 73 65 20 62 65 66 6f 72 65 20 73 t close before s
1a660 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt
1a670 28 29 20 72 65 74 75 72 6e 73 2e 0d 0a 2a 2a 0d () returns...**.
1a680 0a 2a 2a 20 5e 49 66 20 61 6e 20 53 51 4c 20 6f .** ^If an SQL o
1a690 70 65 72 61 74 69 6f 6e 20 69 73 20 76 65 72 79 peration is very
1a6a0 20 6e 65 61 72 6c 79 20 66 69 6e 69 73 68 65 64 nearly finished
1a6b0 20 61 74 20 74 68 65 20 74 69 6d 65 20 77 68 65 at the time whe
1a6c0 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e n..** sqlite3_in
1a6d0 74 65 72 72 75 70 74 28 29 20 69 73 20 63 61 6c terrupt() is cal
1a6e0 6c 65 64 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 led, then it mig
1a6f0 68 74 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f ht not have an o
1a700 70 70 6f 72 74 75 6e 69 74 79 0d 0a 2a 2a 20 74 pportunity..** t
1a710 6f 20 62 65 20 69 6e 74 65 72 72 75 70 74 65 64 o be interrupted
1a720 20 61 6e 64 20 6d 69 67 68 74 20 63 6f 6e 74 69 and might conti
1a730 6e 75 65 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f nue to completio
1a740 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 41 6e 20 53 n...**..** ^An S
1a750 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 QL operation tha
1a760 74 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 t is interrupted
1a770 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 5b 53 51 will return [SQ
1a780 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 5d 2e LITE_INTERRUPT].
1a790 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 69 6e 74 ..** ^If the int
1a7a0 65 72 72 75 70 74 65 64 20 53 51 4c 20 6f 70 65 errupted SQL ope
1a7b0 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 53 ration is an INS
1a7c0 45 52 54 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 ERT, UPDATE, or
1a7d0 44 45 4c 45 54 45 0d 0a 2a 2a 20 74 68 61 74 20 DELETE..** that
1a7e0 69 73 20 69 6e 73 69 64 65 20 61 6e 20 65 78 70 is inside an exp
1a7f0 6c 69 63 69 74 20 74 72 61 6e 73 61 63 74 69 6f licit transactio
1a800 6e 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 n, then the enti
1a810 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a re transaction..
1a820 2a 2a 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 ** will be rolle
1a830 64 20 62 61 63 6b 20 61 75 74 6f 6d 61 74 69 63 d back automatic
1a840 61 6c 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 ally...**..** ^T
1a850 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 he sqlite3_inter
1a860 72 75 70 74 28 44 29 20 63 61 6c 6c 20 69 73 20 rupt(D) call is
1a870 69 6e 20 65 66 66 65 63 74 20 75 6e 74 69 6c 20 in effect until
1a880 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 72 75 all currently ru
1a890 6e 6e 69 6e 67 0d 0a 2a 2a 20 53 51 4c 20 73 74 nning..** SQL st
1a8a0 61 74 65 6d 65 6e 74 73 20 6f 6e 20 5b 64 61 74 atements on [dat
1a8b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
1a8c0 5d 20 44 20 63 6f 6d 70 6c 65 74 65 2e 20 20 5e ] D complete. ^
1a8d0 41 6e 79 20 6e 65 77 20 53 51 4c 20 73 74 61 74 Any new SQL stat
1a8e0 65 6d 65 6e 74 73 0d 0a 2a 2a 20 74 68 61 74 20 ements..** that
1a8f0 61 72 65 20 73 74 61 72 74 65 64 20 61 66 74 65 are started afte
1a900 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e r the sqlite3_in
1a910 74 65 72 72 75 70 74 28 29 20 63 61 6c 6c 20 61 terrupt() call a
1a920 6e 64 20 62 65 66 6f 72 65 20 74 68 65 20 0d 0a nd before the ..
1a930 2a 2a 20 72 75 6e 6e 69 6e 67 20 73 74 61 74 65 ** running state
1a940 6d 65 6e 74 73 20 72 65 61 63 68 65 73 20 7a 65 ments reaches ze
1a950 72 6f 20 61 72 65 20 69 6e 74 65 72 72 75 70 74 ro are interrupt
1a960 65 64 20 61 73 20 69 66 20 74 68 65 79 20 68 61 ed as if they ha
1a970 64 20 62 65 65 6e 0d 0a 2a 2a 20 72 75 6e 6e 69 d been..** runni
1a980 6e 67 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 ng prior to the
1a990 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 sqlite3_interrup
1a9a0 74 28 29 20 63 61 6c 6c 2e 20 20 5e 4e 65 77 20 t() call. ^New
1a9b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0d 0a SQL statements..
1a9c0 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 72 ** that are star
1a9d0 74 65 64 20 61 66 74 65 72 20 74 68 65 20 72 75 ted after the ru
1a9e0 6e 6e 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 nning statement
1a9f0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 count reaches ze
1aa00 72 6f 20 61 72 65 0d 0a 2a 2a 20 6e 6f 74 20 65 ro are..** not e
1aa10 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20 73 ffected by the s
1aa20 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt
1aa30 28 29 2e 0d 0a 2a 2a 20 5e 41 20 63 61 6c 6c 20 ()...** ^A call
1aa40 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 to sqlite3_inter
1aa50 72 75 70 74 28 44 29 20 74 68 61 74 20 6f 63 63 rupt(D) that occ
1aa60 75 72 73 20 77 68 65 6e 20 74 68 65 72 65 20 61 urs when there a
1aa70 72 65 20 6e 6f 20 72 75 6e 6e 69 6e 67 0d 0a 2a re no running..*
1aa80 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 * SQL statements
1aa90 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 is a no-op and
1aaa0 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e has no effect on
1aab0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0d SQL statements.
1aac0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 .** that are sta
1aad0 72 74 65 64 20 61 66 74 65 72 20 74 68 65 20 73 rted after the s
1aae0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt
1aaf0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e () call returns.
1ab00 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 ..**..** If the
1ab10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
1ab20 69 6f 6e 20 63 6c 6f 73 65 73 20 77 68 69 6c 65 ion closes while
1ab30 20 5b 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 [sqlite3_interr
1ab40 75 70 74 28 29 5d 0d 0a 2a 2a 20 69 73 20 72 75 upt()]..** is ru
1ab50 6e 6e 69 6e 67 20 74 68 65 6e 20 62 61 64 20 74 nning then bad t
1ab60 68 69 6e 67 73 20 77 69 6c 6c 20 6c 69 6b 65 6c hings will likel
1ab70 79 20 68 61 70 70 65 6e 2e 0d 0a 2a 2f 0d 0a 53 y happen...*/..S
1ab80 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 QLITE_API void s
1ab90 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt
1aba0 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 2f (sqlite3*);..../
1abb0 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
1abc0 44 65 74 65 72 6d 69 6e 65 20 49 66 20 41 6e 20 Determine If An
1abd0 53 51 4c 20 53 74 61 74 65 6d 65 6e 74 20 49 73 SQL Statement Is
1abe0 20 43 6f 6d 70 6c 65 74 65 0d 0a 2a 2a 0d 0a 2a Complete..**..*
1abf0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 * These routines
1ac00 20 61 72 65 20 75 73 65 66 75 6c 20 64 75 72 69 are useful duri
1ac10 6e 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 ng command-line
1ac20 69 6e 70 75 74 20 74 6f 20 64 65 74 65 72 6d 69 input to determi
1ac30 6e 65 20 69 66 20 74 68 65 0d 0a 2a 2a 20 63 75 ne if the..** cu
1ac40 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64 20 rrently entered
1ac50 74 65 78 74 20 73 65 65 6d 73 20 74 6f 20 66 6f text seems to fo
1ac60 72 6d 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 rm a complete SQ
1ac70 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0d 0a L statement or..
1ac80 2a 2a 20 69 66 20 61 64 64 69 74 69 6f 6e 61 6c ** if additional
1ac90 20 69 6e 70 75 74 20 69 73 20 6e 65 65 64 65 64 input is needed
1aca0 20 62 65 66 6f 72 65 20 73 65 6e 64 69 6e 67 20 before sending
1acb0 74 68 65 20 74 65 78 74 20 69 6e 74 6f 0d 0a 2a the text into..*
1acc0 2a 20 53 51 4c 69 74 65 20 66 6f 72 20 70 61 72 * SQLite for par
1acd0 73 69 6e 67 2e 20 20 5e 54 68 65 73 65 20 72 6f sing. ^These ro
1ace0 75 74 69 6e 65 73 20 72 65 74 75 72 6e 20 31 20 utines return 1
1acf0 69 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 if the input str
1ad00 69 6e 67 0d 0a 2a 2a 20 61 70 70 65 61 72 73 20 ing..** appears
1ad10 74 6f 20 62 65 20 61 20 63 6f 6d 70 6c 65 74 65 to be a complete
1ad20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 SQL statement.
1ad30 20 5e 41 20 73 74 61 74 65 6d 65 6e 74 20 69 73 ^A statement is
1ad40 20 6a 75 64 67 65 64 20 74 6f 20 62 65 0d 0a 2a judged to be..*
1ad50 2a 20 63 6f 6d 70 6c 65 74 65 20 69 66 20 69 74 * complete if it
1ad60 20 65 6e 64 73 20 77 69 74 68 20 61 20 73 65 6d ends with a sem
1ad70 69 63 6f 6c 6f 6e 20 74 6f 6b 65 6e 20 61 6e 64 icolon token and
1ad80 20 69 73 20 6e 6f 74 20 61 20 70 72 65 66 69 78 is not a prefix
1ad90 20 6f 66 20 61 0d 0a 2a 2a 20 77 65 6c 6c 2d 66 of a..** well-f
1ada0 6f 72 6d 65 64 20 43 52 45 41 54 45 20 54 52 49 ormed CREATE TRI
1adb0 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 2e 20 GGER statement.
1adc0 20 5e 53 65 6d 69 63 6f 6c 6f 6e 73 20 74 68 61 ^Semicolons tha
1add0 74 20 61 72 65 20 65 6d 62 65 64 64 65 64 20 77 t are embedded w
1ade0 69 74 68 69 6e 0d 0a 2a 2a 20 73 74 72 69 6e 67 ithin..** string
1adf0 20 6c 69 74 65 72 61 6c 73 20 6f 72 20 71 75 6f literals or quo
1ae00 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 20 6e ted identifier n
1ae10 61 6d 65 73 20 6f 72 20 63 6f 6d 6d 65 6e 74 73 ames or comments
1ae20 20 61 72 65 20 6e 6f 74 0d 0a 2a 2a 20 69 6e 64 are not..** ind
1ae30 65 70 65 6e 64 65 6e 74 20 74 6f 6b 65 6e 73 20 ependent tokens
1ae40 28 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f (they are part o
1ae50 66 20 74 68 65 20 74 6f 6b 65 6e 20 69 6e 20 77 f the token in w
1ae60 68 69 63 68 20 74 68 65 79 20 61 72 65 0d 0a 2a hich they are..*
1ae70 2a 20 65 6d 62 65 64 64 65 64 29 20 61 6e 64 20 * embedded) and
1ae80 74 68 75 73 20 64 6f 20 6e 6f 74 20 63 6f 75 6e thus do not coun
1ae90 74 20 61 73 20 61 20 73 74 61 74 65 6d 65 6e 74 t as a statement
1aea0 20 74 65 72 6d 69 6e 61 74 6f 72 2e 20 20 5e 57 terminator. ^W
1aeb0 68 69 74 65 73 70 61 63 65 0d 0a 2a 2a 20 61 6e hitespace..** an
1aec0 64 20 63 6f 6d 6d 65 6e 74 73 20 74 68 61 74 20 d comments that
1aed0 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 6e 61 6c follow the final
1aee0 20 73 65 6d 69 63 6f 6c 6f 6e 20 61 72 65 20 69 semicolon are i
1aef0 67 6e 6f 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 gnored...**..**
1af00 5e 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 ^These routines
1af10 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 return 0 if the
1af20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 statement is inc
1af30 6f 6d 70 6c 65 74 65 2e 20 20 5e 49 66 20 61 0d omplete. ^If a.
1af40 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 .** memory alloc
1af50 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 ation fails, the
1af60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 n SQLITE_NOMEM i
1af70 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d s returned...**.
1af80 0a 2a 2a 20 5e 54 68 65 73 65 20 72 6f 75 74 69 .** ^These routi
1af90 6e 65 73 20 64 6f 20 6e 6f 74 20 70 61 72 73 65 nes do not parse
1afa0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
1afb0 6e 74 73 20 74 68 75 73 0d 0a 2a 2a 20 77 69 6c nts thus..** wil
1afc0 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 73 79 6e l not detect syn
1afd0 74 61 63 74 69 63 61 6c 6c 79 20 69 6e 63 6f 72 tactically incor
1afe0 72 65 63 74 20 53 51 4c 2e 0d 0a 2a 2a 0d 0a 2a rect SQL...**..*
1aff0 2a 20 5e 28 49 66 20 53 51 4c 69 74 65 20 68 61 * ^(If SQLite ha
1b000 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 s not been initi
1b010 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 5b 73 71 alized using [sq
1b020 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 lite3_initialize
1b030 28 29 5d 20 70 72 69 6f 72 20 0d 0a 2a 2a 20 74 ()] prior ..** t
1b040 6f 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 o invoking sqlit
1b050 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 29 20 e3_complete16()
1b060 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 then sqlite3_ini
1b070 74 69 61 6c 69 7a 65 28 29 20 69 73 20 69 6e 76 tialize() is inv
1b080 6f 6b 65 64 0d 0a 2a 2a 20 61 75 74 6f 6d 61 74 oked..** automat
1b090 69 63 61 6c 6c 79 20 62 79 20 73 71 6c 69 74 65 ically by sqlite
1b0a0 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 29 2e 20 3_complete16().
1b0b0 20 49 66 20 74 68 61 74 20 69 6e 69 74 69 61 6c If that initial
1b0c0 69 7a 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0d 0a ization fails,..
1b0d0 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 ** then the retu
1b0e0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 rn value from sq
1b0f0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 lite3_complete16
1b100 28 29 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a () will be non-z
1b110 65 72 6f 0d 0a 2a 2a 20 72 65 67 61 72 64 6c 65 ero..** regardle
1b120 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 ss of whether or
1b130 20 6e 6f 74 20 74 68 65 20 69 6e 70 75 74 20 53 not the input S
1b140 51 4c 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 29 QL is complete.)
1b150 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e ^..**..** The in
1b160 70 75 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f put to [sqlite3_
1b170 63 6f 6d 70 6c 65 74 65 28 29 5d 20 6d 75 73 74 complete()] must
1b180 20 62 65 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 be a zero-termi
1b190 6e 61 74 65 64 0d 0a 2a 2a 20 55 54 46 2d 38 20 nated..** UTF-8
1b1a0 73 74 72 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 string...**..**
1b1b0 54 68 65 20 69 6e 70 75 74 20 74 6f 20 5b 73 71 The input to [sq
1b1c0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 lite3_complete16
1b1d0 28 29 5d 20 6d 75 73 74 20 62 65 20 61 20 7a 65 ()] must be a ze
1b1e0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 0d 0a 2a ro-terminated..*
1b1f0 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 * UTF-16 string
1b200 69 6e 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f in native byte o
1b210 72 64 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 rder...*/..SQLIT
1b220 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
1b230 33 5f 63 6f 6d 70 6c 65 74 65 28 63 6f 6e 73 74 3_complete(const
1b240 20 63 68 61 72 20 2a 73 71 6c 29 3b 0d 0a 53 51 char *sql);..SQ
1b250 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
1b260 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 ite3_complete16(
1b270 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 29 const void *sql)
1b280 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
1b290 33 52 45 46 3a 20 52 65 67 69 73 74 65 72 20 41 3REF: Register A
1b2a0 20 43 61 6c 6c 62 61 63 6b 20 54 6f 20 48 61 6e Callback To Han
1b2b0 64 6c 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 dle SQLITE_BUSY
1b2c0 45 72 72 6f 72 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e Errors..**..** ^
1b2d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 This routine set
1b2e0 73 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e s a callback fun
1b2f0 63 74 69 6f 6e 20 74 68 61 74 20 6d 69 67 68 74 ction that might
1b300 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e be invoked when
1b310 65 76 65 72 0d 0a 2a 2a 20 61 6e 20 61 74 74 65 ever..** an atte
1b320 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f mpt is made to o
1b330 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 pen a database t
1b340 61 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 able that anothe
1b350 72 20 74 68 72 65 61 64 0d 0a 2a 2a 20 6f 72 20 r thread..** or
1b360 70 72 6f 63 65 73 73 20 68 61 73 20 6c 6f 63 6b process has lock
1b370 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 ed...**..** ^If
1b380 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 the busy callbac
1b390 6b 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 k is NULL, then
1b3a0 5b 53 51 4c 49 54 45 5f 42 55 53 59 5d 20 6f 72 [SQLITE_BUSY] or
1b3b0 20 5b 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 [SQLITE_IOERR_B
1b3c0 4c 4f 43 4b 45 44 5d 0d 0a 2a 2a 20 69 73 20 72 LOCKED]..** is r
1b3d0 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 eturned immediat
1b3e0 65 6c 79 20 75 70 6f 6e 20 65 6e 63 6f 75 6e 74 ely upon encount
1b3f0 65 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 20 ering the lock.
1b400 20 5e 49 66 20 74 68 65 20 62 75 73 79 20 63 61 ^If the busy ca
1b410 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 69 73 20 6e 6f llback..** is no
1b420 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 t NULL, then the
1b430 20 63 61 6c 6c 62 61 63 6b 20 6d 69 67 68 74 20 callback might
1b440 62 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 be invoked with
1b450 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a two arguments...
1b460 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 72 73 **..** ^The firs
1b470 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 t argument to th
1b480 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 e busy handler i
1b490 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
1b4a0 76 6f 69 64 2a 20 70 6f 69 6e 74 65 72 20 77 68 void* pointer wh
1b4b0 69 63 68 0d 0a 2a 2a 20 69 73 20 74 68 65 20 74 ich..** is the t
1b4c0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f hird argument to
1b4d0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 sqlite3_busy_ha
1b4e0 6e 64 6c 65 72 28 29 2e 20 20 5e 54 68 65 20 73 ndler(). ^The s
1b4f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 econd argument t
1b500 6f 0d 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 68 o..** the busy h
1b510 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 andler callback
1b520 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
1b530 20 74 69 6d 65 73 20 74 68 61 74 20 74 68 65 20 times that the
1b540 62 75 73 79 20 68 61 6e 64 6c 65 72 20 68 61 73 busy handler has
1b550 0d 0a 2a 2a 20 62 65 65 6e 20 69 6e 76 6f 6b 65 ..** been invoke
1b560 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 63 6b 69 d for this locki
1b570 6e 67 20 65 76 65 6e 74 2e 20 20 5e 49 66 20 74 ng event. ^If t
1b580 68 65 0d 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c he..** busy call
1b590 62 61 63 6b 20 72 65 74 75 72 6e 73 20 30 2c 20 back returns 0,
1b5a0 74 68 65 6e 20 6e 6f 20 61 64 64 69 74 69 6f 6e then no addition
1b5b0 61 6c 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 al attempts are
1b5c0 6d 61 64 65 20 74 6f 0d 0a 2a 2a 20 61 63 63 65 made to..** acce
1b5d0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ss the database
1b5e0 61 6e 64 20 5b 53 51 4c 49 54 45 5f 42 55 53 59 and [SQLITE_BUSY
1b5f0 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49 4f 45 ] or [SQLITE_IOE
1b600 52 52 5f 42 4c 4f 43 4b 45 44 5d 20 69 73 20 72 RR_BLOCKED] is r
1b610 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 5e 49 66 eturned...** ^If
1b620 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 the callback re
1b630 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 turns non-zero,
1b640 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 61 74 74 then another att
1b650 65 6d 70 74 0d 0a 2a 2a 20 69 73 20 6d 61 64 65 empt..** is made
1b660 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 to open the dat
1b670 61 62 61 73 65 20 66 6f 72 20 72 65 61 64 69 6e abase for readin
1b680 67 20 61 6e 64 20 74 68 65 20 63 79 63 6c 65 20 g and the cycle
1b690 72 65 70 65 61 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a repeats...**..**
1b6a0 20 54 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 The presence of
1b6b0 20 61 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 a busy handler
1b6c0 64 6f 65 73 20 6e 6f 74 20 67 75 61 72 61 6e 74 does not guarant
1b6d0 65 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 ee that it will
1b6e0 62 65 20 69 6e 76 6f 6b 65 64 0d 0a 2a 2a 20 77 be invoked..** w
1b6f0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6c 6f 63 hen there is loc
1b700 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 20 5e 49 k contention. ^I
1b710 66 20 53 51 4c 69 74 65 20 64 65 74 65 72 6d 69 f SQLite determi
1b720 6e 65 73 20 74 68 61 74 20 69 6e 76 6f 6b 69 6e nes that invokin
1b730 67 20 74 68 65 20 62 75 73 79 0d 0a 2a 2a 20 68 g the busy..** h
1b740 61 6e 64 6c 65 72 20 63 6f 75 6c 64 20 72 65 73 andler could res
1b750 75 6c 74 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 ult in a deadloc
1b760 6b 2c 20 69 74 20 77 69 6c 6c 20 67 6f 20 61 68 k, it will go ah
1b770 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 5b ead and return [
1b780 53 51 4c 49 54 45 5f 42 55 53 59 5d 0d 0a 2a 2a SQLITE_BUSY]..**
1b790 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49 4f 45 52 or [SQLITE_IOER
1b7a0 52 5f 42 4c 4f 43 4b 45 44 5d 20 69 6e 73 74 65 R_BLOCKED] inste
1b7b0 61 64 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74 ad of invoking t
1b7c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e he busy handler.
1b7d0 0d 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 61 20 ..** Consider a
1b7e0 73 63 65 6e 61 72 69 6f 20 77 68 65 72 65 20 6f scenario where o
1b7f0 6e 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f ne process is ho
1b800 6c 64 69 6e 67 20 61 20 72 65 61 64 20 6c 6f 63 lding a read loc
1b810 6b 20 74 68 61 74 0d 0a 2a 2a 20 69 74 20 69 73 k that..** it is
1b820 20 74 72 79 69 6e 67 20 74 6f 20 70 72 6f 6d 6f trying to promo
1b830 74 65 20 74 6f 20 61 20 72 65 73 65 72 76 65 64 te to a reserved
1b840 20 6c 6f 63 6b 20 61 6e 64 0d 0a 2a 2a 20 61 20 lock and..** a
1b850 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 69 second process i
1b860 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 73 65 s holding a rese
1b870 72 76 65 64 20 6c 6f 63 6b 20 74 68 61 74 20 69 rved lock that i
1b880 74 20 69 73 20 74 72 79 69 6e 67 0d 0a 2a 2a 20 t is trying..**
1b890 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 61 6e to promote to an
1b8a0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e exclusive lock.
1b8b0 20 20 54 68 65 20 66 69 72 73 74 20 70 72 6f 63 The first proc
1b8c0 65 73 73 20 63 61 6e 6e 6f 74 20 70 72 6f 63 65 ess cannot proce
1b8d0 65 64 0d 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 ed..** because i
1b8e0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 t is blocked by
1b8f0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 the second and t
1b900 68 65 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 he second proces
1b910 73 20 63 61 6e 6e 6f 74 0d 0a 2a 2a 20 70 72 6f s cannot..** pro
1b920 63 65 65 64 20 62 65 63 61 75 73 65 20 69 74 20 ceed because it
1b930 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 74 68 is blocked by th
1b940 65 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 e first. If bot
1b950 68 20 70 72 6f 63 65 73 73 65 73 0d 0a 2a 2a 20 h processes..**
1b960 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 invoke the busy
1b970 68 61 6e 64 6c 65 72 73 2c 20 6e 65 69 74 68 65 handlers, neithe
1b980 72 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 r will make any
1b990 70 72 6f 67 72 65 73 73 2e 20 20 54 68 65 72 65 progress. There
1b9a0 66 6f 72 65 2c 0d 0a 2a 2a 20 53 51 4c 69 74 65 fore,..** SQLite
1b9b0 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 returns [SQLITE
1b9c0 5f 42 55 53 59 5d 20 66 6f 72 20 74 68 65 20 66 _BUSY] for the f
1b9d0 69 72 73 74 20 70 72 6f 63 65 73 73 2c 20 68 6f irst process, ho
1b9e0 70 69 6e 67 20 74 68 61 74 20 74 68 69 73 0d 0a ping that this..
1b9f0 2a 2a 20 77 69 6c 6c 20 69 6e 64 75 63 65 20 74 ** will induce t
1ba00 68 65 20 66 69 72 73 74 20 70 72 6f 63 65 73 73 he first process
1ba10 20 74 6f 20 72 65 6c 65 61 73 65 20 69 74 73 20 to release its
1ba20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6c read lock and al
1ba30 6c 6f 77 0d 0a 2a 2a 20 74 68 65 20 73 65 63 6f low..** the seco
1ba40 6e 64 20 70 72 6f 63 65 73 73 20 74 6f 20 70 72 nd process to pr
1ba50 6f 63 65 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e oceed...**..** ^
1ba60 54 68 65 20 64 65 66 61 75 6c 74 20 62 75 73 79 The default busy
1ba70 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 4e 55 4c callback is NUL
1ba80 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 L...**..** ^The
1ba90 5b 53 51 4c 49 54 45 5f 42 55 53 59 5d 20 65 72 [SQLITE_BUSY] er
1baa0 72 6f 72 20 69 73 20 63 6f 6e 76 65 72 74 65 64 ror is converted
1bab0 20 74 6f 20 5b 53 51 4c 49 54 45 5f 49 4f 45 52 to [SQLITE_IOER
1bac0 52 5f 42 4c 4f 43 4b 45 44 5d 0d 0a 2a 2a 20 77 R_BLOCKED]..** w
1bad0 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 69 6e hen SQLite is in
1bae0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 the middle of a
1baf0 20 6c 61 72 67 65 20 74 72 61 6e 73 61 63 74 69 large transacti
1bb00 6f 6e 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 on where all the
1bb10 0d 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 69 6c ..** changes wil
1bb20 6c 20 6e 6f 74 20 66 69 74 20 69 6e 74 6f 20 74 l not fit into t
1bb30 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 he in-memory cac
1bb40 68 65 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c he. SQLite will
1bb50 0d 0a 2a 2a 20 61 6c 72 65 61 64 79 20 68 6f 6c ..** already hol
1bb60 64 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 d a RESERVED loc
1bb70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 k on the databas
1bb80 65 20 66 69 6c 65 2c 20 62 75 74 20 69 74 20 6e e file, but it n
1bb90 65 65 64 73 0d 0a 2a 2a 20 74 6f 20 70 72 6f 6d eeds..** to prom
1bba0 6f 74 65 20 74 68 69 73 20 6c 6f 63 6b 20 74 6f ote this lock to
1bbb0 20 45 58 43 4c 55 53 49 56 45 20 73 6f 20 74 68 EXCLUSIVE so th
1bbc0 61 74 20 69 74 20 63 61 6e 20 73 70 69 6c 6c 20 at it can spill
1bbd0 63 61 63 68 65 0d 0a 2a 2a 20 70 61 67 65 73 20 cache..** pages
1bbe0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 into the databas
1bbf0 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 68 e file without h
1bc00 61 72 6d 20 74 6f 20 63 6f 6e 63 75 72 72 65 6e arm to concurren
1bc10 74 0d 0a 2a 2a 20 72 65 61 64 65 72 73 2e 20 20 t..** readers.
1bc20 5e 49 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 ^If it is unable
1bc30 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 68 65 20 to promote the
1bc40 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 69 lock, then the i
1bc50 6e 2d 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 63 61 63 n-memory..** cac
1bc60 68 65 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 he will be left
1bc70 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 in an inconsiste
1bc80 6e 74 20 73 74 61 74 65 20 61 6e 64 20 73 6f 20 nt state and so
1bc90 74 68 65 20 65 72 72 6f 72 0d 0a 2a 2a 20 63 6f the error..** co
1bca0 64 65 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 66 de is promoted f
1bcb0 72 6f 6d 20 74 68 65 20 72 65 6c 61 74 69 76 65 rom the relative
1bcc0 6c 79 20 62 65 6e 69 67 6e 20 5b 53 51 4c 49 54 ly benign [SQLIT
1bcd0 45 5f 42 55 53 59 5d 20 74 6f 0d 0a 2a 2a 20 74 E_BUSY] to..** t
1bce0 68 65 20 6d 6f 72 65 20 73 65 76 65 72 65 20 5b he more severe [
1bcf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f SQLITE_IOERR_BLO
1bd00 43 4b 45 44 5d 2e 20 20 5e 54 68 69 73 20 65 72 CKED]. ^This er
1bd10 72 6f 72 20 63 6f 64 65 20 70 72 6f 6d 6f 74 69 ror code promoti
1bd20 6f 6e 0d 0a 2a 2a 20 66 6f 72 63 65 73 20 61 6e on..** forces an
1bd30 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 automatic rollb
1bd40 61 63 6b 20 6f 66 20 74 68 65 20 63 68 61 6e 67 ack of the chang
1bd50 65 73 2e 20 20 53 65 65 20 74 68 65 0d 0a 2a 2a es. See the..**
1bd60 20 3c 61 20 68 72 65 66 3d 22 2f 63 76 73 74 72 <a href="/cvstr
1bd70 61 63 2f 77 69 6b 69 3f 70 3d 43 6f 72 72 75 70 ac/wiki?p=Corrup
1bd80 74 69 6f 6e 46 6f 6c 6c 6f 77 69 6e 67 42 75 73 tionFollowingBus
1bd90 79 45 72 72 6f 72 22 3e 0d 0a 2a 2a 20 43 6f 72 yError">..** Cor
1bda0 72 75 70 74 69 6f 6e 46 6f 6c 6c 6f 77 69 6e 67 ruptionFollowing
1bdb0 42 75 73 79 45 72 72 6f 72 3c 2f 61 3e 20 77 69 BusyError</a> wi
1bdc0 6b 69 20 70 61 67 65 20 66 6f 72 20 61 20 64 69 ki page for a di
1bdd0 73 63 75 73 73 69 6f 6e 20 6f 66 20 77 68 79 0d scussion of why.
1bde0 0a 2a 2a 20 74 68 69 73 20 69 73 20 69 6d 70 6f .** this is impo
1bdf0 72 74 61 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e rtant...**..** ^
1be00 28 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 (There can only
1be10 62 65 20 61 20 73 69 6e 67 6c 65 20 62 75 73 79 be a single busy
1be20 20 68 61 6e 64 6c 65 72 20 64 65 66 69 6e 65 64 handler defined
1be30 20 66 6f 72 20 65 61 63 68 0d 0a 2a 2a 20 5b 64 for each..** [d
1be40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1be50 6f 6e 5d 2e 20 20 53 65 74 74 69 6e 67 20 61 20 on]. Setting a
1be60 6e 65 77 20 62 75 73 79 20 68 61 6e 64 6c 65 72 new busy handler
1be70 20 63 6c 65 61 72 73 20 61 6e 79 0d 0a 2a 2a 20 clears any..**
1be80 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 68 previously set h
1be90 61 6e 64 6c 65 72 2e 29 5e 20 20 5e 4e 6f 74 65 andler.)^ ^Note
1bea0 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 20 5b 73 that calling [s
1beb0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 qlite3_busy_time
1bec0 6f 75 74 28 29 5d 0d 0a 2a 2a 20 77 69 6c 6c 20 out()]..** will
1bed0 61 6c 73 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 also set or clea
1bee0 72 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c r the busy handl
1bef0 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 er...**..** The
1bf00 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 73 68 busy callback sh
1bf10 6f 75 6c 64 20 6e 6f 74 20 74 61 6b 65 20 61 6e ould not take an
1bf20 79 20 61 63 74 69 6f 6e 73 20 77 68 69 63 68 20 y actions which
1bf30 6d 6f 64 69 66 79 20 74 68 65 0d 0a 2a 2a 20 64 modify the..** d
1bf40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1bf50 6f 6e 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 on that invoked
1bf60 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 the busy handler
1bf70 2e 20 20 41 6e 79 20 73 75 63 68 20 61 63 74 69 . Any such acti
1bf80 6f 6e 73 0d 0a 2a 2a 20 72 65 73 75 6c 74 20 69 ons..** result i
1bf90 6e 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 n undefined beha
1bfa0 76 69 6f 72 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 41 vior...** ..** A
1bfb0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6d 75 busy handler mu
1bfc0 73 74 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 st not close the
1bfd0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
1bfe0 74 69 6f 6e 0d 0a 2a 2a 20 6f 72 20 5b 70 72 65 tion..** or [pre
1bff0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d pared statement]
1c000 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 that invoked th
1c010 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0d e busy handler..
1c020 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
1c030 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 int sqlite3_busy
1c040 5f 68 61 6e 64 6c 65 72 28 73 71 6c 69 74 65 33 _handler(sqlite3
1c050 2a 2c 20 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c *, int(*)(void*,
1c060 69 6e 74 29 2c 20 76 6f 69 64 2a 29 3b 0d 0a 0d int), void*);...
1c070 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
1c080 3a 20 53 65 74 20 41 20 42 75 73 79 20 54 69 6d : Set A Busy Tim
1c090 65 6f 75 74 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 eout..**..** ^Th
1c0a0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 is routine sets
1c0b0 61 20 5b 73 71 6c 69 74 65 33 5f 62 75 73 79 5f a [sqlite3_busy_
1c0c0 68 61 6e 64 6c 65 72 20 7c 20 62 75 73 79 20 68 handler | busy h
1c0d0 61 6e 64 6c 65 72 5d 20 74 68 61 74 20 73 6c 65 andler] that sle
1c0e0 65 70 73 0d 0a 2a 2a 20 66 6f 72 20 61 20 73 70 eps..** for a sp
1c0f0 65 63 69 66 69 65 64 20 61 6d 6f 75 6e 74 20 6f ecified amount o
1c100 66 20 74 69 6d 65 20 77 68 65 6e 20 61 20 74 61 f time when a ta
1c110 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 ble is locked.
1c120 5e 54 68 65 20 68 61 6e 64 6c 65 72 0d 0a 2a 2a ^The handler..**
1c130 20 77 69 6c 6c 20 73 6c 65 65 70 20 6d 75 6c 74 will sleep mult
1c140 69 70 6c 65 20 74 69 6d 65 73 20 75 6e 74 69 6c iple times until
1c150 20 61 74 20 6c 65 61 73 74 20 22 6d 73 22 20 6d at least "ms" m
1c160 69 6c 6c 69 73 65 63 6f 6e 64 73 20 6f 66 20 73 illiseconds of s
1c170 6c 65 65 70 69 6e 67 0d 0a 2a 2a 20 68 61 76 65 leeping..** have
1c180 20 61 63 63 75 6d 75 6c 61 74 65 64 2e 20 20 5e accumulated. ^
1c190 41 66 74 65 72 20 61 74 20 6c 65 61 73 74 20 22 After at least "
1c1a0 6d 73 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 ms" milliseconds
1c1b0 20 6f 66 20 73 6c 65 65 70 69 6e 67 2c 0d 0a 2a of sleeping,..*
1c1c0 2a 20 74 68 65 20 68 61 6e 64 6c 65 72 20 72 65 * the handler re
1c1d0 74 75 72 6e 73 20 30 20 77 68 69 63 68 20 63 61 turns 0 which ca
1c1e0 75 73 65 73 20 5b 73 71 6c 69 74 65 33 5f 73 74 uses [sqlite3_st
1c1f0 65 70 28 29 5d 20 74 6f 20 72 65 74 75 72 6e 0d ep()] to return.
1c200 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 42 55 53 59 .** [SQLITE_BUSY
1c210 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49 4f 45 ] or [SQLITE_IOE
1c220 52 52 5f 42 4c 4f 43 4b 45 44 5d 2e 0d 0a 2a 2a RR_BLOCKED]...**
1c230 0d 0a 2a 2a 20 5e 43 61 6c 6c 69 6e 67 20 74 68 ..** ^Calling th
1c240 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 is routine with
1c250 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 65 73 73 an argument less
1c260 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 than or equal t
1c270 6f 20 7a 65 72 6f 0d 0a 2a 2a 20 74 75 72 6e 73 o zero..** turns
1c280 20 6f 66 66 20 61 6c 6c 20 62 75 73 79 20 68 61 off all busy ha
1c290 6e 64 6c 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ndlers...**..**
1c2a0 5e 28 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 ^(There can only
1c2b0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 75 73 be a single bus
1c2c0 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 y handler for a
1c2d0 70 61 72 74 69 63 75 6c 61 72 0d 0a 2a 2a 20 5b particular..** [
1c2e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
1c2f0 69 6f 6e 5d 20 61 6e 79 20 61 6e 79 20 67 69 76 ion] any any giv
1c300 65 6e 20 6d 6f 6d 65 6e 74 2e 20 20 49 66 20 61 en moment. If a
1c310 6e 6f 74 68 65 72 20 62 75 73 79 20 68 61 6e 64 nother busy hand
1c320 6c 65 72 0d 0a 2a 2a 20 77 61 73 20 64 65 66 69 ler..** was defi
1c330 6e 65 64 20 20 28 75 73 69 6e 67 20 5b 73 71 6c ned (using [sql
1c340 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 ite3_busy_handle
1c350 72 28 29 5d 29 20 70 72 69 6f 72 20 74 6f 20 63 r()]) prior to c
1c360 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 74 68 69 73 20 alling..** this
1c370 72 6f 75 74 69 6e 65 2c 20 74 68 61 74 20 6f 74 routine, that ot
1c380 68 65 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 her busy handler
1c390 20 69 73 20 63 6c 65 61 72 65 64 2e 29 5e 0d 0a is cleared.)^..
1c3a0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
1c3b0 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f nt sqlite3_busy_
1c3c0 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 2a timeout(sqlite3*
1c3d0 2c 20 69 6e 74 20 6d 73 29 3b 0d 0a 0d 0a 2f 2a , int ms);..../*
1c3e0 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 ..** CAPI3REF: C
1c3f0 6f 6e 76 65 6e 69 65 6e 63 65 20 52 6f 75 74 69 onvenience Routi
1c400 6e 65 73 20 46 6f 72 20 52 75 6e 6e 69 6e 67 20 nes For Running
1c410 51 75 65 72 69 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 Queries..**..**
1c420 54 68 69 73 20 69 73 20 61 20 6c 65 67 61 63 79 This is a legacy
1c430 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 20 interface that
1c440 69 73 20 70 72 65 73 65 72 76 65 64 20 66 6f 72 is preserved for
1c450 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 backwards compa
1c460 74 69 62 69 6c 69 74 79 2e 0d 0a 2a 2a 20 55 73 tibility...** Us
1c470 65 20 6f 66 20 74 68 69 73 20 69 6e 74 65 72 66 e of this interf
1c480 61 63 65 20 69 73 20 6e 6f 74 20 72 65 63 6f 6d ace is not recom
1c490 6d 65 6e 64 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 mended...**..**
1c4a0 44 65 66 69 6e 69 74 69 6f 6e 3a 20 41 20 3c 62 Definition: A <b
1c4b0 3e 72 65 73 75 6c 74 20 74 61 62 6c 65 3c 2f 62 >result table</b
1c4c0 3e 20 69 73 20 6d 65 6d 6f 72 79 20 64 61 74 61 > is memory data
1c4d0 20 73 74 72 75 63 74 75 72 65 20 63 72 65 61 74 structure creat
1c4e0 65 64 20 62 79 20 74 68 65 0d 0a 2a 2a 20 5b 73 ed by the..** [s
1c4f0 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 qlite3_get_table
1c500 28 29 5d 20 69 6e 74 65 72 66 61 63 65 2e 20 20 ()] interface.
1c510 41 20 72 65 73 75 6c 74 20 74 61 62 6c 65 20 72 A result table r
1c520 65 63 6f 72 64 73 20 74 68 65 0d 0a 2a 2a 20 63 ecords the..** c
1c530 6f 6d 70 6c 65 74 65 20 71 75 65 72 79 20 72 65 omplete query re
1c540 73 75 6c 74 73 20 66 72 6f 6d 20 6f 6e 65 20 6f sults from one o
1c550 72 20 6d 6f 72 65 20 71 75 65 72 69 65 73 2e 0d r more queries..
1c560 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 74 61 62 6c .**..** The tabl
1c570 65 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 68 e conceptually h
1c580 61 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 72 as a number of r
1c590 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e ows and columns.
1c5a0 20 20 42 75 74 0d 0a 2a 2a 20 74 68 65 73 65 20 But..** these
1c5b0 6e 75 6d 62 65 72 73 20 61 72 65 20 6e 6f 74 20 numbers are not
1c5c0 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 part of the resu
1c5d0 6c 74 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e lt table itself.
1c5e0 20 20 54 68 65 73 65 0d 0a 2a 2a 20 6e 75 6d 62 These..** numb
1c5f0 65 72 73 20 61 72 65 20 6f 62 74 61 69 6e 65 64 ers are obtained
1c600 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4c 65 separately. Le
1c610 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 t N be the numbe
1c620 72 20 6f 66 20 72 6f 77 73 0d 0a 2a 2a 20 61 6e r of rows..** an
1c630 64 20 4d 20 62 65 20 74 68 65 20 6e 75 6d 62 65 d M be the numbe
1c640 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0d 0a 2a r of columns...*
1c650 2a 0d 0a 2a 2a 20 41 20 72 65 73 75 6c 74 20 74 *..** A result t
1c660 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79 able is an array
1c670 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 of pointers to
1c680 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 zero-terminated
1c690 55 54 46 2d 38 20 73 74 72 69 6e 67 73 2e 0d 0a UTF-8 strings...
1c6a0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 28 4e 2b ** There are (N+
1c6b0 31 29 2a 4d 20 65 6c 65 6d 65 6e 74 73 20 69 6e 1)*M elements in
1c6c0 20 74 68 65 20 61 72 72 61 79 2e 20 20 54 68 65 the array. The
1c6d0 20 66 69 72 73 74 20 4d 20 70 6f 69 6e 74 65 72 first M pointer
1c6e0 73 20 70 6f 69 6e 74 0d 0a 2a 2a 20 74 6f 20 7a s point..** to z
1c6f0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 ero-terminated s
1c700 74 72 69 6e 67 73 20 74 68 61 74 20 20 63 6f 6e trings that con
1c710 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f tain the names o
1c720 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 2e 0d 0a f the columns...
1c730 2a 2a 20 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 ** The remaining
1c740 20 65 6e 74 72 69 65 73 20 61 6c 6c 20 70 6f 69 entries all poi
1c750 6e 74 20 74 6f 20 71 75 65 72 79 20 72 65 73 75 nt to query resu
1c760 6c 74 73 2e 20 20 4e 55 4c 4c 20 76 61 6c 75 65 lts. NULL value
1c770 73 20 72 65 73 75 6c 74 0d 0a 2a 2a 20 69 6e 20 s result..** in
1c780 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 2e 20 20 NULL pointers.
1c790 41 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73 All other values
1c7a0 20 61 72 65 20 69 6e 20 74 68 65 69 72 20 55 54 are in their UT
1c7b0 46 2d 38 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 F-8 zero-termina
1c7c0 74 65 64 0d 0a 2a 2a 20 73 74 72 69 6e 67 20 72 ted..** string r
1c7d0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 61 73 epresentation as
1c7e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 73 71 returned by [sq
1c7f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 lite3_column_tex
1c800 74 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 t()]...**..** A
1c810 72 65 73 75 6c 74 20 74 61 62 6c 65 20 6d 69 67 result table mig
1c820 68 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 6f 6e ht consist of on
1c830 65 20 6f 72 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 e or more memory
1c840 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0d 0a 2a allocations...*
1c850 2a 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 * It is not safe
1c860 20 74 6f 20 70 61 73 73 20 61 20 72 65 73 75 6c to pass a resul
1c870 74 20 74 61 62 6c 65 20 64 69 72 65 63 74 6c 79 t table directly
1c880 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 to [sqlite3_fre
1c890 65 28 29 5d 2e 0d 0a 2a 2a 20 41 20 72 65 73 75 e()]...** A resu
1c8a0 6c 74 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 lt table should
1c8b0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 75 be deallocated u
1c8c0 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 66 72 sing [sqlite3_fr
1c8d0 65 65 5f 74 61 62 6c 65 28 29 5d 2e 0d 0a 2a 2a ee_table()]...**
1c8e0 0d 0a 2a 2a 20 5e 28 41 73 20 61 6e 20 65 78 61 ..** ^(As an exa
1c8f0 6d 70 6c 65 20 6f 66 20 74 68 65 20 72 65 73 75 mple of the resu
1c900 6c 74 20 74 61 62 6c 65 20 66 6f 72 6d 61 74 2c lt table format,
1c910 20 73 75 70 70 6f 73 65 20 61 20 71 75 65 72 79 suppose a query
1c920 20 72 65 73 75 6c 74 0d 0a 2a 2a 20 69 73 20 61 result..** is a
1c930 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a s follows:..**..
1c940 2a 2a 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c ** <blockquote><
1c950 70 72 65 3e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 pre>..**
1c960 4e 61 6d 65 20 20 20 20 20 20 20 20 7c 20 41 67 Name | Ag
1c970 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 2d 2d 2d e..** ---
1c980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c990 2d 2d 2d 2d 0d 0a 2a 2a 20 20 20 20 20 20 20 20 ----..**
1c9a0 41 6c 69 63 65 20 20 20 20 20 20 20 7c 20 34 33 Alice | 43
1c9b0 0d 0a 2a 2a 20 20 20 20 20 20 20 20 42 6f 62 20 ..** Bob
1c9c0 20 20 20 20 20 20 20 20 7c 20 32 38 0d 0a 2a 2a | 28..**
1c9d0 20 20 20 20 20 20 20 20 43 69 6e 64 79 20 20 20 Cindy
1c9e0 20 20 20 20 7c 20 32 31 0d 0a 2a 2a 20 3c 2f 70 | 21..** </p
1c9f0 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e re></blockquote>
1ca00 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 20 61 ..**..** There a
1ca10 72 65 20 74 77 6f 20 63 6f 6c 75 6d 6e 20 28 4d re two column (M
1ca20 3d 3d 32 29 20 61 6e 64 20 74 68 72 65 65 20 72 ==2) and three r
1ca30 6f 77 73 20 28 4e 3d 3d 33 29 2e 20 20 54 68 75 ows (N==3). Thu
1ca40 73 20 74 68 65 0d 0a 2a 2a 20 72 65 73 75 6c 74 s the..** result
1ca50 20 74 61 62 6c 65 20 68 61 73 20 38 20 65 6e 74 table has 8 ent
1ca60 72 69 65 73 2e 20 20 53 75 70 70 6f 73 65 20 74 ries. Suppose t
1ca70 68 65 20 72 65 73 75 6c 74 20 74 61 62 6c 65 20 he result table
1ca80 69 73 20 73 74 6f 72 65 64 0d 0a 2a 2a 20 69 6e is stored..** in
1ca90 20 61 6e 20 61 72 72 61 79 20 6e 61 6d 65 73 20 an array names
1caa0 61 7a 52 65 73 75 6c 74 2e 20 20 54 68 65 6e 20 azResult. Then
1cab0 61 7a 52 65 73 75 6c 74 20 68 6f 6c 64 73 20 74 azResult holds t
1cac0 68 69 73 20 63 6f 6e 74 65 6e 74 3a 0d 0a 2a 2a his content:..**
1cad0 0d 0a 2a 2a 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 ..** <blockquote
1cae0 3e 3c 70 72 65 3e 0d 0a 2a 2a 20 20 20 20 20 20 ><pre>..**
1caf0 20 20 61 7a 52 65 73 75 6c 74 26 23 39 31 3b 30 azResult[0
1cb00 5d 20 3d 20 22 4e 61 6d 65 22 3b 0d 0a 2a 2a 20 ] = "Name";..**
1cb10 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 26 azResult&
1cb20 23 39 31 3b 31 5d 20 3d 20 22 41 67 65 22 3b 0d #91;1] = "Age";.
1cb30 0a 2a 2a 20 20 20 20 20 20 20 20 61 7a 52 65 73 .** azRes
1cb40 75 6c 74 26 23 39 31 3b 32 5d 20 3d 20 22 41 6c ult[2] = "Al
1cb50 69 63 65 22 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 ice";..**
1cb60 20 61 7a 52 65 73 75 6c 74 26 23 39 31 3b 33 5d azResult[3]
1cb70 20 3d 20 22 34 33 22 3b 0d 0a 2a 2a 20 20 20 20 = "43";..**
1cb80 20 20 20 20 61 7a 52 65 73 75 6c 74 26 23 39 31 azResult[
1cb90 3b 34 5d 20 3d 20 22 42 6f 62 22 3b 0d 0a 2a 2a ;4] = "Bob";..**
1cba0 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 azResult
1cbb0 26 23 39 31 3b 35 5d 20 3d 20 22 32 38 22 3b 0d [5] = "28";.
1cbc0 0a 2a 2a 20 20 20 20 20 20 20 20 61 7a 52 65 73 .** azRes
1cbd0 75 6c 74 26 23 39 31 3b 36 5d 20 3d 20 22 43 69 ult[6] = "Ci
1cbe0 6e 64 79 22 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 ndy";..**
1cbf0 20 61 7a 52 65 73 75 6c 74 26 23 39 31 3b 37 5d azResult[7]
1cc00 20 3d 20 22 32 31 22 3b 0d 0a 2a 2a 20 3c 2f 70 = "21";..** </p
1cc10 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e re></blockquote>
1cc20 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 )^..**..** ^The
1cc30 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c sqlite3_get_tabl
1cc40 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 e() function eva
1cc50 6c 75 61 74 65 73 20 6f 6e 65 20 6f 72 20 6d 6f luates one or mo
1cc60 72 65 0d 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e re..** semicolon
1cc70 2d 73 65 70 61 72 61 74 65 64 20 53 51 4c 20 73 -separated SQL s
1cc80 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 tatements in the
1cc90 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 zero-terminated
1cca0 20 55 54 46 2d 38 0d 0a 2a 2a 20 73 74 72 69 6e UTF-8..** strin
1ccb0 67 20 6f 66 20 69 74 73 20 32 6e 64 20 70 61 72 g of its 2nd par
1ccc0 61 6d 65 74 65 72 20 61 6e 64 20 72 65 74 75 72 ameter and retur
1ccd0 6e 73 20 61 20 72 65 73 75 6c 74 20 74 61 62 6c ns a result tabl
1cce0 65 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 70 6f 69 e to the..** poi
1ccf0 6e 74 65 72 20 67 69 76 65 6e 20 69 6e 20 69 74 nter given in it
1cd00 73 20 33 72 64 20 70 61 72 61 6d 65 74 65 72 2e s 3rd parameter.
1cd10 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66 74 65 72 20 74 ..**..** After t
1cd20 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 he application h
1cd30 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 as finished with
1cd40 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d the result from
1cd50 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 sqlite3_get_tab
1cd60 6c 65 28 29 2c 0d 0a 2a 2a 20 69 74 20 6d 75 73 le(),..** it mus
1cd70 74 20 70 61 73 73 20 74 68 65 20 72 65 73 75 6c t pass the resul
1cd80 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 65 72 20 t table pointer
1cd90 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f to sqlite3_free_
1cda0 74 61 62 6c 65 28 29 20 69 6e 20 6f 72 64 65 72 table() in order
1cdb0 20 74 6f 0d 0a 2a 2a 20 72 65 6c 65 61 73 65 20 to..** release
1cdc0 74 68 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 the memory that
1cdd0 77 61 73 20 6d 61 6c 6c 6f 63 65 64 2e 20 20 42 was malloced. B
1cde0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 ecause of the wa
1cdf0 79 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 y the..** [sqlit
1ce00 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 20 68 61 70 e3_malloc()] hap
1ce10 70 65 6e 73 20 77 69 74 68 69 6e 20 73 71 6c 69 pens within sqli
1ce20 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 29 2c te3_get_table(),
1ce30 20 74 68 65 20 63 61 6c 6c 69 6e 67 0d 0a 2a 2a the calling..**
1ce40 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e function must n
1ce50 6f 74 20 74 72 79 20 74 6f 20 63 61 6c 6c 20 5b ot try to call [
1ce60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 5d 20 sqlite3_free()]
1ce70 64 69 72 65 63 74 6c 79 2e 20 20 4f 6e 6c 79 0d directly. Only.
1ce80 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 .** [sqlite3_fre
1ce90 65 5f 74 61 62 6c 65 28 29 5d 20 69 73 20 61 62 e_table()] is ab
1cea0 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 le to release th
1ceb0 65 20 6d 65 6d 6f 72 79 20 70 72 6f 70 65 72 6c e memory properl
1cec0 79 20 61 6e 64 20 73 61 66 65 6c 79 2e 0d 0a 2a y and safely...*
1ced0 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 *..** The sqlite
1cee0 33 5f 67 65 74 5f 74 61 62 6c 65 28 29 20 69 6e 3_get_table() in
1cef0 74 65 72 66 61 63 65 20 69 73 20 69 6d 70 6c 65 terface is imple
1cf00 6d 65 6e 74 65 64 20 61 73 20 61 20 77 72 61 70 mented as a wrap
1cf10 70 65 72 20 61 72 6f 75 6e 64 0d 0a 2a 2a 20 5b per around..** [
1cf20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 5d 2e sqlite3_exec()].
1cf30 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 67 65 The sqlite3_ge
1cf40 74 5f 74 61 62 6c 65 28 29 20 72 6f 75 74 69 6e t_table() routin
1cf50 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 e does not have
1cf60 61 63 63 65 73 73 0d 0a 2a 2a 20 74 6f 20 61 6e access..** to an
1cf70 79 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 y internal data
1cf80 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 53 51 structures of SQ
1cf90 4c 69 74 65 2e 20 20 49 74 20 75 73 65 73 20 6f Lite. It uses o
1cfa0 6e 6c 79 20 74 68 65 20 70 75 62 6c 69 63 0d 0a nly the public..
1cfb0 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 64 65 66 ** interface def
1cfc0 69 6e 65 64 20 68 65 72 65 2e 20 20 41 73 20 61 ined here. As a
1cfd0 20 63 6f 6e 73 65 71 75 65 6e 63 65 2c 20 65 72 consequence, er
1cfe0 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20 rors that occur
1cff0 69 6e 20 74 68 65 0d 0a 2a 2a 20 77 72 61 70 70 in the..** wrapp
1d000 65 72 20 6c 61 79 65 72 20 6f 75 74 73 69 64 65 er layer outside
1d010 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c of the internal
1d020 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 [sqlite3_exec()
1d030 5d 20 63 61 6c 6c 20 61 72 65 20 6e 6f 74 0d 0a ] call are not..
1d040 2a 2a 20 72 65 66 6c 65 63 74 65 64 20 69 6e 20 ** reflected in
1d050 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 subsequent calls
1d060 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 to [sqlite3_err
1d070 63 6f 64 65 28 29 5d 20 6f 72 0d 0a 2a 2a 20 5b code()] or..** [
1d080 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 sqlite3_errmsg()
1d090 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 ]...*/..SQLITE_A
1d0a0 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 PI int sqlite3_g
1d0b0 65 74 5f 74 61 62 6c 65 28 0d 0a 20 20 73 71 6c et_table(.. sql
1d0c0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 ite3 *db,
1d0d0 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 /* An open da
1d0e0 74 61 62 61 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e tabase */.. con
1d0f0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 st char *zSql,
1d100 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 /* SQL to be
1d110 65 76 61 6c 75 61 74 65 64 20 2a 2f 0d 0a 20 20 evaluated */..
1d120 63 68 61 72 20 2a 2a 2a 70 61 7a 52 65 73 75 6c char ***pazResul
1d130 74 2c 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 t, /* Results
1d140 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f of the query */
1d150 0d 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 77 2c 20 .. int *pnRow,
1d160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1d170 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 72 6f ber of result ro
1d180 77 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 ws written here
1d190 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c */.. int *pnCol
1d1a0 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e umn, /* N
1d1b0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 umber of result
1d1c0 63 6f 6c 75 6d 6e 73 20 77 72 69 74 74 65 6e 20 columns written
1d1d0 68 65 72 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 here */.. char
1d1e0 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20 20 20 20 **pzErrmsg
1d1f0 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 /* Error msg wr
1d200 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0d 0a 29 itten here */..)
1d210 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f ;..SQLITE_API vo
1d220 69 64 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f id sqlite3_free_
1d230 74 61 62 6c 65 28 63 68 61 72 20 2a 2a 72 65 73 table(char **res
1d240 75 6c 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ult);..../*..**
1d250 43 41 50 49 33 52 45 46 3a 20 46 6f 72 6d 61 74 CAPI3REF: Format
1d260 74 65 64 20 53 74 72 69 6e 67 20 50 72 69 6e 74 ted String Print
1d270 69 6e 67 20 46 75 6e 63 74 69 6f 6e 73 0d 0a 2a ing Functions..*
1d280 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 *..** These rout
1d290 69 6e 65 73 20 61 72 65 20 77 6f 72 6b 2d 61 6c ines are work-al
1d2a0 69 6b 65 73 20 6f 66 20 74 68 65 20 22 70 72 69 ikes of the "pri
1d2b0 6e 74 66 28 29 22 20 66 61 6d 69 6c 79 20 6f 66 ntf()" family of
1d2c0 20 66 75 6e 63 74 69 6f 6e 73 0d 0a 2a 2a 20 66 functions..** f
1d2d0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 rom the standard
1d2e0 20 43 20 6c 69 62 72 61 72 79 2e 0d 0a 2a 2a 0d C library...**.
1d2f0 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 .** ^The sqlite3
1d300 5f 6d 70 72 69 6e 74 66 28 29 20 61 6e 64 20 73 _mprintf() and s
1d310 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 qlite3_vmprintf(
1d320 29 20 72 6f 75 74 69 6e 65 73 20 77 72 69 74 65 ) routines write
1d330 20 74 68 65 69 72 0d 0a 2a 2a 20 72 65 73 75 6c their..** resul
1d340 74 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f ts into memory o
1d350 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 5b 73 71 btained from [sq
1d360 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 2e lite3_malloc()].
1d370 0d 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 73 ..** The strings
1d380 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 returned by the
1d390 73 65 20 74 77 6f 20 72 6f 75 74 69 6e 65 73 20 se two routines
1d3a0 73 68 6f 75 6c 64 20 62 65 0d 0a 2a 2a 20 72 65 should be..** re
1d3b0 6c 65 61 73 65 64 20 62 79 20 5b 73 71 6c 69 74 leased by [sqlit
1d3c0 65 33 5f 66 72 65 65 28 29 5d 2e 20 20 5e 42 6f e3_free()]. ^Bo
1d3d0 74 68 20 72 6f 75 74 69 6e 65 73 20 72 65 74 75 th routines retu
1d3e0 72 6e 20 61 0d 0a 2a 2a 20 4e 55 4c 4c 20 70 6f rn a..** NULL po
1d3f0 69 6e 74 65 72 20 69 66 20 5b 73 71 6c 69 74 65 inter if [sqlite
1d400 33 5f 6d 61 6c 6c 6f 63 28 29 5d 20 69 73 20 75 3_malloc()] is u
1d410 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 nable to allocat
1d420 65 20 65 6e 6f 75 67 68 0d 0a 2a 2a 20 6d 65 6d e enough..** mem
1d430 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ory to hold the
1d440 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 resulting string
1d450 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 20 ...**..** ^(The
1d460 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
1d470 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 73 69 () routine is si
1d480 6d 69 6c 61 72 20 74 6f 20 22 73 6e 70 72 69 6e milar to "snprin
1d490 74 66 28 29 22 20 66 72 6f 6d 0d 0a 2a 2a 20 74 tf()" from..** t
1d4a0 68 65 20 73 74 61 6e 64 61 72 64 20 43 20 6c 69 he standard C li
1d4b0 62 72 61 72 79 2e 20 20 54 68 65 20 72 65 73 75 brary. The resu
1d4c0 6c 74 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e lt is written in
1d4d0 74 6f 20 74 68 65 0d 0a 2a 2a 20 62 75 66 66 65 to the..** buffe
1d4e0 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 r supplied as th
1d4f0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 e second paramet
1d500 65 72 20 77 68 6f 73 65 20 73 69 7a 65 20 69 73 er whose size is
1d510 20 67 69 76 65 6e 20 62 79 0d 0a 2a 2a 20 74 68 given by..** th
1d520 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 e first paramete
1d530 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 r. Note that the
1d540 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0d 0a 2a order of the..*
1d550 2a 20 66 69 72 73 74 20 74 77 6f 20 70 61 72 61 * first two para
1d560 6d 65 74 65 72 73 20 69 73 20 72 65 76 65 72 73 meters is revers
1d570 65 64 20 66 72 6f 6d 20 73 6e 70 72 69 6e 74 66 ed from snprintf
1d580 28 29 2e 29 5e 20 20 54 68 69 73 20 69 73 20 61 ().)^ This is a
1d590 6e 0d 0a 2a 2a 20 68 69 73 74 6f 72 69 63 61 6c n..** historical
1d5a0 20 61 63 63 69 64 65 6e 74 20 74 68 61 74 20 63 accident that c
1d5b0 61 6e 6e 6f 74 20 62 65 20 66 69 78 65 64 20 77 annot be fixed w
1d5c0 69 74 68 6f 75 74 20 62 72 65 61 6b 69 6e 67 0d ithout breaking.
1d5d0 0a 2a 2a 20 62 61 63 6b 77 61 72 64 73 20 63 6f .** backwards co
1d5e0 6d 70 61 74 69 62 69 6c 69 74 79 2e 20 20 5e 28 mpatibility. ^(
1d5f0 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 73 Note also that s
1d600 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
1d610 29 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 )..** returns a
1d620 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 62 pointer to its b
1d630 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 uffer instead of
1d640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d 0a the number of..
1d650 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 63 ** characters ac
1d660 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 tually written i
1d670 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 29 nto the buffer.)
1d680 5e 20 20 57 65 20 61 64 6d 69 74 20 74 68 61 74 ^ We admit that
1d690 0d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 ..** the number
1d6a0 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 77 72 of characters wr
1d6b0 69 74 74 65 6e 20 77 6f 75 6c 64 20 62 65 20 61 itten would be a
1d6c0 20 6d 6f 72 65 20 75 73 65 66 75 6c 20 72 65 74 more useful ret
1d6d0 75 72 6e 0d 0a 2a 2a 20 76 61 6c 75 65 20 62 75 urn..** value bu
1d6e0 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e t we cannot chan
1d6f0 67 65 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 ge the implement
1d700 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 ation of sqlite3
1d710 5f 73 6e 70 72 69 6e 74 66 28 29 0d 0a 2a 2a 20 _snprintf()..**
1d720 6e 6f 77 20 77 69 74 68 6f 75 74 20 62 72 65 61 now without brea
1d730 6b 69 6e 67 20 63 6f 6d 70 61 74 69 62 69 6c 69 king compatibili
1d740 74 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 41 73 20 ty...**..** ^As
1d750 6c 6f 6e 67 20 61 73 20 74 68 65 20 62 75 66 66 long as the buff
1d760 65 72 20 73 69 7a 65 20 69 73 20 67 72 65 61 74 er size is great
1d770 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 71 er than zero, sq
1d780 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 lite3_snprintf()
1d790 0d 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 73 20 ..** guarantees
1d7a0 74 68 61 74 20 74 68 65 20 62 75 66 66 65 72 20 that the buffer
1d7b0 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d 74 is always zero-t
1d7c0 65 72 6d 69 6e 61 74 65 64 2e 20 20 5e 54 68 65 erminated. ^The
1d7d0 20 66 69 72 73 74 0d 0a 2a 2a 20 70 61 72 61 6d first..** param
1d7e0 65 74 65 72 20 22 6e 22 20 69 73 20 74 68 65 20 eter "n" is the
1d7f0 74 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 total size of th
1d800 65 20 62 75 66 66 65 72 2c 20 69 6e 63 6c 75 64 e buffer, includ
1d810 69 6e 67 20 73 70 61 63 65 20 66 6f 72 0d 0a 2a ing space for..*
1d820 2a 20 74 68 65 20 7a 65 72 6f 20 74 65 72 6d 69 * the zero termi
1d830 6e 61 74 6f 72 2e 20 20 53 6f 20 74 68 65 20 6c nator. So the l
1d840 6f 6e 67 65 73 74 20 73 74 72 69 6e 67 20 74 68 ongest string th
1d850 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 at can be comple
1d860 74 65 6c 79 0d 0a 2a 2a 20 77 72 69 74 74 65 6e tely..** written
1d870 20 77 69 6c 6c 20 62 65 20 6e 2d 31 20 63 68 61 will be n-1 cha
1d880 72 61 63 74 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a racters...**..**
1d890 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 76 73 ^The sqlite3_vs
1d8a0 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e nprintf() routin
1d8b0 65 20 69 73 20 61 20 76 61 72 61 72 67 73 20 76 e is a varargs v
1d8c0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 ersion of sqlite
1d8d0 33 5f 73 6e 70 72 69 6e 74 66 28 29 2e 0d 0a 2a 3_snprintf()...*
1d8e0 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 *..** These rout
1d8f0 69 6e 65 73 20 61 6c 6c 20 69 6d 70 6c 65 6d 65 ines all impleme
1d900 6e 74 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e nt some addition
1d910 61 6c 20 66 6f 72 6d 61 74 74 69 6e 67 0d 0a 2a al formatting..*
1d920 2a 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 * options that a
1d930 72 65 20 75 73 65 66 75 6c 20 66 6f 72 20 63 6f re useful for co
1d940 6e 73 74 72 75 63 74 69 6e 67 20 53 51 4c 20 73 nstructing SQL s
1d950 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 2a 2a 20 41 tatements...** A
1d960 6c 6c 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 ll of the usual
1d970 70 72 69 6e 74 66 28 29 20 66 6f 72 6d 61 74 74 printf() formatt
1d980 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61 70 70 6c ing options appl
1d990 79 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c y. In addition,
1d9a0 20 74 68 65 72 65 0d 0a 2a 2a 20 69 73 20 61 72 there..** is ar
1d9b0 65 20 22 25 71 22 2c 20 22 25 51 22 2c 20 61 6e e "%q", "%Q", an
1d9c0 64 20 22 25 7a 22 20 6f 70 74 69 6f 6e 73 2e 0d d "%z" options..
1d9d0 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 20 25 71 .**..** ^(The %q
1d9e0 20 6f 70 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 option works li
1d9f0 6b 65 20 25 73 20 69 6e 20 74 68 61 74 20 69 74 ke %s in that it
1da00 20 73 75 62 73 74 69 74 75 74 65 73 20 61 20 6e substitutes a n
1da10 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0d 0a 2a ul-terminated..*
1da20 2a 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 * string from th
1da30 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e e argument list.
1da40 20 20 42 75 74 20 25 71 20 61 6c 73 6f 20 64 6f But %q also do
1da50 75 62 6c 65 73 20 65 76 65 72 79 20 27 5c 27 27 ubles every '\''
1da60 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2a 20 character...**
1da70 25 71 20 69 73 20 64 65 73 69 67 6e 65 64 20 66 %q is designed f
1da80 6f 72 20 75 73 65 20 69 6e 73 69 64 65 20 61 20 or use inside a
1da90 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 2e 29 string literal.)
1daa0 5e 20 20 42 79 20 64 6f 75 62 6c 69 6e 67 20 65 ^ By doubling e
1dab0 61 63 68 20 27 5c 27 27 0d 0a 2a 2a 20 63 68 61 ach '\''..** cha
1dac0 72 61 63 74 65 72 20 69 74 20 65 73 63 61 70 65 racter it escape
1dad0 73 20 74 68 61 74 20 63 68 61 72 61 63 74 65 72 s that character
1dae0 20 61 6e 64 20 61 6c 6c 6f 77 73 20 69 74 20 74 and allows it t
1daf0 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e o be inserted in
1db00 74 6f 0d 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e to..** the strin
1db10 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 65 g...**..** For e
1db20 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 65 20 74 xample, assume t
1db30 68 65 20 73 74 72 69 6e 67 20 76 61 72 69 61 62 he string variab
1db40 6c 65 20 7a 54 65 78 74 20 63 6f 6e 74 61 69 6e le zText contain
1db50 73 20 74 65 78 74 20 61 73 20 66 6f 6c 6c 6f 77 s text as follow
1db60 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 62 6c 6f 63 s:..**..** <bloc
1db70 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0d 0a 2a 2a kquote><pre>..**
1db80 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 char *zText =
1db90 22 49 74 27 73 20 61 20 68 61 70 70 79 20 64 61 "It's a happy da
1dba0 79 21 22 3b 0d 0a 2a 2a 20 3c 2f 70 72 65 3e 3c y!";..** </pre><
1dbb0 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0d 0a 2a 2a /blockquote>..**
1dbc0 0d 0a 2a 2a 20 4f 6e 65 20 63 61 6e 20 75 73 65 ..** One can use
1dbd0 20 74 68 69 73 20 74 65 78 74 20 69 6e 20 61 6e this text in an
1dbe0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 SQL statement a
1dbf0 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a s follows:..**..
1dc00 2a 2a 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c ** <blockquote><
1dc10 70 72 65 3e 0d 0a 2a 2a 20 20 63 68 61 72 20 2a pre>..** char *
1dc20 7a 53 51 4c 20 3d 20 73 71 6c 69 74 65 33 5f 6d zSQL = sqlite3_m
1dc30 70 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 printf("INSERT I
1dc40 4e 54 4f 20 74 61 62 6c 65 20 56 41 4c 55 45 53 NTO table VALUES
1dc50 28 27 25 71 27 29 22 2c 20 7a 54 65 78 74 29 3b ('%q')", zText);
1dc60 0d 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 65 78 ..** sqlite3_ex
1dc70 65 63 28 64 62 2c 20 7a 53 51 4c 2c 20 30 2c 20 ec(db, zSQL, 0,
1dc80 30 2c 20 30 29 3b 0d 0a 2a 2a 20 20 73 71 6c 69 0, 0);..** sqli
1dc90 74 65 33 5f 66 72 65 65 28 7a 53 51 4c 29 3b 0d te3_free(zSQL);.
1dca0 0a 2a 2a 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 .** </pre></bloc
1dcb0 6b 71 75 6f 74 65 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 kquote>..**..**
1dcc0 42 65 63 61 75 73 65 20 74 68 65 20 25 71 20 66 Because the %q f
1dcd0 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69 73 20 ormat string is
1dce0 75 73 65 64 2c 20 74 68 65 20 27 5c 27 27 20 63 used, the '\'' c
1dcf0 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 65 78 haracter in zTex
1dd00 74 0d 0a 2a 2a 20 69 73 20 65 73 63 61 70 65 64 t..** is escaped
1dd10 20 61 6e 64 20 74 68 65 20 53 51 4c 20 67 65 6e and the SQL gen
1dd20 65 72 61 74 65 64 20 69 73 20 61 73 20 66 6f 6c erated is as fol
1dd30 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 62 lows:..**..** <b
1dd40 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0d lockquote><pre>.
1dd50 0a 2a 2a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f .** INSERT INTO
1dd60 20 74 61 62 6c 65 31 20 56 41 4c 55 45 53 28 27 table1 VALUES('
1dd70 49 74 27 27 73 20 61 20 68 61 70 70 79 20 64 61 It''s a happy da
1dd80 79 21 27 29 0d 0a 2a 2a 20 3c 2f 70 72 65 3e 3c y!')..** </pre><
1dd90 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0d 0a 2a 2a /blockquote>..**
1dda0 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 72 ..** This is cor
1ddb0 72 65 63 74 2e 20 20 48 61 64 20 77 65 20 75 73 rect. Had we us
1ddc0 65 64 20 25 73 20 69 6e 73 74 65 61 64 20 6f 66 ed %s instead of
1ddd0 20 25 71 2c 20 74 68 65 20 67 65 6e 65 72 61 74 %q, the generat
1dde0 65 64 20 53 51 4c 0d 0a 2a 2a 20 77 6f 75 6c 64 ed SQL..** would
1ddf0 20 68 61 76 65 20 6c 6f 6f 6b 65 64 20 6c 69 6b have looked lik
1de00 65 20 74 68 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 e this:..**..**
1de10 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 <blockquote><pre
1de20 3e 0d 0a 2a 2a 20 20 49 4e 53 45 52 54 20 49 4e >..** INSERT IN
1de30 54 4f 20 74 61 62 6c 65 31 20 56 41 4c 55 45 53 TO table1 VALUES
1de40 28 27 49 74 27 73 20 61 20 68 61 70 70 79 20 64 ('It's a happy d
1de50 61 79 21 27 29 3b 0d 0a 2a 2a 20 3c 2f 70 72 65 ay!');..** </pre
1de60 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0d 0a ></blockquote>..
1de70 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 73 65 63 6f **..** This seco
1de80 6e 64 20 65 78 61 6d 70 6c 65 20 69 73 20 61 6e nd example is an
1de90 20 53 51 4c 20 73 79 6e 74 61 78 20 65 72 72 6f SQL syntax erro
1dea0 72 2e 20 20 41 73 20 61 20 67 65 6e 65 72 61 6c r. As a general
1deb0 20 72 75 6c 65 20 79 6f 75 20 73 68 6f 75 6c 64 rule you should
1dec0 0d 0a 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 20 ..** always use
1ded0 25 71 20 69 6e 73 74 65 61 64 20 6f 66 20 25 73 %q instead of %s
1dee0 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 when inserting
1def0 74 65 78 74 20 69 6e 74 6f 20 61 20 73 74 72 69 text into a stri
1df00 6e 67 20 6c 69 74 65 72 61 6c 2e 0d 0a 2a 2a 0d ng literal...**.
1df10 0a 2a 2a 20 5e 28 54 68 65 20 25 51 20 6f 70 74 .** ^(The %Q opt
1df20 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 25 ion works like %
1df30 71 20 65 78 63 65 70 74 20 69 74 20 61 6c 73 6f q except it also
1df40 20 61 64 64 73 20 73 69 6e 67 6c 65 20 71 75 6f adds single quo
1df50 74 65 73 20 61 72 6f 75 6e 64 0d 0a 2a 2a 20 74 tes around..** t
1df60 68 65 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 he outside of th
1df70 65 20 74 6f 74 61 6c 20 73 74 72 69 6e 67 2e 20 e total string.
1df80 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 Additionally, i
1df90 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 f the parameter
1dfa0 69 6e 20 74 68 65 0d 0a 2a 2a 20 61 72 67 75 6d in the..** argum
1dfb0 65 6e 74 20 6c 69 73 74 20 69 73 20 61 20 4e 55 ent list is a NU
1dfc0 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 25 51 20 73 LL pointer, %Q s
1dfd0 75 62 73 74 69 74 75 74 65 73 20 74 68 65 20 74 ubstitutes the t
1dfe0 65 78 74 20 22 4e 55 4c 4c 22 20 28 77 69 74 68 ext "NULL" (with
1dff0 6f 75 74 0d 0a 2a 2a 20 73 69 6e 67 6c 65 20 71 out..** single q
1e000 75 6f 74 65 73 29 2e 29 5e 20 20 53 6f 2c 20 66 uotes).)^ So, f
1e010 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6f 6e 65 20 or example, one
1e020 63 6f 75 6c 64 20 73 61 79 3a 0d 0a 2a 2a 0d 0a could say:..**..
1e030 2a 2a 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c ** <blockquote><
1e040 70 72 65 3e 0d 0a 2a 2a 20 20 63 68 61 72 20 2a pre>..** char *
1e050 7a 53 51 4c 20 3d 20 73 71 6c 69 74 65 33 5f 6d zSQL = sqlite3_m
1e060 70 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 printf("INSERT I
1e070 4e 54 4f 20 74 61 62 6c 65 20 56 41 4c 55 45 53 NTO table VALUES
1e080 28 25 51 29 22 2c 20 7a 54 65 78 74 29 3b 0d 0a (%Q)", zText);..
1e090 2a 2a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 ** sqlite3_exec
1e0a0 28 64 62 2c 20 7a 53 51 4c 2c 20 30 2c 20 30 2c (db, zSQL, 0, 0,
1e0b0 20 30 29 3b 0d 0a 2a 2a 20 20 73 71 6c 69 74 65 0);..** sqlite
1e0c0 33 5f 66 72 65 65 28 7a 53 51 4c 29 3b 0d 0a 2a 3_free(zSQL);..*
1e0d0 2a 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 * </pre></blockq
1e0e0 75 6f 74 65 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 uote>..**..** Th
1e0f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 77 69 6c e code above wil
1e100 6c 20 72 65 6e 64 65 72 20 61 20 63 6f 72 72 65 l render a corre
1e110 63 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 ct SQL statement
1e120 20 69 6e 20 74 68 65 20 7a 53 51 4c 0d 0a 2a 2a in the zSQL..**
1e130 20 76 61 72 69 61 62 6c 65 20 65 76 65 6e 20 69 variable even i
1e140 66 20 74 68 65 20 7a 54 65 78 74 20 76 61 72 69 f the zText vari
1e150 61 62 6c 65 20 69 73 20 61 20 4e 55 4c 4c 20 70 able is a NULL p
1e160 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ointer...**..**
1e170 5e 28 54 68 65 20 22 25 7a 22 20 66 6f 72 6d 61 ^(The "%z" forma
1e180 74 74 69 6e 67 20 6f 70 74 69 6f 6e 20 77 6f 72 tting option wor
1e190 6b 73 20 6c 69 6b 65 20 22 25 73 22 20 62 75 74 ks like "%s" but
1e1a0 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 61 64 with the..** ad
1e1b0 64 69 74 69 6f 6e 20 74 68 61 74 20 61 66 74 65 dition that afte
1e1c0 72 20 74 68 65 20 73 74 72 69 6e 67 20 68 61 73 r the string has
1e1d0 20 62 65 65 6e 20 72 65 61 64 20 61 6e 64 20 63 been read and c
1e1e0 6f 70 69 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 74 opied into..** t
1e1f0 68 65 20 72 65 73 75 6c 74 2c 20 5b 73 71 6c 69 he result, [sqli
1e200 74 65 33 5f 66 72 65 65 28 29 5d 20 69 73 20 63 te3_free()] is c
1e210 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 alled on the inp
1e220 75 74 20 73 74 72 69 6e 67 2e 29 5e 0d 0a 2a 2f ut string.)^..*/
1e230 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 68 61 ..SQLITE_API cha
1e240 72 20 2a 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e r *sqlite3_mprin
1e250 74 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 2e tf(const char*,.
1e260 2e 2e 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..);..SQLITE_API
1e270 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 char *sqlite3_v
1e280 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 mprintf(const ch
1e290 61 72 2a 2c 20 76 61 5f 6c 69 73 74 29 3b 0d 0a ar*, va_list);..
1e2a0 53 51 4c 49 54 45 5f 41 50 49 20 63 68 61 72 20 SQLITE_API char
1e2b0 2a 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 *sqlite3_snprint
1e2c0 66 28 69 6e 74 2c 63 68 61 72 2a 2c 63 6f 6e 73 f(int,char*,cons
1e2d0 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a t char*, ...);..
1e2e0 53 51 4c 49 54 45 5f 41 50 49 20 63 68 61 72 20 SQLITE_API char
1e2f0 2a 73 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e *sqlite3_vsnprin
1e300 74 66 28 69 6e 74 2c 63 68 61 72 2a 2c 63 6f 6e tf(int,char*,con
1e310 73 74 20 63 68 61 72 2a 2c 20 76 61 5f 6c 69 73 st char*, va_lis
1e320 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 t);..../*..** CA
1e330 50 49 33 52 45 46 3a 20 4d 65 6d 6f 72 79 20 41 PI3REF: Memory A
1e340 6c 6c 6f 63 61 74 69 6f 6e 20 53 75 62 73 79 73 llocation Subsys
1e350 74 65 6d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 tem..**..** The
1e360 53 51 4c 69 74 65 20 63 6f 72 65 20 75 73 65 73 SQLite core uses
1e370 20 74 68 65 73 65 20 74 68 72 65 65 20 72 6f 75 these three rou
1e380 74 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 tines for all of
1e390 20 69 74 73 20 6f 77 6e 0d 0a 2a 2a 20 69 6e 74 its own..** int
1e3a0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c ernal memory all
1e3b0 6f 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 22 ocation needs. "
1e3c0 43 6f 72 65 22 20 69 6e 20 74 68 65 20 70 72 65 Core" in the pre
1e3d0 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 0d 0a vious sentence..
1e3e0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c ** does not incl
1e3f0 75 64 65 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 ude operating-sy
1e400 73 74 65 6d 20 73 70 65 63 69 66 69 63 20 56 46 stem specific VF
1e410 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e S implementation
1e420 2e 20 20 54 68 65 0d 0a 2a 2a 20 57 69 6e 64 6f . The..** Windo
1e430 77 73 20 56 46 53 20 75 73 65 73 20 6e 61 74 69 ws VFS uses nati
1e440 76 65 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 ve malloc() and
1e450 66 72 65 65 28 29 20 66 6f 72 20 73 6f 6d 65 20 free() for some
1e460 6f 70 65 72 61 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d operations...**.
1e470 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 .** ^The sqlite3
1e480 5f 6d 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e _malloc() routin
1e490 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e e returns a poin
1e4a0 74 65 72 20 74 6f 20 61 20 62 6c 6f 63 6b 0d 0a ter to a block..
1e4b0 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 61 74 20 ** of memory at
1e4c0 6c 65 61 73 74 20 4e 20 62 79 74 65 73 20 69 6e least N bytes in
1e4d0 20 6c 65 6e 67 74 68 2c 20 77 68 65 72 65 20 4e length, where N
1e4e0 20 69 73 20 74 68 65 20 70 61 72 61 6d 65 74 65 is the paramete
1e4f0 72 2e 0d 0a 2a 2a 20 5e 49 66 20 73 71 6c 69 74 r...** ^If sqlit
1e500 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 69 73 20 75 e3_malloc() is u
1e510 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 nable to obtain
1e520 73 75 66 66 69 63 69 65 6e 74 20 66 72 65 65 0d sufficient free.
1e530 0a 2a 2a 20 6d 65 6d 6f 72 79 2c 20 69 74 20 72 .** memory, it r
1e540 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f eturns a NULL po
1e550 69 6e 74 65 72 2e 20 20 5e 49 66 20 74 68 65 20 inter. ^If the
1e560 70 61 72 61 6d 65 74 65 72 20 4e 20 74 6f 0d 0a parameter N to..
1e570 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f ** sqlite3_mallo
1e580 63 28 29 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e c() is zero or n
1e590 65 67 61 74 69 76 65 20 74 68 65 6e 20 73 71 6c egative then sql
1e5a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 72 65 ite3_malloc() re
1e5b0 74 75 72 6e 73 0d 0a 2a 2a 20 61 20 4e 55 4c 4c turns..** a NULL
1e5c0 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a pointer...**..*
1e5d0 2a 20 5e 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 * ^Calling sqlit
1e5e0 65 33 5f 66 72 65 65 28 29 20 77 69 74 68 20 61 e3_free() with a
1e5f0 20 70 6f 69 6e 74 65 72 20 70 72 65 76 69 6f 75 pointer previou
1e600 73 6c 79 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a sly returned..**
1e610 20 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c by sqlite3_mall
1e620 6f 63 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f oc() or sqlite3_
1e630 72 65 61 6c 6c 6f 63 28 29 20 72 65 6c 65 61 73 realloc() releas
1e640 65 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 es that memory s
1e650 6f 0d 0a 2a 2a 20 74 68 61 74 20 69 74 20 6d 69 o..** that it mi
1e660 67 68 74 20 62 65 20 72 65 75 73 65 64 2e 20 20 ght be reused.
1e670 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 66 72 65 ^The sqlite3_fre
1e680 65 28 29 20 72 6f 75 74 69 6e 65 20 69 73 0d 0a e() routine is..
1e690 2a 2a 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 73 ** a no-op if is
1e6a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e called with a N
1e6b0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 20 50 61 ULL pointer. Pa
1e6c0 73 73 69 6e 67 20 61 20 4e 55 4c 4c 20 70 6f 69 ssing a NULL poi
1e6d0 6e 74 65 72 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 nter..** to sqli
1e6e0 74 65 33 5f 66 72 65 65 28 29 20 69 73 20 68 61 te3_free() is ha
1e6f0 72 6d 6c 65 73 73 2e 20 20 41 66 74 65 72 20 62 rmless. After b
1e700 65 69 6e 67 20 66 72 65 65 64 2c 20 6d 65 6d 6f eing freed, memo
1e710 72 79 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 ry..** should ne
1e720 69 74 68 65 72 20 62 65 20 72 65 61 64 20 6e 6f ither be read no
1e730 72 20 77 72 69 74 74 65 6e 2e 20 20 45 76 65 6e r written. Even
1e740 20 72 65 61 64 69 6e 67 20 70 72 65 76 69 6f 75 reading previou
1e750 73 6c 79 20 66 72 65 65 64 0d 0a 2a 2a 20 6d 65 sly freed..** me
1e760 6d 6f 72 79 20 6d 69 67 68 74 20 72 65 73 75 6c mory might resul
1e770 74 20 69 6e 20 61 20 73 65 67 6d 65 6e 74 61 74 t in a segmentat
1e780 69 6f 6e 20 66 61 75 6c 74 20 6f 72 20 6f 74 68 ion fault or oth
1e790 65 72 20 73 65 76 65 72 65 20 65 72 72 6f 72 2e er severe error.
1e7a0 0d 0a 2a 2a 20 4d 65 6d 6f 72 79 20 63 6f 72 72 ..** Memory corr
1e7b0 75 70 74 69 6f 6e 2c 20 61 20 73 65 67 6d 65 6e uption, a segmen
1e7c0 74 61 74 69 6f 6e 20 66 61 75 6c 74 2c 20 6f 72 tation fault, or
1e7d0 20 6f 74 68 65 72 20 73 65 76 65 72 65 20 65 72 other severe er
1e7e0 72 6f 72 0d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 ror..** might re
1e7f0 73 75 6c 74 20 69 66 20 73 71 6c 69 74 65 33 5f sult if sqlite3_
1e800 66 72 65 65 28 29 20 69 73 20 63 61 6c 6c 65 64 free() is called
1e810 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c with a non-NULL
1e820 20 70 6f 69 6e 74 65 72 20 74 68 61 74 0d 0a 2a pointer that..*
1e830 2a 20 77 61 73 20 6e 6f 74 20 6f 62 74 61 69 6e * was not obtain
1e840 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f ed from sqlite3_
1e850 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 73 71 6c 69 malloc() or sqli
1e860 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0d 0a te3_realloc()...
1e870 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 20 73 71 6c **..** ^(The sql
1e880 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 20 69 ite3_realloc() i
1e890 6e 74 65 72 66 61 63 65 20 61 74 74 65 6d 70 74 nterface attempt
1e8a0 73 20 74 6f 20 72 65 73 69 7a 65 20 61 0d 0a 2a s to resize a..*
1e8b0 2a 20 70 72 69 6f 72 20 6d 65 6d 6f 72 79 20 61 * prior memory a
1e8c0 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 62 65 20 llocation to be
1e8d0 61 74 20 6c 65 61 73 74 20 4e 20 62 79 74 65 73 at least N bytes
1e8e0 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 , where N is the
1e8f0 0d 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61 72 61 ..** second para
1e900 6d 65 74 65 72 2e 20 20 54 68 65 20 6d 65 6d 6f meter. The memo
1e910 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f ry allocation to
1e920 20 62 65 20 72 65 73 69 7a 65 64 20 69 73 20 74 be resized is t
1e930 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 70 61 72 he first..** par
1e940 61 6d 65 74 65 72 2e 29 5e 20 5e 20 49 66 20 74 ameter.)^ ^ If t
1e950 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 he first paramet
1e960 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 er to sqlite3_re
1e970 61 6c 6c 6f 63 28 29 0d 0a 2a 2a 20 69 73 20 61 alloc()..** is a
1e980 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 68 NULL pointer th
1e990 65 6e 20 69 74 73 20 62 65 68 61 76 69 6f 72 20 en its behavior
1e9a0 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 is identical to
1e9b0 63 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 73 71 6c 69 calling..** sqli
1e9c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 4e 29 20 77 68 te3_malloc(N) wh
1e9d0 65 72 65 20 4e 20 69 73 20 74 68 65 20 73 65 63 ere N is the sec
1e9e0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f ond parameter to
1e9f0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 sqlite3_realloc
1ea00 28 29 2e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 ()...** ^If the
1ea10 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 second parameter
1ea20 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 61 6c to sqlite3_real
1ea30 6c 6f 63 28 29 20 69 73 20 7a 65 72 6f 20 6f 72 loc() is zero or
1ea40 0d 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 74 68 ..** negative th
1ea50 65 6e 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 en the behavior
1ea60 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 is exactly the s
1ea70 61 6d 65 20 61 73 20 63 61 6c 6c 69 6e 67 0d 0a ame as calling..
1ea80 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 ** sqlite3_free(
1ea90 50 29 20 77 68 65 72 65 20 50 20 69 73 20 74 68 P) where P is th
1eaa0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 e first paramete
1eab0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 61 r to sqlite3_rea
1eac0 6c 6c 6f 63 28 29 2e 0d 0a 2a 2a 20 5e 73 71 6c lloc()...** ^sql
1ead0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 20 72 ite3_realloc() r
1eae0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 eturns a pointer
1eaf0 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c to a memory all
1eb00 6f 63 61 74 69 6f 6e 0d 0a 2a 2a 20 6f 66 20 61 ocation..** of a
1eb10 74 20 6c 65 61 73 74 20 4e 20 62 79 74 65 73 20 t least N bytes
1eb20 69 6e 20 73 69 7a 65 20 6f 72 20 4e 55 4c 4c 20 in size or NULL
1eb30 69 66 20 73 75 66 66 69 63 69 65 6e 74 20 6d 65 if sufficient me
1eb40 6d 6f 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 mory is unavaila
1eb50 62 6c 65 2e 0d 0a 2a 2a 20 5e 49 66 20 4d 20 69 ble...** ^If M i
1eb60 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 s the size of th
1eb70 65 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 e prior allocati
1eb80 6f 6e 2c 20 74 68 65 6e 20 6d 69 6e 28 4e 2c 4d on, then min(N,M
1eb90 29 20 62 79 74 65 73 0d 0a 2a 2a 20 6f 66 20 74 ) bytes..** of t
1eba0 68 65 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 he prior allocat
1ebb0 69 6f 6e 20 61 72 65 20 63 6f 70 69 65 64 20 69 ion are copied i
1ebc0 6e 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e nto the beginnin
1ebd0 67 20 6f 66 20 62 75 66 66 65 72 20 72 65 74 75 g of buffer retu
1ebe0 72 6e 65 64 0d 0a 2a 2a 20 62 79 20 73 71 6c 69 rned..** by sqli
1ebf0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 20 61 6e te3_realloc() an
1ec00 64 20 74 68 65 20 70 72 69 6f 72 20 61 6c 6c 6f d the prior allo
1ec10 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65 64 2e cation is freed.
1ec20 0d 0a 2a 2a 20 5e 49 66 20 73 71 6c 69 74 65 33 ..** ^If sqlite3
1ec30 5f 72 65 61 6c 6c 6f 63 28 29 20 72 65 74 75 72 _realloc() retur
1ec40 6e 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 ns NULL, then th
1ec50 65 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 e prior allocati
1ec60 6f 6e 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 66 72 on..** is not fr
1ec70 65 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 eed...**..** ^Th
1ec80 65 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 e memory returne
1ec90 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c d by sqlite3_mal
1eca0 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65 loc() and sqlite
1ecb0 33 5f 72 65 61 6c 6c 6f 63 28 29 0d 0a 2a 2a 20 3_realloc()..**
1ecc0 69 73 20 61 6c 77 61 79 73 20 61 6c 69 67 6e 65 is always aligne
1ecd0 64 20 74 6f 20 61 74 20 6c 65 61 73 74 20 61 6e d to at least an
1ece0 20 38 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 8 byte boundary
1ecf0 2c 20 6f 72 20 74 6f 20 61 0d 0a 2a 2a 20 34 20 , or to a..** 4
1ed00 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 69 66 byte boundary if
1ed10 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 34 5f 42 the [SQLITE_4_B
1ed20 59 54 45 5f 41 4c 49 47 4e 45 44 5f 4d 41 4c 4c YTE_ALIGNED_MALL
1ed30 4f 43 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 OC] compile-time
1ed40 0d 0a 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 75 ..** option is u
1ed50 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 sed...**..** In
1ed60 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 33 SQLite version 3
1ed70 2e 35 2e 30 20 61 6e 64 20 33 2e 35 2e 31 2c 20 .5.0 and 3.5.1,
1ed80 69 74 20 77 61 73 20 70 6f 73 73 69 62 6c 65 20 it was possible
1ed90 74 6f 20 64 65 66 69 6e 65 0d 0a 2a 2a 20 74 68 to define..** th
1eda0 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 e SQLITE_OMIT_ME
1edb0 4d 4f 52 59 5f 41 4c 4c 4f 43 41 54 49 4f 4e 20 MORY_ALLOCATION
1edc0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 which would caus
1edd0 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0d 0a e the built-in..
1ede0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ** implementatio
1edf0 6e 20 6f 66 20 74 68 65 73 65 20 72 6f 75 74 69 n of these routi
1ee00 6e 65 73 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 nes to be omitte
1ee10 64 2e 20 20 54 68 61 74 20 63 61 70 61 62 69 6c d. That capabil
1ee20 69 74 79 0d 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f ity..** is no lo
1ee30 6e 67 65 72 20 70 72 6f 76 69 64 65 64 2e 20 20 nger provided.
1ee40 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e 20 6d 65 Only built-in me
1ee50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 73 20 mory allocators
1ee60 63 61 6e 20 62 65 20 75 73 65 64 2e 0d 0a 2a 2a can be used...**
1ee70 0d 0a 2a 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 ..** The Windows
1ee80 20 4f 53 20 69 6e 74 65 72 66 61 63 65 20 6c 61 OS interface la
1ee90 79 65 72 20 63 61 6c 6c 73 0d 0a 2a 2a 20 74 68 yer calls..** th
1eea0 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 e system malloc(
1eeb0 29 20 61 6e 64 20 66 72 65 65 28 29 20 64 69 72 ) and free() dir
1eec0 65 63 74 6c 79 20 77 68 65 6e 20 63 6f 6e 76 65 ectly when conve
1eed0 72 74 69 6e 67 0d 0a 2a 2a 20 66 69 6c 65 6e 61 rting..** filena
1eee0 6d 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 mes between the
1eef0 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 75 UTF-8 encoding u
1ef00 73 65 64 20 62 79 20 53 51 4c 69 74 65 0d 0a 2a sed by SQLite..*
1ef10 2a 20 61 6e 64 20 77 68 61 74 65 76 65 72 20 66 * and whatever f
1ef20 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 69 6e 67 ilename encoding
1ef30 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 is used by the
1ef40 70 61 72 74 69 63 75 6c 61 72 20 57 69 6e 64 6f particular Windo
1ef50 77 73 0d 0a 2a 2a 20 69 6e 73 74 61 6c 6c 61 74 ws..** installat
1ef60 69 6f 6e 2e 20 20 4d 65 6d 6f 72 79 20 61 6c 6c ion. Memory all
1ef70 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 20 61 ocation errors a
1ef80 72 65 20 64 65 74 65 63 74 65 64 2c 20 62 75 74 re detected, but
1ef90 0d 0a 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 ..** they are re
1efa0 70 6f 72 74 65 64 20 62 61 63 6b 20 61 73 20 5b ported back as [
1efb0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5d SQLITE_CANTOPEN]
1efc0 20 6f 72 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f or..** [SQLITE_
1efd0 49 4f 45 52 52 5d 20 72 61 74 68 65 72 20 74 68 IOERR] rather th
1efe0 61 6e 20 5b 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d an [SQLITE_NOMEM
1eff0 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 ]...**..** The p
1f000 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 73 ointer arguments
1f010 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 to [sqlite3_fre
1f020 65 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 e()] and [sqlite
1f030 33 5f 72 65 61 6c 6c 6f 63 28 29 5d 0d 0a 2a 2a 3_realloc()]..**
1f040 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
1f050 4e 55 4c 4c 20 6f 72 20 65 6c 73 65 20 70 6f 69 NULL or else poi
1f060 6e 74 65 72 73 20 6f 62 74 61 69 6e 65 64 20 66 nters obtained f
1f070 72 6f 6d 20 61 20 70 72 69 6f 72 0d 0a 2a 2a 20 rom a prior..**
1f080 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 5b 73 invocation of [s
1f090 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d qlite3_malloc()]
1f0a0 20 6f 72 20 5b 73 71 6c 69 74 65 33 5f 72 65 61 or [sqlite3_rea
1f0b0 6c 6c 6f 63 28 29 5d 20 74 68 61 74 20 68 61 76 lloc()] that hav
1f0c0 65 0d 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 e..** not yet be
1f0d0 65 6e 20 72 65 6c 65 61 73 65 64 2e 0d 0a 2a 2a en released...**
1f0e0 0d 0a 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61 ..** The applica
1f0f0 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 tion must not re
1f100 61 64 20 6f 72 20 77 72 69 74 65 20 61 6e 79 20 ad or write any
1f110 70 61 72 74 20 6f 66 0d 0a 2a 2a 20 61 20 62 6c part of..** a bl
1f120 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 61 66 ock of memory af
1f130 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 ter it has been
1f140 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 0d 0a released using..
1f150 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 65 ** [sqlite3_free
1f160 28 29 5d 20 6f 72 20 5b 73 71 6c 69 74 65 33 5f ()] or [sqlite3_
1f170 72 65 61 6c 6c 6f 63 28 29 5d 2e 0d 0a 2a 2f 0d realloc()]...*/.
1f180 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 .SQLITE_API void
1f190 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 *sqlite3_malloc
1f1a0 28 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 (int);..SQLITE_A
1f1b0 50 49 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 PI void *sqlite3
1f1c0 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 2a 2c 20 _realloc(void*,
1f1d0 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 int);..SQLITE_AP
1f1e0 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 66 I void sqlite3_f
1f1f0 72 65 65 28 76 6f 69 64 2a 29 3b 0d 0a 0d 0a 2f ree(void*);..../
1f200 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
1f210 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 74 6f 72 Memory Allocator
1f220 20 53 74 61 74 69 73 74 69 63 73 0d 0a 2a 2a 0d Statistics..**.
1f230 0a 2a 2a 20 53 51 4c 69 74 65 20 70 72 6f 76 69 .** SQLite provi
1f240 64 65 73 20 74 68 65 73 65 20 74 77 6f 20 69 6e des these two in
1f250 74 65 72 66 61 63 65 73 20 66 6f 72 20 72 65 70 terfaces for rep
1f260 6f 72 74 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 orting on the st
1f270 61 74 75 73 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 atus..** of the
1f280 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 [sqlite3_malloc(
1f290 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 )], [sqlite3_fre
1f2a0 65 28 29 5d 2c 20 61 6e 64 20 5b 73 71 6c 69 74 e()], and [sqlit
1f2b0 65 33 5f 72 65 61 6c 6c 6f 63 28 29 5d 0d 0a 2a e3_realloc()]..*
1f2c0 2a 20 72 6f 75 74 69 6e 65 73 2c 20 77 68 69 63 * routines, whic
1f2d0 68 20 66 6f 72 6d 20 74 68 65 20 62 75 69 6c 74 h form the built
1f2e0 2d 69 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 -in memory alloc
1f2f0 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e ation subsystem.
1f300 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b 73 ..**..** ^The [s
1f310 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 qlite3_memory_us
1f320 65 64 28 29 5d 20 72 6f 75 74 69 6e 65 20 72 65 ed()] routine re
1f330 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 turns the number
1f340 20 6f 66 20 62 79 74 65 73 0d 0a 2a 2a 20 6f 66 of bytes..** of
1f350 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c memory currentl
1f360 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 28 6d y outstanding (m
1f370 61 6c 6c 6f 63 65 64 20 62 75 74 20 6e 6f 74 20 alloced but not
1f380 66 72 65 65 64 29 2e 0d 0a 2a 2a 20 5e 54 68 65 freed)...** ^The
1f390 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 [sqlite3_memory
1f3a0 5f 68 69 67 68 77 61 74 65 72 28 29 5d 20 72 6f _highwater()] ro
1f3b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 utine returns th
1f3c0 65 20 6d 61 78 69 6d 75 6d 0d 0a 2a 2a 20 76 61 e maximum..** va
1f3d0 6c 75 65 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f lue of [sqlite3_
1f3e0 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 5d 20 73 memory_used()] s
1f3f0 69 6e 63 65 20 74 68 65 20 68 69 67 68 2d 77 61 ince the high-wa
1f400 74 65 72 20 6d 61 72 6b 0d 0a 2a 2a 20 77 61 73 ter mark..** was
1f410 20 6c 61 73 74 20 72 65 73 65 74 2e 20 20 5e 54 last reset. ^T
1f420 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e he values return
1f430 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 5f 6d ed by [sqlite3_m
1f440 65 6d 6f 72 79 5f 75 73 65 64 28 29 5d 20 61 6e emory_used()] an
1f450 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 6d d..** [sqlite3_m
1f460 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 emory_highwater(
1f470 29 5d 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f )] include any o
1f480 76 65 72 68 65 61 64 0d 0a 2a 2a 20 61 64 64 65 verhead..** adde
1f490 64 20 62 79 20 53 51 4c 69 74 65 20 69 6e 20 69 d by SQLite in i
1f4a0 74 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ts implementatio
1f4b0 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f 6d 61 n of [sqlite3_ma
1f4c0 6c 6c 6f 63 28 29 5d 2c 0d 0a 2a 2a 20 62 75 74 lloc()],..** but
1f4d0 20 6e 6f 74 20 6f 76 65 72 68 65 61 64 20 61 64 not overhead ad
1f4e0 64 65 64 20 62 79 20 74 68 65 20 61 6e 79 20 75 ded by the any u
1f4f0 6e 64 65 72 6c 79 69 6e 67 20 73 79 73 74 65 6d nderlying system
1f500 20 6c 69 62 72 61 72 79 0d 0a 2a 2a 20 72 6f 75 library..** rou
1f510 74 69 6e 65 73 20 74 68 61 74 20 5b 73 71 6c 69 tines that [sqli
1f520 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 20 6d 61 te3_malloc()] ma
1f530 79 20 63 61 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 y call...**..**
1f540 5e 54 68 65 20 6d 65 6d 6f 72 79 20 68 69 67 68 ^The memory high
1f550 2d 77 61 74 65 72 20 6d 61 72 6b 20 69 73 20 72 -water mark is r
1f560 65 73 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 eset to the curr
1f570 65 6e 74 20 76 61 6c 75 65 20 6f 66 0d 0a 2a 2a ent value of..**
1f580 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 [sqlite3_memory
1f590 5f 75 73 65 64 28 29 5d 20 69 66 20 61 6e 64 20 _used()] if and
1f5a0 6f 6e 6c 79 20 69 66 20 74 68 65 20 70 61 72 61 only if the para
1f5b0 6d 65 74 65 72 20 74 6f 0d 0a 2a 2a 20 5b 73 71 meter to..** [sq
1f5c0 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 lite3_memory_hig
1f5d0 68 77 61 74 65 72 28 29 5d 20 69 73 20 74 72 75 hwater()] is tru
1f5e0 65 2e 20 20 5e 54 68 65 20 76 61 6c 75 65 20 72 e. ^The value r
1f5f0 65 74 75 72 6e 65 64 0d 0a 2a 2a 20 62 79 20 5b eturned..** by [
1f600 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 sqlite3_memory_h
1f610 69 67 68 77 61 74 65 72 28 31 29 5d 20 69 73 20 ighwater(1)] is
1f620 74 68 65 20 68 69 67 68 2d 77 61 74 65 72 20 6d the high-water m
1f630 61 72 6b 0d 0a 2a 2a 20 70 72 69 6f 72 20 74 6f ark..** prior to
1f640 20 74 68 65 20 72 65 73 65 74 2e 0d 0a 2a 2f 0d the reset...*/.
1f650 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 6c 69 .SQLITE_API sqli
1f660 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 te3_int64 sqlite
1f670 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 3_memory_used(vo
1f680 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 id);..SQLITE_API
1f690 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 sqlite3_int64 s
1f6a0 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 qlite3_memory_hi
1f6b0 67 68 77 61 74 65 72 28 69 6e 74 20 72 65 73 65 ghwater(int rese
1f6c0 74 46 6c 61 67 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a tFlag);..../*..*
1f6d0 2a 20 43 41 50 49 33 52 45 46 3a 20 50 73 65 75 * CAPI3REF: Pseu
1f6e0 64 6f 2d 52 61 6e 64 6f 6d 20 4e 75 6d 62 65 72 do-Random Number
1f6f0 20 47 65 6e 65 72 61 74 6f 72 0d 0a 2a 2a 0d 0a Generator..**..
1f700 2a 2a 20 53 51 4c 69 74 65 20 63 6f 6e 74 61 69 ** SQLite contai
1f710 6e 73 20 61 20 68 69 67 68 2d 71 75 61 6c 69 74 ns a high-qualit
1f720 79 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 y pseudo-random
1f730 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
1f740 20 28 50 52 4e 47 29 20 75 73 65 64 20 74 6f 0d (PRNG) used to.
1f750 0a 2a 2a 20 73 65 6c 65 63 74 20 72 61 6e 64 6f .** select rando
1f760 6d 20 5b 52 4f 57 49 44 20 7c 20 52 4f 57 49 44 m [ROWID | ROWID
1f770 73 5d 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e s] when insertin
1f780 67 20 6e 65 77 20 72 65 63 6f 72 64 73 20 69 6e g new records in
1f790 74 6f 20 61 20 74 61 62 6c 65 20 74 68 61 74 0d to a table that.
1f7a0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 75 73 65 73 .** already uses
1f7b0 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 6f 73 the largest pos
1f7c0 73 69 62 6c 65 20 5b 52 4f 57 49 44 5d 2e 20 20 sible [ROWID].
1f7d0 54 68 65 20 50 52 4e 47 20 69 73 20 61 6c 73 6f The PRNG is also
1f7e0 20 75 73 65 64 20 66 6f 72 0d 0a 2a 2a 20 74 68 used for..** th
1f7f0 65 20 62 75 69 6c 64 2d 69 6e 20 72 61 6e 64 6f e build-in rando
1f800 6d 28 29 20 61 6e 64 20 72 61 6e 64 6f 6d 62 6c m() and randombl
1f810 6f 62 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f ob() SQL functio
1f820 6e 73 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 ns. This interf
1f830 61 63 65 20 61 6c 6c 6f 77 73 0d 0a 2a 2a 20 61 ace allows..** a
1f840 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 61 pplications to a
1f850 63 63 65 73 73 20 74 68 65 20 73 61 6d 65 20 50 ccess the same P
1f860 52 4e 47 20 66 6f 72 20 6f 74 68 65 72 20 70 75 RNG for other pu
1f870 72 70 6f 73 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 rposes...**..**
1f880 5e 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 ^A call to this
1f890 72 6f 75 74 69 6e 65 20 73 74 6f 72 65 73 20 4e routine stores N
1f8a0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d bytes of random
1f8b0 6e 65 73 73 20 69 6e 74 6f 20 62 75 66 66 65 72 ness into buffer
1f8c0 20 50 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 P...**..** ^The
1f8d0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 first time this
1f8e0 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f routine is invo
1f8f0 6b 65 64 20 28 65 69 74 68 65 72 20 69 6e 74 65 ked (either inte
1f900 72 6e 61 6c 6c 79 20 6f 72 20 62 79 0d 0a 2a 2a rnally or by..**
1f910 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
1f920 29 20 74 68 65 20 50 52 4e 47 20 69 73 20 73 65 ) the PRNG is se
1f930 65 64 65 64 20 75 73 69 6e 67 20 72 61 6e 64 6f eded using rando
1f940 6d 6e 65 73 73 20 6f 62 74 61 69 6e 65 64 0d 0a mness obtained..
1f950 2a 2a 20 66 72 6f 6d 20 74 68 65 20 78 52 61 6e ** from the xRan
1f960 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f domness method o
1f970 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 5b 73 f the default [s
1f980 71 6c 69 74 65 33 5f 76 66 73 5d 20 6f 62 6a 65 qlite3_vfs] obje
1f990 63 74 2e 0d 0a 2a 2a 20 5e 4f 6e 20 61 6c 6c 20 ct...** ^On all
1f9a0 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 subsequent invoc
1f9b0 61 74 69 6f 6e 73 2c 20 74 68 65 20 70 73 65 75 ations, the pseu
1f9c0 64 6f 2d 72 61 6e 64 6f 6d 6e 65 73 73 20 69 73 do-randomness is
1f9d0 20 67 65 6e 65 72 61 74 65 64 0d 0a 2a 2a 20 69 generated..** i
1f9e0 6e 74 65 72 6e 61 6c 6c 79 20 61 6e 64 20 77 69 nternally and wi
1f9f0 74 68 6f 75 74 20 72 65 63 6f 75 72 73 65 20 74 thout recourse t
1fa00 6f 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 76 o the [sqlite3_v
1fa10 66 73 5d 20 78 52 61 6e 64 6f 6d 6e 65 73 73 0d fs] xRandomness.
1fa20 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0d 0a 2a 2f 0d .** method...*/.
1fa30 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 .SQLITE_API void
1fa40 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e sqlite3_randomn
1fa50 65 73 73 28 69 6e 74 20 4e 2c 20 76 6f 69 64 20 ess(int N, void
1fa60 2a 50 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 *P);..../*..** C
1fa70 41 50 49 33 52 45 46 3a 20 43 6f 6d 70 69 6c 65 API3REF: Compile
1fa80 2d 54 69 6d 65 20 41 75 74 68 6f 72 69 7a 61 74 -Time Authorizat
1fa90 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 73 0d 0a 2a ion Callbacks..*
1faa0 2a 0d 0a 2a 2a 20 5e 54 68 69 73 20 72 6f 75 74 *..** ^This rout
1fab0 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6e ine registers an
1fac0 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c authorizer call
1fad0 62 61 63 6b 20 77 69 74 68 20 61 20 70 61 72 74 back with a part
1fae0 69 63 75 6c 61 72 0d 0a 2a 2a 20 5b 64 61 74 61 icular..** [data
1faf0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d base connection]
1fb00 2c 20 73 75 70 70 6c 69 65 64 20 69 6e 20 74 68 , supplied in th
1fb10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 e first argument
1fb20 2e 0d 0a 2a 2a 20 5e 54 68 65 20 61 75 74 68 6f ...** ^The autho
1fb30 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 rizer callback i
1fb40 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 53 51 4c s invoked as SQL
1fb50 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 statements are
1fb60 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 0d 0a being compiled..
1fb70 2a 2a 20 62 79 20 5b 73 71 6c 69 74 65 33 5f 70 ** by [sqlite3_p
1fb80 72 65 70 61 72 65 28 29 5d 20 6f 72 20 69 74 73 repare()] or its
1fb90 20 76 61 72 69 61 6e 74 73 20 5b 73 71 6c 69 74 variants [sqlit
1fba0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 5d e3_prepare_v2()]
1fbb0 2c 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 70 ,..** [sqlite3_p
1fbc0 72 65 70 61 72 65 31 36 28 29 5d 20 61 6e 64 20 repare16()] and
1fbd0 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 [sqlite3_prepare
1fbe0 31 36 5f 76 32 28 29 5d 2e 20 20 5e 41 74 20 76 16_v2()]. ^At v
1fbf0 61 72 69 6f 75 73 0d 0a 2a 2a 20 70 6f 69 6e 74 arious..** point
1fc00 73 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d s during the com
1fc10 70 69 6c 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 pilation process
1fc20 2c 20 61 73 20 6c 6f 67 69 63 20 69 73 20 62 65 , as logic is be
1fc30 69 6e 67 20 63 72 65 61 74 65 64 0d 0a 2a 2a 20 ing created..**
1fc40 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f to perform vario
1fc50 75 73 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 20 us actions, the
1fc60 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 authorizer callb
1fc70 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ack is invoked t
1fc80 6f 0d 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 6f o..** see if tho
1fc90 73 65 20 61 63 74 69 6f 6e 73 20 61 72 65 20 61 se actions are a
1fca0 6c 6c 6f 77 65 64 2e 20 20 5e 54 68 65 20 61 75 llowed. ^The au
1fcb0 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 thorizer callbac
1fcc0 6b 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 72 65 74 k should..** ret
1fcd0 75 72 6e 20 5b 53 51 4c 49 54 45 5f 4f 4b 5d 20 urn [SQLITE_OK]
1fce0 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 61 63 74 to allow the act
1fcf0 69 6f 6e 2c 20 5b 53 51 4c 49 54 45 5f 49 47 4e ion, [SQLITE_IGN
1fd00 4f 52 45 5d 20 74 6f 20 64 69 73 61 6c 6c 6f 77 ORE] to disallow
1fd10 20 74 68 65 0d 0a 2a 2a 20 73 70 65 63 69 66 69 the..** specifi
1fd20 63 20 61 63 74 69 6f 6e 20 62 75 74 20 61 6c 6c c action but all
1fd30 6f 77 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 ow the SQL state
1fd40 6d 65 6e 74 20 74 6f 20 63 6f 6e 74 69 6e 75 65 ment to continue
1fd50 20 74 6f 20 62 65 0d 0a 2a 2a 20 63 6f 6d 70 69 to be..** compi
1fd60 6c 65 64 2c 20 6f 72 20 5b 53 51 4c 49 54 45 5f led, or [SQLITE_
1fd70 44 45 4e 59 5d 20 74 6f 20 63 61 75 73 65 20 74 DENY] to cause t
1fd80 68 65 20 65 6e 74 69 72 65 20 53 51 4c 20 73 74 he entire SQL st
1fd90 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0d 0a 2a atement to be..*
1fda0 2a 20 72 65 6a 65 63 74 65 64 20 77 69 74 68 20 * rejected with
1fdb0 61 6e 20 65 72 72 6f 72 2e 20 20 5e 49 66 20 74 an error. ^If t
1fdc0 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 he authorizer ca
1fdd0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0d 0a llback returns..
1fde0 2a 2a 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 ** any value oth
1fdf0 65 72 20 74 68 61 6e 20 5b 53 51 4c 49 54 45 5f er than [SQLITE_
1fe00 49 47 4e 4f 52 45 5d 2c 20 5b 53 51 4c 49 54 45 IGNORE], [SQLITE
1fe10 5f 4f 4b 5d 2c 20 6f 72 20 5b 53 51 4c 49 54 45 _OK], or [SQLITE
1fe20 5f 44 45 4e 59 5d 0d 0a 2a 2a 20 74 68 65 6e 20 _DENY]..** then
1fe30 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 the [sqlite3_pre
1fe40 70 61 72 65 5f 76 32 28 29 5d 20 6f 72 20 65 71 pare_v2()] or eq
1fe50 75 69 76 61 6c 65 6e 74 20 63 61 6c 6c 20 74 68 uivalent call th
1fe60 61 74 20 74 72 69 67 67 65 72 65 64 0d 0a 2a 2a at triggered..**
1fe70 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 the authorizer
1fe80 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 will fail with a
1fe90 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e n error message.
1fea0 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 68 ..**..** When th
1feb0 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 e callback retur
1fec0 6e 73 20 5b 53 51 4c 49 54 45 5f 4f 4b 5d 2c 20 ns [SQLITE_OK],
1fed0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f that means the o
1fee0 70 65 72 61 74 69 6f 6e 0d 0a 2a 2a 20 72 65 71 peration..** req
1fef0 75 65 73 74 65 64 20 69 73 20 6f 6b 2e 20 20 5e uested is ok. ^
1ff00 57 68 65 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 When the callbac
1ff10 6b 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 k returns [SQLIT
1ff20 45 5f 44 45 4e 59 5d 2c 20 74 68 65 0d 0a 2a 2a E_DENY], the..**
1ff30 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 [sqlite3_prepar
1ff40 65 5f 76 32 28 29 5d 20 6f 72 20 65 71 75 69 76 e_v2()] or equiv
1ff50 61 6c 65 6e 74 20 63 61 6c 6c 20 74 68 61 74 20 alent call that
1ff60 74 72 69 67 67 65 72 65 64 20 74 68 65 0d 0a 2a triggered the..*
1ff70 2a 20 61 75 74 68 6f 72 69 7a 65 72 20 77 69 6c * authorizer wil
1ff80 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 20 65 l fail with an e
1ff90 72 72 6f 72 20 6d 65 73 73 61 67 65 20 65 78 70 rror message exp
1ffa0 6c 61 69 6e 69 6e 67 20 74 68 61 74 0d 0a 2a 2a laining that..**
1ffb0 20 61 63 63 65 73 73 20 69 73 20 64 65 6e 69 65 access is denie
1ffc0 64 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 d. ..**..** ^The
1ffd0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 first parameter
1ffe0 20 74 6f 20 74 68 65 20 61 75 74 68 6f 72 69 7a to the authoriz
1fff0 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 er callback is a
20000 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 68 69 copy of the thi
20010 72 64 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 rd..** parameter
20020 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f to the sqlite3_
20030 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 set_authorizer()
20040 20 69 6e 74 65 72 66 61 63 65 2e 20 5e 54 68 65 interface. ^The
20050 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 second paramete
20060 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c r..** to the cal
20070 6c 62 61 63 6b 20 69 73 20 61 6e 20 69 6e 74 65 lback is an inte
20080 67 65 72 20 5b 53 51 4c 49 54 45 5f 43 4f 50 59 ger [SQLITE_COPY
20090 20 7c 20 61 63 74 69 6f 6e 20 63 6f 64 65 5d 20 | action code]
200a0 74 68 61 74 20 73 70 65 63 69 66 69 65 73 0d 0a that specifies..
200b0 2a 2a 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 ** the particula
200c0 72 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 61 r action to be a
200d0 75 74 68 6f 72 69 7a 65 64 2e 20 5e 54 68 65 20 uthorized. ^The
200e0 74 68 69 72 64 20 74 68 72 6f 75 67 68 20 73 69 third through si
200f0 78 74 68 20 70 61 72 61 6d 65 74 65 72 73 0d 0a xth parameters..
20100 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 ** to the callba
20110 63 6b 20 61 72 65 20 7a 65 72 6f 2d 74 65 72 6d ck are zero-term
20120 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 20 74 inated strings t
20130 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 hat contain addi
20140 74 69 6f 6e 61 6c 0d 0a 2a 2a 20 64 65 74 61 69 tional..** detai
20150 6c 73 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 ls about the act
20160 69 6f 6e 20 74 6f 20 62 65 20 61 75 74 68 6f 72 ion to be author
20170 69 7a 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 ized...**..** ^I
20180 66 20 74 68 65 20 61 63 74 69 6f 6e 20 63 6f 64 f the action cod
20190 65 20 69 73 20 5b 53 51 4c 49 54 45 5f 52 45 41 e is [SQLITE_REA
201a0 44 5d 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 D]..** and the c
201b0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 allback returns
201c0 5b 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5d 20 [SQLITE_IGNORE]
201d0 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 5b 70 72 then the..** [pr
201e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement
201f0 5d 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63 ] statement is c
20200 6f 6e 73 74 72 75 63 74 65 64 20 74 6f 20 73 75 onstructed to su
20210 62 73 74 69 74 75 74 65 0d 0a 2a 2a 20 61 20 4e bstitute..** a N
20220 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 70 6c 61 ULL value in pla
20230 63 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 ce of the table
20240 63 6f 6c 75 6d 6e 20 74 68 61 74 20 77 6f 75 6c column that woul
20250 64 20 68 61 76 65 0d 0a 2a 2a 20 62 65 65 6e 20 d have..** been
20260 72 65 61 64 20 69 66 20 5b 53 51 4c 49 54 45 5f read if [SQLITE_
20270 4f 4b 5d 20 68 61 64 20 62 65 65 6e 20 72 65 74 OK] had been ret
20280 75 72 6e 65 64 2e 20 20 54 68 65 20 5b 53 51 4c urned. The [SQL
20290 49 54 45 5f 49 47 4e 4f 52 45 5d 0d 0a 2a 2a 20 ITE_IGNORE]..**
202a0 72 65 74 75 72 6e 20 63 61 6e 20 62 65 20 75 73 return can be us
202b0 65 64 20 74 6f 20 64 65 6e 79 20 61 6e 20 75 6e ed to deny an un
202c0 74 72 75 73 74 65 64 20 75 73 65 72 20 61 63 63 trusted user acc
202d0 65 73 73 20 74 6f 20 69 6e 64 69 76 69 64 75 61 ess to individua
202e0 6c 0d 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 l..** columns of
202f0 20 61 20 74 61 62 6c 65 2e 0d 0a 2a 2a 20 5e 49 a table...** ^I
20300 66 20 74 68 65 20 61 63 74 69 6f 6e 20 63 6f 64 f the action cod
20310 65 20 69 73 20 5b 53 51 4c 49 54 45 5f 44 45 4c e is [SQLITE_DEL
20320 45 54 45 5d 20 61 6e 64 20 74 68 65 20 63 61 6c ETE] and the cal
20330 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0d 0a 2a lback returns..*
20340 2a 20 5b 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 * [SQLITE_IGNORE
20350 5d 20 74 68 65 6e 20 74 68 65 20 5b 44 45 4c 45 ] then the [DELE
20360 54 45 5d 20 6f 70 65 72 61 74 69 6f 6e 20 70 72 TE] operation pr
20370 6f 63 65 65 64 73 20 62 75 74 20 74 68 65 0d 0a oceeds but the..
20380 2a 2a 20 5b 74 72 75 6e 63 61 74 65 20 6f 70 74 ** [truncate opt
20390 69 6d 69 7a 61 74 69 6f 6e 5d 20 69 73 20 64 69 imization] is di
203a0 73 61 62 6c 65 64 20 61 6e 64 20 61 6c 6c 20 72 sabled and all r
203b0 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 20 ows are deleted
203c0 69 6e 64 69 76 69 64 75 61 6c 6c 79 2e 0d 0a 2a individually...*
203d0 2a 0d 0a 2a 2a 20 41 6e 20 61 75 74 68 6f 72 69 *..** An authori
203e0 7a 65 72 20 69 73 20 75 73 65 64 20 77 68 65 6e zer is used when
203f0 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 [sqlite3_prepar
20400 65 20 7c 20 70 72 65 70 61 72 69 6e 67 5d 0d 0a e | preparing]..
20410 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 ** SQL statement
20420 73 20 66 72 6f 6d 20 61 6e 20 75 6e 74 72 75 73 s from an untrus
20430 74 65 64 20 73 6f 75 72 63 65 2c 20 74 6f 20 65 ted source, to e
20440 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 nsure that the S
20450 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0d 0a 2a QL statements..*
20460 2a 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 * do not try to
20470 61 63 63 65 73 73 20 64 61 74 61 20 74 68 65 79 access data they
20480 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 are not allowed
20490 20 74 6f 20 73 65 65 2c 20 6f 72 20 74 68 61 74 to see, or that
204a0 20 74 68 65 79 20 64 6f 20 6e 6f 74 0d 0a 2a 2a they do not..**
204b0 20 74 72 79 20 74 6f 20 65 78 65 63 75 74 65 20 try to execute
204c0 6d 61 6c 69 63 69 6f 75 73 20 73 74 61 74 65 6d malicious statem
204d0 65 6e 74 73 20 74 68 61 74 20 64 61 6d 61 67 65 ents that damage
204e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 the database.
204f0 46 6f 72 0d 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c For..** example,
20500 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 an application
20510 6d 61 79 20 61 6c 6c 6f 77 20 61 20 75 73 65 72 may allow a user
20520 20 74 6f 20 65 6e 74 65 72 20 61 72 62 69 74 72 to enter arbitr
20530 61 72 79 0d 0a 2a 2a 20 53 51 4c 20 71 75 65 72 ary..** SQL quer
20540 69 65 73 20 66 6f 72 20 65 76 61 6c 75 61 74 69 ies for evaluati
20550 6f 6e 20 62 79 20 61 20 64 61 74 61 62 61 73 65 on by a database
20560 2e 20 20 42 75 74 20 74 68 65 20 61 70 70 6c 69 . But the appli
20570 63 61 74 69 6f 6e 20 64 6f 65 73 0d 0a 2a 2a 20 cation does..**
20580 6e 6f 74 20 77 61 6e 74 20 74 68 65 20 75 73 65 not want the use
20590 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 r to be able to
205a0 6d 61 6b 65 20 61 72 62 69 74 72 61 72 79 20 63 make arbitrary c
205b0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0d 0a 2a hanges to the..*
205c0 2a 20 64 61 74 61 62 61 73 65 2e 20 20 41 6e 20 * database. An
205d0 61 75 74 68 6f 72 69 7a 65 72 20 63 6f 75 6c 64 authorizer could
205e0 20 74 68 65 6e 20 62 65 20 70 75 74 20 69 6e 20 then be put in
205f0 70 6c 61 63 65 20 77 68 69 6c 65 20 74 68 65 0d place while the.
20600 0a 2a 2a 20 75 73 65 72 2d 65 6e 74 65 72 65 64 .** user-entered
20610 20 53 51 4c 20 69 73 20 62 65 69 6e 67 20 5b 73 SQL is being [s
20620 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 7c qlite3_prepare |
20630 20 70 72 65 70 61 72 65 64 5d 20 74 68 61 74 0d prepared] that.
20640 0a 2a 2a 20 64 69 73 61 6c 6c 6f 77 73 20 65 76 .** disallows ev
20650 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 erything except
20660 5b 53 45 4c 45 43 54 5d 20 73 74 61 74 65 6d 65 [SELECT] stateme
20670 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 70 70 nts...**..** App
20680 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6e lications that n
20690 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53 eed to process S
206a0 51 4c 20 66 72 6f 6d 20 75 6e 74 72 75 73 74 65 QL from untruste
206b0 64 20 73 6f 75 72 63 65 73 0d 0a 2a 2a 20 6d 69 d sources..** mi
206c0 67 68 74 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 ght also conside
206d0 72 20 6c 6f 77 65 72 69 6e 67 20 72 65 73 6f 75 r lowering resou
206e0 72 63 65 20 6c 69 6d 69 74 73 20 75 73 69 6e 67 rce limits using
206f0 20 5b 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 [sqlite3_limit(
20700 29 5d 0d 0a 2a 2a 20 61 6e 64 20 6c 69 6d 69 74 )]..** and limit
20710 69 6e 67 20 64 61 74 61 62 61 73 65 20 73 69 7a ing database siz
20720 65 20 75 73 69 6e 67 20 74 68 65 20 5b 6d 61 78 e using the [max
20730 5f 70 61 67 65 5f 63 6f 75 6e 74 5d 20 5b 50 52 _page_count] [PR
20740 41 47 4d 41 5d 0d 0a 2a 2a 20 69 6e 20 61 64 64 AGMA]..** in add
20750 69 74 69 6f 6e 20 74 6f 20 75 73 69 6e 67 20 61 ition to using a
20760 6e 20 61 75 74 68 6f 72 69 7a 65 72 2e 0d 0a 2a n authorizer...*
20770 2a 0d 0a 2a 2a 20 5e 28 4f 6e 6c 79 20 61 20 73 *..** ^(Only a s
20780 69 6e 67 6c 65 20 61 75 74 68 6f 72 69 7a 65 72 ingle authorizer
20790 20 63 61 6e 20 62 65 20 69 6e 20 70 6c 61 63 65 can be in place
207a0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 on a database c
207b0 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 61 74 onnection..** at
207c0 20 61 20 74 69 6d 65 2e 20 20 45 61 63 68 20 63 a time. Each c
207d0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 all to sqlite3_s
207e0 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 20 6f 76 et_authorizer ov
207f0 65 72 72 69 64 65 73 20 74 68 65 0d 0a 2a 2a 20 errides the..**
20800 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2e 29 5e previous call.)^
20810 20 20 5e 44 69 73 61 62 6c 65 20 74 68 65 20 61 ^Disable the a
20820 75 74 68 6f 72 69 7a 65 72 20 62 79 20 69 6e 73 uthorizer by ins
20830 74 61 6c 6c 69 6e 67 20 61 20 4e 55 4c 4c 20 63 talling a NULL c
20840 61 6c 6c 62 61 63 6b 2e 0d 0a 2a 2a 20 54 68 65 allback...** The
20850 20 61 75 74 68 6f 72 69 7a 65 72 20 69 73 20 64 authorizer is d
20860 69 73 61 62 6c 65 64 20 62 79 20 64 65 66 61 75 isabled by defau
20870 6c 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 lt...**..** The
20880 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 authorizer callb
20890 61 63 6b 20 6d 75 73 74 20 6e 6f 74 20 64 6f 20 ack must not do
208a0 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 77 69 anything that wi
208b0 6c 6c 20 6d 6f 64 69 66 79 0d 0a 2a 2a 20 74 68 ll modify..** th
208c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 e database conne
208d0 63 74 69 6f 6e 20 74 68 61 74 20 69 6e 76 6f 6b ction that invok
208e0 65 64 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 ed the authorize
208f0 72 20 63 61 6c 6c 62 61 63 6b 2e 0d 0a 2a 2a 20 r callback...**
20900 4e 6f 74 65 20 74 68 61 74 20 5b 73 71 6c 69 74 Note that [sqlit
20910 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 5d e3_prepare_v2()]
20920 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 73 74 and [sqlite3_st
20930 65 70 28 29 5d 20 62 6f 74 68 20 6d 6f 64 69 66 ep()] both modif
20940 79 20 74 68 65 69 72 0d 0a 2a 2a 20 64 61 74 61 y their..** data
20950 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 base connections
20960 20 66 6f 72 20 74 68 65 20 6d 65 61 6e 69 6e 67 for the meaning
20970 20 6f 66 20 22 6d 6f 64 69 66 79 22 20 69 6e 20 of "modify" in
20980 74 68 69 73 20 70 61 72 61 67 72 61 70 68 2e 0d this paragraph..
20990 0a 2a 2a 0d 0a 2a 2a 20 5e 57 68 65 6e 20 5b 73 .**..** ^When [s
209a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 qlite3_prepare_v
209b0 32 28 29 5d 20 69 73 20 75 73 65 64 20 74 6f 20 2()] is used to
209c0 70 72 65 70 61 72 65 20 61 20 73 74 61 74 65 6d prepare a statem
209d0 65 6e 74 2c 20 74 68 65 0d 0a 2a 2a 20 73 74 61 ent, the..** sta
209e0 74 65 6d 65 6e 74 20 6d 69 67 68 74 20 62 65 20 tement might be
209f0 72 65 2d 70 72 65 70 61 72 65 64 20 64 75 72 69 re-prepared duri
20a00 6e 67 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 ng [sqlite3_step
20a10 28 29 5d 20 64 75 65 20 74 6f 20 61 20 0d 0a 2a ()] due to a ..*
20a20 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e * schema change.
20a30 20 20 48 65 6e 63 65 2c 20 74 68 65 20 61 70 70 Hence, the app
20a40 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 lication should
20a50 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0d ensure that the.
20a60 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 75 74 68 .** correct auth
20a70 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 orizer callback
20a80 72 65 6d 61 69 6e 73 20 69 6e 20 70 6c 61 63 65 remains in place
20a90 20 64 75 72 69 6e 67 20 74 68 65 20 5b 73 71 6c during the [sql
20aa0 69 74 65 33 5f 73 74 65 70 28 29 5d 2e 0d 0a 2a ite3_step()]...*
20ab0 2a 0d 0a 2a 2a 20 5e 4e 6f 74 65 20 74 68 61 74 *..** ^Note that
20ac0 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20 the authorizer
20ad0 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f callback is invo
20ae0 6b 65 64 20 6f 6e 6c 79 20 64 75 72 69 6e 67 0d ked only during.
20af0 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 .** [sqlite3_pre
20b00 70 61 72 65 28 29 5d 20 6f 72 20 69 74 73 20 76 pare()] or its v
20b10 61 72 69 61 6e 74 73 2e 20 20 41 75 74 68 6f 72 ariants. Author
20b20 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0d 0a ization is not..
20b30 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 64 75 72 ** performed dur
20b40 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 65 76 ing statement ev
20b50 61 6c 75 61 74 69 6f 6e 20 69 6e 20 5b 73 71 6c aluation in [sql
20b60 69 74 65 33 5f 73 74 65 70 28 29 5d 2c 20 75 6e ite3_step()], un
20b70 6c 65 73 73 0d 0a 2a 2a 20 61 73 20 73 74 61 74 less..** as stat
20b80 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f ed in the previo
20b90 75 73 20 70 61 72 61 67 72 61 70 68 2c 20 73 71 us paragraph, sq
20ba0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 6e 76 lite3_step() inv
20bb0 6f 6b 65 73 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 okes..** sqlite3
20bc0 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 74 6f _prepare_v2() to
20bd0 20 72 65 70 72 65 70 61 72 65 20 61 20 73 74 61 reprepare a sta
20be0 74 65 6d 65 6e 74 20 61 66 74 65 72 20 61 20 73 tement after a s
20bf0 63 68 65 6d 61 20 63 68 61 6e 67 65 2e 0d 0a 2a chema change...*
20c00 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
20c10 74 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 t sqlite3_set_au
20c20 74 68 6f 72 69 7a 65 72 28 0d 0a 20 20 73 71 6c thorizer(.. sql
20c30 69 74 65 33 2a 2c 0d 0a 20 20 69 6e 74 20 28 2a ite3*,.. int (*
20c40 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 xAuth)(void*,int
20c50 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e ,const char*,con
20c60 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 st char*,const c
20c70 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a har*,const char*
20c80 29 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 ),.. void *pUse
20c90 72 44 61 74 61 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d rData..);..../*.
20ca0 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 41 75 .** CAPI3REF: Au
20cb0 74 68 6f 72 69 7a 65 72 20 52 65 74 75 72 6e 20 thorizer Return
20cc0 43 6f 64 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 Codes..**..** Th
20cd0 65 20 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 e [sqlite3_set_a
20ce0 75 74 68 6f 72 69 7a 65 72 20 7c 20 61 75 74 68 uthorizer | auth
20cf0 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 orizer callback
20d00 66 75 6e 63 74 69 6f 6e 5d 20 6d 75 73 74 0d 0a function] must..
20d10 2a 2a 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 ** return either
20d20 20 5b 53 51 4c 49 54 45 5f 4f 4b 5d 20 6f 72 20 [SQLITE_OK] or
20d30 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 74 77 6f one of these two
20d40 20 63 6f 6e 73 74 61 6e 74 73 20 69 6e 20 6f 72 constants in or
20d50 64 65 72 0d 0a 2a 2a 20 74 6f 20 73 69 67 6e 61 der..** to signa
20d60 6c 20 53 51 4c 69 74 65 20 77 68 65 74 68 65 72 l SQLite whether
20d70 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 63 74 69 or not the acti
20d80 6f 6e 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e on is permitted.
20d90 20 20 53 65 65 20 74 68 65 0d 0a 2a 2a 20 5b 73 See the..** [s
20da0 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f qlite3_set_autho
20db0 72 69 7a 65 72 20 7c 20 61 75 74 68 6f 72 69 7a rizer | authoriz
20dc0 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e er documentation
20dd0 5d 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c ] for additional
20de0 0d 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ..** information
20df0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 ...**..** Note t
20e00 68 61 74 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 hat SQLITE_IGNOR
20e10 45 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 E is also used a
20e20 73 20 61 20 5b 53 51 4c 49 54 45 5f 52 4f 4c 4c s a [SQLITE_ROLL
20e30 42 41 43 4b 20 7c 20 72 65 74 75 72 6e 20 63 6f BACK | return co
20e40 64 65 5d 0d 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 de]..** from the
20e50 20 5b 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f [sqlite3_vtab_o
20e60 6e 5f 63 6f 6e 66 6c 69 63 74 28 29 5d 20 69 6e n_conflict()] in
20e70 74 65 72 66 61 63 65 2e 0d 0a 2a 2f 0d 0a 23 64 terface...*/..#d
20e80 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 4e efine SQLITE_DEN
20e90 59 20 20 20 31 20 20 20 2f 2a 20 41 62 6f 72 74 Y 1 /* Abort
20ea0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
20eb0 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 nt with an error
20ec0 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
20ed0 49 54 45 5f 49 47 4e 4f 52 45 20 32 20 20 20 2f ITE_IGNORE 2 /
20ee0 2a 20 44 6f 6e 27 74 20 61 6c 6c 6f 77 20 61 63 * Don't allow ac
20ef0 63 65 73 73 2c 20 62 75 74 20 64 6f 6e 27 74 20 cess, but don't
20f00 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f generate an erro
20f10 72 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 r */..../*..** C
20f20 41 50 49 33 52 45 46 3a 20 41 75 74 68 6f 72 69 API3REF: Authori
20f30 7a 65 72 20 41 63 74 69 6f 6e 20 43 6f 64 65 73 zer Action Codes
20f40 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 5b 73 71 ..**..** The [sq
20f50 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 lite3_set_author
20f60 69 7a 65 72 28 29 5d 20 69 6e 74 65 72 66 61 63 izer()] interfac
20f70 65 20 72 65 67 69 73 74 65 72 73 20 61 20 63 61 e registers a ca
20f80 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 0d llback function.
20f90 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 76 6f .** that is invo
20fa0 6b 65 64 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 ked to authorize
20fb0 20 63 65 72 74 61 69 6e 20 53 51 4c 20 73 74 61 certain SQL sta
20fc0 74 65 6d 65 6e 74 20 61 63 74 69 6f 6e 73 2e 20 tement actions.
20fd0 20 54 68 65 0d 0a 2a 2a 20 73 65 63 6f 6e 64 20 The..** second
20fe0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 parameter to the
20ff0 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 6e 20 callback is an
21000 69 6e 74 65 67 65 72 20 63 6f 64 65 20 74 68 61 integer code tha
21010 74 20 73 70 65 63 69 66 69 65 73 0d 0a 2a 2a 20 t specifies..**
21020 77 68 61 74 20 61 63 74 69 6f 6e 20 69 73 20 62 what action is b
21030 65 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 64 2e eing authorized.
21040 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 These are the
21050 69 6e 74 65 67 65 72 20 61 63 74 69 6f 6e 20 63 integer action c
21060 6f 64 65 73 20 74 68 61 74 0d 0a 2a 2a 20 74 68 odes that..** th
21070 65 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c e authorizer cal
21080 6c 62 61 63 6b 20 6d 61 79 20 62 65 20 70 61 73 lback may be pas
21090 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 sed...**..** The
210a0 73 65 20 61 63 74 69 6f 6e 20 63 6f 64 65 20 76 se action code v
210b0 61 6c 75 65 73 20 73 69 67 6e 69 66 79 20 77 68 alues signify wh
210c0 61 74 20 6b 69 6e 64 20 6f 66 20 6f 70 65 72 61 at kind of opera
210d0 74 69 6f 6e 20 69 73 20 74 6f 20 62 65 0d 0a 2a tion is to be..*
210e0 2a 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 54 * authorized. T
210f0 68 65 20 33 72 64 20 61 6e 64 20 34 74 68 20 70 he 3rd and 4th p
21100 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 arameters to the
21110 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0d 0a authorization..
21120 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 ** callback func
21130 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 70 61 72 tion will be par
21140 61 6d 65 74 65 72 73 20 6f 72 20 4e 55 4c 4c 20 ameters or NULL
21150 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 depending on whi
21160 63 68 20 6f 66 20 74 68 65 73 65 0d 0a 2a 2a 20 ch of these..**
21170 63 6f 64 65 73 20 69 73 20 75 73 65 64 20 61 73 codes is used as
21180 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 the second para
21190 6d 65 74 65 72 2e 20 20 5e 28 54 68 65 20 35 74 meter. ^(The 5t
211a0 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 h parameter to t
211b0 68 65 0d 0a 2a 2a 20 61 75 74 68 6f 72 69 7a 65 he..** authorize
211c0 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 74 68 r callback is th
211d0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 e name of the da
211e0 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 tabase ("main",
211f0 22 74 65 6d 70 22 2c 0d 0a 2a 2a 20 65 74 63 2e "temp",..** etc.
21200 29 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e ) if applicable.
21210 29 5e 20 20 5e 54 68 65 20 36 74 68 20 70 61 72 )^ ^The 6th par
21220 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 61 75 ameter to the au
21230 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 thorizer callbac
21240 6b 0d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 61 6d k..** is the nam
21250 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d e of the inner-m
21260 6f 73 74 20 74 72 69 67 67 65 72 20 6f 72 20 76 ost trigger or v
21270 69 65 77 20 74 68 61 74 20 69 73 20 72 65 73 70 iew that is resp
21280 6f 6e 73 69 62 6c 65 20 66 6f 72 0d 0a 2a 2a 20 onsible for..**
21290 74 68 65 20 61 63 63 65 73 73 20 61 74 74 65 6d the access attem
212a0 70 74 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 pt or NULL if th
212b0 69 73 20 61 63 63 65 73 73 20 61 74 74 65 6d 70 is access attemp
212c0 74 20 69 73 20 64 69 72 65 63 74 6c 79 20 66 72 t is directly fr
212d0 6f 6d 0d 0a 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c om..** top-level
212e0 20 53 51 4c 20 63 6f 64 65 2e 0d 0a 2a 2f 0d 0a SQL code...*/..
212f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
21300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
21310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 33 72 64 ************ 3rd
21320 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 34 74 ************ 4t
21330 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a h ***********/..
21340 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21350 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 REATE_INDEX
21360 20 20 20 20 20 31 20 20 20 2f 2a 20 49 6e 64 65 1 /* Inde
21370 78 20 4e 61 6d 65 20 20 20 20 20 20 54 61 62 6c x Name Tabl
21380 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21390 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
213a0 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 REATE_TABLE
213b0 20 20 20 20 20 32 20 20 20 2f 2a 20 54 61 62 6c 2 /* Tabl
213c0 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
213d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
213e0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
213f0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 REATE_TEMP_INDEX
21400 20 20 20 20 20 33 20 20 20 2f 2a 20 49 6e 64 65 3 /* Inde
21410 78 20 4e 61 6d 65 20 20 20 20 20 20 54 61 62 6c x Name Tabl
21420 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21430 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21440 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 REATE_TEMP_TABLE
21450 20 20 20 20 20 34 20 20 20 2f 2a 20 54 61 62 6c 4 /* Tabl
21460 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
21470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21480 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21490 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 REATE_TEMP_TRIGG
214a0 45 52 20 20 20 35 20 20 20 2f 2a 20 54 72 69 67 ER 5 /* Trig
214b0 67 65 72 20 4e 61 6d 65 20 20 20 20 54 61 62 6c ger Name Tabl
214c0 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
214d0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
214e0 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 REATE_TEMP_VIEW
214f0 20 20 20 20 20 36 20 20 20 2f 2a 20 56 69 65 77 6 /* View
21500 20 4e 61 6d 65 20 20 20 20 20 20 20 4e 55 4c 4c Name NULL
21510 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21520 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21530 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 REATE_TRIGGER
21540 20 20 20 20 20 37 20 20 20 2f 2a 20 54 72 69 67 7 /* Trig
21550 67 65 72 20 4e 61 6d 65 20 20 20 20 54 61 62 6c ger Name Tabl
21560 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21570 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21580 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 REATE_VIEW
21590 20 20 20 20 20 38 20 20 20 2f 2a 20 56 69 65 77 8 /* View
215a0 20 4e 61 6d 65 20 20 20 20 20 20 20 4e 55 4c 4c Name NULL
215b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
215c0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
215d0 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 ELETE
215e0 20 20 20 20 20 39 20 20 20 2f 2a 20 54 61 62 6c 9 /* Tabl
215f0 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
21600 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21610 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21620 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 ROP_INDEX
21630 20 20 20 20 31 30 20 20 20 2f 2a 20 49 6e 64 65 10 /* Inde
21640 78 20 4e 61 6d 65 20 20 20 20 20 20 54 61 62 6c x Name Tabl
21650 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21660 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21670 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 ROP_TABLE
21680 20 20 20 20 31 31 20 20 20 2f 2a 20 54 61 62 6c 11 /* Tabl
21690 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
216a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
216b0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
216c0 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 ROP_TEMP_INDEX
216d0 20 20 20 20 31 32 20 20 20 2f 2a 20 49 6e 64 65 12 /* Inde
216e0 78 20 4e 61 6d 65 20 20 20 20 20 20 54 61 62 6c x Name Tabl
216f0 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21700 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21710 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 ROP_TEMP_TABLE
21720 20 20 20 20 31 33 20 20 20 2f 2a 20 54 61 62 6c 13 /* Tabl
21730 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
21740 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21750 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21760 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 ROP_TEMP_TRIGGER
21770 20 20 20 20 31 34 20 20 20 2f 2a 20 54 72 69 67 14 /* Trig
21780 67 65 72 20 4e 61 6d 65 20 20 20 20 54 61 62 6c ger Name Tabl
21790 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
217a0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
217b0 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 ROP_TEMP_VIEW
217c0 20 20 20 20 31 35 20 20 20 2f 2a 20 56 69 65 77 15 /* View
217d0 20 4e 61 6d 65 20 20 20 20 20 20 20 4e 55 4c 4c Name NULL
217e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
217f0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21800 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 ROP_TRIGGER
21810 20 20 20 20 31 36 20 20 20 2f 2a 20 54 72 69 67 16 /* Trig
21820 67 65 72 20 4e 61 6d 65 20 20 20 20 54 61 62 6c ger Name Tabl
21830 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21840 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21850 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 ROP_VIEW
21860 20 20 20 20 31 37 20 20 20 2f 2a 20 56 69 65 77 17 /* View
21870 20 4e 61 6d 65 20 20 20 20 20 20 20 4e 55 4c 4c Name NULL
21880 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21890 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 #define SQLITE_I
218a0 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 NSERT
218b0 20 20 20 20 31 38 20 20 20 2f 2a 20 54 61 62 6c 18 /* Tabl
218c0 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
218d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
218e0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 #define SQLITE_P
218f0 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 RAGMA
21900 20 20 20 20 31 39 20 20 20 2f 2a 20 50 72 61 67 19 /* Prag
21910 6d 61 20 4e 61 6d 65 20 20 20 20 20 31 73 74 20 ma Name 1st
21920 61 72 67 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0d 0a arg or NULL */..
21930 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 #define SQLITE_R
21940 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 EAD
21950 20 20 20 20 32 30 20 20 20 2f 2a 20 54 61 62 6c 20 /* Tabl
21960 65 20 4e 61 6d 65 20 20 20 20 20 20 43 6f 6c 75 e Name Colu
21970 6d 6e 20 4e 61 6d 65 20 20 20 20 20 2a 2f 0d 0a mn Name */..
21980 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 #define SQLITE_S
21990 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20 ELECT
219a0 20 20 20 20 32 31 20 20 20 2f 2a 20 4e 55 4c 4c 21 /* NULL
219b0 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c NULL
219c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
219d0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 #define SQLITE_T
219e0 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 RANSACTION
219f0 20 20 20 20 32 32 20 20 20 2f 2a 20 4f 70 65 72 22 /* Oper
21a00 61 74 69 6f 6e 20 20 20 20 20 20 20 4e 55 4c 4c ation NULL
21a10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21a20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 #define SQLITE_U
21a30 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 PDATE
21a40 20 20 20 20 32 33 20 20 20 2f 2a 20 54 61 62 6c 23 /* Tabl
21a50 65 20 4e 61 6d 65 20 20 20 20 20 20 43 6f 6c 75 e Name Colu
21a60 6d 6e 20 4e 61 6d 65 20 20 20 20 20 2a 2f 0d 0a mn Name */..
21a70 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 #define SQLITE_A
21a80 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 TTACH
21a90 20 20 20 20 32 34 20 20 20 2f 2a 20 46 69 6c 65 24 /* File
21aa0 6e 61 6d 65 20 20 20 20 20 20 20 20 4e 55 4c 4c name NULL
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21ac0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21ad0 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 ETACH
21ae0 20 20 20 20 32 35 20 20 20 2f 2a 20 44 61 74 61 25 /* Data
21af0 62 61 73 65 20 4e 61 6d 65 20 20 20 4e 55 4c 4c base Name NULL
21b00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21b10 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 #define SQLITE_A
21b20 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20 LTER_TABLE
21b30 20 20 20 20 32 36 20 20 20 2f 2a 20 44 61 74 61 26 /* Data
21b40 62 61 73 65 20 4e 61 6d 65 20 20 20 54 61 62 6c base Name Tabl
21b50 65 20 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0d 0a e Name */..
21b60 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 #define SQLITE_R
21b70 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 EINDEX
21b80 20 20 20 20 32 37 20 20 20 2f 2a 20 49 6e 64 65 27 /* Inde
21b90 78 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c x Name NULL
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21bb0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 #define SQLITE_A
21bc0 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 NALYZE
21bd0 20 20 20 20 32 38 20 20 20 2f 2a 20 54 61 62 6c 28 /* Tabl
21be0 65 20 4e 61 6d 65 20 20 20 20 20 20 4e 55 4c 4c e Name NULL
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a */..
21c00 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21c10 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 REATE_VTABLE
21c20 20 20 20 20 32 39 20 20 20 2f 2a 20 54 61 62 6c 29 /* Tabl
21c30 65 20 4e 61 6d 65 20 20 20 20 20 20 4d 6f 64 75 e Name Modu
21c40 6c 65 20 4e 61 6d 65 20 20 20 20 20 2a 2f 0d 0a le Name */..
21c50 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
21c60 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 ROP_VTABLE
21c70 20 20 20 20 33 30 20 20 20 2f 2a 20 54 61 62 6c 30 /* Tabl
21c80 65 20 4e 61 6d 65 20 20 20 20 20 20 4d 6f 64 75 e Name Modu
21c90 6c 65 20 4e 61 6d 65 20 20 20 20 20 2a 2f 0d 0a le Name */..
21ca0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 #define SQLITE_F
21cb0 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 UNCTION
21cc0 20 20 20 20 33 31 20 20 20 2f 2a 20 4e 55 4c 4c 31 /* NULL
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 46 75 6e 63 Func
21ce0 74 69 6f 6e 20 4e 61 6d 65 20 20 20 2a 2f 0d 0a tion Name */..
21cf0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 #define SQLITE_S
21d00 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20 20 AVEPOINT
21d10 20 20 20 20 33 32 20 20 20 2f 2a 20 4f 70 65 72 32 /* Oper
21d20 61 74 69 6f 6e 20 20 20 20 20 20 20 53 61 76 65 ation Save
21d30 70 6f 69 6e 74 20 4e 61 6d 65 20 20 2a 2f 0d 0a point Name */..
21d40 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 #define SQLITE_C
21d50 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20 OPY
21d60 20 20 20 20 20 30 20 20 20 2f 2a 20 4e 6f 20 6c 0 /* No l
21d70 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0d 0a 0d onger used */...
21d80 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
21d90 3a 20 54 72 61 63 69 6e 67 20 41 6e 64 20 50 72 : Tracing And Pr
21da0 6f 66 69 6c 69 6e 67 20 46 75 6e 63 74 69 6f 6e ofiling Function
21db0 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 s..**..** These
21dc0 72 6f 75 74 69 6e 65 73 20 72 65 67 69 73 74 65 routines registe
21dd0 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 r callback funct
21de0 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 62 65 ions that can be
21df0 20 75 73 65 64 20 66 6f 72 0d 0a 2a 2a 20 74 72 used for..** tr
21e00 61 63 69 6e 67 20 61 6e 64 20 70 72 6f 66 69 6c acing and profil
21e10 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f ing the executio
21e20 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 n of SQL stateme
21e30 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 nts...**..** ^Th
21e40 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 e callback funct
21e50 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 62 ion registered b
21e60 79 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 y sqlite3_trace(
21e70 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 0d ) is invoked at.
21e80 0a 2a 2a 20 76 61 72 69 6f 75 73 20 74 69 6d 65 .** various time
21e90 73 20 77 68 65 6e 20 61 6e 20 53 51 4c 20 73 74 s when an SQL st
21ea0 61 74 65 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 atement is being
21eb0 20 72 75 6e 20 62 79 20 5b 73 71 6c 69 74 65 33 run by [sqlite3
21ec0 5f 73 74 65 70 28 29 5d 2e 0d 0a 2a 2a 20 5e 54 _step()]...** ^T
21ed0 68 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 he sqlite3_trace
21ee0 28 29 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 () callback is i
21ef0 6e 76 6f 6b 65 64 20 77 69 74 68 20 61 20 55 54 nvoked with a UT
21f00 46 2d 38 20 72 65 6e 64 65 72 69 6e 67 20 6f 66 F-8 rendering of
21f10 20 74 68 65 0d 0a 2a 2a 20 53 51 4c 20 73 74 61 the..** SQL sta
21f20 74 65 6d 65 6e 74 20 74 65 78 74 20 61 73 20 74 tement text as t
21f30 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 69 72 he statement fir
21f40 73 74 20 62 65 67 69 6e 73 20 65 78 65 63 75 74 st begins execut
21f50 69 6e 67 2e 0d 0a 2a 2a 20 5e 28 41 64 64 69 74 ing...** ^(Addit
21f60 69 6f 6e 61 6c 20 73 71 6c 69 74 65 33 5f 74 72 ional sqlite3_tr
21f70 61 63 65 28 29 20 63 61 6c 6c 62 61 63 6b 73 20 ace() callbacks
21f80 6d 69 67 68 74 20 6f 63 63 75 72 0d 0a 2a 2a 20 might occur..**
21f90 61 73 20 65 61 63 68 20 74 72 69 67 67 65 72 65 as each triggere
21fa0 64 20 73 75 62 70 72 6f 67 72 61 6d 20 69 73 20 d subprogram is
21fb0 65 6e 74 65 72 65 64 2e 20 20 54 68 65 20 63 61 entered. The ca
21fc0 6c 6c 62 61 63 6b 73 20 66 6f 72 20 74 72 69 67 llbacks for trig
21fd0 67 65 72 73 0d 0a 2a 2a 20 63 6f 6e 74 61 69 6e gers..** contain
21fe0 20 61 20 55 54 46 2d 38 20 53 51 4c 20 63 6f 6d a UTF-8 SQL com
21ff0 6d 65 6e 74 20 74 68 61 74 20 69 64 65 6e 74 69 ment that identi
22000 66 69 65 73 20 74 68 65 20 74 72 69 67 67 65 72 fies the trigger
22010 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 .)^..**..** ^The
22020 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 callback functi
22030 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 62 79 on registered by
22040 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 sqlite3_profile
22050 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 0d 0a 2a () is invoked..*
22060 2a 20 61 73 20 65 61 63 68 20 53 51 4c 20 73 74 * as each SQL st
22070 61 74 65 6d 65 6e 74 20 66 69 6e 69 73 68 65 73 atement finishes
22080 2e 20 20 5e 54 68 65 20 70 72 6f 66 69 6c 65 20 . ^The profile
22090 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61 69 6e callback contain
220a0 73 0d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e s..** the origin
220b0 61 6c 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 al statement tex
220c0 74 20 61 6e 64 20 61 6e 20 65 73 74 69 6d 61 74 t and an estimat
220d0 65 20 6f 66 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 e of wall-clock
220e0 74 69 6d 65 0d 0a 2a 2a 20 6f 66 20 68 6f 77 20 time..** of how
220f0 6c 6f 6e 67 20 74 68 61 74 20 73 74 61 74 65 6d long that statem
22100 65 6e 74 20 74 6f 6f 6b 20 74 6f 20 72 75 6e 2e ent took to run.
22110 20 20 5e 54 68 65 20 70 72 6f 66 69 6c 65 20 63 ^The profile c
22120 61 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 74 69 6d 65 allback..** time
22130 20 69 73 20 69 6e 20 75 6e 69 74 73 20 6f 66 20 is in units of
22140 6e 61 6e 6f 73 65 63 6f 6e 64 73 2c 20 68 6f 77 nanoseconds, how
22150 65 76 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 ever the current
22160 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0d implementation.
22170 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 61 70 61 .** is only capa
22180 62 6c 65 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f ble of milliseco
22190 6e 64 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 6f nd resolution so
221a0 20 74 68 65 20 73 69 78 20 6c 65 61 73 74 20 73 the six least s
221b0 69 67 6e 69 66 69 63 61 6e 74 0d 0a 2a 2a 20 64 ignificant..** d
221c0 69 67 69 74 73 20 69 6e 20 74 68 65 20 74 69 6d igits in the tim
221d0 65 20 61 72 65 20 6d 65 61 6e 69 6e 67 6c 65 73 e are meaningles
221e0 73 2e 20 20 46 75 74 75 72 65 20 76 65 72 73 69 s. Future versi
221f0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 0d 0a 2a ons of SQLite..*
22200 2a 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 * might provide
22210 67 72 65 61 74 65 72 20 72 65 73 6f 6c 75 74 69 greater resoluti
22220 6f 6e 20 6f 6e 20 74 68 65 20 70 72 6f 66 69 6c on on the profil
22230 65 72 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 er callback. Th
22240 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 e..** sqlite3_pr
22250 6f 66 69 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e ofile() function
22260 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 65 is considered e
22270 78 70 65 72 69 6d 65 6e 74 61 6c 20 61 6e 64 20 xperimental and
22280 69 73 0d 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74 is..** subject t
22290 6f 20 63 68 61 6e 67 65 20 69 6e 20 66 75 74 75 o change in futu
222a0 72 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 re versions of S
222b0 51 4c 69 74 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 QLite...*/..SQLI
222c0 54 45 5f 41 50 49 20 76 6f 69 64 20 2a 73 71 6c TE_API void *sql
222d0 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 ite3_trace(sqlit
222e0 65 33 2a 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 e3*, void(*xTrac
222f0 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 e)(void*,const c
22300 68 61 72 2a 29 2c 20 76 6f 69 64 2a 29 3b 0d 0a har*), void*);..
22310 53 51 4c 49 54 45 5f 41 50 49 20 53 51 4c 49 54 SQLITE_API SQLIT
22320 45 5f 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 76 E_EXPERIMENTAL v
22330 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f oid *sqlite3_pro
22340 66 69 6c 65 28 73 71 6c 69 74 65 33 2a 2c 0d 0a file(sqlite3*,..
22350 20 20 20 76 6f 69 64 28 2a 78 50 72 6f 66 69 6c void(*xProfil
22360 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 e)(void*,const c
22370 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 75 69 6e har*,sqlite3_uin
22380 74 36 34 29 2c 20 76 6f 69 64 2a 29 3b 0d 0a 0d t64), void*);...
22390 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
223a0 3a 20 51 75 65 72 79 20 50 72 6f 67 72 65 73 73 : Query Progress
223b0 20 43 61 6c 6c 62 61 63 6b 73 0d 0a 2a 2a 0d 0a Callbacks..**..
223c0 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
223d0 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 progress_handler
223e0 28 44 2c 4e 2c 58 2c 50 29 20 69 6e 74 65 72 66 (D,N,X,P) interf
223f0 61 63 65 20 63 61 75 73 65 73 20 74 68 65 20 63 ace causes the c
22400 61 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 66 75 6e 63 allback..** func
22410 74 69 6f 6e 20 58 20 74 6f 20 62 65 20 69 6e 76 tion X to be inv
22420 6f 6b 65 64 20 70 65 72 69 6f 64 69 63 61 6c 6c oked periodicall
22430 79 20 64 75 72 69 6e 67 20 6c 6f 6e 67 20 72 75 y during long ru
22440 6e 6e 69 6e 67 20 63 61 6c 6c 73 20 74 6f 0d 0a nning calls to..
22450 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 ** [sqlite3_exec
22460 28 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 73 74 ()], [sqlite3_st
22470 65 70 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 ep()] and [sqlit
22480 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 29 5d 20 e3_get_table()]
22490 66 6f 72 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 for..** database
224a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 44 2e 20 20 connection D.
224b0 41 6e 20 65 78 61 6d 70 6c 65 20 75 73 65 20 66 An example use f
224c0 6f 72 20 74 68 69 73 0d 0a 2a 2a 20 69 6e 74 65 or this..** inte
224d0 72 66 61 63 65 20 69 73 20 74 6f 20 6b 65 65 70 rface is to keep
224e0 20 61 20 47 55 49 20 75 70 64 61 74 65 64 20 64 a GUI updated d
224f0 75 72 69 6e 67 20 61 20 6c 61 72 67 65 20 71 75 uring a large qu
22500 65 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ery...**..** ^Th
22510 65 20 70 61 72 61 6d 65 74 65 72 20 50 20 69 73 e parameter P is
22520 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 passed through
22530 61 73 20 74 68 65 20 6f 6e 6c 79 20 70 61 72 61 as the only para
22540 6d 65 74 65 72 20 74 6f 20 74 68 65 20 0d 0a 2a meter to the ..*
22550 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 * callback funct
22560 69 6f 6e 20 58 2e 20 20 5e 54 68 65 20 70 61 72 ion X. ^The par
22570 61 6d 65 74 65 72 20 4e 20 69 73 20 74 68 65 20 ameter N is the
22580 6e 75 6d 62 65 72 20 6f 66 20 0d 0a 2a 2a 20 5b number of ..** [
22590 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 virtual machine
225a0 69 6e 73 74 72 75 63 74 69 6f 6e 73 5d 20 74 68 instructions] th
225b0 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 at are evaluated
225c0 20 62 65 74 77 65 65 6e 20 73 75 63 63 65 73 73 between success
225d0 69 76 65 0d 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 ive..** invocati
225e0 6f 6e 73 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 ons of the callb
225f0 61 63 6b 20 58 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ack X...**..** ^
22600 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 Only a single pr
22610 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 6d ogress handler m
22620 61 79 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 ay be defined at
22630 20 6f 6e 65 20 74 69 6d 65 20 70 65 72 0d 0a 2a one time per..*
22640 2a 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e * [database conn
22650 65 63 74 69 6f 6e 5d 3b 20 73 65 74 74 69 6e 67 ection]; setting
22660 20 61 20 6e 65 77 20 70 72 6f 67 72 65 73 73 20 a new progress
22670 68 61 6e 64 6c 65 72 20 63 61 6e 63 65 6c 73 20 handler cancels
22680 74 68 65 0d 0a 2a 2a 20 6f 6c 64 20 6f 6e 65 2e the..** old one.
22690 20 20 5e 53 65 74 74 69 6e 67 20 70 61 72 61 6d ^Setting param
226a0 65 74 65 72 20 58 20 74 6f 20 4e 55 4c 4c 20 64 eter X to NULL d
226b0 69 73 61 62 6c 65 73 20 74 68 65 20 70 72 6f 67 isables the prog
226c0 72 65 73 73 20 68 61 6e 64 6c 65 72 2e 0d 0a 2a ress handler...*
226d0 2a 20 5e 54 68 65 20 70 72 6f 67 72 65 73 73 20 * ^The progress
226e0 68 61 6e 64 6c 65 72 20 69 73 20 61 6c 73 6f 20 handler is also
226f0 64 69 73 61 62 6c 65 64 20 62 79 20 73 65 74 74 disabled by sett
22700 69 6e 67 20 4e 20 74 6f 20 61 20 76 61 6c 75 65 ing N to a value
22710 20 6c 65 73 73 0d 0a 2a 2a 20 74 68 61 6e 20 31 less..** than 1
22720 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 ...**..** ^If th
22730 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 e progress callb
22740 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d ack returns non-
22750 7a 65 72 6f 2c 20 74 68 65 20 6f 70 65 72 61 74 zero, the operat
22760 69 6f 6e 20 69 73 0d 0a 2a 2a 20 69 6e 74 65 72 ion is..** inter
22770 72 75 70 74 65 64 2e 20 20 54 68 69 73 20 66 65 rupted. This fe
22780 61 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 ature can be use
22790 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 d to implement a
227a0 0d 0a 2a 2a 20 22 43 61 6e 63 65 6c 22 20 62 75 ..** "Cancel" bu
227b0 74 74 6f 6e 20 6f 6e 20 61 20 47 55 49 20 70 72 tton on a GUI pr
227c0 6f 67 72 65 73 73 20 64 69 61 6c 6f 67 20 62 6f ogress dialog bo
227d0 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 x...**..** The p
227e0 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 rogress handler
227f0 63 61 6c 6c 62 61 63 6b 20 6d 75 73 74 20 6e 6f callback must no
22800 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 74 68 t do anything th
22810 61 74 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0d 0a at will modify..
22820 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ** the database
22830 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 connection that
22840 69 6e 76 6f 6b 65 64 20 74 68 65 20 70 72 6f 67 invoked the prog
22850 72 65 73 73 20 68 61 6e 64 6c 65 72 2e 0d 0a 2a ress handler...*
22860 2a 20 4e 6f 74 65 20 74 68 61 74 20 5b 73 71 6c * Note that [sql
22870 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 ite3_prepare_v2(
22880 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f )] and [sqlite3_
22890 73 74 65 70 28 29 5d 20 62 6f 74 68 20 6d 6f 64 step()] both mod
228a0 69 66 79 20 74 68 65 69 72 0d 0a 2a 2a 20 64 61 ify their..** da
228b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
228c0 6e 73 20 66 6f 72 20 74 68 65 20 6d 65 61 6e 69 ns for the meani
228d0 6e 67 20 6f 66 20 22 6d 6f 64 69 66 79 22 20 69 ng of "modify" i
228e0 6e 20 74 68 69 73 20 70 61 72 61 67 72 61 70 68 n this paragraph
228f0 2e 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 ...**..*/..SQLIT
22900 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c 69 74 E_API void sqlit
22910 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 e3_progress_hand
22920 6c 65 72 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e ler(sqlite3*, in
22930 74 2c 20 69 6e 74 28 2a 29 28 76 6f 69 64 2a 29 t, int(*)(void*)
22940 2c 20 76 6f 69 64 2a 29 3b 0d 0a 0d 0a 2f 2a 0d , void*);..../*.
22950 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 70 .** CAPI3REF: Op
22960 65 6e 69 6e 67 20 41 20 4e 65 77 20 44 61 74 61 ening A New Data
22970 62 61 73 65 20 43 6f 6e 6e 65 63 74 69 6f 6e 0d base Connection.
22980 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 73 65 20 72 .**..** ^These r
22990 6f 75 74 69 6e 65 73 20 6f 70 65 6e 20 61 6e 20 outines open an
229a0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 SQLite database
229b0 66 69 6c 65 20 61 73 20 73 70 65 63 69 66 69 65 file as specifie
229c0 64 20 62 79 20 74 68 65 20 0d 0a 2a 2a 20 66 69 d by the ..** fi
229d0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 2e lename argument.
229e0 20 5e 54 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 ^The filename a
229f0 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 rgument is inter
22a00 70 72 65 74 65 64 20 61 73 20 55 54 46 2d 38 20 preted as UTF-8
22a10 66 6f 72 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f for..** sqlite3_
22a20 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 open() and sqlit
22a30 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 6e 64 e3_open_v2() and
22a40 20 61 73 20 55 54 46 2d 31 36 20 69 6e 20 74 68 as UTF-16 in th
22a50 65 20 6e 61 74 69 76 65 20 62 79 74 65 0d 0a 2a e native byte..*
22a60 2a 20 6f 72 64 65 72 20 66 6f 72 20 73 71 6c 69 * order for sqli
22a70 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 5e 28 te3_open16(). ^(
22a80 41 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e A [database conn
22a90 65 63 74 69 6f 6e 5d 20 68 61 6e 64 6c 65 20 69 ection] handle i
22aa0 73 20 75 73 75 61 6c 6c 79 0d 0a 2a 2a 20 72 65 s usually..** re
22ab0 74 75 72 6e 65 64 20 69 6e 20 2a 70 70 44 62 2c turned in *ppDb,
22ac0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f even if an erro
22ad0 72 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 6f r occurs. The o
22ae0 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 20 69 73 nly exception is
22af0 20 74 68 61 74 0d 0a 2a 2a 20 69 66 20 53 51 4c that..** if SQL
22b00 69 74 65 20 69 73 20 75 6e 61 62 6c 65 20 74 6f ite is unable to
22b10 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 allocate memory
22b20 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 5b 73 71 to hold the [sq
22b30 6c 69 74 65 33 5d 20 6f 62 6a 65 63 74 2c 0d 0a lite3] object,..
22b40 2a 2a 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 62 ** a NULL will b
22b50 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a e written into *
22b60 70 70 44 62 20 69 6e 73 74 65 61 64 20 6f 66 20 ppDb instead of
22b70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
22b80 20 5b 73 71 6c 69 74 65 33 5d 0d 0a 2a 2a 20 6f [sqlite3]..** o
22b90 62 6a 65 63 74 2e 29 5e 20 5e 28 49 66 20 74 68 bject.)^ ^(If th
22ba0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 e database is op
22bb0 65 6e 65 64 20 28 61 6e 64 2f 6f 72 20 63 72 65 ened (and/or cre
22bc0 61 74 65 64 29 20 73 75 63 63 65 73 73 66 75 6c ated) successful
22bd0 6c 79 2c 20 74 68 65 6e 0d 0a 2a 2a 20 5b 53 51 ly, then..** [SQ
22be0 4c 49 54 45 5f 4f 4b 5d 20 69 73 20 72 65 74 75 LITE_OK] is retu
22bf0 72 6e 65 64 2e 20 20 4f 74 68 65 72 77 69 73 65 rned. Otherwise
22c00 20 61 6e 20 5b 65 72 72 6f 72 20 63 6f 64 65 5d an [error code]
22c10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 29 5e 20 is returned.)^
22c20 5e 54 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 ^The..** [sqlite
22c30 33 5f 65 72 72 6d 73 67 28 29 5d 20 6f 72 20 5b 3_errmsg()] or [
22c40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 sqlite3_errmsg16
22c50 28 29 5d 20 72 6f 75 74 69 6e 65 73 20 63 61 6e ()] routines can
22c60 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61 be used to obta
22c70 69 6e 0d 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 in..** an Englis
22c80 68 20 6c 61 6e 67 75 61 67 65 20 64 65 73 63 72 h language descr
22c90 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 iption of the er
22ca0 72 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 ror following a
22cb0 66 61 69 6c 75 72 65 20 6f 66 20 61 6e 79 0d 0a failure of any..
22cc0 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 ** of the sqlite
22cd0 33 5f 6f 70 65 6e 28 29 20 72 6f 75 74 69 6e 65 3_open() routine
22ce0 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 s...**..** ^The
22cf0 64 65 66 61 75 6c 74 20 65 6e 63 6f 64 69 6e 67 default encoding
22d00 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 for the databas
22d10 65 20 77 69 6c 6c 20 62 65 20 55 54 46 2d 38 20 e will be UTF-8
22d20 69 66 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f if..** sqlite3_o
22d30 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 pen() or sqlite3
22d40 5f 6f 70 65 6e 5f 76 32 28 29 20 69 73 20 63 61 _open_v2() is ca
22d50 6c 6c 65 64 20 61 6e 64 0d 0a 2a 2a 20 55 54 46 lled and..** UTF
22d60 2d 31 36 20 69 6e 20 74 68 65 20 6e 61 74 69 76 -16 in the nativ
22d70 65 20 62 79 74 65 20 6f 72 64 65 72 20 69 66 20 e byte order if
22d80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 sqlite3_open16()
22d90 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a is used...**..*
22da0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 * Whether or not
22db0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 an error occurs
22dc0 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65 6e when it is open
22dd0 65 64 2c 20 72 65 73 6f 75 72 63 65 73 0d 0a 2a ed, resources..*
22de0 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 * associated wit
22df0 68 20 74 68 65 20 5b 64 61 74 61 62 61 73 65 20 h the [database
22e00 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 68 61 6e 64 connection] hand
22e10 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c le should be rel
22e20 65 61 73 65 64 20 62 79 0d 0a 2a 2a 20 70 61 73 eased by..** pas
22e30 73 69 6e 67 20 69 74 20 74 6f 20 5b 73 71 6c 69 sing it to [sqli
22e40 74 65 33 5f 63 6c 6f 73 65 28 29 5d 20 77 68 65 te3_close()] whe
22e50 6e 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 n it is no longe
22e60 72 20 72 65 71 75 69 72 65 64 2e 0d 0a 2a 2a 0d r required...**.
22e70 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f .** The sqlite3_
22e80 6f 70 65 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 open_v2() interf
22e90 61 63 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 ace works like s
22ea0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 0d 0a 2a qlite3_open()..*
22eb0 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 * except that it
22ec0 20 61 63 63 65 70 74 73 20 74 77 6f 20 61 64 64 accepts two add
22ed0 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 itional paramete
22ee0 72 73 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 rs for additiona
22ef0 6c 20 63 6f 6e 74 72 6f 6c 0d 0a 2a 2a 20 6f 76 l control..** ov
22f00 65 72 20 74 68 65 20 6e 65 77 20 64 61 74 61 62 er the new datab
22f10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ase connection.
22f20 20 5e 28 54 68 65 20 66 6c 61 67 73 20 70 61 72 ^(The flags par
22f30 61 6d 65 74 65 72 20 74 6f 0d 0a 2a 2a 20 73 71 ameter to..** sq
22f40 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 lite3_open_v2()
22f50 63 61 6e 20 74 61 6b 65 20 6f 6e 65 20 6f 66 0d can take one of.
22f60 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e .** the followin
22f70 67 20 74 68 72 65 65 20 76 61 6c 75 65 73 2c 20 g three values,
22f80 6f 70 74 69 6f 6e 61 6c 6c 79 20 63 6f 6d 62 69 optionally combi
22f90 6e 65 64 20 77 69 74 68 20 74 68 65 20 0d 0a 2a ned with the ..*
22fa0 2a 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e * [SQLITE_OPEN_N
22fb0 4f 4d 55 54 45 58 5d 2c 20 5b 53 51 4c 49 54 45 OMUTEX], [SQLITE
22fc0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 5d _OPEN_FULLMUTEX]
22fd0 2c 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 , [SQLITE_OPEN_S
22fe0 48 41 52 45 44 43 41 43 48 45 5d 2c 0d 0a 2a 2a HAREDCACHE],..**
22ff0 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 [SQLITE_OPEN_PR
23000 49 56 41 54 45 43 41 43 48 45 5d 2c 20 61 6e 64 IVATECACHE], and
23010 2f 6f 72 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e /or [SQLITE_OPEN
23020 5f 55 52 49 5d 20 66 6c 61 67 73 3a 29 5e 0d 0a _URI] flags:)^..
23030 2a 2a 0d 0a 2a 2a 20 3c 64 6c 3e 0d 0a 2a 2a 20 **..** <dl>..**
23040 5e 28 3c 64 74 3e 5b 53 51 4c 49 54 45 5f 4f 50 ^(<dt>[SQLITE_OP
23050 45 4e 5f 52 45 41 44 4f 4e 4c 59 5d 3c 2f 64 74 EN_READONLY]</dt
23060 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 65 20 64 61 >..** <dd>The da
23070 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 tabase is opened
23080 20 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f in read-only mo
23090 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 de. If the data
230a0 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 0d 0a 2a base does not..*
230b0 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c * already exist,
230c0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 an error is ret
230d0 75 72 6e 65 64 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a urned.</dd>)^..*
230e0 2a 0d 0a 2a 2a 20 5e 28 3c 64 74 3e 5b 53 51 4c *..** ^(<dt>[SQL
230f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 ITE_OPEN_READWRI
23100 54 45 5d 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 TE]</dt>..** <dd
23110 3e 54 68 65 20 64 61 74 61 62 61 73 65 20 69 73 >The database is
23120 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 opened for read
23130 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 ing and writing
23140 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 6f 72 20 if possible, or
23150 72 65 61 64 69 6e 67 0d 0a 2a 2a 20 6f 6e 6c 79 reading..** only
23160 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 if the file is
23170 77 72 69 74 65 20 70 72 6f 74 65 63 74 65 64 20 write protected
23180 62 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 by the operating
23190 20 73 79 73 74 65 6d 2e 20 20 49 6e 20 65 69 74 system. In eit
231a0 68 65 72 0d 0a 2a 2a 20 63 61 73 65 20 74 68 65 her..** case the
231b0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 61 database must a
231c0 6c 72 65 61 64 79 20 65 78 69 73 74 2c 20 6f 74 lready exist, ot
231d0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 herwise an error
231e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 3c 2f 64 is returned.</d
231f0 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 3c d>)^..**..** ^(<
23200 64 74 3e 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f dt>[SQLITE_OPEN_
23210 52 45 41 44 57 52 49 54 45 5d 20 7c 20 5b 53 51 READWRITE] | [SQ
23220 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 LITE_OPEN_CREATE
23230 5d 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 ]</dt>..** <dd>T
23240 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f he database is o
23250 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e pened for readin
23260 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2c 20 61 g and writing, a
23270 6e 64 20 69 73 20 63 72 65 61 74 65 64 20 69 66 nd is created if
23280 0d 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 ..** it does not
23290 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 already exist.
232a0 54 68 69 73 20 69 73 20 74 68 65 20 62 65 68 61 This is the beha
232b0 76 69 6f 72 20 74 68 61 74 20 69 73 20 61 6c 77 vior that is alw
232c0 61 79 73 20 75 73 65 64 20 66 6f 72 0d 0a 2a 2a ays used for..**
232d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 sqlite3_open()
232e0 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e and sqlite3_open
232f0 31 36 28 29 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 16().</dd>)^..**
23300 20 3c 2f 64 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 </dl>..**..** I
23310 66 20 74 68 65 20 33 72 64 20 70 61 72 61 6d 65 f the 3rd parame
23320 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f ter to sqlite3_o
23330 70 65 6e 5f 76 32 28 29 20 69 73 20 6e 6f 74 20 pen_v2() is not
23340 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 63 one of the..** c
23350 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 73 68 6f 77 ombinations show
23360 6e 20 61 62 6f 76 65 20 6f 70 74 69 6f 6e 61 6c n above optional
23370 6c 79 20 63 6f 6d 62 69 6e 65 64 20 77 69 74 68 ly combined with
23380 20 6f 74 68 65 72 0d 0a 2a 2a 20 5b 53 51 4c 49 other..** [SQLI
23390 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 TE_OPEN_READONLY
233a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 2a | SQLITE_OPEN_*
233b0 20 62 69 74 73 5d 0d 0a 2a 2a 20 74 68 65 6e 20 bits]..** then
233c0 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 the behavior is
233d0 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a undefined...**..
233e0 2a 2a 20 5e 49 66 20 74 68 65 20 5b 53 51 4c 49 ** ^If the [SQLI
233f0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 5d TE_OPEN_NOMUTEX]
23400 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 flag is set, th
23410 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 en the database
23420 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 6f connection..** o
23430 70 65 6e 73 20 69 6e 20 74 68 65 20 6d 75 6c 74 pens in the mult
23440 69 2d 74 68 72 65 61 64 20 5b 74 68 72 65 61 64 i-thread [thread
23450 69 6e 67 20 6d 6f 64 65 5d 20 61 73 20 6c 6f 6e ing mode] as lon
23460 67 20 61 73 20 74 68 65 20 73 69 6e 67 6c 65 2d g as the single-
23470 74 68 72 65 61 64 0d 0a 2a 2a 20 6d 6f 64 65 20 thread..** mode
23480 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 has not been set
23490 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 at compile-time
234a0 20 6f 72 20 73 74 61 72 74 2d 74 69 6d 65 2e 20 or start-time.
234b0 20 5e 49 66 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 ^If the..** [SQ
234c0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 LITE_OPEN_FULLMU
234d0 54 45 58 5d 20 66 6c 61 67 20 69 73 20 73 65 74 TEX] flag is set
234e0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 then the databa
234f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 se connection op
23500 65 6e 73 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 73 ens..** in the s
23510 65 72 69 61 6c 69 7a 65 64 20 5b 74 68 72 65 61 erialized [threa
23520 64 69 6e 67 20 6d 6f 64 65 5d 20 75 6e 6c 65 73 ding mode] unles
23530 73 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 20 s single-thread
23540 77 61 73 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 was..** previous
23550 6c 79 20 73 65 6c 65 63 74 65 64 20 61 74 20 63 ly selected at c
23560 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 72 20 73 ompile-time or s
23570 74 61 72 74 2d 74 69 6d 65 2e 0d 0a 2a 2a 20 5e tart-time...** ^
23580 54 68 65 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e The [SQLITE_OPEN
23590 5f 53 48 41 52 45 44 43 41 43 48 45 5d 20 66 6c _SHAREDCACHE] fl
235a0 61 67 20 63 61 75 73 65 73 20 74 68 65 20 64 61 ag causes the da
235b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
235c0 6e 20 74 6f 20 62 65 0d 0a 2a 2a 20 65 6c 69 67 n to be..** elig
235d0 69 62 6c 65 20 74 6f 20 75 73 65 20 5b 73 68 61 ible to use [sha
235e0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 5d 2c red cache mode],
235f0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 regardless of w
23600 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 hether or not sh
23610 61 72 65 64 0d 0a 2a 2a 20 63 61 63 68 65 20 69 ared..** cache i
23620 73 20 65 6e 61 62 6c 65 64 20 75 73 69 6e 67 20 s enabled using
23630 5b 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f [sqlite3_enable_
23640 73 68 61 72 65 64 5f 63 61 63 68 65 28 29 5d 2e shared_cache()].
23650 20 20 5e 54 68 65 0d 0a 2a 2a 20 5b 53 51 4c 49 ^The..** [SQLI
23660 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 TE_OPEN_PRIVATEC
23670 41 43 48 45 5d 20 66 6c 61 67 20 63 61 75 73 65 ACHE] flag cause
23680 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 s the database c
23690 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 onnection to not
236a0 0d 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 ..** participate
236b0 20 69 6e 20 5b 73 68 61 72 65 64 20 63 61 63 68 in [shared cach
236c0 65 20 6d 6f 64 65 5d 20 65 76 65 6e 20 69 66 20 e mode] even if
236d0 69 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0d 0a it is enabled...
236e0 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 6f 75 72 **..** ^The four
236f0 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 th parameter to
23700 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 sqlite3_open_v2(
23710 29 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 ) is the name of
23720 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 the..** [sqlite
23730 33 5f 76 66 73 5d 20 6f 62 6a 65 63 74 20 74 68 3_vfs] object th
23740 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6f at defines the o
23750 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
23760 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 0d 0a interface that..
23770 2a 2a 20 74 68 65 20 6e 65 77 20 64 61 74 61 62 ** the new datab
23780 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ase connection s
23790 68 6f 75 6c 64 20 75 73 65 2e 20 20 5e 49 66 20 hould use. ^If
237a0 74 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d the fourth param
237b0 65 74 65 72 20 69 73 0d 0a 2a 2a 20 61 20 4e 55 eter is..** a NU
237c0 4c 4c 20 70 6f 69 6e 74 65 72 20 74 68 65 6e 20 LL pointer then
237d0 74 68 65 20 64 65 66 61 75 6c 74 20 5b 73 71 6c the default [sql
237e0 69 74 65 33 5f 76 66 73 5d 20 6f 62 6a 65 63 74 ite3_vfs] object
237f0 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a is used...**..*
23800 2a 20 5e 49 66 20 74 68 65 20 66 69 6c 65 6e 61 * ^If the filena
23810 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 me is ":memory:"
23820 2c 20 74 68 65 6e 20 61 20 70 72 69 76 61 74 65 , then a private
23830 2c 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 2d 6d , temporary in-m
23840 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0d 0a emory database..
23850 2a 2a 20 69 73 20 63 72 65 61 74 65 64 20 66 6f ** is created fo
23860 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e r the connection
23870 2e 20 20 5e 54 68 69 73 20 69 6e 2d 6d 65 6d 6f . ^This in-memo
23880 72 79 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c ry database will
23890 20 76 61 6e 69 73 68 20 77 68 65 6e 0d 0a 2a 2a vanish when..**
238a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f the database co
238b0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 nnection is clos
238c0 65 64 2e 20 20 46 75 74 75 72 65 20 76 65 72 73 ed. Future vers
238d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 6d ions of SQLite m
238e0 69 67 68 74 0d 0a 2a 2a 20 6d 61 6b 65 20 75 73 ight..** make us
238f0 65 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 e of additional
23900 73 70 65 63 69 61 6c 20 66 69 6c 65 6e 61 6d 65 special filename
23910 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 s that begin wit
23920 68 20 74 68 65 20 22 3a 22 20 63 68 61 72 61 63 h the ":" charac
23930 74 65 72 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 72 ter...** It is r
23940 65 63 6f 6d 6d 65 6e 64 65 64 20 74 68 61 74 20 ecommended that
23950 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 when a database
23960 66 69 6c 65 6e 61 6d 65 20 61 63 74 75 61 6c 6c filename actuall
23970 79 20 64 6f 65 73 20 62 65 67 69 6e 20 77 69 74 y does begin wit
23980 68 0d 0a 2a 2a 20 61 20 22 3a 22 20 63 68 61 72 h..** a ":" char
23990 61 63 74 65 72 20 79 6f 75 20 73 68 6f 75 6c 64 acter you should
239a0 20 70 72 65 66 69 78 20 74 68 65 20 66 69 6c 65 prefix the file
239b0 6e 61 6d 65 20 77 69 74 68 20 61 20 70 61 74 68 name with a path
239c0 6e 61 6d 65 20 73 75 63 68 20 61 73 0d 0a 2a 2a name such as..**
239d0 20 22 2e 2f 22 20 74 6f 20 61 76 6f 69 64 20 61 "./" to avoid a
239e0 6d 62 69 67 75 69 74 79 2e 0d 0a 2a 2a 0d 0a 2a mbiguity...**..*
239f0 2a 20 5e 49 66 20 74 68 65 20 66 69 6c 65 6e 61 * ^If the filena
23a00 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 me is an empty s
23a10 74 72 69 6e 67 2c 20 74 68 65 6e 20 61 20 70 72 tring, then a pr
23a20 69 76 61 74 65 2c 20 74 65 6d 70 6f 72 61 72 79 ivate, temporary
23a30 0d 0a 2a 2a 20 6f 6e 2d 64 69 73 6b 20 64 61 74 ..** on-disk dat
23a40 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 63 72 abase will be cr
23a50 65 61 74 65 64 2e 20 20 5e 54 68 69 73 20 70 72 eated. ^This pr
23a60 69 76 61 74 65 20 64 61 74 61 62 61 73 65 20 77 ivate database w
23a70 69 6c 6c 20 62 65 0d 0a 2a 2a 20 61 75 74 6f 6d ill be..** autom
23a80 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 atically deleted
23a90 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 as soon as the
23aa0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
23ab0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a ion is closed...
23ac0 2a 2a 0d 0a 2a 2a 20 5b 5b 55 52 49 20 66 69 6c **..** [[URI fil
23ad0 65 6e 61 6d 65 73 20 69 6e 20 73 71 6c 69 74 65 enames in sqlite
23ae0 33 5f 6f 70 65 6e 28 29 5d 5d 20 3c 68 33 3e 55 3_open()]] <h3>U
23af0 52 49 20 46 69 6c 65 6e 61 6d 65 73 3c 2f 68 33 RI Filenames</h3
23b00 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 5b 55 >..**..** ^If [U
23b10 52 49 20 66 69 6c 65 6e 61 6d 65 5d 20 69 6e 74 RI filename] int
23b20 65 72 70 72 65 74 61 74 69 6f 6e 20 69 73 20 65 erpretation is e
23b30 6e 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 nabled, and the
23b40 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e filename argumen
23b50 74 0d 0a 2a 2a 20 62 65 67 69 6e 73 20 77 69 74 t..** begins wit
23b60 68 20 22 66 69 6c 65 3a 22 2c 20 74 68 65 6e 20 h "file:", then
23b70 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 the filename is
23b80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 interpreted as a
23b90 20 55 52 49 2e 20 5e 55 52 49 0d 0a 2a 2a 20 66 URI. ^URI..** f
23ba0 69 6c 65 6e 61 6d 65 20 69 6e 74 65 72 70 72 65 ilename interpre
23bb0 74 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 tation is enable
23bc0 64 20 69 66 20 74 68 65 20 5b 53 51 4c 49 54 45 d if the [SQLITE
23bd0 5f 4f 50 45 4e 5f 55 52 49 5d 20 66 6c 61 67 20 _OPEN_URI] flag
23be0 69 73 0d 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 is..** set in th
23bf0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e e fourth argumen
23c00 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 t to sqlite3_ope
23c10 6e 5f 76 32 28 29 2c 20 6f 72 20 69 66 20 69 74 n_v2(), or if it
23c20 20 68 61 73 0d 0a 2a 2a 20 62 65 65 6e 20 65 6e has..** been en
23c30 61 62 6c 65 64 20 67 6c 6f 62 61 6c 6c 79 20 75 abled globally u
23c40 73 69 6e 67 20 74 68 65 20 5b 53 51 4c 49 54 45 sing the [SQLITE
23c50 5f 43 4f 4e 46 49 47 5f 55 52 49 5d 20 6f 70 74 _CONFIG_URI] opt
23c60 69 6f 6e 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a ion with the..**
23c70 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 [sqlite3_config
23c80 28 29 5d 20 6d 65 74 68 6f 64 20 6f 72 20 62 79 ()] method or by
23c90 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 55 53 45 the [SQLITE_USE
23ca0 5f 55 52 49 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 _URI] compile-ti
23cb0 6d 65 20 6f 70 74 69 6f 6e 2e 0d 0a 2a 2a 20 41 me option...** A
23cc0 73 20 6f 66 20 53 51 4c 69 74 65 20 76 65 72 73 s of SQLite vers
23cd0 69 6f 6e 20 33 2e 37 2e 37 2c 20 55 52 49 20 66 ion 3.7.7, URI f
23ce0 69 6c 65 6e 61 6d 65 20 69 6e 74 65 72 70 72 65 ilename interpre
23cf0 74 61 74 69 6f 6e 20 69 73 20 74 75 72 6e 65 64 tation is turned
23d00 20 6f 66 66 0d 0a 2a 2a 20 62 79 20 64 65 66 61 off..** by defa
23d10 75 6c 74 2c 20 62 75 74 20 66 75 74 75 72 65 20 ult, but future
23d20 72 65 6c 65 61 73 65 73 20 6f 66 20 53 51 4c 69 releases of SQLi
23d30 74 65 20 6d 69 67 68 74 20 65 6e 61 62 6c 65 20 te might enable
23d40 55 52 49 20 66 69 6c 65 6e 61 6d 65 0d 0a 2a 2a URI filename..**
23d50 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 interpretation
23d60 62 79 20 64 65 66 61 75 6c 74 2e 20 20 53 65 65 by default. See
23d70 20 22 5b 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 "[URI filenames
23d80 5d 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 ]" for additiona
23d90 6c 0d 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f l..** informatio
23da0 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 55 52 49 20 66 n...**..** URI f
23db0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 70 61 72 ilenames are par
23dc0 73 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f sed according to
23dd0 20 52 46 43 20 33 39 38 36 2e 20 5e 49 66 20 74 RFC 3986. ^If t
23de0 68 65 20 55 52 49 20 63 6f 6e 74 61 69 6e 73 20 he URI contains
23df0 61 6e 0d 0a 2a 2a 20 61 75 74 68 6f 72 69 74 79 an..** authority
23e00 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 , then it must b
23e10 65 20 65 69 74 68 65 72 20 61 6e 20 65 6d 70 74 e either an empt
23e20 79 20 73 74 72 69 6e 67 20 6f 72 20 74 68 65 20 y string or the
23e30 73 74 72 69 6e 67 20 0d 0a 2a 2a 20 22 6c 6f 63 string ..** "loc
23e40 61 6c 68 6f 73 74 22 2e 20 5e 49 66 20 74 68 65 alhost". ^If the
23e50 20 61 75 74 68 6f 72 69 74 79 20 69 73 20 6e 6f authority is no
23e60 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e t an empty strin
23e70 67 20 6f 72 20 22 6c 6f 63 61 6c 68 6f 73 74 22 g or "localhost"
23e80 2c 20 61 6e 20 0d 0a 2a 2a 20 65 72 72 6f 72 20 , an ..** error
23e90 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 is returned to t
23ea0 68 65 20 63 61 6c 6c 65 72 2e 20 5e 54 68 65 20 he caller. ^The
23eb0 66 72 61 67 6d 65 6e 74 20 63 6f 6d 70 6f 6e 65 fragment compone
23ec0 6e 74 20 6f 66 20 61 20 55 52 49 2c 20 69 66 20 nt of a URI, if
23ed0 0d 0a 2a 2a 20 70 72 65 73 65 6e 74 2c 20 69 73 ..** present, is
23ee0 20 69 67 6e 6f 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a ignored...**..*
23ef0 2a 20 5e 53 51 4c 69 74 65 20 75 73 65 73 20 74 * ^SQLite uses t
23f00 68 65 20 70 61 74 68 20 63 6f 6d 70 6f 6e 65 6e he path componen
23f10 74 20 6f 66 20 74 68 65 20 55 52 49 20 61 73 20 t of the URI as
23f20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 the name of the
23f30 64 69 73 6b 20 66 69 6c 65 0d 0a 2a 2a 20 77 68 disk file..** wh
23f40 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 ich contains the
23f50 20 64 61 74 61 62 61 73 65 2e 20 5e 49 66 20 74 database. ^If t
23f60 68 65 20 70 61 74 68 20 62 65 67 69 6e 73 20 77 he path begins w
23f70 69 74 68 20 61 20 27 2f 27 20 63 68 61 72 61 63 ith a '/' charac
23f80 74 65 72 2c 20 0d 0a 2a 2a 20 74 68 65 6e 20 69 ter, ..** then i
23f90 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 t is interpreted
23fa0 20 61 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 as an absolute
23fb0 70 61 74 68 2e 20 5e 49 66 20 74 68 65 20 70 61 path. ^If the pa
23fc0 74 68 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 th does not begi
23fd0 6e 20 0d 0a 2a 2a 20 77 69 74 68 20 61 20 27 2f n ..** with a '/
23fe0 27 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 ' (meaning that
23ff0 74 68 65 20 61 75 74 68 6f 72 69 74 79 20 73 65 the authority se
24000 63 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 ction is omitted
24010 20 66 72 6f 6d 20 74 68 65 20 55 52 49 29 0d 0a from the URI)..
24020 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 74 68 ** then the path
24030 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 is interpreted
24040 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 as a relative pa
24050 74 68 2e 20 0d 0a 2a 2a 20 5e 4f 6e 20 77 69 6e th. ..** ^On win
24060 64 6f 77 73 2c 20 74 68 65 20 66 69 72 73 74 20 dows, the first
24070 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 6e 20 component of an
24080 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 0d 0a absolute path ..
24090 2a 2a 20 69 73 20 61 20 64 72 69 76 65 20 73 70 ** is a drive sp
240a0 65 63 69 66 69 63 61 74 69 6f 6e 20 28 65 2e 67 ecification (e.g
240b0 2e 20 22 43 3a 22 29 2e 0d 0a 2a 2a 0d 0a 2a 2a . "C:")...**..**
240c0 20 5b 5b 63 6f 72 65 20 55 52 49 20 71 75 65 72 [[core URI quer
240d0 79 20 70 61 72 61 6d 65 74 65 72 73 5d 5d 0d 0a y parameters]]..
240e0 2a 2a 20 54 68 65 20 71 75 65 72 79 20 63 6f 6d ** The query com
240f0 70 6f 6e 65 6e 74 20 6f 66 20 61 20 55 52 49 20 ponent of a URI
24100 6d 61 79 20 63 6f 6e 74 61 69 6e 20 70 61 72 61 may contain para
24110 6d 65 74 65 72 73 20 74 68 61 74 20 61 72 65 20 meters that are
24120 69 6e 74 65 72 70 72 65 74 65 64 0d 0a 2a 2a 20 interpreted..**
24130 65 69 74 68 65 72 20 62 79 20 53 51 4c 69 74 65 either by SQLite
24140 20 69 74 73 65 6c 66 2c 20 6f 72 20 62 79 20 61 itself, or by a
24150 20 5b 56 46 53 20 7c 20 63 75 73 74 6f 6d 20 56 [VFS | custom V
24160 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f FS implementatio
24170 6e 5d 2e 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 69 n]...** SQLite i
24180 6e 74 65 72 70 72 65 74 73 20 74 68 65 20 66 6f nterprets the fo
24190 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 71 75 llowing three qu
241a0 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 3a 0d ery parameters:.
241b0 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a .**..** <ul>..**
241c0 20 20 20 3c 6c 69 3e 20 3c 62 3e 76 66 73 3c 2f <li> <b>vfs</
241d0 62 3e 3a 20 5e 54 68 65 20 22 76 66 73 22 20 70 b>: ^The "vfs" p
241e0 61 72 61 6d 65 74 65 72 20 6d 61 79 20 62 65 20 arameter may be
241f0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 used to specify
24200 74 68 65 20 6e 61 6d 65 20 6f 66 0d 0a 2a 2a 20 the name of..**
24210 20 20 20 20 61 20 56 46 53 20 6f 62 6a 65 63 74 a VFS object
24220 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 that provides t
24230 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 he operating sys
24240 74 65 6d 20 69 6e 74 65 72 66 61 63 65 20 74 68 tem interface th
24250 61 74 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 at should..**
24260 20 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 be used to acc
24270 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 ess the database
24280 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 5e file on disk. ^
24290 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 If this option i
242a0 73 20 73 65 74 20 74 6f 0d 0a 2a 2a 20 20 20 20 s set to..**
242b0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 an empty string
242c0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 the default VFS
242d0 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 2e object is used.
242e0 20 5e 53 70 65 63 69 66 79 69 6e 67 20 61 6e 20 ^Specifying an
242f0 75 6e 6b 6e 6f 77 6e 0d 0a 2a 2a 20 20 20 20 20 unknown..**
24300 56 46 53 20 69 73 20 61 6e 20 65 72 72 6f 72 2e VFS is an error.
24310 20 5e 49 66 20 73 71 6c 69 74 65 33 5f 6f 70 65 ^If sqlite3_ope
24320 6e 5f 76 32 28 29 20 69 73 20 75 73 65 64 20 61 n_v2() is used a
24330 6e 64 20 74 68 65 20 76 66 73 20 6f 70 74 69 6f nd the vfs optio
24340 6e 20 69 73 0d 0a 2a 2a 20 20 20 20 20 70 72 65 n is..** pre
24350 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 56 sent, then the V
24360 46 53 20 73 70 65 63 69 66 69 65 64 20 62 79 20 FS specified by
24370 74 68 65 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 the option takes
24380 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 precedence over
24390 0d 0a 2a 2a 20 20 20 20 20 74 68 65 20 76 61 6c ..** the val
243a0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 ue passed as the
243b0 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 fourth paramete
243c0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 r to sqlite3_ope
243d0 6e 5f 76 32 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 n_v2()...**..**
243e0 20 20 3c 6c 69 3e 20 3c 62 3e 6d 6f 64 65 3c 2f <li> <b>mode</
243f0 62 3e 3a 20 5e 28 54 68 65 20 6d 6f 64 65 20 70 b>: ^(The mode p
24400 61 72 61 6d 65 74 65 72 20 6d 61 79 20 62 65 20 arameter may be
24410 73 65 74 20 74 6f 20 65 69 74 68 65 72 20 22 72 set to either "r
24420 6f 22 2c 20 22 72 77 22 20 6f 72 0d 0a 2a 2a 20 o", "rw" or..**
24430 20 20 20 20 22 72 77 63 22 2e 20 41 74 74 65 6d "rwc". Attem
24440 70 74 69 6e 67 20 74 6f 20 73 65 74 20 69 74 20 pting to set it
24450 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 76 61 6c to any other val
24460 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 29 5e ue is an error)^
24470 2e 20 0d 0a 2a 2a 20 20 20 20 20 5e 49 66 20 22 . ..** ^If "
24480 72 6f 22 20 69 73 20 73 70 65 63 69 66 69 65 64 ro" is specified
24490 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 , then the datab
244a0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f ase is opened fo
244b0 72 20 72 65 61 64 2d 6f 6e 6c 79 20 0d 0a 2a 2a r read-only ..**
244c0 20 20 20 20 20 61 63 63 65 73 73 2c 20 6a 75 73 access, jus
244d0 74 20 61 73 20 69 66 20 74 68 65 20 5b 53 51 4c t as if the [SQL
244e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c ITE_OPEN_READONL
244f0 59 5d 20 66 6c 61 67 20 68 61 64 20 62 65 65 6e Y] flag had been
24500 20 73 65 74 20 69 6e 20 74 68 65 20 0d 0a 2a 2a set in the ..**
24510 20 20 20 20 20 74 68 69 72 64 20 61 72 67 75 6d third argum
24520 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 70 ent to sqlite3_p
24530 72 65 70 61 72 65 5f 76 32 28 29 2e 20 5e 49 66 repare_v2(). ^If
24540 20 74 68 65 20 6d 6f 64 65 20 6f 70 74 69 6f 6e the mode option
24550 20 69 73 20 73 65 74 20 74 6f 20 0d 0a 2a 2a 20 is set to ..**
24560 20 20 20 20 22 72 77 22 2c 20 74 68 65 6e 20 74 "rw", then t
24570 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f he database is o
24580 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2d 77 pened for read-w
24590 72 69 74 65 20 28 62 75 74 20 6e 6f 74 20 63 72 rite (but not cr
245a0 65 61 74 65 29 20 0d 0a 2a 2a 20 20 20 20 20 61 eate) ..** a
245b0 63 63 65 73 73 2c 20 61 73 20 69 66 20 53 51 4c ccess, as if SQL
245c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 ITE_OPEN_READWRI
245d0 54 45 20 28 62 75 74 20 6e 6f 74 20 53 51 4c 49 TE (but not SQLI
245e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 20 TE_OPEN_CREATE)
245f0 68 61 64 20 0d 0a 2a 2a 20 20 20 20 20 62 65 65 had ..** bee
24600 6e 20 73 65 74 2e 20 5e 56 61 6c 75 65 20 22 72 n set. ^Value "r
24610 77 63 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e wc" is equivalen
24620 74 20 74 6f 20 73 65 74 74 69 6e 67 20 62 6f 74 t to setting bot
24630 68 20 0d 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 h ..** SQLIT
24640 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 E_OPEN_READWRITE
24650 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e and SQLITE_OPEN
24660 5f 43 52 45 41 54 45 2e 20 5e 49 66 20 73 71 6c _CREATE. ^If sql
24670 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 69 ite3_open_v2() i
24680 73 20 0d 0a 2a 2a 20 20 20 20 20 75 73 65 64 2c s ..** used,
24690 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 it is an error
246a0 74 6f 20 73 70 65 63 69 66 79 20 61 20 76 61 6c to specify a val
246b0 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 64 65 20 ue for the mode
246c0 70 61 72 61 6d 65 74 65 72 20 74 68 61 74 20 69 parameter that i
246d0 73 20 0d 0a 2a 2a 20 20 20 20 20 6c 65 73 73 20 s ..** less
246e0 72 65 73 74 72 69 63 74 69 76 65 20 74 68 61 6e restrictive than
246f0 20 74 68 61 74 20 73 70 65 63 69 66 69 65 64 20 that specified
24700 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 73 by the flags pas
24710 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64 sed as the third
24720 20 0d 0a 2a 2a 20 20 20 20 20 70 61 72 61 6d 65 ..** parame
24730 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c ter...**..** <
24740 6c 69 3e 20 3c 62 3e 63 61 63 68 65 3c 2f 62 3e li> <b>cache</b>
24750 3a 20 5e 54 68 65 20 63 61 63 68 65 20 70 61 72 : ^The cache par
24760 61 6d 65 74 65 72 20 6d 61 79 20 62 65 20 73 65 ameter may be se
24770 74 20 74 6f 20 65 69 74 68 65 72 20 22 73 68 61 t to either "sha
24780 72 65 64 22 20 6f 72 0d 0a 2a 2a 20 20 20 20 20 red" or..**
24790 22 70 72 69 76 61 74 65 22 2e 20 5e 53 65 74 74 "private". ^Sett
247a0 69 6e 67 20 69 74 20 74 6f 20 22 73 68 61 72 65 ing it to "share
247b0 64 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 d" is equivalent
247c0 20 74 6f 20 73 65 74 74 69 6e 67 20 74 68 65 0d to setting the.
247d0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f .** SQLITE_O
247e0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 PEN_SHAREDCACHE
247f0 62 69 74 20 69 6e 20 74 68 65 20 66 6c 61 67 73 bit in the flags
24800 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 argument passed
24810 20 74 6f 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 to..** sqli
24820 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 20 5e te3_open_v2(). ^
24830 53 65 74 74 69 6e 67 20 74 68 65 20 63 61 63 68 Setting the cach
24840 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 22 e parameter to "
24850 70 72 69 76 61 74 65 22 20 69 73 20 0d 0a 2a 2a private" is ..**
24860 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20 equivalent
24870 74 6f 20 73 65 74 74 69 6e 67 20 74 68 65 20 53 to setting the S
24880 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 QLITE_OPEN_PRIVA
24890 54 45 43 41 43 48 45 20 62 69 74 2e 0d 0a 2a 2a TECACHE bit...**
248a0 20 20 20 20 20 5e 49 66 20 73 71 6c 69 74 65 33 ^If sqlite3
248b0 5f 6f 70 65 6e 5f 76 32 28 29 20 69 73 20 75 73 _open_v2() is us
248c0 65 64 20 61 6e 64 20 74 68 65 20 22 63 61 63 68 ed and the "cach
248d0 65 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 e" parameter is
248e0 70 72 65 73 65 6e 74 20 69 6e 0d 0a 2a 2a 20 20 present in..**
248f0 20 20 20 61 20 55 52 49 20 66 69 6c 65 6e 61 6d a URI filenam
24900 65 2c 20 69 74 73 20 76 61 6c 75 65 20 6f 76 65 e, its value ove
24910 72 72 69 64 65 73 20 61 6e 79 20 62 65 68 61 76 rrides any behav
24920 69 6f 75 72 20 72 65 71 75 65 73 74 65 64 20 62 iour requested b
24930 79 20 73 65 74 74 69 6e 67 0d 0a 2a 2a 20 20 20 y setting..**
24940 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 SQLITE_OPEN_PR
24950 49 56 41 54 45 43 41 43 48 45 20 6f 72 20 53 51 IVATECACHE or SQ
24960 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 LITE_OPEN_SHARED
24970 43 41 43 48 45 20 66 6c 61 67 2e 0d 0a 2a 2a 20 CACHE flag...**
24980 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 </ul>..**..** ^S
24990 70 65 63 69 66 79 69 6e 67 20 61 6e 20 75 6e 6b pecifying an unk
249a0 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 20 69 nown parameter i
249b0 6e 20 74 68 65 20 71 75 65 72 79 20 63 6f 6d 70 n the query comp
249c0 6f 6e 65 6e 74 20 6f 66 20 61 20 55 52 49 20 69 onent of a URI i
249d0 73 20 6e 6f 74 20 61 6e 0d 0a 2a 2a 20 65 72 72 s not an..** err
249e0 6f 72 2e 20 20 46 75 74 75 72 65 20 76 65 72 73 or. Future vers
249f0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 6d ions of SQLite m
24a00 69 67 68 74 20 75 6e 64 65 72 73 74 61 6e 64 20 ight understand
24a10 61 64 64 69 74 69 6f 6e 61 6c 20 71 75 65 72 79 additional query
24a20 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 2e ..** parameters.
24a30 20 20 53 65 65 20 22 5b 71 75 65 72 79 20 70 61 See "[query pa
24a40 72 61 6d 65 74 65 72 73 20 77 69 74 68 20 73 70 rameters with sp
24a50 65 63 69 61 6c 20 6d 65 61 6e 69 6e 67 20 74 6f ecial meaning to
24a60 20 53 51 4c 69 74 65 5d 22 20 66 6f 72 0d 0a 2a SQLite]" for..*
24a70 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 * additional inf
24a80 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a ormation...**..*
24a90 2a 20 5b 5b 55 52 49 20 66 69 6c 65 6e 61 6d 65 * [[URI filename
24aa0 20 65 78 61 6d 70 6c 65 73 5d 5d 20 3c 68 33 3e examples]] <h3>
24ab0 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 65 78 61 URI filename exa
24ac0 6d 70 6c 65 73 3c 2f 68 33 3e 0d 0a 2a 2a 0d 0a mples</h3>..**..
24ad0 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 ** <table border
24ae0 3d 22 31 22 20 61 6c 69 67 6e 3d 63 65 6e 74 65 ="1" align=cente
24af0 72 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 35 3e r cellpadding=5>
24b00 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 68 3e 20 55 52 ..** <tr><th> UR
24b10 49 20 66 69 6c 65 6e 61 6d 65 73 20 3c 74 68 3e I filenames <th>
24b20 20 52 65 73 75 6c 74 73 0d 0a 2a 2a 20 3c 74 72 Results..** <tr
24b30 3e 3c 74 64 3e 20 66 69 6c 65 3a 64 61 74 61 2e ><td> file:data.
24b40 64 62 20 3c 74 64 3e 20 0d 0a 2a 2a 20 20 20 20 db <td> ..**
24b50 20 20 20 20 20 20 4f 70 65 6e 20 74 68 65 20 66 Open the f
24b60 69 6c 65 20 22 64 61 74 61 2e 64 62 22 20 69 6e ile "data.db" in
24b70 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 the current dir
24b80 65 63 74 6f 72 79 2e 0d 0a 2a 2a 20 3c 74 72 3e ectory...** <tr>
24b90 3c 74 64 3e 20 66 69 6c 65 3a 2f 68 6f 6d 65 2f <td> file:/home/
24ba0 66 72 65 64 2f 64 61 74 61 2e 64 62 3c 62 72 3e fred/data.db<br>
24bb0 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 ..** fi
24bc0 6c 65 3a 2f 2f 2f 68 6f 6d 65 2f 66 72 65 64 2f le:///home/fred/
24bd0 64 61 74 61 2e 64 62 20 3c 62 72 3e 20 0d 0a 2a data.db <br> ..*
24be0 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 3a * file:
24bf0 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 68 6f 6d 65 //localhost/home
24c00 2f 66 72 65 64 2f 64 61 74 61 2e 64 62 20 3c 62 /fred/data.db <b
24c10 72 3e 20 3c 74 64 3e 20 0d 0a 2a 2a 20 20 20 20 r> <td> ..**
24c20 20 20 20 20 20 20 4f 70 65 6e 20 74 68 65 20 64 Open the d
24c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 2f 68 atabase file "/h
24c40 6f 6d 65 2f 66 72 65 64 2f 64 61 74 61 2e 64 62 ome/fred/data.db
24c50 22 2e 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 "...** <tr><td>
24c60 66 69 6c 65 3a 2f 2f 64 61 72 6b 73 74 61 72 2f file://darkstar/
24c70 68 6f 6d 65 2f 66 72 65 64 2f 64 61 74 61 2e 64 home/fred/data.d
24c80 62 20 3c 74 64 3e 20 0d 0a 2a 2a 20 20 20 20 20 b <td> ..**
24c90 20 20 20 20 20 41 6e 20 65 72 72 6f 72 2e 20 22 An error. "
24ca0 64 61 72 6b 73 74 61 72 22 20 69 73 20 6e 6f 74 darkstar" is not
24cb0 20 61 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 75 a recognized au
24cc0 74 68 6f 72 69 74 79 2e 0d 0a 2a 2a 20 3c 74 72 thority...** <tr
24cd0 3e 3c 74 64 20 73 74 79 6c 65 3d 22 77 68 69 74 ><td style="whit
24ce0 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61 70 22 3e e-space:nowrap">
24cf0 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 ..** f
24d00 69 6c 65 3a 2f 2f 2f 43 3a 2f 44 6f 63 75 6d 65 ile:///C:/Docume
24d10 6e 74 73 25 32 30 61 6e 64 25 32 30 53 65 74 74 nts%20and%20Sett
24d20 69 6e 67 73 2f 66 72 65 64 2f 44 65 73 6b 74 6f ings/fred/Deskto
24d30 70 2f 64 61 74 61 2e 64 62 0d 0a 2a 2a 20 20 20 p/data.db..**
24d40 20 20 3c 74 64 3e 20 57 69 6e 64 6f 77 73 20 6f <td> Windows o
24d50 6e 6c 79 3a 20 4f 70 65 6e 20 74 68 65 20 66 69 nly: Open the fi
24d60 6c 65 20 22 64 61 74 61 2e 64 62 22 20 6f 6e 20 le "data.db" on
24d70 66 72 65 64 27 73 20 64 65 73 6b 74 6f 70 20 6f fred's desktop o
24d80 6e 20 64 72 69 76 65 0d 0a 2a 2a 20 20 20 20 20 n drive..**
24d90 20 20 20 20 20 43 3a 2e 20 4e 6f 74 65 20 74 68 C:. Note th
24da0 61 74 20 74 68 65 20 25 32 30 20 65 73 63 61 70 at the %20 escap
24db0 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d ing in this exam
24dc0 70 6c 65 20 69 73 20 6e 6f 74 20 73 74 72 69 63 ple is not stric
24dd0 74 6c 79 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 tly ..**
24de0 20 20 6e 65 63 65 73 73 61 72 79 20 2d 20 73 70 necessary - sp
24df0 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20 63 ace characters c
24e00 61 6e 20 62 65 20 75 73 65 64 20 6c 69 74 65 72 an be used liter
24e10 61 6c 6c 79 0d 0a 2a 2a 20 20 20 20 20 20 20 20 ally..**
24e20 20 20 69 6e 20 55 52 49 20 66 69 6c 65 6e 61 6d in URI filenam
24e30 65 73 2e 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e es...** <tr><td>
24e40 20 66 69 6c 65 3a 64 61 74 61 2e 64 62 3f 6d 6f file:data.db?mo
24e50 64 65 3d 72 6f 26 63 61 63 68 65 3d 70 72 69 76 de=ro&cache=priv
24e60 61 74 65 20 3c 74 64 3e 20 0d 0a 2a 2a 20 20 20 ate <td> ..**
24e70 20 20 20 20 20 20 20 4f 70 65 6e 20 66 69 6c 65 Open file
24e80 20 22 64 61 74 61 2e 64 62 22 20 69 6e 20 74 68 "data.db" in th
24e90 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 e current direct
24ea0 6f 72 79 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c ory for read-onl
24eb0 79 20 61 63 63 65 73 73 2e 0d 0a 2a 2a 20 20 20 y access...**
24ec0 20 20 20 20 20 20 20 52 65 67 61 72 64 6c 65 73 Regardles
24ed0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 s of whether or
24ee0 6e 6f 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 not shared-cache
24ef0 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 mode is enabled
24f00 20 62 79 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 by..**
24f10 20 64 65 66 61 75 6c 74 2c 20 75 73 65 20 61 20 default, use a
24f20 70 72 69 76 61 74 65 20 63 61 63 68 65 2e 0d 0a private cache...
24f30 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 66 69 6c 65 ** <tr><td> file
24f40 3a 2f 68 6f 6d 65 2f 66 72 65 64 2f 64 61 74 61 :/home/fred/data
24f50 2e 64 62 3f 76 66 73 3d 75 6e 69 78 2d 6e 6f 6c .db?vfs=unix-nol
24f60 6f 63 6b 20 3c 74 64 3e 0d 0a 2a 2a 20 20 20 20 ock <td>..**
24f70 20 20 20 20 20 20 4f 70 65 6e 20 66 69 6c 65 20 Open file
24f80 22 2f 68 6f 6d 65 2f 66 72 65 64 2f 64 61 74 61 "/home/fred/data
24f90 2e 64 62 22 2e 20 55 73 65 20 74 68 65 20 73 70 .db". Use the sp
24fa0 65 63 69 61 6c 20 56 46 53 20 22 75 6e 69 78 2d ecial VFS "unix-
24fb0 6e 6f 6c 6f 63 6b 22 2e 0d 0a 2a 2a 20 3c 74 72 nolock"...** <tr
24fc0 3e 3c 74 64 3e 20 66 69 6c 65 3a 64 61 74 61 2e ><td> file:data.
24fd0 64 62 3f 6d 6f 64 65 3d 72 65 61 64 6f 6e 6c 79 db?mode=readonly
24fe0 20 3c 74 64 3e 20 0d 0a 2a 2a 20 20 20 20 20 20 <td> ..**
24ff0 20 20 20 20 41 6e 20 65 72 72 6f 72 2e 20 22 72 An error. "r
25000 65 61 64 6f 6e 6c 79 22 20 69 73 20 6e 6f 74 20 eadonly" is not
25010 61 20 76 61 6c 69 64 20 6f 70 74 69 6f 6e 20 66 a valid option f
25020 6f 72 20 74 68 65 20 22 6d 6f 64 65 22 20 70 61 or the "mode" pa
25030 72 61 6d 65 74 65 72 2e 0d 0a 2a 2a 20 3c 2f 74 rameter...** </t
25040 61 62 6c 65 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 55 able>..**..** ^U
25050 52 49 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 RI hexadecimal e
25060 73 63 61 70 65 20 73 65 71 75 65 6e 63 65 73 20 scape sequences
25070 28 25 48 48 29 20 61 72 65 20 73 75 70 70 6f 72 (%HH) are suppor
25080 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 70 ted within the p
25090 61 74 68 20 61 6e 64 0d 0a 2a 2a 20 71 75 65 72 ath and..** quer
250a0 79 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 y components of
250b0 61 20 55 52 49 2e 20 41 20 68 65 78 61 64 65 63 a URI. A hexadec
250c0 69 6d 61 6c 20 65 73 63 61 70 65 20 73 65 71 75 imal escape sequ
250d0 65 6e 63 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 ence consists of
250e0 20 61 0d 0a 2a 2a 20 70 65 72 63 65 6e 74 20 73 a..** percent s
250f0 69 67 6e 20 2d 20 22 25 22 20 2d 20 66 6f 6c 6c ign - "%" - foll
25100 6f 77 65 64 20 62 79 20 65 78 61 63 74 6c 79 20 owed by exactly
25110 74 77 6f 20 68 65 78 61 64 65 63 69 6d 61 6c 20 two hexadecimal
25120 64 69 67 69 74 73 20 0d 0a 2a 2a 20 73 70 65 63 digits ..** spec
25130 69 66 79 69 6e 67 20 61 6e 20 6f 63 74 65 74 20 ifying an octet
25140 76 61 6c 75 65 2e 20 5e 42 65 66 6f 72 65 20 74 value. ^Before t
25150 68 65 20 70 61 74 68 20 6f 72 20 71 75 65 72 79 he path or query
25160 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 components of a
25170 0d 0a 2a 2a 20 55 52 49 20 66 69 6c 65 6e 61 6d ..** URI filenam
25180 65 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 e are interprete
25190 64 2c 20 74 68 65 79 20 61 72 65 20 65 6e 63 6f d, they are enco
251a0 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d 38 20 ded using UTF-8
251b0 61 6e 64 20 61 6c 6c 20 0d 0a 2a 2a 20 68 65 78 and all ..** hex
251c0 61 64 65 63 69 6d 61 6c 20 65 73 63 61 70 65 20 adecimal escape
251d0 73 65 71 75 65 6e 63 65 73 20 72 65 70 6c 61 63 sequences replac
251e0 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20 62 ed by a single b
251f0 79 74 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 yte containing t
25200 68 65 0d 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e he..** correspon
25210 64 69 6e 67 20 6f 63 74 65 74 2e 20 49 66 20 74 ding octet. If t
25220 68 69 73 20 70 72 6f 63 65 73 73 20 67 65 6e 65 his process gene
25230 72 61 74 65 73 20 61 6e 20 69 6e 76 61 6c 69 64 rates an invalid
25240 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 2c UTF-8 encoding,
25250 0d 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 73 ..** the results
25260 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0d are undefined..
25270 0a 2a 2a 0d 0a 2a 2a 20 3c 62 3e 4e 6f 74 65 20 .**..** <b>Note
25280 74 6f 20 57 69 6e 64 6f 77 73 20 75 73 65 72 73 to Windows users
25290 3a 3c 2f 62 3e 20 20 54 68 65 20 65 6e 63 6f 64 :</b> The encod
252a0 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 65 ing used for the
252b0 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 filename argume
252c0 6e 74 0d 0a 2a 2a 20 6f 66 20 73 71 6c 69 74 65 nt..** of sqlite
252d0 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 3_open() and sql
252e0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 6d ite3_open_v2() m
252f0 75 73 74 20 62 65 20 55 54 46 2d 38 2c 20 6e 6f ust be UTF-8, no
25300 74 20 77 68 61 74 65 76 65 72 0d 0a 2a 2a 20 63 t whatever..** c
25310 6f 64 65 70 61 67 65 20 69 73 20 63 75 72 72 65 odepage is curre
25320 6e 74 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 46 ntly defined. F
25330 69 6c 65 6e 61 6d 65 73 20 63 6f 6e 74 61 69 6e ilenames contain
25340 69 6e 67 20 69 6e 74 65 72 6e 61 74 69 6f 6e 61 ing internationa
25350 6c 0d 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 l..** characters
25360 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 must be convert
25370 65 64 20 74 6f 20 55 54 46 2d 38 20 70 72 69 6f ed to UTF-8 prio
25380 72 20 74 6f 20 70 61 73 73 69 6e 67 20 74 68 65 r to passing the
25390 6d 20 69 6e 74 6f 0d 0a 2a 2a 20 73 71 6c 69 74 m into..** sqlit
253a0 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c e3_open() or sql
253b0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 0d ite3_open_v2()..
253c0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
253d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e int sqlite3_open
253e0 28 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 (.. const char
253f0 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 *filename, /*
25400 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d Database filenam
25410 65 20 28 55 54 46 2d 38 29 20 2a 2f 0d 0a 20 20 e (UTF-8) */..
25420 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 20 sqlite3 **ppDb
25430 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
25440 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 SQLite db handle
25450 20 2a 2f 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f */..);..SQLITE_
25460 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
25470 6f 70 65 6e 31 36 28 0d 0a 20 20 63 6f 6e 73 74 open16(.. const
25480 20 76 6f 69 64 20 2a 66 69 6c 65 6e 61 6d 65 2c void *filename,
25490 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 /* Database f
254a0 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 31 36 29 ilename (UTF-16)
254b0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a */.. sqlite3 *
254c0 2a 70 70 44 62 20 20 20 20 20 20 20 20 20 20 2f *ppDb /
254d0 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 * OUT: SQLite db
254e0 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 29 3b 0d 0a handle */..);..
254f0 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
25500 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0d qlite3_open_v2(.
25510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 . const char *f
25520 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 ilename, /* Da
25530 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 tabase filename
25540 28 55 54 46 2d 38 29 20 2a 2f 0d 0a 20 20 73 71 (UTF-8) */.. sq
25550 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 lite3 **ppDb,
25560 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 /* OUT: SQ
25570 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a Lite db handle *
25580 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 /.. int flags,
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
255a0 46 6c 61 67 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 Flags */.. cons
255b0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 t char *zVfs
255c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 /* Name of V
255d0 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 FS module to use
255e0 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..);..../*..*
255f0 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 * CAPI3REF: Obta
25600 69 6e 20 56 61 6c 75 65 73 20 46 6f 72 20 55 52 in Values For UR
25610 49 20 50 61 72 61 6d 65 74 65 72 73 0d 0a 2a 2a I Parameters..**
25620 0d 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 75 ..** These are u
25630 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73 2c tility routines,
25640 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 useful to VFS i
25650 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 mplementations,
25660 74 68 61 74 20 63 68 65 63 6b 0d 0a 2a 2a 20 74 that check..** t
25670 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 o see if a datab
25680 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 ase file was a U
25690 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 RI that containe
256a0 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 d a specific que
256b0 72 79 20 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 ry ..** paramete
256c0 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 r, and if so obt
256d0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f ains the value o
256e0 66 20 74 68 61 74 20 71 75 65 72 79 20 70 61 72 f that query par
256f0 61 6d 65 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ameter...**..**
25700 49 66 20 46 20 69 73 20 74 68 65 20 64 61 74 61 If F is the data
25710 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f base filename po
25720 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 inter passed int
25730 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 o the xOpen() me
25740 74 68 6f 64 20 6f 66 20 0d 0a 2a 2a 20 61 20 56 thod of ..** a V
25750 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f FS implementatio
25760 6e 20 77 68 65 6e 20 74 68 65 20 66 6c 61 67 73 n when the flags
25770 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 4f parameter to xO
25780 70 65 6e 28 29 20 68 61 73 20 6f 6e 65 20 6f 72 pen() has one or
25790 20 0d 0a 2a 2a 20 6d 6f 72 65 20 6f 66 20 74 68 ..** more of th
257a0 65 20 5b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 e [SQLITE_OPEN_U
257b0 52 49 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 4f RI] or [SQLITE_O
257c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 5d 20 62 69 74 PEN_MAIN_DB] bit
257d0 73 20 73 65 74 20 61 6e 64 0d 0a 2a 2a 20 50 20 s set and..** P
257e0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 is the name of t
257f0 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 he query paramet
25800 65 72 2c 20 74 68 65 6e 0d 0a 2a 2a 20 73 71 6c er, then..** sql
25810 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 ite3_uri_paramet
25820 65 72 28 46 2c 50 29 20 72 65 74 75 72 6e 73 20 er(F,P) returns
25830 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 the value of the
25840 20 50 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 P..** parameter
25850 20 69 66 20 69 74 20 65 78 69 73 74 73 20 6f 72 if it exists or
25860 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 a NULL pointer
25870 69 66 20 50 20 64 6f 65 73 20 6e 6f 74 20 61 70 if P does not ap
25880 70 65 61 72 20 61 73 20 61 20 0d 0a 2a 2a 20 71 pear as a ..** q
25890 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6f uery parameter o
258a0 6e 20 46 2e 20 20 49 66 20 50 20 69 73 20 61 20 n F. If P is a
258b0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 query parameter
258c0 6f 66 20 46 0d 0a 2a 2a 20 68 61 73 20 6e 6f 20 of F..** has no
258d0 65 78 70 6c 69 63 69 74 20 76 61 6c 75 65 2c 20 explicit value,
258e0 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 75 72 69 then sqlite3_uri
258f0 5f 70 61 72 61 6d 65 74 65 72 28 46 2c 50 29 20 _parameter(F,P)
25900 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 61 20 70 6f returns..** a po
25910 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 6d 70 74 inter to an empt
25920 79 20 73 74 72 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a y string...**..*
25930 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 75 72 * The sqlite3_ur
25940 69 5f 62 6f 6f 6c 65 61 6e 28 46 2c 50 2c 42 29 i_boolean(F,P,B)
25950 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 routine assumes
25960 20 74 68 61 74 20 50 20 69 73 20 61 20 62 6f 6f that P is a boo
25970 6c 65 61 6e 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 lean..** paramet
25980 65 72 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 er and returns t
25990 72 75 65 20 28 31 29 20 6f 72 20 66 61 6c 73 65 rue (1) or false
259a0 20 28 30 29 20 61 63 63 6f 72 64 69 6e 67 20 74 (0) according t
259b0 6f 20 74 68 65 20 76 61 6c 75 65 0d 0a 2a 2a 20 o the value..**
259c0 6f 66 20 50 2e 20 20 54 68 65 20 76 61 6c 75 65 of P. The value
259d0 20 6f 66 20 50 20 69 73 20 74 72 75 65 20 69 66 of P is true if
259e0 20 69 74 20 69 73 20 22 79 65 73 22 20 6f 72 20 it is "yes" or
259f0 22 74 72 75 65 22 20 6f 72 20 22 6f 6e 22 20 6f "true" or "on" o
25a00 72 20 0d 0a 2a 2a 20 61 20 6e 6f 6e 2d 7a 65 72 r ..** a non-zer
25a10 6f 20 6e 75 6d 62 65 72 20 61 6e 64 20 69 73 20 o number and is
25a20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e false otherwise.
25a30 20 20 49 66 20 50 20 69 73 20 6e 6f 74 20 61 20 If P is not a
25a40 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 0d query parameter.
25a50 0a 2a 2a 20 6f 6e 20 46 20 74 68 65 6e 20 73 71 .** on F then sq
25a60 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 lite3_uri_boolea
25a70 6e 28 46 2c 50 2c 42 29 20 72 65 74 75 72 6e 73 n(F,P,B) returns
25a80 20 28 42 21 3d 30 29 2e 0d 0a 2a 2a 0d 0a 2a 2a (B!=0)...**..**
25a90 20 54 68 65 20 73 71 6c 69 74 65 33 5f 75 72 69 The sqlite3_uri
25aa0 5f 69 6e 74 36 34 28 46 2c 50 2c 44 29 20 72 6f _int64(F,P,D) ro
25ab0 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 74 utine converts t
25ac0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 20 69 6e he value of P in
25ad0 74 6f 20 61 0d 0a 2a 2a 20 36 34 2d 62 69 74 20 to a..** 64-bit
25ae0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 signed integer a
25af0 6e 64 20 72 65 74 75 72 6e 73 20 74 68 61 74 20 nd returns that
25b00 69 6e 74 65 67 65 72 2c 20 6f 72 20 44 20 69 66 integer, or D if
25b10 20 50 20 64 6f 65 73 20 6e 6f 74 0d 0a 2a 2a 20 P does not..**
25b20 65 78 69 73 74 2e 20 20 49 66 20 74 68 65 20 76 exist. If the v
25b30 61 6c 75 65 20 6f 66 20 50 20 69 73 20 73 6f 6d alue of P is som
25b40 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 ething other tha
25b50 6e 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 n an integer, th
25b60 65 6e 0d 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 en..** zero is r
25b70 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 0d 0a 2a eturned...** ..*
25b80 2a 20 49 66 20 46 20 69 73 20 61 20 4e 55 4c 4c * If F is a NULL
25b90 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 6e 20 73 pointer, then s
25ba0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d qlite3_uri_param
25bb0 65 74 65 72 28 46 2c 50 29 20 72 65 74 75 72 6e eter(F,P) return
25bc0 73 20 4e 55 4c 4c 20 61 6e 64 0d 0a 2a 2a 20 73 s NULL and..** s
25bd0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 qlite3_uri_boole
25be0 61 6e 28 46 2c 50 2c 42 29 20 72 65 74 75 72 6e an(F,P,B) return
25bf0 73 20 42 2e 20 20 49 66 20 46 20 69 73 20 6e 6f s B. If F is no
25c00 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 t a NULL pointer
25c10 20 61 6e 64 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 and..** is not
25c20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 a database file
25c30 70 61 74 68 6e 61 6d 65 20 70 6f 69 6e 74 65 72 pathname pointer
25c40 20 74 68 61 74 20 53 51 4c 69 74 65 20 70 61 73 that SQLite pas
25c50 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 sed into the xOp
25c60 65 6e 0d 0a 2a 2a 20 56 46 53 20 6d 65 74 68 6f en..** VFS metho
25c70 64 2c 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 d, then the beha
25c80 76 69 6f 72 20 6f 66 20 74 68 69 73 20 72 6f 75 vior of this rou
25c90 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 tine is undefine
25ca0 64 20 61 6e 64 20 70 72 6f 62 61 62 6c 79 0d 0a d and probably..
25cb0 2a 2a 20 75 6e 64 65 73 69 72 61 62 6c 65 2e 0d ** undesirable..
25cc0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
25cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 const char *sqli
25ce0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 te3_uri_paramete
25cf0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 r(const char *zF
25d00 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 ilename, const c
25d10 68 61 72 20 2a 7a 50 61 72 61 6d 29 3b 0d 0a 53 har *zParam);..S
25d20 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
25d30 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 lite3_uri_boolea
25d40 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 n(const char *zF
25d50 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ile, const char
25d60 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 65 *zParam, int bDe
25d70 66 61 75 6c 74 29 3b 0d 0a 53 51 4c 49 54 45 5f fault);..SQLITE_
25d80 41 50 49 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 API sqlite3_int6
25d90 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 4 sqlite3_uri_in
25da0 74 36 34 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c t64(const char*,
25db0 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 const char*, sq
25dc0 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0d 0a 0d lite3_int64);...
25dd0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 .../*..** CAPI3R
25de0 45 46 3a 20 45 72 72 6f 72 20 43 6f 64 65 73 20 EF: Error Codes
25df0 41 6e 64 20 4d 65 73 73 61 67 65 73 0d 0a 2a 2a And Messages..**
25e00 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 ..** ^The sqlite
25e10 33 5f 65 72 72 63 6f 64 65 28 29 20 69 6e 74 65 3_errcode() inte
25e20 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 74 68 rface returns th
25e30 65 20 6e 75 6d 65 72 69 63 20 5b 72 65 73 75 6c e numeric [resul
25e40 74 20 63 6f 64 65 5d 20 6f 72 0d 0a 2a 2a 20 5b t code] or..** [
25e50 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 extended result
25e60 63 6f 64 65 5d 20 66 6f 72 20 74 68 65 20 6d 6f code] for the mo
25e70 73 74 20 72 65 63 65 6e 74 20 66 61 69 6c 65 64 st recent failed
25e80 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 sqlite3_* API c
25e90 61 6c 6c 0d 0a 2a 2a 20 61 73 73 6f 63 69 61 74 all..** associat
25ea0 65 64 20 77 69 74 68 20 61 20 5b 64 61 74 61 62 ed with a [datab
25eb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 2e ase connection].
25ec0 20 49 66 20 61 20 70 72 69 6f 72 20 41 50 49 20 If a prior API
25ed0 63 61 6c 6c 20 66 61 69 6c 65 64 0d 0a 2a 2a 20 call failed..**
25ee0 62 75 74 20 74 68 65 20 6d 6f 73 74 20 72 65 63 but the most rec
25ef0 65 6e 74 20 41 50 49 20 63 61 6c 6c 20 73 75 63 ent API call suc
25f00 63 65 65 64 65 64 2c 20 74 68 65 20 72 65 74 75 ceeded, the retu
25f10 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0d 0a 2a rn value from..*
25f20 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 * sqlite3_errcod
25f30 65 28 29 20 69 73 20 75 6e 64 65 66 69 6e 65 64 e() is undefined
25f40 2e 20 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f . ^The sqlite3_
25f50 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 extended_errcode
25f60 28 29 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 ()..** interface
25f70 20 69 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 is the same exc
25f80 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 77 61 ept that it alwa
25f90 79 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 0d ys returns the .
25fa0 0a 2a 2a 20 5b 65 78 74 65 6e 64 65 64 20 72 65 .** [extended re
25fb0 73 75 6c 74 20 63 6f 64 65 5d 20 65 76 65 6e 20 sult code] even
25fc0 77 68 65 6e 20 65 78 74 65 6e 64 65 64 20 72 65 when extended re
25fd0 73 75 6c 74 20 63 6f 64 65 73 20 61 72 65 0d 0a sult codes are..
25fe0 2a 2a 20 64 69 73 61 62 6c 65 64 2e 0d 0a 2a 2a ** disabled...**
25ff0 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 ..** ^The sqlite
26000 33 5f 65 72 72 6d 73 67 28 29 20 61 6e 64 20 73 3_errmsg() and s
26010 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 qlite3_errmsg16(
26020 29 20 72 65 74 75 72 6e 20 45 6e 67 6c 69 73 68 ) return English
26030 2d 6c 61 6e 67 75 61 67 65 0d 0a 2a 2a 20 74 65 -language..** te
26040 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65 xt that describe
26050 73 20 74 68 65 20 65 72 72 6f 72 2c 20 61 73 20 s the error, as
26060 65 69 74 68 65 72 20 55 54 46 2d 38 20 6f 72 20 either UTF-8 or
26070 55 54 46 2d 31 36 20 72 65 73 70 65 63 74 69 76 UTF-16 respectiv
26080 65 6c 79 2e 0d 0a 2a 2a 20 5e 28 4d 65 6d 6f 72 ely...** ^(Memor
26090 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 72 y to hold the er
260a0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 ror message stri
260b0 6e 67 20 69 73 20 6d 61 6e 61 67 65 64 20 69 6e ng is managed in
260c0 74 65 72 6e 61 6c 6c 79 2e 0d 0a 2a 2a 20 54 68 ternally...** Th
260d0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f e application do
260e0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 77 es not need to w
260f0 6f 72 72 79 20 61 62 6f 75 74 20 66 72 65 65 69 orry about freei
26100 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a ng the result...
26110 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 ** However, the
26120 65 72 72 6f 72 20 73 74 72 69 6e 67 20 6d 69 67 error string mig
26130 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 ht be overwritte
26140 6e 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 n or deallocated
26150 20 62 79 0d 0a 2a 2a 20 73 75 62 73 65 71 75 65 by..** subseque
26160 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6f 74 68 65 nt calls to othe
26170 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 61 r SQLite interfa
26180 63 65 20 66 75 6e 63 74 69 6f 6e 73 2e 29 5e 0d ce functions.)^.
26190 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 68 65 .**..** When the
261a0 20 73 65 72 69 61 6c 69 7a 65 64 20 5b 74 68 72 serialized [thr
261b0 65 61 64 69 6e 67 20 6d 6f 64 65 5d 20 69 73 20 eading mode] is
261c0 69 6e 20 75 73 65 2c 20 69 74 20 6d 69 67 68 74 in use, it might
261d0 20 62 65 20 74 68 65 0d 0a 2a 2a 20 63 61 73 65 be the..** case
261e0 20 74 68 61 74 20 61 20 73 65 63 6f 6e 64 20 65 that a second e
261f0 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 rror occurs on a
26200 20 73 65 70 61 72 61 74 65 20 74 68 72 65 61 64 separate thread
26210 20 69 6e 20 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 in between..**
26220 74 68 65 20 74 69 6d 65 20 6f 66 20 74 68 65 20 the time of the
26230 66 69 72 73 74 20 65 72 72 6f 72 20 61 6e 64 20 first error and
26240 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 73 the call to thes
26250 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0d 0a 2a e interfaces...*
26260 2a 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 * When that happ
26270 65 6e 73 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 ens, the second
26280 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 error will be re
26290 70 6f 72 74 65 64 20 73 69 6e 63 65 20 74 68 65 ported since the
262a0 73 65 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 se..** interface
262b0 73 20 61 6c 77 61 79 73 20 72 65 70 6f 72 74 20 s always report
262c0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 the most recent
262d0 72 65 73 75 6c 74 2e 20 20 54 6f 20 61 76 6f 69 result. To avoi
262e0 64 0d 0a 2a 2a 20 74 68 69 73 2c 20 65 61 63 68 d..** this, each
262f0 20 74 68 72 65 61 64 20 63 61 6e 20 6f 62 74 61 thread can obta
26300 69 6e 20 65 78 63 6c 75 73 69 76 65 20 75 73 65 in exclusive use
26310 20 6f 66 20 74 68 65 20 5b 64 61 74 61 62 61 73 of the [databas
26320 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 44 0d e connection] D.
26330 0a 2a 2a 20 62 79 20 69 6e 76 6f 6b 69 6e 67 20 .** by invoking
26340 5b 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 [sqlite3_mutex_e
26350 6e 74 65 72 5d 28 5b 73 71 6c 69 74 65 33 5f 64 nter]([sqlite3_d
26360 62 5f 6d 75 74 65 78 5d 28 44 29 29 20 62 65 66 b_mutex](D)) bef
26370 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 0d 0a 2a ore beginning..*
26380 2a 20 74 6f 20 75 73 65 20 44 20 61 6e 64 20 69 * to use D and i
26390 6e 76 6f 6b 69 6e 67 20 5b 73 71 6c 69 74 65 33 nvoking [sqlite3
263a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 5d 28 5b 73 _mutex_leave]([s
263b0 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 5d qlite3_db_mutex]
263c0 28 44 29 29 20 61 66 74 65 72 0d 0a 2a 2a 20 61 (D)) after..** a
263d0 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 ll calls to the
263e0 69 6e 74 65 72 66 61 63 65 73 20 6c 69 73 74 65 interfaces liste
263f0 64 20 68 65 72 65 20 61 72 65 20 63 6f 6d 70 6c d here are compl
26400 65 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 eted...**..** If
26410 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20 66 61 an interface fa
26420 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f ils with SQLITE_
26430 4d 49 53 55 53 45 2c 20 74 68 61 74 20 6d 65 61 MISUSE, that mea
26440 6e 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 ns the interface
26450 0d 0a 2a 2a 20 77 61 73 20 69 6e 76 6f 6b 65 64 ..** was invoked
26460 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 62 79 20 incorrectly by
26470 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e the application.
26480 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 In that case,
26490 74 68 65 0d 0a 2a 2a 20 65 72 72 6f 72 20 63 6f the..** error co
264a0 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 6d de and message m
264b0 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 ay or may not be
264c0 20 73 65 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 set...*/..SQLIT
264d0 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
264e0 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 3_errcode(sqlite
264f0 33 20 2a 64 62 29 3b 0d 0a 53 51 4c 49 54 45 5f 3 *db);..SQLITE_
26500 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
26510 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 extended_errcode
26520 28 73 71 6c 69 74 65 33 20 2a 64 62 29 3b 0d 0a (sqlite3 *db);..
26530 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
26540 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 char *sqlite3_e
26550 72 72 6d 73 67 28 73 71 6c 69 74 65 33 2a 29 3b rrmsg(sqlite3*);
26560 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e ..SQLITE_API con
26570 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 st void *sqlite3
26580 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 _errmsg16(sqlite
26590 33 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 3*);..../*..** C
265a0 41 50 49 33 52 45 46 3a 20 53 51 4c 20 53 74 61 API3REF: SQL Sta
265b0 74 65 6d 65 6e 74 20 4f 62 6a 65 63 74 0d 0a 2a tement Object..*
265c0 2a 20 4b 45 59 57 4f 52 44 53 3a 20 7b 70 72 65 * KEYWORDS: {pre
265d0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 7d pared statement}
265e0 20 7b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 {prepared state
265f0 6d 65 6e 74 73 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 41 ments}..**..** A
26600 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 n instance of th
26610 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 is object repres
26620 65 6e 74 73 20 61 20 73 69 6e 67 6c 65 20 53 51 ents a single SQ
26630 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2a L statement...**
26640 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 This object is
26650 76 61 72 69 6f 75 73 6c 79 20 6b 6e 6f 77 6e 20 variously known
26660 61 73 20 61 20 22 70 72 65 70 61 72 65 64 20 73 as a "prepared s
26670 74 61 74 65 6d 65 6e 74 22 20 6f 72 20 61 0d 0a tatement" or a..
26680 2a 2a 20 22 63 6f 6d 70 69 6c 65 64 20 53 51 4c ** "compiled SQL
26690 20 73 74 61 74 65 6d 65 6e 74 22 20 6f 72 20 73 statement" or s
266a0 69 6d 70 6c 79 20 61 73 20 61 20 22 73 74 61 74 imply as a "stat
266b0 65 6d 65 6e 74 22 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ement"...**..**
266c0 54 68 65 20 6c 69 66 65 20 6f 66 20 61 20 73 74 The life of a st
266d0 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 67 atement object g
266e0 6f 65 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 oes something li
266f0 6b 65 20 74 68 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a ke this:..**..**
26700 20 3c 6f 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 43 <ol>..** <li> C
26710 72 65 61 74 65 20 74 68 65 20 6f 62 6a 65 63 74 reate the object
26720 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f using [sqlite3_
26730 70 72 65 70 61 72 65 5f 76 32 28 29 5d 20 6f 72 prepare_v2()] or
26740 20 61 20 72 65 6c 61 74 65 64 0d 0a 2a 2a 20 20 a related..**
26750 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a function...*
26760 2a 20 3c 6c 69 3e 20 42 69 6e 64 20 76 61 6c 75 * <li> Bind valu
26770 65 73 20 74 6f 20 5b 68 6f 73 74 20 70 61 72 61 es to [host para
26780 6d 65 74 65 72 73 5d 20 75 73 69 6e 67 20 74 68 meters] using th
26790 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 2a e sqlite3_bind_*
267a0 28 29 0d 0a 2a 2a 20 20 20 20 20 20 69 6e 74 65 ()..** inte
267b0 72 66 61 63 65 73 2e 0d 0a 2a 2a 20 3c 6c 69 3e rfaces...** <li>
267c0 20 52 75 6e 20 74 68 65 20 53 51 4c 20 62 79 20 Run the SQL by
267d0 63 61 6c 6c 69 6e 67 20 5b 73 71 6c 69 74 65 33 calling [sqlite3
267e0 5f 73 74 65 70 28 29 5d 20 6f 6e 65 20 6f 72 20 _step()] one or
267f0 6d 6f 72 65 20 74 69 6d 65 73 2e 0d 0a 2a 2a 20 more times...**
26800 3c 6c 69 3e 20 52 65 73 65 74 20 74 68 65 20 73 <li> Reset the s
26810 74 61 74 65 6d 65 6e 74 20 75 73 69 6e 67 20 5b tatement using [
26820 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 5d sqlite3_reset()]
26830 20 74 68 65 6e 20 67 6f 20 62 61 63 6b 0d 0a 2a then go back..*
26840 2a 20 20 20 20 20 20 74 6f 20 73 74 65 70 20 32 * to step 2
26850 2e 20 20 44 6f 20 74 68 69 73 20 7a 65 72 6f 20 . Do this zero
26860 6f 72 20 6d 6f 72 65 20 74 69 6d 65 73 2e 0d 0a or more times...
26870 2a 2a 20 3c 6c 69 3e 20 44 65 73 74 72 6f 79 20 ** <li> Destroy
26880 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 the object using
26890 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 [sqlite3_finali
268a0 7a 65 28 29 5d 2e 0d 0a 2a 2a 20 3c 2f 6f 6c 3e ze()]...** </ol>
268b0 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 66 65 72 20 74 ..**..** Refer t
268c0 6f 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 o documentation
268d0 6f 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 6d 65 on individual me
268e0 74 68 6f 64 73 20 61 62 6f 76 65 20 66 6f 72 20 thods above for
268f0 61 64 64 69 74 69 6f 6e 61 6c 0d 0a 2a 2a 20 69 additional..** i
26900 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d nformation...*/.
26910 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
26920 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 73 71 6c sqlite3_stmt sql
26930 69 74 65 33 5f 73 74 6d 74 3b 0d 0a 0d 0a 2f 2a ite3_stmt;..../*
26940 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 52 ..** CAPI3REF: R
26950 75 6e 2d 74 69 6d 65 20 4c 69 6d 69 74 73 0d 0a un-time Limits..
26960 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 69 73 20 69 6e **..** ^(This in
26970 74 65 72 66 61 63 65 20 61 6c 6c 6f 77 73 20 74 terface allows t
26980 68 65 20 73 69 7a 65 20 6f 66 20 76 61 72 69 6f he size of vario
26990 75 73 20 63 6f 6e 73 74 72 75 63 74 73 20 74 6f us constructs to
269a0 20 62 65 20 6c 69 6d 69 74 65 64 0d 0a 2a 2a 20 be limited..**
269b0 6f 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 on a connection
269c0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 61 by connection ba
269d0 73 69 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 sis. The first
269e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 parameter is the
269f0 0d 0a 2a 2a 20 5b 64 61 74 61 62 61 73 65 20 63 ..** [database c
26a00 6f 6e 6e 65 63 74 69 6f 6e 5d 20 77 68 6f 73 65 onnection] whose
26a10 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 62 65 20 limit is to be
26a20 73 65 74 20 6f 72 20 71 75 65 72 69 65 64 2e 20 set or queried.
26a30 20 54 68 65 0d 0a 2a 2a 20 73 65 63 6f 6e 64 20 The..** second
26a40 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 parameter is one
26a50 20 6f 66 20 74 68 65 20 5b 6c 69 6d 69 74 20 63 of the [limit c
26a60 61 74 65 67 6f 72 69 65 73 5d 20 74 68 61 74 20 ategories] that
26a70 64 65 66 69 6e 65 20 61 0d 0a 2a 2a 20 63 6c 61 define a..** cla
26a80 73 73 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 73 ss of constructs
26a90 20 74 6f 20 62 65 20 73 69 7a 65 20 6c 69 6d 69 to be size limi
26aa0 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 ted. The third
26ab0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 parameter is the
26ac0 0d 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 66 ..** new limit f
26ad0 6f 72 20 74 68 61 74 20 63 6f 6e 73 74 72 75 63 or that construc
26ae0 74 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 t.)^..**..** ^If
26af0 20 74 68 65 20 6e 65 77 20 6c 69 6d 69 74 20 69 the new limit i
26b00 73 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d s a negative num
26b10 62 65 72 2c 20 74 68 65 20 6c 69 6d 69 74 20 69 ber, the limit i
26b20 73 20 75 6e 63 68 61 6e 67 65 64 2e 0d 0a 2a 2a s unchanged...**
26b30 20 5e 28 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 ^(For each limi
26b40 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 t category SQLIT
26b50 45 5f 4c 49 4d 49 54 5f 3c 69 3e 4e 41 4d 45 3c E_LIMIT_<i>NAME<
26b60 2f 69 3e 20 74 68 65 72 65 20 69 73 20 61 20 0d /i> there is a .
26b70 0a 2a 2a 20 5b 6c 69 6d 69 74 73 20 7c 20 68 61 .** [limits | ha
26b80 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 5d 0d rd upper bound].
26b90 0a 2a 2a 20 73 65 74 20 61 74 20 63 6f 6d 70 69 .** set at compi
26ba0 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 le-time by a C p
26bb0 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 reprocessor macr
26bc0 6f 20 63 61 6c 6c 65 64 0d 0a 2a 2a 20 5b 6c 69 o called..** [li
26bd0 6d 69 74 73 20 7c 20 53 51 4c 49 54 45 5f 4d 41 mits | SQLITE_MA
26be0 58 5f 3c 69 3e 4e 41 4d 45 3c 2f 69 3e 5d 2e 0d X_<i>NAME</i>]..
26bf0 0a 2a 2a 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 .** (The "_LIMIT
26c00 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 _" in the name i
26c10 73 20 63 68 61 6e 67 65 64 20 74 6f 20 22 5f 4d s changed to "_M
26c20 41 58 5f 22 2e 29 29 5e 0d 0a 2a 2a 20 5e 41 74 AX_".))^..** ^At
26c30 74 65 6d 70 74 73 20 74 6f 20 69 6e 63 72 65 61 tempts to increa
26c40 73 65 20 61 20 6c 69 6d 69 74 20 61 62 6f 76 65 se a limit above
26c50 20 69 74 73 20 68 61 72 64 20 75 70 70 65 72 20 its hard upper
26c60 62 6f 75 6e 64 20 61 72 65 0d 0a 2a 2a 20 73 69 bound are..** si
26c70 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 lently truncated
26c80 20 74 6f 20 74 68 65 20 68 61 72 64 20 75 70 70 to the hard upp
26c90 65 72 20 62 6f 75 6e 64 2e 0d 0a 2a 2a 0d 0a 2a er bound...**..*
26ca0 2a 20 5e 52 65 67 61 72 64 6c 65 73 73 20 6f 66 * ^Regardless of
26cb0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
26cc0 74 68 65 20 6c 69 6d 69 74 20 77 61 73 20 63 68 the limit was ch
26cd0 61 6e 67 65 64 2c 20 74 68 65 20 0d 0a 2a 2a 20 anged, the ..**
26ce0 5b 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 29 [sqlite3_limit()
26cf0 5d 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 ] interface retu
26d00 72 6e 73 20 74 68 65 20 70 72 69 6f 72 20 76 61 rns the prior va
26d10 6c 75 65 20 6f 66 20 74 68 65 20 6c 69 6d 69 74 lue of the limit
26d20 2e 0d 0a 2a 2a 20 5e 48 65 6e 63 65 2c 20 74 6f ...** ^Hence, to
26d30 20 66 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e find the curren
26d40 74 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d t value of a lim
26d50 69 74 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 it without chang
26d60 69 6e 67 20 69 74 2c 0d 0a 2a 2a 20 73 69 6d 70 ing it,..** simp
26d70 6c 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 69 ly invoke this i
26d80 6e 74 65 72 66 61 63 65 20 77 69 74 68 20 74 68 nterface with th
26d90 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 e third paramete
26da0 72 20 73 65 74 20 74 6f 20 2d 31 2e 0d 0a 2a 2a r set to -1...**
26db0 0d 0a 2a 2a 20 52 75 6e 2d 74 69 6d 65 20 6c 69 ..** Run-time li
26dc0 6d 69 74 73 20 61 72 65 20 69 6e 74 65 6e 64 65 mits are intende
26dd0 64 20 66 6f 72 20 75 73 65 20 69 6e 20 61 70 70 d for use in app
26de0 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6d lications that m
26df0 61 6e 61 67 65 0d 0a 2a 2a 20 62 6f 74 68 20 74 anage..** both t
26e00 68 65 69 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 heir own interna
26e10 6c 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 61 l database and a
26e20 6c 73 6f 20 64 61 74 61 62 61 73 65 73 20 74 68 lso databases th
26e30 61 74 20 61 72 65 20 63 6f 6e 74 72 6f 6c 6c 65 at are controlle
26e40 64 0d 0a 2a 2a 20 62 79 20 75 6e 74 72 75 73 74 d..** by untrust
26e50 65 64 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 ed external sour
26e60 63 65 73 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 ces. An example
26e70 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 69 67 application mig
26e80 68 74 20 62 65 20 61 0d 0a 2a 2a 20 77 65 62 20 ht be a..** web
26e90 62 72 6f 77 73 65 72 20 74 68 61 74 20 68 61 73 browser that has
26ea0 20 69 74 73 20 6f 77 6e 20 64 61 74 61 62 61 73 its own databas
26eb0 65 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 68 es for storing h
26ec0 69 73 74 6f 72 79 20 61 6e 64 0d 0a 2a 2a 20 73 istory and..** s
26ed0 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 eparate database
26ee0 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 s controlled by
26ef0 4a 61 76 61 53 63 72 69 70 74 20 61 70 70 6c 69 JavaScript appli
26f00 63 61 74 69 6f 6e 73 20 64 6f 77 6e 6c 6f 61 64 cations download
26f10 65 64 0d 0a 2a 2a 20 6f 66 66 20 74 68 65 20 49 ed..** off the I
26f20 6e 74 65 72 6e 65 74 2e 20 20 54 68 65 20 69 6e nternet. The in
26f30 74 65 72 6e 61 6c 20 64 61 74 61 62 61 73 65 73 ternal databases
26f40 20 63 61 6e 20 62 65 20 67 69 76 65 6e 20 74 68 can be given th
26f50 65 0d 0a 2a 2a 20 6c 61 72 67 65 2c 20 64 65 66 e..** large, def
26f60 61 75 6c 74 20 6c 69 6d 69 74 73 2e 20 20 44 61 ault limits. Da
26f70 74 61 62 61 73 65 73 20 6d 61 6e 61 67 65 64 20 tabases managed
26f80 62 79 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 by external sour
26f90 63 65 73 20 63 61 6e 0d 0a 2a 2a 20 62 65 20 67 ces can..** be g
26fa0 69 76 65 6e 20 6d 75 63 68 20 73 6d 61 6c 6c 65 iven much smalle
26fb0 72 20 6c 69 6d 69 74 73 20 64 65 73 69 67 6e 65 r limits designe
26fc0 64 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 64 d to prevent a d
26fd0 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 enial of service
26fe0 0d 0a 2a 2a 20 61 74 74 61 63 6b 2e 20 20 44 65 ..** attack. De
26ff0 76 65 6c 6f 70 65 72 73 20 6d 69 67 68 74 20 61 velopers might a
27000 6c 73 6f 20 77 61 6e 74 20 74 6f 20 75 73 65 20 lso want to use
27010 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 65 74 the [sqlite3_set
27020 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 5d 0d 0a _authorizer()]..
27030 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 ** interface to
27040 66 75 72 74 68 65 72 20 63 6f 6e 74 72 6f 6c 20 further control
27050 75 6e 74 72 75 73 74 65 64 20 53 51 4c 2e 20 20 untrusted SQL.
27060 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 The size of the
27070 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 72 65 database..** cre
27080 61 74 65 64 20 62 79 20 61 6e 20 75 6e 74 72 75 ated by an untru
27090 73 74 65 64 20 73 63 72 69 70 74 20 63 61 6e 20 sted script can
270a0 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 75 73 69 be contained usi
270b0 6e 67 20 74 68 65 0d 0a 2a 2a 20 5b 6d 61 78 5f ng the..** [max_
270c0 70 61 67 65 5f 63 6f 75 6e 74 5d 20 5b 50 52 41 page_count] [PRA
270d0 47 4d 41 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 65 GMA]...**..** Ne
270e0 77 20 72 75 6e 2d 74 69 6d 65 20 6c 69 6d 69 74 w run-time limit
270f0 20 63 61 74 65 67 6f 72 69 65 73 20 6d 61 79 20 categories may
27100 62 65 20 61 64 64 65 64 20 69 6e 20 66 75 74 75 be added in futu
27110 72 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a 2a 2f re releases...*/
27120 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
27130 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 sqlite3_limit(s
27140 71 6c 69 74 65 33 2a 2c 20 69 6e 74 20 69 64 2c qlite3*, int id,
27150 20 69 6e 74 20 6e 65 77 56 61 6c 29 3b 0d 0a 0d int newVal);...
27160 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
27170 3a 20 52 75 6e 2d 54 69 6d 65 20 4c 69 6d 69 74 : Run-Time Limit
27180 20 43 61 74 65 67 6f 72 69 65 73 0d 0a 2a 2a 20 Categories..**
27190 4b 45 59 57 4f 52 44 53 3a 20 7b 6c 69 6d 69 74 KEYWORDS: {limit
271a0 20 63 61 74 65 67 6f 72 79 7d 20 7b 2a 6c 69 6d category} {*lim
271b0 69 74 20 63 61 74 65 67 6f 72 69 65 73 7d 0d 0a it categories}..
271c0 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 63 6f 6e **..** These con
271d0 73 74 61 6e 74 73 20 64 65 66 69 6e 65 20 76 61 stants define va
271e0 72 69 6f 75 73 20 70 65 72 66 6f 72 6d 61 6e 63 rious performanc
271f0 65 20 6c 69 6d 69 74 73 0d 0a 2a 2a 20 74 68 61 e limits..** tha
27200 74 20 63 61 6e 20 62 65 20 6c 6f 77 65 72 65 64 t can be lowered
27210 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 75 73 69 at run-time usi
27220 6e 67 20 5b 73 71 6c 69 74 65 33 5f 6c 69 6d 69 ng [sqlite3_limi
27230 74 28 29 5d 2e 0d 0a 2a 2a 20 54 68 65 20 73 79 t()]...** The sy
27240 6e 6f 70 73 69 73 20 6f 66 20 74 68 65 20 6d 65 nopsis of the me
27250 61 6e 69 6e 67 73 20 6f 66 20 74 68 65 20 76 61 anings of the va
27260 72 69 6f 75 73 20 6c 69 6d 69 74 73 20 69 73 20 rious limits is
27270 73 68 6f 77 6e 20 62 65 6c 6f 77 2e 0d 0a 2a 2a shown below...**
27280 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f Additional info
27290 72 6d 61 74 69 6f 6e 20 69 73 20 61 76 61 69 6c rmation is avail
272a0 61 62 6c 65 20 61 74 20 5b 6c 69 6d 69 74 73 20 able at [limits
272b0 7c 20 4c 69 6d 69 74 73 20 69 6e 20 53 51 4c 69 | Limits in SQLi
272c0 74 65 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 64 6c te]...**..** <dl
272d0 3e 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 4c >..** [[SQLITE_L
272e0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 5d 20 5e 28 IMIT_LENGTH]] ^(
272f0 3c 64 74 3e 53 51 4c 49 54 45 5f 4c 49 4d 49 54 <dt>SQLITE_LIMIT
27300 5f 4c 45 4e 47 54 48 3c 2f 64 74 3e 0d 0a 2a 2a _LENGTH</dt>..**
27310 20 3c 64 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d <dd>The maximum
27320 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 73 74 72 size of any str
27330 69 6e 67 20 6f 72 20 42 4c 4f 42 20 6f 72 20 74 ing or BLOB or t
27340 61 62 6c 65 20 72 6f 77 2c 20 69 6e 20 62 79 74 able row, in byt
27350 65 73 2e 3c 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a es.<dd>)^..**..*
27360 2a 20 5b 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 * [[SQLITE_LIMIT
27370 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 5d 20 5e 28 _SQL_LENGTH]] ^(
27380 3c 64 74 3e 53 51 4c 49 54 45 5f 4c 49 4d 49 54 <dt>SQLITE_LIMIT
27390 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 2f 64 74 3e _SQL_LENGTH</dt>
273a0 0d 0a 2a 2a 20 3c 64 64 3e 54 68 65 20 6d 61 78 ..** <dd>The max
273b0 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 imum length of a
273c0 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c n SQL statement,
273d0 20 69 6e 20 62 79 74 65 73 2e 3c 2f 64 64 3e 29 in bytes.</dd>)
273e0 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 ^..**..** [[SQLI
273f0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d TE_LIMIT_COLUMN]
27400 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 4c ] ^(<dt>SQLITE_L
27410 49 4d 49 54 5f 43 4f 4c 55 4d 4e 3c 2f 64 74 3e IMIT_COLUMN</dt>
27420 0d 0a 2a 2a 20 3c 64 64 3e 54 68 65 20 6d 61 78 ..** <dd>The max
27430 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 imum number of c
27440 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 74 61 62 6c olumns in a tabl
27450 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 72 20 e definition or
27460 69 6e 20 74 68 65 0d 0a 2a 2a 20 72 65 73 75 6c in the..** resul
27470 74 20 73 65 74 20 6f 66 20 61 20 5b 53 45 4c 45 t set of a [SELE
27480 43 54 5d 20 6f 72 20 74 68 65 20 6d 61 78 69 6d CT] or the maxim
27490 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c um number of col
274a0 75 6d 6e 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 umns in an index
274b0 0d 0a 2a 2a 20 6f 72 20 69 6e 20 61 6e 20 4f 52 ..** or in an OR
274c0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 DER BY or GROUP
274d0 42 59 20 63 6c 61 75 73 65 2e 3c 2f 64 64 3e 29 BY clause.</dd>)
274e0 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 ^..**..** [[SQLI
274f0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 TE_LIMIT_EXPR_DE
27500 50 54 48 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 PTH]] ^(<dt>SQLI
27510 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 TE_LIMIT_EXPR_DE
27520 50 54 48 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 PTH</dt>..** <dd
27530 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70 >The maximum dep
27540 74 68 20 6f 66 20 74 68 65 20 70 61 72 73 65 20 th of the parse
27550 74 72 65 65 20 6f 6e 20 61 6e 79 20 65 78 70 72 tree on any expr
27560 65 73 73 69 6f 6e 2e 3c 2f 64 64 3e 29 5e 0d 0a ession.</dd>)^..
27570 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f **..** [[SQLITE_
27580 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 LIMIT_COMPOUND_S
27590 45 4c 45 43 54 5d 5d 20 5e 28 3c 64 74 3e 53 51 ELECT]] ^(<dt>SQ
275a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f LITE_LIMIT_COMPO
275b0 55 4e 44 5f 53 45 4c 45 43 54 3c 2f 64 74 3e 0d UND_SELECT</dt>.
275c0 0a 2a 2a 20 3c 64 64 3e 54 68 65 20 6d 61 78 69 .** <dd>The maxi
275d0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 mum number of te
275e0 72 6d 73 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e rms in a compoun
275f0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 d SELECT stateme
27600 6e 74 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a nt.</dd>)^..**..
27610 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 ** [[SQLITE_LIMI
27620 54 5f 56 44 42 45 5f 4f 50 5d 5d 20 5e 28 3c 64 T_VDBE_OP]] ^(<d
27630 74 3e 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 t>SQLITE_LIMIT_V
27640 44 42 45 5f 4f 50 3c 2f 64 74 3e 0d 0a 2a 2a 20 DBE_OP</dt>..**
27650 3c 64 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 <dd>The maximum
27660 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 number of instru
27670 63 74 69 6f 6e 73 20 69 6e 20 61 20 76 69 72 74 ctions in a virt
27680 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 ual machine prog
27690 72 61 6d 0d 0a 2a 2a 20 75 73 65 64 20 74 6f 20 ram..** used to
276a0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 53 51 4c implement an SQL
276b0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 statement. Thi
276c0 73 20 6c 69 6d 69 74 20 69 73 20 6e 6f 74 20 63 s limit is not c
276d0 75 72 72 65 6e 74 6c 79 0d 0a 2a 2a 20 65 6e 66 urrently..** enf
276e0 6f 72 63 65 64 2c 20 74 68 6f 75 67 68 20 74 68 orced, though th
276f0 61 74 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 at might be adde
27700 64 20 69 6e 20 73 6f 6d 65 20 66 75 74 75 72 65 d in some future
27710 20 72 65 6c 65 61 73 65 20 6f 66 0d 0a 2a 2a 20 release of..**
27720 53 51 4c 69 74 65 2e 3c 2f 64 64 3e 29 5e 0d 0a SQLite.</dd>)^..
27730 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f **..** [[SQLITE_
27740 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 LIMIT_FUNCTION_A
27750 52 47 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 RG]] ^(<dt>SQLIT
27760 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e E_LIMIT_FUNCTION
27770 5f 41 52 47 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 _ARG</dt>..** <d
27780 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 d>The maximum nu
27790 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
277a0 73 20 6f 6e 20 61 20 66 75 6e 63 74 69 6f 6e 2e s on a function.
277b0 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 </dd>)^..**..**
277c0 5b 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 [[SQLITE_LIMIT_A
277d0 54 54 41 43 48 45 44 5d 5d 20 5e 28 3c 64 74 3e TTACHED]] ^(<dt>
277e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 SQLITE_LIMIT_ATT
277f0 41 43 48 45 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c ACHED</dt>..** <
27800 64 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e dd>The maximum n
27810 75 6d 62 65 72 20 6f 66 20 5b 41 54 54 41 43 48 umber of [ATTACH
27820 20 7c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 | attached data
27830 62 61 73 65 73 5d 2e 29 5e 3c 2f 64 64 3e 0d 0a bases].)^</dd>..
27840 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f **..** [[SQLITE_
27850 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 LIMIT_LIKE_PATTE
27860 52 4e 5f 4c 45 4e 47 54 48 5d 5d 0d 0a 2a 2a 20 RN_LENGTH]]..**
27870 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 4c 49 4d ^(<dt>SQLITE_LIM
27880 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f IT_LIKE_PATTERN_
27890 4c 45 4e 47 54 48 3c 2f 64 74 3e 0d 0a 2a 2a 20 LENGTH</dt>..**
278a0 3c 64 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 <dd>The maximum
278b0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 70 61 length of the pa
278c0 74 74 65 72 6e 20 61 72 67 75 6d 65 6e 74 20 74 ttern argument t
278d0 6f 20 74 68 65 20 5b 4c 49 4b 45 5d 20 6f 72 0d o the [LIKE] or.
278e0 0a 2a 2a 20 5b 47 4c 4f 42 5d 20 6f 70 65 72 61 .** [GLOB] opera
278f0 74 6f 72 73 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a tors.</dd>)^..**
27900 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 4c 49 ..** [[SQLITE_LI
27910 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d MIT_VARIABLE_NUM
27920 42 45 52 5d 5d 0d 0a 2a 2a 20 5e 28 3c 64 74 3e BER]]..** ^(<dt>
27930 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 SQLITE_LIMIT_VAR
27940 49 41 42 4c 45 5f 4e 55 4d 42 45 52 3c 2f 64 74 IABLE_NUMBER</dt
27950 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 65 20 6d 61 >..** <dd>The ma
27960 78 69 6d 75 6d 20 69 6e 64 65 78 20 6e 75 6d 62 ximum index numb
27970 65 72 20 6f 66 20 61 6e 79 20 5b 70 61 72 61 6d er of any [param
27980 65 74 65 72 5d 20 69 6e 20 61 6e 20 53 51 4c 20 eter] in an SQL
27990 73 74 61 74 65 6d 65 6e 74 2e 29 5e 0d 0a 2a 2a statement.)^..**
279a0 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 4c 49 ..** [[SQLITE_LI
279b0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 MIT_TRIGGER_DEPT
279c0 48 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 H]] ^(<dt>SQLITE
279d0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 _LIMIT_TRIGGER_D
279e0 45 50 54 48 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 EPTH</dt>..** <d
279f0 64 3e 54 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 d>The maximum de
27a00 70 74 68 20 6f 66 20 72 65 63 75 72 73 69 6f 6e pth of recursion
27a10 20 66 6f 72 20 74 72 69 67 67 65 72 73 2e 3c 2f for triggers.</
27a20 64 64 3e 29 5e 0d 0a 2a 2a 20 3c 2f 64 6c 3e 0d dd>)^..** </dl>.
27a30 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c .*/..#define SQL
27a40 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 ITE_LIMIT_LENGTH
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27a60 20 20 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 53 0..#define S
27a70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f QLITE_LIMIT_SQL_
27a80 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 LENGTH
27a90 20 20 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65 1..#define
27aa0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f SQLITE_LIMIT_CO
27ab0 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 LUMN
27ac0 20 20 20 20 20 20 20 20 32 0d 0a 23 64 65 66 69 2..#defi
27ad0 6e 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f ne SQLITE_LIMIT_
27ae0 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 EXPR_DEPTH
27af0 20 20 20 20 20 20 20 20 20 20 33 0d 0a 23 64 65 3..#de
27b00 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 fine SQLITE_LIMI
27b10 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 T_COMPOUND_SELEC
27b20 54 20 20 20 20 20 20 20 20 20 20 20 34 0d 0a 23 T 4..#
27b30 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 49 define SQLITE_LI
27b40 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 MIT_VDBE_OP
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0d 5.
27b60 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
27b70 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 LIMIT_FUNCTION_A
27b80 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 RG
27b90 36 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 6..#define SQLIT
27ba0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 E_LIMIT_ATTACHED
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27bc0 20 20 37 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 7..#define SQL
27bd0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 ITE_LIMIT_LIKE_P
27be0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 ATTERN_LENGTH
27bf0 20 20 20 20 38 0d 0a 23 64 65 66 69 6e 65 20 53 8..#define S
27c00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 QLITE_LIMIT_VARI
27c10 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 ABLE_NUMBER
27c20 20 20 20 20 20 20 39 0d 0a 23 64 65 66 69 6e 65 9..#define
27c30 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 SQLITE_LIMIT_TR
27c40 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 IGGER_DEPTH
27c50 20 20 20 20 20 20 20 31 30 0d 0a 0d 0a 2f 2a 0d 10..../*.
27c60 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f .** CAPI3REF: Co
27c70 6d 70 69 6c 69 6e 67 20 41 6e 20 53 51 4c 20 53 mpiling An SQL S
27c80 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 4b 45 59 tatement..** KEY
27c90 57 4f 52 44 53 3a 20 7b 53 51 4c 20 73 74 61 74 WORDS: {SQL stat
27ca0 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 72 7d 0d ement compiler}.
27cb0 0a 2a 2a 0d 0a 2a 2a 20 54 6f 20 65 78 65 63 75 .**..** To execu
27cc0 74 65 20 61 6e 20 53 51 4c 20 71 75 65 72 79 2c te an SQL query,
27cd0 20 69 74 20 6d 75 73 74 20 66 69 72 73 74 20 62 it must first b
27ce0 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74 6f 20 e compiled into
27cf0 61 20 62 79 74 65 2d 63 6f 64 65 0d 0a 2a 2a 20 a byte-code..**
27d00 70 72 6f 67 72 61 6d 20 75 73 69 6e 67 20 6f 6e program using on
27d10 65 20 6f 66 20 74 68 65 73 65 20 72 6f 75 74 69 e of these routi
27d20 6e 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 nes...**..** The
27d30 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c first argument,
27d40 20 22 64 62 22 2c 20 69 73 20 61 20 5b 64 61 74 "db", is a [dat
27d50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
27d60 5d 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 ] obtained from
27d70 61 0d 0a 2a 2a 20 70 72 69 6f 72 20 73 75 63 63 a..** prior succ
27d80 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 5b essful call to [
27d90 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 5d 2c sqlite3_open()],
27da0 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 [sqlite3_open_v
27db0 32 28 29 5d 20 6f 72 0d 0a 2a 2a 20 5b 73 71 6c 2()] or..** [sql
27dc0 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 5d 2e 20 ite3_open16()].
27dd0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f The database co
27de0 6e 6e 65 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f nnection must no
27df0 74 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 t have been clos
27e00 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ed...**..** The
27e10 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c second argument,
27e20 20 22 7a 53 71 6c 22 2c 20 69 73 20 74 68 65 20 "zSql", is the
27e30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 20 statement to be
27e40 63 6f 6d 70 69 6c 65 64 2c 20 65 6e 63 6f 64 65 compiled, encode
27e50 64 0d 0a 2a 2a 20 61 73 20 65 69 74 68 65 72 20 d..** as either
27e60 55 54 46 2d 38 20 6f 72 20 55 54 46 2d 31 36 2e UTF-8 or UTF-16.
27e70 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 72 The sqlite3_pr
27e80 65 70 61 72 65 28 29 20 61 6e 64 20 73 71 6c 69 epare() and sqli
27e90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 te3_prepare_v2()
27ea0 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 ..** interfaces
27eb0 75 73 65 20 55 54 46 2d 38 2c 20 61 6e 64 20 73 use UTF-8, and s
27ec0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 qlite3_prepare16
27ed0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 70 () and sqlite3_p
27ee0 72 65 70 61 72 65 31 36 5f 76 32 28 29 0d 0a 2a repare16_v2()..*
27ef0 2a 20 75 73 65 20 55 54 46 2d 31 36 2e 0d 0a 2a * use UTF-16...*
27f00 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 6e 42 *..** ^If the nB
27f10 79 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 yte argument is
27f20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 less than zero,
27f30 74 68 65 6e 20 7a 53 71 6c 20 69 73 20 72 65 61 then zSql is rea
27f40 64 20 75 70 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 d up to the..**
27f50 66 69 72 73 74 20 7a 65 72 6f 20 74 65 72 6d 69 first zero termi
27f60 6e 61 74 6f 72 2e 20 5e 49 66 20 6e 42 79 74 65 nator. ^If nByte
27f70 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 is non-negative
27f80 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 , then it is the
27f90 20 6d 61 78 69 6d 75 6d 0d 0a 2a 2a 20 6e 75 6d maximum..** num
27fa0 62 65 72 20 6f 66 20 20 62 79 74 65 73 20 72 65 ber of bytes re
27fb0 61 64 20 66 72 6f 6d 20 7a 53 71 6c 2e 20 20 5e ad from zSql. ^
27fc0 57 68 65 6e 20 6e 42 79 74 65 20 69 73 20 6e 6f When nByte is no
27fd0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 0d n-negative, the.
27fe0 0a 2a 2a 20 7a 53 71 6c 20 73 74 72 69 6e 67 20 .** zSql string
27ff0 65 6e 64 73 20 61 74 20 65 69 74 68 65 72 20 74 ends at either t
28000 68 65 20 66 69 72 73 74 20 27 5c 30 30 30 27 20 he first '\000'
28010 6f 72 20 27 5c 75 30 30 30 30 27 20 63 68 61 72 or '\u0000' char
28020 61 63 74 65 72 20 6f 72 0d 0a 2a 2a 20 74 68 65 acter or..** the
28030 20 6e 42 79 74 65 2d 74 68 20 62 79 74 65 2c 20 nByte-th byte,
28040 77 68 69 63 68 65 76 65 72 20 63 6f 6d 65 73 20 whichever comes
28050 66 69 72 73 74 2e 20 49 66 20 74 68 65 20 63 61 first. If the ca
28060 6c 6c 65 72 20 6b 6e 6f 77 73 0d 0a 2a 2a 20 74 ller knows..** t
28070 68 61 74 20 74 68 65 20 73 75 70 70 6c 69 65 64 hat the supplied
28080 20 73 74 72 69 6e 67 20 69 73 20 6e 75 6c 2d 74 string is nul-t
28090 65 72 6d 69 6e 61 74 65 64 2c 20 74 68 65 6e 20 erminated, then
280a0 74 68 65 72 65 20 69 73 20 61 20 73 6d 61 6c 6c there is a small
280b0 0d 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 ..** performance
280c0 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 62 65 advantage to be
280d0 20 67 61 69 6e 65 64 20 62 79 20 70 61 73 73 69 gained by passi
280e0 6e 67 20 61 6e 20 6e 42 79 74 65 20 70 61 72 61 ng an nByte para
280f0 6d 65 74 65 72 20 74 68 61 74 0d 0a 2a 2a 20 69 meter that..** i
28100 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e s equal to the n
28110 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
28120 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 n the input stri
28130 6e 67 20 3c 69 3e 69 6e 63 6c 75 64 69 6e 67 3c ng <i>including<
28140 2f 69 3e 0d 0a 2a 2a 20 74 68 65 20 6e 75 6c 2d /i>..** the nul-
28150 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 terminator bytes
28160 20 61 73 20 74 68 69 73 20 73 61 76 65 73 20 53 as this saves S
28170 51 4c 69 74 65 20 66 72 6f 6d 20 68 61 76 69 6e QLite from havin
28180 67 20 74 6f 0d 0a 2a 2a 20 6d 61 6b 65 20 61 20 g to..** make a
28190 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70 75 copy of the inpu
281a0 74 20 73 74 72 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a t string...**..*
281b0 2a 20 5e 49 66 20 70 7a 54 61 69 6c 20 69 73 20 * ^If pzTail is
281c0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 not NULL then *p
281d0 7a 54 61 69 6c 20 69 73 20 6d 61 64 65 20 74 6f zTail is made to
281e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 point to the fi
281f0 72 73 74 20 62 79 74 65 0d 0a 2a 2a 20 70 61 73 rst byte..** pas
28200 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 t the end of the
28210 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74 65 first SQL state
28220 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 54 ment in zSql. T
28230 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 6f 6e hese routines on
28240 6c 79 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 20 74 ly..** compile t
28250 68 65 20 66 69 72 73 74 20 73 74 61 74 65 6d 65 he first stateme
28260 6e 74 20 69 6e 20 7a 53 71 6c 2c 20 73 6f 20 2a nt in zSql, so *
28270 70 7a 54 61 69 6c 20 69 73 20 6c 65 66 74 20 70 pzTail is left p
28280 6f 69 6e 74 69 6e 67 20 74 6f 0d 0a 2a 2a 20 77 ointing to..** w
28290 68 61 74 20 72 65 6d 61 69 6e 73 20 75 6e 63 6f hat remains unco
282a0 6d 70 69 6c 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 mpiled...**..**
282b0 5e 2a 70 70 53 74 6d 74 20 69 73 20 6c 65 66 74 ^*ppStmt is left
282c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 63 pointing to a c
282d0 6f 6d 70 69 6c 65 64 20 5b 70 72 65 70 61 72 65 ompiled [prepare
282e0 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 74 68 61 d statement] tha
282f0 74 20 63 61 6e 20 62 65 0d 0a 2a 2a 20 65 78 65 t can be..** exe
28300 63 75 74 65 64 20 75 73 69 6e 67 20 5b 73 71 6c cuted using [sql
28310 69 74 65 33 5f 73 74 65 70 28 29 5d 2e 20 20 5e ite3_step()]. ^
28320 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 If there is an e
28330 72 72 6f 72 2c 20 2a 70 70 53 74 6d 74 20 69 73 rror, *ppStmt is
28340 20 73 65 74 0d 0a 2a 2a 20 74 6f 20 4e 55 4c 4c set..** to NULL
28350 2e 20 20 5e 49 66 20 74 68 65 20 69 6e 70 75 74 . ^If the input
28360 20 74 65 78 74 20 63 6f 6e 74 61 69 6e 73 20 6e text contains n
28370 6f 20 53 51 4c 20 28 69 66 20 74 68 65 20 69 6e o SQL (if the in
28380 70 75 74 20 69 73 20 61 6e 20 65 6d 70 74 79 0d put is an empty.
28390 0a 2a 2a 20 73 74 72 69 6e 67 20 6f 72 20 61 20 .** string or a
283a0 63 6f 6d 6d 65 6e 74 29 20 74 68 65 6e 20 2a 70 comment) then *p
283b0 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 pStmt is set to
283c0 4e 55 4c 4c 2e 0d 0a 2a 2a 20 54 68 65 20 63 61 NULL...** The ca
283d0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 lling procedure
283e0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 is responsible f
283f0 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 or deleting the
28400 63 6f 6d 70 69 6c 65 64 0d 0a 2a 2a 20 53 51 4c compiled..** SQL
28410 20 73 74 61 74 65 6d 65 6e 74 20 75 73 69 6e 67 statement using
28420 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 [sqlite3_finali
28430 7a 65 28 29 5d 20 61 66 74 65 72 20 69 74 20 68 ze()] after it h
28440 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 as finished with
28450 20 69 74 2e 0d 0a 2a 2a 20 70 70 53 74 6d 74 20 it...** ppStmt
28460 6d 61 79 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e may not be NULL.
28470 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 4f 6e 20 73 75 63 ..**..** ^On suc
28480 63 65 73 73 2c 20 74 68 65 20 73 71 6c 69 74 65 cess, the sqlite
28490 33 5f 70 72 65 70 61 72 65 28 29 20 66 61 6d 69 3_prepare() fami
284a0 6c 79 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 72 ly of routines r
284b0 65 74 75 72 6e 20 5b 53 51 4c 49 54 45 5f 4f 4b eturn [SQLITE_OK
284c0 5d 3b 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 ];..** otherwise
284d0 20 61 6e 20 5b 65 72 72 6f 72 20 63 6f 64 65 5d an [error code]
284e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a is returned...*
284f0 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 *..** The sqlite
28500 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 61 3_prepare_v2() a
28510 6e 64 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 nd sqlite3_prepa
28520 72 65 31 36 5f 76 32 28 29 20 69 6e 74 65 72 66 re16_v2() interf
28530 61 63 65 73 20 61 72 65 0d 0a 2a 2a 20 72 65 63 aces are..** rec
28540 6f 6d 6d 65 6e 64 65 64 20 66 6f 72 20 61 6c 6c ommended for all
28550 20 6e 65 77 20 70 72 6f 67 72 61 6d 73 2e 20 54 new programs. T
28560 68 65 20 74 77 6f 20 6f 6c 64 65 72 20 69 6e 74 he two older int
28570 65 72 66 61 63 65 73 20 61 72 65 20 72 65 74 61 erfaces are reta
28580 69 6e 65 64 0d 0a 2a 2a 20 66 6f 72 20 62 61 63 ined..** for bac
28590 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 kwards compatibi
285a0 6c 69 74 79 2c 20 62 75 74 20 74 68 65 69 72 20 lity, but their
285b0 75 73 65 20 69 73 20 64 69 73 63 6f 75 72 61 67 use is discourag
285c0 65 64 2e 0d 0a 2a 2a 20 5e 49 6e 20 74 68 65 20 ed...** ^In the
285d0 22 76 32 22 20 69 6e 74 65 72 66 61 63 65 73 2c "v2" interfaces,
285e0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
285f0 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 74 68 61 74 atement..** that
28600 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 74 68 is returned (th
28610 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 6d 74 5d e [sqlite3_stmt]
28620 20 6f 62 6a 65 63 74 29 20 63 6f 6e 74 61 69 6e object) contain
28630 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0d s a copy of the.
28640 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c .** original SQL
28650 20 74 65 78 74 2e 20 54 68 69 73 20 63 61 75 73 text. This caus
28660 65 73 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f es the [sqlite3_
28670 73 74 65 70 28 29 5d 20 69 6e 74 65 72 66 61 63 step()] interfac
28680 65 20 74 6f 0d 0a 2a 2a 20 62 65 68 61 76 65 20 e to..** behave
28690 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 differently in t
286a0 68 72 65 65 20 77 61 79 73 3a 0d 0a 2a 2a 0d 0a hree ways:..**..
286b0 2a 2a 20 3c 6f 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e ** <ol>..** <li>
286c0 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 64 61 74 ..** ^If the dat
286d0 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 68 61 abase schema cha
286e0 6e 67 65 73 2c 20 69 6e 73 74 65 61 64 20 6f 66 nges, instead of
286f0 20 72 65 74 75 72 6e 69 6e 67 20 5b 53 51 4c 49 returning [SQLI
28700 54 45 5f 53 43 48 45 4d 41 5d 20 61 73 20 69 74 TE_SCHEMA] as it
28710 0d 0a 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 ..** always used
28720 20 74 6f 20 64 6f 2c 20 5b 73 71 6c 69 74 65 33 to do, [sqlite3
28730 5f 73 74 65 70 28 29 5d 20 77 69 6c 6c 20 61 75 _step()] will au
28740 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65 63 6f tomatically reco
28750 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 0d 0a 2a mpile the SQL..*
28760 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 * statement and
28770 74 72 79 20 74 6f 20 72 75 6e 20 69 74 20 61 67 try to run it ag
28780 61 69 6e 2e 0d 0a 2a 2a 20 3c 2f 6c 69 3e 0d 0a ain...** </li>..
28790 2a 2a 0d 0a 2a 2a 20 3c 6c 69 3e 0d 0a 2a 2a 20 **..** <li>..**
287a0 5e 57 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f ^When an error o
287b0 63 63 75 72 73 2c 20 5b 73 71 6c 69 74 65 33 5f ccurs, [sqlite3_
287c0 73 74 65 70 28 29 5d 20 77 69 6c 6c 20 72 65 74 step()] will ret
287d0 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 urn one of the d
287e0 65 74 61 69 6c 65 64 0d 0a 2a 2a 20 5b 65 72 72 etailed..** [err
287f0 6f 72 20 63 6f 64 65 73 5d 20 6f 72 20 5b 65 78 or codes] or [ex
28800 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 tended error cod
28810 65 73 5d 2e 20 20 5e 54 68 65 20 6c 65 67 61 63 es]. ^The legac
28820 79 20 62 65 68 61 76 69 6f 72 20 77 61 73 20 74 y behavior was t
28830 68 61 74 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 hat..** [sqlite3
28840 5f 73 74 65 70 28 29 5d 20 77 6f 75 6c 64 20 6f _step()] would o
28850 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 67 65 6e nly return a gen
28860 65 72 69 63 20 5b 53 51 4c 49 54 45 5f 45 52 52 eric [SQLITE_ERR
28870 4f 52 5d 20 72 65 73 75 6c 74 20 63 6f 64 65 0d OR] result code.
28880 0a 2a 2a 20 61 6e 64 20 74 68 65 20 61 70 70 6c .** and the appl
28890 69 63 61 74 69 6f 6e 20 77 6f 75 6c 64 20 68 61 ication would ha
288a0 76 65 20 74 6f 20 6d 61 6b 65 20 61 20 73 65 63 ve to make a sec
288b0 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c ond call to [sql
288c0 69 74 65 33 5f 72 65 73 65 74 28 29 5d 0d 0a 2a ite3_reset()]..*
288d0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 * in order to fi
288e0 6e 64 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e nd the underlyin
288f0 67 20 63 61 75 73 65 20 6f 66 20 74 68 65 20 70 g cause of the p
28900 72 6f 62 6c 65 6d 2e 20 57 69 74 68 20 74 68 65 roblem. With the
28910 20 22 76 32 22 20 70 72 65 70 61 72 65 0d 0a 2a "v2" prepare..*
28920 2a 20 69 6e 74 65 72 66 61 63 65 73 2c 20 74 68 * interfaces, th
28930 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 72 65 61 e underlying rea
28940 73 6f 6e 20 66 6f 72 20 74 68 65 20 65 72 72 6f son for the erro
28950 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d r is returned im
28960 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 2a 2a 20 3c mediately...** <
28970 2f 6c 69 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 6c 69 /li>..**..** <li
28980 3e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 73 70 >..** ^If the sp
28990 65 63 69 66 69 63 20 76 61 6c 75 65 20 62 6f 75 ecific value bou
289a0 6e 64 20 74 6f 20 5b 70 61 72 61 6d 65 74 65 72 nd to [parameter
289b0 20 7c 20 68 6f 73 74 20 70 61 72 61 6d 65 74 65 | host paramete
289c0 72 5d 20 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 57 r] in the ..** W
289d0 48 45 52 45 20 63 6c 61 75 73 65 20 6d 69 67 68 HERE clause migh
289e0 74 20 69 6e 66 6c 75 65 6e 63 65 20 74 68 65 20 t influence the
289f0 63 68 6f 69 63 65 20 6f 66 20 71 75 65 72 79 20 choice of query
28a00 70 6c 61 6e 20 66 6f 72 20 61 20 73 74 61 74 65 plan for a state
28a10 6d 65 6e 74 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74 ment,..** then t
28a20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c he statement wil
28a30 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c l be automatical
28a40 6c 79 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20 61 ly recompiled, a
28a50 73 20 69 66 20 74 68 65 72 65 20 68 61 64 20 62 s if there had b
28a60 65 65 6e 20 0d 0a 2a 2a 20 61 20 73 63 68 65 6d een ..** a schem
28a70 61 20 63 68 61 6e 67 65 2c 20 6f 6e 20 74 68 65 a change, on the
28a80 20 66 69 72 73 74 20 20 5b 73 71 6c 69 74 65 33 first [sqlite3
28a90 5f 73 74 65 70 28 29 5d 20 63 61 6c 6c 20 66 6f _step()] call fo
28aa0 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 63 68 61 6e llowing any chan
28ab0 67 65 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 5b 73 ge..** to the [s
28ac0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 qlite3_bind_text
28ad0 20 7c 20 62 69 6e 64 69 6e 67 73 5d 20 6f 66 20 | bindings] of
28ae0 74 68 61 74 20 5b 70 61 72 61 6d 65 74 65 72 5d that [parameter]
28af0 2e 20 0d 0a 2a 2a 20 5e 54 68 65 20 73 70 65 63 . ..** ^The spec
28b00 69 66 69 63 20 76 61 6c 75 65 20 6f 66 20 57 48 ific value of WH
28b10 45 52 45 2d 63 6c 61 75 73 65 20 5b 70 61 72 61 ERE-clause [para
28b20 6d 65 74 65 72 5d 20 6d 69 67 68 74 20 69 6e 66 meter] might inf
28b30 6c 75 65 6e 63 65 20 74 68 65 20 0d 0a 2a 2a 20 luence the ..**
28b40 63 68 6f 69 63 65 20 6f 66 20 71 75 65 72 79 20 choice of query
28b50 70 6c 61 6e 20 69 66 20 74 68 65 20 70 61 72 61 plan if the para
28b60 6d 65 74 65 72 20 69 73 20 74 68 65 20 6c 65 66 meter is the lef
28b70 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 t-hand side of a
28b80 20 5b 4c 49 4b 45 5d 0d 0a 2a 2a 20 6f 72 20 5b [LIKE]..** or [
28b90 47 4c 4f 42 5d 20 6f 70 65 72 61 74 6f 72 20 6f GLOB] operator o
28ba0 72 20 69 66 20 74 68 65 20 70 61 72 61 6d 65 74 r if the paramet
28bb0 65 72 20 69 73 20 63 6f 6d 70 61 72 65 64 20 74 er is compared t
28bc0 6f 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c o an indexed col
28bd0 75 6d 6e 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 umn..** and the
28be0 5b 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 [SQLITE_ENABLE_S
28bf0 54 41 54 33 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 TAT3] compile-ti
28c00 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 me option is ena
28c10 62 6c 65 64 2e 0d 0a 2a 2a 20 74 68 65 20 0d 0a bled...** the ..
28c20 2a 2a 20 3c 2f 6c 69 3e 0d 0a 2a 2a 20 3c 2f 6f ** </li>..** </o
28c30 6c 3e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 l>..*/..SQLITE_A
28c40 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 PI int sqlite3_p
28c50 72 65 70 61 72 65 28 0d 0a 20 20 73 71 6c 69 74 repare(.. sqlit
28c60 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 e3 *db,
28c70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 /* Database h
28c80 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 andle */.. cons
28c90 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 t char *zSql,
28ca0 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 /* SQL state
28cb0 6d 65 6e 74 2c 20 55 54 46 2d 38 20 65 6e 63 6f ment, UTF-8 enco
28cc0 64 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 ded */.. int nB
28cd0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 yte,
28ce0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e /* Maximum len
28cf0 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 gth of zSql in b
28d00 79 74 65 73 2e 20 2a 2f 0d 0a 20 20 73 71 6c 69 ytes. */.. sqli
28d10 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d te3_stmt **ppStm
28d20 74 2c 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 t, /* OUT: Stat
28d30 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0d ement handle */.
28d40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a . const char **
28d50 70 7a 54 61 69 6c 20 20 20 20 20 2f 2a 20 4f 55 pzTail /* OU
28d60 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 75 6e T: Pointer to un
28d70 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 used portion of
28d80 7a 53 71 6c 20 2a 2f 0d 0a 29 3b 0d 0a 53 51 4c zSql */..);..SQL
28d90 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
28da0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 0d te3_prepare_v2(.
28db0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 . sqlite3 *db,
28dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 /* Da
28dd0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f tabase handle */
28de0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
28df0 7a 53 71 6c 2c 20 20 20 20 20 20 20 2f 2a 20 53 zSql, /* S
28e00 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 55 54 QL statement, UT
28e10 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0d 0a F-8 encoded */..
28e20 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 int nByte,
28e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 /* Max
28e40 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 7a imum length of z
28e50 53 71 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f Sql in bytes. */
28e60 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 .. sqlite3_stmt
28e70 20 2a 2a 70 70 53 74 6d 74 2c 20 20 2f 2a 20 4f **ppStmt, /* O
28e80 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68 61 UT: Statement ha
28e90 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 ndle */.. const
28ea0 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 20 20 char **pzTail
28eb0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 /* OUT: Point
28ec0 65 72 20 74 6f 20 75 6e 75 73 65 64 20 70 6f 72 er to unused por
28ed0 74 69 6f 6e 20 6f 66 20 7a 53 71 6c 20 2a 2f 0d tion of zSql */.
28ee0 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .);..SQLITE_API
28ef0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 int sqlite3_prep
28f00 61 72 65 31 36 28 0d 0a 20 20 73 71 6c 69 74 65 are16(.. sqlite
28f10 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 3 *db,
28f20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 /* Database ha
28f30 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 ndle */.. const
28f40 20 76 6f 69 64 20 2a 7a 53 71 6c 2c 20 20 20 20 void *zSql,
28f50 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d /* SQL statem
28f60 65 6e 74 2c 20 55 54 46 2d 31 36 20 65 6e 63 6f ent, UTF-16 enco
28f70 64 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 ded */.. int nB
28f80 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 yte,
28f90 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e /* Maximum len
28fa0 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 gth of zSql in b
28fb0 79 74 65 73 2e 20 2a 2f 0d 0a 20 20 73 71 6c 69 ytes. */.. sqli
28fc0 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d te3_stmt **ppStm
28fd0 74 2c 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 t, /* OUT: Stat
28fe0 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0d ement handle */.
28ff0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2a . const void **
29000 70 7a 54 61 69 6c 20 20 20 20 20 2f 2a 20 4f 55 pzTail /* OU
29010 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 75 6e T: Pointer to un
29020 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 used portion of
29030 7a 53 71 6c 20 2a 2f 0d 0a 29 3b 0d 0a 53 51 4c zSql */..);..SQL
29040 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
29050 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 te3_prepare16_v2
29060 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 (.. sqlite3 *db
29070 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
29080 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 Database handle
29090 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 */.. const void
290a0 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 2f 2a *zSql, /*
290b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 SQL statement,
290c0 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 2a UTF-16 encoded *
290d0 2f 0d 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 /.. int nByte,
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
290f0 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f Maximum length o
29100 66 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 2e f zSql in bytes.
29110 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 */.. sqlite3_s
29120 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 2f tmt **ppStmt, /
29130 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 * OUT: Statement
29140 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63 6f handle */.. co
29150 6e 73 74 20 76 6f 69 64 20 2a 2a 70 7a 54 61 69 nst void **pzTai
29160 6c 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f l /* OUT: Po
29170 69 6e 74 65 72 20 74 6f 20 75 6e 75 73 65 64 20 inter to unused
29180 70 6f 72 74 69 6f 6e 20 6f 66 20 7a 53 71 6c 20 portion of zSql
29190 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..);..../*..**
291a0 20 43 41 50 49 33 52 45 46 3a 20 52 65 74 72 69 CAPI3REF: Retri
291b0 65 76 69 6e 67 20 53 74 61 74 65 6d 65 6e 74 20 eving Statement
291c0 53 51 4c 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 SQL..**..** ^Thi
291d0 73 20 69 6e 74 65 72 66 61 63 65 20 63 61 6e 20 s interface can
291e0 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 be used to retri
291f0 65 76 65 20 61 20 73 61 76 65 64 20 63 6f 70 79 eve a saved copy
29200 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c of the original
29210 0d 0a 2a 2a 20 53 51 4c 20 74 65 78 74 20 75 73 ..** SQL text us
29220 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 5b ed to create a [
29230 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
29240 6e 74 5d 20 69 66 20 74 68 61 74 20 73 74 61 74 nt] if that stat
29250 65 6d 65 6e 74 20 77 61 73 0d 0a 2a 2a 20 63 6f ement was..** co
29260 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 65 69 74 mpiled using eit
29270 68 65 72 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 her [sqlite3_pre
29280 70 61 72 65 5f 76 32 28 29 5d 20 6f 72 20 5b 73 pare_v2()] or [s
29290 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 qlite3_prepare16
292a0 5f 76 32 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c _v2()]...*/..SQL
292b0 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 ITE_API const ch
292c0 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 ar *sqlite3_sql(
292d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 sqlite3_stmt *pS
292e0 74 6d 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 tmt);..../*..**
292f0 43 41 50 49 33 52 45 46 3a 20 44 65 74 65 72 6d CAPI3REF: Determ
29300 69 6e 65 20 49 66 20 41 6e 20 53 51 4c 20 53 74 ine If An SQL St
29310 61 74 65 6d 65 6e 74 20 57 72 69 74 65 73 20 54 atement Writes T
29320 68 65 20 44 61 74 61 62 61 73 65 0d 0a 2a 2a 0d he Database..**.
29330 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 .** ^The sqlite3
29340 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 58 _stmt_readonly(X
29350 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 ) interface retu
29360 72 6e 73 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 rns true (non-ze
29370 72 6f 29 20 69 66 0d 0a 2a 2a 20 61 6e 64 20 6f ro) if..** and o
29380 6e 6c 79 20 69 66 20 74 68 65 20 5b 70 72 65 70 nly if the [prep
29390 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 ared statement]
293a0 58 20 6d 61 6b 65 73 20 6e 6f 20 64 69 72 65 63 X makes no direc
293b0 74 20 63 68 61 6e 67 65 73 20 74 6f 0d 0a 2a 2a t changes to..**
293c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 the content of
293d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
293e0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 e...**..** Note
293f0 74 68 61 74 20 5b 61 70 70 6c 69 63 61 74 69 6f that [applicatio
29400 6e 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 n-defined SQL fu
29410 6e 63 74 69 6f 6e 73 5d 20 6f 72 0d 0a 2a 2a 20 nctions] or..**
29420 5b 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 5d [virtual tables]
29430 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 might change th
29440 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 69 72 e database indir
29450 65 63 74 6c 79 20 61 73 20 61 20 73 69 64 65 20 ectly as a side
29460 65 66 66 65 63 74 2e 20 20 0d 0a 2a 2a 20 5e 28 effect. ..** ^(
29470 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 For example, if
29480 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 an application d
29490 65 66 69 6e 65 73 20 61 20 66 75 6e 63 74 69 6f efines a functio
294a0 6e 20 22 65 76 61 6c 28 29 22 20 74 68 61 74 20 n "eval()" that
294b0 0d 0a 2a 2a 20 63 61 6c 6c 73 20 5b 73 71 6c 69 ..** calls [sqli
294c0 74 65 33 5f 65 78 65 63 28 29 5d 2c 20 74 68 65 te3_exec()], the
294d0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 n the following
294e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 6f SQL statement wo
294f0 75 6c 64 0d 0a 2a 2a 20 63 68 61 6e 67 65 20 74 uld..** change t
29500 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
29510 20 74 68 72 6f 75 67 68 20 73 69 64 65 2d 65 66 through side-ef
29520 66 65 63 74 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c fects:..**..** <
29530 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e blockquote><pre>
29540 0d 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 65 ..** SELECT e
29550 76 61 6c 28 27 44 45 4c 45 54 45 20 46 52 4f 4d val('DELETE FROM
29560 20 74 31 27 29 20 46 52 4f 4d 20 74 32 3b 0d 0a t1') FROM t2;..
29570 2a 2a 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b ** </pre></block
29580 71 75 6f 74 65 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 42 quote>..**..** B
29590 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 5b ut because the [
295a0 53 45 4c 45 43 54 5d 20 73 74 61 74 65 6d 65 6e SELECT] statemen
295b0 74 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 t does not chang
295c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 e the database f
295d0 69 6c 65 0d 0a 2a 2a 20 64 69 72 65 63 74 6c 79 ile..** directly
295e0 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 , sqlite3_stmt_r
295f0 65 61 64 6f 6e 6c 79 28 29 20 77 6f 75 6c 64 20 eadonly() would
29600 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 still return tru
29610 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 72 e.)^..**..** ^Tr
29620 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6e 74 72 6f ansaction contro
29630 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 73 75 63 l statements suc
29640 68 20 61 73 20 5b 42 45 47 49 4e 5d 2c 20 5b 43 h as [BEGIN], [C
29650 4f 4d 4d 49 54 5d 2c 20 5b 52 4f 4c 4c 42 41 43 OMMIT], [ROLLBAC
29660 4b 5d 2c 0d 0a 2a 2a 20 5b 53 41 56 45 50 4f 49 K],..** [SAVEPOI
29670 4e 54 5d 2c 20 61 6e 64 20 5b 52 45 4c 45 41 53 NT], and [RELEAS
29680 45 5d 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 E] cause sqlite3
29690 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 29 _stmt_readonly()
296a0 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2c to return true,
296b0 0d 0a 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73 ..** since the s
296c0 74 61 74 65 6d 65 6e 74 73 20 74 68 65 6d 73 65 tatements themse
296d0 6c 76 65 73 20 64 6f 20 6e 6f 74 20 61 63 74 75 lves do not actu
296e0 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 ally modify the
296f0 64 61 74 61 62 61 73 65 20 62 75 74 0d 0a 2a 2a database but..**
29700 20 72 61 74 68 65 72 20 74 68 65 79 20 63 6f 6e rather they con
29710 74 72 6f 6c 20 74 68 65 20 74 69 6d 69 6e 67 20 trol the timing
29720 6f 66 20 77 68 65 6e 20 6f 74 68 65 72 20 73 74 of when other st
29730 61 74 65 6d 65 6e 74 73 20 6d 6f 64 69 66 79 20 atements modify
29740 74 68 65 20 0d 0a 2a 2a 20 64 61 74 61 62 61 73 the ..** databas
29750 65 2e 20 20 5e 54 68 65 20 5b 41 54 54 41 43 48 e. ^The [ATTACH
29760 5d 20 61 6e 64 20 5b 44 45 54 41 43 48 5d 20 73 ] and [DETACH] s
29770 74 61 74 65 6d 65 6e 74 73 20 61 6c 73 6f 20 63 tatements also c
29780 61 75 73 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 ause..** sqlite3
29790 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 29 _stmt_readonly()
297a0 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 to return true
297b0 73 69 6e 63 65 2c 20 77 68 69 6c 65 20 74 68 6f since, while tho
297c0 73 65 20 73 74 61 74 65 6d 65 6e 74 73 0d 0a 2a se statements..*
297d0 2a 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e * change the con
297e0 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 61 20 figuration of a
297f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
29800 69 6f 6e 2c 20 74 68 65 79 20 64 6f 20 6e 6f 74 ion, they do not
29810 20 6d 61 6b 65 20 0d 0a 2a 2a 20 63 68 61 6e 67 make ..** chang
29820 65 73 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e es to the conten
29830 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 t of the databas
29840 65 20 66 69 6c 65 73 20 6f 6e 20 64 69 73 6b 2e e files on disk.
29850 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
29860 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 6d int sqlite3_stm
29870 74 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 t_readonly(sqlit
29880 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 3b e3_stmt *pStmt);
29890 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
298a0 52 45 46 3a 20 44 65 74 65 72 6d 69 6e 65 20 49 REF: Determine I
298b0 66 20 41 20 50 72 65 70 61 72 65 64 20 53 74 61 f A Prepared Sta
298c0 74 65 6d 65 6e 74 20 48 61 73 20 42 65 65 6e 20 tement Has Been
298d0 52 65 73 65 74 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 Reset..**..** ^T
298e0 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f he sqlite3_stmt_
298f0 62 75 73 79 28 53 29 20 69 6e 74 65 72 66 61 63 busy(S) interfac
29900 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 28 e returns true (
29910 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 non-zero) if the
29920 0d 0a 2a 2a 20 5b 70 72 65 70 61 72 65 64 20 73 ..** [prepared s
29930 74 61 74 65 6d 65 6e 74 5d 20 53 20 68 61 73 20 tatement] S has
29940 62 65 65 6e 20 73 74 65 70 70 65 64 20 61 74 20 been stepped at
29950 6c 65 61 73 74 20 6f 6e 63 65 20 75 73 69 6e 67 least once using
29960 20 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 73 ..** [sqlite3_s
29970 74 65 70 28 53 29 5d 20 62 75 74 20 68 61 73 20 tep(S)] but has
29980 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c not run to compl
29990 65 74 69 6f 6e 20 61 6e 64 2f 6f 72 20 68 61 73 etion and/or has
299a0 20 6e 6f 74 20 0d 0a 2a 2a 20 62 65 65 6e 20 72 not ..** been r
299b0 65 73 65 74 20 75 73 69 6e 67 20 5b 73 71 6c 69 eset using [sqli
299c0 74 65 33 5f 72 65 73 65 74 28 53 29 5d 2e 20 20 te3_reset(S)].
299d0 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d ^The sqlite3_stm
299e0 74 5f 62 75 73 79 28 53 29 0d 0a 2a 2a 20 69 6e t_busy(S)..** in
299f0 74 65 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 terface returns
29a00 66 61 6c 73 65 20 69 66 20 53 20 69 73 20 61 20 false if S is a
29a10 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 20 49 NULL pointer. I
29a20 66 20 53 20 69 73 20 6e 6f 74 20 61 20 0d 0a 2a f S is not a ..*
29a30 2a 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 * NULL pointer a
29a40 6e 64 20 69 73 20 6e 6f 74 20 61 20 70 6f 69 6e nd is not a poin
29a50 74 65 72 20 74 6f 20 61 20 76 61 6c 69 64 20 5b ter to a valid [
29a60 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
29a70 6e 74 5d 0d 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 nt]..** object,
29a80 74 68 65 6e 20 74 68 65 20 62 65 68 61 76 69 6f then the behavio
29a90 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 r is undefined a
29aa0 6e 64 20 70 72 6f 62 61 62 6c 79 20 75 6e 64 65 nd probably unde
29ab0 73 69 72 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a sirable...**..**
29ac0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 This interface
29ad0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 63 can be used in c
29ae0 6f 6d 62 69 6e 61 74 69 6f 6e 20 5b 73 71 6c 69 ombination [sqli
29af0 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 29 5d te3_next_stmt()]
29b00 0d 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 ..** to locate a
29b10 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61 74 ll prepared stat
29b20 65 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65 ements associate
29b30 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 d with a databas
29b40 65 20 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f e ..** connectio
29b50 6e 20 74 68 61 74 20 61 72 65 20 69 6e 20 6e 65 n that are in ne
29b60 65 64 20 6f 66 20 62 65 69 6e 67 20 72 65 73 65 ed of being rese
29b70 74 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 t. This can be
29b80 75 73 65 64 2c 0d 0a 2a 2a 20 66 6f 72 20 65 78 used,..** for ex
29b90 61 6d 70 6c 65 2c 20 69 6e 20 64 69 61 67 6e 6f ample, in diagno
29ba0 73 74 69 63 20 72 6f 75 74 69 6e 65 73 20 74 6f stic routines to
29bb0 20 73 65 61 72 63 68 20 66 6f 72 20 70 72 65 70 search for prep
29bc0 61 72 65 64 20 0d 0a 2a 2a 20 73 74 61 74 65 6d ared ..** statem
29bd0 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 68 6f ents that are ho
29be0 6c 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 lding a transact
29bf0 69 6f 6e 20 6f 70 65 6e 2e 0d 0a 2a 2f 0d 0a 53 ion open...*/..S
29c00 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
29c10 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 lite3_stmt_busy(
29c20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0d sqlite3_stmt*);.
29c30 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 .../*..** CAPI3R
29c40 45 46 3a 20 44 79 6e 61 6d 69 63 61 6c 6c 79 20 EF: Dynamically
29c50 54 79 70 65 64 20 56 61 6c 75 65 20 4f 62 6a 65 Typed Value Obje
29c60 63 74 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a ct..** KEYWORDS:
29c70 20 7b 70 72 6f 74 65 63 74 65 64 20 73 71 6c 69 {protected sqli
29c80 74 65 33 5f 76 61 6c 75 65 7d 20 7b 75 6e 70 72 te3_value} {unpr
29c90 6f 74 65 63 74 65 64 20 73 71 6c 69 74 65 33 5f otected sqlite3_
29ca0 76 61 6c 75 65 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 53 value}..**..** S
29cb0 51 4c 69 74 65 20 75 73 65 73 20 74 68 65 20 73 QLite uses the s
29cc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a qlite3_value obj
29cd0 65 63 74 20 74 6f 20 72 65 70 72 65 73 65 6e 74 ect to represent
29ce0 20 61 6c 6c 20 76 61 6c 75 65 73 0d 0a 2a 2a 20 all values..**
29cf0 74 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 that can be stor
29d00 65 64 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 ed in a database
29d10 20 74 61 62 6c 65 2e 20 53 51 4c 69 74 65 20 75 table. SQLite u
29d20 73 65 73 20 64 79 6e 61 6d 69 63 20 74 79 70 69 ses dynamic typi
29d30 6e 67 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 76 ng..** for the v
29d40 61 6c 75 65 73 20 69 74 20 73 74 6f 72 65 73 2e alues it stores.
29d50 20 20 5e 56 61 6c 75 65 73 20 73 74 6f 72 65 64 ^Values stored
29d60 20 69 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 in sqlite3_valu
29d70 65 20 6f 62 6a 65 63 74 73 0d 0a 2a 2a 20 63 61 e objects..** ca
29d80 6e 20 62 65 20 69 6e 74 65 67 65 72 73 2c 20 66 n be integers, f
29d90 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 loating point va
29da0 6c 75 65 73 2c 20 73 74 72 69 6e 67 73 2c 20 42 lues, strings, B
29db0 4c 4f 42 73 2c 20 6f 72 20 4e 55 4c 4c 2e 0d 0a LOBs, or NULL...
29dc0 2a 2a 0d 0a 2a 2a 20 41 6e 20 73 71 6c 69 74 65 **..** An sqlite
29dd0 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 6d 3_value object m
29de0 61 79 20 62 65 20 65 69 74 68 65 72 20 22 70 72 ay be either "pr
29df0 6f 74 65 63 74 65 64 22 20 6f 72 20 22 75 6e 70 otected" or "unp
29e00 72 6f 74 65 63 74 65 64 22 2e 0d 0a 2a 2a 20 53 rotected"...** S
29e10 6f 6d 65 20 69 6e 74 65 72 66 61 63 65 73 20 72 ome interfaces r
29e20 65 71 75 69 72 65 20 61 20 70 72 6f 74 65 63 74 equire a protect
29e30 65 64 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 ed sqlite3_value
29e40 2e 20 20 4f 74 68 65 72 20 69 6e 74 65 72 66 61 . Other interfa
29e50 63 65 73 0d 0a 2a 2a 20 77 69 6c 6c 20 61 63 63 ces..** will acc
29e60 65 70 74 20 65 69 74 68 65 72 20 61 20 70 72 6f ept either a pro
29e70 74 65 63 74 65 64 20 6f 72 20 61 6e 20 75 6e 70 tected or an unp
29e80 72 6f 74 65 63 74 65 64 20 73 71 6c 69 74 65 33 rotected sqlite3
29e90 5f 76 61 6c 75 65 2e 0d 0a 2a 2a 20 45 76 65 72 _value...** Ever
29ea0 79 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 y interface that
29eb0 20 61 63 63 65 70 74 73 20 73 71 6c 69 74 65 33 accepts sqlite3
29ec0 5f 76 61 6c 75 65 20 61 72 67 75 6d 65 6e 74 73 _value arguments
29ed0 20 73 70 65 63 69 66 69 65 73 0d 0a 2a 2a 20 77 specifies..** w
29ee0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 hether or not it
29ef0 20 72 65 71 75 69 72 65 73 20 61 20 70 72 6f 74 requires a prot
29f00 65 63 74 65 64 20 73 71 6c 69 74 65 33 5f 76 61 ected sqlite3_va
29f10 6c 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 lue...**..** The
29f20 20 74 65 72 6d 73 20 22 70 72 6f 74 65 63 74 65 terms "protecte
29f30 64 22 20 61 6e 64 20 22 75 6e 70 72 6f 74 65 63 d" and "unprotec
29f40 74 65 64 22 20 72 65 66 65 72 20 74 6f 20 77 68 ted" refer to wh
29f50 65 74 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 2a 2a ether or not..**
29f60 20 61 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 a mutex is held
29f70 2e 20 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6d . An internal m
29f80 75 74 65 78 20 69 73 20 68 65 6c 64 20 66 6f 72 utex is held for
29f90 20 61 20 70 72 6f 74 65 63 74 65 64 0d 0a 2a 2a a protected..**
29fa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f sqlite3_value o
29fb0 62 6a 65 63 74 20 62 75 74 20 6e 6f 20 6d 75 74 bject but no mut
29fc0 65 78 20 69 73 20 68 65 6c 64 20 66 6f 72 20 61 ex is held for a
29fd0 6e 20 75 6e 70 72 6f 74 65 63 74 65 64 0d 0a 2a n unprotected..*
29fe0 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 * sqlite3_value
29ff0 6f 62 6a 65 63 74 2e 20 20 49 66 20 53 51 4c 69 object. If SQLi
2a000 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 te is compiled t
2a010 6f 20 62 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 o be single-thre
2a020 61 64 65 64 0d 0a 2a 2a 20 28 77 69 74 68 20 5b aded..** (with [
2a030 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
2a040 45 3d 30 5d 20 61 6e 64 20 77 69 74 68 20 5b 73 E=0] and with [s
2a050 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 qlite3_threadsaf
2a060 65 28 29 5d 20 72 65 74 75 72 6e 69 6e 67 20 30 e()] returning 0
2a070 29 0d 0a 2a 2a 20 6f 72 20 69 66 20 53 51 4c 69 )..** or if SQLi
2a080 74 65 20 69 73 20 72 75 6e 20 69 6e 20 6f 6e 65 te is run in one
2a090 20 6f 66 20 72 65 64 75 63 65 64 20 6d 75 74 65 of reduced mute
2a0a0 78 20 6d 6f 64 65 73 20 0d 0a 2a 2a 20 5b 53 51 x modes ..** [SQ
2a0b0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 LITE_CONFIG_SING
2a0c0 4c 45 54 48 52 45 41 44 5d 20 6f 72 20 5b 53 51 LETHREAD] or [SQ
2a0d0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 LITE_CONFIG_MULT
2a0e0 49 54 48 52 45 41 44 5d 0d 0a 2a 2a 20 74 68 65 ITHREAD]..** the
2a0f0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 n there is no di
2a100 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 stinction betwee
2a110 6e 20 70 72 6f 74 65 63 74 65 64 20 61 6e 64 20 n protected and
2a120 75 6e 70 72 6f 74 65 63 74 65 64 0d 0a 2a 2a 20 unprotected..**
2a130 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 sqlite3_value ob
2a140 6a 65 63 74 73 20 61 6e 64 20 74 68 65 79 20 63 jects and they c
2a150 61 6e 20 62 65 20 75 73 65 64 20 69 6e 74 65 72 an be used inter
2a160 63 68 61 6e 67 65 61 62 6c 79 2e 20 20 48 6f 77 changeably. How
2a170 65 76 65 72 2c 0d 0a 2a 2a 20 66 6f 72 20 6d 61 ever,..** for ma
2a180 78 69 6d 75 6d 20 63 6f 64 65 20 70 6f 72 74 61 ximum code porta
2a190 62 69 6c 69 74 79 20 69 74 20 69 73 20 72 65 63 bility it is rec
2a1a0 6f 6d 6d 65 6e 64 65 64 20 74 68 61 74 20 61 70 ommended that ap
2a1b0 70 6c 69 63 61 74 69 6f 6e 73 0d 0a 2a 2a 20 73 plications..** s
2a1c0 74 69 6c 6c 20 6d 61 6b 65 20 74 68 65 20 64 69 till make the di
2a1d0 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 stinction betwee
2a1e0 6e 20 70 72 6f 74 65 63 74 65 64 20 61 6e 64 20 n protected and
2a1f0 75 6e 70 72 6f 74 65 63 74 65 64 0d 0a 2a 2a 20 unprotected..**
2a200 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 sqlite3_value ob
2a210 6a 65 63 74 73 20 65 76 65 6e 20 77 68 65 6e 20 jects even when
2a220 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71 not strictly req
2a230 75 69 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e uired...**..** ^
2a240 54 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 The sqlite3_valu
2a250 65 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 61 e objects that a
2a260 72 65 20 70 61 73 73 65 64 20 61 73 20 70 61 72 re passed as par
2a270 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 ameters into the
2a280 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 ..** implementat
2a290 69 6f 6e 20 6f 66 20 5b 61 70 70 6c 69 63 61 74 ion of [applicat
2a2a0 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 ion-defined SQL
2a2b0 66 75 6e 63 74 69 6f 6e 73 5d 20 61 72 65 20 70 functions] are p
2a2c0 72 6f 74 65 63 74 65 64 2e 0d 0a 2a 2a 20 5e 54 rotected...** ^T
2a2d0 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 he sqlite3_value
2a2e0 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 object returned
2a2f0 20 62 79 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 by..** [sqlite3
2a300 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 29 5d _column_value()]
2a310 20 69 73 20 75 6e 70 72 6f 74 65 63 74 65 64 2e is unprotected.
2a320 0d 0a 2a 2a 20 55 6e 70 72 6f 74 65 63 74 65 64 ..** Unprotected
2a330 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f sqlite3_value o
2a340 62 6a 65 63 74 73 20 6d 61 79 20 6f 6e 6c 79 20 bjects may only
2a350 62 65 20 75 73 65 64 20 77 69 74 68 0d 0a 2a 2a be used with..**
2a360 20 5b 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 [sqlite3_result
2a370 5f 76 61 6c 75 65 28 29 5d 20 61 6e 64 20 5b 73 _value()] and [s
2a380 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 qlite3_bind_valu
2a390 65 28 29 5d 2e 0d 0a 2a 2a 20 54 68 65 20 5b 73 e()]...** The [s
2a3a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f qlite3_value_blo
2a3b0 62 20 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 b | sqlite3_valu
2a3c0 65 5f 74 79 70 65 28 29 5d 20 66 61 6d 69 6c 79 e_type()] family
2a3d0 20 6f 66 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 of..** interfac
2a3e0 65 73 20 72 65 71 75 69 72 65 20 70 72 6f 74 65 es require prote
2a3f0 63 74 65 64 20 73 71 6c 69 74 65 33 5f 76 61 6c cted sqlite3_val
2a400 75 65 20 6f 62 6a 65 63 74 73 2e 0d 0a 2a 2f 0d ue objects...*/.
2a410 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
2a420 4d 65 6d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 Mem sqlite3_valu
2a430 65 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 e;..../*..** CAP
2a440 49 33 52 45 46 3a 20 53 51 4c 20 46 75 6e 63 74 I3REF: SQL Funct
2a450 69 6f 6e 20 43 6f 6e 74 65 78 74 20 4f 62 6a 65 ion Context Obje
2a460 63 74 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 ct..**..** The c
2a470 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 ontext in which
2a480 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 an SQL function
2a490 65 78 65 63 75 74 65 73 20 69 73 20 73 74 6f 72 executes is stor
2a4a0 65 64 20 69 6e 20 61 6e 0d 0a 2a 2a 20 73 71 6c ed in an..** sql
2a4b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a ite3_context obj
2a4c0 65 63 74 2e 20 20 5e 41 20 70 6f 69 6e 74 65 72 ect. ^A pointer
2a4d0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 to an sqlite3_c
2a4e0 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 0d 0a 2a ontext object..*
2a4f0 2a 20 69 73 20 61 6c 77 61 79 73 20 66 69 72 73 * is always firs
2a500 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 5b t parameter to [
2a510 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 application-defi
2a520 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e ned SQL function
2a530 73 5d 2e 0d 0a 2a 2a 20 54 68 65 20 61 70 70 6c s]...** The appl
2a540 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 ication-defined
2a550 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 SQL function imp
2a560 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c lementation will
2a570 20 70 61 73 73 20 74 68 69 73 0d 0a 2a 2a 20 70 pass this..** p
2a580 6f 69 6e 74 65 72 20 74 68 72 6f 75 67 68 20 69 ointer through i
2a590 6e 74 6f 20 63 61 6c 6c 73 20 74 6f 20 5b 73 71 nto calls to [sq
2a5a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 lite3_result_int
2a5b0 20 7c 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c | sqlite3_resul
2a5c0 74 28 29 5d 2c 0d 0a 2a 2a 20 5b 73 71 6c 69 74 t()],..** [sqlit
2a5d0 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e e3_aggregate_con
2a5e0 74 65 78 74 28 29 5d 2c 20 5b 73 71 6c 69 74 65 text()], [sqlite
2a5f0 33 5f 75 73 65 72 5f 64 61 74 61 28 29 5d 2c 0d 3_user_data()],.
2a600 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e .** [sqlite3_con
2a610 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 29 text_db_handle()
2a620 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 67 65 74 5f ], [sqlite3_get_
2a630 61 75 78 64 61 74 61 28 29 5d 2c 0d 0a 2a 2a 20 auxdata()],..**
2a640 61 6e 64 2f 6f 72 20 5b 73 71 6c 69 74 65 33 5f and/or [sqlite3_
2a650 73 65 74 5f 61 75 78 64 61 74 61 28 29 5d 2e 0d set_auxdata()]..
2a660 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 .*/..typedef str
2a670 75 63 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 uct sqlite3_cont
2a680 65 78 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 ext sqlite3_cont
2a690 65 78 74 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ext;..../*..** C
2a6a0 41 50 49 33 52 45 46 3a 20 42 69 6e 64 69 6e 67 API3REF: Binding
2a6b0 20 56 61 6c 75 65 73 20 54 6f 20 50 72 65 70 61 Values To Prepa
2a6c0 72 65 64 20 53 74 61 74 65 6d 65 6e 74 73 0d 0a red Statements..
2a6d0 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 7b 68 6f ** KEYWORDS: {ho
2a6e0 73 74 20 70 61 72 61 6d 65 74 65 72 7d 20 7b 68 st parameter} {h
2a6f0 6f 73 74 20 70 61 72 61 6d 65 74 65 72 73 7d 20 ost parameters}
2a700 7b 68 6f 73 74 20 70 61 72 61 6d 65 74 65 72 20 {host parameter
2a710 6e 61 6d 65 7d 0d 0a 2a 2a 20 4b 45 59 57 4f 52 name}..** KEYWOR
2a720 44 53 3a 20 7b 53 51 4c 20 70 61 72 61 6d 65 74 DS: {SQL paramet
2a730 65 72 7d 20 7b 53 51 4c 20 70 61 72 61 6d 65 74 er} {SQL paramet
2a740 65 72 73 7d 20 7b 70 61 72 61 6d 65 74 65 72 20 ers} {parameter
2a750 62 69 6e 64 69 6e 67 7d 0d 0a 2a 2a 0d 0a 2a 2a binding}..**..**
2a760 20 5e 28 49 6e 20 74 68 65 20 53 51 4c 20 73 74 ^(In the SQL st
2a770 61 74 65 6d 65 6e 74 20 74 65 78 74 20 69 6e 70 atement text inp
2a780 75 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 70 ut to [sqlite3_p
2a790 72 65 70 61 72 65 5f 76 32 28 29 5d 20 61 6e 64 repare_v2()] and
2a7a0 20 69 74 73 20 76 61 72 69 61 6e 74 73 2c 0d 0a its variants,..
2a7b0 2a 2a 20 6c 69 74 65 72 61 6c 73 20 6d 61 79 20 ** literals may
2a7c0 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 be replaced by a
2a7d0 20 5b 70 61 72 61 6d 65 74 65 72 5d 20 74 68 61 [parameter] tha
2a7e0 74 20 6d 61 74 63 68 65 73 20 6f 6e 65 20 6f 66 t matches one of
2a7f0 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 74 following..** t
2a800 65 6d 70 6c 61 74 65 73 3a 0d 0a 2a 2a 0d 0a 2a emplates:..**..*
2a810 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 * <ul>..** <li>
2a820 20 3f 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 3f 4e 4e ?..** <li> ?NN
2a830 4e 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 3a 56 56 56 N..** <li> :VVV
2a840 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 40 56 56 56 0d ..** <li> @VVV.
2a850 0a 2a 2a 20 3c 6c 69 3e 20 20 24 56 56 56 0d 0a .** <li> $VVV..
2a860 2a 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a ** </ul>..**..**
2a870 20 49 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 In the template
2a880 73 20 61 62 6f 76 65 2c 20 4e 4e 4e 20 72 65 70 s above, NNN rep
2a890 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65 67 resents an integ
2a8a0 65 72 20 6c 69 74 65 72 61 6c 2c 0d 0a 2a 2a 20 er literal,..**
2a8b0 61 6e 64 20 56 56 56 20 72 65 70 72 65 73 65 6e and VVV represen
2a8c0 74 73 20 61 6e 20 61 6c 70 68 61 6e 75 6d 65 72 ts an alphanumer
2a8d0 69 63 20 69 64 65 6e 74 69 66 69 65 72 2e 29 5e ic identifier.)^
2a8e0 20 20 5e 54 68 65 20 76 61 6c 75 65 73 20 6f 66 ^The values of
2a8f0 20 74 68 65 73 65 0d 0a 2a 2a 20 70 61 72 61 6d these..** param
2a900 65 74 65 72 73 20 28 61 6c 73 6f 20 63 61 6c 6c eters (also call
2a910 65 64 20 22 68 6f 73 74 20 70 61 72 61 6d 65 74 ed "host paramet
2a920 65 72 20 6e 61 6d 65 73 22 20 6f 72 20 22 53 51 er names" or "SQ
2a930 4c 20 70 61 72 61 6d 65 74 65 72 73 22 29 0d 0a L parameters")..
2a940 2a 2a 20 63 61 6e 20 62 65 20 73 65 74 20 75 73 ** can be set us
2a950 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f ing the sqlite3_
2a960 62 69 6e 64 5f 2a 28 29 20 72 6f 75 74 69 6e 65 bind_*() routine
2a970 73 20 64 65 66 69 6e 65 64 20 68 65 72 65 2e 0d s defined here..
2a980 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 72 .**..** ^The fir
2a990 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 st argument to t
2a9a0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f he sqlite3_bind_
2a9b0 2a 28 29 20 72 6f 75 74 69 6e 65 73 20 69 73 20 *() routines is
2a9c0 61 6c 77 61 79 73 0d 0a 2a 2a 20 61 20 70 6f 69 always..** a poi
2a9d0 6e 74 65 72 20 74 6f 20 74 68 65 20 5b 73 71 6c nter to the [sql
2a9e0 69 74 65 33 5f 73 74 6d 74 5d 20 6f 62 6a 65 63 ite3_stmt] objec
2a9f0 74 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0d t returned from.
2aa00 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 .** [sqlite3_pre
2aa10 70 61 72 65 5f 76 32 28 29 5d 20 6f 72 20 69 74 pare_v2()] or it
2aa20 73 20 76 61 72 69 61 6e 74 73 2e 0d 0a 2a 2a 0d s variants...**.
2aa30 0a 2a 2a 20 5e 54 68 65 20 73 65 63 6f 6e 64 20 .** ^The second
2aa40 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 argument is the
2aa50 69 6e 64 65 78 20 6f 66 20 74 68 65 20 53 51 4c index of the SQL
2aa60 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65 parameter to be
2aa70 20 73 65 74 2e 0d 0a 2a 2a 20 5e 54 68 65 20 6c set...** ^The l
2aa80 65 66 74 6d 6f 73 74 20 53 51 4c 20 70 61 72 61 eftmost SQL para
2aa90 6d 65 74 65 72 20 68 61 73 20 61 6e 20 69 6e 64 meter has an ind
2aaa0 65 78 20 6f 66 20 31 2e 20 20 5e 57 68 65 6e 20 ex of 1. ^When
2aab0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 64 0d 0a the same named..
2aac0 2a 2a 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 ** SQL parameter
2aad0 20 69 73 20 75 73 65 64 20 6d 6f 72 65 20 74 68 is used more th
2aae0 61 6e 20 6f 6e 63 65 2c 20 73 65 63 6f 6e 64 20 an once, second
2aaf0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0d 0a and subsequent..
2ab00 2a 2a 20 6f 63 63 75 72 72 65 6e 63 65 73 20 68 ** occurrences h
2ab10 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 6e 64 ave the same ind
2ab20 65 78 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ex as the first
2ab30 6f 63 63 75 72 72 65 6e 63 65 2e 0d 0a 2a 2a 20 occurrence...**
2ab40 5e 54 68 65 20 69 6e 64 65 78 20 66 6f 72 20 6e ^The index for n
2ab50 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 amed parameters
2ab60 63 61 6e 20 62 65 20 6c 6f 6f 6b 65 64 20 75 70 can be looked up
2ab70 20 75 73 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 5b using the..** [
2ab80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 sqlite3_bind_par
2ab90 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 29 5d 20 ameter_index()]
2aba0 41 50 49 20 69 66 20 64 65 73 69 72 65 64 2e 20 API if desired.
2abb0 20 5e 54 68 65 20 69 6e 64 65 78 0d 0a 2a 2a 20 ^The index..**
2abc0 66 6f 72 20 22 3f 4e 4e 4e 22 20 70 61 72 61 6d for "?NNN" param
2abd0 65 74 65 72 73 20 69 73 20 74 68 65 20 76 61 6c eters is the val
2abe0 75 65 20 6f 66 20 4e 4e 4e 2e 0d 0a 2a 2a 20 5e ue of NNN...** ^
2abf0 54 68 65 20 4e 4e 4e 20 76 61 6c 75 65 20 6d 75 The NNN value mu
2ac00 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 st be between 1
2ac10 61 6e 64 20 74 68 65 20 5b 73 71 6c 69 74 65 33 and the [sqlite3
2ac20 5f 6c 69 6d 69 74 28 29 5d 0d 0a 2a 2a 20 70 61 _limit()]..** pa
2ac30 72 61 6d 65 74 65 72 20 5b 53 51 4c 49 54 45 5f rameter [SQLITE_
2ac40 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e LIMIT_VARIABLE_N
2ac50 55 4d 42 45 52 5d 20 28 64 65 66 61 75 6c 74 20 UMBER] (default
2ac60 76 61 6c 75 65 3a 20 39 39 39 29 2e 0d 0a 2a 2a value: 999)...**
2ac70 0d 0a 2a 2a 20 5e 54 68 65 20 74 68 69 72 64 20 ..** ^The third
2ac80 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 argument is the
2ac90 76 61 6c 75 65 20 74 6f 20 62 69 6e 64 20 74 6f value to bind to
2aca0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 2e 0d the parameter..
2acb0 0a 2a 2a 0d 0a 2a 2a 20 5e 28 49 6e 20 74 68 6f .**..** ^(In tho
2acc0 73 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 se routines that
2acd0 20 68 61 76 65 20 61 20 66 6f 75 72 74 68 20 61 have a fourth a
2ace0 72 67 75 6d 65 6e 74 2c 20 69 74 73 20 76 61 6c rgument, its val
2acf0 75 65 20 69 73 20 74 68 65 0d 0a 2a 2a 20 6e 75 ue is the..** nu
2ad00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
2ad10 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 2e 20 the parameter.
2ad20 20 54 6f 20 62 65 20 63 6c 65 61 72 3a 20 74 68 To be clear: th
2ad30 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 0d 0a e value is the..
2ad40 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 3c 75 3e ** number of <u>
2ad50 62 79 74 65 73 3c 2f 75 3e 20 69 6e 20 74 68 65 bytes</u> in the
2ad60 20 76 61 6c 75 65 2c 20 6e 6f 74 20 74 68 65 20 value, not the
2ad70 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 number of charac
2ad80 74 65 72 73 2e 29 5e 0d 0a 2a 2a 20 5e 49 66 20 ters.)^..** ^If
2ad90 74 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d the fourth param
2ada0 65 74 65 72 20 69 73 20 6e 65 67 61 74 69 76 65 eter is negative
2adb0 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 , the length of
2adc0 74 68 65 20 73 74 72 69 6e 67 20 69 73 0d 0a 2a the string is..*
2add0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 * the number of
2ade0 62 79 74 65 73 20 75 70 20 74 6f 20 74 68 65 20 bytes up to the
2adf0 66 69 72 73 74 20 7a 65 72 6f 20 74 65 72 6d 69 first zero termi
2ae00 6e 61 74 6f 72 2e 0d 0a 2a 2a 20 49 66 20 61 20 nator...** If a
2ae10 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 66 6f 75 non-negative fou
2ae20 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 rth parameter is
2ae30 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73 71 6c provided to sql
2ae40 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 29 ite3_bind_text()
2ae50 0d 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f ..** or sqlite3_
2ae60 62 69 6e 64 5f 74 65 78 74 31 36 28 29 20 74 68 bind_text16() th
2ae70 65 6e 20 74 68 61 74 20 70 61 72 61 6d 65 74 65 en that paramete
2ae80 72 20 6d 75 73 74 20 62 65 20 74 68 65 20 62 79 r must be the by
2ae90 74 65 20 6f 66 66 73 65 74 0d 0a 2a 2a 20 77 68 te offset..** wh
2aea0 65 72 65 20 74 68 65 20 4e 55 4c 20 74 65 72 6d ere the NUL term
2aeb0 69 6e 61 74 6f 72 20 77 6f 75 6c 64 20 6f 63 63 inator would occ
2aec0 75 72 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 ur assuming the
2aed0 73 74 72 69 6e 67 20 77 65 72 65 20 4e 55 4c 0d string were NUL.
2aee0 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 65 64 2e 20 .** terminated.
2aef0 20 49 66 20 61 6e 79 20 4e 55 4c 20 63 68 61 72 If any NUL char
2af00 61 63 74 65 72 73 20 6f 63 63 75 72 20 61 74 20 acters occur at
2af10 62 79 74 65 20 6f 66 66 73 65 74 73 20 6c 65 73 byte offsets les
2af20 73 20 74 68 61 6e 20 0d 0a 2a 2a 20 74 68 65 20 s than ..** the
2af30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f 75 value of the fou
2af40 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 68 rth parameter th
2af50 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 en the resulting
2af60 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 77 69 string value wi
2af70 6c 6c 0d 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 65 ll..** contain e
2af80 6d 62 65 64 64 65 64 20 4e 55 4c 73 2e 20 20 54 mbedded NULs. T
2af90 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 78 70 he result of exp
2afa0 72 65 73 73 69 6f 6e 73 20 69 6e 76 6f 6c 76 69 ressions involvi
2afb0 6e 67 20 73 74 72 69 6e 67 73 0d 0a 2a 2a 20 77 ng strings..** w
2afc0 69 74 68 20 65 6d 62 65 64 64 65 64 20 4e 55 4c ith embedded NUL
2afd0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0d s is undefined..
2afe0 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 66 .**..** ^The fif
2aff0 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 th argument to s
2b000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 qlite3_bind_blob
2b010 28 29 2c 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 (), sqlite3_bind
2b020 5f 74 65 78 74 28 29 2c 20 61 6e 64 0d 0a 2a 2a _text(), and..**
2b030 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 sqlite3_bind_te
2b040 78 74 31 36 28 29 20 69 73 20 61 20 64 65 73 74 xt16() is a dest
2b050 72 75 63 74 6f 72 20 75 73 65 64 20 74 6f 20 64 ructor used to d
2b060 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 42 4c ispose of the BL
2b070 4f 42 20 6f 72 0d 0a 2a 2a 20 73 74 72 69 6e 67 OB or..** string
2b080 20 61 66 74 65 72 20 53 51 4c 69 74 65 20 68 61 after SQLite ha
2b090 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 s finished with
2b0a0 69 74 2e 20 20 5e 54 68 65 20 64 65 73 74 72 75 it. ^The destru
2b0b0 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0d 0a ctor is called..
2b0c0 2a 2a 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 ** to dispose of
2b0d0 20 74 68 65 20 42 4c 4f 42 20 6f 72 20 73 74 72 the BLOB or str
2b0e0 69 6e 67 20 65 76 65 6e 20 69 66 20 74 68 65 20 ing even if the
2b0f0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f call to sqlite3_
2b100 62 69 6e 64 5f 62 6c 6f 62 28 29 2c 0d 0a 2a 2a bind_blob(),..**
2b110 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 sqlite3_bind_te
2b120 78 74 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 xt(), or sqlite3
2b130 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 29 20 66 _bind_text16() f
2b140 61 69 6c 73 2e 20 20 0d 0a 2a 2a 20 5e 49 66 20 ails. ..** ^If
2b150 74 68 65 20 66 69 66 74 68 20 61 72 67 75 6d 65 the fifth argume
2b160 6e 74 20 69 73 0d 0a 2a 2a 20 74 68 65 20 73 70 nt is..** the sp
2b170 65 63 69 61 6c 20 76 61 6c 75 65 20 5b 53 51 4c ecial value [SQL
2b180 49 54 45 5f 53 54 41 54 49 43 5d 2c 20 74 68 65 ITE_STATIC], the
2b190 6e 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 73 n SQLite assumes
2b1a0 20 74 68 61 74 20 74 68 65 0d 0a 2a 2a 20 69 6e that the..** in
2b1b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e 20 formation is in
2b1c0 73 74 61 74 69 63 2c 20 75 6e 6d 61 6e 61 67 65 static, unmanage
2b1d0 64 20 73 70 61 63 65 20 61 6e 64 20 64 6f 65 73 d space and does
2b1e0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 not need to be
2b1f0 66 72 65 65 64 2e 0d 0a 2a 2a 20 5e 49 66 20 74 freed...** ^If t
2b200 68 65 20 66 69 66 74 68 20 61 72 67 75 6d 65 6e he fifth argumen
2b210 74 20 68 61 73 20 74 68 65 20 76 61 6c 75 65 20 t has the value
2b220 5b 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e [SQLITE_TRANSIEN
2b230 54 5d 2c 20 74 68 65 6e 0d 0a 2a 2a 20 53 51 4c T], then..** SQL
2b240 69 74 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 ite makes its ow
2b250 6e 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f n private copy o
2b260 66 20 74 68 65 20 64 61 74 61 20 69 6d 6d 65 64 f the data immed
2b270 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 0d 0a iately, before..
2b280 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 ** the sqlite3_b
2b290 69 6e 64 5f 2a 28 29 20 72 6f 75 74 69 6e 65 20 ind_*() routine
2b2a0 72 65 74 75 72 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a returns...**..**
2b2b0 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 62 69 ^The sqlite3_bi
2b2c0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 29 20 72 6f nd_zeroblob() ro
2b2d0 75 74 69 6e 65 20 62 69 6e 64 73 20 61 20 42 4c utine binds a BL
2b2e0 4f 42 20 6f 66 20 6c 65 6e 67 74 68 20 4e 20 74 OB of length N t
2b2f0 68 61 74 0d 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 hat..** is fille
2b300 64 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 20 d with zeroes.
2b310 5e 41 20 7a 65 72 6f 62 6c 6f 62 20 75 73 65 73 ^A zeroblob uses
2b320 20 61 20 66 69 78 65 64 20 61 6d 6f 75 6e 74 20 a fixed amount
2b330 6f 66 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 28 6a of memory..** (j
2b340 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 74 ust an integer t
2b350 6f 20 68 6f 6c 64 20 69 74 73 20 73 69 7a 65 29 o hold its size)
2b360 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 while it is bei
2b370 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 0d 0a 2a ng processed...*
2b380 2a 20 5a 65 72 6f 62 6c 6f 62 73 20 61 72 65 20 * Zeroblobs are
2b390 69 6e 74 65 6e 64 65 64 20 74 6f 20 73 65 72 76 intended to serv
2b3a0 65 20 61 73 20 70 6c 61 63 65 68 6f 6c 64 65 72 e as placeholder
2b3b0 73 20 66 6f 72 20 42 4c 4f 42 73 20 77 68 6f 73 s for BLOBs whos
2b3c0 65 0d 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 69 73 e..** content is
2b3d0 20 6c 61 74 65 72 20 77 72 69 74 74 65 6e 20 75 later written u
2b3e0 73 69 6e 67 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 sing..** [sqlite
2b3f0 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 7c 20 69 6e 3_blob_open | in
2b400 63 72 65 6d 65 6e 74 61 6c 20 42 4c 4f 42 20 49 cremental BLOB I
2b410 2f 4f 5d 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a /O] routines...*
2b420 2a 20 5e 41 20 6e 65 67 61 74 69 76 65 20 76 61 * ^A negative va
2b430 6c 75 65 20 66 6f 72 20 74 68 65 20 7a 65 72 6f lue for the zero
2b440 62 6c 6f 62 20 72 65 73 75 6c 74 73 20 69 6e 20 blob results in
2b450 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 42 4c a zero-length BL
2b460 4f 42 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 OB...**..** ^If
2b470 61 6e 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 any of the sqlit
2b480 65 33 5f 62 69 6e 64 5f 2a 28 29 20 72 6f 75 74 e3_bind_*() rout
2b490 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 ines are called
2b4a0 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e with a NULL poin
2b4b0 74 65 72 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 ter..** for the
2b4c0 5b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d [prepared statem
2b4d0 65 6e 74 5d 20 6f 72 20 77 69 74 68 20 61 20 70 ent] or with a p
2b4e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
2b4f0 74 20 66 6f 72 20 77 68 69 63 68 0d 0a 2a 2a 20 t for which..**
2b500 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 5d [sqlite3_step()]
2b510 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 has been called
2b520 20 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79 20 74 more recently t
2b530 68 61 6e 20 5b 73 71 6c 69 74 65 33 5f 72 65 73 han [sqlite3_res
2b540 65 74 28 29 5d 2c 0d 0a 2a 2a 20 74 68 65 6e 20 et()],..** then
2b550 74 68 65 20 63 61 6c 6c 20 77 69 6c 6c 20 72 65 the call will re
2b560 74 75 72 6e 20 5b 53 51 4c 49 54 45 5f 4d 49 53 turn [SQLITE_MIS
2b570 55 53 45 5d 2e 20 20 49 66 20 61 6e 79 20 73 71 USE]. If any sq
2b580 6c 69 74 65 33 5f 62 69 6e 64 5f 28 29 0d 0a 2a lite3_bind_()..*
2b590 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 73 * routine is pas
2b5a0 73 65 64 20 61 20 5b 70 72 65 70 61 72 65 64 20 sed a [prepared
2b5b0 73 74 61 74 65 6d 65 6e 74 5d 20 74 68 61 74 20 statement] that
2b5c0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a has been finaliz
2b5d0 65 64 2c 20 74 68 65 0d 0a 2a 2a 20 72 65 73 75 ed, the..** resu
2b5e0 6c 74 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 lt is undefined
2b5f0 61 6e 64 20 70 72 6f 62 61 62 6c 79 20 68 61 72 and probably har
2b600 6d 66 75 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 42 mful...**..** ^B
2b610 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 indings are not
2b620 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 20 5b cleared by the [
2b630 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 5d sqlite3_reset()]
2b640 20 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2a 20 5e 55 routine...** ^U
2b650 6e 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 nbound parameter
2b660 73 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 s are interprete
2b670 64 20 61 73 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a d as NULL...**..
2b680 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
2b690 62 69 6e 64 5f 2a 20 72 6f 75 74 69 6e 65 73 20 bind_* routines
2b6a0 72 65 74 75 72 6e 20 5b 53 51 4c 49 54 45 5f 4f return [SQLITE_O
2b6b0 4b 5d 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 K] on success or
2b6c0 20 61 6e 0d 0a 2a 2a 20 5b 65 72 72 6f 72 20 63 an..** [error c
2b6d0 6f 64 65 5d 20 69 66 20 61 6e 79 74 68 69 6e 67 ode] if anything
2b6e0 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0d 0a 2a 2a goes wrong...**
2b6f0 20 5e 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d ^[SQLITE_RANGE]
2b700 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 is returned if
2b710 74 68 65 20 70 61 72 61 6d 65 74 65 72 0d 0a 2a the parameter..*
2b720 2a 20 69 6e 64 65 78 20 69 73 20 6f 75 74 20 6f * index is out o
2b730 66 20 72 61 6e 67 65 2e 20 20 5e 5b 53 51 4c 49 f range. ^[SQLI
2b740 54 45 5f 4e 4f 4d 45 4d 5d 20 69 73 20 72 65 74 TE_NOMEM] is ret
2b750 75 72 6e 65 64 20 69 66 20 6d 61 6c 6c 6f 63 28 urned if malloc(
2b760 29 20 66 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a ) fails...**..**
2b770 20 53 65 65 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 See also: [sqli
2b780 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 te3_bind_paramet
2b790 65 72 5f 63 6f 75 6e 74 28 29 5d 2c 0d 0a 2a 2a er_count()],..**
2b7a0 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 [sqlite3_bind_p
2b7b0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 5d arameter_name()]
2b7c0 2c 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 62 , and [sqlite3_b
2b7d0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e ind_parameter_in
2b7e0 64 65 78 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c dex()]...*/..SQL
2b7f0 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
2b800 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 73 71 te3_bind_blob(sq
2b810 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 lite3_stmt*, int
2b820 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69 , const void*, i
2b830 6e 74 20 6e 2c 20 76 6f 69 64 28 2a 29 28 76 6f nt n, void(*)(vo
2b840 69 64 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 id*));..SQLITE_A
2b850 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 PI int sqlite3_b
2b860 69 6e 64 5f 64 6f 75 62 6c 65 28 73 71 6c 69 74 ind_double(sqlit
2b870 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 2c 20 64 e3_stmt*, int, d
2b880 6f 75 62 6c 65 29 3b 0d 0a 53 51 4c 49 54 45 5f ouble);..SQLITE_
2b890 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
2b8a0 62 69 6e 64 5f 69 6e 74 28 73 71 6c 69 74 65 33 bind_int(sqlite3
2b8b0 5f 73 74 6d 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 _stmt*, int, int
2b8c0 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 );..SQLITE_API i
2b8d0 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f nt sqlite3_bind_
2b8e0 69 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 73 74 int64(sqlite3_st
2b8f0 6d 74 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 mt*, int, sqlite
2b900 33 5f 69 6e 74 36 34 29 3b 0d 0a 53 51 4c 49 54 3_int64);..SQLIT
2b910 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
2b920 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 73 71 6c 69 3_bind_null(sqli
2b930 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b te3_stmt*, int);
2b940 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
2b950 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 sqlite3_bind_te
2b960 78 74 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a xt(sqlite3_stmt*
2b970 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 , int, const cha
2b980 72 2a 2c 20 69 6e 74 20 6e 2c 20 76 6f 69 64 28 r*, int n, void(
2b990 2a 29 28 76 6f 69 64 2a 29 29 3b 0d 0a 53 51 4c *)(void*));..SQL
2b9a0 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
2b9b0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 te3_bind_text16(
2b9c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 sqlite3_stmt*, i
2b9d0 6e 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 2c nt, const void*,
2b9e0 20 69 6e 74 2c 20 76 6f 69 64 28 2a 29 28 76 6f int, void(*)(vo
2b9f0 69 64 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 id*));..SQLITE_A
2ba00 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 PI int sqlite3_b
2ba10 69 6e 64 5f 76 61 6c 75 65 28 73 71 6c 69 74 65 ind_value(sqlite
2ba20 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 2c 20 63 6f 3_stmt*, int, co
2ba30 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 nst sqlite3_valu
2ba40 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 e*);..SQLITE_API
2ba50 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 69 6e int sqlite3_bin
2ba60 64 5f 7a 65 72 6f 62 6c 6f 62 28 73 71 6c 69 74 d_zeroblob(sqlit
2ba70 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 2c 20 69 e3_stmt*, int, i
2ba80 6e 74 20 6e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a nt n);..../*..**
2ba90 20 43 41 50 49 33 52 45 46 3a 20 4e 75 6d 62 65 CAPI3REF: Numbe
2baa0 72 20 4f 66 20 53 51 4c 20 50 61 72 61 6d 65 74 r Of SQL Paramet
2bab0 65 72 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 ers..**..** ^Thi
2bac0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 s routine can be
2bad0 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20 74 68 used to find th
2bae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 5b 53 51 4c e number of [SQL
2baf0 20 70 61 72 61 6d 65 74 65 72 73 5d 0d 0a 2a 2a parameters]..**
2bb00 20 69 6e 20 61 20 5b 70 72 65 70 61 72 65 64 20 in a [prepared
2bb10 73 74 61 74 65 6d 65 6e 74 5d 2e 20 20 53 51 4c statement]. SQL
2bb20 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 parameters are
2bb30 74 6f 6b 65 6e 73 20 6f 66 20 74 68 65 0d 0a 2a tokens of the..*
2bb40 2a 20 66 6f 72 6d 20 22 3f 22 2c 20 22 3f 4e 4e * form "?", "?NN
2bb50 4e 22 2c 20 22 3a 41 41 41 22 2c 20 22 24 41 41 N", ":AAA", "$AA
2bb60 41 22 2c 20 6f 72 20 22 40 41 41 41 22 20 74 68 A", or "@AAA" th
2bb70 61 74 20 73 65 72 76 65 20 61 73 0d 0a 2a 2a 20 at serve as..**
2bb80 70 6c 61 63 65 68 6f 6c 64 65 72 73 20 66 6f 72 placeholders for
2bb90 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 values that are
2bba0 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 [sqlite3_bind_b
2bbb0 6c 6f 62 20 7c 20 62 6f 75 6e 64 5d 0d 0a 2a 2a lob | bound]..**
2bbc0 20 74 6f 20 74 68 65 20 70 61 72 61 6d 65 74 65 to the paramete
2bbd0 72 73 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 rs at a later ti
2bbe0 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 me...**..** ^(Th
2bbf0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 75 61 is routine actua
2bc00 6c 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 lly returns the
2bc10 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6c 61 72 index of the lar
2bc20 67 65 73 74 20 28 72 69 67 68 74 6d 6f 73 74 29 gest (rightmost)
2bc30 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 ..** parameter.
2bc40 46 6f 72 20 61 6c 6c 20 66 6f 72 6d 73 20 65 78 For all forms ex
2bc50 63 65 70 74 20 3f 4e 4e 4e 2c 20 74 68 69 73 20 cept ?NNN, this
2bc60 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 will correspond
2bc70 74 6f 20 74 68 65 0d 0a 2a 2a 20 6e 75 6d 62 65 to the..** numbe
2bc80 72 20 6f 66 20 75 6e 69 71 75 65 20 70 61 72 61 r of unique para
2bc90 6d 65 74 65 72 73 2e 20 20 49 66 20 70 61 72 61 meters. If para
2bca0 6d 65 74 65 72 73 20 6f 66 20 74 68 65 20 3f 4e meters of the ?N
2bcb0 4e 4e 20 66 6f 72 6d 20 61 72 65 20 75 73 65 64 NN form are used
2bcc0 2c 0d 0a 2a 2a 20 74 68 65 72 65 20 6d 61 79 20 ,..** there may
2bcd0 62 65 20 67 61 70 73 20 69 6e 20 74 68 65 20 6c be gaps in the l
2bce0 69 73 74 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 ist.)^..**..** S
2bcf0 65 65 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 ee also: [sqlite
2bd00 33 5f 62 69 6e 64 5f 62 6c 6f 62 7c 73 71 6c 69 3_bind_blob|sqli
2bd10 74 65 33 5f 62 69 6e 64 28 29 5d 2c 0d 0a 2a 2a te3_bind()],..**
2bd20 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 [sqlite3_bind_p
2bd30 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 5d arameter_name()]
2bd40 2c 20 61 6e 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 , and..** [sqlit
2bd50 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 e3_bind_paramete
2bd60 72 5f 69 6e 64 65 78 28 29 5d 2e 0d 0a 2a 2f 0d r_index()]...*/.
2bd70 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
2bd80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 sqlite3_bind_par
2bd90 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 73 71 6c ameter_count(sql
2bda0 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0d 0a 0d 0a ite3_stmt*);....
2bdb0 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
2bdc0 20 4e 61 6d 65 20 4f 66 20 41 20 48 6f 73 74 20 Name Of A Host
2bdd0 50 61 72 61 6d 65 74 65 72 0d 0a 2a 2a 0d 0a 2a Parameter..**..*
2bde0 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 62 * ^The sqlite3_b
2bdf0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 ind_parameter_na
2be00 6d 65 28 50 2c 4e 29 20 69 6e 74 65 72 66 61 63 me(P,N) interfac
2be10 65 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 74 68 e returns..** th
2be20 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 2d e name of the N-
2be30 74 68 20 5b 53 51 4c 20 70 61 72 61 6d 65 74 65 th [SQL paramete
2be40 72 5d 20 69 6e 20 74 68 65 20 5b 70 72 65 70 61 r] in the [prepa
2be50 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 50 red statement] P
2be60 2e 0d 0a 2a 2a 20 5e 28 53 51 4c 20 70 61 72 61 ...** ^(SQL para
2be70 6d 65 74 65 72 73 20 6f 66 20 74 68 65 20 66 6f meters of the fo
2be80 72 6d 20 22 3f 4e 4e 4e 22 20 6f 72 20 22 3a 41 rm "?NNN" or ":A
2be90 41 41 22 20 6f 72 20 22 40 41 41 41 22 20 6f 72 AA" or "@AAA" or
2bea0 20 22 24 41 41 41 22 0d 0a 2a 2a 20 68 61 76 65 "$AAA"..** have
2beb0 20 61 20 6e 61 6d 65 20 77 68 69 63 68 20 69 73 a name which is
2bec0 20 74 68 65 20 73 74 72 69 6e 67 20 22 3f 4e 4e the string "?NN
2bed0 4e 22 20 6f 72 20 22 3a 41 41 41 22 20 6f 72 20 N" or ":AAA" or
2bee0 22 40 41 41 41 22 20 6f 72 20 22 24 41 41 41 22 "@AAA" or "$AAA"
2bef0 0d 0a 2a 2a 20 72 65 73 70 65 63 74 69 76 65 6c ..** respectivel
2bf00 79 2e 0d 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 y...** In other
2bf10 77 6f 72 64 73 2c 20 74 68 65 20 69 6e 69 74 69 words, the initi
2bf20 61 6c 20 22 3a 22 20 6f 72 20 22 24 22 20 6f 72 al ":" or "$" or
2bf30 20 22 40 22 20 6f 72 20 22 3f 22 0d 0a 2a 2a 20 "@" or "?"..**
2bf40 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20 70 is included as p
2bf50 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 2e art of the name.
2bf60 29 5e 0d 0a 2a 2a 20 5e 50 61 72 61 6d 65 74 65 )^..** ^Paramete
2bf70 72 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 rs of the form "
2bf80 3f 22 20 77 69 74 68 6f 75 74 20 61 20 66 6f 6c ?" without a fol
2bf90 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20 68 lowing integer h
2bfa0 61 76 65 20 6e 6f 20 6e 61 6d 65 0d 0a 2a 2a 20 ave no name..**
2bfb0 61 6e 64 20 61 72 65 20 72 65 66 65 72 72 65 64 and are referred
2bfc0 20 74 6f 20 61 73 20 22 6e 61 6d 65 6c 65 73 73 to as "nameless
2bfd0 22 20 6f 72 20 22 61 6e 6f 6e 79 6d 6f 75 73 20 " or "anonymous
2bfe0 70 61 72 61 6d 65 74 65 72 73 22 2e 0d 0a 2a 2a parameters"...**
2bff0 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 72 73 74 20 ..** ^The first
2c000 68 6f 73 74 20 70 61 72 61 6d 65 74 65 72 20 68 host parameter h
2c010 61 73 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 31 as an index of 1
2c020 2c 20 6e 6f 74 20 30 2e 0d 0a 2a 2a 0d 0a 2a 2a , not 0...**..**
2c030 20 5e 49 66 20 74 68 65 20 76 61 6c 75 65 20 4e ^If the value N
2c040 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 is out of range
2c050 20 6f 72 20 69 66 20 74 68 65 20 4e 2d 74 68 20 or if the N-th
2c060 70 61 72 61 6d 65 74 65 72 20 69 73 0d 0a 2a 2a parameter is..**
2c070 20 6e 61 6d 65 6c 65 73 73 2c 20 74 68 65 6e 20 nameless, then
2c080 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 NULL is returned
2c090 2e 20 20 5e 54 68 65 20 72 65 74 75 72 6e 65 64 . ^The returned
2c0a0 20 73 74 72 69 6e 67 20 69 73 0d 0a 2a 2a 20 61 string is..** a
2c0b0 6c 77 61 79 73 20 69 6e 20 55 54 46 2d 38 20 65 lways in UTF-8 e
2c0c0 6e 63 6f 64 69 6e 67 20 65 76 65 6e 20 69 66 20 ncoding even if
2c0d0 74 68 65 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 the named parame
2c0e0 74 65 72 20 77 61 73 0d 0a 2a 2a 20 6f 72 69 67 ter was..** orig
2c0f0 69 6e 61 6c 6c 79 20 73 70 65 63 69 66 69 65 64 inally specified
2c100 20 61 73 20 55 54 46 2d 31 36 20 69 6e 20 5b 73 as UTF-16 in [s
2c110 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 qlite3_prepare16
2c120 28 29 5d 20 6f 72 0d 0a 2a 2a 20 5b 73 71 6c 69 ()] or..** [sqli
2c130 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 te3_prepare16_v2
2c140 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 ()]...**..** See
2c150 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 33 5f also: [sqlite3_
2c160 62 69 6e 64 5f 62 6c 6f 62 7c 73 71 6c 69 74 65 bind_blob|sqlite
2c170 33 5f 62 69 6e 64 28 29 5d 2c 0d 0a 2a 2a 20 5b 3_bind()],..** [
2c180 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 sqlite3_bind_par
2c190 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 29 5d 2c ameter_count()],
2c1a0 20 61 6e 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 and..** [sqlite
2c1b0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 3_bind_parameter
2c1c0 5f 69 6e 64 65 78 28 29 5d 2e 0d 0a 2a 2f 0d 0a _index()]...*/..
2c1d0 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
2c1e0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 62 char *sqlite3_b
2c1f0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 ind_parameter_na
2c200 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a me(sqlite3_stmt*
2c210 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a , int);..../*..*
2c220 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6e 64 65 * CAPI3REF: Inde
2c230 78 20 4f 66 20 41 20 50 61 72 61 6d 65 74 65 72 x Of A Parameter
2c240 20 57 69 74 68 20 41 20 47 69 76 65 6e 20 4e 61 With A Given Na
2c250 6d 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 52 65 74 75 me..**..** ^Retu
2c260 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 rn the index of
2c270 61 6e 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 an SQL parameter
2c280 20 67 69 76 65 6e 20 69 74 73 20 6e 61 6d 65 2e given its name.
2c290 20 20 5e 54 68 65 0d 0a 2a 2a 20 69 6e 64 65 78 ^The..** index
2c2a0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 value returned
2c2b0 69 73 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 is suitable for
2c2c0 75 73 65 20 61 73 20 74 68 65 20 73 65 63 6f 6e use as the secon
2c2d0 64 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 d..** parameter
2c2e0 74 6f 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 to [sqlite3_bind
2c2f0 5f 62 6c 6f 62 7c 73 71 6c 69 74 65 33 5f 62 69 _blob|sqlite3_bi
2c300 6e 64 28 29 5d 2e 20 20 5e 41 20 7a 65 72 6f 0d nd()]. ^A zero.
2c310 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 .** is returned
2c320 69 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 70 if no matching p
2c330 61 72 61 6d 65 74 65 72 20 69 73 20 66 6f 75 6e arameter is foun
2c340 64 2e 20 20 5e 54 68 65 20 70 61 72 61 6d 65 74 d. ^The paramet
2c350 65 72 0d 0a 2a 2a 20 6e 61 6d 65 20 6d 75 73 74 er..** name must
2c360 20 62 65 20 67 69 76 65 6e 20 69 6e 20 55 54 46 be given in UTF
2c370 2d 38 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f -8 even if the o
2c380 72 69 67 69 6e 61 6c 20 73 74 61 74 65 6d 65 6e riginal statemen
2c390 74 0d 0a 2a 2a 20 77 61 73 20 70 72 65 70 61 72 t..** was prepar
2c3a0 65 64 20 66 72 6f 6d 20 55 54 46 2d 31 36 20 74 ed from UTF-16 t
2c3b0 65 78 74 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 ext using [sqlit
2c3c0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 e3_prepare16_v2(
2c3d0 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 )]...**..** See
2c3e0 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 33 5f 62 also: [sqlite3_b
2c3f0 69 6e 64 5f 62 6c 6f 62 7c 73 71 6c 69 74 65 33 ind_blob|sqlite3
2c400 5f 62 69 6e 64 28 29 5d 2c 0d 0a 2a 2a 20 5b 73 _bind()],..** [s
2c410 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 qlite3_bind_para
2c420 6d 65 74 65 72 5f 63 6f 75 6e 74 28 29 5d 2c 20 meter_count()],
2c430 61 6e 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 and..** [sqlite3
2c440 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f _bind_parameter_
2c450 69 6e 64 65 78 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 index()]...*/..S
2c460 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
2c470 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d lite3_bind_param
2c480 65 74 65 72 5f 69 6e 64 65 78 28 73 71 6c 69 74 eter_index(sqlit
2c490 65 33 5f 73 74 6d 74 2a 2c 20 63 6f 6e 73 74 20 e3_stmt*, const
2c4a0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 3b 0d 0a 0d char *zName);...
2c4b0 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
2c4c0 3a 20 52 65 73 65 74 20 41 6c 6c 20 42 69 6e 64 : Reset All Bind
2c4d0 69 6e 67 73 20 4f 6e 20 41 20 50 72 65 70 61 72 ings On A Prepar
2c4e0 65 64 20 53 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a ed Statement..**
2c4f0 0d 0a 2a 2a 20 5e 43 6f 6e 74 72 61 72 79 20 74 ..** ^Contrary t
2c500 6f 20 74 68 65 20 69 6e 74 75 69 74 69 6f 6e 20 o the intuition
2c510 6f 66 20 6d 61 6e 79 2c 20 5b 73 71 6c 69 74 65 of many, [sqlite
2c520 33 5f 72 65 73 65 74 28 29 5d 20 64 6f 65 73 20 3_reset()] does
2c530 6e 6f 74 20 72 65 73 65 74 0d 0a 2a 2a 20 74 68 not reset..** th
2c540 65 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f e [sqlite3_bind_
2c550 62 6c 6f 62 20 7c 20 62 69 6e 64 69 6e 67 73 5d blob | bindings]
2c560 20 6f 6e 20 61 20 5b 70 72 65 70 61 72 65 64 20 on a [prepared
2c570 73 74 61 74 65 6d 65 6e 74 5d 2e 0d 0a 2a 2a 20 statement]...**
2c580 5e 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e ^Use this routin
2c590 65 20 74 6f 20 72 65 73 65 74 20 61 6c 6c 20 68 e to reset all h
2c5a0 6f 73 74 20 70 61 72 61 6d 65 74 65 72 73 20 74 ost parameters t
2c5b0 6f 20 4e 55 4c 4c 2e 0d 0a 2a 2f 0d 0a 53 51 4c o NULL...*/..SQL
2c5c0 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
2c5d0 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e te3_clear_bindin
2c5e0 67 73 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a gs(sqlite3_stmt*
2c5f0 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 );..../*..** CAP
2c600 49 33 52 45 46 3a 20 4e 75 6d 62 65 72 20 4f 66 I3REF: Number Of
2c610 20 43 6f 6c 75 6d 6e 73 20 49 6e 20 41 20 52 65 Columns In A Re
2c620 73 75 6c 74 20 53 65 74 0d 0a 2a 2a 0d 0a 2a 2a sult Set..**..**
2c630 20 5e 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d ^Return the num
2c640 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 ber of columns i
2c650 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 n the result set
2c660 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 returned by the
2c670 0d 0a 2a 2a 20 5b 70 72 65 70 61 72 65 64 20 73 ..** [prepared s
2c680 74 61 74 65 6d 65 6e 74 5d 2e 20 5e 54 68 69 73 tatement]. ^This
2c690 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
2c6a0 20 30 20 69 66 20 70 53 74 6d 74 20 69 73 20 61 0 if pStmt is a
2c6b0 6e 20 53 51 4c 0d 0a 2a 2a 20 73 74 61 74 65 6d n SQL..** statem
2c6c0 65 6e 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f ent that does no
2c6d0 74 20 72 65 74 75 72 6e 20 64 61 74 61 20 28 66 t return data (f
2c6e0 6f 72 20 65 78 61 6d 70 6c 65 20 61 6e 20 5b 55 or example an [U
2c6f0 50 44 41 54 45 5d 29 2e 0d 0a 2a 2a 0d 0a 2a 2a PDATE])...**..**
2c700 20 53 65 65 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 See also: [sqli
2c710 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 29 te3_data_count()
2c720 5d 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ]..*/..SQLITE_AP
2c730 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f I int sqlite3_co
2c740 6c 75 6d 6e 5f 63 6f 75 6e 74 28 73 71 6c 69 74 lumn_count(sqlit
2c750 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 3b e3_stmt *pStmt);
2c760 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
2c770 52 45 46 3a 20 43 6f 6c 75 6d 6e 20 4e 61 6d 65 REF: Column Name
2c780 73 20 49 6e 20 41 20 52 65 73 75 6c 74 20 53 65 s In A Result Se
2c790 74 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 73 65 t..**..** ^These
2c7a0 20 72 6f 75 74 69 6e 65 73 20 72 65 74 75 72 6e routines return
2c7b0 20 74 68 65 20 6e 61 6d 65 20 61 73 73 69 67 6e the name assign
2c7c0 65 64 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c ed to a particul
2c7d0 61 72 20 63 6f 6c 75 6d 6e 0d 0a 2a 2a 20 69 6e ar column..** in
2c7e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 the result set
2c7f0 6f 66 20 61 20 5b 53 45 4c 45 43 54 5d 20 73 74 of a [SELECT] st
2c800 61 74 65 6d 65 6e 74 2e 20 20 5e 54 68 65 20 73 atement. ^The s
2c810 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 qlite3_column_na
2c820 6d 65 28 29 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 me()..** interfa
2c830 63 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 ce returns a poi
2c840 6e 74 65 72 20 74 6f 20 61 20 7a 65 72 6f 2d 74 nter to a zero-t
2c850 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 erminated UTF-8
2c860 73 74 72 69 6e 67 0d 0a 2a 2a 20 61 6e 64 20 73 string..** and s
2c870 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 qlite3_column_na
2c880 6d 65 31 36 28 29 20 72 65 74 75 72 6e 73 20 61 me16() returns a
2c890 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65 pointer to a ze
2c8a0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 0d 0a 2a ro-terminated..*
2c8b0 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e * UTF-16 string.
2c8c0 20 20 5e 54 68 65 20 66 69 72 73 74 20 70 61 72 ^The first par
2c8d0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 5b 70 ameter is the [p
2c8e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
2c8f0 74 5d 0d 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c t]..** that impl
2c900 65 6d 65 6e 74 73 20 74 68 65 20 5b 53 45 4c 45 ements the [SELE
2c910 43 54 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20 5e CT] statement. ^
2c920 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d The second param
2c930 65 74 65 72 20 69 73 20 74 68 65 0d 0a 2a 2a 20 eter is the..**
2c940 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 column number.
2c950 5e 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f ^The leftmost co
2c960 6c 75 6d 6e 20 69 73 20 6e 75 6d 62 65 72 20 30 lumn is number 0
2c970 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 72 ...**..** ^The r
2c980 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 70 eturned string p
2c990 6f 69 6e 74 65 72 20 69 73 20 76 61 6c 69 64 20 ointer is valid
2c9a0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68 65 until either the
2c9b0 20 5b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 [prepared state
2c9c0 6d 65 6e 74 5d 0d 0a 2a 2a 20 69 73 20 64 65 73 ment]..** is des
2c9d0 74 72 6f 79 65 64 20 62 79 20 5b 73 71 6c 69 74 troyed by [sqlit
2c9e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 20 6f e3_finalize()] o
2c9f0 72 20 75 6e 74 69 6c 20 74 68 65 20 73 74 61 74 r until the stat
2ca00 65 6d 65 6e 74 20 69 73 20 61 75 74 6f 6d 61 74 ement is automat
2ca10 69 63 61 6c 6c 79 0d 0a 2a 2a 20 72 65 70 72 65 ically..** repre
2ca20 70 61 72 65 64 20 62 79 20 74 68 65 20 66 69 72 pared by the fir
2ca30 73 74 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 st call to [sqli
2ca40 74 65 33 5f 73 74 65 70 28 29 5d 20 66 6f 72 20 te3_step()] for
2ca50 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 75 6e a particular run
2ca60 0d 0a 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 74 68 ..** or until th
2ca70 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0d 0a e next call to..
2ca80 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d ** sqlite3_colum
2ca90 6e 5f 6e 61 6d 65 28 29 20 6f 72 20 73 71 6c 69 n_name() or sqli
2caa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 te3_column_name1
2cab0 36 28 29 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6() on the same
2cac0 63 6f 6c 75 6d 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 column...**..**
2cad0 5e 49 66 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c ^If sqlite3_mall
2cae0 6f 63 28 29 20 66 61 69 6c 73 20 64 75 72 69 6e oc() fails durin
2caf0 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 g the processing
2cb00 20 6f 66 20 65 69 74 68 65 72 20 72 6f 75 74 69 of either routi
2cb10 6e 65 0d 0a 2a 2a 20 28 66 6f 72 20 65 78 61 6d ne..** (for exam
2cb20 70 6c 65 20 64 75 72 69 6e 67 20 61 20 63 6f 6e ple during a con
2cb30 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 55 54 46 version from UTF
2cb40 2d 38 20 74 6f 20 55 54 46 2d 31 36 29 20 74 68 -8 to UTF-16) th
2cb50 65 6e 20 61 0d 0a 2a 2a 20 4e 55 4c 4c 20 70 6f en a..** NULL po
2cb60 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 inter is returne
2cb70 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 d...**..** ^The
2cb80 6e 61 6d 65 20 6f 66 20 61 20 72 65 73 75 6c 74 name of a result
2cb90 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 76 column is the v
2cba0 61 6c 75 65 20 6f 66 20 74 68 65 20 22 41 53 22 alue of the "AS"
2cbb0 20 63 6c 61 75 73 65 20 66 6f 72 0d 0a 2a 2a 20 clause for..**
2cbc0 74 68 61 74 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 that column, if
2cbd0 74 68 65 72 65 20 69 73 20 61 6e 20 41 53 20 63 there is an AS c
2cbe0 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 72 65 lause. If there
2cbf0 20 69 73 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 is no AS clause
2cc00 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 6e 61 ..** then the na
2cc10 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e me of the column
2cc20 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 20 is unspecified
2cc30 61 6e 64 20 6d 61 79 20 63 68 61 6e 67 65 20 66 and may change f
2cc40 72 6f 6d 0d 0a 2a 2a 20 6f 6e 65 20 72 65 6c 65 rom..** one rele
2cc50 61 73 65 20 6f 66 20 53 51 4c 69 74 65 20 74 6f ase of SQLite to
2cc60 20 74 68 65 20 6e 65 78 74 2e 0d 0a 2a 2f 0d 0a the next...*/..
2cc70 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
2cc80 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 char *sqlite3_c
2cc90 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 73 71 6c 69 74 olumn_name(sqlit
2cca0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 20 4e 29 e3_stmt*, int N)
2ccb0 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f ;..SQLITE_API co
2ccc0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 nst void *sqlite
2ccd0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 28 3_column_name16(
2cce0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 sqlite3_stmt*, i
2ccf0 6e 74 20 4e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a nt N);..../*..**
2cd00 20 43 41 50 49 33 52 45 46 3a 20 53 6f 75 72 63 CAPI3REF: Sourc
2cd10 65 20 4f 66 20 44 61 74 61 20 49 6e 20 41 20 51 e Of Data In A Q
2cd20 75 65 72 79 20 52 65 73 75 6c 74 0d 0a 2a 2a 0d uery Result..**.
2cd30 0a 2a 2a 20 5e 54 68 65 73 65 20 72 6f 75 74 69 .** ^These routi
2cd40 6e 65 73 20 70 72 6f 76 69 64 65 20 61 20 6d 65 nes provide a me
2cd50 61 6e 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 ans to determine
2cd60 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 the database, t
2cd70 61 62 6c 65 2c 20 61 6e 64 0d 0a 2a 2a 20 74 61 able, and..** ta
2cd80 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 ble column that
2cd90 69 73 20 74 68 65 20 6f 72 69 67 69 6e 20 6f 66 is the origin of
2cda0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 a particular re
2cdb0 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 69 6e 0d 0a sult column in..
2cdc0 2a 2a 20 5b 53 45 4c 45 43 54 5d 20 73 74 61 74 ** [SELECT] stat
2cdd0 65 6d 65 6e 74 2e 0d 0a 2a 2a 20 5e 54 68 65 20 ement...** ^The
2cde0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 name of the data
2cdf0 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6f 72 base or table or
2ce00 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 72 column can be r
2ce10 65 74 75 72 6e 65 64 20 61 73 0d 0a 2a 2a 20 65 eturned as..** e
2ce20 69 74 68 65 72 20 61 20 55 54 46 2d 38 20 6f 72 ither a UTF-8 or
2ce30 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 20 UTF-16 string.
2ce40 20 5e 54 68 65 20 5f 64 61 74 61 62 61 73 65 5f ^The _database_
2ce50 20 72 6f 75 74 69 6e 65 73 20 72 65 74 75 72 6e routines return
2ce60 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 ..** the databas
2ce70 65 20 6e 61 6d 65 2c 20 74 68 65 20 5f 74 61 62 e name, the _tab
2ce80 6c 65 5f 20 72 6f 75 74 69 6e 65 73 20 72 65 74 le_ routines ret
2ce90 75 72 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 urn the table na
2cea0 6d 65 2c 20 61 6e 64 0d 0a 2a 2a 20 74 68 65 20 me, and..** the
2ceb0 6f 72 69 67 69 6e 5f 20 72 6f 75 74 69 6e 65 73 origin_ routines
2cec0 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 return the colu
2ced0 6d 6e 20 6e 61 6d 65 2e 0d 0a 2a 2a 20 5e 54 68 mn name...** ^Th
2cee0 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e e returned strin
2cef0 67 20 69 73 20 76 61 6c 69 64 20 75 6e 74 69 6c g is valid until
2cf00 20 74 68 65 20 5b 70 72 65 70 61 72 65 64 20 73 the [prepared s
2cf10 74 61 74 65 6d 65 6e 74 5d 20 69 73 20 64 65 73 tatement] is des
2cf20 74 72 6f 79 65 64 0d 0a 2a 2a 20 75 73 69 6e 67 troyed..** using
2cf30 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 [sqlite3_finali
2cf40 7a 65 28 29 5d 20 6f 72 20 75 6e 74 69 6c 20 74 ze()] or until t
2cf50 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 he statement is
2cf60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0d 0a 2a automatically..*
2cf70 2a 20 72 65 70 72 65 70 61 72 65 64 20 62 79 20 * reprepared by
2cf80 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 the first call t
2cf90 6f 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 o [sqlite3_step(
2cfa0 29 5d 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 )] for a particu
2cfb0 6c 61 72 20 72 75 6e 0d 0a 2a 2a 20 6f 72 20 75 lar run..** or u
2cfc0 6e 74 69 6c 20 74 68 65 20 73 61 6d 65 20 69 6e ntil the same in
2cfd0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 formation is req
2cfe0 75 65 73 74 65 64 0d 0a 2a 2a 20 61 67 61 69 6e uested..** again
2cff0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 in a different
2d000 65 6e 63 6f 64 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a encoding...**..*
2d010 2a 20 5e 54 68 65 20 6e 61 6d 65 73 20 72 65 74 * ^The names ret
2d020 75 72 6e 65 64 20 61 72 65 20 74 68 65 20 6f 72 urned are the or
2d030 69 67 69 6e 61 6c 20 75 6e 2d 61 6c 69 61 73 65 iginal un-aliase
2d040 64 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0d 0a d names of the..
2d050 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 ** database, tab
2d060 6c 65 2c 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 0d le, and column..
2d070 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 72 .**..** ^The fir
2d080 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 st argument to t
2d090 68 65 73 65 20 69 6e 74 65 72 66 61 63 65 73 20 hese interfaces
2d0a0 69 73 20 61 20 5b 70 72 65 70 61 72 65 64 20 73 is a [prepared s
2d0b0 74 61 74 65 6d 65 6e 74 5d 2e 0d 0a 2a 2a 20 5e tatement]...** ^
2d0c0 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 These functions
2d0d0 72 65 74 75 72 6e 20 69 6e 66 6f 72 6d 61 74 69 return informati
2d0e0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4e 74 68 on about the Nth
2d0f0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 72 result column r
2d100 65 74 75 72 6e 65 64 20 62 79 0d 0a 2a 2a 20 74 eturned by..** t
2d110 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 77 68 he statement, wh
2d120 65 72 65 20 4e 20 69 73 20 74 68 65 20 73 65 63 ere N is the sec
2d130 6f 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 ond function arg
2d140 75 6d 65 6e 74 2e 0d 0a 2a 2a 20 5e 54 68 65 20 ument...** ^The
2d150 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e left-most column
2d160 20 69 73 20 63 6f 6c 75 6d 6e 20 30 20 66 6f 72 is column 0 for
2d170 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 2e these routines.
2d180 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 ..**..** ^If the
2d190 20 4e 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 Nth column retu
2d1a0 72 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 rned by the stat
2d1b0 65 6d 65 6e 74 20 69 73 20 61 6e 20 65 78 70 72 ement is an expr
2d1c0 65 73 73 69 6f 6e 20 6f 72 0d 0a 2a 2a 20 73 75 ession or..** su
2d1d0 62 71 75 65 72 79 20 61 6e 64 20 69 73 20 6e 6f bquery and is no
2d1e0 74 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 t a column value
2d1f0 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 , then all of th
2d200 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 ese functions re
2d210 74 75 72 6e 0d 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 turn..** NULL.
2d220 5e 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 6d ^These routine m
2d230 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e ight also return
2d240 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 NULL if a memor
2d250 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 y allocation err
2d260 6f 72 0d 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 or..** occurs.
2d270 5e 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 79 ^Otherwise, they
2d280 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 return the name
2d290 20 6f 66 20 74 68 65 20 61 74 74 61 63 68 65 64 of the attached
2d2a0 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 database, table
2d2b0 2c 0d 0a 2a 2a 20 6f 72 20 63 6f 6c 75 6d 6e 20 ,..** or column
2d2c0 74 68 61 74 20 71 75 65 72 79 20 72 65 73 75 6c that query resul
2d2d0 74 20 63 6f 6c 75 6d 6e 20 77 61 73 20 65 78 74 t column was ext
2d2e0 72 61 63 74 65 64 20 66 72 6f 6d 2e 0d 0a 2a 2a racted from...**
2d2f0 0d 0a 2a 2a 20 5e 41 73 20 77 69 74 68 20 61 6c ..** ^As with al
2d300 6c 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 41 l other SQLite A
2d310 50 49 73 2c 20 74 68 6f 73 65 20 77 68 6f 73 65 PIs, those whose
2d320 20 6e 61 6d 65 73 20 65 6e 64 20 77 69 74 68 20 names end with
2d330 22 31 36 22 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 "16" return..**
2d340 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 73 UTF-16 encoded s
2d350 74 72 69 6e 67 73 20 61 6e 64 20 74 68 65 20 6f trings and the o
2d360 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 ther functions r
2d370 65 74 75 72 6e 20 55 54 46 2d 38 2e 0d 0a 2a 2a eturn UTF-8...**
2d380 0d 0a 2a 2a 20 5e 54 68 65 73 65 20 41 50 49 73 ..** ^These APIs
2d390 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 are only availa
2d3a0 62 6c 65 20 69 66 20 74 68 65 20 6c 69 62 72 61 ble if the libra
2d3b0 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 ry was compiled
2d3c0 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 with the..** [SQ
2d3d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 LITE_ENABLE_COLU
2d3e0 4d 4e 5f 4d 45 54 41 44 41 54 41 5d 20 43 2d 70 MN_METADATA] C-p
2d3f0 72 65 70 72 6f 63 65 73 73 6f 72 20 73 79 6d 62 reprocessor symb
2d400 6f 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 ol...**..** If t
2d410 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 wo or more threa
2d420 64 73 20 63 61 6c 6c 20 6f 6e 65 20 6f 72 20 6d ds call one or m
2d430 6f 72 65 20 6f 66 20 74 68 65 73 65 20 72 6f 75 ore of these rou
2d440 74 69 6e 65 73 20 61 67 61 69 6e 73 74 20 74 68 tines against th
2d450 65 20 73 61 6d 65 0d 0a 2a 2a 20 70 72 65 70 61 e same..** prepa
2d460 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 6e red statement an
2d470 64 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 d column at the
2d480 73 61 6d 65 20 74 69 6d 65 20 74 68 65 6e 20 74 same time then t
2d490 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 0d 0a he results are..
2d4a0 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a ** undefined...*
2d4b0 2a 0d 0a 2a 2a 20 49 66 20 74 77 6f 20 6f 72 20 *..** If two or
2d4c0 6d 6f 72 65 20 74 68 72 65 61 64 73 20 63 61 6c more threads cal
2d4d0 6c 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0d 0a 2a l one or more..*
2d4e0 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d * [sqlite3_colum
2d4f0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 20 n_database_name
2d500 7c 20 63 6f 6c 75 6d 6e 20 6d 65 74 61 64 61 74 | column metadat
2d510 61 20 69 6e 74 65 72 66 61 63 65 73 5d 0d 0a 2a a interfaces]..*
2d520 2a 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 5b * for the same [
2d530 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
2d540 6e 74 5d 20 61 6e 64 20 72 65 73 75 6c 74 20 63 nt] and result c
2d550 6f 6c 75 6d 6e 0d 0a 2a 2a 20 61 74 20 74 68 65 olumn..** at the
2d560 20 73 61 6d 65 20 74 69 6d 65 20 74 68 65 6e 20 same time then
2d570 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 the results are
2d580 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a undefined...*/..
2d590 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
2d5a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 char *sqlite3_c
2d5b0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e olumn_database_n
2d5c0 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 ame(sqlite3_stmt
2d5d0 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f *,int);..SQLITE_
2d5e0 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a API const void *
2d5f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 sqlite3_column_d
2d600 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 28 73 atabase_name16(s
2d610 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 69 6e 74 qlite3_stmt*,int
2d620 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 );..SQLITE_API c
2d630 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 onst char *sqlit
2d640 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f e3_column_table_
2d650 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d name(sqlite3_stm
2d660 74 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 t*,int);..SQLITE
2d670 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 _API const void
2d680 2a 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f *sqlite3_column_
2d690 74 61 62 6c 65 5f 6e 61 6d 65 31 36 28 73 71 6c table_name16(sql
2d6a0 69 74 65 33 5f 73 74 6d 74 2a 2c 69 6e 74 29 3b ite3_stmt*,int);
2d6b0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e ..SQLITE_API con
2d6c0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 st char *sqlite3
2d6d0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e _column_origin_n
2d6e0 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 ame(sqlite3_stmt
2d6f0 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f *,int);..SQLITE_
2d700 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a API const void *
2d710 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f sqlite3_column_o
2d720 72 69 67 69 6e 5f 6e 61 6d 65 31 36 28 73 71 6c rigin_name16(sql
2d730 69 74 65 33 5f 73 74 6d 74 2a 2c 69 6e 74 29 3b ite3_stmt*,int);
2d740 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
2d750 52 45 46 3a 20 44 65 63 6c 61 72 65 64 20 44 61 REF: Declared Da
2d760 74 61 74 79 70 65 20 4f 66 20 41 20 51 75 65 72 tatype Of A Quer
2d770 79 20 52 65 73 75 6c 74 0d 0a 2a 2a 0d 0a 2a 2a y Result..**..**
2d780 20 5e 28 54 68 65 20 66 69 72 73 74 20 70 61 72 ^(The first par
2d790 61 6d 65 74 65 72 20 69 73 20 61 20 5b 70 72 65 ameter is a [pre
2d7a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d pared statement]
2d7b0 2e 0d 0a 2a 2a 20 49 66 20 74 68 69 73 20 73 74 ...** If this st
2d7c0 61 74 65 6d 65 6e 74 20 69 73 20 61 20 5b 53 45 atement is a [SE
2d7d0 4c 45 43 54 5d 20 73 74 61 74 65 6d 65 6e 74 20 LECT] statement
2d7e0 61 6e 64 20 74 68 65 20 4e 74 68 20 63 6f 6c 75 and the Nth colu
2d7f0 6d 6e 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 72 65 mn of the..** re
2d800 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 73 65 turned result se
2d810 74 20 6f 66 20 74 68 61 74 20 5b 53 45 4c 45 43 t of that [SELEC
2d820 54 5d 20 69 73 20 61 20 74 61 62 6c 65 20 63 6f T] is a table co
2d830 6c 75 6d 6e 20 28 6e 6f 74 20 61 6e 0d 0a 2a 2a lumn (not an..**
2d840 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 73 expression or s
2d850 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 ubquery) then th
2d860 65 20 64 65 63 6c 61 72 65 64 20 74 79 70 65 20 e declared type
2d870 6f 66 20 74 68 65 20 74 61 62 6c 65 0d 0a 2a 2a of the table..**
2d880 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 column is retur
2d890 6e 65 64 2e 29 5e 20 20 5e 49 66 20 74 68 65 20 ned.)^ ^If the
2d8a0 4e 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 Nth column of th
2d8b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 e result set is
2d8c0 61 6e 0d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f an..** expressio
2d8d0 6e 20 6f 72 20 73 75 62 71 75 65 72 79 2c 20 74 n or subquery, t
2d8e0 68 65 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 hen a NULL point
2d8f0 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d er is returned..
2d900 0a 2a 2a 20 5e 54 68 65 20 72 65 74 75 72 6e 65 .** ^The returne
2d910 64 20 73 74 72 69 6e 67 20 69 73 20 61 6c 77 61 d string is alwa
2d920 79 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 ys UTF-8 encoded
2d930 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 46 6f 72 20 ...**..** ^(For
2d940 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74 example, given t
2d950 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 he database sche
2d960 6d 61 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 43 52 45 41 ma:..**..** CREA
2d970 54 45 20 54 41 42 4c 45 20 74 31 28 63 31 20 56 TE TABLE t1(c1 V
2d980 41 52 49 41 4e 54 29 3b 0d 0a 2a 2a 0d 0a 2a 2a ARIANT);..**..**
2d990 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 and the followi
2d9a0 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 ng statement to
2d9b0 62 65 20 63 6f 6d 70 69 6c 65 64 3a 0d 0a 2a 2a be compiled:..**
2d9c0 0d 0a 2a 2a 20 53 45 4c 45 43 54 20 63 31 20 2b ..** SELECT c1 +
2d9d0 20 31 2c 20 63 31 20 46 52 4f 4d 20 74 31 3b 0d 1, c1 FROM t1;.
2d9e0 0a 2a 2a 0d 0a 2a 2a 20 74 68 69 73 20 72 6f 75 .**..** this rou
2d9f0 74 69 6e 65 20 77 6f 75 6c 64 20 72 65 74 75 72 tine would retur
2da00 6e 20 74 68 65 20 73 74 72 69 6e 67 20 22 56 41 n the string "VA
2da10 52 49 41 4e 54 22 20 66 6f 72 20 74 68 65 20 73 RIANT" for the s
2da20 65 63 6f 6e 64 20 72 65 73 75 6c 74 0d 0a 2a 2a econd result..**
2da30 20 63 6f 6c 75 6d 6e 20 28 69 3d 3d 31 29 2c 20 column (i==1),
2da40 61 6e 64 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 and a NULL point
2da50 65 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 er for the first
2da60 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 28 result column (
2da70 69 3d 3d 30 29 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a i==0).)^..**..**
2da80 20 5e 53 51 4c 69 74 65 20 75 73 65 73 20 64 79 ^SQLite uses dy
2da90 6e 61 6d 69 63 20 72 75 6e 2d 74 69 6d 65 20 74 namic run-time t
2daa0 79 70 69 6e 67 2e 20 20 5e 53 6f 20 6a 75 73 74 yping. ^So just
2dab0 20 62 65 63 61 75 73 65 20 61 20 63 6f 6c 75 6d because a colum
2dac0 6e 0d 0a 2a 2a 20 69 73 20 64 65 63 6c 61 72 65 n..** is declare
2dad0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 70 d to contain a p
2dae0 61 72 74 69 63 75 6c 61 72 20 74 79 70 65 20 64 articular type d
2daf0 6f 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68 61 oes not mean tha
2db00 74 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 20 73 t the..** data s
2db10 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 63 6f tored in that co
2db20 6c 75 6d 6e 20 69 73 20 6f 66 20 74 68 65 20 64 lumn is of the d
2db30 65 63 6c 61 72 65 64 20 74 79 70 65 2e 20 20 53 eclared type. S
2db40 51 4c 69 74 65 20 69 73 0d 0a 2a 2a 20 73 74 72 QLite is..** str
2db50 6f 6e 67 6c 79 20 74 79 70 65 64 2c 20 62 75 74 ongly typed, but
2db60 20 74 68 65 20 74 79 70 69 6e 67 20 69 73 20 64 the typing is d
2db70 79 6e 61 6d 69 63 20 6e 6f 74 20 73 74 61 74 69 ynamic not stati
2db80 63 2e 20 20 5e 54 79 70 65 0d 0a 2a 2a 20 69 73 c. ^Type..** is
2db90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
2dba0 20 69 6e 64 69 76 69 64 75 61 6c 20 76 61 6c 75 individual valu
2dbb0 65 73 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 es, not with the
2dbc0 20 63 6f 6e 74 61 69 6e 65 72 73 0d 0a 2a 2a 20 containers..**
2dbd0 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 6f used to hold tho
2dbe0 73 65 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f 0d 0a se values...*/..
2dbf0 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
2dc00 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 char *sqlite3_c
2dc10 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 73 olumn_decltype(s
2dc20 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 69 6e 74 qlite3_stmt*,int
2dc30 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 );..SQLITE_API c
2dc40 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 onst void *sqlit
2dc50 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 e3_column_declty
2dc60 70 65 31 36 28 73 71 6c 69 74 65 33 5f 73 74 6d pe16(sqlite3_stm
2dc70 74 2a 2c 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a t*,int);..../*..
2dc80 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 45 76 61 ** CAPI3REF: Eva
2dc90 6c 75 61 74 65 20 41 6e 20 53 51 4c 20 53 74 61 luate An SQL Sta
2dca0 74 65 6d 65 6e 74 0d 0a 2a 2a 0d 0a 2a 2a 20 41 tement..**..** A
2dcb0 66 74 65 72 20 61 20 5b 70 72 65 70 61 72 65 64 fter a [prepared
2dcc0 20 73 74 61 74 65 6d 65 6e 74 5d 20 68 61 73 20 statement] has
2dcd0 62 65 65 6e 20 70 72 65 70 61 72 65 64 20 75 73 been prepared us
2dce0 69 6e 67 20 65 69 74 68 65 72 0d 0a 2a 2a 20 5b ing either..** [
2dcf0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f sqlite3_prepare_
2dd00 76 32 28 29 5d 20 6f 72 20 5b 73 71 6c 69 74 65 v2()] or [sqlite
2dd10 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 29 3_prepare16_v2()
2dd20 5d 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 ] or one of the
2dd30 6c 65 67 61 63 79 0d 0a 2a 2a 20 69 6e 74 65 72 legacy..** inter
2dd40 66 61 63 65 73 20 5b 73 71 6c 69 74 65 33 5f 70 faces [sqlite3_p
2dd50 72 65 70 61 72 65 28 29 5d 20 6f 72 20 5b 73 71 repare()] or [sq
2dd60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 lite3_prepare16(
2dd70 29 5d 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f )], this functio
2dd80 6e 0d 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61 n..** must be ca
2dd90 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 lled one or more
2dda0 20 74 69 6d 65 73 20 74 6f 20 65 76 61 6c 75 61 times to evalua
2ddb0 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 te the statement
2ddc0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 64 65 ...**..** The de
2ddd0 74 61 69 6c 73 20 6f 66 20 74 68 65 20 62 65 68 tails of the beh
2dde0 61 76 69 6f 72 20 6f 66 20 74 68 65 20 73 71 6c avior of the sql
2ddf0 69 74 65 33 5f 73 74 65 70 28 29 20 69 6e 74 65 ite3_step() inte
2de00 72 66 61 63 65 20 64 65 70 65 6e 64 0d 0a 2a 2a rface depend..**
2de10 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 on whether the
2de20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 70 72 statement was pr
2de30 65 70 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 epared using the
2de40 20 6e 65 77 65 72 20 22 76 32 22 20 69 6e 74 65 newer "v2" inte
2de50 72 66 61 63 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 rface..** [sqlit
2de60 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 5d e3_prepare_v2()]
2de70 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 70 72 and [sqlite3_pr
2de80 65 70 61 72 65 31 36 5f 76 32 28 29 5d 20 6f 72 epare16_v2()] or
2de90 20 74 68 65 20 6f 6c 64 65 72 20 6c 65 67 61 63 the older legac
2dea0 79 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 y..** interface
2deb0 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 [sqlite3_prepare
2dec0 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 ()] and [sqlite3
2ded0 5f 70 72 65 70 61 72 65 31 36 28 29 5d 2e 20 20 _prepare16()].
2dee0 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 0d 0a The use of the..
2def0 2a 2a 20 6e 65 77 20 22 76 32 22 20 69 6e 74 65 ** new "v2" inte
2df00 72 66 61 63 65 20 69 73 20 72 65 63 6f 6d 6d 65 rface is recomme
2df10 6e 64 65 64 20 66 6f 72 20 6e 65 77 20 61 70 70 nded for new app
2df20 6c 69 63 61 74 69 6f 6e 73 20 62 75 74 20 74 68 lications but th
2df30 65 20 6c 65 67 61 63 79 0d 0a 2a 2a 20 69 6e 74 e legacy..** int
2df40 65 72 66 61 63 65 20 77 69 6c 6c 20 63 6f 6e 74 erface will cont
2df50 69 6e 75 65 20 74 6f 20 62 65 20 73 75 70 70 6f inue to be suppo
2df60 72 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 rted...**..** ^I
2df70 6e 20 74 68 65 20 6c 65 67 61 63 79 20 69 6e 74 n the legacy int
2df80 65 72 66 61 63 65 2c 20 74 68 65 20 72 65 74 75 erface, the retu
2df90 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 rn value will be
2dfa0 20 65 69 74 68 65 72 20 5b 53 51 4c 49 54 45 5f either [SQLITE_
2dfb0 42 55 53 59 5d 2c 0d 0a 2a 2a 20 5b 53 51 4c 49 BUSY],..** [SQLI
2dfc0 54 45 5f 44 4f 4e 45 5d 2c 20 5b 53 51 4c 49 54 TE_DONE], [SQLIT
2dfd0 45 5f 52 4f 57 5d 2c 20 5b 53 51 4c 49 54 45 5f E_ROW], [SQLITE_
2dfe0 45 52 52 4f 52 5d 2c 20 6f 72 20 5b 53 51 4c 49 ERROR], or [SQLI
2dff0 54 45 5f 4d 49 53 55 53 45 5d 2e 0d 0a 2a 2a 20 TE_MISUSE]...**
2e000 5e 57 69 74 68 20 74 68 65 20 22 76 32 22 20 69 ^With the "v2" i
2e010 6e 74 65 72 66 61 63 65 2c 20 61 6e 79 20 6f 66 nterface, any of
2e020 20 74 68 65 20 6f 74 68 65 72 20 5b 72 65 73 75 the other [resu
2e030 6c 74 20 63 6f 64 65 73 5d 20 6f 72 0d 0a 2a 2a lt codes] or..**
2e040 20 5b 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c [extended resul
2e050 74 20 63 6f 64 65 73 5d 20 6d 69 67 68 74 20 62 t codes] might b
2e060 65 20 72 65 74 75 72 6e 65 64 20 61 73 20 77 65 e returned as we
2e070 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 5b 53 51 ll...**..** ^[SQ
2e080 4c 49 54 45 5f 42 55 53 59 5d 20 6d 65 61 6e 73 LITE_BUSY] means
2e090 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 that the databa
2e0a0 73 65 20 65 6e 67 69 6e 65 20 77 61 73 20 75 6e se engine was un
2e0b0 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20 able to acquire
2e0c0 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 the..** database
2e0d0 20 6c 6f 63 6b 73 20 69 74 20 6e 65 65 64 73 20 locks it needs
2e0e0 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62 2e 20 20 to do its job.
2e0f0 5e 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e ^If the statemen
2e100 74 20 69 73 20 61 20 5b 43 4f 4d 4d 49 54 5d 0d t is a [COMMIT].
2e110 0a 2a 2a 20 6f 72 20 6f 63 63 75 72 73 20 6f 75 .** or occurs ou
2e120 74 73 69 64 65 20 6f 66 20 61 6e 20 65 78 70 6c tside of an expl
2e130 69 63 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e icit transaction
2e140 2c 20 74 68 65 6e 20 79 6f 75 20 63 61 6e 20 72 , then you can r
2e150 65 74 72 79 20 74 68 65 0d 0a 2a 2a 20 73 74 61 etry the..** sta
2e160 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 tement. If the
2e170 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 statement is not
2e180 20 61 20 5b 43 4f 4d 4d 49 54 5d 20 61 6e 64 20 a [COMMIT] and
2e190 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 61 6e occurs within an
2e1a0 0d 0a 2a 2a 20 65 78 70 6c 69 63 69 74 20 74 72 ..** explicit tr
2e1b0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 79 ansaction then y
2e1c0 6f 75 20 73 68 6f 75 6c 64 20 72 6f 6c 6c 62 61 ou should rollba
2e1d0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 ck the transacti
2e1e0 6f 6e 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 63 6f on before..** co
2e1f0 6e 74 69 6e 75 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a ntinuing...**..*
2e200 2a 20 5e 5b 53 51 4c 49 54 45 5f 44 4f 4e 45 5d * ^[SQLITE_DONE]
2e210 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 means that the
2e220 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 66 69 statement has fi
2e230 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 nished executing
2e240 0d 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c ..** successfull
2e250 79 2e 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 y. sqlite3_step
2e260 28 29 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 () should not be
2e270 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 6f 6e called again on
2e280 20 74 68 69 73 20 76 69 72 74 75 61 6c 0d 0a 2a this virtual..*
2e290 2a 20 6d 61 63 68 69 6e 65 20 77 69 74 68 6f 75 * machine withou
2e2a0 74 20 66 69 72 73 74 20 63 61 6c 6c 69 6e 67 20 t first calling
2e2b0 5b 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 [sqlite3_reset()
2e2c0 5d 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 76 ] to reset the v
2e2d0 69 72 74 75 61 6c 0d 0a 2a 2a 20 6d 61 63 68 69 irtual..** machi
2e2e0 6e 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 69 ne back to its i
2e2f0 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0d 0a 2a nitial state...*
2e300 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 53 51 *..** ^If the SQ
2e310 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e L statement bein
2e320 67 20 65 78 65 63 75 74 65 64 20 72 65 74 75 72 g executed retur
2e330 6e 73 20 61 6e 79 20 64 61 74 61 2c 20 74 68 65 ns any data, the
2e340 6e 20 5b 53 51 4c 49 54 45 5f 52 4f 57 5d 0d 0a n [SQLITE_ROW]..
2e350 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 65 ** is returned e
2e360 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 72 ach time a new r
2e370 6f 77 20 6f 66 20 64 61 74 61 20 69 73 20 72 65 ow of data is re
2e380 61 64 79 20 66 6f 72 20 70 72 6f 63 65 73 73 69 ady for processi
2e390 6e 67 20 62 79 20 74 68 65 0d 0a 2a 2a 20 63 61 ng by the..** ca
2e3a0 6c 6c 65 72 2e 20 54 68 65 20 76 61 6c 75 65 73 ller. The values
2e3b0 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 may be accessed
2e3c0 20 75 73 69 6e 67 20 74 68 65 20 5b 63 6f 6c 75 using the [colu
2e3d0 6d 6e 20 61 63 63 65 73 73 20 66 75 6e 63 74 69 mn access functi
2e3e0 6f 6e 73 5d 2e 0d 0a 2a 2a 20 73 71 6c 69 74 65 ons]...** sqlite
2e3f0 33 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 3_step() is call
2e400 65 64 20 61 67 61 69 6e 20 74 6f 20 72 65 74 72 ed again to retr
2e410 69 65 76 65 20 74 68 65 20 6e 65 78 74 20 72 6f ieve the next ro
2e420 77 20 6f 66 20 64 61 74 61 2e 0d 0a 2a 2a 0d 0a w of data...**..
2e430 2a 2a 20 5e 5b 53 51 4c 49 54 45 5f 45 52 52 4f ** ^[SQLITE_ERRO
2e440 52 5d 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 R] means that a
2e450 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 28 run-time error (
2e460 73 75 63 68 20 61 73 20 61 20 63 6f 6e 73 74 72 such as a constr
2e470 61 69 6e 74 0d 0a 2a 2a 20 76 69 6f 6c 61 74 69 aint..** violati
2e480 6f 6e 29 20 68 61 73 20 6f 63 63 75 72 72 65 64 on) has occurred
2e490 2e 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 . sqlite3_step(
2e4a0 29 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ) should not be
2e4b0 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 6f 6e 0d called again on.
2e4c0 0a 2a 2a 20 74 68 65 20 56 4d 2e 20 4d 6f 72 65 .** the VM. More
2e4d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 61 79 information may
2e4e0 20 62 65 20 66 6f 75 6e 64 20 62 79 20 63 61 6c be found by cal
2e4f0 6c 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 65 72 ling [sqlite3_er
2e500 72 6d 73 67 28 29 5d 2e 0d 0a 2a 2a 20 5e 57 69 rmsg()]...** ^Wi
2e510 74 68 20 74 68 65 20 6c 65 67 61 63 79 20 69 6e th the legacy in
2e520 74 65 72 66 61 63 65 2c 20 61 20 6d 6f 72 65 20 terface, a more
2e530 73 70 65 63 69 66 69 63 20 65 72 72 6f 72 20 63 specific error c
2e540 6f 64 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 ode (for example
2e550 2c 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 49 4e ,..** [SQLITE_IN
2e560 54 45 52 52 55 50 54 5d 2c 20 5b 53 51 4c 49 54 TERRUPT], [SQLIT
2e570 45 5f 53 43 48 45 4d 41 5d 2c 20 5b 53 51 4c 49 E_SCHEMA], [SQLI
2e580 54 45 5f 43 4f 52 52 55 50 54 5d 2c 20 61 6e 64 TE_CORRUPT], and
2e590 20 73 6f 20 66 6f 72 74 68 29 0d 0a 2a 2a 20 63 so forth)..** c
2e5a0 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 20 62 an be obtained b
2e5b0 79 20 63 61 6c 6c 69 6e 67 20 5b 73 71 6c 69 74 y calling [sqlit
2e5c0 65 33 5f 72 65 73 65 74 28 29 5d 20 6f 6e 20 74 e3_reset()] on t
2e5d0 68 65 0d 0a 2a 2a 20 5b 70 72 65 70 61 72 65 64 he..** [prepared
2e5e0 20 73 74 61 74 65 6d 65 6e 74 5d 2e 20 20 5e 49 statement]. ^I
2e5f0 6e 20 74 68 65 20 22 76 32 22 20 69 6e 74 65 72 n the "v2" inter
2e600 66 61 63 65 2c 0d 0a 2a 2a 20 74 68 65 20 6d 6f face,..** the mo
2e610 72 65 20 73 70 65 63 69 66 69 63 20 65 72 72 6f re specific erro
2e620 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e r code is return
2e630 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 73 ed directly by s
2e640 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0d 0a qlite3_step()...
2e650 2a 2a 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 4d **..** [SQLITE_M
2e660 49 53 55 53 45 5d 20 6d 65 61 6e 73 20 74 68 61 ISUSE] means tha
2e670 74 20 74 68 65 20 74 68 69 73 20 72 6f 75 74 69 t the this routi
2e680 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 69 6e ne was called in
2e690 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0d 0a appropriately...
2e6a0 2a 2a 20 50 65 72 68 61 70 73 20 69 74 20 77 61 ** Perhaps it wa
2e6b0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 5b 70 s called on a [p
2e6c0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
2e6d0 74 5d 20 74 68 61 74 20 68 61 73 0d 0a 2a 2a 20 t] that has..**
2e6e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 5b 73 71 already been [sq
2e6f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 7c lite3_finalize |
2e700 20 66 69 6e 61 6c 69 7a 65 64 5d 20 6f 72 20 6f finalized] or o
2e710 6e 20 6f 6e 65 20 74 68 61 74 20 68 61 64 0d 0a n one that had..
2e720 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 ** previously re
2e730 74 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 5f 45 turned [SQLITE_E
2e740 52 52 4f 52 5d 20 6f 72 20 5b 53 51 4c 49 54 45 RROR] or [SQLITE
2e750 5f 44 4f 4e 45 5d 2e 20 20 4f 72 20 69 74 20 63 _DONE]. Or it c
2e760 6f 75 6c 64 0d 0a 2a 2a 20 62 65 20 74 68 65 20 ould..** be the
2e770 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 61 case that the sa
2e780 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e me database conn
2e790 65 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 ection is being
2e7a0 75 73 65 64 20 62 79 20 74 77 6f 20 6f 72 0d 0a used by two or..
2e7b0 2a 2a 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 ** more threads
2e7c0 61 74 20 74 68 65 20 73 61 6d 65 20 6d 6f 6d 65 at the same mome
2e7d0 6e 74 20 69 6e 20 74 69 6d 65 2e 0d 0a 2a 2a 0d nt in time...**.
2e7e0 0a 2a 2a 20 46 6f 72 20 61 6c 6c 20 76 65 72 73 .** For all vers
2e7f0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 75 ions of SQLite u
2e800 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 p to and includi
2e810 6e 67 20 33 2e 36 2e 32 33 2e 31 2c 20 61 20 63 ng 3.6.23.1, a c
2e820 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 all to..** [sqli
2e830 74 65 33 5f 72 65 73 65 74 28 29 5d 20 77 61 73 te3_reset()] was
2e840 20 72 65 71 75 69 72 65 64 20 61 66 74 65 72 20 required after
2e850 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 72 sqlite3_step() r
2e860 65 74 75 72 6e 65 64 20 61 6e 79 74 68 69 6e 67 eturned anything
2e870 0d 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 ..** other than
2e880 5b 53 51 4c 49 54 45 5f 52 4f 57 5d 20 62 65 66 [SQLITE_ROW] bef
2e890 6f 72 65 20 61 6e 79 20 73 75 62 73 65 71 75 65 ore any subseque
2e8a0 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 nt invocation of
2e8b0 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 ..** sqlite3_ste
2e8c0 70 28 29 2e 20 20 46 61 69 6c 75 72 65 20 74 6f p(). Failure to
2e8d0 20 72 65 73 65 74 20 74 68 65 20 70 72 65 70 61 reset the prepa
2e8e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 73 red statement us
2e8f0 69 6e 67 20 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 ing ..** [sqlite
2e900 33 5f 72 65 73 65 74 28 29 5d 20 77 6f 75 6c 64 3_reset()] would
2e910 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 5b 53 result in an [S
2e920 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 72 65 QLITE_MISUSE] re
2e930 74 75 72 6e 20 66 72 6f 6d 0d 0a 2a 2a 20 73 71 turn from..** sq
2e940 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 42 lite3_step(). B
2e950 75 74 20 61 66 74 65 72 20 76 65 72 73 69 6f 6e ut after version
2e960 20 33 2e 36 2e 32 33 2e 31 2c 20 73 71 6c 69 74 3.6.23.1, sqlit
2e970 65 33 5f 73 74 65 70 28 29 20 62 65 67 61 6e 0d e3_step() began.
2e980 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 5b 73 71 6c .** calling [sql
2e990 69 74 65 33 5f 72 65 73 65 74 28 29 5d 20 61 75 ite3_reset()] au
2e9a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 20 74 tomatically in t
2e9b0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 his circumstance
2e9c0 20 72 61 74 68 65 72 0d 0a 2a 2a 20 74 68 61 6e rather..** than
2e9d0 20 72 65 74 75 72 6e 69 6e 67 20 5b 53 51 4c 49 returning [SQLI
2e9e0 54 45 5f 4d 49 53 55 53 45 5d 2e 20 20 54 68 69 TE_MISUSE]. Thi
2e9f0 73 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 s is not conside
2ea00 72 65 64 20 61 20 63 6f 6d 70 61 74 69 62 69 6c red a compatibil
2ea10 69 74 79 0d 0a 2a 2a 20 62 72 65 61 6b 20 62 65 ity..** break be
2ea20 63 61 75 73 65 20 61 6e 79 20 61 70 70 6c 69 63 cause any applic
2ea30 61 74 69 6f 6e 20 74 68 61 74 20 65 76 65 72 20 ation that ever
2ea40 72 65 63 65 69 76 65 73 20 61 6e 20 53 51 4c 49 receives an SQLI
2ea50 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 0d TE_MISUSE error.
2ea60 0a 2a 2a 20 69 73 20 62 72 6f 6b 65 6e 20 62 79 .** is broken by
2ea70 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 definition. Th
2ea80 65 20 5b 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 e [SQLITE_OMIT_A
2ea90 55 54 4f 52 45 53 45 54 5d 20 63 6f 6d 70 69 6c UTORESET] compil
2eaa0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a 2a e-time option..*
2eab0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f * can be used to
2eac0 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 65 67 restore the leg
2ead0 61 63 79 20 62 65 68 61 76 69 6f 72 2e 0d 0a 2a acy behavior...*
2eae0 2a 0d 0a 2a 2a 20 3c 62 3e 47 6f 6f 66 79 20 49 *..** <b>Goofy I
2eaf0 6e 74 65 72 66 61 63 65 20 41 6c 65 72 74 3a 3c nterface Alert:<
2eb00 2f 62 3e 20 49 6e 20 74 68 65 20 6c 65 67 61 63 /b> In the legac
2eb10 79 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68 65 y interface, the
2eb20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 0d sqlite3_step().
2eb30 0a 2a 2a 20 41 50 49 20 61 6c 77 61 79 73 20 72 .** API always r
2eb40 65 74 75 72 6e 73 20 61 20 67 65 6e 65 72 69 63 eturns a generic
2eb50 20 65 72 72 6f 72 20 63 6f 64 65 2c 20 5b 53 51 error code, [SQ
2eb60 4c 49 54 45 5f 45 52 52 4f 52 5d 2c 20 66 6f 6c LITE_ERROR], fol
2eb70 6c 6f 77 69 6e 67 20 61 6e 79 0d 0a 2a 2a 20 65 lowing any..** e
2eb80 72 72 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 rror other than
2eb90 5b 53 51 4c 49 54 45 5f 42 55 53 59 5d 20 61 6e [SQLITE_BUSY] an
2eba0 64 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 d [SQLITE_MISUSE
2ebb0 5d 2e 20 20 59 6f 75 20 6d 75 73 74 20 63 61 6c ]. You must cal
2ebc0 6c 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 72 l..** [sqlite3_r
2ebd0 65 73 65 74 28 29 5d 20 6f 72 20 5b 73 71 6c 69 eset()] or [sqli
2ebe0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 20 te3_finalize()]
2ebf0 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 in order to find
2ec00 20 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 one of the..**
2ec10 73 70 65 63 69 66 69 63 20 5b 65 72 72 6f 72 20 specific [error
2ec20 63 6f 64 65 73 5d 20 74 68 61 74 20 62 65 74 74 codes] that bett
2ec30 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 er describes the
2ec40 20 65 72 72 6f 72 2e 0d 0a 2a 2a 20 57 65 20 61 error...** We a
2ec50 64 6d 69 74 20 74 68 61 74 20 74 68 69 73 20 69 dmit that this i
2ec60 73 20 61 20 67 6f 6f 66 79 20 64 65 73 69 67 6e s a goofy design
2ec70 2e 20 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 68 . The problem h
2ec80 61 73 20 62 65 65 6e 20 66 69 78 65 64 0d 0a 2a as been fixed..*
2ec90 2a 20 77 69 74 68 20 74 68 65 20 22 76 32 22 20 * with the "v2"
2eca0 69 6e 74 65 72 66 61 63 65 2e 20 20 49 66 20 79 interface. If y
2ecb0 6f 75 20 70 72 65 70 61 72 65 20 61 6c 6c 20 6f ou prepare all o
2ecc0 66 20 79 6f 75 72 20 53 51 4c 20 73 74 61 74 65 f your SQL state
2ecd0 6d 65 6e 74 73 0d 0a 2a 2a 20 75 73 69 6e 67 20 ments..** using
2ece0 65 69 74 68 65 72 20 5b 73 71 6c 69 74 65 33 5f either [sqlite3_
2ecf0 70 72 65 70 61 72 65 5f 76 32 28 29 5d 20 6f 72 prepare_v2()] or
2ed00 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 [sqlite3_prepar
2ed10 65 31 36 5f 76 32 28 29 5d 20 69 6e 73 74 65 61 e16_v2()] instea
2ed20 64 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 65 67 d..** of the leg
2ed30 61 63 79 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 acy [sqlite3_pre
2ed40 70 61 72 65 28 29 5d 20 61 6e 64 20 5b 73 71 6c pare()] and [sql
2ed50 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 29 ite3_prepare16()
2ed60 5d 20 69 6e 74 65 72 66 61 63 65 73 2c 0d 0a 2a ] interfaces,..*
2ed70 2a 20 74 68 65 6e 20 74 68 65 20 6d 6f 72 65 20 * then the more
2ed80 73 70 65 63 69 66 69 63 20 5b 65 72 72 6f 72 20 specific [error
2ed90 63 6f 64 65 73 5d 20 61 72 65 20 72 65 74 75 72 codes] are retur
2eda0 6e 65 64 20 64 69 72 65 63 74 6c 79 0d 0a 2a 2a ned directly..**
2edb0 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 65 70 by sqlite3_step
2edc0 28 29 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 (). The use of
2edd0 74 68 65 20 22 76 32 22 20 69 6e 74 65 72 66 61 the "v2" interfa
2ede0 63 65 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 ce is recommende
2edf0 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 d...*/..SQLITE_A
2ee00 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 PI int sqlite3_s
2ee10 74 65 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 tep(sqlite3_stmt
2ee20 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 *);..../*..** CA
2ee30 50 49 33 52 45 46 3a 20 4e 75 6d 62 65 72 20 6f PI3REF: Number o
2ee40 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 f columns in a r
2ee50 65 73 75 6c 74 20 73 65 74 0d 0a 2a 2a 0d 0a 2a esult set..**..*
2ee60 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 64 * ^The sqlite3_d
2ee70 61 74 61 5f 63 6f 75 6e 74 28 50 29 20 69 6e 74 ata_count(P) int
2ee80 65 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 74 erface returns t
2ee90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c he number of col
2eea0 75 6d 6e 73 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 umns in the..**
2eeb0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 current row of t
2eec0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 he result set of
2eed0 20 5b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 [prepared state
2eee0 6d 65 6e 74 5d 20 50 2e 0d 0a 2a 2a 20 5e 49 66 ment] P...** ^If
2eef0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
2ef00 65 6e 74 20 50 20 64 6f 65 73 20 6e 6f 74 20 68 ent P does not h
2ef10 61 76 65 20 72 65 73 75 6c 74 73 20 72 65 61 64 ave results read
2ef20 79 20 74 6f 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 y to return..**
2ef30 28 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 (via calls to th
2ef40 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d e [sqlite3_colum
2ef50 6e 5f 69 6e 74 20 7c 20 73 71 6c 69 74 65 33 5f n_int | sqlite3_
2ef60 63 6f 6c 75 6d 6e 5f 2a 28 29 5d 20 6f 66 0d 0a column_*()] of..
2ef70 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 29 20 74 ** interfaces) t
2ef80 68 65 6e 20 73 71 6c 69 74 65 33 5f 64 61 74 61 hen sqlite3_data
2ef90 5f 63 6f 75 6e 74 28 50 29 20 72 65 74 75 72 6e _count(P) return
2efa0 73 20 30 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 s 0...** ^The sq
2efb0 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 lite3_data_count
2efc0 28 50 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f (P) routine also
2efd0 20 72 65 74 75 72 6e 73 20 30 20 69 66 20 50 20 returns 0 if P
2efe0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 is a NULL pointe
2eff0 72 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 r...** ^The sqli
2f000 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 50 te3_data_count(P
2f010 29 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e ) routine return
2f020 73 20 30 20 69 66 20 74 68 65 20 70 72 65 76 69 s 0 if the previ
2f030 6f 75 73 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 ous call to..**
2f040 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 5d 28 50 [sqlite3_step](P
2f050 29 20 72 65 74 75 72 6e 65 64 20 5b 53 51 4c 49 ) returned [SQLI
2f060 54 45 5f 44 4f 4e 45 5d 2e 20 20 5e 54 68 65 20 TE_DONE]. ^The
2f070 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 sqlite3_data_cou
2f080 6e 74 28 50 29 0d 0a 2a 2a 20 77 69 6c 6c 20 72 nt(P)..** will r
2f090 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 eturn non-zero i
2f0a0 66 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 f previous call
2f0b0 74 6f 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 to [sqlite3_step
2f0c0 5d 28 50 29 20 72 65 74 75 72 6e 65 64 0d 0a 2a ](P) returned..*
2f0d0 2a 20 5b 53 51 4c 49 54 45 5f 52 4f 57 5d 2c 20 * [SQLITE_ROW],
2f0e0 65 78 63 65 70 74 20 69 6e 20 74 68 65 20 63 61 except in the ca
2f0f0 73 65 20 6f 66 20 74 68 65 20 5b 50 52 41 47 4d se of the [PRAGM
2f100 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 A incremental_va
2f110 63 75 75 6d 5d 0d 0a 2a 2a 20 77 68 65 72 65 20 cuum]..** where
2f120 69 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e it always return
2f130 73 20 7a 65 72 6f 20 73 69 6e 63 65 20 65 61 63 s zero since eac
2f140 68 20 73 74 65 70 20 6f 66 20 74 68 61 74 20 6d h step of that m
2f150 75 6c 74 69 2d 73 74 65 70 0d 0a 2a 2a 20 70 72 ulti-step..** pr
2f160 61 67 6d 61 20 72 65 74 75 72 6e 73 20 30 20 63 agma returns 0 c
2f170 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 2e 0d olumns of data..
2f180 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f .**..** See also
2f190 3a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d : [sqlite3_colum
2f1a0 6e 5f 63 6f 75 6e 74 28 29 5d 0d 0a 2a 2f 0d 0a n_count()]..*/..
2f1b0 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
2f1c0 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e qlite3_data_coun
2f1d0 74 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a t(sqlite3_stmt *
2f1e0 70 53 74 6d 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a pStmt);..../*..*
2f1f0 2a 20 43 41 50 49 33 52 45 46 3a 20 46 75 6e 64 * CAPI3REF: Fund
2f200 61 6d 65 6e 74 61 6c 20 44 61 74 61 74 79 70 65 amental Datatype
2f210 73 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 s..** KEYWORDS:
2f220 53 51 4c 49 54 45 5f 54 45 58 54 0d 0a 2a 2a 0d SQLITE_TEXT..**.
2f230 0a 2a 2a 20 5e 28 45 76 65 72 79 20 76 61 6c 75 .** ^(Every valu
2f240 65 20 69 6e 20 53 51 4c 69 74 65 20 68 61 73 20 e in SQLite has
2f250 6f 6e 65 20 6f 66 20 66 69 76 65 20 66 75 6e 64 one of five fund
2f260 61 6d 65 6e 74 61 6c 20 64 61 74 61 74 79 70 65 amental datatype
2f270 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d s:..**..** <ul>.
2f280 0a 2a 2a 20 3c 6c 69 3e 20 36 34 2d 62 69 74 20 .** <li> 64-bit
2f290 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0d 0a signed integer..
2f2a0 2a 2a 20 3c 6c 69 3e 20 36 34 2d 62 69 74 20 49 ** <li> 64-bit I
2f2b0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 EEE floating poi
2f2c0 6e 74 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20 3c 6c nt number..** <l
2f2d0 69 3e 20 73 74 72 69 6e 67 0d 0a 2a 2a 20 3c 6c i> string..** <l
2f2e0 69 3e 20 42 4c 4f 42 0d 0a 2a 2a 20 3c 6c 69 3e i> BLOB..** <li>
2f2f0 20 4e 55 4c 4c 0d 0a 2a 2a 20 3c 2f 75 6c 3e 29 NULL..** </ul>)
2f300 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 ^..**..** These
2f310 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 63 6f constants are co
2f320 64 65 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 des for each of
2f330 74 68 6f 73 65 20 74 79 70 65 73 2e 0d 0a 2a 2a those types...**
2f340 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 ..** Note that t
2f350 68 65 20 53 51 4c 49 54 45 5f 54 45 58 54 20 63 he SQLITE_TEXT c
2f360 6f 6e 73 74 61 6e 74 20 77 61 73 20 61 6c 73 6f onstant was also
2f370 20 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65 20 used in SQLite
2f380 76 65 72 73 69 6f 6e 20 32 0d 0a 2a 2a 20 66 6f version 2..** fo
2f390 72 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 r a completely d
2f3a0 69 66 66 65 72 65 6e 74 20 6d 65 61 6e 69 6e 67 ifferent meaning
2f3b0 2e 20 20 53 6f 66 74 77 61 72 65 20 74 68 61 74 . Software that
2f3c0 20 6c 69 6e 6b 73 20 61 67 61 69 6e 73 74 20 62 links against b
2f3d0 6f 74 68 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 76 oth..** SQLite v
2f3e0 65 72 73 69 6f 6e 20 32 20 61 6e 64 20 53 51 4c ersion 2 and SQL
2f3f0 69 74 65 20 76 65 72 73 69 6f 6e 20 33 20 73 68 ite version 3 sh
2f400 6f 75 6c 64 20 75 73 65 20 53 51 4c 49 54 45 33 ould use SQLITE3
2f410 5f 54 45 58 54 2c 20 6e 6f 74 0d 0a 2a 2a 20 53 _TEXT, not..** S
2f420 51 4c 49 54 45 5f 54 45 58 54 2e 0d 0a 2a 2f 0d QLITE_TEXT...*/.
2f430 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
2f440 49 4e 54 45 47 45 52 20 20 31 0d 0a 23 64 65 66 INTEGER 1..#def
2f450 69 6e 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 ine SQLITE_FLOAT
2f460 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 53 2..#define S
2f470 51 4c 49 54 45 5f 42 4c 4f 42 20 20 20 20 20 34 QLITE_BLOB 4
2f480 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
2f490 5f 4e 55 4c 4c 20 20 20 20 20 35 0d 0a 23 69 66 _NULL 5..#if
2f4a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 58 54 0d def SQLITE_TEXT.
2f4b0 0a 23 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f .# undef SQLITE_
2f4c0 54 45 58 54 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 TEXT..#else..# d
2f4d0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 58 efine SQLITE_TEX
2f4e0 54 20 20 20 20 20 33 0d 0a 23 65 6e 64 69 66 0d T 3..#endif.
2f4f0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 33 .#define SQLITE3
2f500 5f 54 45 58 54 20 20 20 20 20 33 0d 0a 0d 0a 2f _TEXT 3..../
2f510 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
2f520 52 65 73 75 6c 74 20 56 61 6c 75 65 73 20 46 72 Result Values Fr
2f530 6f 6d 20 41 20 51 75 65 72 79 0d 0a 2a 2a 20 4b om A Query..** K
2f540 45 59 57 4f 52 44 53 3a 20 7b 63 6f 6c 75 6d 6e EYWORDS: {column
2f550 20 61 63 63 65 73 73 20 66 75 6e 63 74 69 6f 6e access function
2f560 73 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 s}..**..** These
2f570 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 6d 20 74 routines form t
2f580 68 65 20 22 72 65 73 75 6c 74 20 73 65 74 22 20 he "result set"
2f590 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a interface...**..
2f5a0 2a 2a 20 5e 54 68 65 73 65 20 72 6f 75 74 69 6e ** ^These routin
2f5b0 65 73 20 72 65 74 75 72 6e 20 69 6e 66 6f 72 6d es return inform
2f5c0 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 69 ation about a si
2f5d0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 ngle column of t
2f5e0 68 65 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 72 he current..** r
2f5f0 65 73 75 6c 74 20 72 6f 77 20 6f 66 20 61 20 71 esult row of a q
2f600 75 65 72 79 2e 20 20 5e 49 6e 20 65 76 65 72 79 uery. ^In every
2f610 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74 20 case the first
2f620 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f argument is a po
2f630 69 6e 74 65 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 inter..** to the
2f640 20 5b 70 72 65 70 61 72 65 64 20 73 74 61 74 65 [prepared state
2f650 6d 65 6e 74 5d 20 74 68 61 74 20 69 73 20 62 65 ment] that is be
2f660 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 28 74 ing evaluated (t
2f670 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 6d 74 he [sqlite3_stmt
2f680 2a 5d 0d 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 *]..** that was
2f690 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 5b 73 returned from [s
2f6a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 qlite3_prepare_v
2f6b0 32 28 29 5d 20 6f 72 20 6f 6e 65 20 6f 66 20 69 2()] or one of i
2f6c0 74 73 20 76 61 72 69 61 6e 74 73 29 0d 0a 2a 2a ts variants)..**
2f6d0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 and the second
2f6e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 argument is the
2f6f0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c index of the col
2f700 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e umn for which in
2f710 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a 20 73 68 formation..** sh
2f720 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64 ould be returned
2f730 2e 20 5e 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 . ^The leftmost
2f740 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 column of the re
2f750 73 75 6c 74 20 73 65 74 20 68 61 73 20 74 68 65 sult set has the
2f760 20 69 6e 64 65 78 20 30 2e 0d 0a 2a 2a 20 5e 54 index 0...** ^T
2f770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c he number of col
2f780 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 umns in the resu
2f790 6c 74 20 63 61 6e 20 62 65 20 64 65 74 65 72 6d lt can be determ
2f7a0 69 6e 65 64 20 75 73 69 6e 67 0d 0a 2a 2a 20 5b ined using..** [
2f7b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 sqlite3_column_c
2f7c0 6f 75 6e 74 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a ount()]...**..**
2f7d0 20 49 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 If the SQL stat
2f7e0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 ement does not c
2f7f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 urrently point t
2f800 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2c 20 6f o a valid row, o
2f810 72 20 69 66 20 74 68 65 0d 0a 2a 2a 20 63 6f 6c r if the..** col
2f820 75 6d 6e 20 69 6e 64 65 78 20 69 73 20 6f 75 74 umn index is out
2f830 20 6f 66 20 72 61 6e 67 65 2c 20 74 68 65 20 72 of range, the r
2f840 65 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e esult is undefin
2f850 65 64 2e 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f ed...** These ro
2f860 75 74 69 6e 65 73 20 6d 61 79 20 6f 6e 6c 79 20 utines may only
2f870 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 be called when t
2f880 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 he most recent c
2f890 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 all to..** [sqli
2f8a0 74 65 33 5f 73 74 65 70 28 29 5d 20 68 61 73 20 te3_step()] has
2f8b0 72 65 74 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 returned [SQLITE
2f8c0 5f 52 4f 57 5d 20 61 6e 64 20 6e 65 69 74 68 65 _ROW] and neithe
2f8d0 72 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 72 r..** [sqlite3_r
2f8e0 65 73 65 74 28 29 5d 20 6e 6f 72 20 5b 73 71 6c eset()] nor [sql
2f8f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 5d ite3_finalize()]
2f900 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 have been calle
2f910 64 20 73 75 62 73 65 71 75 65 6e 74 6c 79 2e 0d d subsequently..
2f920 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 .** If any of th
2f930 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 ese routines are
2f940 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 5b 73 called after [s
2f950 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 5d 20 qlite3_reset()]
2f960 6f 72 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f or..** [sqlite3_
2f970 66 69 6e 61 6c 69 7a 65 28 29 5d 20 6f 72 20 61 finalize()] or a
2f980 66 74 65 72 20 5b 73 71 6c 69 74 65 33 5f 73 74 fter [sqlite3_st
2f990 65 70 28 29 5d 20 68 61 73 20 72 65 74 75 72 6e ep()] has return
2f9a0 65 64 0d 0a 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 ed..** something
2f9b0 20 6f 74 68 65 72 20 74 68 61 6e 20 5b 53 51 4c other than [SQL
2f9c0 49 54 45 5f 52 4f 57 5d 2c 20 74 68 65 20 72 65 ITE_ROW], the re
2f9d0 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 sults are undefi
2f9e0 6e 65 64 2e 0d 0a 2a 2a 20 49 66 20 5b 73 71 6c ned...** If [sql
2f9f0 69 74 65 33 5f 73 74 65 70 28 29 5d 20 6f 72 20 ite3_step()] or
2fa00 5b 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 [sqlite3_reset()
2fa10 5d 20 6f 72 20 5b 73 71 6c 69 74 65 33 5f 66 69 ] or [sqlite3_fi
2fa20 6e 61 6c 69 7a 65 28 29 5d 0d 0a 2a 2a 20 61 72 nalize()]..** ar
2fa30 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 e called from a
2fa40 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 different thread
2fa50 20 77 68 69 6c 65 20 61 6e 79 20 6f 66 20 74 68 while any of th
2fa60 65 73 65 20 72 6f 75 74 69 6e 65 73 0d 0a 2a 2a ese routines..**
2fa70 20 61 72 65 20 70 65 6e 64 69 6e 67 2c 20 74 68 are pending, th
2fa80 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 en the results a
2fa90 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a re undefined...*
2faa0 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 *..** ^The sqlit
2fab0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 29 e3_column_type()
2fac0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
2fad0 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 the..** [SQLITE
2fae0 5f 49 4e 54 45 47 45 52 20 7c 20 64 61 74 61 74 _INTEGER | datat
2faf0 79 70 65 20 63 6f 64 65 5d 20 66 6f 72 20 74 68 ype code] for th
2fb00 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 20 74 e initial data t
2fb10 79 70 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 72 ype..** of the r
2fb20 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 5e esult column. ^
2fb30 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c The returned val
2fb40 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 5b 53 51 ue is one of [SQ
2fb50 4c 49 54 45 5f 49 4e 54 45 47 45 52 5d 2c 0d 0a LITE_INTEGER],..
2fb60 2a 2a 20 5b 53 51 4c 49 54 45 5f 46 4c 4f 41 54 ** [SQLITE_FLOAT
2fb70 5d 2c 20 5b 53 51 4c 49 54 45 5f 54 45 58 54 5d ], [SQLITE_TEXT]
2fb80 2c 20 5b 53 51 4c 49 54 45 5f 42 4c 4f 42 5d 2c , [SQLITE_BLOB],
2fb90 20 6f 72 20 5b 53 51 4c 49 54 45 5f 4e 55 4c 4c or [SQLITE_NULL
2fba0 5d 2e 20 20 54 68 65 20 76 61 6c 75 65 0d 0a 2a ]. The value..*
2fbb0 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 * returned by sq
2fbc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 lite3_column_typ
2fbd0 65 28 29 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e e() is only mean
2fbe0 69 6e 67 66 75 6c 20 69 66 20 6e 6f 20 74 79 70 ingful if no typ
2fbf0 65 0d 0a 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e e..** conversion
2fc00 73 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 s have occurred
2fc10 61 73 20 64 65 73 63 72 69 62 65 64 20 62 65 6c as described bel
2fc20 6f 77 2e 20 20 41 66 74 65 72 20 61 20 74 79 70 ow. After a typ
2fc30 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2c 0d 0a 2a e conversion,..*
2fc40 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 * the value retu
2fc50 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f rned by sqlite3_
2fc60 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 29 20 69 73 column_type() is
2fc70 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 46 75 74 undefined. Fut
2fc80 75 72 65 0d 0a 2a 2a 20 76 65 72 73 69 6f 6e 73 ure..** versions
2fc90 20 6f 66 20 53 51 4c 69 74 65 20 6d 61 79 20 63 of SQLite may c
2fca0 68 61 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 hange the behavi
2fcb0 6f 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 63 6f or of sqlite3_co
2fcc0 6c 75 6d 6e 5f 74 79 70 65 28 29 0d 0a 2a 2a 20 lumn_type()..**
2fcd0 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 74 79 70 65 following a type
2fce0 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 0d 0a 2a 2a conversion...**
2fcf0 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 72 65 73 ..** ^If the res
2fd00 75 6c 74 20 69 73 20 61 20 42 4c 4f 42 20 6f 72 ult is a BLOB or
2fd10 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 68 UTF-8 string th
2fd20 65 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 en the sqlite3_c
2fd30 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 29 0d 0a 2a olumn_bytes()..*
2fd40 2a 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e * routine return
2fd50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
2fd60 62 79 74 65 73 20 69 6e 20 74 68 61 74 20 42 4c bytes in that BL
2fd70 4f 42 20 6f 72 20 73 74 72 69 6e 67 2e 0d 0a 2a OB or string...*
2fd80 2a 20 5e 49 66 20 74 68 65 20 72 65 73 75 6c 74 * ^If the result
2fd90 20 69 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 is a UTF-16 str
2fda0 69 6e 67 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 ing, then sqlite
2fdb0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 29 3_column_bytes()
2fdc0 20 63 6f 6e 76 65 72 74 73 0d 0a 2a 2a 20 74 68 converts..** th
2fdd0 65 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d e string to UTF-
2fde0 38 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 8 and then retur
2fdf0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ns the number of
2fe00 20 62 79 74 65 73 2e 0d 0a 2a 2a 20 5e 49 66 20 bytes...** ^If
2fe10 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 the result is a
2fe20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 74 68 numeric value th
2fe30 65 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d en sqlite3_colum
2fe40 6e 5f 62 79 74 65 73 28 29 20 75 73 65 73 0d 0a n_bytes() uses..
2fe50 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 73 6e 70 72 ** [sqlite3_snpr
2fe60 69 6e 74 66 28 29 5d 20 74 6f 20 63 6f 6e 76 65 intf()] to conve
2fe70 72 74 20 74 68 61 74 20 76 61 6c 75 65 20 74 6f rt that value to
2fe80 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 a UTF-8 string
2fe90 61 6e 64 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 and returns..**
2fea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
2feb0 74 65 73 20 69 6e 20 74 68 61 74 20 73 74 72 69 tes in that stri
2fec0 6e 67 2e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 ng...** ^If the
2fed0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2c 20 result is NULL,
2fee0 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c then sqlite3_col
2fef0 75 6d 6e 5f 62 79 74 65 73 28 29 20 72 65 74 75 umn_bytes() retu
2ff00 72 6e 73 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a rns zero...**..*
2ff10 2a 20 5e 49 66 20 74 68 65 20 72 65 73 75 6c 74 * ^If the result
2ff20 20 69 73 20 61 20 42 4c 4f 42 20 6f 72 20 55 54 is a BLOB or UT
2ff30 46 2d 31 36 20 73 74 72 69 6e 67 20 74 68 65 6e F-16 string then
2ff40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6c the sqlite3_col
2ff50 75 6d 6e 5f 62 79 74 65 73 31 36 28 29 0d 0a 2a umn_bytes16()..*
2ff60 2a 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e * routine return
2ff70 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
2ff80 62 79 74 65 73 20 69 6e 20 74 68 61 74 20 42 4c bytes in that BL
2ff90 4f 42 20 6f 72 20 73 74 72 69 6e 67 2e 0d 0a 2a OB or string...*
2ffa0 2a 20 5e 49 66 20 74 68 65 20 72 65 73 75 6c 74 * ^If the result
2ffb0 20 69 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 is a UTF-8 stri
2ffc0 6e 67 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 ng, then sqlite3
2ffd0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 _column_bytes16(
2ffe0 29 20 63 6f 6e 76 65 72 74 73 0d 0a 2a 2a 20 74 ) converts..** t
2fff0 68 65 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 he string to UTF
30000 2d 31 36 20 61 6e 64 20 74 68 65 6e 20 72 65 74 -16 and then ret
30010 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
30020 6f 66 20 62 79 74 65 73 2e 0d 0a 2a 2a 20 5e 49 of bytes...** ^I
30030 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 f the result is
30040 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 a numeric value
30050 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c then sqlite3_col
30060 75 6d 6e 5f 62 79 74 65 73 31 36 28 29 20 75 73 umn_bytes16() us
30070 65 73 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f es..** [sqlite3_
30080 73 6e 70 72 69 6e 74 66 28 29 5d 20 74 6f 20 63 snprintf()] to c
30090 6f 6e 76 65 72 74 20 74 68 61 74 20 76 61 6c 75 onvert that valu
300a0 65 20 74 6f 20 61 20 55 54 46 2d 31 36 20 73 74 e to a UTF-16 st
300b0 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 ring and returns
300c0 0d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 ..** the number
300d0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 61 74 of bytes in that
300e0 20 73 74 72 69 6e 67 2e 0d 0a 2a 2a 20 5e 49 66 string...** ^If
300f0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e the result is N
30100 55 4c 4c 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 ULL, then sqlite
30110 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 3_column_bytes16
30120 28 29 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e () returns zero.
30130 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 76 61 ..**..** ^The va
30140 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 lues returned by
30150 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e [sqlite3_column
30160 5f 62 79 74 65 73 28 29 5d 20 61 6e 64 20 0d 0a _bytes()] and ..
30170 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 ** [sqlite3_colu
30180 6d 6e 5f 62 79 74 65 73 31 36 28 29 5d 20 64 6f mn_bytes16()] do
30190 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 not include the
301a0 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 6f 72 zero terminator
301b0 73 20 61 74 20 74 68 65 20 65 6e 64 0d 0a 2a 2a s at the end..**
301c0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2e 20 of the string.
301d0 20 5e 46 6f 72 20 63 6c 61 72 69 74 79 3a 20 74 ^For clarity: t
301e0 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e he values return
301f0 65 64 20 62 79 0d 0a 2a 2a 20 5b 73 71 6c 69 74 ed by..** [sqlit
30200 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 e3_column_bytes(
30210 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f )] and [sqlite3_
30220 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 29 column_bytes16()
30230 5d 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 ] are the number
30240 20 6f 66 0d 0a 2a 2a 20 62 79 74 65 73 20 69 6e of..** bytes in
30250 20 74 68 65 20 73 74 72 69 6e 67 2c 20 6e 6f 74 the string, not
30260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 the number of c
30270 68 61 72 61 63 74 65 72 73 2e 0d 0a 2a 2a 0d 0a haracters...**..
30280 2a 2a 20 5e 53 74 72 69 6e 67 73 20 72 65 74 75 ** ^Strings retu
30290 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f rned by sqlite3_
302a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 61 6e column_text() an
302b0 64 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e d sqlite3_column
302c0 5f 74 65 78 74 31 36 28 29 2c 0d 0a 2a 2a 20 65 _text16(),..** e
302d0 76 65 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 ven empty string
302e0 73 2c 20 61 72 65 20 61 6c 77 61 79 73 20 7a 65 s, are always ze
302f0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 ro-terminated.
30300 5e 54 68 65 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 ^The return..**
30310 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 value from sqlit
30320 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 29 e3_column_blob()
30330 20 66 6f 72 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 for a zero-leng
30340 74 68 20 42 4c 4f 42 20 69 73 20 61 20 4e 55 4c th BLOB is a NUL
30350 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 0d 0a L pointer...**..
30360 2a 2a 20 5e 54 68 65 20 6f 62 6a 65 63 74 20 72 ** ^The object r
30370 65 74 75 72 6e 65 64 20 62 79 20 5b 73 71 6c 69 eturned by [sqli
30380 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 te3_column_value
30390 28 29 5d 20 69 73 20 61 6e 0d 0a 2a 2a 20 5b 75 ()] is an..** [u
303a0 6e 70 72 6f 74 65 63 74 65 64 20 73 71 6c 69 74 nprotected sqlit
303b0 65 33 5f 76 61 6c 75 65 5d 20 6f 62 6a 65 63 74 e3_value] object
303c0 2e 20 20 41 6e 20 75 6e 70 72 6f 74 65 63 74 65 . An unprotecte
303d0 64 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 d sqlite3_value
303e0 6f 62 6a 65 63 74 0d 0a 2a 2a 20 6d 61 79 20 6f object..** may o
303f0 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 nly be used with
30400 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 [sqlite3_bind_v
30410 61 6c 75 65 28 29 5d 20 61 6e 64 20 5b 73 71 6c alue()] and [sql
30420 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 ite3_result_valu
30430 65 28 29 5d 2e 0d 0a 2a 2a 20 49 66 20 74 68 65 e()]...** If the
30440 20 5b 75 6e 70 72 6f 74 65 63 74 65 64 20 73 71 [unprotected sq
30450 6c 69 74 65 33 5f 76 61 6c 75 65 5d 20 6f 62 6a lite3_value] obj
30460 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 0d ect returned by.
30470 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c .** [sqlite3_col
30480 75 6d 6e 5f 76 61 6c 75 65 28 29 5d 20 69 73 20 umn_value()] is
30490 75 73 65 64 20 69 6e 20 61 6e 79 20 6f 74 68 65 used in any othe
304a0 72 20 77 61 79 2c 20 69 6e 63 6c 75 64 69 6e 67 r way, including
304b0 20 63 61 6c 6c 73 0d 0a 2a 2a 20 74 6f 20 72 6f calls..** to ro
304c0 75 74 69 6e 65 73 20 6c 69 6b 65 20 5b 73 71 6c utines like [sql
304d0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 29 ite3_value_int()
304e0 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 ], [sqlite3_valu
304f0 65 5f 74 65 78 74 28 29 5d 2c 0d 0a 2a 2a 20 6f e_text()],..** o
30500 72 20 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 r [sqlite3_value
30510 5f 62 79 74 65 73 28 29 5d 2c 20 74 68 65 6e 20 _bytes()], then
30520 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 the behavior is
30530 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a undefined...**..
30540 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 ** These routine
30550 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e s attempt to con
30560 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 77 vert the value w
30570 68 65 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 here appropriate
30580 2e 20 20 5e 46 6f 72 0d 0a 2a 2a 20 65 78 61 6d . ^For..** exam
30590 70 6c 65 2c 20 69 66 20 74 68 65 20 69 6e 74 65 ple, if the inte
305a0 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 rnal representat
305b0 69 6f 6e 20 69 73 20 46 4c 4f 41 54 20 61 6e 64 ion is FLOAT and
305c0 20 61 20 74 65 78 74 20 72 65 73 75 6c 74 0d 0a a text result..
305d0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c ** is requested,
305e0 20 5b 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e [sqlite3_snprin
305f0 74 66 28 29 5d 20 69 73 20 75 73 65 64 20 69 6e tf()] is used in
30600 74 65 72 6e 61 6c 6c 79 20 74 6f 20 70 65 72 66 ternally to perf
30610 6f 72 6d 20 74 68 65 0d 0a 2a 2a 20 63 6f 6e 76 orm the..** conv
30620 65 72 73 69 6f 6e 20 61 75 74 6f 6d 61 74 69 63 ersion automatic
30630 61 6c 6c 79 2e 20 20 5e 28 54 68 65 20 66 6f 6c ally. ^(The fol
30640 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 74 lowing table det
30650 61 69 6c 73 20 74 68 65 20 63 6f 6e 76 65 72 73 ails the convers
30660 69 6f 6e 73 0d 0a 2a 2a 20 74 68 61 74 20 61 72 ions..** that ar
30670 65 20 61 70 70 6c 69 65 64 3a 0d 0a 2a 2a 0d 0a e applied:..**..
30680 2a 2a 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0d ** <blockquote>.
30690 0a 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 .** <table borde
306a0 72 3d 22 31 22 3e 0d 0a 2a 2a 20 3c 74 72 3e 3c r="1">..** <tr><
306b0 74 68 3e 20 49 6e 74 65 72 6e 61 6c 3c 62 72 3e th> Internal<br>
306c0 54 79 70 65 20 3c 74 68 3e 20 52 65 71 75 65 73 Type <th> Reques
306d0 74 65 64 3c 62 72 3e 54 79 70 65 20 3c 74 68 3e ted<br>Type <th>
306e0 20 20 43 6f 6e 76 65 72 73 69 6f 6e 0d 0a 2a 2a Conversion..**
306f0 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 4e ..** <tr><td> N
30700 55 4c 4c 20 20 20 20 3c 74 64 3e 20 49 4e 54 45 ULL <td> INTE
30710 47 45 52 20 20 20 3c 74 64 3e 20 52 65 73 75 6c GER <td> Resul
30720 74 20 69 73 20 30 0d 0a 2a 2a 20 3c 74 72 3e 3c t is 0..** <tr><
30730 74 64 3e 20 20 4e 55 4c 4c 20 20 20 20 3c 74 64 td> NULL <td
30740 3e 20 20 46 4c 4f 41 54 20 20 20 20 3c 74 64 3e > FLOAT <td>
30750 20 52 65 73 75 6c 74 20 69 73 20 30 2e 30 0d 0a Result is 0.0..
30760 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 4e 55 4c ** <tr><td> NUL
30770 4c 20 20 20 20 3c 74 64 3e 20 20 20 54 45 58 54 L <td> TEXT
30780 20 20 20 20 3c 74 64 3e 20 52 65 73 75 6c 74 20 <td> Result
30790 69 73 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0d is NULL pointer.
307a0 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 4e 55 .** <tr><td> NU
307b0 4c 4c 20 20 20 20 3c 74 64 3e 20 20 20 42 4c 4f LL <td> BLO
307c0 42 20 20 20 20 3c 74 64 3e 20 52 65 73 75 6c 74 B <td> Result
307d0 20 69 73 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 is NULL pointer
307e0 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 49 4e ..** <tr><td> IN
307f0 54 45 47 45 52 20 20 3c 74 64 3e 20 20 46 4c 4f TEGER <td> FLO
30800 41 54 20 20 20 20 3c 74 64 3e 20 43 6f 6e 76 65 AT <td> Conve
30810 72 74 20 66 72 6f 6d 20 69 6e 74 65 67 65 72 20 rt from integer
30820 74 6f 20 66 6c 6f 61 74 0d 0a 2a 2a 20 3c 74 72 to float..** <tr
30830 3e 3c 74 64 3e 20 49 4e 54 45 47 45 52 20 20 3c ><td> INTEGER <
30840 74 64 3e 20 20 20 54 45 58 54 20 20 20 20 3c 74 td> TEXT <t
30850 64 3e 20 41 53 43 49 49 20 72 65 6e 64 65 72 69 d> ASCII renderi
30860 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 ng of the intege
30870 72 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 49 r..** <tr><td> I
30880 4e 54 45 47 45 52 20 20 3c 74 64 3e 20 20 20 42 NTEGER <td> B
30890 4c 4f 42 20 20 20 20 3c 74 64 3e 20 53 61 6d 65 LOB <td> Same
308a0 20 61 73 20 49 4e 54 45 47 45 52 2d 3e 54 45 58 as INTEGER->TEX
308b0 54 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 T..** <tr><td>
308c0 46 4c 4f 41 54 20 20 20 3c 74 64 3e 20 49 4e 54 FLOAT <td> INT
308d0 45 47 45 52 20 20 20 3c 74 64 3e 20 43 6f 6e 76 EGER <td> Conv
308e0 65 72 74 20 66 72 6f 6d 20 66 6c 6f 61 74 20 74 ert from float t
308f0 6f 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 3c 74 o integer..** <t
30900 72 3e 3c 74 64 3e 20 20 46 4c 4f 41 54 20 20 20 r><td> FLOAT
30910 3c 74 64 3e 20 20 20 54 45 58 54 20 20 20 20 3c <td> TEXT <
30920 74 64 3e 20 41 53 43 49 49 20 72 65 6e 64 65 72 td> ASCII render
30930 69 6e 67 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 ing of the float
30940 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 46 ..** <tr><td> F
30950 4c 4f 41 54 20 20 20 3c 74 64 3e 20 20 20 42 4c LOAT <td> BL
30960 4f 42 20 20 20 20 3c 74 64 3e 20 53 61 6d 65 20 OB <td> Same
30970 61 73 20 46 4c 4f 41 54 2d 3e 54 45 58 54 0d 0a as FLOAT->TEXT..
30980 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 54 45 58 ** <tr><td> TEX
30990 54 20 20 20 20 3c 74 64 3e 20 49 4e 54 45 47 45 T <td> INTEGE
309a0 52 20 20 20 3c 74 64 3e 20 55 73 65 20 61 74 6f R <td> Use ato
309b0 69 28 29 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e i()..** <tr><td>
309c0 20 20 54 45 58 54 20 20 20 20 3c 74 64 3e 20 20 TEXT <td>
309d0 46 4c 4f 41 54 20 20 20 20 3c 74 64 3e 20 55 73 FLOAT <td> Us
309e0 65 20 61 74 6f 66 28 29 0d 0a 2a 2a 20 3c 74 72 e atof()..** <tr
309f0 3e 3c 74 64 3e 20 20 54 45 58 54 20 20 20 20 3c ><td> TEXT <
30a00 74 64 3e 20 20 20 42 4c 4f 42 20 20 20 20 3c 74 td> BLOB <t
30a10 64 3e 20 4e 6f 20 63 68 61 6e 67 65 0d 0a 2a 2a d> No change..**
30a20 20 3c 74 72 3e 3c 74 64 3e 20 20 42 4c 4f 42 20 <tr><td> BLOB
30a30 20 20 20 3c 74 64 3e 20 49 4e 54 45 47 45 52 20 <td> INTEGER
30a40 20 20 3c 74 64 3e 20 43 6f 6e 76 65 72 74 20 74 <td> Convert t
30a50 6f 20 54 45 58 54 20 74 68 65 6e 20 75 73 65 20 o TEXT then use
30a60 61 74 6f 69 28 29 0d 0a 2a 2a 20 3c 74 72 3e 3c atoi()..** <tr><
30a70 74 64 3e 20 20 42 4c 4f 42 20 20 20 20 3c 74 64 td> BLOB <td
30a80 3e 20 20 46 4c 4f 41 54 20 20 20 20 3c 74 64 3e > FLOAT <td>
30a90 20 43 6f 6e 76 65 72 74 20 74 6f 20 54 45 58 54 Convert to TEXT
30aa0 20 74 68 65 6e 20 75 73 65 20 61 74 6f 66 28 29 then use atof()
30ab0 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 20 42 ..** <tr><td> B
30ac0 4c 4f 42 20 20 20 20 3c 74 64 3e 20 20 20 54 45 LOB <td> TE
30ad0 58 54 20 20 20 20 3c 74 64 3e 20 41 64 64 20 61 XT <td> Add a
30ae0 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 6f 72 zero terminator
30af0 20 69 66 20 6e 65 65 64 65 64 0d 0a 2a 2a 20 3c if needed..** <
30b00 2f 74 61 62 6c 65 3e 0d 0a 2a 2a 20 3c 2f 62 6c /table>..** </bl
30b10 6f 63 6b 71 75 6f 74 65 3e 29 5e 0d 0a 2a 2a 0d ockquote>)^..**.
30b20 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 .** The table ab
30b30 6f 76 65 20 6d 61 6b 65 73 20 72 65 66 65 72 65 ove makes refere
30b40 6e 63 65 20 74 6f 20 73 74 61 6e 64 61 72 64 20 nce to standard
30b50 43 20 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 C library functi
30b60 6f 6e 73 20 61 74 6f 69 28 29 0d 0a 2a 2a 20 61 ons atoi()..** a
30b70 6e 64 20 61 74 6f 66 28 29 2e 20 20 53 51 4c 69 nd atof(). SQLi
30b80 74 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c te does not real
30b90 6c 79 20 75 73 65 20 74 68 65 73 65 20 66 75 6e ly use these fun
30ba0 63 74 69 6f 6e 73 2e 20 20 49 74 20 68 61 73 20 ctions. It has
30bb0 69 74 73 0d 0a 2a 2a 20 6f 77 6e 20 65 71 75 69 its..** own equi
30bc0 76 61 6c 65 6e 74 20 69 6e 74 65 72 6e 61 6c 20 valent internal
30bd0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 20 61 routines. The a
30be0 74 6f 69 28 29 20 61 6e 64 20 61 74 6f 66 28 29 toi() and atof()
30bf0 20 6e 61 6d 65 73 20 61 72 65 0d 0a 2a 2a 20 75 names are..** u
30c00 73 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 sed in the table
30c10 20 66 6f 72 20 62 72 65 76 69 74 79 20 61 6e 64 for brevity and
30c20 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 because they ar
30c30 65 20 66 61 6d 69 6c 69 61 72 20 74 6f 20 6d 6f e familiar to mo
30c40 73 74 0d 0a 2a 2a 20 43 20 70 72 6f 67 72 61 6d st..** C program
30c50 6d 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f mers...**..** No
30c60 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 79 70 te that when typ
30c70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 63 e conversions oc
30c80 63 75 72 2c 20 70 6f 69 6e 74 65 72 73 20 72 65 cur, pointers re
30c90 74 75 72 6e 65 64 20 62 79 20 70 72 69 6f 72 0d turned by prior.
30ca0 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c .** calls to sql
30cb0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 ite3_column_blob
30cc0 28 29 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 (), sqlite3_colu
30cd0 6d 6e 5f 74 65 78 74 28 29 2c 20 61 6e 64 2f 6f mn_text(), and/o
30ce0 72 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f r..** sqlite3_co
30cf0 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 6d 61 lumn_text16() ma
30d00 79 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 y be invalidated
30d10 2e 0d 0a 2a 2a 20 54 79 70 65 20 63 6f 6e 76 65 ...** Type conve
30d20 72 73 69 6f 6e 73 20 61 6e 64 20 70 6f 69 6e 74 rsions and point
30d30 65 72 20 69 6e 76 61 6c 69 64 61 74 69 6f 6e 73 er invalidations
30d40 20 6d 69 67 68 74 20 6f 63 63 75 72 0d 0a 2a 2a might occur..**
30d50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e in the followin
30d60 67 20 63 61 73 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a g cases:..**..**
30d70 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 <ul>..** <li> T
30d80 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 6e 74 65 he initial conte
30d90 6e 74 20 69 73 20 61 20 42 4c 4f 42 20 61 6e 64 nt is a BLOB and
30da0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
30db0 74 65 78 74 28 29 20 6f 72 0d 0a 2a 2a 20 20 20 text() or..**
30dc0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d sqlite3_colum
30dd0 6e 5f 74 65 78 74 31 36 28 29 20 69 73 20 63 61 n_text16() is ca
30de0 6c 6c 65 64 2e 20 20 41 20 7a 65 72 6f 2d 74 65 lled. A zero-te
30df0 72 6d 69 6e 61 74 6f 72 20 6d 69 67 68 74 0d 0a rminator might..
30e00 2a 2a 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 ** need to
30e10 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 be added to the
30e20 73 74 72 69 6e 67 2e 3c 2f 6c 69 3e 0d 0a 2a 2a string.</li>..**
30e30 20 3c 6c 69 3e 20 54 68 65 20 69 6e 69 74 69 61 <li> The initia
30e40 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 55 54 46 l content is UTF
30e50 2d 38 20 74 65 78 74 20 61 6e 64 20 73 71 6c 69 -8 text and sqli
30e60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 te3_column_bytes
30e70 31 36 28 29 20 6f 72 0d 0a 2a 2a 20 20 20 20 20 16() or..**
30e80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
30e90 74 65 78 74 31 36 28 29 20 69 73 20 63 61 6c 6c text16() is call
30ea0 65 64 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 ed. The content
30eb0 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 must be convert
30ec0 65 64 0d 0a 2a 2a 20 20 20 20 20 20 74 6f 20 55 ed..** to U
30ed0 54 46 2d 31 36 2e 3c 2f 6c 69 3e 0d 0a 2a 2a 20 TF-16.</li>..**
30ee0 3c 6c 69 3e 20 54 68 65 20 69 6e 69 74 69 61 6c <li> The initial
30ef0 20 63 6f 6e 74 65 6e 74 20 69 73 20 55 54 46 2d content is UTF-
30f00 31 36 20 74 65 78 74 20 61 6e 64 20 73 71 6c 69 16 text and sqli
30f10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 te3_column_bytes
30f20 28 29 20 6f 72 0d 0a 2a 2a 20 20 20 20 20 20 73 () or..** s
30f30 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 qlite3_column_te
30f40 78 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 xt() is called.
30f50 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6d 75 73 The content mus
30f60 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a t be converted..
30f70 2a 2a 20 20 20 20 20 20 74 6f 20 55 54 46 2d 38 ** to UTF-8
30f80 2e 3c 2f 6c 69 3e 0d 0a 2a 2a 20 3c 2f 75 6c 3e .</li>..** </ul>
30f90 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 43 6f 6e 76 65 72 ..**..** ^Conver
30fa0 73 69 6f 6e 73 20 62 65 74 77 65 65 6e 20 55 54 sions between UT
30fb0 46 2d 31 36 62 65 20 61 6e 64 20 55 54 46 2d 31 F-16be and UTF-1
30fc0 36 6c 65 20 61 72 65 20 61 6c 77 61 79 73 20 64 6le are always d
30fd0 6f 6e 65 20 69 6e 20 70 6c 61 63 65 20 61 6e 64 one in place and
30fe0 20 64 6f 0d 0a 2a 2a 20 6e 6f 74 20 69 6e 76 61 do..** not inva
30ff0 6c 69 64 61 74 65 20 61 20 70 72 69 6f 72 20 70 lidate a prior p
31000 6f 69 6e 74 65 72 2c 20 74 68 6f 75 67 68 20 6f ointer, though o
31010 66 20 63 6f 75 72 73 65 20 74 68 65 20 63 6f 6e f course the con
31020 74 65 6e 74 20 6f 66 20 74 68 65 20 62 75 66 66 tent of the buff
31030 65 72 0d 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 er..** that the
31040 70 72 69 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 prior pointer re
31050 66 65 72 65 6e 63 65 73 20 77 69 6c 6c 20 68 61 ferences will ha
31060 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 ve been modified
31070 2e 20 20 4f 74 68 65 72 20 6b 69 6e 64 73 0d 0a . Other kinds..
31080 2a 2a 20 6f 66 20 63 6f 6e 76 65 72 73 69 6f 6e ** of conversion
31090 20 61 72 65 20 64 6f 6e 65 20 69 6e 20 70 6c 61 are done in pla
310a0 63 65 20 77 68 65 6e 20 69 74 20 69 73 20 70 6f ce when it is po
310b0 73 73 69 62 6c 65 2c 20 62 75 74 20 73 6f 6d 65 ssible, but some
310c0 74 69 6d 65 73 20 74 68 65 79 0d 0a 2a 2a 20 61 times they..** a
310d0 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 re not possible
310e0 61 6e 64 20 69 6e 20 74 68 6f 73 65 20 63 61 73 and in those cas
310f0 65 73 20 70 72 69 6f 72 20 70 6f 69 6e 74 65 72 es prior pointer
31100 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 s are invalidate
31110 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 d...**..** The s
31120 61 66 65 73 74 20 61 6e 64 20 65 61 73 69 65 73 afest and easies
31130 74 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 70 6f t to remember po
31140 6c 69 63 79 20 69 73 20 74 6f 20 69 6e 76 6f 6b licy is to invok
31150 65 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 e these routines
31160 0d 0a 2a 2a 20 69 6e 20 6f 6e 65 20 6f 66 20 74 ..** in one of t
31170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 he following way
31180 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d s:..**..** <ul>.
31190 0a 2a 2a 20 20 3c 6c 69 3e 73 71 6c 69 74 65 33 .** <li>sqlite3
311a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 66 _column_text() f
311b0 6f 6c 6c 6f 77 65 64 20 62 79 20 73 71 6c 69 74 ollowed by sqlit
311c0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 e3_column_bytes(
311d0 29 3c 2f 6c 69 3e 0d 0a 2a 2a 20 20 3c 6c 69 3e )</li>..** <li>
311e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 sqlite3_column_b
311f0 6c 6f 62 28 29 20 66 6f 6c 6c 6f 77 65 64 20 62 lob() followed b
31200 79 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e y sqlite3_column
31210 5f 62 79 74 65 73 28 29 3c 2f 6c 69 3e 0d 0a 2a _bytes()</li>..*
31220 2a 20 20 3c 6c 69 3e 73 71 6c 69 74 65 33 5f 63 * <li>sqlite3_c
31230 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 olumn_text16() f
31240 6f 6c 6c 6f 77 65 64 20 62 79 20 73 71 6c 69 74 ollowed by sqlit
31250 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 e3_column_bytes1
31260 36 28 29 3c 2f 6c 69 3e 0d 0a 2a 2a 20 3c 2f 75 6()</li>..** </u
31270 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 6f 74 l>..**..** In ot
31280 68 65 72 20 77 6f 72 64 73 2c 20 79 6f 75 20 73 her words, you s
31290 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 hould call sqlit
312a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 e3_column_text()
312b0 2c 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f ,..** sqlite3_co
312c0 6c 75 6d 6e 5f 62 6c 6f 62 28 29 2c 20 6f 72 20 lumn_blob(), or
312d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
312e0 65 78 74 31 36 28 29 20 66 69 72 73 74 20 74 6f ext16() first to
312f0 20 66 6f 72 63 65 20 74 68 65 20 72 65 73 75 6c force the resul
31300 74 0d 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 t..** into the d
31310 65 73 69 72 65 64 20 66 6f 72 6d 61 74 2c 20 74 esired format, t
31320 68 65 6e 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 hen invoke sqlit
31330 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 e3_column_bytes(
31340 29 20 6f 72 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 ) or..** sqlite3
31350 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 _column_bytes16(
31360 29 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 69 ) to find the si
31370 7a 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 ze of the result
31380 2e 20 20 44 6f 20 6e 6f 74 20 6d 69 78 20 63 61 . Do not mix ca
31390 6c 6c 73 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 lls..** to sqlit
313a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 e3_column_text()
313b0 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 or sqlite3_colu
313c0 6d 6e 5f 62 6c 6f 62 28 29 20 77 69 74 68 20 63 mn_blob() with c
313d0 61 6c 6c 73 20 74 6f 0d 0a 2a 2a 20 73 71 6c 69 alls to..** sqli
313e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 te3_column_bytes
313f0 31 36 28 29 2c 20 61 6e 64 20 64 6f 20 6e 6f 74 16(), and do not
31400 20 6d 69 78 20 63 61 6c 6c 73 20 74 6f 20 73 71 mix calls to sq
31410 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 lite3_column_tex
31420 74 31 36 28 29 0d 0a 2a 2a 20 77 69 74 68 20 63 t16()..** with c
31430 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f alls to sqlite3_
31440 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 29 2e 0d column_bytes()..
31450 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 70 6f 69 .**..** ^The poi
31460 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 61 nters returned a
31470 72 65 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 61 re valid until a
31480 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e type conversion
31490 20 6f 63 63 75 72 73 20 61 73 0d 0a 2a 2a 20 64 occurs as..** d
314a0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 escribed above,
314b0 6f 72 20 75 6e 74 69 6c 20 5b 73 71 6c 69 74 65 or until [sqlite
314c0 33 5f 73 74 65 70 28 29 5d 20 6f 72 20 5b 73 71 3_step()] or [sq
314d0 6c 69 74 65 33 5f 72 65 73 65 74 28 29 5d 20 6f lite3_reset()] o
314e0 72 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 66 r..** [sqlite3_f
314f0 69 6e 61 6c 69 7a 65 28 29 5d 20 69 73 20 63 61 inalize()] is ca
31500 6c 6c 65 64 2e 20 20 5e 54 68 65 20 6d 65 6d 6f lled. ^The memo
31510 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f ry space used to
31520 20 68 6f 6c 64 20 73 74 72 69 6e 67 73 0d 0a 2a hold strings..*
31530 2a 20 61 6e 64 20 42 4c 4f 42 73 20 69 73 20 66 * and BLOBs is f
31540 72 65 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c reed automatical
31550 6c 79 2e 20 20 44 6f 20 3c 62 3e 6e 6f 74 3c 2f ly. Do <b>not</
31560 62 3e 20 70 61 73 73 20 74 68 65 20 70 6f 69 6e b> pass the poin
31570 74 65 72 73 20 72 65 74 75 72 6e 65 64 0d 0a 2a ters returned..*
31580 2a 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d * [sqlite3_colum
31590 6e 5f 62 6c 6f 62 28 29 5d 2c 20 5b 73 71 6c 69 n_blob()], [sqli
315a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 te3_column_text(
315b0 29 5d 2c 20 65 74 63 2e 20 69 6e 74 6f 0d 0a 2a )], etc. into..*
315c0 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 65 28 * [sqlite3_free(
315d0 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 49 66 )]...**..** ^(If
315e0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 a memory alloca
315f0 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 tion error occur
31600 73 20 64 75 72 69 6e 67 20 74 68 65 20 65 76 61 s during the eva
31610 6c 75 61 74 69 6f 6e 20 6f 66 20 61 6e 79 0d 0a luation of any..
31620 2a 2a 20 6f 66 20 74 68 65 73 65 20 72 6f 75 74 ** of these rout
31630 69 6e 65 73 2c 20 61 20 64 65 66 61 75 6c 74 20 ines, a default
31640 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 value is returne
31650 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 d. The default
31660 76 61 6c 75 65 0d 0a 2a 2a 20 69 73 20 65 69 74 value..** is eit
31670 68 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 20 her the integer
31680 30 2c 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 0, the floating
31690 70 6f 69 6e 74 20 6e 75 6d 62 65 72 20 30 2e 30 point number 0.0
316a0 2c 20 6f 72 20 61 20 4e 55 4c 4c 0d 0a 2a 2a 20 , or a NULL..**
316b0 70 6f 69 6e 74 65 72 2e 20 20 53 75 62 73 65 71 pointer. Subseq
316c0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 5b 73 uent calls to [s
316d0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 qlite3_errcode()
316e0 5d 20 77 69 6c 6c 20 72 65 74 75 72 6e 0d 0a 2a ] will return..*
316f0 2a 20 5b 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5d * [SQLITE_NOMEM]
31700 2e 29 5e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f .)^..*/..SQLITE_
31710 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a API const void *
31720 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 sqlite3_column_b
31730 6c 6f 62 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 lob(sqlite3_stmt
31740 2a 2c 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 *, int iCol);..S
31750 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
31760 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 lite3_column_byt
31770 65 73 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a es(sqlite3_stmt*
31780 2c 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 51 , int iCol);..SQ
31790 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
317a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 ite3_column_byte
317b0 73 31 36 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 s16(sqlite3_stmt
317c0 2a 2c 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 *, int iCol);..S
317d0 51 4c 49 54 45 5f 41 50 49 20 64 6f 75 62 6c 65 QLITE_API double
317e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
317f0 64 6f 75 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 double(sqlite3_s
31800 74 6d 74 2a 2c 20 69 6e 74 20 69 43 6f 6c 29 3b tmt*, int iCol);
31810 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
31820 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
31830 69 6e 74 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 int(sqlite3_stmt
31840 2a 2c 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 *, int iCol);..S
31850 51 4c 49 54 45 5f 41 50 49 20 73 71 6c 69 74 65 QLITE_API sqlite
31860 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 3_int64 sqlite3_
31870 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 73 71 6c column_int64(sql
31880 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 20 ite3_stmt*, int
31890 69 43 6f 6c 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 iCol);..SQLITE_A
318a0 50 49 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 PI const unsigne
318b0 64 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f d char *sqlite3_
318c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 71 6c 69 column_text(sqli
318d0 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 20 69 te3_stmt*, int i
318e0 43 6f 6c 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 Col);..SQLITE_AP
318f0 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 I const void *sq
31900 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 lite3_column_tex
31910 74 31 36 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 t16(sqlite3_stmt
31920 2a 2c 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 *, int iCol);..S
31930 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
31940 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 lite3_column_typ
31950 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c e(sqlite3_stmt*,
31960 20 69 6e 74 20 69 43 6f 6c 29 3b 0d 0a 53 51 4c int iCol);..SQL
31970 49 54 45 5f 41 50 49 20 73 71 6c 69 74 65 33 5f ITE_API sqlite3_
31980 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 5f 63 value *sqlite3_c
31990 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 73 71 6c 69 olumn_value(sqli
319a0 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 20 69 te3_stmt*, int i
319b0 43 6f 6c 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 Col);..../*..**
319c0 43 41 50 49 33 52 45 46 3a 20 44 65 73 74 72 6f CAPI3REF: Destro
319d0 79 20 41 20 50 72 65 70 61 72 65 64 20 53 74 61 y A Prepared Sta
319e0 74 65 6d 65 6e 74 20 4f 62 6a 65 63 74 0d 0a 2a tement Object..*
319f0 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 *..** ^The sqlit
31a00 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 66 75 e3_finalize() fu
31a10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 nction is called
31a20 20 74 6f 20 64 65 6c 65 74 65 20 61 20 5b 70 72 to delete a [pr
31a30 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement
31a40 5d 2e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 20 6d ]...** ^If the m
31a50 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 75 ost recent evalu
31a60 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 ation of the sta
31a70 74 65 6d 65 6e 74 20 65 6e 63 6f 75 6e 74 65 72 tement encounter
31a80 65 64 20 6e 6f 20 65 72 72 6f 72 73 0d 0a 2a 2a ed no errors..**
31a90 20 6f 72 20 69 66 20 74 68 65 20 73 74 61 74 65 or if the state
31aa0 6d 65 6e 74 20 69 73 20 6e 65 76 65 72 20 62 65 ment is never be
31ab0 65 6e 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 en evaluated, th
31ac0 65 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c en sqlite3_final
31ad0 69 7a 65 28 29 20 72 65 74 75 72 6e 73 0d 0a 2a ize() returns..*
31ae0 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 5e 49 * SQLITE_OK. ^I
31af0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e f the most recen
31b00 74 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 t evaluation of
31b10 73 74 61 74 65 6d 65 6e 74 20 53 20 66 61 69 6c statement S fail
31b20 65 64 2c 20 74 68 65 6e 0d 0a 2a 2a 20 73 71 6c ed, then..** sql
31b30 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 53 29 ite3_finalize(S)
31b40 20 72 65 74 75 72 6e 73 20 74 68 65 20 61 70 70 returns the app
31b50 72 6f 70 72 69 61 74 65 20 5b 65 72 72 6f 72 20 ropriate [error
31b60 63 6f 64 65 5d 20 6f 72 0d 0a 2a 2a 20 5b 65 78 code] or..** [ex
31b70 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 tended error cod
31b80 65 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 e]...**..** ^The
31b90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a sqlite3_finaliz
31ba0 65 28 53 29 20 72 6f 75 74 69 6e 65 20 63 61 6e e(S) routine can
31bb0 20 62 65 20 63 61 6c 6c 65 64 20 61 74 20 61 6e be called at an
31bc0 79 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 0d 0a y point during..
31bd0 2a 2a 20 74 68 65 20 6c 69 66 65 20 63 79 63 6c ** the life cycl
31be0 65 20 6f 66 20 5b 70 72 65 70 61 72 65 64 20 73 e of [prepared s
31bf0 74 61 74 65 6d 65 6e 74 5d 20 53 3a 0d 0a 2a 2a tatement] S:..**
31c00 20 62 65 66 6f 72 65 20 73 74 61 74 65 6d 65 6e before statemen
31c10 74 20 53 20 69 73 20 65 76 65 72 20 65 76 61 6c t S is ever eval
31c20 75 61 74 65 64 2c 20 61 66 74 65 72 0d 0a 2a 2a uated, after..**
31c30 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c one or more cal
31c40 6c 73 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 72 ls to [sqlite3_r
31c50 65 73 65 74 28 29 5d 2c 20 6f 72 20 61 66 74 65 eset()], or afte
31c60 72 20 61 6e 79 20 63 61 6c 6c 0d 0a 2a 2a 20 74 r any call..** t
31c70 6f 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 o [sqlite3_step(
31c80 29 5d 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 )] regardless of
31c90 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
31ca0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 the statement ha
31cb0 73 0d 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 64 20 s..** completed
31cc0 65 78 65 63 75 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a execution...**..
31cd0 2a 2a 20 5e 49 6e 76 6f 6b 69 6e 67 20 73 71 6c ** ^Invoking sql
31ce0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 ite3_finalize()
31cf0 6f 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 on a NULL pointe
31d00 72 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 r is a harmless
31d10 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 no-op...**..** T
31d20 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d he application m
31d30 75 73 74 20 66 69 6e 61 6c 69 7a 65 20 65 76 65 ust finalize eve
31d40 72 79 20 5b 70 72 65 70 61 72 65 64 20 73 74 61 ry [prepared sta
31d50 74 65 6d 65 6e 74 5d 20 69 6e 20 6f 72 64 65 72 tement] in order
31d60 20 74 6f 20 61 76 6f 69 64 0d 0a 2a 2a 20 72 65 to avoid..** re
31d70 73 6f 75 72 63 65 20 6c 65 61 6b 73 2e 20 20 49 source leaks. I
31d80 74 20 69 73 20 61 20 67 72 69 65 76 6f 75 73 20 t is a grievous
31d90 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 61 70 error for the ap
31da0 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 74 72 79 plication to try
31db0 20 74 6f 20 75 73 65 0d 0a 2a 2a 20 61 20 70 72 to use..** a pr
31dc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement
31dd0 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 after it has be
31de0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 2e 20 20 41 en finalized. A
31df0 6e 79 20 75 73 65 20 6f 66 20 61 20 70 72 65 70 ny use of a prep
31e00 61 72 65 64 0d 0a 2a 2a 20 73 74 61 74 65 6d 65 ared..** stateme
31e10 6e 74 20 61 66 74 65 72 20 69 74 20 68 61 73 20 nt after it has
31e20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 63 been finalized c
31e30 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 75 6e 64 an result in und
31e40 65 66 69 6e 65 64 20 61 6e 64 0d 0a 2a 2a 20 75 efined and..** u
31e50 6e 64 65 73 69 72 61 62 6c 65 20 62 65 68 61 76 ndesirable behav
31e60 69 6f 72 20 73 75 63 68 20 61 73 20 73 65 67 66 ior such as segf
31e70 61 75 6c 74 73 20 61 6e 64 20 68 65 61 70 20 63 aults and heap c
31e80 6f 72 72 75 70 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a orruption...*/..
31e90 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
31ea0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 qlite3_finalize(
31eb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 sqlite3_stmt *pS
31ec0 74 6d 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 tmt);..../*..**
31ed0 43 41 50 49 33 52 45 46 3a 20 52 65 73 65 74 20 CAPI3REF: Reset
31ee0 41 20 50 72 65 70 61 72 65 64 20 53 74 61 74 65 A Prepared State
31ef0 6d 65 6e 74 20 4f 62 6a 65 63 74 0d 0a 2a 2a 0d ment Object..**.
31f00 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f .** The sqlite3_
31f10 72 65 73 65 74 28 29 20 66 75 6e 63 74 69 6f 6e reset() function
31f20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 is called to re
31f30 73 65 74 20 61 20 5b 70 72 65 70 61 72 65 64 20 set a [prepared
31f40 73 74 61 74 65 6d 65 6e 74 5d 0d 0a 2a 2a 20 6f statement]..** o
31f50 62 6a 65 63 74 20 62 61 63 6b 20 74 6f 20 69 74 bject back to it
31f60 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2c s initial state,
31f70 20 72 65 61 64 79 20 74 6f 20 62 65 20 72 65 2d ready to be re-
31f80 65 78 65 63 75 74 65 64 2e 0d 0a 2a 2a 20 5e 41 executed...** ^A
31f90 6e 79 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 ny SQL statement
31fa0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 variables that
31fb0 68 61 64 20 76 61 6c 75 65 73 20 62 6f 75 6e 64 had values bound
31fc0 20 74 6f 20 74 68 65 6d 20 75 73 69 6e 67 0d 0a to them using..
31fd0 2a 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f ** the [sqlite3_
31fe0 62 69 6e 64 5f 62 6c 6f 62 20 7c 20 73 71 6c 69 bind_blob | sqli
31ff0 74 65 33 5f 62 69 6e 64 5f 2a 28 29 20 41 50 49 te3_bind_*() API
32000 5d 20 72 65 74 61 69 6e 20 74 68 65 69 72 20 76 ] retain their v
32010 61 6c 75 65 73 2e 0d 0a 2a 2a 20 55 73 65 20 5b alues...** Use [
32020 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 sqlite3_clear_bi
32030 6e 64 69 6e 67 73 28 29 5d 20 74 6f 20 72 65 73 ndings()] to res
32040 65 74 20 74 68 65 20 62 69 6e 64 69 6e 67 73 2e et the bindings.
32050 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b 73 ..**..** ^The [s
32060 71 6c 69 74 65 33 5f 72 65 73 65 74 28 53 29 5d qlite3_reset(S)]
32070 20 69 6e 74 65 72 66 61 63 65 20 72 65 73 65 74 interface reset
32080 73 20 74 68 65 20 5b 70 72 65 70 61 72 65 64 20 s the [prepared
32090 73 74 61 74 65 6d 65 6e 74 5d 20 53 0d 0a 2a 2a statement] S..**
320a0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 back to the beg
320b0 69 6e 6e 69 6e 67 20 6f 66 20 69 74 73 20 70 72 inning of its pr
320c0 6f 67 72 61 6d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ogram...**..** ^
320d0 49 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 If the most rece
320e0 6e 74 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 nt call to [sqli
320f0 74 65 33 5f 73 74 65 70 28 53 29 5d 20 66 6f 72 te3_step(S)] for
32100 20 74 68 65 0d 0a 2a 2a 20 5b 70 72 65 70 61 72 the..** [prepar
32110 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 53 20 ed statement] S
32120 72 65 74 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 returned [SQLITE
32130 5f 52 4f 57 5d 20 6f 72 20 5b 53 51 4c 49 54 45 _ROW] or [SQLITE
32140 5f 44 4f 4e 45 5d 2c 0d 0a 2a 2a 20 6f 72 20 69 _DONE],..** or i
32150 66 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 f [sqlite3_step(
32160 53 29 5d 20 68 61 73 20 6e 65 76 65 72 20 62 65 S)] has never be
32170 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 fore been called
32180 20 6f 6e 20 53 2c 0d 0a 2a 2a 20 74 68 65 6e 20 on S,..** then
32190 5b 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 53 [sqlite3_reset(S
321a0 29 5d 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 )] returns [SQLI
321b0 54 45 5f 4f 4b 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 TE_OK]...**..**
321c0 5e 49 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 ^If the most rec
321d0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c ent call to [sql
321e0 69 74 65 33 5f 73 74 65 70 28 53 29 5d 20 66 6f ite3_step(S)] fo
321f0 72 20 74 68 65 0d 0a 2a 2a 20 5b 70 72 65 70 61 r the..** [prepa
32200 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 53 red statement] S
32210 20 69 6e 64 69 63 61 74 65 64 20 61 6e 20 65 72 indicated an er
32220 72 6f 72 2c 20 74 68 65 6e 0d 0a 2a 2a 20 5b 73 ror, then..** [s
32230 71 6c 69 74 65 33 5f 72 65 73 65 74 28 53 29 5d qlite3_reset(S)]
32240 20 72 65 74 75 72 6e 73 20 61 6e 20 61 70 70 72 returns an appr
32250 6f 70 72 69 61 74 65 20 5b 65 72 72 6f 72 20 63 opriate [error c
32260 6f 64 65 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 ode]...**..** ^T
32270 68 65 20 5b 73 71 6c 69 74 65 33 5f 72 65 73 65 he [sqlite3_rese
32280 74 28 53 29 5d 20 69 6e 74 65 72 66 61 63 65 20 t(S)] interface
32290 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 does not change
322a0 74 68 65 20 76 61 6c 75 65 73 0d 0a 2a 2a 20 6f the values..** o
322b0 66 20 61 6e 79 20 5b 73 71 6c 69 74 65 33 5f 62 f any [sqlite3_b
322c0 69 6e 64 5f 62 6c 6f 62 7c 62 69 6e 64 69 6e 67 ind_blob|binding
322d0 73 5d 20 6f 6e 20 74 68 65 20 5b 70 72 65 70 61 s] on the [prepa
322e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 53 red statement] S
322f0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
32300 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 I int sqlite3_re
32310 73 65 74 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 set(sqlite3_stmt
32320 20 2a 70 53 74 6d 74 29 3b 0d 0a 0d 0a 2f 2a 0d *pStmt);..../*.
32330 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 72 .** CAPI3REF: Cr
32340 65 61 74 65 20 4f 72 20 52 65 64 65 66 69 6e 65 eate Or Redefine
32350 20 53 51 4c 20 46 75 6e 63 74 69 6f 6e 73 0d 0a SQL Functions..
32360 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 7b 66 75 ** KEYWORDS: {fu
32370 6e 63 74 69 6f 6e 20 63 72 65 61 74 69 6f 6e 20 nction creation
32380 72 6f 75 74 69 6e 65 73 7d 0d 0a 2a 2a 20 4b 45 routines}..** KE
32390 59 57 4f 52 44 53 3a 20 7b 61 70 70 6c 69 63 61 YWORDS: {applica
323a0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53 51 4c tion-defined SQL
323b0 20 66 75 6e 63 74 69 6f 6e 7d 0d 0a 2a 2a 20 4b function}..** K
323c0 45 59 57 4f 52 44 53 3a 20 7b 61 70 70 6c 69 63 EYWORDS: {applic
323d0 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53 51 ation-defined SQ
323e0 4c 20 66 75 6e 63 74 69 6f 6e 73 7d 0d 0a 2a 2a L functions}..**
323f0 0d 0a 2a 2a 20 5e 54 68 65 73 65 20 66 75 6e 63 ..** ^These func
32400 74 69 6f 6e 73 20 28 63 6f 6c 6c 65 63 74 69 76 tions (collectiv
32410 65 6c 79 20 6b 6e 6f 77 6e 20 61 73 20 22 66 75 ely known as "fu
32420 6e 63 74 69 6f 6e 20 63 72 65 61 74 69 6f 6e 20 nction creation
32430 72 6f 75 74 69 6e 65 73 22 29 0d 0a 2a 2a 20 61 routines")..** a
32440 72 65 20 75 73 65 64 20 74 6f 20 61 64 64 20 53 re used to add S
32450 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 QL functions or
32460 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 6f aggregates or to
32470 20 72 65 64 65 66 69 6e 65 20 74 68 65 20 62 65 redefine the be
32480 68 61 76 69 6f 72 0d 0a 2a 2a 20 6f 66 20 65 78 havior..** of ex
32490 69 73 74 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 isting SQL funct
324a0 69 6f 6e 73 20 6f 72 20 61 67 67 72 65 67 61 74 ions or aggregat
324b0 65 73 2e 20 20 54 68 65 20 6f 6e 6c 79 20 64 69 es. The only di
324c0 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65 fferences betwee
324d0 6e 0d 0a 2a 2a 20 74 68 65 73 65 20 72 6f 75 74 n..** these rout
324e0 69 6e 65 73 20 61 72 65 20 74 68 65 20 74 65 78 ines are the tex
324f0 74 20 65 6e 63 6f 64 69 6e 67 20 65 78 70 65 63 t encoding expec
32500 74 65 64 20 66 6f 72 0d 0a 2a 2a 20 74 68 65 20 ted for..** the
32510 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 second parameter
32520 20 28 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 (the name of th
32530 65 20 66 75 6e 63 74 69 6f 6e 20 62 65 69 6e 67 e function being
32540 20 63 72 65 61 74 65 64 29 0d 0a 2a 2a 20 61 6e created)..** an
32550 64 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f d the presence o
32560 72 20 61 62 73 65 6e 63 65 20 6f 66 20 61 20 64 r absence of a d
32570 65 73 74 72 75 63 74 6f 72 20 63 61 6c 6c 62 61 estructor callba
32580 63 6b 20 66 6f 72 0d 0a 2a 2a 20 74 68 65 20 61 ck for..** the a
32590 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 20 pplication data
325a0 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a pointer...**..**
325b0 20 5e 54 68 65 20 66 69 72 73 74 20 70 61 72 61 ^The first para
325c0 6d 65 74 65 72 20 69 73 20 74 68 65 20 5b 64 61 meter is the [da
325d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
325e0 6e 5d 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 n] to which the
325f0 53 51 4c 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e SQL..** function
32600 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 2e is to be added.
32610 20 20 5e 49 66 20 61 6e 20 61 70 70 6c 69 63 61 ^If an applica
32620 74 69 6f 6e 20 75 73 65 73 20 6d 6f 72 65 20 74 tion uses more t
32630 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 han one database
32640 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ..** connection
32650 74 68 65 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e then application
32660 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e -defined SQL fun
32670 63 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 61 ctions must be a
32680 64 64 65 64 0d 0a 2a 2a 20 74 6f 20 65 61 63 68 dded..** to each
32690 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
326a0 74 69 6f 6e 20 73 65 70 61 72 61 74 65 6c 79 2e tion separately.
326b0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 65 ..**..** ^The se
326c0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 cond parameter i
326d0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 s the name of th
326e0 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 e SQL function t
326f0 6f 20 62 65 20 63 72 65 61 74 65 64 20 6f 72 0d o be created or.
32700 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 .** redefined.
32710 5e 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 ^The length of t
32720 68 65 20 6e 61 6d 65 20 69 73 20 6c 69 6d 69 74 he name is limit
32730 65 64 20 74 6f 20 32 35 35 20 62 79 74 65 73 20 ed to 255 bytes
32740 69 6e 20 61 20 55 54 46 2d 38 0d 0a 2a 2a 20 72 in a UTF-8..** r
32750 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 65 epresentation, e
32760 78 63 6c 75 73 69 76 65 20 6f 66 20 74 68 65 20 xclusive of the
32770 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 2e zero-terminator.
32780 20 20 5e 4e 6f 74 65 20 74 68 61 74 20 74 68 65 ^Note that the
32790 20 6e 61 6d 65 0d 0a 2a 2a 20 6c 65 6e 67 74 68 name..** length
327a0 20 6c 69 6d 69 74 20 69 73 20 69 6e 20 55 54 46 limit is in UTF
327b0 2d 38 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 -8 bytes, not ch
327c0 61 72 61 63 74 65 72 73 20 6e 6f 72 20 55 54 46 aracters nor UTF
327d0 2d 31 36 20 62 79 74 65 73 2e 20 20 0d 0a 2a 2a -16 bytes. ..**
327e0 20 5e 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f ^Any attempt to
327f0 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 create a functi
32800 6f 6e 20 77 69 74 68 20 61 20 6c 6f 6e 67 65 72 on with a longer
32810 20 6e 61 6d 65 0d 0a 2a 2a 20 77 69 6c 6c 20 72 name..** will r
32820 65 73 75 6c 74 20 69 6e 20 5b 53 51 4c 49 54 45 esult in [SQLITE
32830 5f 4d 49 53 55 53 45 5d 20 62 65 69 6e 67 20 72 _MISUSE] being r
32840 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a eturned...**..**
32850 20 5e 54 68 65 20 74 68 69 72 64 20 70 61 72 61 ^The third para
32860 6d 65 74 65 72 20 28 6e 41 72 67 29 0d 0a 2a 2a meter (nArg)..**
32870 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f is the number o
32880 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 f arguments that
32890 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f the SQL functio
328a0 6e 20 6f 72 0d 0a 2a 2a 20 61 67 67 72 65 67 61 n or..** aggrega
328b0 74 65 20 74 61 6b 65 73 2e 20 5e 49 66 20 74 68 te takes. ^If th
328c0 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 is parameter is
328d0 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c -1, then the SQL
328e0 20 66 75 6e 63 74 69 6f 6e 20 6f 72 0d 0a 2a 2a function or..**
328f0 20 61 67 67 72 65 67 61 74 65 20 6d 61 79 20 74 aggregate may t
32900 61 6b 65 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f ake any number o
32910 66 20 61 72 67 75 6d 65 6e 74 73 20 62 65 74 77 f arguments betw
32920 65 65 6e 20 30 20 61 6e 64 20 74 68 65 20 6c 69 een 0 and the li
32930 6d 69 74 0d 0a 2a 2a 20 73 65 74 20 62 79 20 5b mit..** set by [
32940 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 5d 28 5b sqlite3_limit]([
32950 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e SQLITE_LIMIT_FUN
32960 43 54 49 4f 4e 5f 41 52 47 5d 29 2e 20 20 49 66 CTION_ARG]). If
32970 20 74 68 65 20 74 68 69 72 64 0d 0a 2a 2a 20 70 the third..** p
32980 61 72 61 6d 65 74 65 72 20 69 73 20 6c 65 73 73 arameter is less
32990 20 74 68 61 6e 20 2d 31 20 6f 72 20 67 72 65 61 than -1 or grea
329a0 74 65 72 20 74 68 61 6e 20 31 32 37 20 74 68 65 ter than 127 the
329b0 6e 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 n the behavior i
329c0 73 0d 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e s..** undefined.
329d0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 6f ..**..** ^The fo
329e0 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 2c 20 urth parameter,
329f0 65 54 65 78 74 52 65 70 2c 20 73 70 65 63 69 66 eTextRep, specif
32a00 69 65 73 20 77 68 61 74 0d 0a 2a 2a 20 5b 53 51 ies what..** [SQ
32a10 4c 49 54 45 5f 55 54 46 38 20 7c 20 74 65 78 74 LITE_UTF8 | text
32a20 20 65 6e 63 6f 64 69 6e 67 5d 20 74 68 69 73 20 encoding] this
32a30 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 SQL function pre
32a40 66 65 72 73 20 66 6f 72 0d 0a 2a 2a 20 69 74 73 fers for..** its
32a50 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 45 76 parameters. Ev
32a60 65 72 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e ery SQL function
32a70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
32a80 6d 75 73 74 20 62 65 20 61 62 6c 65 20 74 6f 20 must be able to
32a90 77 6f 72 6b 0d 0a 2a 2a 20 77 69 74 68 20 55 54 work..** with UT
32aa0 46 2d 38 2c 20 55 54 46 2d 31 36 6c 65 2c 20 6f F-8, UTF-16le, o
32ab0 72 20 55 54 46 2d 31 36 62 65 2e 20 20 42 75 74 r UTF-16be. But
32ac0 20 73 6f 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 some implementa
32ad0 74 69 6f 6e 73 20 6d 61 79 20 62 65 0d 0a 2a 2a tions may be..**
32ae0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 more efficient
32af0 77 69 74 68 20 6f 6e 65 20 65 6e 63 6f 64 69 6e with one encodin
32b00 67 20 74 68 61 6e 20 61 6e 6f 74 68 65 72 2e 20 g than another.
32b10 20 5e 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e ^An application
32b20 20 6d 61 79 0d 0a 2a 2a 20 69 6e 76 6f 6b 65 20 may..** invoke
32b30 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 sqlite3_create_f
32b40 75 6e 63 74 69 6f 6e 28 29 20 6f 72 20 73 71 6c unction() or sql
32b50 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 ite3_create_func
32b60 74 69 6f 6e 31 36 28 29 20 6d 75 6c 74 69 70 6c tion16() multipl
32b70 65 0d 0a 2a 2a 20 74 69 6d 65 73 20 77 69 74 68 e..** times with
32b80 20 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69 the same functi
32b90 6f 6e 20 62 75 74 20 77 69 74 68 20 64 69 66 66 on but with diff
32ba0 65 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 erent values of
32bb0 65 54 65 78 74 52 65 70 2e 0d 0a 2a 2a 20 5e 57 eTextRep...** ^W
32bc0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 69 6d 70 hen multiple imp
32bd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 lementations of
32be0 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69 6f the same functio
32bf0 6e 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c n are available,
32c00 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 77 69 6c 6c SQLite..** will
32c10 20 70 69 63 6b 20 74 68 65 20 6f 6e 65 20 74 68 pick the one th
32c20 61 74 20 69 6e 76 6f 6c 76 65 73 20 74 68 65 20 at involves the
32c30 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 least amount of
32c40 64 61 74 61 20 63 6f 6e 76 65 72 73 69 6f 6e 2e data conversion.
32c50 0d 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 ..** If there is
32c60 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 69 only a single i
32c70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 mplementation wh
32c80 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 61 72 ich does not car
32c90 65 20 77 68 61 74 20 74 65 78 74 0d 0a 2a 2a 20 e what text..**
32ca0 65 6e 63 6f 64 69 6e 67 20 69 73 20 75 73 65 64 encoding is used
32cb0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 75 72 74 , then the fourt
32cc0 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c h argument shoul
32cd0 64 20 62 65 20 5b 53 51 4c 49 54 45 5f 41 4e 59 d be [SQLITE_ANY
32ce0 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 ]...**..** ^(The
32cf0 20 66 69 66 74 68 20 70 61 72 61 6d 65 74 65 72 fifth parameter
32d00 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 is an arbitrary
32d10 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 20 69 pointer. The i
32d20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
32d30 20 74 68 65 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f the..** functio
32d40 6e 20 63 61 6e 20 67 61 69 6e 20 61 63 63 65 73 n can gain acces
32d50 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 s to this pointe
32d60 72 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 r using [sqlite3
32d70 5f 75 73 65 72 5f 64 61 74 61 28 29 5d 2e 29 5e _user_data()].)^
32d80 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 69 ..**..** ^The si
32d90 78 74 68 2c 20 73 65 76 65 6e 74 68 20 61 6e 64 xth, seventh and
32da0 20 65 69 67 68 74 68 20 70 61 72 61 6d 65 74 65 eighth paramete
32db0 72 73 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 rs, xFunc, xStep
32dc0 20 61 6e 64 20 78 46 69 6e 61 6c 2c 20 61 72 65 and xFinal, are
32dd0 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f ..** pointers to
32de0 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 C-language func
32df0 74 69 6f 6e 73 20 74 68 61 74 20 69 6d 70 6c 65 tions that imple
32e00 6d 65 6e 74 20 74 68 65 20 53 51 4c 20 66 75 6e ment the SQL fun
32e10 63 74 69 6f 6e 20 6f 72 0d 0a 2a 2a 20 61 67 67 ction or..** agg
32e20 72 65 67 61 74 65 2e 20 5e 41 20 73 63 61 6c 61 regate. ^A scala
32e30 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 r SQL function r
32e40 65 71 75 69 72 65 73 20 61 6e 20 69 6d 70 6c 65 equires an imple
32e50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 mentation of the
32e60 20 78 46 75 6e 63 0d 0a 2a 2a 20 63 61 6c 6c 62 xFunc..** callb
32e70 61 63 6b 20 6f 6e 6c 79 3b 20 4e 55 4c 4c 20 70 ack only; NULL p
32e80 6f 69 6e 74 65 72 73 20 6d 75 73 74 20 62 65 20 ointers must be
32e90 70 61 73 73 65 64 20 61 73 20 74 68 65 20 78 53 passed as the xS
32ea0 74 65 70 20 61 6e 64 20 78 46 69 6e 61 6c 0d 0a tep and xFinal..
32eb0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 2e 20 5e ** parameters. ^
32ec0 41 6e 20 61 67 67 72 65 67 61 74 65 20 53 51 4c An aggregate SQL
32ed0 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 function requir
32ee0 65 73 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 es an implementa
32ef0 74 69 6f 6e 20 6f 66 20 78 53 74 65 70 0d 0a 2a tion of xStep..*
32f00 2a 20 61 6e 64 20 78 46 69 6e 61 6c 20 61 6e 64 * and xFinal and
32f10 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6d 75 NULL pointer mu
32f20 73 74 20 62 65 20 70 61 73 73 65 64 20 66 6f 72 st be passed for
32f30 20 78 46 75 6e 63 2e 20 5e 54 6f 20 64 65 6c 65 xFunc. ^To dele
32f40 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0d 0a te an existing..
32f50 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 ** SQL function
32f60 6f 72 20 61 67 67 72 65 67 61 74 65 2c 20 70 61 or aggregate, pa
32f70 73 73 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 ss NULL pointers
32f80 20 66 6f 72 20 61 6c 6c 20 74 68 72 65 65 20 66 for all three f
32f90 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 63 61 6c 6c unction..** call
32fa0 62 61 63 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e backs...**..** ^
32fb0 28 49 66 20 74 68 65 20 6e 69 6e 74 68 20 70 61 (If the ninth pa
32fc0 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74 rameter to sqlit
32fd0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 e3_create_functi
32fe0 6f 6e 5f 76 32 28 29 20 69 73 20 6e 6f 74 20 4e on_v2() is not N
32ff0 55 4c 4c 2c 0d 0a 2a 2a 20 74 68 65 6e 20 69 74 ULL,..** then it
33000 20 69 73 20 64 65 73 74 72 75 63 74 6f 72 20 66 is destructor f
33010 6f 72 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 or the applicati
33020 6f 6e 20 64 61 74 61 20 70 6f 69 6e 74 65 72 2e on data pointer.
33030 20 0d 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 ..** The destru
33040 63 74 6f 72 20 69 73 20 69 6e 76 6f 6b 65 64 20 ctor is invoked
33050 77 68 65 6e 20 74 68 65 20 66 75 6e 63 74 69 6f when the functio
33060 6e 20 69 73 20 64 65 6c 65 74 65 64 2c 20 65 69 n is deleted, ei
33070 74 68 65 72 20 62 79 20 62 65 69 6e 67 0d 0a 2a ther by being..*
33080 2a 20 6f 76 65 72 6c 6f 61 64 65 64 20 6f 72 20 * overloaded or
33090 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 when the databas
330a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f e connection clo
330b0 73 65 73 2e 29 5e 0d 0a 2a 2a 20 5e 54 68 65 20 ses.)^..** ^The
330c0 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 61 6c destructor is al
330d0 73 6f 20 69 6e 76 6f 6b 65 64 20 69 66 20 74 68 so invoked if th
330e0 65 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 73 71 e call to..** sq
330f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e lite3_create_fun
33100 63 74 69 6f 6e 5f 76 32 28 29 20 66 61 69 6c 73 ction_v2() fails
33110 2e 0d 0a 2a 2a 20 5e 57 68 65 6e 20 74 68 65 20 ...** ^When the
33120 64 65 73 74 72 75 63 74 6f 72 20 63 61 6c 6c 62 destructor callb
33130 61 63 6b 20 6f 66 20 74 68 65 20 74 65 6e 74 68 ack of the tenth
33140 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 6e parameter is in
33150 76 6f 6b 65 64 2c 20 69 74 0d 0a 2a 2a 20 69 73 voked, it..** is
33160 20 70 61 73 73 65 64 20 61 20 73 69 6e 67 6c 65 passed a single
33170 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 argument which
33180 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 is a copy of the
33190 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 application dat
331a0 61 20 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 77 a ..** pointer w
331b0 68 69 63 68 20 77 61 73 20 74 68 65 20 66 69 66 hich was the fif
331c0 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 th parameter to
331d0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 sqlite3_create_f
331e0 75 6e 63 74 69 6f 6e 5f 76 32 28 29 2e 0d 0a 2a unction_v2()...*
331f0 2a 0d 0a 2a 2a 20 5e 49 74 20 69 73 20 70 65 72 *..** ^It is per
33200 6d 69 74 74 65 64 20 74 6f 20 72 65 67 69 73 74 mitted to regist
33210 65 72 20 6d 75 6c 74 69 70 6c 65 20 69 6d 70 6c er multiple impl
33220 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 ementations of t
33230 68 65 20 73 61 6d 65 0d 0a 2a 2a 20 66 75 6e 63 he same..** func
33240 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 73 tions with the s
33250 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 ame name but wit
33260 68 20 65 69 74 68 65 72 20 64 69 66 66 65 72 69 h either differi
33270 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66 0d 0a 2a ng numbers of..*
33280 2a 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 64 * arguments or d
33290 69 66 66 65 72 69 6e 67 20 70 72 65 66 65 72 72 iffering preferr
332a0 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 ed text encoding
332b0 73 2e 20 20 5e 53 51 4c 69 74 65 20 77 69 6c 6c s. ^SQLite will
332c0 20 75 73 65 0d 0a 2a 2a 20 74 68 65 20 69 6d 70 use..** the imp
332d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 lementation that
332e0 20 6d 6f 73 74 20 63 6c 6f 73 65 6c 79 20 6d 61 most closely ma
332f0 74 63 68 65 73 20 74 68 65 20 77 61 79 20 69 6e tches the way in
33300 20 77 68 69 63 68 20 74 68 65 0d 0a 2a 2a 20 53 which the..** S
33310 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 QL function is u
33320 73 65 64 2e 20 20 5e 41 20 66 75 6e 63 74 69 6f sed. ^A functio
33330 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e n implementation
33340 20 77 69 74 68 20 61 20 6e 6f 6e 2d 6e 65 67 61 with a non-nega
33350 74 69 76 65 0d 0a 2a 2a 20 6e 41 72 67 20 70 61 tive..** nArg pa
33360 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 65 74 rameter is a bet
33370 74 65 72 20 6d 61 74 63 68 20 74 68 61 6e 20 61 ter match than a
33380 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d function implem
33390 65 6e 74 61 74 69 6f 6e 20 77 69 74 68 0d 0a 2a entation with..*
333a0 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 41 72 * a negative nAr
333b0 67 2e 20 20 5e 41 20 66 75 6e 63 74 69 6f 6e 20 g. ^A function
333c0 77 68 65 72 65 20 74 68 65 20 70 72 65 66 65 72 where the prefer
333d0 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69 6e red text encodin
333e0 67 0d 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 g..** matches th
333f0 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 e database encod
33400 69 6e 67 20 69 73 20 61 20 62 65 74 74 65 72 0d ing is a better.
33410 0a 2a 2a 20 6d 61 74 63 68 20 74 68 61 6e 20 61 .** match than a
33420 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 72 65 20 function where
33430 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 the encoding is
33440 64 69 66 66 65 72 65 6e 74 2e 20 20 0d 0a 2a 2a different. ..**
33450 20 5e 41 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 ^A function whe
33460 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 re the encoding
33470 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 62 65 difference is be
33480 74 77 65 65 6e 20 55 54 46 31 36 6c 65 20 61 6e tween UTF16le an
33490 64 20 55 54 46 31 36 62 65 0d 0a 2a 2a 20 69 73 d UTF16be..** is
334a0 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68 20 a closer match
334b0 74 68 61 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 than a function
334c0 77 68 65 72 65 20 74 68 65 20 65 6e 63 6f 64 69 where the encodi
334d0 6e 67 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 ng difference is
334e0 0d 0a 2a 2a 20 62 65 74 77 65 65 6e 20 55 54 46 ..** between UTF
334f0 38 20 61 6e 64 20 55 54 46 31 36 2e 0d 0a 2a 2a 8 and UTF16...**
33500 0d 0a 2a 2a 20 5e 42 75 69 6c 74 2d 69 6e 20 66 ..** ^Built-in f
33510 75 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 unctions may be
33520 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 6e 65 overloaded by ne
33530 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 w application-de
33540 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 2e fined functions.
33550 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 41 6e 20 61 70 70 ..**..** ^An app
33560 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 lication-defined
33570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 65 72 function is per
33580 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 6f mitted to call o
33590 74 68 65 72 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 ther..** SQLite
335a0 69 6e 74 65 72 66 61 63 65 73 2e 20 20 48 6f 77 interfaces. How
335b0 65 76 65 72 2c 20 73 75 63 68 20 63 61 6c 6c 73 ever, such calls
335c0 20 6d 75 73 74 20 6e 6f 74 0d 0a 2a 2a 20 63 6c must not..** cl
335d0 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 ose the database
335e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 72 20 connection nor
335f0 66 69 6e 61 6c 69 7a 65 20 6f 72 20 72 65 73 65 finalize or rese
33600 74 20 74 68 65 20 70 72 65 70 61 72 65 64 0d 0a t the prepared..
33610 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 ** statement in
33620 77 68 69 63 68 20 74 68 65 20 66 75 6e 63 74 69 which the functi
33630 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0d 0a on is running...
33640 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
33650 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 nt sqlite3_creat
33660 65 5f 66 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 73 e_function(.. s
33670 71 6c 69 74 65 33 20 2a 64 62 2c 0d 0a 20 20 63 qlite3 *db,.. c
33680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 onst char *zFunc
33690 74 69 6f 6e 4e 61 6d 65 2c 0d 0a 20 20 69 6e 74 tionName,.. int
336a0 20 6e 41 72 67 2c 0d 0a 20 20 69 6e 74 20 65 54 nArg,.. int eT
336b0 65 78 74 52 65 70 2c 0d 0a 20 20 76 6f 69 64 20 extRep,.. void
336c0 2a 70 41 70 70 2c 0d 0a 20 20 76 6f 69 64 20 28 *pApp,.. void (
336d0 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f *xFunc)(sqlite3_
336e0 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c context*,int,sql
336f0 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0d 0a ite3_value**),..
33700 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 void (*xStep)(
33710 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a sqlite3_context*
33720 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c ,int,sqlite3_val
33730 75 65 2a 2a 29 2c 0d 0a 20 20 76 6f 69 64 20 28 ue**),.. void (
33740 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 *xFinal)(sqlite3
33750 5f 63 6f 6e 74 65 78 74 2a 29 0d 0a 29 3b 0d 0a _context*)..);..
33760 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
33770 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 qlite3_create_fu
33780 6e 63 74 69 6f 6e 31 36 28 0d 0a 20 20 73 71 6c nction16(.. sql
33790 69 74 65 33 20 2a 64 62 2c 0d 0a 20 20 63 6f 6e ite3 *db,.. con
337a0 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 st void *zFuncti
337b0 6f 6e 4e 61 6d 65 2c 0d 0a 20 20 69 6e 74 20 6e onName,.. int n
337c0 41 72 67 2c 0d 0a 20 20 69 6e 74 20 65 54 65 78 Arg,.. int eTex
337d0 74 52 65 70 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 tRep,.. void *p
337e0 41 70 70 2c 0d 0a 20 20 76 6f 69 64 20 28 2a 78 App,.. void (*x
337f0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f Func)(sqlite3_co
33800 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 ntext*,int,sqlit
33810 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0d 0a 20 20 e3_value**),..
33820 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 void (*xStep)(sq
33830 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 lite3_context*,i
33840 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 nt,sqlite3_value
33850 2a 2a 29 2c 0d 0a 20 20 76 6f 69 64 20 28 2a 78 **),.. void (*x
33860 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 Final)(sqlite3_c
33870 6f 6e 74 65 78 74 2a 29 0d 0a 29 3b 0d 0a 53 51 ontext*)..);..SQ
33880 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
33890 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 ite3_create_func
338a0 74 69 6f 6e 5f 76 32 28 0d 0a 20 20 73 71 6c 69 tion_v2(.. sqli
338b0 74 65 33 20 2a 64 62 2c 0d 0a 20 20 63 6f 6e 73 te3 *db,.. cons
338c0 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f t char *zFunctio
338d0 6e 4e 61 6d 65 2c 0d 0a 20 20 69 6e 74 20 6e 41 nName,.. int nA
338e0 72 67 2c 0d 0a 20 20 69 6e 74 20 65 54 65 78 74 rg,.. int eText
338f0 52 65 70 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 41 Rep,.. void *pA
33900 70 70 2c 0d 0a 20 20 76 6f 69 64 20 28 2a 78 46 pp,.. void (*xF
33910 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e unc)(sqlite3_con
33920 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 text*,int,sqlite
33930 33 5f 76 61 6c 75 65 2a 2a 29 2c 0d 0a 20 20 76 3_value**),.. v
33940 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c oid (*xStep)(sql
33950 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e ite3_context*,in
33960 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a t,sqlite3_value*
33970 2a 29 2c 0d 0a 20 20 76 6f 69 64 20 28 2a 78 46 *),.. void (*xF
33980 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f inal)(sqlite3_co
33990 6e 74 65 78 74 2a 29 2c 0d 0a 20 20 76 6f 69 64 ntext*),.. void
339a0 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 (*xDestroy)(void
339b0 2a 29 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a *)..);..../*..**
339c0 20 43 41 50 49 33 52 45 46 3a 20 54 65 78 74 20 CAPI3REF: Text
339d0 45 6e 63 6f 64 69 6e 67 73 0d 0a 2a 2a 0d 0a 2a Encodings..**..*
339e0 2a 20 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 * These constant
339f0 20 64 65 66 69 6e 65 20 69 6e 74 65 67 65 72 20 define integer
33a00 63 6f 64 65 73 20 74 68 61 74 20 72 65 70 72 65 codes that repre
33a10 73 65 6e 74 20 74 68 65 20 76 61 72 69 6f 75 73 sent the various
33a20 0d 0a 2a 2a 20 74 65 78 74 20 65 6e 63 6f 64 69 ..** text encodi
33a30 6e 67 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 ngs supported by
33a40 20 53 51 4c 69 74 65 2e 0d 0a 2a 2f 0d 0a 23 64 SQLite...*/..#d
33a50 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 54 46 efine SQLITE_UTF
33a60 38 20 20 20 20 20 20 20 20 20 20 20 31 0d 0a 23 8 1..#
33a70 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 54 define SQLITE_UT
33a80 46 31 36 4c 45 20 20 20 20 20 20 20 20 32 0d 0a F16LE 2..
33a90 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 #define SQLITE_U
33aa0 54 46 31 36 42 45 20 20 20 20 20 20 20 20 33 0d TF16BE 3.
33ab0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
33ac0 55 54 46 31 36 20 20 20 20 20 20 20 20 20 20 34 UTF16 4
33ad0 20 20 20 20 2f 2a 20 55 73 65 20 6e 61 74 69 76 /* Use nativ
33ae0 65 20 62 79 74 65 20 6f 72 64 65 72 20 2a 2f 0d e byte order */.
33af0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
33b00 41 4e 59 20 20 20 20 20 20 20 20 20 20 20 20 35 ANY 5
33b10 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 /* sqlite3_c
33b20 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 6f reate_function o
33b30 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 nly */..#define
33b40 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 SQLITE_UTF16_ALI
33b50 47 4e 45 44 20 20 38 20 20 20 20 2f 2a 20 73 71 GNED 8 /* sq
33b60 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c lite3_create_col
33b70 6c 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0d 0a lation only */..
33b80 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
33b90 46 3a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 F: Deprecated Fu
33ba0 6e 63 74 69 6f 6e 73 0d 0a 2a 2a 20 44 45 50 52 nctions..** DEPR
33bb0 45 43 41 54 45 44 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ECATED..**..** T
33bc0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 hese functions a
33bd0 72 65 20 5b 64 65 70 72 65 63 61 74 65 64 5d 2e re [deprecated].
33be0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 In order to ma
33bf0 69 6e 74 61 69 6e 0d 0a 2a 2a 20 62 61 63 6b 77 intain..** backw
33c00 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 ards compatibili
33c10 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 63 6f ty with older co
33c20 64 65 2c 20 74 68 65 73 65 20 66 75 6e 63 74 69 de, these functi
33c30 6f 6e 73 20 63 6f 6e 74 69 6e 75 65 20 0d 0a 2a ons continue ..*
33c40 2a 20 74 6f 20 62 65 20 73 75 70 70 6f 72 74 65 * to be supporte
33c50 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 d. However, new
33c60 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 applications sh
33c70 6f 75 6c 64 20 61 76 6f 69 64 0d 0a 2a 2a 20 74 ould avoid..** t
33c80 68 65 20 75 73 65 20 6f 66 20 74 68 65 73 65 20 he use of these
33c90 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 6f 20 68 functions. To h
33ca0 65 6c 70 20 65 6e 63 6f 75 72 61 67 65 20 70 65 elp encourage pe
33cb0 6f 70 6c 65 20 74 6f 20 61 76 6f 69 64 0d 0a 2a ople to avoid..*
33cc0 2a 20 75 73 69 6e 67 20 74 68 65 73 65 20 66 75 * using these fu
33cd0 6e 63 74 69 6f 6e 73 2c 20 77 65 20 61 72 65 20 nctions, we are
33ce0 6e 6f 74 20 67 6f 69 6e 67 20 74 6f 20 74 65 6c not going to tel
33cf0 6c 20 79 6f 75 20 77 68 61 74 20 74 68 65 79 20 l you what they
33d00 64 6f 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 do...*/..#ifndef
33d10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 SQLITE_OMIT_DEP
33d20 52 45 43 41 54 45 44 0d 0a 53 51 4c 49 54 45 5f RECATED..SQLITE_
33d30 41 50 49 20 53 51 4c 49 54 45 5f 44 45 50 52 45 API SQLITE_DEPRE
33d40 43 41 54 45 44 20 69 6e 74 20 73 71 6c 69 74 65 CATED int sqlite
33d50 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 3_aggregate_coun
33d60 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 t(sqlite3_contex
33d70 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 t*);..SQLITE_API
33d80 20 53 51 4c 49 54 45 5f 44 45 50 52 45 43 41 54 SQLITE_DEPRECAT
33d90 45 44 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 ED int sqlite3_e
33da0 78 70 69 72 65 64 28 73 71 6c 69 74 65 33 5f 73 xpired(sqlite3_s
33db0 74 6d 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 tmt*);..SQLITE_A
33dc0 50 49 20 53 51 4c 49 54 45 5f 44 45 50 52 45 43 PI SQLITE_DEPREC
33dd0 41 54 45 44 20 69 6e 74 20 73 71 6c 69 74 65 33 ATED int sqlite3
33de0 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e _transfer_bindin
33df0 67 73 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a gs(sqlite3_stmt*
33e00 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 , sqlite3_stmt*)
33e10 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 53 51 ;..SQLITE_API SQ
33e20 4c 49 54 45 5f 44 45 50 52 45 43 41 54 45 44 20 LITE_DEPRECATED
33e30 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 int sqlite3_glob
33e40 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 al_recover(void)
33e50 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 53 51 ;..SQLITE_API SQ
33e60 4c 49 54 45 5f 44 45 50 52 45 43 41 54 45 44 20 LITE_DEPRECATED
33e70 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 void sqlite3_thr
33e80 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 ead_cleanup(void
33e90 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 53 );..SQLITE_API S
33ea0 51 4c 49 54 45 5f 44 45 50 52 45 43 41 54 45 44 QLITE_DEPRECATED
33eb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d int sqlite3_mem
33ec0 6f 72 79 5f 61 6c 61 72 6d 28 76 6f 69 64 28 2a ory_alarm(void(*
33ed0 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 5f )(void*,sqlite3_
33ee0 69 6e 74 36 34 2c 69 6e 74 29 2c 76 6f 69 64 2a int64,int),void*
33ef0 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b ,sqlite3_int64);
33f00 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
33f10 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 ** CAPI3REF: Obt
33f20 61 69 6e 69 6e 67 20 53 51 4c 20 46 75 6e 63 74 aining SQL Funct
33f30 69 6f 6e 20 50 61 72 61 6d 65 74 65 72 20 56 61 ion Parameter Va
33f40 6c 75 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 lues..**..** The
33f50 20 43 2d 6c 61 6e 67 75 61 67 65 20 69 6d 70 6c C-language impl
33f60 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 ementation of SQ
33f70 4c 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 L functions and
33f80 61 67 67 72 65 67 61 74 65 73 20 75 73 65 73 0d aggregates uses.
33f90 0a 2a 2a 20 74 68 69 73 20 73 65 74 20 6f 66 20 .** this set of
33fa0 69 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e interface routin
33fb0 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 es to access the
33fc0 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 parameter value
33fd0 73 20 6f 6e 0d 0a 2a 2a 20 74 68 65 20 66 75 6e s on..** the fun
33fe0 63 74 69 6f 6e 20 6f 72 20 61 67 67 72 65 67 61 ction or aggrega
33ff0 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 te...**..** The
34000 78 46 75 6e 63 20 28 66 6f 72 20 73 63 61 6c 61 xFunc (for scala
34010 72 20 66 75 6e 63 74 69 6f 6e 73 29 20 6f 72 20 r functions) or
34020 78 53 74 65 70 20 28 66 6f 72 20 61 67 67 72 65 xStep (for aggre
34030 67 61 74 65 73 29 20 70 61 72 61 6d 65 74 65 72 gates) parameter
34040 73 0d 0a 2a 2a 20 74 6f 20 5b 73 71 6c 69 74 65 s..** to [sqlite
34050 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 3_create_functio
34060 6e 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 n()] and [sqlite
34070 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 3_create_functio
34080 6e 31 36 28 29 5d 0d 0a 2a 2a 20 64 65 66 69 6e n16()]..** defin
34090 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 68 61 74 e callbacks that
340a0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 53 implement the S
340b0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 QL functions and
340c0 20 61 67 67 72 65 67 61 74 65 73 2e 0d 0a 2a 2a aggregates...**
340d0 20 54 68 65 20 33 72 64 20 70 61 72 61 6d 65 74 The 3rd paramet
340e0 65 72 20 74 6f 20 74 68 65 73 65 20 63 61 6c 6c er to these call
340f0 62 61 63 6b 73 20 69 73 20 61 6e 20 61 72 72 61 backs is an arra
34100 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f y of pointers to
34110 0d 0a 2a 2a 20 5b 70 72 6f 74 65 63 74 65 64 20 ..** [protected
34120 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5d 20 6f sqlite3_value] o
34130 62 6a 65 63 74 73 2e 20 20 54 68 65 72 65 20 69 bjects. There i
34140 73 20 6f 6e 65 20 5b 73 71 6c 69 74 65 33 5f 76 s one [sqlite3_v
34150 61 6c 75 65 5d 20 6f 62 6a 65 63 74 20 66 6f 72 alue] object for
34160 0d 0a 2a 2a 20 65 61 63 68 20 70 61 72 61 6d 65 ..** each parame
34170 74 65 72 20 74 6f 20 74 68 65 20 53 51 4c 20 66 ter to the SQL f
34180 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 unction. These
34190 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 routines are use
341a0 64 20 74 6f 0d 0a 2a 2a 20 65 78 74 72 61 63 74 d to..** extract
341b0 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 values from the
341c0 20 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5d [sqlite3_value]
341d0 20 6f 62 6a 65 63 74 73 2e 0d 0a 2a 2a 0d 0a 2a objects...**..*
341e0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 * These routines
341f0 20 77 6f 72 6b 20 6f 6e 6c 79 20 77 69 74 68 20 work only with
34200 5b 70 72 6f 74 65 63 74 65 64 20 73 71 6c 69 74 [protected sqlit
34210 65 33 5f 76 61 6c 75 65 5d 20 6f 62 6a 65 63 74 e3_value] object
34220 73 2e 0d 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d s...** Any attem
34230 70 74 20 74 6f 20 75 73 65 20 74 68 65 73 65 20 pt to use these
34240 72 6f 75 74 69 6e 65 73 20 6f 6e 20 61 6e 20 5b routines on an [
34250 75 6e 70 72 6f 74 65 63 74 65 64 20 73 71 6c 69 unprotected sqli
34260 74 65 33 5f 76 61 6c 75 65 5d 0d 0a 2a 2a 20 6f te3_value]..** o
34270 62 6a 65 63 74 20 72 65 73 75 6c 74 73 20 69 6e bject results in
34280 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 undefined behav
34290 69 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ior...**..** ^Th
342a0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 ese routines wor
342b0 6b 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 k just like the
342c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 5b 63 corresponding [c
342d0 6f 6c 75 6d 6e 20 61 63 63 65 73 73 20 66 75 6e olumn access fun
342e0 63 74 69 6f 6e 73 5d 0d 0a 2a 2a 20 65 78 63 65 ctions]..** exce
342f0 70 74 20 74 68 61 74 20 20 74 68 65 73 65 20 72 pt that these r
34300 6f 75 74 69 6e 65 73 20 74 61 6b 65 20 61 20 73 outines take a s
34310 69 6e 67 6c 65 20 5b 70 72 6f 74 65 63 74 65 64 ingle [protected
34320 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5d 20 sqlite3_value]
34330 6f 62 6a 65 63 74 0d 0a 2a 2a 20 70 6f 69 6e 74 object..** point
34340 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 er instead of a
34350 5b 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 5d 20 [sqlite3_stmt*]
34360 70 6f 69 6e 74 65 72 20 61 6e 64 20 61 6e 20 69 pointer and an i
34370 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 nteger column nu
34380 6d 62 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 mber...**..** ^T
34390 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 he sqlite3_value
343a0 5f 74 65 78 74 31 36 28 29 20 69 6e 74 65 72 66 _text16() interf
343b0 61 63 65 20 65 78 74 72 61 63 74 73 20 61 20 55 ace extracts a U
343c0 54 46 2d 31 36 20 73 74 72 69 6e 67 0d 0a 2a 2a TF-16 string..**
343d0 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65 20 62 in the native b
343e0 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 yte-order of the
343f0 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20 20 host machine.
34400 5e 54 68 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 ^The..** sqlite3
34410 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 _value_text16be(
34420 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 76 61 ) and sqlite3_va
34430 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 29 20 69 lue_text16le() i
34440 6e 74 65 72 66 61 63 65 73 0d 0a 2a 2a 20 65 78 nterfaces..** ex
34450 74 72 61 63 74 20 55 54 46 2d 31 36 20 73 74 72 tract UTF-16 str
34460 69 6e 67 73 20 61 73 20 62 69 67 2d 65 6e 64 69 ings as big-endi
34470 61 6e 20 61 6e 64 20 6c 69 74 74 6c 65 2d 65 6e an and little-en
34480 64 69 61 6e 20 72 65 73 70 65 63 74 69 76 65 6c dian respectivel
34490 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 y...**..** ^(The
344a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e sqlite3_value_n
344b0 75 6d 65 72 69 63 5f 74 79 70 65 28 29 20 69 6e umeric_type() in
344c0 74 65 72 66 61 63 65 20 61 74 74 65 6d 70 74 73 terface attempts
344d0 20 74 6f 20 61 70 70 6c 79 0d 0a 2a 2a 20 6e 75 to apply..** nu
344e0 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 74 meric affinity t
344f0 6f 20 74 68 65 20 76 61 6c 75 65 2e 20 20 54 68 o the value. Th
34500 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e is means that an
34510 20 61 74 74 65 6d 70 74 20 69 73 0d 0a 2a 2a 20 attempt is..**
34520 6d 61 64 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 made to convert
34530 74 68 65 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 the value to an
34540 69 6e 74 65 67 65 72 20 6f 72 20 66 6c 6f 61 74 integer or float
34550 69 6e 67 20 70 6f 69 6e 74 2e 20 20 49 66 0d 0a ing point. If..
34560 2a 2a 20 73 75 63 68 20 61 20 63 6f 6e 76 65 72 ** such a conver
34570 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 sion is possible
34580 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 without loss of
34590 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 69 6e information (in
345a0 20 6f 74 68 65 72 0d 0a 2a 2a 20 77 6f 72 64 73 other..** words
345b0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 , if the value i
345c0 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 s a string that
345d0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d looks like a num
345e0 62 65 72 29 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 ber)..** then th
345f0 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 e conversion is
34600 70 65 72 66 6f 72 6d 65 64 2e 20 20 4f 74 68 65 performed. Othe
34610 72 77 69 73 65 20 6e 6f 20 63 6f 6e 76 65 72 73 rwise no convers
34620 69 6f 6e 20 6f 63 63 75 72 73 2e 0d 0a 2a 2a 20 ion occurs...**
34630 54 68 65 20 5b 53 51 4c 49 54 45 5f 49 4e 54 45 The [SQLITE_INTE
34640 47 45 52 20 7c 20 64 61 74 61 74 79 70 65 5d 20 GER | datatype]
34650 61 66 74 65 72 20 63 6f 6e 76 65 72 73 69 6f 6e after conversion
34660 20 69 73 20 72 65 74 75 72 6e 65 64 2e 29 5e 0d is returned.)^.
34670 0a 2a 2a 0d 0a 2a 2a 20 50 6c 65 61 73 65 20 70 .**..** Please p
34680 61 79 20 70 61 72 74 69 63 75 6c 61 72 20 61 74 ay particular at
34690 74 65 6e 74 69 6f 6e 20 74 6f 20 74 68 65 20 66 tention to the f
346a0 61 63 74 20 74 68 61 74 20 74 68 65 20 70 6f 69 act that the poi
346b0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 0d 0a 2a nter returned..*
346c0 2a 20 66 72 6f 6d 20 5b 73 71 6c 69 74 65 33 5f * from [sqlite3_
346d0 76 61 6c 75 65 5f 62 6c 6f 62 28 29 5d 2c 20 5b value_blob()], [
346e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 sqlite3_value_te
346f0 78 74 28 29 5d 2c 20 6f 72 0d 0a 2a 2a 20 5b 73 xt()], or..** [s
34700 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 qlite3_value_tex
34710 74 31 36 28 29 5d 20 63 61 6e 20 62 65 20 69 6e t16()] can be in
34720 76 61 6c 69 64 61 74 65 64 20 62 79 20 61 20 73 validated by a s
34730 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 ubsequent call t
34740 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 76 o..** [sqlite3_v
34750 61 6c 75 65 5f 62 79 74 65 73 28 29 5d 2c 20 5b alue_bytes()], [
34760 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 sqlite3_value_by
34770 74 65 73 31 36 28 29 5d 2c 20 5b 73 71 6c 69 74 tes16()], [sqlit
34780 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 5d e3_value_text()]
34790 2c 0d 0a 2a 2a 20 6f 72 20 5b 73 71 6c 69 74 65 ,..** or [sqlite
347a0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 3_value_text16()
347b0 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 ]...**..** These
347c0 20 72 6f 75 74 69 6e 65 73 20 6d 75 73 74 20 62 routines must b
347d0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68 e called from th
347e0 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 61 73 e same thread as
347f0 0d 0a 2a 2a 20 74 68 65 20 53 51 4c 20 66 75 6e ..** the SQL fun
34800 63 74 69 6f 6e 20 74 68 61 74 20 73 75 70 70 6c ction that suppl
34810 69 65 64 20 74 68 65 20 5b 73 71 6c 69 74 65 33 ied the [sqlite3
34820 5f 76 61 6c 75 65 2a 5d 20 70 61 72 61 6d 65 74 _value*] paramet
34830 65 72 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ers...*/..SQLITE
34840 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 _API const void
34850 2a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 *sqlite3_value_b
34860 6c 6f 62 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 lob(sqlite3_valu
34870 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 e*);..SQLITE_API
34880 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c int sqlite3_val
34890 75 65 5f 62 79 74 65 73 28 73 71 6c 69 74 65 33 ue_bytes(sqlite3
348a0 5f 76 61 6c 75 65 2a 29 3b 0d 0a 53 51 4c 49 54 _value*);..SQLIT
348b0 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
348c0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 3_value_bytes16(
348d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b sqlite3_value*);
348e0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 64 6f 75 ..SQLITE_API dou
348f0 62 6c 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 ble sqlite3_valu
34900 65 5f 64 6f 75 62 6c 65 28 73 71 6c 69 74 65 33 e_double(sqlite3
34910 5f 76 61 6c 75 65 2a 29 3b 0d 0a 53 51 4c 49 54 _value*);..SQLIT
34920 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
34930 33 5f 76 61 6c 75 65 5f 69 6e 74 28 73 71 6c 69 3_value_int(sqli
34940 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a 53 51 te3_value*);..SQ
34950 4c 49 54 45 5f 41 50 49 20 73 71 6c 69 74 65 33 LITE_API sqlite3
34960 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 76 _int64 sqlite3_v
34970 61 6c 75 65 5f 69 6e 74 36 34 28 73 71 6c 69 74 alue_int64(sqlit
34980 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a 53 51 4c e3_value*);..SQL
34990 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 75 6e ITE_API const un
349a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 71 6c signed char *sql
349b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 ite3_value_text(
349c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b sqlite3_value*);
349d0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e ..SQLITE_API con
349e0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 st void *sqlite3
349f0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 73 71 _value_text16(sq
34a00 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a lite3_value*);..
34a10 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
34a20 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 76 void *sqlite3_v
34a30 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 73 71 alue_text16le(sq
34a40 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a lite3_value*);..
34a50 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 SQLITE_API const
34a60 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 76 void *sqlite3_v
34a70 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 73 71 alue_text16be(sq
34a80 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a lite3_value*);..
34a90 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
34aa0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 qlite3_value_typ
34ab0 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a e(sqlite3_value*
34ac0 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 );..SQLITE_API i
34ad0 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 nt sqlite3_value
34ae0 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71 _numeric_type(sq
34af0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0d 0a lite3_value*);..
34b00 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
34b10 46 3a 20 4f 62 74 61 69 6e 20 41 67 67 72 65 67 F: Obtain Aggreg
34b20 61 74 65 20 46 75 6e 63 74 69 6f 6e 20 43 6f 6e ate Function Con
34b30 74 65 78 74 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6d 70 text..**..** Imp
34b40 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 lementations of
34b50 61 67 67 72 65 67 61 74 65 20 53 51 4c 20 66 75 aggregate SQL fu
34b60 6e 63 74 69 6f 6e 73 20 75 73 65 20 74 68 69 73 nctions use this
34b70 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 ..** routine to
34b80 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 allocate memory
34b90 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 69 for storing thei
34ba0 72 20 73 74 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a r state...**..**
34bb0 20 5e 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 ^The first time
34bc0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 67 67 the sqlite3_agg
34bd0 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 43 regate_context(C
34be0 2c 4e 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 ,N) routine is c
34bf0 61 6c 6c 65 64 20 0d 0a 2a 2a 20 66 6f 72 20 61 alled ..** for a
34c00 20 70 61 72 74 69 63 75 6c 61 72 20 61 67 67 72 particular aggr
34c10 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 egate function,
34c20 53 51 4c 69 74 65 0d 0a 2a 2a 20 61 6c 6c 6f 63 SQLite..** alloc
34c30 61 74 65 73 20 4e 20 6f 66 20 6d 65 6d 6f 72 79 ates N of memory
34c40 2c 20 7a 65 72 6f 65 73 20 6f 75 74 20 74 68 61 , zeroes out tha
34c50 74 20 6d 65 6d 6f 72 79 2c 20 61 6e 64 20 72 65 t memory, and re
34c60 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0d turns a pointer.
34c70 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 6d .** to the new m
34c80 65 6d 6f 72 79 2e 20 5e 4f 6e 20 73 65 63 6f 6e emory. ^On secon
34c90 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 d and subsequent
34ca0 20 63 61 6c 6c 73 20 74 6f 0d 0a 2a 2a 20 73 71 calls to..** sq
34cb0 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f lite3_aggregate_
34cc0 63 6f 6e 74 65 78 74 28 29 20 66 6f 72 20 74 68 context() for th
34cd0 65 20 73 61 6d 65 20 61 67 67 72 65 67 61 74 65 e same aggregate
34ce0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 74 61 6e function instan
34cf0 63 65 2c 0d 0a 2a 2a 20 74 68 65 20 73 61 6d 65 ce,..** the same
34d00 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75 72 buffer is retur
34d10 6e 65 64 2e 20 20 53 71 6c 69 74 65 33 5f 61 67 ned. Sqlite3_ag
34d20 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 gregate_context(
34d30 29 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 2a ) is normally..*
34d40 2a 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f * called once fo
34d50 72 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f r each invocatio
34d60 6e 20 6f 66 20 74 68 65 20 78 53 74 65 70 20 63 n of the xStep c
34d70 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 6e allback and then
34d80 20 6f 6e 65 0d 0a 2a 2a 20 6c 61 73 74 20 74 69 one..** last ti
34d90 6d 65 20 77 68 65 6e 20 74 68 65 20 78 46 69 6e me when the xFin
34da0 61 6c 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 al callback is i
34db0 6e 76 6f 6b 65 64 2e 20 20 5e 28 57 68 65 6e 20 nvoked. ^(When
34dc0 6e 6f 20 72 6f 77 73 20 6d 61 74 63 68 0d 0a 2a no rows match..*
34dd0 2a 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 * an aggregate q
34de0 75 65 72 79 2c 20 74 68 65 20 78 53 74 65 70 28 uery, the xStep(
34df0 29 20 63 61 6c 6c 62 61 63 6b 20 6f 66 20 74 68 ) callback of th
34e00 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 e aggregate func
34e10 74 69 6f 6e 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 tion..** impleme
34e20 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 ntation is never
34e30 20 63 61 6c 6c 65 64 20 61 6e 64 20 78 46 69 6e called and xFin
34e40 61 6c 28 29 20 69 73 20 63 61 6c 6c 65 64 20 65 al() is called e
34e50 78 61 63 74 6c 79 20 6f 6e 63 65 2e 0d 0a 2a 2a xactly once...**
34e60 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c In those cases,
34e70 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 sqlite3_aggrega
34e80 74 65 5f 63 6f 6e 74 65 78 74 28 29 20 6d 69 67 te_context() mig
34e90 68 74 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 ht be called for
34ea0 20 74 68 65 0d 0a 2a 2a 20 66 69 72 73 74 20 74 the..** first t
34eb0 69 6d 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 ime from within
34ec0 78 46 69 6e 61 6c 28 29 2e 29 5e 0d 0a 2a 2a 0d xFinal().)^..**.
34ed0 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 .** ^The sqlite3
34ee0 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 _aggregate_conte
34ef0 78 74 28 43 2c 4e 29 20 72 6f 75 74 69 6e 65 20 xt(C,N) routine
34f00 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 returns a NULL p
34f10 6f 69 6e 74 65 72 20 69 66 20 4e 20 69 73 0d 0a ointer if N is..
34f20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 ** less than or
34f30 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 20 6f 72 equal to zero or
34f40 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c if a memory all
34f50 6f 63 61 74 65 20 65 72 72 6f 72 20 6f 63 63 75 ocate error occu
34f60 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 rs...**..** ^(Th
34f70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 e amount of spac
34f80 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73 e allocated by s
34f90 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 qlite3_aggregate
34fa0 5f 63 6f 6e 74 65 78 74 28 43 2c 4e 29 20 69 73 _context(C,N) is
34fb0 0d 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 ..** determined
34fc0 62 79 20 74 68 65 20 4e 20 70 61 72 61 6d 65 74 by the N paramet
34fd0 65 72 20 6f 6e 20 66 69 72 73 74 20 73 75 63 63 er on first succ
34fe0 65 73 73 66 75 6c 20 63 61 6c 6c 2e 20 20 43 68 essful call. Ch
34ff0 61 6e 67 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 76 anging the..** v
35000 61 6c 75 65 20 6f 66 20 4e 20 69 6e 20 73 75 62 alue of N in sub
35010 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 sequent call to
35020 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 sqlite3_aggregat
35030 65 5f 63 6f 6e 74 65 78 74 28 29 20 77 69 74 68 e_context() with
35040 69 6e 0d 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 in..** the same
35050 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 aggregate functi
35060 6f 6e 20 69 6e 73 74 61 6e 63 65 20 77 69 6c 6c on instance will
35070 20 6e 6f 74 20 72 65 73 69 7a 65 20 74 68 65 20 not resize the
35080 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 memory..** alloc
35090 61 74 69 6f 6e 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a ation.)^..**..**
350a0 20 5e 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 ^SQLite automat
350b0 69 63 61 6c 6c 79 20 66 72 65 65 73 20 74 68 65 ically frees the
350c0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 memory allocate
350d0 64 20 62 79 20 0d 0a 2a 2a 20 73 71 6c 69 74 65 d by ..** sqlite
350e0 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 3_aggregate_cont
350f0 65 78 74 28 29 20 77 68 65 6e 20 74 68 65 20 61 ext() when the a
35100 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 63 ggregate query c
35110 6f 6e 63 6c 75 64 65 73 2e 0d 0a 2a 2a 0d 0a 2a oncludes...**..*
35120 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 * The first para
35130 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 meter must be a
35140 63 6f 70 79 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 copy of the..**
35150 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 [sqlite3_context
35160 20 7c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 | SQL function
35170 63 6f 6e 74 65 78 74 5d 20 74 68 61 74 20 69 73 context] that is
35180 20 74 68 65 20 66 69 72 73 74 20 70 61 72 61 6d the first param
35190 65 74 65 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 eter..** to the
351a0 78 53 74 65 70 20 6f 72 20 78 46 69 6e 61 6c 20 xStep or xFinal
351b0 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 callback routine
351c0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 that implements
351d0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 0d 0a the aggregate..
351e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a ** function...**
351f0 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
35200 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 e must be called
35210 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 74 from the same t
35220 68 72 65 61 64 20 69 6e 20 77 68 69 63 68 0d 0a hread in which..
35230 2a 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65 ** the aggregate
35240 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 SQL function is
35250 20 72 75 6e 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 53 running...*/..S
35260 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 2a QLITE_API void *
35270 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 sqlite3_aggregat
35280 65 5f 63 6f 6e 74 65 78 74 28 73 71 6c 69 74 65 e_context(sqlite
35290 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 3_context*, int
352a0 6e 42 79 74 65 73 29 3b 0d 0a 0d 0a 2f 2a 0d 0a nBytes);..../*..
352b0 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 55 73 65 ** CAPI3REF: Use
352c0 72 20 44 61 74 61 20 46 6f 72 20 46 75 6e 63 74 r Data For Funct
352d0 69 6f 6e 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ions..**..** ^Th
352e0 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 e sqlite3_user_d
352f0 61 74 61 28 29 20 69 6e 74 65 72 66 61 63 65 20 ata() interface
35300 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f returns a copy o
35310 66 0d 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 f..** the pointe
35320 72 20 74 68 61 74 20 77 61 73 20 74 68 65 20 70 r that was the p
35330 55 73 65 72 44 61 74 61 20 70 61 72 61 6d 65 74 UserData paramet
35340 65 72 20 28 74 68 65 20 35 74 68 20 70 61 72 61 er (the 5th para
35350 6d 65 74 65 72 29 0d 0a 2a 2a 20 6f 66 20 74 68 meter)..** of th
35360 65 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 e [sqlite3_creat
35370 65 5f 66 75 6e 63 74 69 6f 6e 28 29 5d 0d 0a 2a e_function()]..*
35380 2a 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 63 * and [sqlite3_c
35390 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 reate_function16
353a0 28 29 5d 20 72 6f 75 74 69 6e 65 73 20 74 68 61 ()] routines tha
353b0 74 20 6f 72 69 67 69 6e 61 6c 6c 79 0d 0a 2a 2a t originally..**
353c0 20 72 65 67 69 73 74 65 72 65 64 20 74 68 65 20 registered the
353d0 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 66 69 application defi
353e0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a ned function...*
353f0 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 *..** This routi
35400 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 ne must be calle
35410 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 d from the same
35420 74 68 72 65 61 64 20 69 6e 20 77 68 69 63 68 0d thread in which.
35430 0a 2a 2a 20 74 68 65 20 61 70 70 6c 69 63 61 74 .** the applicat
35440 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 ion-defined func
35450 74 69 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 2e tion is running.
35460 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
35470 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 void *sqlite3_u
35480 73 65 72 5f 64 61 74 61 28 73 71 6c 69 74 65 33 ser_data(sqlite3
35490 5f 63 6f 6e 74 65 78 74 2a 29 3b 0d 0a 0d 0a 2f _context*);..../
354a0 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
354b0 44 61 74 61 62 61 73 65 20 43 6f 6e 6e 65 63 74 Database Connect
354c0 69 6f 6e 20 46 6f 72 20 46 75 6e 63 74 69 6f 6e ion For Function
354d0 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 s..**..** ^The s
354e0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 qlite3_context_d
354f0 62 5f 68 61 6e 64 6c 65 28 29 20 69 6e 74 65 72 b_handle() inter
35500 66 61 63 65 20 72 65 74 75 72 6e 73 20 61 20 63 face returns a c
35510 6f 70 79 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 70 opy of..** the p
35520 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 5b 64 ointer to the [d
35530 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
35540 6f 6e 5d 20 28 74 68 65 20 31 73 74 20 70 61 72 on] (the 1st par
35550 61 6d 65 74 65 72 29 0d 0a 2a 2a 20 6f 66 20 74 ameter)..** of t
35560 68 65 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 he [sqlite3_crea
35570 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 5d 0d 0a te_function()]..
35580 2a 2a 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f ** and [sqlite3_
35590 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 create_function1
355a0 36 28 29 5d 20 72 6f 75 74 69 6e 65 73 20 74 68 6()] routines th
355b0 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 0d 0a 2a at originally..*
355c0 2a 20 72 65 67 69 73 74 65 72 65 64 20 74 68 65 * registered the
355d0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 66 application def
355e0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a ined function...
355f0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 */..SQLITE_API s
35600 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 5f qlite3 *sqlite3_
35610 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c context_db_handl
35620 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 e(sqlite3_contex
35630 74 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 t*);..../*..** C
35640 41 50 49 33 52 45 46 3a 20 46 75 6e 63 74 69 6f API3REF: Functio
35650 6e 20 41 75 78 69 6c 69 61 72 79 20 44 61 74 61 n Auxiliary Data
35660 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c ..**..** The fol
35670 6c 6f 77 69 6e 67 20 74 77 6f 20 66 75 6e 63 74 lowing two funct
35680 69 6f 6e 73 20 6d 61 79 20 62 65 20 75 73 65 64 ions may be used
35690 20 62 79 20 73 63 61 6c 61 72 20 53 51 4c 20 66 by scalar SQL f
356a0 75 6e 63 74 69 6f 6e 73 20 74 6f 0d 0a 2a 2a 20 unctions to..**
356b0 61 73 73 6f 63 69 61 74 65 20 6d 65 74 61 64 61 associate metada
356c0 74 61 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74 ta with argument
356d0 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 values. If the
356e0 73 61 6d 65 20 76 61 6c 75 65 20 69 73 20 70 61 same value is pa
356f0 73 73 65 64 20 74 6f 0d 0a 2a 2a 20 6d 75 6c 74 ssed to..** mult
35700 69 70 6c 65 20 69 6e 76 6f 63 61 74 69 6f 6e 73 iple invocations
35710 20 6f 66 20 74 68 65 20 73 61 6d 65 20 53 51 4c of the same SQL
35720 20 66 75 6e 63 74 69 6f 6e 20 64 75 72 69 6e 67 function during
35730 20 71 75 65 72 79 20 65 78 65 63 75 74 69 6f 6e query execution
35740 2c 20 75 6e 64 65 72 0d 0a 2a 2a 20 73 6f 6d 65 , under..** some
35750 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 74 circumstances t
35760 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6d 65 he associated me
35770 74 61 64 61 74 61 20 6d 61 79 20 62 65 20 70 72 tadata may be pr
35780 65 73 65 72 76 65 64 2e 20 54 68 69 73 20 6d 61 eserved. This ma
35790 79 0d 0a 2a 2a 20 62 65 20 75 73 65 64 2c 20 66 y..** be used, f
357a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 61 or example, to a
357b0 64 64 20 61 20 72 65 67 75 6c 61 72 2d 65 78 70 dd a regular-exp
357c0 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 69 6e 67 ression matching
357d0 20 73 63 61 6c 61 72 0d 0a 2a 2a 20 66 75 6e 63 scalar..** func
357e0 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6d 70 69 6c tion. The compil
357f0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 ed version of th
35800 65 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 e regular expres
35810 73 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 sion is stored a
35820 73 0d 0a 2a 2a 20 6d 65 74 61 64 61 74 61 20 61 s..** metadata a
35830 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
35840 68 65 20 53 51 4c 20 76 61 6c 75 65 20 70 61 73 he SQL value pas
35850 73 65 64 20 61 73 20 74 68 65 20 72 65 67 75 6c sed as the regul
35860 61 72 20 65 78 70 72 65 73 73 69 6f 6e 0d 0a 2a ar expression..*
35870 2a 20 70 61 74 74 65 72 6e 2e 20 20 54 68 65 20 * pattern. The
35880 63 6f 6d 70 69 6c 65 64 20 72 65 67 75 6c 61 72 compiled regular
35890 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 expression can
358a0 62 65 20 72 65 75 73 65 64 20 6f 6e 20 6d 75 6c be reused on mul
358b0 74 69 70 6c 65 0d 0a 2a 2a 20 69 6e 76 6f 63 61 tiple..** invoca
358c0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d tions of the sam
358d0 65 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 e function so th
358e0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 at the original
358f0 70 61 74 74 65 72 6e 20 73 74 72 69 6e 67 0d 0a pattern string..
35900 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 ** does not need
35910 20 74 6f 20 62 65 20 72 65 63 6f 6d 70 69 6c 65 to be recompile
35920 64 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 d on each invoca
35930 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 tion...**..** ^T
35940 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 he sqlite3_get_a
35950 75 78 64 61 74 61 28 29 20 69 6e 74 65 72 66 61 uxdata() interfa
35960 63 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 ce returns a poi
35970 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65 74 61 nter to the meta
35980 64 61 74 61 0d 0a 2a 2a 20 61 73 73 6f 63 69 61 data..** associa
35990 74 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 ted by the sqlit
359a0 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 e3_set_auxdata()
359b0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 function with t
359c0 68 65 20 4e 74 68 20 61 72 67 75 6d 65 6e 74 0d he Nth argument.
359d0 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 74 68 65 .** value to the
359e0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 application-def
359f0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e 20 5e ined function. ^
35a00 49 66 20 6e 6f 20 6d 65 74 61 64 61 74 61 20 68 If no metadata h
35a10 61 73 20 62 65 65 6e 20 65 76 65 72 0d 0a 2a 2a as been ever..**
35a20 20 62 65 65 6e 20 73 65 74 20 66 6f 72 20 74 68 been set for th
35a30 65 20 4e 74 68 20 61 72 67 75 6d 65 6e 74 20 6f e Nth argument o
35a40 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 f the function,
35a50 6f 72 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 or if the corres
35a60 70 6f 6e 64 69 6e 67 0d 0a 2a 2a 20 66 75 6e 63 ponding..** func
35a70 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 68 tion parameter h
35a80 61 73 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 as changed since
35a90 20 74 68 65 20 6d 65 74 61 2d 64 61 74 61 20 77 the meta-data w
35aa0 61 73 20 73 65 74 2c 0d 0a 2a 2a 20 74 68 65 6e as set,..** then
35ab0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 sqlite3_get_aux
35ac0 64 61 74 61 28 29 20 72 65 74 75 72 6e 73 20 61 data() returns a
35ad0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a NULL pointer...
35ae0 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 **..** ^The sqli
35af0 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 te3_set_auxdata(
35b00 29 20 69 6e 74 65 72 66 61 63 65 20 73 61 76 65 ) interface save
35b10 73 20 74 68 65 20 6d 65 74 61 64 61 74 61 0d 0a s the metadata..
35b20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 ** pointed to by
35b30 20 69 74 73 20 33 72 64 20 70 61 72 61 6d 65 74 its 3rd paramet
35b40 65 72 20 61 73 20 74 68 65 20 6d 65 74 61 64 61 er as the metada
35b50 74 61 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 0d ta for the N-th.
35b60 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 .** argument of
35b70 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d the application-
35b80 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e defined function
35b90 2e 20 20 53 75 62 73 65 71 75 65 6e 74 0d 0a 2a . Subsequent..*
35ba0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 * calls to sqlit
35bb0 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28 29 e3_get_auxdata()
35bc0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 74 68 might return th
35bd0 69 73 20 64 61 74 61 2c 20 69 66 20 69 74 20 68 is data, if it h
35be0 61 73 0d 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 as..** not been
35bf0 64 65 73 74 72 6f 79 65 64 2e 0d 0a 2a 2a 20 5e destroyed...** ^
35c00 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c If it is not NUL
35c10 4c 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 69 L, SQLite will i
35c20 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 nvoke the destru
35c30 63 74 6f 72 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f ctor..** functio
35c40 6e 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 34 n given by the 4
35c50 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 th parameter to
35c60 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 sqlite3_set_auxd
35c70 61 74 61 28 29 20 6f 6e 0d 0a 2a 2a 20 74 68 65 ata() on..** the
35c80 20 6d 65 74 61 64 61 74 61 20 77 68 65 6e 20 74 metadata when t
35c90 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
35ca0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 function parame
35cb0 74 65 72 20 63 68 61 6e 67 65 73 0d 0a 2a 2a 20 ter changes..**
35cc0 6f 72 20 77 68 65 6e 20 74 68 65 20 53 51 4c 20 or when the SQL
35cd0 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 6c 65 statement comple
35ce0 74 65 73 2c 20 77 68 69 63 68 65 76 65 72 20 63 tes, whichever c
35cf0 6f 6d 65 73 20 66 69 72 73 74 2e 0d 0a 2a 2a 0d omes first...**.
35d00 0a 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 66 72 .** SQLite is fr
35d10 65 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 64 ee to call the d
35d20 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 64 72 estructor and dr
35d30 6f 70 20 6d 65 74 61 64 61 74 61 20 6f 6e 20 61 op metadata on a
35d40 6e 79 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 ny..** parameter
35d50 20 6f 66 20 61 6e 79 20 66 75 6e 63 74 69 6f 6e of any function
35d60 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 5e at any time. ^
35d70 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 The only guarant
35d80 65 65 20 69 73 20 74 68 61 74 0d 0a 2a 2a 20 74 ee is that..** t
35d90 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 77 69 he destructor wi
35da0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 ll be called bef
35db0 6f 72 65 20 74 68 65 20 6d 65 74 61 64 61 74 61 ore the metadata
35dc0 20 69 73 20 64 72 6f 70 70 65 64 2e 0d 0a 2a 2a is dropped...**
35dd0 0d 0a 2a 2a 20 5e 28 49 6e 20 70 72 61 63 74 69 ..** ^(In practi
35de0 63 65 2c 20 6d 65 74 61 64 61 74 61 20 69 73 20 ce, metadata is
35df0 70 72 65 73 65 72 76 65 64 20 62 65 74 77 65 65 preserved betwee
35e00 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 n function calls
35e10 20 66 6f 72 0d 0a 2a 2a 20 65 78 70 72 65 73 73 for..** express
35e20 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 63 6f ions that are co
35e30 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c nstant at compil
35e40 65 20 74 69 6d 65 2e 20 54 68 69 73 20 69 6e 63 e time. This inc
35e50 6c 75 64 65 73 20 6c 69 74 65 72 61 6c 0d 0a 2a ludes literal..*
35e60 2a 20 76 61 6c 75 65 73 20 61 6e 64 20 5b 70 61 * values and [pa
35e70 72 61 6d 65 74 65 72 73 5d 2e 29 5e 0d 0a 2a 2a rameters].)^..**
35e80 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 ..** These routi
35e90 6e 65 73 20 6d 75 73 74 20 62 65 20 63 61 6c 6c nes must be call
35ea0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 ed from the same
35eb0 20 74 68 72 65 61 64 20 69 6e 20 77 68 69 63 68 thread in which
35ec0 0d 0a 2a 2a 20 74 68 65 20 53 51 4c 20 66 75 6e ..** the SQL fun
35ed0 63 74 69 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 ction is running
35ee0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
35ef0 49 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f I void *sqlite3_
35f00 67 65 74 5f 61 75 78 64 61 74 61 28 73 71 6c 69 get_auxdata(sqli
35f10 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e te3_context*, in
35f20 74 20 4e 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 t N);..SQLITE_AP
35f30 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 I void sqlite3_s
35f40 65 74 5f 61 75 78 64 61 74 61 28 73 71 6c 69 74 et_auxdata(sqlit
35f50 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 e3_context*, int
35f60 20 4e 2c 20 76 6f 69 64 2a 2c 20 76 6f 69 64 20 N, void*, void
35f70 28 2a 29 28 76 6f 69 64 2a 29 29 3b 0d 0a 0d 0a (*)(void*));....
35f80 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
35f90 46 3a 20 43 6f 6e 73 74 61 6e 74 73 20 44 65 66 F: Constants Def
35fa0 69 6e 69 6e 67 20 53 70 65 63 69 61 6c 20 44 65 ining Special De
35fb0 73 74 72 75 63 74 6f 72 20 42 65 68 61 76 69 6f structor Behavio
35fc0 72 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 r..**..** These
35fd0 61 72 65 20 73 70 65 63 69 61 6c 20 76 61 6c 75 are special valu
35fe0 65 73 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 es for the destr
35ff0 75 63 74 6f 72 20 74 68 61 74 20 69 73 20 70 61 uctor that is pa
36000 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 0d 0a ssed in as the..
36010 2a 2a 20 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e ** final argumen
36020 74 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 6c 69 t to routines li
36030 6b 65 20 5b 73 71 6c 69 74 65 33 5f 72 65 73 75 ke [sqlite3_resu
36040 6c 74 5f 62 6c 6f 62 28 29 5d 2e 20 20 5e 49 66 lt_blob()]. ^If
36050 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 0d the destructor.
36060 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 .** argument is
36070 53 51 4c 49 54 45 5f 53 54 41 54 49 43 2c 20 69 SQLITE_STATIC, i
36080 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 t means that the
36090 20 63 6f 6e 74 65 6e 74 20 70 6f 69 6e 74 65 72 content pointer
360a0 20 69 73 20 63 6f 6e 73 74 61 6e 74 0d 0a 2a 2a is constant..**
360b0 20 61 6e 64 20 77 69 6c 6c 20 6e 65 76 65 72 20 and will never
360c0 63 68 61 6e 67 65 2e 20 20 49 74 20 64 6f 65 73 change. It does
360d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 not need to be
360e0 64 65 73 74 72 6f 79 65 64 2e 20 20 5e 54 68 65 destroyed. ^The
360f0 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 52 41 4e ..** SQLITE_TRAN
36100 53 49 45 4e 54 20 76 61 6c 75 65 20 6d 65 61 6e SIENT value mean
36110 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 s that the conte
36120 6e 74 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 nt will likely c
36130 68 61 6e 67 65 20 69 6e 0d 0a 2a 2a 20 74 68 65 hange in..** the
36140 20 6e 65 61 72 20 66 75 74 75 72 65 20 61 6e 64 near future and
36150 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 68 6f that SQLite sho
36160 75 6c 64 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e uld make its own
36170 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66 private copy of
36180 0d 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 ..** the content
36190 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
361a0 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 74 g...**..** The t
361b0 79 70 65 64 65 66 20 69 73 20 6e 65 63 65 73 73 ypedef is necess
361c0 61 72 79 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 ary to work arou
361d0 6e 64 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 63 nd problems in c
361e0 65 72 74 61 69 6e 0d 0a 2a 2a 20 43 2b 2b 20 63 ertain..** C++ c
361f0 6f 6d 70 69 6c 65 72 73 2e 20 20 53 65 65 20 74 ompilers. See t
36200 69 63 6b 65 74 20 23 32 31 39 31 2e 0d 0a 2a 2f icket #2191...*/
36210 0d 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 ..typedef void (
36220 2a 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63 *sqlite3_destruc
36230 74 6f 72 5f 74 79 70 65 29 28 76 6f 69 64 2a 29 tor_type)(void*)
36240 3b 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 ;..#define SQLIT
36250 45 5f 53 54 41 54 49 43 20 20 20 20 20 20 28 28 E_STATIC ((
36260 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63 74 sqlite3_destruct
36270 6f 72 5f 74 79 70 65 29 30 29 0d 0a 23 64 65 66 or_type)0)..#def
36280 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 ine SQLITE_TRANS
36290 49 45 4e 54 20 20 20 28 28 73 71 6c 69 74 65 33 IENT ((sqlite3
362a0 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65 _destructor_type
362b0 29 2d 31 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 )-1)..../*..** C
362c0 41 50 49 33 52 45 46 3a 20 53 65 74 74 69 6e 67 API3REF: Setting
362d0 20 54 68 65 20 52 65 73 75 6c 74 20 4f 66 20 41 The Result Of A
362e0 6e 20 53 51 4c 20 46 75 6e 63 74 69 6f 6e 0d 0a n SQL Function..
362f0 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 **..** These rou
36300 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 62 tines are used b
36310 79 20 74 68 65 20 78 46 75 6e 63 20 6f 72 20 78 y the xFunc or x
36320 46 69 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 73 20 Final callbacks
36330 74 68 61 74 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 that..** impleme
36340 6e 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 nt SQL functions
36350 20 61 6e 64 20 61 67 67 72 65 67 61 74 65 73 2e and aggregates.
36360 20 20 53 65 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 See..** [sqlit
36370 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 e3_create_functi
36380 6f 6e 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 on()] and [sqlit
36390 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 e3_create_functi
363a0 6f 6e 31 36 28 29 5d 0d 0a 2a 2a 20 66 6f 72 20 on16()]..** for
363b0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 additional infor
363c0 6d 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 mation...**..**
363d0 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 These functions
363e0 77 6f 72 6b 20 76 65 72 79 20 6d 75 63 68 20 6c work very much l
363f0 69 6b 65 20 74 68 65 20 5b 70 61 72 61 6d 65 74 ike the [paramet
36400 65 72 20 62 69 6e 64 69 6e 67 5d 20 66 61 6d 69 er binding] fami
36410 6c 79 20 6f 66 0d 0a 2a 2a 20 66 75 6e 63 74 69 ly of..** functi
36420 6f 6e 73 20 75 73 65 64 20 74 6f 20 62 69 6e 64 ons used to bind
36430 20 76 61 6c 75 65 73 20 74 6f 20 68 6f 73 74 20 values to host
36440 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 70 72 parameters in pr
36450 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement
36460 73 2e 0d 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 s...** Refer to
36470 74 68 65 20 5b 53 51 4c 20 70 61 72 61 6d 65 74 the [SQL paramet
36480 65 72 5d 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f er] documentatio
36490 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c n for additional
364a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a information...*
364b0 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 *..** ^The sqlit
364c0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 29 e3_result_blob()
364d0 20 69 6e 74 65 72 66 61 63 65 20 73 65 74 73 20 interface sets
364e0 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 0d the result from.
364f0 0a 2a 2a 20 61 6e 20 61 70 70 6c 69 63 61 74 69 .** an applicati
36500 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 on-defined funct
36510 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 42 4c ion to be the BL
36520 4f 42 20 77 68 6f 73 65 20 63 6f 6e 74 65 6e 74 OB whose content
36530 20 69 73 20 70 6f 69 6e 74 65 64 0d 0a 2a 2a 20 is pointed..**
36540 74 6f 20 62 79 20 74 68 65 20 73 65 63 6f 6e 64 to by the second
36550 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 77 parameter and w
36560 68 69 63 68 20 69 73 20 4e 20 62 79 74 65 73 20 hich is N bytes
36570 6c 6f 6e 67 20 77 68 65 72 65 20 4e 20 69 73 20 long where N is
36580 74 68 65 0d 0a 2a 2a 20 74 68 69 72 64 20 70 61 the..** third pa
36590 72 61 6d 65 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a rameter...**..**
365a0 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 72 65 ^The sqlite3_re
365b0 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 29 20 sult_zeroblob()
365c0 69 6e 74 65 72 66 61 63 65 73 20 73 65 74 20 74 interfaces set t
365d0 68 65 20 72 65 73 75 6c 74 20 6f 66 0d 0a 2a 2a he result of..**
365e0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
365f0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f -defined functio
36600 6e 20 74 6f 20 62 65 20 61 20 42 4c 4f 42 20 63 n to be a BLOB c
36610 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 7a 65 ontaining all ze
36620 72 6f 0d 0a 2a 2a 20 62 79 74 65 73 20 61 6e 64 ro..** bytes and
36630 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 N bytes in size
36640 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 , where N is the
36650 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 32 6e value of the 2n
36660 64 20 70 61 72 61 6d 65 74 65 72 2e 0d 0a 2a 2a d parameter...**
36670 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 ..** ^The sqlite
36680 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 3_result_double(
36690 29 20 69 6e 74 65 72 66 61 63 65 20 73 65 74 73 ) interface sets
366a0 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d the result from
366b0 0d 0a 2a 2a 20 61 6e 20 61 70 70 6c 69 63 61 74 ..** an applicat
366c0 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 ion-defined func
366d0 74 69 6f 6e 20 74 6f 20 62 65 20 61 20 66 6c 6f tion to be a flo
366e0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 ating point valu
366f0 65 20 73 70 65 63 69 66 69 65 64 0d 0a 2a 2a 20 e specified..**
36700 62 79 20 69 74 73 20 32 6e 64 20 61 72 67 75 6d by its 2nd argum
36710 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ent...**..** ^Th
36720 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 e sqlite3_result
36730 5f 65 72 72 6f 72 28 29 20 61 6e 64 20 73 71 6c _error() and sql
36740 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f ite3_result_erro
36750 72 31 36 28 29 20 66 75 6e 63 74 69 6f 6e 73 0d r16() functions.
36760 0a 2a 2a 20 63 61 75 73 65 20 74 68 65 20 69 6d .** cause the im
36770 70 6c 65 6d 65 6e 74 65 64 20 53 51 4c 20 66 75 plemented SQL fu
36780 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 nction to throw
36790 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 0d 0a 2a an exception...*
367a0 2a 20 5e 53 51 4c 69 74 65 20 75 73 65 73 20 74 * ^SQLite uses t
367b0 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 he string pointe
367c0 64 20 74 6f 20 62 79 20 74 68 65 0d 0a 2a 2a 20 d to by the..**
367d0 32 6e 64 20 70 61 72 61 6d 65 74 65 72 20 6f 66 2nd parameter of
367e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f sqlite3_result_
367f0 65 72 72 6f 72 28 29 20 6f 72 20 73 71 6c 69 74 error() or sqlit
36800 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 e3_result_error1
36810 36 28 29 0d 0a 2a 2a 20 61 73 20 74 68 65 20 74 6()..** as the t
36820 65 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 ext of an error
36830 6d 65 73 73 61 67 65 2e 20 20 5e 53 51 4c 69 74 message. ^SQLit
36840 65 20 69 6e 74 65 72 70 72 65 74 73 20 74 68 65 e interprets the
36850 20 65 72 72 6f 72 0d 0a 2a 2a 20 6d 65 73 73 61 error..** messa
36860 67 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 73 ge string from s
36870 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 qlite3_result_er
36880 72 6f 72 28 29 20 61 73 20 55 54 46 2d 38 2e 20 ror() as UTF-8.
36890 5e 53 51 4c 69 74 65 0d 0a 2a 2a 20 69 6e 74 65 ^SQLite..** inte
368a0 72 70 72 65 74 73 20 74 68 65 20 73 74 72 69 6e rprets the strin
368b0 67 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 g from sqlite3_r
368c0 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 29 20 esult_error16()
368d0 61 73 20 55 54 46 2d 31 36 20 69 6e 20 6e 61 74 as UTF-16 in nat
368e0 69 76 65 0d 0a 2a 2a 20 62 79 74 65 20 6f 72 64 ive..** byte ord
368f0 65 72 2e 20 20 5e 49 66 20 74 68 65 20 74 68 69 er. ^If the thi
36900 72 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 rd parameter to
36910 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 sqlite3_result_e
36920 72 72 6f 72 28 29 0d 0a 2a 2a 20 6f 72 20 73 71 rror()..** or sq
36930 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 lite3_result_err
36940 6f 72 31 36 28 29 20 69 73 20 6e 65 67 61 74 69 or16() is negati
36950 76 65 20 74 68 65 6e 20 53 51 4c 69 74 65 20 74 ve then SQLite t
36960 61 6b 65 73 20 61 73 20 74 68 65 20 65 72 72 6f akes as the erro
36970 72 0d 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 6c r..** message al
36980 6c 20 74 65 78 74 20 75 70 20 74 68 72 6f 75 67 l text up throug
36990 68 20 74 68 65 20 66 69 72 73 74 20 7a 65 72 6f h the first zero
369a0 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2a 20 character...**
369b0 5e 49 66 20 74 68 65 20 74 68 69 72 64 20 70 61 ^If the third pa
369c0 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74 rameter to sqlit
369d0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 e3_result_error(
369e0 29 20 6f 72 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 ) or..** sqlite3
369f0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 _result_error16(
36a00 29 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 ) is non-negativ
36a10 65 20 74 68 65 6e 20 53 51 4c 69 74 65 20 74 61 e then SQLite ta
36a20 6b 65 73 20 74 68 61 74 20 6d 61 6e 79 0d 0a 2a kes that many..*
36a30 2a 20 62 79 74 65 73 20 28 6e 6f 74 20 63 68 61 * bytes (not cha
36a40 72 61 63 74 65 72 73 29 20 66 72 6f 6d 20 74 68 racters) from th
36a50 65 20 32 6e 64 20 70 61 72 61 6d 65 74 65 72 20 e 2nd parameter
36a60 61 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 as the error mes
36a70 73 61 67 65 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 sage...** ^The s
36a80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 qlite3_result_er
36a90 72 6f 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 ror() and sqlite
36aa0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 3_result_error16
36ab0 28 29 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 ()..** routines
36ac0 6d 61 6b 65 20 61 20 70 72 69 76 61 74 65 20 63 make a private c
36ad0 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 opy of the error
36ae0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 62 65 message text be
36af0 66 6f 72 65 0d 0a 2a 2a 20 74 68 65 79 20 72 65 fore..** they re
36b00 74 75 72 6e 2e 20 20 48 65 6e 63 65 2c 20 74 68 turn. Hence, th
36b10 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 e calling functi
36b20 6f 6e 20 63 61 6e 20 64 65 61 6c 6c 6f 63 61 74 on can deallocat
36b30 65 20 6f 72 0d 0a 2a 2a 20 6d 6f 64 69 66 79 20 e or..** modify
36b40 74 68 65 20 74 65 78 74 20 61 66 74 65 72 20 74 the text after t
36b50 68 65 79 20 72 65 74 75 72 6e 20 77 69 74 68 6f hey return witho
36b60 75 74 20 68 61 72 6d 2e 0d 0a 2a 2a 20 5e 54 68 ut harm...** ^Th
36b70 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 e sqlite3_result
36b80 5f 65 72 72 6f 72 5f 63 6f 64 65 28 29 20 66 75 _error_code() fu
36b90 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 74 nction changes t
36ba0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0d 0a 2a he error code..*
36bb0 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 51 * returned by SQ
36bc0 4c 69 74 65 20 61 73 20 61 20 72 65 73 75 6c 74 Lite as a result
36bd0 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 of an error in
36be0 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 5e 42 79 a function. ^By
36bf0 20 64 65 66 61 75 6c 74 2c 0d 0a 2a 2a 20 74 68 default,..** th
36c00 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 e error code is
36c10 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 5e SQLITE_ERROR. ^
36c20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c A subsequent cal
36c30 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 l to sqlite3_res
36c40 75 6c 74 5f 65 72 72 6f 72 28 29 0d 0a 2a 2a 20 ult_error()..**
36c50 6f 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c or sqlite3_resul
36c60 74 5f 65 72 72 6f 72 31 36 28 29 20 72 65 73 65 t_error16() rese
36c70 74 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 ts the error cod
36c80 65 20 74 6f 20 53 51 4c 49 54 45 5f 45 52 52 4f e to SQLITE_ERRO
36c90 52 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 R...**..** ^The
36ca0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 sqlite3_result_t
36cb0 6f 6f 62 69 67 28 29 20 69 6e 74 65 72 66 61 63 oobig() interfac
36cc0 65 20 63 61 75 73 65 73 20 53 51 4c 69 74 65 20 e causes SQLite
36cd0 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f to throw an erro
36ce0 72 0d 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 r..** indicating
36cf0 20 74 68 61 74 20 61 20 73 74 72 69 6e 67 20 6f that a string o
36d00 72 20 42 4c 4f 42 20 69 73 20 74 6f 6f 20 6c 6f r BLOB is too lo
36d10 6e 67 20 74 6f 20 72 65 70 72 65 73 65 6e 74 2e ng to represent.
36d20 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 ..**..** ^The sq
36d30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 6f 6d lite3_result_nom
36d40 65 6d 28 29 20 69 6e 74 65 72 66 61 63 65 20 63 em() interface c
36d50 61 75 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20 auses SQLite to
36d60 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 0d 0a throw an error..
36d70 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 ** indicating th
36d80 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f at a memory allo
36d90 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 0d 0a cation failed...
36da0 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 **..** ^The sqli
36db0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 29 te3_result_int()
36dc0 20 69 6e 74 65 72 66 61 63 65 20 73 65 74 73 20 interface sets
36dd0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
36de0 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 61 70 70 6c ..** of the appl
36df0 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 ication-defined
36e00 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 function to be t
36e10 68 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 he 32-bit signed
36e20 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 76 61 6c integer..** val
36e30 75 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 ue given in the
36e40 32 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2nd argument...*
36e50 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 72 * ^The sqlite3_r
36e60 65 73 75 6c 74 5f 69 6e 74 36 34 28 29 20 69 6e esult_int64() in
36e70 74 65 72 66 61 63 65 20 73 65 74 73 20 74 68 65 terface sets the
36e80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a return value..*
36e90 2a 20 6f 66 20 74 68 65 20 61 70 70 6c 69 63 61 * of the applica
36ea0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e tion-defined fun
36eb0 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 ction to be the
36ec0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 64-bit signed in
36ed0 74 65 67 65 72 0d 0a 2a 2a 20 76 61 6c 75 65 20 teger..** value
36ee0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 32 6e 64 given in the 2nd
36ef0 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a argument...**..
36f00 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
36f10 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 29 20 69 6e result_null() in
36f20 74 65 72 66 61 63 65 20 73 65 74 73 20 74 68 65 terface sets the
36f30 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a return value..*
36f40 2a 20 6f 66 20 74 68 65 20 61 70 70 6c 69 63 61 * of the applica
36f50 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e tion-defined fun
36f60 63 74 69 6f 6e 20 74 6f 20 62 65 20 4e 55 4c 4c ction to be NULL
36f70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 ...**..** ^The s
36f80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 qlite3_result_te
36f90 78 74 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 xt(), sqlite3_re
36fa0 73 75 6c 74 5f 74 65 78 74 31 36 28 29 2c 0d 0a sult_text16(),..
36fb0 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c ** sqlite3_resul
36fc0 74 5f 74 65 78 74 31 36 6c 65 28 29 2c 20 61 6e t_text16le(), an
36fd0 64 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 d sqlite3_result
36fe0 5f 74 65 78 74 31 36 62 65 28 29 20 69 6e 74 65 _text16be() inte
36ff0 72 66 61 63 65 73 0d 0a 2a 2a 20 73 65 74 20 74 rfaces..** set t
37000 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
37010 6f 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 of the applicati
37020 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 on-defined funct
37030 69 6f 6e 20 74 6f 20 62 65 0d 0a 2a 2a 20 61 20 ion to be..** a
37040 74 65 78 74 20 73 74 72 69 6e 67 20 77 68 69 63 text string whic
37050 68 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 h is represented
37060 20 61 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 as UTF-8, UTF-1
37070 36 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f 72 6 native byte or
37080 64 65 72 2c 0d 0a 2a 2a 20 55 54 46 2d 31 36 20 der,..** UTF-16
37090 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 2c 20 6f little endian, o
370a0 72 20 55 54 46 2d 31 36 20 62 69 67 20 65 6e 64 r UTF-16 big end
370b0 69 61 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c ian, respectivel
370c0 79 2e 0d 0a 2a 2a 20 5e 53 51 4c 69 74 65 20 74 y...** ^SQLite t
370d0 61 6b 65 73 20 74 68 65 20 74 65 78 74 20 72 65 akes the text re
370e0 73 75 6c 74 20 66 72 6f 6d 20 74 68 65 20 61 70 sult from the ap
370f0 70 6c 69 63 61 74 69 6f 6e 20 66 72 6f 6d 0d 0a plication from..
37100 2a 2a 20 74 68 65 20 32 6e 64 20 70 61 72 61 6d ** the 2nd param
37110 65 74 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 eter of the sqli
37120 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 2a te3_result_text*
37130 20 69 6e 74 65 72 66 61 63 65 73 2e 0d 0a 2a 2a interfaces...**
37140 20 5e 49 66 20 74 68 65 20 33 72 64 20 70 61 72 ^If the 3rd par
37150 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 73 71 ameter to the sq
37160 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 lite3_result_tex
37170 74 2a 20 69 6e 74 65 72 66 61 63 65 73 0d 0a 2a t* interfaces..*
37180 2a 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 * is negative, t
37190 68 65 6e 20 53 51 4c 69 74 65 20 74 61 6b 65 73 hen SQLite takes
371a0 20 72 65 73 75 6c 74 20 74 65 78 74 20 66 72 6f result text fro
371b0 6d 20 74 68 65 20 32 6e 64 20 70 61 72 61 6d 65 m the 2nd parame
371c0 74 65 72 0d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 ter..** through
371d0 74 68 65 20 66 69 72 73 74 20 7a 65 72 6f 20 63 the first zero c
371e0 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2a 20 5e 49 haracter...** ^I
371f0 66 20 74 68 65 20 33 72 64 20 70 61 72 61 6d 65 f the 3rd parame
37200 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ter to the sqlit
37210 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 2a 20 e3_result_text*
37220 69 6e 74 65 72 66 61 63 65 73 0d 0a 2a 2a 20 69 interfaces..** i
37230 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 s non-negative,
37240 74 68 65 6e 20 61 73 20 6d 61 6e 79 20 62 79 74 then as many byt
37250 65 73 20 28 6e 6f 74 20 63 68 61 72 61 63 74 65 es (not characte
37260 72 73 29 20 6f 66 20 74 68 65 20 74 65 78 74 0d rs) of the text.
37270 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 .** pointed to b
37280 79 20 74 68 65 20 32 6e 64 20 70 61 72 61 6d 65 y the 2nd parame
37290 74 65 72 20 61 72 65 20 74 61 6b 65 6e 20 61 73 ter are taken as
372a0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
372b0 2d 64 65 66 69 6e 65 64 0d 0a 2a 2a 20 66 75 6e -defined..** fun
372c0 63 74 69 6f 6e 20 72 65 73 75 6c 74 2e 20 20 49 ction result. I
372d0 66 20 74 68 65 20 33 72 64 20 70 61 72 61 6d 65 f the 3rd parame
372e0 74 65 72 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 ter is non-negat
372f0 69 76 65 2c 20 74 68 65 6e 20 69 74 0d 0a 2a 2a ive, then it..**
37300 20 6d 75 73 74 20 62 65 20 74 68 65 20 62 79 74 must be the byt
37310 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 e offset into th
37320 65 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 74 e string where t
37330 68 65 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f he NUL terminato
37340 72 20 77 6f 75 6c 64 0d 0a 2a 2a 20 61 70 70 65 r would..** appe
37350 61 72 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 ar if the string
37360 20 77 68 65 72 65 20 4e 55 4c 20 74 65 72 6d 69 where NUL termi
37370 6e 61 74 65 64 2e 20 20 49 66 20 61 6e 79 20 4e nated. If any N
37380 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 6f 63 UL characters oc
37390 63 75 72 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 73 cur..** in the s
373a0 74 72 69 6e 67 20 61 74 20 61 20 62 79 74 65 20 tring at a byte
373b0 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 6c offset that is l
373c0 65 73 73 20 74 68 61 6e 20 74 68 65 20 76 61 6c ess than the val
373d0 75 65 20 6f 66 20 74 68 65 20 33 72 64 0d 0a 2a ue of the 3rd..*
373e0 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 * parameter, the
373f0 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 n the resulting
37400 73 74 72 69 6e 67 20 77 69 6c 6c 20 63 6f 6e 74 string will cont
37410 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c ain embedded NUL
37420 73 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 72 65 s and the..** re
37430 73 75 6c 74 20 6f 66 20 65 78 70 72 65 73 73 69 sult of expressi
37440 6f 6e 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e ons operating on
37450 20 73 74 72 69 6e 67 73 20 77 69 74 68 20 65 6d strings with em
37460 62 65 64 64 65 64 20 4e 55 4c 73 20 69 73 20 75 bedded NULs is u
37470 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 20 5e 49 ndefined...** ^I
37480 66 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 f the 4th parame
37490 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ter to the sqlit
374a0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 2a 20 e3_result_text*
374b0 69 6e 74 65 72 66 61 63 65 73 0d 0a 2a 2a 20 6f interfaces..** o
374c0 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 r sqlite3_result
374d0 5f 62 6c 6f 62 20 69 73 20 61 20 6e 6f 6e 2d 4e _blob is a non-N
374e0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 ULL pointer, the
374f0 6e 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 n SQLite calls t
37500 68 61 74 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e hat..** function
37510 20 61 73 20 74 68 65 20 64 65 73 74 72 75 63 74 as the destruct
37520 6f 72 20 6f 6e 20 74 68 65 20 74 65 78 74 20 6f or on the text o
37530 72 20 42 4c 4f 42 20 72 65 73 75 6c 74 20 77 68 r BLOB result wh
37540 65 6e 20 69 74 20 68 61 73 0d 0a 2a 2a 20 66 69 en it has..** fi
37550 6e 69 73 68 65 64 20 75 73 69 6e 67 20 74 68 61 nished using tha
37560 74 20 72 65 73 75 6c 74 2e 0d 0a 2a 2a 20 5e 49 t result...** ^I
37570 66 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 f the 4th parame
37580 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ter to the sqlit
37590 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 2a 20 e3_result_text*
375a0 69 6e 74 65 72 66 61 63 65 73 20 6f 72 20 74 6f interfaces or to
375b0 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 ..** sqlite3_res
375c0 75 6c 74 5f 62 6c 6f 62 20 69 73 20 74 68 65 20 ult_blob is the
375d0 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 special constant
375e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 2c 20 SQLITE_STATIC,
375f0 74 68 65 6e 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 then SQLite..**
37600 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 assumes that the
37610 20 74 65 78 74 20 6f 72 20 42 4c 4f 42 20 72 65 text or BLOB re
37620 73 75 6c 74 20 69 73 20 69 6e 20 63 6f 6e 73 74 sult is in const
37630 61 6e 74 20 73 70 61 63 65 20 61 6e 64 20 64 6f ant space and do
37640 65 73 20 6e 6f 74 0d 0a 2a 2a 20 63 6f 70 79 20 es not..** copy
37650 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 the content of t
37660 68 65 20 70 61 72 61 6d 65 74 65 72 20 6e 6f 72 he parameter nor
37670 20 63 61 6c 6c 20 61 20 64 65 73 74 72 75 63 74 call a destruct
37680 6f 72 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e or on the conten
37690 74 0d 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 t..** when it ha
376a0 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 s finished using
376b0 20 74 68 61 74 20 72 65 73 75 6c 74 2e 0d 0a 2a that result...*
376c0 2a 20 5e 49 66 20 74 68 65 20 34 74 68 20 70 61 * ^If the 4th pa
376d0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 73 rameter to the s
376e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 qlite3_result_te
376f0 78 74 2a 20 69 6e 74 65 72 66 61 63 65 73 0d 0a xt* interfaces..
37700 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 72 65 ** or sqlite3_re
37710 73 75 6c 74 5f 62 6c 6f 62 20 69 73 20 74 68 65 sult_blob is the
37720 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e special constan
37730 74 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 t SQLITE_TRANSIE
37740 4e 54 0d 0a 2a 2a 20 74 68 65 6e 20 53 51 4c 69 NT..** then SQLi
37750 74 65 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 te makes a copy
37760 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e of the result in
37770 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 to space obtaine
37780 64 20 66 72 6f 6d 0d 0a 2a 2a 20 66 72 6f 6d 20 d from..** from
37790 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 [sqlite3_malloc(
377a0 29 5d 20 62 65 66 6f 72 65 20 69 74 20 72 65 74 )] before it ret
377b0 75 72 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 urns...**..** ^T
377c0 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c he sqlite3_resul
377d0 74 5f 76 61 6c 75 65 28 29 20 69 6e 74 65 72 66 t_value() interf
377e0 61 63 65 20 73 65 74 73 20 74 68 65 20 72 65 73 ace sets the res
377f0 75 6c 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 61 ult of..** the a
37800 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e pplication-defin
37810 65 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 ed function to b
37820 65 20 61 20 63 6f 70 79 20 74 68 65 0d 0a 2a 2a e a copy the..**
37830 20 5b 75 6e 70 72 6f 74 65 63 74 65 64 20 73 71 [unprotected sq
37840 6c 69 74 65 33 5f 76 61 6c 75 65 5d 20 6f 62 6a lite3_value] obj
37850 65 63 74 20 73 70 65 63 69 66 69 65 64 20 62 79 ect specified by
37860 20 74 68 65 20 32 6e 64 20 70 61 72 61 6d 65 74 the 2nd paramet
37870 65 72 2e 20 20 5e 54 68 65 0d 0a 2a 2a 20 73 71 er. ^The..** sq
37880 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c lite3_result_val
37890 75 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 6d ue() interface m
378a0 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
378b0 68 65 20 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 he [sqlite3_valu
378c0 65 5d 0d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 e]..** so that t
378d0 68 65 20 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 he [sqlite3_valu
378e0 65 5d 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 e] specified in
378f0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 6d 61 the parameter ma
37900 79 20 63 68 61 6e 67 65 20 6f 72 0d 0a 2a 2a 20 y change or..**
37910 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 be deallocated a
37920 66 74 65 72 20 73 71 6c 69 74 65 33 5f 72 65 73 fter sqlite3_res
37930 75 6c 74 5f 76 61 6c 75 65 28 29 20 72 65 74 75 ult_value() retu
37940 72 6e 73 20 77 69 74 68 6f 75 74 20 68 61 72 6d rns without harm
37950 2e 0d 0a 2a 2a 20 5e 41 20 5b 70 72 6f 74 65 63 ...** ^A [protec
37960 74 65 64 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 ted sqlite3_valu
37970 65 5d 20 6f 62 6a 65 63 74 20 6d 61 79 20 61 6c e] object may al
37980 77 61 79 73 20 62 65 20 75 73 65 64 20 77 68 65 ways be used whe
37990 72 65 20 61 6e 0d 0a 2a 2a 20 5b 75 6e 70 72 6f re an..** [unpro
379a0 74 65 63 74 65 64 20 73 71 6c 69 74 65 33 5f 76 tected sqlite3_v
379b0 61 6c 75 65 5d 20 6f 62 6a 65 63 74 20 69 73 20 alue] object is
379c0 72 65 71 75 69 72 65 64 2c 20 73 6f 20 65 69 74 required, so eit
379d0 68 65 72 0d 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 her..** kind of
379e0 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5d 20 [sqlite3_value]
379f0 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 75 73 object can be us
37a00 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 74 ed with this int
37a10 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 erface...**..**
37a20 49 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 If these routine
37a30 73 20 61 72 65 20 63 61 6c 6c 65 64 20 66 72 6f s are called fro
37a40 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 69 66 m within the dif
37a50 66 65 72 65 6e 74 20 74 68 72 65 61 64 0d 0a 2a ferent thread..*
37a60 2a 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 63 * than the one c
37a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 70 ontaining the ap
37a80 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 plication-define
37a90 64 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 d function that
37aa0 72 65 63 65 69 76 65 64 0d 0a 2a 2a 20 74 68 65 received..** the
37ab0 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 [sqlite3_contex
37ac0 74 5d 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 t] pointer, the
37ad0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 results are unde
37ae0 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 fined...*/..SQLI
37af0 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c 69 TE_API void sqli
37b00 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 te3_result_blob(
37b10 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a sqlite3_context*
37b20 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69 , const void*, i
37b30 6e 74 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 nt, void(*)(void
37b40 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 *));..SQLITE_API
37b50 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 72 65 void sqlite3_re
37b60 73 75 6c 74 5f 64 6f 75 62 6c 65 28 73 71 6c 69 sult_double(sqli
37b70 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 64 6f te3_context*, do
37b80 75 62 6c 65 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 uble);..SQLITE_A
37b90 50 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f PI void sqlite3_
37ba0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 73 71 6c result_error(sql
37bb0 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 63 ite3_context*, c
37bc0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 onst char*, int)
37bd0 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f ;..SQLITE_API vo
37be0 69 64 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c id sqlite3_resul
37bf0 74 5f 65 72 72 6f 72 31 36 28 73 71 6c 69 74 65 t_error16(sqlite
37c00 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 63 6f 6e 73 3_context*, cons
37c10 74 20 76 6f 69 64 2a 2c 20 69 6e 74 29 3b 0d 0a t void*, int);..
37c20 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 SQLITE_API void
37c30 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 sqlite3_result_e
37c40 72 72 6f 72 5f 74 6f 6f 62 69 67 28 73 71 6c 69 rror_toobig(sqli
37c50 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0d 0a te3_context*);..
37c60 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 SQLITE_API void
37c70 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 sqlite3_result_e
37c80 72 72 6f 72 5f 6e 6f 6d 65 6d 28 73 71 6c 69 74 rror_nomem(sqlit
37c90 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0d 0a 53 e3_context*);..S
37ca0 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 QLITE_API void s
37cb0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 qlite3_result_er
37cc0 72 6f 72 5f 63 6f 64 65 28 73 71 6c 69 74 65 33 ror_code(sqlite3
37cd0 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 29 3b _context*, int);
37ce0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 ..SQLITE_API voi
37cf0 64 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 d sqlite3_result
37d00 5f 69 6e 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e _int(sqlite3_con
37d10 74 65 78 74 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 text*, int);..SQ
37d20 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 LITE_API void sq
37d30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 lite3_result_int
37d40 36 34 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 64(sqlite3_conte
37d50 78 74 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 xt*, sqlite3_int
37d60 36 34 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 64);..SQLITE_API
37d70 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 72 65 void sqlite3_re
37d80 73 75 6c 74 5f 6e 75 6c 6c 28 73 71 6c 69 74 65 sult_null(sqlite
37d90 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0d 0a 53 51 3_context*);..SQ
37da0 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 LITE_API void sq
37db0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 lite3_result_tex
37dc0 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 t(sqlite3_contex
37dd0 74 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c t*, const char*,
37de0 20 69 6e 74 2c 20 76 6f 69 64 28 2a 29 28 76 6f int, void(*)(vo
37df0 69 64 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 id*));..SQLITE_A
37e00 50 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f PI void sqlite3_
37e10 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 73 71 result_text16(sq
37e20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 lite3_context*,
37e30 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69 6e 74 const void*, int
37e40 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 29 , void(*)(void*)
37e50 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 );..SQLITE_API v
37e60 6f 69 64 20 73 71 6c 69 74 65 33 5f 72 65 73 75 oid sqlite3_resu
37e70 6c 74 5f 74 65 78 74 31 36 6c 65 28 73 71 6c 69 lt_text16le(sqli
37e80 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 63 6f te3_context*, co
37e90 6e 73 74 20 76 6f 69 64 2a 2c 20 69 6e 74 2c 76 nst void*, int,v
37ea0 6f 69 64 28 2a 29 28 76 6f 69 64 2a 29 29 3b 0d oid(*)(void*));.
37eb0 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 .SQLITE_API void
37ec0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f sqlite3_result_
37ed0 74 65 78 74 31 36 62 65 28 73 71 6c 69 74 65 33 text16be(sqlite3
37ee0 5f 63 6f 6e 74 65 78 74 2a 2c 20 63 6f 6e 73 74 _context*, const
37ef0 20 76 6f 69 64 2a 2c 20 69 6e 74 2c 76 6f 69 64 void*, int,void
37f00 28 2a 29 28 76 6f 69 64 2a 29 29 3b 0d 0a 53 51 (*)(void*));..SQ
37f10 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 LITE_API void sq
37f20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c lite3_result_val
37f30 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 ue(sqlite3_conte
37f40 78 74 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c xt*, sqlite3_val
37f50 75 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 ue*);..SQLITE_AP
37f60 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 72 I void sqlite3_r
37f70 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 73 esult_zeroblob(s
37f80 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c qlite3_context*,
37f90 20 69 6e 74 20 6e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a int n);..../*..
37fa0 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 66 ** CAPI3REF: Def
37fb0 69 6e 65 20 4e 65 77 20 43 6f 6c 6c 61 74 69 6e ine New Collatin
37fc0 67 20 53 65 71 75 65 6e 63 65 73 0d 0a 2a 2a 0d g Sequences..**.
37fd0 0a 2a 2a 20 5e 54 68 65 73 65 20 66 75 6e 63 74 .** ^These funct
37fe0 69 6f 6e 73 20 61 64 64 2c 20 72 65 6d 6f 76 65 ions add, remove
37ff0 2c 20 6f 72 20 6d 6f 64 69 66 79 20 61 20 5b 63 , or modify a [c
38000 6f 6c 6c 61 74 69 6f 6e 5d 20 61 73 73 6f 63 69 ollation] associ
38010 61 74 65 64 0d 0a 2a 2a 20 77 69 74 68 20 74 68 ated..** with th
38020 65 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e e [database conn
38030 65 63 74 69 6f 6e 5d 20 73 70 65 63 69 66 69 65 ection] specifie
38040 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 d as the first a
38050 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a rgument...**..**
38060 20 5e 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 ^The name of th
38070 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 61 e collation is a
38080 20 55 54 46 2d 38 20 73 74 72 69 6e 67 0d 0a 2a UTF-8 string..*
38090 2a 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 63 72 * for sqlite3_cr
380a0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 eate_collation()
380b0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 63 72 65 and sqlite3_cre
380c0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 ate_collation_v2
380d0 28 29 0d 0a 2a 2a 20 61 6e 64 20 61 20 55 54 46 ()..** and a UTF
380e0 2d 31 36 20 73 74 72 69 6e 67 20 69 6e 20 6e 61 -16 string in na
380f0 74 69 76 65 20 62 79 74 65 20 6f 72 64 65 72 20 tive byte order
38100 66 6f 72 20 73 71 6c 69 74 65 33 5f 63 72 65 61 for sqlite3_crea
38110 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 29 te_collation16()
38120 2e 0d 0a 2a 2a 20 5e 43 6f 6c 6c 61 74 69 6f 6e ...** ^Collation
38130 20 6e 61 6d 65 73 20 74 68 61 74 20 63 6f 6d 70 names that comp
38140 61 72 65 20 65 71 75 61 6c 20 61 63 63 6f 72 64 are equal accord
38150 69 6e 67 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f ing to [sqlite3_
38160 73 74 72 6e 69 63 6d 70 28 29 5d 20 61 72 65 0d strnicmp()] are.
38170 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 .** considered t
38180 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 6e 61 o be the same na
38190 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 me...**..** ^(Th
381a0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 e third argument
381b0 20 28 65 54 65 78 74 52 65 70 29 20 6d 75 73 74 (eTextRep) must
381c0 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 be one of the c
381d0 6f 6e 73 74 61 6e 74 73 3a 0d 0a 2a 2a 20 3c 75 onstants:..** <u
381e0 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c l>..** <li> [SQL
381f0 49 54 45 5f 55 54 46 38 5d 2c 0d 0a 2a 2a 20 3c ITE_UTF8],..** <
38200 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 55 54 46 31 li> [SQLITE_UTF1
38210 36 4c 45 5d 2c 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 6LE],..** <li> [
38220 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2c SQLITE_UTF16BE],
38230 0d 0a 2a 2a 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 ..** <li> [SQLIT
38240 45 5f 55 54 46 31 36 5d 2c 20 6f 72 0d 0a 2a 2a E_UTF16], or..**
38250 20 3c 6c 69 3e 20 5b 53 51 4c 49 54 45 5f 55 54 <li> [SQLITE_UT
38260 46 31 36 5f 41 4c 49 47 4e 45 44 5d 2e 0d 0a 2a F16_ALIGNED]...*
38270 2a 20 3c 2f 75 6c 3e 29 5e 0d 0a 2a 2a 20 5e 54 * </ul>)^..** ^T
38280 68 65 20 65 54 65 78 74 52 65 70 20 61 72 67 75 he eTextRep argu
38290 6d 65 6e 74 20 64 65 74 65 72 6d 69 6e 65 73 20 ment determines
382a0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 the encoding of
382b0 73 74 72 69 6e 67 73 20 70 61 73 73 65 64 0d 0a strings passed..
382c0 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 ** to the collat
382d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c ing function cal
382e0 6c 62 61 63 6b 2c 20 78 43 61 6c 6c 62 61 63 6b lback, xCallback
382f0 2e 0d 0a 2a 2a 20 5e 54 68 65 20 5b 53 51 4c 49 ...** ^The [SQLI
38300 54 45 5f 55 54 46 31 36 5d 20 61 6e 64 20 5b 53 TE_UTF16] and [S
38310 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 QLITE_UTF16_ALIG
38320 4e 45 44 5d 20 76 61 6c 75 65 73 20 66 6f 72 20 NED] values for
38330 65 54 65 78 74 52 65 70 0d 0a 2a 2a 20 66 6f 72 eTextRep..** for
38340 63 65 20 73 74 72 69 6e 67 73 20 74 6f 20 62 65 ce strings to be
38350 20 55 54 46 31 36 20 77 69 74 68 20 6e 61 74 69 UTF16 with nati
38360 76 65 20 62 79 74 65 20 6f 72 64 65 72 2e 0d 0a ve byte order...
38370 2a 2a 20 5e 54 68 65 20 5b 53 51 4c 49 54 45 5f ** ^The [SQLITE_
38380 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 5d 20 76 UTF16_ALIGNED] v
38390 61 6c 75 65 20 66 6f 72 20 65 54 65 78 74 52 65 alue for eTextRe
383a0 70 20 66 6f 72 63 65 73 20 73 74 72 69 6e 67 73 p forces strings
383b0 20 74 6f 20 62 65 67 69 6e 0d 0a 2a 2a 20 6f 6e to begin..** on
383c0 20 61 6e 20 65 76 65 6e 20 62 79 74 65 20 61 64 an even byte ad
383d0 64 72 65 73 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e dress...**..** ^
383e0 54 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d The fourth argum
383f0 65 6e 74 2c 20 70 41 72 67 2c 20 69 73 20 61 6e ent, pArg, is an
38400 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 application dat
38410 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 69 a pointer that i
38420 73 20 70 61 73 73 65 64 0d 0a 2a 2a 20 74 68 72 s passed..** thr
38430 6f 75 67 68 20 61 73 20 74 68 65 20 66 69 72 73 ough as the firs
38440 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 t argument to th
38450 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 e collating func
38460 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 0d 0a tion callback...
38470 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 66 74 **..** ^The fift
38480 68 20 61 72 67 75 6d 65 6e 74 2c 20 78 43 61 6c h argument, xCal
38490 6c 62 61 63 6b 2c 20 69 73 20 61 20 70 6f 69 6e lback, is a poin
384a0 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 ter to the colla
384b0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a ting function...
384c0 2a 2a 20 5e 4d 75 6c 74 69 70 6c 65 20 63 6f 6c ** ^Multiple col
384d0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 lating functions
384e0 20 63 61 6e 20 62 65 20 72 65 67 69 73 74 65 72 can be register
384f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d ed using the sam
38500 65 20 6e 61 6d 65 20 62 75 74 0d 0a 2a 2a 20 77 e name but..** w
38510 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 65 54 ith different eT
38520 65 78 74 52 65 70 20 70 61 72 61 6d 65 74 65 72 extRep parameter
38530 73 20 61 6e 64 20 53 51 4c 69 74 65 20 77 69 6c s and SQLite wil
38540 6c 20 75 73 65 20 77 68 69 63 68 65 76 65 72 0d l use whichever.
38550 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 .** function req
38560 75 69 72 65 73 20 74 68 65 20 6c 65 61 73 74 20 uires the least
38570 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 74 amount of data t
38580 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a ransformation...
38590 2a 2a 20 5e 49 66 20 74 68 65 20 78 43 61 6c 6c ** ^If the xCall
385a0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 69 73 back argument is
385b0 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 63 NULL then the c
385c0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f ollating functio
385d0 6e 20 69 73 0d 0a 2a 2a 20 64 65 6c 65 74 65 64 n is..** deleted
385e0 2e 20 20 5e 57 68 65 6e 20 61 6c 6c 20 63 6f 6c . ^When all col
385f0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 lating functions
38600 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 having the same
38610 20 6e 61 6d 65 20 61 72 65 20 64 65 6c 65 74 65 name are delete
38620 64 2c 0d 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 6c d,..** that coll
38630 61 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 ation is no long
38640 65 72 20 75 73 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a er usable...**..
38650 2a 2a 20 5e 54 68 65 20 63 6f 6c 6c 61 74 69 6e ** ^The collatin
38660 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 g function callb
38670 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 ack is invoked w
38680 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 ith a copy of th
38690 65 20 70 41 72 67 20 0d 0a 2a 2a 20 61 70 70 6c e pArg ..** appl
386a0 69 63 61 74 69 6f 6e 20 64 61 74 61 20 70 6f 69 ication data poi
386b0 6e 74 65 72 20 61 6e 64 20 77 69 74 68 20 74 77 nter and with tw
386c0 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 o strings in the
386d0 20 65 6e 63 6f 64 69 6e 67 20 73 70 65 63 69 66 encoding specif
386e0 69 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 65 ied..** by the e
386f0 54 65 78 74 52 65 70 20 61 72 67 75 6d 65 6e 74 TextRep argument
38700 2e 20 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 . The collating
38710 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 72 function must r
38720 65 74 75 72 6e 20 61 6e 0d 0a 2a 2a 20 69 6e 74 eturn an..** int
38730 65 67 65 72 20 74 68 61 74 20 69 73 20 6e 65 67 eger that is neg
38740 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 ative, zero, or
38750 70 6f 73 69 74 69 76 65 0d 0a 2a 2a 20 69 66 20 positive..** if
38760 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 the first string
38770 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
38780 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 qual to, or grea
38790 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 ter than the sec
387a0 6f 6e 64 2c 0d 0a 2a 2a 20 72 65 73 70 65 63 74 ond,..** respect
387b0 69 76 65 6c 79 2e 20 20 41 20 63 6f 6c 6c 61 74 ively. A collat
387c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 ing function mus
387d0 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 t always return
387e0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0d the same answer.
387f0 0a 2a 2a 20 67 69 76 65 6e 20 74 68 65 20 73 61 .** given the sa
38800 6d 65 20 69 6e 70 75 74 73 2e 20 20 49 66 20 74 me inputs. If t
38810 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 6c 61 wo or more colla
38820 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 61 ting functions a
38830 72 65 20 72 65 67 69 73 74 65 72 65 64 0d 0a 2a re registered..*
38840 2a 20 74 6f 20 74 68 65 20 73 61 6d 65 20 63 6f * to the same co
38850 6c 6c 61 74 69 6f 6e 20 6e 61 6d 65 20 28 75 73 llation name (us
38860 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 65 54 ing different eT
38870 65 78 74 52 65 70 20 76 61 6c 75 65 73 29 20 74 extRep values) t
38880 68 65 6e 20 61 6c 6c 0d 0a 2a 2a 20 6d 75 73 74 hen all..** must
38890 20 67 69 76 65 20 61 6e 20 65 71 75 69 76 61 6c give an equival
388a0 65 6e 74 20 61 6e 73 77 65 72 20 77 68 65 6e 20 ent answer when
388b0 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 65 71 75 invoked with equ
388c0 69 76 61 6c 65 6e 74 20 73 74 72 69 6e 67 73 2e ivalent strings.
388d0 0d 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 ..** The collati
388e0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 ng function must
388f0 20 6f 62 65 79 20 74 68 65 20 66 6f 6c 6c 6f 77 obey the follow
38900 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 20 66 ing properties f
38910 6f 72 20 61 6c 6c 0d 0a 2a 2a 20 73 74 72 69 6e or all..** strin
38920 67 73 20 41 2c 20 42 2c 20 61 6e 64 20 43 3a 0d gs A, B, and C:.
38930 0a 2a 2a 0d 0a 2a 2a 20 3c 6f 6c 3e 0d 0a 2a 2a .**..** <ol>..**
38940 20 3c 6c 69 3e 20 49 66 20 41 3d 3d 42 20 74 68 <li> If A==B th
38950 65 6e 20 42 3d 3d 41 2e 0d 0a 2a 2a 20 3c 6c 69 en B==A...** <li
38960 3e 20 49 66 20 41 3d 3d 42 20 61 6e 64 20 42 3d > If A==B and B=
38970 3d 43 20 74 68 65 6e 20 41 3d 3d 43 2e 0d 0a 2a =C then A==C...*
38980 2a 20 3c 6c 69 3e 20 49 66 20 41 26 6c 74 3b 42 * <li> If A<B
38990 20 54 48 45 4e 20 42 26 67 74 3b 41 2e 0d 0a 2a THEN B>A...*
389a0 2a 20 3c 6c 69 3e 20 49 66 20 41 26 6c 74 3b 42 * <li> If A<B
389b0 20 61 6e 64 20 42 26 6c 74 3b 43 20 74 68 65 6e and B<C then
389c0 20 41 26 6c 74 3b 43 2e 0d 0a 2a 2a 20 3c 2f 6f A<C...** </o
389d0 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 l>..**..** If a
389e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 collating functi
389f0 6f 6e 20 66 61 69 6c 73 20 61 6e 79 20 6f 66 20 on fails any of
38a00 74 68 65 20 61 62 6f 76 65 20 63 6f 6e 73 74 72 the above constr
38a10 61 69 6e 74 73 20 61 6e 64 20 74 68 61 74 0d 0a aints and that..
38a20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e ** collating fun
38a30 63 74 69 6f 6e 20 69 73 20 20 72 65 67 69 73 74 ction is regist
38a40 65 72 65 64 20 61 6e 64 20 75 73 65 64 2c 20 74 ered and used, t
38a50 68 65 6e 20 74 68 65 20 62 65 68 61 76 69 6f 72 hen the behavior
38a60 20 6f 66 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 69 of SQLite..** i
38a70 73 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a s undefined...**
38a80 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 ..** ^The sqlite
38a90 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 3_create_collati
38aa0 6f 6e 5f 76 32 28 29 20 77 6f 72 6b 73 20 6c 69 on_v2() works li
38ab0 6b 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 ke sqlite3_creat
38ac0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 0d 0a 2a e_collation()..*
38ad0 2a 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 * with the addit
38ae0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 78 44 65 ion that the xDe
38af0 73 74 72 6f 79 20 63 61 6c 6c 62 61 63 6b 20 69 stroy callback i
38b00 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 70 41 72 s invoked on pAr
38b10 67 20 77 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 63 g when..** the c
38b20 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f ollating functio
38b30 6e 20 69 73 20 64 65 6c 65 74 65 64 2e 0d 0a 2a n is deleted...*
38b40 2a 20 5e 43 6f 6c 6c 61 74 69 6e 67 20 66 75 6e * ^Collating fun
38b50 63 74 69 6f 6e 73 20 61 72 65 20 64 65 6c 65 74 ctions are delet
38b60 65 64 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 ed when they are
38b70 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6c overridden by l
38b80 61 74 65 72 0d 0a 2a 2a 20 63 61 6c 6c 73 20 74 ater..** calls t
38b90 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 o the collation
38ba0 63 72 65 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f creation functio
38bb0 6e 73 20 6f 72 20 77 68 65 6e 20 74 68 65 0d 0a ns or when the..
38bc0 2a 2a 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e ** [database con
38bd0 6e 65 63 74 69 6f 6e 5d 20 69 73 20 63 6c 6f 73 nection] is clos
38be0 65 64 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 ed using [sqlite
38bf0 33 5f 63 6c 6f 73 65 28 29 5d 2e 0d 0a 2a 2a 0d 3_close()]...**.
38c00 0a 2a 2a 20 5e 54 68 65 20 78 44 65 73 74 72 6f .** ^The xDestro
38c10 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 3c 75 y callback is <u
38c20 3e 6e 6f 74 3c 2f 75 3e 20 63 61 6c 6c 65 64 20 >not</u> called
38c30 69 66 20 74 68 65 20 0d 0a 2a 2a 20 73 71 6c 69 if the ..** sqli
38c40 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 te3_create_colla
38c50 74 69 6f 6e 5f 76 32 28 29 20 66 75 6e 63 74 69 tion_v2() functi
38c60 6f 6e 20 66 61 69 6c 73 2e 20 20 41 70 70 6c 69 on fails. Appli
38c70 63 61 74 69 6f 6e 73 20 74 68 61 74 20 69 6e 76 cations that inv
38c80 6f 6b 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f oke..** sqlite3_
38c90 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e create_collation
38ca0 5f 76 32 28 29 20 77 69 74 68 20 61 20 6e 6f 6e _v2() with a non
38cb0 2d 4e 55 4c 4c 20 78 44 65 73 74 72 6f 79 20 61 -NULL xDestroy a
38cc0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 0d rgument should .
38cd0 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 72 65 .** check the re
38ce0 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 64 69 turn code and di
38cf0 73 70 6f 73 65 20 6f 66 20 74 68 65 20 61 70 70 spose of the app
38d00 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 20 70 6f lication data po
38d10 69 6e 74 65 72 0d 0a 2a 2a 20 74 68 65 6d 73 65 inter..** themse
38d20 6c 76 65 73 20 72 61 74 68 65 72 20 74 68 61 6e lves rather than
38d30 20 65 78 70 65 63 74 69 6e 67 20 53 51 4c 69 74 expecting SQLit
38d40 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 69 e to deal with i
38d50 74 20 66 6f 72 20 74 68 65 6d 2e 0d 0a 2a 2a 20 t for them...**
38d60 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e This is differen
38d70 74 20 66 72 6f 6d 20 65 76 65 72 79 20 6f 74 68 t from every oth
38d80 65 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 er SQLite interf
38d90 61 63 65 2e 20 20 54 68 65 20 69 6e 63 6f 6e 73 ace. The incons
38da0 69 73 74 65 6e 63 79 20 0d 0a 2a 2a 20 69 73 20 istency ..** is
38db0 75 6e 66 6f 72 74 75 6e 61 74 65 20 62 75 74 20 unfortunate but
38dc0 63 61 6e 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 cannot be change
38dd0 64 20 77 69 74 68 6f 75 74 20 62 72 65 61 6b 69 d without breaki
38de0 6e 67 20 62 61 63 6b 77 61 72 64 73 20 0d 0a 2a ng backwards ..*
38df0 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e * compatibility.
38e00 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 ..**..** See als
38e10 6f 3a 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c o: [sqlite3_col
38e20 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 29 5d lation_needed()]
38e30 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 63 6f and [sqlite3_co
38e40 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 llation_needed16
38e50 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ()]...*/..SQLITE
38e60 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
38e70 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f _create_collatio
38e80 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 2a 2c 20 n(.. sqlite3*,
38e90 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
38ea0 7a 4e 61 6d 65 2c 20 0d 0a 20 20 69 6e 74 20 65 zName, .. int e
38eb0 54 65 78 74 52 65 70 2c 20 0d 0a 20 20 76 6f 69 TextRep, .. voi
38ec0 64 20 2a 70 41 72 67 2c 0d 0a 20 20 69 6e 74 28 d *pArg,.. int(
38ed0 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a *xCompare)(void*
38ee0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a ,int,const void*
38ef0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a ,int,const void*
38f00 29 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 )..);..SQLITE_AP
38f10 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 I int sqlite3_cr
38f20 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 eate_collation_v
38f30 32 28 0d 0a 20 20 73 71 6c 69 74 65 33 2a 2c 20 2(.. sqlite3*,
38f40 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
38f50 7a 4e 61 6d 65 2c 20 0d 0a 20 20 69 6e 74 20 65 zName, .. int e
38f60 54 65 78 74 52 65 70 2c 20 0d 0a 20 20 76 6f 69 TextRep, .. voi
38f70 64 20 2a 70 41 72 67 2c 0d 0a 20 20 69 6e 74 28 d *pArg,.. int(
38f80 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a *xCompare)(void*
38f90 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a ,int,const void*
38fa0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a ,int,const void*
38fb0 29 2c 0d 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 ),.. void(*xDes
38fc0 74 72 6f 79 29 28 76 6f 69 64 2a 29 0d 0a 29 3b troy)(void*)..);
38fd0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
38fe0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f sqlite3_create_
38ff0 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0d 0a 20 20 collation16(..
39000 73 71 6c 69 74 65 33 2a 2c 20 0d 0a 20 20 63 6f sqlite3*, .. co
39010 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c nst void *zName,
39020 0d 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 .. int eTextRep
39030 2c 20 0d 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 , .. void *pArg
39040 2c 0d 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 ,.. int(*xCompa
39050 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f re)(void*,int,co
39060 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f nst void*,int,co
39070 6e 73 74 20 76 6f 69 64 2a 29 0d 0a 29 3b 0d 0a nst void*)..);..
39080 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
39090 46 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 4e 65 65 F: Collation Nee
390a0 64 65 64 20 43 61 6c 6c 62 61 63 6b 73 0d 0a 2a ded Callbacks..*
390b0 2a 0d 0a 2a 2a 20 5e 54 6f 20 61 76 6f 69 64 20 *..** ^To avoid
390c0 68 61 76 69 6e 67 20 74 6f 20 72 65 67 69 73 74 having to regist
390d0 65 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6f 6e er all collation
390e0 20 73 65 71 75 65 6e 63 65 73 20 62 65 66 6f 72 sequences befor
390f0 65 20 61 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a e a database..**
39100 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 61 20 can be used, a
39110 73 69 6e 67 6c 65 20 63 61 6c 6c 62 61 63 6b 20 single callback
39120 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 function may be
39130 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68 20 registered with
39140 74 68 65 0d 0a 2a 2a 20 5b 64 61 74 61 62 61 73 the..** [databas
39150 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 74 6f e connection] to
39160 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e be invoked when
39170 65 76 65 72 20 61 6e 20 75 6e 64 65 66 69 6e 65 ever an undefine
39180 64 20 63 6f 6c 6c 61 74 69 6f 6e 0d 0a 2a 2a 20 d collation..**
39190 73 65 71 75 65 6e 63 65 20 69 73 20 72 65 71 75 sequence is requ
391a0 69 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 ired...**..** ^I
391b0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 f the function i
391c0 73 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 s registered usi
391d0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 ng the sqlite3_c
391e0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 ollation_needed(
391f0 29 20 41 50 49 2c 0d 0a 2a 2a 20 74 68 65 6e 20 ) API,..** then
39200 69 74 20 69 73 20 70 61 73 73 65 64 20 74 68 65 it is passed the
39210 20 6e 61 6d 65 73 20 6f 66 20 75 6e 64 65 66 69 names of undefi
39220 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 ned collation se
39230 71 75 65 6e 63 65 73 20 61 73 20 73 74 72 69 6e quences as strin
39240 67 73 0d 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 69 gs..** encoded i
39250 6e 20 55 54 46 2d 38 2e 20 5e 49 66 20 73 71 6c n UTF-8. ^If sql
39260 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e ite3_collation_n
39270 65 65 64 65 64 31 36 28 29 20 69 73 20 75 73 65 eeded16() is use
39280 64 2c 0d 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 d,..** the names
39290 20 61 72 65 20 70 61 73 73 65 64 20 61 73 20 55 are passed as U
392a0 54 46 2d 31 36 20 69 6e 20 6d 61 63 68 69 6e 65 TF-16 in machine
392b0 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f 72 64 native byte ord
392c0 65 72 2e 0d 0a 2a 2a 20 5e 41 20 63 61 6c 6c 20 er...** ^A call
392d0 74 6f 20 65 69 74 68 65 72 20 66 75 6e 63 74 69 to either functi
392e0 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 on replaces the
392f0 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 existing collati
39300 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 on-needed callba
39310 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 57 68 ck...**..** ^(Wh
39320 65 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 en the callback
39330 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 20 is invoked, the
39340 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 first argument p
39350 61 73 73 65 64 20 69 73 20 61 20 63 6f 70 79 0d assed is a copy.
39360 0a 2a 2a 20 6f 66 20 74 68 65 20 73 65 63 6f 6e .** of the secon
39370 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 d argument to sq
39380 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f lite3_collation_
39390 6e 65 65 64 65 64 28 29 20 6f 72 0d 0a 2a 2a 20 needed() or..**
393a0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f sqlite3_collatio
393b0 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 20 20 54 n_needed16(). T
393c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 he second argume
393d0 6e 74 20 69 73 20 74 68 65 20 64 61 74 61 62 61 nt is the databa
393e0 73 65 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f se..** connectio
393f0 6e 2e 20 20 54 68 65 20 74 68 69 72 64 20 61 72 n. The third ar
39400 67 75 6d 65 6e 74 20 69 73 20 6f 6e 65 20 6f 66 gument is one of
39410 20 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2c 20 [SQLITE_UTF8],
39420 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d [SQLITE_UTF16BE]
39430 2c 0d 0a 2a 2a 20 6f 72 20 5b 53 51 4c 49 54 45 ,..** or [SQLITE
39440 5f 55 54 46 31 36 4c 45 5d 2c 20 69 6e 64 69 63 _UTF16LE], indic
39450 61 74 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 64 ating the most d
39460 65 73 69 72 61 62 6c 65 20 66 6f 72 6d 20 6f 66 esirable form of
39470 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0d 0a the collation..
39480 2a 2a 20 73 65 71 75 65 6e 63 65 20 66 75 6e 63 ** sequence func
39490 74 69 6f 6e 20 72 65 71 75 69 72 65 64 2e 20 20 tion required.
394a0 54 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d The fourth param
394b0 65 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 eter is the name
394c0 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 72 65 71 75 of the..** requ
394d0 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 ired collation s
394e0 65 71 75 65 6e 63 65 2e 29 5e 0d 0a 2a 2a 0d 0a equence.)^..**..
394f0 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 ** The callback
39500 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 function should
39510 72 65 67 69 73 74 65 72 20 74 68 65 20 64 65 73 register the des
39520 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 75 ired collation u
39530 73 69 6e 67 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 sing..** [sqlite
39540 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 3_create_collati
39550 6f 6e 28 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f on()], [sqlite3_
39560 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e create_collation
39570 31 36 28 29 5d 2c 20 6f 72 0d 0a 2a 2a 20 5b 73 16()], or..** [s
39580 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f qlite3_create_co
39590 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 5d 2e 0d 0a llation_v2()]...
395a0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
395b0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 nt sqlite3_colla
395c0 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0d 0a 20 20 tion_needed(..
395d0 73 71 6c 69 74 65 33 2a 2c 20 0d 0a 20 20 76 6f sqlite3*, .. vo
395e0 69 64 2a 2c 20 0d 0a 20 20 76 6f 69 64 28 2a 29 id*, .. void(*)
395f0 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c (void*,sqlite3*,
39600 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e int eTextRep,con
39610 73 74 20 63 68 61 72 2a 29 0d 0a 29 3b 0d 0a 53 st char*)..);..S
39620 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
39630 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f lite3_collation_
39640 6e 65 65 64 65 64 31 36 28 0d 0a 20 20 73 71 6c needed16(.. sql
39650 69 74 65 33 2a 2c 20 0d 0a 20 20 76 6f 69 64 2a ite3*, .. void*
39660 2c 0d 0a 20 20 76 6f 69 64 28 2a 29 28 76 6f 69 ,.. void(*)(voi
39670 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 d*,sqlite3*,int
39680 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 eTextRep,const v
39690 6f 69 64 2a 29 0d 0a 29 3b 0d 0a 0d 0a 23 69 66 oid*)..);....#if
396a0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 def SQLITE_HAS_C
396b0 4f 44 45 43 0d 0a 2f 2a 0d 0a 2a 2a 20 53 70 65 ODEC../*..** Spe
396c0 63 69 66 79 20 74 68 65 20 6b 65 79 20 66 6f 72 cify the key for
396d0 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 an encrypted da
396e0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f tabase. This ro
396f0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 0d utine should be.
39700 0a 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 .** called right
39710 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 5f 6f after sqlite3_o
39720 70 65 6e 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 pen()...**..** T
39730 68 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 he code to imple
39740 6d 65 6e 74 20 74 68 69 73 20 41 50 49 20 69 73 ment this API is
39750 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 not available i
39760 6e 20 74 68 65 20 70 75 62 6c 69 63 20 72 65 6c n the public rel
39770 65 61 73 65 0d 0a 2a 2a 20 6f 66 20 53 51 4c 69 ease..** of SQLi
39780 74 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f te...*/..SQLITE_
39790 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
397a0 6b 65 79 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 key(.. sqlite3
397b0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 *db,
397c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
397d0 73 65 20 74 6f 20 62 65 20 72 65 6b 65 79 65 64 se to be rekeyed
397e0 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 */.. const voi
397f0 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 d *pKey, int nKe
39800 79 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 y /* The key
39810 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..);..../*..*
39820 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6b 65 79 * Change the key
39830 20 6f 6e 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 on an open data
39840 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 63 75 base. If the cu
39850 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 rrent database i
39860 73 20 6e 6f 74 0d 0a 2a 2a 20 65 6e 63 72 79 70 s not..** encryp
39870 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ted, this routin
39880 65 20 77 69 6c 6c 20 65 6e 63 72 79 70 74 20 69 e will encrypt i
39890 74 2e 20 20 49 66 20 70 4e 65 77 3d 3d 30 20 6f t. If pNew==0 o
398a0 72 20 6e 4e 65 77 3d 3d 30 2c 20 74 68 65 0d 0a r nNew==0, the..
398b0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 64 ** database is d
398c0 65 63 72 79 70 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a ecrypted...**..*
398d0 2a 20 54 68 65 20 63 6f 64 65 20 74 6f 20 69 6d * The code to im
398e0 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 41 50 49 plement this API
398f0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c is not availabl
39900 65 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63 20 e in the public
39910 72 65 6c 65 61 73 65 0d 0a 2a 2a 20 6f 66 20 53 release..** of S
39920 51 4c 69 74 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 QLite...*/..SQLI
39930 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
39940 65 33 5f 72 65 6b 65 79 28 0d 0a 20 20 73 71 6c e3_rekey(.. sql
39950 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 ite3 *db,
39960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
39970 61 74 61 62 61 73 65 20 74 6f 20 62 65 20 72 65 atabase to be re
39980 6b 65 79 65 64 20 2a 2f 0d 0a 20 20 63 6f 6e 73 keyed */.. cons
39990 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e t void *pKey, in
399a0 74 20 6e 4b 65 79 20 20 20 20 20 2f 2a 20 54 68 t nKey /* Th
399b0 65 20 6e 65 77 20 6b 65 79 20 2a 2f 0d 0a 29 3b e new key */..);
399c0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 70 65 63 69 ..../*..** Speci
399d0 66 79 20 74 68 65 20 61 63 74 69 76 61 74 69 6f fy the activatio
399e0 6e 20 6b 65 79 20 66 6f 72 20 61 20 53 45 45 20 n key for a SEE
399f0 64 61 74 61 62 61 73 65 2e 20 20 55 6e 6c 65 73 database. Unles
39a00 73 20 0d 0a 2a 2a 20 61 63 74 69 76 61 74 65 64 s ..** activated
39a10 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 53 45 , none of the SE
39a20 45 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 E routines will
39a30 77 6f 72 6b 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 work...*/..SQLIT
39a40 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c 69 74 E_API void sqlit
39a50 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 e3_activate_see(
39a60 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
39a70 7a 50 61 73 73 50 68 72 61 73 65 20 20 20 20 20 zPassPhrase
39a80 20 20 20 2f 2a 20 41 63 74 69 76 61 74 69 6f 6e /* Activation
39a90 20 70 68 72 61 73 65 20 2a 2f 0d 0a 29 3b 0d 0a phrase */..);..
39aa0 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 64 65 66 #endif....#ifdef
39ab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 SQLITE_ENABLE_C
39ac0 45 52 4f 44 0d 0a 2f 2a 0d 0a 2a 2a 20 53 70 65 EROD../*..** Spe
39ad0 63 69 66 79 20 74 68 65 20 61 63 74 69 76 61 74 cify the activat
39ae0 69 6f 6e 20 6b 65 79 20 66 6f 72 20 61 20 43 45 ion key for a CE
39af0 52 4f 44 20 64 61 74 61 62 61 73 65 2e 20 20 55 ROD database. U
39b00 6e 6c 65 73 73 20 0d 0a 2a 2a 20 61 63 74 69 76 nless ..** activ
39b10 61 74 65 64 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 ated, none of th
39b20 65 20 43 45 52 4f 44 20 72 6f 75 74 69 6e 65 73 e CEROD routines
39b30 20 77 69 6c 6c 20 77 6f 72 6b 2e 0d 0a 2a 2f 0d will work...*/.
39b40 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 .SQLITE_API void
39b50 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 sqlite3_activat
39b60 65 5f 63 65 72 6f 64 28 0d 0a 20 20 63 6f 6e 73 e_cerod(.. cons
39b70 74 20 63 68 61 72 20 2a 7a 50 61 73 73 50 68 72 t char *zPassPhr
39b80 61 73 65 20 20 20 20 20 20 20 20 2f 2a 20 41 63 ase /* Ac
39b90 74 69 76 61 74 69 6f 6e 20 70 68 72 61 73 65 20 tivation phrase
39ba0 2a 2f 0d 0a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a */..);..#endif..
39bb0 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
39bc0 46 3a 20 53 75 73 70 65 6e 64 20 45 78 65 63 75 F: Suspend Execu
39bd0 74 69 6f 6e 20 46 6f 72 20 41 20 53 68 6f 72 74 tion For A Short
39be0 20 54 69 6d 65 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 Time..**..** Th
39bf0 65 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 e sqlite3_sleep(
39c00 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 75 73 65 ) function cause
39c10 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 s the current th
39c20 72 65 61 64 20 74 6f 20 73 75 73 70 65 6e 64 20 read to suspend
39c30 65 78 65 63 75 74 69 6f 6e 0d 0a 2a 2a 20 66 6f execution..** fo
39c40 72 20 61 74 20 6c 65 61 73 74 20 61 20 6e 75 6d r at least a num
39c50 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f ber of milliseco
39c60 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 69 6e nds specified in
39c70 20 69 74 73 20 70 61 72 61 6d 65 74 65 72 2e 0d its parameter..
39c80 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6f .**..** If the o
39c90 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
39ca0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 does not support
39cb0 20 73 6c 65 65 70 20 72 65 71 75 65 73 74 73 20 sleep requests
39cc0 77 69 74 68 0d 0a 2a 2a 20 6d 69 6c 6c 69 73 65 with..** millise
39cd0 63 6f 6e 64 20 74 69 6d 65 20 72 65 73 6f 6c 75 cond time resolu
39ce0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 tion, then the t
39cf0 69 6d 65 20 77 69 6c 6c 20 62 65 20 72 6f 75 6e ime will be roun
39d00 64 65 64 20 75 70 20 74 6f 0d 0a 2a 2a 20 74 68 ded up to..** th
39d10 65 20 6e 65 61 72 65 73 74 20 73 65 63 6f 6e 64 e nearest second
39d20 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 . The number of
39d30 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 6f 66 20 milliseconds of
39d40 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0d 0a sleep actually..
39d50 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f ** requested fro
39d60 6d 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 m the operating
39d70 73 79 73 74 65 6d 20 69 73 20 72 65 74 75 72 6e system is return
39d80 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 4c ed...**..** ^SQL
39d90 69 74 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 ite implements t
39da0 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 62 79 his interface by
39db0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 78 53 6c calling the xSl
39dc0 65 65 70 28 29 0d 0a 2a 2a 20 6d 65 74 68 6f 64 eep()..** method
39dd0 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 of the default
39de0 5b 73 71 6c 69 74 65 33 5f 76 66 73 5d 20 6f 62 [sqlite3_vfs] ob
39df0 6a 65 63 74 2e 20 20 49 66 20 74 68 65 20 78 53 ject. If the xS
39e00 6c 65 65 70 28 29 20 6d 65 74 68 6f 64 0d 0a 2a leep() method..*
39e10 2a 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 * of the default
39e20 20 56 46 53 20 69 73 20 6e 6f 74 20 69 6d 70 6c VFS is not impl
39e30 65 6d 65 6e 74 65 64 20 63 6f 72 72 65 63 74 6c emented correctl
39e40 79 2c 20 6f 72 20 6e 6f 74 20 69 6d 70 6c 65 6d y, or not implem
39e50 65 6e 74 65 64 20 61 74 0d 0a 2a 2a 20 61 6c 6c ented at..** all
39e60 2c 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 76 , then the behav
39e70 69 6f 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 ior of sqlite3_s
39e80 6c 65 65 70 28 29 20 6d 61 79 20 64 65 76 69 61 leep() may devia
39e90 74 65 20 66 72 6f 6d 20 74 68 65 20 64 65 73 63 te from the desc
39ea0 72 69 70 74 69 6f 6e 0d 0a 2a 2a 20 69 6e 20 74 ription..** in t
39eb0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 72 61 he previous para
39ec0 67 72 61 70 68 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c graphs...*/..SQL
39ed0 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
39ee0 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 29 3b 0d te3_sleep(int);.
39ef0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 .../*..** CAPI3R
39f00 45 46 3a 20 4e 61 6d 65 20 4f 66 20 54 68 65 20 EF: Name Of The
39f10 46 6f 6c 64 65 72 20 48 6f 6c 64 69 6e 67 20 54 Folder Holding T
39f20 65 6d 70 6f 72 61 72 79 20 46 69 6c 65 73 0d 0a emporary Files..
39f30 2a 2a 0d 0a 2a 2a 20 5e 28 49 66 20 74 68 69 73 **..** ^(If this
39f40 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 global variable
39f50 20 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e is made to poin
39f60 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 t to a string wh
39f70 69 63 68 20 69 73 0d 0a 2a 2a 20 74 68 65 20 6e ich is..** the n
39f80 61 6d 65 20 6f 66 20 61 20 66 6f 6c 64 65 72 20 ame of a folder
39f90 28 61 2e 6b 2e 61 2e 20 64 69 72 65 63 74 6f 72 (a.k.a. director
39fa0 79 29 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 6d y), then all tem
39fb0 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 2a 2a porary files..**
39fc0 20 63 72 65 61 74 65 64 20 62 79 20 53 51 4c 69 created by SQLi
39fd0 74 65 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 te when using a
39fe0 62 75 69 6c 74 2d 69 6e 20 5b 73 71 6c 69 74 65 built-in [sqlite
39ff0 33 5f 76 66 73 20 7c 20 56 46 53 5d 0d 0a 2a 2a 3_vfs | VFS]..**
3a000 20 77 69 6c 6c 20 62 65 20 70 6c 61 63 65 64 20 will be placed
3a010 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 in that director
3a020 79 2e 29 5e 20 20 5e 49 66 20 74 68 69 73 20 76 y.)^ ^If this v
3a030 61 72 69 61 62 6c 65 0d 0a 2a 2a 20 69 73 20 61 ariable..** is a
3a040 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 NULL pointer, t
3a050 68 65 6e 20 53 51 4c 69 74 65 20 70 65 72 66 6f hen SQLite perfo
3a060 72 6d 73 20 61 20 73 65 61 72 63 68 20 66 6f 72 rms a search for
3a070 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0d an appropriate.
3a080 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 .** temporary fi
3a090 6c 65 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 2a le directory...*
3a0a0 2a 0d 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 *..** It is not
3a0b0 73 61 66 65 20 74 6f 20 72 65 61 64 20 6f 72 20 safe to read or
3a0c0 6d 6f 64 69 66 79 20 74 68 69 73 20 76 61 72 69 modify this vari
3a0d0 61 62 6c 65 20 69 6e 20 6d 6f 72 65 20 74 68 61 able in more tha
3a0e0 6e 20 6f 6e 65 0d 0a 2a 2a 20 74 68 72 65 61 64 n one..** thread
3a0f0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 at a time. It
3a100 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 is not safe to r
3a110 65 61 64 20 6f 72 20 6d 6f 64 69 66 79 20 74 68 ead or modify th
3a120 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 2a 2a 20 is variable..**
3a130 69 66 20 61 20 5b 64 61 74 61 62 61 73 65 20 63 if a [database c
3a140 6f 6e 6e 65 63 74 69 6f 6e 5d 20 69 73 20 62 65 onnection] is be
3a150 69 6e 67 20 75 73 65 64 20 61 74 20 74 68 65 20 ing used at the
3a160 73 61 6d 65 20 74 69 6d 65 20 69 6e 20 61 20 73 same time in a s
3a170 65 70 61 72 61 74 65 0d 0a 2a 2a 20 74 68 72 65 eparate..** thre
3a180 61 64 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 69 6e ad...** It is in
3a190 74 65 6e 64 65 64 20 74 68 61 74 20 74 68 69 73 tended that this
3a1a0 20 76 61 72 69 61 62 6c 65 20 62 65 20 73 65 74 variable be set
3a1b0 20 6f 6e 63 65 0d 0a 2a 2a 20 61 73 20 70 61 72 once..** as par
3a1c0 74 20 6f 66 20 70 72 6f 63 65 73 73 20 69 6e 69 t of process ini
3a1d0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 tialization and
3a1e0 62 65 66 6f 72 65 20 61 6e 79 20 53 51 4c 69 74 before any SQLit
3a1f0 65 20 69 6e 74 65 72 66 61 63 65 0d 0a 2a 2a 20 e interface..**
3a200 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 routines have be
3a210 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 en called and th
3a220 61 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 at this variable
3a230 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 remain unchange
3a240 64 0d 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 d..** thereafter
3a250 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b ...**..** ^The [
3a260 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 temp_store_direc
3a270 74 6f 72 79 20 70 72 61 67 6d 61 5d 20 6d 61 79 tory pragma] may
3a280 20 6d 6f 64 69 66 79 20 74 68 69 73 20 76 61 72 modify this var
3a290 69 61 62 6c 65 20 61 6e 64 20 63 61 75 73 65 0d iable and cause.
3a2a0 0a 2a 2a 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 .** it to point
3a2b0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e to memory obtain
3a2c0 65 64 20 66 72 6f 6d 20 5b 73 71 6c 69 74 65 33 ed from [sqlite3
3a2d0 5f 6d 61 6c 6c 6f 63 5d 2e 20 20 5e 46 75 72 74 _malloc]. ^Furt
3a2e0 68 65 72 6d 6f 72 65 2c 0d 0a 2a 2a 20 74 68 65 hermore,..** the
3a2f0 20 5b 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 [temp_store_dir
3a300 65 63 74 6f 72 79 20 70 72 61 67 6d 61 5d 20 61 ectory pragma] a
3a310 6c 77 61 79 73 20 61 73 73 75 6d 65 73 20 74 68 lways assumes th
3a320 61 74 20 61 6e 79 20 73 74 72 69 6e 67 0d 0a 2a at any string..*
3a330 2a 20 74 68 61 74 20 74 68 69 73 20 76 61 72 69 * that this vari
3a340 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 69 able points to i
3a350 73 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 s held in memory
3a360 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 0d obtained from .
3a370 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 6d 61 6c .** [sqlite3_mal
3a380 6c 6f 63 5d 20 61 6e 64 20 74 68 65 20 70 72 61 loc] and the pra
3a390 67 6d 61 20 6d 61 79 20 61 74 74 65 6d 70 74 20 gma may attempt
3a3a0 74 6f 20 66 72 65 65 20 74 68 61 74 20 6d 65 6d to free that mem
3a3b0 6f 72 79 0d 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 ory..** using [s
3a3c0 71 6c 69 74 65 33 5f 66 72 65 65 5d 2e 0d 0a 2a qlite3_free]...*
3a3d0 2a 20 48 65 6e 63 65 2c 20 69 66 20 74 68 69 73 * Hence, if this
3a3e0 20 76 61 72 69 61 62 6c 65 20 69 73 20 6d 6f 64 variable is mod
3a3f0 69 66 69 65 64 20 64 69 72 65 63 74 6c 79 2c 20 ified directly,
3a400 65 69 74 68 65 72 20 69 74 20 73 68 6f 75 6c 64 either it should
3a410 20 62 65 0d 0a 2a 2a 20 6d 61 64 65 20 4e 55 4c be..** made NUL
3a420 4c 20 6f 72 20 6d 61 64 65 20 74 6f 20 70 6f 69 L or made to poi
3a430 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 nt to memory obt
3a440 61 69 6e 65 64 20 66 72 6f 6d 20 5b 73 71 6c 69 ained from [sqli
3a450 74 65 33 5f 6d 61 6c 6c 6f 63 5d 0d 0a 2a 2a 20 te3_malloc]..**
3a460 6f 72 20 65 6c 73 65 20 74 68 65 20 75 73 65 20 or else the use
3a470 6f 66 20 74 68 65 20 5b 74 65 6d 70 5f 73 74 6f of the [temp_sto
3a480 72 65 5f 64 69 72 65 63 74 6f 72 79 20 70 72 61 re_directory pra
3a490 67 6d 61 5d 20 73 68 6f 75 6c 64 20 62 65 20 61 gma] should be a
3a4a0 76 6f 69 64 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c voided...*/..SQL
3a4b0 49 54 45 5f 41 50 49 20 63 68 61 72 20 2a 73 71 ITE_API char *sq
3a4c0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 lite3_temp_direc
3a4d0 74 6f 72 79 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 tory;..../*..**
3a4e0 43 41 50 49 33 52 45 46 3a 20 54 65 73 74 20 46 CAPI3REF: Test F
3a4f0 6f 72 20 41 75 74 6f 2d 43 6f 6d 6d 69 74 20 4d or Auto-Commit M
3a500 6f 64 65 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 ode..** KEYWORDS
3a510 3a 20 7b 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f : {autocommit mo
3a520 64 65 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 de}..**..** ^The
3a530 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 sqlite3_get_aut
3a540 6f 63 6f 6d 6d 69 74 28 29 20 69 6e 74 65 72 66 ocommit() interf
3a550 61 63 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d ace returns non-
3a560 7a 65 72 6f 20 6f 72 0d 0a 2a 2a 20 7a 65 72 6f zero or..** zero
3a570 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 64 61 if the given da
3a580 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3a590 6e 20 69 73 20 6f 72 20 69 73 20 6e 6f 74 20 69 n is or is not i
3a5a0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 n autocommit mod
3a5b0 65 2c 0d 0a 2a 2a 20 72 65 73 70 65 63 74 69 76 e,..** respectiv
3a5c0 65 6c 79 2e 20 20 5e 41 75 74 6f 63 6f 6d 6d 69 ely. ^Autocommi
3a5d0 74 20 6d 6f 64 65 20 69 73 20 6f 6e 20 62 79 20 t mode is on by
3a5e0 64 65 66 61 75 6c 74 2e 0d 0a 2a 2a 20 5e 41 75 default...** ^Au
3a5f0 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 tocommit mode is
3a600 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 5b disabled by a [
3a610 42 45 47 49 4e 5d 20 73 74 61 74 65 6d 65 6e 74 BEGIN] statement
3a620 2e 0d 0a 2a 2a 20 5e 41 75 74 6f 63 6f 6d 6d 69 ...** ^Autocommi
3a630 74 20 6d 6f 64 65 20 69 73 20 72 65 2d 65 6e 61 t mode is re-ena
3a640 62 6c 65 64 20 62 79 20 61 20 5b 43 4f 4d 4d 49 bled by a [COMMI
3a650 54 5d 20 6f 72 20 5b 52 4f 4c 4c 42 41 43 4b 5d T] or [ROLLBACK]
3a660 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 63 65 72 ...**..** If cer
3a670 74 61 69 6e 20 6b 69 6e 64 73 20 6f 66 20 65 72 tain kinds of er
3a680 72 6f 72 73 20 6f 63 63 75 72 20 6f 6e 20 61 20 rors occur on a
3a690 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 69 6e statement within
3a6a0 20 61 20 6d 75 6c 74 69 2d 73 74 61 74 65 6d 65 a multi-stateme
3a6b0 6e 74 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 nt..** transacti
3a6c0 6f 6e 20 28 65 72 72 6f 72 73 20 69 6e 63 6c 75 on (errors inclu
3a6d0 64 69 6e 67 20 5b 53 51 4c 49 54 45 5f 46 55 4c ding [SQLITE_FUL
3a6e0 4c 5d 2c 20 5b 53 51 4c 49 54 45 5f 49 4f 45 52 L], [SQLITE_IOER
3a6f0 52 5d 2c 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f R],..** [SQLITE_
3a700 4e 4f 4d 45 4d 5d 2c 20 5b 53 51 4c 49 54 45 5f NOMEM], [SQLITE_
3a710 42 55 53 59 5d 2c 20 61 6e 64 20 5b 53 51 4c 49 BUSY], and [SQLI
3a720 54 45 5f 49 4e 54 45 52 52 55 50 54 5d 29 20 74 TE_INTERRUPT]) t
3a730 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 74 72 61 6e hen the..** tran
3a740 73 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 62 65 saction might be
3a750 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 75 74 rolled back aut
3a760 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 54 68 65 omatically. The
3a770 20 6f 6e 6c 79 20 77 61 79 20 74 6f 0d 0a 2a 2a only way to..**
3a780 20 66 69 6e 64 20 6f 75 74 20 77 68 65 74 68 65 find out whethe
3a790 72 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 r SQLite automat
3a7a0 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20 62 61 ically rolled ba
3a7b0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 ck the transacti
3a7c0 6f 6e 20 61 66 74 65 72 0d 0a 2a 2a 20 61 6e 20 on after..** an
3a7d0 65 72 72 6f 72 20 69 73 20 74 6f 20 75 73 65 20 error is to use
3a7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a this function...
3a7f0 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 6f 74 68 65 **..** If anothe
3a800 72 20 74 68 72 65 61 64 20 63 68 61 6e 67 65 73 r thread changes
3a810 20 74 68 65 20 61 75 74 6f 63 6f 6d 6d 69 74 20 the autocommit
3a820 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 64 61 status of the da
3a830 74 61 62 61 73 65 0d 0a 2a 2a 20 63 6f 6e 6e 65 tabase..** conne
3a840 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 ction while this
3a850 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e routine is runn
3a860 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 72 65 ing, then the re
3a870 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a 2a 20 69 turn value..** i
3a880 73 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f s undefined...*/
3a890 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
3a8a0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 sqlite3_get_aut
3a8b0 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 2a ocommit(sqlite3*
3a8c0 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 );..../*..** CAP
3a8d0 49 33 52 45 46 3a 20 46 69 6e 64 20 54 68 65 20 I3REF: Find The
3a8e0 44 61 74 61 62 61 73 65 20 48 61 6e 64 6c 65 20 Database Handle
3a8f0 4f 66 20 41 20 50 72 65 70 61 72 65 64 20 53 74 Of A Prepared St
3a900 61 74 65 6d 65 6e 74 0d 0a 2a 2a 0d 0a 2a 2a 20 atement..**..**
3a910 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 64 62 5f ^The sqlite3_db_
3a920 68 61 6e 64 6c 65 20 69 6e 74 65 72 66 61 63 65 handle interface
3a930 20 72 65 74 75 72 6e 73 20 74 68 65 20 5b 64 61 returns the [da
3a940 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3a950 6e 5d 20 68 61 6e 64 6c 65 0d 0a 2a 2a 20 74 6f n] handle..** to
3a960 20 77 68 69 63 68 20 61 20 5b 70 72 65 70 61 72 which a [prepar
3a970 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 62 65 ed statement] be
3a980 6c 6f 6e 67 73 2e 20 20 5e 54 68 65 20 5b 64 61 longs. ^The [da
3a990 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3a9a0 6e 5d 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 n]..** returned
3a9b0 62 79 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 by sqlite3_db_ha
3a9c0 6e 64 6c 65 20 69 73 20 74 68 65 20 73 61 6d 65 ndle is the same
3a9d0 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 [database conne
3a9e0 63 74 69 6f 6e 5d 0d 0a 2a 2a 20 74 68 61 74 20 ction]..** that
3a9f0 77 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 was the first ar
3aa00 67 75 6d 65 6e 74 0d 0a 2a 2a 20 74 6f 20 74 68 gument..** to th
3aa10 65 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 e [sqlite3_prepa
3aa20 72 65 5f 76 32 28 29 5d 20 63 61 6c 6c 20 28 6f re_v2()] call (o
3aa30 72 20 69 74 73 20 76 61 72 69 61 6e 74 73 29 20 r its variants)
3aa40 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f that was used to
3aa50 0d 0a 2a 2a 20 63 72 65 61 74 65 20 74 68 65 20 ..** create the
3aa60 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 statement in the
3aa70 20 66 69 72 73 74 20 70 6c 61 63 65 2e 0d 0a 2a first place...*
3aa80 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 /..SQLITE_API sq
3aa90 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 5f 64 lite3 *sqlite3_d
3aaa0 62 5f 68 61 6e 64 6c 65 28 73 71 6c 69 74 65 33 b_handle(sqlite3
3aab0 5f 73 74 6d 74 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a _stmt*);..../*..
3aac0 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 52 65 74 ** CAPI3REF: Ret
3aad0 75 72 6e 20 54 68 65 20 46 69 6c 65 6e 61 6d 65 urn The Filename
3aae0 20 46 6f 72 20 41 20 44 61 74 61 62 61 73 65 20 For A Database
3aaf0 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 0d 0a Connection..**..
3ab00 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f ** ^The sqlite3_
3ab10 64 62 5f 66 69 6c 65 6e 61 6d 65 28 44 2c 4e 29 db_filename(D,N)
3ab20 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 72 interface retur
3ab30 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ns a pointer to
3ab40 61 20 66 69 6c 65 6e 61 6d 65 0d 0a 2a 2a 20 61 a filename..** a
3ab50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 ssociated with d
3ab60 61 74 61 62 61 73 65 20 4e 20 6f 66 20 63 6f 6e atabase N of con
3ab70 6e 65 63 74 69 6f 6e 20 44 2e 20 20 5e 54 68 65 nection D. ^The
3ab80 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 main database f
3ab90 69 6c 65 0d 0a 2a 2a 20 68 61 73 20 74 68 65 20 ile..** has the
3aba0 6e 61 6d 65 20 22 6d 61 69 6e 22 2e 20 20 49 66 name "main". If
3abb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 74 74 there is no att
3abc0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 4e ached database N
3abd0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
3abe0 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ..** connection
3abf0 44 2c 20 6f 72 20 69 66 20 64 61 74 61 62 61 73 D, or if databas
3ac00 65 20 4e 20 69 73 20 61 20 74 65 6d 70 6f 72 61 e N is a tempora
3ac10 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 ry or in-memory
3ac20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0d 0a database, then..
3ac30 2a 2a 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 ** a NULL pointe
3ac40 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a r is returned...
3ac50 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 66 69 6c 65 **..** ^The file
3ac60 6e 61 6d 65 20 72 65 74 75 72 6e 65 64 20 62 79 name returned by
3ac70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
3ac80 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 s the output of
3ac90 74 68 65 0d 0a 2a 2a 20 78 46 75 6c 6c 50 61 74 the..** xFullPat
3aca0 68 6e 61 6d 65 20 6d 65 74 68 6f 64 20 6f 66 20 hname method of
3acb0 74 68 65 20 5b 56 46 53 5d 2e 20 20 5e 49 6e 20 the [VFS]. ^In
3acc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 other words, the
3acd0 20 66 69 6c 65 6e 61 6d 65 0d 0a 2a 2a 20 77 69 filename..** wi
3ace0 6c 6c 20 62 65 20 61 6e 20 61 62 73 6f 6c 75 74 ll be an absolut
3acf0 65 20 70 61 74 68 6e 61 6d 65 2c 20 65 76 65 6e e pathname, even
3ad00 20 69 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 if the filename
3ad10 20 75 73 65 64 0d 0a 2a 2a 20 74 6f 20 6f 70 65 used..** to ope
3ad20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f n the database o
3ad30 72 69 67 69 6e 61 6c 6c 79 20 77 61 73 20 61 20 riginally was a
3ad40 55 52 49 20 6f 72 20 72 65 6c 61 74 69 76 65 20 URI or relative
3ad50 70 61 74 68 6e 61 6d 65 2e 0d 0a 2a 2f 0d 0a 53 pathname...*/..S
3ad60 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 QLITE_API const
3ad70 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 char *sqlite3_db
3ad80 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 _filename(sqlite
3ad90 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 3 *db, const cha
3ada0 72 20 2a 7a 44 62 4e 61 6d 65 29 3b 0d 0a 0d 0a r *zDbName);....
3adb0 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
3adc0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 Find the next p
3add0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
3ade0 74 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 20 t..**..** ^This
3adf0 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 72 6e interface return
3ae00 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 s a pointer to t
3ae10 68 65 20 6e 65 78 74 20 5b 70 72 65 70 61 72 65 he next [prepare
3ae20 64 20 73 74 61 74 65 6d 65 6e 74 5d 20 61 66 74 d statement] aft
3ae30 65 72 0d 0a 2a 2a 20 70 53 74 6d 74 20 61 73 73 er..** pStmt ass
3ae40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
3ae50 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 [database conne
3ae60 63 74 69 6f 6e 5d 20 70 44 62 2e 20 20 5e 49 66 ction] pDb. ^If
3ae70 20 70 53 74 6d 74 20 69 73 20 4e 55 4c 4c 0d 0a pStmt is NULL..
3ae80 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 69 6e 74 ** then this int
3ae90 65 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 61 erface returns a
3aea0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
3aeb0 66 69 72 73 74 20 70 72 65 70 61 72 65 64 20 73 first prepared s
3aec0 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 61 73 73 tatement..** ass
3aed0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
3aee0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
3aef0 74 69 6f 6e 20 70 44 62 2e 20 20 5e 49 66 20 6e tion pDb. ^If n
3af00 6f 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 o prepared state
3af10 6d 65 6e 74 0d 0a 2a 2a 20 73 61 74 69 73 66 69 ment..** satisfi
3af20 65 73 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e es the condition
3af30 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e s of this routin
3af40 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 e, it returns NU
3af50 4c 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 LL...**..** The
3af60 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
3af70 74 69 6f 6e 5d 20 70 6f 69 6e 74 65 72 20 44 20 tion] pointer D
3af80 69 6e 20 61 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a in a call to..**
3af90 20 5b 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 [sqlite3_next_s
3afa0 74 6d 74 28 44 2c 53 29 5d 20 6d 75 73 74 20 72 tmt(D,S)] must r
3afb0 65 66 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 20 efer to an open
3afc0 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 6f 6e database..** con
3afd0 6e 65 63 74 69 6f 6e 20 61 6e 64 20 69 6e 20 70 nection and in p
3afe0 61 72 74 69 63 75 6c 61 72 20 6d 75 73 74 20 6e articular must n
3aff0 6f 74 20 62 65 20 61 20 4e 55 4c 4c 20 70 6f 69 ot be a NULL poi
3b000 6e 74 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 nter...*/..SQLIT
3b010 45 5f 41 50 49 20 73 71 6c 69 74 65 33 5f 73 74 E_API sqlite3_st
3b020 6d 74 20 2a 73 71 6c 69 74 65 33 5f 6e 65 78 74 mt *sqlite3_next
3b030 5f 73 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 70 _stmt(sqlite3 *p
3b040 44 62 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 Db, sqlite3_stmt
3b050 20 2a 70 53 74 6d 74 29 3b 0d 0a 0d 0a 2f 2a 0d *pStmt);..../*.
3b060 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f .** CAPI3REF: Co
3b070 6d 6d 69 74 20 41 6e 64 20 52 6f 6c 6c 62 61 63 mmit And Rollbac
3b080 6b 20 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 43 k Notification C
3b090 61 6c 6c 62 61 63 6b 73 0d 0a 2a 2a 0d 0a 2a 2a allbacks..**..**
3b0a0 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6f ^The sqlite3_co
3b0b0 6d 6d 69 74 5f 68 6f 6f 6b 28 29 20 69 6e 74 65 mmit_hook() inte
3b0c0 72 66 61 63 65 20 72 65 67 69 73 74 65 72 73 20 rface registers
3b0d0 61 20 63 61 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 66 a callback..** f
3b0e0 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e unction to be in
3b0f0 76 6f 6b 65 64 20 77 68 65 6e 65 76 65 72 20 61 voked whenever a
3b100 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 transaction is
3b110 5b 43 4f 4d 4d 49 54 20 7c 20 63 6f 6d 6d 69 74 [COMMIT | commit
3b120 74 65 64 5d 2e 0d 0a 2a 2a 20 5e 41 6e 79 20 63 ted]...** ^Any c
3b130 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20 61 allback set by a
3b140 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 previous call t
3b150 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 o sqlite3_commit
3b160 5f 68 6f 6f 6b 28 29 0d 0a 2a 2a 20 66 6f 72 20 _hook()..** for
3b170 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 the same databas
3b180 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 e connection is
3b190 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 2a 2a 20 overridden...**
3b1a0 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 72 6f 6c ^The sqlite3_rol
3b1b0 6c 62 61 63 6b 5f 68 6f 6f 6b 28 29 20 69 6e 74 lback_hook() int
3b1c0 65 72 66 61 63 65 20 72 65 67 69 73 74 65 72 73 erface registers
3b1d0 20 61 20 63 61 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 a callback..**
3b1e0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 function to be i
3b1f0 6e 76 6f 6b 65 64 20 77 68 65 6e 65 76 65 72 20 nvoked whenever
3b200 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 a transaction is
3b210 20 5b 52 4f 4c 4c 42 41 43 4b 20 7c 20 72 6f 6c [ROLLBACK | rol
3b220 6c 65 64 20 62 61 63 6b 5d 2e 0d 0a 2a 2a 20 5e led back]...** ^
3b230 41 6e 79 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 Any callback set
3b240 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63 by a previous c
3b250 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 all to sqlite3_r
3b260 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 29 0d 0a ollback_hook()..
3b270 2a 2a 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 ** for the same
3b280 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
3b290 69 6f 6e 20 69 73 20 6f 76 65 72 72 69 64 64 65 ion is overridde
3b2a0 6e 2e 0d 0a 2a 2a 20 5e 54 68 65 20 70 41 72 67 n...** ^The pArg
3b2b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73 argument is pas
3b2c0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 sed through to t
3b2d0 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0d 0a 2a 2a he callback...**
3b2e0 20 5e 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 ^If the callbac
3b2f0 6b 20 6f 6e 20 61 20 63 6f 6d 6d 69 74 20 68 6f k on a commit ho
3b300 6f 6b 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 ok function retu
3b310 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0d 0a 2a rns non-zero,..*
3b320 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 * then the commi
3b330 74 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 t is converted i
3b340 6e 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0d nto a rollback..
3b350 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c .**..** ^The sql
3b360 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b ite3_commit_hook
3b370 28 44 2c 43 2c 50 29 20 61 6e 64 20 73 71 6c 69 (D,C,P) and sqli
3b380 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f te3_rollback_hoo
3b390 6b 28 44 2c 43 2c 50 29 20 66 75 6e 63 74 69 6f k(D,C,P) functio
3b3a0 6e 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 ns..** return th
3b3b0 65 20 50 20 61 72 67 75 6d 65 6e 74 20 66 72 6f e P argument fro
3b3c0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 m the previous c
3b3d0 61 6c 6c 20 6f 66 20 74 68 65 20 73 61 6d 65 20 all of the same
3b3e0 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 6f 6e 20 function..** on
3b3f0 74 68 65 20 73 61 6d 65 20 5b 64 61 74 61 62 61 the same [databa
3b400 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 44 se connection] D
3b410 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 0d 0a 2a , or NULL for..*
3b420 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c * the first call
3b430 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69 for each functi
3b440 6f 6e 20 6f 6e 20 44 2e 0d 0a 2a 2a 0d 0a 2a 2a on on D...**..**
3b450 20 54 68 65 20 63 6f 6d 6d 69 74 20 61 6e 64 20 The commit and
3b460 72 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 63 61 rollback hook ca
3b470 6c 6c 62 61 63 6b 73 20 61 72 65 20 6e 6f 74 20 llbacks are not
3b480 72 65 65 6e 74 72 61 6e 74 2e 0d 0a 2a 2a 20 54 reentrant...** T
3b490 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 6d 70 6c he callback impl
3b4a0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 73 74 20 ementation must
3b4b0 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 not do anything
3b4c0 74 68 61 74 20 77 69 6c 6c 20 6d 6f 64 69 66 79 that will modify
3b4d0 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 ..** the databas
3b4e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 e connection tha
3b4f0 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 63 61 t invoked the ca
3b500 6c 6c 62 61 63 6b 2e 20 20 41 6e 79 20 61 63 74 llback. Any act
3b510 69 6f 6e 73 0d 0a 2a 2a 20 74 6f 20 6d 6f 64 69 ions..** to modi
3b520 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 fy the database
3b530 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 75 73 74 20 connection must
3b540 62 65 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 be deferred unti
3b550 6c 20 61 66 74 65 72 20 74 68 65 0d 0a 2a 2a 20 l after the..**
3b560 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 66 20 74 68 completion of th
3b570 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 28 e [sqlite3_step(
3b580 29 5d 20 63 61 6c 6c 20 74 68 61 74 20 74 72 69 )] call that tri
3b590 67 67 65 72 65 64 20 74 68 65 20 63 6f 6d 6d 69 ggered the commi
3b5a0 74 0d 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 62 61 63 t..** or rollbac
3b5b0 6b 20 68 6f 6f 6b 20 69 6e 20 74 68 65 20 66 69 k hook in the fi
3b5c0 72 73 74 20 70 6c 61 63 65 2e 0d 0a 2a 2a 20 4e rst place...** N
3b5d0 6f 74 65 20 74 68 61 74 20 72 75 6e 6e 69 6e 67 ote that running
3b5e0 20 61 6e 79 20 6f 74 68 65 72 20 53 51 4c 20 73 any other SQL s
3b5f0 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e 63 6c 75 tatements, inclu
3b600 64 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 ding SELECT stat
3b610 65 6d 65 6e 74 73 2c 0d 0a 2a 2a 20 6f 72 20 6d ements,..** or m
3b620 65 72 65 6c 79 20 63 61 6c 6c 69 6e 67 20 5b 73 erely calling [s
3b630 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 qlite3_prepare_v
3b640 32 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 2()] and [sqlite
3b650 33 5f 73 74 65 70 28 29 5d 20 77 69 6c 6c 20 6d 3_step()] will m
3b660 6f 64 69 66 79 0d 0a 2a 2a 20 74 68 65 20 64 61 odify..** the da
3b670 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3b680 6e 73 20 66 6f 72 20 74 68 65 20 6d 65 61 6e 69 ns for the meani
3b690 6e 67 20 6f 66 20 22 6d 6f 64 69 66 79 22 20 69 ng of "modify" i
3b6a0 6e 20 74 68 69 73 20 70 61 72 61 67 72 61 70 68 n this paragraph
3b6b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 52 65 67 69 73 ...**..** ^Regis
3b6c0 74 65 72 69 6e 67 20 61 20 4e 55 4c 4c 20 66 75 tering a NULL fu
3b6d0 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73 20 nction disables
3b6e0 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0d 0a 2a the callback...*
3b6f0 2a 0d 0a 2a 2a 20 5e 57 68 65 6e 20 74 68 65 20 *..** ^When the
3b700 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c commit hook call
3b710 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 72 65 74 back routine ret
3b720 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 20 5b urns zero, the [
3b730 43 4f 4d 4d 49 54 5d 0d 0a 2a 2a 20 6f 70 65 72 COMMIT]..** oper
3b740 61 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65 64 ation is allowed
3b750 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 to continue nor
3b760 6d 61 6c 6c 79 2e 20 20 5e 49 66 20 74 68 65 20 mally. ^If the
3b770 63 6f 6d 6d 69 74 20 68 6f 6f 6b 0d 0a 2a 2a 20 commit hook..**
3b780 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f returns non-zero
3b790 2c 20 74 68 65 6e 20 74 68 65 20 5b 43 4f 4d 4d , then the [COMM
3b7a0 49 54 5d 20 69 73 20 63 6f 6e 76 65 72 74 65 64 IT] is converted
3b7b0 20 69 6e 74 6f 20 61 20 5b 52 4f 4c 4c 42 41 43 into a [ROLLBAC
3b7c0 4b 5d 2e 0d 0a 2a 2a 20 5e 54 68 65 20 72 6f 6c K]...** ^The rol
3b7d0 6c 62 61 63 6b 20 68 6f 6f 6b 20 69 73 20 69 6e lback hook is in
3b7e0 76 6f 6b 65 64 20 6f 6e 20 61 20 72 6f 6c 6c 62 voked on a rollb
3b7f0 61 63 6b 20 74 68 61 74 20 72 65 73 75 6c 74 73 ack that results
3b800 20 66 72 6f 6d 20 61 20 63 6f 6d 6d 69 74 0d 0a from a commit..
3b810 2a 2a 20 68 6f 6f 6b 20 72 65 74 75 72 6e 69 6e ** hook returnin
3b820 67 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6a 75 73 74 g non-zero, just
3b830 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 as it would be
3b840 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 20 72 with any other r
3b850 6f 6c 6c 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a ollback...**..**
3b860 20 5e 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 ^For the purpos
3b870 65 73 20 6f 66 20 74 68 69 73 20 41 50 49 2c 20 es of this API,
3b880 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 a transaction is
3b890 20 73 61 69 64 20 74 6f 20 68 61 76 65 20 62 65 said to have be
3b8a0 65 6e 0d 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 en..** rolled ba
3b8b0 63 6b 20 69 66 20 61 6e 20 65 78 70 6c 69 63 69 ck if an explici
3b8c0 74 20 22 52 4f 4c 4c 42 41 43 4b 22 20 73 74 61 t "ROLLBACK" sta
3b8d0 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 tement is execut
3b8e0 65 64 2c 20 6f 72 0d 0a 2a 2a 20 61 6e 20 65 72 ed, or..** an er
3b8f0 72 6f 72 20 6f 72 20 63 6f 6e 73 74 72 61 69 6e ror or constrain
3b900 74 20 63 61 75 73 65 73 20 61 6e 20 69 6d 70 6c t causes an impl
3b910 69 63 69 74 20 72 6f 6c 6c 62 61 63 6b 20 74 6f icit rollback to
3b920 20 6f 63 63 75 72 2e 0d 0a 2a 2a 20 5e 54 68 65 occur...** ^The
3b930 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 rollback callba
3b940 63 6b 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 ck is not invoke
3b950 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 d if a transacti
3b960 6f 6e 20 69 73 0d 0a 2a 2a 20 61 75 74 6f 6d 61 on is..** automa
3b970 74 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20 62 tically rolled b
3b980 61 63 6b 20 62 65 63 61 75 73 65 20 74 68 65 20 ack because the
3b990 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
3b9a0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a ion is closed...
3b9b0 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 **..** See also
3b9c0 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 75 70 64 the [sqlite3_upd
3b9d0 61 74 65 5f 68 6f 6f 6b 28 29 5d 20 69 6e 74 65 ate_hook()] inte
3b9e0 72 66 61 63 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 rface...*/..SQLI
3b9f0 54 45 5f 41 50 49 20 76 6f 69 64 20 2a 73 71 6c TE_API void *sql
3ba00 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b ite3_commit_hook
3ba10 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 28 2a (sqlite3*, int(*
3ba20 29 28 76 6f 69 64 2a 29 2c 20 76 6f 69 64 2a 29 )(void*), void*)
3ba30 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f ;..SQLITE_API vo
3ba40 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c id *sqlite3_roll
3ba50 62 61 63 6b 5f 68 6f 6f 6b 28 73 71 6c 69 74 65 back_hook(sqlite
3ba60 33 2a 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 3*, void(*)(void
3ba70 20 2a 29 2c 20 76 6f 69 64 2a 29 3b 0d 0a 0d 0a *), void*);....
3ba80 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
3ba90 20 44 61 74 61 20 43 68 61 6e 67 65 20 4e 6f 74 Data Change Not
3baa0 69 66 69 63 61 74 69 6f 6e 20 43 61 6c 6c 62 61 ification Callba
3bab0 63 6b 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 cks..**..** ^The
3bac0 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f sqlite3_update_
3bad0 68 6f 6f 6b 28 29 20 69 6e 74 65 72 66 61 63 65 hook() interface
3bae0 20 72 65 67 69 73 74 65 72 73 20 61 20 63 61 6c registers a cal
3baf0 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 0d 0a lback function..
3bb00 2a 2a 20 77 69 74 68 20 74 68 65 20 5b 64 61 74 ** with the [dat
3bb10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
3bb20 5d 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 ] identified by
3bb30 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
3bb40 6e 74 0d 0a 2a 2a 20 74 6f 20 62 65 20 69 6e 76 nt..** to be inv
3bb50 6f 6b 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 oked whenever a
3bb60 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 20 row is updated,
3bb70 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 inserted or dele
3bb80 74 65 64 2e 0d 0a 2a 2a 20 5e 41 6e 79 20 63 61 ted...** ^Any ca
3bb90 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20 61 20 llback set by a
3bba0 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f previous call to
3bbb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a this function..
3bbc0 2a 2a 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 ** for the same
3bbd0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
3bbe0 69 6f 6e 20 69 73 20 6f 76 65 72 72 69 64 64 65 ion is overridde
3bbf0 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 n...**..** ^The
3bc00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
3bc10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
3bc20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 the function to
3bc30 69 6e 76 6f 6b 65 20 77 68 65 6e 20 61 0d 0a 2a invoke when a..*
3bc40 2a 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 * row is updated
3bc50 2c 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 , inserted or de
3bc60 6c 65 74 65 64 2e 0d 0a 2a 2a 20 5e 54 68 65 20 leted...** ^The
3bc70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 first argument t
3bc80 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 o the callback i
3bc90 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
3bca0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0d 0a third argument..
3bcb0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 75 70 ** to sqlite3_up
3bcc0 64 61 74 65 5f 68 6f 6f 6b 28 29 2e 0d 0a 2a 2a date_hook()...**
3bcd0 20 5e 54 68 65 20 73 65 63 6f 6e 64 20 63 61 6c ^The second cal
3bce0 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 69 lback argument i
3bcf0 73 20 6f 6e 65 20 6f 66 20 5b 53 51 4c 49 54 45 s one of [SQLITE
3bd00 5f 49 4e 53 45 52 54 5d 2c 20 5b 53 51 4c 49 54 _INSERT], [SQLIT
3bd10 45 5f 44 45 4c 45 54 45 5d 2c 0d 0a 2a 2a 20 6f E_DELETE],..** o
3bd20 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54 45 r [SQLITE_UPDATE
3bd30 5d 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 ], depending on
3bd40 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 the operation th
3bd50 61 74 20 63 61 75 73 65 64 20 74 68 65 20 63 61 at caused the ca
3bd60 6c 6c 62 61 63 6b 0d 0a 2a 2a 20 74 6f 20 62 65 llback..** to be
3bd70 20 69 6e 76 6f 6b 65 64 2e 0d 0a 2a 2a 20 5e 54 invoked...** ^T
3bd80 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 he third and fou
3bd90 72 74 68 20 61 72 67 75 6d 65 6e 74 73 20 74 6f rth arguments to
3bda0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f the callback co
3bdb0 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 ntain pointers t
3bdc0 6f 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 o the..** databa
3bdd0 73 65 20 61 6e 64 20 74 61 62 6c 65 20 6e 61 6d se and table nam
3bde0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 e containing the
3bdf0 20 61 66 66 65 63 74 65 64 20 72 6f 77 2e 0d 0a affected row...
3be00 2a 2a 20 5e 54 68 65 20 66 69 6e 61 6c 20 63 61 ** ^The final ca
3be10 6c 6c 62 61 63 6b 20 70 61 72 61 6d 65 74 65 72 llback parameter
3be20 20 69 73 20 74 68 65 20 5b 72 6f 77 69 64 5d 20 is the [rowid]
3be30 6f 66 20 74 68 65 20 72 6f 77 2e 0d 0a 2a 2a 20 of the row...**
3be40 5e 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 ^In the case of
3be50 61 6e 20 75 70 64 61 74 65 2c 20 74 68 69 73 20 an update, this
3be60 69 73 20 74 68 65 20 5b 72 6f 77 69 64 5d 20 61 is the [rowid] a
3be70 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65 20 fter the update
3be80 74 61 6b 65 73 20 70 6c 61 63 65 2e 0d 0a 2a 2a takes place...**
3be90 0d 0a 2a 2a 20 5e 28 54 68 65 20 75 70 64 61 74 ..** ^(The updat
3bea0 65 20 68 6f 6f 6b 20 69 73 20 6e 6f 74 20 69 6e e hook is not in
3beb0 76 6f 6b 65 64 20 77 68 65 6e 20 69 6e 74 65 72 voked when inter
3bec0 6e 61 6c 20 73 79 73 74 65 6d 20 74 61 62 6c 65 nal system table
3bed0 73 20 61 72 65 0d 0a 2a 2a 20 6d 6f 64 69 66 69 s are..** modifi
3bee0 65 64 20 28 69 2e 65 2e 20 73 71 6c 69 74 65 5f ed (i.e. sqlite_
3bef0 6d 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 master and sqlit
3bf00 65 5f 73 65 71 75 65 6e 63 65 29 2e 29 5e 0d 0a e_sequence).)^..
3bf10 2a 2a 0d 0a 2a 2a 20 5e 49 6e 20 74 68 65 20 63 **..** ^In the c
3bf20 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 urrent implement
3bf30 61 74 69 6f 6e 2c 20 74 68 65 20 75 70 64 61 74 ation, the updat
3bf40 65 20 68 6f 6f 6b 0d 0a 2a 2a 20 69 73 20 6e 6f e hook..** is no
3bf50 74 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 64 t invoked when d
3bf60 75 70 6c 69 63 61 74 69 6f 6e 20 72 6f 77 73 20 uplication rows
3bf70 61 72 65 20 64 65 6c 65 74 65 64 20 62 65 63 61 are deleted beca
3bf80 75 73 65 20 6f 66 20 61 6e 0d 0a 2a 2a 20 5b 4f use of an..** [O
3bf90 4e 20 43 4f 4e 46 4c 49 43 54 20 7c 20 4f 4e 20 N CONFLICT | ON
3bfa0 43 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41 43 45 CONFLICT REPLACE
3bfb0 5d 20 63 6c 61 75 73 65 2e 20 20 5e 4e 6f 72 20 ] clause. ^Nor
3bfc0 69 73 20 74 68 65 20 75 70 64 61 74 65 20 68 6f is the update ho
3bfd0 6f 6b 0d 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 ok..** invoked w
3bfe0 68 65 6e 20 72 6f 77 73 20 61 72 65 20 64 65 6c hen rows are del
3bff0 65 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 5b eted using the [
3c000 74 72 75 6e 63 61 74 65 20 6f 70 74 69 6d 69 7a truncate optimiz
3c010 61 74 69 6f 6e 5d 2e 0d 0a 2a 2a 20 54 68 65 20 ation]...** The
3c020 65 78 63 65 70 74 69 6f 6e 73 20 64 65 66 69 6e exceptions defin
3c030 65 64 20 69 6e 20 74 68 69 73 20 70 61 72 61 67 ed in this parag
3c040 72 61 70 68 20 6d 69 67 68 74 20 63 68 61 6e 67 raph might chang
3c050 65 20 69 6e 20 61 20 66 75 74 75 72 65 0d 0a 2a e in a future..*
3c060 2a 20 72 65 6c 65 61 73 65 20 6f 66 20 53 51 4c * release of SQL
3c070 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ite...**..** The
3c080 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 6d 70 update hook imp
3c090 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 73 74 lementation must
3c0a0 20 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 not do anything
3c0b0 20 74 68 61 74 20 77 69 6c 6c 20 6d 6f 64 69 66 that will modif
3c0c0 79 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 y..** the databa
3c0d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 se connection th
3c0e0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 75 at invoked the u
3c0f0 70 64 61 74 65 20 68 6f 6f 6b 2e 20 20 41 6e 79 pdate hook. Any
3c100 20 61 63 74 69 6f 6e 73 0d 0a 2a 2a 20 74 6f 20 actions..** to
3c110 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 modify the datab
3c120 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d ase connection m
3c130 75 73 74 20 62 65 20 64 65 66 65 72 72 65 64 20 ust be deferred
3c140 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 0d until after the.
3c150 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f .** completion o
3c160 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 f the [sqlite3_s
3c170 74 65 70 28 29 5d 20 63 61 6c 6c 20 74 68 61 74 tep()] call that
3c180 20 74 72 69 67 67 65 72 65 64 20 74 68 65 20 75 triggered the u
3c190 70 64 61 74 65 20 68 6f 6f 6b 2e 0d 0a 2a 2a 20 pdate hook...**
3c1a0 4e 6f 74 65 20 74 68 61 74 20 5b 73 71 6c 69 74 Note that [sqlit
3c1b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 5d e3_prepare_v2()]
3c1c0 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 73 74 and [sqlite3_st
3c1d0 65 70 28 29 5d 20 62 6f 74 68 20 6d 6f 64 69 66 ep()] both modif
3c1e0 79 20 74 68 65 69 72 0d 0a 2a 2a 20 64 61 74 61 y their..** data
3c1f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 base connections
3c200 20 66 6f 72 20 74 68 65 20 6d 65 61 6e 69 6e 67 for the meaning
3c210 20 6f 66 20 22 6d 6f 64 69 66 79 22 20 69 6e 20 of "modify" in
3c220 74 68 69 73 20 70 61 72 61 67 72 61 70 68 2e 0d this paragraph..
3c230 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c .**..** ^The sql
3c240 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b ite3_update_hook
3c250 28 44 2c 43 2c 50 29 20 66 75 6e 63 74 69 6f 6e (D,C,P) function
3c260 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 ..** returns the
3c270 20 50 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d P argument from
3c280 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 the previous ca
3c290 6c 6c 0d 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 ll..** on the sa
3c2a0 6d 65 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e me [database con
3c2b0 6e 65 63 74 69 6f 6e 5d 20 44 2c 20 6f 72 20 4e nection] D, or N
3c2c0 55 4c 4c 20 66 6f 72 0d 0a 2a 2a 20 74 68 65 20 ULL for..** the
3c2d0 66 69 72 73 74 20 63 61 6c 6c 20 6f 6e 20 44 2e first call on D.
3c2e0 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 ..**..** See als
3c2f0 6f 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 63 o the [sqlite3_c
3c300 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 29 5d 20 61 6e ommit_hook()] an
3c310 64 20 5b 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 d [sqlite3_rollb
3c320 61 63 6b 5f 68 6f 6f 6b 28 29 5d 0d 0a 2a 2a 20 ack_hook()]..**
3c330 69 6e 74 65 72 66 61 63 65 73 2e 0d 0a 2a 2f 0d interfaces...*/.
3c340 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 .SQLITE_API void
3c350 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 *sqlite3_update
3c360 5f 68 6f 6f 6b 28 0d 0a 20 20 73 71 6c 69 74 65 _hook(.. sqlite
3c370 33 2a 2c 20 0d 0a 20 20 76 6f 69 64 28 2a 29 28 3*, .. void(*)(
3c380 76 6f 69 64 20 2a 2c 69 6e 74 20 2c 63 68 61 72 void *,int ,char
3c390 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f const *,char co
3c3a0 6e 73 74 20 2a 2c 73 71 6c 69 74 65 33 5f 69 6e nst *,sqlite3_in
3c3b0 74 36 34 29 2c 0d 0a 20 20 76 6f 69 64 2a 0d 0a t64),.. void*..
3c3c0 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 );..../*..** CAP
3c3d0 49 33 52 45 46 3a 20 45 6e 61 62 6c 65 20 4f 72 I3REF: Enable Or
3c3e0 20 44 69 73 61 62 6c 65 20 53 68 61 72 65 64 20 Disable Shared
3c3f0 50 61 67 65 72 20 43 61 63 68 65 0d 0a 2a 2a 20 Pager Cache..**
3c400 4b 45 59 57 4f 52 44 53 3a 20 7b 73 68 61 72 65 KEYWORDS: {share
3c410 64 20 63 61 63 68 65 7d 0d 0a 2a 2a 0d 0a 2a 2a d cache}..**..**
3c420 20 5e 28 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ^(This routine
3c430 65 6e 61 62 6c 65 73 20 6f 72 20 64 69 73 61 62 enables or disab
3c440 6c 65 73 20 74 68 65 20 73 68 61 72 69 6e 67 20 les the sharing
3c450 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
3c460 63 61 63 68 65 0d 0a 2a 2a 20 61 6e 64 20 73 63 cache..** and sc
3c470 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 hema data struct
3c480 75 72 65 73 20 62 65 74 77 65 65 6e 20 5b 64 61 ures between [da
3c490 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3c4a0 6e 20 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d n | connections]
3c4b0 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d 65 ..** to the same
3c4c0 20 64 61 74 61 62 61 73 65 2e 20 53 68 61 72 69 database. Shari
3c4d0 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 69 66 ng is enabled if
3c4e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 the argument is
3c4f0 20 74 72 75 65 0d 0a 2a 2a 20 61 6e 64 20 64 69 true..** and di
3c500 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 61 72 sabled if the ar
3c510 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e gument is false.
3c520 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 43 61 63 68 )^..**..** ^Cach
3c530 65 20 73 68 61 72 69 6e 67 20 69 73 20 65 6e 61 e sharing is ena
3c540 62 6c 65 64 20 61 6e 64 20 64 69 73 61 62 6c 65 bled and disable
3c550 64 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 d for an entire
3c560 70 72 6f 63 65 73 73 2e 0d 0a 2a 2a 20 54 68 69 process...** Thi
3c570 73 20 69 73 20 61 20 63 68 61 6e 67 65 20 61 73 s is a change as
3c580 20 6f 66 20 53 51 4c 69 74 65 20 76 65 72 73 69 of SQLite versi
3c590 6f 6e 20 33 2e 35 2e 30 2e 20 49 6e 20 70 72 69 on 3.5.0. In pri
3c5a0 6f 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 or versions of S
3c5b0 51 4c 69 74 65 2c 0d 0a 2a 2a 20 73 68 61 72 69 QLite,..** shari
3c5c0 6e 67 20 77 61 73 20 65 6e 61 62 6c 65 64 20 6f ng was enabled o
3c5d0 72 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 65 r disabled for e
3c5e0 61 63 68 20 74 68 72 65 61 64 20 73 65 70 61 72 ach thread separ
3c5f0 61 74 65 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ately...**..** ^
3c600 28 54 68 65 20 63 61 63 68 65 20 73 68 61 72 69 (The cache shari
3c610 6e 67 20 6d 6f 64 65 20 73 65 74 20 62 79 20 74 ng mode set by t
3c620 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 65 66 his interface ef
3c630 66 65 63 74 73 20 61 6c 6c 20 73 75 62 73 65 71 fects all subseq
3c640 75 65 6e 74 0d 0a 2a 2a 20 63 61 6c 6c 73 20 74 uent..** calls t
3c650 6f 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 o [sqlite3_open(
3c660 29 5d 2c 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 )], [sqlite3_ope
3c670 6e 5f 76 32 28 29 5d 2c 20 61 6e 64 20 5b 73 71 n_v2()], and [sq
3c680 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 5d 2e lite3_open16()].
3c690 0d 0a 2a 2a 20 45 78 69 73 74 69 6e 67 20 64 61 ..** Existing da
3c6a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
3c6b0 6e 73 20 63 6f 6e 74 69 6e 75 65 20 75 73 65 20 ns continue use
3c6c0 74 68 65 20 73 68 61 72 69 6e 67 20 6d 6f 64 65 the sharing mode
3c6d0 0d 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 69 6e ..** that was in
3c6e0 20 65 66 66 65 63 74 20 61 74 20 74 68 65 20 74 effect at the t
3c6f0 69 6d 65 20 74 68 65 79 20 77 65 72 65 20 6f 70 ime they were op
3c700 65 6e 65 64 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 ened.)^..**..**
3c710 5e 28 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 ^(This routine r
3c720 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4f eturns [SQLITE_O
3c730 4b 5d 20 69 66 20 73 68 61 72 65 64 20 63 61 63 K] if shared cac
3c740 68 65 20 77 61 73 20 65 6e 61 62 6c 65 64 20 6f he was enabled o
3c750 72 20 64 69 73 61 62 6c 65 64 0d 0a 2a 2a 20 73 r disabled..** s
3c760 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 20 41 6e uccessfully. An
3c770 20 5b 65 72 72 6f 72 20 63 6f 64 65 5d 20 69 73 [error code] is
3c780 20 72 65 74 75 72 6e 65 64 20 6f 74 68 65 72 77 returned otherw
3c790 69 73 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ise.)^..**..** ^
3c7a0 53 68 61 72 65 64 20 63 61 63 68 65 20 69 73 20 Shared cache is
3c7b0 64 69 73 61 62 6c 65 64 20 62 79 20 64 65 66 61 disabled by defa
3c7c0 75 6c 74 2e 20 42 75 74 20 74 68 69 73 20 6d 69 ult. But this mi
3c7d0 67 68 74 20 63 68 61 6e 67 65 20 69 6e 0d 0a 2a ght change in..*
3c7e0 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 * future release
3c7f0 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 41 70 s of SQLite. Ap
3c800 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20 plications that
3c810 63 61 72 65 20 61 62 6f 75 74 20 73 68 61 72 65 care about share
3c820 64 0d 0a 2a 2a 20 63 61 63 68 65 20 73 65 74 74 d..** cache sett
3c830 69 6e 67 20 73 68 6f 75 6c 64 20 73 65 74 20 69 ing should set i
3c840 74 20 65 78 70 6c 69 63 69 74 6c 79 2e 0d 0a 2a t explicitly...*
3c850 2a 0d 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 *..** See Also:
3c860 20 5b 53 51 4c 69 74 65 20 53 68 61 72 65 64 2d [SQLite Shared-
3c870 43 61 63 68 65 20 4d 6f 64 65 5d 0d 0a 2a 2f 0d Cache Mode]..*/.
3c880 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
3c890 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 sqlite3_enable_s
3c8a0 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 29 hared_cache(int)
3c8b0 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
3c8c0 33 52 45 46 3a 20 41 74 74 65 6d 70 74 20 54 6f 3REF: Attempt To
3c8d0 20 46 72 65 65 20 48 65 61 70 20 4d 65 6d 6f 72 Free Heap Memor
3c8e0 79 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 y..**..** ^The s
3c8f0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d qlite3_release_m
3c900 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63 emory() interfac
3c910 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 72 e attempts to fr
3c920 65 65 20 4e 20 62 79 74 65 73 0d 0a 2a 2a 20 6f ee N bytes..** o
3c930 66 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 62 79 f heap memory by
3c940 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 6e 6f deallocating no
3c950 6e 2d 65 73 73 65 6e 74 69 61 6c 20 6d 65 6d 6f n-essential memo
3c960 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0d 0a ry allocations..
3c970 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 64 ** held by the d
3c980 61 74 61 62 61 73 65 20 6c 69 62 72 61 72 79 2e atabase library.
3c990 20 20 20 4d 65 6d 6f 72 79 20 75 73 65 64 20 74 Memory used t
3c9a0 6f 20 63 61 63 68 65 20 64 61 74 61 62 61 73 65 o cache database
3c9b0 0d 0a 2a 2a 20 70 61 67 65 73 20 74 6f 20 69 6d ..** pages to im
3c9c0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 prove performanc
3c9d0 65 20 69 73 20 61 6e 20 65 78 61 6d 70 6c 65 20 e is an example
3c9e0 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e 74 69 61 6c of non-essential
3c9f0 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a 20 5e 73 71 memory...** ^sq
3ca00 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 lite3_release_me
3ca10 6d 6f 72 79 28 29 20 72 65 74 75 72 6e 73 20 74 mory() returns t
3ca20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
3ca30 65 73 20 61 63 74 75 61 6c 6c 79 20 66 72 65 65 es actually free
3ca40 64 2c 0d 0a 2a 2a 20 77 68 69 63 68 20 6d 69 67 d,..** which mig
3ca50 68 74 20 62 65 20 6d 6f 72 65 20 6f 72 20 6c 65 ht be more or le
3ca60 73 73 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 ss than the amou
3ca70 6e 74 20 72 65 71 75 65 73 74 65 64 2e 0d 0a 2a nt requested...*
3ca80 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 72 * ^The sqlite3_r
3ca90 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 elease_memory()
3caa0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d routine is a no-
3cab0 6f 70 20 72 65 74 75 72 6e 69 6e 67 20 7a 65 72 op returning zer
3cac0 6f 0d 0a 2a 2a 20 69 66 20 53 51 4c 69 74 65 20 o..** if SQLite
3cad0 69 73 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 64 20 is not compiled
3cae0 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 45 4e 41 with [SQLITE_ENA
3caf0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 BLE_MEMORY_MANAG
3cb00 45 4d 45 4e 54 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 EMENT]...**..**
3cb10 53 65 65 20 61 6c 73 6f 3a 20 5b 73 71 6c 69 74 See also: [sqlit
3cb20 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 e3_db_release_me
3cb30 6d 6f 72 79 28 29 5d 0d 0a 2a 2f 0d 0a 53 51 4c mory()]..*/..SQL
3cb40 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
3cb50 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f te3_release_memo
3cb60 72 79 28 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a ry(int);..../*..
3cb70 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 46 72 65 ** CAPI3REF: Fre
3cb80 65 20 4d 65 6d 6f 72 79 20 55 73 65 64 20 42 79 e Memory Used By
3cb90 20 41 20 44 61 74 61 62 61 73 65 20 43 6f 6e 6e A Database Conn
3cba0 65 63 74 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ection..**..** ^
3cbb0 54 68 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 The sqlite3_db_r
3cbc0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 44 29 elease_memory(D)
3cbd0 20 69 6e 74 65 72 66 61 63 65 20 61 74 74 65 6d interface attem
3cbe0 70 74 73 20 74 6f 20 66 72 65 65 20 61 73 20 6d pts to free as m
3cbf0 75 63 68 20 68 65 61 70 0d 0a 2a 2a 20 6d 65 6d uch heap..** mem
3cc00 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 ory as possible
3cc10 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 63 6f from database co
3cc20 6e 6e 65 63 74 69 6f 6e 20 44 2e 20 55 6e 6c 69 nnection D. Unli
3cc30 6b 65 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 ke the..** [sqli
3cc40 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f te3_release_memo
3cc50 72 79 28 29 5d 20 69 6e 74 65 72 66 61 63 65 2c ry()] interface,
3cc60 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 this interface
3cc70 69 73 20 65 66 66 65 63 74 20 65 76 65 6e 0d 0a is effect even..
3cc80 2a 2a 20 77 68 65 6e 20 74 68 65 6e 20 5b 53 51 ** when then [SQ
3cc90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f LITE_ENABLE_MEMO
3cca0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 5d 20 63 RY_MANAGEMENT] c
3ccb0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 ompile-time opti
3ccc0 6f 6e 20 69 73 0d 0a 2a 2a 20 6f 6d 69 74 74 65 on is..** omitte
3ccd0 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 d...**..** See a
3cce0 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 33 5f 72 65 lso: [sqlite3_re
3ccf0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 5d 0d lease_memory()].
3cd00 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
3cd10 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 int sqlite3_db_r
3cd20 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 elease_memory(sq
3cd30 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a lite3*);..../*..
3cd40 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6d 70 ** CAPI3REF: Imp
3cd50 6f 73 65 20 41 20 4c 69 6d 69 74 20 4f 6e 20 48 ose A Limit On H
3cd60 65 61 70 20 53 69 7a 65 0d 0a 2a 2a 0d 0a 2a 2a eap Size..**..**
3cd70 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f ^The sqlite3_so
3cd80 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 ft_heap_limit64(
3cd90 29 20 69 6e 74 65 72 66 61 63 65 20 73 65 74 73 ) interface sets
3cda0 20 61 6e 64 2f 6f 72 20 71 75 65 72 69 65 73 20 and/or queries
3cdb0 74 68 65 0d 0a 2a 2a 20 73 6f 66 74 20 6c 69 6d the..** soft lim
3cdc0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 it on the amount
3cdd0 20 6f 66 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 of heap memory
3cde0 74 68 61 74 20 6d 61 79 20 62 65 20 61 6c 6c 6f that may be allo
3cdf0 63 61 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e cated by SQLite.
3ce00 0d 0a 2a 2a 20 5e 53 51 4c 69 74 65 20 73 74 72 ..** ^SQLite str
3ce10 69 76 65 73 20 74 6f 20 6b 65 65 70 20 68 65 61 ives to keep hea
3ce20 70 20 6d 65 6d 6f 72 79 20 75 74 69 6c 69 7a 61 p memory utiliza
3ce30 74 69 6f 6e 20 62 65 6c 6f 77 20 74 68 65 20 73 tion below the s
3ce40 6f 66 74 20 68 65 61 70 0d 0a 2a 2a 20 6c 69 6d oft heap..** lim
3ce50 69 74 20 62 79 20 72 65 64 75 63 69 6e 67 20 74 it by reducing t
3ce60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 he number of pag
3ce70 65 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 70 es held in the p
3ce80 61 67 65 20 63 61 63 68 65 0d 0a 2a 2a 20 61 73 age cache..** as
3ce90 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 75 73 61 heap memory usa
3cea0 67 65 73 20 61 70 70 72 6f 61 63 68 65 73 20 74 ges approaches t
3ceb0 68 65 20 6c 69 6d 69 74 2e 0d 0a 2a 2a 20 5e 54 he limit...** ^T
3cec0 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d he soft heap lim
3ced0 69 74 20 69 73 20 22 73 6f 66 74 22 20 62 65 63 it is "soft" bec
3cee0 61 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 ause even though
3cef0 20 53 51 4c 69 74 65 20 73 74 72 69 76 65 73 20 SQLite strives
3cf00 74 6f 20 73 74 61 79 0d 0a 2a 2a 20 62 65 6c 6f to stay..** belo
3cf10 77 20 74 68 65 20 6c 69 6d 69 74 2c 20 69 74 20 w the limit, it
3cf20 77 69 6c 6c 20 65 78 63 65 65 64 20 74 68 65 20 will exceed the
3cf30 6c 69 6d 69 74 20 72 61 74 68 65 72 20 74 68 61 limit rather tha
3cf40 6e 20 67 65 6e 65 72 61 74 65 0d 0a 2a 2a 20 61 n generate..** a
3cf50 6e 20 5b 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5d n [SQLITE_NOMEM]
3cf60 20 65 72 72 6f 72 2e 20 20 49 6e 20 6f 74 68 65 error. In othe
3cf70 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73 6f 66 r words, the sof
3cf80 74 20 68 65 61 70 20 6c 69 6d 69 74 20 0d 0a 2a t heap limit ..*
3cf90 2a 20 69 73 20 61 64 76 69 73 6f 72 79 20 6f 6e * is advisory on
3cfa0 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 ly...**..** ^The
3cfb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 return value fr
3cfc0 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f om sqlite3_soft_
3cfd0 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 heap_limit64() i
3cfe0 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0d 0a 2a s the size of..*
3cff0 2a 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 * the soft heap
3d000 6c 69 6d 69 74 20 70 72 69 6f 72 20 74 6f 20 74 limit prior to t
3d010 68 65 20 63 61 6c 6c 2c 20 6f 72 20 6e 65 67 61 he call, or nega
3d020 74 69 76 65 20 69 6e 20 74 68 65 20 63 61 73 65 tive in the case
3d030 20 6f 66 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f 72 of an..** error
3d040 2e 20 20 5e 49 66 20 74 68 65 20 61 72 67 75 6d . ^If the argum
3d050 65 6e 74 20 4e 20 69 73 20 6e 65 67 61 74 69 76 ent N is negativ
3d060 65 0d 0a 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 e..** then no ch
3d070 61 6e 67 65 20 69 73 20 6d 61 64 65 20 74 6f 20 ange is made to
3d080 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 the soft heap li
3d090 6d 69 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 mit. Hence, the
3d0a0 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 73 69 7a current..** siz
3d0b0 65 20 6f 66 20 74 68 65 20 73 6f 66 74 20 68 65 e of the soft he
3d0c0 61 70 20 6c 69 6d 69 74 20 63 61 6e 20 62 65 20 ap limit can be
3d0d0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e determined by in
3d0e0 76 6f 6b 69 6e 67 0d 0a 2a 2a 20 73 71 6c 69 74 voking..** sqlit
3d0f0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d e3_soft_heap_lim
3d100 69 74 36 34 28 29 20 77 69 74 68 20 61 20 6e 65 it64() with a ne
3d110 67 61 74 69 76 65 20 61 72 67 75 6d 65 6e 74 2e gative argument.
3d120 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 ..**..** ^If the
3d130 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 7a argument N is z
3d140 65 72 6f 20 74 68 65 6e 20 74 68 65 20 73 6f 66 ero then the sof
3d150 74 20 68 65 61 70 20 6c 69 6d 69 74 20 69 73 20 t heap limit is
3d160 64 69 73 61 62 6c 65 64 2e 0d 0a 2a 2a 0d 0a 2a disabled...**..*
3d170 2a 20 5e 28 54 68 65 20 73 6f 66 74 20 68 65 61 * ^(The soft hea
3d180 70 20 6c 69 6d 69 74 20 69 73 20 6e 6f 74 20 65 p limit is not e
3d190 6e 66 6f 72 63 65 64 20 69 6e 20 74 68 65 20 63 nforced in the c
3d1a0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 urrent implement
3d1b0 61 74 69 6f 6e 0d 0a 2a 2a 20 69 66 20 6f 6e 65 ation..** if one
3d1c0 20 6f 72 20 6d 6f 72 65 20 6f 66 20 66 6f 6c 6c or more of foll
3d1d0 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 73 owing conditions
3d1e0 20 61 72 65 20 74 72 75 65 3a 0d 0a 2a 2a 0d 0a are true:..**..
3d1f0 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e ** <ul>..** <li>
3d200 20 54 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c The soft heap l
3d210 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 7a imit is set to z
3d220 65 72 6f 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 4d 65 ero...** <li> Me
3d230 6d 6f 72 79 20 61 63 63 6f 75 6e 74 69 6e 67 20 mory accounting
3d240 69 73 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e is disabled usin
3d250 67 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 g a combination
3d260 6f 66 20 74 68 65 0d 0a 2a 2a 20 20 20 20 20 20 of the..**
3d270 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5d [sqlite3_config]
3d280 28 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f ([SQLITE_CONFIG_
3d290 4d 45 4d 53 54 41 54 55 53 5d 2c 2e 2e 2e 29 20 MEMSTATUS],...)
3d2a0 73 74 61 72 74 2d 74 69 6d 65 20 6f 70 74 69 6f start-time optio
3d2b0 6e 20 61 6e 64 0d 0a 2a 2a 20 20 20 20 20 20 74 n and..** t
3d2c0 68 65 20 5b 53 51 4c 49 54 45 5f 44 45 46 41 55 he [SQLITE_DEFAU
3d2d0 4c 54 5f 4d 45 4d 53 54 41 54 55 53 5d 20 63 6f LT_MEMSTATUS] co
3d2e0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f mpile-time optio
3d2f0 6e 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 41 6e 20 61 n...** <li> An a
3d300 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 lternative page
3d310 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 cache implementa
3d320 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65 tion is specifie
3d330 64 20 75 73 69 6e 67 0d 0a 2a 2a 20 20 20 20 20 d using..**
3d340 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 [sqlite3_config
3d350 5d 28 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ]([SQLITE_CONFIG
3d360 5f 50 43 41 43 48 45 32 5d 2c 2e 2e 2e 29 2e 0d _PCACHE2],...)..
3d370 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65 20 70 61 67 .** <li> The pag
3d380 65 20 63 61 63 68 65 20 61 6c 6c 6f 63 61 74 65 e cache allocate
3d390 73 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20 6d s from its own m
3d3a0 65 6d 6f 72 79 20 70 6f 6f 6c 20 73 75 70 70 6c emory pool suppl
3d3b0 69 65 64 0d 0a 2a 2a 20 20 20 20 20 20 62 79 20 ied..** by
3d3c0 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5d [sqlite3_config]
3d3d0 28 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f ([SQLITE_CONFIG_
3d3e0 50 41 47 45 43 41 43 48 45 5d 2c 2e 2e 2e 29 20 PAGECACHE],...)
3d3f0 72 61 74 68 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 rather than..**
3d400 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 68 65 from the he
3d410 61 70 2e 0d 0a 2a 2a 20 3c 2f 75 6c 3e 29 5e 0d ap...** </ul>)^.
3d420 0a 2a 2a 0d 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e .**..** Beginnin
3d430 67 20 77 69 74 68 20 53 51 4c 69 74 65 20 76 65 g with SQLite ve
3d440 72 73 69 6f 6e 20 33 2e 37 2e 33 2c 20 74 68 65 rsion 3.7.3, the
3d450 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 soft heap limit
3d460 20 69 73 20 65 6e 66 6f 72 63 65 64 0d 0a 2a 2a is enforced..**
3d470 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 regardless of w
3d480 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 hether or not th
3d490 65 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 e [SQLITE_ENABLE
3d4a0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 _MEMORY_MANAGEME
3d4b0 4e 54 5d 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d NT]..** compile-
3d4c0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 69 time option is i
3d4d0 6e 76 6f 6b 65 64 2e 20 20 57 69 74 68 20 5b 53 nvoked. With [S
3d4e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d QLITE_ENABLE_MEM
3d4f0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 5d 2c ORY_MANAGEMENT],
3d500 0d 0a 2a 2a 20 74 68 65 20 73 6f 66 74 20 68 65 ..** the soft he
3d510 61 70 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f ap limit is enfo
3d520 72 63 65 64 20 6f 6e 20 65 76 65 72 79 20 6d 65 rced on every me
3d530 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e mory allocation.
3d540 20 20 57 69 74 68 6f 75 74 0d 0a 2a 2a 20 5b 53 Without..** [S
3d550 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d QLITE_ENABLE_MEM
3d560 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 5d 2c ORY_MANAGEMENT],
3d570 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c the soft heap l
3d580 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 65 6e 66 imit is only enf
3d590 6f 72 63 65 64 0d 0a 2a 2a 20 77 68 65 6e 20 6d orced..** when m
3d5a0 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 emory is allocat
3d5b0 65 64 20 62 79 20 74 68 65 20 70 61 67 65 20 63 ed by the page c
3d5c0 61 63 68 65 2e 20 20 54 65 73 74 69 6e 67 20 73 ache. Testing s
3d5d0 75 67 67 65 73 74 73 20 74 68 61 74 20 62 65 63 uggests that bec
3d5e0 61 75 73 65 0d 0a 2a 2a 20 74 68 65 20 70 61 67 ause..** the pag
3d5f0 65 20 63 61 63 68 65 20 69 73 20 74 68 65 20 70 e cache is the p
3d600 72 65 64 6f 6d 69 6e 61 74 65 20 6d 65 6d 6f 72 redominate memor
3d610 79 20 75 73 65 72 20 69 6e 20 53 51 4c 69 74 65 y user in SQLite
3d620 2c 20 6d 6f 73 74 0d 0a 2a 2a 20 61 70 70 6c 69 , most..** appli
3d630 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 61 63 68 cations will ach
3d640 69 65 76 65 20 61 64 65 71 75 61 74 65 20 73 6f ieve adequate so
3d650 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 65 6e ft heap limit en
3d660 66 6f 72 63 65 6d 65 6e 74 20 77 69 74 68 6f 75 forcement withou
3d670 74 0d 0a 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 t..** the use of
3d680 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f [SQLITE_ENABLE_
3d690 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e MEMORY_MANAGEMEN
3d6a0 54 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 T]...**..** The
3d6b0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 75 6e circumstances un
3d6c0 64 65 72 20 77 68 69 63 68 20 53 51 4c 69 74 65 der which SQLite
3d6d0 20 77 69 6c 6c 20 65 6e 66 6f 72 63 65 20 74 68 will enforce th
3d6e0 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 e soft heap limi
3d6f0 74 20 6d 61 79 0d 0a 2a 2a 20 63 68 61 6e 67 65 t may..** change
3d700 73 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 s in future rele
3d710 61 73 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0d ases of SQLite..
3d720 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
3d730 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 sqlite3_int64 sq
3d740 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f lite3_soft_heap_
3d750 6c 69 6d 69 74 36 34 28 73 71 6c 69 74 65 33 5f limit64(sqlite3_
3d760 69 6e 74 36 34 20 4e 29 3b 0d 0a 0d 0a 2f 2a 0d int64 N);..../*.
3d770 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 .** CAPI3REF: De
3d780 70 72 65 63 61 74 65 64 20 53 6f 66 74 20 48 65 precated Soft He
3d790 61 70 20 4c 69 6d 69 74 20 49 6e 74 65 72 66 61 ap Limit Interfa
3d7a0 63 65 0d 0a 2a 2a 20 44 45 50 52 45 43 41 54 45 ce..** DEPRECATE
3d7b0 44 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 D..**..** This i
3d7c0 73 20 61 20 64 65 70 72 65 63 61 74 65 64 20 76 s a deprecated v
3d7d0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 5b 73 ersion of the [s
3d7e0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 qlite3_soft_heap
3d7f0 5f 6c 69 6d 69 74 36 34 28 29 5d 0d 0a 2a 2a 20 _limit64()]..**
3d800 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69 73 interface. This
3d810 20 72 6f 75 74 69 6e 65 20 69 73 20 70 72 6f 76 routine is prov
3d820 69 64 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 ided for histori
3d830 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 cal compatibilit
3d840 79 0d 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 41 6c 6c y..** only. All
3d850 20 6e 65 77 20 61 70 70 6c 69 63 61 74 69 6f 6e new application
3d860 73 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 s should use the
3d870 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 73 6f ..** [sqlite3_so
3d880 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 ft_heap_limit64(
3d890 29 5d 20 69 6e 74 65 72 66 61 63 65 20 72 61 74 )] interface rat
3d8a0 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e her than this on
3d8b0 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 e...*/..SQLITE_A
3d8c0 50 49 20 53 51 4c 49 54 45 5f 44 45 50 52 45 43 PI SQLITE_DEPREC
3d8d0 41 54 45 44 20 76 6f 69 64 20 73 71 6c 69 74 65 ATED void sqlite
3d8e0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 3_soft_heap_limi
3d8f0 74 28 69 6e 74 20 4e 29 3b 0d 0a 0d 0a 0d 0a 2f t(int N);....../
3d900 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
3d910 45 78 74 72 61 63 74 20 4d 65 74 61 64 61 74 61 Extract Metadata
3d920 20 41 62 6f 75 74 20 41 20 43 6f 6c 75 6d 6e 20 About A Column
3d930 4f 66 20 41 20 54 61 62 6c 65 0d 0a 2a 2a 0d 0a Of A Table..**..
3d940 2a 2a 20 5e 54 68 69 73 20 72 6f 75 74 69 6e 65 ** ^This routine
3d950 20 72 65 74 75 72 6e 73 20 6d 65 74 61 64 61 74 returns metadat
3d960 61 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 a about a specif
3d970 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 73 ic column of a s
3d980 70 65 63 69 66 69 63 0d 0a 2a 2a 20 64 61 74 61 pecific..** data
3d990 62 61 73 65 20 74 61 62 6c 65 20 61 63 63 65 73 base table acces
3d9a0 73 69 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 sible using the
3d9b0 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 [database connec
3d9c0 74 69 6f 6e 5d 20 68 61 6e 64 6c 65 0d 0a 2a 2a tion] handle..**
3d9d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
3d9e0 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 61 72 irst function ar
3d9f0 67 75 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 gument...**..**
3da00 5e 54 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 ^The column is i
3da10 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 dentified by the
3da20 20 73 65 63 6f 6e 64 2c 20 74 68 69 72 64 20 61 second, third a
3da30 6e 64 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65 nd fourth parame
3da40 74 65 72 73 20 74 6f 0d 0a 2a 2a 20 74 68 69 73 ters to..** this
3da50 20 66 75 6e 63 74 69 6f 6e 2e 20 5e 54 68 65 20 function. ^The
3da60 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 second parameter
3da70 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 6e is either the n
3da80 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 ame of the datab
3da90 61 73 65 0d 0a 2a 2a 20 28 69 2e 65 2e 20 22 6d ase..** (i.e. "m
3daa0 61 69 6e 22 2c 20 22 74 65 6d 70 22 2c 20 6f 72 ain", "temp", or
3dab0 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 an attached dat
3dac0 61 62 61 73 65 29 20 63 6f 6e 74 61 69 6e 69 6e abase) containin
3dad0 67 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0d g the specified.
3dae0 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 4e 55 4c .** table or NUL
3daf0 4c 2e 20 5e 49 66 20 69 74 20 69 73 20 4e 55 4c L. ^If it is NUL
3db00 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 L, then all atta
3db10 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 ched databases a
3db20 72 65 20 73 65 61 72 63 68 65 64 0d 0a 2a 2a 20 re searched..**
3db30 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 75 73 for the table us
3db40 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61 6c 67 ing the same alg
3db50 6f 72 69 74 68 6d 20 75 73 65 64 20 62 79 20 74 orithm used by t
3db60 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 he database engi
3db70 6e 65 20 74 6f 0d 0a 2a 2a 20 72 65 73 6f 6c 76 ne to..** resolv
3db80 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 e unqualified ta
3db90 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 2e 0d ble references..
3dba0 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 74 68 69 .**..** ^The thi
3dbb0 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 70 61 rd and fourth pa
3dbc0 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 rameters to this
3dbd0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 function are th
3dbe0 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 e table and colu
3dbf0 6d 6e 0d 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 mn..** name of t
3dc00 68 65 20 64 65 73 69 72 65 64 20 63 6f 6c 75 6d he desired colum
3dc10 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e n, respectively.
3dc20 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 Neither of thes
3dc30 65 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 2a 2a e parameters..**
3dc40 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 0d 0a 2a may be NULL...*
3dc50 2a 0d 0a 2a 2a 20 5e 4d 65 74 61 64 61 74 61 20 *..** ^Metadata
3dc60 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 77 is returned by w
3dc70 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6d 65 riting to the me
3dc80 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 70 mory locations p
3dc90 61 73 73 65 64 20 61 73 20 74 68 65 20 35 74 68 assed as the 5th
3dca0 0d 0a 2a 2a 20 61 6e 64 20 73 75 62 73 65 71 75 ..** and subsequ
3dcb0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 73 20 74 ent parameters t
3dcc0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e o this function.
3dcd0 20 5e 41 6e 79 20 6f 66 20 74 68 65 73 65 20 61 ^Any of these a
3dce0 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 0d rguments may be.
3dcf0 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 6e 20 77 68 69 .** NULL, in whi
3dd00 63 68 20 63 61 73 65 20 74 68 65 20 63 6f 72 72 ch case the corr
3dd10 65 73 70 6f 6e 64 69 6e 67 20 65 6c 65 6d 65 6e esponding elemen
3dd20 74 20 6f 66 20 6d 65 74 61 64 61 74 61 20 69 73 t of metadata is
3dd30 20 6f 6d 69 74 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a omitted...**..*
3dd40 2a 20 5e 28 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e * ^(<blockquote>
3dd50 0d 0a 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 ..** <table bord
3dd60 65 72 3d 22 31 22 3e 0d 0a 2a 2a 20 3c 74 72 3e er="1">..** <tr>
3dd70 3c 74 68 3e 20 50 61 72 61 6d 65 74 65 72 20 3c <th> Parameter <
3dd80 74 68 3e 20 4f 75 74 70 75 74 3c 62 72 3e 54 79 th> Output<br>Ty
3dd90 70 65 20 3c 74 68 3e 20 20 44 65 73 63 72 69 70 pe <th> Descrip
3dda0 74 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 74 72 tion..**..** <tr
3ddb0 3e 3c 74 64 3e 20 35 74 68 20 3c 74 64 3e 20 63 ><td> 5th <td> c
3ddc0 6f 6e 73 74 20 63 68 61 72 2a 20 3c 74 64 3e 20 onst char* <td>
3ddd0 44 61 74 61 20 74 79 70 65 0d 0a 2a 2a 20 3c 74 Data type..** <t
3dde0 72 3e 3c 74 64 3e 20 36 74 68 20 3c 74 64 3e 20 r><td> 6th <td>
3ddf0 63 6f 6e 73 74 20 63 68 61 72 2a 20 3c 74 64 3e const char* <td>
3de00 20 4e 61 6d 65 20 6f 66 20 64 65 66 61 75 6c 74 Name of default
3de10 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 collation seque
3de20 6e 63 65 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e nce..** <tr><td>
3de30 20 37 74 68 20 3c 74 64 3e 20 69 6e 74 20 20 20 7th <td> int
3de40 20 20 20 20 20 20 3c 74 64 3e 20 54 72 75 65 20 <td> True
3de50 69 66 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 20 if column has a
3de60 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 NOT NULL constra
3de70 69 6e 74 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e int..** <tr><td>
3de80 20 38 74 68 20 3c 74 64 3e 20 69 6e 74 20 20 20 8th <td> int
3de90 20 20 20 20 20 20 3c 74 64 3e 20 54 72 75 65 20 <td> True
3dea0 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72 if column is par
3deb0 74 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 t of the PRIMARY
3dec0 20 4b 45 59 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 KEY..** <tr><td
3ded0 3e 20 39 74 68 20 3c 74 64 3e 20 69 6e 74 20 20 > 9th <td> int
3dee0 20 20 20 20 20 20 20 3c 74 64 3e 20 54 72 75 65 <td> True
3def0 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 5b 41 if column is [A
3df00 55 54 4f 49 4e 43 52 45 4d 45 4e 54 5d 0d 0a 2a UTOINCREMENT]..*
3df10 2a 20 3c 2f 74 61 62 6c 65 3e 0d 0a 2a 2a 20 3c * </table>..** <
3df20 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 29 5e 0d 0a /blockquote>)^..
3df30 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 6d 65 6d 6f **..** ^The memo
3df40 72 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 ry pointed to by
3df50 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 70 the character p
3df60 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 ointers returned
3df70 20 66 6f 72 20 74 68 65 0d 0a 2a 2a 20 64 65 63 for the..** dec
3df80 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e laration type an
3df90 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 d collation sequ
3dfa0 65 6e 63 65 20 69 73 20 76 61 6c 69 64 20 6f 6e ence is valid on
3dfb0 6c 79 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 ly until the nex
3dfc0 74 0d 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 61 6e t..** call to an
3dfd0 79 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e y SQLite API fun
3dfe0 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ction...**..** ^
3dff0 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 If the specified
3e000 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c table is actual
3e010 6c 79 20 61 20 76 69 65 77 2c 20 61 6e 20 5b 65 ly a view, an [e
3e020 72 72 6f 72 20 63 6f 64 65 5d 20 69 73 20 72 65 rror code] is re
3e030 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 turned...**..**
3e040 5e 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65 ^If the specifie
3e050 64 20 63 6f 6c 75 6d 6e 20 69 73 20 22 72 6f 77 d column is "row
3e060 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f id", "oid" or "_
3e070 72 6f 77 69 64 5f 22 20 61 6e 64 20 61 6e 0d 0a rowid_" and an..
3e080 2a 2a 20 5b 49 4e 54 45 47 45 52 20 50 52 49 4d ** [INTEGER PRIM
3e090 41 52 59 20 4b 45 59 5d 20 63 6f 6c 75 6d 6e 20 ARY KEY] column
3e0a0 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 has been explici
3e0b0 74 6c 79 20 64 65 63 6c 61 72 65 64 2c 20 74 68 tly declared, th
3e0c0 65 6e 20 74 68 65 20 6f 75 74 70 75 74 0d 0a 2a en the output..*
3e0d0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 * parameters are
3e0e0 20 73 65 74 20 66 6f 72 20 74 68 65 20 65 78 70 set for the exp
3e0f0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 licitly declared
3e100 20 63 6f 6c 75 6d 6e 2e 20 5e 28 49 66 20 74 68 column. ^(If th
3e110 65 72 65 20 69 73 20 6e 6f 0d 0a 2a 2a 20 65 78 ere is no..** ex
3e120 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 plicitly declare
3e130 64 20 5b 49 4e 54 45 47 45 52 20 50 52 49 4d 41 d [INTEGER PRIMA
3e140 52 59 20 4b 45 59 5d 20 63 6f 6c 75 6d 6e 2c 20 RY KEY] column,
3e150 74 68 65 6e 20 74 68 65 20 6f 75 74 70 75 74 0d then the output.
3e160 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 .** parameters a
3e170 72 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 re set as follow
3e180 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 70 72 65 3e s:..**..** <pre>
3e190 0d 0a 2a 2a 20 20 20 20 20 64 61 74 61 20 74 79 ..** data ty
3e1a0 70 65 3a 20 22 49 4e 54 45 47 45 52 22 0d 0a 2a pe: "INTEGER"..*
3e1b0 2a 20 20 20 20 20 63 6f 6c 6c 61 74 69 6f 6e 20 * collation
3e1c0 73 65 71 75 65 6e 63 65 3a 20 22 42 49 4e 41 52 sequence: "BINAR
3e1d0 59 22 0d 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 6e Y"..** not n
3e1e0 75 6c 6c 3a 20 30 0d 0a 2a 2a 20 20 20 20 20 70 ull: 0..** p
3e1f0 72 69 6d 61 72 79 20 6b 65 79 3a 20 31 0d 0a 2a rimary key: 1..*
3e200 2a 20 20 20 20 20 61 75 74 6f 20 69 6e 63 72 65 * auto incre
3e210 6d 65 6e 74 3a 20 30 0d 0a 2a 2a 20 3c 2f 70 72 ment: 0..** </pr
3e220 65 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 e>)^..**..** ^(T
3e230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 his function may
3e240 20 6c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 load one or mor
3e250 65 20 73 63 68 65 6d 61 73 20 66 72 6f 6d 20 64 e schemas from d
3e260 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 49 atabase files. I
3e270 66 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f 72 20 6f f an..** error o
3e280 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 69 ccurs during thi
3e290 73 20 70 72 6f 63 65 73 73 2c 20 6f 72 20 69 66 s process, or if
3e2a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 74 the requested t
3e2b0 61 62 6c 65 20 6f 72 20 63 6f 6c 75 6d 6e 0d 0a able or column..
3e2c0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 ** cannot be fou
3e2d0 6e 64 2c 20 61 6e 20 5b 65 72 72 6f 72 20 63 6f nd, an [error co
3e2e0 64 65 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 de] is returned
3e2f0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 and an error mes
3e300 73 61 67 65 20 6c 65 66 74 0d 0a 2a 2a 20 69 6e sage left..** in
3e310 20 74 68 65 20 5b 64 61 74 61 62 61 73 65 20 63 the [database c
3e320 6f 6e 6e 65 63 74 69 6f 6e 5d 20 28 74 6f 20 62 onnection] (to b
3e330 65 20 72 65 74 72 69 65 76 65 64 20 75 73 69 6e e retrieved usin
3e340 67 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 g sqlite3_errmsg
3e350 28 29 29 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ()).)^..**..** ^
3e360 54 68 69 73 20 41 50 49 20 69 73 20 6f 6e 6c 79 This API is only
3e370 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74 68 available if th
3e380 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f e library was co
3e390 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0d mpiled with the.
3e3a0 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42 .** [SQLITE_ENAB
3e3b0 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 LE_COLUMN_METADA
3e3c0 54 41 5d 20 43 2d 70 72 65 70 72 6f 63 65 73 73 TA] C-preprocess
3e3d0 6f 72 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 or symbol define
3e3e0 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 d...*/..SQLITE_A
3e3f0 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 PI int sqlite3_t
3e400 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 able_column_meta
3e410 64 61 74 61 28 0d 0a 20 20 73 71 6c 69 74 65 33 data(.. sqlite3
3e420 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 *db,
3e430 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 /* Connecti
3e440 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 on handle */..
3e450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e const char *zDbN
3e460 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 ame, /* D
3e470 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 atabase name or
3e480 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 NULL */.. const
3e490 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d char *zTableNam
3e4a0 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 e, /* Table
3e4b0 6e 61 6d 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 name */.. const
3e4c0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 char *zColumnNa
3e4d0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e me, /* Column
3e4e0 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 63 68 61 72 name */.. char
3e4f0 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 const **pzDataT
3e500 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 ype, /* OUTPU
3e510 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 T: Declared data
3e520 20 74 79 70 65 20 2a 2f 0d 0a 20 20 63 68 61 72 type */.. char
3e530 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 const **pzCollS
3e540 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 eq, /* OUTPU
3e550 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 T: Collation seq
3e560 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0d 0a 20 uence name */..
3e570 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 int *pNotNull,
3e580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
3e590 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 OUTPUT: True if
3e5a0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 NOT NULL constra
3e5b0 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0d 0a 20 int exists */..
3e5c0 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 int *pPrimaryKe
3e5d0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 y, /*
3e5e0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 OUTPUT: True if
3e5f0 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 column part of P
3e600 4b 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 41 75 K */.. int *pAu
3e610 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 toinc
3e620 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 /* OUTPUT: T
3e630 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 rue if column is
3e640 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 auto-increment
3e650 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..);..../*..**
3e660 20 43 41 50 49 33 52 45 46 3a 20 4c 6f 61 64 20 CAPI3REF: Load
3e670 41 6e 20 45 78 74 65 6e 73 69 6f 6e 0d 0a 2a 2a An Extension..**
3e680 0d 0a 2a 2a 20 5e 54 68 69 73 20 69 6e 74 65 72 ..** ^This inter
3e690 66 61 63 65 20 6c 6f 61 64 73 20 61 6e 20 53 51 face loads an SQ
3e6a0 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c Lite extension l
3e6b0 69 62 72 61 72 79 20 66 72 6f 6d 20 74 68 65 20 ibrary from the
3e6c0 6e 61 6d 65 64 20 66 69 6c 65 2e 0d 0a 2a 2a 0d named file...**.
3e6d0 0a 2a 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 .** ^The sqlite3
3e6e0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 _load_extension(
3e6f0 29 20 69 6e 74 65 72 66 61 63 65 20 61 74 74 65 ) interface atte
3e700 6d 70 74 73 20 74 6f 20 6c 6f 61 64 20 61 6e 0d mpts to load an.
3e710 0a 2a 2a 20 53 51 4c 69 74 65 20 65 78 74 65 6e .** SQLite exten
3e720 73 69 6f 6e 20 6c 69 62 72 61 72 79 20 63 6f 6e sion library con
3e730 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 tained in the fi
3e740 6c 65 20 7a 46 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a le zFile...**..*
3e750 2a 20 5e 54 68 65 20 65 6e 74 72 79 20 70 6f 69 * ^The entry poi
3e760 6e 74 20 69 73 20 7a 50 72 6f 63 2e 0d 0a 2a 2a nt is zProc...**
3e770 20 5e 7a 50 72 6f 63 20 6d 61 79 20 62 65 20 30 ^zProc may be 0
3e780 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 , in which case
3e790 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 the name of the
3e7a0 65 6e 74 72 79 20 70 6f 69 6e 74 0d 0a 2a 2a 20 entry point..**
3e7b0 64 65 66 61 75 6c 74 73 20 74 6f 20 22 73 71 6c defaults to "sql
3e7c0 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 ite3_extension_i
3e7d0 6e 69 74 22 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 nit"...** ^The s
3e7e0 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 qlite3_load_exte
3e7f0 6e 73 69 6f 6e 28 29 20 69 6e 74 65 72 66 61 63 nsion() interfac
3e800 65 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 5b 53 e returns..** [S
3e810 51 4c 49 54 45 5f 4f 4b 5d 20 6f 6e 20 73 75 63 QLITE_OK] on suc
3e820 63 65 73 73 20 61 6e 64 20 5b 53 51 4c 49 54 45 cess and [SQLITE
3e830 5f 45 52 52 4f 52 5d 20 69 66 20 73 6f 6d 65 74 _ERROR] if somet
3e840 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e hing goes wrong.
3e850 0d 0a 2a 2a 20 5e 49 66 20 61 6e 20 65 72 72 6f ..** ^If an erro
3e860 72 20 6f 63 63 75 72 73 20 61 6e 64 20 70 7a 45 r occurs and pzE
3e870 72 72 4d 73 67 20 69 73 20 6e 6f 74 20 30 2c 20 rrMsg is not 0,
3e880 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 then the..** [sq
3e890 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e lite3_load_exten
3e8a0 73 69 6f 6e 28 29 5d 20 69 6e 74 65 72 66 61 63 sion()] interfac
3e8b0 65 20 73 68 61 6c 6c 20 61 74 74 65 6d 70 74 20 e shall attempt
3e8c0 74 6f 0d 0a 2a 2a 20 66 69 6c 6c 20 2a 70 7a 45 to..** fill *pzE
3e8d0 72 72 4d 73 67 20 77 69 74 68 20 65 72 72 6f 72 rrMsg with error
3e8e0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 73 74 message text st
3e8f0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 0d 0a ored in memory..
3e900 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d ** obtained from
3e910 20 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 [sqlite3_malloc
3e920 28 29 5d 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 ()]. The calling
3e930 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 73 68 function..** sh
3e940 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 6d ould free this m
3e950 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 emory by calling
3e960 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 [sqlite3_free()
3e970 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 45 78 74 65 ]...**..** ^Exte
3e980 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 6d 75 nsion loading mu
3e990 73 74 20 62 65 20 65 6e 61 62 6c 65 64 20 75 73 st be enabled us
3e9a0 69 6e 67 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 ing..** [sqlite3
3e9b0 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 _enable_load_ext
3e9c0 65 6e 73 69 6f 6e 28 29 5d 20 70 72 69 6f 72 20 ension()] prior
3e9d0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 to calling this
3e9e0 41 50 49 2c 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 API,..** otherwi
3e9f0 73 65 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c se an error will
3ea00 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a be returned...*
3ea10 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 *..** See also t
3ea20 68 65 20 5b 6c 6f 61 64 5f 65 78 74 65 6e 73 69 he [load_extensi
3ea30 6f 6e 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f on() SQL functio
3ea40 6e 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f n]...*/..SQLITE_
3ea50 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
3ea60 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0d load_extension(.
3ea70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 . sqlite3 *db,
3ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 /* Load
3ea90 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 the extension i
3eaa0 6e 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 nto this databas
3eab0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0d e connection */.
3eac0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
3ead0 46 69 6c 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 File, /* Name
3eae0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6c of the shared l
3eaf0 69 62 72 61 72 79 20 63 6f 6e 74 61 69 6e 69 6e ibrary containin
3eb00 67 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0d 0a g extension */..
3eb10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
3eb20 72 6f 63 2c 20 20 20 20 2f 2a 20 45 6e 74 72 79 roc, /* Entry
3eb30 20 70 6f 69 6e 74 2e 20 20 44 65 72 69 76 65 64 point. Derived
3eb40 20 66 72 6f 6d 20 7a 46 69 6c 65 20 69 66 20 30 from zFile if 0
3eb50 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a */.. char **pz
3eb60 45 72 72 4d 73 67 20 20 20 20 20 20 20 2f 2a 20 ErrMsg /*
3eb70 50 75 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 Put error messag
3eb80 65 20 68 65 72 65 20 69 66 20 6e 6f 74 20 30 20 e here if not 0
3eb90 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..);..../*..**
3eba0 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62 6c CAPI3REF: Enabl
3ebb0 65 20 4f 72 20 44 69 73 61 62 6c 65 20 45 78 74 e Or Disable Ext
3ebc0 65 6e 73 69 6f 6e 20 4c 6f 61 64 69 6e 67 0d 0a ension Loading..
3ebd0 2a 2a 0d 0a 2a 2a 20 5e 53 6f 20 61 73 20 6e 6f **..** ^So as no
3ebe0 74 20 74 6f 20 6f 70 65 6e 20 73 65 63 75 72 69 t to open securi
3ebf0 74 79 20 68 6f 6c 65 73 20 69 6e 20 6f 6c 64 65 ty holes in olde
3ec00 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 r applications t
3ec10 68 61 74 20 61 72 65 0d 0a 2a 2a 20 75 6e 70 72 hat are..** unpr
3ec20 65 70 61 72 65 64 20 74 6f 20 64 65 61 6c 20 77 epared to deal w
3ec30 69 74 68 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f ith extension lo
3ec40 61 64 69 6e 67 2c 20 61 6e 64 20 61 73 20 61 20 ading, and as a
3ec50 6d 65 61 6e 73 20 6f 66 20 64 69 73 61 62 6c 69 means of disabli
3ec60 6e 67 0d 0a 2a 2a 20 65 78 74 65 6e 73 69 6f 6e ng..** extension
3ec70 20 6c 6f 61 64 69 6e 67 20 77 68 69 6c 65 20 65 loading while e
3ec80 76 61 6c 75 61 74 69 6e 67 20 75 73 65 72 2d 65 valuating user-e
3ec90 6e 74 65 72 65 64 20 53 51 4c 2c 20 74 68 65 20 ntered SQL, the
3eca0 66 6f 6c 6c 6f 77 69 6e 67 20 41 50 49 0d 0a 2a following API..*
3ecb0 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 74 6f * is provided to
3ecc0 20 74 75 72 6e 20 74 68 65 20 5b 73 71 6c 69 74 turn the [sqlit
3ecd0 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f e3_load_extensio
3ece0 6e 28 29 5d 20 6d 65 63 68 61 6e 69 73 6d 20 6f n()] mechanism o
3ecf0 6e 20 61 6e 64 20 6f 66 66 2e 0d 0a 2a 2a 0d 0a n and off...**..
3ed00 2a 2a 20 5e 45 78 74 65 6e 73 69 6f 6e 20 6c 6f ** ^Extension lo
3ed10 61 64 69 6e 67 20 69 73 20 6f 66 66 20 62 79 20 ading is off by
3ed20 64 65 66 61 75 6c 74 2e 20 53 65 65 20 74 69 63 default. See tic
3ed30 6b 65 74 20 23 31 38 36 33 2e 0d 0a 2a 2a 20 5e ket #1863...** ^
3ed40 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 Call the sqlite3
3ed50 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 _enable_load_ext
3ed60 65 6e 73 69 6f 6e 28 29 20 72 6f 75 74 69 6e 65 ension() routine
3ed70 20 77 69 74 68 20 6f 6e 6f 66 66 3d 3d 31 0d 0a with onoff==1..
3ed80 2a 2a 20 74 6f 20 74 75 72 6e 20 65 78 74 65 6e ** to turn exten
3ed90 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 6f 6e 20 sion loading on
3eda0 61 6e 64 20 63 61 6c 6c 20 69 74 20 77 69 74 68 and call it with
3edb0 20 6f 6e 6f 66 66 3d 3d 30 20 74 6f 20 74 75 72 onoff==0 to tur
3edc0 6e 0d 0a 2a 2a 20 69 74 20 62 61 63 6b 20 6f 66 n..** it back of
3edd0 66 20 61 67 61 69 6e 2e 0d 0a 2a 2f 0d 0a 53 51 f again...*/..SQ
3ede0 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
3edf0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 ite3_enable_load
3ee00 5f 65 78 74 65 6e 73 69 6f 6e 28 73 71 6c 69 74 _extension(sqlit
3ee10 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 e3 *db, int onof
3ee20 66 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 f);..../*..** CA
3ee30 50 49 33 52 45 46 3a 20 41 75 74 6f 6d 61 74 69 PI3REF: Automati
3ee40 63 61 6c 6c 79 20 4c 6f 61 64 20 53 74 61 74 69 cally Load Stati
3ee50 63 61 6c 6c 79 20 4c 69 6e 6b 65 64 20 45 78 74 cally Linked Ext
3ee60 65 6e 73 69 6f 6e 73 0d 0a 2a 2a 0d 0a 2a 2a 20 ensions..**..**
3ee70 5e 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 ^This interface
3ee80 63 61 75 73 65 73 20 74 68 65 20 78 45 6e 74 72 causes the xEntr
3ee90 79 50 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f yPoint() functio
3eea0 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 n to be invoked
3eeb0 66 6f 72 0d 0a 2a 2a 20 65 61 63 68 20 6e 65 77 for..** each new
3eec0 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 [database conne
3eed0 63 74 69 6f 6e 5d 20 74 68 61 74 20 69 73 20 63 ction] that is c
3eee0 72 65 61 74 65 64 2e 20 20 54 68 65 20 69 64 65 reated. The ide
3eef0 61 20 68 65 72 65 20 69 73 20 74 68 61 74 0d 0a a here is that..
3ef00 2a 2a 20 78 45 6e 74 72 79 50 6f 69 6e 74 28 29 ** xEntryPoint()
3ef10 20 69 73 20 74 68 65 20 65 6e 74 72 79 20 70 6f is the entry po
3ef20 69 6e 74 20 66 6f 72 20 61 20 73 74 61 74 69 63 int for a static
3ef30 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 53 51 4c 69 ally linked SQLi
3ef40 74 65 20 65 78 74 65 6e 73 69 6f 6e 0d 0a 2a 2a te extension..**
3ef50 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 that is to be a
3ef60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6c 6f 61 utomatically loa
3ef70 64 65 64 20 69 6e 74 6f 20 61 6c 6c 20 6e 65 77 ded into all new
3ef80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
3ef90 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e tions...**..** ^
3efa0 28 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 (Even though the
3efb0 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 74 6f 74 function protot
3efc0 79 70 65 20 73 68 6f 77 73 20 74 68 61 74 20 78 ype shows that x
3efd0 45 6e 74 72 79 50 6f 69 6e 74 28 29 20 74 61 6b EntryPoint() tak
3efe0 65 73 0d 0a 2a 2a 20 6e 6f 20 61 72 67 75 6d 65 es..** no argume
3eff0 6e 74 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 nts and returns
3f000 76 6f 69 64 2c 20 53 51 4c 69 74 65 20 69 6e 76 void, SQLite inv
3f010 6f 6b 65 73 20 78 45 6e 74 72 79 50 6f 69 6e 74 okes xEntryPoint
3f020 28 29 20 77 69 74 68 20 74 68 72 65 65 0d 0a 2a () with three..*
3f030 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 * arguments and
3f040 65 78 70 65 63 74 73 20 61 6e 64 20 69 6e 74 65 expects and inte
3f050 67 65 72 20 72 65 73 75 6c 74 20 61 73 20 69 66 ger result as if
3f060 20 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 6f the signature o
3f070 66 20 74 68 65 0d 0a 2a 2a 20 65 6e 74 72 79 20 f the..** entry
3f080 70 6f 69 6e 74 20 77 68 65 72 65 20 61 73 20 66 point where as f
3f090 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 ollows:..**..**
3f0a0 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 <blockquote><pre
3f0b0 3e 0d 0a 2a 2a 20 26 6e 62 73 70 3b 20 20 69 6e >..** in
3f0c0 74 20 78 45 6e 74 72 79 50 6f 69 6e 74 28 0d 0a t xEntryPoint(..
3f0d0 2a 2a 20 26 6e 62 73 70 3b 20 20 20 20 73 71 6c ** sql
3f0e0 69 74 65 33 20 2a 64 62 2c 0d 0a 2a 2a 20 26 6e ite3 *db,..** &n
3f0f0 62 73 70 3b 20 20 20 20 63 6f 6e 73 74 20 63 68 bsp; const ch
3f100 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0d 0a ar **pzErrMsg,..
3f110 2a 2a 20 26 6e 62 73 70 3b 20 20 20 20 63 6f 6e ** con
3f120 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 st struct sqlite
3f130 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 3_api_routines *
3f140 70 54 68 75 6e 6b 0d 0a 2a 2a 20 26 6e 62 73 70 pThunk..**  
3f150 3b 20 20 29 3b 0d 0a 2a 2a 20 3c 2f 70 72 65 3e ; );..** </pre>
3f160 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 29 5e 0d </blockquote>)^.
3f170 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 78 .**..** If the x
3f180 45 6e 74 72 79 50 6f 69 6e 74 20 72 6f 75 74 69 EntryPoint routi
3f190 6e 65 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 6e ne encounters an
3f1a0 20 65 72 72 6f 72 2c 20 69 74 20 73 68 6f 75 6c error, it shoul
3f1b0 64 20 6d 61 6b 65 20 2a 70 7a 45 72 72 4d 73 67 d make *pzErrMsg
3f1c0 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e ..** point to an
3f1d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 appropriate err
3f1e0 6f 72 20 6d 65 73 73 61 67 65 20 28 6f 62 74 61 or message (obta
3f1f0 69 6e 65 64 20 66 72 6f 6d 20 5b 73 71 6c 69 74 ined from [sqlit
3f200 65 33 5f 6d 70 72 69 6e 74 66 28 29 5d 29 0d 0a e3_mprintf()])..
3f210 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e ** and return an
3f220 20 61 70 70 72 6f 70 72 69 61 74 65 20 5b 65 72 appropriate [er
3f230 72 6f 72 20 63 6f 64 65 5d 2e 20 20 5e 53 51 4c ror code]. ^SQL
3f240 69 74 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 ite ensures that
3f250 20 2a 70 7a 45 72 72 4d 73 67 0d 0a 2a 2a 20 69 *pzErrMsg..** i
3f260 73 20 4e 55 4c 4c 20 62 65 66 6f 72 65 20 63 61 s NULL before ca
3f270 6c 6c 69 6e 67 20 74 68 65 20 78 45 6e 74 72 79 lling the xEntry
3f280 50 6f 69 6e 74 28 29 2e 20 20 5e 53 51 4c 69 74 Point(). ^SQLit
3f290 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 0d 0a 2a e will invoke..*
3f2a0 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 65 28 * [sqlite3_free(
3f2b0 29 5d 20 6f 6e 20 2a 70 7a 45 72 72 4d 73 67 20 )] on *pzErrMsg
3f2c0 61 66 74 65 72 20 78 45 6e 74 72 79 50 6f 69 6e after xEntryPoin
3f2d0 74 28 29 20 72 65 74 75 72 6e 73 2e 20 20 5e 49 t() returns. ^I
3f2e0 66 20 61 6e 79 0d 0a 2a 2a 20 78 45 6e 74 72 79 f any..** xEntry
3f2f0 50 6f 69 6e 74 28 29 20 72 65 74 75 72 6e 73 20 Point() returns
3f300 61 6e 20 65 72 72 6f 72 2c 20 74 68 65 20 5b 73 an error, the [s
3f310 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 5d 2c 20 qlite3_open()],
3f320 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 [sqlite3_open16(
3f330 29 5d 2c 0d 0a 2a 2a 20 6f 72 20 5b 73 71 6c 69 )],..** or [sqli
3f340 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 5d 20 63 te3_open_v2()] c
3f350 61 6c 6c 20 74 68 61 74 20 70 72 6f 76 6f 6b 65 all that provoke
3f360 64 20 74 68 65 20 78 45 6e 74 72 79 50 6f 69 6e d the xEntryPoin
3f370 74 28 29 20 77 69 6c 6c 20 66 61 69 6c 2e 0d 0a t() will fail...
3f380 2a 2a 0d 0a 2a 2a 20 5e 43 61 6c 6c 69 6e 67 20 **..** ^Calling
3f390 73 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 sqlite3_auto_ext
3f3a0 65 6e 73 69 6f 6e 28 58 29 20 77 69 74 68 20 61 ension(X) with a
3f3b0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 58 20 n entry point X
3f3c0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 0d that is already.
3f3d0 0a 2a 2a 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 .** on the list
3f3e0 6f 66 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 of automatic ext
3f3f0 65 6e 73 69 6f 6e 73 20 69 73 20 61 20 68 61 72 ensions is a har
3f400 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 5e 4e 6f mless no-op. ^No
3f410 20 65 6e 74 72 79 20 70 6f 69 6e 74 0d 0a 2a 2a entry point..**
3f420 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 will be called
3f430 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 66 more than once f
3f440 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 or each database
3f450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 connection that
3f460 20 69 73 20 6f 70 65 6e 65 64 2e 0d 0a 2a 2a 0d is opened...**.
3f470 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 5b 73 .** See also: [s
3f480 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 qlite3_reset_aut
3f490 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 5d 2e 0d o_extension()]..
3f4a0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
3f4b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 75 74 6f int sqlite3_auto
3f4c0 5f 65 78 74 65 6e 73 69 6f 6e 28 76 6f 69 64 20 _extension(void
3f4d0 28 2a 78 45 6e 74 72 79 50 6f 69 6e 74 29 28 76 (*xEntryPoint)(v
3f4e0 6f 69 64 29 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a oid));..../*..**
3f4f0 20 43 41 50 49 33 52 45 46 3a 20 52 65 73 65 74 CAPI3REF: Reset
3f500 20 41 75 74 6f 6d 61 74 69 63 20 45 78 74 65 6e Automatic Exten
3f510 73 69 6f 6e 20 4c 6f 61 64 69 6e 67 0d 0a 2a 2a sion Loading..**
3f520 0d 0a 2a 2a 20 5e 54 68 69 73 20 69 6e 74 65 72 ..** ^This inter
3f530 66 61 63 65 20 64 69 73 61 62 6c 65 73 20 61 6c face disables al
3f540 6c 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 l automatic exte
3f550 6e 73 69 6f 6e 73 20 70 72 65 76 69 6f 75 73 6c nsions previousl
3f560 79 0d 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 y..** registered
3f570 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f using [sqlite3_
3f580 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 auto_extension()
3f590 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 ]...*/..SQLITE_A
3f5a0 50 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f PI void sqlite3_
3f5b0 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e reset_auto_exten
3f5c0 73 69 6f 6e 28 76 6f 69 64 29 3b 0d 0a 0d 0a 2f sion(void);..../
3f5d0 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 *..** The interf
3f5e0 61 63 65 20 74 6f 20 74 68 65 20 76 69 72 74 75 ace to the virtu
3f5f0 61 6c 2d 74 61 62 6c 65 20 6d 65 63 68 61 6e 69 al-table mechani
3f600 73 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 sm is currently
3f610 63 6f 6e 73 69 64 65 72 65 64 0d 0a 2a 2a 20 74 considered..** t
3f620 6f 20 62 65 20 65 78 70 65 72 69 6d 65 6e 74 61 o be experimenta
3f630 6c 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63 l. The interfac
3f640 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 e might change i
3f650 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 77 n incompatible w
3f660 61 79 73 2e 0d 0a 2a 2a 20 49 66 20 74 68 69 73 ays...** If this
3f670 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 20 66 6f is a problem fo
3f680 72 20 79 6f 75 2c 20 64 6f 20 6e 6f 74 20 75 73 r you, do not us
3f690 65 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 e the interface
3f6a0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0d 0a 2a at this time...*
3f6b0 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 76 *..** When the v
3f6c0 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 6d 65 63 irtual-table mec
3f6d0 68 61 6e 69 73 6d 20 73 74 61 62 69 6c 69 7a 65 hanism stabilize
3f6e0 73 2c 20 77 65 20 77 69 6c 6c 20 64 65 63 6c 61 s, we will decla
3f6f0 72 65 20 74 68 65 0d 0a 2a 2a 20 69 6e 74 65 72 re the..** inter
3f700 66 61 63 65 20 66 69 78 65 64 2c 20 73 75 70 70 face fixed, supp
3f710 6f 72 74 20 69 74 20 69 6e 64 65 66 69 6e 69 74 ort it indefinit
3f720 65 6c 79 2c 20 61 6e 64 20 72 65 6d 6f 76 65 20 ely, and remove
3f730 74 68 69 73 20 63 6f 6d 6d 65 6e 74 2e 0d 0a 2a this comment...*
3f740 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 74 72 75 /..../*..** Stru
3f750 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 ctures used by t
3f760 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 he virtual table
3f770 20 69 6e 74 65 72 66 61 63 65 0d 0a 2a 2f 0d 0a interface..*/..
3f780 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 typedef struct s
3f790 71 6c 69 74 65 33 5f 76 74 61 62 20 73 71 6c 69 qlite3_vtab sqli
3f7a0 74 65 33 5f 76 74 61 62 3b 0d 0a 74 79 70 65 64 te3_vtab;..typed
3f7b0 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 ef struct sqlite
3f7c0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 71 6c 3_index_info sql
3f7d0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 3b ite3_index_info;
3f7e0 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
3f7f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 sqlite3_vtab_cu
3f800 72 73 6f 72 20 73 71 6c 69 74 65 33 5f 76 74 61 rsor sqlite3_vta
3f810 62 5f 63 75 72 73 6f 72 3b 0d 0a 74 79 70 65 64 b_cursor;..typed
3f820 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 ef struct sqlite
3f830 33 5f 6d 6f 64 75 6c 65 20 73 71 6c 69 74 65 33 3_module sqlite3
3f840 5f 6d 6f 64 75 6c 65 3b 0d 0a 0d 0a 2f 2a 0d 0a _module;..../*..
3f850 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 56 69 72 ** CAPI3REF: Vir
3f860 74 75 61 6c 20 54 61 62 6c 65 20 4f 62 6a 65 63 tual Table Objec
3f870 74 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 t..** KEYWORDS:
3f880 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 7b sqlite3_module {
3f890 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f virtual table mo
3f8a0 64 75 6c 65 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 dule}..**..** Th
3f8b0 69 73 20 73 74 72 75 63 74 75 72 65 2c 20 73 6f is structure, so
3f8c0 6d 65 74 69 6d 65 73 20 63 61 6c 6c 65 64 20 61 metimes called a
3f8d0 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 "virtual table
3f8e0 6d 6f 64 75 6c 65 22 2c 20 0d 0a 2a 2a 20 64 65 module", ..** de
3f8f0 66 69 6e 65 73 20 74 68 65 20 69 6d 70 6c 65 6d fines the implem
3f900 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 5b 76 entation of a [v
3f910 69 72 74 75 61 6c 20 74 61 62 6c 65 73 5d 2e 20 irtual tables].
3f920 20 0d 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 ..** This struc
3f930 74 75 72 65 20 63 6f 6e 73 69 73 74 73 20 6d 6f ture consists mo
3f940 73 74 6c 79 20 6f 66 20 6d 65 74 68 6f 64 73 20 stly of methods
3f950 66 6f 72 20 74 68 65 20 6d 6f 64 75 6c 65 2e 0d for the module..
3f960 0a 2a 2a 0d 0a 2a 2a 20 5e 41 20 76 69 72 74 75 .**..** ^A virtu
3f970 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 al table module
3f980 69 73 20 63 72 65 61 74 65 64 20 62 79 20 66 69 is created by fi
3f990 6c 6c 69 6e 67 20 69 6e 20 61 20 70 65 72 73 69 lling in a persi
3f9a0 73 74 65 6e 74 0d 0a 2a 2a 20 69 6e 73 74 61 6e stent..** instan
3f9b0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 ce of this struc
3f9c0 74 75 72 65 20 61 6e 64 20 70 61 73 73 69 6e 67 ture and passing
3f9d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
3f9e0 61 74 20 69 6e 73 74 61 6e 63 65 0d 0a 2a 2a 20 at instance..**
3f9f0 74 6f 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 to [sqlite3_crea
3fa00 74 65 5f 6d 6f 64 75 6c 65 28 29 5d 20 6f 72 20 te_module()] or
3fa10 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f [sqlite3_create_
3fa20 6d 6f 64 75 6c 65 5f 76 32 28 29 5d 2e 0d 0a 2a module_v2()]...*
3fa30 2a 20 5e 54 68 65 20 72 65 67 69 73 74 72 61 74 * ^The registrat
3fa40 69 6f 6e 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 ion remains vali
3fa50 64 20 75 6e 74 69 6c 20 69 74 20 69 73 20 72 65 d until it is re
3fa60 70 6c 61 63 65 64 20 62 79 20 61 20 64 69 66 66 placed by a diff
3fa70 65 72 65 6e 74 0d 0a 2a 2a 20 6d 6f 64 75 6c 65 erent..** module
3fa80 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 5b 64 or until the [d
3fa90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
3faa0 6f 6e 5d 20 63 6c 6f 73 65 73 2e 20 20 54 68 65 on] closes. The
3fab0 20 63 6f 6e 74 65 6e 74 0d 0a 2a 2a 20 6f 66 20 content..** of
3fac0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6d this structure m
3fad0 75 73 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 77 ust not change w
3fae0 68 69 6c 65 20 69 74 20 69 73 20 72 65 67 69 73 hile it is regis
3faf0 74 65 72 65 64 20 77 69 74 68 0d 0a 2a 2a 20 61 tered with..** a
3fb00 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e ny database conn
3fb10 65 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 72 ection...*/..str
3fb20 75 63 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 uct sqlite3_modu
3fb30 6c 65 20 7b 0d 0a 20 20 69 6e 74 20 69 56 65 72 le {.. int iVer
3fb40 73 69 6f 6e 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 sion;.. int (*x
3fb50 43 72 65 61 74 65 29 28 73 71 6c 69 74 65 33 2a Create)(sqlite3*
3fb60 2c 20 76 6f 69 64 20 2a 70 41 75 78 2c 0d 0a 20 , void *pAux,..
3fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e in
3fb80 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 t argc, const ch
3fb90 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0d ar *const*argv,.
3fba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
3fbb0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 sqlite3_vtab **p
3fbc0 70 56 54 61 62 2c 20 63 68 61 72 2a 2a 29 3b 0d pVTab, char**);.
3fbd0 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 6e 65 63 . int (*xConnec
3fbe0 74 29 28 73 71 6c 69 74 65 33 2a 2c 20 76 6f 69 t)(sqlite3*, voi
3fbf0 64 20 2a 70 41 75 78 2c 0d 0a 20 20 20 20 20 20 d *pAux,..
3fc00 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 int arg
3fc10 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 c, const char *c
3fc20 6f 6e 73 74 2a 61 72 67 76 2c 0d 0a 20 20 20 20 onst*argv,..
3fc30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 sqlit
3fc40 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 e3_vtab **ppVTab
3fc50 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 20 20 69 6e , char**);.. in
3fc60 74 20 28 2a 78 42 65 73 74 49 6e 64 65 78 29 28 t (*xBestIndex)(
3fc70 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
3fc80 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 Tab, sqlite3_ind
3fc90 65 78 5f 69 6e 66 6f 2a 29 3b 0d 0a 20 20 69 6e ex_info*);.. in
3fca0 74 20 28 2a 78 44 69 73 63 6f 6e 6e 65 63 74 29 t (*xDisconnect)
3fcb0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 (sqlite3_vtab *p
3fcc0 56 54 61 62 29 3b 0d 0a 20 20 69 6e 74 20 28 2a VTab);.. int (*
3fcd0 78 44 65 73 74 72 6f 79 29 28 73 71 6c 69 74 65 xDestroy)(sqlite
3fce0 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29 3b 0d 3_vtab *pVTab);.
3fcf0 0a 20 20 69 6e 74 20 28 2a 78 4f 70 65 6e 29 28 . int (*xOpen)(
3fd00 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
3fd10 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 Tab, sqlite3_vta
3fd20 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 b_cursor **ppCur
3fd30 73 6f 72 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 sor);.. int (*x
3fd40 43 6c 6f 73 65 29 28 73 71 6c 69 74 65 33 5f 76 Close)(sqlite3_v
3fd50 74 61 62 5f 63 75 72 73 6f 72 2a 29 3b 0d 0a 20 tab_cursor*);..
3fd60 20 69 6e 74 20 28 2a 78 46 69 6c 74 65 72 29 28 int (*xFilter)(
3fd70 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 sqlite3_vtab_cur
3fd80 73 6f 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d sor*, int idxNum
3fd90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 , const char *id
3fda0 78 53 74 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 xStr,..
3fdb0 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c int argc,
3fdc0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a sqlite3_value *
3fdd0 2a 61 72 67 76 29 3b 0d 0a 20 20 69 6e 74 20 28 *argv);.. int (
3fde0 2a 78 4e 65 78 74 29 28 73 71 6c 69 74 65 33 5f *xNext)(sqlite3_
3fdf0 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 3b 0d 0a vtab_cursor*);..
3fe00 20 20 69 6e 74 20 28 2a 78 45 6f 66 29 28 73 71 int (*xEof)(sq
3fe10 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f lite3_vtab_curso
3fe20 72 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 r*);.. int (*xC
3fe30 6f 6c 75 6d 6e 29 28 73 71 6c 69 74 65 33 5f 76 olumn)(sqlite3_v
3fe40 74 61 62 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c tab_cursor*, sql
3fe50 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 ite3_context*, i
3fe60 6e 74 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 52 nt);.. int (*xR
3fe70 6f 77 69 64 29 28 73 71 6c 69 74 65 33 5f 76 74 owid)(sqlite3_vt
3fe80 61 62 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69 ab_cursor*, sqli
3fe90 74 65 33 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 te3_int64 *pRowi
3fea0 64 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 55 70 d);.. int (*xUp
3feb0 64 61 74 65 29 28 73 71 6c 69 74 65 33 5f 76 74 date)(sqlite3_vt
3fec0 61 62 20 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 ab *, int, sqlit
3fed0 65 33 5f 76 61 6c 75 65 20 2a 2a 2c 20 73 71 6c e3_value **, sql
3fee0 69 74 65 33 5f 69 6e 74 36 34 20 2a 29 3b 0d 0a ite3_int64 *);..
3fef0 20 20 69 6e 74 20 28 2a 78 42 65 67 69 6e 29 28 int (*xBegin)(
3ff00 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
3ff10 54 61 62 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 Tab);.. int (*x
3ff20 53 79 6e 63 29 28 73 71 6c 69 74 65 33 5f 76 74 Sync)(sqlite3_vt
3ff30 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 20 69 ab *pVTab);.. i
3ff40 6e 74 20 28 2a 78 43 6f 6d 6d 69 74 29 28 73 71 nt (*xCommit)(sq
3ff50 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 lite3_vtab *pVTa
3ff60 62 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 52 6f b);.. int (*xRo
3ff70 6c 6c 62 61 63 6b 29 28 73 71 6c 69 74 65 33 5f llback)(sqlite3_
3ff80 76 74 61 62 20 2a 70 56 54 61 62 29 3b 0d 0a 20 vtab *pVTab);..
3ff90 20 69 6e 74 20 28 2a 78 46 69 6e 64 46 75 6e 63 int (*xFindFunc
3ffa0 74 69 6f 6e 29 28 73 71 6c 69 74 65 33 5f 76 74 tion)(sqlite3_vt
3ffb0 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20 6e ab *pVtab, int n
3ffc0 41 72 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 Arg, const char
3ffd0 2a 7a 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 *zName,..
3ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3fff0 76 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 void (**pxFunc)(
40000 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a sqlite3_context*
40010 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c ,int,sqlite3_val
40020 75 65 2a 2a 29 2c 0d 0a 20 20 20 20 20 20 20 20 ue**),..
40030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 v
40040 6f 69 64 20 2a 2a 70 70 41 72 67 29 3b 0d 0a 20 oid **ppArg);..
40050 20 69 6e 74 20 28 2a 78 52 65 6e 61 6d 65 29 28 int (*xRename)(
40060 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
40070 74 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 tab, const char
40080 2a 7a 4e 65 77 29 3b 0d 0a 20 20 2f 2a 20 54 68 *zNew);.. /* Th
40090 65 20 6d 65 74 68 6f 64 73 20 61 62 6f 76 65 20 e methods above
400a0 61 72 65 20 69 6e 20 76 65 72 73 69 6f 6e 20 31 are in version 1
400b0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d of the sqlite_m
400c0 6f 64 75 6c 65 20 6f 62 6a 65 63 74 2e 20 54 68 odule object. Th
400d0 6f 73 65 20 0d 0a 20 20 2a 2a 20 62 65 6c 6f 77 ose .. ** below
400e0 20 61 72 65 20 66 6f 72 20 76 65 72 73 69 6f 6e are for version
400f0 20 32 20 61 6e 64 20 67 72 65 61 74 65 72 2e 20 2 and greater.
40100 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 53 61 76 */.. int (*xSav
40110 65 70 6f 69 6e 74 29 28 73 71 6c 69 74 65 33 5f epoint)(sqlite3_
40120 76 74 61 62 20 2a 70 56 54 61 62 2c 20 69 6e 74 vtab *pVTab, int
40130 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 52 65 6c );.. int (*xRel
40140 65 61 73 65 29 28 73 71 6c 69 74 65 33 5f 76 74 ease)(sqlite3_vt
40150 61 62 20 2a 70 56 54 61 62 2c 20 69 6e 74 29 3b ab *pVTab, int);
40160 0d 0a 20 20 69 6e 74 20 28 2a 78 52 6f 6c 6c 62 .. int (*xRollb
40170 61 63 6b 54 6f 29 28 73 71 6c 69 74 65 33 5f 76 ackTo)(sqlite3_v
40180 74 61 62 20 2a 70 56 54 61 62 2c 20 69 6e 74 29 tab *pVTab, int)
40190 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ;..};..../*..**
401a0 43 41 50 49 33 52 45 46 3a 20 56 69 72 74 75 61 CAPI3REF: Virtua
401b0 6c 20 54 61 62 6c 65 20 49 6e 64 65 78 69 6e 67 l Table Indexing
401c0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a Information..**
401d0 20 4b 45 59 57 4f 52 44 53 3a 20 73 71 6c 69 74 KEYWORDS: sqlit
401e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0d 0a 2a e3_index_info..*
401f0 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 *..** The sqlite
40200 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 3_index_info str
40210 75 63 74 75 72 65 20 61 6e 64 20 69 74 73 20 73 ucture and its s
40220 75 62 73 74 72 75 63 74 75 72 65 73 20 69 73 20 ubstructures is
40230 75 73 65 64 20 61 73 20 70 61 72 74 0d 0a 2a 2a used as part..**
40240 20 6f 66 20 74 68 65 20 5b 76 69 72 74 75 61 6c of the [virtual
40250 20 74 61 62 6c 65 5d 20 69 6e 74 65 72 66 61 63 table] interfac
40260 65 20 74 6f 0d 0a 2a 2a 20 70 61 73 73 20 69 6e e to..** pass in
40270 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 61 formation into a
40280 6e 64 20 72 65 63 65 69 76 65 20 74 68 65 20 72 nd receive the r
40290 65 70 6c 79 20 66 72 6f 6d 20 74 68 65 20 5b 78 eply from the [x
402a0 42 65 73 74 49 6e 64 65 78 5d 0d 0a 2a 2a 20 6d BestIndex]..** m
402b0 65 74 68 6f 64 20 6f 66 20 61 20 5b 76 69 72 74 ethod of a [virt
402c0 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 ual table module
402d0 5d 2e 20 20 54 68 65 20 66 69 65 6c 64 73 20 75 ]. The fields u
402e0 6e 64 65 72 20 2a 2a 49 6e 70 75 74 73 2a 2a 20 nder **Inputs**
402f0 61 72 65 20 74 68 65 0d 0a 2a 2a 20 69 6e 70 75 are the..** inpu
40300 74 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 ts to xBestIndex
40310 20 61 6e 64 20 61 72 65 20 72 65 61 64 2d 6f 6e and are read-on
40320 6c 79 2e 20 20 78 42 65 73 74 49 6e 64 65 78 20 ly. xBestIndex
40330 69 6e 73 65 72 74 73 20 69 74 73 0d 0a 2a 2a 20 inserts its..**
40340 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 65 results into the
40350 20 2a 2a 4f 75 74 70 75 74 73 2a 2a 20 66 69 65 **Outputs** fie
40360 6c 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 lds...**..** ^(T
40370 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d he aConstraint[]
40380 20 61 72 72 61 79 20 72 65 63 6f 72 64 73 20 57 array records W
40390 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 HERE clause cons
403a0 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 traints of the f
403b0 6f 72 6d 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 62 6c orm:..**..** <bl
403c0 6f 63 6b 71 75 6f 74 65 3e 63 6f 6c 75 6d 6e 20 ockquote>column
403d0 4f 50 20 65 78 70 72 3c 2f 62 6c 6f 63 6b 71 75 OP expr</blockqu
403e0 6f 74 65 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 77 68 65 ote>..**..** whe
403f0 72 65 20 4f 50 20 69 73 20 3d 2c 20 26 6c 74 3b re OP is =, <
40400 2c 20 26 6c 74 3b 3d 2c 20 26 67 74 3b 2c 20 6f , <=, >, o
40410 72 20 26 67 74 3b 3d 2e 29 5e 20 20 5e 28 54 68 r >=.)^ ^(Th
40420 65 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70 65 e particular ope
40430 72 61 74 6f 72 20 69 73 0d 0a 2a 2a 20 73 74 6f rator is..** sto
40440 72 65 64 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 red in aConstrai
40450 6e 74 5b 5d 2e 6f 70 20 75 73 69 6e 67 20 6f 6e nt[].op using on
40460 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 5b 53 51 e of the..** [SQ
40470 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 LITE_INDEX_CONST
40480 52 41 49 4e 54 5f 45 51 20 7c 20 53 51 4c 49 54 RAINT_EQ | SQLIT
40490 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 E_INDEX_CONSTRAI
404a0 4e 54 5f 20 76 61 6c 75 65 73 5d 2e 29 5e 0d 0a NT_ values].)^..
404b0 2a 2a 20 5e 28 54 68 65 20 69 6e 64 65 78 20 6f ** ^(The index o
404c0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 f the column is
404d0 73 74 6f 72 65 64 20 69 6e 0d 0a 2a 2a 20 61 43 stored in..** aC
404e0 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 69 43 6f 6c onstraint[].iCol
404f0 75 6d 6e 2e 29 5e 20 20 5e 28 61 43 6f 6e 73 74 umn.)^ ^(aConst
40500 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 raint[].usable i
40510 73 20 54 52 55 45 20 69 66 20 74 68 65 0d 0a 2a s TRUE if the..*
40520 2a 20 65 78 70 72 20 6f 6e 20 74 68 65 20 72 69 * expr on the ri
40530 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 63 61 ght-hand side ca
40540 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 28 n be evaluated (
40550 61 6e 64 20 74 68 75 73 20 74 68 65 20 63 6f 6e and thus the con
40560 73 74 72 61 69 6e 74 0d 0a 2a 2a 20 69 73 20 75 straint..** is u
40570 73 61 62 6c 65 29 20 61 6e 64 20 66 61 6c 73 65 sable) and false
40580 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 2e 29 5e if it cannot.)^
40590 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 6f 70 ..**..** ^The op
405a0 74 69 6d 69 7a 65 72 20 61 75 74 6f 6d 61 74 69 timizer automati
405b0 63 61 6c 6c 79 20 69 6e 76 65 72 74 73 20 74 65 cally inverts te
405c0 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 rms of the form
405d0 22 65 78 70 72 20 4f 50 20 63 6f 6c 75 6d 6e 22 "expr OP column"
405e0 0d 0a 2a 2a 20 61 6e 64 20 6d 61 6b 65 73 20 6f ..** and makes o
405f0 74 68 65 72 20 73 69 6d 70 6c 69 66 69 63 61 74 ther simplificat
40600 69 6f 6e 73 20 74 6f 20 74 68 65 20 57 48 45 52 ions to the WHER
40610 45 20 63 6c 61 75 73 65 20 69 6e 20 61 6e 20 61 E clause in an a
40620 74 74 65 6d 70 74 20 74 6f 0d 0a 2a 2a 20 67 65 ttempt to..** ge
40630 74 20 61 73 20 6d 61 6e 79 20 57 48 45 52 45 20 t as many WHERE
40640 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 74 clause terms int
40650 6f 20 74 68 65 20 66 6f 72 6d 20 73 68 6f 77 6e o the form shown
40660 20 61 62 6f 76 65 20 61 73 20 70 6f 73 73 69 62 above as possib
40670 6c 65 2e 0d 0a 2a 2a 20 5e 54 68 65 20 61 43 6f le...** ^The aCo
40680 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79 nstraint[] array
40690 20 6f 6e 6c 79 20 72 65 70 6f 72 74 73 20 57 48 only reports WH
406a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 ERE clause terms
406b0 20 74 68 61 74 20 61 72 65 0d 0a 2a 2a 20 72 65 that are..** re
406c0 6c 65 76 61 6e 74 20 74 6f 20 74 68 65 20 70 61 levant to the pa
406d0 72 74 69 63 75 6c 61 72 20 76 69 72 74 75 61 6c rticular virtual
406e0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 table being que
406f0 72 69 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 ried...**..** ^I
40700 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 nformation about
40710 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c the ORDER BY cl
40720 61 75 73 65 20 69 73 20 73 74 6f 72 65 64 20 69 ause is stored i
40730 6e 20 61 4f 72 64 65 72 42 79 5b 5d 2e 0d 0a 2a n aOrderBy[]...*
40740 2a 20 5e 45 61 63 68 20 74 65 72 6d 20 6f 66 20 * ^Each term of
40750 61 4f 72 64 65 72 42 79 20 72 65 63 6f 72 64 73 aOrderBy records
40760 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 a column of the
40770 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 ORDER BY clause
40780 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 5b 78 ...**..** The [x
40790 42 65 73 74 49 6e 64 65 78 5d 20 6d 65 74 68 6f BestIndex] metho
407a0 64 20 6d 75 73 74 20 66 69 6c 6c 20 61 43 6f 6e d must fill aCon
407b0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 5d 20 77 straintUsage[] w
407c0 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0d ith information.
407d0 0a 2a 2a 20 61 62 6f 75 74 20 77 68 61 74 20 70 .** about what p
407e0 61 72 61 6d 65 74 65 72 73 20 74 6f 20 70 61 73 arameters to pas
407f0 73 20 74 6f 20 78 46 69 6c 74 65 72 2e 20 20 5e s to xFilter. ^
40800 49 66 20 61 72 67 76 49 6e 64 65 78 3e 30 20 74 If argvIndex>0 t
40810 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 72 69 67 68 hen..** the righ
40820 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 t-hand side of t
40830 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
40840 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 69 aConstraint[] i
40850 73 20 65 76 61 6c 75 61 74 65 64 0d 0a 2a 2a 20 s evaluated..**
40860 61 6e 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 and becomes the
40870 61 72 67 76 49 6e 64 65 78 2d 74 68 20 65 6e 74 argvIndex-th ent
40880 72 79 20 69 6e 20 61 72 67 76 2e 20 20 5e 28 49 ry in argv. ^(I
40890 66 20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 f aConstraintUsa
408a0 67 65 5b 5d 2e 6f 6d 69 74 0d 0a 2a 2a 20 69 73 ge[].omit..** is
408b0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 true, then the
408c0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 61 73 constraint is as
408d0 73 75 6d 65 64 20 74 6f 20 62 65 20 66 75 6c 6c sumed to be full
408e0 79 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 y handled by the
408f0 0d 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 ..** virtual tab
40900 6c 65 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 68 le and is not ch
40910 65 63 6b 65 64 20 61 67 61 69 6e 20 62 79 20 53 ecked again by S
40920 51 4c 69 74 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a QLite.)^..**..**
40930 20 5e 54 68 65 20 69 64 78 4e 75 6d 20 61 6e 64 ^The idxNum and
40940 20 69 64 78 50 74 72 20 76 61 6c 75 65 73 20 61 idxPtr values a
40950 72 65 20 72 65 63 6f 72 64 65 64 20 61 6e 64 20 re recorded and
40960 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 0d passed into the.
40970 0a 2a 2a 20 5b 78 46 69 6c 74 65 72 5d 20 6d 65 .** [xFilter] me
40980 74 68 6f 64 2e 0d 0a 2a 2a 20 5e 5b 73 71 6c 69 thod...** ^[sqli
40990 74 65 33 5f 66 72 65 65 28 29 5d 20 69 73 20 75 te3_free()] is u
409a0 73 65 64 20 74 6f 20 66 72 65 65 20 69 64 78 50 sed to free idxP
409b0 74 72 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 tr if and only i
409c0 66 0d 0a 2a 2a 20 6e 65 65 64 54 6f 46 72 65 65 f..** needToFree
409d0 49 64 78 50 74 72 20 69 73 20 74 72 75 65 2e 0d IdxPtr is true..
409e0 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 6f 72 64 .**..** ^The ord
409f0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 6d 65 61 erByConsumed mea
40a00 6e 73 20 74 68 61 74 20 6f 75 74 70 75 74 20 66 ns that output f
40a10 72 6f 6d 20 5b 78 46 69 6c 74 65 72 5d 2f 5b 78 rom [xFilter]/[x
40a20 4e 65 78 74 5d 20 77 69 6c 6c 20 6f 63 63 75 72 Next] will occur
40a30 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 63 6f 72 72 in..** the corr
40a40 65 63 74 20 6f 72 64 65 72 20 74 6f 20 73 61 74 ect order to sat
40a50 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 isfy the ORDER B
40a60 59 20 63 6c 61 75 73 65 20 73 6f 20 74 68 61 74 Y clause so that
40a70 20 6e 6f 20 73 65 70 61 72 61 74 65 0d 0a 2a 2a no separate..**
40a80 20 73 6f 72 74 69 6e 67 20 73 74 65 70 20 69 73 sorting step is
40a90 20 72 65 71 75 69 72 65 64 2e 0d 0a 2a 2a 0d 0a required...**..
40aa0 2a 2a 20 5e 54 68 65 20 65 73 74 69 6d 61 74 65 ** ^The estimate
40ab0 64 43 6f 73 74 20 76 61 6c 75 65 20 69 73 20 61 dCost value is a
40ac0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 n estimate of th
40ad0 65 20 63 6f 73 74 20 6f 66 20 64 6f 69 6e 67 20 e cost of doing
40ae0 74 68 65 0d 0a 2a 2a 20 70 61 72 74 69 63 75 6c the..** particul
40af0 61 72 20 6c 6f 6f 6b 75 70 2e 20 20 41 20 66 75 ar lookup. A fu
40b00 6c 6c 20 73 63 61 6e 20 6f 66 20 61 20 74 61 62 ll scan of a tab
40b10 6c 65 20 77 69 74 68 20 4e 20 65 6e 74 72 69 65 le with N entrie
40b20 73 20 73 68 6f 75 6c 64 20 68 61 76 65 0d 0a 2a s should have..*
40b30 2a 20 61 20 63 6f 73 74 20 6f 66 20 4e 2e 20 20 * a cost of N.
40b40 41 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 A binary search
40b50 6f 66 20 61 20 74 61 62 6c 65 20 6f 66 20 4e 20 of a table of N
40b60 65 6e 74 72 69 65 73 20 73 68 6f 75 6c 64 20 68 entries should h
40b70 61 76 65 20 61 0d 0a 2a 2a 20 63 6f 73 74 20 6f ave a..** cost o
40b80 66 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 f approximately
40b90 6c 6f 67 28 4e 29 2e 0d 0a 2a 2f 0d 0a 73 74 72 log(N)...*/..str
40ba0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 uct sqlite3_inde
40bb0 78 5f 69 6e 66 6f 20 7b 0d 0a 20 20 2f 2a 20 49 x_info {.. /* I
40bc0 6e 70 75 74 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 nputs */.. int
40bd0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 nConstraint;
40be0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
40bf0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 of entries in a
40c00 43 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a 20 Constraint */..
40c10 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f struct sqlite3_
40c20 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 index_constraint
40c30 20 7b 0d 0a 20 20 20 20 20 69 6e 74 20 69 43 6f {.. int iCo
40c40 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 lumn;
40c50 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 6e 20 /* Column on
40c60 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f left-hand side o
40c70 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d f constraint */.
40c80 0a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 . unsigned c
40c90 68 61 72 20 6f 70 3b 20 20 20 20 20 20 20 20 20 har op;
40ca0 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 6f 70 /* Constraint op
40cb0 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 20 20 20 erator */..
40cc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 73 unsigned char us
40cd0 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 able; /* Tru
40ce0 65 20 69 66 20 74 68 69 73 20 63 6f 6e 73 74 72 e if this constr
40cf0 61 69 6e 74 20 69 73 20 75 73 61 62 6c 65 20 2a aint is usable *
40d00 2f 0d 0a 20 20 20 20 20 69 6e 74 20 69 54 65 72 /.. int iTer
40d10 6d 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 mOffset;
40d20 20 20 2f 2a 20 55 73 65 64 20 69 6e 74 65 72 6e /* Used intern
40d30 61 6c 6c 79 20 2d 20 78 42 65 73 74 49 6e 64 65 ally - xBestInde
40d40 78 20 73 68 6f 75 6c 64 20 69 67 6e 6f 72 65 20 x should ignore
40d50 2a 2f 0d 0a 20 20 7d 20 2a 61 43 6f 6e 73 74 72 */.. } *aConstr
40d60 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 aint;
40d70 20 2f 2a 20 54 61 62 6c 65 20 6f 66 20 57 48 45 /* Table of WHE
40d80 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 RE clause constr
40d90 61 69 6e 74 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 aints */.. int
40da0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 nOrderBy;
40db0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
40dc0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 of terms in the
40dd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 ORDER BY clause
40de0 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 73 71 */.. struct sq
40df0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 lite3_index_orde
40e00 72 62 79 20 7b 0d 0a 20 20 20 20 20 69 6e 74 20 rby {.. int
40e10 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 iColumn;
40e20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 /* Column
40e30 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 20 20 20 number */..
40e40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 65 unsigned char de
40e50 73 63 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 sc; /* Tru
40e60 65 20 66 6f 72 20 44 45 53 43 2e 20 20 46 61 6c e for DESC. Fal
40e70 73 65 20 66 6f 72 20 41 53 43 2e 20 2a 2f 0d 0a se for ASC. */..
40e80 20 20 7d 20 2a 61 4f 72 64 65 72 42 79 3b 20 20 } *aOrderBy;
40e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
40ea0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 The ORDER BY cla
40eb0 75 73 65 20 2a 2f 0d 0a 20 20 2f 2a 20 4f 75 74 use */.. /* Out
40ec0 70 75 74 73 20 2a 2f 0d 0a 20 20 73 74 72 75 63 puts */.. struc
40ed0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f t sqlite3_index_
40ee0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 constraint_usage
40ef0 20 7b 0d 0a 20 20 20 20 69 6e 74 20 61 72 67 76 {.. int argv
40f00 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 Index;
40f10 20 2f 2a 20 69 66 20 3e 30 2c 20 63 6f 6e 73 74 /* if >0, const
40f20 72 61 69 6e 74 20 69 73 20 70 61 72 74 20 6f 66 raint is part of
40f30 20 61 72 67 76 20 74 6f 20 78 46 69 6c 74 65 72 argv to xFilter
40f40 20 2a 2f 0d 0a 20 20 20 20 75 6e 73 69 67 6e 65 */.. unsigne
40f50 64 20 63 68 61 72 20 6f 6d 69 74 3b 20 20 20 20 d char omit;
40f60 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 6f 64 65 /* Do not code
40f70 20 61 20 74 65 73 74 20 66 6f 72 20 74 68 69 73 a test for this
40f80 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a constraint */..
40f90 20 20 7d 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 } *aConstraint
40fa0 55 73 61 67 65 3b 0d 0a 20 20 69 6e 74 20 69 64 Usage;.. int id
40fb0 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 xNum;
40fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 75 /* Number u
40fd0 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 sed to identify
40fe0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 the index */..
40ff0 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20 20 20 char *idxStr;
41000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 /* St
41010 72 69 6e 67 2c 20 70 6f 73 73 69 62 6c 79 20 6f ring, possibly o
41020 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
41030 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 2a 2f 0d 0a ite3_malloc */..
41040 20 20 69 6e 74 20 6e 65 65 64 54 6f 46 72 65 65 int needToFree
41050 49 64 78 53 74 72 3b 20 20 20 20 20 20 2f 2a 20 IdxStr; /*
41060 46 72 65 65 20 69 64 78 53 74 72 20 75 73 69 6e Free idxStr usin
41070 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 g sqlite3_free()
41080 20 69 66 20 74 72 75 65 20 2a 2f 0d 0a 20 20 69 if true */.. i
41090 6e 74 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d nt orderByConsum
410a0 65 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 ed; /* Tru
410b0 65 20 69 66 20 6f 75 74 70 75 74 20 69 73 20 61 e if output is a
410c0 6c 72 65 61 64 79 20 6f 72 64 65 72 65 64 20 2a lready ordered *
410d0 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 65 73 74 69 /.. double esti
410e0 6d 61 74 65 64 43 6f 73 74 3b 20 20 20 20 20 20 matedCost;
410f0 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 /* Estimated cos
41100 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 t of using this
41110 69 6e 64 65 78 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a index */..};....
41120 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
41130 20 56 69 72 74 75 61 6c 20 54 61 62 6c 65 20 43 Virtual Table C
41140 6f 6e 73 74 72 61 69 6e 74 20 4f 70 65 72 61 74 onstraint Operat
41150 6f 72 20 43 6f 64 65 73 0d 0a 2a 2a 0d 0a 2a 2a or Codes..**..**
41160 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 64 65 These macros de
41170 66 69 6e 65 64 20 74 68 65 20 61 6c 6c 6f 77 65 fined the allowe
41180 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 d values for the
41190 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 69 6e ..** [sqlite3_in
411a0 64 65 78 5f 69 6e 66 6f 5d 2e 61 43 6f 6e 73 74 dex_info].aConst
411b0 72 61 69 6e 74 5b 5d 2e 6f 70 20 66 69 65 6c 64 raint[].op field
411c0 2e 20 20 45 61 63 68 20 76 61 6c 75 65 20 72 65 . Each value re
411d0 70 72 65 73 65 6e 74 73 0d 0a 2a 2a 20 61 6e 20 presents..** an
411e0 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 69 73 operator that is
411f0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 73 74 part of a const
41200 72 61 69 6e 74 20 74 65 72 6d 20 69 6e 20 74 68 raint term in th
41210 65 20 77 48 45 52 45 20 63 6c 61 75 73 65 20 6f e wHERE clause o
41220 66 0d 0a 2a 2a 20 61 20 71 75 65 72 79 20 74 68 f..** a query th
41230 61 74 20 75 73 65 73 20 61 20 5b 76 69 72 74 75 at uses a [virtu
41240 61 6c 20 74 61 62 6c 65 5d 2e 0d 0a 2a 2f 0d 0a al table]...*/..
41250 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 #define SQLITE_I
41260 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f NDEX_CONSTRAINT_
41270 45 51 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 EQ 2..#define
41280 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f SQLITE_INDEX_CO
41290 4e 53 54 52 41 49 4e 54 5f 47 54 20 20 20 20 34 NSTRAINT_GT 4
412a0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
412b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e _INDEX_CONSTRAIN
412c0 54 5f 4c 45 20 20 20 20 38 0d 0a 23 64 65 66 69 T_LE 8..#defi
412d0 6e 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f ne SQLITE_INDEX_
412e0 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 20 20 CONSTRAINT_LT
412f0 20 31 36 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 16..#define SQL
41300 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 ITE_INDEX_CONSTR
41310 41 49 4e 54 5f 47 45 20 20 20 20 33 32 0d 0a 23 AINT_GE 32..#
41320 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e define SQLITE_IN
41330 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d DEX_CONSTRAINT_M
41340 41 54 43 48 20 36 34 0d 0a 0d 0a 2f 2a 0d 0a 2a ATCH 64..../*..*
41350 2a 20 43 41 50 49 33 52 45 46 3a 20 52 65 67 69 * CAPI3REF: Regi
41360 73 74 65 72 20 41 20 56 69 72 74 75 61 6c 20 54 ster A Virtual T
41370 61 62 6c 65 20 49 6d 70 6c 65 6d 65 6e 74 61 74 able Implementat
41380 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 ion..**..** ^The
41390 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 se routines are
413a0 75 73 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 used to register
413b0 20 61 20 6e 65 77 20 5b 76 69 72 74 75 61 6c 20 a new [virtual
413c0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 5d 20 6e 61 table module] na
413d0 6d 65 2e 0d 0a 2a 2a 20 5e 4d 6f 64 75 6c 65 20 me...** ^Module
413e0 6e 61 6d 65 73 20 6d 75 73 74 20 62 65 20 72 65 names must be re
413f0 67 69 73 74 65 72 65 64 20 62 65 66 6f 72 65 0d gistered before.
41400 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 61 20 6e .** creating a n
41410 65 77 20 5b 76 69 72 74 75 61 6c 20 74 61 62 6c ew [virtual tabl
41420 65 5d 20 75 73 69 6e 67 20 74 68 65 20 6d 6f 64 e] using the mod
41430 75 6c 65 20 61 6e 64 20 62 65 66 6f 72 65 20 75 ule and before u
41440 73 69 6e 67 20 61 0d 0a 2a 2a 20 70 72 65 65 78 sing a..** preex
41450 69 73 74 69 6e 67 20 5b 76 69 72 74 75 61 6c 20 isting [virtual
41460 74 61 62 6c 65 5d 20 66 6f 72 20 74 68 65 20 6d table] for the m
41470 6f 64 75 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e odule...**..** ^
41480 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 The module name
41490 69 73 20 72 65 67 69 73 74 65 72 65 64 20 6f 6e is registered on
414a0 20 74 68 65 20 5b 64 61 74 61 62 61 73 65 20 63 the [database c
414b0 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 70 65 63 69 onnection] speci
414c0 66 69 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 fied..** by the
414d0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 2e first parameter.
414e0 20 20 5e 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 ^The name of t
414f0 68 65 20 6d 6f 64 75 6c 65 20 69 73 20 67 69 76 he module is giv
41500 65 6e 20 62 79 20 74 68 65 20 0d 0a 2a 2a 20 73 en by the ..** s
41510 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2e econd parameter.
41520 20 20 5e 54 68 65 20 74 68 69 72 64 20 70 61 72 ^The third par
41530 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e ameter is a poin
41540 74 65 72 20 74 6f 0d 0a 2a 2a 20 74 68 65 20 69 ter to..** the i
41550 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
41560 20 74 68 65 20 5b 76 69 72 74 75 61 6c 20 74 61 the [virtual ta
41570 62 6c 65 20 6d 6f 64 75 6c 65 5d 2e 20 20 20 5e ble module]. ^
41580 54 68 65 20 66 6f 75 72 74 68 0d 0a 2a 2a 20 70 The fourth..** p
41590 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 61 arameter is an a
415a0 72 62 69 74 72 61 72 79 20 63 6c 69 65 6e 74 20 rbitrary client
415b0 64 61 74 61 20 70 6f 69 6e 74 65 72 20 74 68 61 data pointer tha
415c0 74 20 69 73 20 70 61 73 73 65 64 20 74 68 72 6f t is passed thro
415d0 75 67 68 0d 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 ugh..** into the
415e0 20 5b 78 43 72 65 61 74 65 5d 20 61 6e 64 20 5b [xCreate] and [
415f0 78 43 6f 6e 6e 65 63 74 5d 20 6d 65 74 68 6f 64 xConnect] method
41600 73 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c s of the virtual
41610 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 0d 0a 2a table module..*
41620 2a 20 77 68 65 6e 20 61 20 6e 65 77 20 76 69 72 * when a new vir
41630 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 62 65 tual table is be
41640 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 6f being created o
41650 72 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 2e r reinitialized.
41660 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 ..**..** ^The sq
41670 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 lite3_create_mod
41680 75 6c 65 5f 76 32 28 29 20 69 6e 74 65 72 66 61 ule_v2() interfa
41690 63 65 20 68 61 73 20 61 20 66 69 66 74 68 20 70 ce has a fifth p
416a0 61 72 61 6d 65 74 65 72 20 77 68 69 63 68 0d 0a arameter which..
416b0 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 ** is a pointer
416c0 74 6f 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 to a destructor
416d0 66 6f 72 20 74 68 65 20 70 43 6c 69 65 6e 74 44 for the pClientD
416e0 61 74 61 2e 20 20 5e 53 51 4c 69 74 65 20 77 69 ata. ^SQLite wi
416f0 6c 6c 0d 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 ll..** invoke th
41700 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e e destructor fun
41710 63 74 69 6f 6e 20 28 69 66 20 69 74 20 69 73 20 ction (if it is
41720 6e 6f 74 20 4e 55 4c 4c 29 20 77 68 65 6e 20 53 not NULL) when S
41730 51 4c 69 74 65 0d 0a 2a 2a 20 6e 6f 20 6c 6f 6e QLite..** no lon
41740 67 65 72 20 6e 65 65 64 73 20 74 68 65 20 70 43 ger needs the pC
41750 6c 69 65 6e 74 44 61 74 61 20 70 6f 69 6e 74 65 lientData pointe
41760 72 2e 20 20 5e 54 68 65 20 64 65 73 74 72 75 63 r. ^The destruc
41770 74 6f 72 20 77 69 6c 6c 20 61 6c 73 6f 0d 0a 2a tor will also..*
41780 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 69 66 20 * be invoked if
41790 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 the call to sqli
417a0 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c te3_create_modul
417b0 65 5f 76 32 28 29 20 66 61 69 6c 73 2e 0d 0a 2a e_v2() fails...*
417c0 2a 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 63 * ^The sqlite3_c
417d0 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 29 0d 0a reate_module()..
417e0 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 ** interface is
417f0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 73 71 equivalent to sq
41800 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 lite3_create_mod
41810 75 6c 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 ule_v2() with a
41820 4e 55 4c 4c 0d 0a 2a 2a 20 64 65 73 74 72 75 63 NULL..** destruc
41830 74 6f 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 tor...*/..SQLITE
41840 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
41850 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 0d _create_module(.
41860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 . sqlite3 *db,
41870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
41880 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63 74 69 SQLite connecti
41890 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 6d on to register m
418a0 6f 64 75 6c 65 20 77 69 74 68 20 2a 2f 0d 0a 20 odule with */..
418b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
418c0 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e me, /* N
418d0 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c ame of the modul
418e0 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 73 71 e */.. const sq
418f0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 2c lite3_module *p,
41900 20 20 20 2f 2a 20 4d 65 74 68 6f 64 73 20 66 6f /* Methods fo
41910 72 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a 2f 0d r the module */.
41920 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 . void *pClient
41930 44 61 74 61 20 20 20 20 20 20 20 20 20 20 2f 2a Data /*
41940 20 43 6c 69 65 6e 74 20 64 61 74 61 20 66 6f 72 Client data for
41950 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 xCreate/xConnec
41960 74 20 2a 2f 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 t */..);..SQLITE
41970 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
41980 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 _create_module_v
41990 32 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 2(.. sqlite3 *d
419a0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b,
419b0 20 2f 2a 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 /* SQLite conne
419c0 63 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 ction to registe
419d0 72 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 2a 2f r module with */
419e0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
419f0 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f zName, /
41a00 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f * Name of the mo
41a10 64 75 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 dule */.. const
41a20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 sqlite3_module
41a30 2a 70 2c 20 20 20 2f 2a 20 4d 65 74 68 6f 64 73 *p, /* Methods
41a40 20 66 6f 72 20 74 68 65 20 6d 6f 64 75 6c 65 20 for the module
41a50 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 */.. void *pCli
41a60 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 entData,
41a70 20 2f 2a 20 43 6c 69 65 6e 74 20 64 61 74 61 20 /* Client data
41a80 66 6f 72 20 78 43 72 65 61 74 65 2f 78 43 6f 6e for xCreate/xCon
41a90 6e 65 63 74 20 2a 2f 0d 0a 20 20 76 6f 69 64 28 nect */.. void(
41aa0 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a *xDestroy)(void*
41ab0 29 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 ) /* Module
41ac0 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 destructor funct
41ad0 69 6f 6e 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a ion */..);..../*
41ae0 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 56 ..** CAPI3REF: V
41af0 69 72 74 75 61 6c 20 54 61 62 6c 65 20 49 6e 73 irtual Table Ins
41b00 74 61 6e 63 65 20 4f 62 6a 65 63 74 0d 0a 2a 2a tance Object..**
41b10 20 4b 45 59 57 4f 52 44 53 3a 20 73 71 6c 69 74 KEYWORDS: sqlit
41b20 65 33 5f 76 74 61 62 0d 0a 2a 2a 0d 0a 2a 2a 20 e3_vtab..**..**
41b30 45 76 65 72 79 20 5b 76 69 72 74 75 61 6c 20 74 Every [virtual t
41b40 61 62 6c 65 20 6d 6f 64 75 6c 65 5d 20 69 6d 70 able module] imp
41b50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 lementation uses
41b60 20 61 20 73 75 62 63 6c 61 73 73 0d 0a 2a 2a 20 a subclass..**
41b70 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 74 of this object t
41b80 6f 20 64 65 73 63 72 69 62 65 20 61 20 70 61 72 o describe a par
41b90 74 69 63 75 6c 61 72 20 69 6e 73 74 61 6e 63 65 ticular instance
41ba0 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 5b 76 69 72 ..** of the [vir
41bb0 74 75 61 6c 20 74 61 62 6c 65 5d 2e 20 20 45 61 tual table]. Ea
41bc0 63 68 20 73 75 62 63 6c 61 73 73 20 77 69 6c 6c ch subclass will
41bd0 0d 0a 2a 2a 20 62 65 20 74 61 69 6c 6f 72 65 64 ..** be tailored
41be0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 63 to the specific
41bf0 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 6d 6f needs of the mo
41c00 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 dule implementat
41c10 69 6f 6e 2e 0d 0a 2a 2a 20 54 68 65 20 70 75 72 ion...** The pur
41c20 70 6f 73 65 20 6f 66 20 74 68 69 73 20 73 75 70 pose of this sup
41c30 65 72 63 6c 61 73 73 20 69 73 20 74 6f 20 64 65 erclass is to de
41c40 66 69 6e 65 20 63 65 72 74 61 69 6e 20 66 69 65 fine certain fie
41c50 6c 64 73 20 74 68 61 74 20 61 72 65 0d 0a 2a 2a lds that are..**
41c60 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6d common to all m
41c70 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 odule implementa
41c80 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e tions...**..** ^
41c90 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d Virtual tables m
41ca0 65 74 68 6f 64 73 20 63 61 6e 20 73 65 74 20 61 ethods can set a
41cb0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 n error message
41cc0 62 79 20 61 73 73 69 67 6e 69 6e 67 20 61 0d 0a by assigning a..
41cd0 2a 2a 20 73 74 72 69 6e 67 20 6f 62 74 61 69 6e ** string obtain
41ce0 65 64 20 66 72 6f 6d 20 5b 73 71 6c 69 74 65 33 ed from [sqlite3
41cf0 5f 6d 70 72 69 6e 74 66 28 29 5d 20 74 6f 20 7a _mprintf()] to z
41d00 45 72 72 4d 73 67 2e 20 20 54 68 65 20 6d 65 74 ErrMsg. The met
41d10 68 6f 64 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 74 hod should..** t
41d20 61 6b 65 20 63 61 72 65 20 74 68 61 74 20 61 6e ake care that an
41d30 79 20 70 72 69 6f 72 20 73 74 72 69 6e 67 20 69 y prior string i
41d40 73 20 66 72 65 65 64 20 62 79 20 61 20 63 61 6c s freed by a cal
41d50 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 66 72 l to [sqlite3_fr
41d60 65 65 28 29 5d 0d 0a 2a 2a 20 70 72 69 6f 72 20 ee()]..** prior
41d70 74 6f 20 61 73 73 69 67 6e 69 6e 67 20 61 20 6e to assigning a n
41d80 65 77 20 73 74 72 69 6e 67 20 74 6f 20 7a 45 72 ew string to zEr
41d90 72 4d 73 67 2e 20 20 5e 41 66 74 65 72 20 74 68 rMsg. ^After th
41da0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0d e error message.
41db0 0a 2a 2a 20 69 73 20 64 65 6c 69 76 65 72 65 64 .** is delivered
41dc0 20 75 70 20 74 6f 20 74 68 65 20 63 6c 69 65 6e up to the clien
41dd0 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 74 t application, t
41de0 68 65 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 he string will b
41df0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0d e automatically.
41e00 0a 2a 2a 20 66 72 65 65 64 20 62 79 20 73 71 6c .** freed by sql
41e10 69 74 65 33 5f 66 72 65 65 28 29 20 61 6e 64 20 ite3_free() and
41e20 74 68 65 20 7a 45 72 72 4d 73 67 20 66 69 65 6c the zErrMsg fiel
41e30 64 20 77 69 6c 6c 20 62 65 20 7a 65 72 6f 65 64 d will be zeroed
41e40 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 73 71 ...*/..struct sq
41e50 6c 69 74 65 33 5f 76 74 61 62 20 7b 0d 0a 20 20 lite3_vtab {..
41e60 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f const sqlite3_mo
41e70 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 20 20 dule *pModule;
41e80 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 6f /* The module fo
41e90 72 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 r this virtual t
41ea0 61 62 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e able */.. int n
41eb0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 Ref;
41ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 4f /* NO
41ed0 20 4c 4f 4e 47 45 52 20 55 53 45 44 20 2a 2f 0d LONGER USED */.
41ee0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 . char *zErrMsg
41ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
41f00 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 /* Error mess
41f10 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 age from sqlite3
41f20 5f 6d 70 72 69 6e 74 66 28 29 20 2a 2f 0d 0a 20 _mprintf() */..
41f30 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c /* Virtual tabl
41f40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e e implementation
41f50 73 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 s will typically
41f60 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 add additional
41f70 66 69 65 6c 64 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d fields */..};...
41f80 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
41f90 3a 20 56 69 72 74 75 61 6c 20 54 61 62 6c 65 20 : Virtual Table
41fa0 43 75 72 73 6f 72 20 4f 62 6a 65 63 74 0d 0a 2a Cursor Object..*
41fb0 2a 20 4b 45 59 57 4f 52 44 53 3a 20 73 71 6c 69 * KEYWORDS: sqli
41fc0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 te3_vtab_cursor
41fd0 7b 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 {virtual table c
41fe0 75 72 73 6f 72 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 45 ursor}..**..** E
41ff0 76 65 72 79 20 5b 76 69 72 74 75 61 6c 20 74 61 very [virtual ta
42000 62 6c 65 20 6d 6f 64 75 6c 65 5d 20 69 6d 70 6c ble module] impl
42010 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 ementation uses
42020 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 74 68 a subclass of th
42030 65 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 e..** following
42040 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 structure to des
42050 63 72 69 62 65 20 63 75 72 73 6f 72 73 20 74 68 cribe cursors th
42060 61 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 at point into th
42070 65 0d 0a 2a 2a 20 5b 76 69 72 74 75 61 6c 20 74 e..** [virtual t
42080 61 62 6c 65 5d 20 61 6e 64 20 61 72 65 20 75 73 able] and are us
42090 65 64 0d 0a 2a 2a 20 74 6f 20 6c 6f 6f 70 20 74 ed..** to loop t
420a0 68 72 6f 75 67 68 20 74 68 65 20 76 69 72 74 75 hrough the virtu
420b0 61 6c 20 74 61 62 6c 65 2e 20 20 43 75 72 73 6f al table. Curso
420c0 72 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75 rs are created u
420d0 73 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 sing the..** [sq
420e0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2e 78 4f 70 lite3_module.xOp
420f0 65 6e 20 7c 20 78 4f 70 65 6e 5d 20 6d 65 74 68 en | xOpen] meth
42100 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 od of the module
42110 20 61 6e 64 20 61 72 65 20 64 65 73 74 72 6f 79 and are destroy
42120 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 5b 73 ed..** by the [s
42130 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2e 78 43 qlite3_module.xC
42140 6c 6f 73 65 20 7c 20 78 43 6c 6f 73 65 5d 20 6d lose | xClose] m
42150 65 74 68 6f 64 2e 20 20 43 75 72 73 6f 72 73 20 ethod. Cursors
42160 61 72 65 20 75 73 65 64 0d 0a 2a 2a 20 62 79 20 are used..** by
42170 74 68 65 20 5b 78 46 69 6c 74 65 72 5d 2c 20 5b the [xFilter], [
42180 78 4e 65 78 74 5d 2c 20 5b 78 45 6f 66 5d 2c 20 xNext], [xEof],
42190 5b 78 43 6f 6c 75 6d 6e 5d 2c 20 61 6e 64 20 5b [xColumn], and [
421a0 78 52 6f 77 69 64 5d 20 6d 65 74 68 6f 64 73 0d xRowid] methods.
421b0 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c .** of the modul
421c0 65 2e 20 20 45 61 63 68 20 6d 6f 64 75 6c 65 20 e. Each module
421d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 implementation w
421e0 69 6c 6c 20 64 65 66 69 6e 65 0d 0a 2a 2a 20 74 ill define..** t
421f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 he content of a
42200 63 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 cursor structure
42210 20 74 6f 20 73 75 69 74 20 69 74 73 20 6f 77 6e to suit its own
42220 20 6e 65 65 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 needs...**..**
42230 54 68 69 73 20 73 75 70 65 72 63 6c 61 73 73 20 This superclass
42240 65 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20 exists in order
42250 74 6f 20 64 65 66 69 6e 65 20 66 69 65 6c 64 73 to define fields
42260 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 74 of the cursor t
42270 68 61 74 0d 0a 2a 2a 20 61 72 65 20 63 6f 6d 6d hat..** are comm
42280 6f 6e 20 74 6f 20 61 6c 6c 20 69 6d 70 6c 65 6d on to all implem
42290 65 6e 74 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d 0a entations...*/..
422a0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 76 struct sqlite3_v
422b0 74 61 62 5f 63 75 72 73 6f 72 20 7b 0d 0a 20 20 tab_cursor {..
422c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
422d0 74 61 62 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 tab; /* Vir
422e0 74 75 61 6c 20 74 61 62 6c 65 20 6f 66 20 74 68 tual table of th
422f0 69 73 20 63 75 72 73 6f 72 20 2a 2f 0d 0a 20 20 is cursor */..
42300 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 /* Virtual table
42310 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 implementations
42320 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 20 will typically
42330 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 add additional f
42340 69 65 6c 64 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a ields */..};....
42350 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
42360 20 44 65 63 6c 61 72 65 20 54 68 65 20 53 63 68 Declare The Sch
42370 65 6d 61 20 4f 66 20 41 20 56 69 72 74 75 61 6c ema Of A Virtual
42380 20 54 61 62 6c 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e Table..**..** ^
42390 54 68 65 20 5b 78 43 72 65 61 74 65 5d 20 61 6e The [xCreate] an
423a0 64 20 5b 78 43 6f 6e 6e 65 63 74 5d 20 6d 65 74 d [xConnect] met
423b0 68 6f 64 73 20 6f 66 20 61 0d 0a 2a 2a 20 5b 76 hods of a..** [v
423c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 irtual table mod
423d0 75 6c 65 5d 20 63 61 6c 6c 20 74 68 69 73 20 69 ule] call this i
423e0 6e 74 65 72 66 61 63 65 0d 0a 2a 2a 20 74 6f 20 nterface..** to
423f0 64 65 63 6c 61 72 65 20 74 68 65 20 66 6f 72 6d declare the form
42400 61 74 20 28 74 68 65 20 6e 61 6d 65 73 20 61 6e at (the names an
42410 64 20 64 61 74 61 74 79 70 65 73 20 6f 66 20 74 d datatypes of t
42420 68 65 20 63 6f 6c 75 6d 6e 73 29 20 6f 66 0d 0a he columns) of..
42430 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 ** the virtual t
42440 61 62 6c 65 73 20 74 68 65 79 20 69 6d 70 6c 65 ables they imple
42450 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 ment...*/..SQLIT
42460 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
42470 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 73 3_declare_vtab(s
42480 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 qlite3*, const c
42490 68 61 72 20 2a 7a 53 51 4c 29 3b 0d 0a 0d 0a 2f har *zSQL);..../
424a0 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 *..** CAPI3REF:
424b0 4f 76 65 72 6c 6f 61 64 20 41 20 46 75 6e 63 74 Overload A Funct
424c0 69 6f 6e 20 46 6f 72 20 41 20 56 69 72 74 75 61 ion For A Virtua
424d0 6c 20 54 61 62 6c 65 0d 0a 2a 2a 0d 0a 2a 2a 20 l Table..**..**
424e0 5e 28 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 ^(Virtual tables
424f0 20 63 61 6e 20 70 72 6f 76 69 64 65 20 61 6c 74 can provide alt
42500 65 72 6e 61 74 69 76 65 20 69 6d 70 6c 65 6d 65 ernative impleme
42510 6e 74 61 74 69 6f 6e 73 20 6f 66 20 66 75 6e 63 ntations of func
42520 74 69 6f 6e 73 0d 0a 2a 2a 20 75 73 69 6e 67 20 tions..** using
42530 74 68 65 20 5b 78 46 69 6e 64 46 75 6e 63 74 69 the [xFindFuncti
42540 6f 6e 5d 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 on] method of th
42550 65 20 5b 76 69 72 74 75 61 6c 20 74 61 62 6c 65 e [virtual table
42560 20 6d 6f 64 75 6c 65 5d 2e 20 20 0d 0a 2a 2a 20 module]. ..**
42570 42 75 74 20 67 6c 6f 62 61 6c 20 76 65 72 73 69 But global versi
42580 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 66 75 6e ons of those fun
42590 63 74 69 6f 6e 73 0d 0a 2a 2a 20 6d 75 73 74 20 ctions..** must
425a0 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 exist in order t
425b0 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64 65 64 2e o be overloaded.
425c0 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 69 )^..**..** ^(Thi
425d0 73 20 41 50 49 20 6d 61 6b 65 73 20 73 75 72 65 s API makes sure
425e0 20 61 20 67 6c 6f 62 61 6c 20 76 65 72 73 69 6f a global versio
425f0 6e 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 20 n of a function
42600 77 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 with a particula
42610 72 0d 0a 2a 2a 20 6e 61 6d 65 20 61 6e 64 20 6e r..** name and n
42620 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 umber of paramet
42630 65 72 73 20 65 78 69 73 74 73 2e 20 20 49 66 20 ers exists. If
42640 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e no such function
42650 20 65 78 69 73 74 73 0d 0a 2a 2a 20 62 65 66 6f exists..** befo
42660 72 65 20 74 68 69 73 20 41 50 49 20 69 73 20 63 re this API is c
42670 61 6c 6c 65 64 2c 20 61 20 6e 65 77 20 66 75 6e alled, a new fun
42680 63 74 69 6f 6e 20 69 73 20 63 72 65 61 74 65 64 ction is created
42690 2e 29 5e 20 20 5e 54 68 65 20 69 6d 70 6c 65 6d .)^ ^The implem
426a0 65 6e 74 61 74 69 6f 6e 0d 0a 2a 2a 20 6f 66 20 entation..** of
426b0 74 68 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e the new function
426c0 20 61 6c 77 61 79 73 20 63 61 75 73 65 73 20 61 always causes a
426d0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 62 n exception to b
426e0 65 20 74 68 72 6f 77 6e 2e 20 20 53 6f 0d 0a 2a e thrown. So..*
426f0 2a 20 74 68 65 20 6e 65 77 20 66 75 6e 63 74 69 * the new functi
42700 6f 6e 20 69 73 20 6e 6f 74 20 67 6f 6f 64 20 66 on is not good f
42710 6f 72 20 61 6e 79 74 68 69 6e 67 20 62 79 20 69 or anything by i
42720 74 73 65 6c 66 2e 20 20 49 74 73 20 6f 6e 6c 79 tself. Its only
42730 0d 0a 2a 2a 20 70 75 72 70 6f 73 65 20 69 73 20 ..** purpose is
42740 74 6f 20 62 65 20 61 20 70 6c 61 63 65 68 6f 6c to be a placehol
42750 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 der function tha
42760 74 20 63 61 6e 20 62 65 20 6f 76 65 72 6c 6f 61 t can be overloa
42770 64 65 64 0d 0a 2a 2a 20 62 79 20 61 20 5b 76 69 ded..** by a [vi
42780 72 74 75 61 6c 20 74 61 62 6c 65 5d 2e 0d 0a 2a rtual table]...*
42790 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
427a0 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f t sqlite3_overlo
427b0 61 64 5f 66 75 6e 63 74 69 6f 6e 28 73 71 6c 69 ad_function(sqli
427c0 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 te3*, const char
427d0 20 2a 7a 46 75 6e 63 4e 61 6d 65 2c 20 69 6e 74 *zFuncName, int
427e0 20 6e 41 72 67 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a nArg);..../*..*
427f0 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 * The interface
42800 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 to the virtual-t
42810 61 62 6c 65 20 6d 65 63 68 61 6e 69 73 6d 20 64 able mechanism d
42820 65 66 69 6e 65 64 20 61 62 6f 76 65 20 28 62 61 efined above (ba
42830 63 6b 20 75 70 0d 0a 2a 2a 20 74 6f 20 61 20 63 ck up..** to a c
42840 6f 6d 6d 65 6e 74 20 72 65 6d 61 72 6b 61 62 6c omment remarkabl
42850 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 y similar to thi
42860 73 20 6f 6e 65 29 20 69 73 20 63 75 72 72 65 6e s one) is curren
42870 74 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 0d 0a tly considered..
42880 2a 2a 20 74 6f 20 62 65 20 65 78 70 65 72 69 6d ** to be experim
42890 65 6e 74 61 6c 2e 20 20 54 68 65 20 69 6e 74 65 ental. The inte
428a0 72 66 61 63 65 20 6d 69 67 68 74 20 63 68 61 6e rface might chan
428b0 67 65 20 69 6e 20 69 6e 63 6f 6d 70 61 74 69 62 ge in incompatib
428c0 6c 65 20 77 61 79 73 2e 0d 0a 2a 2a 20 49 66 20 le ways...** If
428d0 74 68 69 73 20 69 73 20 61 20 70 72 6f 62 6c 65 this is a proble
428e0 6d 20 66 6f 72 20 79 6f 75 2c 20 64 6f 20 6e 6f m for you, do no
428f0 74 20 75 73 65 20 74 68 65 20 69 6e 74 65 72 66 t use the interf
42900 61 63 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 ace at this time
42910 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 ...**..** When t
42920 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 he virtual-table
42930 20 6d 65 63 68 61 6e 69 73 6d 20 73 74 61 62 69 mechanism stabi
42940 6c 69 7a 65 73 2c 20 77 65 20 77 69 6c 6c 20 64 lizes, we will d
42950 65 63 6c 61 72 65 20 74 68 65 0d 0a 2a 2a 20 69 eclare the..** i
42960 6e 74 65 72 66 61 63 65 20 66 69 78 65 64 2c 20 nterface fixed,
42970 73 75 70 70 6f 72 74 20 69 74 20 69 6e 64 65 66 support it indef
42980 69 6e 69 74 65 6c 79 2c 20 61 6e 64 20 72 65 6d initely, and rem
42990 6f 76 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 ove this comment
429a0 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ...*/..../*..**
429b0 43 41 50 49 33 52 45 46 3a 20 41 20 48 61 6e 64 CAPI3REF: A Hand
429c0 6c 65 20 54 6f 20 41 6e 20 4f 70 65 6e 20 42 4c le To An Open BL
429d0 4f 42 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a OB..** KEYWORDS:
429e0 20 7b 42 4c 4f 42 20 68 61 6e 64 6c 65 7d 20 7b {BLOB handle} {
429f0 42 4c 4f 42 20 68 61 6e 64 6c 65 73 7d 0d 0a 2a BLOB handles}..*
42a00 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 *..** An instanc
42a10 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 e of this object
42a20 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20 6f represents an o
42a30 70 65 6e 20 42 4c 4f 42 20 6f 6e 20 77 68 69 63 pen BLOB on whic
42a40 68 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 62 h..** [sqlite3_b
42a50 6c 6f 62 5f 6f 70 65 6e 20 7c 20 69 6e 63 72 65 lob_open | incre
42a60 6d 65 6e 74 61 6c 20 42 4c 4f 42 20 49 2f 4f 5d mental BLOB I/O]
42a70 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65 can be performe
42a80 64 2e 0d 0a 2a 2a 20 5e 4f 62 6a 65 63 74 73 20 d...** ^Objects
42a90 6f 66 20 74 68 69 73 20 74 79 70 65 20 61 72 65 of this type are
42aa0 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71 6c created by [sql
42ab0 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 ite3_blob_open()
42ac0 5d 0d 0a 2a 2a 20 61 6e 64 20 64 65 73 74 72 6f ]..** and destro
42ad0 79 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 5f yed by [sqlite3_
42ae0 62 6c 6f 62 5f 63 6c 6f 73 65 28 29 5d 2e 0d 0a blob_close()]...
42af0 2a 2a 20 5e 54 68 65 20 5b 73 71 6c 69 74 65 33 ** ^The [sqlite3
42b00 5f 62 6c 6f 62 5f 72 65 61 64 28 29 5d 20 61 6e _blob_read()] an
42b10 64 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f d [sqlite3_blob_
42b20 77 72 69 74 65 28 29 5d 20 69 6e 74 65 72 66 61 write()] interfa
42b30 63 65 73 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 75 ces..** can be u
42b40 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 77 sed to read or w
42b50 72 69 74 65 20 73 6d 61 6c 6c 20 73 75 62 73 65 rite small subse
42b60 63 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 4c ctions of the BL
42b70 4f 42 2e 0d 0a 2a 2a 20 5e 54 68 65 20 5b 73 71 OB...** ^The [sq
42b80 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 lite3_blob_bytes
42b90 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20 72 65 ()] interface re
42ba0 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f turns the size o
42bb0 66 20 74 68 65 20 42 4c 4f 42 20 69 6e 20 62 79 f the BLOB in by
42bc0 74 65 73 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 tes...*/..typede
42bd0 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 f struct sqlite3
42be0 5f 62 6c 6f 62 20 73 71 6c 69 74 65 33 5f 62 6c _blob sqlite3_bl
42bf0 6f 62 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 ob;..../*..** CA
42c00 50 49 33 52 45 46 3a 20 4f 70 65 6e 20 41 20 42 PI3REF: Open A B
42c10 4c 4f 42 20 46 6f 72 20 49 6e 63 72 65 6d 65 6e LOB For Incremen
42c20 74 61 6c 20 49 2f 4f 0d 0a 2a 2a 0d 0a 2a 2a 20 tal I/O..**..**
42c30 5e 28 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 ^(This interface
42c40 73 20 6f 70 65 6e 73 20 61 20 5b 42 4c 4f 42 20 s opens a [BLOB
42c50 68 61 6e 64 6c 65 20 7c 20 68 61 6e 64 6c 65 5d handle | handle]
42c60 20 74 6f 20 74 68 65 20 42 4c 4f 42 20 6c 6f 63 to the BLOB loc
42c70 61 74 65 64 0d 0a 2a 2a 20 69 6e 20 72 6f 77 20 ated..** in row
42c80 69 52 6f 77 2c 20 63 6f 6c 75 6d 6e 20 7a 43 6f iRow, column zCo
42c90 6c 75 6d 6e 2c 20 74 61 62 6c 65 20 7a 54 61 62 lumn, table zTab
42ca0 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 7a le in database z
42cb0 44 62 3b 0d 0a 2a 2a 20 69 6e 20 6f 74 68 65 72 Db;..** in other
42cc0 20 77 6f 72 64 73 2c 20 74 68 65 20 73 61 6d 65 words, the same
42cd0 20 42 4c 4f 42 20 74 68 61 74 20 77 6f 75 6c 64 BLOB that would
42ce0 20 62 65 20 73 65 6c 65 63 74 65 64 20 62 79 3a be selected by:
42cf0 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 70 72 65 3e 0d 0a ..**..** <pre>..
42d00 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 7a 43 ** SELECT zC
42d10 6f 6c 75 6d 6e 20 46 52 4f 4d 20 7a 44 62 2e 7a olumn FROM zDb.z
42d20 54 61 62 6c 65 20 57 48 45 52 45 20 5b 72 6f 77 Table WHERE [row
42d30 69 64 5d 20 3d 20 69 52 6f 77 3b 0d 0a 2a 2a 20 id] = iRow;..**
42d40 3c 2f 70 72 65 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a </pre>)^..**..**
42d50 20 5e 49 66 20 74 68 65 20 66 6c 61 67 73 20 70 ^If the flags p
42d60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d arameter is non-
42d70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 42 zero, then the B
42d80 4c 4f 42 20 69 73 20 6f 70 65 6e 65 64 20 66 6f LOB is opened fo
42d90 72 20 72 65 61 64 0d 0a 2a 2a 20 61 6e 64 20 77 r read..** and w
42da0 72 69 74 65 20 61 63 63 65 73 73 2e 20 5e 49 66 rite access. ^If
42db0 20 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 it is zero, the
42dc0 20 42 4c 4f 42 20 69 73 20 6f 70 65 6e 65 64 20 BLOB is opened
42dd0 66 6f 72 20 72 65 61 64 20 61 63 63 65 73 73 2e for read access.
42de0 0d 0a 2a 2a 20 5e 49 74 20 69 73 20 6e 6f 74 20 ..** ^It is not
42df0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e possible to open
42e00 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 a column that i
42e10 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 s part of an ind
42e20 65 78 20 6f 72 20 70 72 69 6d 61 72 79 20 0d 0a ex or primary ..
42e30 2a 2a 20 6b 65 79 20 66 6f 72 20 77 72 69 74 69 ** key for writi
42e40 6e 67 2e 20 5e 49 66 20 5b 66 6f 72 65 69 67 6e ng. ^If [foreign
42e50 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 key constraints
42e60 5d 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 69 ] are enabled, i
42e70 74 20 69 73 20 0d 0a 2a 2a 20 6e 6f 74 20 70 6f t is ..** not po
42e80 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 ssible to open a
42e90 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 column that is
42ea0 70 61 72 74 20 6f 66 20 61 20 5b 63 68 69 6c 64 part of a [child
42eb0 20 6b 65 79 5d 20 66 6f 72 20 77 72 69 74 69 6e key] for writin
42ec0 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 4e 6f 74 65 g...**..** ^Note
42ed0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 that the databa
42ee0 73 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 74 se name is not t
42ef0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 68 61 74 he filename that
42f00 20 63 6f 6e 74 61 69 6e 73 0d 0a 2a 2a 20 74 68 contains..** th
42f10 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 72 e database but r
42f20 61 74 68 65 72 20 74 68 65 20 73 79 6d 62 6f 6c ather the symbol
42f30 69 63 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 ic name of the d
42f40 61 74 61 62 61 73 65 20 74 68 61 74 0d 0a 2a 2a atabase that..**
42f50 20 61 70 70 65 61 72 73 20 61 66 74 65 72 20 74 appears after t
42f60 68 65 20 41 53 20 6b 65 79 77 6f 72 64 20 77 68 he AS keyword wh
42f70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 en the database
42f80 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 75 73 69 is connected usi
42f90 6e 67 20 5b 41 54 54 41 43 48 5d 2e 0d 0a 2a 2a ng [ATTACH]...**
42fa0 20 5e 46 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 ^For the main d
42fb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 atabase file, th
42fc0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 e database name
42fd0 69 73 20 22 6d 61 69 6e 22 2e 0d 0a 2a 2a 20 5e is "main"...** ^
42fe0 46 6f 72 20 54 45 4d 50 20 74 61 62 6c 65 73 2c For TEMP tables,
42ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 the database na
43000 6d 65 20 69 73 20 22 74 65 6d 70 22 2e 0d 0a 2a me is "temp"...*
43010 2a 0d 0a 2a 2a 20 5e 28 4f 6e 20 73 75 63 63 65 *..** ^(On succe
43020 73 73 2c 20 5b 53 51 4c 49 54 45 5f 4f 4b 5d 20 ss, [SQLITE_OK]
43030 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 is returned and
43040 74 68 65 20 6e 65 77 20 5b 42 4c 4f 42 20 68 61 the new [BLOB ha
43050 6e 64 6c 65 5d 20 69 73 20 77 72 69 74 74 65 6e ndle] is written
43060 0d 0a 2a 2a 20 74 6f 20 2a 70 70 42 6c 6f 62 2e ..** to *ppBlob.
43070 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 5b 65 Otherwise an [e
43080 72 72 6f 72 20 63 6f 64 65 5d 20 69 73 20 72 65 rror code] is re
43090 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 42 6c turned and *ppBl
430a0 6f 62 20 69 73 20 73 65 74 0d 0a 2a 2a 20 74 6f ob is set..** to
430b0 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 be a null point
430c0 65 72 2e 29 5e 0d 0a 2a 2a 20 5e 54 68 69 73 20 er.)^..** ^This
430d0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 function sets th
430e0 65 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e e [database conn
430f0 65 63 74 69 6f 6e 5d 20 65 72 72 6f 72 20 63 6f ection] error co
43100 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 0d 0a de and message..
43110 2a 2a 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 ** accessible vi
43120 61 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 63 6f a [sqlite3_errco
43130 64 65 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 de()] and [sqlit
43140 65 33 5f 65 72 72 6d 73 67 28 29 5d 20 61 6e 64 e3_errmsg()] and
43150 20 72 65 6c 61 74 65 64 0d 0a 2a 2a 20 66 75 6e related..** fun
43160 63 74 69 6f 6e 73 2e 20 5e 4e 6f 74 65 20 74 68 ctions. ^Note th
43170 61 74 20 74 68 65 20 2a 70 70 42 6c 6f 62 20 76 at the *ppBlob v
43180 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 ariable is alway
43190 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e s initialized in
431a0 20 61 0d 0a 2a 2a 20 77 61 79 20 74 68 61 74 20 a..** way that
431b0 6d 61 6b 65 73 20 69 74 20 73 61 66 65 20 74 6f makes it safe to
431c0 20 69 6e 76 6f 6b 65 20 5b 73 71 6c 69 74 65 33 invoke [sqlite3
431d0 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 29 5d 20 6f _blob_close()] o
431e0 6e 20 2a 70 70 42 6c 6f 62 0d 0a 2a 2a 20 72 65 n *ppBlob..** re
431f0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 gardless of the
43200 73 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 success or failu
43210 72 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 re of this routi
43220 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 49 66 ne...**..** ^(If
43230 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 61 20 the row that a
43240 42 4c 4f 42 20 68 61 6e 64 6c 65 20 70 6f 69 6e BLOB handle poin
43250 74 73 20 74 6f 20 69 73 20 6d 6f 64 69 66 69 65 ts to is modifie
43260 64 20 62 79 20 61 6e 0d 0a 2a 2a 20 5b 55 50 44 d by an..** [UPD
43270 41 54 45 5d 2c 20 5b 44 45 4c 45 54 45 5d 2c 20 ATE], [DELETE],
43280 6f 72 20 62 79 20 5b 4f 4e 20 43 4f 4e 46 4c 49 or by [ON CONFLI
43290 43 54 5d 20 73 69 64 65 2d 65 66 66 65 63 74 73 CT] side-effects
432a0 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 4c ..** then the BL
432b0 4f 42 20 68 61 6e 64 6c 65 20 69 73 20 6d 61 72 OB handle is mar
432c0 6b 65 64 20 61 73 20 22 65 78 70 69 72 65 64 22 ked as "expired"
432d0 2e 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 ...** This is tr
432e0 75 65 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e ue if any column
432f0 20 6f 66 20 74 68 65 20 72 6f 77 20 69 73 20 63 of the row is c
43300 68 61 6e 67 65 64 2c 20 65 76 65 6e 20 61 20 63 hanged, even a c
43310 6f 6c 75 6d 6e 0d 0a 2a 2a 20 6f 74 68 65 72 20 olumn..** other
43320 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 74 68 65 than the one the
43330 20 42 4c 4f 42 20 68 61 6e 64 6c 65 20 69 73 20 BLOB handle is
43340 6f 70 65 6e 20 6f 6e 2e 29 5e 0d 0a 2a 2a 20 5e open on.)^..** ^
43350 43 61 6c 6c 73 20 74 6f 20 5b 73 71 6c 69 74 65 Calls to [sqlite
43360 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 5d 20 61 3_blob_read()] a
43370 6e 64 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 nd [sqlite3_blob
43380 5f 77 72 69 74 65 28 29 5d 20 66 6f 72 0d 0a 2a _write()] for..*
43390 2a 20 61 6e 20 65 78 70 69 72 65 64 20 42 4c 4f * an expired BLO
433a0 42 20 68 61 6e 64 6c 65 20 66 61 69 6c 20 77 69 B handle fail wi
433b0 74 68 20 61 20 72 65 74 75 72 6e 20 63 6f 64 65 th a return code
433c0 20 6f 66 20 5b 53 51 4c 49 54 45 5f 41 42 4f 52 of [SQLITE_ABOR
433d0 54 5d 2e 0d 0a 2a 2a 20 5e 28 43 68 61 6e 67 65 T]...** ^(Change
433e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 s written into a
433f0 20 42 4c 4f 42 20 70 72 69 6f 72 20 74 6f 20 74 BLOB prior to t
43400 68 65 20 42 4c 4f 42 20 65 78 70 69 72 69 6e 67 he BLOB expiring
43410 20 61 72 65 20 6e 6f 74 0d 0a 2a 2a 20 72 6f 6c are not..** rol
43420 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 led back by the
43430 65 78 70 69 72 61 74 69 6f 6e 20 6f 66 20 74 68 expiration of th
43440 65 20 42 4c 4f 42 2e 20 20 53 75 63 68 20 63 68 e BLOB. Such ch
43450 61 6e 67 65 73 20 77 69 6c 6c 20 65 76 65 6e 74 anges will event
43460 75 61 6c 6c 79 0d 0a 2a 2a 20 63 6f 6d 6d 69 74 ually..** commit
43470 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 if the transact
43480 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f ion continues to
43490 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 29 5e 0d 0a completion.)^..
434a0 2a 2a 0d 0a 2a 2a 20 5e 55 73 65 20 74 68 65 20 **..** ^Use the
434b0 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 [sqlite3_blob_by
434c0 74 65 73 28 29 5d 20 69 6e 74 65 72 66 61 63 65 tes()] interface
434d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 to determine th
434e0 65 20 73 69 7a 65 20 6f 66 0d 0a 2a 2a 20 74 68 e size of..** th
434f0 65 20 6f 70 65 6e 65 64 20 62 6c 6f 62 2e 20 20 e opened blob.
43500 5e 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 62 ^The size of a b
43510 6c 6f 62 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 lob may not be c
43520 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 0d 0a hanged by this..
43530 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 55 ** interface. U
43540 73 65 20 74 68 65 20 5b 55 50 44 41 54 45 5d 20 se the [UPDATE]
43550 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 SQL command to c
43560 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f hange the size o
43570 66 20 61 0d 0a 2a 2a 20 62 6c 6f 62 2e 0d 0a 2a f a..** blob...*
43580 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b 73 71 6c 69 *..** ^The [sqli
43590 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f te3_bind_zeroblo
435a0 62 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 b()] and [sqlite
435b0 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 3_result_zeroblo
435c0 62 28 29 5d 20 69 6e 74 65 72 66 61 63 65 73 0d b()] interfaces.
435d0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 62 75 69 6c .** and the buil
435e0 74 2d 69 6e 20 5b 7a 65 72 6f 62 6c 6f 62 5d 20 t-in [zeroblob]
435f0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e SQL function can
43600 20 62 65 20 75 73 65 64 2c 20 69 66 20 64 65 73 be used, if des
43610 69 72 65 64 2c 0d 0a 2a 2a 20 74 6f 20 63 72 65 ired,..** to cre
43620 61 74 65 20 61 6e 20 65 6d 70 74 79 2c 20 7a 65 ate an empty, ze
43630 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 69 ro-filled blob i
43640 6e 20 77 68 69 63 68 20 74 6f 20 72 65 61 64 20 n which to read
43650 6f 72 20 77 72 69 74 65 20 75 73 69 6e 67 0d 0a or write using..
43660 2a 2a 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 ** this interfac
43670 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 6f 20 61 76 e...**..** To av
43680 6f 69 64 20 61 20 72 65 73 6f 75 72 63 65 20 6c oid a resource l
43690 65 61 6b 2c 20 65 76 65 72 79 20 6f 70 65 6e 20 eak, every open
436a0 5b 42 4c 4f 42 20 68 61 6e 64 6c 65 5d 20 73 68 [BLOB handle] sh
436b0 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 0d ould eventually.
436c0 0a 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 20 .** be released
436d0 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 5b 73 71 by a call to [sq
436e0 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 lite3_blob_close
436f0 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ()]...*/..SQLITE
43700 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
43710 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0d 0a 20 20 73 _blob_open(.. s
43720 71 6c 69 74 65 33 2a 2c 0d 0a 20 20 63 6f 6e 73 qlite3*,.. cons
43730 74 20 63 68 61 72 20 2a 7a 44 62 2c 0d 0a 20 20 t char *zDb,..
43740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 const char *zTab
43750 6c 65 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 le,.. const cha
43760 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 0d 0a 20 20 73 r *zColumn,.. s
43770 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f qlite3_int64 iRo
43780 77 2c 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c w,.. int flags,
43790 0d 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 .. sqlite3_blob
437a0 20 2a 2a 70 70 42 6c 6f 62 0d 0a 29 3b 0d 0a 0d **ppBlob..);...
437b0 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
437c0 3a 20 4d 6f 76 65 20 61 20 42 4c 4f 42 20 48 61 : Move a BLOB Ha
437d0 6e 64 6c 65 20 74 6f 20 61 20 4e 65 77 20 52 6f ndle to a New Ro
437e0 77 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 20 w..**..** ^This
437f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
43800 20 74 6f 20 6d 6f 76 65 20 61 6e 20 65 78 69 73 to move an exis
43810 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e 64 6c 65 ting blob handle
43820 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e so that it poin
43830 74 73 0d 0a 2a 2a 20 74 6f 20 61 20 64 69 66 66 ts..** to a diff
43840 65 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 erent row of the
43850 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 74 same database t
43860 61 62 6c 65 2e 20 5e 54 68 65 20 6e 65 77 20 72 able. ^The new r
43870 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 ow is identified
43880 0d 0a 2a 2a 20 62 79 20 74 68 65 20 72 6f 77 69 ..** by the rowi
43890 64 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 d value passed a
438a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 s the second arg
438b0 75 6d 65 6e 74 2e 20 4f 6e 6c 79 20 74 68 65 20 ument. Only the
438c0 72 6f 77 20 63 61 6e 20 62 65 0d 0a 2a 2a 20 63 row can be..** c
438d0 68 61 6e 67 65 64 2e 20 5e 54 68 65 20 64 61 74 hanged. ^The dat
438e0 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 abase, table and
438f0 20 63 6f 6c 75 6d 6e 20 6f 6e 20 77 68 69 63 68 column on which
43900 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 the blob handle
43910 20 69 73 20 6f 70 65 6e 0d 0a 2a 2a 20 72 65 6d is open..** rem
43920 61 69 6e 20 74 68 65 20 73 61 6d 65 2e 20 4d 6f ain the same. Mo
43930 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 ving an existing
43940 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 74 6f 20 blob handle to
43950 61 20 6e 65 77 20 72 6f 77 20 63 61 6e 20 62 65 a new row can be
43960 0d 0a 2a 2a 20 66 61 73 74 65 72 20 74 68 61 6e ..** faster than
43970 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 65 78 69 closing the exi
43980 73 74 69 6e 67 20 68 61 6e 64 6c 65 20 61 6e 64 sting handle and
43990 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 6f opening a new o
439a0 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 ne...**..** ^(Th
439b0 65 20 6e 65 77 20 72 6f 77 20 6d 75 73 74 20 6d e new row must m
439c0 65 65 74 20 74 68 65 20 73 61 6d 65 20 63 72 69 eet the same cri
439d0 74 65 72 69 61 20 61 73 20 66 6f 72 20 5b 73 71 teria as for [sq
439e0 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 lite3_blob_open(
439f0 29 5d 20 2d 0d 0a 2a 2a 20 69 74 20 6d 75 73 74 )] -..** it must
43a00 20 65 78 69 73 74 20 61 6e 64 20 74 68 65 72 65 exist and there
43a10 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
43a20 61 20 62 6c 6f 62 20 6f 72 20 74 65 78 74 20 76 a blob or text v
43a30 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0d 0a alue stored in..
43a40 2a 2a 20 74 68 65 20 6e 6f 6d 69 6e 61 74 65 64 ** the nominated
43a50 20 63 6f 6c 75 6d 6e 2e 29 5e 20 5e 49 66 20 74 column.)^ ^If t
43a60 68 65 20 6e 65 77 20 72 6f 77 20 69 73 20 6e 6f he new row is no
43a70 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 t present in the
43a80 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0d 0a 2a table, or if..*
43a90 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f * it does not co
43aa0 6e 74 61 69 6e 20 61 20 62 6c 6f 62 20 6f 72 20 ntain a blob or
43ab0 74 65 78 74 20 76 61 6c 75 65 2c 20 6f 72 20 69 text value, or i
43ac0 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 f another error
43ad0 6f 63 63 75 72 73 2c 20 61 6e 0d 0a 2a 2a 20 53 occurs, an..** S
43ae0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 QLite error code
43af0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 is returned and
43b00 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 the blob handle
43b10 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 is considered a
43b20 62 6f 72 74 65 64 2e 0d 0a 2a 2a 20 5e 41 6c 6c borted...** ^All
43b30 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c subsequent call
43b40 73 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 62 6c s to [sqlite3_bl
43b50 6f 62 5f 72 65 61 64 28 29 5d 2c 20 5b 73 71 6c ob_read()], [sql
43b60 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 ite3_blob_write(
43b70 29 5d 20 6f 72 0d 0a 2a 2a 20 5b 73 71 6c 69 74 )] or..** [sqlit
43b80 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 e3_blob_reopen()
43b90 5d 20 6f 6e 20 61 6e 20 61 62 6f 72 74 65 64 20 ] on an aborted
43ba0 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 6d 6d 65 blob handle imme
43bb0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 0d 0a diately return..
43bc0 2a 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e ** SQLITE_ABORT.
43bd0 20 5e 43 61 6c 6c 69 6e 67 20 5b 73 71 6c 69 74 ^Calling [sqlit
43be0 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 29 5d e3_blob_bytes()]
43bf0 20 6f 6e 20 61 6e 20 61 62 6f 72 74 65 64 20 62 on an aborted b
43c00 6c 6f 62 20 68 61 6e 64 6c 65 0d 0a 2a 2a 20 61 lob handle..** a
43c10 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 7a 65 lways returns ze
43c20 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 ro...**..** ^Thi
43c30 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 s function sets
43c40 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e the database han
43c50 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 dle error code a
43c60 6e 64 20 6d 65 73 73 61 67 65 2e 0d 0a 2a 2f 0d nd message...*/.
43c70 0a 53 51 4c 49 54 45 5f 41 50 49 20 53 51 4c 49 .SQLITE_API SQLI
43c80 54 45 5f 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 TE_EXPERIMENTAL
43c90 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 int sqlite3_blob
43ca0 5f 72 65 6f 70 65 6e 28 73 71 6c 69 74 65 33 5f _reopen(sqlite3_
43cb0 62 6c 6f 62 20 2a 2c 20 73 71 6c 69 74 65 33 5f blob *, sqlite3_
43cc0 69 6e 74 36 34 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a int64);..../*..*
43cd0 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6c 6f 73 * CAPI3REF: Clos
43ce0 65 20 41 20 42 4c 4f 42 20 48 61 6e 64 6c 65 0d e A BLOB Handle.
43cf0 0a 2a 2a 0d 0a 2a 2a 20 5e 43 6c 6f 73 65 73 20 .**..** ^Closes
43d00 61 6e 20 6f 70 65 6e 20 5b 42 4c 4f 42 20 68 61 an open [BLOB ha
43d10 6e 64 6c 65 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ndle]...**..** ^
43d20 43 6c 6f 73 69 6e 67 20 61 20 42 4c 4f 42 20 73 Closing a BLOB s
43d30 68 61 6c 6c 20 63 61 75 73 65 20 74 68 65 20 63 hall cause the c
43d40 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 urrent transacti
43d50 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 0d 0a 2a 2a on to commit..**
43d60 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f if there are no
43d70 20 6f 74 68 65 72 20 42 4c 4f 42 73 2c 20 6e 6f other BLOBs, no
43d80 20 70 65 6e 64 69 6e 67 20 70 72 65 70 61 72 65 pending prepare
43d90 64 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e d statements, an
43da0 64 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 d the..** databa
43db0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 se connection is
43dc0 20 69 6e 20 5b 61 75 74 6f 63 6f 6d 6d 69 74 20 in [autocommit
43dd0 6d 6f 64 65 5d 2e 0d 0a 2a 2a 20 5e 49 66 20 61 mode]...** ^If a
43de0 6e 79 20 77 72 69 74 65 73 20 77 65 72 65 20 6d ny writes were m
43df0 61 64 65 20 74 6f 20 74 68 65 20 42 4c 4f 42 2c ade to the BLOB,
43e00 20 74 68 65 79 20 6d 69 67 68 74 20 62 65 20 68 they might be h
43e10 65 6c 64 20 69 6e 20 63 61 63 68 65 0d 0a 2a 2a eld in cache..**
43e20 20 75 6e 74 69 6c 20 74 68 65 20 63 6c 6f 73 65 until the close
43e30 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74 68 operation if th
43e40 65 79 20 77 69 6c 6c 20 66 69 74 2e 0d 0a 2a 2a ey will fit...**
43e50 0d 0a 2a 2a 20 5e 28 43 6c 6f 73 69 6e 67 20 74 ..** ^(Closing t
43e60 68 65 20 42 4c 4f 42 20 6f 66 74 65 6e 20 66 6f he BLOB often fo
43e70 72 63 65 73 20 74 68 65 20 63 68 61 6e 67 65 73 rces the changes
43e80 0d 0a 2a 2a 20 6f 75 74 20 74 6f 20 64 69 73 6b ..** out to disk
43e90 20 61 6e 64 20 73 6f 20 69 66 20 61 6e 79 20 49 and so if any I
43ea0 2f 4f 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c /O errors occur,
43eb0 20 74 68 65 79 20 77 69 6c 6c 20 6c 69 6b 65 6c they will likel
43ec0 79 20 6f 63 63 75 72 0d 0a 2a 2a 20 61 74 20 74 y occur..** at t
43ed0 68 65 20 74 69 6d 65 20 77 68 65 6e 20 74 68 65 he time when the
43ee0 20 42 4c 4f 42 20 69 73 20 63 6c 6f 73 65 64 2e BLOB is closed.
43ef0 20 20 41 6e 79 20 65 72 72 6f 72 73 20 74 68 61 Any errors tha
43f00 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67 0d 0a t occur during..
43f10 2a 2a 20 63 6c 6f 73 69 6e 67 20 61 72 65 20 72 ** closing are r
43f20 65 70 6f 72 74 65 64 20 61 73 20 61 20 6e 6f 6e eported as a non
43f30 2d 7a 65 72 6f 20 72 65 74 75 72 6e 20 76 61 6c -zero return val
43f40 75 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 ue.)^..**..** ^(
43f50 54 68 65 20 42 4c 4f 42 20 69 73 20 63 6c 6f 73 The BLOB is clos
43f60 65 64 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c ed unconditional
43f70 6c 79 2e 20 20 45 76 65 6e 20 69 66 20 74 68 69 ly. Even if thi
43f80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e s routine return
43f90 73 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 s..** an error c
43fa0 6f 64 65 2c 20 74 68 65 20 42 4c 4f 42 20 69 73 ode, the BLOB is
43fb0 20 73 74 69 6c 6c 20 63 6c 6f 73 65 64 2e 29 5e still closed.)^
43fc0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 43 61 6c 6c 69 6e ..**..** ^Callin
43fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 g this routine w
43fe0 69 74 68 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 ith a null point
43ff0 65 72 20 28 73 75 63 68 20 61 73 20 77 6f 75 6c er (such as woul
44000 64 20 62 65 20 72 65 74 75 72 6e 65 64 0d 0a 2a d be returned..*
44010 2a 20 62 79 20 61 20 66 61 69 6c 65 64 20 63 61 * by a failed ca
44020 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 62 ll to [sqlite3_b
44030 6c 6f 62 5f 6f 70 65 6e 28 29 5d 29 20 69 73 20 lob_open()]) is
44040 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 a harmless no-op
44050 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
44060 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c I int sqlite3_bl
44070 6f 62 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 ob_close(sqlite3
44080 5f 62 6c 6f 62 20 2a 29 3b 0d 0a 0d 0a 2f 2a 0d _blob *);..../*.
44090 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 52 65 .** CAPI3REF: Re
440a0 74 75 72 6e 20 54 68 65 20 53 69 7a 65 20 4f 66 turn The Size Of
440b0 20 41 6e 20 4f 70 65 6e 20 42 4c 4f 42 0d 0a 2a An Open BLOB..*
440c0 2a 0d 0a 2a 2a 20 5e 52 65 74 75 72 6e 73 20 74 *..** ^Returns t
440d0 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 he size in bytes
440e0 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 61 63 63 of the BLOB acc
440f0 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 essible via the
44100 0d 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c ..** successfull
44110 79 20 6f 70 65 6e 65 64 20 5b 42 4c 4f 42 20 68 y opened [BLOB h
44120 61 6e 64 6c 65 5d 20 69 6e 20 69 74 73 20 6f 6e andle] in its on
44130 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 20 5e 54 ly argument. ^T
44140 68 65 0d 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 he..** increment
44150 61 6c 20 62 6c 6f 62 20 49 2f 4f 20 72 6f 75 74 al blob I/O rout
44160 69 6e 65 73 20 63 61 6e 20 6f 6e 6c 79 20 72 65 ines can only re
44170 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 69 6e ad or overwritin
44180 67 20 65 78 69 73 74 69 6e 67 0d 0a 2a 2a 20 62 g existing..** b
44190 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 20 74 68 65 lob content; the
441a0 79 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 y cannot change
441b0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 62 6c the size of a bl
441c0 6f 62 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 ob...**..** This
441d0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 77 6f routine only wo
441e0 72 6b 73 20 6f 6e 20 61 20 5b 42 4c 4f 42 20 68 rks on a [BLOB h
441f0 61 6e 64 6c 65 5d 20 77 68 69 63 68 20 68 61 73 andle] which has
44200 20 62 65 65 6e 20 63 72 65 61 74 65 64 0d 0a 2a been created..*
44210 2a 20 62 79 20 61 20 70 72 69 6f 72 20 73 75 63 * by a prior suc
44220 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 cessful call to
44230 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 [sqlite3_blob_op
44240 65 6e 28 29 5d 20 61 6e 64 20 77 68 69 63 68 20 en()] and which
44250 68 61 73 20 6e 6f 74 0d 0a 2a 2a 20 62 65 65 6e has not..** been
44260 20 63 6c 6f 73 65 64 20 62 79 20 5b 73 71 6c 69 closed by [sqli
44270 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 29 te3_blob_close()
44280 5d 2e 20 20 50 61 73 73 69 6e 67 20 61 6e 79 20 ]. Passing any
44290 6f 74 68 65 72 20 70 6f 69 6e 74 65 72 20 69 6e other pointer in
442a0 0d 0a 2a 2a 20 74 6f 20 74 68 69 73 20 72 6f 75 ..** to this rou
442b0 74 69 6e 65 20 72 65 73 75 6c 74 73 20 69 6e 20 tine results in
442c0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 70 72 undefined and pr
442d0 6f 62 61 62 6c 79 20 75 6e 64 65 73 69 72 61 62 obably undesirab
442e0 6c 65 20 62 65 68 61 76 69 6f 72 2e 0d 0a 2a 2f le behavior...*/
442f0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
44300 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 sqlite3_blob_by
44310 74 65 73 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 tes(sqlite3_blob
44320 20 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 *);..../*..** C
44330 41 50 49 33 52 45 46 3a 20 52 65 61 64 20 44 61 API3REF: Read Da
44340 74 61 20 46 72 6f 6d 20 41 20 42 4c 4f 42 20 49 ta From A BLOB I
44350 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 0d 0a 2a 2a ncrementally..**
44360 0d 0a 2a 2a 20 5e 28 54 68 69 73 20 66 75 6e 63 ..** ^(This func
44370 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 tion is used to
44380 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 read data from a
44390 6e 20 6f 70 65 6e 20 5b 42 4c 4f 42 20 68 61 6e n open [BLOB han
443a0 64 6c 65 5d 20 69 6e 74 6f 20 61 0d 0a 2a 2a 20 dle] into a..**
443b0 63 61 6c 6c 65 72 2d 73 75 70 70 6c 69 65 64 20 caller-supplied
443c0 62 75 66 66 65 72 2e 20 4e 20 62 79 74 65 73 20 buffer. N bytes
443d0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 of data are copi
443e0 65 64 20 69 6e 74 6f 20 62 75 66 66 65 72 20 5a ed into buffer Z
443f0 0d 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6f 70 ..** from the op
44400 65 6e 20 42 4c 4f 42 2c 20 73 74 61 72 74 69 6e en BLOB, startin
44410 67 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 g at offset iOff
44420 73 65 74 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e set.)^..**..** ^
44430 49 66 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 If offset iOffse
44440 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 4e t is less than N
44450 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 bytes from the
44460 65 6e 64 20 6f 66 20 74 68 65 20 42 4c 4f 42 2c end of the BLOB,
44470 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 45 52 52 ..** [SQLITE_ERR
44480 4f 52 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 OR] is returned
44490 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 72 and no data is r
444a0 65 61 64 2e 20 20 5e 49 66 20 4e 20 6f 72 20 69 ead. ^If N or i
444b0 4f 66 66 73 65 74 20 69 73 0d 0a 2a 2a 20 6c 65 Offset is..** le
444c0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 5b 53 ss than zero, [S
444d0 51 4c 49 54 45 5f 45 52 52 4f 52 5d 20 69 73 20 QLITE_ERROR] is
444e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 returned and no
444f0 64 61 74 61 20 69 73 20 72 65 61 64 2e 0d 0a 2a data is read...*
44500 2a 20 5e 54 68 65 20 73 69 7a 65 20 6f 66 20 74 * ^The size of t
44510 68 65 20 62 6c 6f 62 20 28 61 6e 64 20 68 65 6e he blob (and hen
44520 63 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 ce the maximum v
44530 61 6c 75 65 20 6f 66 20 4e 2b 69 4f 66 66 73 65 alue of N+iOffse
44540 74 29 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 64 65 t)..** can be de
44550 74 65 72 6d 69 6e 65 64 20 75 73 69 6e 67 20 74 termined using t
44560 68 65 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 he [sqlite3_blob
44570 5f 62 79 74 65 73 28 29 5d 20 69 6e 74 65 72 66 _bytes()] interf
44580 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 41 6e ace...**..** ^An
44590 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 attempt to read
445a0 20 66 72 6f 6d 20 61 6e 20 65 78 70 69 72 65 64 from an expired
445b0 20 5b 42 4c 4f 42 20 68 61 6e 64 6c 65 5d 20 66 [BLOB handle] f
445c0 61 69 6c 73 20 77 69 74 68 20 61 6e 0d 0a 2a 2a ails with an..**
445d0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20 5b error code of [
445e0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5d 2e 0d 0a SQLITE_ABORT]...
445f0 2a 2a 0d 0a 2a 2a 20 5e 28 4f 6e 20 73 75 63 63 **..** ^(On succ
44600 65 73 73 2c 20 73 71 6c 69 74 65 33 5f 62 6c 6f ess, sqlite3_blo
44610 62 5f 72 65 61 64 28 29 20 72 65 74 75 72 6e 73 b_read() returns
44620 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2a 20 SQLITE_OK...**
44630 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 5b 65 Otherwise, an [e
44640 72 72 6f 72 20 63 6f 64 65 5d 20 6f 72 20 61 6e rror code] or an
44650 20 5b 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 [extended error
44660 20 63 6f 64 65 5d 20 69 73 20 72 65 74 75 72 6e code] is return
44670 65 64 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 ed.)^..**..** Th
44680 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 is routine only
44690 77 6f 72 6b 73 20 6f 6e 20 61 20 5b 42 4c 4f 42 works on a [BLOB
446a0 20 68 61 6e 64 6c 65 5d 20 77 68 69 63 68 20 68 handle] which h
446b0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 0d as been created.
446c0 0a 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20 73 .** by a prior s
446d0 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 uccessful call t
446e0 6f 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f o [sqlite3_blob_
446f0 6f 70 65 6e 28 29 5d 20 61 6e 64 20 77 68 69 63 open()] and whic
44700 68 20 68 61 73 20 6e 6f 74 0d 0a 2a 2a 20 62 65 h has not..** be
44710 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 5b 73 71 en closed by [sq
44720 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 lite3_blob_close
44730 28 29 5d 2e 20 20 50 61 73 73 69 6e 67 20 61 6e ()]. Passing an
44740 79 20 6f 74 68 65 72 20 70 6f 69 6e 74 65 72 20 y other pointer
44750 69 6e 0d 0a 2a 2a 20 74 6f 20 74 68 69 73 20 72 in..** to this r
44760 6f 75 74 69 6e 65 20 72 65 73 75 6c 74 73 20 69 outine results i
44770 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 n undefined and
44780 70 72 6f 62 61 62 6c 79 20 75 6e 64 65 73 69 72 probably undesir
44790 61 62 6c 65 20 62 65 68 61 76 69 6f 72 2e 0d 0a able behavior...
447a0 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a **..** See also:
447b0 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 [sqlite3_blob_w
447c0 72 69 74 65 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 rite()]...*/..SQ
447d0 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
447e0 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 73 ite3_blob_read(s
447f0 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2c 20 76 qlite3_blob *, v
44800 6f 69 64 20 2a 5a 2c 20 69 6e 74 20 4e 2c 20 69 oid *Z, int N, i
44810 6e 74 20 69 4f 66 66 73 65 74 29 3b 0d 0a 0d 0a nt iOffset);....
44820 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
44830 20 57 72 69 74 65 20 44 61 74 61 20 49 6e 74 6f Write Data Into
44840 20 41 20 42 4c 4f 42 20 49 6e 63 72 65 6d 65 6e A BLOB Incremen
44850 74 61 6c 6c 79 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 tally..**..** ^T
44860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
44870 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 64 61 used to write da
44880 74 61 20 69 6e 74 6f 20 61 6e 20 6f 70 65 6e 20 ta into an open
44890 5b 42 4c 4f 42 20 68 61 6e 64 6c 65 5d 20 66 72 [BLOB handle] fr
448a0 6f 6d 20 61 0d 0a 2a 2a 20 63 61 6c 6c 65 72 2d om a..** caller-
448b0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2e supplied buffer.
448c0 20 5e 4e 20 62 79 74 65 73 20 6f 66 20 64 61 74 ^N bytes of dat
448d0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f a are copied fro
448e0 6d 20 74 68 65 20 62 75 66 66 65 72 20 5a 0d 0a m the buffer Z..
448f0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 70 65 6e ** into the open
44900 20 42 4c 4f 42 2c 20 73 74 61 72 74 69 6e 67 20 BLOB, starting
44910 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 at offset iOffse
44920 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 74 t...**..** ^If t
44930 68 65 20 5b 42 4c 4f 42 20 68 61 6e 64 6c 65 5d he [BLOB handle]
44940 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
44950 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 61 irst argument wa
44960 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 66 6f 72 s not opened for
44970 0d 0a 2a 2a 20 77 72 69 74 69 6e 67 20 28 74 68 ..** writing (th
44980 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 e flags paramete
44990 72 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 62 6c r to [sqlite3_bl
449a0 6f 62 5f 6f 70 65 6e 28 29 5d 20 77 61 73 20 7a ob_open()] was z
449b0 65 72 6f 29 2c 0d 0a 2a 2a 20 74 68 69 73 20 66 ero),..** this f
449c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
449d0 5b 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 [SQLITE_READONLY
449e0 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 73 ]...**..** ^This
449f0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e function may on
44a00 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f ly modify the co
44a10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 42 4c ntents of the BL
44a20 4f 42 3b 20 69 74 20 69 73 0d 0a 2a 2a 20 6e 6f OB; it is..** no
44a30 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e t possible to in
44a40 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 crease the size
44a50 6f 66 20 61 20 42 4c 4f 42 20 75 73 69 6e 67 20 of a BLOB using
44a60 74 68 69 73 20 41 50 49 2e 0d 0a 2a 2a 20 5e 49 this API...** ^I
44a70 66 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 f offset iOffset
44a80 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 is less than N
44a90 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 65 bytes from the e
44aa0 6e 64 20 6f 66 20 74 68 65 20 42 4c 4f 42 2c 0d nd of the BLOB,.
44ab0 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 45 52 52 4f .** [SQLITE_ERRO
44ac0 52 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 R] is returned a
44ad0 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 nd no data is wr
44ae0 69 74 74 65 6e 2e 20 20 5e 49 66 20 4e 20 69 73 itten. ^If N is
44af0 0d 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 7a ..** less than z
44b00 65 72 6f 20 5b 53 51 4c 49 54 45 5f 45 52 52 4f ero [SQLITE_ERRO
44b10 52 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 R] is returned a
44b20 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 nd no data is wr
44b30 69 74 74 65 6e 2e 0d 0a 2a 2a 20 54 68 65 20 73 itten...** The s
44b40 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 ize of the BLOB
44b50 28 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 6d (and hence the m
44b60 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 aximum value of
44b70 4e 2b 69 4f 66 66 73 65 74 29 0d 0a 2a 2a 20 63 N+iOffset)..** c
44b80 61 6e 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 an be determined
44b90 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c 69 using the [sqli
44ba0 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 29 te3_blob_bytes()
44bb0 5d 20 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2a ] interface...**
44bc0 0d 0a 2a 2a 20 5e 41 6e 20 61 74 74 65 6d 70 74 ..** ^An attempt
44bd0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 61 6e 20 to write to an
44be0 65 78 70 69 72 65 64 20 5b 42 4c 4f 42 20 68 61 expired [BLOB ha
44bf0 6e 64 6c 65 5d 20 66 61 69 6c 73 20 77 69 74 68 ndle] fails with
44c00 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f 72 20 63 6f an..** error co
44c10 64 65 20 6f 66 20 5b 53 51 4c 49 54 45 5f 41 42 de of [SQLITE_AB
44c20 4f 52 54 5d 2e 20 20 5e 57 72 69 74 65 73 20 74 ORT]. ^Writes t
44c30 6f 20 74 68 65 20 42 4c 4f 42 20 74 68 61 74 20 o the BLOB that
44c40 6f 63 63 75 72 72 65 64 0d 0a 2a 2a 20 62 65 66 occurred..** bef
44c50 6f 72 65 20 74 68 65 20 5b 42 4c 4f 42 20 68 61 ore the [BLOB ha
44c60 6e 64 6c 65 5d 20 65 78 70 69 72 65 64 20 61 72 ndle] expired ar
44c70 65 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 e not rolled bac
44c80 6b 20 62 79 20 74 68 65 0d 0a 2a 2a 20 65 78 70 k by the..** exp
44c90 69 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 68 iration of the h
44ca0 61 6e 64 6c 65 2c 20 74 68 6f 75 67 68 20 6f 66 andle, though of
44cb0 20 63 6f 75 72 73 65 20 74 68 6f 73 65 20 63 68 course those ch
44cc0 61 6e 67 65 73 20 6d 69 67 68 74 0d 0a 2a 2a 20 anges might..**
44cd0 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72 77 72 have been overwr
44ce0 69 74 74 65 6e 20 62 79 20 74 68 65 20 73 74 61 itten by the sta
44cf0 74 65 6d 65 6e 74 20 74 68 61 74 20 65 78 70 69 tement that expi
44d00 72 65 64 20 74 68 65 20 42 4c 4f 42 20 68 61 6e red the BLOB han
44d10 64 6c 65 0d 0a 2a 2a 20 6f 72 20 62 79 20 6f 74 dle..** or by ot
44d20 68 65 72 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 her independent
44d30 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 2a 2a 0d statements...**.
44d40 0a 2a 2a 20 5e 28 4f 6e 20 73 75 63 63 65 73 73 .** ^(On success
44d50 2c 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 , sqlite3_blob_w
44d60 72 69 74 65 28 29 20 72 65 74 75 72 6e 73 20 53 rite() returns S
44d70 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2a 20 4f 74 QLITE_OK...** Ot
44d80 68 65 72 77 69 73 65 2c 20 61 6e 20 20 5b 65 72 herwise, an [er
44d90 72 6f 72 20 63 6f 64 65 5d 20 6f 72 20 61 6e 20 ror code] or an
44da0 5b 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 [extended error
44db0 63 6f 64 65 5d 20 69 73 20 72 65 74 75 72 6e 65 code] is returne
44dc0 64 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 d.)^..**..** Thi
44dd0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 77 s routine only w
44de0 6f 72 6b 73 20 6f 6e 20 61 20 5b 42 4c 4f 42 20 orks on a [BLOB
44df0 68 61 6e 64 6c 65 5d 20 77 68 69 63 68 20 68 61 handle] which ha
44e00 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 0d 0a s been created..
44e10 2a 2a 20 62 79 20 61 20 70 72 69 6f 72 20 73 75 ** by a prior su
44e20 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f ccessful call to
44e30 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f [sqlite3_blob_o
44e40 70 65 6e 28 29 5d 20 61 6e 64 20 77 68 69 63 68 pen()] and which
44e50 20 68 61 73 20 6e 6f 74 0d 0a 2a 2a 20 62 65 65 has not..** bee
44e60 6e 20 63 6c 6f 73 65 64 20 62 79 20 5b 73 71 6c n closed by [sql
44e70 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 ite3_blob_close(
44e80 29 5d 2e 20 20 50 61 73 73 69 6e 67 20 61 6e 79 )]. Passing any
44e90 20 6f 74 68 65 72 20 70 6f 69 6e 74 65 72 20 69 other pointer i
44ea0 6e 0d 0a 2a 2a 20 74 6f 20 74 68 69 73 20 72 6f n..** to this ro
44eb0 75 74 69 6e 65 20 72 65 73 75 6c 74 73 20 69 6e utine results in
44ec0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 70 undefined and p
44ed0 72 6f 62 61 62 6c 79 20 75 6e 64 65 73 69 72 61 robably undesira
44ee0 62 6c 65 20 62 65 68 61 76 69 6f 72 2e 0d 0a 2a ble behavior...*
44ef0 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 *..** See also:
44f00 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 [sqlite3_blob_re
44f10 61 64 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 ad()]...*/..SQLI
44f20 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
44f30 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 73 71 e3_blob_write(sq
44f40 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2c 20 63 6f lite3_blob *, co
44f50 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 20 69 6e 74 nst void *z, int
44f60 20 6e 2c 20 69 6e 74 20 69 4f 66 66 73 65 74 29 n, int iOffset)
44f70 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
44f80 33 52 45 46 3a 20 56 69 72 74 75 61 6c 20 46 69 3REF: Virtual Fi
44f90 6c 65 20 53 79 73 74 65 6d 20 4f 62 6a 65 63 74 le System Object
44fa0 73 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 76 69 72 74 s..**..** A virt
44fb0 75 61 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 28 ual filesystem (
44fc0 56 46 53 29 20 69 73 20 61 6e 20 5b 73 71 6c 69 VFS) is an [sqli
44fd0 74 65 33 5f 76 66 73 5d 20 6f 62 6a 65 63 74 0d te3_vfs] object.
44fe0 0a 2a 2a 20 74 68 61 74 20 53 51 4c 69 74 65 20 .** that SQLite
44ff0 75 73 65 73 20 74 6f 20 69 6e 74 65 72 61 63 74 uses to interact
45000 0d 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 75 6e ..** with the un
45010 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 derlying operati
45020 6e 67 20 73 79 73 74 65 6d 2e 20 20 4d 6f 73 74 ng system. Most
45030 20 53 51 4c 69 74 65 20 62 75 69 6c 64 73 20 63 SQLite builds c
45040 6f 6d 65 20 77 69 74 68 20 61 0d 0a 2a 2a 20 73 ome with a..** s
45050 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 56 46 ingle default VF
45060 53 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 S that is approp
45070 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 68 6f riate for the ho
45080 73 74 20 63 6f 6d 70 75 74 65 72 2e 0d 0a 2a 2a st computer...**
45090 20 4e 65 77 20 56 46 53 65 73 20 63 61 6e 20 62 New VFSes can b
450a0 65 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 e registered and
450b0 20 65 78 69 73 74 69 6e 67 20 56 46 53 65 73 20 existing VFSes
450c0 63 61 6e 20 62 65 20 75 6e 72 65 67 69 73 74 65 can be unregiste
450d0 72 65 64 2e 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c red...** The fol
450e0 6c 6f 77 69 6e 67 20 69 6e 74 65 72 66 61 63 65 lowing interface
450f0 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2e 0d s are provided..
45100 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c .**..** ^The sql
45110 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 29 20 ite3_vfs_find()
45120 69 6e 74 65 72 66 61 63 65 20 72 65 74 75 72 6e interface return
45130 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
45140 20 56 46 53 20 67 69 76 65 6e 20 69 74 73 20 6e VFS given its n
45150 61 6d 65 2e 0d 0a 2a 2a 20 5e 4e 61 6d 65 73 20 ame...** ^Names
45160 61 72 65 20 63 61 73 65 20 73 65 6e 73 69 74 69 are case sensiti
45170 76 65 2e 0d 0a 2a 2a 20 5e 4e 61 6d 65 73 20 61 ve...** ^Names a
45180 72 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 re zero-terminat
45190 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 ed UTF-8 strings
451a0 2e 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 72 65 20 ...** ^If there
451b0 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 61 20 4e is no match, a N
451c0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 72 ULL pointer is r
451d0 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 5e 49 66 eturned...** ^If
451e0 20 7a 56 66 73 4e 61 6d 65 20 69 73 20 4e 55 4c zVfsName is NUL
451f0 4c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75 L then the defau
45200 6c 74 20 56 46 53 20 69 73 20 72 65 74 75 72 6e lt VFS is return
45210 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 4e 65 77 ed...**..** ^New
45220 20 56 46 53 65 73 20 61 72 65 20 72 65 67 69 73 VFSes are regis
45230 74 65 72 65 64 20 77 69 74 68 20 73 71 6c 69 74 tered with sqlit
45240 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 e3_vfs_register(
45250 29 2e 0d 0a 2a 2a 20 5e 45 61 63 68 20 6e 65 77 )...** ^Each new
45260 20 56 46 53 20 62 65 63 6f 6d 65 73 20 74 68 65 VFS becomes the
45270 20 64 65 66 61 75 6c 74 20 56 46 53 20 69 66 20 default VFS if
45280 74 68 65 20 6d 61 6b 65 44 66 6c 74 20 66 6c 61 the makeDflt fla
45290 67 20 69 73 20 73 65 74 2e 0d 0a 2a 2a 20 5e 54 g is set...** ^T
452a0 68 65 20 73 61 6d 65 20 56 46 53 20 63 61 6e 20 he same VFS can
452b0 62 65 20 72 65 67 69 73 74 65 72 65 64 20 6d 75 be registered mu
452c0 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 77 69 74 ltiple times wit
452d0 68 6f 75 74 20 69 6e 6a 75 72 79 2e 0d 0a 2a 2a hout injury...**
452e0 20 5e 54 6f 20 6d 61 6b 65 20 61 6e 20 65 78 69 ^To make an exi
452f0 73 74 69 6e 67 20 56 46 53 20 69 6e 74 6f 20 74 sting VFS into t
45300 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 he default VFS,
45310 72 65 67 69 73 74 65 72 20 69 74 20 61 67 61 69 register it agai
45320 6e 0d 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d n..** with the m
45330 61 6b 65 44 66 6c 74 20 66 6c 61 67 20 73 65 74 akeDflt flag set
45340 2e 20 20 49 66 20 74 77 6f 20 64 69 66 66 65 72 . If two differ
45350 65 6e 74 20 56 46 53 65 73 20 77 69 74 68 20 74 ent VFSes with t
45360 68 65 0d 0a 2a 2a 20 73 61 6d 65 20 6e 61 6d 65 he..** same name
45370 20 61 72 65 20 72 65 67 69 73 74 65 72 65 64 2c are registered,
45380 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 the behavior is
45390 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 undefined. If
453a0 61 0d 0a 2a 2a 20 56 46 53 20 69 73 20 72 65 67 a..** VFS is reg
453b0 69 73 74 65 72 65 64 20 77 69 74 68 20 61 20 6e istered with a n
453c0 61 6d 65 20 74 68 61 74 20 69 73 20 4e 55 4c 4c ame that is NULL
453d0 20 6f 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72 or an empty str
453e0 69 6e 67 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 ing,..** then th
453f0 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e e behavior is un
45400 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a defined...**..**
45410 20 5e 55 6e 72 65 67 69 73 74 65 72 20 61 20 56 ^Unregister a V
45420 46 53 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 FS with the sqli
45430 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 te3_vfs_unregist
45440 65 72 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0d er() interface..
45450 0a 2a 2a 20 5e 28 49 66 20 74 68 65 20 64 65 66 .** ^(If the def
45460 61 75 6c 74 20 56 46 53 20 69 73 20 75 6e 72 65 ault VFS is unre
45470 67 69 73 74 65 72 65 64 2c 20 61 6e 6f 74 68 65 gistered, anothe
45480 72 20 56 46 53 20 69 73 20 63 68 6f 73 65 6e 20 r VFS is chosen
45490 61 73 0d 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 as..** the defau
454a0 6c 74 2e 20 20 54 68 65 20 63 68 6f 69 63 65 20 lt. The choice
454b0 66 6f 72 20 74 68 65 20 6e 65 77 20 56 46 53 20 for the new VFS
454c0 69 73 20 61 72 62 69 74 72 61 72 79 2e 29 5e 0d is arbitrary.)^.
454d0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
454e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c sqlite3_vfs *sql
454f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 63 6f ite3_vfs_find(co
45500 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 nst char *zVfsNa
45510 6d 65 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 me);..SQLITE_API
45520 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73 int sqlite3_vfs
45530 5f 72 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 _register(sqlite
45540 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6d 61 6b 65 3_vfs*, int make
45550 44 66 6c 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 Dflt);..SQLITE_A
45560 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 PI int sqlite3_v
45570 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 73 71 fs_unregister(sq
45580 6c 69 74 65 33 5f 76 66 73 2a 29 3b 0d 0a 0d 0a lite3_vfs*);....
45590 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a /*..** CAPI3REF:
455a0 20 4d 75 74 65 78 65 73 0d 0a 2a 2a 0d 0a 2a 2a Mutexes..**..**
455b0 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 The SQLite core
455c0 20 75 73 65 73 20 74 68 65 73 65 20 72 6f 75 74 uses these rout
455d0 69 6e 65 73 20 66 6f 72 20 74 68 72 65 61 64 0d ines for thread.
455e0 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 .** synchronizat
455f0 69 6f 6e 2e 20 54 68 6f 75 67 68 20 74 68 65 79 ion. Though they
45600 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f are intended fo
45610 72 20 69 6e 74 65 72 6e 61 6c 0d 0a 2a 2a 20 75 r internal..** u
45620 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 63 6f se by SQLite, co
45630 64 65 20 74 68 61 74 20 6c 69 6e 6b 73 20 61 67 de that links ag
45640 61 69 6e 73 74 20 53 51 4c 69 74 65 20 69 73 0d ainst SQLite is.
45650 0a 2a 2a 20 70 65 72 6d 69 74 74 65 64 20 74 6f .** permitted to
45660 20 75 73 65 20 61 6e 79 20 6f 66 20 74 68 65 73 use any of thes
45670 65 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a 2a 0d e routines...**.
45680 0a 2a 2a 20 54 68 65 20 53 51 4c 69 74 65 20 73 .** The SQLite s
45690 6f 75 72 63 65 20 63 6f 64 65 20 63 6f 6e 74 61 ource code conta
456a0 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 69 6d 70 ins multiple imp
456b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0d 0a 2a 2a lementations..**
456c0 20 6f 66 20 74 68 65 73 65 20 6d 75 74 65 78 20 of these mutex
456d0 72 6f 75 74 69 6e 65 73 2e 20 20 41 6e 20 61 70 routines. An ap
456e0 70 72 6f 70 72 69 61 74 65 20 69 6d 70 6c 65 6d propriate implem
456f0 65 6e 74 61 74 69 6f 6e 0d 0a 2a 2a 20 69 73 20 entation..** is
45700 73 65 6c 65 63 74 65 64 20 61 75 74 6f 6d 61 74 selected automat
45710 69 63 61 6c 6c 79 20 61 74 20 63 6f 6d 70 69 6c ically at compil
45720 65 2d 74 69 6d 65 2e 20 20 5e 28 54 68 65 20 66 e-time. ^(The f
45730 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 69 6d 70 ollowing..** imp
45740 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 72 65 lementations are
45750 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 available in th
45760 65 20 53 51 4c 69 74 65 20 63 6f 72 65 3a 0d 0a e SQLite core:..
45770 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 **..** <ul>..**
45780 3c 6c 69 3e 20 20 20 53 51 4c 49 54 45 5f 4d 55 <li> SQLITE_MU
45790 54 45 58 5f 4f 53 32 0d 0a 2a 2a 20 3c 6c 69 3e TEX_OS2..** <li>
457a0 20 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f SQLITE_MUTEX_
457b0 50 54 48 52 45 41 44 53 0d 0a 2a 2a 20 3c 6c 69 PTHREADS..** <li
457c0 3e 20 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 > SQLITE_MUTEX
457d0 5f 57 33 32 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 20 _W32..** <li>
457e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f SQLITE_MUTEX_NOO
457f0 50 0d 0a 2a 2a 20 3c 2f 75 6c 3e 29 5e 0d 0a 2a P..** </ul>)^..*
45800 2a 0d 0a 2a 2a 20 5e 54 68 65 20 53 51 4c 49 54 *..** ^The SQLIT
45810 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 20 69 6d 70 E_MUTEX_NOOP imp
45820 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 lementation is a
45830 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 set of routines
45840 0d 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e ..** that does n
45850 6f 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 61 o real locking a
45860 6e 64 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 nd is appropriat
45870 65 20 66 6f 72 20 75 73 65 20 69 6e 0d 0a 2a 2a e for use in..**
45880 20 61 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 a single-thread
45890 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 ed application.
458a0 20 5e 54 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 ^The SQLITE_MUT
458b0 45 58 5f 4f 53 32 2c 0d 0a 2a 2a 20 53 51 4c 49 EX_OS2,..** SQLI
458c0 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44 TE_MUTEX_PTHREAD
458d0 53 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55 S, and SQLITE_MU
458e0 54 45 58 5f 57 33 32 20 69 6d 70 6c 65 6d 65 6e TEX_W32 implemen
458f0 74 61 74 69 6f 6e 73 0d 0a 2a 2a 20 61 72 65 20 tations..** are
45900 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 appropriate for
45910 75 73 65 20 6f 6e 20 4f 53 2f 32 2c 20 55 6e 69 use on OS/2, Uni
45920 78 2c 20 61 6e 64 20 57 69 6e 64 6f 77 73 2e 0d x, and Windows..
45930 0a 2a 2a 0d 0a 2a 2a 20 5e 28 49 66 20 53 51 4c .**..** ^(If SQL
45940 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 ite is compiled
45950 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f with the SQLITE_
45960 4d 55 54 45 58 5f 41 50 50 44 45 46 20 70 72 65 MUTEX_APPDEF pre
45970 70 72 6f 63 65 73 73 6f 72 0d 0a 2a 2a 20 6d 61 processor..** ma
45980 63 72 6f 20 64 65 66 69 6e 65 64 20 28 77 69 74 cro defined (wit
45990 68 20 22 2d 44 53 51 4c 49 54 45 5f 4d 55 54 45 h "-DSQLITE_MUTE
459a0 58 5f 41 50 50 44 45 46 3d 31 22 29 2c 20 74 68 X_APPDEF=1"), th
459b0 65 6e 20 6e 6f 20 6d 75 74 65 78 0d 0a 2a 2a 20 en no mutex..**
459c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 implementation i
459d0 73 20 69 6e 63 6c 75 64 65 64 20 77 69 74 68 20 s included with
459e0 74 68 65 20 6c 69 62 72 61 72 79 2e 20 49 6e 20 the library. In
459f0 74 68 69 73 20 63 61 73 65 20 74 68 65 0d 0a 2a this case the..*
45a00 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 * application mu
45a10 73 74 20 73 75 70 70 6c 79 20 61 20 63 75 73 74 st supply a cust
45a20 6f 6d 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 om mutex impleme
45a30 6e 74 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 ntation using th
45a40 65 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 4f e..** [SQLITE_CO
45a50 4e 46 49 47 5f 4d 55 54 45 58 5d 20 6f 70 74 69 NFIG_MUTEX] opti
45a60 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 on of the sqlite
45a70 33 5f 63 6f 6e 66 69 67 28 29 20 66 75 6e 63 74 3_config() funct
45a80 69 6f 6e 0d 0a 2a 2a 20 62 65 66 6f 72 65 20 63 ion..** before c
45a90 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 alling sqlite3_i
45aa0 6e 69 74 69 61 6c 69 7a 65 28 29 20 6f 72 20 61 nitialize() or a
45ab0 6e 79 20 6f 74 68 65 72 20 70 75 62 6c 69 63 20 ny other public
45ac0 73 71 6c 69 74 65 33 5f 0d 0a 2a 2a 20 66 75 6e sqlite3_..** fun
45ad0 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6c 6c 73 ction that calls
45ae0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
45af0 69 7a 65 28 29 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a ize().)^..**..**
45b00 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 ^The sqlite3_mu
45b10 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72 6f 75 74 tex_alloc() rout
45b20 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 ine allocates a
45b30 6e 65 77 0d 0a 2a 2a 20 6d 75 74 65 78 20 61 6e new..** mutex an
45b40 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e d returns a poin
45b50 74 65 72 20 74 6f 20 69 74 2e 20 5e 49 66 20 69 ter to it. ^If i
45b60 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 0d 0a t returns NULL..
45b70 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 ** that means th
45b80 61 74 20 61 20 6d 75 74 65 78 20 63 6f 75 6c 64 at a mutex could
45b90 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 not be allocate
45ba0 64 2e 20 20 5e 53 51 4c 69 74 65 0d 0a 2a 2a 20 d. ^SQLite..**
45bb0 77 69 6c 6c 20 75 6e 77 69 6e 64 20 69 74 73 20 will unwind its
45bc0 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e stack and return
45bd0 20 61 6e 20 65 72 72 6f 72 2e 20 20 5e 28 54 68 an error. ^(Th
45be0 65 20 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 74 e argument..** t
45bf0 6f 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f o sqlite3_mutex_
45c00 61 6c 6c 6f 63 28 29 20 69 73 20 6f 6e 65 20 6f alloc() is one o
45c10 66 20 74 68 65 73 65 20 69 6e 74 65 67 65 72 20 f these integer
45c20 63 6f 6e 73 74 61 6e 74 73 3a 0d 0a 2a 2a 0d 0a constants:..**..
45c30 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e ** <ul>..** <li>
45c40 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 SQLITE_MUTEX_F
45c50 41 53 54 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 AST..** <li> SQ
45c60 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 LITE_MUTEX_RECUR
45c70 53 49 56 45 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 SIVE..** <li> S
45c80 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 QLITE_MUTEX_STAT
45c90 49 43 5f 4d 41 53 54 45 52 0d 0a 2a 2a 20 3c 6c IC_MASTER..** <l
45ca0 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 i> SQLITE_MUTEX
45cb0 5f 53 54 41 54 49 43 5f 4d 45 4d 0d 0a 2a 2a 20 _STATIC_MEM..**
45cc0 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 <li> SQLITE_MUT
45cd0 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 0d 0a EX_STATIC_MEM2..
45ce0 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f ** <li> SQLITE_
45cf0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 50 52 4e MUTEX_STATIC_PRN
45d00 47 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 G..** <li> SQLI
45d10 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
45d20 4c 52 55 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 LRU..** <li> SQ
45d30 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 LITE_MUTEX_STATI
45d40 43 5f 4c 52 55 32 0d 0a 2a 2a 20 3c 2f 75 6c 3e C_LRU2..** </ul>
45d50 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 )^..**..** ^The
45d60 66 69 72 73 74 20 74 77 6f 20 63 6f 6e 73 74 61 first two consta
45d70 6e 74 73 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 nts (SQLITE_MUTE
45d80 58 5f 46 41 53 54 20 61 6e 64 20 53 51 4c 49 54 X_FAST and SQLIT
45d90 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 E_MUTEX_RECURSIV
45da0 45 29 0d 0a 2a 2a 20 63 61 75 73 65 20 73 71 6c E)..** cause sql
45db0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 ite3_mutex_alloc
45dc0 28 29 20 74 6f 20 63 72 65 61 74 65 0d 0a 2a 2a () to create..**
45dd0 20 61 20 6e 65 77 20 6d 75 74 65 78 2e 20 20 5e a new mutex. ^
45de0 54 68 65 20 6e 65 77 20 6d 75 74 65 78 20 69 73 The new mutex is
45df0 20 72 65 63 75 72 73 69 76 65 20 77 68 65 6e 20 recursive when
45e00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
45e10 55 52 53 49 56 45 0d 0a 2a 2a 20 69 73 20 75 73 URSIVE..** is us
45e20 65 64 20 62 75 74 20 6e 6f 74 20 6e 65 63 65 73 ed but not neces
45e30 73 61 72 69 6c 79 20 73 6f 20 77 68 65 6e 20 53 sarily so when S
45e40 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 QLITE_MUTEX_FAST
45e50 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2a 20 54 68 is used...** Th
45e60 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e e mutex implemen
45e70 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 tation does not
45e80 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 64 need to make a d
45e90 69 73 74 69 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 62 istinction..** b
45ea0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d 55 etween SQLITE_MU
45eb0 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 61 6e TEX_RECURSIVE an
45ec0 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 d SQLITE_MUTEX_F
45ed0 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 0d 0a AST if it does..
45ee0 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20 ** not want to.
45ef0 20 5e 53 51 4c 69 74 65 20 77 69 6c 6c 20 6f 6e ^SQLite will on
45f00 6c 79 20 72 65 71 75 65 73 74 20 61 20 72 65 63 ly request a rec
45f10 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 6e 0d ursive mutex in.
45f20 0a 2a 2a 20 63 61 73 65 73 20 77 68 65 72 65 20 .** cases where
45f30 69 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 it really needs
45f40 6f 6e 65 2e 20 20 5e 49 66 20 61 20 66 61 73 74 one. ^If a fast
45f50 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76 65 er non-recursive
45f60 20 6d 75 74 65 78 0d 0a 2a 2a 20 69 6d 70 6c 65 mutex..** imple
45f70 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76 61 mentation is ava
45f80 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f ilable on the ho
45f90 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65 st platform, the
45fa0 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d mutex subsystem
45fb0 0d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 ..** might retur
45fc0 6e 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69 n such a mutex i
45fd0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51 n response to SQ
45fe0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e LITE_MUTEX_FAST.
45ff0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 6f 74 ..**..** ^The ot
46000 68 65 72 20 61 6c 6c 6f 77 65 64 20 70 61 72 61 her allowed para
46010 6d 65 74 65 72 73 20 74 6f 20 73 71 6c 69 74 65 meters to sqlite
46020 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 3_mutex_alloc()
46030 28 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 0d (anything other.
46040 0a 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54 45 5f .** than SQLITE_
46050 4d 55 54 45 58 5f 46 41 53 54 20 61 6e 64 20 53 MUTEX_FAST and S
46060 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 QLITE_MUTEX_RECU
46070 52 53 49 56 45 29 20 65 61 63 68 20 72 65 74 75 RSIVE) each retu
46080 72 6e 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 rn..** a pointer
46090 20 74 6f 20 61 20 73 74 61 74 69 63 20 70 72 65 to a static pre
460a0 65 78 69 73 74 69 6e 67 20 6d 75 74 65 78 2e 20 existing mutex.
460b0 20 5e 53 69 78 20 73 74 61 74 69 63 20 6d 75 74 ^Six static mut
460c0 65 78 65 73 20 61 72 65 0d 0a 2a 2a 20 75 73 65 exes are..** use
460d0 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 d by the current
460e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 version of SQLi
460f0 74 65 2e 20 20 46 75 74 75 72 65 20 76 65 72 73 te. Future vers
46100 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 0d 0a ions of SQLite..
46110 2a 2a 20 6d 61 79 20 61 64 64 20 61 64 64 69 74 ** may add addit
46120 69 6f 6e 61 6c 20 73 74 61 74 69 63 20 6d 75 74 ional static mut
46130 65 78 65 73 2e 20 20 53 74 61 74 69 63 20 6d 75 exes. Static mu
46140 74 65 78 65 73 20 61 72 65 20 66 6f 72 20 69 6e texes are for in
46150 74 65 72 6e 61 6c 0d 0a 2a 2a 20 75 73 65 20 62 ternal..** use b
46160 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e 20 20 y SQLite only.
46170 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 Applications tha
46180 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d 75 74 t use SQLite mut
46190 65 78 65 73 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 exes should..**
461a0 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 64 79 6e use only the dyn
461b0 61 6d 69 63 20 6d 75 74 65 78 65 73 20 72 65 74 amic mutexes ret
461c0 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f urned by SQLITE_
461d0 4d 55 54 45 58 5f 46 41 53 54 20 6f 72 0d 0a 2a MUTEX_FAST or..*
461e0 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 * SQLITE_MUTEX_R
461f0 45 43 55 52 53 49 56 45 2e 0d 0a 2a 2a 0d 0a 2a ECURSIVE...**..*
46200 2a 20 5e 4e 6f 74 65 20 74 68 61 74 20 69 66 20 * ^Note that if
46210 6f 6e 65 20 6f 66 20 74 68 65 20 64 79 6e 61 6d one of the dynam
46220 69 63 20 6d 75 74 65 78 20 70 61 72 61 6d 65 74 ic mutex paramet
46230 65 72 73 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 ers (SQLITE_MUTE
46240 58 5f 46 41 53 54 0d 0a 2a 2a 20 6f 72 20 53 51 X_FAST..** or SQ
46250 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 LITE_MUTEX_RECUR
46260 53 49 56 45 29 20 69 73 20 75 73 65 64 20 74 68 SIVE) is used th
46270 65 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 en sqlite3_mutex
46280 5f 61 6c 6c 6f 63 28 29 0d 0a 2a 2a 20 72 65 74 _alloc()..** ret
46290 75 72 6e 73 20 61 20 64 69 66 66 65 72 65 6e 74 urns a different
462a0 20 6d 75 74 65 78 20 6f 6e 20 65 76 65 72 79 20 mutex on every
462b0 63 61 6c 6c 2e 20 20 5e 42 75 74 20 66 6f 72 20 call. ^But for
462c0 74 68 65 20 73 74 61 74 69 63 0d 0a 2a 2a 20 6d the static..** m
462d0 75 74 65 78 20 74 79 70 65 73 2c 20 74 68 65 20 utex types, the
462e0 73 61 6d 65 20 6d 75 74 65 78 20 69 73 20 72 65 same mutex is re
462f0 74 75 72 6e 65 64 20 6f 6e 20 65 76 65 72 79 20 turned on every
46300 63 61 6c 6c 20 74 68 61 74 20 68 61 73 0d 0a 2a call that has..*
46310 2a 20 74 68 65 20 73 61 6d 65 20 74 79 70 65 20 * the same type
46320 6e 75 6d 62 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 number...**..**
46330 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 ^The sqlite3_mut
46340 65 78 5f 66 72 65 65 28 29 20 72 6f 75 74 69 6e ex_free() routin
46350 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 e deallocates a
46360 70 72 65 76 69 6f 75 73 6c 79 0d 0a 2a 2a 20 61 previously..** a
46370 6c 6c 6f 63 61 74 65 64 20 64 79 6e 61 6d 69 63 llocated dynamic
46380 20 6d 75 74 65 78 2e 20 20 5e 53 51 4c 69 74 65 mutex. ^SQLite
46390 20 69 73 20 63 61 72 65 66 75 6c 20 74 6f 20 64 is careful to d
463a0 65 61 6c 6c 6f 63 61 74 65 20 65 76 65 72 79 0d eallocate every.
463b0 0a 2a 2a 20 64 79 6e 61 6d 69 63 20 6d 75 74 65 .** dynamic mute
463c0 78 20 74 68 61 74 20 69 74 20 61 6c 6c 6f 63 61 x that it alloca
463d0 74 65 73 2e 20 20 54 68 65 20 64 79 6e 61 6d 69 tes. The dynami
463e0 63 20 6d 75 74 65 78 65 73 20 6d 75 73 74 20 6e c mutexes must n
463f0 6f 74 20 62 65 20 69 6e 0d 0a 2a 2a 20 75 73 65 ot be in..** use
46400 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 64 when they are d
46410 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 41 74 74 eallocated. Att
46420 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 61 6c 6c empting to deall
46430 6f 63 61 74 65 20 61 20 73 74 61 74 69 63 0d 0a ocate a static..
46440 2a 2a 20 6d 75 74 65 78 20 72 65 73 75 6c 74 73 ** mutex results
46450 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 62 65 in undefined be
46460 68 61 76 69 6f 72 2e 20 20 5e 53 51 4c 69 74 65 havior. ^SQLite
46470 20 6e 65 76 65 72 20 64 65 61 6c 6c 6f 63 61 74 never deallocat
46480 65 73 0d 0a 2a 2a 20 61 20 73 74 61 74 69 63 20 es..** a static
46490 6d 75 74 65 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e mutex...**..** ^
464a0 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 The sqlite3_mute
464b0 78 5f 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 x_enter() and sq
464c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 lite3_mutex_try(
464d0 29 20 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d ) routines attem
464e0 70 74 0d 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 pt..** to enter
464f0 61 20 6d 75 74 65 78 2e 20 20 5e 49 66 20 61 6e a mutex. ^If an
46500 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 73 20 other thread is
46510 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 74 already within t
46520 68 65 20 6d 75 74 65 78 2c 0d 0a 2a 2a 20 73 71 he mutex,..** sq
46530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 lite3_mutex_ente
46540 72 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 61 r() will block a
46550 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 nd sqlite3_mutex
46560 5f 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74 75 _try() will retu
46570 72 6e 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 rn..** SQLITE_BU
46580 53 59 2e 20 20 5e 54 68 65 20 73 71 6c 69 74 65 SY. ^The sqlite
46590 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 69 6e 3_mutex_try() in
465a0 74 65 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 terface returns
465b0 5b 53 51 4c 49 54 45 5f 4f 4b 5d 0d 0a 2a 2a 20 [SQLITE_OK]..**
465c0 75 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 20 upon successful
465d0 65 6e 74 72 79 2e 20 20 5e 28 4d 75 74 65 78 65 entry. ^(Mutexe
465e0 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0d s created using.
465f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 .** SQLITE_MUTEX
46600 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 20 62 _RECURSIVE can b
46610 65 20 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 70 e entered multip
46620 6c 65 20 74 69 6d 65 73 20 62 79 20 74 68 65 20 le times by the
46630 73 61 6d 65 20 74 68 72 65 61 64 2e 0d 0a 2a 2a same thread...**
46640 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 In such cases t
46650 68 65 2c 0d 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 he,..** mutex mu
46660 73 74 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 st be exited an
46670 65 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 equal number of
46680 74 69 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f times before ano
46690 74 68 65 72 20 74 68 72 65 61 64 0d 0a 2a 2a 20 ther thread..**
466a0 63 61 6e 20 65 6e 74 65 72 2e 29 5e 20 20 5e 28 can enter.)^ ^(
466b0 49 66 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 If the same thre
466c0 61 64 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65 ad tries to ente
466d0 72 20 61 6e 79 20 6f 74 68 65 72 0d 0a 2a 2a 20 r any other..**
466e0 6b 69 6e 64 20 6f 66 20 6d 75 74 65 78 20 6d 6f kind of mutex mo
466f0 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 re than once, th
46700 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e e behavior is un
46710 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 20 53 51 4c defined...** SQL
46720 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 65 ite will never e
46730 78 68 69 62 69 74 0d 0a 2a 2a 20 73 75 63 68 20 xhibit..** such
46740 62 65 68 61 76 69 6f 72 20 69 6e 20 69 74 73 20 behavior in its
46750 6f 77 6e 20 75 73 65 20 6f 66 20 6d 75 74 65 78 own use of mutex
46760 65 73 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 es.)^..**..** ^(
46770 53 6f 6d 65 20 73 79 73 74 65 6d 73 20 28 66 6f Some systems (fo
46780 72 20 65 78 61 6d 70 6c 65 2c 20 57 69 6e 64 6f r example, Windo
46790 77 73 20 39 35 29 20 64 6f 20 6e 6f 74 20 73 75 ws 95) do not su
467a0 70 70 6f 72 74 20 74 68 65 20 6f 70 65 72 61 74 pport the operat
467b0 69 6f 6e 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e ion..** implemen
467c0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d ted by sqlite3_m
467d0 75 74 65 78 5f 74 72 79 28 29 2e 20 20 4f 6e 20 utex_try(). On
467e0 74 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 73 those systems, s
467f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 qlite3_mutex_try
46800 28 29 0d 0a 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 ()..** will alwa
46810 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ys return SQLITE
46820 5f 42 55 53 59 2e 20 20 54 68 65 20 53 51 4c 69 _BUSY. The SQLi
46830 74 65 20 63 6f 72 65 20 6f 6e 6c 79 20 65 76 65 te core only eve
46840 72 20 75 73 65 73 0d 0a 2a 2a 20 73 71 6c 69 74 r uses..** sqlit
46850 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 61 e3_mutex_try() a
46860 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f s an optimizatio
46870 6e 20 73 6f 20 74 68 69 73 20 69 73 20 61 63 63 n so this is acc
46880 65 70 74 61 62 6c 65 20 62 65 68 61 76 69 6f 72 eptable behavior
46890 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 .)^..**..** ^The
468a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
468b0 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 20 65 eave() routine e
468c0 78 69 74 73 20 61 20 6d 75 74 65 78 20 74 68 61 xits a mutex tha
468d0 74 20 77 61 73 0d 0a 2a 2a 20 70 72 65 76 69 6f t was..** previo
468e0 75 73 6c 79 20 65 6e 74 65 72 65 64 20 62 79 20 usly entered by
468f0 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e the same thread.
46900 20 20 20 5e 28 54 68 65 20 62 65 68 61 76 69 6f ^(The behavio
46910 72 0d 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e r..** is undefin
46920 65 64 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 ed if the mutex
46930 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 is not currently
46940 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 0d entered by the.
46950 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 .** calling thre
46960 61 64 20 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 ad or is not cur
46970 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 rently allocated
46980 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 0d 0a . SQLite will..
46990 2a 2a 20 6e 65 76 65 72 20 64 6f 20 65 69 74 68 ** never do eith
469a0 65 72 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 er.)^..**..** ^I
469b0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 f the argument t
469c0 6f 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f o sqlite3_mutex_
469d0 65 6e 74 65 72 28 29 2c 20 73 71 6c 69 74 65 33 enter(), sqlite3
469e0 5f 6d 75 74 65 78 5f 74 72 79 28 29 2c 20 6f 72 _mutex_try(), or
469f0 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 ..** sqlite3_mut
46a00 65 78 5f 6c 65 61 76 65 28 29 20 69 73 20 61 20 ex_leave() is a
46a10 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 NULL pointer, th
46a20 65 6e 20 61 6c 6c 20 74 68 72 65 65 20 72 6f 75 en all three rou
46a30 74 69 6e 65 73 0d 0a 2a 2a 20 62 65 68 61 76 65 tines..** behave
46a40 20 61 73 20 6e 6f 2d 6f 70 73 2e 0d 0a 2a 2a 0d as no-ops...**.
46a50 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 5b 73 .** See also: [s
46a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
46a70 64 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 74 65 d()] and [sqlite
46a80 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 3_mutex_notheld(
46a90 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f )]...*/..SQLITE_
46aa0 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 API sqlite3_mute
46ab0 78 20 2a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 x *sqlite3_mutex
46ac0 5f 61 6c 6c 6f 63 28 69 6e 74 29 3b 0d 0a 53 51 _alloc(int);..SQ
46ad0 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 LITE_API void sq
46ae0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 lite3_mutex_free
46af0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2a 29 (sqlite3_mutex*)
46b00 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f ;..SQLITE_API vo
46b10 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 id sqlite3_mutex
46b20 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d _enter(sqlite3_m
46b30 75 74 65 78 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f utex*);..SQLITE_
46b40 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
46b50 6d 75 74 65 78 5f 74 72 79 28 73 71 6c 69 74 65 mutex_try(sqlite
46b60 33 5f 6d 75 74 65 78 2a 29 3b 0d 0a 53 51 4c 49 3_mutex*);..SQLI
46b70 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c 69 TE_API void sqli
46b80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
46b90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2a 29 3b sqlite3_mutex*);
46ba0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 ..../*..** CAPI3
46bb0 52 45 46 3a 20 4d 75 74 65 78 20 4d 65 74 68 6f REF: Mutex Metho
46bc0 64 73 20 4f 62 6a 65 63 74 0d 0a 2a 2a 0d 0a 2a ds Object..**..*
46bd0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 * An instance of
46be0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 this structure
46bf0 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 2d defines the low-
46c00 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 0d 0a level routines..
46c10 2a 2a 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 ** used to alloc
46c20 61 74 65 20 61 6e 64 20 75 73 65 20 6d 75 74 65 ate and use mute
46c30 78 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 55 73 75 xes...**..** Usu
46c40 61 6c 6c 79 2c 20 74 68 65 20 64 65 66 61 75 6c ally, the defaul
46c50 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e t mutex implemen
46c60 74 61 74 69 6f 6e 73 20 70 72 6f 76 69 64 65 64 tations provided
46c70 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 0d 0a by SQLite are..
46c80 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 2c 20 68 ** sufficient, h
46c90 6f 77 65 76 65 72 20 74 68 65 20 75 73 65 72 20 owever the user
46ca0 68 61 73 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f has the option o
46cb0 66 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 61 f substituting a
46cc0 20 63 75 73 74 6f 6d 0d 0a 2a 2a 20 69 6d 70 6c custom..** impl
46cd0 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 73 ementation for s
46ce0 70 65 63 69 61 6c 69 7a 65 64 20 64 65 70 6c 6f pecialized deplo
46cf0 79 6d 65 6e 74 73 20 6f 72 20 73 79 73 74 65 6d yments or system
46d00 73 20 66 6f 72 20 77 68 69 63 68 20 53 51 4c 69 s for which SQLi
46d10 74 65 0d 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 te..** does not
46d20 70 72 6f 76 69 64 65 20 61 20 73 75 69 74 61 62 provide a suitab
46d30 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f le implementatio
46d40 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c n. In this case,
46d50 20 74 68 65 20 75 73 65 72 0d 0a 2a 2a 20 63 72 the user..** cr
46d60 65 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 eates and popula
46d70 74 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 tes an instance
46d80 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 of this structur
46d90 65 20 74 6f 20 70 61 73 73 0d 0a 2a 2a 20 74 6f e to pass..** to
46da0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 sqlite3_config(
46db0 29 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 ) along with the
46dc0 20 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f [SQLITE_CONFIG_
46dd0 4d 55 54 45 58 5d 20 6f 70 74 69 6f 6e 2e 0d 0a MUTEX] option...
46de0 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c ** Additionally,
46df0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
46e00 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63 this structure c
46e10 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 6e an be used as an
46e20 0d 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 ..** output vari
46e30 61 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69 able when queryi
46e40 6e 67 20 74 68 65 20 73 79 73 74 65 6d 20 66 6f ng the system fo
46e50 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 r the current mu
46e60 74 65 78 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e tex..** implemen
46e70 74 61 74 69 6f 6e 2c 20 75 73 69 6e 67 20 74 68 tation, using th
46e80 65 20 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 e [SQLITE_CONFIG
46e90 5f 47 45 54 4d 55 54 45 58 5d 20 6f 70 74 69 6f _GETMUTEX] optio
46ea0 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 n...**..** ^The
46eb0 78 4d 75 74 65 78 49 6e 69 74 20 6d 65 74 68 6f xMutexInit metho
46ec0 64 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 69 d defined by thi
46ed0 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 69 s structure is i
46ee0 6e 76 6f 6b 65 64 20 61 73 0d 0a 2a 2a 20 70 61 nvoked as..** pa
46ef0 72 74 20 6f 66 20 73 79 73 74 65 6d 20 69 6e 69 rt of system ini
46f00 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 20 74 tialization by t
46f10 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 he sqlite3_initi
46f20 61 6c 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e alize() function
46f30 2e 0d 0a 2a 2a 20 5e 54 68 65 20 78 4d 75 74 65 ...** ^The xMute
46f40 78 49 6e 69 74 20 72 6f 75 74 69 6e 65 20 69 73 xInit routine is
46f50 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 called by SQLit
46f60 65 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 66 e exactly once f
46f70 6f 72 20 65 61 63 68 0d 0a 2a 2a 20 65 66 66 65 or each..** effe
46f80 63 74 69 76 65 20 63 61 6c 6c 20 74 6f 20 5b 73 ctive call to [s
46f90 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a qlite3_initializ
46fa0 65 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 e()]...**..** ^T
46fb0 68 65 20 78 4d 75 74 65 78 45 6e 64 20 6d 65 74 he xMutexEnd met
46fc0 68 6f 64 20 64 65 66 69 6e 65 64 20 62 79 20 74 hod defined by t
46fd0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 his structure is
46fe0 20 69 6e 76 6f 6b 65 64 20 61 73 0d 0a 2a 2a 20 invoked as..**
46ff0 70 61 72 74 20 6f 66 20 73 79 73 74 65 6d 20 73 part of system s
47000 68 75 74 64 6f 77 6e 20 62 79 20 74 68 65 20 73 hutdown by the s
47010 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 qlite3_shutdown(
47020 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 0d ) function. The.
47030 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 .** implementati
47040 6f 6e 20 6f 66 20 74 68 69 73 20 6d 65 74 68 6f on of this metho
47050 64 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f d is expected to
47060 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 75 74 release all out
47070 73 74 61 6e 64 69 6e 67 0d 0a 2a 2a 20 72 65 73 standing..** res
47080 6f 75 72 63 65 73 20 6f 62 74 61 69 6e 65 64 20 ources obtained
47090 62 79 20 74 68 65 20 6d 75 74 65 78 20 6d 65 74 by the mutex met
470a0 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 hods implementat
470b0 69 6f 6e 2c 20 65 73 70 65 63 69 61 6c 6c 79 0d ion, especially.
470c0 0a 2a 2a 20 74 68 6f 73 65 20 6f 62 74 61 69 6e .** those obtain
470d0 65 64 20 62 79 20 74 68 65 20 78 4d 75 74 65 78 ed by the xMutex
470e0 49 6e 69 74 20 6d 65 74 68 6f 64 2e 20 20 5e 54 Init method. ^T
470f0 68 65 20 78 4d 75 74 65 78 45 6e 64 28 29 0d 0a he xMutexEnd()..
47100 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 ** interface is
47110 69 6e 76 6f 6b 65 64 20 65 78 61 63 74 6c 79 20 invoked exactly
47120 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 61 once for each ca
47130 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 73 ll to [sqlite3_s
47140 68 75 74 64 6f 77 6e 28 29 5d 2e 0d 0a 2a 2a 0d hutdown()]...**.
47150 0a 2a 2a 20 5e 28 54 68 65 20 72 65 6d 61 69 6e .** ^(The remain
47160 69 6e 67 20 73 65 76 65 6e 20 6d 65 74 68 6f 64 ing seven method
47170 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 69 s defined by thi
47180 73 20 73 74 72 75 63 74 75 72 65 20 28 78 4d 75 s structure (xMu
47190 74 65 78 41 6c 6c 6f 63 2c 0d 0a 2a 2a 20 78 4d texAlloc,..** xM
471a0 75 74 65 78 46 72 65 65 2c 20 78 4d 75 74 65 78 utexFree, xMutex
471b0 45 6e 74 65 72 2c 20 78 4d 75 74 65 78 54 72 79 Enter, xMutexTry
471c0 2c 20 78 4d 75 74 65 78 4c 65 61 76 65 2c 20 78 , xMutexLeave, x
471d0 4d 75 74 65 78 48 65 6c 64 20 61 6e 64 0d 0a 2a MutexHeld and..*
471e0 2a 20 78 4d 75 74 65 78 4e 6f 74 68 65 6c 64 29 * xMutexNotheld)
471f0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 implement the f
47200 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 72 66 61 ollowing interfa
47210 63 65 73 20 28 72 65 73 70 65 63 74 69 76 65 6c ces (respectivel
47220 79 29 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e y):..**..** <ul>
47230 0d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 20 5b 73 71 ..** <li> [sq
47240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f lite3_mutex_allo
47250 63 28 29 5d 20 3c 2f 6c 69 3e 0d 0a 2a 2a 20 20 c()] </li>..**
47260 20 3c 6c 69 3e 20 20 5b 73 71 6c 69 74 65 33 5f <li> [sqlite3_
47270 6d 75 74 65 78 5f 66 72 65 65 28 29 5d 20 3c 2f mutex_free()] </
47280 6c 69 3e 0d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 20 li>..** <li>
47290 5b 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 [sqlite3_mutex_e
472a0 6e 74 65 72 28 29 5d 20 3c 2f 6c 69 3e 0d 0a 2a nter()] </li>..*
472b0 2a 20 20 20 3c 6c 69 3e 20 20 5b 73 71 6c 69 74 * <li> [sqlit
472c0 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 5d 20 e3_mutex_try()]
472d0 3c 2f 6c 69 3e 0d 0a 2a 2a 20 20 20 3c 6c 69 3e </li>..** <li>
472e0 20 20 5b 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 [sqlite3_mutex
472f0 5f 6c 65 61 76 65 28 29 5d 20 3c 2f 6c 69 3e 0d _leave()] </li>.
47300 0a 2a 2a 20 20 20 3c 6c 69 3e 20 20 5b 73 71 6c .** <li> [sql
47310 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
47320 29 5d 20 3c 2f 6c 69 3e 0d 0a 2a 2a 20 20 20 3c )] </li>..** <
47330 6c 69 3e 20 20 5b 73 71 6c 69 74 65 33 5f 6d 75 li> [sqlite3_mu
47340 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 5d 20 3c tex_notheld()] <
47350 2f 6c 69 3e 0d 0a 2a 2a 20 3c 2f 75 6c 3e 29 5e /li>..** </ul>)^
47360 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f 6e 6c ..**..** The onl
47370 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 y difference is
47380 74 68 61 74 20 74 68 65 20 70 75 62 6c 69 63 20 that the public
47390 73 71 6c 69 74 65 33 5f 58 58 58 20 66 75 6e 63 sqlite3_XXX func
473a0 74 69 6f 6e 73 20 65 6e 75 6d 65 72 61 74 65 64 tions enumerated
473b0 0d 0a 2a 2a 20 61 62 6f 76 65 20 73 69 6c 65 6e ..** above silen
473c0 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 20 69 tly ignore any i
473d0 6e 76 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 nvocations that
473e0 70 61 73 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e pass a NULL poin
473f0 74 65 72 20 69 6e 73 74 65 61 64 0d 0a 2a 2a 20 ter instead..**
47400 6f 66 20 61 20 76 61 6c 69 64 20 6d 75 74 65 78 of a valid mutex
47410 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 69 6d 70 handle. The imp
47420 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 lementations of
47430 74 68 65 20 6d 65 74 68 6f 64 73 20 64 65 66 69 the methods defi
47440 6e 65 64 0d 0a 2a 2a 20 62 79 20 74 68 69 73 20 ned..** by this
47450 73 74 72 75 63 74 75 72 65 20 61 72 65 20 6e 6f structure are no
47460 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 t required to ha
47470 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2c 20 ndle this case,
47480 74 68 65 20 72 65 73 75 6c 74 73 0d 0a 2a 2a 20 the results..**
47490 6f 66 20 70 61 73 73 69 6e 67 20 61 20 4e 55 4c of passing a NUL
474a0 4c 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 65 61 L pointer instea
474b0 64 20 6f 66 20 61 20 76 61 6c 69 64 20 6d 75 74 d of a valid mut
474c0 65 78 20 68 61 6e 64 6c 65 20 61 72 65 20 75 6e ex handle are un
474d0 64 65 66 69 6e 65 64 0d 0a 2a 2a 20 28 69 2e 65 defined..** (i.e
474e0 2e 20 69 74 20 69 73 20 61 63 63 65 70 74 61 62 . it is acceptab
474f0 6c 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e le to provide an
47500 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
47510 74 68 61 74 20 73 65 67 66 61 75 6c 74 73 20 69 that segfaults i
47520 66 0d 0a 2a 2a 20 69 74 20 69 73 20 70 61 73 73 f..** it is pass
47530 65 64 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 ed a NULL pointe
47540 72 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 r)...**..** The
47550 78 4d 75 74 65 78 49 6e 69 74 28 29 20 6d 65 74 xMutexInit() met
47560 68 6f 64 20 6d 75 73 74 20 62 65 20 74 68 72 65 hod must be thre
47570 61 64 73 61 66 65 2e 20 20 5e 49 74 20 6d 75 73 adsafe. ^It mus
47580 74 20 62 65 20 68 61 72 6d 6c 65 73 73 20 74 6f t be harmless to
47590 0d 0a 2a 2a 20 69 6e 76 6f 6b 65 20 78 4d 75 74 ..** invoke xMut
475a0 65 78 49 6e 69 74 28 29 20 6d 75 6c 74 69 70 6c exInit() multipl
475b0 65 20 74 69 6d 65 73 20 77 69 74 68 69 6e 20 74 e times within t
475c0 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 he same process
475d0 61 6e 64 20 77 69 74 68 6f 75 74 0d 0a 2a 2a 20 and without..**
475e0 69 6e 74 65 72 76 65 6e 69 6e 67 20 63 61 6c 6c intervening call
475f0 73 20 74 6f 20 78 4d 75 74 65 78 45 6e 64 28 29 s to xMutexEnd()
47600 2e 20 20 53 65 63 6f 6e 64 20 61 6e 64 20 73 75 . Second and su
47610 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 bsequent calls t
47620 6f 0d 0a 2a 2a 20 78 4d 75 74 65 78 49 6e 69 74 o..** xMutexInit
47630 28 29 20 6d 75 73 74 20 62 65 20 6e 6f 2d 6f 70 () must be no-op
47640 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 78 4d 75 74 s...**..** ^xMut
47650 65 78 49 6e 69 74 28 29 20 6d 75 73 74 20 6e 6f exInit() must no
47660 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d 65 6d t use SQLite mem
47670 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 ory allocation (
47680 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 [sqlite3_malloc(
47690 29 5d 0d 0a 2a 2a 20 61 6e 64 20 69 74 73 20 61 )]..** and its a
476a0 73 73 6f 63 69 61 74 65 73 29 2e 20 20 5e 53 69 ssociates). ^Si
476b0 6d 69 6c 61 72 6c 79 2c 20 78 4d 75 74 65 78 41 milarly, xMutexA
476c0 6c 6c 6f 63 28 29 20 6d 75 73 74 20 6e 6f 74 20 lloc() must not
476d0 75 73 65 20 53 51 4c 69 74 65 20 6d 65 6d 6f 72 use SQLite memor
476e0 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e y..** allocation
476f0 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 for a static mu
47700 74 65 78 2e 20 20 5e 48 6f 77 65 76 65 72 20 78 tex. ^However x
47710 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 6d 61 79 MutexAlloc() may
47720 20 75 73 65 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 use SQLite..**
47730 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
47740 6e 20 66 6f 72 20 61 20 66 61 73 74 20 6f 72 20 n for a fast or
47750 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 2e recursive mutex.
47760 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 4c 69 74 65 ..**..** ^SQLite
47770 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 will invoke the
47780 20 78 4d 75 74 65 78 45 6e 64 28 29 20 6d 65 74 xMutexEnd() met
47790 68 6f 64 20 77 68 65 6e 20 5b 73 71 6c 69 74 65 hod when [sqlite
477a0 33 5f 73 68 75 74 64 6f 77 6e 28 29 5d 20 69 73 3_shutdown()] is
477b0 0d 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 62 75 74 ..** called, but
477c0 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 70 72 69 only if the pri
477d0 6f 72 20 63 61 6c 6c 20 74 6f 20 78 4d 75 74 65 or call to xMute
477e0 78 49 6e 69 74 20 72 65 74 75 72 6e 65 64 20 53 xInit returned S
477f0 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2a 20 49 66 QLITE_OK...** If
47800 20 78 4d 75 74 65 78 49 6e 69 74 20 66 61 69 6c xMutexInit fail
47810 73 20 69 6e 20 61 6e 79 20 77 61 79 2c 20 69 74 s in any way, it
47820 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 is expected to
47830 63 6c 65 61 6e 20 75 70 20 61 66 74 65 72 20 69 clean up after i
47840 74 73 65 6c 66 0d 0a 2a 2a 20 70 72 69 6f 72 20 tself..** prior
47850 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a to returning...*
47860 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
47870 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f t sqlite3_mutex_
47880 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f methods sqlite3_
47890 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 3b 0d 0a mutex_methods;..
478a0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 6d struct sqlite3_m
478b0 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 7b 0d 0a utex_methods {..
478c0 20 20 69 6e 74 20 28 2a 78 4d 75 74 65 78 49 6e int (*xMutexIn
478d0 69 74 29 28 76 6f 69 64 29 3b 0d 0a 20 20 69 6e it)(void);.. in
478e0 74 20 28 2a 78 4d 75 74 65 78 45 6e 64 29 28 76 t (*xMutexEnd)(v
478f0 6f 69 64 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 oid);.. sqlite3
47900 5f 6d 75 74 65 78 20 2a 28 2a 78 4d 75 74 65 78 _mutex *(*xMutex
47910 41 6c 6c 6f 63 29 28 69 6e 74 29 3b 0d 0a 20 20 Alloc)(int);..
47920 76 6f 69 64 20 28 2a 78 4d 75 74 65 78 46 72 65 void (*xMutexFre
47930 65 29 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 e)(sqlite3_mutex
47940 20 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 *);.. void (*x
47950 4d 75 74 65 78 45 6e 74 65 72 29 28 73 71 6c 69 MutexEnter)(sqli
47960 74 65 33 5f 6d 75 74 65 78 20 2a 29 3b 0d 0a 20 te3_mutex *);..
47970 20 69 6e 74 20 28 2a 78 4d 75 74 65 78 54 72 79 int (*xMutexTry
47980 29 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 )(sqlite3_mutex
47990 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 4d *);.. void (*xM
479a0 75 74 65 78 4c 65 61 76 65 29 28 73 71 6c 69 74 utexLeave)(sqlit
479b0 65 33 5f 6d 75 74 65 78 20 2a 29 3b 0d 0a 20 20 e3_mutex *);..
479c0 69 6e 74 20 28 2a 78 4d 75 74 65 78 48 65 6c 64 int (*xMutexHeld
479d0 29 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 )(sqlite3_mutex
479e0 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 4d 75 *);.. int (*xMu
479f0 74 65 78 4e 6f 74 68 65 6c 64 29 28 73 71 6c 69 texNotheld)(sqli
47a00 74 65 33 5f 6d 75 74 65 78 20 2a 29 3b 0d 0a 7d te3_mutex *);..}
47a10 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
47a20 33 52 45 46 3a 20 4d 75 74 65 78 20 56 65 72 69 3REF: Mutex Veri
47a30 66 69 63 61 74 69 6f 6e 20 52 6f 75 74 69 6e 65 fication Routine
47a40 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 s..**..** The sq
47a50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
47a60 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d () and sqlite3_m
47a70 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72 utex_notheld() r
47a80 6f 75 74 69 6e 65 73 0d 0a 2a 2a 20 61 72 65 20 outines..** are
47a90 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 intended for use
47aa0 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 inside assert()
47ab0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 5e 54 statements. ^T
47ac0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a he SQLite core..
47ad0 2a 2a 20 6e 65 76 65 72 20 75 73 65 73 20 74 68 ** never uses th
47ae0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 65 78 63 ese routines exc
47af0 65 70 74 20 69 6e 73 69 64 65 20 61 6e 20 61 73 ept inside an as
47b00 73 65 72 74 28 29 20 61 6e 64 20 61 70 70 6c 69 sert() and appli
47b10 63 61 74 69 6f 6e 73 0d 0a 2a 2a 20 61 72 65 20 cations..** are
47b20 61 64 76 69 73 65 64 20 74 6f 20 66 6f 6c 6c 6f advised to follo
47b30 77 20 74 68 65 20 6c 65 61 64 20 6f 66 20 74 68 w the lead of th
47b40 65 20 63 6f 72 65 2e 20 20 5e 54 68 65 20 53 51 e core. ^The SQ
47b50 4c 69 74 65 20 63 6f 72 65 20 6f 6e 6c 79 0d 0a Lite core only..
47b60 2a 2a 20 70 72 6f 76 69 64 65 73 20 69 6d 70 6c ** provides impl
47b70 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 ementations for
47b80 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 77 these routines w
47b90 68 65 6e 20 69 74 20 69 73 20 63 6f 6d 70 69 6c hen it is compil
47ba0 65 64 0d 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 ed..** with the
47bb0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 66 6c 61 SQLITE_DEBUG fla
47bc0 67 2e 20 20 5e 45 78 74 65 72 6e 61 6c 20 6d 75 g. ^External mu
47bd0 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 tex implementati
47be0 6f 6e 73 0d 0a 2a 2a 20 61 72 65 20 6f 6e 6c 79 ons..** are only
47bf0 20 72 65 71 75 69 72 65 64 20 74 6f 20 70 72 6f required to pro
47c00 76 69 64 65 20 74 68 65 73 65 20 72 6f 75 74 69 vide these routi
47c10 6e 65 73 20 69 66 20 53 51 4c 49 54 45 5f 44 45 nes if SQLITE_DE
47c20 42 55 47 20 69 73 0d 0a 2a 2a 20 64 65 66 69 6e BUG is..** defin
47c30 65 64 20 61 6e 64 20 69 66 20 4e 44 45 42 55 47 ed and if NDEBUG
47c40 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e is not defined.
47c50 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 73 65 20 ..**..** ^These
47c60 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 routines should
47c70 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 return true if t
47c80 68 65 20 6d 75 74 65 78 20 69 6e 20 74 68 65 69 he mutex in thei
47c90 72 20 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 69 r argument..** i
47ca0 73 20 68 65 6c 64 20 6f 72 20 6e 6f 74 20 68 65 s held or not he
47cb0 6c 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 ld, respectively
47cc0 2c 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 , by the calling
47cd0 20 74 68 72 65 61 64 2e 0d 0a 2a 2a 0d 0a 2a 2a thread...**..**
47ce0 20 5e 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 ^The implementa
47cf0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 65 71 75 tion is not requ
47d00 69 72 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 ired to provide
47d10 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 73 versions of thes
47d20 65 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 e..** routines t
47d30 68 61 74 20 61 63 74 75 61 6c 6c 79 20 77 6f 72 hat actually wor
47d40 6b 2e 20 49 66 20 74 68 65 20 69 6d 70 6c 65 6d k. If the implem
47d50 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f entation does no
47d60 74 20 70 72 6f 76 69 64 65 20 77 6f 72 6b 69 6e t provide workin
47d70 67 0d 0a 2a 2a 20 76 65 72 73 69 6f 6e 73 20 6f g..** versions o
47d80 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 f these routines
47d90 2c 20 69 74 20 73 68 6f 75 6c 64 20 61 74 20 6c , it should at l
47da0 65 61 73 74 20 70 72 6f 76 69 64 65 20 73 74 75 east provide stu
47db0 62 73 20 74 68 61 74 20 61 6c 77 61 79 73 0d 0a bs that always..
47dc0 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20 73 ** return true s
47dd0 6f 20 74 68 61 74 20 6f 6e 65 20 64 6f 65 73 20 o that one does
47de0 6e 6f 74 20 67 65 74 20 73 70 75 72 69 6f 75 73 not get spurious
47df0 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 75 assertion failu
47e00 72 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 res...**..** ^If
47e10 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f the argument to
47e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
47e30 65 6c 64 28 29 20 69 73 20 61 20 4e 55 4c 4c 20 eld() is a NULL
47e40 70 6f 69 6e 74 65 72 20 74 68 65 6e 0d 0a 2a 2a pointer then..**
47e50 20 74 68 65 20 72 6f 75 74 69 6e 65 20 73 68 6f the routine sho
47e60 75 6c 64 20 72 65 74 75 72 6e 20 31 2e 20 20 20 uld return 1.
47e70 54 68 69 73 20 73 65 65 6d 73 20 63 6f 75 6e 74 This seems count
47e80 65 72 2d 69 6e 74 75 69 74 69 76 65 20 73 69 6e er-intuitive sin
47e90 63 65 0d 0a 2a 2a 20 63 6c 65 61 72 6c 79 20 74 ce..** clearly t
47ea0 68 65 20 6d 75 74 65 78 20 63 61 6e 6e 6f 74 20 he mutex cannot
47eb0 62 65 20 68 65 6c 64 20 69 66 20 69 74 20 64 6f be held if it do
47ec0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 42 es not exist. B
47ed0 75 74 0d 0a 2a 2a 20 74 68 65 20 72 65 61 73 6f ut..** the reaso
47ee0 6e 20 74 68 65 20 6d 75 74 65 78 20 64 6f 65 73 n the mutex does
47ef0 20 6e 6f 74 20 65 78 69 73 74 20 69 73 20 62 65 not exist is be
47f00 63 61 75 73 65 20 74 68 65 20 62 75 69 6c 64 20 cause the build
47f10 69 73 20 6e 6f 74 0d 0a 2a 2a 20 75 73 69 6e 67 is not..** using
47f20 20 6d 75 74 65 78 65 73 2e 20 20 41 6e 64 20 77 mutexes. And w
47f30 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 e do not want th
47f40 65 20 61 73 73 65 72 74 28 29 20 63 6f 6e 74 61 e assert() conta
47f50 69 6e 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 63 61 ining the..** ca
47f60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75 ll to sqlite3_mu
47f70 74 65 78 5f 68 65 6c 64 28 29 20 74 6f 20 66 61 tex_held() to fa
47f80 69 6c 2c 20 73 6f 20 61 20 6e 6f 6e 2d 7a 65 72 il, so a non-zer
47f90 6f 20 72 65 74 75 72 6e 20 69 73 0d 0a 2a 2a 20 o return is..**
47fa0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
47fb0 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 5e 54 thing to do. ^T
47fc0 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 he sqlite3_mutex
47fd0 5f 6e 6f 74 68 65 6c 64 28 29 0d 0a 2a 2a 20 69 _notheld()..** i
47fe0 6e 74 65 72 66 61 63 65 20 73 68 6f 75 6c 64 20 nterface should
47ff0 61 6c 73 6f 20 72 65 74 75 72 6e 20 31 20 77 68 also return 1 wh
48000 65 6e 20 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 en given a NULL
48010 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d 0a 23 69 pointer...*/..#i
48020 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 53 51 fndef NDEBUG..SQ
48030 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
48040 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
48050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2a 29 3b sqlite3_mutex*);
48060 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
48070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e sqlite3_mutex_n
48080 6f 74 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d otheld(sqlite3_m
48090 75 74 65 78 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d utex*);..#endif.
480a0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 .../*..** CAPI3R
480b0 45 46 3a 20 4d 75 74 65 78 20 54 79 70 65 73 0d EF: Mutex Types.
480c0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 5b 73 71 6c .**..** The [sql
480d0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 ite3_mutex_alloc
480e0 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20 74 61 ()] interface ta
480f0 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 61 72 67 kes a single arg
48100 75 6d 65 6e 74 0d 0a 2a 2a 20 77 68 69 63 68 20 ument..** which
48110 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 is one of these
48120 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 integer constant
48130 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 s...**..** The s
48140 65 74 20 6f 66 20 73 74 61 74 69 63 20 6d 75 74 et of static mut
48150 65 78 65 73 20 6d 61 79 20 63 68 61 6e 67 65 20 exes may change
48160 66 72 6f 6d 20 6f 6e 65 20 53 51 4c 69 74 65 20 from one SQLite
48170 72 65 6c 65 61 73 65 20 74 6f 20 74 68 65 0d 0a release to the..
48180 2a 2a 20 6e 65 78 74 2e 20 20 41 70 70 6c 69 63 ** next. Applic
48190 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 76 65 72 ations that over
481a0 72 69 64 65 20 74 68 65 20 62 75 69 6c 74 2d 69 ride the built-i
481b0 6e 20 6d 75 74 65 78 20 6c 6f 67 69 63 20 6d 75 n mutex logic mu
481c0 73 74 20 62 65 0d 0a 2a 2a 20 70 72 65 70 61 72 st be..** prepar
481d0 65 64 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 ed to accommodat
481e0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 74 61 e additional sta
481f0 74 69 63 20 6d 75 74 65 78 65 73 2e 0d 0a 2a 2f tic mutexes...*/
48200 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
48210 5f 4d 55 54 45 58 5f 46 41 53 54 20 20 20 20 20 _MUTEX_FAST
48220 20 20 20 20 20 20 20 20 30 0d 0a 23 64 65 66 69 0..#defi
48230 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f ne SQLITE_MUTEX_
48240 52 45 43 55 52 53 49 56 45 20 20 20 20 20 20 20 RECURSIVE
48250 20 31 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 1..#define SQLI
48260 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
48270 4d 41 53 54 45 52 20 20 20 20 32 0d 0a 23 64 65 MASTER 2..#de
48280 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 fine SQLITE_MUTE
48290 58 5f 53 54 41 54 49 43 5f 4d 45 4d 20 20 20 20 X_STATIC_MEM
482a0 20 20 20 33 20 20 2f 2a 20 73 71 6c 69 74 65 33 3 /* sqlite3
482b0 5f 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0d 0a 23 64 _malloc() */..#d
482c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 efine SQLITE_MUT
482d0 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 20 EX_STATIC_MEM2
482e0 20 20 20 20 34 20 20 2f 2a 20 4e 4f 54 20 55 53 4 /* NOT US
482f0 45 44 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ED */..#define S
48300 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 QLITE_MUTEX_STAT
48310 49 43 5f 4f 50 45 4e 20 20 20 20 20 20 34 20 20 IC_OPEN 4
48320 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f /* sqlite3BtreeO
48330 70 65 6e 28 29 20 2a 2f 0d 0a 23 64 65 66 69 6e pen() */..#defin
48340 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 e SQLITE_MUTEX_S
48350 54 41 54 49 43 5f 50 52 4e 47 20 20 20 20 20 20 TATIC_PRNG
48360 35 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 61 5 /* sqlite3_ra
48370 6e 64 6f 6d 28 29 20 2a 2f 0d 0a 23 64 65 66 69 ndom() */..#defi
48380 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f ne SQLITE_MUTEX_
48390 53 54 41 54 49 43 5f 4c 52 55 20 20 20 20 20 20 STATIC_LRU
483a0 20 36 20 20 2f 2a 20 6c 72 75 20 70 61 67 65 20 6 /* lru page
483b0 6c 69 73 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 list */..#define
483c0 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 SQLITE_MUTEX_ST
483d0 41 54 49 43 5f 4c 52 55 32 20 20 20 20 20 20 37 ATIC_LRU2 7
483e0 20 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f /* NOT USED */
483f0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
48400 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 50 4d _MUTEX_STATIC_PM
48410 45 4d 20 20 20 20 20 20 37 20 20 2f 2a 20 73 71 EM 7 /* sq
48420 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 lite3PageMalloc(
48430 29 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ) */..../*..** C
48440 41 50 49 33 52 45 46 3a 20 52 65 74 72 69 65 76 API3REF: Retriev
48450 65 20 74 68 65 20 6d 75 74 65 78 20 66 6f 72 20 e the mutex for
48460 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 a database conne
48470 63 74 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 ction..**..** ^T
48480 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 72 65 his interface re
48490 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 turns a pointer
484a0 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 6d 75 74 the [sqlite3_mut
484b0 65 78 5d 20 6f 62 6a 65 63 74 20 74 68 61 74 20 ex] object that
484c0 0d 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 73 20 ..** serializes
484d0 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 5b 64 access to the [d
484e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
484f0 6f 6e 5d 20 67 69 76 65 6e 20 69 6e 20 74 68 65 on] given in the
48500 20 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 77 68 argument..** wh
48510 65 6e 20 74 68 65 20 5b 74 68 72 65 61 64 69 6e en the [threadin
48520 67 20 6d 6f 64 65 5d 20 69 73 20 53 65 72 69 61 g mode] is Seria
48530 6c 69 7a 65 64 2e 0d 0a 2a 2a 20 5e 49 66 20 74 lized...** ^If t
48540 68 65 20 5b 74 68 72 65 61 64 69 6e 67 20 6d 6f he [threading mo
48550 64 65 5d 20 69 73 20 53 69 6e 67 6c 65 2d 74 68 de] is Single-th
48560 72 65 61 64 20 6f 72 20 4d 75 6c 74 69 2d 74 68 read or Multi-th
48570 72 65 61 64 20 74 68 65 6e 20 74 68 69 73 0d 0a read then this..
48580 2a 2a 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 ** routine retur
48590 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 ns a NULL pointe
485a0 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 r...*/..SQLITE_A
485b0 50 49 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 PI sqlite3_mutex
485c0 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 *sqlite3_db_mut
485d0 65 78 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d ex(sqlite3*);...
485e0 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
485f0 3a 20 4c 6f 77 2d 4c 65 76 65 6c 20 43 6f 6e 74 : Low-Level Cont
48600 72 6f 6c 20 4f 66 20 44 61 74 61 62 61 73 65 20 rol Of Database
48610 46 69 6c 65 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 Files..**..** ^T
48620 68 65 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c 65 he [sqlite3_file
48630 5f 63 6f 6e 74 72 6f 6c 28 29 5d 20 69 6e 74 65 _control()] inte
48640 72 66 61 63 65 20 6d 61 6b 65 73 20 61 20 64 69 rface makes a di
48650 72 65 63 74 20 63 61 6c 6c 20 74 6f 20 74 68 65 rect call to the
48660 0d 0a 2a 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f ..** xFileContro
48670 6c 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65 l method for the
48680 20 5b 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 [sqlite3_io_met
48690 68 6f 64 73 5d 20 6f 62 6a 65 63 74 20 61 73 73 hods] object ass
486a0 6f 63 69 61 74 65 64 0d 0a 2a 2a 20 77 69 74 68 ociated..** with
486b0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 a particular da
486c0 74 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 tabase identifie
486d0 64 20 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20 d by the second
486e0 61 72 67 75 6d 65 6e 74 2e 20 5e 54 68 65 0d 0a argument. ^The..
486f0 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 ** name of the d
48700 61 74 61 62 61 73 65 20 69 73 20 22 6d 61 69 6e atabase is "main
48710 22 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 " for the main d
48720 61 74 61 62 61 73 65 20 6f 72 20 22 74 65 6d 70 atabase or "temp
48730 22 20 66 6f 72 20 74 68 65 0d 0a 2a 2a 20 54 45 " for the..** TE
48740 4d 50 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 MP database, or
48750 74 68 65 20 6e 61 6d 65 20 74 68 61 74 20 61 70 the name that ap
48760 70 65 61 72 73 20 61 66 74 65 72 20 74 68 65 20 pears after the
48770 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 0d 0a AS keyword for..
48780 2a 2a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 ** databases tha
48790 74 20 61 72 65 20 61 64 64 65 64 20 75 73 69 6e t are added usin
487a0 67 20 74 68 65 20 5b 41 54 54 41 43 48 5d 20 53 g the [ATTACH] S
487b0 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 2a 2a 20 QL command...**
487c0 5e 41 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 ^A NULL pointer
487d0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 70 can be used in p
487e0 6c 61 63 65 20 6f 66 20 22 6d 61 69 6e 22 20 74 lace of "main" t
487f0 6f 20 72 65 66 65 72 20 74 6f 20 74 68 65 0d 0a o refer to the..
48800 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 ** main database
48810 20 66 69 6c 65 2e 0d 0a 2a 2a 20 5e 54 68 65 20 file...** ^The
48820 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 third and fourth
48830 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 parameters to t
48840 68 69 73 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 his routine..**
48850 61 72 65 20 70 61 73 73 65 64 20 64 69 72 65 63 are passed direc
48860 74 6c 79 20 74 68 72 6f 75 67 68 20 74 6f 20 74 tly through to t
48870 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 he second and th
48880 69 72 64 20 70 61 72 61 6d 65 74 65 72 73 20 6f ird parameters o
48890 66 0d 0a 2a 2a 20 74 68 65 20 78 46 69 6c 65 43 f..** the xFileC
488a0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 20 ontrol method.
488b0 5e 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 ^The return valu
488c0 65 20 6f 66 20 74 68 65 20 78 46 69 6c 65 43 6f e of the xFileCo
488d0 6e 74 72 6f 6c 0d 0a 2a 2a 20 6d 65 74 68 6f 64 ntrol..** method
488e0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 becomes the ret
488f0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 urn value of thi
48900 73 20 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2a 0d 0a s routine...**..
48910 2a 2a 20 5e 54 68 65 20 53 51 4c 49 54 45 5f 46 ** ^The SQLITE_F
48920 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 CNTL_FILE_POINTE
48930 52 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 R value for the
48940 6f 70 20 70 61 72 61 6d 65 74 65 72 20 63 61 75 op parameter cau
48950 73 65 73 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 ses..** a pointe
48960 72 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 r to the underly
48970 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 66 69 6c ing [sqlite3_fil
48980 65 5d 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 e] object to be
48990 77 72 69 74 74 65 6e 20 69 6e 74 6f 0d 0a 2a 2a written into..**
489a0 20 74 68 65 20 73 70 61 63 65 20 70 6f 69 6e 74 the space point
489b0 65 64 20 74 6f 20 62 79 20 74 68 65 20 34 74 68 ed to by the 4th
489c0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 5e 54 68 parameter. ^Th
489d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 e SQLITE_FCNTL_F
489e0 49 4c 45 5f 50 4f 49 4e 54 45 52 0d 0a 2a 2a 20 ILE_POINTER..**
489f0 63 61 73 65 20 69 73 20 61 20 73 68 6f 72 74 2d case is a short-
48a00 63 69 72 63 75 69 74 20 70 61 74 68 20 77 68 69 circuit path whi
48a10 63 68 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 ch does not actu
48a20 61 6c 6c 79 20 69 6e 76 6f 6b 65 20 74 68 65 0d ally invoke the.
48a30 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 .** underlying s
48a40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 qlite3_io_method
48a50 73 2e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d s.xFileControl m
48a60 65 74 68 6f 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ethod...**..** ^
48a70 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 If the second pa
48a80 72 61 6d 65 74 65 72 20 28 7a 44 62 4e 61 6d 65 rameter (zDbName
48a90 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 ) does not match
48aa0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79 the name of any
48ab0 0d 0a 2a 2a 20 6f 70 65 6e 20 64 61 74 61 62 61 ..** open databa
48ac0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 se file, then SQ
48ad0 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 20 72 65 LITE_ERROR is re
48ae0 74 75 72 6e 65 64 2e 20 20 5e 54 68 69 73 20 65 turned. ^This e
48af0 72 72 6f 72 0d 0a 2a 2a 20 63 6f 64 65 20 69 73 rror..** code is
48b00 20 6e 6f 74 20 72 65 6d 65 6d 62 65 72 65 64 20 not remembered
48b10 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 and will not be
48b20 72 65 63 61 6c 6c 65 64 20 62 79 20 5b 73 71 6c recalled by [sql
48b30 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 5d 0d ite3_errcode()].
48b40 0a 2a 2a 20 6f 72 20 5b 73 71 6c 69 74 65 33 5f .** or [sqlite3_
48b50 65 72 72 6d 73 67 28 29 5d 2e 20 20 54 68 65 20 errmsg()]. The
48b60 75 6e 64 65 72 6c 79 69 6e 67 20 78 46 69 6c 65 underlying xFile
48b70 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6d Control method m
48b80 69 67 68 74 0d 0a 2a 2a 20 61 6c 73 6f 20 72 65 ight..** also re
48b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
48ba0 52 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 R. There is no
48bb0 77 61 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 way to distingui
48bc0 73 68 20 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 61 sh between..** a
48bd0 6e 20 69 6e 63 6f 72 72 65 63 74 20 7a 44 62 4e n incorrect zDbN
48be0 61 6d 65 20 61 6e 64 20 61 6e 20 53 51 4c 49 54 ame and an SQLIT
48bf0 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 20 66 E_ERROR return f
48c00 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 rom the underlyi
48c10 6e 67 0d 0a 2a 2a 20 78 46 69 6c 65 43 6f 6e 74 ng..** xFileCont
48c20 72 6f 6c 20 6d 65 74 68 6f 64 2e 0d 0a 2a 2a 0d rol method...**.
48c30 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 5b 53 .** See also: [S
48c40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b QLITE_FCNTL_LOCK
48c50 53 54 41 54 45 5d 0d 0a 2a 2f 0d 0a 53 51 4c 49 STATE]..*/..SQLI
48c60 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
48c70 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 e3_file_control(
48c80 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 sqlite3*, const
48c90 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 char *zDbName, i
48ca0 6e 74 20 6f 70 2c 20 76 6f 69 64 2a 29 3b 0d 0a nt op, void*);..
48cb0 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
48cc0 46 3a 20 54 65 73 74 69 6e 67 20 49 6e 74 65 72 F: Testing Inter
48cd0 66 61 63 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 face..**..** ^Th
48ce0 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 e sqlite3_test_c
48cf0 6f 6e 74 72 6f 6c 28 29 20 69 6e 74 65 72 66 61 ontrol() interfa
48d00 63 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 ce is used to re
48d10 61 64 20 6f 75 74 20 69 6e 74 65 72 6e 61 6c 0d ad out internal.
48d20 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 53 51 4c .** state of SQL
48d30 69 74 65 20 61 6e 64 20 74 6f 20 69 6e 6a 65 63 ite and to injec
48d40 74 20 66 61 75 6c 74 73 20 69 6e 74 6f 20 53 51 t faults into SQ
48d50 4c 69 74 65 20 66 6f 72 20 74 65 73 74 69 6e 67 Lite for testing
48d60 0d 0a 2a 2a 20 70 75 72 70 6f 73 65 73 2e 20 20 ..** purposes.
48d70 5e 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d ^The first param
48d80 65 74 65 72 20 69 73 20 61 6e 20 6f 70 65 72 61 eter is an opera
48d90 74 69 6f 6e 20 63 6f 64 65 20 74 68 61 74 20 64 tion code that d
48da0 65 74 65 72 6d 69 6e 65 73 0d 0a 2a 2a 20 74 68 etermines..** th
48db0 65 20 6e 75 6d 62 65 72 2c 20 6d 65 61 6e 69 6e e number, meanin
48dc0 67 2c 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e g, and operation
48dd0 20 6f 66 20 61 6c 6c 20 73 75 62 73 65 71 75 65 of all subseque
48de0 6e 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a nt parameters...
48df0 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 **..** This inte
48e00 72 66 61 63 65 20 69 73 20 6e 6f 74 20 66 6f 72 rface is not for
48e10 20 75 73 65 20 62 79 20 61 70 70 6c 69 63 61 74 use by applicat
48e20 69 6f 6e 73 2e 20 20 49 74 20 65 78 69 73 74 73 ions. It exists
48e30 20 73 6f 6c 65 6c 79 0d 0a 2a 2a 20 66 6f 72 20 solely..** for
48e40 76 65 72 69 66 79 69 6e 67 20 74 68 65 20 63 6f verifying the co
48e50 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 rrect operation
48e60 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 of the SQLite li
48e70 62 72 61 72 79 2e 20 20 44 65 70 65 6e 64 69 6e brary. Dependin
48e80 67 0d 0a 2a 2a 20 6f 6e 20 68 6f 77 20 74 68 65 g..** on how the
48e90 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 SQLite library
48ea0 69 73 20 63 6f 6d 70 69 6c 65 64 2c 20 74 68 69 is compiled, thi
48eb0 73 20 69 6e 74 65 72 66 61 63 65 20 6d 69 67 68 s interface migh
48ec0 74 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 2a 2a t not exist...**
48ed0 0d 0a 2a 2a 20 54 68 65 20 64 65 74 61 69 6c 73 ..** The details
48ee0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f of the operatio
48ef0 6e 20 63 6f 64 65 73 2c 20 74 68 65 69 72 20 6d n codes, their m
48f00 65 61 6e 69 6e 67 73 2c 20 74 68 65 20 70 61 72 eanings, the par
48f10 61 6d 65 74 65 72 73 0d 0a 2a 2a 20 74 68 65 79 ameters..** they
48f20 20 74 61 6b 65 2c 20 61 6e 64 20 77 68 61 74 20 take, and what
48f30 74 68 65 79 20 64 6f 20 61 72 65 20 61 6c 6c 20 they do are all
48f40 73 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 subject to chang
48f50 65 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 e without notice
48f60 2e 0d 0a 2a 2a 20 55 6e 6c 69 6b 65 20 6d 6f 73 ...** Unlike mos
48f70 74 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 t of the SQLite
48f80 41 50 49 2c 20 74 68 69 73 20 66 75 6e 63 74 69 API, this functi
48f90 6f 6e 20 69 73 20 6e 6f 74 20 67 75 61 72 61 6e on is not guaran
48fa0 74 65 65 64 20 74 6f 0d 0a 2a 2a 20 6f 70 65 72 teed to..** oper
48fb0 61 74 65 20 63 6f 6e 73 69 73 74 65 6e 74 6c 79 ate consistently
48fc0 20 66 72 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 from one releas
48fd0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 0d 0a e to the next...
48fe0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
48ff0 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f nt sqlite3_test_
49000 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 control(int op,
49010 2e 2e 2e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ...);..../*..**
49020 43 41 50 49 33 52 45 46 3a 20 54 65 73 74 69 6e CAPI3REF: Testin
49030 67 20 49 6e 74 65 72 66 61 63 65 20 4f 70 65 72 g Interface Oper
49040 61 74 69 6f 6e 20 43 6f 64 65 73 0d 0a 2a 2a 0d ation Codes..**.
49050 0a 2a 2a 20 54 68 65 73 65 20 63 6f 6e 73 74 61 .** These consta
49060 6e 74 73 20 61 72 65 20 74 68 65 20 76 61 6c 69 nts are the vali
49070 64 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 64 65 d operation code
49080 20 70 61 72 61 6d 65 74 65 72 73 20 75 73 65 64 parameters used
49090 0d 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 ..** as the firs
490a0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 5b 73 t argument to [s
490b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 qlite3_test_cont
490c0 72 6f 6c 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 rol()]...**..**
490d0 54 68 65 73 65 20 70 61 72 61 6d 65 74 65 72 73 These parameters
490e0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 and their meani
490f0 6e 67 73 20 61 72 65 20 73 75 62 6a 65 63 74 20 ngs are subject
49100 74 6f 20 63 68 61 6e 67 65 0d 0a 2a 2a 20 77 69 to change..** wi
49110 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 20 54 thout notice. T
49120 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20 hese values are
49130 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 for testing purp
49140 6f 73 65 73 20 6f 6e 6c 79 2e 0d 0a 2a 2a 20 41 oses only...** A
49150 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 pplications shou
49160 6c 64 20 6e 6f 74 20 75 73 65 20 61 6e 79 20 6f ld not use any o
49170 66 20 74 68 65 73 65 20 70 61 72 61 6d 65 74 65 f these paramete
49180 72 73 20 6f 72 20 74 68 65 0d 0a 2a 2a 20 5b 73 rs or the..** [s
49190 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 qlite3_test_cont
491a0 72 6f 6c 28 29 5d 20 69 6e 74 65 72 66 61 63 65 rol()] interface
491b0 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ...*/..#define S
491c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 QLITE_TESTCTRL_F
491d0 49 52 53 54 20 20 20 20 20 20 20 20 20 20 20 20 IRST
491e0 20 20 20 20 20 20 20 20 35 0d 0a 23 64 65 66 69 5..#defi
491f0 6e 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 ne SQLITE_TESTCT
49200 52 4c 5f 50 52 4e 47 5f 53 41 56 45 20 20 20 20 RL_PRNG_SAVE
49210 20 20 20 20 20 20 20 20 20 20 20 20 35 0d 0a 23 5..#
49220 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 define SQLITE_TE
49230 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 STCTRL_PRNG_REST
49240 4f 52 45 20 20 20 20 20 20 20 20 20 20 20 20 20 ORE
49250 36 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 6..#define SQLIT
49260 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f E_TESTCTRL_PRNG_
49270 52 45 53 45 54 20 20 20 20 20 20 20 20 20 20 20 RESET
49280 20 20 20 20 37 0d 0a 23 64 65 66 69 6e 65 20 53 7..#define S
49290 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 QLITE_TESTCTRL_B
492a0 49 54 56 45 43 5f 54 45 53 54 20 20 20 20 20 20 ITVEC_TEST
492b0 20 20 20 20 20 20 20 20 38 0d 0a 23 64 65 66 69 8..#defi
492c0 6e 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 ne SQLITE_TESTCT
492d0 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c RL_FAULT_INSTALL
492e0 20 20 20 20 20 20 20 20 20 20 20 20 39 0d 0a 23 9..#
492f0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 define SQLITE_TE
49300 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 STCTRL_BENIGN_MA
49310 4c 4c 4f 43 5f 48 4f 4f 4b 53 20 20 20 20 20 31 LLOC_HOOKS 1
49320 30 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 0..#define SQLIT
49330 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 E_TESTCTRL_PENDI
49340 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 20 NG_BYTE
49350 20 20 20 31 31 0d 0a 23 64 65 66 69 6e 65 20 53 11..#define S
49360 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 QLITE_TESTCTRL_A
49370 53 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 SSERT
49380 20 20 20 20 20 20 20 31 32 0d 0a 23 64 65 66 69 12..#defi
49390 6e 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 ne SQLITE_TESTCT
493a0 52 4c 5f 41 4c 57 41 59 53 20 20 20 20 20 20 20 RL_ALWAYS
493b0 20 20 20 20 20 20 20 20 20 20 20 31 33 0d 0a 23 13..#
493c0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 define SQLITE_TE
493d0 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 20 20 STCTRL_RESERVE
493e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
493f0 34 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 4..#define SQLIT
49400 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d E_TESTCTRL_OPTIM
49410 49 5a 41 54 49 4f 4e 53 20 20 20 20 20 20 20 20 IZATIONS
49420 20 20 20 31 35 0d 0a 23 64 65 66 69 6e 65 20 53 15..#define S
49430 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 QLITE_TESTCTRL_I
49440 53 4b 45 59 57 4f 52 44 20 20 20 20 20 20 20 20 SKEYWORD
49450 20 20 20 20 20 20 20 31 36 0d 0a 23 64 65 66 69 16..#defi
49460 6e 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 ne SQLITE_TESTCT
49470 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 RL_SCRATCHMALLOC
49480 20 20 20 20 20 20 20 20 20 20 20 31 37 0d 0a 23 17..#
49490 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 define SQLITE_TE
494a0 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 STCTRL_LOCALTIME
494b0 5f 46 41 55 4c 54 20 20 20 20 20 20 20 20 20 31 _FAULT 1
494c0 38 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 8..#define SQLIT
494d0 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 E_TESTCTRL_EXPLA
494e0 49 4e 5f 53 54 4d 54 20 20 20 20 20 20 20 20 20 IN_STMT
494f0 20 20 20 31 39 0d 0a 23 64 65 66 69 6e 65 20 53 19..#define S
49500 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c QLITE_TESTCTRL_L
49510 41 53 54 20 20 20 20 20 20 20 20 20 20 20 20 20 AST
49520 20 20 20 20 20 20 20 31 39 0d 0a 0d 0a 2f 2a 0d 19..../*.
49530 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 51 .** CAPI3REF: SQ
49540 4c 69 74 65 20 52 75 6e 74 69 6d 65 20 53 74 61 Lite Runtime Sta
49550 74 75 73 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 69 tus..**..** ^Thi
49560 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 s interface is u
49570 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 sed to retrieve
49580 72 75 6e 74 69 6d 65 20 73 74 61 74 75 73 20 69 runtime status i
49590 6e 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a 20 61 nformation..** a
495a0 62 6f 75 74 20 74 68 65 20 70 65 72 66 6f 72 6d bout the perform
495b0 61 6e 63 65 20 6f 66 20 53 51 4c 69 74 65 2c 20 ance of SQLite,
495c0 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 and optionally t
495d0 6f 20 72 65 73 65 74 20 76 61 72 69 6f 75 73 0d o reset various.
495e0 0a 2a 2a 20 68 69 67 68 77 61 74 65 72 20 6d 61 .** highwater ma
495f0 72 6b 73 2e 20 20 5e 54 68 65 20 66 69 72 73 74 rks. ^The first
49600 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 argument is an
49610 69 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 integer code for
49620 0d 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 ..** the specifi
49630 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 6d c parameter to m
49640 65 61 73 75 72 65 2e 20 20 5e 28 52 65 63 6f 67 easure. ^(Recog
49650 6e 69 7a 65 64 20 69 6e 74 65 67 65 72 20 63 6f nized integer co
49660 64 65 73 0d 0a 2a 2a 20 61 72 65 20 6f 66 20 74 des..** are of t
49670 68 65 20 66 6f 72 6d 20 5b 73 74 61 74 75 73 20 he form [status
49680 70 61 72 61 6d 65 74 65 72 73 20 7c 20 53 51 4c parameters | SQL
49690 49 54 45 5f 53 54 41 54 55 53 5f 2e 2e 2e 5d 2e ITE_STATUS_...].
496a0 29 5e 0d 0a 2a 2a 20 5e 54 68 65 20 63 75 72 72 )^..** ^The curr
496b0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 ent value of the
496c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 parameter is re
496d0 74 75 72 6e 65 64 20 69 6e 74 6f 20 2a 70 43 75 turned into *pCu
496e0 72 72 65 6e 74 2e 0d 0a 2a 2a 20 5e 54 68 65 20 rrent...** ^The
496f0 68 69 67 68 65 73 74 20 72 65 63 6f 72 64 65 64 highest recorded
49700 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e value is return
49710 65 64 20 69 6e 20 2a 70 48 69 67 68 77 61 74 65 ed in *pHighwate
49720 72 2e 20 20 5e 49 66 20 74 68 65 0d 0a 2a 2a 20 r. ^If the..**
49730 72 65 73 65 74 46 6c 61 67 20 69 73 20 74 72 75 resetFlag is tru
49740 65 2c 20 74 68 65 6e 20 74 68 65 20 68 69 67 68 e, then the high
49750 65 73 74 20 72 65 63 6f 72 64 20 76 61 6c 75 65 est record value
49760 20 69 73 20 72 65 73 65 74 20 61 66 74 65 72 0d is reset after.
49770 0a 2a 2a 20 2a 70 48 69 67 68 77 61 74 65 72 20 .** *pHighwater
49780 69 73 20 77 72 69 74 74 65 6e 2e 20 20 5e 28 53 is written. ^(S
49790 6f 6d 65 20 70 61 72 61 6d 65 74 65 72 73 20 64 ome parameters d
497a0 6f 20 6e 6f 74 20 72 65 63 6f 72 64 20 74 68 65 o not record the
497b0 20 68 69 67 68 65 73 74 0d 0a 2a 2a 20 76 61 6c highest..** val
497c0 75 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 20 70 ue. For those p
497d0 61 72 61 6d 65 74 65 72 73 0d 0a 2a 2a 20 6e 6f arameters..** no
497e0 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e thing is written
497f0 20 69 6e 74 6f 20 2a 70 48 69 67 68 77 61 74 65 into *pHighwate
49800 72 20 61 6e 64 20 74 68 65 20 72 65 73 65 74 46 r and the resetF
49810 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 29 lag is ignored.)
49820 5e 0d 0a 2a 2a 20 5e 28 4f 74 68 65 72 20 70 61 ^..** ^(Other pa
49830 72 61 6d 65 74 65 72 73 20 72 65 63 6f 72 64 20 rameters record
49840 6f 6e 6c 79 20 74 68 65 20 68 69 67 68 77 61 74 only the highwat
49850 65 72 20 6d 61 72 6b 20 61 6e 64 20 6e 6f 74 20 er mark and not
49860 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 the current..**
49870 76 61 6c 75 65 2e 20 20 46 6f 72 20 74 68 65 73 value. For thes
49880 65 20 6c 61 74 74 65 72 20 70 61 72 61 6d 65 74 e latter paramet
49890 65 72 73 20 6e 6f 74 68 69 6e 67 20 69 73 20 77 ers nothing is w
498a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 43 75 ritten into *pCu
498b0 72 72 65 6e 74 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a rrent.)^..**..**
498c0 20 5e 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 ^The sqlite3_st
498d0 61 74 75 73 28 29 20 72 6f 75 74 69 6e 65 20 72 atus() routine r
498e0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b eturns SQLITE_OK
498f0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 on success and
49900 61 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 5b a..** non-zero [
49910 65 72 72 6f 72 20 63 6f 64 65 5d 20 6f 6e 20 66 error code] on f
49920 61 69 6c 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ailure...**..**
49930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
49940 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 69 threadsafe but i
49950 73 20 6e 6f 74 20 61 74 6f 6d 69 63 2e 20 20 54 s not atomic. T
49960 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 his routine can
49970 62 65 0d 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 68 be..** called wh
49980 69 6c 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 ile other thread
49990 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 74 68 s are running th
499a0 65 20 73 61 6d 65 20 6f 72 20 64 69 66 66 65 72 e same or differ
499b0 65 6e 74 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 69 ent SQLite..** i
499c0 6e 74 65 72 66 61 63 65 73 2e 20 20 48 6f 77 65 nterfaces. Howe
499d0 76 65 72 20 74 68 65 20 76 61 6c 75 65 73 20 72 ver the values r
499e0 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 43 75 72 eturned in *pCur
499f0 72 65 6e 74 20 61 6e 64 0d 0a 2a 2a 20 2a 70 48 rent and..** *pH
49a00 69 67 68 77 61 74 65 72 20 72 65 66 6c 65 63 74 ighwater reflect
49a10 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 53 the status of S
49a20 51 4c 69 74 65 20 61 74 20 64 69 66 66 65 72 65 QLite at differe
49a30 6e 74 20 70 6f 69 6e 74 73 20 69 6e 20 74 69 6d nt points in tim
49a40 65 0d 0a 2a 2a 20 61 6e 64 20 69 74 20 69 73 20 e..** and it is
49a50 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e possible that an
49a60 6f 74 68 65 72 20 74 68 72 65 61 64 20 6d 69 67 other thread mig
49a70 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 ht change the pa
49a80 72 61 6d 65 74 65 72 0d 0a 2a 2a 20 69 6e 20 62 rameter..** in b
49a90 65 74 77 65 65 6e 20 74 68 65 20 74 69 6d 65 73 etween the times
49aa0 20 77 68 65 6e 20 2a 70 43 75 72 72 65 6e 74 20 when *pCurrent
49ab0 61 6e 64 20 2a 70 48 69 67 68 77 61 74 65 72 20 and *pHighwater
49ac0 61 72 65 20 77 72 69 74 74 65 6e 2e 0d 0a 2a 2a are written...**
49ad0 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 5b ..** See also: [
49ae0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 sqlite3_db_statu
49af0 73 28 29 5d 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 s()]..*/..SQLITE
49b00 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
49b10 5f 73 74 61 74 75 73 28 69 6e 74 20 6f 70 2c 20 _status(int op,
49b20 69 6e 74 20 2a 70 43 75 72 72 65 6e 74 2c 20 69 int *pCurrent, i
49b30 6e 74 20 2a 70 48 69 67 68 77 61 74 65 72 2c 20 nt *pHighwater,
49b40 69 6e 74 20 72 65 73 65 74 46 6c 61 67 29 3b 0d int resetFlag);.
49b50 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ...../*..** CAPI
49b60 33 52 45 46 3a 20 53 74 61 74 75 73 20 50 61 72 3REF: Status Par
49b70 61 6d 65 74 65 72 73 0d 0a 2a 2a 20 4b 45 59 57 ameters..** KEYW
49b80 4f 52 44 53 3a 20 7b 73 74 61 74 75 73 20 70 61 ORDS: {status pa
49b90 72 61 6d 65 74 65 72 73 7d 0d 0a 2a 2a 0d 0a 2a rameters}..**..*
49ba0 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 20 * These integer
49bb0 63 6f 6e 73 74 61 6e 74 73 20 64 65 73 69 67 6e constants design
49bc0 61 74 65 20 76 61 72 69 6f 75 73 20 72 75 6e 2d ate various run-
49bd0 74 69 6d 65 20 73 74 61 74 75 73 20 70 61 72 61 time status para
49be0 6d 65 74 65 72 73 0d 0a 2a 2a 20 74 68 61 74 20 meters..** that
49bf0 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65 64 20 can be returned
49c00 62 79 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 by [sqlite3_stat
49c10 75 73 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c us()]...**..** <
49c20 64 6c 3e 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 dl>..** [[SQLITE
49c30 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 _STATUS_MEMORY_U
49c40 53 45 44 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 SED]] ^(<dt>SQLI
49c50 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 TE_STATUS_MEMORY
49c60 5f 55 53 45 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c _USED</dt>..** <
49c70 64 64 3e 54 68 69 73 20 70 61 72 61 6d 65 74 65 dd>This paramete
49c80 72 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 r is the current
49c90 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 amount of memor
49ca0 79 20 63 68 65 63 6b 65 64 20 6f 75 74 0d 0a 2a y checked out..*
49cb0 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 * using [sqlite3
49cc0 5f 6d 61 6c 6c 6f 63 28 29 5d 2c 20 65 69 74 68 _malloc()], eith
49cd0 65 72 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 er directly or i
49ce0 6e 64 69 72 65 63 74 6c 79 2e 20 20 54 68 65 0d ndirectly. The.
49cf0 0a 2a 2a 20 66 69 67 75 72 65 20 69 6e 63 6c 75 .** figure inclu
49d00 64 65 73 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 des calls made t
49d10 6f 20 5b 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f o [sqlite3_mallo
49d20 63 28 29 5d 20 62 79 20 74 68 65 20 61 70 70 6c c()] by the appl
49d30 69 63 61 74 69 6f 6e 0d 0a 2a 2a 20 61 6e 64 20 ication..** and
49d40 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 internal memory
49d50 75 73 61 67 65 20 62 79 20 74 68 65 20 53 51 4c usage by the SQL
49d60 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20 53 63 ite library. Sc
49d70 72 61 74 63 68 20 6d 65 6d 6f 72 79 0d 0a 2a 2a ratch memory..**
49d80 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 5b controlled by [
49d90 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 SQLITE_CONFIG_SC
49da0 52 41 54 43 48 5d 20 61 6e 64 20 61 75 78 69 6c RATCH] and auxil
49db0 69 61 72 79 20 70 61 67 65 2d 63 61 63 68 65 0d iary page-cache.
49dc0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 72 .** memory contr
49dd0 6f 6c 6c 65 64 20 62 79 20 5b 53 51 4c 49 54 45 olled by [SQLITE
49de0 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 _CONFIG_PAGECACH
49df0 45 5d 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 E] is not includ
49e00 65 64 20 69 6e 0d 0a 2a 2a 20 74 68 69 73 20 70 ed in..** this p
49e10 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 61 arameter. The a
49e20 6d 6f 75 6e 74 20 72 65 74 75 72 6e 65 64 20 69 mount returned i
49e30 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 s the sum of the
49e40 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d 0a 2a 2a 20 allocation..**
49e50 73 69 7a 65 73 20 61 73 20 72 65 70 6f 72 74 65 sizes as reporte
49e60 64 20 62 79 20 74 68 65 20 78 53 69 7a 65 20 6d d by the xSize m
49e70 65 74 68 6f 64 20 69 6e 20 5b 73 71 6c 69 74 65 ethod in [sqlite
49e80 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 5d 2e 3c 3_mem_methods].<
49e90 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b /dd>)^..**..** [
49ea0 5b 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d [SQLITE_STATUS_M
49eb0 41 4c 4c 4f 43 5f 53 49 5a 45 5d 5d 20 5e 28 3c ALLOC_SIZE]] ^(<
49ec0 64 74 3e 53 51 4c 49 54 45 5f 53 54 41 54 55 53 dt>SQLITE_STATUS
49ed0 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 3c 2f 64 74 _MALLOC_SIZE</dt
49ee0 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 73 20 70 >..** <dd>This p
49ef0 61 72 61 6d 65 74 65 72 20 72 65 63 6f 72 64 73 arameter records
49f00 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65 6d the largest mem
49f10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 ory allocation r
49f20 65 71 75 65 73 74 0d 0a 2a 2a 20 68 61 6e 64 65 equest..** hande
49f30 64 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 6d 61 d to [sqlite3_ma
49f40 6c 6c 6f 63 28 29 5d 20 6f 72 20 5b 73 71 6c 69 lloc()] or [sqli
49f50 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 5d 20 28 te3_realloc()] (
49f60 6f 72 20 74 68 65 69 72 0d 0a 2a 2a 20 69 6e 74 or their..** int
49f70 65 72 6e 61 6c 20 65 71 75 69 76 61 6c 65 6e 74 ernal equivalent
49f80 73 29 2e 20 20 4f 6e 6c 79 20 74 68 65 20 76 61 s). Only the va
49f90 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 20 lue returned in
49fa0 74 68 65 0d 0a 2a 2a 20 2a 70 48 69 67 68 77 61 the..** *pHighwa
49fb0 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 74 6f ter parameter to
49fc0 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 [sqlite3_status
49fd0 28 29 5d 20 69 73 20 6f 66 20 69 6e 74 65 72 65 ()] is of intere
49fe0 73 74 2e 20 20 0d 0a 2a 2a 20 54 68 65 20 76 61 st. ..** The va
49ff0 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f lue written into
4a000 20 74 68 65 20 2a 70 43 75 72 72 65 6e 74 20 70 the *pCurrent p
4a010 61 72 61 6d 65 74 65 72 20 69 73 20 75 6e 64 65 arameter is unde
4a020 66 69 6e 65 64 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a fined.</dd>)^..*
4a030 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 53 *..** [[SQLITE_S
4a040 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 TATUS_MALLOC_COU
4a050 4e 54 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 NT]] ^(<dt>SQLIT
4a060 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f E_STATUS_MALLOC_
4a070 43 4f 55 4e 54 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c COUNT</dt>..** <
4a080 64 64 3e 54 68 69 73 20 70 61 72 61 6d 65 74 65 dd>This paramete
4a090 72 20 72 65 63 6f 72 64 73 20 74 68 65 20 6e 75 r records the nu
4a0a0 6d 62 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 mber of separate
4a0b0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 memory allocati
4a0c0 6f 6e 73 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 6c ons..** currentl
4a0d0 79 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 3c 2f y checked out.</
4a0e0 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b dd>)^..**..** [[
4a0f0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 SQLITE_STATUS_PA
4a100 47 45 43 41 43 48 45 5f 55 53 45 44 5d 5d 20 5e GECACHE_USED]] ^
4a110 28 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 41 54 (<dt>SQLITE_STAT
4a120 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45 US_PAGECACHE_USE
4a130 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 D</dt>..** <dd>T
4a140 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 his parameter re
4a150 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 turns the number
4a160 20 6f 66 20 70 61 67 65 73 20 75 73 65 64 20 6f of pages used o
4a170 75 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 5b 70 ut of the..** [p
4a180 61 67 65 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 agecache memory
4a190 61 6c 6c 6f 63 61 74 6f 72 5d 20 74 68 61 74 20 allocator] that
4a1a0 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 75 was configured u
4a1b0 73 69 6e 67 20 0d 0a 2a 2a 20 5b 53 51 4c 49 54 sing ..** [SQLIT
4a1c0 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 E_CONFIG_PAGECAC
4a1d0 48 45 5d 2e 20 20 54 68 65 0d 0a 2a 2a 20 76 61 HE]. The..** va
4a1e0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 lue returned is
4a1f0 69 6e 20 70 61 67 65 73 2c 20 6e 6f 74 20 69 6e in pages, not in
4a200 20 62 79 74 65 73 2e 3c 2f 64 64 3e 29 5e 0d 0a bytes.</dd>)^..
4a210 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f **..** [[SQLITE_
4a220 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 STATUS_PAGECACHE
4a230 5f 4f 56 45 52 46 4c 4f 57 5d 5d 20 0d 0a 2a 2a _OVERFLOW]] ..**
4a240 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 ^(<dt>SQLITE_ST
4a250 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f ATUS_PAGECACHE_O
4a260 56 45 52 46 4c 4f 57 3c 2f 64 74 3e 0d 0a 2a 2a VERFLOW</dt>..**
4a270 20 3c 64 64 3e 54 68 69 73 20 70 61 72 61 6d 65 <dd>This parame
4a280 74 65 72 20 72 65 74 75 72 6e 73 20 74 68 65 20 ter returns the
4a290 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
4a2a0 6f 66 20 70 61 67 65 20 63 61 63 68 65 0d 0a 2a of page cache..*
4a2b0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 69 * allocation whi
4a2c0 63 68 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ch could not be
4a2d0 73 61 74 69 73 66 69 65 64 20 62 79 20 74 68 65 satisfied by the
4a2e0 20 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f [SQLITE_CONFIG_
4a2f0 50 41 47 45 43 41 43 48 45 5d 0d 0a 2a 2a 20 62 PAGECACHE]..** b
4a300 75 66 66 65 72 20 61 6e 64 20 77 68 65 72 65 20 uffer and where
4a310 66 6f 72 63 65 64 20 74 6f 20 6f 76 65 72 66 6c forced to overfl
4a320 6f 77 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 6d ow to [sqlite3_m
4a330 61 6c 6c 6f 63 28 29 5d 2e 20 20 54 68 65 0d 0a alloc()]. The..
4a340 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 ** returned valu
4a350 65 20 69 6e 63 6c 75 64 65 73 20 61 6c 6c 6f 63 e includes alloc
4a360 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 76 65 72 ations that over
4a370 66 6c 6f 77 65 64 20 62 65 63 61 75 73 65 20 74 flowed because t
4a380 68 65 79 0d 0a 2a 2a 20 77 68 65 72 65 20 74 6f hey..** where to
4a390 6f 20 6c 61 72 67 65 20 28 74 68 65 79 20 77 65 o large (they we
4a3a0 72 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 re larger than t
4a3b0 68 65 20 22 73 7a 22 20 70 61 72 61 6d 65 74 65 he "sz" paramete
4a3c0 72 20 74 6f 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 r to..** [SQLITE
4a3d0 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 _CONFIG_PAGECACH
4a3e0 45 5d 29 20 61 6e 64 20 61 6c 6c 6f 63 61 74 69 E]) and allocati
4a3f0 6f 6e 73 20 74 68 61 74 20 6f 76 65 72 66 6c 6f ons that overflo
4a400 77 65 64 20 62 65 63 61 75 73 65 0d 0a 2a 2a 20 wed because..**
4a410 6e 6f 20 73 70 61 63 65 20 77 61 73 20 6c 65 66 no space was lef
4a420 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 t in the page ca
4a430 63 68 65 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d che.</dd>)^..**.
4a440 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 53 54 41 .** [[SQLITE_STA
4a450 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 TUS_PAGECACHE_SI
4a460 5a 45 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 ZE]] ^(<dt>SQLIT
4a470 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 E_STATUS_PAGECAC
4a480 48 45 5f 53 49 5a 45 3c 2f 64 74 3e 0d 0a 2a 2a HE_SIZE</dt>..**
4a490 20 3c 64 64 3e 54 68 69 73 20 70 61 72 61 6d 65 <dd>This parame
4a4a0 74 65 72 20 72 65 63 6f 72 64 73 20 74 68 65 20 ter records the
4a4b0 6c 61 72 67 65 73 74 20 6d 65 6d 6f 72 79 20 61 largest memory a
4a4c0 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 llocation reques
4a4d0 74 0d 0a 2a 2a 20 68 61 6e 64 65 64 20 74 6f 20 t..** handed to
4a4e0 5b 70 61 67 65 63 61 63 68 65 20 6d 65 6d 6f 72 [pagecache memor
4a4f0 79 20 61 6c 6c 6f 63 61 74 6f 72 5d 2e 20 20 4f y allocator]. O
4a500 6e 6c 79 20 74 68 65 20 76 61 6c 75 65 20 72 65 nly the value re
4a510 74 75 72 6e 65 64 20 69 6e 20 74 68 65 0d 0a 2a turned in the..*
4a520 2a 20 2a 70 48 69 67 68 77 61 74 65 72 20 70 61 * *pHighwater pa
4a530 72 61 6d 65 74 65 72 20 74 6f 20 5b 73 71 6c 69 rameter to [sqli
4a540 74 65 33 5f 73 74 61 74 75 73 28 29 5d 20 69 73 te3_status()] is
4a550 20 6f 66 20 69 6e 74 65 72 65 73 74 2e 20 20 0d of interest. .
4a560 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 77 72 .** The value wr
4a570 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 2a itten into the *
4a580 70 43 75 72 72 65 6e 74 20 70 61 72 61 6d 65 74 pCurrent paramet
4a590 65 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e er is undefined.
4a5a0 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 </dd>)^..**..**
4a5b0 5b 5b 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f [[SQLITE_STATUS_
4a5c0 53 43 52 41 54 43 48 5f 55 53 45 44 5d 5d 20 5e SCRATCH_USED]] ^
4a5d0 28 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 41 54 (<dt>SQLITE_STAT
4a5e0 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45 44 3c US_SCRATCH_USED<
4a5f0 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 /dt>..** <dd>Thi
4a600 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 74 75 s parameter retu
4a610 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
4a620 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 75 73 f allocations us
4a630 65 64 20 6f 75 74 20 6f 66 20 74 68 65 0d 0a 2a ed out of the..*
4a640 2a 20 5b 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 * [scratch memor
4a650 79 20 61 6c 6c 6f 63 61 74 6f 72 5d 20 63 6f 6e y allocator] con
4a660 66 69 67 75 72 65 64 20 75 73 69 6e 67 0d 0a 2a figured using..*
4a670 2a 20 5b 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 * [SQLITE_CONFIG
4a680 5f 53 43 52 41 54 43 48 5d 2e 20 20 54 68 65 20 _SCRATCH]. The
4a690 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 value returned i
4a6a0 73 20 69 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 s in allocations
4a6b0 2c 20 6e 6f 74 0d 0a 2a 2a 20 69 6e 20 62 79 74 , not..** in byt
4a6c0 65 73 2e 20 20 53 69 6e 63 65 20 61 20 73 69 6e es. Since a sin
4a6d0 67 6c 65 20 74 68 72 65 61 64 20 6d 61 79 20 6f gle thread may o
4a6e0 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 73 63 72 nly have one scr
4a6f0 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d atch allocation.
4a700 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 .** outstanding
4a710 61 74 20 74 69 6d 65 2c 20 74 68 69 73 20 70 61 at time, this pa
4a720 72 61 6d 65 74 65 72 20 61 6c 73 6f 20 72 65 70 rameter also rep
4a730 6f 72 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 orts the number
4a740 6f 66 20 74 68 72 65 61 64 73 0d 0a 2a 2a 20 75 of threads..** u
4a750 73 69 6e 67 20 73 63 72 61 74 63 68 20 6d 65 6d sing scratch mem
4a760 6f 72 79 20 61 74 20 74 68 65 20 73 61 6d 65 20 ory at the same
4a770 74 69 6d 65 2e 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a time.</dd>)^..**
4a780 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 53 54 ..** [[SQLITE_ST
4a790 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 ATUS_SCRATCH_OVE
4a7a0 52 46 4c 4f 57 5d 5d 20 5e 28 3c 64 74 3e 53 51 RFLOW]] ^(<dt>SQ
4a7b0 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 LITE_STATUS_SCRA
4a7c0 54 43 48 5f 4f 56 45 52 46 4c 4f 57 3c 2f 64 74 TCH_OVERFLOW</dt
4a7d0 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 73 20 70 >..** <dd>This p
4a7e0 61 72 61 6d 65 74 65 72 20 72 65 74 75 72 6e 73 arameter returns
4a7f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
4a800 79 74 65 73 20 6f 66 20 73 63 72 61 74 63 68 20 ytes of scratch
4a810 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 memory..** alloc
4a820 61 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 75 6c ation which coul
4a830 64 20 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 d not be satisfi
4a840 65 64 20 62 79 20 74 68 65 20 5b 53 51 4c 49 54 ed by the [SQLIT
4a850 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 E_CONFIG_SCRATCH
4a860 5d 0d 0a 2a 2a 20 62 75 66 66 65 72 20 61 6e 64 ]..** buffer and
4a870 20 77 68 65 72 65 20 66 6f 72 63 65 64 20 74 6f where forced to
4a880 20 6f 76 65 72 66 6c 6f 77 20 74 6f 20 5b 73 71 overflow to [sq
4a890 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 5d 2e lite3_malloc()].
4a8a0 20 20 54 68 65 20 76 61 6c 75 65 73 0d 0a 2a 2a The values..**
4a8b0 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 returned includ
4a8c0 65 20 6f 76 65 72 66 6c 6f 77 73 20 62 65 63 61 e overflows beca
4a8d0 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 use the requeste
4a8e0 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 d allocation was
4a8f0 20 74 6f 6f 0d 0a 2a 2a 20 6c 61 72 67 65 72 20 too..** larger
4a900 28 74 68 61 74 20 69 73 2c 20 62 65 63 61 75 73 (that is, becaus
4a910 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 e the requested
4a920 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6c allocation was l
4a930 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 0d 0a arger than the..
4a940 2a 2a 20 22 73 7a 22 20 70 61 72 61 6d 65 74 65 ** "sz" paramete
4a950 72 20 74 6f 20 5b 53 51 4c 49 54 45 5f 43 4f 4e r to [SQLITE_CON
4a960 46 49 47 5f 53 43 52 41 54 43 48 5d 29 20 61 6e FIG_SCRATCH]) an
4a970 64 20 62 65 63 61 75 73 65 20 6e 6f 20 73 63 72 d because no scr
4a980 61 74 63 68 20 62 75 66 66 65 72 0d 0a 2a 2a 20 atch buffer..**
4a990 73 6c 6f 74 73 20 77 65 72 65 20 61 76 61 69 6c slots were avail
4a9a0 61 62 6c 65 2e 0d 0a 2a 2a 20 3c 2f 64 64 3e 29 able...** </dd>)
4a9b0 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 ^..**..** [[SQLI
4a9c0 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 TE_STATUS_SCRATC
4a9d0 48 5f 53 49 5a 45 5d 5d 20 5e 28 3c 64 74 3e 53 H_SIZE]] ^(<dt>S
4a9e0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 QLITE_STATUS_SCR
4a9f0 41 54 43 48 5f 53 49 5a 45 3c 2f 64 74 3e 0d 0a ATCH_SIZE</dt>..
4aa00 2a 2a 20 3c 64 64 3e 54 68 69 73 20 70 61 72 61 ** <dd>This para
4aa10 6d 65 74 65 72 20 72 65 63 6f 72 64 73 20 74 68 meter records th
4aa20 65 20 6c 61 72 67 65 73 74 20 6d 65 6d 6f 72 79 e largest memory
4aa30 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 allocation requ
4aa40 65 73 74 0d 0a 2a 2a 20 68 61 6e 64 65 64 20 74 est..** handed t
4aa50 6f 20 5b 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 o [scratch memor
4aa60 79 20 61 6c 6c 6f 63 61 74 6f 72 5d 2e 20 20 4f y allocator]. O
4aa70 6e 6c 79 20 74 68 65 20 76 61 6c 75 65 20 72 65 nly the value re
4aa80 74 75 72 6e 65 64 20 69 6e 20 74 68 65 0d 0a 2a turned in the..*
4aa90 2a 20 2a 70 48 69 67 68 77 61 74 65 72 20 70 61 * *pHighwater pa
4aaa0 72 61 6d 65 74 65 72 20 74 6f 20 5b 73 71 6c 69 rameter to [sqli
4aab0 74 65 33 5f 73 74 61 74 75 73 28 29 5d 20 69 73 te3_status()] is
4aac0 20 6f 66 20 69 6e 74 65 72 65 73 74 2e 20 20 0d of interest. .
4aad0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 77 72 .** The value wr
4aae0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 2a itten into the *
4aaf0 70 43 75 72 72 65 6e 74 20 70 61 72 61 6d 65 74 pCurrent paramet
4ab00 65 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e er is undefined.
4ab10 3c 2f 64 64 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 </dd>)^..**..**
4ab20 5b 5b 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f [[SQLITE_STATUS_
4ab30 50 41 52 53 45 52 5f 53 54 41 43 4b 5d 5d 20 5e PARSER_STACK]] ^
4ab40 28 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 41 54 (<dt>SQLITE_STAT
4ab50 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 3c US_PARSER_STACK<
4ab60 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 /dt>..** <dd>Thi
4ab70 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 63 6f s parameter reco
4ab80 72 64 73 20 74 68 65 20 64 65 65 70 65 73 74 20 rds the deepest
4ab90 70 61 72 73 65 72 20 73 74 61 63 6b 2e 20 20 49 parser stack. I
4aba0 74 20 69 73 20 6f 6e 6c 79 0d 0a 2a 2a 20 6d 65 t is only..** me
4abb0 61 6e 69 6e 67 66 75 6c 20 69 66 20 53 51 4c 69 aningful if SQLi
4abc0 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 te is compiled w
4abd0 69 74 68 20 5b 59 59 54 52 41 43 4b 4d 41 58 53 ith [YYTRACKMAXS
4abe0 54 41 43 4b 44 45 50 54 48 5d 2e 3c 2f 64 64 3e TACKDEPTH].</dd>
4abf0 29 5e 0d 0a 2a 2a 20 3c 2f 64 6c 3e 0d 0a 2a 2a )^..** </dl>..**
4ac00 0d 0a 2a 2a 20 4e 65 77 20 73 74 61 74 75 73 20 ..** New status
4ac10 70 61 72 61 6d 65 74 65 72 73 20 6d 61 79 20 62 parameters may b
4ac20 65 20 61 64 64 65 64 20 66 72 6f 6d 20 74 69 6d e added from tim
4ac30 65 20 74 6f 20 74 69 6d 65 2e 0d 0a 2a 2f 0d 0a e to time...*/..
4ac40 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 #define SQLITE_S
4ac50 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 TATUS_MEMORY_USE
4ac60 44 20 20 20 20 20 20 20 20 20 20 30 0d 0a 23 64 D 0..#d
4ac70 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41 efine SQLITE_STA
4ac80 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 TUS_PAGECACHE_US
4ac90 45 44 20 20 20 20 20 20 20 31 0d 0a 23 64 65 66 ED 1..#def
4aca0 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41 54 55 ine SQLITE_STATU
4acb0 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 S_PAGECACHE_OVER
4acc0 46 4c 4f 57 20 20 20 32 0d 0a 23 64 65 66 69 6e FLOW 2..#defin
4acd0 65 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f e SQLITE_STATUS_
4ace0 53 43 52 41 54 43 48 5f 55 53 45 44 20 20 20 20 SCRATCH_USED
4acf0 20 20 20 20 20 33 0d 0a 23 64 65 66 69 6e 65 20 3..#define
4ad00 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 SQLITE_STATUS_SC
4ad10 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 20 20 RATCH_OVERFLOW
4ad20 20 20 20 34 0d 0a 23 64 65 66 69 6e 65 20 53 51 4..#define SQ
4ad30 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c LITE_STATUS_MALL
4ad40 4f 43 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20 OC_SIZE
4ad50 20 35 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 5..#define SQLI
4ad60 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 TE_STATUS_PARSER
4ad70 5f 53 54 41 43 4b 20 20 20 20 20 20 20 20 20 36 _STACK 6
4ad80 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
4ad90 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 _STATUS_PAGECACH
4ada0 45 5f 53 49 5a 45 20 20 20 20 20 20 20 37 0d 0a E_SIZE 7..
4adb0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 #define SQLITE_S
4adc0 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 53 49 TATUS_SCRATCH_SI
4add0 5a 45 20 20 20 20 20 20 20 20 20 38 0d 0a 23 64 ZE 8..#d
4ade0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41 efine SQLITE_STA
4adf0 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 TUS_MALLOC_COUNT
4ae00 20 20 20 20 20 20 20 20 20 39 0d 0a 0d 0a 2f 2a 9..../*
4ae10 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 ..** CAPI3REF: D
4ae20 61 74 61 62 61 73 65 20 43 6f 6e 6e 65 63 74 69 atabase Connecti
4ae30 6f 6e 20 53 74 61 74 75 73 0d 0a 2a 2a 0d 0a 2a on Status..**..*
4ae40 2a 20 5e 54 68 69 73 20 69 6e 74 65 72 66 61 63 * ^This interfac
4ae50 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 74 e is used to ret
4ae60 72 69 65 76 65 20 72 75 6e 74 69 6d 65 20 73 74 rieve runtime st
4ae70 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e atus information
4ae80 20 0d 0a 2a 2a 20 61 62 6f 75 74 20 61 20 73 69 ..** about a si
4ae90 6e 67 6c 65 20 5b 64 61 74 61 62 61 73 65 20 63 ngle [database c
4aea0 6f 6e 6e 65 63 74 69 6f 6e 5d 2e 20 20 5e 54 68 onnection]. ^Th
4aeb0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 e first argument
4aec0 20 69 73 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 is the..** data
4aed0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
4aee0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 69 6e 74 object to be int
4aef0 65 72 72 6f 67 61 74 65 64 2e 20 20 5e 54 68 65 errogated. ^The
4af00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 second argument
4af10 0d 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 ..** is an integ
4af20 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 61 6b er constant, tak
4af30 65 6e 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 en from the set
4af40 6f 66 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 44 of..** [SQLITE_D
4af50 42 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 73 5d BSTATUS options]
4af60 2c 20 74 68 61 74 0d 0a 2a 2a 20 64 65 74 65 72 , that..** deter
4af70 6d 69 6e 65 73 20 74 68 65 20 70 61 72 61 6d 65 mines the parame
4af80 74 65 72 20 74 6f 20 69 6e 74 65 72 72 6f 67 61 ter to interroga
4af90 74 65 2e 20 20 54 68 65 20 73 65 74 20 6f 66 20 te. The set of
4afa0 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 44 42 53 ..** [SQLITE_DBS
4afb0 54 41 54 55 53 20 6f 70 74 69 6f 6e 73 5d 20 69 TATUS options] i
4afc0 73 20 6c 69 6b 65 6c 79 0d 0a 2a 2a 20 74 6f 20 s likely..** to
4afd0 67 72 6f 77 20 69 6e 20 66 75 74 75 72 65 20 72 grow in future r
4afe0 65 6c 65 61 73 65 73 20 6f 66 20 53 51 4c 69 74 eleases of SQLit
4aff0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 e...**..** ^The
4b000 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 current value of
4b010 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 the requested p
4b020 61 72 61 6d 65 74 65 72 20 69 73 20 77 72 69 74 arameter is writ
4b030 74 65 6e 20 69 6e 74 6f 20 2a 70 43 75 72 0d 0a ten into *pCur..
4b040 2a 2a 20 61 6e 64 20 74 68 65 20 68 69 67 68 65 ** and the highe
4b050 73 74 20 69 6e 73 74 61 6e 74 61 6e 65 6f 75 73 st instantaneous
4b060 20 76 61 6c 75 65 20 69 73 20 77 72 69 74 74 65 value is writte
4b070 6e 20 69 6e 74 6f 20 2a 70 48 69 77 74 72 2e 20 n into *pHiwtr.
4b080 20 5e 49 66 0d 0a 2a 2a 20 74 68 65 20 72 65 73 ^If..** the res
4b090 65 74 46 6c 67 20 69 73 20 74 72 75 65 2c 20 74 etFlg is true, t
4b0a0 68 65 6e 20 74 68 65 20 68 69 67 68 65 73 74 20 hen the highest
4b0b0 69 6e 73 74 61 6e 74 61 6e 65 6f 75 73 20 76 61 instantaneous va
4b0c0 6c 75 65 20 69 73 0d 0a 2a 2a 20 72 65 73 65 74 lue is..** reset
4b0d0 20 62 61 63 6b 20 64 6f 77 6e 20 74 6f 20 74 68 back down to th
4b0e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 2e e current value.
4b0f0 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 ..**..** ^The sq
4b100 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 lite3_db_status(
4b110 29 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e ) routine return
4b120 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 s SQLITE_OK on s
4b130 75 63 63 65 73 73 20 61 6e 64 20 61 0d 0a 2a 2a uccess and a..**
4b140 20 6e 6f 6e 2d 7a 65 72 6f 20 5b 65 72 72 6f 72 non-zero [error
4b150 20 63 6f 64 65 5d 20 6f 6e 20 66 61 69 6c 75 72 code] on failur
4b160 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 e...**..** See a
4b170 6c 73 6f 3a 20 5b 73 71 6c 69 74 65 33 5f 73 74 lso: [sqlite3_st
4b180 61 74 75 73 28 29 5d 20 61 6e 64 20 5b 73 71 6c atus()] and [sql
4b190 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 ite3_stmt_status
4b1a0 28 29 5d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ()]...*/..SQLITE
4b1b0 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
4b1c0 5f 64 62 5f 73 74 61 74 75 73 28 73 71 6c 69 74 _db_status(sqlit
4b1d0 65 33 2a 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 e3*, int op, int
4b1e0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 69 *pCur, int *pHi
4b1f0 77 74 72 2c 20 69 6e 74 20 72 65 73 65 74 46 6c wtr, int resetFl
4b200 67 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 g);..../*..** CA
4b210 50 49 33 52 45 46 3a 20 53 74 61 74 75 73 20 50 PI3REF: Status P
4b220 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 64 61 arameters for da
4b230 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
4b240 6e 73 0d 0a 2a 2a 20 4b 45 59 57 4f 52 44 53 3a ns..** KEYWORDS:
4b250 20 7b 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 {SQLITE_DBSTATU
4b260 53 20 6f 70 74 69 6f 6e 73 7d 0d 0a 2a 2a 0d 0a S options}..**..
4b270 2a 2a 20 54 68 65 73 65 20 63 6f 6e 73 74 61 6e ** These constan
4b280 74 73 20 61 72 65 20 74 68 65 20 61 76 61 69 6c ts are the avail
4b290 61 62 6c 65 20 69 6e 74 65 67 65 72 20 22 76 65 able integer "ve
4b2a0 72 62 73 22 20 74 68 61 74 20 63 61 6e 20 62 65 rbs" that can be
4b2b0 20 70 61 73 73 65 64 20 61 73 0d 0a 2a 2a 20 74 passed as..** t
4b2c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 he second argume
4b2d0 6e 74 20 74 6f 20 74 68 65 20 5b 73 71 6c 69 74 nt to the [sqlit
4b2e0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 5d 20 e3_db_status()]
4b2f0 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a interface...**..
4b300 2a 2a 20 4e 65 77 20 76 65 72 62 73 20 6d 61 79 ** New verbs may
4b310 20 62 65 20 61 64 64 65 64 20 69 6e 20 66 75 74 be added in fut
4b320 75 72 65 20 72 65 6c 65 61 73 65 73 20 6f 66 20 ure releases of
4b330 53 51 4c 69 74 65 2e 20 45 78 69 73 74 69 6e 67 SQLite. Existing
4b340 20 76 65 72 62 73 0d 0a 2a 2a 20 6d 69 67 68 74 verbs..** might
4b350 20 62 65 20 64 69 73 63 6f 6e 74 69 6e 75 65 64 be discontinued
4b360 2e 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 . Applications s
4b370 68 6f 75 6c 64 20 63 68 65 63 6b 20 74 68 65 20 hould check the
4b380 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d return code from
4b390 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 64 62 ..** [sqlite3_db
4b3a0 5f 73 74 61 74 75 73 28 29 5d 20 74 6f 20 6d 61 _status()] to ma
4b3b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
4b3c0 20 63 61 6c 6c 20 77 6f 72 6b 65 64 2e 0d 0a 2a call worked...*
4b3d0 2a 20 54 68 65 20 5b 73 71 6c 69 74 65 33 5f 64 * The [sqlite3_d
4b3e0 62 5f 73 74 61 74 75 73 28 29 5d 20 69 6e 74 65 b_status()] inte
4b3f0 72 66 61 63 65 20 77 69 6c 6c 20 72 65 74 75 72 rface will retur
4b400 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 n a non-zero err
4b410 6f 72 20 63 6f 64 65 0d 0a 2a 2a 20 69 66 20 61 or code..** if a
4b420 20 64 69 73 63 6f 6e 74 69 6e 75 65 64 20 6f 72 discontinued or
4b430 20 75 6e 73 75 70 70 6f 72 74 65 64 20 76 65 72 unsupported ver
4b440 62 20 69 73 20 69 6e 76 6f 6b 65 64 2e 0d 0a 2a b is invoked...*
4b450 2a 0d 0a 2a 2a 20 3c 64 6c 3e 0d 0a 2a 2a 20 5b *..** <dl>..** [
4b460 5b 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 [SQLITE_DBSTATUS
4b470 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 5d _LOOKASIDE_USED]
4b480 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 44 ] ^(<dt>SQLITE_D
4b490 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 BSTATUS_LOOKASID
4b4a0 45 5f 55 53 45 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 E_USED</dt>..**
4b4b0 3c 64 64 3e 54 68 69 73 20 70 61 72 61 6d 65 74 <dd>This paramet
4b4c0 65 72 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e er returns the n
4b4d0 75 6d 62 65 72 20 6f 66 20 6c 6f 6f 6b 61 73 69 umber of lookasi
4b4e0 64 65 20 6d 65 6d 6f 72 79 20 73 6c 6f 74 73 20 de memory slots
4b4f0 63 75 72 72 65 6e 74 6c 79 0d 0a 2a 2a 20 63 68 currently..** ch
4b500 65 63 6b 65 64 20 6f 75 74 2e 3c 2f 64 64 3e 29 ecked out.</dd>)
4b510 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 ^..**..** [[SQLI
4b520 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b TE_DBSTATUS_LOOK
4b530 41 53 49 44 45 5f 48 49 54 5d 5d 20 5e 28 3c 64 ASIDE_HIT]] ^(<d
4b540 74 3e 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 t>SQLITE_DBSTATU
4b550 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 3c S_LOOKASIDE_HIT<
4b560 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 /dt>..** <dd>Thi
4b570 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 74 75 s parameter retu
4b580 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6d rns the number m
4b590 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 73 20 74 alloc attempts t
4b5a0 68 61 74 20 77 65 72 65 20 0d 0a 2a 2a 20 73 61 hat were ..** sa
4b5b0 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 6c 6f tisfied using lo
4b5c0 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 okaside memory.
4b5d0 4f 6e 6c 79 20 74 68 65 20 68 69 67 68 2d 77 61 Only the high-wa
4b5e0 74 65 72 20 76 61 6c 75 65 20 69 73 20 6d 65 61 ter value is mea
4b5f0 6e 69 6e 67 66 75 6c 3b 0d 0a 2a 2a 20 74 68 65 ningful;..** the
4b600 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 69 current value i
4b610 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2e 29 5e s always zero.)^
4b620 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 ..**..** [[SQLIT
4b630 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 E_DBSTATUS_LOOKA
4b640 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 5d 5d SIDE_MISS_SIZE]]
4b650 0d 0a 2a 2a 20 5e 28 3c 64 74 3e 53 51 4c 49 54 ..** ^(<dt>SQLIT
4b660 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 E_DBSTATUS_LOOKA
4b670 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 3c 2f SIDE_MISS_SIZE</
4b680 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 73 dt>..** <dd>This
4b690 20 70 61 72 61 6d 65 74 65 72 20 72 65 74 75 72 parameter retur
4b6a0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6d 61 ns the number ma
4b6b0 6c 6c 6f 63 20 61 74 74 65 6d 70 74 73 20 74 68 lloc attempts th
4b6c0 61 74 20 6d 69 67 68 74 20 68 61 76 65 0d 0a 2a at might have..*
4b6d0 2a 20 62 65 65 6e 20 73 61 74 69 73 66 69 65 64 * been satisfied
4b6e0 20 75 73 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 using lookaside
4b6f0 20 6d 65 6d 6f 72 79 20 62 75 74 20 66 61 69 6c memory but fail
4b700 65 64 20 64 75 65 20 74 6f 20 74 68 65 20 61 6d ed due to the am
4b710 6f 75 6e 74 20 6f 66 0d 0a 2a 2a 20 6d 65 6d 6f ount of..** memo
4b720 72 79 20 72 65 71 75 65 73 74 65 64 20 62 65 69 ry requested bei
4b730 6e 67 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 ng larger than t
4b740 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f he lookaside slo
4b750 74 20 73 69 7a 65 2e 0d 0a 2a 2a 20 4f 6e 6c 79 t size...** Only
4b760 20 74 68 65 20 68 69 67 68 2d 77 61 74 65 72 20 the high-water
4b770 76 61 6c 75 65 20 69 73 20 6d 65 61 6e 69 6e 67 value is meaning
4b780 66 75 6c 3b 0d 0a 2a 2a 20 74 68 65 20 63 75 72 ful;..** the cur
4b790 72 65 6e 74 20 76 61 6c 75 65 20 69 73 20 61 6c rent value is al
4b7a0 77 61 79 73 20 7a 65 72 6f 2e 29 5e 0d 0a 2a 2a ways zero.)^..**
4b7b0 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 44 42 ..** [[SQLITE_DB
4b7c0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 STATUS_LOOKASIDE
4b7d0 5f 4d 49 53 53 5f 46 55 4c 4c 5d 5d 0d 0a 2a 2a _MISS_FULL]]..**
4b7e0 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 44 42 ^(<dt>SQLITE_DB
4b7f0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 STATUS_LOOKASIDE
4b800 5f 4d 49 53 53 5f 46 55 4c 4c 3c 2f 64 74 3e 0d _MISS_FULL</dt>.
4b810 0a 2a 2a 20 3c 64 64 3e 54 68 69 73 20 70 61 72 .** <dd>This par
4b820 61 6d 65 74 65 72 20 72 65 74 75 72 6e 73 20 74 ameter returns t
4b830 68 65 20 6e 75 6d 62 65 72 20 6d 61 6c 6c 6f 63 he number malloc
4b840 20 61 74 74 65 6d 70 74 73 20 74 68 61 74 20 6d attempts that m
4b850 69 67 68 74 20 68 61 76 65 0d 0a 2a 2a 20 62 65 ight have..** be
4b860 65 6e 20 73 61 74 69 73 66 69 65 64 20 75 73 69 en satisfied usi
4b870 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d ng lookaside mem
4b880 6f 72 79 20 62 75 74 20 66 61 69 6c 65 64 20 64 ory but failed d
4b890 75 65 20 74 6f 20 61 6c 6c 20 6c 6f 6f 6b 61 73 ue to all lookas
4b8a0 69 64 65 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 ide..** memory a
4b8b0 6c 72 65 61 64 79 20 62 65 69 6e 67 20 69 6e 20 lready being in
4b8c0 75 73 65 2e 0d 0a 2a 2a 20 4f 6e 6c 79 20 74 68 use...** Only th
4b8d0 65 20 68 69 67 68 2d 77 61 74 65 72 20 76 61 6c e high-water val
4b8e0 75 65 20 69 73 20 6d 65 61 6e 69 6e 67 66 75 6c ue is meaningful
4b8f0 3b 0d 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e ;..** the curren
4b900 74 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 t value is alway
4b910 73 20 7a 65 72 6f 2e 29 5e 0d 0a 2a 2a 0d 0a 2a s zero.)^..**..*
4b920 2a 20 5b 5b 53 51 4c 49 54 45 5f 44 42 53 54 41 * [[SQLITE_DBSTA
4b930 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 5d 5d TUS_CACHE_USED]]
4b940 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f 44 42 ^(<dt>SQLITE_DB
4b950 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 STATUS_CACHE_USE
4b960 44 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 D</dt>..** <dd>T
4b970 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 his parameter re
4b980 74 75 72 6e 73 20 74 68 65 20 61 70 70 72 6f 78 turns the approx
4b990 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 imate number of
4b9a0 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 70 of bytes of heap
4b9b0 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 ..** memory used
4b9c0 20 62 79 20 61 6c 6c 20 70 61 67 65 72 20 63 61 by all pager ca
4b9d0 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 ches associated
4b9e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 with the databas
4b9f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 29 5e 0d e connection.)^.
4ba00 0a 2a 2a 20 5e 54 68 65 20 68 69 67 68 77 61 74 .** ^The highwat
4ba10 65 72 20 6d 61 72 6b 20 61 73 73 6f 63 69 61 74 er mark associat
4ba20 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 44 ed with SQLITE_D
4ba30 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 BSTATUS_CACHE_US
4ba40 45 44 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0d ED is always 0..
4ba50 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 .**..** [[SQLITE
4ba60 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41 _DBSTATUS_SCHEMA
4ba70 5f 55 53 45 44 5d 5d 20 5e 28 3c 64 74 3e 53 51 _USED]] ^(<dt>SQ
4ba80 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 LITE_DBSTATUS_SC
4ba90 48 45 4d 41 5f 55 53 45 44 3c 2f 64 74 3e 0d 0a HEMA_USED</dt>..
4baa0 2a 2a 20 3c 64 64 3e 54 68 69 73 20 70 61 72 61 ** <dd>This para
4bab0 6d 65 74 65 72 20 72 65 74 75 72 6e 73 20 74 68 meter returns th
4bac0 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 e approximate nu
4bad0 6d 62 65 72 20 6f 66 20 6f 66 20 62 79 74 65 73 mber of of bytes
4bae0 20 6f 66 20 68 65 61 70 0d 0a 2a 2a 20 6d 65 6d of heap..** mem
4baf0 6f 72 79 20 75 73 65 64 20 74 6f 20 73 74 6f 72 ory used to stor
4bb00 65 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 e the schema for
4bb10 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 all databases a
4bb20 73 73 6f 63 69 61 74 65 64 0d 0a 2a 2a 20 77 69 ssociated..** wi
4bb30 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f th the connectio
4bb40 6e 20 2d 20 6d 61 69 6e 2c 20 74 65 6d 70 2c 20 n - main, temp,
4bb50 61 6e 64 20 61 6e 79 20 5b 41 54 54 41 43 48 5d and any [ATTACH]
4bb60 2d 65 64 20 64 61 74 61 62 61 73 65 73 2e 29 5e -ed databases.)^
4bb70 20 0d 0a 2a 2a 20 5e 54 68 65 20 66 75 6c 6c 20 ..** ^The full
4bb80 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 amount of memory
4bb90 20 75 73 65 64 20 62 79 20 74 68 65 20 73 63 68 used by the sch
4bba0 65 6d 61 73 20 69 73 20 72 65 70 6f 72 74 65 64 emas is reported
4bbb0 2c 20 65 76 65 6e 20 69 66 20 74 68 65 0d 0a 2a , even if the..*
4bbc0 2a 20 73 63 68 65 6d 61 20 6d 65 6d 6f 72 79 20 * schema memory
4bbd0 69 73 20 73 68 61 72 65 64 20 77 69 74 68 20 6f is shared with o
4bbe0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f ther database co
4bbf0 6e 6e 65 63 74 69 6f 6e 73 20 64 75 65 20 74 6f nnections due to
4bc00 0d 0a 2a 2a 20 5b 73 68 61 72 65 64 20 63 61 63 ..** [shared cac
4bc10 68 65 20 6d 6f 64 65 5d 20 62 65 69 6e 67 20 65 he mode] being e
4bc20 6e 61 62 6c 65 64 2e 0d 0a 2a 2a 20 5e 54 68 65 nabled...** ^The
4bc30 20 68 69 67 68 77 61 74 65 72 20 6d 61 72 6b 20 highwater mark
4bc40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
4bc50 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f SQLITE_DBSTATUS_
4bc60 53 43 48 45 4d 41 5f 55 53 45 44 20 69 73 20 61 SCHEMA_USED is a
4bc70 6c 77 61 79 73 20 30 2e 0d 0a 2a 2a 0d 0a 2a 2a lways 0...**..**
4bc80 20 5b 5b 53 51 4c 49 54 45 5f 44 42 53 54 41 54 [[SQLITE_DBSTAT
4bc90 55 53 5f 53 54 4d 54 5f 55 53 45 44 5d 5d 20 5e US_STMT_USED]] ^
4bca0 28 3c 64 74 3e 53 51 4c 49 54 45 5f 44 42 53 54 (<dt>SQLITE_DBST
4bcb0 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 3c 2f ATUS_STMT_USED</
4bcc0 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 54 68 69 73 dt>..** <dd>This
4bcd0 20 70 61 72 61 6d 65 74 65 72 20 72 65 74 75 72 parameter retur
4bce0 6e 73 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 ns the approxima
4bcf0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 66 20 te number of of
4bd00 62 79 74 65 73 20 6f 66 20 68 65 61 70 0d 0a 2a bytes of heap..*
4bd10 2a 20 61 6e 64 20 6c 6f 6f 6b 61 73 69 64 65 20 * and lookaside
4bd20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 memory used by a
4bd30 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61 74 ll prepared stat
4bd40 65 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65 ements associate
4bd50 64 20 77 69 74 68 0d 0a 2a 2a 20 74 68 65 20 64 d with..** the d
4bd60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
4bd70 6f 6e 2e 29 5e 0d 0a 2a 2a 20 5e 54 68 65 20 68 on.)^..** ^The h
4bd80 69 67 68 77 61 74 65 72 20 6d 61 72 6b 20 61 73 ighwater mark as
4bd90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 53 51 sociated with SQ
4bda0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 LITE_DBSTATUS_ST
4bdb0 4d 54 5f 55 53 45 44 20 69 73 20 61 6c 77 61 79 MT_USED is alway
4bdc0 73 20 30 2e 0d 0a 2a 2a 20 3c 2f 64 64 3e 0d 0a s 0...** </dd>..
4bdd0 2a 2a 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f **..** [[SQLITE_
4bde0 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 DBSTATUS_CACHE_H
4bdf0 49 54 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 IT]] ^(<dt>SQLIT
4be00 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 E_DBSTATUS_CACHE
4be10 5f 48 49 54 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 _HIT</dt>..** <d
4be20 64 3e 54 68 69 73 20 70 61 72 61 6d 65 74 65 72 d>This parameter
4be30 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d returns the num
4be40 62 65 72 20 6f 66 20 70 61 67 65 72 20 63 61 63 ber of pager cac
4be50 68 65 20 68 69 74 73 20 74 68 61 74 20 68 61 76 he hits that hav
4be60 65 0d 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 29 e..** occurred.)
4be70 5e 20 5e 54 68 65 20 68 69 67 68 77 61 74 65 72 ^ ^The highwater
4be80 20 6d 61 72 6b 20 61 73 73 6f 63 69 61 74 65 64 mark associated
4be90 20 77 69 74 68 20 53 51 4c 49 54 45 5f 44 42 53 with SQLITE_DBS
4bea0 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 20 TATUS_CACHE_HIT
4beb0 0d 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 30 ..** is always 0
4bec0 2e 0d 0a 2a 2a 20 3c 2f 64 64 3e 0d 0a 2a 2a 0d ...** </dd>..**.
4bed0 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 44 42 53 .** [[SQLITE_DBS
4bee0 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 TATUS_CACHE_MISS
4bef0 5d 5d 20 5e 28 3c 64 74 3e 53 51 4c 49 54 45 5f ]] ^(<dt>SQLITE_
4bf00 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d DBSTATUS_CACHE_M
4bf10 49 53 53 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 ISS</dt>..** <dd
4bf20 3e 54 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 >This parameter
4bf30 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 returns the numb
4bf40 65 72 20 6f 66 20 70 61 67 65 72 20 63 61 63 68 er of pager cach
4bf50 65 20 6d 69 73 73 65 73 20 74 68 61 74 20 68 61 e misses that ha
4bf60 76 65 0d 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e ve..** occurred.
4bf70 29 5e 20 5e 54 68 65 20 68 69 67 68 77 61 74 65 )^ ^The highwate
4bf80 72 20 6d 61 72 6b 20 61 73 73 6f 63 69 61 74 65 r mark associate
4bf90 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 44 42 d with SQLITE_DB
4bfa0 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 STATUS_CACHE_MIS
4bfb0 53 20 0d 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 S ..** is always
4bfc0 20 30 2e 0d 0a 2a 2a 20 3c 2f 64 64 3e 0d 0a 2a 0...** </dd>..*
4bfd0 2a 20 3c 2f 64 6c 3e 0d 0a 2a 2f 0d 0a 23 64 65 * </dl>..*/..#de
4bfe0 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4bff0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 ATUS_LOOKASIDE_U
4c000 53 45 44 20 20 20 20 20 20 20 30 0d 0a 23 64 65 SED 0..#de
4c010 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c020 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 20 ATUS_CACHE_USED
4c030 20 20 20 20 20 20 20 20 20 20 31 0d 0a 23 64 65 1..#de
4c040 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c050 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 ATUS_SCHEMA_USED
4c060 20 20 20 20 20 20 20 20 20 20 32 0d 0a 23 64 65 2..#de
4c070 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c080 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 20 20 ATUS_STMT_USED
4c090 20 20 20 20 20 20 20 20 20 20 33 0d 0a 23 64 65 3..#de
4c0a0 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c0b0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 ATUS_LOOKASIDE_H
4c0c0 49 54 20 20 20 20 20 20 20 20 34 0d 0a 23 64 65 IT 4..#de
4c0d0 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c0e0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d ATUS_LOOKASIDE_M
4c0f0 49 53 53 5f 53 49 5a 45 20 20 35 0d 0a 23 64 65 ISS_SIZE 5..#de
4c100 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c110 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d ATUS_LOOKASIDE_M
4c120 49 53 53 5f 46 55 4c 4c 20 20 36 0d 0a 23 64 65 ISS_FULL 6..#de
4c130 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c140 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 20 20 ATUS_CACHE_HIT
4c150 20 20 20 20 20 20 20 20 20 20 37 0d 0a 23 64 65 7..#de
4c160 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c170 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 20 ATUS_CACHE_MISS
4c180 20 20 20 20 20 20 20 20 20 20 38 0d 0a 23 64 65 8..#de
4c190 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 42 53 54 fine SQLITE_DBST
4c1a0 41 54 55 53 5f 4d 41 58 20 20 20 20 20 20 20 20 ATUS_MAX
4c1b0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 2f 2a 8 /*
4c1c0 20 4c 61 72 67 65 73 74 20 64 65 66 69 6e 65 64 Largest defined
4c1d0 20 44 42 53 54 41 54 55 53 20 2a 2f 0d 0a 0d 0a DBSTATUS */....
4c1e0 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
4c1f0 46 3a 20 50 72 65 70 61 72 65 64 20 53 74 61 74 F: Prepared Stat
4c200 65 6d 65 6e 74 20 53 74 61 74 75 73 0d 0a 2a 2a ement Status..**
4c210 0d 0a 2a 2a 20 5e 28 45 61 63 68 20 70 72 65 70 ..** ^(Each prep
4c220 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d ared statement m
4c230 61 69 6e 74 61 69 6e 73 20 76 61 72 69 6f 75 73 aintains various
4c240 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 53 54 4d ..** [SQLITE_STM
4c250 54 53 54 41 54 55 53 20 63 6f 75 6e 74 65 72 73 TSTATUS counters
4c260 5d 20 74 68 61 74 20 6d 65 61 73 75 72 65 20 74 ] that measure t
4c270 68 65 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20 6f 66 he number..** of
4c280 20 74 69 6d 65 73 20 69 74 20 68 61 73 20 70 65 times it has pe
4c290 72 66 6f 72 6d 65 64 20 73 70 65 63 69 66 69 63 rformed specific
4c2a0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 29 5e 20 20 operations.)^
4c2b0 54 68 65 73 65 20 63 6f 75 6e 74 65 72 73 20 63 These counters c
4c2c0 61 6e 0d 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 an..** be used t
4c2d0 6f 20 6d 6f 6e 69 74 6f 72 20 74 68 65 20 70 65 o monitor the pe
4c2e0 72 66 6f 72 6d 61 6e 63 65 20 63 68 61 72 61 63 rformance charac
4c2f0 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 teristics of the
4c300 20 70 72 65 70 61 72 65 64 0d 0a 2a 2a 20 73 74 prepared..** st
4c310 61 74 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 atements. For e
4c320 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 6e xample, if the n
4c330 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20 73 umber of table s
4c340 74 65 70 73 20 67 72 65 61 74 6c 79 20 65 78 63 teps greatly exc
4c350 65 65 64 73 0d 0a 2a 2a 20 74 68 65 20 6e 75 6d eeds..** the num
4c360 62 65 72 20 6f 66 20 74 61 62 6c 65 20 73 65 61 ber of table sea
4c370 72 63 68 65 73 20 6f 72 20 72 65 73 75 6c 74 20 rches or result
4c380 72 6f 77 73 2c 20 74 68 61 74 20 77 6f 75 6c 64 rows, that would
4c390 20 74 65 6e 64 20 74 6f 20 69 6e 64 69 63 61 74 tend to indicat
4c3a0 65 0d 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 e..** that the p
4c3b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
4c3c0 74 20 69 73 20 75 73 69 6e 67 20 61 20 66 75 6c t is using a ful
4c3d0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 72 61 74 l table scan rat
4c3e0 68 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 61 6e 20 her than..** an
4c3f0 69 6e 64 65 78 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a index. ..**..**
4c400 20 5e 28 54 68 69 73 20 69 6e 74 65 72 66 61 63 ^(This interfac
4c410 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 74 e is used to ret
4c420 72 69 65 76 65 20 61 6e 64 20 72 65 73 65 74 20 rieve and reset
4c430 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20 66 counter values f
4c440 72 6f 6d 0d 0a 2a 2a 20 61 20 5b 70 72 65 70 61 rom..** a [prepa
4c450 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5d 2e 20 red statement].
4c460 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d The first argum
4c470 65 6e 74 20 69 73 20 74 68 65 20 70 72 65 70 61 ent is the prepa
4c480 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0d 0a 2a red statement..*
4c490 2a 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 69 * object to be i
4c4a0 6e 74 65 72 72 6f 67 61 74 65 64 2e 20 20 54 68 nterrogated. Th
4c4b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e e second argumen
4c4c0 74 0d 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 t..** is an inte
4c4d0 67 65 72 20 63 6f 64 65 20 66 6f 72 20 61 20 73 ger code for a s
4c4e0 70 65 63 69 66 69 63 20 5b 53 51 4c 49 54 45 5f pecific [SQLITE_
4c4f0 53 54 4d 54 53 54 41 54 55 53 20 63 6f 75 6e 74 STMTSTATUS count
4c500 65 72 5d 0d 0a 2a 2a 20 74 6f 20 62 65 20 69 6e er]..** to be in
4c510 74 65 72 72 6f 67 61 74 65 64 2e 29 5e 0d 0a 2a terrogated.)^..*
4c520 2a 20 5e 54 68 65 20 63 75 72 72 65 6e 74 20 76 * ^The current v
4c530 61 6c 75 65 20 6f 66 20 74 68 65 20 72 65 71 75 alue of the requ
4c540 65 73 74 65 64 20 63 6f 75 6e 74 65 72 20 69 73 ested counter is
4c550 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 5e returned...** ^
4c560 49 66 20 74 68 65 20 72 65 73 65 74 46 6c 67 20 If the resetFlg
4c570 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 is true, then th
4c580 65 20 63 6f 75 6e 74 65 72 20 69 73 20 72 65 73 e counter is res
4c590 65 74 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 et to zero after
4c5a0 20 74 68 69 73 0d 0a 2a 2a 20 69 6e 74 65 72 66 this..** interf
4c5b0 61 63 65 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 ace call returns
4c5c0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c ...**..** See al
4c5d0 73 6f 3a 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 so: [sqlite3_sta
4c5e0 74 75 73 28 29 5d 20 61 6e 64 20 5b 73 71 6c 69 tus()] and [sqli
4c5f0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 5d te3_db_status()]
4c600 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
4c610 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 I int sqlite3_st
4c620 6d 74 5f 73 74 61 74 75 73 28 73 71 6c 69 74 65 mt_status(sqlite
4c630 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 20 6f 70 2c 3_stmt*, int op,
4c640 69 6e 74 20 72 65 73 65 74 46 6c 67 29 3b 0d 0a int resetFlg);..
4c650 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
4c660 46 3a 20 53 74 61 74 75 73 20 50 61 72 61 6d 65 F: Status Parame
4c670 74 65 72 73 20 66 6f 72 20 70 72 65 70 61 72 65 ters for prepare
4c680 64 20 73 74 61 74 65 6d 65 6e 74 73 0d 0a 2a 2a d statements..**
4c690 20 4b 45 59 57 4f 52 44 53 3a 20 7b 53 51 4c 49 KEYWORDS: {SQLI
4c6a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 20 63 6f TE_STMTSTATUS co
4c6b0 75 6e 74 65 72 7d 20 7b 53 51 4c 49 54 45 5f 53 unter} {SQLITE_S
4c6c0 54 4d 54 53 54 41 54 55 53 20 63 6f 75 6e 74 65 TMTSTATUS counte
4c6d0 72 73 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 rs}..**..** Thes
4c6e0 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d e preprocessor m
4c6f0 61 63 72 6f 73 20 64 65 66 69 6e 65 20 69 6e 74 acros define int
4c700 65 67 65 72 20 63 6f 64 65 73 20 74 68 61 74 20 eger codes that
4c710 6e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 2a 2a name counter..**
4c720 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 values associat
4c730 65 64 20 77 69 74 68 20 74 68 65 20 5b 73 71 6c ed with the [sql
4c740 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 ite3_stmt_status
4c750 28 29 5d 20 69 6e 74 65 72 66 61 63 65 2e 0d 0a ()] interface...
4c760 2a 2a 20 54 68 65 20 6d 65 61 6e 69 6e 67 73 20 ** The meanings
4c770 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 of the various c
4c780 6f 75 6e 74 65 72 73 20 61 72 65 20 61 73 20 66 ounters are as f
4c790 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 ollows:..**..**
4c7a0 3c 64 6c 3e 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 <dl>..** [[SQLIT
4c7b0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c E_STMTSTATUS_FUL
4c7c0 4c 53 43 41 4e 5f 53 54 45 50 5d 5d 20 3c 64 74 LSCAN_STEP]] <dt
4c7d0 3e 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 >SQLITE_STMTSTAT
4c7e0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 US_FULLSCAN_STEP
4c7f0 3c 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 5e 54 </dt>..** <dd>^T
4c800 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 his is the numbe
4c810 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 r of times that
4c820 53 51 4c 69 74 65 20 68 61 73 20 73 74 65 70 70 SQLite has stepp
4c830 65 64 20 66 6f 72 77 61 72 64 20 69 6e 0d 0a 2a ed forward in..*
4c840 2a 20 61 20 74 61 62 6c 65 20 61 73 20 70 61 72 * a table as par
4c850 74 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c t of a full tabl
4c860 65 20 73 63 61 6e 2e 20 20 4c 61 72 67 65 20 6e e scan. Large n
4c870 75 6d 62 65 72 73 20 66 6f 72 20 74 68 69 73 20 umbers for this
4c880 63 6f 75 6e 74 65 72 0d 0a 2a 2a 20 6d 61 79 20 counter..** may
4c890 69 6e 64 69 63 61 74 65 20 6f 70 70 6f 72 74 75 indicate opportu
4c8a0 6e 69 74 69 65 73 20 66 6f 72 20 70 65 72 66 6f nities for perfo
4c8b0 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 rmance improveme
4c8c0 6e 74 20 74 68 72 6f 75 67 68 20 0d 0a 2a 2a 20 nt through ..**
4c8d0 63 61 72 65 66 75 6c 20 75 73 65 20 6f 66 20 69 careful use of i
4c8e0 6e 64 69 63 65 73 2e 3c 2f 64 64 3e 0d 0a 2a 2a ndices.</dd>..**
4c8f0 0d 0a 2a 2a 20 5b 5b 53 51 4c 49 54 45 5f 53 54 ..** [[SQLITE_ST
4c900 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 5d 5d 20 MTSTATUS_SORT]]
4c910 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 4d 54 53 <dt>SQLITE_STMTS
4c920 54 41 54 55 53 5f 53 4f 52 54 3c 2f 64 74 3e 0d TATUS_SORT</dt>.
4c930 0a 2a 2a 20 3c 64 64 3e 5e 54 68 69 73 20 69 73 .** <dd>^This is
4c940 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 the number of s
4c950 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 ort operations t
4c960 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 hat have occurre
4c970 64 2e 0d 0a 2a 2a 20 41 20 6e 6f 6e 2d 7a 65 72 d...** A non-zer
4c980 6f 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 o value in this
4c990 63 6f 75 6e 74 65 72 20 6d 61 79 20 69 6e 64 69 counter may indi
4c9a0 63 61 74 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e cate an opportun
4c9b0 69 74 79 20 74 6f 0d 0a 2a 2a 20 69 6d 70 72 6f ity to..** impro
4c9c0 76 65 6d 65 6e 74 20 70 65 72 66 6f 72 6d 61 6e vement performan
4c9d0 63 65 20 74 68 72 6f 75 67 68 20 63 61 72 65 66 ce through caref
4c9e0 75 6c 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 ul use of indice
4c9f0 73 2e 3c 2f 64 64 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 s.</dd>..**..**
4ca00 5b 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 [[SQLITE_STMTSTA
4ca10 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 5d 5d 20 TUS_AUTOINDEX]]
4ca20 3c 64 74 3e 53 51 4c 49 54 45 5f 53 54 4d 54 53 <dt>SQLITE_STMTS
4ca30 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 3c TATUS_AUTOINDEX<
4ca40 2f 64 74 3e 0d 0a 2a 2a 20 3c 64 64 3e 5e 54 68 /dt>..** <dd>^Th
4ca50 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 is is the number
4ca60 20 6f 66 20 72 6f 77 73 20 69 6e 73 65 72 74 65 of rows inserte
4ca70 64 20 69 6e 74 6f 20 74 72 61 6e 73 69 65 6e 74 d into transient
4ca80 20 69 6e 64 69 63 65 73 20 74 68 61 74 0d 0a 2a indices that..*
4ca90 2a 20 77 65 72 65 20 63 72 65 61 74 65 64 20 61 * were created a
4caa0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 20 utomatically in
4cab0 6f 72 64 65 72 20 74 6f 20 68 65 6c 70 20 6a 6f order to help jo
4cac0 69 6e 73 20 72 75 6e 20 66 61 73 74 65 72 2e 0d ins run faster..
4cad0 0a 2a 2a 20 41 20 6e 6f 6e 2d 7a 65 72 6f 20 76 .** A non-zero v
4cae0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 63 6f 75 alue in this cou
4caf0 6e 74 65 72 20 6d 61 79 20 69 6e 64 69 63 61 74 nter may indicat
4cb00 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 e an opportunity
4cb10 20 74 6f 0d 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d to..** improvem
4cb20 65 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 ent performance
4cb30 62 79 20 61 64 64 69 6e 67 20 70 65 72 6d 61 6e by adding perman
4cb40 65 6e 74 20 69 6e 64 69 63 65 73 20 74 68 61 74 ent indices that
4cb50 20 64 6f 20 6e 6f 74 0d 0a 2a 2a 20 6e 65 65 64 do not..** need
4cb60 20 74 6f 20 62 65 20 72 65 69 6e 69 74 69 61 6c to be reinitial
4cb70 69 7a 65 64 20 65 61 63 68 20 74 69 6d 65 20 74 ized each time t
4cb80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 he statement is
4cb90 72 75 6e 2e 3c 2f 64 64 3e 0d 0a 2a 2a 20 3c 2f run.</dd>..** </
4cba0 64 6c 3e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 dl>..*/..#define
4cbb0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 SQLITE_STMTSTAT
4cbc0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 US_FULLSCAN_STEP
4cbd0 20 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 1..#define
4cbe0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 SQLITE_STMTSTATU
4cbf0 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 S_SORT
4cc00 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 53 2..#define S
4cc10 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 QLITE_STMTSTATUS
4cc20 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20 20 _AUTOINDEX
4cc30 20 20 20 33 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 3..../*..** C
4cc40 41 50 49 33 52 45 46 3a 20 43 75 73 74 6f 6d 20 API3REF: Custom
4cc50 50 61 67 65 20 43 61 63 68 65 20 4f 62 6a 65 63 Page Cache Objec
4cc60 74 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 t..**..** The sq
4cc70 6c 69 74 65 33 5f 70 63 61 63 68 65 20 74 79 70 lite3_pcache typ
4cc80 65 20 69 73 20 6f 70 61 71 75 65 2e 20 20 49 74 e is opaque. It
4cc90 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 is implemented
4cca0 62 79 0d 0a 2a 2a 20 74 68 65 20 70 6c 75 67 67 by..** the plugg
4ccb0 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 able module. Th
4ccc0 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 68 61 e SQLite core ha
4ccd0 73 20 6e 6f 20 6b 6e 6f 77 6c 65 64 67 65 20 6f s no knowledge o
4cce0 66 0d 0a 2a 2a 20 69 74 73 20 73 69 7a 65 20 6f f..** its size o
4ccf0 72 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 r internal struc
4cd00 74 75 72 65 20 61 6e 64 20 6e 65 76 65 72 20 64 ture and never d
4cd10 65 61 6c 73 20 77 69 74 68 20 74 68 65 0d 0a 2a eals with the..*
4cd20 2a 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 * sqlite3_pcache
4cd30 20 6f 62 6a 65 63 74 20 65 78 63 65 70 74 20 62 object except b
4cd40 79 20 68 6f 6c 64 69 6e 67 20 61 6e 64 20 70 61 y holding and pa
4cd50 73 73 69 6e 67 20 70 6f 69 6e 74 65 72 73 0d 0a ssing pointers..
4cd60 2a 2a 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 ** to the object
4cd70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 5b 73 ...**..** See [s
4cd80 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 qlite3_pcache_me
4cd90 74 68 6f 64 73 32 5d 20 66 6f 72 20 61 64 64 69 thods2] for addi
4cda0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 tional informati
4cdb0 6f 6e 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 on...*/..typedef
4cdc0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f struct sqlite3_
4cdd0 70 63 61 63 68 65 20 73 71 6c 69 74 65 33 5f 70 pcache sqlite3_p
4cde0 63 61 63 68 65 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a cache;..../*..**
4cdf0 20 43 41 50 49 33 52 45 46 3a 20 43 75 73 74 6f CAPI3REF: Custo
4ce00 6d 20 50 61 67 65 20 43 61 63 68 65 20 4f 62 6a m Page Cache Obj
4ce10 65 63 74 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ect..**..** The
4ce20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 sqlite3_pcache_p
4ce30 61 67 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 age object repre
4ce40 73 65 6e 74 73 20 61 20 73 69 6e 67 6c 65 20 70 sents a single p
4ce50 61 67 65 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 70 age in the..** p
4ce60 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 age cache. The
4ce70 70 61 67 65 20 63 61 63 68 65 20 77 69 6c 6c 20 page cache will
4ce80 61 6c 6c 6f 63 61 74 65 20 69 6e 73 74 61 6e 63 allocate instanc
4ce90 65 73 20 6f 66 20 74 68 69 73 0d 0a 2a 2a 20 6f es of this..** o
4cea0 62 6a 65 63 74 2e 20 20 56 61 72 69 6f 75 73 20 bject. Various
4ceb0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 70 methods of the p
4cec0 61 67 65 20 63 61 63 68 65 20 75 73 65 20 70 6f age cache use po
4ced0 69 6e 74 65 72 73 20 74 6f 20 69 6e 73 74 61 6e inters to instan
4cee0 63 65 73 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 ces..** of this
4cef0 6f 62 6a 65 63 74 20 61 73 20 70 61 72 61 6d 65 object as parame
4cf00 74 65 72 73 20 6f 72 20 61 73 20 74 68 65 69 72 ters or as their
4cf10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0d 0a return value...
4cf20 2a 2a 0d 0a 2a 2a 20 53 65 65 20 5b 73 71 6c 69 **..** See [sqli
4cf30 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f te3_pcache_metho
4cf40 64 73 32 5d 20 66 6f 72 20 61 64 64 69 74 69 6f ds2] for additio
4cf50 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e nal information.
4cf60 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 ..*/..typedef st
4cf70 72 75 63 74 20 73 71 6c 69 74 65 33 5f 70 63 61 ruct sqlite3_pca
4cf80 63 68 65 5f 70 61 67 65 20 73 71 6c 69 74 65 33 che_page sqlite3
4cf90 5f 70 63 61 63 68 65 5f 70 61 67 65 3b 0d 0a 73 _pcache_page;..s
4cfa0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 70 63 truct sqlite3_pc
4cfb0 61 63 68 65 5f 70 61 67 65 20 7b 0d 0a 20 20 76 ache_page {.. v
4cfc0 6f 69 64 20 2a 70 42 75 66 3b 20 20 20 20 20 20 oid *pBuf;
4cfd0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 /* The content
4cfe0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0d of the page */.
4cff0 0a 20 20 76 6f 69 64 20 2a 70 45 78 74 72 61 3b . void *pExtra;
4d000 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 /* Extra i
4d010 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 nformation assoc
4d020 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70 iated with the p
4d030 61 67 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a age */..};..../*
4d040 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 41 ..** CAPI3REF: A
4d050 70 70 6c 69 63 61 74 69 6f 6e 20 44 65 66 69 6e pplication Defin
4d060 65 64 20 50 61 67 65 20 43 61 63 68 65 2e 0d 0a ed Page Cache...
4d070 2a 2a 20 4b 45 59 57 4f 52 44 53 3a 20 7b 70 61 ** KEYWORDS: {pa
4d080 67 65 20 63 61 63 68 65 7d 0d 0a 2a 2a 0d 0a 2a ge cache}..**..*
4d090 2a 20 5e 28 54 68 65 20 5b 73 71 6c 69 74 65 33 * ^(The [sqlite3
4d0a0 5f 63 6f 6e 66 69 67 5d 28 5b 53 51 4c 49 54 45 _config]([SQLITE
4d0b0 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 5d _CONFIG_PCACHE2]
4d0c0 2c 20 2e 2e 2e 29 20 69 6e 74 65 72 66 61 63 65 , ...) interface
4d0d0 20 63 61 6e 0d 0a 2a 2a 20 72 65 67 69 73 74 65 can..** registe
4d0e0 72 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 r an alternative
4d0f0 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c page cache impl
4d100 65 6d 65 6e 74 61 74 69 6f 6e 20 62 79 20 70 61 ementation by pa
4d110 73 73 69 6e 67 20 69 6e 20 61 6e 20 0d 0a 2a 2a ssing in an ..**
4d120 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
4d130 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f sqlite3_pcache_
4d140 6d 65 74 68 6f 64 73 32 20 73 74 72 75 63 74 75 methods2 structu
4d150 72 65 2e 29 5e 0d 0a 2a 2a 20 49 6e 20 6d 61 6e re.)^..** In man
4d160 79 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2c 20 y applications,
4d170 6d 6f 73 74 20 6f 66 20 74 68 65 20 68 65 61 70 most of the heap
4d180 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 memory allocate
4d190 64 20 62 79 20 0d 0a 2a 2a 20 53 51 4c 69 74 65 d by ..** SQLite
4d1a0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 is used for the
4d1b0 20 70 61 67 65 20 63 61 63 68 65 2e 0d 0a 2a 2a page cache...**
4d1c0 20 42 79 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 By implementing
4d1d0 20 61 20 0d 0a 2a 2a 20 63 75 73 74 6f 6d 20 70 a ..** custom p
4d1e0 61 67 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 age cache using
4d1f0 74 68 69 73 20 41 50 49 2c 20 61 6e 20 61 70 70 this API, an app
4d200 6c 69 63 61 74 69 6f 6e 20 63 61 6e 20 62 65 74 lication can bet
4d210 74 65 72 20 63 6f 6e 74 72 6f 6c 0d 0a 2a 2a 20 ter control..**
4d220 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 the amount of me
4d230 6d 6f 72 79 20 63 6f 6e 73 75 6d 65 64 20 62 79 mory consumed by
4d240 20 53 51 4c 69 74 65 2c 20 74 68 65 20 77 61 79 SQLite, the way
4d250 20 69 6e 20 77 68 69 63 68 20 0d 0a 2a 2a 20 74 in which ..** t
4d260 68 61 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c hat memory is al
4d270 6c 6f 63 61 74 65 64 20 61 6e 64 20 72 65 6c 65 located and rele
4d280 61 73 65 64 2c 20 61 6e 64 20 74 68 65 20 70 6f ased, and the po
4d290 6c 69 63 69 65 73 20 75 73 65 64 20 74 6f 20 0d licies used to .
4d2a0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 65 78 .** determine ex
4d2b0 61 63 74 6c 79 20 77 68 69 63 68 20 70 61 72 74 actly which part
4d2c0 73 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 s of a database
4d2d0 66 69 6c 65 20 61 72 65 20 63 61 63 68 65 64 20 file are cached
4d2e0 61 6e 64 20 66 6f 72 20 0d 0a 2a 2a 20 68 6f 77 and for ..** how
4d2f0 20 6c 6f 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 long...**..** T
4d300 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 he alternative p
4d310 61 67 65 20 63 61 63 68 65 20 6d 65 63 68 61 6e age cache mechan
4d320 69 73 6d 20 69 73 20 61 6e 0d 0a 2a 2a 20 65 78 ism is an..** ex
4d330 74 72 65 6d 65 20 6d 65 61 73 75 72 65 20 74 68 treme measure th
4d340 61 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 at is only neede
4d350 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 64 65 d by the most de
4d360 6d 61 6e 64 69 6e 67 20 61 70 70 6c 69 63 61 74 manding applicat
4d370 69 6f 6e 73 2e 0d 0a 2a 2a 20 54 68 65 20 62 75 ions...** The bu
4d380 69 6c 74 2d 69 6e 20 70 61 67 65 20 63 61 63 68 ilt-in page cach
4d390 65 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 e is recommended
4d3a0 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e 0d for most uses..
4d3b0 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 20 63 6f .**..** ^(The co
4d3c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 ntents of the sq
4d3d0 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 lite3_pcache_met
4d3e0 68 6f 64 73 32 20 73 74 72 75 63 74 75 72 65 20 hods2 structure
4d3f0 61 72 65 20 63 6f 70 69 65 64 20 74 6f 20 61 6e are copied to an
4d400 0d 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 62 75 ..** internal bu
4d410 66 66 65 72 20 62 79 20 53 51 4c 69 74 65 20 77 ffer by SQLite w
4d420 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 ithin the call t
4d430 6f 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 o [sqlite3_confi
4d440 67 5d 2e 20 20 48 65 6e 63 65 0d 0a 2a 2a 20 74 g]. Hence..** t
4d450 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d he application m
4d460 61 79 20 64 69 73 63 61 72 64 20 74 68 65 20 70 ay discard the p
4d470 61 72 61 6d 65 74 65 72 20 61 66 74 65 72 20 74 arameter after t
4d480 68 65 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 5b he call to..** [
4d490 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 sqlite3_config()
4d4a0 5d 20 72 65 74 75 72 6e 73 2e 29 5e 0d 0a 2a 2a ] returns.)^..**
4d4b0 0d 0a 2a 2a 20 5b 5b 74 68 65 20 78 49 6e 69 74 ..** [[the xInit
4d4c0 28 29 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 () page cache me
4d4d0 74 68 6f 64 5d 5d 0d 0a 2a 2a 20 5e 28 54 68 65 thod]]..** ^(The
4d4e0 20 78 49 6e 69 74 28 29 20 6d 65 74 68 6f 64 20 xInit() method
4d4f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 is called once f
4d500 6f 72 20 65 61 63 68 20 65 66 66 65 63 74 69 76 or each effectiv
4d510 65 20 0d 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b e ..** call to [
4d520 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 sqlite3_initiali
4d530 7a 65 28 29 5d 29 5e 0d 0a 2a 2a 20 28 75 73 75 ze()])^..** (usu
4d540 61 6c 6c 79 20 6f 6e 6c 79 20 6f 6e 63 65 20 64 ally only once d
4d550 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 uring the lifeti
4d560 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 me of the proces
4d570 73 29 2e 20 5e 28 54 68 65 20 78 49 6e 69 74 28 s). ^(The xInit(
4d580 29 0d 0a 2a 2a 20 6d 65 74 68 6f 64 20 69 73 20 )..** method is
4d590 70 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f 66 passed a copy of
4d5a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 the sqlite3_pca
4d5b0 63 68 65 5f 6d 65 74 68 6f 64 73 32 2e 70 41 72 che_methods2.pAr
4d5c0 67 20 76 61 6c 75 65 2e 29 5e 0d 0a 2a 2a 20 54 g value.)^..** T
4d5d0 68 65 20 69 6e 74 65 6e 74 20 6f 66 20 74 68 65 he intent of the
4d5e0 20 78 49 6e 69 74 28 29 20 6d 65 74 68 6f 64 20 xInit() method
4d5f0 69 73 20 74 6f 20 73 65 74 20 75 70 20 67 6c 6f is to set up glo
4d600 62 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 bal data structu
4d610 72 65 73 20 0d 0a 2a 2a 20 72 65 71 75 69 72 65 res ..** require
4d620 64 20 62 79 20 74 68 65 20 63 75 73 74 6f 6d 20 d by the custom
4d630 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 page cache imple
4d640 6d 65 6e 74 61 74 69 6f 6e 2e 20 0d 0a 2a 2a 20 mentation. ..**
4d650 5e 28 49 66 20 74 68 65 20 78 49 6e 69 74 28 29 ^(If the xInit()
4d660 20 6d 65 74 68 6f 64 20 69 73 20 4e 55 4c 4c 2c method is NULL,
4d670 20 74 68 65 6e 20 74 68 65 20 0d 0a 2a 2a 20 62 then the ..** b
4d680 75 69 6c 74 2d 69 6e 20 64 65 66 61 75 6c 74 20 uilt-in default
4d690 70 61 67 65 20 63 61 63 68 65 20 69 73 20 75 73 page cache is us
4d6a0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 ed instead of th
4d6b0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 e application de
4d6c0 66 69 6e 65 64 0d 0a 2a 2a 20 70 61 67 65 20 63 fined..** page c
4d6d0 61 63 68 65 2e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a 20 ache.)^..**..**
4d6e0 5b 5b 74 68 65 20 78 53 68 75 74 64 6f 77 6e 28 [[the xShutdown(
4d6f0 29 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 74 ) page cache met
4d700 68 6f 64 5d 5d 0d 0a 2a 2a 20 5e 54 68 65 20 78 hod]]..** ^The x
4d710 53 68 75 74 64 6f 77 6e 28 29 20 6d 65 74 68 6f Shutdown() metho
4d720 64 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 5b d is called by [
4d730 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e sqlite3_shutdown
4d740 28 29 5d 2e 0d 0a 2a 2a 20 49 74 20 63 61 6e 20 ()]...** It can
4d750 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e be used to clean
4d760 20 75 70 20 0d 0a 2a 2a 20 61 6e 79 20 6f 75 74 up ..** any out
4d770 73 74 61 6e 64 69 6e 67 20 72 65 73 6f 75 72 63 standing resourc
4d780 65 73 20 62 65 66 6f 72 65 20 70 72 6f 63 65 73 es before proces
4d790 73 20 73 68 75 74 64 6f 77 6e 2c 20 69 66 20 72 s shutdown, if r
4d7a0 65 71 75 69 72 65 64 2e 0d 0a 2a 2a 20 5e 54 68 equired...** ^Th
4d7b0 65 20 78 53 68 75 74 64 6f 77 6e 28 29 20 6d 65 e xShutdown() me
4d7c0 74 68 6f 64 20 6d 61 79 20 62 65 20 4e 55 4c 4c thod may be NULL
4d7d0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 4c 69 74 ...**..** ^SQLit
4d7e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 e automatically
4d7f0 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 serializes calls
4d800 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 to the xInit me
4d810 74 68 6f 64 2c 0d 0a 2a 2a 20 73 6f 20 74 68 65 thod,..** so the
4d820 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 xInit method ne
4d830 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 ed not be thread
4d840 73 61 66 65 2e 20 20 5e 54 68 65 0d 0a 2a 2a 20 safe. ^The..**
4d850 78 53 68 75 74 64 6f 77 6e 20 6d 65 74 68 6f 64 xShutdown method
4d860 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 is only called
4d870 66 72 6f 6d 20 5b 73 71 6c 69 74 65 33 5f 73 68 from [sqlite3_sh
4d880 75 74 64 6f 77 6e 28 29 5d 20 73 6f 20 69 74 20 utdown()] so it
4d890 64 6f 65 73 0d 0a 2a 2a 20 6e 6f 74 20 6e 65 65 does..** not nee
4d8a0 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 d to be threadsa
4d8b0 66 65 20 65 69 74 68 65 72 2e 20 20 41 6c 6c 20 fe either. All
4d8c0 6f 74 68 65 72 20 6d 65 74 68 6f 64 73 20 6d 75 other methods mu
4d8d0 73 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65 st be threadsafe
4d8e0 0d 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 74 68 72 ..** in multithr
4d8f0 65 61 64 65 64 20 61 70 70 6c 69 63 61 74 69 6f eaded applicatio
4d900 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 4c ns...**..** ^SQL
4d910 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 ite will never i
4d920 6e 76 6f 6b 65 20 78 49 6e 69 74 28 29 20 6d 6f nvoke xInit() mo
4d930 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 re than once wit
4d940 68 6f 75 74 20 61 6e 20 69 6e 74 65 72 76 65 6e hout an interven
4d950 69 6e 67 0d 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 ing..** call to
4d960 78 53 68 75 74 64 6f 77 6e 28 29 2e 0d 0a 2a 2a xShutdown()...**
4d970 0d 0a 2a 2a 20 5b 5b 74 68 65 20 78 43 72 65 61 ..** [[the xCrea
4d980 74 65 28 29 20 70 61 67 65 20 63 61 63 68 65 20 te() page cache
4d990 6d 65 74 68 6f 64 73 5d 5d 0d 0a 2a 2a 20 5e 53 methods]]..** ^S
4d9a0 51 4c 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 QLite invokes th
4d9b0 65 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 e xCreate() meth
4d9c0 6f 64 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 od to construct
4d9d0 61 20 6e 65 77 20 63 61 63 68 65 20 69 6e 73 74 a new cache inst
4d9e0 61 6e 63 65 2e 0d 0a 2a 2a 20 53 51 4c 69 74 65 ance...** SQLite
4d9f0 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 20 will typically
4da00 63 72 65 61 74 65 20 6f 6e 65 20 63 61 63 68 65 create one cache
4da10 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 65 61 instance for ea
4da20 63 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 ch open database
4da30 20 66 69 6c 65 2c 0d 0a 2a 2a 20 74 68 6f 75 67 file,..** thoug
4da40 68 20 74 68 69 73 20 69 73 20 6e 6f 74 20 67 75 h this is not gu
4da50 61 72 61 6e 74 65 65 64 2e 20 5e 54 68 65 0d 0a aranteed. ^The..
4da60 2a 2a 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 ** first paramet
4da70 65 72 2c 20 73 7a 50 61 67 65 2c 20 69 73 20 74 er, szPage, is t
4da80 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 he size in bytes
4da90 20 6f 66 20 74 68 65 20 70 61 67 65 73 20 74 68 of the pages th
4daa0 61 74 20 6d 75 73 74 0d 0a 2a 2a 20 62 65 20 61 at must..** be a
4dab0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 llocated by the
4dac0 63 61 63 68 65 2e 20 20 5e 73 7a 50 61 67 65 20 cache. ^szPage
4dad0 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 20 70 6f will always a po
4dae0 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 5e 54 68 wer of two. ^Th
4daf0 65 0d 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61 72 e..** second par
4db00 61 6d 65 74 65 72 20 73 7a 45 78 74 72 61 20 69 ameter szExtra i
4db10 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 s a number of by
4db20 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 74 6f tes of extra sto
4db30 72 61 67 65 20 0d 0a 2a 2a 20 61 73 73 6f 63 69 rage ..** associ
4db40 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 70 ated with each p
4db50 61 67 65 20 63 61 63 68 65 20 65 6e 74 72 79 2e age cache entry.
4db60 20 20 5e 54 68 65 20 73 7a 45 78 74 72 61 20 70 ^The szExtra p
4db70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0d 0a 2a arameter will..*
4db80 2a 20 61 20 6e 75 6d 62 65 72 20 6c 65 73 73 20 * a number less
4db90 74 68 61 6e 20 32 35 30 2e 20 20 53 51 4c 69 74 than 250. SQLit
4dba0 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0d 0a e will use the..
4dbb0 2a 2a 20 65 78 74 72 61 20 73 7a 45 78 74 72 61 ** extra szExtra
4dbc0 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70 bytes on each p
4dbd0 61 67 65 20 74 6f 20 73 74 6f 72 65 20 6d 65 74 age to store met
4dbe0 61 64 61 74 61 20 61 62 6f 75 74 20 74 68 65 20 adata about the
4dbf0 75 6e 64 65 72 6c 79 69 6e 67 0d 0a 2a 2a 20 64 underlying..** d
4dc00 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 6e 20 atabase page on
4dc10 64 69 73 6b 2e 20 20 54 68 65 20 76 61 6c 75 65 disk. The value
4dc20 20 70 61 73 73 65 64 20 69 6e 74 6f 20 73 7a 45 passed into szE
4dc30 78 74 72 61 20 64 65 70 65 6e 64 73 0d 0a 2a 2a xtra depends..**
4dc40 20 6f 6e 20 74 68 65 20 53 51 4c 69 74 65 20 76 on the SQLite v
4dc50 65 72 73 69 6f 6e 2c 20 74 68 65 20 74 61 72 67 ersion, the targ
4dc60 65 74 20 70 6c 61 74 66 6f 72 6d 2c 20 61 6e 64 et platform, and
4dc70 20 68 6f 77 20 53 51 4c 69 74 65 20 77 61 73 20 how SQLite was
4dc80 63 6f 6d 70 69 6c 65 64 2e 0d 0a 2a 2a 20 5e 54 compiled...** ^T
4dc90 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e he third argumen
4dca0 74 20 74 6f 20 78 43 72 65 61 74 65 28 29 2c 20 t to xCreate(),
4dcb0 62 50 75 72 67 65 61 62 6c 65 2c 20 69 73 20 74 bPurgeable, is t
4dcc0 72 75 65 20 69 66 20 74 68 65 20 63 61 63 68 65 rue if the cache
4dcd0 20 62 65 69 6e 67 0d 0a 2a 2a 20 63 72 65 61 74 being..** creat
4dce0 65 64 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 ed will be used
4dcf0 74 6f 20 63 61 63 68 65 20 64 61 74 61 62 61 73 to cache databas
4dd00 65 20 70 61 67 65 73 20 6f 66 20 61 20 66 69 6c e pages of a fil
4dd10 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b e stored on disk
4dd20 2c 20 6f 72 0d 0a 2a 2a 20 66 61 6c 73 65 20 69 , or..** false i
4dd30 66 20 69 74 20 69 73 20 75 73 65 64 20 66 6f 72 f it is used for
4dd40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 an in-memory da
4dd50 74 61 62 61 73 65 2e 20 54 68 65 20 63 61 63 68 tabase. The cach
4dd60 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e e implementation
4dd70 0d 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 ..** does not ha
4dd80 76 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e ve to do anythin
4dd90 67 20 73 70 65 63 69 61 6c 20 62 61 73 65 64 20 g special based
4dda0 77 69 74 68 20 74 68 65 20 76 61 6c 75 65 20 6f with the value o
4ddb0 66 20 62 50 75 72 67 65 61 62 6c 65 3b 0d 0a 2a f bPurgeable;..*
4ddc0 2a 20 69 74 20 69 73 20 70 75 72 65 6c 79 20 61 * it is purely a
4ddd0 64 76 69 73 6f 72 79 2e 20 20 5e 4f 6e 20 61 20 dvisory. ^On a
4dde0 63 61 63 68 65 20 77 68 65 72 65 20 62 50 75 72 cache where bPur
4ddf0 67 65 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c geable is false,
4de00 20 53 51 4c 69 74 65 20 77 69 6c 6c 0d 0a 2a 2a SQLite will..**
4de10 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 78 55 never invoke xU
4de20 6e 70 69 6e 28 29 20 65 78 63 65 70 74 20 74 6f npin() except to
4de30 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 64 65 deliberately de
4de40 6c 65 74 65 20 61 20 70 61 67 65 2e 0d 0a 2a 2a lete a page...**
4de50 20 5e 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 ^In other words
4de60 2c 20 63 61 6c 6c 73 20 74 6f 20 78 55 6e 70 69 , calls to xUnpi
4de70 6e 28 29 20 6f 6e 20 61 20 63 61 63 68 65 20 77 n() on a cache w
4de80 69 74 68 20 62 50 75 72 67 65 61 62 6c 65 20 73 ith bPurgeable s
4de90 65 74 20 74 6f 0d 0a 2a 2a 20 66 61 6c 73 65 20 et to..** false
4dea0 77 69 6c 6c 20 61 6c 77 61 79 73 20 68 61 76 65 will always have
4deb0 20 74 68 65 20 22 64 69 73 63 61 72 64 22 20 66 the "discard" f
4dec0 6c 61 67 20 73 65 74 20 74 6f 20 74 72 75 65 2e lag set to true.
4ded0 20 20 0d 0a 2a 2a 20 5e 48 65 6e 63 65 2c 20 61 ..** ^Hence, a
4dee0 20 63 61 63 68 65 20 63 72 65 61 74 65 64 20 77 cache created w
4def0 69 74 68 20 62 50 75 72 67 65 61 62 6c 65 20 66 ith bPurgeable f
4df00 61 6c 73 65 20 77 69 6c 6c 0d 0a 2a 2a 20 6e 65 alse will..** ne
4df10 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 ver contain any
4df20 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 2e 0d unpinned pages..
4df30 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 74 68 65 20 78 43 .**..** [[the xC
4df40 61 63 68 65 73 69 7a 65 28 29 20 70 61 67 65 20 achesize() page
4df50 63 61 63 68 65 20 6d 65 74 68 6f 64 5d 5d 0d 0a cache method]]..
4df60 2a 2a 20 5e 28 54 68 65 20 78 43 61 63 68 65 73 ** ^(The xCaches
4df70 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 6d 61 79 ize() method may
4df80 20 62 65 20 63 61 6c 6c 65 64 20 61 74 20 61 6e be called at an
4df90 79 20 74 69 6d 65 20 62 79 20 53 51 4c 69 74 65 y time by SQLite
4dfa0 20 74 6f 20 73 65 74 20 74 68 65 0d 0a 2a 2a 20 to set the..**
4dfb0 73 75 67 67 65 73 74 65 64 20 6d 61 78 69 6d 75 suggested maximu
4dfc0 6d 20 63 61 63 68 65 2d 73 69 7a 65 20 28 6e 75 m cache-size (nu
4dfd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 mber of pages st
4dfe0 6f 72 65 64 20 62 79 29 20 74 68 65 20 63 61 63 ored by) the cac
4dff0 68 65 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 he..** instance
4e000 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 passed as the fi
4e010 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 rst argument. Th
4e020 69 73 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 is is the value
4e030 63 6f 6e 66 69 67 75 72 65 64 20 75 73 69 6e 67 configured using
4e040 0d 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 ..** the SQLite
4e050 22 5b 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 "[PRAGMA cache_s
4e060 69 7a 65 5d 22 20 63 6f 6d 6d 61 6e 64 2e 29 5e ize]" command.)^
4e070 20 20 41 73 20 77 69 74 68 20 74 68 65 20 62 50 As with the bP
4e080 75 72 67 65 61 62 6c 65 0d 0a 2a 2a 20 70 61 72 urgeable..** par
4e090 61 6d 65 74 65 72 2c 20 74 68 65 20 69 6d 70 6c ameter, the impl
4e0a0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 6f ementation is no
4e0b0 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 6f t required to do
4e0c0 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 74 anything with t
4e0d0 68 69 73 0d 0a 2a 2a 20 76 61 6c 75 65 3b 20 69 his..** value; i
4e0e0 74 20 69 73 20 61 64 76 69 73 6f 72 79 20 6f 6e t is advisory on
4e0f0 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5b 5b 74 68 ly...**..** [[th
4e100 65 20 78 50 61 67 65 63 6f 75 6e 74 28 29 20 70 e xPagecount() p
4e110 61 67 65 20 63 61 63 68 65 20 6d 65 74 68 6f 64 age cache method
4e120 73 5d 5d 0d 0a 2a 2a 20 54 68 65 20 78 50 61 67 s]]..** The xPag
4e130 65 63 6f 75 6e 74 28 29 20 6d 65 74 68 6f 64 20 ecount() method
4e140 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 must return the
4e150 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 number of pages
4e160 63 75 72 72 65 6e 74 6c 79 0d 0a 2a 2a 20 73 74 currently..** st
4e170 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 ored in the cach
4e180 65 2c 20 62 6f 74 68 20 70 69 6e 6e 65 64 20 61 e, both pinned a
4e190 6e 64 20 75 6e 70 69 6e 6e 65 64 2e 0d 0a 2a 2a nd unpinned...**
4e1a0 20 0d 0a 2a 2a 20 5b 5b 74 68 65 20 78 46 65 74 ..** [[the xFet
4e1b0 63 68 28 29 20 70 61 67 65 20 63 61 63 68 65 20 ch() page cache
4e1c0 6d 65 74 68 6f 64 73 5d 5d 0d 0a 2a 2a 20 54 68 methods]]..** Th
4e1d0 65 20 78 46 65 74 63 68 28 29 20 6d 65 74 68 6f e xFetch() metho
4e1e0 64 20 6c 6f 63 61 74 65 73 20 61 20 70 61 67 65 d locates a page
4e1f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e in the cache an
4e200 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e d returns a poin
4e210 74 65 72 20 74 6f 20 0d 0a 2a 2a 20 61 6e 20 73 ter to ..** an s
4e220 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 qlite3_pcache_pa
4e230 67 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 ge object associ
4e240 61 74 65 64 20 77 69 74 68 20 74 68 61 74 20 70 ated with that p
4e250 61 67 65 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 age, or a NULL p
4e260 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 20 54 68 65 20 ointer...** The
4e270 70 42 75 66 20 65 6c 65 6d 65 6e 74 20 6f 66 20 pBuf element of
4e280 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 71 6c the returned sql
4e290 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 ite3_pcache_page
4e2a0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 object will be
4e2b0 61 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f a..** pointer to
4e2c0 20 61 20 62 75 66 66 65 72 20 6f 66 20 73 7a 50 a buffer of szP
4e2d0 61 67 65 20 62 79 74 65 73 20 75 73 65 64 20 74 age bytes used t
4e2e0 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 o store the cont
4e2f0 65 6e 74 20 6f 66 20 61 20 0d 0a 2a 2a 20 73 69 ent of a ..** si
4e300 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 70 61 ngle database pa
4e310 67 65 2e 20 20 54 68 65 20 70 45 78 74 72 61 20 ge. The pExtra
4e320 65 6c 65 6d 65 6e 74 20 6f 66 20 73 71 6c 69 74 element of sqlit
4e330 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 77 e3_pcache_page w
4e340 69 6c 6c 20 62 65 0d 0a 2a 2a 20 61 20 70 6f 69 ill be..** a poi
4e350 6e 74 65 72 20 74 6f 20 74 68 65 20 73 7a 45 78 nter to the szEx
4e360 74 72 61 20 62 79 74 65 73 20 6f 66 20 65 78 74 tra bytes of ext
4e370 72 61 20 73 74 6f 72 61 67 65 20 74 68 61 74 20 ra storage that
4e380 53 51 4c 69 74 65 20 68 61 73 20 72 65 71 75 65 SQLite has reque
4e390 73 74 65 64 0d 0a 2a 2a 20 66 6f 72 20 65 61 63 sted..** for eac
4e3a0 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 h entry in the p
4e3b0 61 67 65 20 63 61 63 68 65 2e 0d 0a 2a 2a 0d 0a age cache...**..
4e3c0 2a 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 ** The page to b
4e3d0 65 20 66 65 74 63 68 65 64 20 69 73 20 64 65 74 e fetched is det
4e3e0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6b ermined by the k
4e3f0 65 79 2e 20 5e 54 68 65 20 6d 69 6e 69 6d 75 6d ey. ^The minimum
4e400 20 6b 65 79 20 76 61 6c 75 65 0d 0a 2a 2a 20 69 key value..** i
4e410 73 20 31 2e 20 20 41 66 74 65 72 20 69 74 20 68 s 1. After it h
4e420 61 73 20 62 65 65 6e 20 72 65 74 72 69 65 76 65 as been retrieve
4e430 64 20 75 73 69 6e 67 20 78 46 65 74 63 68 2c 20 d using xFetch,
4e440 74 68 65 20 70 61 67 65 20 69 73 20 63 6f 6e 73 the page is cons
4e450 69 64 65 72 65 64 0d 0a 2a 2a 20 74 6f 20 62 65 idered..** to be
4e460 20 22 70 69 6e 6e 65 64 22 2e 0d 0a 2a 2a 0d 0a "pinned"...**..
4e470 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 ** If the reques
4e480 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 ted page is alre
4e490 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 20 ady in the page
4e4a0 63 61 63 68 65 2c 20 74 68 65 6e 20 74 68 65 20 cache, then the
4e4b0 70 61 67 65 20 63 61 63 68 65 0d 0a 2a 2a 20 69 page cache..** i
4e4c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 mplementation mu
4e4d0 73 74 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e st return a poin
4e4e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 ter to the page
4e4f0 62 75 66 66 65 72 20 77 69 74 68 20 69 74 73 20 buffer with its
4e500 63 6f 6e 74 65 6e 74 0d 0a 2a 2a 20 69 6e 74 61 content..** inta
4e510 63 74 2e 20 20 49 66 20 74 68 65 20 72 65 71 75 ct. If the requ
4e520 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f ested page is no
4e530 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 t already in the
4e540 20 63 61 63 68 65 2c 20 74 68 65 6e 20 74 68 65 cache, then the
4e550 0d 0a 2a 2a 20 63 61 63 68 65 20 69 6d 70 6c 65 ..** cache imple
4e560 6d 65 6e 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 mentation should
4e570 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f use the value o
4e580 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 f the createFlag
4e590 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 ..** parameter t
4e5a0 6f 20 68 65 6c 70 20 69 74 20 64 65 74 65 72 6d o help it determ
4e5b0 69 6e 65 64 20 77 68 61 74 20 61 63 74 69 6f 6e ined what action
4e5c0 20 74 6f 20 74 61 6b 65 3a 0d 0a 2a 2a 0d 0a 2a to take:..**..*
4e5d0 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d * <table border=
4e5e0 31 20 77 69 64 74 68 3d 38 35 25 20 61 6c 69 67 1 width=85% alig
4e5f0 6e 3d 63 65 6e 74 65 72 3e 0d 0a 2a 2a 20 3c 74 n=center>..** <t
4e600 72 3e 3c 74 68 3e 20 63 72 65 61 74 65 46 6c 61 r><th> createFla
4e610 67 20 3c 74 68 3e 20 42 65 68 61 76 69 6f 75 72 g <th> Behaviour
4e620 20 77 68 65 6e 20 70 61 67 65 20 69 73 20 6e 6f when page is no
4e630 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 t already in cac
4e640 68 65 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 he..** <tr><td>
4e650 30 20 3c 74 64 3e 20 44 6f 20 6e 6f 74 20 61 6c 0 <td> Do not al
4e660 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 locate a new pag
4e670 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 2e e. Return NULL.
4e680 0d 0a 2a 2a 20 3c 74 72 3e 3c 74 64 3e 20 31 20 ..** <tr><td> 1
4e690 3c 74 64 3e 20 41 6c 6c 6f 63 61 74 65 20 61 20 <td> Allocate a
4e6a0 6e 65 77 20 70 61 67 65 20 69 66 20 69 74 20 65 new page if it e
4e6b0 61 73 79 20 61 6e 64 20 63 6f 6e 76 65 6e 69 65 asy and convenie
4e6c0 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 0d 0a 2a 2a nt to do so...**
4e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4e6e0 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 Otherwise retur
4e6f0 6e 20 4e 55 4c 4c 2e 0d 0a 2a 2a 20 3c 74 72 3e n NULL...** <tr>
4e700 3c 74 64 3e 20 32 20 3c 74 64 3e 20 4d 61 6b 65 <td> 2 <td> Make
4e710 20 65 76 65 72 79 20 65 66 66 6f 72 74 20 74 6f every effort to
4e720 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 allocate a new
4e730 70 61 67 65 2e 20 20 4f 6e 6c 79 20 72 65 74 75 page. Only retu
4e740 72 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 rn..**
4e750 20 20 20 20 20 20 20 4e 55 4c 4c 20 69 66 20 61 NULL if a
4e760 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 llocating a new
4e770 70 61 67 65 20 69 73 20 65 66 66 65 63 74 69 76 page is effectiv
4e780 65 6c 79 20 69 6d 70 6f 73 73 69 62 6c 65 2e 0d ely impossible..
4e790 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e 0d 0a 2a 2a .** </table>..**
4e7a0 0d 0a 2a 2a 20 5e 28 53 51 4c 69 74 65 20 77 69 ..** ^(SQLite wi
4e7b0 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 76 6f ll normally invo
4e7c0 6b 65 20 78 46 65 74 63 68 28 29 20 77 69 74 68 ke xFetch() with
4e7d0 20 61 20 63 72 65 61 74 65 46 6c 61 67 20 6f 66 a createFlag of
4e7e0 20 30 20 6f 72 20 31 2e 20 20 53 51 4c 69 74 65 0 or 1. SQLite
4e7f0 0d 0a 2a 2a 20 77 69 6c 6c 20 6f 6e 6c 79 20 75 ..** will only u
4e800 73 65 20 61 20 63 72 65 61 74 65 46 6c 61 67 20 se a createFlag
4e810 6f 66 20 32 20 61 66 74 65 72 20 61 20 70 72 69 of 2 after a pri
4e820 6f 72 20 63 61 6c 6c 20 77 69 74 68 20 61 20 63 or call with a c
4e830 72 65 61 74 65 46 6c 61 67 20 6f 66 20 31 0d 0a reateFlag of 1..
4e840 2a 2a 20 66 61 69 6c 65 64 2e 29 5e 20 20 49 6e ** failed.)^ In
4e850 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 6f 20 between the to
4e860 78 46 65 74 63 68 28 29 20 63 61 6c 6c 73 2c 20 xFetch() calls,
4e870 53 51 4c 69 74 65 20 6d 61 79 0d 0a 2a 2a 20 61 SQLite may..** a
4e880 74 74 65 6d 70 74 20 74 6f 20 75 6e 70 69 6e 20 ttempt to unpin
4e890 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 63 68 one or more cach
4e8a0 65 20 70 61 67 65 73 20 62 79 20 73 70 69 6c 6c e pages by spill
4e8b0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 ing the content
4e8c0 6f 66 0d 0a 2a 2a 20 70 69 6e 6e 65 64 20 70 61 of..** pinned pa
4e8d0 67 65 73 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 ges to disk and
4e8e0 73 79 6e 63 68 69 6e 67 20 74 68 65 20 6f 70 65 synching the ope
4e8f0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 69 rating system di
4e900 73 6b 20 63 61 63 68 65 2e 0d 0a 2a 2a 0d 0a 2a sk cache...**..*
4e910 2a 20 5b 5b 74 68 65 20 78 55 6e 70 69 6e 28 29 * [[the xUnpin()
4e920 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 74 68 page cache meth
4e930 6f 64 5d 5d 0d 0a 2a 2a 20 5e 78 55 6e 70 69 6e od]]..** ^xUnpin
4e940 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 () is called by
4e950 53 51 4c 69 74 65 20 77 69 74 68 20 61 20 70 6f SQLite with a po
4e960 69 6e 74 65 72 20 74 6f 20 61 20 63 75 72 72 65 inter to a curre
4e970 6e 74 6c 79 20 70 69 6e 6e 65 64 20 70 61 67 65 ntly pinned page
4e980 0d 0a 2a 2a 20 61 73 20 69 74 73 20 73 65 63 6f ..** as its seco
4e990 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 nd argument. If
4e9a0 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d the third param
4e9b0 65 74 65 72 2c 20 64 69 73 63 61 72 64 2c 20 69 eter, discard, i
4e9c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0d 0a 2a 2a 20 s non-zero,..**
4e9d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 then the page mu
4e9e0 73 74 20 62 65 20 65 76 69 63 74 65 64 20 66 72 st be evicted fr
4e9f0 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 0d 0a 2a om the cache...*
4ea00 2a 20 5e 49 66 20 74 68 65 20 64 69 73 63 61 72 * ^If the discar
4ea10 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 0d 0a d parameter is..
4ea20 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 ** zero, then th
4ea30 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 64 69 e page may be di
4ea40 73 63 61 72 64 65 64 20 6f 72 20 72 65 74 61 69 scarded or retai
4ea50 6e 65 64 20 61 74 20 74 68 65 20 64 69 73 63 72 ned at the discr
4ea60 65 74 69 6f 6e 20 6f 66 0d 0a 2a 2a 20 70 61 67 etion of..** pag
4ea70 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e e cache implemen
4ea80 74 61 74 69 6f 6e 2e 20 5e 54 68 65 20 70 61 67 tation. ^The pag
4ea90 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e e cache implemen
4eaa0 74 61 74 69 6f 6e 0d 0a 2a 2a 20 6d 61 79 20 63 tation..** may c
4eab0 68 6f 6f 73 65 20 74 6f 20 65 76 69 63 74 20 75 hoose to evict u
4eac0 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 20 61 74 npinned pages at
4ead0 20 61 6e 79 20 74 69 6d 65 2e 0d 0a 2a 2a 0d 0a any time...**..
4eae0 2a 2a 20 54 68 65 20 63 61 63 68 65 20 6d 75 73 ** The cache mus
4eaf0 74 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e t not perform an
4eb00 79 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e y reference coun
4eb10 74 69 6e 67 2e 20 41 20 73 69 6e 67 6c 65 20 0d ting. A single .
4eb20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 78 55 6e 70 .** call to xUnp
4eb30 69 6e 28 29 20 75 6e 70 69 6e 73 20 74 68 65 20 in() unpins the
4eb40 70 61 67 65 20 72 65 67 61 72 64 6c 65 73 73 20 page regardless
4eb50 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 of the number of
4eb60 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 0d 0a 2a prior calls ..*
4eb70 2a 20 74 6f 20 78 46 65 74 63 68 28 29 2e 0d 0a * to xFetch()...
4eb80 2a 2a 0d 0a 2a 2a 20 5b 5b 74 68 65 20 78 52 65 **..** [[the xRe
4eb90 6b 65 79 28 29 20 70 61 67 65 20 63 61 63 68 65 key() page cache
4eba0 20 6d 65 74 68 6f 64 73 5d 5d 0d 0a 2a 2a 20 54 methods]]..** T
4ebb0 68 65 20 78 52 65 6b 65 79 28 29 20 6d 65 74 68 he xRekey() meth
4ebc0 6f 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 od is used to ch
4ebd0 61 6e 67 65 20 74 68 65 20 6b 65 79 20 76 61 6c ange the key val
4ebe0 75 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ue associated wi
4ebf0 74 68 20 74 68 65 0d 0a 2a 2a 20 70 61 67 65 20 th the..** page
4ec00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 passed as the se
4ec10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49 cond argument. I
4ec20 66 20 74 68 65 20 63 61 63 68 65 0d 0a 2a 2a 20 f the cache..**
4ec30 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 previously conta
4ec40 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 61 73 73 ins an entry ass
4ec50 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 ociated with new
4ec60 4b 65 79 2c 20 69 74 20 6d 75 73 74 20 62 65 0d Key, it must be.
4ec70 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 5e .** discarded. ^
4ec80 41 6e 79 20 70 72 69 6f 72 20 63 61 63 68 65 20 Any prior cache
4ec90 65 6e 74 72 79 20 61 73 73 6f 63 69 61 74 65 64 entry associated
4eca0 20 77 69 74 68 20 6e 65 77 4b 65 79 20 69 73 20 with newKey is
4ecb0 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0d 0a guaranteed not..
4ecc0 2a 2a 20 74 6f 20 62 65 20 70 69 6e 6e 65 64 2e ** to be pinned.
4ecd0 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 53 51 ..**..** When SQ
4ece0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 65 20 78 Lite calls the x
4ecf0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f Truncate() metho
4ed00 64 2c 20 74 68 65 20 63 61 63 68 65 20 6d 75 73 d, the cache mus
4ed10 74 20 64 69 73 63 61 72 64 20 61 6c 6c 0d 0a 2a t discard all..*
4ed20 2a 20 65 78 69 73 74 69 6e 67 20 63 61 63 68 65 * existing cache
4ed30 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 70 61 entries with pa
4ed40 67 65 20 6e 75 6d 62 65 72 73 20 28 6b 65 79 73 ge numbers (keys
4ed50 29 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f ) greater than o
4ed60 72 20 65 71 75 61 6c 0d 0a 2a 2a 20 74 6f 20 74 r equal..** to t
4ed70 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
4ed80 69 4c 69 6d 69 74 20 70 61 72 61 6d 65 74 65 72 iLimit parameter
4ed90 20 70 61 73 73 65 64 20 74 6f 20 78 54 72 75 6e passed to xTrun
4eda0 63 61 74 65 28 29 2e 20 49 66 20 61 6e 79 0d 0a cate(). If any..
4edb0 2a 2a 20 6f 66 20 74 68 65 73 65 20 70 61 67 65 ** of these page
4edc0 73 20 61 72 65 20 70 69 6e 6e 65 64 2c 20 74 68 s are pinned, th
4edd0 65 79 20 61 72 65 20 69 6d 70 6c 69 63 69 74 6c ey are implicitl
4ede0 79 20 75 6e 70 69 6e 6e 65 64 2c 20 6d 65 61 6e y unpinned, mean
4edf0 69 6e 67 20 74 68 61 74 0d 0a 2a 2a 20 74 68 65 ing that..** the
4ee00 79 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 y can be safely
4ee10 64 69 73 63 61 72 64 65 64 2e 0d 0a 2a 2a 0d 0a discarded...**..
4ee20 2a 2a 20 5b 5b 74 68 65 20 78 44 65 73 74 72 6f ** [[the xDestro
4ee30 79 28 29 20 70 61 67 65 20 63 61 63 68 65 20 6d y() page cache m
4ee40 65 74 68 6f 64 5d 5d 0d 0a 2a 2a 20 5e 54 68 65 ethod]]..** ^The
4ee50 20 78 44 65 73 74 72 6f 79 28 29 20 6d 65 74 68 xDestroy() meth
4ee60 6f 64 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 od is used to de
4ee70 6c 65 74 65 20 61 20 63 61 63 68 65 20 61 6c 6c lete a cache all
4ee80 6f 63 61 74 65 64 20 62 79 20 78 43 72 65 61 74 ocated by xCreat
4ee90 65 28 29 2e 0d 0a 2a 2a 20 41 6c 6c 20 72 65 73 e()...** All res
4eea0 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 ources associate
4eeb0 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 d with the speci
4eec0 66 69 65 64 20 63 61 63 68 65 20 73 68 6f 75 6c fied cache shoul
4eed0 64 20 62 65 20 66 72 65 65 64 2e 20 5e 41 66 74 d be freed. ^Aft
4eee0 65 72 0d 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 er..** calling t
4eef0 68 65 20 78 44 65 73 74 72 6f 79 28 29 20 6d 65 he xDestroy() me
4ef00 74 68 6f 64 2c 20 53 51 4c 69 74 65 20 63 6f 6e thod, SQLite con
4ef10 73 69 64 65 72 73 20 74 68 65 20 5b 73 71 6c 69 siders the [sqli
4ef20 74 65 33 5f 70 63 61 63 68 65 2a 5d 0d 0a 2a 2a te3_pcache*]..**
4ef30 20 68 61 6e 64 6c 65 20 69 6e 76 61 6c 69 64 2c handle invalid,
4ef40 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 75 73 and will not us
4ef50 65 20 69 74 20 77 69 74 68 20 61 6e 79 20 6f 74 e it with any ot
4ef60 68 65 72 20 73 71 6c 69 74 65 33 5f 70 63 61 63 her sqlite3_pcac
4ef70 68 65 5f 6d 65 74 68 6f 64 73 32 0d 0a 2a 2a 20 he_methods2..**
4ef80 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a functions...**..
4ef90 2a 2a 20 5b 5b 74 68 65 20 78 53 68 72 69 6e 6b ** [[the xShrink
4efa0 28 29 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 () page cache me
4efb0 74 68 6f 64 5d 5d 0d 0a 2a 2a 20 5e 53 51 4c 69 thod]]..** ^SQLi
4efc0 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 te invokes the x
4efd0 53 68 72 69 6e 6b 28 29 20 6d 65 74 68 6f 64 20 Shrink() method
4efe0 77 68 65 6e 20 69 74 20 77 61 6e 74 73 20 74 68 when it wants th
4eff0 65 20 70 61 67 65 20 63 61 63 68 65 20 74 6f 0d e page cache to.
4f000 0a 2a 2a 20 66 72 65 65 20 75 70 20 61 73 20 6d .** free up as m
4f010 75 63 68 20 6f 66 20 68 65 61 70 20 6d 65 6d 6f uch of heap memo
4f020 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 ry as possible.
4f030 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 The page cache
4f040 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0d 0a implementation..
4f050 2a 2a 20 69 73 20 6e 6f 74 20 6f 62 6c 69 67 61 ** is not obliga
4f060 74 65 64 20 74 6f 20 66 72 65 65 20 61 6e 79 20 ted to free any
4f070 6d 65 6d 6f 72 79 2c 20 62 75 74 20 77 65 6c 6c memory, but well
4f080 2d 62 65 68 61 76 65 64 20 69 6d 70 6c 65 6d 65 -behaved impleme
4f090 6e 74 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 0d ntations should.
4f0a0 0a 2a 2a 20 64 6f 20 74 68 65 69 72 20 62 65 73 .** do their bes
4f0b0 74 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 t...*/..typedef
4f0c0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 70 struct sqlite3_p
4f0d0 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 20 73 cache_methods2 s
4f0e0 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 qlite3_pcache_me
4f0f0 74 68 6f 64 73 32 3b 0d 0a 73 74 72 75 63 74 20 thods2;..struct
4f100 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d sqlite3_pcache_m
4f110 65 74 68 6f 64 73 32 20 7b 0d 0a 20 20 69 6e 74 ethods2 {.. int
4f120 20 69 56 65 72 73 69 6f 6e 3b 0d 0a 20 20 76 6f iVersion;.. vo
4f130 69 64 20 2a 70 41 72 67 3b 0d 0a 20 20 69 6e 74 id *pArg;.. int
4f140 20 28 2a 78 49 6e 69 74 29 28 76 6f 69 64 2a 29 (*xInit)(void*)
4f150 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 53 68 75 ;.. void (*xShu
4f160 74 64 6f 77 6e 29 28 76 6f 69 64 2a 29 3b 0d 0a tdown)(void*);..
4f170 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 sqlite3_pcache
4f180 20 2a 28 2a 78 43 72 65 61 74 65 29 28 69 6e 74 *(*xCreate)(int
4f190 20 73 7a 50 61 67 65 2c 20 69 6e 74 20 73 7a 45 szPage, int szE
4f1a0 78 74 72 61 2c 20 69 6e 74 20 62 50 75 72 67 65 xtra, int bPurge
4f1b0 61 62 6c 65 29 3b 0d 0a 20 20 76 6f 69 64 20 28 able);.. void (
4f1c0 2a 78 43 61 63 68 65 73 69 7a 65 29 28 73 71 6c *xCachesize)(sql
4f1d0 69 74 65 33 5f 70 63 61 63 68 65 2a 2c 20 69 6e ite3_pcache*, in
4f1e0 74 20 6e 43 61 63 68 65 73 69 7a 65 29 3b 0d 0a t nCachesize);..
4f1f0 20 20 69 6e 74 20 28 2a 78 50 61 67 65 63 6f 75 int (*xPagecou
4f200 6e 74 29 28 73 71 6c 69 74 65 33 5f 70 63 61 63 nt)(sqlite3_pcac
4f210 68 65 2a 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 he*);.. sqlite3
4f220 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 28 2a _pcache_page *(*
4f230 78 46 65 74 63 68 29 28 73 71 6c 69 74 65 33 5f xFetch)(sqlite3_
4f240 70 63 61 63 68 65 2a 2c 20 75 6e 73 69 67 6e 65 pcache*, unsigne
4f250 64 20 6b 65 79 2c 20 69 6e 74 20 63 72 65 61 74 d key, int creat
4f260 65 46 6c 61 67 29 3b 0d 0a 20 20 76 6f 69 64 20 eFlag);.. void
4f270 28 2a 78 55 6e 70 69 6e 29 28 73 71 6c 69 74 65 (*xUnpin)(sqlite
4f280 33 5f 70 63 61 63 68 65 2a 2c 20 73 71 6c 69 74 3_pcache*, sqlit
4f290 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 2a 2c e3_pcache_page*,
4f2a0 20 69 6e 74 20 64 69 73 63 61 72 64 29 3b 0d 0a int discard);..
4f2b0 20 20 76 6f 69 64 20 28 2a 78 52 65 6b 65 79 29 void (*xRekey)
4f2c0 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 2a (sqlite3_pcache*
4f2d0 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 , sqlite3_pcache
4f2e0 5f 70 61 67 65 2a 2c 20 0d 0a 20 20 20 20 20 20 _page*, ..
4f2f0 75 6e 73 69 67 6e 65 64 20 6f 6c 64 4b 65 79 2c unsigned oldKey,
4f300 20 75 6e 73 69 67 6e 65 64 20 6e 65 77 4b 65 79 unsigned newKey
4f310 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 54 72 );.. void (*xTr
4f320 75 6e 63 61 74 65 29 28 73 71 6c 69 74 65 33 5f uncate)(sqlite3_
4f330 70 63 61 63 68 65 2a 2c 20 75 6e 73 69 67 6e 65 pcache*, unsigne
4f340 64 20 69 4c 69 6d 69 74 29 3b 0d 0a 20 20 76 6f d iLimit);.. vo
4f350 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 73 id (*xDestroy)(s
4f360 71 6c 69 74 65 33 5f 70 63 61 63 68 65 2a 29 3b qlite3_pcache*);
4f370 0d 0a 20 20 76 6f 69 64 20 28 2a 78 53 68 72 69 .. void (*xShri
4f380 6e 6b 29 28 73 71 6c 69 74 65 33 5f 70 63 61 63 nk)(sqlite3_pcac
4f390 68 65 2a 29 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d he*);..};..../*.
4f3a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 .** This is the
4f3b0 6f 62 73 6f 6c 65 74 65 20 70 63 61 63 68 65 5f obsolete pcache_
4f3c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 methods object t
4f3d0 68 61 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e hat has now been
4f3e0 20 72 65 70 6c 61 63 65 64 0d 0a 2a 2a 20 62 79 replaced..** by
4f3f0 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f sqlite3_pcache_
4f400 6d 65 74 68 6f 64 73 32 2e 20 20 54 68 69 73 20 methods2. This
4f410 6f 62 6a 65 63 74 20 69 73 20 6e 6f 74 20 75 73 object is not us
4f420 65 64 20 62 79 20 53 51 4c 69 74 65 2e 20 20 49 ed by SQLite. I
4f430 74 20 69 73 0d 0a 2a 2a 20 72 65 74 61 69 6e 65 t is..** retaine
4f440 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 d in the header
4f450 66 69 6c 65 20 66 6f 72 20 62 61 63 6b 77 61 72 file for backwar
4f460 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 ds compatibility
4f470 20 6f 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 only...*/..type
4f480 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 def struct sqlit
4f490 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 e3_pcache_method
4f4a0 73 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 s sqlite3_pcache
4f4b0 5f 6d 65 74 68 6f 64 73 3b 0d 0a 73 74 72 75 63 _methods;..struc
4f4c0 74 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 t sqlite3_pcache
4f4d0 5f 6d 65 74 68 6f 64 73 20 7b 0d 0a 20 20 76 6f _methods {.. vo
4f4e0 69 64 20 2a 70 41 72 67 3b 0d 0a 20 20 69 6e 74 id *pArg;.. int
4f4f0 20 28 2a 78 49 6e 69 74 29 28 76 6f 69 64 2a 29 (*xInit)(void*)
4f500 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 53 68 75 ;.. void (*xShu
4f510 74 64 6f 77 6e 29 28 76 6f 69 64 2a 29 3b 0d 0a tdown)(void*);..
4f520 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 sqlite3_pcache
4f530 20 2a 28 2a 78 43 72 65 61 74 65 29 28 69 6e 74 *(*xCreate)(int
4f540 20 73 7a 50 61 67 65 2c 20 69 6e 74 20 62 50 75 szPage, int bPu
4f550 72 67 65 61 62 6c 65 29 3b 0d 0a 20 20 76 6f 69 rgeable);.. voi
4f560 64 20 28 2a 78 43 61 63 68 65 73 69 7a 65 29 28 d (*xCachesize)(
4f570 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 2a 2c sqlite3_pcache*,
4f580 20 69 6e 74 20 6e 43 61 63 68 65 73 69 7a 65 29 int nCachesize)
4f590 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 50 61 67 65 ;.. int (*xPage
4f5a0 63 6f 75 6e 74 29 28 73 71 6c 69 74 65 33 5f 70 count)(sqlite3_p
4f5b0 63 61 63 68 65 2a 29 3b 0d 0a 20 20 76 6f 69 64 cache*);.. void
4f5c0 20 2a 28 2a 78 46 65 74 63 68 29 28 73 71 6c 69 *(*xFetch)(sqli
4f5d0 74 65 33 5f 70 63 61 63 68 65 2a 2c 20 75 6e 73 te3_pcache*, uns
4f5e0 69 67 6e 65 64 20 6b 65 79 2c 20 69 6e 74 20 63 igned key, int c
4f5f0 72 65 61 74 65 46 6c 61 67 29 3b 0d 0a 20 20 76 reateFlag);.. v
4f600 6f 69 64 20 28 2a 78 55 6e 70 69 6e 29 28 73 71 oid (*xUnpin)(sq
4f610 6c 69 74 65 33 5f 70 63 61 63 68 65 2a 2c 20 76 lite3_pcache*, v
4f620 6f 69 64 2a 2c 20 69 6e 74 20 64 69 73 63 61 72 oid*, int discar
4f630 64 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 52 d);.. void (*xR
4f640 65 6b 65 79 29 28 73 71 6c 69 74 65 33 5f 70 63 ekey)(sqlite3_pc
4f650 61 63 68 65 2a 2c 20 76 6f 69 64 2a 2c 20 75 6e ache*, void*, un
4f660 73 69 67 6e 65 64 20 6f 6c 64 4b 65 79 2c 20 75 signed oldKey, u
4f670 6e 73 69 67 6e 65 64 20 6e 65 77 4b 65 79 29 3b nsigned newKey);
4f680 0d 0a 20 20 76 6f 69 64 20 28 2a 78 54 72 75 6e .. void (*xTrun
4f690 63 61 74 65 29 28 73 71 6c 69 74 65 33 5f 70 63 cate)(sqlite3_pc
4f6a0 61 63 68 65 2a 2c 20 75 6e 73 69 67 6e 65 64 20 ache*, unsigned
4f6b0 69 4c 69 6d 69 74 29 3b 0d 0a 20 20 76 6f 69 64 iLimit);.. void
4f6c0 20 28 2a 78 44 65 73 74 72 6f 79 29 28 73 71 6c (*xDestroy)(sql
4f6d0 69 74 65 33 5f 70 63 61 63 68 65 2a 29 3b 0d 0a ite3_pcache*);..
4f6e0 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 };....../*..** C
4f6f0 41 50 49 33 52 45 46 3a 20 4f 6e 6c 69 6e 65 20 API3REF: Online
4f700 42 61 63 6b 75 70 20 4f 62 6a 65 63 74 0d 0a 2a Backup Object..*
4f710 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 *..** The sqlite
4f720 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 20 3_backup object
4f730 72 65 63 6f 72 64 73 20 73 74 61 74 65 20 69 6e records state in
4f740 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
4f750 61 6e 20 6f 6e 67 6f 69 6e 67 0d 0a 2a 2a 20 6f an ongoing..** o
4f760 6e 6c 69 6e 65 20 62 61 63 6b 75 70 20 6f 70 65 nline backup ope
4f770 72 61 74 69 6f 6e 2e 20 20 5e 54 68 65 20 73 71 ration. ^The sq
4f780 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a lite3_backup obj
4f790 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 62 ect is created b
4f7a0 79 0d 0a 2a 2a 20 61 20 63 61 6c 6c 20 74 6f 20 y..** a call to
4f7b0 5b 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f [sqlite3_backup_
4f7c0 69 6e 69 74 28 29 5d 20 61 6e 64 20 69 73 20 64 init()] and is d
4f7d0 65 73 74 72 6f 79 65 64 20 62 79 20 61 20 63 61 estroyed by a ca
4f7e0 6c 6c 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 74 ll to..** [sqlit
4f7f0 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
4f800 28 29 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 ()]...**..** See
4f810 20 41 6c 73 6f 3a 20 5b 55 73 69 6e 67 20 74 68 Also: [Using th
4f820 65 20 53 51 4c 69 74 65 20 4f 6e 6c 69 6e 65 20 e SQLite Online
4f830 42 61 63 6b 75 70 20 41 50 49 5d 0d 0a 2a 2f 0d Backup API]..*/.
4f840 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
4f850 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 73 sqlite3_backup s
4f860 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 3b 0d 0a qlite3_backup;..
4f870 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
4f880 46 3a 20 4f 6e 6c 69 6e 65 20 42 61 63 6b 75 70 F: Online Backup
4f890 20 41 50 49 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 API...**..** Th
4f8a0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 70 e backup API cop
4f8b0 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 ies the content
4f8c0 6f 66 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 of one database
4f8d0 69 6e 74 6f 20 61 6e 6f 74 68 65 72 2e 0d 0a 2a into another...*
4f8e0 2a 20 49 74 20 69 73 20 75 73 65 66 75 6c 20 65 * It is useful e
4f8f0 69 74 68 65 72 20 66 6f 72 20 63 72 65 61 74 69 ither for creati
4f900 6e 67 20 62 61 63 6b 75 70 73 20 6f 66 20 64 61 ng backups of da
4f910 74 61 62 61 73 65 73 20 6f 72 0d 0a 2a 2a 20 66 tabases or..** f
4f920 6f 72 20 63 6f 70 79 69 6e 67 20 69 6e 2d 6d 65 or copying in-me
4f930 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 74 mory databases t
4f940 6f 20 6f 72 20 66 72 6f 6d 20 70 65 72 73 69 73 o or from persis
4f950 74 65 6e 74 20 66 69 6c 65 73 2e 20 0d 0a 2a 2a tent files. ..**
4f960 0d 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 5b ..** See Also: [
4f970 55 73 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 Using the SQLite
4f980 20 4f 6e 6c 69 6e 65 20 42 61 63 6b 75 70 20 41 Online Backup A
4f990 50 49 5d 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 53 51 4c PI]..**..** ^SQL
4f9a0 69 74 65 20 68 6f 6c 64 73 20 61 20 77 72 69 74 ite holds a writ
4f9b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 e transaction op
4f9c0 65 6e 20 6f 6e 20 74 68 65 20 64 65 73 74 69 6e en on the destin
4f9d0 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20 66 ation database f
4f9e0 69 6c 65 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 ile..** for the
4f9f0 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 duration of the
4fa00 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e backup operation
4fa10 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 6f 75 72 63 ...** ^The sourc
4fa20 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 e database is re
4fa30 61 64 2d 6c 6f 63 6b 65 64 20 6f 6e 6c 79 20 77 ad-locked only w
4fa40 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67 hile it is being
4fa50 20 72 65 61 64 3b 0d 0a 2a 2a 20 69 74 20 69 73 read;..** it is
4fa60 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 63 6f 6e 74 not locked cont
4fa70 69 6e 75 6f 75 73 6c 79 20 66 6f 72 20 74 68 65 inuously for the
4fa80 20 65 6e 74 69 72 65 20 62 61 63 6b 75 70 20 6f entire backup o
4fa90 70 65 72 61 74 69 6f 6e 2e 0d 0a 2a 2a 20 5e 54 peration...** ^T
4faa0 68 75 73 2c 20 74 68 65 20 62 61 63 6b 75 70 20 hus, the backup
4fab0 6d 61 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 may be performed
4fac0 20 6f 6e 20 61 20 6c 69 76 65 20 73 6f 75 72 63 on a live sourc
4fad0 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 6f e database witho
4fae0 75 74 0d 0a 2a 2a 20 70 72 65 76 65 6e 74 69 6e ut..** preventin
4faf0 67 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 g other database
4fb00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f connections fro
4fb10 6d 0d 0a 2a 2a 20 72 65 61 64 69 6e 67 20 6f 72 m..** reading or
4fb20 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 writing to the
4fb30 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 source database
4fb40 77 68 69 6c 65 20 74 68 65 20 62 61 63 6b 75 70 while the backup
4fb50 20 69 73 20 75 6e 64 65 72 77 61 79 2e 0d 0a 2a is underway...*
4fb60 2a 20 0d 0a 2a 2a 20 5e 28 54 6f 20 70 65 72 66 * ..** ^(To perf
4fb70 6f 72 6d 20 61 20 62 61 63 6b 75 70 20 6f 70 65 orm a backup ope
4fb80 72 61 74 69 6f 6e 3a 20 0d 0a 2a 2a 20 20 20 3c ration: ..** <
4fb90 6f 6c 3e 0d 0a 2a 2a 20 20 20 20 20 3c 6c 69 3e ol>..** <li>
4fba0 3c 62 3e 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 <b>sqlite3_backu
4fbb0 70 5f 69 6e 69 74 28 29 3c 2f 62 3e 20 69 73 20 p_init()</b> is
4fbc0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 74 6f 20 69 called once to i
4fbd0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 0d 0a 2a nitialize the..*
4fbe0 2a 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 * backup
4fbf0 2c 20 0d 0a 2a 2a 20 20 20 20 20 3c 6c 69 3e 3c , ..** <li><
4fc00 62 3e 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 b>sqlite3_backup
4fc10 5f 73 74 65 70 28 29 3c 2f 62 3e 20 69 73 20 63 _step()</b> is c
4fc20 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 alled one or mor
4fc30 65 20 74 69 6d 65 73 20 74 6f 20 74 72 61 6e 73 e times to trans
4fc40 66 65 72 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 fer ..**
4fc50 20 74 68 65 20 64 61 74 61 20 62 65 74 77 65 65 the data betwee
4fc60 6e 20 74 68 65 20 74 77 6f 20 64 61 74 61 62 61 n the two databa
4fc70 73 65 73 2c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 ses, and finally
4fc80 0d 0a 2a 2a 20 20 20 20 20 3c 6c 69 3e 3c 62 3e ..** <li><b>
4fc90 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 sqlite3_backup_f
4fca0 69 6e 69 73 68 28 29 3c 2f 62 3e 20 69 73 20 63 inish()</b> is c
4fcb0 61 6c 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 alled to release
4fcc0 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 0d all resources .
4fcd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 73 73 6f .** asso
4fce0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
4fcf0 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e backup operation
4fd00 2e 20 0d 0a 2a 2a 20 20 20 3c 2f 6f 6c 3e 29 5e . ..** </ol>)^
4fd10 0d 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c ..** There shoul
4fd20 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 d be exactly one
4fd30 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
4fd40 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 29 _backup_finish()
4fd50 20 66 6f 72 20 65 61 63 68 0d 0a 2a 2a 20 73 75 for each..** su
4fd60 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f ccessful call to
4fd70 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
4fd80 69 6e 69 74 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 init()...**..**
4fd90 5b 5b 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 [[sqlite3_backup
4fda0 5f 69 6e 69 74 28 29 5d 5d 20 3c 62 3e 73 71 6c _init()]] <b>sql
4fdb0 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 ite3_backup_init
4fdc0 28 29 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e ()</b>..**..** ^
4fdd0 54 68 65 20 44 20 61 6e 64 20 4e 20 61 72 67 75 The D and N argu
4fde0 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33 ments to sqlite3
4fdf0 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 44 2c 4e _backup_init(D,N
4fe00 2c 53 2c 4d 29 20 61 72 65 20 74 68 65 20 0d 0a ,S,M) are the ..
4fe10 2a 2a 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e ** [database con
4fe20 6e 65 63 74 69 6f 6e 5d 20 61 73 73 6f 63 69 61 nection] associa
4fe30 74 65 64 20 77 69 74 68 20 74 68 65 20 64 65 73 ted with the des
4fe40 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 tination databas
4fe50 65 20 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 e ..** and the d
4fe60 61 74 61 62 61 73 65 20 6e 61 6d 65 2c 20 72 65 atabase name, re
4fe70 73 70 65 63 74 69 76 65 6c 79 2e 0d 0a 2a 2a 20 spectively...**
4fe80 5e 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 ^The database na
4fe90 6d 65 20 69 73 20 22 6d 61 69 6e 22 20 66 6f 72 me is "main" for
4fea0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 the main databa
4feb0 73 65 2c 20 22 74 65 6d 70 22 20 66 6f 72 20 74 se, "temp" for t
4fec0 68 65 0d 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 he..** temporary
4fed0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 74 68 database, or th
4fee0 65 20 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 e name specified
4fef0 20 61 66 74 65 72 20 74 68 65 20 41 53 20 6b 65 after the AS ke
4ff00 79 77 6f 72 64 20 69 6e 0d 0a 2a 2a 20 61 6e 20 yword in..** an
4ff10 5b 41 54 54 41 43 48 5d 20 73 74 61 74 65 6d 65 [ATTACH] stateme
4ff20 6e 74 20 66 6f 72 20 61 6e 20 61 74 74 61 63 68 nt for an attach
4ff30 65 64 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2a ed database...**
4ff40 20 5e 54 68 65 20 53 20 61 6e 64 20 4d 20 61 72 ^The S and M ar
4ff50 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 guments passed t
4ff60 6f 20 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 o ..** sqlite3_b
4ff70 61 63 6b 75 70 5f 69 6e 69 74 28 44 2c 4e 2c 53 ackup_init(D,N,S
4ff80 2c 4d 29 20 69 64 65 6e 74 69 66 79 20 74 68 65 ,M) identify the
4ff90 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 [database conne
4ffa0 63 74 69 6f 6e 5d 0d 0a 2a 2a 20 61 6e 64 20 64 ction]..** and d
4ffb0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20 atabase name of
4ffc0 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 the source datab
4ffd0 61 73 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c ase, respectivel
4ffe0 79 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 6f 75 72 y...** ^The sour
4fff0 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 ce and destinati
50000 6f 6e 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e on [database con
50010 6e 65 63 74 69 6f 6e 73 5d 20 28 70 61 72 61 6d nections] (param
50020 65 74 65 72 73 20 53 20 61 6e 64 20 44 29 0d 0a eters S and D)..
50030 2a 2a 20 6d 75 73 74 20 62 65 20 64 69 66 66 65 ** must be diffe
50040 72 65 6e 74 20 6f 72 20 65 6c 73 65 20 73 71 6c rent or else sql
50050 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 ite3_backup_init
50060 28 44 2c 4e 2c 53 2c 4d 29 20 77 69 6c 6c 20 66 (D,N,S,M) will f
50070 61 69 6c 20 77 69 74 68 0d 0a 2a 2a 20 61 6e 20 ail with..** an
50080 65 72 72 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e error...**..** ^
50090 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 If an error occu
500a0 72 73 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 rs within sqlite
500b0 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 44 2c 3_backup_init(D,
500c0 4e 2c 53 2c 4d 29 2c 20 74 68 65 6e 20 4e 55 4c N,S,M), then NUL
500d0 4c 20 69 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 L is..** returne
500e0 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 d and an error c
500f0 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 ode and error me
50100 73 73 61 67 65 20 61 72 65 20 73 74 6f 72 65 64 ssage are stored
50110 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 64 65 73 74 in the..** dest
50120 69 6e 61 74 69 6f 6e 20 5b 64 61 74 61 62 61 73 ination [databas
50130 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 44 2e e connection] D.
50140 0d 0a 2a 2a 20 5e 54 68 65 20 65 72 72 6f 72 20 ..** ^The error
50150 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 code and message
50160 20 66 6f 72 20 74 68 65 20 66 61 69 6c 65 64 20 for the failed
50170 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f call to sqlite3_
50180 62 61 63 6b 75 70 5f 69 6e 69 74 28 29 0d 0a 2a backup_init()..*
50190 2a 20 63 61 6e 20 62 65 20 72 65 74 72 69 65 76 * can be retriev
501a0 65 64 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 ed using the [sq
501b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 5d lite3_errcode()]
501c0 2c 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 , [sqlite3_errms
501d0 67 28 29 5d 2c 20 61 6e 64 2f 6f 72 0d 0a 2a 2a g()], and/or..**
501e0 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 [sqlite3_errmsg
501f0 31 36 28 29 5d 20 66 75 6e 63 74 69 6f 6e 73 2e 16()] functions.
50200 0d 0a 2a 2a 20 5e 41 20 73 75 63 63 65 73 73 66 ..** ^A successf
50210 75 6c 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 ul call to sqlit
50220 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 29 e3_backup_init()
50230 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 returns a point
50240 65 72 20 74 6f 20 61 6e 0d 0a 2a 2a 20 5b 73 71 er to an..** [sq
50250 6c 69 74 65 33 5f 62 61 63 6b 75 70 5d 20 6f 62 lite3_backup] ob
50260 6a 65 63 74 2e 0d 0a 2a 2a 20 5e 54 68 65 20 5b ject...** ^The [
50270 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5d 20 sqlite3_backup]
50280 6f 62 6a 65 63 74 20 6d 61 79 20 62 65 20 75 73 object may be us
50290 65 64 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 ed with the sqli
502a0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 te3_backup_step(
502b0 29 20 61 6e 64 0d 0a 2a 2a 20 73 71 6c 69 74 65 ) and..** sqlite
502c0 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 3_backup_finish(
502d0 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 ) functions to p
502e0 65 72 66 6f 72 6d 20 74 68 65 20 73 70 65 63 69 erform the speci
502f0 66 69 65 64 20 62 61 63 6b 75 70 20 0d 0a 2a 2a fied backup ..**
50300 20 6f 70 65 72 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d operation...**.
50310 0a 2a 2a 20 5b 5b 73 71 6c 69 74 65 33 5f 62 61 .** [[sqlite3_ba
50320 63 6b 75 70 5f 73 74 65 70 28 29 5d 5d 20 3c 62 ckup_step()]] <b
50330 3e 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f >sqlite3_backup_
50340 73 74 65 70 28 29 3c 2f 62 3e 0d 0a 2a 2a 0d 0a step()</b>..**..
50350 2a 2a 20 5e 46 75 6e 63 74 69 6f 6e 20 73 71 6c ** ^Function sql
50360 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 ite3_backup_step
50370 28 42 2c 4e 29 20 77 69 6c 6c 20 63 6f 70 79 20 (B,N) will copy
50380 75 70 20 74 6f 20 4e 20 70 61 67 65 73 20 62 65 up to N pages be
50390 74 77 65 65 6e 20 0d 0a 2a 2a 20 74 68 65 20 73 tween ..** the s
503a0 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e ource and destin
503b0 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 73 20 ation databases
503c0 73 70 65 63 69 66 69 65 64 20 62 79 20 5b 73 71 specified by [sq
503d0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5d 20 6f 62 lite3_backup] ob
503e0 6a 65 63 74 20 42 2e 0d 0a 2a 2a 20 5e 49 66 20 ject B...** ^If
503f0 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 61 N is negative, a
50400 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 73 6f 75 ll remaining sou
50410 72 63 65 20 70 61 67 65 73 20 61 72 65 20 63 6f rce pages are co
50420 70 69 65 64 2e 20 0d 0a 2a 2a 20 5e 49 66 20 73 pied. ..** ^If s
50430 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 qlite3_backup_st
50440 65 70 28 42 2c 4e 29 20 73 75 63 63 65 73 73 66 ep(B,N) successf
50450 75 6c 6c 79 20 63 6f 70 69 65 73 20 4e 20 70 61 ully copies N pa
50460 67 65 73 20 61 6e 64 20 74 68 65 72 65 0d 0a 2a ges and there..*
50470 2a 20 61 72 65 20 73 74 69 6c 6c 20 6d 6f 72 65 * are still more
50480 20 70 61 67 65 73 20 74 6f 20 62 65 20 63 6f 70 pages to be cop
50490 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20 66 75 ied, then the fu
504a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b nction returns [
504b0 53 51 4c 49 54 45 5f 4f 4b 5d 2e 0d 0a 2a 2a 20 SQLITE_OK]...**
504c0 5e 49 66 20 73 71 6c 69 74 65 33 5f 62 61 63 6b ^If sqlite3_back
504d0 75 70 5f 73 74 65 70 28 42 2c 4e 29 20 73 75 63 up_step(B,N) suc
504e0 63 65 73 73 66 75 6c 6c 79 20 66 69 6e 69 73 68 cessfully finish
504f0 65 73 20 63 6f 70 79 69 6e 67 20 61 6c 6c 20 70 es copying all p
50500 61 67 65 73 0d 0a 2a 2a 20 66 72 6f 6d 20 73 6f ages..** from so
50510 75 72 63 65 20 74 6f 20 64 65 73 74 69 6e 61 74 urce to destinat
50520 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 72 65 74 ion, then it ret
50530 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 44 4f 4e urns [SQLITE_DON
50540 45 5d 2e 0d 0a 2a 2a 20 5e 49 66 20 61 6e 20 65 E]...** ^If an e
50550 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c rror occurs whil
50560 65 20 72 75 6e 6e 69 6e 67 20 73 71 6c 69 74 65 e running sqlite
50570 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 42 2c 3_backup_step(B,
50580 4e 29 2c 0d 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 N),..** then an
50590 5b 65 72 72 6f 72 20 63 6f 64 65 5d 20 69 73 20 [error code] is
505a0 72 65 74 75 72 6e 65 64 2e 20 5e 41 73 20 77 65 returned. ^As we
505b0 6c 6c 20 61 73 20 5b 53 51 4c 49 54 45 5f 4f 4b ll as [SQLITE_OK
505c0 5d 20 61 6e 64 0d 0a 2a 2a 20 5b 53 51 4c 49 54 ] and..** [SQLIT
505d0 45 5f 44 4f 4e 45 5d 2c 20 61 20 63 61 6c 6c 20 E_DONE], a call
505e0 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 to sqlite3_backu
505f0 70 5f 73 74 65 70 28 29 20 6d 61 79 20 72 65 74 p_step() may ret
50600 75 72 6e 20 5b 53 51 4c 49 54 45 5f 52 45 41 44 urn [SQLITE_READ
50610 4f 4e 4c 59 5d 2c 0d 0a 2a 2a 20 5b 53 51 4c 49 ONLY],..** [SQLI
50620 54 45 5f 4e 4f 4d 45 4d 5d 2c 20 5b 53 51 4c 49 TE_NOMEM], [SQLI
50630 54 45 5f 42 55 53 59 5d 2c 20 5b 53 51 4c 49 54 TE_BUSY], [SQLIT
50640 45 5f 4c 4f 43 4b 45 44 5d 2c 20 6f 72 20 61 6e E_LOCKED], or an
50650 0d 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 49 4f 45 ..** [SQLITE_IOE
50660 52 52 5f 41 43 43 45 53 53 20 7c 20 53 51 4c 49 RR_ACCESS | SQLI
50670 54 45 5f 49 4f 45 52 52 5f 58 58 58 5d 20 65 78 TE_IOERR_XXX] ex
50680 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 tended error cod
50690 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 e...**..** ^(The
506a0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
506b0 73 74 65 70 28 29 20 6d 69 67 68 74 20 72 65 74 step() might ret
506c0 75 72 6e 20 5b 53 51 4c 49 54 45 5f 52 45 41 44 urn [SQLITE_READ
506d0 4f 4e 4c 59 5d 20 69 66 0d 0a 2a 2a 20 3c 6f 6c ONLY] if..** <ol
506e0 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 74 68 65 20 64 >..** <li> the d
506f0 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 estination datab
50700 61 73 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 ase was opened r
50710 65 61 64 2d 6f 6e 6c 79 2c 20 6f 72 0d 0a 2a 2a ead-only, or..**
50720 20 3c 6c 69 3e 20 74 68 65 20 64 65 73 74 69 6e <li> the destin
50730 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20 69 ation database i
50740 73 20 75 73 69 6e 67 20 77 72 69 74 65 2d 61 68 s using write-ah
50750 65 61 64 2d 6c 6f 67 20 6a 6f 75 72 6e 61 6c 69 ead-log journali
50760 6e 67 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 ng..** and the d
50770 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 73 estination and s
50780 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a 65 73 ource page sizes
50790 20 64 69 66 66 65 72 2c 20 6f 72 0d 0a 2a 2a 20 differ, or..**
507a0 3c 6c 69 3e 20 74 68 65 20 64 65 73 74 69 6e 61 <li> the destina
507b0 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20 69 73 tion database is
507c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 an in-memory da
507d0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 0d 0a tabase and the..
507e0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 ** destination a
507f0 6e 64 20 73 6f 75 72 63 65 20 70 61 67 65 20 73 nd source page s
50800 69 7a 65 73 20 64 69 66 66 65 72 2e 0d 0a 2a 2a izes differ...**
50810 20 3c 2f 6f 6c 3e 29 5e 0d 0a 2a 2a 0d 0a 2a 2a </ol>)^..**..**
50820 20 5e 49 66 20 73 71 6c 69 74 65 33 5f 62 61 63 ^If sqlite3_bac
50830 6b 75 70 5f 73 74 65 70 28 29 20 63 61 6e 6e 6f kup_step() canno
50840 74 20 6f 62 74 61 69 6e 20 61 20 72 65 71 75 69 t obtain a requi
50850 72 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 red file-system
50860 6c 6f 63 6b 2c 20 74 68 65 6e 0d 0a 2a 2a 20 74 lock, then..** t
50870 68 65 20 5b 73 71 6c 69 74 65 33 5f 62 75 73 79 he [sqlite3_busy
50880 5f 68 61 6e 64 6c 65 72 20 7c 20 62 75 73 79 2d _handler | busy-
50890 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e handler function
508a0 5d 0d 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 ]..** is invoked
508b0 20 28 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63 (if one is spec
508c0 69 66 69 65 64 29 2e 20 5e 49 66 20 74 68 65 20 ified). ^If the
508d0 0d 0a 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 ..** busy-handle
508e0 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 r returns non-ze
508f0 72 6f 20 62 65 66 6f 72 65 20 74 68 65 20 6c 6f ro before the lo
50900 63 6b 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c ck is available,
50910 20 74 68 65 6e 20 0d 0a 2a 2a 20 5b 53 51 4c 49 then ..** [SQLI
50920 54 45 5f 42 55 53 59 5d 20 69 73 20 72 65 74 75 TE_BUSY] is retu
50930 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c rned to the call
50940 65 72 2e 20 5e 49 6e 20 74 68 69 73 20 63 61 73 er. ^In this cas
50950 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 0d 0a 2a e the call to..*
50960 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 * sqlite3_backup
50970 5f 73 74 65 70 28 29 20 63 61 6e 20 62 65 20 72 _step() can be r
50980 65 74 72 69 65 64 20 6c 61 74 65 72 2e 20 5e 49 etried later. ^I
50990 66 20 74 68 65 20 73 6f 75 72 63 65 0d 0a 2a 2a f the source..**
509a0 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 [database conne
509b0 63 74 69 6f 6e 5d 0d 0a 2a 2a 20 69 73 20 62 65 ction]..** is be
509c0 69 6e 67 20 75 73 65 64 20 74 6f 20 77 72 69 74 ing used to writ
509d0 65 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 e to the source
509e0 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 73 71 database when sq
509f0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 lite3_backup_ste
50a00 70 28 29 0d 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 p()..** is calle
50a10 64 2c 20 74 68 65 6e 20 5b 53 51 4c 49 54 45 5f d, then [SQLITE_
50a20 4c 4f 43 4b 45 44 5d 20 69 73 20 72 65 74 75 72 LOCKED] is retur
50a30 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e ned immediately.
50a40 20 5e 41 67 61 69 6e 2c 20 69 6e 20 74 68 69 73 ^Again, in this
50a50 0d 0a 2a 2a 20 63 61 73 65 20 74 68 65 20 63 61 ..** case the ca
50a60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 ll to sqlite3_ba
50a70 63 6b 75 70 5f 73 74 65 70 28 29 20 63 61 6e 20 ckup_step() can
50a80 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 be retried later
50a90 20 6f 6e 2e 20 5e 28 49 66 0d 0a 2a 2a 20 5b 53 on. ^(If..** [S
50aa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 QLITE_IOERR_ACCE
50ab0 53 53 20 7c 20 53 51 4c 49 54 45 5f 49 4f 45 52 SS | SQLITE_IOER
50ac0 52 5f 58 58 58 5d 2c 20 5b 53 51 4c 49 54 45 5f R_XXX], [SQLITE_
50ad0 4e 4f 4d 45 4d 5d 2c 20 6f 72 0d 0a 2a 2a 20 5b NOMEM], or..** [
50ae0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5d SQLITE_READONLY]
50af0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 is returned, th
50b00 65 6e 20 0d 0a 2a 2a 20 74 68 65 72 65 20 69 73 en ..** there is
50b10 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 72 65 74 no point in ret
50b20 72 79 69 6e 67 20 74 68 65 20 63 61 6c 6c 20 74 rying the call t
50b30 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 o sqlite3_backup
50b40 5f 73 74 65 70 28 29 2e 20 54 68 65 73 65 20 0d _step(). These .
50b50 0a 2a 2a 20 65 72 72 6f 72 73 20 61 72 65 20 63 .** errors are c
50b60 6f 6e 73 69 64 65 72 65 64 20 66 61 74 61 6c 2e onsidered fatal.
50b70 29 5e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74 )^ The applicat
50b80 69 6f 6e 20 6d 75 73 74 20 61 63 63 65 70 74 20 ion must accept
50b90 0d 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 62 61 ..** that the ba
50ba0 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 20 68 ckup operation h
50bb0 61 73 20 66 61 69 6c 65 64 20 61 6e 64 20 70 61 as failed and pa
50bc0 73 73 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 ss the backup op
50bd0 65 72 61 74 69 6f 6e 20 68 61 6e 64 6c 65 20 0d eration handle .
50be0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69 74 .** to the sqlit
50bf0 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
50c00 28 29 20 74 6f 20 72 65 6c 65 61 73 65 20 61 73 () to release as
50c10 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63 sociated resourc
50c20 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 es...**..** ^The
50c30 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 first call to s
50c40 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 qlite3_backup_st
50c50 65 70 28 29 20 6f 62 74 61 69 6e 73 20 61 6e 20 ep() obtains an
50c60 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0d 0a exclusive lock..
50c70 2a 2a 20 6f 6e 20 74 68 65 20 64 65 73 74 69 6e ** on the destin
50c80 61 74 69 6f 6e 20 66 69 6c 65 2e 20 5e 54 68 65 ation file. ^The
50c90 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 exclusive lock
50ca0 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 20 is not released
50cb0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 0d 0a 2a until either ..*
50cc0 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 * sqlite3_backup
50cd0 5f 66 69 6e 69 73 68 28 29 20 69 73 20 63 61 6c _finish() is cal
50ce0 6c 65 64 20 6f 72 20 74 68 65 20 62 61 63 6b 75 led or the backu
50cf0 70 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 63 p operation is c
50d00 6f 6d 70 6c 65 74 65 20 0d 0a 2a 2a 20 61 6e 64 omplete ..** and
50d10 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
50d20 73 74 65 70 28 29 20 72 65 74 75 72 6e 73 20 5b step() returns [
50d30 53 51 4c 49 54 45 5f 44 4f 4e 45 5d 2e 20 20 5e SQLITE_DONE]. ^
50d40 45 76 65 72 79 20 63 61 6c 6c 20 74 6f 0d 0a 2a Every call to..*
50d50 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 * sqlite3_backup
50d60 5f 73 74 65 70 28 29 20 6f 62 74 61 69 6e 73 20 _step() obtains
50d70 61 20 5b 73 68 61 72 65 64 20 6c 6f 63 6b 5d 20 a [shared lock]
50d80 6f 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 on the source da
50d90 74 61 62 61 73 65 20 74 68 61 74 0d 0a 2a 2a 20 tabase that..**
50da0 6c 61 73 74 73 20 66 6f 72 20 74 68 65 20 64 75 lasts for the du
50db0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 ration of the sq
50dc0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 lite3_backup_ste
50dd0 70 28 29 20 63 61 6c 6c 2e 0d 0a 2a 2a 20 5e 42 p() call...** ^B
50de0 65 63 61 75 73 65 20 74 68 65 20 73 6f 75 72 63 ecause the sourc
50df0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f e database is no
50e00 74 20 6c 6f 63 6b 65 64 20 62 65 74 77 65 65 6e t locked between
50e10 20 63 61 6c 6c 73 20 74 6f 0d 0a 2a 2a 20 73 71 calls to..** sq
50e20 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 lite3_backup_ste
50e30 70 28 29 2c 20 74 68 65 20 73 6f 75 72 63 65 20 p(), the source
50e40 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 database may be
50e50 6d 6f 64 69 66 69 65 64 20 6d 69 64 2d 77 61 79 modified mid-way
50e60 0d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 ..** through the
50e70 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 2e backup process.
50e80 20 20 5e 49 66 20 74 68 65 20 73 6f 75 72 63 65 ^If the source
50e90 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 database is mod
50ea0 69 66 69 65 64 20 62 79 20 61 6e 0d 0a 2a 2a 20 ified by an..**
50eb0 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 external process
50ec0 20 6f 72 20 76 69 61 20 61 20 64 61 74 61 62 61 or via a databa
50ed0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 74 se connection ot
50ee0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 her than the one
50ef0 20 62 65 69 6e 67 0d 0a 2a 2a 20 75 73 65 64 20 being..** used
50f00 62 79 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 by the backup op
50f10 65 72 61 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 eration, then th
50f20 65 20 62 61 63 6b 75 70 20 77 69 6c 6c 20 62 65 e backup will be
50f30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0d 0a automatically..
50f40 2a 2a 20 72 65 73 74 61 72 74 65 64 20 62 79 20 ** restarted by
50f50 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f the next call to
50f60 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
50f70 73 74 65 70 28 29 2e 20 5e 49 66 20 74 68 65 20 step(). ^If the
50f80 73 6f 75 72 63 65 20 0d 0a 2a 2a 20 64 61 74 61 source ..** data
50f90 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 base is modified
50fa0 20 62 79 20 74 68 65 20 75 73 69 6e 67 20 74 68 by the using th
50fb0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 e same database
50fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 69 73 connection as is
50fd0 20 75 73 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 used..** by the
50fe0 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f backup operatio
50ff0 6e 2c 20 74 68 65 6e 20 74 68 65 20 62 61 63 6b n, then the back
51000 75 70 20 64 61 74 61 62 61 73 65 20 69 73 20 61 up database is a
51010 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0d 0a 2a 2a utomatically..**
51020 20 75 70 64 61 74 65 64 20 61 74 20 74 68 65 20 updated at the
51030 73 61 6d 65 20 74 69 6d 65 2e 0d 0a 2a 2a 0d 0a same time...**..
51040 2a 2a 20 5b 5b 73 71 6c 69 74 65 33 5f 62 61 63 ** [[sqlite3_bac
51050 6b 75 70 5f 66 69 6e 69 73 68 28 29 5d 5d 20 3c kup_finish()]] <
51060 62 3e 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 b>sqlite3_backup
51070 5f 66 69 6e 69 73 68 28 29 3c 2f 62 3e 0d 0a 2a _finish()</b>..*
51080 2a 0d 0a 2a 2a 20 57 68 65 6e 20 73 71 6c 69 74 *..** When sqlit
51090 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 e3_backup_step()
510a0 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 5b 53 has returned [S
510b0 51 4c 49 54 45 5f 44 4f 4e 45 5d 2c 20 6f 72 20 QLITE_DONE], or
510c0 77 68 65 6e 20 74 68 65 20 0d 0a 2a 2a 20 61 70 when the ..** ap
510d0 70 6c 69 63 61 74 69 6f 6e 20 77 69 73 68 65 73 plication wishes
510e0 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 to abandon the
510f0 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e backup operation
51100 2c 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f , the applicatio
51110 6e 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 64 65 73 n..** should des
51120 74 72 6f 79 20 74 68 65 20 5b 73 71 6c 69 74 65 troy the [sqlite
51130 33 5f 62 61 63 6b 75 70 5d 20 62 79 20 70 61 73 3_backup] by pas
51140 73 69 6e 67 20 69 74 20 74 6f 20 73 71 6c 69 74 sing it to sqlit
51150 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
51160 28 29 2e 0d 0a 2a 2a 20 5e 54 68 65 20 73 71 6c ()...** ^The sql
51170 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 ite3_backup_fini
51180 73 68 28 29 20 69 6e 74 65 72 66 61 63 65 73 20 sh() interfaces
51190 72 65 6c 65 61 73 65 73 20 61 6c 6c 0d 0a 2a 2a releases all..**
511a0 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 resources assoc
511b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 5b iated with the [
511c0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5d 20 sqlite3_backup]
511d0 6f 62 6a 65 63 74 2e 20 0d 0a 2a 2a 20 5e 49 66 object. ..** ^If
511e0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
511f0 73 74 65 70 28 29 20 68 61 73 20 6e 6f 74 20 79 step() has not y
51200 65 74 20 72 65 74 75 72 6e 65 64 20 5b 53 51 4c et returned [SQL
51210 49 54 45 5f 44 4f 4e 45 5d 2c 20 74 68 65 6e 20 ITE_DONE], then
51220 61 6e 79 0d 0a 2a 2a 20 61 63 74 69 76 65 20 77 any..** active w
51230 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e rite-transaction
51240 20 6f 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 on the destinat
51250 69 6f 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 ion database is
51260 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 2a 2a rolled back...**
51270 20 54 68 65 20 5b 73 71 6c 69 74 65 33 5f 62 61 The [sqlite3_ba
51280 63 6b 75 70 5d 20 6f 62 6a 65 63 74 20 69 73 20 ckup] object is
51290 69 6e 76 61 6c 69 64 0d 0a 2a 2a 20 61 6e 64 20 invalid..** and
512a0 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 may not be used
512b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 61 6c 6c following a call
512c0 20 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b to sqlite3_back
512d0 75 70 5f 66 69 6e 69 73 68 28 29 2e 0d 0a 2a 2a up_finish()...**
512e0 0d 0a 2a 2a 20 5e 54 68 65 20 76 61 6c 75 65 20 ..** ^The value
512f0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 returned by sqli
51300 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 te3_backup_finis
51310 68 20 69 73 20 5b 53 51 4c 49 54 45 5f 4f 4b 5d h is [SQLITE_OK]
51320 20 69 66 20 6e 6f 0d 0a 2a 2a 20 73 71 6c 69 74 if no..** sqlit
51330 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 e3_backup_step()
51340 20 65 72 72 6f 72 73 20 6f 63 63 75 72 72 65 64 errors occurred
51350 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 72 20 , regardless or
51360 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0d 0a whether or not..
51370 2a 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 ** sqlite3_backu
51380 70 5f 73 74 65 70 28 29 20 63 6f 6d 70 6c 65 74 p_step() complet
51390 65 64 2e 0d 0a 2a 2a 20 5e 49 66 20 61 6e 20 6f ed...** ^If an o
513a0 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e ut-of-memory con
513b0 64 69 74 69 6f 6e 20 6f 72 20 49 4f 20 65 72 72 dition or IO err
513c0 6f 72 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 or occurred duri
513d0 6e 67 20 61 6e 79 20 70 72 69 6f 72 0d 0a 2a 2a ng any prior..**
513e0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f sqlite3_backup_
513f0 73 74 65 70 28 29 20 63 61 6c 6c 20 6f 6e 20 74 step() call on t
51400 68 65 20 73 61 6d 65 20 5b 73 71 6c 69 74 65 33 he same [sqlite3
51410 5f 62 61 63 6b 75 70 5d 20 6f 62 6a 65 63 74 2c _backup] object,
51420 20 74 68 65 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 then..** sqlite
51430 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 3_backup_finish(
51440 29 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f ) returns the co
51450 72 72 65 73 70 6f 6e 64 69 6e 67 20 5b 65 72 72 rresponding [err
51460 6f 72 20 63 6f 64 65 5d 2e 0d 0a 2a 2a 0d 0a 2a or code]...**..*
51470 2a 20 5e 41 20 72 65 74 75 72 6e 20 6f 66 20 5b * ^A return of [
51480 53 51 4c 49 54 45 5f 42 55 53 59 5d 20 6f 72 20 SQLITE_BUSY] or
51490 5b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5d 20 [SQLITE_LOCKED]
514a0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 62 61 63 from sqlite3_bac
514b0 6b 75 70 5f 73 74 65 70 28 29 0d 0a 2a 2a 20 69 kup_step()..** i
514c0 73 20 6e 6f 74 20 61 20 70 65 72 6d 61 6e 65 6e s not a permanen
514d0 74 20 65 72 72 6f 72 20 61 6e 64 20 64 6f 65 73 t error and does
514e0 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 not affect the
514f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 0d return value of.
51500 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b .** sqlite3_back
51510 75 70 5f 66 69 6e 69 73 68 28 29 2e 0d 0a 2a 2a up_finish()...**
51520 0d 0a 2a 2a 20 5b 5b 73 71 6c 69 74 65 33 5f 62 ..** [[sqlite3_b
51530 61 63 6b 75 70 5f 5f 72 65 6d 61 69 6e 69 6e 67 ackup__remaining
51540 28 29 5d 5d 20 5b 5b 73 71 6c 69 74 65 33 5f 62 ()]] [[sqlite3_b
51550 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28 ackup_pagecount(
51560 29 5d 5d 0d 0a 2a 2a 20 3c 62 3e 73 71 6c 69 74 )]]..** <b>sqlit
51570 65 33 5f 62 61 63 6b 75 70 5f 72 65 6d 61 69 6e e3_backup_remain
51580 69 6e 67 28 29 20 61 6e 64 20 73 71 6c 69 74 65 ing() and sqlite
51590 33 5f 62 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 3_backup_pagecou
515a0 6e 74 28 29 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a nt()</b>..**..**
515b0 20 5e 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 ^Each call to s
515c0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 qlite3_backup_st
515d0 65 70 28 29 20 73 65 74 73 20 74 77 6f 20 76 61 ep() sets two va
515e0 6c 75 65 73 20 69 6e 73 69 64 65 0d 0a 2a 2a 20 lues inside..**
515f0 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 62 61 63 the [sqlite3_bac
51600 6b 75 70 5d 20 6f 62 6a 65 63 74 3a 20 74 68 65 kup] object: the
51610 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 number of pages
51620 20 73 74 69 6c 6c 20 74 6f 20 62 65 20 62 61 63 still to be bac
51630 6b 65 64 0d 0a 2a 2a 20 75 70 20 61 6e 64 20 74 ked..** up and t
51640 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 he total number
51650 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 of pages in the
51660 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 source database
51670 66 69 6c 65 2e 0d 0a 2a 2a 20 54 68 65 20 73 71 file...** The sq
51680 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 72 65 6d lite3_backup_rem
51690 61 69 6e 69 6e 67 28 29 20 61 6e 64 20 73 71 6c aining() and sql
516a0 69 74 65 33 5f 62 61 63 6b 75 70 5f 70 61 67 65 ite3_backup_page
516b0 63 6f 75 6e 74 28 29 20 69 6e 74 65 72 66 61 63 count() interfac
516c0 65 73 0d 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 es..** retrieve
516d0 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 these two values
516e0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0d , respectively..
516f0 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 76 61 6c .**..** ^The val
51700 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 ues returned by
51710 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 these functions
51720 61 72 65 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 are only updated
51730 20 62 79 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f by..** sqlite3_
51740 62 61 63 6b 75 70 5f 73 74 65 70 28 29 2e 20 5e backup_step(). ^
51750 49 66 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 If the source da
51760 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 tabase is modifi
51770 65 64 20 64 75 72 69 6e 67 20 61 20 62 61 63 6b ed during a back
51780 75 70 0d 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e up..** operation
51790 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 , then the value
517a0 73 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 s are not update
517b0 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 d to account for
517c0 20 61 6e 79 20 65 78 74 72 61 0d 0a 2a 2a 20 70 any extra..** p
517d0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 ages that need t
517e0 6f 20 62 65 20 75 70 64 61 74 65 64 20 6f 72 20 o be updated or
517f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 the size of the
51800 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 source database
51810 66 69 6c 65 0d 0a 2a 2a 20 63 68 61 6e 67 69 6e file..** changin
51820 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 62 3e 43 6f g...**..** <b>Co
51830 6e 63 75 72 72 65 6e 74 20 55 73 61 67 65 20 6f ncurrent Usage o
51840 66 20 44 61 74 61 62 61 73 65 20 48 61 6e 64 6c f Database Handl
51850 65 73 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e es</b>..**..** ^
51860 54 68 65 20 73 6f 75 72 63 65 20 5b 64 61 74 61 The source [data
51870 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d base connection]
51880 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 20 may be used by
51890 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 the application
518a0 66 6f 72 20 6f 74 68 65 72 0d 0a 2a 2a 20 70 75 for other..** pu
518b0 72 70 6f 73 65 73 20 77 68 69 6c 65 20 61 20 62 rposes while a b
518c0 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 20 ackup operation
518d0 69 73 20 75 6e 64 65 72 77 61 79 20 6f 72 20 62 is underway or b
518e0 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 eing initialized
518f0 2e 0d 0a 2a 2a 20 5e 49 66 20 53 51 4c 69 74 65 ...** ^If SQLite
51900 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 is compiled and
51910 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 73 configured to s
51920 75 70 70 6f 72 74 20 74 68 72 65 61 64 73 61 66 upport threadsaf
51930 65 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 e database..** c
51940 6f 6e 6e 65 63 74 69 6f 6e 73 2c 20 74 68 65 6e onnections, then
51950 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 the source data
51960 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
51970 6d 61 79 20 62 65 20 75 73 65 64 20 63 6f 6e 63 may be used conc
51980 75 72 72 65 6e 74 6c 79 0d 0a 2a 2a 20 66 72 6f urrently..** fro
51990 6d 20 77 69 74 68 69 6e 20 6f 74 68 65 72 20 74 m within other t
519a0 68 72 65 61 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 hreads...**..**
519b0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 61 70 70 However, the app
519c0 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74 20 67 75 lication must gu
519d0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 arantee that the
519e0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 0d 0a 2a destination ..*
519f0 2a 20 5b 64 61 74 61 62 61 73 65 20 63 6f 6e 6e * [database conn
51a00 65 63 74 69 6f 6e 5d 20 69 73 20 6e 6f 74 20 70 ection] is not p
51a10 61 73 73 65 64 20 74 6f 20 61 6e 79 20 6f 74 68 assed to any oth
51a20 65 72 20 41 50 49 20 28 62 79 20 61 6e 79 20 74 er API (by any t
51a30 68 72 65 61 64 29 20 61 66 74 65 72 20 0d 0a 2a hread) after ..*
51a40 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 * sqlite3_backup
51a50 5f 69 6e 69 74 28 29 20 69 73 20 63 61 6c 6c 65 _init() is calle
51a60 64 20 61 6e 64 20 62 65 66 6f 72 65 20 74 68 65 d and before the
51a70 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 corresponding c
51a80 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 73 71 6c 69 74 all to..** sqlit
51a90 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
51aa0 28 29 2e 20 20 53 51 4c 69 74 65 20 64 6f 65 73 (). SQLite does
51ab0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 63 not currently c
51ac0 68 65 63 6b 20 74 6f 20 73 65 65 0d 0a 2a 2a 20 heck to see..**
51ad0 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 if the applicati
51ae0 6f 6e 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 on incorrectly a
51af0 63 63 65 73 73 65 73 20 74 68 65 20 64 65 73 74 ccesses the dest
51b00 69 6e 61 74 69 6f 6e 20 5b 64 61 74 61 62 61 73 ination [databas
51b10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 2a e connection]..*
51b20 2a 20 61 6e 64 20 73 6f 20 6e 6f 20 65 72 72 6f * and so no erro
51b30 72 20 63 6f 64 65 20 69 73 20 72 65 70 6f 72 74 r code is report
51b40 65 64 2c 20 62 75 74 20 74 68 65 20 6f 70 65 72 ed, but the oper
51b50 61 74 69 6f 6e 73 20 6d 61 79 20 6d 61 6c 66 75 ations may malfu
51b60 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 6e 65 76 65 72 nction..** never
51b70 74 68 65 6c 65 73 73 2e 20 20 55 73 65 20 6f 66 theless. Use of
51b80 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e the destination
51b90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
51ba0 74 69 6f 6e 20 77 68 69 6c 65 20 61 0d 0a 2a 2a tion while a..**
51bb0 20 62 61 63 6b 75 70 20 69 73 20 69 6e 20 70 72 backup is in pr
51bc0 6f 67 72 65 73 73 20 6d 69 67 68 74 20 61 6c 73 ogress might als
51bd0 6f 20 61 6c 73 6f 20 63 61 75 73 65 20 61 20 6d o also cause a m
51be0 75 74 65 78 20 64 65 61 64 6c 6f 63 6b 2e 0d 0a utex deadlock...
51bf0 2a 2a 0d 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e **..** If runnin
51c00 67 20 69 6e 20 5b 73 68 61 72 65 64 20 63 61 63 g in [shared cac
51c10 68 65 20 6d 6f 64 65 5d 2c 20 74 68 65 20 61 70 he mode], the ap
51c20 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74 0d 0a plication must..
51c30 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 ** guarantee tha
51c40 74 20 74 68 65 20 73 68 61 72 65 64 20 63 61 63 t the shared cac
51c50 68 65 20 75 73 65 64 20 62 79 20 74 68 65 20 64 he used by the d
51c60 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 estination datab
51c70 61 73 65 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 ase..** is not a
51c80 63 63 65 73 73 65 64 20 77 68 69 6c 65 20 74 68 ccessed while th
51c90 65 20 62 61 63 6b 75 70 20 69 73 20 72 75 6e 6e e backup is runn
51ca0 69 6e 67 2e 20 49 6e 20 70 72 61 63 74 69 63 65 ing. In practice
51cb0 20 74 68 69 73 20 6d 65 61 6e 73 0d 0a 2a 2a 20 this means..**
51cc0 74 68 61 74 20 74 68 65 20 61 70 70 6c 69 63 61 that the applica
51cd0 74 69 6f 6e 20 6d 75 73 74 20 67 75 61 72 61 6e tion must guaran
51ce0 74 65 65 20 74 68 61 74 20 74 68 65 20 64 69 73 tee that the dis
51cf0 6b 20 66 69 6c 65 20 62 65 69 6e 67 20 0d 0a 2a k file being ..*
51d00 2a 20 62 61 63 6b 65 64 20 75 70 20 74 6f 20 69 * backed up to i
51d10 73 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20 62 s not accessed b
51d20 79 20 61 6e 79 20 63 6f 6e 6e 65 63 74 69 6f 6e y any connection
51d30 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 6f 63 within the proc
51d40 65 73 73 2c 0d 0a 2a 2a 20 6e 6f 74 20 6a 75 73 ess,..** not jus
51d50 74 20 74 68 65 20 73 70 65 63 69 66 69 63 20 63 t the specific c
51d60 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 77 onnection that w
51d70 61 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c as passed to sql
51d80 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 ite3_backup_init
51d90 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ()...**..** The
51da0 5b 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5d [sqlite3_backup]
51db0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 20 69 object itself i
51dc0 73 20 70 61 72 74 69 61 6c 6c 79 20 74 68 72 65 s partially thre
51dd0 61 64 73 61 66 65 2e 20 4d 75 6c 74 69 70 6c 65 adsafe. Multiple
51de0 20 0d 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 61 ..** threads ma
51df0 79 20 73 61 66 65 6c 79 20 6d 61 6b 65 20 6d 75 y safely make mu
51e00 6c 74 69 70 6c 65 20 63 6f 6e 63 75 72 72 65 6e ltiple concurren
51e10 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 t calls to sqlit
51e20 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 e3_backup_step()
51e30 2e 0d 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 ...** However, t
51e40 68 65 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 he sqlite3_backu
51e50 70 5f 72 65 6d 61 69 6e 69 6e 67 28 29 20 61 6e p_remaining() an
51e60 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 d sqlite3_backup
51e70 5f 70 61 67 65 63 6f 75 6e 74 28 29 0d 0a 2a 2a _pagecount()..**
51e80 20 41 50 49 73 20 61 72 65 20 6e 6f 74 20 73 74 APIs are not st
51e90 72 69 63 74 6c 79 20 73 70 65 61 6b 69 6e 67 20 rictly speaking
51ea0 74 68 72 65 61 64 73 61 66 65 2e 20 49 66 20 74 threadsafe. If t
51eb0 68 65 79 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 hey are invoked
51ec0 61 74 20 74 68 65 0d 0a 2a 2a 20 73 61 6d 65 20 at the..** same
51ed0 74 69 6d 65 20 61 73 20 61 6e 6f 74 68 65 72 20 time as another
51ee0 74 68 72 65 61 64 20 69 73 20 69 6e 76 6f 6b 69 thread is invoki
51ef0 6e 67 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 ng sqlite3_backu
51f00 70 5f 73 74 65 70 28 29 20 69 74 20 69 73 0d 0a p_step() it is..
51f10 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 ** possible that
51f20 20 74 68 65 79 20 72 65 74 75 72 6e 20 69 6e 76 they return inv
51f30 61 6c 69 64 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f alid values...*/
51f40 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 6c ..SQLITE_API sql
51f50 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 73 71 6c ite3_backup *sql
51f60 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 ite3_backup_init
51f70 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 44 (.. sqlite3 *pD
51f80 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 est,
51f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
51fa0 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 estination datab
51fb0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 ase handle */..
51fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 const char *zDe
51fd0 73 74 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 stName,
51fe0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 69 /* Desti
51ff0 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20 nation database
52000 6e 61 6d 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 name */.. sqlit
52010 65 33 20 2a 70 53 6f 75 72 63 65 2c 20 20 20 20 e3 *pSource,
52020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
52030 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61 74 61 /* Source data
52040 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a base handle */..
52050 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 const char *zS
52060 6f 75 72 63 65 4e 61 6d 65 20 20 20 20 20 20 20 ourceName
52070 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 /* Sour
52080 63 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 ce database name
52090 20 2a 2f 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f */..);..SQLITE_
520a0 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
520b0 62 61 63 6b 75 70 5f 73 74 65 70 28 73 71 6c 69 backup_step(sqli
520c0 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 2c 20 69 te3_backup *p, i
520d0 6e 74 20 6e 50 61 67 65 29 3b 0d 0a 53 51 4c 49 nt nPage);..SQLI
520e0 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
520f0 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
52100 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 (sqlite3_backup
52110 2a 70 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 *p);..SQLITE_API
52120 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 61 63 int sqlite3_bac
52130 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 73 71 kup_remaining(sq
52140 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 29 lite3_backup *p)
52150 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e ;..SQLITE_API in
52160 74 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 t sqlite3_backup
52170 5f 70 61 67 65 63 6f 75 6e 74 28 73 71 6c 69 74 _pagecount(sqlit
52180 65 33 5f 62 61 63 6b 75 70 20 2a 70 29 3b 0d 0a e3_backup *p);..
52190 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
521a0 46 3a 20 55 6e 6c 6f 63 6b 20 4e 6f 74 69 66 69 F: Unlock Notifi
521b0 63 61 74 69 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e cation..**..** ^
521c0 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 When running in
521d0 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 shared-cache mod
521e0 65 2c 20 61 20 64 61 74 61 62 61 73 65 20 6f 70 e, a database op
521f0 65 72 61 74 69 6f 6e 20 6d 61 79 20 66 61 69 6c eration may fail
52200 20 77 69 74 68 0d 0a 2a 2a 20 61 6e 20 5b 53 51 with..** an [SQ
52210 4c 49 54 45 5f 4c 4f 43 4b 45 44 5d 20 65 72 72 LITE_LOCKED] err
52220 6f 72 20 69 66 20 74 68 65 20 72 65 71 75 69 72 or if the requir
52230 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 ed locks on the
52240 73 68 61 72 65 64 2d 63 61 63 68 65 20 6f 72 0d shared-cache or.
52250 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 74 .** individual t
52260 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74 68 65 ables within the
52270 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 61 shared-cache ca
52280 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 nnot be obtained
52290 2e 20 53 65 65 0d 0a 2a 2a 20 5b 53 51 4c 69 74 . See..** [SQLit
522a0 65 20 53 68 61 72 65 64 2d 43 61 63 68 65 20 4d e Shared-Cache M
522b0 6f 64 65 5d 20 66 6f 72 20 61 20 64 65 73 63 72 ode] for a descr
522c0 69 70 74 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 iption of shared
522d0 2d 63 61 63 68 65 20 6c 6f 63 6b 69 6e 67 2e 20 -cache locking.
522e0 0d 0a 2a 2a 20 5e 54 68 69 73 20 41 50 49 20 6d ..** ^This API m
522f0 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 ay be used to re
52300 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 gister a callbac
52310 6b 20 74 68 61 74 20 53 51 4c 69 74 65 20 77 69 k that SQLite wi
52320 6c 6c 20 69 6e 76 6f 6b 65 20 0d 0a 2a 2a 20 77 ll invoke ..** w
52330 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 hen the connecti
52340 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c on currently hol
52350 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 ding the require
52360 64 20 6c 6f 63 6b 20 72 65 6c 69 6e 71 75 69 73 d lock relinquis
52370 68 65 73 20 69 74 2e 0d 0a 2a 2a 20 5e 54 68 69 hes it...** ^Thi
52380 73 20 41 50 49 20 69 73 20 6f 6e 6c 79 20 61 76 s API is only av
52390 61 69 6c 61 62 6c 65 20 69 66 20 74 68 65 20 6c ailable if the l
523a0 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 ibrary was compi
523b0 6c 65 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a led with the..**
523c0 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f [SQLITE_ENABLE_
523d0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 5d 20 43 UNLOCK_NOTIFY] C
523e0 2d 70 72 65 70 72 6f 63 65 73 73 6f 72 20 73 79 -preprocessor sy
523f0 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2e 0d 0a 2a mbol defined...*
52400 2a 0d 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 *..** See Also:
52410 5b 55 73 69 6e 67 20 74 68 65 20 53 51 4c 69 74 [Using the SQLit
52420 65 20 55 6e 6c 6f 63 6b 20 4e 6f 74 69 66 69 63 e Unlock Notific
52430 61 74 69 6f 6e 20 46 65 61 74 75 72 65 5d 2e 0d ation Feature]..
52440 0a 2a 2a 0d 0a 2a 2a 20 5e 53 68 61 72 65 64 2d .**..** ^Shared-
52450 63 61 63 68 65 20 6c 6f 63 6b 73 20 61 72 65 20 cache locks are
52460 72 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 20 released when a
52470 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
52480 69 6f 6e 20 63 6f 6e 63 6c 75 64 65 73 0d 0a 2a ion concludes..*
52490 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20 74 72 * its current tr
524a0 61 6e 73 61 63 74 69 6f 6e 2c 20 65 69 74 68 65 ansaction, eithe
524b0 72 20 62 79 20 63 6f 6d 6d 69 74 74 69 6e 67 20 r by committing
524c0 69 74 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 69 74 it or rolling it
524d0 20 62 61 63 6b 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 back. ..**..**
524e0 5e 57 68 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 ^When a connecti
524f0 6f 6e 20 28 6b 6e 6f 77 6e 20 61 73 20 74 68 65 on (known as the
52500 20 62 6c 6f 63 6b 65 64 20 63 6f 6e 6e 65 63 74 blocked connect
52510 69 6f 6e 29 20 66 61 69 6c 73 20 74 6f 20 6f 62 ion) fails to ob
52520 74 61 69 6e 20 61 0d 0a 2a 2a 20 73 68 61 72 65 tain a..** share
52530 64 2d 63 61 63 68 65 20 6c 6f 63 6b 20 61 6e 64 d-cache lock and
52540 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 SQLITE_LOCKED i
52550 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 s returned to th
52560 65 20 63 61 6c 6c 65 72 2c 20 74 68 65 0d 0a 2a e caller, the..*
52570 2a 20 69 64 65 6e 74 69 74 79 20 6f 66 20 74 68 * identity of th
52580 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 e database conne
52590 63 74 69 6f 6e 20 28 74 68 65 20 62 6c 6f 63 6b ction (the block
525a0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 ing connection)
525b0 74 68 61 74 0d 0a 2a 2a 20 68 61 73 20 6c 6f 63 that..** has loc
525c0 6b 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 ked the required
525d0 20 72 65 73 6f 75 72 63 65 20 69 73 20 73 74 6f resource is sto
525e0 72 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 red internally.
525f0 5e 41 66 74 65 72 20 61 6e 20 0d 0a 2a 2a 20 61 ^After an ..** a
52600 70 70 6c 69 63 61 74 69 6f 6e 20 72 65 63 65 69 pplication recei
52610 76 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 4c 4f ves an SQLITE_LO
52620 43 4b 45 44 20 65 72 72 6f 72 2c 20 69 74 20 6d CKED error, it m
52630 61 79 20 63 61 6c 6c 20 74 68 65 0d 0a 2a 2a 20 ay call the..**
52640 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e sqlite3_unlock_n
52650 6f 74 69 66 79 28 29 20 6d 65 74 68 6f 64 20 77 otify() method w
52660 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 65 64 20 ith the blocked
52670 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c connection handl
52680 65 20 61 73 20 0d 0a 2a 2a 20 74 68 65 20 66 69 e as ..** the fi
52690 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 rst argument to
526a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 61 20 63 register for a c
526b0 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 77 69 6c allback that wil
526c0 6c 20 62 65 20 69 6e 76 6f 6b 65 64 0d 0a 2a 2a l be invoked..**
526d0 20 77 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 69 when the blocki
526e0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 ng connections c
526f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 urrent transacti
52700 6f 6e 20 69 73 20 63 6f 6e 63 6c 75 64 65 64 2e on is concluded.
52710 20 5e 54 68 65 0d 0a 2a 2a 20 63 61 6c 6c 62 61 ^The..** callba
52720 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 72 ck is invoked fr
52730 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 5b 73 om within the [s
52740 71 6c 69 74 65 33 5f 73 74 65 70 5d 20 6f 72 20 qlite3_step] or
52750 5b 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5d 0d [sqlite3_close].
52760 0a 2a 2a 20 63 61 6c 6c 20 74 68 61 74 20 63 6f .** call that co
52770 6e 63 6c 75 64 65 73 20 74 68 65 20 62 6c 6f 63 ncludes the bloc
52780 6b 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 king connections
52790 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a transaction...*
527a0 2a 0d 0a 2a 2a 20 5e 28 49 66 20 73 71 6c 69 74 *..** ^(If sqlit
527b0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 e3_unlock_notify
527c0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 69 6e 20 () is called in
527d0 61 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 a multi-threaded
527e0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 0d 0a 2a application,..*
527f0 2a 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 * there is a cha
52800 6e 63 65 20 74 68 61 74 20 74 68 65 20 62 6c 6f nce that the blo
52810 63 6b 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e cking connection
52820 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 will have alrea
52830 64 79 0d 0a 2a 2a 20 63 6f 6e 63 6c 75 64 65 64 dy..** concluded
52840 20 69 74 73 20 74 72 61 6e 73 61 63 74 69 6f 6e its transaction
52850 20 62 79 20 74 68 65 20 74 69 6d 65 20 73 71 6c by the time sql
52860 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 ite3_unlock_noti
52870 66 79 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 2e fy() is invoked.
52880 0d 0a 2a 2a 20 49 66 20 74 68 69 73 20 68 61 70 ..** If this hap
52890 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 pens, then the s
528a0 70 65 63 69 66 69 65 64 20 63 61 6c 6c 62 61 63 pecified callbac
528b0 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 6d 6d k is invoked imm
528c0 65 64 69 61 74 65 6c 79 2c 0d 0a 2a 2a 20 66 72 ediately,..** fr
528d0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 om within the ca
528e0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 75 6e ll to sqlite3_un
528f0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 2e 29 5e lock_notify().)^
52900 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 49 66 20 74 68 65 ..**..** ^If the
52910 20 62 6c 6f 63 6b 65 64 20 63 6f 6e 6e 65 63 74 blocked connect
52920 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 69 6e ion is attemptin
52930 67 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 77 72 g to obtain a wr
52940 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 0d 0a 2a ite-lock on a..*
52950 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74 * shared-cache t
52960 61 62 6c 65 2c 20 61 6e 64 20 6d 6f 72 65 20 74 able, and more t
52970 68 61 6e 20 6f 6e 65 20 6f 74 68 65 72 20 63 6f han one other co
52980 6e 6e 65 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 nnection current
52990 6c 79 20 68 6f 6c 64 73 0d 0a 2a 2a 20 61 20 72 ly holds..** a r
529a0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 ead-lock on the
529b0 73 61 6d 65 20 74 61 62 6c 65 2c 20 74 68 65 6e same table, then
529c0 20 53 51 4c 69 74 65 20 61 72 62 69 74 72 61 72 SQLite arbitrar
529d0 69 6c 79 20 73 65 6c 65 63 74 73 20 6f 6e 65 20 ily selects one
529e0 6f 66 20 0d 0a 2a 2a 20 74 68 65 20 6f 74 68 65 of ..** the othe
529f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f r connections to
52a00 20 75 73 65 20 61 73 20 74 68 65 20 62 6c 6f 63 use as the bloc
52a10 6b 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e king connection.
52a20 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 28 54 68 65 72 65 ..**..** ^(There
52a30 20 6d 61 79 20 62 65 20 61 74 20 6d 6f 73 74 20 may be at most
52a40 6f 6e 65 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 one unlock-notif
52a50 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 y callback regis
52a60 74 65 72 65 64 20 62 79 20 61 20 0d 0a 2a 2a 20 tered by a ..**
52a70 62 6c 6f 63 6b 65 64 20 63 6f 6e 6e 65 63 74 69 blocked connecti
52a80 6f 6e 2e 20 49 66 20 73 71 6c 69 74 65 33 5f 75 on. If sqlite3_u
52a90 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 69 nlock_notify() i
52aa0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 s called when th
52ab0 65 0d 0a 2a 2a 20 62 6c 6f 63 6b 65 64 20 63 6f e..** blocked co
52ac0 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 nnection already
52ad0 20 68 61 73 20 61 20 72 65 67 69 73 74 65 72 65 has a registere
52ae0 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 d unlock-notify
52af0 63 61 6c 6c 62 61 63 6b 2c 0d 0a 2a 2a 20 74 68 callback,..** th
52b00 65 6e 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 en the new callb
52b10 61 63 6b 20 72 65 70 6c 61 63 65 73 20 74 68 65 ack replaces the
52b20 20 6f 6c 64 2e 29 5e 20 5e 49 66 20 73 71 6c 69 old.)^ ^If sqli
52b30 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 te3_unlock_notif
52b40 79 28 29 20 69 73 0d 0a 2a 2a 20 63 61 6c 6c 65 y() is..** calle
52b50 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f d with a NULL po
52b60 69 6e 74 65 72 20 61 73 20 69 74 73 20 73 65 63 inter as its sec
52b70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 ond argument, th
52b80 65 6e 20 61 6e 79 20 65 78 69 73 74 69 6e 67 0d en any existing.
52b90 0a 2a 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 .** unlock-notif
52ba0 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 63 61 y callback is ca
52bb0 6e 63 65 6c 65 64 2e 20 5e 54 68 65 20 62 6c 6f nceled. ^The blo
52bc0 63 6b 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 cked connections
52bd0 20 0d 0a 2a 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 ..** unlock-not
52be0 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 ify callback may
52bf0 20 61 6c 73 6f 20 62 65 20 63 61 6e 63 65 6c 65 also be cancele
52c00 64 20 62 79 20 63 6c 6f 73 69 6e 67 20 74 68 65 d by closing the
52c10 20 62 6c 6f 63 6b 65 64 0d 0a 2a 2a 20 63 6f 6e blocked..** con
52c20 6e 65 63 74 69 6f 6e 20 75 73 69 6e 67 20 5b 73 nection using [s
52c30 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 5d 2e qlite3_close()].
52c40 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 75 6e 6c ..**..** The unl
52c50 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 ock-notify callb
52c60 61 63 6b 20 69 73 20 6e 6f 74 20 72 65 65 6e 74 ack is not reent
52c70 72 61 6e 74 2e 20 49 66 20 61 6e 20 61 70 70 6c rant. If an appl
52c80 69 63 61 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 0d ication invokes.
52c90 0a 2a 2a 20 61 6e 79 20 73 71 6c 69 74 65 33 5f .** any sqlite3_
52ca0 78 78 78 20 41 50 49 20 66 75 6e 63 74 69 6f 6e xxx API function
52cb0 73 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e s from within an
52cc0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 unlock-notify c
52cd0 61 6c 6c 62 61 63 6b 2c 20 61 0d 0a 2a 2a 20 63 allback, a..** c
52ce0 72 61 73 68 20 6f 72 20 64 65 61 64 6c 6f 63 6b rash or deadlock
52cf0 20 6d 61 79 20 62 65 20 74 68 65 20 72 65 73 75 may be the resu
52d00 6c 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 55 6e 6c lt...**..** ^Unl
52d10 65 73 73 20 64 65 61 64 6c 6f 63 6b 20 69 73 20 ess deadlock is
52d20 64 65 74 65 63 74 65 64 20 28 73 65 65 20 62 65 detected (see be
52d30 6c 6f 77 29 2c 20 73 71 6c 69 74 65 33 5f 75 6e low), sqlite3_un
52d40 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 61 6c lock_notify() al
52d50 77 61 79 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 ways..** returns
52d60 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2a 0d SQLITE_OK...**.
52d70 0a 2a 2a 20 3c 62 3e 43 61 6c 6c 62 61 63 6b 20 .** <b>Callback
52d80 49 6e 76 6f 63 61 74 69 6f 6e 20 44 65 74 61 69 Invocation Detai
52d90 6c 73 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 ls</b>..**..** W
52da0 68 65 6e 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f hen an unlock-no
52db0 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 tify callback is
52dc0 20 72 65 67 69 73 74 65 72 65 64 2c 20 74 68 65 registered, the
52dd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 70 72 6f application pro
52de0 76 69 64 65 73 20 61 20 0d 0a 2a 2a 20 73 69 6e vides a ..** sin
52df0 67 6c 65 20 76 6f 69 64 2a 20 70 6f 69 6e 74 65 gle void* pointe
52e00 72 20 74 68 61 74 20 69 73 20 70 61 73 73 65 64 r that is passed
52e10 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b to the callback
52e20 20 77 68 65 6e 20 69 74 20 69 73 20 69 6e 76 6f when it is invo
52e30 6b 65 64 2e 0d 0a 2a 2a 20 48 6f 77 65 76 65 72 ked...** However
52e40 2c 20 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 , the signature
52e50 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 of the callback
52e60 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 function allows
52e70 53 51 4c 69 74 65 20 74 6f 20 70 61 73 73 0d 0a SQLite to pass..
52e80 2a 2a 20 69 74 20 61 6e 20 61 72 72 61 79 20 6f ** it an array o
52e90 66 20 76 6f 69 64 2a 20 63 6f 6e 74 65 78 74 20 f void* context
52ea0 70 6f 69 6e 74 65 72 73 2e 20 54 68 65 20 66 69 pointers. The fi
52eb0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 rst argument pas
52ec0 73 65 64 20 74 6f 0d 0a 2a 2a 20 61 6e 20 75 6e sed to..** an un
52ed0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c lock-notify call
52ee0 62 61 63 6b 20 69 73 20 61 20 70 6f 69 6e 74 65 back is a pointe
52ef0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 r to an array of
52f00 20 76 6f 69 64 2a 20 70 6f 69 6e 74 65 72 73 2c void* pointers,
52f10 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 ..** and the sec
52f20 6f 6e 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65 ond is the numbe
52f30 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 r of entries in
52f40 74 68 65 20 61 72 72 61 79 2e 0d 0a 2a 2a 0d 0a the array...**..
52f50 2a 2a 20 57 68 65 6e 20 61 20 62 6c 6f 63 6b 69 ** When a blocki
52f60 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 ng connections t
52f70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f ransaction is co
52f80 6e 63 6c 75 64 65 64 2c 20 74 68 65 72 65 20 6d ncluded, there m
52f90 61 79 20 62 65 0d 0a 2a 2a 20 6d 6f 72 65 20 74 ay be..** more t
52fa0 68 61 6e 20 6f 6e 65 20 62 6c 6f 63 6b 65 64 20 han one blocked
52fb0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 connection that
52fc0 68 61 73 20 72 65 67 69 73 74 65 72 65 64 20 66 has registered f
52fd0 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 or an unlock-not
52fe0 69 66 79 0d 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b ify..** callback
52ff0 2e 20 5e 49 66 20 74 77 6f 20 6f 72 20 6d 6f 72 . ^If two or mor
53000 65 20 73 75 63 68 20 62 6c 6f 63 6b 65 64 20 63 e such blocked c
53010 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 61 76 65 20 onnections have
53020 73 70 65 63 69 66 69 65 64 20 74 68 65 0d 0a 2a specified the..*
53030 2a 20 73 61 6d 65 20 63 61 6c 6c 62 61 63 6b 20 * same callback
53040 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 69 function, then i
53050 6e 73 74 65 61 64 20 6f 66 20 69 6e 76 6f 6b 69 nstead of invoki
53060 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 ng the callback
53070 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 6d 75 6c function..** mul
53080 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 69 74 20 tiple times, it
53090 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 is invoked once
530a0 77 69 74 68 20 74 68 65 20 73 65 74 20 6f 66 20 with the set of
530b0 76 6f 69 64 2a 20 63 6f 6e 74 65 78 74 20 70 6f void* context po
530c0 69 6e 74 65 72 73 0d 0a 2a 2a 20 73 70 65 63 69 inters..** speci
530d0 66 69 65 64 20 62 79 20 74 68 65 20 62 6c 6f 63 fied by the bloc
530e0 6b 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 ked connections
530f0 62 75 6e 64 6c 65 64 20 74 6f 67 65 74 68 65 72 bundled together
53100 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 2e 0d into an array..
53110 0a 2a 2a 20 54 68 69 73 20 67 69 76 65 73 20 74 .** This gives t
53120 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 he application a
53130 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f n opportunity to
53140 20 70 72 69 6f 72 69 74 69 7a 65 20 61 6e 79 20 prioritize any
53150 61 63 74 69 6f 6e 73 20 0d 0a 2a 2a 20 72 65 6c actions ..** rel
53160 61 74 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 ated to the set
53170 6f 66 20 75 6e 62 6c 6f 63 6b 65 64 20 64 61 74 of unblocked dat
53180 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
53190 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 62 3e 44 65 s...**..** <b>De
531a0 61 64 6c 6f 63 6b 20 44 65 74 65 63 74 69 6f 6e adlock Detection
531b0 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 73 73 </b>..**..** Ass
531c0 75 6d 69 6e 67 20 74 68 61 74 20 61 66 74 65 72 uming that after
531d0 20 72 65 67 69 73 74 65 72 69 6e 67 20 66 6f 72 registering for
531e0 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 an unlock-notif
531f0 79 20 63 61 6c 6c 62 61 63 6b 20 61 20 0d 0a 2a y callback a ..*
53200 2a 20 64 61 74 61 62 61 73 65 20 77 61 69 74 73 * database waits
53210 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 62 61 63 for the callbac
53220 6b 20 74 6f 20 62 65 20 69 73 73 75 65 64 20 62 k to be issued b
53230 65 66 6f 72 65 20 74 61 6b 69 6e 67 20 61 6e 79 efore taking any
53240 20 66 75 72 74 68 65 72 0d 0a 2a 2a 20 61 63 74 further..** act
53250 69 6f 6e 20 28 61 20 72 65 61 73 6f 6e 61 62 6c ion (a reasonabl
53260 65 20 61 73 73 75 6d 70 74 69 6f 6e 29 2c 20 74 e assumption), t
53270 68 65 6e 20 75 73 69 6e 67 20 74 68 69 73 20 41 hen using this A
53280 50 49 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 PI may cause the
53290 0d 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e ..** application
532a0 20 74 6f 20 64 65 61 64 6c 6f 63 6b 2e 20 46 6f to deadlock. Fo
532b0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 63 6f r example, if co
532c0 6e 6e 65 63 74 69 6f 6e 20 58 20 69 73 20 77 61 nnection X is wa
532d0 69 74 69 6e 67 20 66 6f 72 0d 0a 2a 2a 20 63 6f iting for..** co
532e0 6e 6e 65 63 74 69 6f 6e 20 59 27 73 20 74 72 61 nnection Y's tra
532f0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 nsaction to be c
53300 6f 6e 63 6c 75 64 65 64 2c 20 61 6e 64 20 73 69 oncluded, and si
53310 6d 69 6c 61 72 6c 79 20 63 6f 6e 6e 65 63 74 69 milarly connecti
53320 6f 6e 0d 0a 2a 2a 20 59 20 69 73 20 77 61 69 74 on..** Y is wait
53330 69 6e 67 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f ing on connectio
53340 6e 20 58 27 73 20 74 72 61 6e 73 61 63 74 69 6f n X's transactio
53350 6e 2c 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 n, then neither
53360 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 77 connection..** w
53370 69 6c 6c 20 70 72 6f 63 65 65 64 20 61 6e 64 20 ill proceed and
53380 74 68 65 20 73 79 73 74 65 6d 20 6d 61 79 20 72 the system may r
53390 65 6d 61 69 6e 20 64 65 61 64 6c 6f 63 6b 65 64 emain deadlocked
533a0 20 69 6e 64 65 66 69 6e 69 74 65 6c 79 2e 0d 0a indefinitely...
533b0 2a 2a 0d 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 **..** To avoid
533c0 74 68 69 73 20 73 63 65 6e 61 72 69 6f 2c 20 74 this scenario, t
533d0 68 65 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 he sqlite3_unloc
533e0 6b 5f 6e 6f 74 69 66 79 28 29 20 70 65 72 66 6f k_notify() perfo
533f0 72 6d 73 20 64 65 61 64 6c 6f 63 6b 0d 0a 2a 2a rms deadlock..**
53400 20 64 65 74 65 63 74 69 6f 6e 2e 20 5e 49 66 20 detection. ^If
53410 61 20 67 69 76 65 6e 20 63 61 6c 6c 20 74 6f 20 a given call to
53420 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e sqlite3_unlock_n
53430 6f 74 69 66 79 28 29 20 77 6f 75 6c 64 20 70 75 otify() would pu
53440 74 20 74 68 65 0d 0a 2a 2a 20 73 79 73 74 65 6d t the..** system
53450 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 65 64 in a deadlocked
53460 20 73 74 61 74 65 2c 20 74 68 65 6e 20 53 51 4c state, then SQL
53470 49 54 45 5f 4c 4f 43 4b 45 44 20 69 73 20 72 65 ITE_LOCKED is re
53480 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 0d 0a 2a turned and no..*
53490 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 * unlock-notify
534a0 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 65 67 69 callback is regi
534b0 73 74 65 72 65 64 2e 20 54 68 65 20 73 79 73 74 stered. The syst
534c0 65 6d 20 69 73 20 73 61 69 64 20 74 6f 20 62 65 em is said to be
534d0 20 69 6e 0d 0a 2a 2a 20 61 20 64 65 61 64 6c 6f in..** a deadlo
534e0 63 6b 65 64 20 73 74 61 74 65 20 69 66 20 63 6f cked state if co
534f0 6e 6e 65 63 74 69 6f 6e 20 41 20 68 61 73 20 72 nnection A has r
53500 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 61 6e egistered for an
53510 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 0d 0a unlock-notify..
53520 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 20 74 ** callback on t
53530 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 he conclusion of
53540 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 42 27 73 20 connection B's
53550 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 transaction, and
53560 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 connection..**
53570 42 20 68 61 73 20 69 74 73 65 6c 66 20 72 65 67 B has itself reg
53580 69 73 74 65 72 65 64 20 66 6f 72 20 61 6e 20 75 istered for an u
53590 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c nlock-notify cal
535a0 6c 62 61 63 6b 20 77 68 65 6e 20 63 6f 6e 6e 65 lback when conne
535b0 63 74 69 6f 6e 0d 0a 2a 2a 20 41 27 73 20 74 72 ction..** A's tr
535c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6e ansaction is con
535d0 63 6c 75 64 65 64 2e 20 5e 49 6e 64 69 72 65 63 cluded. ^Indirec
535e0 74 20 64 65 61 64 6c 6f 63 6b 20 69 73 20 61 6c t deadlock is al
535f0 73 6f 20 64 65 74 65 63 74 65 64 2c 20 73 6f 0d so detected, so.
53600 0a 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 69 .** the system i
53610 73 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 s also considere
53620 64 20 74 6f 20 62 65 20 64 65 61 64 6c 6f 63 6b d to be deadlock
53630 65 64 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e ed if connection
53640 20 42 20 68 61 73 0d 0a 2a 2a 20 72 65 67 69 73 B has..** regis
53650 74 65 72 65 64 20 66 6f 72 20 61 6e 20 75 6e 6c tered for an unl
53660 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 ock-notify callb
53670 61 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 6c ack on the concl
53680 75 73 69 6f 6e 20 6f 66 20 63 6f 6e 6e 65 63 74 usion of connect
53690 69 6f 6e 0d 0a 2a 2a 20 43 27 73 20 74 72 61 6e ion..** C's tran
536a0 73 61 63 74 69 6f 6e 2c 20 77 68 65 72 65 20 63 saction, where c
536b0 6f 6e 6e 65 63 74 69 6f 6e 20 43 20 69 73 20 77 onnection C is w
536c0 61 69 74 69 6e 67 20 6f 6e 20 63 6f 6e 6e 65 63 aiting on connec
536d0 74 69 6f 6e 20 41 2e 20 5e 41 6e 79 0d 0a 2a 2a tion A. ^Any..**
536e0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c number of level
536f0 73 20 6f 66 20 69 6e 64 69 72 65 63 74 69 6f 6e s of indirection
53700 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0d 0a 2a are allowed...*
53710 2a 0d 0a 2a 2a 20 3c 62 3e 54 68 65 20 22 44 52 *..** <b>The "DR
53720 4f 50 20 54 41 42 4c 45 22 20 45 78 63 65 70 74 OP TABLE" Except
53730 69 6f 6e 3c 2f 62 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 ion</b>..**..**
53740 57 68 65 6e 20 61 20 63 61 6c 6c 20 74 6f 20 5b When a call to [
53750 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 5d 20 sqlite3_step()]
53760 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c returns SQLITE_L
53770 4f 43 4b 45 44 2c 20 69 74 20 69 73 20 61 6c 6d OCKED, it is alm
53780 6f 73 74 20 0d 0a 2a 2a 20 61 6c 77 61 79 73 20 ost ..** always
53790 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 63 appropriate to c
537a0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f all sqlite3_unlo
537b0 63 6b 5f 6e 6f 74 69 66 79 28 29 2e 20 54 68 65 ck_notify(). The
537c0 72 65 20 69 73 20 68 6f 77 65 76 65 72 2c 0d 0a re is however,..
537d0 2a 2a 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e ** one exception
537e0 2e 20 57 68 65 6e 20 65 78 65 63 75 74 69 6e 67 . When executing
537f0 20 61 20 22 44 52 4f 50 20 54 41 42 4c 45 22 20 a "DROP TABLE"
53800 6f 72 20 22 44 52 4f 50 20 49 4e 44 45 58 22 20 or "DROP INDEX"
53810 73 74 61 74 65 6d 65 6e 74 2c 0d 0a 2a 2a 20 53 statement,..** S
53820 51 4c 69 74 65 20 63 68 65 63 6b 73 20 69 66 20 QLite checks if
53830 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 75 there are any cu
53840 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e rrently executin
53850 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 g SELECT stateme
53860 6e 74 73 0d 0a 2a 2a 20 74 68 61 74 20 62 65 6c nts..** that bel
53870 6f 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 ong to the same
53880 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 74 connection. If t
53890 68 65 72 65 20 61 72 65 2c 20 53 51 4c 49 54 45 here are, SQLITE
538a0 5f 4c 4f 43 4b 45 44 20 69 73 0d 0a 2a 2a 20 72 _LOCKED is..** r
538b0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 eturned. In this
538c0 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e case there is n
538d0 6f 20 22 62 6c 6f 63 6b 69 6e 67 20 63 6f 6e 6e o "blocking conn
538e0 65 63 74 69 6f 6e 22 2c 20 73 6f 20 69 6e 76 6f ection", so invo
538f0 6b 69 6e 67 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 king..** sqlite3
53900 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 _unlock_notify()
53910 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 results in the
53920 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 unlock-notify ca
53930 6c 6c 62 61 63 6b 20 62 65 69 6e 67 0d 0a 2a 2a llback being..**
53940 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 invoked immedia
53950 74 65 6c 79 2e 20 49 66 20 74 68 65 20 61 70 70 tely. If the app
53960 6c 69 63 61 74 69 6f 6e 20 74 68 65 6e 20 72 65 lication then re
53970 2d 61 74 74 65 6d 70 74 73 20 74 68 65 20 22 44 -attempts the "D
53980 52 4f 50 20 54 41 42 4c 45 22 0d 0a 2a 2a 20 6f ROP TABLE"..** o
53990 72 20 22 44 52 4f 50 20 49 4e 44 45 58 22 20 71 r "DROP INDEX" q
539a0 75 65 72 79 2c 20 61 6e 20 69 6e 66 69 6e 69 74 uery, an infinit
539b0 65 20 6c 6f 6f 70 20 6d 69 67 68 74 20 62 65 20 e loop might be
539c0 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 2a 2a 0d the result...**.
539d0 0a 2a 2a 20 4f 6e 65 20 77 61 79 20 61 72 6f 75 .** One way arou
539e0 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 nd this problem
539f0 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 is to check the
53a00 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 extended error c
53a10 6f 64 65 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a ode returned..**
53a20 20 62 79 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 by an sqlite3_s
53a30 74 65 70 28 29 20 63 61 6c 6c 2e 20 5e 28 49 66 tep() call. ^(If
53a40 20 74 68 65 72 65 20 69 73 20 61 20 62 6c 6f 63 there is a bloc
53a50 6b 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c king connection,
53a60 20 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 65 78 then the..** ex
53a70 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 tended error cod
53a80 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 e is set to SQLI
53a90 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 TE_LOCKED_SHARED
53aa0 43 41 43 48 45 2e 20 4f 74 68 65 72 77 69 73 65 CACHE. Otherwise
53ab0 2c 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 73 70 65 , in..** the spe
53ac0 63 69 61 6c 20 22 44 52 4f 50 20 54 41 42 4c 45 cial "DROP TABLE
53ad0 2f 49 4e 44 45 58 22 20 63 61 73 65 2c 20 74 68 /INDEX" case, th
53ae0 65 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 e extended error
53af0 20 63 6f 64 65 20 69 73 20 6a 75 73 74 20 0d 0a code is just ..
53b00 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 ** SQLITE_LOCKED
53b10 2e 29 5e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f .)^..*/..SQLITE_
53b20 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
53b30 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 0d 0a unlock_notify(..
53b40 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 sqlite3 *pBloc
53b50 6b 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 ked,
53b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
53b70 20 57 61 69 74 69 6e 67 20 63 6f 6e 6e 65 63 74 Waiting connect
53b80 69 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 ion */.. void (
53b90 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a *xNotify)(void *
53ba0 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 *apArg, int nArg
53bb0 29 2c 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 ), /* Callbac
53bc0 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e k function to in
53bd0 76 6f 6b 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 voke */.. void
53be0 2a 70 4e 6f 74 69 66 79 41 72 67 20 20 20 20 20 *pNotifyArg
53bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
53c00 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 /* Argume
53c10 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 4e nt to pass to xN
53c20 6f 74 69 66 79 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a otify */..);....
53c30 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 ../*..** CAPI3RE
53c40 46 3a 20 53 74 72 69 6e 67 20 43 6f 6d 70 61 72 F: String Compar
53c50 69 73 6f 6e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 ison..**..** ^Th
53c60 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 e [sqlite3_strni
53c70 63 6d 70 28 29 5d 20 41 50 49 20 61 6c 6c 6f 77 cmp()] API allow
53c80 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 61 s applications a
53c90 6e 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f nd extensions to
53ca0 0d 0a 2a 2a 20 63 6f 6d 70 61 72 65 20 74 68 65 ..** compare the
53cb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 77 6f contents of two
53cc0 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61 69 6e buffers contain
53cd0 69 6e 67 20 55 54 46 2d 38 20 73 74 72 69 6e 67 ing UTF-8 string
53ce0 73 20 69 6e 20 61 0d 0a 2a 2a 20 63 61 73 65 2d s in a..** case-
53cf0 69 6e 64 65 70 65 6e 64 65 6e 74 20 66 61 73 68 independent fash
53d00 69 6f 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 73 ion, using the s
53d10 61 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f ame definition o
53d20 66 20 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 f case independe
53d30 6e 63 65 20 0d 0a 2a 2a 20 74 68 61 74 20 53 51 nce ..** that SQ
53d40 4c 69 74 65 20 75 73 65 73 20 69 6e 74 65 72 6e Lite uses intern
53d50 61 6c 6c 79 20 77 68 65 6e 20 63 6f 6d 70 61 72 ally when compar
53d60 69 6e 67 20 69 64 65 6e 74 69 66 69 65 72 73 2e ing identifiers.
53d70 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
53d80 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 72 int sqlite3_str
53d90 6e 69 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 nicmp(const char
53da0 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *, const char *
53db0 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a , int);..../*..*
53dc0 2a 20 43 41 50 49 33 52 45 46 3a 20 45 72 72 6f * CAPI3REF: Erro
53dd0 72 20 4c 6f 67 67 69 6e 67 20 49 6e 74 65 72 66 r Logging Interf
53de0 61 63 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 ace..**..** ^The
53df0 20 5b 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 5d [sqlite3_log()]
53e00 20 69 6e 74 65 72 66 61 63 65 20 77 72 69 74 65 interface write
53e10 73 20 61 20 6d 65 73 73 61 67 65 20 69 6e 74 6f s a message into
53e20 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 0d 0a the error log..
53e30 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 62 ** established b
53e40 79 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 43 4f y the [SQLITE_CO
53e50 4e 46 49 47 5f 4c 4f 47 5d 20 6f 70 74 69 6f 6e NFIG_LOG] option
53e60 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e to [sqlite3_con
53e70 66 69 67 28 29 5d 2e 0d 0a 2a 2a 20 5e 49 66 20 fig()]...** ^If
53e80 6c 6f 67 67 69 6e 67 20 69 73 20 65 6e 61 62 6c logging is enabl
53e90 65 64 2c 20 74 68 65 20 7a 46 6f 72 6d 61 74 20 ed, the zFormat
53ea0 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 string and subse
53eb0 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 quent arguments
53ec0 61 72 65 0d 0a 2a 2a 20 75 73 65 64 20 77 69 74 are..** used wit
53ed0 68 20 5b 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 h [sqlite3_snpri
53ee0 6e 74 66 28 29 5d 20 74 6f 20 67 65 6e 65 72 61 ntf()] to genera
53ef0 74 65 20 74 68 65 20 66 69 6e 61 6c 20 6f 75 74 te the final out
53f00 70 75 74 20 73 74 72 69 6e 67 2e 0d 0a 2a 2a 0d put string...**.
53f10 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f .** The sqlite3_
53f20 6c 6f 67 28 29 20 69 6e 74 65 72 66 61 63 65 20 log() interface
53f30 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 is intended for
53f40 75 73 65 20 62 79 20 65 78 74 65 6e 73 69 6f 6e use by extension
53f50 73 20 73 75 63 68 20 61 73 0d 0a 2a 2a 20 76 69 s such as..** vi
53f60 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 63 6f rtual tables, co
53f70 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e llating function
53f80 73 2c 20 61 6e 64 20 53 51 4c 20 66 75 6e 63 74 s, and SQL funct
53f90 69 6f 6e 73 2e 20 20 57 68 69 6c 65 20 74 68 65 ions. While the
53fa0 72 65 20 69 73 0d 0a 2a 2a 20 6e 6f 74 68 69 6e re is..** nothin
53fb0 67 20 74 6f 20 70 72 65 76 65 6e 74 20 61 6e 20 g to prevent an
53fc0 61 70 70 6c 69 63 61 74 69 6f 6e 20 66 72 6f 6d application from
53fd0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 calling sqlite3
53fe0 5f 6c 6f 67 28 29 2c 20 64 6f 69 6e 67 20 73 6f _log(), doing so
53ff0 0d 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 ..** is consider
54000 65 64 20 62 61 64 20 66 6f 72 6d 2e 0d 0a 2a 2a ed bad form...**
54010 0d 0a 2a 2a 20 54 68 65 20 7a 46 6f 72 6d 61 74 ..** The zFormat
54020 20 73 74 72 69 6e 67 20 6d 75 73 74 20 6e 6f 74 string must not
54030 20 62 65 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a 2a be NULL...**..*
54040 2a 20 54 6f 20 61 76 6f 69 64 20 64 65 61 64 6c * To avoid deadl
54050 6f 63 6b 73 20 61 6e 64 20 6f 74 68 65 72 20 74 ocks and other t
54060 68 72 65 61 64 69 6e 67 20 70 72 6f 62 6c 65 6d hreading problem
54070 73 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c s, the sqlite3_l
54080 6f 67 28 29 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a og() routine..**
54090 20 77 69 6c 6c 20 6e 6f 74 20 75 73 65 20 64 79 will not use dy
540a0 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 namically alloca
540b0 74 65 64 20 6d 65 6d 6f 72 79 2e 20 20 54 68 65 ted memory. The
540c0 20 6c 6f 67 20 6d 65 73 73 61 67 65 20 69 73 20 log message is
540d0 73 74 6f 72 65 64 20 69 6e 0d 0a 2a 2a 20 61 20 stored in..** a
540e0 66 69 78 65 64 2d 6c 65 6e 67 74 68 20 62 75 66 fixed-length buf
540f0 66 65 72 20 6f 6e 20 74 68 65 20 73 74 61 63 6b fer on the stack
54100 2e 20 20 49 66 20 74 68 65 20 6c 6f 67 20 6d 65 . If the log me
54110 73 73 61 67 65 20 69 73 20 6c 6f 6e 67 65 72 20 ssage is longer
54120 74 68 61 6e 0d 0a 2a 2a 20 61 20 66 65 77 20 68 than..** a few h
54130 75 6e 64 72 65 64 20 63 68 61 72 61 63 74 65 72 undred character
54140 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 72 s, it will be tr
54150 75 6e 63 61 74 65 64 20 74 6f 20 74 68 65 20 6c uncated to the l
54160 65 6e 67 74 68 20 6f 66 20 74 68 65 0d 0a 2a 2a ength of the..**
54170 20 62 75 66 66 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 buffer...*/..SQ
54180 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 LITE_API void sq
54190 6c 69 74 65 33 5f 6c 6f 67 28 69 6e 74 20 69 45 lite3_log(int iE
541a0 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 rrCode, const ch
541b0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e ar *zFormat, ...
541c0 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 );..../*..** CAP
541d0 49 33 52 45 46 3a 20 57 72 69 74 65 2d 41 68 65 I3REF: Write-Ahe
541e0 61 64 20 4c 6f 67 20 43 6f 6d 6d 69 74 20 48 6f ad Log Commit Ho
541f0 6f 6b 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 ok..**..** ^The
54200 5b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f [sqlite3_wal_hoo
54210 6b 28 29 5d 20 66 75 6e 63 74 69 6f 6e 20 69 73 k()] function is
54220 20 75 73 65 64 20 74 6f 20 72 65 67 69 73 74 65 used to registe
54230 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 r a callback tha
54240 74 0d 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6e t..** will be in
54250 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 voked each time
54260 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 a database conne
54270 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 64 61 ction commits da
54280 74 61 20 74 6f 20 61 0d 0a 2a 2a 20 5b 77 72 69 ta to a..** [wri
54290 74 65 2d 61 68 65 61 64 20 6c 6f 67 5d 20 28 69 te-ahead log] (i
542a0 2e 65 2e 20 77 68 65 6e 65 76 65 72 20 61 20 74 .e. whenever a t
542b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f ransaction is co
542c0 6d 6d 69 74 74 65 64 20 69 6e 0d 0a 2a 2a 20 5b mmitted in..** [
542d0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7c 20 6a journal_mode | j
542e0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 ournal_mode=WAL
542f0 6d 6f 64 65 5d 29 2e 20 0d 0a 2a 2a 0d 0a 2a 2a mode]). ..**..**
54300 20 5e 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 ^The callback i
54310 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 53 51 4c s invoked by SQL
54320 69 74 65 20 61 66 74 65 72 20 74 68 65 20 63 6f ite after the co
54330 6d 6d 69 74 20 68 61 73 20 74 61 6b 65 6e 20 70 mmit has taken p
54340 6c 61 63 65 20 61 6e 64 20 0d 0a 2a 2a 20 74 68 lace and ..** th
54350 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 72 69 e associated wri
54360 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 te-lock on the d
54370 61 74 61 62 61 73 65 20 72 65 6c 65 61 73 65 64 atabase released
54380 2c 20 73 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 , so the impleme
54390 6e 74 61 74 69 6f 6e 20 0d 0a 2a 2a 20 6d 61 79 ntation ..** may
543a0 20 72 65 61 64 2c 20 77 72 69 74 65 20 6f 72 20 read, write or
543b0 5b 63 68 65 63 6b 70 6f 69 6e 74 5d 20 74 68 65 [checkpoint] the
543c0 20 64 61 74 61 62 61 73 65 20 61 73 20 72 65 71 database as req
543d0 75 69 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e uired...**..** ^
543e0 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 The first parame
543f0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 ter passed to th
54400 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 e callback funct
54410 69 6f 6e 20 77 68 65 6e 20 69 74 20 69 73 20 69 ion when it is i
54420 6e 76 6f 6b 65 64 0d 0a 2a 2a 20 69 73 20 61 20 nvoked..** is a
54430 63 6f 70 79 20 6f 66 20 74 68 65 20 74 68 69 72 copy of the thir
54440 64 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 d parameter pass
54450 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 77 61 ed to sqlite3_wa
54460 6c 5f 68 6f 6f 6b 28 29 20 77 68 65 6e 0d 0a 2a l_hook() when..*
54470 2a 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 * registering th
54480 65 20 63 61 6c 6c 62 61 63 6b 2e 20 5e 54 68 65 e callback. ^The
54490 20 73 65 63 6f 6e 64 20 69 73 20 61 20 63 6f 70 second is a cop
544a0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 y of the databas
544b0 65 20 68 61 6e 64 6c 65 2e 0d 0a 2a 2a 20 5e 54 e handle...** ^T
544c0 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 he third paramet
544d0 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f er is the name o
544e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 f the database t
544f0 68 61 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 hat was written
54500 74 6f 20 2d 0d 0a 2a 2a 20 65 69 74 68 65 72 20 to -..** either
54510 22 6d 61 69 6e 22 20 6f 72 20 74 68 65 20 6e 61 "main" or the na
54520 6d 65 20 6f 66 20 61 6e 20 5b 41 54 54 41 43 48 me of an [ATTACH
54530 5d 2d 65 64 20 64 61 74 61 62 61 73 65 2e 20 5e ]-ed database. ^
54540 54 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d The fourth param
54550 65 74 65 72 0d 0a 2a 2a 20 69 73 20 74 68 65 20 eter..** is the
54560 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 number of pages
54570 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 currently in the
54580 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 write-ahead log
54590 20 66 69 6c 65 2c 0d 0a 2a 2a 20 69 6e 63 6c 75 file,..** inclu
545a0 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61 74 20 ding those that
545b0 77 65 72 65 20 6a 75 73 74 20 63 6f 6d 6d 69 74 were just commit
545c0 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ted...**..** The
545d0 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 callback functi
545e0 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c on should normal
545f0 6c 79 20 72 65 74 75 72 6e 20 5b 53 51 4c 49 54 ly return [SQLIT
54600 45 5f 4f 4b 5d 2e 20 20 5e 49 66 20 61 6e 20 65 E_OK]. ^If an e
54610 72 72 6f 72 0d 0a 2a 2a 20 63 6f 64 65 20 69 73 rror..** code is
54620 20 72 65 74 75 72 6e 65 64 2c 20 74 68 61 74 20 returned, that
54630 65 72 72 6f 72 20 77 69 6c 6c 20 70 72 6f 70 61 error will propa
54640 67 61 74 65 20 62 61 63 6b 20 75 70 20 74 68 72 gate back up thr
54650 6f 75 67 68 20 74 68 65 0d 0a 2a 2a 20 53 51 4c ough the..** SQL
54660 69 74 65 20 63 6f 64 65 20 62 61 73 65 20 74 6f ite code base to
54670 20 63 61 75 73 65 20 74 68 65 20 73 74 61 74 65 cause the state
54680 6d 65 6e 74 20 74 68 61 74 20 70 72 6f 76 6f 6b ment that provok
54690 65 64 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0d ed the callback.
546a0 0a 2a 2a 20 74 6f 20 72 65 70 6f 72 74 20 61 6e .** to report an
546b0 20 65 72 72 6f 72 2c 20 74 68 6f 75 67 68 20 74 error, though t
546c0 68 65 20 63 6f 6d 6d 69 74 20 77 69 6c 6c 20 68 he commit will h
546d0 61 76 65 20 73 74 69 6c 6c 20 6f 63 63 75 72 72 ave still occurr
546e0 65 64 2e 20 49 66 20 74 68 65 0d 0a 2a 2a 20 63 ed. If the..** c
546f0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 allback returns
54700 5b 53 51 4c 49 54 45 5f 52 4f 57 5d 20 6f 72 20 [SQLITE_ROW] or
54710 5b 53 51 4c 49 54 45 5f 44 4f 4e 45 5d 2c 20 6f [SQLITE_DONE], o
54720 72 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 r if it returns
54730 61 20 76 61 6c 75 65 0d 0a 2a 2a 20 74 68 61 74 a value..** that
54740 20 64 6f 65 73 20 6e 6f 74 20 63 6f 72 72 65 73 does not corres
54750 70 6f 6e 64 20 74 6f 20 61 6e 79 20 76 61 6c 69 pond to any vali
54760 64 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 d SQLite error c
54770 6f 64 65 2c 20 74 68 65 20 72 65 73 75 6c 74 73 ode, the results
54780 0d 0a 2a 2a 20 61 72 65 20 75 6e 64 65 66 69 6e ..** are undefin
54790 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 73 69 ed...**..** A si
547a0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 68 61 ngle database ha
547b0 6e 64 6c 65 20 6d 61 79 20 68 61 76 65 20 61 74 ndle may have at
547c0 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 77 most a single w
547d0 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 63 rite-ahead log c
547e0 61 6c 6c 62 61 63 6b 20 0d 0a 2a 2a 20 72 65 67 allback ..** reg
547f0 69 73 74 65 72 65 64 20 61 74 20 6f 6e 65 20 74 istered at one t
54800 69 6d 65 2e 20 5e 43 61 6c 6c 69 6e 67 20 5b 73 ime. ^Calling [s
54810 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 qlite3_wal_hook(
54820 29 5d 20 72 65 70 6c 61 63 65 73 20 61 6e 79 0d )] replaces any.
54830 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 .** previously r
54840 65 67 69 73 74 65 72 65 64 20 77 72 69 74 65 2d egistered write-
54850 61 68 65 61 64 20 6c 6f 67 20 63 61 6c 6c 62 61 ahead log callba
54860 63 6b 2e 20 5e 4e 6f 74 65 20 74 68 61 74 20 74 ck. ^Note that t
54870 68 65 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f he..** [sqlite3_
54880 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 wal_autocheckpoi
54890 6e 74 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20 nt()] interface
548a0 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 5b 77 61 6c and the..** [wal
548b0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 _autocheckpoint
548c0 70 72 61 67 6d 61 5d 20 62 6f 74 68 20 69 6e 76 pragma] both inv
548d0 6f 6b 65 20 5b 73 71 6c 69 74 65 33 5f 77 61 6c oke [sqlite3_wal
548e0 5f 68 6f 6f 6b 28 29 5d 20 61 6e 64 20 77 69 6c _hook()] and wil
548f0 6c 0d 0a 2a 2a 20 74 68 6f 73 65 20 6f 76 65 72 l..** those over
54900 77 72 69 74 65 20 61 6e 79 20 70 72 69 6f 72 20 write any prior
54910 5b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f [sqlite3_wal_hoo
54920 6b 28 29 5d 20 73 65 74 74 69 6e 67 73 2e 0d 0a k()] settings...
54930 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 */..SQLITE_API v
54940 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c oid *sqlite3_wal
54950 5f 68 6f 6f 6b 28 0d 0a 20 20 73 71 6c 69 74 65 _hook(.. sqlite
54960 33 2a 2c 20 0d 0a 20 20 69 6e 74 28 2a 29 28 76 3*, .. int(*)(v
54970 6f 69 64 20 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 oid *,sqlite3*,c
54980 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 2c onst char*,int),
54990 0d 0a 20 20 76 6f 69 64 2a 0d 0a 29 3b 0d 0a 0d .. void*..);...
549a0 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 ./*..** CAPI3REF
549b0 3a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 61 : Configure an a
549c0 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 0d 0a uto-checkpoint..
549d0 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b 73 71 6c **..** ^The [sql
549e0 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 ite3_wal_autoche
549f0 63 6b 70 6f 69 6e 74 28 44 2c 4e 29 5d 20 69 73 ckpoint(D,N)] is
54a00 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e a wrapper aroun
54a10 64 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 77 d..** [sqlite3_w
54a20 61 6c 5f 68 6f 6f 6b 28 29 5d 20 74 68 61 74 20 al_hook()] that
54a30 63 61 75 73 65 73 20 61 6e 79 20 64 61 74 61 62 causes any datab
54a40 61 73 65 20 6f 6e 20 5b 64 61 74 61 62 61 73 65 ase on [database
54a50 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 44 0d 0a connection] D..
54a60 2a 2a 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 ** to automatica
54a70 6c 6c 79 20 5b 63 68 65 63 6b 70 6f 69 6e 74 5d lly [checkpoint]
54a80 0d 0a 2a 2a 20 61 66 74 65 72 20 63 6f 6d 6d 69 ..** after commi
54a90 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 tting a transact
54aa0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 ion if there are
54ab0 20 4e 20 6f 72 0d 0a 2a 2a 20 6d 6f 72 65 20 66 N or..** more f
54ac0 72 61 6d 65 73 20 69 6e 20 74 68 65 20 5b 77 72 rames in the [wr
54ad0 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 5d 20 66 ite-ahead log] f
54ae0 69 6c 65 2e 20 20 5e 50 61 73 73 69 6e 67 20 7a ile. ^Passing z
54af0 65 72 6f 20 6f 72 20 0d 0a 2a 2a 20 61 20 6e 65 ero or ..** a ne
54b00 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 gative value as
54b10 74 68 65 20 6e 46 72 61 6d 65 20 70 61 72 61 6d the nFrame param
54b20 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 eter disables au
54b30 74 6f 6d 61 74 69 63 0d 0a 2a 2a 20 63 68 65 63 tomatic..** chec
54b40 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 kpoints entirely
54b50 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 63 ...**..** ^The c
54b60 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 allback register
54b70 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 ed by this funct
54b80 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 ion replaces any
54b90 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 existing callba
54ba0 63 6b 0d 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 ck..** registere
54bb0 64 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 d using [sqlite3
54bc0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 5d 2e 20 20 5e _wal_hook()]. ^
54bd0 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 Likewise, regist
54be0 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b ering a callback
54bf0 0d 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 ..** using [sqli
54c00 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 5d 20 te3_wal_hook()]
54c10 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 disables the aut
54c20 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e omatic checkpoin
54c30 74 20 6d 65 63 68 61 6e 69 73 6d 0d 0a 2a 2a 20 t mechanism..**
54c40 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 configured by th
54c50 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a is function...**
54c60 0d 0a 2a 2a 20 5e 54 68 65 20 5b 77 61 6c 5f 61 ..** ^The [wal_a
54c70 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 70 72 utocheckpoint pr
54c80 61 67 6d 61 5d 20 63 61 6e 20 62 65 20 75 73 65 agma] can be use
54c90 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 d to invoke this
54ca0 20 69 6e 74 65 72 66 61 63 65 0d 0a 2a 2a 20 66 interface..** f
54cb0 72 6f 6d 20 53 51 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a rom SQL...**..**
54cc0 20 5e 45 76 65 72 79 20 6e 65 77 20 5b 64 61 74 ^Every new [dat
54cd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
54ce0 5d 20 64 65 66 61 75 6c 74 73 20 74 6f 20 68 61 ] defaults to ha
54cf0 76 69 6e 67 20 74 68 65 20 61 75 74 6f 2d 63 68 ving the auto-ch
54d00 65 63 6b 70 6f 69 6e 74 0d 0a 2a 2a 20 65 6e 61 eckpoint..** ena
54d10 62 6c 65 64 20 77 69 74 68 20 61 20 74 68 72 65 bled with a thre
54d20 73 68 6f 6c 64 20 6f 66 20 31 30 30 30 20 6f 72 shold of 1000 or
54d30 20 5b 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 [SQLITE_DEFAULT
54d40 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f _WAL_AUTOCHECKPO
54d50 49 4e 54 5d 0d 0a 2a 2a 20 70 61 67 65 73 2e 20 INT]..** pages.
54d60 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 69 73 The use of this
54d70 20 69 6e 74 65 72 66 61 63 65 0d 0a 2a 2a 20 69 interface..** i
54d80 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 s only necessary
54d90 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 if the default
54da0 73 65 74 74 69 6e 67 20 69 73 20 66 6f 75 6e 64 setting is found
54db0 20 74 6f 20 62 65 20 73 75 62 6f 70 74 69 6d 61 to be suboptima
54dc0 6c 0d 0a 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 l..** for a part
54dd0 69 63 75 6c 61 72 20 61 70 70 6c 69 63 61 74 69 icular applicati
54de0 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f on...*/..SQLITE_
54df0 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
54e00 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 wal_autocheckpoi
54e10 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 nt(sqlite3 *db,
54e20 69 6e 74 20 4e 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a int N);..../*..*
54e30 2a 20 43 41 50 49 33 52 45 46 3a 20 43 68 65 63 * CAPI3REF: Chec
54e40 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61 73 kpoint a databas
54e50 65 0d 0a 2a 2a 0d 0a 2a 2a 20 5e 54 68 65 20 5b e..**..** ^The [
54e60 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 sqlite3_wal_chec
54e70 6b 70 6f 69 6e 74 28 44 2c 58 29 5d 20 69 6e 74 kpoint(D,X)] int
54e80 65 72 66 61 63 65 20 63 61 75 73 65 73 20 64 61 erface causes da
54e90 74 61 62 61 73 65 20 6e 61 6d 65 64 20 58 0d 0a tabase named X..
54ea0 2a 2a 20 6f 6e 20 5b 64 61 74 61 62 61 73 65 20 ** on [database
54eb0 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 44 20 74 6f connection] D to
54ec0 20 62 65 20 5b 63 68 65 63 6b 70 6f 69 6e 74 65 be [checkpointe
54ed0 64 5d 2e 20 20 5e 49 66 20 58 20 69 73 20 4e 55 d]. ^If X is NU
54ee0 4c 4c 20 6f 72 20 61 6e 0d 0a 2a 2a 20 65 6d 70 LL or an..** emp
54ef0 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 ty string, then
54f00 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 a checkpoint is
54f10 72 75 6e 20 6f 6e 20 61 6c 6c 20 64 61 74 61 62 run on all datab
54f20 61 73 65 73 20 6f 66 0d 0a 2a 2a 20 63 6f 6e 6e ases of..** conn
54f30 65 63 74 69 6f 6e 20 44 2e 20 20 5e 49 66 20 74 ection D. ^If t
54f40 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e he database conn
54f50 65 63 74 69 6f 6e 20 44 20 69 73 20 6e 6f 74 20 ection D is not
54f60 69 6e 0d 0a 2a 2a 20 5b 57 41 4c 20 7c 20 77 72 in..** [WAL | wr
54f70 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 6d 6f ite-ahead log mo
54f80 64 65 5d 20 74 68 65 6e 20 74 68 69 73 20 69 6e de] then this in
54f90 74 65 72 66 61 63 65 20 69 73 20 61 20 68 61 72 terface is a har
54fa0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a mless no-op...**
54fb0 0d 0a 2a 2a 20 5e 54 68 65 20 5b 77 61 6c 5f 63 ..** ^The [wal_c
54fc0 68 65 63 6b 70 6f 69 6e 74 20 70 72 61 67 6d 61 heckpoint pragma
54fd0 5d 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f ] can be used to
54fe0 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 69 6e 74 invoke this int
54ff0 65 72 66 61 63 65 0d 0a 2a 2a 20 66 72 6f 6d 20 erface..** from
55000 53 51 4c 2e 20 20 5e 54 68 65 20 5b 73 71 6c 69 SQL. ^The [sqli
55010 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 te3_wal_autochec
55020 6b 70 6f 69 6e 74 28 29 5d 20 69 6e 74 65 72 66 kpoint()] interf
55030 61 63 65 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 ace and the..**
55040 5b 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f [wal_autocheckpo
55050 69 6e 74 20 70 72 61 67 6d 61 5d 20 63 61 6e 20 int pragma] can
55060 62 65 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 be used to cause
55070 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 this interface
55080 74 6f 20 62 65 0d 0a 2a 2a 20 72 75 6e 20 77 68 to be..** run wh
55090 65 6e 65 76 65 72 20 74 68 65 20 57 41 4c 20 72 enever the WAL r
550a0 65 61 63 68 65 73 20 61 20 63 65 72 74 61 69 6e eaches a certain
550b0 20 73 69 7a 65 20 74 68 72 65 73 68 6f 6c 64 2e size threshold.
550c0 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 ..**..** See als
550d0 6f 3a 20 5b 73 71 6c 69 74 65 33 5f 77 61 6c 5f o: [sqlite3_wal_
550e0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 5d checkpoint_v2()]
550f0 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
55100 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c int sqlite3_wal
55110 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 _checkpoint(sqli
55120 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 te3 *db, const c
55130 68 61 72 20 2a 7a 44 62 29 3b 0d 0a 0d 0a 2f 2a har *zDb);..../*
55140 0d 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 ..** CAPI3REF: C
55150 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 heckpoint a data
55160 62 61 73 65 0d 0a 2a 2a 0d 0a 2a 2a 20 52 75 6e base..**..** Run
55170 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 a checkpoint op
55180 65 72 61 74 69 6f 6e 20 6f 6e 20 57 41 4c 20 64 eration on WAL d
55190 61 74 61 62 61 73 65 20 7a 44 62 20 61 74 74 61 atabase zDb atta
551a0 63 68 65 64 20 74 6f 20 64 61 74 61 62 61 73 65 ched to database
551b0 20 0d 0a 2a 2a 20 68 61 6e 64 6c 65 20 64 62 2e ..** handle db.
551c0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 6f 70 The specific op
551d0 65 72 61 74 69 6f 6e 20 69 73 20 64 65 74 65 72 eration is deter
551e0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 76 61 6c mined by the val
551f0 75 65 20 6f 66 20 74 68 65 20 0d 0a 2a 2a 20 65 ue of the ..** e
55200 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 3a 0d Mode parameter:.
55210 0a 2a 2a 0d 0a 2a 2a 20 3c 64 6c 3e 0d 0a 2a 2a .**..** <dl>..**
55220 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 45 43 <dt>SQLITE_CHEC
55230 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3c 64 KPOINT_PASSIVE<d
55240 64 3e 0d 0a 2a 2a 20 20 20 43 68 65 63 6b 70 6f d>..** Checkpo
55250 69 6e 74 20 61 73 20 6d 61 6e 79 20 66 72 61 6d int as many fram
55260 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 77 es as possible w
55270 69 74 68 6f 75 74 20 77 61 69 74 69 6e 67 20 66 ithout waiting f
55280 6f 72 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 or any database
55290 0d 0a 2a 2a 20 20 20 72 65 61 64 65 72 73 20 6f ..** readers o
552a0 72 20 77 72 69 74 65 72 73 20 74 6f 20 66 69 6e r writers to fin
552b0 69 73 68 2e 20 53 79 6e 63 20 74 68 65 20 64 62 ish. Sync the db
552c0 20 66 69 6c 65 20 69 66 20 61 6c 6c 20 66 72 61 file if all fra
552d0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0d 0a mes in the log..
552e0 2a 2a 20 20 20 61 72 65 20 63 68 65 63 6b 70 6f ** are checkpo
552f0 69 6e 74 65 64 2e 20 54 68 69 73 20 6d 6f 64 65 inted. This mode
55300 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 is the same as
55310 63 61 6c 6c 69 6e 67 20 0d 0a 2a 2a 20 20 20 73 calling ..** s
55320 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b qlite3_wal_check
55330 70 6f 69 6e 74 28 29 2e 20 54 68 65 20 62 75 73 point(). The bus
55340 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 y-handler callba
55350 63 6b 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f ck is never invo
55360 6b 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 64 74 ked...**..** <dt
55370 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 >SQLITE_CHECKPOI
55380 4e 54 5f 46 55 4c 4c 3c 64 64 3e 0d 0a 2a 2a 20 NT_FULL<dd>..**
55390 20 20 54 68 69 73 20 6d 6f 64 65 20 62 6c 6f 63 This mode bloc
553a0 6b 73 20 28 63 61 6c 6c 73 20 74 68 65 20 62 75 ks (calls the bu
553b0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 sy-handler callb
553c0 61 63 6b 29 20 75 6e 74 69 6c 20 74 68 65 72 65 ack) until there
553d0 20 69 73 20 6e 6f 0d 0a 2a 2a 20 20 20 64 61 74 is no..** dat
553e0 61 62 61 73 65 20 77 72 69 74 65 72 20 61 6e 64 abase writer and
553f0 20 61 6c 6c 20 72 65 61 64 65 72 73 20 61 72 65 all readers are
55400 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 reading from th
55410 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 64 61 e most recent da
55420 74 61 62 61 73 65 0d 0a 2a 2a 20 20 20 73 6e 61 tabase..** sna
55430 70 73 68 6f 74 2e 20 49 74 20 74 68 65 6e 20 63 pshot. It then c
55440 68 65 63 6b 70 6f 69 6e 74 73 20 61 6c 6c 20 66 heckpoints all f
55450 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 rames in the log
55460 20 66 69 6c 65 20 61 6e 64 20 73 79 6e 63 73 20 file and syncs
55470 74 68 65 0d 0a 2a 2a 20 20 20 64 61 74 61 62 61 the..** databa
55480 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 se file. This ca
55490 6c 6c 20 62 6c 6f 63 6b 73 20 64 61 74 61 62 61 ll blocks databa
554a0 73 65 20 77 72 69 74 65 72 73 20 77 68 69 6c 65 se writers while
554b0 20 69 74 20 69 73 20 72 75 6e 6e 69 6e 67 2c 0d it is running,.
554c0 0a 2a 2a 20 20 20 62 75 74 20 6e 6f 74 20 64 61 .** but not da
554d0 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2e 0d tabase readers..
554e0 0a 2a 2a 0d 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 .**..** <dt>SQLI
554f0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 TE_CHECKPOINT_RE
55500 53 54 41 52 54 3c 64 64 3e 0d 0a 2a 2a 20 20 20 START<dd>..**
55510 54 68 69 73 20 6d 6f 64 65 20 77 6f 72 6b 73 20 This mode works
55520 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 the same way as
55530 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e SQLITE_CHECKPOIN
55540 54 5f 46 55 4c 4c 2c 20 65 78 63 65 70 74 20 61 T_FULL, except a
55550 66 74 65 72 20 0d 0a 2a 2a 20 20 20 63 68 65 63 fter ..** chec
55560 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 6c 6f kpointing the lo
55570 67 20 66 69 6c 65 20 69 74 20 62 6c 6f 63 6b 73 g file it blocks
55580 20 28 63 61 6c 6c 73 20 74 68 65 20 62 75 73 79 (calls the busy
55590 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 -handler callbac
555a0 6b 29 0d 0a 2a 2a 20 20 20 75 6e 74 69 6c 20 61 k)..** until a
555b0 6c 6c 20 72 65 61 64 65 72 73 20 61 72 65 20 72 ll readers are r
555c0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 eading from the
555d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e database file on
555e0 6c 79 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 ly. This ensures
555f0 20 0d 0a 2a 2a 20 20 20 74 68 61 74 20 74 68 65 ..** that the
55600 20 6e 65 78 74 20 63 6c 69 65 6e 74 20 74 6f 20 next client to
55610 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 write to the dat
55620 61 62 61 73 65 20 66 69 6c 65 20 72 65 73 74 61 abase file resta
55630 72 74 73 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 rts the log file
55640 20 0d 0a 2a 2a 20 20 20 66 72 6f 6d 20 74 68 65 ..** from the
55650 20 62 65 67 69 6e 6e 69 6e 67 2e 20 54 68 69 73 beginning. This
55660 20 63 61 6c 6c 20 62 6c 6f 63 6b 73 20 64 61 74 call blocks dat
55670 61 62 61 73 65 20 77 72 69 74 65 72 73 20 77 68 abase writers wh
55680 69 6c 65 20 69 74 20 69 73 20 72 75 6e 6e 69 6e ile it is runnin
55690 67 2c 0d 0a 2a 2a 20 20 20 62 75 74 20 6e 6f 74 g,..** but not
556a0 20 64 61 74 61 62 61 73 65 20 72 65 61 64 65 72 database reader
556b0 73 2e 0d 0a 2a 2a 20 3c 2f 64 6c 3e 0d 0a 2a 2a s...** </dl>..**
556c0 0d 0a 2a 2a 20 49 66 20 70 6e 4c 6f 67 20 69 73 ..** If pnLog is
556d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 not NULL, then
556e0 2a 70 6e 4c 6f 67 20 69 73 20 73 65 74 20 74 6f *pnLog is set to
556f0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 the total numbe
55700 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 0d 0a r of frames in..
55710 2a 2a 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 ** the log file
55720 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 before returning
55730 2e 20 49 66 20 70 6e 43 6b 70 74 20 69 73 20 6e . If pnCkpt is n
55740 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 ot NULL, then *p
55750 6e 43 6b 70 74 20 69 73 20 73 65 74 20 74 6f 0d nCkpt is set to.
55760 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 .** the total nu
55770 6d 62 65 72 20 6f 66 20 63 68 65 63 6b 70 6f 69 mber of checkpoi
55780 6e 74 65 64 20 66 72 61 6d 65 73 20 28 69 6e 63 nted frames (inc
55790 6c 75 64 69 6e 67 20 61 6e 79 20 74 68 61 74 20 luding any that
557a0 77 65 72 65 20 61 6c 72 65 61 64 79 0d 0a 2a 2a were already..**
557b0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 77 68 checkpointed wh
557c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e en this function
557d0 20 69 73 20 63 61 6c 6c 65 64 29 2e 20 2a 70 6e is called). *pn
557e0 4c 6f 67 20 61 6e 64 20 2a 70 6e 43 6b 70 74 20 Log and *pnCkpt
557f0 6d 61 79 20 62 65 0d 0a 2a 2a 20 70 6f 70 75 6c may be..** popul
55800 61 74 65 64 20 65 76 65 6e 20 69 66 20 73 71 6c ated even if sql
55810 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f ite3_wal_checkpo
55820 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e 73 int_v2() returns
55830 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 other than SQLI
55840 54 45 5f 4f 4b 2e 0d 0a 2a 2a 20 49 66 20 6e 6f TE_OK...** If no
55850 20 76 61 6c 75 65 73 20 61 72 65 20 61 76 61 69 values are avai
55860 6c 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 lable because of
55870 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 65 79 20 an error, they
55880 61 72 65 20 62 6f 74 68 20 73 65 74 20 74 6f 20 are both set to
55890 2d 31 0d 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 -1..** before re
558a0 74 75 72 6e 69 6e 67 20 74 6f 20 63 6f 6d 6d 75 turning to commu
558b0 6e 69 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 nicate this to t
558c0 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a 2a 0d 0a he caller...**..
558d0 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 6f 62 74 ** All calls obt
558e0 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 ain an exclusive
558f0 20 22 63 68 65 63 6b 70 6f 69 6e 74 22 20 6c 6f "checkpoint" lo
55900 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 ck on the databa
55910 73 65 20 66 69 6c 65 2e 20 49 66 0d 0a 2a 2a 20 se file. If..**
55920 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 any other proces
55930 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 63 s is running a c
55940 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 heckpoint operat
55950 69 6f 6e 20 61 74 20 74 68 65 20 73 61 6d 65 20 ion at the same
55960 74 69 6d 65 2c 20 74 68 65 20 0d 0a 2a 2a 20 6c time, the ..** l
55970 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 ock cannot be ob
55980 74 61 69 6e 65 64 20 61 6e 64 20 53 51 4c 49 54 tained and SQLIT
55990 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e E_BUSY is return
559a0 65 64 2e 20 45 76 65 6e 20 69 66 20 74 68 65 72 ed. Even if ther
559b0 65 20 69 73 20 61 20 0d 0a 2a 2a 20 62 75 73 79 e is a ..** busy
559c0 2d 68 61 6e 64 6c 65 72 20 63 6f 6e 66 69 67 75 -handler configu
559d0 72 65 64 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 red, it will not
559e0 20 62 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 be invoked in t
559f0 68 69 73 20 63 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a his case...**..*
55a00 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 48 45 * The SQLITE_CHE
55a10 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 20 61 6e 64 CKPOINT_FULL and
55a20 20 52 45 53 54 41 52 54 20 6d 6f 64 65 73 20 61 RESTART modes a
55a30 6c 73 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 lso obtain the e
55a40 78 63 6c 75 73 69 76 65 20 0d 0a 2a 2a 20 22 77 xclusive ..** "w
55a50 72 69 74 65 72 22 20 6c 6f 63 6b 20 6f 6e 20 74 riter" lock on t
55a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
55a70 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 72 20 . If the writer
55a80 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f lock cannot be o
55a90 62 74 61 69 6e 65 64 0d 0a 2a 2a 20 69 6d 6d 65 btained..** imme
55aa0 64 69 61 74 65 6c 79 2c 20 61 6e 64 20 61 20 62 diately, and a b
55ab0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 63 usy-handler is c
55ac0 6f 6e 66 69 67 75 72 65 64 2c 20 69 74 20 69 73 onfigured, it is
55ad0 20 69 6e 76 6f 6b 65 64 20 61 6e 64 20 74 68 65 invoked and the
55ae0 20 77 72 69 74 65 72 0d 0a 2a 2a 20 6c 6f 63 6b writer..** lock
55af0 20 72 65 74 72 69 65 64 20 75 6e 74 69 6c 20 65 retried until e
55b00 69 74 68 65 72 20 74 68 65 20 62 75 73 79 2d 68 ither the busy-h
55b10 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20 30 andler returns 0
55b20 20 6f 72 20 74 68 65 20 6c 6f 63 6b 20 69 73 0d or the lock is.
55b30 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 .** successfully
55b40 20 6f 62 74 61 69 6e 65 64 2e 20 54 68 65 20 62 obtained. The b
55b50 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 61 usy-handler is a
55b60 6c 73 6f 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c lso invoked whil
55b70 65 20 77 61 69 74 69 6e 67 20 66 6f 72 0d 0a 2a e waiting for..*
55b80 2a 20 64 61 74 61 62 61 73 65 20 72 65 61 64 65 * database reade
55b90 72 73 20 61 73 20 64 65 73 63 72 69 62 65 64 20 rs as described
55ba0 61 62 6f 76 65 2e 20 49 66 20 74 68 65 20 62 75 above. If the bu
55bb0 73 79 2d 68 61 6e 64 6c 65 72 20 72 65 74 75 72 sy-handler retur
55bc0 6e 73 20 30 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 ns 0 before..**
55bd0 74 68 65 20 77 72 69 74 65 72 20 6c 6f 63 6b 20 the writer lock
55be0 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 72 20 77 is obtained or w
55bf0 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 hile waiting for
55c00 20 64 61 74 61 62 61 73 65 20 72 65 61 64 65 72 database reader
55c10 73 2c 20 74 68 65 0d 0a 2a 2a 20 63 68 65 63 6b s, the..** check
55c20 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 point operation
55c30 70 72 6f 63 65 65 64 73 20 66 72 6f 6d 20 74 68 proceeds from th
55c40 61 74 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 at point in the
55c50 73 61 6d 65 20 77 61 79 20 61 73 20 0d 0a 2a 2a same way as ..**
55c60 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 SQLITE_CHECKPOI
55c70 4e 54 5f 50 41 53 53 49 56 45 20 2d 20 63 68 65 NT_PASSIVE - che
55c80 63 6b 70 6f 69 6e 74 69 6e 67 20 61 73 20 6d 61 ckpointing as ma
55c90 6e 79 20 66 72 61 6d 65 73 20 61 73 20 70 6f 73 ny frames as pos
55ca0 73 69 62 6c 65 20 0d 0a 2a 2a 20 77 69 74 68 6f sible ..** witho
55cb0 75 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 79 20 ut blocking any
55cc0 66 75 72 74 68 65 72 2e 20 53 51 4c 49 54 45 5f further. SQLITE_
55cd0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 BUSY is returned
55ce0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0d 0a in this case...
55cf0 2a 2a 0d 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 **..** If parame
55d00 74 65 72 20 7a 44 62 20 69 73 20 4e 55 4c 4c 20 ter zDb is NULL
55d10 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a or points to a z
55d20 65 72 6f 20 6c 65 6e 67 74 68 20 73 74 72 69 6e ero length strin
55d30 67 2c 20 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 g, then the..**
55d40 73 70 65 63 69 66 69 65 64 20 6f 70 65 72 61 74 specified operat
55d50 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64 ion is attempted
55d60 20 6f 6e 20 61 6c 6c 20 57 41 4c 20 64 61 74 61 on all WAL data
55d70 62 61 73 65 73 2e 20 49 6e 20 74 68 69 73 20 63 bases. In this c
55d80 61 73 65 20 74 68 65 0d 0a 2a 2a 20 76 61 6c 75 ase the..** valu
55d90 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 75 es written to ou
55da0 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 tput parameters
55db0 2a 70 6e 4c 6f 67 20 61 6e 64 20 2a 70 6e 43 6b *pnLog and *pnCk
55dc0 70 74 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 pt are undefined
55dd0 2e 20 49 66 20 0d 0a 2a 2a 20 61 6e 20 53 51 4c . If ..** an SQL
55de0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 ITE_BUSY error i
55df0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 s encountered wh
55e00 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e en processing on
55e10 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 e or more of the
55e20 20 0d 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 57 ..** attached W
55e30 41 4c 20 64 61 74 61 62 61 73 65 73 2c 20 74 68 AL databases, th
55e40 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 e operation is s
55e50 74 69 6c 6c 20 61 74 74 65 6d 70 74 65 64 20 6f till attempted o
55e60 6e 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 n any remaining
55e70 0d 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 ..** attached da
55e80 74 61 62 61 73 65 73 20 61 6e 64 20 53 51 4c 49 tabases and SQLI
55e90 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 TE_BUSY is retur
55ea0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 ned to the calle
55eb0 72 2e 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20 r. If any other
55ec0 0d 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 ..** error occur
55ed0 73 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 s while processi
55ee0 6e 67 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 ng an attached d
55ef0 61 74 61 62 61 73 65 2c 20 70 72 6f 63 65 73 73 atabase, process
55f00 69 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 ing is abandoned
55f10 20 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 72 ..** and the er
55f20 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 ror code returne
55f30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 d to the caller
55f40 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 66 20 immediately. If
55f50 6e 6f 20 65 72 72 6f 72 20 0d 0a 2a 2a 20 28 53 no error ..** (S
55f60 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6f 74 QLITE_BUSY or ot
55f70 68 65 72 77 69 73 65 29 20 69 73 20 65 6e 63 6f herwise) is enco
55f80 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 70 72 untered while pr
55f90 6f 63 65 73 73 69 6e 67 20 74 68 65 20 61 74 74 ocessing the att
55fa0 61 63 68 65 64 20 0d 0a 2a 2a 20 64 61 74 61 62 ached ..** datab
55fb0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 ases, SQLITE_OK
55fc0 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a is returned...**
55fd0 0d 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 ..** If database
55fe0 20 7a 44 62 20 69 73 20 74 68 65 20 6e 61 6d 65 zDb is the name
55ff0 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 of an attached
56000 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 database that is
56010 20 6e 6f 74 20 69 6e 20 57 41 4c 0d 0a 2a 2a 20 not in WAL..**
56020 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 mode, SQLITE_OK
56030 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 is returned and
56040 62 6f 74 68 20 2a 70 6e 4c 6f 67 20 61 6e 64 20 both *pnLog and
56050 2a 70 6e 43 6b 70 74 20 73 65 74 20 74 6f 20 2d *pnCkpt set to -
56060 31 2e 20 49 66 0d 0a 2a 2a 20 7a 44 62 20 69 73 1. If..** zDb is
56070 20 6e 6f 74 20 4e 55 4c 4c 20 28 6f 72 20 61 20 not NULL (or a
56080 7a 65 72 6f 20 6c 65 6e 67 74 68 20 73 74 72 69 zero length stri
56090 6e 67 29 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 ng) and is not t
560a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79 0d 0a he name of any..
560b0 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 ** attached data
560c0 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 base, SQLITE_ERR
560d0 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 OR is returned t
560e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a o the caller...*
560f0 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
56100 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 t sqlite3_wal_ch
56110 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0d 0a 20 20 eckpoint_v2(..
56120 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 sqlite3 *db,
56130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
56140 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 /* Database hand
56150 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 le */.. const c
56160 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 har *zDb,
56170 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 /* Name
56180 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 of attached dat
56190 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 abase (or NULL)
561a0 2a 2f 0d 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c */.. int eMode,
561b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
561c0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f /* SQLITE_
561d0 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c CHECKPOINT_* val
561e0 75 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e ue */.. int *pn
561f0 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 Log,
56200 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
56210 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 Size of WAL log
56220 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0d 0a 20 in frames */..
56230 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 int *pnCkpt
56240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
56250 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e /* OUT: Total n
56260 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 umber of frames
56270 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0d checkpointed */.
56280 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 .);..../*..** CA
56290 50 49 33 52 45 46 3a 20 43 68 65 63 6b 70 6f 69 PI3REF: Checkpoi
562a0 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 70 61 72 nt operation par
562b0 61 6d 65 74 65 72 73 0d 0a 2a 2a 0d 0a 2a 2a 20 ameters..**..**
562c0 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 These constants
562d0 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 can be used as t
562e0 68 65 20 33 72 64 20 70 61 72 61 6d 65 74 65 72 he 3rd parameter
562f0 20 74 6f 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 to..** [sqlite3
56300 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f _wal_checkpoint_
56310 76 32 28 29 5d 2e 20 20 53 65 65 20 74 68 65 20 v2()]. See the
56320 5b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 [sqlite3_wal_che
56330 63 6b 70 6f 69 6e 74 5f 76 32 28 29 5d 0d 0a 2a ckpoint_v2()]..*
56340 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 * documentation
56350 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 for additional i
56360 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 nformation about
56370 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 61 6e 64 the meaning and
56380 20 75 73 65 20 6f 66 0d 0a 2a 2a 20 65 61 63 68 use of..** each
56390 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 of these values
563a0 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ...*/..#define S
563b0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 QLITE_CHECKPOINT
563c0 5f 50 41 53 53 49 56 45 20 30 0d 0a 23 64 65 66 _PASSIVE 0..#def
563d0 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 45 43 4b ine SQLITE_CHECK
563e0 50 4f 49 4e 54 5f 46 55 4c 4c 20 20 20 20 31 0d POINT_FULL 1.
563f0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
56400 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 CHECKPOINT_RESTA
56410 52 54 20 32 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 RT 2..../*..** C
56420 41 50 49 33 52 45 46 3a 20 56 69 72 74 75 61 6c API3REF: Virtual
56430 20 54 61 62 6c 65 20 49 6e 74 65 72 66 61 63 65 Table Interface
56440 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a Configuration..
56450 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 **..** This func
56460 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c tion may be call
56470 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65 ed by either the
56480 20 5b 78 43 6f 6e 6e 65 63 74 5d 20 6f 72 20 5b [xConnect] or [
56490 78 43 72 65 61 74 65 5d 20 6d 65 74 68 6f 64 0d xCreate] method.
564a0 0a 2a 2a 20 6f 66 20 61 20 5b 76 69 72 74 75 61 .** of a [virtua
564b0 6c 20 74 61 62 6c 65 5d 20 69 6d 70 6c 65 6d 65 l table] impleme
564c0 6e 74 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 66 69 ntation to confi
564d0 67 75 72 65 0d 0a 2a 2a 20 76 61 72 69 6f 75 73 gure..** various
564e0 20 66 61 63 65 74 73 20 6f 66 20 74 68 65 20 76 facets of the v
564f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 irtual table int
56500 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 erface...**..**
56510 49 66 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 If this interfac
56520 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 75 74 e is invoked out
56530 73 69 64 65 20 74 68 65 20 63 6f 6e 74 65 78 74 side the context
56540 20 6f 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74 20 of an xConnect
56550 6f 72 0d 0a 2a 2a 20 78 43 72 65 61 74 65 20 76 or..** xCreate v
56560 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 irtual table met
56570 68 6f 64 20 74 68 65 6e 20 74 68 65 20 62 65 68 hod then the beh
56580 61 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e avior is undefin
56590 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 74 20 70 ed...**..** At p
565a0 72 65 73 65 6e 74 2c 20 74 68 65 72 65 20 69 73 resent, there is
565b0 20 6f 6e 6c 79 20 6f 6e 65 20 6f 70 74 69 6f 6e only one option
565c0 20 74 68 61 74 20 6d 61 79 20 62 65 20 63 6f 6e that may be con
565d0 66 69 67 75 72 65 64 20 75 73 69 6e 67 0d 0a 2a figured using..*
565e0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e * this function.
565f0 20 28 53 65 65 20 5b 53 51 4c 49 54 45 5f 56 54 (See [SQLITE_VT
56600 41 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 AB_CONSTRAINT_SU
56610 50 50 4f 52 54 5d 2e 29 20 20 46 75 72 74 68 65 PPORT].) Furthe
56620 72 20 6f 70 74 69 6f 6e 73 0d 0a 2a 2a 20 6d 61 r options..** ma
56630 79 20 62 65 20 61 64 64 65 64 20 69 6e 20 74 68 y be added in th
56640 65 20 66 75 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 53 e future...*/..S
56650 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
56660 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 lite3_vtab_confi
56670 67 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 20 g(sqlite3*, int
56680 6f 70 2c 20 2e 2e 2e 29 3b 0d 0a 0d 0a 2f 2a 0d op, ...);..../*.
56690 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 56 69 .** CAPI3REF: Vi
566a0 72 74 75 61 6c 20 54 61 62 6c 65 20 43 6f 6e 66 rtual Table Conf
566b0 69 67 75 72 61 74 69 6f 6e 20 4f 70 74 69 6f 6e iguration Option
566c0 73 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 s..**..** These
566d0 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68 macros define th
566e0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6f 6e e various option
566f0 73 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 5b 73 71 s to the..** [sq
56700 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 lite3_vtab_confi
56710 67 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20 74 g()] interface t
56720 68 61 74 20 5b 76 69 72 74 75 61 6c 20 74 61 62 hat [virtual tab
56730 6c 65 5d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 le] implementati
56740 6f 6e 73 0d 0a 2a 2a 20 63 61 6e 20 75 73 65 20 ons..** can use
56750 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 61 6e 64 to customize and
56760 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 69 72 20 optimize their
56770 62 65 68 61 76 69 6f 72 2e 0d 0a 2a 2a 0d 0a 2a behavior...**..*
56780 2a 20 3c 64 6c 3e 0d 0a 2a 2a 20 3c 64 74 3e 53 * <dl>..** <dt>S
56790 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f 4e 53 54 QLITE_VTAB_CONST
567a0 52 41 49 4e 54 5f 53 55 50 50 4f 52 54 0d 0a 2a RAINT_SUPPORT..*
567b0 2a 20 3c 64 64 3e 43 61 6c 6c 73 20 6f 66 20 74 * <dd>Calls of t
567c0 68 65 20 66 6f 72 6d 0d 0a 2a 2a 20 5b 73 71 6c he form..** [sql
567d0 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 ite3_vtab_config
567e0 5d 28 64 62 2c 53 51 4c 49 54 45 5f 56 54 41 42 ](db,SQLITE_VTAB
567f0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 _CONSTRAINT_SUPP
56800 4f 52 54 2c 58 29 20 61 72 65 20 73 75 70 70 6f ORT,X) are suppo
56810 72 74 65 64 2c 0d 0a 2a 2a 20 77 68 65 72 65 20 rted,..** where
56820 58 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e X is an integer.
56830 20 20 49 66 20 58 20 69 73 20 7a 65 72 6f 2c 20 If X is zero,
56840 74 68 65 6e 20 74 68 65 20 5b 76 69 72 74 75 61 then the [virtua
56850 6c 20 74 61 62 6c 65 5d 20 77 68 6f 73 65 0d 0a l table] whose..
56860 2a 2a 20 5b 78 43 72 65 61 74 65 5d 20 6f 72 20 ** [xCreate] or
56870 5b 78 43 6f 6e 6e 65 63 74 5d 20 6d 65 74 68 6f [xConnect] metho
56880 64 20 69 6e 76 6f 6b 65 64 20 5b 73 71 6c 69 74 d invoked [sqlit
56890 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28 29 e3_vtab_config()
568a0 5d 20 64 6f 65 73 20 6e 6f 74 0d 0a 2a 2a 20 73 ] does not..** s
568b0 75 70 70 6f 72 74 20 63 6f 6e 73 74 72 61 69 6e upport constrain
568c0 74 73 2e 20 20 49 6e 20 74 68 69 73 20 63 6f 6e ts. In this con
568d0 66 69 67 75 72 61 74 69 6f 6e 20 28 77 68 69 63 figuration (whic
568e0 68 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 h is the default
568f0 29 20 69 66 0d 0a 2a 2a 20 61 20 63 61 6c 6c 20 ) if..** a call
56900 74 6f 20 74 68 65 20 5b 78 55 70 64 61 74 65 5d to the [xUpdate]
56910 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 method returns
56920 5b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 [SQLITE_CONSTRAI
56930 4e 54 5d 2c 20 74 68 65 6e 20 74 68 65 20 65 6e NT], then the en
56940 74 69 72 65 0d 0a 2a 2a 20 73 74 61 74 65 6d 65 tire..** stateme
56950 6e 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 nt is rolled bac
56960 6b 20 61 73 20 69 66 20 5b 4f 4e 20 43 4f 4e 46 k as if [ON CONF
56970 4c 49 43 54 20 7c 20 4f 52 20 41 42 4f 52 54 5d LICT | OR ABORT]
56980 20 68 61 64 20 62 65 65 6e 0d 0a 2a 2a 20 73 70 had been..** sp
56990 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 ecified as part
569a0 6f 66 20 74 68 65 20 75 73 65 72 73 20 53 51 4c of the users SQL
569b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 67 61 statement, rega
569c0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 61 63 rdless of the ac
569d0 74 75 61 6c 0d 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 tual..** ON CONF
569e0 4c 49 43 54 20 6d 6f 64 65 20 73 70 65 63 69 66 LICT mode specif
569f0 69 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 ied...**..** If
56a00 58 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 X is non-zero, t
56a10 68 65 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 hen the virtual
56a20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 table implementa
56a30 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 0d tion guarantees.
56a40 0a 2a 2a 20 74 68 61 74 20 69 66 20 5b 78 55 70 .** that if [xUp
56a50 64 61 74 65 5d 20 72 65 74 75 72 6e 73 20 5b 53 date] returns [S
56a60 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
56a70 5d 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f ], it will do so
56a80 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 61 6e 79 20 before..** any
56a90 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f modifications to
56aa0 20 69 6e 74 65 72 6e 61 6c 20 6f 72 20 70 65 72 internal or per
56ab0 73 69 73 74 65 6e 74 20 64 61 74 61 20 73 74 72 sistent data str
56ac0 75 63 74 75 72 65 73 20 68 61 76 65 20 62 65 65 uctures have bee
56ad0 6e 20 6d 61 64 65 2e 0d 0a 2a 2a 20 49 66 20 74 n made...** If t
56ae0 68 65 20 5b 4f 4e 20 43 4f 4e 46 4c 49 43 54 5d he [ON CONFLICT]
56af0 20 6d 6f 64 65 20 69 73 20 41 42 4f 52 54 2c 20 mode is ABORT,
56b00 46 41 49 4c 2c 20 49 47 4e 4f 52 45 20 6f 72 20 FAIL, IGNORE or
56b10 52 4f 4c 4c 42 41 43 4b 2c 20 53 51 4c 69 74 65 ROLLBACK, SQLite
56b20 20 0d 0a 2a 2a 20 69 73 20 61 62 6c 65 20 74 6f ..** is able to
56b30 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 73 74 61 roll back a sta
56b40 74 65 6d 65 6e 74 20 6f 72 20 64 61 74 61 62 61 tement or databa
56b50 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 se transaction,
56b60 61 6e 64 20 61 62 61 6e 64 6f 6e 0d 0a 2a 2a 20 and abandon..**
56b70 6f 72 20 63 6f 6e 74 69 6e 75 65 20 70 72 6f 63 or continue proc
56b80 65 73 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 essing the curre
56b90 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 nt SQL statement
56ba0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e as appropriate.
56bb0 20 0d 0a 2a 2a 20 49 66 20 74 68 65 20 4f 4e 20 ..** If the ON
56bc0 43 4f 4e 46 4c 49 43 54 20 6d 6f 64 65 20 69 73 CONFLICT mode is
56bd0 20 52 45 50 4c 41 43 45 20 61 6e 64 20 74 68 65 REPLACE and the
56be0 20 5b 78 55 70 64 61 74 65 5d 20 6d 65 74 68 6f [xUpdate] metho
56bf0 64 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 5b 53 d returns..** [S
56c00 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
56c10 5d 2c 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 ], SQLite handle
56c20 73 20 74 68 69 73 20 61 73 20 69 66 20 74 68 65 s this as if the
56c30 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 6d 6f 64 ON CONFLICT mod
56c40 65 0d 0a 2a 2a 20 68 61 64 20 62 65 65 6e 20 41 e..** had been A
56c50 42 4f 52 54 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 56 69 BORT...**..** Vi
56c60 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c rtual table impl
56c70 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 68 61 74 ementations that
56c80 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f are required to
56c90 20 68 61 6e 64 6c 65 20 4f 52 20 52 45 50 4c 41 handle OR REPLA
56ca0 43 45 0d 0a 2a 2a 20 6d 75 73 74 20 64 6f 20 73 CE..** must do s
56cb0 6f 20 77 69 74 68 69 6e 20 74 68 65 20 5b 78 55 o within the [xU
56cc0 70 64 61 74 65 5d 20 6d 65 74 68 6f 64 2e 20 49 pdate] method. I
56cd0 66 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 f a call to the
56ce0 0d 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 76 74 ..** [sqlite3_vt
56cf0 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 29 ab_on_conflict()
56d00 5d 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 ] function indic
56d10 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 75 ates that the cu
56d20 72 72 65 6e 74 20 4f 4e 20 0d 0a 2a 2a 20 43 4f rrent ON ..** CO
56d30 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 69 73 NFLICT policy is
56d40 20 52 45 50 4c 41 43 45 2c 20 74 68 65 20 76 69 REPLACE, the vi
56d50 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c rtual table impl
56d60 65 6d 65 6e 74 61 74 69 6f 6e 20 73 68 6f 75 6c ementation shoul
56d70 64 20 0d 0a 2a 2a 20 73 69 6c 65 6e 74 6c 79 20 d ..** silently
56d80 72 65 70 6c 61 63 65 20 74 68 65 20 61 70 70 72 replace the appr
56d90 6f 70 72 69 61 74 65 20 72 6f 77 73 20 77 69 74 opriate rows wit
56da0 68 69 6e 20 74 68 65 20 78 55 70 64 61 74 65 20 hin the xUpdate
56db0 63 61 6c 6c 62 61 63 6b 20 61 6e 64 0d 0a 2a 2a callback and..**
56dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
56dd0 4b 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 K. Or, if this i
56de0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 s not possible,
56df0 69 74 20 6d 61 79 20 72 65 74 75 72 6e 0d 0a 2a it may return..*
56e00 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 * SQLITE_CONSTRA
56e10 49 4e 54 2c 20 69 6e 20 77 68 69 63 68 20 63 61 INT, in which ca
56e20 73 65 20 53 51 4c 69 74 65 20 66 61 6c 6c 73 20 se SQLite falls
56e30 62 61 63 6b 20 74 6f 20 4f 52 20 41 42 4f 52 54 back to OR ABORT
56e40 20 0d 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 ..** constraint
56e50 20 68 61 6e 64 6c 69 6e 67 2e 0d 0a 2a 2a 20 3c handling...** <
56e60 2f 64 6c 3e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e /dl>..*/..#defin
56e70 65 20 53 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f e SQLITE_VTAB_CO
56e80 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f 52 54 NSTRAINT_SUPPORT
56e90 20 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 1..../*..** CAP
56ea0 49 33 52 45 46 3a 20 44 65 74 65 72 6d 69 6e 65 I3REF: Determine
56eb0 20 54 68 65 20 56 69 72 74 75 61 6c 20 54 61 62 The Virtual Tab
56ec0 6c 65 20 43 6f 6e 66 6c 69 63 74 20 50 6f 6c 69 le Conflict Poli
56ed0 63 79 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 cy..**..** This
56ee0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c function may onl
56ef0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d y be called from
56f00 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 20 74 within a call t
56f10 6f 20 74 68 65 20 5b 78 55 70 64 61 74 65 5d 20 o the [xUpdate]
56f20 6d 65 74 68 6f 64 0d 0a 2a 2a 20 6f 66 20 61 20 method..** of a
56f30 5b 76 69 72 74 75 61 6c 20 74 61 62 6c 65 5d 20 [virtual table]
56f40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 implementation f
56f50 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 or an INSERT or
56f60 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e UPDATE operation
56f70 2e 20 5e 54 68 65 0d 0a 2a 2a 20 76 61 6c 75 65 . ^The..** value
56f80 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f 6e 65 returned is one
56f90 20 6f 66 20 5b 53 51 4c 49 54 45 5f 52 4f 4c 4c of [SQLITE_ROLL
56fa0 42 41 43 4b 5d 2c 20 5b 53 51 4c 49 54 45 5f 49 BACK], [SQLITE_I
56fb0 47 4e 4f 52 45 5d 2c 20 5b 53 51 4c 49 54 45 5f GNORE], [SQLITE_
56fc0 46 41 49 4c 5d 2c 0d 0a 2a 2a 20 5b 53 51 4c 49 FAIL],..** [SQLI
56fd0 54 45 5f 41 42 4f 52 54 5d 2c 20 6f 72 20 5b 53 TE_ABORT], or [S
56fe0 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5d 2c 20 QLITE_REPLACE],
56ff0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 according to the
57000 20 5b 4f 4e 20 43 4f 4e 46 4c 49 43 54 5d 20 6d [ON CONFLICT] m
57010 6f 64 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 53 ode..** of the S
57020 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 QL statement tha
57030 74 20 74 72 69 67 67 65 72 65 64 20 74 68 65 20 t triggered the
57040 63 61 6c 6c 20 74 6f 20 74 68 65 20 5b 78 55 70 call to the [xUp
57050 64 61 74 65 5d 20 6d 65 74 68 6f 64 20 6f 66 20 date] method of
57060 74 68 65 0d 0a 2a 2a 20 5b 76 69 72 74 75 61 6c the..** [virtual
57070 20 74 61 62 6c 65 5d 2e 0d 0a 2a 2f 0d 0a 53 51 table]...*/..SQ
57080 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
57090 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e ite3_vtab_on_con
570a0 66 6c 69 63 74 28 73 71 6c 69 74 65 33 20 2a 29 flict(sqlite3 *)
570b0 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 41 50 49 ;..../*..** CAPI
570c0 33 52 45 46 3a 20 43 6f 6e 66 6c 69 63 74 20 72 3REF: Conflict r
570d0 65 73 6f 6c 75 74 69 6f 6e 20 6d 6f 64 65 73 0d esolution modes.
570e0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 63 6f .**..** These co
570f0 6e 73 74 61 6e 74 73 20 61 72 65 20 72 65 74 75 nstants are retu
57100 72 6e 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 rned by [sqlite3
57110 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 _vtab_on_conflic
57120 74 28 29 5d 20 74 6f 0d 0a 2a 2a 20 69 6e 66 6f t()] to..** info
57130 72 6d 20 61 20 5b 76 69 72 74 75 61 6c 20 74 61 rm a [virtual ta
57140 62 6c 65 5d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 ble] implementat
57150 69 6f 6e 20 77 68 61 74 20 74 68 65 20 5b 4f 4e ion what the [ON
57160 20 43 4f 4e 46 4c 49 43 54 5d 20 6d 6f 64 65 0d CONFLICT] mode.
57170 0a 2a 2a 20 69 73 20 66 6f 72 20 74 68 65 20 53 .** is for the S
57180 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 QL statement bei
57190 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 0d 0a 2a ng evaluated...*
571a0 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 *..** Note that
571b0 74 68 65 20 5b 53 51 4c 49 54 45 5f 49 47 4e 4f the [SQLITE_IGNO
571c0 52 45 5d 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 RE] constant is
571d0 61 6c 73 6f 20 75 73 65 64 20 61 73 20 61 20 70 also used as a p
571e0 6f 74 65 6e 74 69 61 6c 0d 0a 2a 2a 20 72 65 74 otential..** ret
571f0 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 urn value from t
57200 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f he [sqlite3_set_
57210 61 75 74 68 6f 72 69 7a 65 72 28 29 5d 20 63 61 authorizer()] ca
57220 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 0d llback and that.
57230 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 41 42 4f 52 .** [SQLITE_ABOR
57240 54 5d 20 69 73 20 61 6c 73 6f 20 61 20 5b 72 65 T] is also a [re
57250 73 75 6c 74 20 63 6f 64 65 5d 2e 0d 0a 2a 2f 0d sult code]...*/.
57260 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
57270 52 4f 4c 4c 42 41 43 4b 20 31 0d 0a 2f 2a 20 23 ROLLBACK 1../* #
57280 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 47 define SQLITE_IG
57290 4e 4f 52 45 20 32 20 2f 2f 20 41 6c 73 6f 20 75 NORE 2 // Also u
572a0 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 61 sed by sqlite3_a
572b0 75 74 68 6f 72 69 7a 65 72 28 29 20 63 61 6c 6c uthorizer() call
572c0 62 61 63 6b 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 back */..#define
572d0 20 53 51 4c 49 54 45 5f 46 41 49 4c 20 20 20 20 SQLITE_FAIL
572e0 20 33 0d 0a 2f 2a 20 23 64 65 66 69 6e 65 20 53 3../* #define S
572f0 51 4c 49 54 45 5f 41 42 4f 52 54 20 34 20 20 2f QLITE_ABORT 4 /
57300 2f 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 / Also an error
57310 63 6f 64 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 code */..#define
57320 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 SQLITE_REPLACE
57330 20 35 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 5......../*..**
57340 20 55 6e 64 6f 20 74 68 65 20 68 61 63 6b 20 74 Undo the hack t
57350 68 61 74 20 63 6f 6e 76 65 72 74 73 20 66 6c 6f hat converts flo
57360 61 74 69 6e 67 20 70 6f 69 6e 74 20 74 79 70 65 ating point type
57370 73 20 74 6f 20 69 6e 74 65 67 65 72 20 66 6f 72 s to integer for
57380 0d 0a 2a 2a 20 62 75 69 6c 64 73 20 6f 6e 20 70 ..** builds on p
57390 72 6f 63 65 73 73 6f 72 73 20 77 69 74 68 6f 75 rocessors withou
573a0 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 t floating point
573b0 20 73 75 70 70 6f 72 74 2e 0d 0a 2a 2f 0d 0a 23 support...*/..#
573c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 ifdef SQLITE_OMI
573d0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 T_FLOATING_POINT
573e0 0d 0a 23 20 75 6e 64 65 66 20 64 6f 75 62 6c 65 ..# undef double
573f0 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 ..#endif....#if
57400 30 0d 0a 7d 20 20 2f 2a 20 45 6e 64 20 6f 66 20 0..} /* End of
57410 74 68 65 20 27 65 78 74 65 72 6e 20 22 43 22 27 the 'extern "C"'
57420 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 23 65 6e 64 69 block */..#endi
57430 66 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d f..#endif..../*.
57440 0a 2a 2a 20 32 30 31 30 20 41 75 67 75 73 74 20 .** 2010 August
57450 33 30 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 30..**..** The a
57460 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 uthor disclaims
57470 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 copyright to thi
57480 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 s source code.
57490 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 In place of..**
574a0 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 a legal notice,
574b0 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 here is a blessi
574c0 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d ng:..**..** M
574d0 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
574e0 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a nd not evil...**
574f0 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 May you find
57500 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 forgiveness for
57510 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f yourself and fo
57520 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a rgive others...*
57530 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 * May you sha
57540 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 re freely, never
57550 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 taking more tha
57560 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d n you give...**.
57570 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
57580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
575a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
575b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d 0a **********..*/..
575c0 0d 0a 23 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 ..#ifndef _SQLIT
575d0 45 33 52 54 52 45 45 5f 48 5f 0d 0a 23 64 65 66 E3RTREE_H_..#def
575e0 69 6e 65 20 5f 53 51 4c 49 54 45 33 52 54 52 45 ine _SQLITE3RTRE
575f0 45 5f 48 5f 0d 0a 0d 0a 0d 0a 23 69 66 20 30 0d E_H_......#if 0.
57600 0a 65 78 74 65 72 6e 20 22 43 22 20 7b 0d 0a 23 .extern "C" {..#
57610 65 6e 64 69 66 0d 0a 0d 0a 74 79 70 65 64 65 66 endif....typedef
57620 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f struct sqlite3_
57630 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 73 rtree_geometry s
57640 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f qlite3_rtree_geo
57650 6d 65 74 72 79 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a metry;..../*..**
57660 20 52 65 67 69 73 74 65 72 20 61 20 67 65 6f 6d Register a geom
57670 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 20 6e 61 etry callback na
57680 6d 65 64 20 7a 47 65 6f 6d 20 74 68 61 74 20 63 med zGeom that c
57690 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 70 61 an be used as pa
576a0 72 74 20 6f 66 20 61 6e 0d 0a 2a 2a 20 52 2d 54 rt of an..** R-T
576b0 72 65 65 20 67 65 6f 6d 65 74 72 79 20 71 75 65 ree geometry que
576c0 72 79 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a ry as follows:..
576d0 2a 2a 0d 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 **..** SELECT
576e0 2e 2e 2e 20 46 52 4f 4d 20 3c 72 74 72 65 65 3e ... FROM <rtree>
576f0 20 57 48 45 52 45 20 3c 72 74 72 65 65 20 63 6f WHERE <rtree co
57700 6c 3e 20 4d 41 54 43 48 20 24 7a 47 65 6f 6d 28 l> MATCH $zGeom(
57710 2e 2e 2e 20 70 61 72 61 6d 73 20 2e 2e 2e 29 0d ... params ...).
57720 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
57730 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65 int sqlite3_rtre
57740 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 e_geometry_callb
57750 61 63 6b 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 ack(.. sqlite3
57760 2a 64 62 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 *db,.. const ch
57770 61 72 20 2a 7a 47 65 6f 6d 2c 0d 0a 20 20 69 6e ar *zGeom,.. in
57780 74 20 28 2a 78 47 65 6f 6d 29 28 73 71 6c 69 74 t (*xGeom)(sqlit
57790 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 e3_rtree_geometr
577a0 79 20 2a 2c 20 69 6e 74 20 6e 43 6f 6f 72 64 2c y *, int nCoord,
577b0 20 64 6f 75 62 6c 65 20 2a 61 43 6f 6f 72 64 2c double *aCoord,
577c0 20 69 6e 74 20 2a 70 52 65 73 29 2c 0d 0a 20 20 int *pRes),..
577d0 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 0d 0a void *pContext..
577e0 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 );....../*..** A
577f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 pointer to a st
57800 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 66 ructure of the f
57810 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 ollowing type is
57820 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
57830 69 72 73 74 0d 0a 2a 2a 20 61 72 67 75 6d 65 6e irst..** argumen
57840 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b 73 20 72 t to callbacks r
57850 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 egistered using
57860 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 rtree_geometry_c
57870 61 6c 6c 62 61 63 6b 28 29 2e 0d 0a 2a 2f 0d 0a allback()...*/..
57880 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 72 struct sqlite3_r
57890 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 7b 0d tree_geometry {.
578a0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 . void *pContex
578b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
578c0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 43 /* Copy of pC
578d0 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20 74 6f ontext passed to
578e0 20 73 5f 72 5f 67 5f 63 28 29 20 2a 2f 0d 0a 20 s_r_g_c() */..
578f0 20 69 6e 74 20 6e 50 61 72 61 6d 3b 20 20 20 20 int nParam;
57900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57910 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 /* Size of arra
57920 79 20 61 50 61 72 61 6d 5b 5d 20 2a 2f 0d 0a 20 y aParam[] */..
57930 20 64 6f 75 62 6c 65 20 2a 61 50 61 72 61 6d 3b double *aParam;
57940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57950 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 70 /* Parameters p
57960 61 73 73 65 64 20 74 6f 20 53 51 4c 20 67 65 6f assed to SQL geo
57970 6d 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 m function */..
57980 20 76 6f 69 64 20 2a 70 55 73 65 72 3b 20 20 20 void *pUser;
57990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
579a0 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 69 6d 70 /* Callback imp
579b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 72 lementation user
579c0 20 64 61 74 61 20 2a 2f 0d 0a 20 20 76 6f 69 64 data */.. void
579d0 20 28 2a 78 44 65 6c 55 73 65 72 29 28 76 6f 69 (*xDelUser)(voi
579e0 64 20 2a 29 3b 20 20 20 20 20 20 20 2f 2a 20 43 d *); /* C
579f0 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 20 alled by SQLite
57a00 74 6f 20 63 6c 65 61 6e 20 75 70 20 70 55 73 65 to clean up pUse
57a10 72 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 23 69 r */..};......#i
57a20 66 20 30 0d 0a 7d 20 20 2f 2a 20 65 6e 64 20 6f f 0..} /* end o
57a30 66 20 74 68 65 20 27 65 78 74 65 72 6e 20 22 43 f the 'extern "C
57a40 22 27 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 23 65 6e "' block */..#en
57a50 64 69 66 0d 0a 0d 0a 23 65 6e 64 69 66 20 20 2f dif....#endif /
57a60 2a 20 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 45 * ifndef _SQLITE
57a70 33 52 54 52 45 45 5f 48 5f 20 2a 2f 0d 0a 0d 0a 3RTREE_H_ */....
57a80 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
57a90 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 * End of sqlite3
57aa0 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .h *************
57ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57ad0 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /../************
57ae0 2a 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 ** Continuing wh
57af0 65 72 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 ere we left off
57b00 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a in sqliteInt.h *
57b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57b20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */../***********
57b30 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 68 61 73 68 *** Include hash
57b40 2e 68 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 .h in the middle
57b50 20 6f 66 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 of sqliteInt.h
57b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57b70 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
57b80 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
57b90 68 61 73 68 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a hash.h *********
57ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57bc0 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
57bd0 31 20 53 65 70 74 65 6d 62 65 72 20 32 32 0d 0a 1 September 22..
57be0 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f **..** The autho
57bf0 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 r disclaims copy
57c00 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f right to this so
57c10 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 urce code. In p
57c20 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 lace of..** a le
57c30 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 gal notice, here
57c40 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d is a blessing:.
57c50 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 .**..** May y
57c60 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e ou do good and n
57c70 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 ot evil...**
57c80 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 May you find for
57c90 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 giveness for you
57ca0 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 rself and forgiv
57cb0 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 e others...**
57cc0 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 May you share f
57cd0 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b reely, never tak
57ce0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f ing more than yo
57cf0 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a u give...**..***
57d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57d40 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 ******..** This
57d50 69 73 20 74 68 65 20 68 65 61 64 65 72 20 66 69 is the header fi
57d60 6c 65 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 le for the gener
57d70 69 63 20 68 61 73 68 2d 74 61 62 6c 65 20 69 6d ic hash-table im
57d80 70 6c 65 6d 65 6e 61 74 69 6f 6e 0d 0a 2a 2a 20 plemenation..**
57d90 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65 2e 0d used in SQLite..
57da0 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 53 51 .*/..#ifndef _SQ
57db0 4c 49 54 45 5f 48 41 53 48 5f 48 5f 0d 0a 23 64 LITE_HASH_H_..#d
57dc0 65 66 69 6e 65 20 5f 53 51 4c 49 54 45 5f 48 41 efine _SQLITE_HA
57dd0 53 48 5f 48 5f 0d 0a 0d 0a 2f 2a 20 46 6f 72 77 SH_H_..../* Forw
57de0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ard declarations
57df0 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e 20 of structures.
57e00 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 */..typedef stru
57e10 63 74 20 48 61 73 68 20 48 61 73 68 3b 0d 0a 74 ct Hash Hash;..t
57e20 79 70 65 64 65 66 20 73 74 72 75 63 74 20 48 61 ypedef struct Ha
57e30 73 68 45 6c 65 6d 20 48 61 73 68 45 6c 65 6d 3b shElem HashElem;
57e40 0d 0a 0d 0a 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 ..../* A complet
57e50 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 e hash table is
57e60 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 an instance of t
57e70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 he following str
57e80 75 63 74 75 72 65 2e 0d 0a 2a 2a 20 54 68 65 20 ucture...** The
57e90 69 6e 74 65 72 6e 61 6c 73 20 6f 66 20 74 68 69 internals of thi
57ea0 73 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 s structure are
57eb0 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 6f intended to be o
57ec0 70 61 71 75 65 20 2d 2d 20 63 6c 69 65 6e 74 0d paque -- client.
57ed0 0a 2a 2a 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 .** code should
57ee0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 61 not attempt to a
57ef0 63 63 65 73 73 20 6f 72 20 6d 6f 64 69 66 79 20 ccess or modify
57f00 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 the fields of th
57f10 69 73 20 73 74 72 75 63 74 75 72 65 0d 0a 2a 2a is structure..**
57f20 20 64 69 72 65 63 74 6c 79 2e 20 20 43 68 61 6e directly. Chan
57f30 67 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 ge this structur
57f40 65 20 6f 6e 6c 79 20 62 79 20 75 73 69 6e 67 20 e only by using
57f50 74 68 65 20 72 6f 75 74 69 6e 65 73 20 62 65 6c the routines bel
57f60 6f 77 2e 0d 0a 2a 2a 20 48 6f 77 65 76 65 72 2c ow...** However,
57f70 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 22 70 72 some of the "pr
57f80 6f 63 65 64 75 72 65 73 22 20 61 6e 64 20 22 66 ocedures" and "f
57f90 75 6e 63 74 69 6f 6e 73 22 20 66 6f 72 20 6d 6f unctions" for mo
57fa0 64 69 66 79 69 6e 67 20 61 6e 64 0d 0a 2a 2a 20 difying and..**
57fb0 61 63 63 65 73 73 69 6e 67 20 74 68 69 73 20 73 accessing this s
57fc0 74 72 75 63 74 75 72 65 20 61 72 65 20 72 65 61 tructure are rea
57fd0 6c 6c 79 20 6d 61 63 72 6f 73 2c 20 73 6f 20 77 lly macros, so w
57fe0 65 20 63 61 6e 27 74 20 72 65 61 6c 6c 79 20 6d e can't really m
57ff0 61 6b 65 0d 0a 2a 2a 20 74 68 69 73 20 73 74 72 ake..** this str
58000 75 63 74 75 72 65 20 6f 70 61 71 75 65 2e 0d 0a ucture opaque...
58010 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 65 6c 65 6d 65 **..** All eleme
58020 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 nts of the hash
58030 74 61 62 6c 65 20 61 72 65 20 6f 6e 20 61 20 73 table are on a s
58040 69 6e 67 6c 65 20 64 6f 75 62 6c 79 2d 6c 69 6e ingle doubly-lin
58050 6b 65 64 20 6c 69 73 74 2e 0d 0a 2a 2a 20 48 61 ked list...** Ha
58060 73 68 2e 66 69 72 73 74 20 70 6f 69 6e 74 73 20 sh.first points
58070 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 to the head of t
58080 68 69 73 20 6c 69 73 74 2e 0d 0a 2a 2a 0d 0a 2a his list...**..*
58090 2a 20 54 68 65 72 65 20 61 72 65 20 48 61 73 68 * There are Hash
580a0 2e 68 74 73 69 7a 65 20 62 75 63 6b 65 74 73 2e .htsize buckets.
580b0 20 20 45 61 63 68 20 62 75 63 6b 65 74 20 70 6f Each bucket po
580c0 69 6e 74 73 20 74 6f 20 61 20 73 70 6f 74 20 69 ints to a spot i
580d0 6e 0d 0a 2a 2a 20 74 68 65 20 67 6c 6f 62 61 6c n..** the global
580e0 20 64 6f 75 62 6c 79 2d 6c 69 6e 6b 65 64 20 6c doubly-linked l
580f0 69 73 74 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e ist. The conten
58100 74 73 20 6f 66 20 74 68 65 20 62 75 63 6b 65 74 ts of the bucket
58110 20 61 72 65 20 74 68 65 0d 0a 2a 2a 20 65 6c 65 are the..** ele
58120 6d 65 6e 74 20 70 6f 69 6e 74 65 64 20 74 6f 20 ment pointed to
58130 70 6c 75 73 20 74 68 65 20 6e 65 78 74 20 5f 68 plus the next _h
58140 74 2e 63 6f 75 6e 74 2d 31 20 65 6c 65 6d 65 6e t.count-1 elemen
58150 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0d ts in the list..
58160 0a 2a 2a 0d 0a 2a 2a 20 48 61 73 68 2e 68 74 73 .**..** Hash.hts
58170 69 7a 65 20 61 6e 64 20 48 61 73 68 2e 68 74 20 ize and Hash.ht
58180 6d 61 79 20 62 65 20 7a 65 72 6f 2e 20 20 49 6e may be zero. In
58190 20 74 68 61 74 20 63 61 73 65 20 6c 6f 6f 6b 75 that case looku
581a0 70 20 69 73 20 64 6f 6e 65 0d 0a 2a 2a 20 62 79 p is done..** by
581b0 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72 63 68 a linear search
581c0 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c of the global l
581d0 69 73 74 2e 20 20 46 6f 72 20 73 6d 61 6c 6c 20 ist. For small
581e0 74 61 62 6c 65 73 2c 20 74 68 65 20 0d 0a 2a 2a tables, the ..**
581f0 20 48 61 73 68 2e 68 74 20 74 61 62 6c 65 20 69 Hash.ht table i
58200 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 s never allocate
58210 64 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65 d because if the
58220 72 65 20 61 72 65 20 66 65 77 20 65 6c 65 6d 65 re are few eleme
58230 6e 74 73 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 74 nts..** in the t
58240 61 62 6c 65 2c 20 69 74 20 69 73 20 66 61 73 74 able, it is fast
58250 65 72 20 74 6f 20 64 6f 20 61 20 6c 69 6e 65 61 er to do a linea
58260 72 20 73 65 61 72 63 68 20 74 68 61 6e 20 74 6f r search than to
58270 20 6d 61 6e 61 67 65 0d 0a 2a 2a 20 74 68 65 20 manage..** the
58280 68 61 73 68 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d hash table...*/.
58290 0a 73 74 72 75 63 74 20 48 61 73 68 20 7b 0d 0a .struct Hash {..
582a0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 68 unsigned int h
582b0 74 73 69 7a 65 3b 20 20 20 20 20 20 2f 2a 20 4e tsize; /* N
582c0 75 6d 62 65 72 20 6f 66 20 62 75 63 6b 65 74 73 umber of buckets
582d0 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 in the hash tab
582e0 6c 65 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 le */.. unsigne
582f0 64 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 d int count;
58300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
58310 65 6e 74 72 69 65 73 20 69 6e 20 74 68 69 73 20 entries in this
58320 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 48 61 73 68 table */.. Hash
58330 45 6c 65 6d 20 2a 66 69 72 73 74 3b 20 20 20 20 Elem *first;
58340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 /* The fir
58350 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 st element of th
58360 65 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 73 74 e array */.. st
58370 72 75 63 74 20 5f 68 74 20 7b 20 20 20 20 20 20 ruct _ht {
58380 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 68 /* the h
58390 61 73 68 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 ash table */..
583a0 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 int count;
583b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
583c0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 Number of entrie
583d0 73 20 77 69 74 68 20 74 68 69 73 20 68 61 73 68 s with this hash
583e0 20 2a 2f 0d 0a 20 20 20 20 48 61 73 68 45 6c 65 */.. HashEle
583f0 6d 20 2a 63 68 61 69 6e 3b 20 20 20 20 20 20 20 m *chain;
58400 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
58410 6f 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 69 o first entry wi
58420 74 68 20 74 68 69 73 20 68 61 73 68 20 2a 2f 0d th this hash */.
58430 0a 20 20 7d 20 2a 68 74 3b 0d 0a 7d 3b 0d 0a 0d . } *ht;..};...
58440 0a 2f 2a 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 ./* Each element
58450 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 in the hash tab
58460 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 le is an instanc
58470 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
58480 6e 67 20 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 ng ..** structur
58490 65 2e 20 20 41 6c 6c 20 65 6c 65 6d 65 6e 74 73 e. All elements
584a0 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 61 are stored on a
584b0 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 79 2d 6c single doubly-l
584c0 69 6e 6b 65 64 20 6c 69 73 74 2e 0d 0a 2a 2a 0d inked list...**.
584d0 0a 2a 2a 20 41 67 61 69 6e 2c 20 74 68 69 73 20 .** Again, this
584e0 73 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 74 structure is int
584f0 65 6e 64 65 64 20 74 6f 20 62 65 20 6f 70 61 71 ended to be opaq
58500 75 65 2c 20 62 75 74 20 69 74 20 63 61 6e 27 74 ue, but it can't
58510 20 72 65 61 6c 6c 79 0d 0a 2a 2a 20 62 65 20 6f really..** be o
58520 70 61 71 75 65 20 62 65 63 61 75 73 65 20 69 74 paque because it
58530 20 69 73 20 75 73 65 64 20 62 79 20 6d 61 63 72 is used by macr
58540 6f 73 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 os...*/..struct
58550 48 61 73 68 45 6c 65 6d 20 7b 0d 0a 20 20 48 61 HashElem {.. Ha
58560 73 68 45 6c 65 6d 20 2a 6e 65 78 74 2c 20 2a 70 shElem *next, *p
58570 72 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 rev; /* Ne
58580 78 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 xt and previous
58590 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 elements in the
585a0 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 table */.. void
585b0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 *data;
585c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 /* Data
585d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
585e0 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f this element */
585f0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
58600 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 20 pKey; int nKey;
58610 20 2f 2a 20 4b 65 79 20 61 73 73 6f 63 69 61 74 /* Key associat
58620 65 64 20 77 69 74 68 20 74 68 69 73 20 65 6c 65 ed with this ele
58630 6d 65 6e 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f ment */..};..../
58640 2a 0d 0a 2a 2a 20 41 63 63 65 73 73 20 72 6f 75 *..** Access rou
58650 74 69 6e 65 73 2e 20 20 54 6f 20 64 65 6c 65 74 tines. To delet
58660 65 2c 20 69 6e 73 65 72 74 20 61 20 4e 55 4c 4c e, insert a NULL
58670 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d 0a 53 pointer...*/..S
58680 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
58690 69 64 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e id sqlite3HashIn
586a0 69 74 28 48 61 73 68 2a 29 3b 0d 0a 53 51 4c 49 it(Hash*);..SQLI
586b0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
586c0 2a 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 *sqlite3HashInse
586d0 72 74 28 48 61 73 68 2a 2c 20 63 6f 6e 73 74 20 rt(Hash*, const
586e0 63 68 61 72 20 2a 70 4b 65 79 2c 20 69 6e 74 20 char *pKey, int
586f0 6e 4b 65 79 2c 20 76 6f 69 64 20 2a 70 44 61 74 nKey, void *pDat
58700 61 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 a);..SQLITE_PRIV
58710 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 ATE void *sqlite
58720 33 48 61 73 68 46 69 6e 64 28 63 6f 6e 73 74 20 3HashFind(const
58730 48 61 73 68 2a 2c 20 63 6f 6e 73 74 20 63 68 61 Hash*, const cha
58740 72 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 r *pKey, int nKe
58750 79 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 y);..SQLITE_PRIV
58760 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
58770 48 61 73 68 43 6c 65 61 72 28 48 61 73 68 2a 29 HashClear(Hash*)
58780 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 63 72 ;..../*..** Macr
58790 6f 73 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f os for looping o
587a0 76 65 72 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 ver all elements
587b0 20 6f 66 20 61 20 68 61 73 68 20 74 61 62 6c 65 of a hash table
587c0 2e 20 20 54 68 65 20 69 64 69 6f 6d 20 69 73 0d . The idiom is.
587d0 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0d 0a .** like this:..
587e0 2a 2a 0d 0a 2a 2a 20 20 20 48 61 73 68 20 68 3b **..** Hash h;
587f0 0d 0a 2a 2a 20 20 20 48 61 73 68 45 6c 65 6d 20 ..** HashElem
58800 2a 70 3b 0d 0a 2a 2a 20 20 20 2e 2e 2e 0d 0a 2a *p;..** .....*
58810 2a 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 * for(p=sqlite
58820 48 61 73 68 46 69 72 73 74 28 26 68 29 3b 20 70 HashFirst(&h); p
58830 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 ; p=sqliteHashNe
58840 78 74 28 70 29 29 7b 0d 0a 2a 2a 20 20 20 20 20 xt(p)){..**
58850 53 6f 6d 65 53 74 72 75 63 74 75 72 65 20 2a 70 SomeStructure *p
58860 44 61 74 61 20 3d 20 73 71 6c 69 74 65 48 61 73 Data = sqliteHas
58870 68 44 61 74 61 28 70 29 3b 0d 0a 2a 2a 20 20 20 hData(p);..**
58880 20 20 2f 2f 20 64 6f 20 73 6f 6d 65 74 68 69 6e // do somethin
58890 67 20 77 69 74 68 20 70 44 61 74 61 0d 0a 2a 2a g with pData..**
588a0 20 20 20 7d 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e }..*/..#defin
588b0 65 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 e sqliteHashFirs
588c0 74 28 48 29 20 20 28 28 48 29 2d 3e 66 69 72 73 t(H) ((H)->firs
588d0 74 29 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 t)..#define sqli
588e0 74 65 48 61 73 68 4e 65 78 74 28 45 29 20 20 20 teHashNext(E)
588f0 28 28 45 29 2d 3e 6e 65 78 74 29 0d 0a 23 64 65 ((E)->next)..#de
58900 66 69 6e 65 20 73 71 6c 69 74 65 48 61 73 68 44 fine sqliteHashD
58910 61 74 61 28 45 29 20 20 20 28 28 45 29 2d 3e 64 ata(E) ((E)->d
58920 61 74 61 29 0d 0a 2f 2a 20 23 64 65 66 69 6e 65 ata)../* #define
58930 20 73 71 6c 69 74 65 48 61 73 68 4b 65 79 28 45 sqliteHashKey(E
58940 29 20 20 20 20 28 28 45 29 2d 3e 70 4b 65 79 29 ) ((E)->pKey)
58950 20 2f 2f 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d // NOT USED */.
58960 0a 2f 2a 20 23 64 65 66 69 6e 65 20 73 71 6c 69 ./* #define sqli
58970 74 65 48 61 73 68 4b 65 79 73 69 7a 65 28 45 29 teHashKeysize(E)
58980 20 28 28 45 29 2d 3e 6e 4b 65 79 29 20 20 2f 2f ((E)->nKey) //
58990 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 0d 0a NOT USED */....
589a0 2f 2a 0d 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 /*..** Number of
589b0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 68 61 entries in a ha
589c0 73 68 20 74 61 62 6c 65 0d 0a 2a 2f 0d 0a 2f 2a sh table..*/../*
589d0 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 48 #define sqliteH
589e0 61 73 68 43 6f 75 6e 74 28 48 29 20 20 28 28 48 ashCount(H) ((H
589f0 29 2d 3e 63 6f 75 6e 74 29 20 2f 2f 20 4e 4f 54 )->count) // NOT
58a00 20 55 53 45 44 20 2a 2f 0d 0a 0d 0a 23 65 6e 64 USED */....#end
58a10 69 66 20 2f 2a 20 5f 53 51 4c 49 54 45 5f 48 41 if /* _SQLITE_HA
58a20 53 48 5f 48 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a SH_H_ */..../***
58a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 *********** End
58a40 6f 66 20 68 61 73 68 2e 68 20 2a 2a 2a 2a 2a 2a of hash.h ******
58a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
58a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
58a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a **********/../**
58a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e ************ Con
58a90 74 69 6e 75 69 6e 67 20 77 68 65 72 65 20 77 65 tinuing where we
58aa0 20 6c 65 66 74 20 6f 66 66 20 69 6e 20 73 71 6c left off in sql
58ab0 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a iteInt.h *******
58ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a ***********/../*
58ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e ************* In
58ae0 63 6c 75 64 65 20 70 61 72 73 65 2e 68 20 69 6e clude parse.h in
58af0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 73 the middle of s
58b00 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a qliteInt.h *****
58b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
58b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 ************** B
58b30 65 67 69 6e 20 66 69 6c 65 20 70 61 72 73 65 2e egin file parse.
58b40 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
58b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
58b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
58b70 23 64 65 66 69 6e 65 20 54 4b 5f 53 45 4d 49 20 #define TK_SEMI
58b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58b90 20 20 20 20 20 20 20 20 20 20 20 31 0d 0a 23 64 1..#d
58ba0 65 66 69 6e 65 20 54 4b 5f 45 58 50 4c 41 49 4e efine TK_EXPLAIN
58bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58bc0 20 20 20 20 20 20 20 20 20 32 0d 0a 23 64 65 66 2..#def
58bd0 69 6e 65 20 54 4b 5f 51 55 45 52 59 20 20 20 20 ine TK_QUERY
58be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58bf0 20 20 20 20 20 20 20 33 0d 0a 23 64 65 66 69 6e 3..#defin
58c00 65 20 54 4b 5f 50 4c 41 4e 20 20 20 20 20 20 20 e TK_PLAN
58c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58c20 20 20 20 20 20 34 0d 0a 23 64 65 66 69 6e 65 20 4..#define
58c30 54 4b 5f 42 45 47 49 4e 20 20 20 20 20 20 20 20 TK_BEGIN
58c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58c50 20 20 20 35 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5..#define TK
58c60 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 _TRANSACTION
58c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58c80 20 36 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 44 6..#define TK_D
58c90 45 46 45 52 52 45 44 20 20 20 20 20 20 20 20 20 EFERRED
58ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 7
58cb0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 49 4d 4d ..#define TK_IMM
58cc0 45 44 49 41 54 45 20 20 20 20 20 20 20 20 20 20 EDIATE
58cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 0d 0a 8..
58ce0 23 64 65 66 69 6e 65 20 54 4b 5f 45 58 43 4c 55 #define TK_EXCLU
58cf0 53 49 56 45 20 20 20 20 20 20 20 20 20 20 20 20 SIVE
58d00 20 20 20 20 20 20 20 20 20 20 20 39 0d 0a 23 64 9..#d
58d10 65 66 69 6e 65 20 54 4b 5f 43 4f 4d 4d 49 54 20 efine TK_COMMIT
58d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58d30 20 20 20 20 20 20 20 20 31 30 0d 0a 23 64 65 66 10..#def
58d40 69 6e 65 20 54 4b 5f 45 4e 44 20 20 20 20 20 20 ine TK_END
58d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58d60 20 20 20 20 20 20 31 31 0d 0a 23 64 65 66 69 6e 11..#defin
58d70 65 20 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 e TK_ROLLBACK
58d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58d90 20 20 20 20 31 32 0d 0a 23 64 65 66 69 6e 65 20 12..#define
58da0 54 4b 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 TK_SAVEPOINT
58db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58dc0 20 20 31 33 0d 0a 23 64 65 66 69 6e 65 20 54 4b 13..#define TK
58dd0 5f 52 45 4c 45 41 53 45 20 20 20 20 20 20 20 20 _RELEASE
58de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58df0 31 34 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 54 14..#define TK_T
58e00 4f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 O
58e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35 15
58e20 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 54 41 42 ..#define TK_TAB
58e30 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 LE
58e40 20 20 20 20 20 20 20 20 20 20 20 20 31 36 0d 0a 16..
58e50 23 64 65 66 69 6e 65 20 54 4b 5f 43 52 45 41 54 #define TK_CREAT
58e60 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
58e70 20 20 20 20 20 20 20 20 20 20 31 37 0d 0a 23 64 17..#d
58e80 65 66 69 6e 65 20 54 4b 5f 49 46 20 20 20 20 20 efine TK_IF
58e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58ea0 20 20 20 20 20 20 20 20 31 38 0d 0a 23 64 65 66 18..#def
58eb0 69 6e 65 20 54 4b 5f 4e 4f 54 20 20 20 20 20 20 ine TK_NOT
58ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58ed0 20 20 20 20 20 20 31 39 0d 0a 23 64 65 66 69 6e 19..#defin
58ee0 65 20 54 4b 5f 45 58 49 53 54 53 20 20 20 20 20 e TK_EXISTS
58ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58f00 20 20 20 20 32 30 0d 0a 23 64 65 66 69 6e 65 20 20..#define
58f10 54 4b 5f 54 45 4d 50 20 20 20 20 20 20 20 20 20 TK_TEMP
58f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58f30 20 20 32 31 0d 0a 23 64 65 66 69 6e 65 20 54 4b 21..#define TK
58f40 5f 4c 50 20 20 20 20 20 20 20 20 20 20 20 20 20 _LP
58f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58f60 32 32 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 52 22..#define TK_R
58f70 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 P
58f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 33 23
58f90 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 53 20 ..#define TK_AS
58fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58fb0 20 20 20 20 20 20 20 20 20 20 20 20 32 34 0d 0a 24..
58fc0 23 64 65 66 69 6e 65 20 54 4b 5f 43 4f 4d 4d 41 #define TK_COMMA
58fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58fe0 20 20 20 20 20 20 20 20 20 20 32 35 0d 0a 23 64 25..#d
58ff0 65 66 69 6e 65 20 54 4b 5f 49 44 20 20 20 20 20 efine TK_ID
59000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59010 20 20 20 20 20 20 20 20 32 36 0d 0a 23 64 65 66 26..#def
59020 69 6e 65 20 54 4b 5f 49 4e 44 45 58 45 44 20 20 ine TK_INDEXED
59030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59040 20 20 20 20 20 20 32 37 0d 0a 23 64 65 66 69 6e 27..#defin
59050 65 20 54 4b 5f 41 42 4f 52 54 20 20 20 20 20 20 e TK_ABORT
59060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59070 20 20 20 20 32 38 0d 0a 23 64 65 66 69 6e 65 20 28..#define
59080 54 4b 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20 TK_ACTION
59090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
590a0 20 20 32 39 0d 0a 23 64 65 66 69 6e 65 20 54 4b 29..#define TK
590b0 5f 41 46 54 45 52 20 20 20 20 20 20 20 20 20 20 _AFTER
590c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
590d0 33 30 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 30..#define TK_A
590e0 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 NALYZE
590f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 31 31
59100 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 53 43 ..#define TK_ASC
59110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59120 20 20 20 20 20 20 20 20 20 20 20 20 33 32 0d 0a 32..
59130 23 64 65 66 69 6e 65 20 54 4b 5f 41 54 54 41 43 #define TK_ATTAC
59140 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 H
59150 20 20 20 20 20 20 20 20 20 20 33 33 0d 0a 23 64 33..#d
59160 65 66 69 6e 65 20 54 4b 5f 42 45 46 4f 52 45 20 efine TK_BEFORE
59170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59180 20 20 20 20 20 20 20 20 33 34 0d 0a 23 64 65 66 34..#def
59190 69 6e 65 20 54 4b 5f 42 59 20 20 20 20 20 20 20 ine TK_BY
591a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
591b0 20 20 20 20 20 20 33 35 0d 0a 23 64 65 66 69 6e 35..#defin
591c0 65 20 54 4b 5f 43 41 53 43 41 44 45 20 20 20 20 e TK_CASCADE
591d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
591e0 20 20 20 20 33 36 0d 0a 23 64 65 66 69 6e 65 20 36..#define
591f0 54 4b 5f 43 41 53 54 20 20 20 20 20 20 20 20 20 TK_CAST
59200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59210 20 20 33 37 0d 0a 23 64 65 66 69 6e 65 20 54 4b 37..#define TK
59220 5f 43 4f 4c 55 4d 4e 4b 57 20 20 20 20 20 20 20 _COLUMNKW
59230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59240 33 38 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 43 38..#define TK_C
59250 4f 4e 46 4c 49 43 54 20 20 20 20 20 20 20 20 20 ONFLICT
59260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 39 39
59270 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 44 41 54 ..#define TK_DAT
59280 41 42 41 53 45 20 20 20 20 20 20 20 20 20 20 20 ABASE
59290 20 20 20 20 20 20 20 20 20 20 20 20 34 30 0d 0a 40..
592a0 23 64 65 66 69 6e 65 20 54 4b 5f 44 45 53 43 20 #define TK_DESC
592b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
592c0 20 20 20 20 20 20 20 20 20 20 34 31 0d 0a 23 64 41..#d
592d0 65 66 69 6e 65 20 54 4b 5f 44 45 54 41 43 48 20 efine TK_DETACH
592e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
592f0 20 20 20 20 20 20 20 20 34 32 0d 0a 23 64 65 66 42..#def
59300 69 6e 65 20 54 4b 5f 45 41 43 48 20 20 20 20 20 ine TK_EACH
59310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59320 20 20 20 20 20 20 34 33 0d 0a 23 64 65 66 69 6e 43..#defin
59330 65 20 54 4b 5f 46 41 49 4c 20 20 20 20 20 20 20 e TK_FAIL
59340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59350 20 20 20 20 34 34 0d 0a 23 64 65 66 69 6e 65 20 44..#define
59360 54 4b 5f 46 4f 52 20 20 20 20 20 20 20 20 20 20 TK_FOR
59370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59380 20 20 34 35 0d 0a 23 64 65 66 69 6e 65 20 54 4b 45..#define TK
59390 5f 49 47 4e 4f 52 45 20 20 20 20 20 20 20 20 20 _IGNORE
593a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
593b0 34 36 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 49 46..#define TK_I
593c0 4e 49 54 49 41 4c 4c 59 20 20 20 20 20 20 20 20 NITIALLY
593d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 37 47
593e0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 49 4e 53 ..#define TK_INS
593f0 54 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 TEAD
59400 20 20 20 20 20 20 20 20 20 20 20 20 34 38 0d 0a 48..
59410 23 64 65 66 69 6e 65 20 54 4b 5f 4c 49 4b 45 5f #define TK_LIKE_
59420 4b 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 KW
59430 20 20 20 20 20 20 20 20 20 20 34 39 0d 0a 23 64 49..#d
59440 65 66 69 6e 65 20 54 4b 5f 4d 41 54 43 48 20 20 efine TK_MATCH
59450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59460 20 20 20 20 20 20 20 20 35 30 0d 0a 23 64 65 66 50..#def
59470 69 6e 65 20 54 4b 5f 4e 4f 20 20 20 20 20 20 20 ine TK_NO
59480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59490 20 20 20 20 20 20 35 31 0d 0a 23 64 65 66 69 6e 51..#defin
594a0 65 20 54 4b 5f 4b 45 59 20 20 20 20 20 20 20 20 e TK_KEY
594b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
594c0 20 20 20 20 35 32 0d 0a 23 64 65 66 69 6e 65 20 52..#define
594d0 54 4b 5f 4f 46 20 20 20 20 20 20 20 20 20 20 20 TK_OF
594e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
594f0 20 20 35 33 0d 0a 23 64 65 66 69 6e 65 20 54 4b 53..#define TK
59500 5f 4f 46 46 53 45 54 20 20 20 20 20 20 20 20 20 _OFFSET
59510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59520 35 34 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 50 54..#define TK_P
59530 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 RAGMA
59540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 35 55
59550 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 52 41 49 ..#define TK_RAI
59560 53 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 SE
59570 20 20 20 20 20 20 20 20 20 20 20 20 35 36 0d 0a 56..
59580 23 64 65 66 69 6e 65 20 54 4b 5f 52 45 50 4c 41 #define TK_REPLA
59590 43 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 CE
595a0 20 20 20 20 20 20 20 20 20 20 35 37 0d 0a 23 64 57..#d
595b0 65 66 69 6e 65 20 54 4b 5f 52 45 53 54 52 49 43 efine TK_RESTRIC
595c0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
595d0 20 20 20 20 20 20 20 20 35 38 0d 0a 23 64 65 66 58..#def
595e0 69 6e 65 20 54 4b 5f 52 4f 57 20 20 20 20 20 20 ine TK_ROW
595f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59600 20 20 20 20 20 20 35 39 0d 0a 23 64 65 66 69 6e 59..#defin
59610 65 20 54 4b 5f 54 52 49 47 47 45 52 20 20 20 20 e TK_TRIGGER
59620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59630 20 20 20 20 36 30 0d 0a 23 64 65 66 69 6e 65 20 60..#define
59640 54 4b 5f 56 41 43 55 55 4d 20 20 20 20 20 20 20 TK_VACUUM
59650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59660 20 20 36 31 0d 0a 23 64 65 66 69 6e 65 20 54 4b 61..#define TK
59670 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 20 20 _VIEW
59680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59690 36 32 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 56 62..#define TK_V
596a0 49 52 54 55 41 4c 20 20 20 20 20 20 20 20 20 20 IRTUAL
596b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 33 63
596c0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 52 45 49 ..#define TK_REI
596d0 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 NDEX
596e0 20 20 20 20 20 20 20 20 20 20 20 20 36 34 0d 0a 64..
596f0 23 64 65 66 69 6e 65 20 54 4b 5f 52 45 4e 41 4d #define TK_RENAM
59700 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
59710 20 20 20 20 20 20 20 20 20 20 36 35 0d 0a 23 64 65..#d
59720 65 66 69 6e 65 20 54 4b 5f 43 54 49 4d 45 5f 4b efine TK_CTIME_K
59730 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 W
59740 20 20 20 20 20 20 20 20 36 36 0d 0a 23 64 65 66 66..#def
59750 69 6e 65 20 54 4b 5f 41 4e 59 20 20 20 20 20 20 ine TK_ANY
59760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59770 20 20 20 20 20 20 36 37 0d 0a 23 64 65 66 69 6e 67..#defin
59780 65 20 54 4b 5f 4f 52 20 20 20 20 20 20 20 20 20 e TK_OR
59790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
597a0 20 20 20 20 36 38 0d 0a 23 64 65 66 69 6e 65 20 68..#define
597b0 54 4b 5f 41 4e 44 20 20 20 20 20 20 20 20 20 20 TK_AND
597c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
597d0 20 20 36 39 0d 0a 23 64 65 66 69 6e 65 20 54 4b 69..#define TK
597e0 5f 49 53 20 20 20 20 20 20 20 20 20 20 20 20 20 _IS
597f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59800 37 30 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 42 70..#define TK_B
59810 45 54 57 45 45 4e 20 20 20 20 20 20 20 20 20 20 ETWEEN
59820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 31 71
59830 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 49 4e 20 ..#define TK_IN
59840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59850 20 20 20 20 20 20 20 20 20 20 20 20 37 32 0d 0a 72..
59860 23 64 65 66 69 6e 65 20 54 4b 5f 49 53 4e 55 4c #define TK_ISNUL
59870 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 L
59880 20 20 20 20 20 20 20 20 20 20 37 33 0d 0a 23 64 73..#d
59890 65 66 69 6e 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c efine TK_NOTNULL
598a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
598b0 20 20 20 20 20 20 20 20 37 34 0d 0a 23 64 65 66 74..#def
598c0 69 6e 65 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 ine TK_NE
598d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
598e0 20 20 20 20 20 20 37 35 0d 0a 23 64 65 66 69 6e 75..#defin
598f0 65 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 e TK_EQ
59900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59910 20 20 20 20 37 36 0d 0a 23 64 65 66 69 6e 65 20 76..#define
59920 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 TK_GT
59930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59940 20 20 37 37 0d 0a 23 64 65 66 69 6e 65 20 54 4b 77..#define TK
59950 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 _LE
59960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59970 37 38 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4c 78..#define TK_L
59980 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
59990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 39 79
599a0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 47 45 20 ..#define TK_GE
599b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
599c0 20 20 20 20 20 20 20 20 20 20 20 20 38 30 0d 0a 80..
599d0 23 64 65 66 69 6e 65 20 54 4b 5f 45 53 43 41 50 #define TK_ESCAP
599e0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
599f0 20 20 20 20 20 20 20 20 20 20 38 31 0d 0a 23 64 81..#d
59a00 65 66 69 6e 65 20 54 4b 5f 42 49 54 41 4e 44 20 efine TK_BITAND
59a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59a20 20 20 20 20 20 20 20 20 38 32 0d 0a 23 64 65 66 82..#def
59a30 69 6e 65 20 54 4b 5f 42 49 54 4f 52 20 20 20 20 ine TK_BITOR
59a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59a50 20 20 20 20 20 20 38 33 0d 0a 23 64 65 66 69 6e 83..#defin
59a60 65 20 54 4b 5f 4c 53 48 49 46 54 20 20 20 20 20 e TK_LSHIFT
59a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59a80 20 20 20 20 38 34 0d 0a 23 64 65 66 69 6e 65 20 84..#define
59a90 54 4b 5f 52 53 48 49 46 54 20 20 20 20 20 20 20 TK_RSHIFT
59aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59ab0 20 20 38 35 0d 0a 23 64 65 66 69 6e 65 20 54 4b 85..#define TK
59ac0 5f 50 4c 55 53 20 20 20 20 20 20 20 20 20 20 20 _PLUS
59ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59ae0 38 36 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4d 86..#define TK_M
59af0 49 4e 55 53 20 20 20 20 20 20 20 20 20 20 20 20 INUS
59b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 37 87
59b10 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 53 54 41 ..#define TK_STA
59b20 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 R
59b30 20 20 20 20 20 20 20 20 20 20 20 20 38 38 0d 0a 88..
59b40 23 64 65 66 69 6e 65 20 54 4b 5f 53 4c 41 53 48 #define TK_SLASH
59b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59b60 20 20 20 20 20 20 20 20 20 20 38 39 0d 0a 23 64 89..#d
59b70 65 66 69 6e 65 20 54 4b 5f 52 45 4d 20 20 20 20 efine TK_REM
59b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59b90 20 20 20 20 20 20 20 20 39 30 0d 0a 23 64 65 66 90..#def
59ba0 69 6e 65 20 54 4b 5f 43 4f 4e 43 41 54 20 20 20 ine TK_CONCAT
59bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59bc0 20 20 20 20 20 20 39 31 0d 0a 23 64 65 66 69 6e 91..#defin
59bd0 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 20 20 20 e TK_COLLATE
59be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59bf0 20 20 20 20 39 32 0d 0a 23 64 65 66 69 6e 65 20 92..#define
59c00 54 4b 5f 42 49 54 4e 4f 54 20 20 20 20 20 20 20 TK_BITNOT
59c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59c20 20 20 39 33 0d 0a 23 64 65 66 69 6e 65 20 54 4b 93..#define TK
59c30 5f 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 20 _STRING
59c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59c50 39 34 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4a 94..#define TK_J
59c60 4f 49 4e 5f 4b 57 20 20 20 20 20 20 20 20 20 20 OIN_KW
59c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 35 95
59c80 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 43 4f 4e ..#define TK_CON
59c90 53 54 52 41 49 4e 54 20 20 20 20 20 20 20 20 20 STRAINT
59ca0 20 20 20 20 20 20 20 20 20 20 20 20 39 36 0d 0a 96..
59cb0 23 64 65 66 69 6e 65 20 54 4b 5f 44 45 46 41 55 #define TK_DEFAU
59cc0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 LT
59cd0 20 20 20 20 20 20 20 20 20 20 39 37 0d 0a 23 64 97..#d
59ce0 65 66 69 6e 65 20 54 4b 5f 4e 55 4c 4c 20 20 20 efine TK_NULL
59cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59d00 20 20 20 20 20 20 20 20 39 38 0d 0a 23 64 65 66 98..#def
59d10 69 6e 65 20 54 4b 5f 50 52 49 4d 41 52 59 20 20 ine TK_PRIMARY
59d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59d30 20 20 20 20 20 20 39 39 0d 0a 23 64 65 66 69 6e 99..#defin
59d40 65 20 54 4b 5f 55 4e 49 51 55 45 20 20 20 20 20 e TK_UNIQUE
59d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59d60 20 20 20 20 31 30 30 0d 0a 23 64 65 66 69 6e 65 100..#define
59d70 20 54 4b 5f 43 48 45 43 4b 20 20 20 20 20 20 20 TK_CHECK
59d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59d90 20 20 20 31 30 31 0d 0a 23 64 65 66 69 6e 65 20 101..#define
59da0 54 4b 5f 52 45 46 45 52 45 4e 43 45 53 20 20 20 TK_REFERENCES
59db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59dc0 20 20 31 30 32 0d 0a 23 64 65 66 69 6e 65 20 54 102..#define T
59dd0 4b 5f 41 55 54 4f 49 4e 43 52 20 20 20 20 20 20 K_AUTOINCR
59de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59df0 20 31 30 33 0d 0a 23 64 65 66 69 6e 65 20 54 4b 103..#define TK
59e00 5f 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 _ON
59e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59e20 31 30 34 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 104..#define TK_
59e30 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 INSERT
59e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
59e50 30 35 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 44 05..#define TK_D
59e60 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 ELETE
59e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 10
59e80 36 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 55 50 6..#define TK_UP
59e90 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 DATE
59ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 37 107
59eb0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 53 45 54 ..#define TK_SET
59ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59ed0 20 20 20 20 20 20 20 20 20 20 20 20 31 30 38 0d 108.
59ee0 0a 23 64 65 66 69 6e 65 20 54 4b 5f 44 45 46 45 .#define TK_DEFE
59ef0 52 52 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 RRABLE
59f00 20 20 20 20 20 20 20 20 20 20 20 31 30 39 0d 0a 109..
59f10 23 64 65 66 69 6e 65 20 54 4b 5f 46 4f 52 45 49 #define TK_FOREI
59f20 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 GN
59f30 20 20 20 20 20 20 20 20 20 20 31 31 30 0d 0a 23 110..#
59f40 64 65 66 69 6e 65 20 54 4b 5f 44 52 4f 50 20 20 define TK_DROP
59f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59f60 20 20 20 20 20 20 20 20 20 31 31 31 0d 0a 23 64 111..#d
59f70 65 66 69 6e 65 20 54 4b 5f 55 4e 49 4f 4e 20 20 efine TK_UNION
59f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59f90 20 20 20 20 20 20 20 20 31 31 32 0d 0a 23 64 65 112..#de
59fa0 66 69 6e 65 20 54 4b 5f 41 4c 4c 20 20 20 20 20 fine TK_ALL
59fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59fc0 20 20 20 20 20 20 20 31 31 33 0d 0a 23 64 65 66 113..#def
59fd0 69 6e 65 20 54 4b 5f 45 58 43 45 50 54 20 20 20 ine TK_EXCEPT
59fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59ff0 20 20 20 20 20 20 31 31 34 0d 0a 23 64 65 66 69 114..#defi
5a000 6e 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 ne TK_INTERSECT
5a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a020 20 20 20 20 20 31 31 35 0d 0a 23 64 65 66 69 6e 115..#defin
5a030 65 20 54 4b 5f 53 45 4c 45 43 54 20 20 20 20 20 e TK_SELECT
5a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a050 20 20 20 20 31 31 36 0d 0a 23 64 65 66 69 6e 65 116..#define
5a060 20 54 4b 5f 44 49 53 54 49 4e 43 54 20 20 20 20 TK_DISTINCT
5a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a080 20 20 20 31 31 37 0d 0a 23 64 65 66 69 6e 65 20 117..#define
5a090 54 4b 5f 44 4f 54 20 20 20 20 20 20 20 20 20 20 TK_DOT
5a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a0b0 20 20 31 31 38 0d 0a 23 64 65 66 69 6e 65 20 54 118..#define T
5a0c0 4b 5f 46 52 4f 4d 20 20 20 20 20 20 20 20 20 20 K_FROM
5a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a0e0 20 31 31 39 0d 0a 23 64 65 66 69 6e 65 20 54 4b 119..#define TK
5a0f0 5f 4a 4f 49 4e 20 20 20 20 20 20 20 20 20 20 20 _JOIN
5a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a110 31 32 30 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 120..#define TK_
5a120 55 53 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 USING
5a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
5a140 32 31 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4f 21..#define TK_O
5a150 52 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 RDER
5a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 32 12
5a170 32 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 47 52 2..#define TK_GR
5a180 4f 55 50 20 20 20 20 20 20 20 20 20 20 20 20 20 OUP
5a190 20 20 20 20 20 20 20 20 20 20 20 20 20 31 32 33 123
5a1a0 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 48 41 56 ..#define TK_HAV
5a1b0 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 20 20 ING
5a1c0 20 20 20 20 20 20 20 20 20 20 20 20 31 32 34 0d 124.
5a1d0 0a 23 64 65 66 69 6e 65 20 54 4b 5f 4c 49 4d 49 .#define TK_LIMI
5a1e0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
5a1f0 20 20 20 20 20 20 20 20 20 20 20 31 32 35 0d 0a 125..
5a200 23 64 65 66 69 6e 65 20 54 4b 5f 57 48 45 52 45 #define TK_WHERE
5a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a220 20 20 20 20 20 20 20 20 20 20 31 32 36 0d 0a 23 126..#
5a230 64 65 66 69 6e 65 20 54 4b 5f 49 4e 54 4f 20 20 define TK_INTO
5a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a250 20 20 20 20 20 20 20 20 20 31 32 37 0d 0a 23 64 127..#d
5a260 65 66 69 6e 65 20 54 4b 5f 56 41 4c 55 45 53 20 efine TK_VALUES
5a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a280 20 20 20 20 20 20 20 20 31 32 38 0d 0a 23 64 65 128..#de
5a290 66 69 6e 65 20 54 4b 5f 49 4e 54 45 47 45 52 20 fine TK_INTEGER
5a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a2b0 20 20 20 20 20 20 20 31 32 39 0d 0a 23 64 65 66 129..#def
5a2c0 69 6e 65 20 54 4b 5f 46 4c 4f 41 54 20 20 20 20 ine TK_FLOAT
5a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a2e0 20 20 20 20 20 20 31 33 30 0d 0a 23 64 65 66 69 130..#defi
5a2f0 6e 65 20 54 4b 5f 42 4c 4f 42 20 20 20 20 20 20 ne TK_BLOB
5a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a310 20 20 20 20 20 31 33 31 0d 0a 23 64 65 66 69 6e 131..#defin
5a320 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 20 20 e TK_REGISTER
5a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a340 20 20 20 20 31 33 32 0d 0a 23 64 65 66 69 6e 65 132..#define
5a350 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 20 20 20 TK_VARIABLE
5a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a370 20 20 20 31 33 33 0d 0a 23 64 65 66 69 6e 65 20 133..#define
5a380 54 4b 5f 43 41 53 45 20 20 20 20 20 20 20 20 20 TK_CASE
5a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a3a0 20 20 31 33 34 0d 0a 23 64 65 66 69 6e 65 20 54 134..#define T
5a3b0 4b 5f 57 48 45 4e 20 20 20 20 20 20 20 20 20 20 K_WHEN
5a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a3d0 20 31 33 35 0d 0a 23 64 65 66 69 6e 65 20 54 4b 135..#define TK
5a3e0 5f 54 48 45 4e 20 20 20 20 20 20 20 20 20 20 20 _THEN
5a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a400 31 33 36 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 136..#define TK_
5a410 45 4c 53 45 20 20 20 20 20 20 20 20 20 20 20 20 ELSE
5a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
5a430 33 37 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 49 37..#define TK_I
5a440 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 NDEX
5a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 33 13
5a460 38 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 4c 8..#define TK_AL
5a470 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 TER
5a480 20 20 20 20 20 20 20 20 20 20 20 20 20 31 33 39 139
5a490 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 44 44 ..#define TK_ADD
5a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a4b0 20 20 20 20 20 20 20 20 20 20 20 20 31 34 30 0d 140.
5a4c0 0a 23 64 65 66 69 6e 65 20 54 4b 5f 54 4f 5f 54 .#define TK_TO_T
5a4d0 45 58 54 20 20 20 20 20 20 20 20 20 20 20 20 20 EXT
5a4e0 20 20 20 20 20 20 20 20 20 20 20 31 34 31 0d 0a 141..
5a4f0 23 64 65 66 69 6e 65 20 54 4b 5f 54 4f 5f 42 4c #define TK_TO_BL
5a500 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 OB
5a510 20 20 20 20 20 20 20 20 20 20 31 34 32 0d 0a 23 142..#
5a520 64 65 66 69 6e 65 20 54 4b 5f 54 4f 5f 4e 55 4d define TK_TO_NUM
5a530 45 52 49 43 20 20 20 20 20 20 20 20 20 20 20 20 ERIC
5a540 20 20 20 20 20 20 20 20 20 31 34 33 0d 0a 23 64 143..#d
5a550 65 66 69 6e 65 20 54 4b 5f 54 4f 5f 49 4e 54 20 efine TK_TO_INT
5a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a570 20 20 20 20 20 20 20 20 31 34 34 0d 0a 23 64 65 144..#de
5a580 66 69 6e 65 20 54 4b 5f 54 4f 5f 52 45 41 4c 20 fine TK_TO_REAL
5a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a5a0 20 20 20 20 20 20 20 31 34 35 0d 0a 23 64 65 66 145..#def
5a5b0 69 6e 65 20 54 4b 5f 49 53 4e 4f 54 20 20 20 20 ine TK_ISNOT
5a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a5d0 20 20 20 20 20 20 31 34 36 0d 0a 23 64 65 66 69 146..#defi
5a5e0 6e 65 20 54 4b 5f 45 4e 44 5f 4f 46 5f 46 49 4c ne TK_END_OF_FIL
5a5f0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
5a600 20 20 20 20 20 31 34 37 0d 0a 23 64 65 66 69 6e 147..#defin
5a610 65 20 54 4b 5f 49 4c 4c 45 47 41 4c 20 20 20 20 e TK_ILLEGAL
5a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a630 20 20 20 20 31 34 38 0d 0a 23 64 65 66 69 6e 65 148..#define
5a640 20 54 4b 5f 53 50 41 43 45 20 20 20 20 20 20 20 TK_SPACE
5a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a660 20 20 20 31 34 39 0d 0a 23 64 65 66 69 6e 65 20 149..#define
5a670 54 4b 5f 55 4e 43 4c 4f 53 45 44 5f 53 54 52 49 TK_UNCLOSED_STRI
5a680 4e 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 NG
5a690 20 20 31 35 30 0d 0a 23 64 65 66 69 6e 65 20 54 150..#define T
5a6a0 4b 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 K_FUNCTION
5a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a6c0 20 31 35 31 0d 0a 23 64 65 66 69 6e 65 20 54 4b 151..#define TK
5a6d0 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 _COLUMN
5a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a6f0 31 35 32 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 152..#define TK_
5a700 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 AGG_FUNCTION
5a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
5a720 35 33 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 41 53..#define TK_A
5a730 47 47 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 GG_COLUMN
5a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35 15
5a750 34 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 43 4f 4..#define TK_CO
5a760 4e 53 54 5f 46 55 4e 43 20 20 20 20 20 20 20 20 NST_FUNC
5a770 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35 35 155
5a780 0d 0a 23 64 65 66 69 6e 65 20 54 4b 5f 55 4d 49 ..#define TK_UMI
5a790 4e 55 53 20 20 20 20 20 20 20 20 20 20 20 20 20 NUS
5a7a0 20 20 20 20 20 20 20 20 20 20 20 20 31 35 36 0d 156.
5a7b0 0a 23 64 65 66 69 6e 65 20 54 4b 5f 55 50 4c 55 .#define TK_UPLU
5a7c0 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 S
5a7d0 20 20 20 20 20 20 20 20 20 20 20 31 35 37 0d 0a 157..
5a7e0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
5a7f0 2a 20 45 6e 64 20 6f 66 20 70 61 72 73 65 2e 68 * End of parse.h
5a800 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
5a810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5a830 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /../************
5a840 2a 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 ** Continuing wh
5a850 65 72 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 ere we left off
5a860 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a in sqliteInt.h *
5a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5a880 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 */..#include <st
5a890 64 69 6f 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 dio.h>..#include
5a8a0 20 3c 73 74 64 6c 69 62 2e 68 3e 0d 0a 23 69 6e <stdlib.h>..#in
5a8b0 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e clude <string.h>
5a8c0 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 ..#include <asse
5a8d0 72 74 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 rt.h>..#include
5a8e0 3c 73 74 64 64 65 66 2e 68 3e 0d 0a 0d 0a 2f 2a <stddef.h>..../*
5a8f0 0d 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 69 6e ..** If compilin
5a900 67 20 66 6f 72 20 61 20 70 72 6f 63 65 73 73 6f g for a processo
5a910 72 20 74 68 61 74 20 6c 61 63 6b 73 20 66 6c 6f r that lacks flo
5a920 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 70 70 ating point supp
5a930 6f 72 74 2c 0d 0a 2a 2a 20 73 75 62 73 74 69 74 ort,..** substit
5a940 75 74 65 20 69 6e 74 65 67 65 72 20 66 6f 72 20 ute integer for
5a950 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0d 0a floating-point..
5a960 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
5a970 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f E_OMIT_FLOATING_
5a980 50 4f 49 4e 54 0d 0a 23 20 64 65 66 69 6e 65 20 POINT..# define
5a990 64 6f 75 62 6c 65 20 73 71 6c 69 74 65 5f 69 6e double sqlite_in
5a9a0 74 36 34 0d 0a 23 20 64 65 66 69 6e 65 20 66 6c t64..# define fl
5a9b0 6f 61 74 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 oat sqlite_int64
5a9c0 0d 0a 23 20 64 65 66 69 6e 65 20 4c 4f 4e 47 44 ..# define LONGD
5a9d0 4f 55 42 4c 45 5f 54 59 50 45 20 73 71 6c 69 74 OUBLE_TYPE sqlit
5a9e0 65 5f 69 6e 74 36 34 0d 0a 23 20 69 66 6e 64 65 e_int64..# ifnde
5a9f0 66 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c f SQLITE_BIG_DBL
5aa00 0d 0a 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c ..# define SQL
5aa10 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 28 28 73 ITE_BIG_DBL (((s
5aa20 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 29 3c qlite3_int64)1)<
5aa30 3c 35 30 29 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 <50)..# endif..#
5aa40 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f define SQLITE_O
5aa50 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e MIT_DATETIME_FUN
5aa60 43 53 20 31 0d 0a 23 20 64 65 66 69 6e 65 20 53 CS 1..# define S
5aa70 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
5aa80 20 31 0d 0a 23 20 75 6e 64 65 66 20 53 51 4c 49 1..# undef SQLI
5aa90 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f TE_MIXED_ENDIAN_
5aaa0 36 34 42 49 54 5f 46 4c 4f 41 54 0d 0a 23 20 75 64BIT_FLOAT..# u
5aab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 ndef SQLITE_HAVE
5aac0 5f 49 53 4e 41 4e 0d 0a 23 65 6e 64 69 66 0d 0a _ISNAN..#endif..
5aad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 #ifndef SQLITE_B
5aae0 49 47 5f 44 42 4c 0d 0a 23 20 64 65 66 69 6e 65 IG_DBL..# define
5aaf0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 SQLITE_BIG_DBL
5ab00 28 31 65 39 39 29 0d 0a 23 65 6e 64 69 66 0d 0a (1e99)..#endif..
5ab10 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 4d 49 54 5f 54 45 ../*..** OMIT_TE
5ab20 4d 50 44 42 20 69 73 20 73 65 74 20 74 6f 20 31 MPDB is set to 1
5ab30 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f if SQLITE_OMIT_
5ab40 54 45 4d 50 44 42 20 69 73 20 64 65 66 69 6e 65 TEMPDB is define
5ab50 64 2c 20 6f 72 20 30 0d 0a 2a 2a 20 61 66 74 65 d, or 0..** afte
5ab60 72 77 61 72 64 2e 20 48 61 76 69 6e 67 20 74 68 rward. Having th
5ab70 69 73 20 6d 61 63 72 6f 20 61 6c 6c 6f 77 73 20 is macro allows
5ab80 75 73 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 us to cause the
5ab90 43 20 63 6f 6d 70 69 6c 65 72 20 0d 0a 2a 2a 20 C compiler ..**
5aba0 74 6f 20 6f 6d 69 74 20 63 6f 64 65 20 75 73 65 to omit code use
5abb0 64 20 62 79 20 54 45 4d 50 20 74 61 62 6c 65 73 d by TEMP tables
5abc0 20 77 69 74 68 6f 75 74 20 6d 65 73 73 79 20 23 without messy #
5abd0 69 66 6e 64 65 66 20 73 74 61 74 65 6d 65 6e 74 ifndef statement
5abe0 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 s...*/..#ifdef S
5abf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 QLITE_OMIT_TEMPD
5ac00 42 0d 0a 23 64 65 66 69 6e 65 20 4f 4d 49 54 5f B..#define OMIT_
5ac10 54 45 4d 50 44 42 20 31 0d 0a 23 65 6c 73 65 0d TEMPDB 1..#else.
5ac20 0a 23 64 65 66 69 6e 65 20 4f 4d 49 54 5f 54 45 .#define OMIT_TE
5ac30 4d 50 44 42 20 30 0d 0a 23 65 6e 64 69 66 0d 0a MPDB 0..#endif..
5ac40 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 22 66 69 ../*..** The "fi
5ac50 6c 65 20 66 6f 72 6d 61 74 22 20 6e 75 6d 62 65 le format" numbe
5ac60 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 r is an integer
5ac70 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e that is incremen
5ac80 74 65 64 20 77 68 65 6e 65 76 65 72 0d 0a 2a 2a ted whenever..**
5ac90 20 74 68 65 20 56 44 42 45 2d 6c 65 76 65 6c 20 the VDBE-level
5aca0 66 69 6c 65 20 66 6f 72 6d 61 74 20 63 68 61 6e file format chan
5acb0 67 65 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 ges. The follow
5acc0 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69 6e ing macros defin
5acd0 65 20 74 68 65 0d 0a 2a 2a 20 74 68 65 20 64 65 e the..** the de
5ace0 66 61 75 6c 74 20 66 69 6c 65 20 66 6f 72 6d 61 fault file forma
5acf0 74 20 66 6f 72 20 6e 65 77 20 64 61 74 61 62 61 t for new databa
5ad00 73 65 73 20 61 6e 64 20 74 68 65 20 6d 61 78 69 ses and the maxi
5ad10 6d 75 6d 20 66 69 6c 65 20 66 6f 72 6d 61 74 0d mum file format.
5ad20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 69 62 .** that the lib
5ad30 72 61 72 79 20 63 61 6e 20 72 65 61 64 2e 0d 0a rary can read...
5ad40 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
5ad50 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d TE_MAX_FILE_FORM
5ad60 41 54 20 34 0d 0a 23 69 66 6e 64 65 66 20 53 51 AT 4..#ifndef SQ
5ad70 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c LITE_DEFAULT_FIL
5ad80 45 5f 46 4f 52 4d 41 54 0d 0a 23 20 64 65 66 69 E_FORMAT..# defi
5ad90 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ne SQLITE_DEFAUL
5ada0 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 34 0d T_FILE_FORMAT 4.
5adb0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
5adc0 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 * Determine whet
5add0 68 65 72 20 74 72 69 67 67 65 72 73 20 61 72 65 her triggers are
5ade0 20 72 65 63 75 72 73 69 76 65 20 62 79 20 64 65 recursive by de
5adf0 66 61 75 6c 74 2e 20 20 54 68 69 73 20 63 61 6e fault. This can
5ae00 20 62 65 0d 0a 2a 2a 20 63 68 61 6e 67 65 64 20 be..** changed
5ae10 61 74 20 72 75 6e 2d 74 69 6d 65 20 75 73 69 6e at run-time usin
5ae20 67 20 61 20 70 72 61 67 6d 61 2e 0d 0a 2a 2f 0d g a pragma...*/.
5ae30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
5ae40 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 DEFAULT_RECURSIV
5ae50 45 5f 54 52 49 47 47 45 52 53 0d 0a 23 20 64 65 E_TRIGGERS..# de
5ae60 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 fine SQLITE_DEFA
5ae70 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 ULT_RECURSIVE_TR
5ae80 49 47 47 45 52 53 20 30 0d 0a 23 65 6e 64 69 66 IGGERS 0..#endif
5ae90 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 6f 76 69 ..../*..** Provi
5aea0 64 65 20 61 20 64 65 66 61 75 6c 74 20 76 61 6c de a default val
5aeb0 75 65 20 66 6f 72 20 53 51 4c 49 54 45 5f 54 45 ue for SQLITE_TE
5aec0 4d 50 5f 53 54 4f 52 45 20 69 6e 20 63 61 73 65 MP_STORE in case
5aed0 20 69 74 20 69 73 20 6e 6f 74 20 73 70 65 63 69 it is not speci
5aee0 66 69 65 64 0d 0a 2a 2a 20 6f 6e 20 74 68 65 20 fied..** on the
5aef0 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0d 0a 2a 2f command-line..*/
5af00 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
5af10 5f 54 45 4d 50 5f 53 54 4f 52 45 0d 0a 23 20 64 _TEMP_STORE..# d
5af20 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 4d efine SQLITE_TEM
5af30 50 5f 53 54 4f 52 45 20 31 0d 0a 23 65 6e 64 69 P_STORE 1..#endi
5af40 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 43 43 20 f..../*..** GCC
5af50 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 does not define
5af60 74 68 65 20 6f 66 66 73 65 74 6f 66 28 29 20 6d the offsetof() m
5af70 61 63 72 6f 20 73 6f 20 77 65 27 6c 6c 20 68 61 acro so we'll ha
5af80 76 65 20 74 6f 20 64 6f 20 69 74 0d 0a 2a 2a 20 ve to do it..**
5af90 6f 75 72 73 65 6c 76 65 73 2e 0d 0a 2a 2f 0d 0a ourselves...*/..
5afa0 23 69 66 6e 64 65 66 20 6f 66 66 73 65 74 6f 66 #ifndef offsetof
5afb0 0d 0a 23 64 65 66 69 6e 65 20 6f 66 66 73 65 74 ..#define offset
5afc0 6f 66 28 53 54 52 55 43 54 55 52 45 2c 46 49 45 of(STRUCTURE,FIE
5afd0 4c 44 29 20 28 28 69 6e 74 29 28 28 63 68 61 72 LD) ((int)((char
5afe0 2a 29 26 28 28 53 54 52 55 43 54 55 52 45 2a 29 *)&((STRUCTURE*)
5aff0 30 29 2d 3e 46 49 45 4c 44 29 29 0d 0a 23 65 6e 0)->FIELD))..#en
5b000 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 dif..../*..** Ch
5b010 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
5b020 69 73 20 6d 61 63 68 69 6e 65 20 75 73 65 73 20 is machine uses
5b030 45 42 43 44 49 43 2e 20 20 28 59 65 73 2c 20 62 EBCDIC. (Yes, b
5b040 65 6c 69 65 76 65 20 69 74 20 6f 72 0d 0a 2a 2a elieve it or..**
5b050 20 6e 6f 74 2c 20 74 68 65 72 65 20 61 72 65 20 not, there are
5b060 73 74 69 6c 6c 20 6d 61 63 68 69 6e 65 73 20 6f still machines o
5b070 75 74 20 74 68 65 72 65 20 74 68 61 74 20 75 73 ut there that us
5b080 65 20 45 42 43 44 49 43 2e 29 0d 0a 2a 2f 0d 0a e EBCDIC.)..*/..
5b090 23 69 66 20 27 41 27 20 3d 3d 20 27 5c 33 30 31 #if 'A' == '\301
5b0a0 27 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 '..# define SQLI
5b0b0 54 45 5f 45 42 43 44 49 43 20 31 0d 0a 23 65 6c TE_EBCDIC 1..#el
5b0c0 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c se..# define SQL
5b0d0 49 54 45 5f 41 53 43 49 49 20 31 0d 0a 23 65 6e ITE_ASCII 1..#en
5b0e0 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e dif..../*..** In
5b0f0 74 65 67 65 72 73 20 6f 66 20 6b 6e 6f 77 6e 20 tegers of known
5b100 73 69 7a 65 73 2e 20 20 54 68 65 73 65 20 74 79 sizes. These ty
5b110 70 65 64 65 66 73 20 6d 69 67 68 74 20 63 68 61 pedefs might cha
5b120 6e 67 65 20 66 6f 72 20 61 72 63 68 69 74 65 63 nge for architec
5b130 74 75 72 65 73 0d 0a 2a 2a 20 77 68 65 72 65 20 tures..** where
5b140 74 68 65 20 73 69 7a 65 73 20 76 65 72 79 2e 20 the sizes very.
5b150 20 50 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 Preprocessor ma
5b160 63 72 6f 73 20 61 72 65 20 61 76 61 69 6c 61 62 cros are availab
5b170 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 0d 0a le so that the..
5b180 2a 2a 20 74 79 70 65 73 20 63 61 6e 20 62 65 20 ** types can be
5b190 63 6f 6e 76 65 6e 69 65 6e 74 6c 79 20 72 65 64 conveniently red
5b1a0 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c efined at compil
5b1b0 65 2d 74 79 70 65 2e 20 20 4c 69 6b 65 20 74 68 e-type. Like th
5b1c0 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 is:..**..**
5b1d0 20 20 20 20 63 63 20 27 2d 44 55 49 4e 54 50 54 cc '-DUINTPT
5b1e0 52 5f 54 59 50 45 3d 6c 6f 6e 67 20 6c 6f 6e 67 R_TYPE=long long
5b1f0 20 69 6e 74 27 20 2e 2e 2e 0d 0a 2a 2f 0d 0a 23 int' .....*/..#
5b200 69 66 6e 64 65 66 20 55 49 4e 54 33 32 5f 54 59 ifndef UINT32_TY
5b210 50 45 0d 0a 23 20 69 66 64 65 66 20 48 41 56 45 PE..# ifdef HAVE
5b220 5f 55 49 4e 54 33 32 5f 54 0d 0a 23 20 20 64 65 _UINT32_T..# de
5b230 66 69 6e 65 20 55 49 4e 54 33 32 5f 54 59 50 45 fine UINT32_TYPE
5b240 20 75 69 6e 74 33 32 5f 74 0d 0a 23 20 65 6c 73 uint32_t..# els
5b250 65 0d 0a 23 20 20 64 65 66 69 6e 65 20 55 49 4e e..# define UIN
5b260 54 33 32 5f 54 59 50 45 20 75 6e 73 69 67 6e 65 T32_TYPE unsigne
5b270 64 20 69 6e 74 0d 0a 23 20 65 6e 64 69 66 0d 0a d int..# endif..
5b280 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 #endif..#ifndef
5b290 55 49 4e 54 31 36 5f 54 59 50 45 0d 0a 23 20 69 UINT16_TYPE..# i
5b2a0 66 64 65 66 20 48 41 56 45 5f 55 49 4e 54 31 36 fdef HAVE_UINT16
5b2b0 5f 54 0d 0a 23 20 20 64 65 66 69 6e 65 20 55 49 _T..# define UI
5b2c0 4e 54 31 36 5f 54 59 50 45 20 75 69 6e 74 31 36 NT16_TYPE uint16
5b2d0 5f 74 0d 0a 23 20 65 6c 73 65 0d 0a 23 20 20 64 _t..# else..# d
5b2e0 65 66 69 6e 65 20 55 49 4e 54 31 36 5f 54 59 50 efine UINT16_TYP
5b2f0 45 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 E unsigned short
5b300 20 69 6e 74 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 int..# endif..#
5b310 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 49 endif..#ifndef I
5b320 4e 54 31 36 5f 54 59 50 45 0d 0a 23 20 69 66 64 NT16_TYPE..# ifd
5b330 65 66 20 48 41 56 45 5f 49 4e 54 31 36 5f 54 0d ef HAVE_INT16_T.
5b340 0a 23 20 20 64 65 66 69 6e 65 20 49 4e 54 31 36 .# define INT16
5b350 5f 54 59 50 45 20 69 6e 74 31 36 5f 74 0d 0a 23 _TYPE int16_t..#
5b360 20 65 6c 73 65 0d 0a 23 20 20 64 65 66 69 6e 65 else..# define
5b370 20 49 4e 54 31 36 5f 54 59 50 45 20 73 68 6f 72 INT16_TYPE shor
5b380 74 20 69 6e 74 0d 0a 23 20 65 6e 64 69 66 0d 0a t int..# endif..
5b390 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 #endif..#ifndef
5b3a0 55 49 4e 54 38 5f 54 59 50 45 0d 0a 23 20 69 66 UINT8_TYPE..# if
5b3b0 64 65 66 20 48 41 56 45 5f 55 49 4e 54 38 5f 54 def HAVE_UINT8_T
5b3c0 0d 0a 23 20 20 64 65 66 69 6e 65 20 55 49 4e 54 ..# define UINT
5b3d0 38 5f 54 59 50 45 20 75 69 6e 74 38 5f 74 0d 0a 8_TYPE uint8_t..
5b3e0 23 20 65 6c 73 65 0d 0a 23 20 20 64 65 66 69 6e # else..# defin
5b3f0 65 20 55 49 4e 54 38 5f 54 59 50 45 20 75 6e 73 e UINT8_TYPE uns
5b400 69 67 6e 65 64 20 63 68 61 72 0d 0a 23 20 65 6e igned char..# en
5b410 64 69 66 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 dif..#endif..#if
5b420 6e 64 65 66 20 49 4e 54 38 5f 54 59 50 45 0d 0a ndef INT8_TYPE..
5b430 23 20 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 # ifdef HAVE_INT
5b440 38 5f 54 0d 0a 23 20 20 64 65 66 69 6e 65 20 49 8_T..# define I
5b450 4e 54 38 5f 54 59 50 45 20 69 6e 74 38 5f 74 0d NT8_TYPE int8_t.
5b460 0a 23 20 65 6c 73 65 0d 0a 23 20 20 64 65 66 69 .# else..# defi
5b470 6e 65 20 49 4e 54 38 5f 54 59 50 45 20 73 69 67 ne INT8_TYPE sig
5b480 6e 65 64 20 63 68 61 72 0d 0a 23 20 65 6e 64 69 ned char..# endi
5b490 66 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 f..#endif..#ifnd
5b4a0 65 66 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 ef LONGDOUBLE_TY
5b4b0 50 45 0d 0a 23 20 64 65 66 69 6e 65 20 4c 4f 4e PE..# define LON
5b4c0 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 6c 6f 6e GDOUBLE_TYPE lon
5b4d0 67 20 64 6f 75 62 6c 65 0d 0a 23 65 6e 64 69 66 g double..#endif
5b4e0 0d 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 ..typedef sqlite
5b4f0 5f 69 6e 74 36 34 20 69 36 34 3b 20 20 20 20 20 _int64 i64;
5b500 20 20 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 /* 8-byte s
5b510 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
5b520 0d 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 ..typedef sqlite
5b530 5f 75 69 6e 74 36 34 20 75 36 34 3b 20 20 20 20 _uint64 u64;
5b540 20 20 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 75 /* 8-byte u
5b550 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 nsigned integer
5b560 2a 2f 0d 0a 74 79 70 65 64 65 66 20 55 49 4e 54 */..typedef UINT
5b570 33 32 5f 54 59 50 45 20 75 33 32 3b 20 20 20 20 32_TYPE u32;
5b580 20 20 20 20 20 20 20 2f 2a 20 34 2d 62 79 74 65 /* 4-byte
5b590 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 unsigned intege
5b5a0 72 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 55 49 r */..typedef UI
5b5b0 4e 54 31 36 5f 54 59 50 45 20 75 31 36 3b 20 20 NT16_TYPE u16;
5b5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 2d 62 79 /* 2-by
5b5d0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 te unsigned inte
5b5e0 67 65 72 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 ger */..typedef
5b5f0 49 4e 54 31 36 5f 54 59 50 45 20 69 31 36 3b 20 INT16_TYPE i16;
5b600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 2d /* 2-
5b610 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 byte signed inte
5b620 67 65 72 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 ger */..typedef
5b630 55 49 4e 54 38 5f 54 59 50 45 20 75 38 3b 20 20 UINT8_TYPE u8;
5b640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 2d /* 1-
5b650 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e byte unsigned in
5b660 74 65 67 65 72 20 2a 2f 0d 0a 74 79 70 65 64 65 teger */..typede
5b670 66 20 49 4e 54 38 5f 54 59 50 45 20 69 38 3b 20 f INT8_TYPE i8;
5b680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5b690 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 1-byte signed in
5b6a0 74 65 67 65 72 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a teger */..../*..
5b6b0 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 ** SQLITE_MAX_U3
5b6c0 32 20 69 73 20 61 20 75 36 34 20 63 6f 6e 73 74 2 is a u64 const
5b6d0 61 6e 74 20 74 68 61 74 20 69 73 20 74 68 65 20 ant that is the
5b6e0 6d 61 78 69 6d 75 6d 20 75 36 34 20 76 61 6c 75 maximum u64 valu
5b6f0 65 0d 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 e..** that can b
5b700 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 75 33 e stored in a u3
5b710 32 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 2 without loss o
5b720 66 20 64 61 74 61 2e 20 20 54 68 65 20 76 61 6c f data. The val
5b730 75 65 0d 0a 2a 2a 20 69 73 20 30 78 30 30 30 30 ue..** is 0x0000
5b740 30 30 30 30 66 66 66 66 66 66 66 66 2e 20 20 42 0000ffffffff. B
5b750 75 74 20 62 65 63 61 75 73 65 20 6f 66 20 71 75 ut because of qu
5b760 69 72 6b 73 20 6f 66 20 73 6f 6d 65 20 63 6f 6d irks of some com
5b770 70 69 6c 65 72 73 2c 20 77 65 0d 0a 2a 2a 20 68 pilers, we..** h
5b780 61 76 65 20 74 6f 20 73 70 65 63 69 66 79 20 74 ave to specify t
5b790 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 he value in the
5b7a0 6c 65 73 73 20 69 6e 74 75 69 74 69 76 65 20 6d less intuitive m
5b7b0 61 6e 6e 65 72 20 73 68 6f 77 6e 3a 0d 0a 2a 2f anner shown:..*/
5b7c0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
5b7d0 5f 4d 41 58 5f 55 33 32 20 20 28 28 28 28 75 36 _MAX_U32 ((((u6
5b7e0 34 29 31 29 3c 3c 33 32 29 2d 31 29 0d 0a 0d 0a 4)1)<<32)-1)....
5b7f0 2f 2a 0d 0a 2a 2a 20 54 68 65 20 64 61 74 61 74 /*..** The datat
5b800 79 70 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 ype used to stor
5b810 65 20 65 73 74 69 6d 61 74 65 73 20 6f 66 20 74 e estimates of t
5b820 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 he number of row
5b830 73 20 69 6e 20 61 0d 0a 2a 2a 20 74 61 62 6c 65 s in a..** table
5b840 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 69 73 or index. This
5b850 20 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 is an unsigned
5b860 69 6e 74 65 67 65 72 20 74 79 70 65 2e 20 20 46 integer type. F
5b870 6f 72 20 39 39 2e 39 25 20 6f 66 0d 0a 2a 2a 20 or 99.9% of..**
5b880 74 68 65 20 77 6f 72 6c 64 2c 20 61 20 33 32 2d the world, a 32-
5b890 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 20 73 bit integer is s
5b8a0 75 66 66 69 63 69 65 6e 74 2e 20 20 42 75 74 20 ufficient. But
5b8b0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 a 64-bit integer
5b8c0 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 ..** can be used
5b8d0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 at compile-time
5b8e0 20 69 66 20 64 65 73 69 72 65 64 2e 0d 0a 2a 2f if desired...*/
5b8f0 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
5b900 36 34 42 49 54 5f 53 54 41 54 53 0d 0a 20 74 79 64BIT_STATS.. ty
5b910 70 65 64 65 66 20 75 36 34 20 74 52 6f 77 63 6e pedef u64 tRowcn
5b920 74 3b 20 20 20 20 2f 2a 20 36 34 2d 62 69 74 20 t; /* 64-bit
5b930 6f 6e 6c 79 20 69 66 20 72 65 71 75 65 73 74 65 only if requeste
5b940 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d d at compile-tim
5b950 65 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 20 74 79 e */..#else.. ty
5b960 70 65 64 65 66 20 75 33 32 20 74 52 6f 77 63 6e pedef u32 tRowcn
5b970 74 3b 20 20 20 20 2f 2a 20 33 32 2d 62 69 74 20 t; /* 32-bit
5b980 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 2a is the default *
5b990 2f 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d /..#endif..../*.
5b9a0 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20 64 65 .** Macros to de
5b9b0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 termine whether
5b9c0 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 62 the machine is b
5b9d0 69 67 20 6f 72 20 6c 69 74 74 6c 65 20 65 6e 64 ig or little end
5b9e0 69 61 6e 2c 0d 0a 2a 2a 20 65 76 61 6c 75 61 74 ian,..** evaluat
5b9f0 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e 0d 0a ed at runtime...
5ba00 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
5ba10 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0d 0a E_AMALGAMATION..
5ba20 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 SQLITE_PRIVATE c
5ba30 6f 6e 73 74 20 69 6e 74 20 73 71 6c 69 74 65 33 onst int sqlite3
5ba40 6f 6e 65 20 3d 20 31 3b 0d 0a 23 65 6c 73 65 0d one = 1;..#else.
5ba50 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
5ba60 63 6f 6e 73 74 20 69 6e 74 20 73 71 6c 69 74 65 const int sqlite
5ba70 33 6f 6e 65 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 3one;..#endif..#
5ba80 69 66 20 64 65 66 69 6e 65 64 28 69 33 38 36 29 if defined(i386)
5ba90 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 33 || defined(__i3
5baa0 38 36 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 86__) || defined
5bab0 28 5f 4d 5f 49 58 38 36 29 5c 0d 0a 20 20 20 20 (_M_IX86)\..
5bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5bad0 20 20 20 20 20 20 20 20 20 7c 7c 20 64 65 66 69 || defi
5bae0 6e 65 64 28 5f 5f 78 38 36 5f 36 34 29 20 7c 7c ned(__x86_64) ||
5baf0 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 defined(__x86_6
5bb00 34 5f 5f 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 4__)..# define S
5bb10 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 20 QLITE_BIGENDIAN
5bb20 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 53 0..# define S
5bb30 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 QLITE_LITTLEENDI
5bb40 41 4e 20 31 0d 0a 23 20 64 65 66 69 6e 65 20 53 AN 1..# define S
5bb50 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 QLITE_UTF16NATIV
5bb60 45 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c E SQLITE_UTF16L
5bb70 45 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 E..#else..# defi
5bb80 6e 65 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 ne SQLITE_BIGEND
5bb90 49 41 4e 20 20 20 20 28 2a 28 63 68 61 72 20 2a IAN (*(char *
5bba0 29 28 26 73 71 6c 69 74 65 33 6f 6e 65 29 3d 3d )(&sqlite3one)==
5bbb0 30 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 0)..# define SQL
5bbc0 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e ITE_LITTLEENDIAN
5bbd0 20 28 2a 28 63 68 61 72 20 2a 29 28 26 73 71 6c (*(char *)(&sql
5bbe0 69 74 65 33 6f 6e 65 29 3d 3d 31 29 0d 0a 23 20 ite3one)==1)..#
5bbf0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 54 define SQLITE_UT
5bc00 46 31 36 4e 41 54 49 56 45 20 28 53 51 4c 49 54 F16NATIVE (SQLIT
5bc10 45 5f 42 49 47 45 4e 44 49 41 4e 3f 53 51 4c 49 E_BIGENDIAN?SQLI
5bc20 54 45 5f 55 54 46 31 36 42 45 3a 53 51 4c 49 54 TE_UTF16BE:SQLIT
5bc30 45 5f 55 54 46 31 36 4c 45 29 0d 0a 23 65 6e 64 E_UTF16LE)..#end
5bc40 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e if..../*..** Con
5bc50 73 74 61 6e 74 73 20 66 6f 72 20 74 68 65 20 6c stants for the l
5bc60 61 72 67 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c argest and small
5bc70 65 73 74 20 70 6f 73 73 69 62 6c 65 20 36 34 2d est possible 64-
5bc80 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 bit signed integ
5bc90 65 72 73 2e 0d 0a 2a 2a 20 54 68 65 73 65 20 6d ers...** These m
5bca0 61 63 72 6f 73 20 61 72 65 20 64 65 73 69 67 6e acros are design
5bcb0 65 64 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 ed to work corre
5bcc0 63 74 6c 79 20 6f 6e 20 62 6f 74 68 20 33 32 2d ctly on both 32-
5bcd0 62 69 74 20 61 6e 64 20 36 34 2d 62 69 74 0d 0a bit and 64-bit..
5bce0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 2e 0d 0a 2a ** compilers...*
5bcf0 2f 0d 0a 23 64 65 66 69 6e 65 20 4c 41 52 47 45 /..#define LARGE
5bd00 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66 66 ST_INT64 (0xfff
5bd10 66 66 66 66 66 7c 28 28 28 69 36 34 29 30 78 37 fffff|(((i64)0x7
5bd20 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0d 0a fffffff)<<32))..
5bd30 23 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 #define SMALLEST
5bd40 5f 49 4e 54 36 34 20 28 28 28 69 36 34 29 2d 31 _INT64 (((i64)-1
5bd50 29 20 2d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 ) - LARGEST_INT6
5bd60 34 29 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 52 6f 4)..../* ..** Ro
5bd70 75 6e 64 20 75 70 20 61 20 6e 75 6d 62 65 72 20 und up a number
5bd80 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 61 72 67 to the next larg
5bd90 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 er multiple of 8
5bda0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0d . This is used.
5bdb0 0a 2a 2a 20 74 6f 20 66 6f 72 63 65 20 38 2d 62 .** to force 8-b
5bdc0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 6e yte alignment on
5bdd0 20 36 34 2d 62 69 74 20 61 72 63 68 69 74 65 63 64-bit architec
5bde0 74 75 72 65 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 tures...*/..#def
5bdf0 69 6e 65 20 52 4f 55 4e 44 38 28 78 29 20 20 20 ine ROUND8(x)
5be00 20 20 28 28 28 78 29 2b 37 29 26 7e 37 29 0d 0a (((x)+7)&~7)..
5be10 0d 0a 2f 2a 0d 0a 2a 2a 20 52 6f 75 6e 64 20 64 ../*..** Round d
5be20 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 own to the neare
5be30 73 74 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 st multiple of 8
5be40 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 52 4f ..*/..#define RO
5be50 55 4e 44 44 4f 57 4e 38 28 78 29 20 28 28 78 29 UNDDOWN8(x) ((x)
5be60 26 7e 37 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 &~7)..../*..** A
5be70 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70 ssert that the p
5be80 6f 69 6e 74 65 72 20 58 20 69 73 20 61 6c 69 67 ointer X is alig
5be90 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 ned to an 8-byte
5bea0 20 62 6f 75 6e 64 61 72 79 2e 20 20 54 68 69 73 boundary. This
5beb0 0d 0a 2a 2a 20 6d 61 63 72 6f 20 69 73 20 75 73 ..** macro is us
5bec0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 ed only within a
5bed0 73 73 65 72 74 28 29 20 74 6f 20 76 65 72 69 66 ssert() to verif
5bee0 79 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 y that the code
5bef0 67 65 74 73 0d 0a 2a 2a 20 61 6c 6c 20 61 6c 69 gets..** all ali
5bf00 67 6e 6d 65 6e 74 20 72 65 73 74 72 69 63 74 69 gnment restricti
5bf10 6f 6e 73 20 63 6f 72 72 65 63 74 2e 0d 0a 2a 2a ons correct...**
5bf20 0d 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 ..** Except, if
5bf30 53 51 4c 49 54 45 5f 34 5f 42 59 54 45 5f 41 4c SQLITE_4_BYTE_AL
5bf40 49 47 4e 45 44 5f 4d 41 4c 4c 4f 43 20 69 73 20 IGNED_MALLOC is
5bf50 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 defined, then th
5bf60 65 0d 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 e..** underlying
5bf70 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d malloc() implem
5bf80 65 6e 74 69 6f 6e 20 6d 69 67 68 74 20 72 65 74 ention might ret
5bf90 75 72 6e 20 75 73 20 34 2d 62 79 74 65 20 61 6c urn us 4-byte al
5bfa0 69 67 6e 65 64 0d 0a 2a 2a 20 70 6f 69 6e 74 65 igned..** pointe
5bfb0 72 73 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 rs. In that cas
5bfc0 65 2c 20 6f 6e 6c 79 20 76 65 72 69 66 79 20 34 e, only verify 4
5bfd0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 2e -byte alignment.
5bfe0 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c ..*/..#ifdef SQL
5bff0 49 54 45 5f 34 5f 42 59 54 45 5f 41 4c 49 47 4e ITE_4_BYTE_ALIGN
5c000 45 44 5f 4d 41 4c 4c 4f 43 0d 0a 23 20 64 65 66 ED_MALLOC..# def
5c010 69 6e 65 20 45 49 47 48 54 5f 42 59 54 45 5f 41 ine EIGHT_BYTE_A
5c020 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 LIGNMENT(X) ((
5c030 28 28 63 68 61 72 2a 29 28 58 29 20 2d 20 28 63 ((char*)(X) - (c
5c040 68 61 72 2a 29 30 29 26 33 29 3d 3d 30 29 0d 0a har*)0)&3)==0)..
5c050 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 #else..# define
5c060 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e EIGHT_BYTE_ALIGN
5c070 4d 45 4e 54 28 58 29 20 20 20 28 28 28 28 63 68 MENT(X) ((((ch
5c080 61 72 2a 29 28 58 29 20 2d 20 28 63 68 61 72 2a ar*)(X) - (char*
5c090 29 30 29 26 37 29 3d 3d 30 29 0d 0a 23 65 6e 64 )0)&7)==0)..#end
5c0a0 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 if....../*..** A
5c0b0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 n instance of th
5c0c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 e following stru
5c0d0 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f cture is used to
5c0e0 20 73 74 6f 72 65 20 74 68 65 20 62 75 73 79 2d store the busy-
5c0f0 68 61 6e 64 6c 65 72 0d 0a 2a 2a 20 63 61 6c 6c handler..** call
5c100 62 61 63 6b 20 66 6f 72 20 61 20 67 69 76 65 6e back for a given
5c110 20 73 71 6c 69 74 65 20 68 61 6e 64 6c 65 2e 20 sqlite handle.
5c120 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c ..**..** The sql
5c130 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 ite.busyHandler
5c140 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 73 71 member of the sq
5c150 6c 69 74 65 20 73 74 72 75 63 74 20 63 6f 6e 74 lite struct cont
5c160 61 69 6e 73 20 74 68 65 20 62 75 73 79 0d 0a 2a ains the busy..*
5c170 2a 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 * callback for t
5c180 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 he database hand
5c190 6c 65 2e 20 45 61 63 68 20 70 61 67 65 72 20 6f le. Each pager o
5c1a0 70 65 6e 65 64 20 76 69 61 20 74 68 65 20 73 71 pened via the sq
5c1b0 6c 69 74 65 0d 0a 2a 2a 20 68 61 6e 64 6c 65 20 lite..** handle
5c1c0 69 73 20 70 61 73 73 65 64 20 61 20 70 6f 69 6e is passed a poin
5c1d0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 ter to sqlite.bu
5c1e0 73 79 48 61 6e 64 6c 65 72 2e 20 54 68 65 20 62 syHandler. The b
5c1f0 75 73 79 2d 68 61 6e 64 6c 65 72 0d 0a 2a 2a 20 usy-handler..**
5c200 63 61 6c 6c 62 61 63 6b 20 69 73 20 63 75 72 72 callback is curr
5c210 65 6e 74 6c 79 20 69 6e 76 6f 6b 65 64 20 6f 6e ently invoked on
5c220 6c 79 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 ly from within p
5c230 61 67 65 72 2e 63 2e 0d 0a 2a 2f 0d 0a 74 79 70 ager.c...*/..typ
5c240 65 64 65 66 20 73 74 72 75 63 74 20 42 75 73 79 edef struct Busy
5c250 48 61 6e 64 6c 65 72 20 42 75 73 79 48 61 6e 64 Handler BusyHand
5c260 6c 65 72 3b 0d 0a 73 74 72 75 63 74 20 42 75 73 ler;..struct Bus
5c270 79 48 61 6e 64 6c 65 72 20 7b 0d 0a 20 20 69 6e yHandler {.. in
5c280 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 t (*xFunc)(void
5c290 2a 2c 69 6e 74 29 3b 20 20 2f 2a 20 54 68 65 20 *,int); /* The
5c2a0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 2a 2f busy callback */
5c2b0 0d 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 20 .. void *pArg;
5c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5c2d0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 62 * First arg to b
5c2e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d usy callback */.
5c2f0 0a 20 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 . int nBusy;
5c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
5c310 20 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 Incremented wit
5c320 68 20 65 61 63 68 20 62 75 73 79 20 63 61 6c 6c h each busy call
5c330 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
5c340 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 * Name of the ma
5c350 73 74 65 72 20 64 61 74 61 62 61 73 65 20 74 61 ster database ta
5c360 62 6c 65 2e 20 20 54 68 65 20 6d 61 73 74 65 72 ble. The master
5c370 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0d database table.
5c380 0a 2a 2a 20 69 73 20 61 20 73 70 65 63 69 61 6c .** is a special
5c390 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f 6c 64 table that hold
5c3a0 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 s the names and
5c3b0 61 74 74 72 69 62 75 74 65 73 20 6f 66 20 61 6c attributes of al
5c3c0 6c 0d 0a 2a 2a 20 75 73 65 72 20 74 61 62 6c 65 l..** user table
5c3d0 73 20 61 6e 64 20 69 6e 64 69 63 65 73 2e 0d 0a s and indices...
5c3e0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 41 53 54 */..#define MAST
5c3f0 45 52 5f 4e 41 4d 45 20 20 20 20 20 20 20 22 73 ER_NAME "s
5c400 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0d 0a 23 qlite_master"..#
5c410 64 65 66 69 6e 65 20 54 45 4d 50 5f 4d 41 53 54 define TEMP_MAST
5c420 45 52 5f 4e 41 4d 45 20 20 22 73 71 6c 69 74 65 ER_NAME "sqlite
5c430 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 0d 0a 0d _temp_master"...
5c440 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 ./*..** The root
5c450 2d 70 61 67 65 20 6f 66 20 74 68 65 20 6d 61 73 -page of the mas
5c460 74 65 72 20 64 61 74 61 62 61 73 65 20 74 61 62 ter database tab
5c470 6c 65 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 le...*/..#define
5c480 20 4d 41 53 54 45 52 5f 52 4f 4f 54 20 20 20 20 MASTER_ROOT
5c490 20 20 20 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 1..../*..** T
5c4a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 he name of the s
5c4b0 63 68 65 6d 61 20 74 61 62 6c 65 2e 0d 0a 2a 2f chema table...*/
5c4c0 0d 0a 23 64 65 66 69 6e 65 20 53 43 48 45 4d 41 ..#define SCHEMA
5c4d0 5f 54 41 42 4c 45 28 78 29 20 20 28 28 21 4f 4d _TABLE(x) ((!OM
5c4e0 49 54 5f 54 45 4d 50 44 42 29 26 26 28 78 3d 3d IT_TEMPDB)&&(x==
5c4f0 31 29 3f 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 1)?TEMP_MASTER_N
5c500 41 4d 45 3a 4d 41 53 54 45 52 5f 4e 41 4d 45 29 AME:MASTER_NAME)
5c510 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 63 6f 6e ..../*..** A con
5c520 76 65 6e 69 65 6e 63 65 20 6d 61 63 72 6f 20 74 venience macro t
5c530 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 hat returns the
5c540 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e number of elemen
5c550 74 73 20 69 6e 0d 0a 2a 2a 20 61 6e 20 61 72 72 ts in..** an arr
5c560 61 79 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 ay...*/..#define
5c570 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 20 ArraySize(X)
5c580 20 28 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 58 ((int)(sizeof(X
5c590 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29 29 )/sizeof(X[0])))
5c5a0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 ..../*..** The f
5c5b0 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 20 61 ollowing value a
5c5c0 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6d s a destructor m
5c5d0 65 61 6e 73 20 74 6f 20 75 73 65 20 73 71 6c 69 eans to use sqli
5c5e0 74 65 33 44 62 46 72 65 65 28 29 2e 0d 0a 2a 2a te3DbFree()...**
5c5f0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 This is an inte
5c600 72 6e 61 6c 20 65 78 74 65 6e 73 69 6f 6e 20 74 rnal extension t
5c610 6f 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 20 o SQLITE_STATIC
5c620 61 6e 64 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 and SQLITE_TRANS
5c630 49 45 4e 54 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 IENT...*/..#defi
5c640 6e 65 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 ne SQLITE_DYNAMI
5c650 43 20 20 20 28 28 73 71 6c 69 74 65 33 5f 64 65 C ((sqlite3_de
5c660 73 74 72 75 63 74 6f 72 5f 74 79 70 65 29 73 71 structor_type)sq
5c670 6c 69 74 65 33 44 62 46 72 65 65 29 0d 0a 0d 0a lite3DbFree)....
5c680 2f 2a 0d 0a 2a 2a 20 57 68 65 6e 20 53 51 4c 49 /*..** When SQLI
5c690 54 45 5f 4f 4d 49 54 5f 57 53 44 20 69 73 20 64 TE_OMIT_WSD is d
5c6a0 65 66 69 6e 65 64 2c 20 69 74 20 6d 65 61 6e 73 efined, it means
5c6b0 20 74 68 61 74 20 74 68 65 20 74 61 72 67 65 74 that the target
5c6c0 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65 73 0d 0a platform does..
5c6d0 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 57 ** not support W
5c6e0 72 69 74 61 62 6c 65 20 53 74 61 74 69 63 20 44 ritable Static D
5c6f0 61 74 61 20 28 57 53 44 29 20 73 75 63 68 20 61 ata (WSD) such a
5c700 73 20 67 6c 6f 62 61 6c 20 61 6e 64 20 73 74 61 s global and sta
5c710 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a tic variables...
5c720 2a 2a 20 41 6c 6c 20 76 61 72 69 61 62 6c 65 73 ** All variables
5c730 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20 must either be
5c740 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 6f 72 20 on the stack or
5c750 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f dynamically allo
5c760 63 61 74 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 74 cated from..** t
5c770 68 65 20 68 65 61 70 2e 20 20 57 68 65 6e 20 57 he heap. When W
5c780 53 44 20 69 73 20 75 6e 73 75 70 70 6f 72 74 65 SD is unsupporte
5c790 64 2c 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 d, the variable
5c7a0 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 73 63 61 declarations sca
5c7b0 74 74 65 72 65 64 0d 0a 2a 2a 20 74 68 72 6f 75 ttered..** throu
5c7c0 67 68 6f 75 74 20 74 68 65 20 53 51 4c 69 74 65 ghout the SQLite
5c7d0 20 63 6f 64 65 20 6d 75 73 74 20 62 65 63 6f 6d code must becom
5c7e0 65 20 63 6f 6e 73 74 61 6e 74 73 20 69 6e 73 74 e constants inst
5c7f0 65 61 64 2e 20 20 54 68 65 20 53 51 4c 49 54 45 ead. The SQLITE
5c800 5f 57 53 44 0d 0a 2a 2a 20 6d 61 63 72 6f 20 69 _WSD..** macro i
5c810 73 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 s used for this
5c820 70 75 72 70 6f 73 65 2e 20 20 41 6e 64 20 69 6e purpose. And in
5c830 73 74 65 61 64 20 6f 66 20 72 65 66 65 72 65 6e stead of referen
5c840 63 69 6e 67 20 74 68 65 20 76 61 72 69 61 62 6c cing the variabl
5c850 65 0d 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c 20 e..** directly,
5c860 77 65 20 75 73 65 20 69 74 73 20 63 6f 6e 73 74 we use its const
5c870 61 6e 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 ant as a key to
5c880 6c 6f 6f 6b 75 70 20 74 68 65 20 72 75 6e 2d 74 lookup the run-t
5c890 69 6d 65 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 2a ime allocated..*
5c8a0 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 68 6f * buffer that ho
5c8b0 6c 64 73 20 72 65 61 6c 20 76 61 72 69 61 62 6c lds real variabl
5c8c0 65 2e 20 20 54 68 65 20 63 6f 6e 73 74 61 6e 74 e. The constant
5c8d0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 69 6e 69 is also the ini
5c8e0 74 69 61 6c 69 7a 65 72 0d 0a 2a 2a 20 66 6f 72 tializer..** for
5c8f0 20 74 68 65 20 72 75 6e 2d 74 69 6d 65 20 61 6c the run-time al
5c900 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0d located buffer..
5c910 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 74 68 65 20 75 .**..** In the u
5c920 73 75 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 sual case where
5c930 57 53 44 20 69 73 20 73 75 70 70 6f 72 74 65 64 WSD is supported
5c940 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 57 53 44 , the SQLITE_WSD
5c950 20 61 6e 64 20 47 4c 4f 42 41 4c 0d 0a 2a 2a 20 and GLOBAL..**
5c960 6d 61 63 72 6f 73 20 62 65 63 6f 6d 65 20 6e 6f macros become no
5c970 2d 6f 70 73 20 61 6e 64 20 68 61 76 65 20 7a 65 -ops and have ze
5c980 72 6f 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 ro performance i
5c990 6d 70 61 63 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 mpact...*/..#ifd
5c9a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 ef SQLITE_OMIT_W
5c9b0 53 44 0d 0a 20 20 23 64 65 66 69 6e 65 20 53 51 SD.. #define SQ
5c9c0 4c 49 54 45 5f 57 53 44 20 63 6f 6e 73 74 0d 0a LITE_WSD const..
5c9d0 20 20 23 64 65 66 69 6e 65 20 47 4c 4f 42 41 4c #define GLOBAL
5c9e0 28 74 2c 76 29 20 28 2a 28 74 2a 29 73 71 6c 69 (t,v) (*(t*)sqli
5c9f0 74 65 33 5f 77 73 64 5f 66 69 6e 64 28 28 76 6f te3_wsd_find((vo
5ca00 69 64 2a 29 26 28 76 29 2c 20 73 69 7a 65 6f 66 id*)&(v), sizeof
5ca10 28 76 29 29 29 0d 0a 20 20 23 64 65 66 69 6e 65 (v))).. #define
5ca20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
5ca30 6e 66 69 67 20 47 4c 4f 42 41 4c 28 73 74 72 75 nfig GLOBAL(stru
5ca40 63 74 20 53 71 6c 69 74 65 33 43 6f 6e 66 69 67 ct Sqlite3Config
5ca50 2c 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 29 , sqlite3Config)
5ca60 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 20 20 69 ..SQLITE_API i
5ca70 6e 74 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 nt sqlite3_wsd_i
5ca80 6e 69 74 28 69 6e 74 20 4e 2c 20 69 6e 74 20 4a nit(int N, int J
5ca90 29 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 20 );..SQLITE_API
5caa0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 void *sqlite3_w
5cab0 73 64 5f 66 69 6e 64 28 76 6f 69 64 20 2a 4b 2c sd_find(void *K,
5cac0 20 69 6e 74 20 4c 29 3b 0d 0a 23 65 6c 73 65 0d int L);..#else.
5cad0 0a 20 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 . #define SQLIT
5cae0 45 5f 57 53 44 20 0d 0a 20 20 23 64 65 66 69 6e E_WSD .. #defin
5caf0 65 20 47 4c 4f 42 41 4c 28 74 2c 76 29 20 76 0d e GLOBAL(t,v) v.
5cb00 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 . #define sqlit
5cb10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 20 73 e3GlobalConfig s
5cb20 71 6c 69 74 65 33 43 6f 6e 66 69 67 0d 0a 23 65 qlite3Config..#e
5cb30 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ndif..../*..** T
5cb40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 he following mac
5cb50 72 6f 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 ros are used to
5cb60 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65 suppress compile
5cb70 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 74 r warnings and t
5cb80 6f 0d 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 63 6c o..** make it cl
5cb90 65 61 72 20 74 6f 20 68 75 6d 61 6e 20 72 65 61 ear to human rea
5cba0 64 65 72 73 20 77 68 65 6e 20 61 20 66 75 6e 63 ders when a func
5cbb0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 tion parameter i
5cbc0 73 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 0d s deliberately .
5cbd0 0a 2a 2a 20 6c 65 66 74 20 75 6e 75 73 65 64 20 .** left unused
5cbe0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 within the body
5cbf0 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 54 of a function. T
5cc00 68 69 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70 his usually happ
5cc10 65 6e 73 20 77 68 65 6e 0d 0a 2a 2a 20 61 20 66 ens when..** a f
5cc20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
5cc30 64 20 76 69 61 20 61 20 66 75 6e 63 74 69 6f 6e d via a function
5cc40 20 70 6f 69 6e 74 65 72 2e 20 46 6f 72 20 65 78 pointer. For ex
5cc50 61 6d 70 6c 65 20 74 68 65 20 0d 0a 2a 2a 20 69 ample the ..** i
5cc60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
5cc70 20 61 6e 20 53 51 4c 20 61 67 67 72 65 67 61 74 an SQL aggregat
5cc80 65 20 73 74 65 70 20 63 61 6c 6c 62 61 63 6b 20 e step callback
5cc90 6d 61 79 20 6e 6f 74 20 75 73 65 20 74 68 65 0d may not use the.
5cca0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e .** parameter in
5ccb0 64 69 63 61 74 69 6e 67 20 74 68 65 20 6e 75 6d dicating the num
5ccc0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
5ccd0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 passed to the a
5cce0 67 67 72 65 67 61 74 65 2c 0d 0a 2a 2a 20 69 66 ggregate,..** if
5ccf0 20 69 74 20 6b 6e 6f 77 73 20 74 68 61 74 20 74 it knows that t
5cd00 68 69 73 20 69 73 20 65 6e 66 6f 72 63 65 64 20 his is enforced
5cd10 65 6c 73 65 77 68 65 72 65 2e 0d 0a 2a 2a 0d 0a elsewhere...**..
5cd20 2a 2a 20 57 68 65 6e 20 61 20 66 75 6e 63 74 69 ** When a functi
5cd30 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 on parameter is
5cd40 6e 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c 20 not used at all
5cd50 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 within the body
5cd60 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e 2c 0d 0a of a function,..
5cd70 2a 2a 20 69 74 20 69 73 20 67 65 6e 65 72 61 6c ** it is general
5cd80 6c 79 20 6e 61 6d 65 64 20 22 4e 6f 74 55 73 65 ly named "NotUse
5cd90 64 22 20 6f 72 20 22 4e 6f 74 55 73 65 64 32 22 d" or "NotUsed2"
5cda0 20 74 6f 20 6d 61 6b 65 20 74 68 69 6e 67 73 20 to make things
5cdb0 65 76 65 6e 20 63 6c 65 61 72 65 72 2e 0d 0a 2a even clearer...*
5cdc0 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 73 65 * However, these
5cdd0 20 6d 61 63 72 6f 73 20 6d 61 79 20 61 6c 73 6f macros may also
5cde0 20 62 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 be used to supp
5cdf0 72 65 73 73 20 77 61 72 6e 69 6e 67 73 20 72 65 ress warnings re
5ce00 6c 61 74 65 64 20 74 6f 0d 0a 2a 2a 20 70 61 72 lated to..** par
5ce10 61 6d 65 74 65 72 73 20 74 68 61 74 20 6d 61 79 ameters that may
5ce20 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 or may not be u
5ce30 73 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e sed depending on
5ce40 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 70 74 compilation opt
5ce50 69 6f 6e 73 2e 0d 0a 2a 2a 20 46 6f 72 20 65 78 ions...** For ex
5ce60 61 6d 70 6c 65 20 74 68 6f 73 65 20 70 61 72 61 ample those para
5ce70 6d 65 74 65 72 73 20 6f 6e 6c 79 20 75 73 65 64 meters only used
5ce80 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 in assert() sta
5ce90 74 65 6d 65 6e 74 73 2e 20 49 6e 20 74 68 65 73 tements. In thes
5cea0 65 0d 0a 2a 2a 20 63 61 73 65 73 20 74 68 65 20 e..** cases the
5ceb0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e parameters are n
5cec0 61 6d 65 64 20 61 73 20 70 65 72 20 74 68 65 20 amed as per the
5ced0 75 73 75 61 6c 20 63 6f 6e 76 65 6e 74 69 6f 6e usual convention
5cee0 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 s...*/..#define
5cef0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
5cf00 28 78 29 20 28 76 6f 69 64 29 28 78 29 0d 0a 23 (x) (void)(x)..#
5cf10 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 define UNUSED_PA
5cf20 52 41 4d 45 54 45 52 32 28 78 2c 79 29 20 55 4e RAMETER2(x,y) UN
5cf30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 USED_PARAMETER(x
5cf40 29 2c 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 ),UNUSED_PARAMET
5cf50 45 52 28 79 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ER(y)..../*..**
5cf60 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 Forward referenc
5cf70 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 es to structures
5cf80 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 ..*/..typedef st
5cf90 72 75 63 74 20 41 67 67 49 6e 66 6f 20 41 67 67 ruct AggInfo Agg
5cfa0 49 6e 66 6f 3b 0d 0a 74 79 70 65 64 65 66 20 73 Info;..typedef s
5cfb0 74 72 75 63 74 20 41 75 74 68 43 6f 6e 74 65 78 truct AuthContex
5cfc0 74 20 41 75 74 68 43 6f 6e 74 65 78 74 3b 0d 0a t AuthContext;..
5cfd0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41 typedef struct A
5cfe0 75 74 6f 69 6e 63 49 6e 66 6f 20 41 75 74 6f 69 utoincInfo Autoi
5cff0 6e 63 49 6e 66 6f 3b 0d 0a 74 79 70 65 64 65 66 ncInfo;..typedef
5d000 20 73 74 72 75 63 74 20 42 69 74 76 65 63 20 42 struct Bitvec B
5d010 69 74 76 65 63 3b 0d 0a 74 79 70 65 64 65 66 20 itvec;..typedef
5d020 73 74 72 75 63 74 20 43 6f 6c 6c 53 65 71 20 43 struct CollSeq C
5d030 6f 6c 6c 53 65 71 3b 0d 0a 74 79 70 65 64 65 66 ollSeq;..typedef
5d040 20 73 74 72 75 63 74 20 43 6f 6c 75 6d 6e 20 43 struct Column C
5d050 6f 6c 75 6d 6e 3b 0d 0a 74 79 70 65 64 65 66 20 olumn;..typedef
5d060 73 74 72 75 63 74 20 44 62 20 44 62 3b 0d 0a 74 struct Db Db;..t
5d070 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 63 ypedef struct Sc
5d080 68 65 6d 61 20 53 63 68 65 6d 61 3b 0d 0a 74 79 hema Schema;..ty
5d090 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70 pedef struct Exp
5d0a0 72 20 45 78 70 72 3b 0d 0a 74 79 70 65 64 65 66 r Expr;..typedef
5d0b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 struct ExprList
5d0c0 20 45 78 70 72 4c 69 73 74 3b 0d 0a 74 79 70 65 ExprList;..type
5d0d0 64 65 66 20 73 74 72 75 63 74 20 45 78 70 72 53 def struct ExprS
5d0e0 70 61 6e 20 45 78 70 72 53 70 61 6e 3b 0d 0a 74 pan ExprSpan;..t
5d0f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 4b ypedef struct FK
5d100 65 79 20 46 4b 65 79 3b 0d 0a 74 79 70 65 64 65 ey FKey;..typede
5d110 66 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 73 f struct FuncDes
5d120 74 72 75 63 74 6f 72 20 46 75 6e 63 44 65 73 74 tructor FuncDest
5d130 72 75 63 74 6f 72 3b 0d 0a 74 79 70 65 64 65 66 ructor;..typedef
5d140 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 66 20 struct FuncDef
5d150 46 75 6e 63 44 65 66 3b 0d 0a 74 79 70 65 64 65 FuncDef;..typede
5d160 66 20 73 74 72 75 63 74 20 46 75 6e 63 44 65 66 f struct FuncDef
5d170 48 61 73 68 20 46 75 6e 63 44 65 66 48 61 73 68 Hash FuncDefHash
5d180 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 ;..typedef struc
5d190 74 20 49 64 4c 69 73 74 20 49 64 4c 69 73 74 3b t IdList IdList;
5d1a0 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
5d1b0 20 49 6e 64 65 78 20 49 6e 64 65 78 3b 0d 0a 74 Index Index;..t
5d1c0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e ypedef struct In
5d1d0 64 65 78 53 61 6d 70 6c 65 20 49 6e 64 65 78 53 dexSample IndexS
5d1e0 61 6d 70 6c 65 3b 0d 0a 74 79 70 65 64 65 66 20 ample;..typedef
5d1f0 73 74 72 75 63 74 20 4b 65 79 43 6c 61 73 73 20 struct KeyClass
5d200 4b 65 79 43 6c 61 73 73 3b 0d 0a 74 79 70 65 64 KeyClass;..typed
5d210 65 66 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 ef struct KeyInf
5d220 6f 20 4b 65 79 49 6e 66 6f 3b 0d 0a 74 79 70 65 o KeyInfo;..type
5d230 64 65 66 20 73 74 72 75 63 74 20 4c 6f 6f 6b 61 def struct Looka
5d240 73 69 64 65 20 4c 6f 6f 6b 61 73 69 64 65 3b 0d side Lookaside;.
5d250 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
5d260 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 4c 6f LookasideSlot Lo
5d270 6f 6b 61 73 69 64 65 53 6c 6f 74 3b 0d 0a 74 79 okasideSlot;..ty
5d280 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 6f 64 pedef struct Mod
5d290 75 6c 65 20 4d 6f 64 75 6c 65 3b 0d 0a 74 79 70 ule Module;..typ
5d2a0 65 64 65 66 20 73 74 72 75 63 74 20 4e 61 6d 65 edef struct Name
5d2b0 43 6f 6e 74 65 78 74 20 4e 61 6d 65 43 6f 6e 74 Context NameCont
5d2c0 65 78 74 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 ext;..typedef st
5d2d0 72 75 63 74 20 50 61 72 73 65 20 50 61 72 73 65 ruct Parse Parse
5d2e0 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 ;..typedef struc
5d2f0 74 20 52 6f 77 53 65 74 20 52 6f 77 53 65 74 3b t RowSet RowSet;
5d300 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
5d310 20 53 61 76 65 70 6f 69 6e 74 20 53 61 76 65 70 Savepoint Savep
5d320 6f 69 6e 74 3b 0d 0a 74 79 70 65 64 65 66 20 73 oint;..typedef s
5d330 74 72 75 63 74 20 53 65 6c 65 63 74 20 53 65 6c truct Select Sel
5d340 65 63 74 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 ect;..typedef st
5d350 72 75 63 74 20 53 72 63 4c 69 73 74 20 53 72 63 ruct SrcList Src
5d360 4c 69 73 74 3b 0d 0a 74 79 70 65 64 65 66 20 73 List;..typedef s
5d370 74 72 75 63 74 20 53 74 72 41 63 63 75 6d 20 53 truct StrAccum S
5d380 74 72 41 63 63 75 6d 3b 0d 0a 74 79 70 65 64 65 trAccum;..typede
5d390 66 20 73 74 72 75 63 74 20 54 61 62 6c 65 20 54 f struct Table T
5d3a0 61 62 6c 65 3b 0d 0a 74 79 70 65 64 65 66 20 73 able;..typedef s
5d3b0 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63 6b 20 truct TableLock
5d3c0 54 61 62 6c 65 4c 6f 63 6b 3b 0d 0a 74 79 70 65 TableLock;..type
5d3d0 64 65 66 20 73 74 72 75 63 74 20 54 6f 6b 65 6e def struct Token
5d3e0 20 54 6f 6b 65 6e 3b 0d 0a 74 79 70 65 64 65 66 Token;..typedef
5d3f0 20 73 74 72 75 63 74 20 54 72 69 67 67 65 72 20 struct Trigger
5d400 54 72 69 67 67 65 72 3b 0d 0a 74 79 70 65 64 65 Trigger;..typede
5d410 66 20 73 74 72 75 63 74 20 54 72 69 67 67 65 72 f struct Trigger
5d420 50 72 67 20 54 72 69 67 67 65 72 50 72 67 3b 0d Prg TriggerPrg;.
5d430 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
5d440 54 72 69 67 67 65 72 53 74 65 70 20 54 72 69 67 TriggerStep Trig
5d450 67 65 72 53 74 65 70 3b 0d 0a 74 79 70 65 64 65 gerStep;..typede
5d460 66 20 73 74 72 75 63 74 20 55 6e 70 61 63 6b 65 f struct Unpacke
5d470 64 52 65 63 6f 72 64 20 55 6e 70 61 63 6b 65 64 dRecord Unpacked
5d480 52 65 63 6f 72 64 3b 0d 0a 74 79 70 65 64 65 66 Record;..typedef
5d490 20 73 74 72 75 63 74 20 56 54 61 62 6c 65 20 56 struct VTable V
5d4a0 54 61 62 6c 65 3b 0d 0a 74 79 70 65 64 65 66 20 Table;..typedef
5d4b0 73 74 72 75 63 74 20 56 74 61 62 43 74 78 20 56 struct VtabCtx V
5d4c0 74 61 62 43 74 78 3b 0d 0a 74 79 70 65 64 65 66 tabCtx;..typedef
5d4d0 20 73 74 72 75 63 74 20 57 61 6c 6b 65 72 20 57 struct Walker W
5d4e0 61 6c 6b 65 72 3b 0d 0a 74 79 70 65 64 65 66 20 alker;..typedef
5d4f0 73 74 72 75 63 74 20 57 68 65 72 65 50 6c 61 6e struct WherePlan
5d500 20 57 68 65 72 65 50 6c 61 6e 3b 0d 0a 74 79 70 WherePlan;..typ
5d510 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 edef struct Wher
5d520 65 49 6e 66 6f 20 57 68 65 72 65 49 6e 66 6f 3b eInfo WhereInfo;
5d530 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
5d540 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65 72 WhereLevel Wher
5d550 65 4c 65 76 65 6c 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a eLevel;..../*..*
5d560 2a 20 44 65 66 65 72 20 73 6f 75 72 63 69 6e 67 * Defer sourcing
5d570 20 76 64 62 65 2e 68 20 61 6e 64 20 62 74 72 65 vdbe.h and btre
5d580 65 2e 68 20 75 6e 74 69 6c 20 61 66 74 65 72 20 e.h until after
5d590 74 68 65 20 22 75 38 22 20 61 6e 64 20 0d 0a 2a the "u8" and ..*
5d5a0 2a 20 22 42 75 73 79 48 61 6e 64 6c 65 72 22 20 * "BusyHandler"
5d5b0 74 79 70 65 64 65 66 73 2e 20 76 64 62 65 2e 68 typedefs. vdbe.h
5d5c0 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 20 61 also requires a
5d5d0 20 66 65 77 20 6f 66 20 74 68 65 20 6f 70 61 71 few of the opaq
5d5e0 75 65 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 ue..** pointer t
5d5f0 79 70 65 73 20 28 69 2e 65 2e 20 46 75 6e 63 44 ypes (i.e. FuncD
5d600 65 66 29 20 64 65 66 69 6e 65 64 20 61 62 6f 76 ef) defined abov
5d610 65 2e 0d 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a e...*/../*******
5d620 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 ******* Include
5d630 62 74 72 65 65 2e 68 20 69 6e 20 74 68 65 20 6d btree.h in the m
5d640 69 64 64 6c 65 20 6f 66 20 73 71 6c 69 74 65 49 iddle of sqliteI
5d650 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nt.h ***********
5d660 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
5d670 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 ******** Begin f
5d680 69 6c 65 20 62 74 72 65 65 2e 68 20 2a 2a 2a 2a ile btree.h ****
5d690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d6b0 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a *******/../*..**
5d6c0 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72 20 2001 September
5d6d0 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 15..**..** The a
5d6e0 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 uthor disclaims
5d6f0 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 copyright to thi
5d700 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 s source code.
5d710 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 In place of..**
5d720 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 a legal notice,
5d730 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 here is a blessi
5d740 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d ng:..**..** M
5d750 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
5d760 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a nd not evil...**
5d770 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 May you find
5d780 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 forgiveness for
5d790 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f yourself and fo
5d7a0 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a rgive others...*
5d7b0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 * May you sha
5d7c0 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 re freely, never
5d7d0 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 taking more tha
5d7e0 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d n you give...**.
5d7f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
5d800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 **********..** T
5d840 68 69 73 20 68 65 61 64 65 72 20 66 69 6c 65 20 his header file
5d850 64 65 66 69 6e 65 73 20 74 68 65 20 69 6e 74 65 defines the inte
5d860 72 66 61 63 65 20 74 68 61 74 20 74 68 65 20 73 rface that the s
5d870 71 6c 69 74 65 20 42 2d 54 72 65 65 20 66 69 6c qlite B-Tree fil
5d880 65 0d 0a 2a 2a 20 73 75 62 73 79 73 74 65 6d 2e e..** subsystem.
5d890 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 See comments i
5d8a0 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 n the source cod
5d8b0 65 20 66 6f 72 20 61 20 64 65 74 61 69 6c 65 64 e for a detailed
5d8c0 20 64 65 73 63 72 69 70 74 69 6f 6e 0d 0a 2a 2a description..**
5d8d0 20 6f 66 20 77 68 61 74 20 65 61 63 68 20 69 6e of what each in
5d8e0 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65 20 terface routine
5d8f0 64 6f 65 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 does...*/..#ifnd
5d900 65 66 20 5f 42 54 52 45 45 5f 48 5f 0d 0a 23 64 ef _BTREE_H_..#d
5d910 65 66 69 6e 65 20 5f 42 54 52 45 45 5f 48 5f 0d efine _BTREE_H_.
5d920 0a 0d 0a 2f 2a 20 54 4f 44 4f 3a 20 54 68 69 73 .../* TODO: This
5d930 20 64 65 66 69 6e 69 74 69 6f 6e 20 69 73 20 6a definition is j
5d940 75 73 74 20 69 6e 63 6c 75 64 65 64 20 73 6f 20 ust included so
5d950 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 63 6f other modules co
5d960 6d 70 69 6c 65 2e 20 49 74 0d 0a 2a 2a 20 6e 65 mpile. It..** ne
5d970 65 64 73 20 74 6f 20 62 65 20 72 65 76 69 73 69 eds to be revisi
5d980 74 65 64 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e ted...*/..#defin
5d990 65 20 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 e SQLITE_N_BTREE
5d9a0 5f 4d 45 54 41 20 31 30 0d 0a 0d 0a 2f 2a 0d 0a _META 10..../*..
5d9b0 2a 2a 20 49 66 20 64 65 66 69 6e 65 64 20 61 73 ** If defined as
5d9c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 75 74 6f 2d non-zero, auto-
5d9d0 76 61 63 75 75 6d 20 69 73 20 65 6e 61 62 6c 65 vacuum is enable
5d9e0 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 4f 74 d by default. Ot
5d9f0 68 65 72 77 69 73 65 0d 0a 2a 2a 20 69 74 20 6d herwise..** it m
5da00 75 73 74 20 62 65 20 74 75 72 6e 65 64 20 6f 6e ust be turned on
5da10 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 for each databa
5da20 73 65 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 se using "PRAGMA
5da30 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 auto_vacuum = 1
5da40 22 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 "...*/..#ifndef
5da50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 SQLITE_DEFAULT_A
5da60 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 23 64 65 UTOVACUUM.. #de
5da70 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 fine SQLITE_DEFA
5da80 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 30 ULT_AUTOVACUUM 0
5da90 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 ..#endif....#def
5daa0 69 6e 65 20 42 54 52 45 45 5f 41 55 54 4f 56 41 ine BTREE_AUTOVA
5dab0 43 55 55 4d 5f 4e 4f 4e 45 20 30 20 20 20 20 20 CUUM_NONE 0
5dac0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 /* Do not do
5dad0 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a 2f 0d 0a auto-vacuum */..
5dae0 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 41 55 #define BTREE_AU
5daf0 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 20 31 20 TOVACUUM_FULL 1
5db00 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 6c /* Do ful
5db10 6c 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a 2f l auto-vacuum */
5db20 0d 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f ..#define BTREE_
5db30 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 20 AUTOVACUUM_INCR
5db40 32 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 2 /* Incr
5db50 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 2a emental vacuum *
5db60 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 6f 72 77 /..../*..** Forw
5db70 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ard declarations
5db80 20 6f 66 20 73 74 72 75 63 74 75 72 65 0d 0a 2a of structure..*
5db90 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
5dba0 74 20 42 74 72 65 65 20 42 74 72 65 65 3b 0d 0a t Btree Btree;..
5dbb0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42 typedef struct B
5dbc0 74 43 75 72 73 6f 72 20 42 74 43 75 72 73 6f 72 tCursor BtCursor
5dbd0 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 ;..typedef struc
5dbe0 74 20 42 74 53 68 61 72 65 64 20 42 74 53 68 61 t BtShared BtSha
5dbf0 72 65 64 3b 0d 0a 0d 0a 0d 0a 53 51 4c 49 54 45 red;......SQLITE
5dc00 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
5dc10 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0d 0a ite3BtreeOpen(..
5dc20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
5dc30 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 56 46 Vfs, /* VF
5dc40 53 20 74 6f 20 75 73 65 20 77 69 74 68 20 74 68 S to use with th
5dc50 69 73 20 62 2d 74 72 65 65 20 2a 2f 0d 0a 20 20 is b-tree */..
5dc60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
5dc70 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 ename, /* Name
5dc80 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c of database fil
5dc90 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0d 0a 20 20 e to open */..
5dca0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 sqlite3 *db,
5dcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f /* Asso
5dcc0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 ciated database
5dcd0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0d 0a 20 connection */..
5dce0 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 Btree **ppBtree
5dcf0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 , /* Ret
5dd00 75 72 6e 20 6f 70 65 6e 20 42 74 72 65 65 2a 20 urn open Btree*
5dd10 68 65 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 here */.. int f
5dd20 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 lags,
5dd30 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0d /* Flags */.
5dd40 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 . int vfsFlags
5dd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
5dd60 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f lags passed thro
5dd70 75 67 68 20 74 6f 20 56 46 53 20 6f 70 65 6e 20 ugh to VFS open
5dd80 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 20 54 68 65 */..);..../* The
5dd90 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 flags parameter
5dda0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 to sqlite3Btree
5ddb0 4f 70 65 6e 20 63 61 6e 20 62 65 20 74 68 65 20 Open can be the
5ddc0 62 69 74 77 69 73 65 20 6f 72 20 6f 66 20 74 68 bitwise or of th
5ddd0 65 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 e..** following
5dde0 76 61 6c 75 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 values...**..**
5ddf0 4e 4f 54 45 3a 20 20 54 68 65 73 65 20 76 61 6c NOTE: These val
5de00 75 65 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 ues must match t
5de10 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
5de20 20 50 41 47 45 52 5f 20 76 61 6c 75 65 73 20 69 PAGER_ values i
5de30 6e 0d 0a 2a 2a 20 70 61 67 65 72 2e 68 2e 0d 0a n..** pager.h...
5de40 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 54 52 45 */..#define BTRE
5de50 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 20 E_OMIT_JOURNAL
5de60 31 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65 1 /* Do not cre
5de70 61 74 65 20 6f 72 20 75 73 65 20 61 20 72 6f 6c ate or use a rol
5de80 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 2a 2f lback journal */
5de90 0d 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f ..#define BTREE_
5dea0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 20 20 32 20 NO_READLOCK 2
5deb0 20 2f 2a 20 4f 6d 69 74 20 72 65 61 64 6c 6f 63 /* Omit readloc
5dec0 6b 73 20 6f 6e 20 72 65 61 64 6f 6e 6c 79 20 66 ks on readonly f
5ded0 69 6c 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 iles */..#define
5dee0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 20 20 20 BTREE_MEMORY
5def0 20 20 20 20 20 34 20 20 2f 2a 20 54 68 69 73 20 4 /* This
5df00 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 is an in-memory
5df10 44 42 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 DB */..#define B
5df20 54 52 45 45 5f 53 49 4e 47 4c 45 20 20 20 20 20 TREE_SINGLE
5df30 20 20 20 38 20 20 2f 2a 20 54 68 65 20 66 69 6c 8 /* The fil
5df40 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6d 6f e contains at mo
5df50 73 74 20 31 20 62 2d 74 72 65 65 20 2a 2f 0d 0a st 1 b-tree */..
5df60 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 55 4e #define BTREE_UN
5df70 4f 52 44 45 52 45 44 20 20 20 20 31 36 20 20 2f ORDERED 16 /
5df80 2a 20 55 73 65 20 6f 66 20 61 20 68 61 73 68 20 * Use of a hash
5df90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 implementation i
5dfa0 73 20 4f 4b 20 2a 2f 0d 0a 0d 0a 53 51 4c 49 54 s OK */....SQLIT
5dfb0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
5dfc0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 lite3BtreeClose(
5dfd0 42 74 72 65 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 Btree*);..SQLITE
5dfe0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
5dff0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 ite3BtreeSetCach
5e000 65 53 69 7a 65 28 42 74 72 65 65 2a 2c 69 6e 74 eSize(Btree*,int
5e010 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
5e020 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
5e030 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 reeSetSafetyLeve
5e040 6c 28 42 74 72 65 65 2a 2c 69 6e 74 2c 69 6e 74 l(Btree*,int,int
5e050 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ,int);..SQLITE_P
5e060 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
5e070 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 e3BtreeSyncDisab
5e080 6c 65 64 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 led(Btree*);..SQ
5e090 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
5e0a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 sqlite3BtreeSet
5e0b0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a PageSize(Btree *
5e0c0 70 2c 20 69 6e 74 20 6e 50 61 67 65 73 69 7a 65 p, int nPagesize
5e0d0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 , int nReserve,
5e0e0 69 6e 74 20 65 46 69 78 29 3b 0d 0a 53 51 4c 49 int eFix);..SQLI
5e0f0 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
5e100 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 qlite3BtreeGetPa
5e110 67 65 53 69 7a 65 28 42 74 72 65 65 2a 29 3b 0d geSize(Btree*);.
5e120 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
5e130 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
5e140 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 MaxPageCount(Btr
5e150 65 65 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 ee*,int);..SQLIT
5e160 45 5f 50 52 49 56 41 54 45 20 75 33 32 20 73 71 E_PRIVATE u32 sq
5e170 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 lite3BtreeLastPa
5e180 67 65 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 4c ge(Btree*);..SQL
5e190 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
5e1a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 sqlite3BtreeSecu
5e1b0 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 2a 2c reDelete(Btree*,
5e1c0 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
5e1d0 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
5e1e0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 3BtreeGetReserve
5e1f0 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 4c 49 54 (Btree*);..SQLIT
5e200 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
5e210 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 lite3BtreeSetAut
5e220 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 2c oVacuum(Btree *,
5e230 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
5e240 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
5e250 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 e3BtreeGetAutoVa
5e260 63 75 75 6d 28 42 74 72 65 65 20 2a 29 3b 0d 0a cuum(Btree *);..
5e270 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
5e280 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 nt sqlite3BtreeB
5e290 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 2a eginTrans(Btree*
5e2a0 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ,int);..SQLITE_P
5e2b0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
5e2c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 e3BtreeCommitPha
5e2d0 73 65 4f 6e 65 28 42 74 72 65 65 2a 2c 20 63 6f seOne(Btree*, co
5e2e0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 nst char *zMaste
5e2f0 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 r);..SQLITE_PRIV
5e300 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 ATE int sqlite3B
5e310 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 treeCommitPhaseT
5e320 77 6f 28 42 74 72 65 65 2a 2c 20 69 6e 74 29 3b wo(Btree*, int);
5e330 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5e340 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5e350 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 2a 29 3b eCommit(Btree*);
5e360 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5e370 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5e380 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 2a eRollback(Btree*
5e390 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
5e3a0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
5e3b0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 reeBeginStmt(Btr
5e3c0 65 65 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 ee*,int);..SQLIT
5e3d0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
5e3e0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 lite3BtreeCreate
5e3f0 54 61 62 6c 65 28 42 74 72 65 65 2a 2c 20 69 6e Table(Btree*, in
5e400 74 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0d t*, int flags);.
5e410 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
5e420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
5e430 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 2a IsInTrans(Btree*
5e440 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
5e450 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
5e460 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 reeIsInReadTrans
5e470 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 4c 49 54 (Btree*);..SQLIT
5e480 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
5e490 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 lite3BtreeIsInBa
5e4a0 63 6b 75 70 28 42 74 72 65 65 2a 29 3b 0d 0a 53 ckup(Btree*);..S
5e4b0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
5e4c0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 id *sqlite3Btree
5e4d0 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 2c 20 Schema(Btree *,
5e4e0 69 6e 74 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 int, void(*)(voi
5e4f0 64 20 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 d *));..SQLITE_P
5e500 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
5e510 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 e3BtreeSchemaLoc
5e520 6b 65 64 28 42 74 72 65 65 20 2a 70 42 74 72 65 ked(Btree *pBtre
5e530 65 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 e);..SQLITE_PRIV
5e540 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 ATE int sqlite3B
5e550 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 treeLockTable(Bt
5e560 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 ree *pBtree, int
5e570 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 iTab, u8 isWrit
5e580 65 4c 6f 63 6b 29 3b 0d 0a 53 51 4c 49 54 45 5f eLock);..SQLITE_
5e590 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
5e5a0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e te3BtreeSavepoin
5e5b0 74 28 42 74 72 65 65 20 2a 2c 20 69 6e 74 2c 20 t(Btree *, int,
5e5c0 69 6e 74 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f int);....SQLITE_
5e5d0 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 63 68 PRIVATE const ch
5e5e0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 ar *sqlite3Btree
5e5f0 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 GetFilename(Btre
5e600 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 e *);..SQLITE_PR
5e610 49 56 41 54 45 20 63 6f 6e 73 74 20 63 68 61 72 IVATE const char
5e620 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 *sqlite3BtreeGe
5e630 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 tJournalname(Btr
5e640 65 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ee *);..SQLITE_P
5e650 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
5e660 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 e3BtreeCopyFile(
5e670 42 74 72 65 65 20 2a 2c 20 42 74 72 65 65 20 2a Btree *, Btree *
5e680 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 );....SQLITE_PRI
5e690 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
5e6a0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 BtreeIncrVacuum(
5e6b0 42 74 72 65 65 20 2a 29 3b 0d 0a 0d 0a 2f 2a 20 Btree *);..../*
5e6c0 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 The flags parame
5e6d0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 ter to sqlite3Bt
5e6e0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 20 63 reeCreateTable c
5e6f0 61 6e 20 62 65 20 74 68 65 20 62 69 74 77 69 73 an be the bitwis
5e700 65 20 4f 52 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 e OR..** of the
5e710 66 6c 61 67 73 20 73 68 6f 77 6e 20 62 65 6c 6f flags shown belo
5e720 77 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 76 65 72 79 w...**..** Every
5e730 20 53 51 4c 69 74 65 20 74 61 62 6c 65 20 6d 75 SQLite table mu
5e740 73 74 20 68 61 76 65 20 65 69 74 68 65 72 20 42 st have either B
5e750 54 52 45 45 5f 49 4e 54 4b 45 59 20 6f 72 20 42 TREE_INTKEY or B
5e760 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 73 65 74 TREE_BLOBKEY set
5e770 2e 0d 0a 2a 2a 20 57 69 74 68 20 42 54 52 45 45 ...** With BTREE
5e780 5f 49 4e 54 4b 45 59 2c 20 74 68 65 20 74 61 62 _INTKEY, the tab
5e790 6c 65 20 6b 65 79 20 69 73 20 61 20 36 34 2d 62 le key is a 64-b
5e7a0 69 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 it integer and a
5e7b0 72 62 69 74 72 61 72 79 20 64 61 74 61 0d 0a 2a rbitrary data..*
5e7c0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 * is stored in t
5e7d0 68 65 20 6c 65 61 76 65 73 2e 20 20 28 42 54 52 he leaves. (BTR
5e7e0 45 45 5f 49 4e 54 4b 45 59 20 69 73 20 75 73 65 EE_INTKEY is use
5e7f0 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 d for SQL tables
5e800 2e 29 20 20 57 69 74 68 0d 0a 2a 2a 20 42 54 52 .) With..** BTR
5e810 45 45 5f 42 4c 4f 42 4b 45 59 2c 20 74 68 65 20 EE_BLOBKEY, the
5e820 6b 65 79 20 69 73 20 61 6e 20 61 72 62 69 74 72 key is an arbitr
5e830 61 72 79 20 42 4c 4f 42 20 61 6e 64 20 6e 6f 20 ary BLOB and no
5e840 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65 content is store
5e850 64 0d 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 2d d..** anywhere -
5e860 20 74 68 65 20 6b 65 79 20 69 73 20 74 68 65 20 the key is the
5e870 63 6f 6e 74 65 6e 74 2e 20 20 28 42 54 52 45 45 content. (BTREE
5e880 5f 42 4c 4f 42 4b 45 59 20 69 73 20 75 73 65 64 _BLOBKEY is used
5e890 20 66 6f 72 20 53 51 4c 0d 0a 2a 2a 20 69 6e 64 for SQL..** ind
5e8a0 69 63 65 73 2e 29 0d 0a 2a 2f 0d 0a 23 64 65 66 ices.)..*/..#def
5e8b0 69 6e 65 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 ine BTREE_INTKEY
5e8c0 20 20 20 20 20 31 20 20 20 20 2f 2a 20 54 61 62 1 /* Tab
5e8d0 6c 65 20 68 61 73 20 6f 6e 6c 79 20 36 34 2d 62 le has only 64-b
5e8e0 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 it signed intege
5e8f0 72 20 6b 65 79 73 20 2a 2f 0d 0a 23 64 65 66 69 r keys */..#defi
5e900 6e 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 ne BTREE_BLOBKEY
5e910 20 20 20 20 32 20 20 20 20 2f 2a 20 54 61 62 6c 2 /* Tabl
5e920 65 20 68 61 73 20 6b 65 79 73 20 6f 6e 6c 79 20 e has keys only
5e930 2d 20 6e 6f 20 64 61 74 61 20 2a 2f 0d 0a 0d 0a - no data */....
5e940 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
5e950 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 nt sqlite3BtreeD
5e960 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 2a 2c ropTable(Btree*,
5e970 20 69 6e 74 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 int, int*);..SQ
5e980 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
5e990 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 sqlite3BtreeCle
5e9a0 61 72 54 61 62 6c 65 28 42 74 72 65 65 2a 2c 20 arTable(Btree*,
5e9b0 69 6e 74 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 4c int, int*);..SQL
5e9c0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
5e9d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 sqlite3BtreeTri
5e9e0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 pAllCursors(Btre
5e9f0 65 2a 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 53 51 4c e*, int);....SQL
5ea00 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
5ea10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 sqlite3BtreeGet
5ea20 4d 65 74 61 28 42 74 72 65 65 20 2a 70 42 74 72 Meta(Btree *pBtr
5ea30 65 65 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 ee, int idx, u32
5ea40 20 2a 70 56 61 6c 75 65 29 3b 0d 0a 53 51 4c 49 *pValue);..SQLI
5ea50 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
5ea60 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 qlite3BtreeUpdat
5ea70 65 4d 65 74 61 28 42 74 72 65 65 2a 2c 20 69 6e eMeta(Btree*, in
5ea80 74 20 69 64 78 2c 20 75 33 32 20 76 61 6c 75 65 t idx, u32 value
5ea90 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 );..../*..** The
5eaa0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 second paramete
5eab0 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 r to sqlite3Btre
5eac0 65 47 65 74 4d 65 74 61 20 6f 72 20 73 71 6c 69 eGetMeta or sqli
5ead0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 te3BtreeUpdateMe
5eae0 74 61 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 ta..** should be
5eaf0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c one of the foll
5eb00 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 20 54 68 owing values. Th
5eb10 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 e integer values
5eb20 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 0d 0a are assigned ..
5eb30 2a 2a 20 74 6f 20 63 6f 6e 73 74 61 6e 74 73 20 ** to constants
5eb40 73 6f 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 so that the offs
5eb50 65 74 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 et of the corres
5eb60 70 6f 6e 64 69 6e 67 20 66 69 65 6c 64 20 69 6e ponding field in
5eb70 20 61 6e 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 64 an..** SQLite d
5eb80 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 6d atabase header m
5eb90 61 79 20 62 65 20 66 6f 75 6e 64 20 75 73 69 6e ay be found usin
5eba0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 g the following
5ebb0 66 6f 72 6d 75 6c 61 3a 0d 0a 2a 2a 0d 0a 2a 2a formula:..**..**
5ebc0 20 20 20 6f 66 66 73 65 74 20 3d 20 33 36 20 2b offset = 36 +
5ebd0 20 28 69 64 78 20 2a 20 34 29 0d 0a 2a 2a 0d 0a (idx * 4)..**..
5ebe0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 ** For example,
5ebf0 74 68 65 20 66 72 65 65 2d 70 61 67 65 2d 63 6f the free-page-co
5ec00 75 6e 74 20 66 69 65 6c 64 20 69 73 20 6c 6f 63 unt field is loc
5ec10 61 74 65 64 20 61 74 20 62 79 74 65 20 6f 66 66 ated at byte off
5ec20 73 65 74 20 33 36 20 6f 66 0d 0a 2a 2a 20 74 68 set 36 of..** th
5ec30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
5ec40 68 65 61 64 65 72 2e 20 54 68 65 20 69 6e 63 72 header. The incr
5ec50 2d 76 61 63 75 75 6d 2d 66 6c 61 67 20 66 69 65 -vacuum-flag fie
5ec60 6c 64 20 69 73 20 6c 6f 63 61 74 65 64 20 61 74 ld is located at
5ec70 0d 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 ..** byte offset
5ec80 20 36 34 20 28 3d 3d 20 33 36 2b 34 2a 37 29 2e 64 (== 36+4*7).
5ec90 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 54 ..*/..#define BT
5eca0 52 45 45 5f 46 52 45 45 5f 50 41 47 45 5f 43 4f REE_FREE_PAGE_CO
5ecb0 55 4e 54 20 20 20 20 20 30 0d 0a 23 64 65 66 69 UNT 0..#defi
5ecc0 6e 65 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f ne BTREE_SCHEMA_
5ecd0 56 45 52 53 49 4f 4e 20 20 20 20 20 20 31 0d 0a VERSION 1..
5ece0 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 46 49 #define BTREE_FI
5ecf0 4c 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 20 LE_FORMAT
5ed00 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 42 54 52 2..#define BTR
5ed10 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 EE_DEFAULT_CACHE
5ed20 5f 53 49 5a 45 20 20 33 0d 0a 23 64 65 66 69 6e _SIZE 3..#defin
5ed30 65 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f e BTREE_LARGEST_
5ed40 52 4f 4f 54 5f 50 41 47 45 20 20 20 34 0d 0a 23 ROOT_PAGE 4..#
5ed50 64 65 66 69 6e 65 20 42 54 52 45 45 5f 54 45 58 define BTREE_TEX
5ed60 54 5f 45 4e 43 4f 44 49 4e 47 20 20 20 20 20 20 T_ENCODING
5ed70 20 35 0d 0a 23 64 65 66 69 6e 65 20 42 54 52 45 5..#define BTRE
5ed80 45 5f 55 53 45 52 5f 56 45 52 53 49 4f 4e 20 20 E_USER_VERSION
5ed90 20 20 20 20 20 20 36 0d 0a 23 64 65 66 69 6e 65 6..#define
5eda0 20 42 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 BTREE_INCR_VACU
5edb0 55 4d 20 20 20 20 20 20 20 20 20 37 0d 0a 0d 0a UM 7....
5edc0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
5edd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 nt sqlite3BtreeC
5ede0 75 72 73 6f 72 28 0d 0a 20 20 42 74 72 65 65 2a ursor(.. Btree*
5edf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5ee10 2a 20 42 54 72 65 65 20 63 6f 6e 74 61 69 6e 69 * BTree containi
5ee20 6e 67 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e ng table to open
5ee30 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 54 61 62 6c */.. int iTabl
5ee40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
5ee50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
5ee60 6e 64 65 78 20 6f 66 20 72 6f 6f 74 20 70 61 67 ndex of root pag
5ee70 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 77 72 46 6c e */.. int wrFl
5ee80 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ag,
5ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5eea0 31 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 20 1 for writing.
5eeb0 30 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 0 for read-only
5eec0 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 4b 65 79 */.. struct Key
5eed0 49 6e 66 6f 2a 2c 20 20 20 20 20 20 20 20 20 20 Info*,
5eee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
5eef0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 rst argument to
5ef00 63 6f 6d 70 61 72 65 20 66 75 6e 63 74 69 6f 6e compare function
5ef10 20 2a 2f 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 */.. BtCursor
5ef20 2a 70 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 *pCursor
5ef30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
5ef40 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 63 75 pace to write cu
5ef50 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 2a rsor structure *
5ef60 2f 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 /..);..SQLITE_PR
5ef70 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
5ef80 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 3BtreeCursorSize
5ef90 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f (void);..SQLITE_
5efa0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
5efb0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a ite3BtreeCursorZ
5efc0 65 72 6f 28 42 74 43 75 72 73 6f 72 2a 29 3b 0d ero(BtCursor*);.
5efd0 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ...SQLITE_PRIVAT
5efe0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
5eff0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 eeCloseCursor(Bt
5f000 43 75 72 73 6f 72 2a 29 3b 0d 0a 53 51 4c 49 54 Cursor*);..SQLIT
5f010 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
5f020 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f lite3BtreeMoveto
5f030 55 6e 70 61 63 6b 65 64 28 0d 0a 20 20 42 74 43 Unpacked(.. BtC
5f040 75 72 73 6f 72 2a 2c 0d 0a 20 20 55 6e 70 61 63 ursor*,.. Unpac
5f050 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b 65 kedRecord *pUnKe
5f060 79 2c 0d 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 y,.. i64 intKey
5f070 2c 0d 0a 20 20 69 6e 74 20 62 69 61 73 2c 0d 0a ,.. int bias,..
5f080 20 20 69 6e 74 20 2a 70 52 65 73 0d 0a 29 3b 0d int *pRes..);.
5f090 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
5f0a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
5f0b0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 CursorHasMoved(B
5f0c0 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 2a 29 3b tCursor*, int*);
5f0d0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f0e0 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f0f0 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 eDelete(BtCursor
5f100 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
5f110 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 ATE int sqlite3B
5f120 74 72 65 65 49 6e 73 65 72 74 28 42 74 43 75 72 treeInsert(BtCur
5f130 73 6f 72 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 sor*, const void
5f140 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 *pKey, i64 nKey
5f150 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
5f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f170 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 const void
5f180 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 *pData, int nDat
5f190 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 a,..
5f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f1b0 20 20 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 2c int nZero,
5f1c0 20 69 6e 74 20 62 69 61 73 2c 20 69 6e 74 20 73 int bias, int s
5f1d0 65 65 6b 52 65 73 75 6c 74 29 3b 0d 0a 53 51 4c eekResult);..SQL
5f1e0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
5f1f0 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 sqlite3BtreeFirs
5f200 74 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 t(BtCursor*, int
5f210 20 2a 70 52 65 73 29 3b 0d 0a 53 51 4c 49 54 45 *pRes);..SQLITE
5f220 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
5f230 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 ite3BtreeLast(Bt
5f240 43 75 72 73 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 Cursor*, int *pR
5f250 65 73 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 es);..SQLITE_PRI
5f260 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
5f270 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 BtreeNext(BtCurs
5f280 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 65 73 29 3b or*, int *pRes);
5f290 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f2a0 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f2b0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 2a 29 3b eEof(BtCursor*);
5f2c0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f2d0 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f2e0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 ePrevious(BtCurs
5f2f0 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 65 73 29 3b or*, int *pRes);
5f300 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f310 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f320 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f eKeySize(BtCurso
5f330 72 2a 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 3b r*, i64 *pSize);
5f340 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f350 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f360 65 4b 65 79 28 42 74 43 75 72 73 6f 72 2a 2c 20 eKey(BtCursor*,
5f370 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 u32 offset, u32
5f380 61 6d 74 2c 20 76 6f 69 64 2a 29 3b 0d 0a 53 51 amt, void*);..SQ
5f390 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e LITE_PRIVATE con
5f3a0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 st void *sqlite3
5f3b0 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 BtreeKeyFetch(Bt
5f3c0 43 75 72 73 6f 72 2a 2c 20 69 6e 74 20 2a 70 41 Cursor*, int *pA
5f3d0 6d 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 mt);..SQLITE_PRI
5f3e0 56 41 54 45 20 63 6f 6e 73 74 20 76 6f 69 64 20 VATE const void
5f3f0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 *sqlite3BtreeDat
5f400 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 2a aFetch(BtCursor*
5f410 2c 20 69 6e 74 20 2a 70 41 6d 74 29 3b 0d 0a 53 , int *pAmt);..S
5f420 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
5f430 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 t sqlite3BtreeDa
5f440 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 2a taSize(BtCursor*
5f450 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 3b 0d 0a , u32 *pSize);..
5f460 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
5f470 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 nt sqlite3BtreeD
5f480 61 74 61 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 ata(BtCursor*, u
5f490 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 32 offset, u32 a
5f4a0 6d 74 2c 20 76 6f 69 64 2a 29 3b 0d 0a 53 51 4c mt, void*);..SQL
5f4b0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
5f4c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 sqlite3BtreeSet
5f4d0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 CachedRowid(BtCu
5f4e0 72 73 6f 72 2a 2c 20 73 71 6c 69 74 65 33 5f 69 rsor*, sqlite3_i
5f4f0 6e 74 36 34 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 nt64);..SQLITE_P
5f500 52 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 69 RIVATE sqlite3_i
5f510 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 nt64 sqlite3Btre
5f520 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 eGetCachedRowid(
5f530 42 74 43 75 72 73 6f 72 2a 29 3b 0d 0a 0d 0a 53 BtCursor*);....S
5f540 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 68 QLITE_PRIVATE ch
5f550 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 ar *sqlite3Btree
5f560 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 42 IntegrityCheck(B
5f570 74 72 65 65 2a 2c 20 69 6e 74 20 2a 61 52 6f 6f tree*, int *aRoo
5f580 74 2c 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 69 6e t, int nRoot, in
5f590 74 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 4c 49 54 t, int*);..SQLIT
5f5a0 45 5f 50 52 49 56 41 54 45 20 73 74 72 75 63 74 E_PRIVATE struct
5f5b0 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 Pager *sqlite3B
5f5c0 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 2a treePager(Btree*
5f5d0 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 );....SQLITE_PRI
5f5e0 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
5f5f0 42 74 72 65 65 50 75 74 44 61 74 61 28 42 74 43 BtreePutData(BtC
5f600 75 72 73 6f 72 2a 2c 20 75 33 32 20 6f 66 66 73 ursor*, u32 offs
5f610 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 et, u32 amt, voi
5f620 64 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 d*);..SQLITE_PRI
5f630 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
5f640 33 42 74 72 65 65 43 61 63 68 65 4f 76 65 72 66 3BtreeCacheOverf
5f650 6c 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 29 3b low(BtCursor *);
5f660 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f670 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 void sqlite3Btr
5f680 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 eeClearCursor(Bt
5f690 43 75 72 73 6f 72 20 2a 29 3b 0d 0a 0d 0a 53 51 Cursor *);....SQ
5f6a0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
5f6b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 sqlite3BtreeSet
5f6c0 56 65 72 73 69 6f 6e 28 42 74 72 65 65 20 2a 70 Version(Btree *p
5f6d0 42 74 2c 20 69 6e 74 20 69 56 65 72 73 69 6f 6e Bt, int iVersion
5f6e0 29 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 );....#ifndef ND
5f6f0 45 42 55 47 0d 0a 53 51 4c 49 54 45 5f 50 52 49 EBUG..SQLITE_PRI
5f700 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
5f710 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c BtreeCursorIsVal
5f720 69 64 28 42 74 43 75 72 73 6f 72 2a 29 3b 0d 0a id(BtCursor*);..
5f730 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 #endif....#ifnde
5f740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 f SQLITE_OMIT_BT
5f750 52 45 45 43 4f 55 4e 54 0d 0a 53 51 4c 49 54 45 REECOUNT..SQLITE
5f760 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
5f770 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 42 ite3BtreeCount(B
5f780 74 43 75 72 73 6f 72 20 2a 2c 20 69 36 34 20 2a tCursor *, i64 *
5f790 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 );..#endif....#i
5f7a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
5f7b0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
5f7c0 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
5f7d0 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43 75 eCursorInfo(BtCu
5f7e0 72 73 6f 72 2a 2c 20 69 6e 74 2a 2c 20 69 6e 74 rsor*, int*, int
5f7f0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
5f800 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 TE void sqlite3B
5f810 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74 28 42 treeCursorList(B
5f820 74 72 65 65 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d tree*);..#endif.
5f830 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
5f840 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 53 51 4c 49 E_OMIT_WAL..SQLI
5f850 54 45 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 TE_PRIVATE int
5f860 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 sqlite3BtreeChe
5f870 63 6b 70 6f 69 6e 74 28 42 74 72 65 65 2a 2c 20 ckpoint(Btree*,
5f880 69 6e 74 2c 20 69 6e 74 20 2a 2c 20 69 6e 74 20 int, int *, int
5f890 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f *);..#endif..../
5f8a0 2a 0d 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 *..** If we are
5f8b0 6e 6f 74 20 75 73 69 6e 67 20 73 68 61 72 65 64 not using shared
5f8c0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 74 68 65 cache, then the
5f8d0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f re is no need to
5f8e0 0d 0a 2a 2a 20 75 73 65 20 6d 75 74 65 78 65 73 ..** use mutexes
5f8f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 42 to access the B
5f900 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 tShared structur
5f910 65 73 2e 20 20 53 6f 20 6d 61 6b 65 20 74 68 65 es. So make the
5f920 0d 0a 2a 2a 20 45 6e 74 65 72 20 61 6e 64 20 4c ..** Enter and L
5f930 65 61 76 65 20 70 72 6f 63 65 64 75 72 65 73 20 eave procedures
5f940 6e 6f 2d 6f 70 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 no-ops...*/..#if
5f950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
5f960 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0d 0a 53 _SHARED_CACHE..S
5f970 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
5f980 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 void sqlite3Btre
5f990 65 45 6e 74 65 72 28 42 74 72 65 65 2a 29 3b 0d eEnter(Btree*);.
5f9a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
5f9b0 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 void sqlite3Bt
5f9c0 72 65 65 45 6e 74 65 72 41 6c 6c 28 73 71 6c 69 reeEnterAll(sqli
5f9d0 74 65 33 2a 29 3b 0d 0a 23 65 6c 73 65 0d 0a 23 te3*);..#else..#
5f9e0 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 define sqlite3B
5f9f0 74 72 65 65 45 6e 74 65 72 28 58 29 20 0d 0a 23 treeEnter(X) ..#
5fa00 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 define sqlite3B
5fa10 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 58 29 0d treeEnterAll(X).
5fa20 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 21 .#endif....#if !
5fa30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
5fa40 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
5fa50 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 ) && SQLITE_THRE
5fa60 41 44 53 41 46 45 0d 0a 53 51 4c 49 54 45 5f 50 ADSAFE..SQLITE_P
5fa70 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 71 6c RIVATE int sql
5fa80 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c ite3BtreeSharabl
5fa90 65 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 4c 49 e(Btree*);..SQLI
5faa0 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 TE_PRIVATE voi
5fab0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 d sqlite3BtreeLe
5fac0 61 76 65 28 42 74 72 65 65 2a 29 3b 0d 0a 53 51 ave(Btree*);..SQ
5fad0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 LITE_PRIVATE v
5fae0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 oid sqlite3Btree
5faf0 45 6e 74 65 72 43 75 72 73 6f 72 28 42 74 43 75 EnterCursor(BtCu
5fb00 72 73 6f 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f rsor*);..SQLITE_
5fb10 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 PRIVATE void s
5fb20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
5fb30 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 2a Cursor(BtCursor*
5fb40 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
5fb50 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
5fb60 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 73 3BtreeLeaveAll(s
5fb70 71 6c 69 74 65 33 2a 29 3b 0d 0a 23 69 66 6e 64 qlite3*);..#ifnd
5fb80 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 2f 2a 20 ef NDEBUG.. /*
5fb90 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 These routines a
5fba0 72 65 20 75 73 65 64 20 69 6e 73 69 64 65 20 61 re used inside a
5fbb0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e ssert() statemen
5fbc0 74 73 20 6f 6e 6c 79 2e 20 2a 2f 0d 0a 53 51 4c ts only. */..SQL
5fbd0 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 69 6e ITE_PRIVATE in
5fbe0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f t sqlite3BtreeHo
5fbf0 6c 64 73 4d 75 74 65 78 28 42 74 72 65 65 2a 29 ldsMutex(Btree*)
5fc00 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
5fc10 45 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42 E int sqlite3B
5fc20 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 treeHoldsAllMute
5fc30 78 65 73 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a xes(sqlite3*);..
5fc40 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
5fc50 20 69 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65 int sqlite3Sche
5fc60 6d 61 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69 maMutexHeld(sqli
5fc70 74 65 33 2a 2c 69 6e 74 2c 53 63 68 65 6d 61 2a te3*,int,Schema*
5fc80 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 65 6c 73 );..#endif..#els
5fc90 65 0d 0a 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 e....# define sq
5fca0 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 lite3BtreeSharab
5fcb0 6c 65 28 58 29 20 30 0d 0a 23 20 64 65 66 69 6e le(X) 0..# defin
5fcc0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 e sqlite3BtreeLe
5fcd0 61 76 65 28 58 29 0d 0a 23 20 64 65 66 69 6e 65 ave(X)..# define
5fce0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
5fcf0 65 72 43 75 72 73 6f 72 28 58 29 0d 0a 23 20 64 erCursor(X)..# d
5fd00 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72 efine sqlite3Btr
5fd10 65 65 4c 65 61 76 65 43 75 72 73 6f 72 28 58 29 eeLeaveCursor(X)
5fd20 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 ..# define sqlit
5fd30 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 e3BtreeLeaveAll(
5fd40 58 29 0d 0a 0d 0a 23 20 64 65 66 69 6e 65 20 73 X)....# define s
5fd50 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 qlite3BtreeHolds
5fd60 4d 75 74 65 78 28 58 29 20 31 0d 0a 23 20 64 65 Mutex(X) 1..# de
5fd70 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72 65 fine sqlite3Btre
5fd80 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 eHoldsAllMutexes
5fd90 28 58 29 20 31 0d 0a 23 20 64 65 66 69 6e 65 20 (X) 1..# define
5fda0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 sqlite3SchemaMut
5fdb0 65 78 48 65 6c 64 28 58 2c 59 2c 5a 29 20 31 0d exHeld(X,Y,Z) 1.
5fdc0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 23 65 6e .#endif......#en
5fdd0 64 69 66 20 2f 2a 20 5f 42 54 52 45 45 5f 48 5f dif /* _BTREE_H_
5fde0 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */..../********
5fdf0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 62 74 ****** End of bt
5fe00 72 65 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ree.h **********
5fe10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5fe20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5fe30 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a *****/../*******
5fe40 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 69 ******* Continui
5fe50 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 74 ng where we left
5fe60 20 6f 66 66 20 69 6e 20 73 71 6c 69 74 65 49 6e off in sqliteIn
5fe70 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a t.h ************
5fe80 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
5fe90 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 64 65 ******** Include
5fea0 20 76 64 62 65 2e 68 20 69 6e 20 74 68 65 20 6d vdbe.h in the m
5feb0 69 64 64 6c 65 20 6f 66 20 73 71 6c 69 74 65 49 iddle of sqliteI
5fec0 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nt.h ***********
5fed0 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
5fee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 ********* Begin
5fef0 66 69 6c 65 20 76 64 62 65 2e 68 20 2a 2a 2a 2a file vdbe.h ****
5ff00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5ff10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5ff20 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a ********/../*..*
5ff30 2a 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72 * 2001 September
5ff40 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 15..**..** The
5ff50 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 author disclaims
5ff60 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 copyright to th
5ff70 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 is source code.
5ff80 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a In place of..**
5ff90 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
5ffa0 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
5ffb0 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ing:..**..**
5ffc0 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 May you do good
5ffd0 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a and not evil...*
5ffe0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e * May you fin
5fff0 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f d forgiveness fo
60000 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 r yourself and f
60010 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a orgive others...
60020 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 ** May you sh
60030 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 are freely, neve
60040 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 r taking more th
60050 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a an you give...**
60060 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
60070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
60080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
60090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
600a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 ***********..**
600b0 48 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 Header file for
600c0 74 68 65 20 56 69 72 74 75 61 6c 20 44 61 74 61 the Virtual Data
600d0 42 61 73 65 20 45 6e 67 69 6e 65 20 28 56 44 42 Base Engine (VDB
600e0 45 29 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 E)..**..** This
600f0 68 65 61 64 65 72 20 64 65 66 69 6e 65 73 20 74 header defines t
60100 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 he interface to
60110 74 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 the virtual data
60120 62 61 73 65 20 65 6e 67 69 6e 65 0d 0a 2a 2a 20 base engine..**
60130 6f 72 20 56 44 42 45 2e 20 20 54 68 65 20 56 44 or VDBE. The VD
60140 42 45 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e BE implements an
60150 20 61 62 73 74 72 61 63 74 20 6d 61 63 68 69 6e abstract machin
60160 65 20 74 68 61 74 20 72 75 6e 73 20 61 0d 0a 2a e that runs a..*
60170 2a 20 73 69 6d 70 6c 65 20 70 72 6f 67 72 61 6d * simple program
60180 20 74 6f 20 61 63 63 65 73 73 20 61 6e 64 20 6d to access and m
60190 6f 64 69 66 79 20 74 68 65 20 75 6e 64 65 72 6c odify the underl
601a0 79 69 6e 67 20 64 61 74 61 62 61 73 65 2e 0d 0a ying database...
601b0 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 53 51 4c */..#ifndef _SQL
601c0 49 54 45 5f 56 44 42 45 5f 48 5f 0d 0a 23 64 65 ITE_VDBE_H_..#de
601d0 66 69 6e 65 20 5f 53 51 4c 49 54 45 5f 56 44 42 fine _SQLITE_VDB
601e0 45 5f 48 5f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 E_H_../* #includ
601f0 65 20 3c 73 74 64 69 6f 2e 68 3e 20 2a 2f 0d 0a e <stdio.h> */..
60200 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 73 69 6e 67 6c ../*..** A singl
60210 65 20 56 44 42 45 20 69 73 20 61 6e 20 6f 70 61 e VDBE is an opa
60220 71 75 65 20 73 74 72 75 63 74 75 72 65 20 6e 61 que structure na
60230 6d 65 64 20 22 56 64 62 65 22 2e 20 20 4f 6e 6c med "Vdbe". Onl
60240 79 20 72 6f 75 74 69 6e 65 73 0d 0a 2a 2a 20 69 y routines..** i
60250 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c n the source fil
60260 65 20 73 71 6c 69 74 65 56 64 62 65 2e 63 20 61 e sqliteVdbe.c a
60270 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 73 65 re allowed to se
60280 65 20 74 68 65 20 69 6e 73 69 64 65 73 0d 0a 2a e the insides..*
60290 2a 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 * of this struct
602a0 75 72 65 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 ure...*/..typede
602b0 66 20 73 74 72 75 63 74 20 56 64 62 65 20 56 64 f struct Vdbe Vd
602c0 62 65 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 be;..../*..** Th
602d0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 66 e names of the f
602e0 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 73 20 64 ollowing types d
602f0 65 63 6c 61 72 65 64 20 69 6e 20 76 64 62 65 49 eclared in vdbeI
60300 6e 74 2e 68 20 61 72 65 20 72 65 71 75 69 72 65 nt.h are require
60310 64 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 56 64 d..** for the Vd
60320 62 65 4f 70 20 64 65 66 69 6e 69 74 69 6f 6e 2e beOp definition.
60330 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 ..*/..typedef st
60340 72 75 63 74 20 56 64 62 65 46 75 6e 63 20 56 64 ruct VdbeFunc Vd
60350 62 65 46 75 6e 63 3b 0d 0a 74 79 70 65 64 65 66 beFunc;..typedef
60360 20 73 74 72 75 63 74 20 4d 65 6d 20 4d 65 6d 3b struct Mem Mem;
60370 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
60380 20 53 75 62 50 72 6f 67 72 61 6d 20 53 75 62 50 SubProgram SubP
60390 72 6f 67 72 61 6d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a rogram;..../*..*
603a0 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 73 74 72 * A single instr
603b0 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 69 uction of the vi
603c0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 68 61 rtual machine ha
603d0 73 20 61 6e 20 6f 70 63 6f 64 65 0d 0a 2a 2a 20 s an opcode..**
603e0 61 6e 64 20 61 73 20 6d 61 6e 79 20 61 73 20 74 and as many as t
603f0 68 72 65 65 20 6f 70 65 72 61 6e 64 73 2e 20 20 hree operands.
60400 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 The instruction
60410 69 73 20 72 65 63 6f 72 64 65 64 0d 0a 2a 2a 20 is recorded..**
60420 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f as an instance o
60430 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
60440 73 74 72 75 63 74 75 72 65 3a 0d 0a 2a 2f 0d 0a structure:..*/..
60450 73 74 72 75 63 74 20 56 64 62 65 4f 70 20 7b 0d struct VdbeOp {.
60460 0a 20 20 75 38 20 6f 70 63 6f 64 65 3b 20 20 20 . u8 opcode;
60470 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 6f /* What o
60480 70 65 72 61 74 69 6f 6e 20 74 6f 20 70 65 72 66 peration to perf
60490 6f 72 6d 20 2a 2f 0d 0a 20 20 73 69 67 6e 65 64 orm */.. signed
604a0 20 63 68 61 72 20 70 34 74 79 70 65 3b 20 2f 2a char p4type; /*
604b0 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 34 5f 78 One of the P4_x
604c0 78 78 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 xx constants for
604d0 20 70 34 20 2a 2f 0d 0a 20 20 75 38 20 6f 70 66 p4 */.. u8 opf
604e0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a lags; /*
604f0 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 4f 50 46 Mask of the OPF
60500 4c 47 5f 2a 20 66 6c 61 67 73 20 69 6e 20 6f 70 LG_* flags in op
60510 63 6f 64 65 73 2e 68 20 2a 2f 0d 0a 20 20 75 38 codes.h */.. u8
60520 20 70 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 p5;
60530 20 20 2f 2a 20 46 69 66 74 68 20 70 61 72 61 6d /* Fifth param
60540 65 74 65 72 20 69 73 20 61 6e 20 75 6e 73 69 67 eter is an unsig
60550 6e 65 64 20 63 68 61 72 61 63 74 65 72 20 2a 2f ned character */
60560 0d 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 .. int p1;
60570 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 /* First
60580 20 6f 70 65 72 61 6e 64 20 2a 2f 0d 0a 20 20 69 operand */.. i
60590 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 nt p2;
605a0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 /* Second par
605b0 61 6d 65 74 65 72 20 28 6f 66 74 65 6e 20 74 68 ameter (often th
605c0 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 e jump destinati
605d0 6f 6e 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 33 on) */.. int p3
605e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
605f0 20 54 68 65 20 74 68 69 72 64 20 70 61 72 61 6d The third param
60600 65 74 65 72 20 2a 2f 0d 0a 20 20 75 6e 69 6f 6e eter */.. union
60610 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f { /
60620 2a 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65 74 * fourth paramet
60630 65 72 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 er */.. int i
60640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
60650 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c /* Integer val
60660 75 65 20 69 66 20 70 34 74 79 70 65 3d 3d 50 34 ue if p4type==P4
60670 5f 49 4e 54 33 32 20 2a 2f 0d 0a 20 20 20 20 76 _INT32 */.. v
60680 6f 69 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 oid *p;
60690 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 69 63 /* Generic
606a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a 20 20 20 pointer */..
606b0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 char *z;
606c0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
606d0 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 73 er to data for s
606e0 74 72 69 6e 67 20 28 63 68 61 72 20 61 72 72 61 tring (char arra
606f0 79 29 20 74 79 70 65 73 20 2a 2f 0d 0a 20 20 20 y) types */..
60700 20 69 36 34 20 2a 70 49 36 34 3b 20 20 20 20 20 i64 *pI64;
60710 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 /* Used
60720 77 68 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 when p4type is P
60730 34 5f 49 4e 54 36 34 20 2a 2f 0d 0a 20 20 20 20 4_INT64 */..
60740 64 6f 75 62 6c 65 20 2a 70 52 65 61 6c 3b 20 20 double *pReal;
60750 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77 /* Used w
60760 68 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 hen p4type is P4
60770 5f 52 45 41 4c 20 2a 2f 0d 0a 20 20 20 20 46 75 _REAL */.. Fu
60780 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 20 20 20 ncDef *pFunc;
60790 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 /* Used whe
607a0 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 5f 46 n p4type is P4_F
607b0 55 4e 43 44 45 46 20 2a 2f 0d 0a 20 20 20 20 56 UNCDEF */.. V
607c0 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 dbeFunc *pVdbeFu
607d0 6e 63 3b 20 20 20 2f 2a 20 55 73 65 64 20 77 68 nc; /* Used wh
607e0 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 5f en p4type is P4_
607f0 56 44 42 45 46 55 4e 43 20 2a 2f 0d 0a 20 20 20 VDBEFUNC */..
60800 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b CollSeq *pColl;
60810 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 /* Used
60820 77 68 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 when p4type is P
60830 34 5f 43 4f 4c 4c 53 45 51 20 2a 2f 0d 0a 20 20 4_COLLSEQ */..
60840 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 Mem *pMem;
60850 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 /* Used
60860 20 77 68 65 6e 20 70 34 74 79 70 65 20 69 73 20 when p4type is
60870 50 34 5f 4d 45 4d 20 2a 2f 0d 0a 20 20 20 20 56 P4_MEM */.. V
60880 54 61 62 6c 65 20 2a 70 56 74 61 62 3b 20 20 20 Table *pVtab;
60890 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 /* Used wh
608a0 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 5f en p4type is P4_
608b0 56 54 41 42 20 2a 2f 0d 0a 20 20 20 20 4b 65 79 VTAB */.. Key
608c0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 Info *pKeyInfo;
608d0 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e /* Used when
608e0 20 70 34 74 79 70 65 20 69 73 20 50 34 5f 4b 45 p4type is P4_KE
608f0 59 49 4e 46 4f 20 2a 2f 0d 0a 20 20 20 20 69 6e YINFO */.. in
60900 74 20 2a 61 69 3b 20 20 20 20 20 20 20 20 20 20 t *ai;
60910 20 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 /* Used whe
60920 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 5f 49 n p4type is P4_I
60930 4e 54 41 52 52 41 59 20 2a 2f 0d 0a 20 20 20 20 NTARRAY */..
60940 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f SubProgram *pPro
60950 67 72 61 6d 3b 20 20 2f 2a 20 55 73 65 64 20 77 gram; /* Used w
60960 68 65 6e 20 70 34 74 79 70 65 20 69 73 20 50 34 hen p4type is P4
60970 5f 53 55 42 50 52 4f 47 52 41 4d 20 2a 2f 0d 0a _SUBPROGRAM */..
60980 20 20 20 20 69 6e 74 20 28 2a 78 41 64 76 61 6e int (*xAdvan
60990 63 65 29 28 42 74 43 75 72 73 6f 72 20 2a 2c 20 ce)(BtCursor *,
609a0 69 6e 74 20 2a 29 3b 0d 0a 20 20 7d 20 70 34 3b int *);.. } p4;
609b0 0d 0a 2f 2f 23 69 66 64 65 66 20 53 51 4c 49 54 ..//#ifdef SQLIT
609c0 45 5f 44 45 42 55 47 0d 0a 20 20 63 68 61 72 20 E_DEBUG.. char
609d0 2a 7a 43 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 *zComment;
609e0 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 74 /* Comment t
609f0 6f 20 69 6d 70 72 6f 76 65 20 72 65 61 64 61 62 o improve readab
60a00 69 6c 69 74 79 20 2a 2f 0d 0a 2f 2f 23 65 6e 64 ility */..//#end
60a10 69 66 0d 0a 23 69 66 64 65 66 20 56 44 42 45 5f if..#ifdef VDBE_
60a20 50 52 4f 46 49 4c 45 0d 0a 20 20 69 6e 74 20 63 PROFILE.. int c
60a30 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 nt;
60a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
60a50 20 74 69 6d 65 73 20 74 68 69 73 20 69 6e 73 74 times this inst
60a60 72 75 63 74 69 6f 6e 20 77 61 73 20 65 78 65 63 ruction was exec
60a70 75 74 65 64 20 2a 2f 0d 0a 20 20 75 36 34 20 63 uted */.. u64 c
60a80 79 63 6c 65 73 3b 20 20 20 20 20 20 20 20 20 20 ycles;
60a90 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 69 6d /* Total tim
60aa0 65 20 73 70 65 6e 74 20 65 78 65 63 75 74 69 6e e spent executin
60ab0 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 g this instructi
60ac0 6f 6e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d on */..#endif..}
60ad0 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 ;..typedef struc
60ae0 74 20 56 64 62 65 4f 70 20 56 64 62 65 4f 70 3b t VdbeOp VdbeOp;
60af0 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 73 ....../*..** A s
60b00 75 62 2d 72 6f 75 74 69 6e 65 20 75 73 65 64 20 ub-routine used
60b10 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 74 to implement a t
60b20 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0d rigger program..
60b30 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 53 75 62 50 .*/..struct SubP
60b40 72 6f 67 72 61 6d 20 7b 0d 0a 20 20 56 64 62 65 rogram {.. Vdbe
60b50 4f 70 20 2a 61 4f 70 3b 20 20 20 20 20 20 20 20 Op *aOp;
60b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 /* Arr
60b70 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 66 6f ay of opcodes fo
60b80 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f r sub-program */
60b90 0d 0a 20 20 69 6e 74 20 6e 4f 70 3b 20 20 20 20 .. int nOp;
60ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60bb0 20 20 2f 2a 20 45 6c 65 6d 65 6e 74 73 20 69 6e /* Elements in
60bc0 20 61 4f 70 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 aOp[] */.. int
60bd0 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 nMem;
60be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
60bf0 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 mber of memory c
60c00 65 6c 6c 73 20 72 65 71 75 69 72 65 64 20 2a 2f ells required */
60c10 0d 0a 20 20 69 6e 74 20 6e 43 73 72 3b 20 20 20 .. int nCsr;
60c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 /* Number of c
60c40 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 ursors required
60c50 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b */.. int nOnce;
60c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60c70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
60c80 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 OP_Once instruc
60c90 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 76 6f 69 64 tions */.. void
60ca0 20 2a 74 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 *token;
60cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 64 20 /* id
60cc0 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 that may be used
60cd0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 72 to recursive tr
60ce0 69 67 67 65 72 73 20 2a 2f 0d 0a 20 20 53 75 62 iggers */.. Sub
60cf0 50 72 6f 67 72 61 6d 20 2a 70 4e 65 78 74 3b 20 Program *pNext;
60d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
60d10 78 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 61 xt sub-program a
60d20 6c 72 65 61 64 79 20 76 69 73 69 74 65 64 20 2a lready visited *
60d30 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 /..};..../*..**
60d40 41 20 73 6d 61 6c 6c 65 72 20 76 65 72 73 69 6f A smaller versio
60d50 6e 20 6f 66 20 56 64 62 65 4f 70 20 75 73 65 64 n of VdbeOp used
60d60 20 66 6f 72 20 74 68 65 20 56 64 62 65 41 64 64 for the VdbeAdd
60d70 4f 70 4c 69 73 74 28 29 20 66 75 6e 63 74 69 6f OpList() functio
60d80 6e 20 62 65 63 61 75 73 65 0d 0a 2a 2a 20 69 74 n because..** it
60d90 20 74 61 6b 65 73 20 75 70 20 6c 65 73 73 20 73 takes up less s
60da0 70 61 63 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 pace...*/..struc
60db0 74 20 56 64 62 65 4f 70 4c 69 73 74 20 7b 0d 0a t VdbeOpList {..
60dc0 20 20 75 38 20 6f 70 63 6f 64 65 3b 20 20 20 20 u8 opcode;
60dd0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 6f 70 /* What op
60de0 65 72 61 74 69 6f 6e 20 74 6f 20 70 65 72 66 6f eration to perfo
60df0 72 6d 20 2a 2f 0d 0a 20 20 73 69 67 6e 65 64 20 rm */.. signed
60e00 63 68 61 72 20 70 31 3b 20 20 20 20 20 2f 2a 20 char p1; /*
60e10 46 69 72 73 74 20 6f 70 65 72 61 6e 64 20 2a 2f First operand */
60e20 0d 0a 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 .. signed char
60e30 70 32 3b 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e p2; /* Secon
60e40 64 20 70 61 72 61 6d 65 74 65 72 20 28 6f 66 74 d parameter (oft
60e50 65 6e 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 en the jump dest
60e60 69 6e 61 74 69 6f 6e 29 20 2a 2f 0d 0a 20 20 73 ination) */.. s
60e70 69 67 6e 65 64 20 63 68 61 72 20 70 33 3b 20 20 igned char p3;
60e80 20 20 20 2f 2a 20 54 68 69 72 64 20 70 61 72 61 /* Third para
60e90 6d 65 74 65 72 20 2a 2f 0d 0a 7d 3b 0d 0a 74 79 meter */..};..ty
60ea0 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 pedef struct Vdb
60eb0 65 4f 70 4c 69 73 74 20 56 64 62 65 4f 70 4c 69 eOpList VdbeOpLi
60ec0 73 74 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c st;..../*..** Al
60ed0 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 lowed values of
60ee0 56 64 62 65 4f 70 2e 70 34 74 79 70 65 0d 0a 2a VdbeOp.p4type..*
60ef0 2f 0d 0a 23 64 65 66 69 6e 65 20 50 34 5f 4e 4f /..#define P4_NO
60f00 54 55 53 45 44 20 20 20 20 30 20 20 20 2f 2a 20 TUSED 0 /*
60f10 54 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 The P4 parameter
60f20 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0d is not used */.
60f30 0a 23 64 65 66 69 6e 65 20 50 34 5f 44 59 4e 41 .#define P4_DYNA
60f40 4d 49 43 20 20 28 2d 31 29 20 20 2f 2a 20 50 6f MIC (-1) /* Po
60f50 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e inter to a strin
60f60 67 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 g obtained from
60f70 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 2a sqliteMalloc() *
60f80 2f 0d 0a 23 64 65 66 69 6e 65 20 50 34 5f 53 54 /..#define P4_ST
60f90 41 54 49 43 20 20 20 28 2d 32 29 20 20 2f 2a 20 ATIC (-2) /*
60fa0 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 Pointer to a sta
60fb0 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 23 tic string */..#
60fc0 64 65 66 69 6e 65 20 50 34 5f 43 4f 4c 4c 53 45 define P4_COLLSE
60fd0 51 20 20 28 2d 34 29 20 20 2f 2a 20 50 34 20 69 Q (-4) /* P4 i
60fe0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
60ff0 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 CollSeq structu
61000 72 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 re */..#define P
61010 34 5f 46 55 4e 43 44 45 46 20 20 28 2d 35 29 20 4_FUNCDEF (-5)
61020 20 2f 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e /* P4 is a poin
61030 74 65 72 20 74 6f 20 61 20 46 75 6e 63 44 65 66 ter to a FuncDef
61040 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a 23 structure */..#
61050 64 65 66 69 6e 65 20 50 34 5f 4b 45 59 49 4e 46 define P4_KEYINF
61060 4f 20 20 28 2d 36 29 20 20 2f 2a 20 50 34 20 69 O (-6) /* P4 i
61070 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
61080 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 KeyInfo structu
61090 72 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 re */..#define P
610a0 34 5f 56 44 42 45 46 55 4e 43 20 28 2d 37 29 20 4_VDBEFUNC (-7)
610b0 20 2f 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e /* P4 is a poin
610c0 74 65 72 20 74 6f 20 61 20 56 64 62 65 46 75 6e ter to a VdbeFun
610d0 63 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a c structure */..
610e0 23 64 65 66 69 6e 65 20 50 34 5f 4d 45 4d 20 20 #define P4_MEM
610f0 20 20 20 20 28 2d 38 29 20 20 2f 2a 20 50 34 20 (-8) /* P4
61100 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
61110 61 20 4d 65 6d 2a 20 20 20 20 73 74 72 75 63 74 a Mem* struct
61120 75 72 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ure */..#define
61130 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 20 30 20 P4_TRANSIENT 0
61140 20 20 2f 2a 20 50 34 20 69 73 20 61 20 70 6f 69 /* P4 is a poi
61150 6e 74 65 72 20 74 6f 20 61 20 74 72 61 6e 73 69 nter to a transi
61160 65 6e 74 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 23 ent string */..#
61170 64 65 66 69 6e 65 20 50 34 5f 56 54 41 42 20 20 define P4_VTAB
61180 20 20 20 28 2d 31 30 29 20 2f 2a 20 50 34 20 69 (-10) /* P4 i
61190 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
611a0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 n sqlite3_vtab s
611b0 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a 23 64 65 tructure */..#de
611c0 66 69 6e 65 20 50 34 5f 4d 50 52 49 4e 54 46 20 fine P4_MPRINTF
611d0 20 28 2d 31 31 29 20 2f 2a 20 50 34 20 69 73 20 (-11) /* P4 is
611e0 61 20 73 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 a string obtaine
611f0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d d from sqlite3_m
61200 70 72 69 6e 74 66 28 29 20 2a 2f 0d 0a 23 64 65 printf() */..#de
61210 66 69 6e 65 20 50 34 5f 52 45 41 4c 20 20 20 20 fine P4_REAL
61220 20 28 2d 31 32 29 20 2f 2a 20 50 34 20 69 73 20 (-12) /* P4 is
61230 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e a 64-bit floatin
61240 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f g point value */
61250 0d 0a 23 64 65 66 69 6e 65 20 50 34 5f 49 4e 54 ..#define P4_INT
61260 36 34 20 20 20 20 28 2d 31 33 29 20 2f 2a 20 50 64 (-13) /* P
61270 34 20 69 73 20 61 20 36 34 2d 62 69 74 20 73 69 4 is a 64-bit si
61280 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0d gned integer */.
61290 0a 23 64 65 66 69 6e 65 20 50 34 5f 49 4e 54 33 .#define P4_INT3
612a0 32 20 20 20 20 28 2d 31 34 29 20 2f 2a 20 50 34 2 (-14) /* P4
612b0 20 69 73 20 61 20 33 32 2d 62 69 74 20 73 69 67 is a 32-bit sig
612c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0d 0a ned integer */..
612d0 23 64 65 66 69 6e 65 20 50 34 5f 49 4e 54 41 52 #define P4_INTAR
612e0 52 41 59 20 28 2d 31 35 29 20 2f 2a 20 50 34 20 RAY (-15) /* P4
612f0 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 33 is a vector of 3
61300 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 2a 2-bit integers *
61310 2f 0d 0a 23 64 65 66 69 6e 65 20 50 34 5f 53 55 /..#define P4_SU
61320 42 50 52 4f 47 52 41 4d 20 20 28 2d 31 38 29 20 BPROGRAM (-18)
61330 2f 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 /* P4 is a point
61340 65 72 20 74 6f 20 61 20 53 75 62 50 72 6f 67 72 er to a SubProgr
61350 61 6d 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d am structure */.
61360 0a 23 64 65 66 69 6e 65 20 50 34 5f 41 44 56 41 .#define P4_ADVA
61370 4e 43 45 20 20 28 2d 31 39 29 20 2f 2a 20 50 34 NCE (-19) /* P4
61380 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f is a pointer to
61390 20 42 74 72 65 65 4e 65 78 74 28 29 20 6f 72 20 BtreeNext() or
613a0 42 74 72 65 65 50 72 65 76 28 29 20 2a 2f 0d 0a BtreePrev() */..
613b0 0d 0a 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 ../* When adding
613c0 20 61 20 50 34 20 61 72 67 75 6d 65 6e 74 20 75 a P4 argument u
613d0 73 69 6e 67 20 50 34 5f 4b 45 59 49 4e 46 4f 2c sing P4_KEYINFO,
613e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 4b a copy of the K
613f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 eyInfo structure
61400 0d 0a 2a 2a 20 69 73 20 6d 61 64 65 2e 20 20 54 ..** is made. T
61410 68 61 74 20 63 6f 70 79 20 69 73 20 66 72 65 65 hat copy is free
61420 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 d when the Vdbe
61430 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 20 20 42 is finalized. B
61440 75 74 20 69 66 20 74 68 65 0d 0a 2a 2a 20 61 72 ut if the..** ar
61450 67 75 6d 65 6e 74 20 69 73 20 50 34 5f 4b 45 59 gument is P4_KEY
61460 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 74 68 INFO_HANDOFF, th
61470 65 20 70 61 73 73 65 64 20 69 6e 20 70 6f 69 6e e passed in poin
61480 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 49 74 ter is used. It
61490 20 73 74 69 6c 6c 0d 0a 2a 2a 20 67 65 74 73 20 still..** gets
614a0 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 freed when the V
614b0 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 dbe is finalized
614c0 20 73 6f 20 69 74 20 73 74 69 6c 6c 20 73 68 6f so it still sho
614d0 75 6c 64 20 62 65 20 6f 62 74 61 69 6e 65 64 0d uld be obtained.
614e0 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c .** from a singl
614f0 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 e sqliteMalloc()
61500 2e 20 20 42 75 74 20 6e 6f 20 63 6f 70 79 20 69 . But no copy i
61510 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 63 s made and the c
61520 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 66 75 6e 63 74 alling..** funct
61530 69 6f 6e 20 73 68 6f 75 6c 64 20 2a 6e 6f 74 2a ion should *not*
61540 20 74 72 79 20 74 6f 20 66 72 65 65 20 74 68 65 try to free the
61550 20 4b 65 79 49 6e 66 6f 2e 0d 0a 2a 2f 0d 0a 23 KeyInfo...*/..#
61560 64 65 66 69 6e 65 20 50 34 5f 4b 45 59 49 4e 46 define P4_KEYINF
61570 4f 5f 48 41 4e 44 4f 46 46 20 28 2d 31 36 29 0d O_HANDOFF (-16).
61580 0a 23 64 65 66 69 6e 65 20 50 34 5f 4b 45 59 49 .#define P4_KEYI
61590 4e 46 4f 5f 53 54 41 54 49 43 20 20 28 2d 31 37 NFO_STATIC (-17
615a0 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 )..../*..** The
615b0 56 64 62 65 2e 61 43 6f 6c 4e 61 6d 65 20 61 72 Vdbe.aColName ar
615c0 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 35 6e 20 ray contains 5n
615d0 4d 65 6d 20 73 74 72 75 63 74 75 72 65 73 2c 20 Mem structures,
615e0 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 0d where n is the .
615f0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f .** number of co
61600 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 72 65 lumns of data re
61610 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74 turned by the st
61620 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 23 64 atement...*/..#d
61630 65 66 69 6e 65 20 43 4f 4c 4e 41 4d 45 5f 4e 41 efine COLNAME_NA
61640 4d 45 20 20 20 20 20 30 0d 0a 23 64 65 66 69 6e ME 0..#defin
61650 65 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 e COLNAME_DECLTY
61660 50 45 20 31 0d 0a 23 64 65 66 69 6e 65 20 43 4f PE 1..#define CO
61670 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 20 32 LNAME_DATABASE 2
61680 0d 0a 23 64 65 66 69 6e 65 20 43 4f 4c 4e 41 4d ..#define COLNAM
61690 45 5f 54 41 42 4c 45 20 20 20 20 33 0d 0a 23 64 E_TABLE 3..#d
616a0 65 66 69 6e 65 20 43 4f 4c 4e 41 4d 45 5f 43 4f efine COLNAME_CO
616b0 4c 55 4d 4e 20 20 20 34 0d 0a 23 69 66 64 65 66 LUMN 4..#ifdef
616c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 SQLITE_ENABLE_C
616d0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0d 0a OLUMN_METADATA..
616e0 23 20 64 65 66 69 6e 65 20 43 4f 4c 4e 41 4d 45 # define COLNAME
616f0 5f 4e 20 20 20 20 20 20 20 20 35 20 20 20 20 20 _N 5
61700 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 43 4f /* Number of CO
61710 4c 4e 41 4d 45 5f 78 78 78 20 73 79 6d 62 6f 6c LNAME_xxx symbol
61720 73 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 23 20 69 s */..#else..# i
61730 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
61740 5f 44 45 43 4c 54 59 50 45 0d 0a 23 20 20 20 64 _DECLTYPE..# d
61750 65 66 69 6e 65 20 43 4f 4c 4e 41 4d 45 5f 4e 20 efine COLNAME_N
61760 20 20 20 20 20 31 20 20 20 20 20 20 2f 2a 20 53 1 /* S
61770 74 6f 72 65 20 6f 6e 6c 79 20 74 68 65 20 6e 61 tore only the na
61780 6d 65 20 2a 2f 0d 0a 23 20 65 6c 73 65 0d 0a 23 me */..# else..#
61790 20 20 20 64 65 66 69 6e 65 20 43 4f 4c 4e 41 4d define COLNAM
617a0 45 5f 4e 20 20 20 20 20 20 32 20 20 20 20 20 20 E_N 2
617b0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 61 6d /* Store the nam
617c0 65 20 61 6e 64 20 64 65 63 6c 74 79 70 65 20 2a e and decltype *
617d0 2f 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 65 6e 64 /..# endif..#end
617e0 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 if..../*..** The
617f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f following macro
61800 20 63 6f 6e 76 65 72 74 73 20 61 20 72 65 6c 61 converts a rela
61810 74 69 76 65 20 61 64 64 72 65 73 73 20 69 6e 20 tive address in
61820 74 68 65 20 70 32 20 66 69 65 6c 64 0d 0a 2a 2a the p2 field..**
61830 20 6f 66 20 61 20 56 64 62 65 4f 70 20 73 74 72 of a VdbeOp str
61840 75 63 74 75 72 65 20 69 6e 74 6f 20 61 20 6e 65 ucture into a ne
61850 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 73 6f gative number so
61860 20 74 68 61 74 20 0d 0a 2a 2a 20 73 71 6c 69 74 that ..** sqlit
61870 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 e3VdbeAddOpList(
61880 29 20 6b 6e 6f 77 73 20 74 68 61 74 20 74 68 65 ) knows that the
61890 20 61 64 64 72 65 73 73 20 69 73 20 72 65 6c 61 address is rela
618a0 74 69 76 65 2e 20 20 43 61 6c 6c 69 6e 67 0d 0a tive. Calling..
618b0 2a 2a 20 74 68 65 20 6d 61 63 72 6f 20 61 67 61 ** the macro aga
618c0 69 6e 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 in restores the
618d0 61 64 64 72 65 73 73 2e 0d 0a 2a 2f 0d 0a 23 64 address...*/..#d
618e0 65 66 69 6e 65 20 41 44 44 52 28 58 29 20 20 28 efine ADDR(X) (
618f0 2d 31 2d 28 58 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a -1-(X))..../*..*
61900 2a 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 73 * The makefile s
61910 63 61 6e 73 20 74 68 65 20 76 64 62 65 2e 63 20 cans the vdbe.c
61920 73 6f 75 72 63 65 20 66 69 6c 65 20 61 6e 64 20 source file and
61930 63 72 65 61 74 65 73 20 74 68 65 20 22 6f 70 63 creates the "opc
61940 6f 64 65 73 2e 68 22 0d 0a 2a 2a 20 68 65 61 64 odes.h"..** head
61950 65 72 20 66 69 6c 65 20 74 68 61 74 20 64 65 66 er file that def
61960 69 6e 65 73 20 61 20 6e 75 6d 62 65 72 20 66 6f ines a number fo
61970 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 75 73 r each opcode us
61980 65 64 20 62 79 20 74 68 65 20 56 44 42 45 2e 0d ed by the VDBE..
61990 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .*/../**********
619a0 2a 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 6f 70 63 **** Include opc
619b0 6f 64 65 73 2e 68 20 69 6e 20 74 68 65 20 6d 69 odes.h in the mi
619c0 64 64 6c 65 20 6f 66 20 76 64 62 65 2e 68 20 2a ddle of vdbe.h *
619d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
619e0 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
619f0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 ***** Begin file
61a00 20 6f 70 63 6f 64 65 73 2e 68 20 2a 2a 2a 2a 2a opcodes.h *****
61a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
61a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
61a30 2a 2a 2a 2a 2f 0d 0a 2f 2a 20 41 75 74 6f 6d 61 ****/../* Automa
61a40 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 tically generate
61a50 64 2e 20 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 d. Do not edit
61a60 2a 2f 0d 0a 2f 2a 20 53 65 65 20 74 68 65 20 6d */../* See the m
61a70 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 kopcodeh.awk scr
61a80 69 70 74 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ipt for details
61a90 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 47 */..#define OP_G
61aa0 6f 74 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 oto
61ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61ac0 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 4f 1..#define O
61ad0 50 5f 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 P_Gosub
61ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61af0 20 20 20 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 2..#defin
61b00 65 20 4f 50 5f 52 65 74 75 72 6e 20 20 20 20 20 e OP_Return
61b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61b20 20 20 20 20 20 20 20 20 20 20 33 0d 0a 23 64 65 3..#de
61b30 66 69 6e 65 20 4f 50 5f 59 69 65 6c 64 20 20 20 fine OP_Yield
61b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61b50 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0d 0a 4..
61b60 23 64 65 66 69 6e 65 20 4f 50 5f 48 61 6c 74 49 #define OP_HaltI
61b70 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 fNull
61b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61b90 35 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 48 61 5..#define OP_Ha
61ba0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 lt
61bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61bc0 20 20 20 36 0d 0a 23 64 65 66 69 6e 65 20 4f 50 6..#define OP
61bd0 5f 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 20 _Integer
61be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61bf0 20 20 20 20 20 20 37 0d 0a 23 64 65 66 69 6e 65 7..#define
61c00 20 4f 50 5f 49 6e 74 36 34 20 20 20 20 20 20 20 OP_Int64
61c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61c20 20 20 20 20 20 20 20 20 20 38 0d 0a 23 64 65 66 8..#def
61c30 69 6e 65 20 4f 50 5f 52 65 61 6c 20 20 20 20 20 ine OP_Real
61c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61c50 20 20 20 20 20 20 20 20 20 20 31 33 30 20 20 20 130
61c60 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c /* same as TK_FL
61c70 4f 41 54 20 20 20 20 2a 2f 0d 0a 23 64 65 66 69 OAT */..#defi
61c80 6e 65 20 4f 50 5f 53 74 72 69 6e 67 38 20 20 20 ne OP_String8
61c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61ca0 20 20 20 20 20 20 20 20 20 20 39 34 20 20 20 2f 94 /
61cb0 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 * same as TK_STR
61cc0 49 4e 47 20 20 20 2a 2f 0d 0a 23 64 65 66 69 6e ING */..#defin
61cd0 65 20 4f 50 5f 53 74 72 69 6e 67 20 20 20 20 20 e OP_String
61ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61cf0 20 20 20 20 20 20 20 20 20 20 39 0d 0a 23 64 65 9..#de
61d00 66 69 6e 65 20 4f 50 5f 4e 75 6c 6c 20 20 20 20 fine OP_Null
61d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61d20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 0d 0a 10..
61d30 23 64 65 66 69 6e 65 20 4f 50 5f 42 6c 6f 62 20 #define OP_Blob
61d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
61d60 31 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 56 61 1..#define OP_Va
61d70 72 69 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 riable
61d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61d90 20 20 31 32 0d 0a 23 64 65 66 69 6e 65 20 4f 50 12..#define OP
61da0 5f 4d 6f 76 65 20 20 20 20 20 20 20 20 20 20 20 _Move
61db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61dc0 20 20 20 20 20 31 33 0d 0a 23 64 65 66 69 6e 65 13..#define
61dd0 20 4f 50 5f 43 6f 70 79 20 20 20 20 20 20 20 20 OP_Copy
61de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61df0 20 20 20 20 20 20 20 20 31 34 0d 0a 23 64 65 66 14..#def
61e00 69 6e 65 20 4f 50 5f 53 43 6f 70 79 20 20 20 20 ine OP_SCopy
61e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61e20 20 20 20 20 20 20 20 20 20 20 20 31 35 0d 0a 23 15..#
61e30 64 65 66 69 6e 65 20 4f 50 5f 52 65 73 75 6c 74 define OP_Result
61e40 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 Row
61e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36 16
61e60 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 43 6f 6e ..#define OP_Con
61e70 63 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 cat
61e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61e90 20 39 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 91 /* same as
61ea0 20 54 4b 5f 43 4f 4e 43 41 54 20 20 20 2a 2f 0d TK_CONCAT */.
61eb0 0a 23 64 65 66 69 6e 65 20 4f 50 5f 41 64 64 20 .#define OP_Add
61ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61ee0 38 36 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 86 /* same as
61ef0 54 4b 5f 50 4c 55 53 20 20 20 20 20 2a 2f 0d 0a TK_PLUS */..
61f00 23 64 65 66 69 6e 65 20 4f 50 5f 53 75 62 74 72 #define OP_Subtr
61f10 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 act
61f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 8
61f30 37 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 7 /* same as T
61f40 4b 5f 4d 49 4e 55 53 20 20 20 20 2a 2f 0d 0a 23 K_MINUS */..#
61f50 64 65 66 69 6e 65 20 4f 50 5f 4d 75 6c 74 69 70 define OP_Multip
61f60 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ly
61f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 38 88
61f80 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b /* same as TK
61f90 5f 53 54 41 52 20 20 20 20 20 2a 2f 0d 0a 23 64 _STAR */..#d
61fa0 65 66 69 6e 65 20 4f 50 5f 44 69 76 69 64 65 20 efine OP_Divide
61fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 39 20 89
61fd0 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f /* same as TK_
61fe0 53 4c 41 53 48 20 20 20 20 2a 2f 0d 0a 23 64 65 SLASH */..#de
61ff0 66 69 6e 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65 fine OP_Remainde
62000 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r
62010 20 20 20 20 20 20 20 20 20 20 20 20 39 30 20 20 90
62020 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 /* same as TK_R
62030 45 4d 20 20 20 20 20 20 2a 2f 0d 0a 23 64 65 66 EM */..#def
62040 69 6e 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 20 20 ine OP_CollSeq
62050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62060 20 20 20 20 20 20 20 20 20 20 20 31 37 0d 0a 23 17..#
62070 64 65 66 69 6e 65 20 4f 50 5f 46 75 6e 63 74 69 define OP_Functi
62080 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 on
62090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 38 18
620a0 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 69 74 ..#define OP_Bit
620b0 41 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 And
620c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
620d0 20 38 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 82 /* same as
620e0 20 54 4b 5f 42 49 54 41 4e 44 20 20 20 2a 2f 0d TK_BITAND */.
620f0 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 69 74 4f .#define OP_BitO
62100 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r
62110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62120 38 33 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 83 /* same as
62130 54 4b 5f 42 49 54 4f 52 20 20 20 20 2a 2f 0d 0a TK_BITOR */..
62140 23 64 65 66 69 6e 65 20 4f 50 5f 53 68 69 66 74 #define OP_Shift
62150 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 20 20 Left
62160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 8
62170 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4 /* same as T
62180 4b 5f 4c 53 48 49 46 54 20 20 20 2a 2f 0d 0a 23 K_LSHIFT */..#
62190 64 65 66 69 6e 65 20 4f 50 5f 53 68 69 66 74 52 define OP_ShiftR
621a0 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 ight
621b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 35 85
621c0 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b /* same as TK
621d0 5f 52 53 48 49 46 54 20 20 20 2a 2f 0d 0a 23 64 _RSHIFT */..#d
621e0 65 66 69 6e 65 20 4f 50 5f 41 64 64 49 6d 6d 20 efine OP_AddImm
621f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62200 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0d 20.
62210 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4d 75 73 74 .#define OP_Must
62220 42 65 49 6e 74 20 20 20 20 20 20 20 20 20 20 20 BeInt
62230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62240 32 31 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 52 21..#define OP_R
62250 65 61 6c 41 66 66 69 6e 69 74 79 20 20 20 20 20 ealAffinity
62260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62270 20 20 20 32 32 0d 0a 23 64 65 66 69 6e 65 20 4f 22..#define O
62280 50 5f 54 6f 54 65 78 74 20 20 20 20 20 20 20 20 P_ToText
62290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
622a0 20 20 20 20 20 31 34 31 20 20 20 2f 2a 20 73 61 141 /* sa
622b0 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45 58 54 me as TK_TO_TEXT
622c0 20 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 */..#define OP
622d0 5f 54 6f 42 6c 6f 62 20 20 20 20 20 20 20 20 20 _ToBlob
622e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
622f0 20 20 20 20 31 34 32 20 20 20 2f 2a 20 73 61 6d 142 /* sam
62300 65 20 61 73 20 54 4b 5f 54 4f 5f 42 4c 4f 42 20 e as TK_TO_BLOB
62310 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f */..#define OP_
62320 54 6f 4e 75 6d 65 72 69 63 20 20 20 20 20 20 20 ToNumeric
62330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62340 20 20 20 31 34 33 20 20 20 2f 2a 20 73 61 6d 65 143 /* same
62350 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49 as TK_TO_NUMERI
62360 43 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f C*/..#define OP_
62370 54 6f 49 6e 74 20 20 20 20 20 20 20 20 20 20 20 ToInt
62380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62390 20 20 20 31 34 34 20 20 20 2f 2a 20 73 61 6d 65 144 /* same
623a0 20 61 73 20 54 4b 5f 54 4f 5f 49 4e 54 20 20 20 as TK_TO_INT
623b0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 54 */..#define OP_T
623c0 6f 52 65 61 6c 20 20 20 20 20 20 20 20 20 20 20 oReal
623d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
623e0 20 20 31 34 35 20 20 20 2f 2a 20 73 61 6d 65 20 145 /* same
623f0 61 73 20 54 4b 5f 54 4f 5f 52 45 41 4c 20 20 2a as TK_TO_REAL *
62400 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 45 71 /..#define OP_Eq
62410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62430 20 20 37 36 20 20 20 2f 2a 20 73 61 6d 65 20 61 76 /* same a
62440 73 20 54 4b 5f 45 51 20 20 20 20 20 20 20 2a 2f s TK_EQ */
62450 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4e 65 20 ..#define OP_Ne
62460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62480 20 37 35 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 75 /* same as
62490 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 2a 2f 0d TK_NE */.
624a0 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4c 74 20 20 .#define OP_Lt
624b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
624c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
624d0 37 39 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 79 /* same as
624e0 54 4b 5f 4c 54 20 20 20 20 20 20 20 2a 2f 0d 0a TK_LT */..
624f0 23 64 65 66 69 6e 65 20 4f 50 5f 4c 65 20 20 20 #define OP_Le
62500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 7
62520 38 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 8 /* same as T
62530 4b 5f 4c 45 20 20 20 20 20 20 20 2a 2f 0d 0a 23 K_LE */..#
62540 64 65 66 69 6e 65 20 4f 50 5f 47 74 20 20 20 20 define OP_Gt
62550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 37 77
62570 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b /* same as TK
62580 5f 47 54 20 20 20 20 20 20 20 2a 2f 0d 0a 23 64 _GT */..#d
62590 65 66 69 6e 65 20 4f 50 5f 47 65 20 20 20 20 20 efine OP_Ge
625a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
625b0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 30 20 80
625c0 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f /* same as TK_
625d0 47 45 20 20 20 20 20 20 20 2a 2f 0d 0a 23 64 65 GE */..#de
625e0 66 69 6e 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 fine OP_Permutat
625f0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 ion
62600 20 20 20 20 20 20 20 20 20 20 20 20 32 33 0d 0a 23..
62610 23 64 65 66 69 6e 65 20 4f 50 5f 43 6f 6d 70 61 #define OP_Compa
62620 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 re
62630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2
62640 34 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4a 75 4..#define OP_Ju
62650 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 mp
62660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62670 20 20 32 35 0d 0a 23 64 65 66 69 6e 65 20 4f 50 25..#define OP
62680 5f 41 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 _And
62690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
626a0 20 20 20 20 20 36 39 20 20 20 2f 2a 20 73 61 6d 69 /* sam
626b0 65 20 61 73 20 54 4b 5f 41 4e 44 20 20 20 20 20 e as TK_AND
626c0 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f */..#define OP_
626d0 4f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 Or
626e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
626f0 20 20 20 20 36 38 20 20 20 2f 2a 20 73 61 6d 65 68 /* same
62700 20 61 73 20 54 4b 5f 4f 52 20 20 20 20 20 20 20 as TK_OR
62710 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4e */..#define OP_N
62720 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ot
62730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62740 20 20 20 31 39 20 20 20 2f 2a 20 73 61 6d 65 20 19 /* same
62750 61 73 20 54 4b 5f 4e 4f 54 20 20 20 20 20 20 2a as TK_NOT *
62760 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 69 /..#define OP_Bi
62770 74 4e 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 tNot
62780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62790 20 20 39 33 20 20 20 2f 2a 20 73 61 6d 65 20 61 93 /* same a
627a0 73 20 54 4b 5f 42 49 54 4e 4f 54 20 20 20 2a 2f s TK_BITNOT */
627b0 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4f 6e 63 ..#define OP_Onc
627c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
627d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
627e0 20 32 36 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 26..#define OP_
627f0 49 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 If
62800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62810 20 20 20 20 32 37 0d 0a 23 64 65 66 69 6e 65 20 27..#define
62820 4f 50 5f 49 66 4e 6f 74 20 20 20 20 20 20 20 20 OP_IfNot
62830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62840 20 20 20 20 20 20 20 32 38 0d 0a 23 64 65 66 69 28..#defi
62850 6e 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 20 20 20 ne OP_IsNull
62860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62870 20 20 20 20 20 20 20 20 20 20 37 33 20 20 20 2f 73 /
62880 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e * same as TK_ISN
62890 55 4c 4c 20 20 20 2a 2f 0d 0a 23 64 65 66 69 6e ULL */..#defin
628a0 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 20 20 20 e OP_NotNull
628b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
628c0 20 20 20 20 20 20 20 20 20 37 34 20 20 20 2f 2a 74 /*
628d0 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e same as TK_NOTN
628e0 55 4c 4c 20 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ULL */..#define
628f0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 20 20 OP_Column
62900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62910 20 20 20 20 20 20 20 20 32 39 0d 0a 23 64 65 66 29..#def
62920 69 6e 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 ine OP_Affinity
62930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62940 20 20 20 20 20 20 20 20 20 20 20 33 30 0d 0a 23 30..#
62950 64 65 66 69 6e 65 20 4f 50 5f 4d 61 6b 65 52 65 define OP_MakeRe
62960 63 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 20 cord
62970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 31 31
62980 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 43 6f 75 ..#define OP_Cou
62990 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 nt
629a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
629b0 20 33 32 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 32..#define OP_
629c0 53 61 76 65 70 6f 69 6e 74 20 20 20 20 20 20 20 Savepoint
629d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
629e0 20 20 20 20 33 33 0d 0a 23 64 65 66 69 6e 65 20 33..#define
629f0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 20 20 20 OP_AutoCommit
62a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62a10 20 20 20 20 20 20 20 33 34 0d 0a 23 64 65 66 69 34..#defi
62a20 6e 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f ne OP_Transactio
62a30 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
62a40 20 20 20 20 20 20 20 20 20 20 33 35 0d 0a 23 64 35..#d
62a50 65 66 69 6e 65 20 4f 50 5f 52 65 61 64 43 6f 6f efine OP_ReadCoo
62a60 6b 69 65 20 20 20 20 20 20 20 20 20 20 20 20 20 kie
62a70 20 20 20 20 20 20 20 20 20 20 20 20 20 33 36 0d 36.
62a80 0a 23 64 65 66 69 6e 65 20 4f 50 5f 53 65 74 43 .#define OP_SetC
62a90 6f 6f 6b 69 65 20 20 20 20 20 20 20 20 20 20 20 ookie
62aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62ab0 33 37 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 56 37..#define OP_V
62ac0 65 72 69 66 79 43 6f 6f 6b 69 65 20 20 20 20 20 erifyCookie
62ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62ae0 20 20 20 33 38 0d 0a 23 64 65 66 69 6e 65 20 4f 38..#define O
62af0 50 5f 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 P_OpenRead
62b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62b10 20 20 20 20 20 20 33 39 0d 0a 23 64 65 66 69 6e 39..#defin
62b20 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 20 e OP_OpenWrite
62b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62b40 20 20 20 20 20 20 20 20 20 34 30 0d 0a 23 64 65 40..#de
62b50 66 69 6e 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f fine OP_OpenAuto
62b60 69 6e 64 65 78 20 20 20 20 20 20 20 20 20 20 20 index
62b70 20 20 20 20 20 20 20 20 20 20 20 20 34 31 0d 0a 41..
62b80 23 64 65 66 69 6e 65 20 4f 50 5f 4f 70 65 6e 45 #define OP_OpenE
62b90 70 68 65 6d 65 72 61 6c 20 20 20 20 20 20 20 20 phemeral
62ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 4
62bb0 32 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 53 6f 2..#define OP_So
62bc0 72 74 65 72 4f 70 65 6e 20 20 20 20 20 20 20 20 rterOpen
62bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62be0 20 20 34 33 0d 0a 23 64 65 66 69 6e 65 20 4f 50 43..#define OP
62bf0 5f 4f 70 65 6e 50 73 65 75 64 6f 20 20 20 20 20 _OpenPseudo
62c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62c10 20 20 20 20 20 34 34 0d 0a 23 64 65 66 69 6e 65 44..#define
62c20 20 4f 50 5f 43 6c 6f 73 65 20 20 20 20 20 20 20 OP_Close
62c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62c40 20 20 20 20 20 20 20 20 34 35 0d 0a 23 64 65 66 45..#def
62c50 69 6e 65 20 4f 50 5f 53 65 65 6b 4c 74 20 20 20 ine OP_SeekLt
62c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62c70 20 20 20 20 20 20 20 20 20 20 20 34 36 0d 0a 23 46..#
62c80 64 65 66 69 6e 65 20 4f 50 5f 53 65 65 6b 4c 65 define OP_SeekLe
62c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 37 47
62cb0 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 53 65 65 ..#define OP_See
62cc0 6b 47 65 20 20 20 20 20 20 20 20 20 20 20 20 20 kGe
62cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62ce0 20 34 38 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 48..#define OP_
62cf0 53 65 65 6b 47 74 20 20 20 20 20 20 20 20 20 20 SeekGt
62d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62d10 20 20 20 20 34 39 0d 0a 23 64 65 66 69 6e 65 20 49..#define
62d20 4f 50 5f 53 65 65 6b 20 20 20 20 20 20 20 20 20 OP_Seek
62d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62d40 20 20 20 20 20 20 20 35 30 0d 0a 23 64 65 66 69 50..#defi
62d50 6e 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 20 ne OP_NotFound
62d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62d70 20 20 20 20 20 20 20 20 20 20 35 31 0d 0a 23 64 51..#d
62d80 65 66 69 6e 65 20 4f 50 5f 46 6f 75 6e 64 20 20 efine OP_Found
62d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62da0 20 20 20 20 20 20 20 20 20 20 20 20 20 35 32 0d 52.
62db0 0a 23 64 65 66 69 6e 65 20 4f 50 5f 49 73 55 6e .#define OP_IsUn
62dc0 69 71 75 65 20 20 20 20 20 20 20 20 20 20 20 20 ique
62dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62de0 35 33 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4e 53..#define OP_N
62df0 6f 74 45 78 69 73 74 73 20 20 20 20 20 20 20 20 otExists
62e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62e10 20 20 20 35 34 0d 0a 23 64 65 66 69 6e 65 20 4f 54..#define O
62e20 50 5f 53 65 71 75 65 6e 63 65 20 20 20 20 20 20 P_Sequence
62e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62e40 20 20 20 20 20 20 35 35 0d 0a 23 64 65 66 69 6e 55..#defin
62e50 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 20 20 20 e OP_NewRowid
62e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62e70 20 20 20 20 20 20 20 20 20 35 36 0d 0a 23 64 65 56..#de
62e80 66 69 6e 65 20 4f 50 5f 49 6e 73 65 72 74 20 20 fine OP_Insert
62e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62ea0 20 20 20 20 20 20 20 20 20 20 20 20 35 37 0d 0a 57..
62eb0 23 64 65 66 69 6e 65 20 4f 50 5f 49 6e 73 65 72 #define OP_Inser
62ec0 74 49 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 tInt
62ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 5
62ee0 38 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 44 65 8..#define OP_De
62ef0 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20 lete
62f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62f10 20 20 35 39 0d 0a 23 64 65 66 69 6e 65 20 4f 50 59..#define OP
62f20 5f 52 65 73 65 74 43 6f 75 6e 74 20 20 20 20 20 _ResetCount
62f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62f40 20 20 20 20 20 36 30 0d 0a 23 64 65 66 69 6e 65 60..#define
62f50 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 OP_SorterCompar
62f60 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
62f70 20 20 20 20 20 20 20 20 36 31 0d 0a 23 64 65 66 61..#def
62f80 69 6e 65 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 ine OP_SorterDat
62f90 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 a
62fa0 20 20 20 20 20 20 20 20 20 20 20 36 32 0d 0a 23 62..#
62fb0 64 65 66 69 6e 65 20 4f 50 5f 52 6f 77 4b 65 79 define OP_RowKey
62fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
62fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 33 63
62fe0 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 52 6f 77 ..#define OP_Row
62ff0 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 Data
63000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63010 20 36 34 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 64..#define OP_
63020 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 Rowid
63030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63040 20 20 20 20 36 35 0d 0a 23 64 65 66 69 6e 65 20 65..#define
63050 4f 50 5f 4e 75 6c 6c 52 6f 77 20 20 20 20 20 20 OP_NullRow
63060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63070 20 20 20 20 20 20 20 36 36 0d 0a 23 64 65 66 69 66..#defi
63080 6e 65 20 4f 50 5f 4c 61 73 74 20 20 20 20 20 20 ne OP_Last
63090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
630a0 20 20 20 20 20 20 20 20 20 20 36 37 0d 0a 23 64 67..#d
630b0 65 66 69 6e 65 20 4f 50 5f 53 6f 72 74 65 72 53 efine OP_SorterS
630c0 6f 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 ort
630d0 20 20 20 20 20 20 20 20 20 20 20 20 20 37 30 0d 70.
630e0 0a 23 64 65 66 69 6e 65 20 4f 50 5f 53 6f 72 74 .#define OP_Sort
630f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63110 37 31 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 52 71..#define OP_R
63120 65 77 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 ewind
63130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63140 20 20 20 37 32 0d 0a 23 64 65 66 69 6e 65 20 4f 72..#define O
63150 50 5f 53 6f 72 74 65 72 4e 65 78 74 20 20 20 20 P_SorterNext
63160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63170 20 20 20 20 20 20 38 31 0d 0a 23 64 65 66 69 6e 81..#defin
63180 65 20 4f 50 5f 50 72 65 76 20 20 20 20 20 20 20 e OP_Prev
63190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
631a0 20 20 20 20 20 20 20 20 20 39 32 0d 0a 23 64 65 92..#de
631b0 66 69 6e 65 20 4f 50 5f 4e 65 78 74 20 20 20 20 fine OP_Next
631c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
631d0 20 20 20 20 20 20 20 20 20 20 20 20 39 35 0d 0a 95..
631e0 23 64 65 66 69 6e 65 20 4f 50 5f 53 6f 72 74 65 #define OP_Sorte
631f0 72 49 6e 73 65 72 74 20 20 20 20 20 20 20 20 20 rInsert
63200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 9
63210 36 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 49 64 6..#define OP_Id
63220 78 49 6e 73 65 72 74 20 20 20 20 20 20 20 20 20 xInsert
63230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63240 20 20 39 37 0d 0a 23 64 65 66 69 6e 65 20 4f 50 97..#define OP
63250 5f 49 64 78 44 65 6c 65 74 65 20 20 20 20 20 20 _IdxDelete
63260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63270 20 20 20 20 20 39 38 0d 0a 23 64 65 66 69 6e 65 98..#define
63280 20 4f 50 5f 49 64 78 52 6f 77 69 64 20 20 20 20 OP_IdxRowid
63290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
632a0 20 20 20 20 20 20 20 20 39 39 0d 0a 23 64 65 66 99..#def
632b0 69 6e 65 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 ine OP_IdxLT
632c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
632d0 20 20 20 20 20 20 20 20 20 20 31 30 30 0d 0a 23 100..#
632e0 64 65 66 69 6e 65 20 4f 50 5f 49 64 78 47 45 20 define OP_IdxGE
632f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63300 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 31 101
63310 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 44 65 73 ..#define OP_Des
63320 74 72 6f 79 20 20 20 20 20 20 20 20 20 20 20 20 troy
63330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63340 31 30 32 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 102..#define OP_
63350 43 6c 65 61 72 20 20 20 20 20 20 20 20 20 20 20 Clear
63360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63370 20 20 20 31 30 33 0d 0a 23 64 65 66 69 6e 65 20 103..#define
63380 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20 20 OP_CreateIndex
63390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
633a0 20 20 20 20 20 20 31 30 34 0d 0a 23 64 65 66 69 104..#defi
633b0 6e 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c ne OP_CreateTabl
633c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
633d0 20 20 20 20 20 20 20 20 20 31 30 35 0d 0a 23 64 105..#d
633e0 65 66 69 6e 65 20 4f 50 5f 50 61 72 73 65 53 63 efine OP_ParseSc
633f0 68 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 hema
63400 20 20 20 20 20 20 20 20 20 20 20 20 31 30 36 0d 106.
63410 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4c 6f 61 64 .#define OP_Load
63420 41 6e 61 6c 79 73 69 73 20 20 20 20 20 20 20 20 Analysis
63430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
63440 30 37 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 44 07..#define OP_D
63450 72 6f 70 54 61 62 6c 65 20 20 20 20 20 20 20 20 ropTable
63460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63470 20 20 31 30 38 0d 0a 23 64 65 66 69 6e 65 20 4f 108..#define O
63480 50 5f 44 72 6f 70 49 6e 64 65 78 20 20 20 20 20 P_DropIndex
63490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
634a0 20 20 20 20 20 31 30 39 0d 0a 23 64 65 66 69 6e 109..#defin
634b0 65 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 e OP_DropTrigger
634c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
634d0 20 20 20 20 20 20 20 20 31 31 30 0d 0a 23 64 65 110..#de
634e0 66 69 6e 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 fine OP_Integrit
634f0 79 43 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 yCk
63500 20 20 20 20 20 20 20 20 20 20 20 31 31 31 0d 0a 111..
63510 23 64 65 66 69 6e 65 20 4f 50 5f 52 6f 77 53 65 #define OP_RowSe
63520 74 41 64 64 20 20 20 20 20 20 20 20 20 20 20 20 tAdd
63530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 11
63540 32 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 52 6f 2..#define OP_Ro
63550 77 53 65 74 52 65 61 64 20 20 20 20 20 20 20 20 wSetRead
63560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63570 20 31 31 33 0d 0a 23 64 65 66 69 6e 65 20 4f 50 113..#define OP
63580 5f 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 _RowSetTest
63590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
635a0 20 20 20 20 31 31 34 0d 0a 23 64 65 66 69 6e 65 114..#define
635b0 20 4f 50 5f 50 72 6f 67 72 61 6d 20 20 20 20 20 OP_Program
635c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
635d0 20 20 20 20 20 20 20 31 31 35 0d 0a 23 64 65 66 115..#def
635e0 69 6e 65 20 4f 50 5f 50 61 72 61 6d 20 20 20 20 ine OP_Param
635f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63600 20 20 20 20 20 20 20 20 20 20 31 31 36 0d 0a 23 116..#
63610 64 65 66 69 6e 65 20 4f 50 5f 46 6b 43 6f 75 6e define OP_FkCoun
63620 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 ter
63630 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 37 117
63640 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 46 6b 49 ..#define OP_FkI
63650 66 5a 65 72 6f 20 20 20 20 20 20 20 20 20 20 20 fZero
63660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63670 31 31 38 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 118..#define OP_
63680 4d 65 6d 4d 61 78 20 20 20 20 20 20 20 20 20 20 MemMax
63690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
636a0 20 20 20 31 31 39 0d 0a 23 64 65 66 69 6e 65 20 119..#define
636b0 4f 50 5f 49 66 50 6f 73 20 20 20 20 20 20 20 20 OP_IfPos
636c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
636d0 20 20 20 20 20 20 31 32 30 0d 0a 23 64 65 66 69 120..#defi
636e0 6e 65 20 4f 50 5f 49 66 4e 65 67 20 20 20 20 20 ne OP_IfNeg
636f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63700 20 20 20 20 20 20 20 20 20 31 32 31 0d 0a 23 64 121..#d
63710 65 66 69 6e 65 20 4f 50 5f 49 66 5a 65 72 6f 20 efine OP_IfZero
63720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63730 20 20 20 20 20 20 20 20 20 20 20 20 31 32 32 0d 122.
63740 0a 23 64 65 66 69 6e 65 20 4f 50 5f 41 67 67 53 .#define OP_AggS
63750 74 65 70 20 20 20 20 20 20 20 20 20 20 20 20 20 tep
63760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
63770 32 33 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 41 23..#define OP_A
63780 67 67 46 69 6e 61 6c 20 20 20 20 20 20 20 20 20 ggFinal
63790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
637a0 20 20 31 32 34 0d 0a 23 64 65 66 69 6e 65 20 4f 124..#define O
637b0 50 5f 43 68 65 63 6b 70 6f 69 6e 74 20 20 20 20 P_Checkpoint
637c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
637d0 20 20 20 20 20 31 32 35 0d 0a 23 64 65 66 69 6e 125..#defin
637e0 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 e OP_JournalMode
637f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63800 20 20 20 20 20 20 20 20 31 32 36 0d 0a 23 64 65 126..#de
63810 66 69 6e 65 20 4f 50 5f 56 61 63 75 75 6d 20 20 fine OP_Vacuum
63820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63830 20 20 20 20 20 20 20 20 20 20 20 31 32 37 0d 0a 127..
63840 23 64 65 66 69 6e 65 20 4f 50 5f 49 6e 63 72 56 #define OP_IncrV
63850 61 63 75 75 6d 20 20 20 20 20 20 20 20 20 20 20 acuum
63860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 32 12
63870 38 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 45 78 8..#define OP_Ex
63880 70 69 72 65 20 20 20 20 20 20 20 20 20 20 20 20 pire
63890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
638a0 20 31 32 39 0d 0a 23 64 65 66 69 6e 65 20 4f 50 129..#define OP
638b0 5f 54 61 62 6c 65 4c 6f 63 6b 20 20 20 20 20 20 _TableLock
638c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
638d0 20 20 20 20 31 33 31 0d 0a 23 64 65 66 69 6e 65 131..#define
638e0 20 4f 50 5f 56 42 65 67 69 6e 20 20 20 20 20 20 OP_VBegin
638f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63900 20 20 20 20 20 20 20 31 33 32 0d 0a 23 64 65 66 132..#def
63910 69 6e 65 20 4f 50 5f 56 43 72 65 61 74 65 20 20 ine OP_VCreate
63920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63930 20 20 20 20 20 20 20 20 20 20 31 33 33 0d 0a 23 133..#
63940 64 65 66 69 6e 65 20 4f 50 5f 56 44 65 73 74 72 define OP_VDestr
63950 6f 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 oy
63960 20 20 20 20 20 20 20 20 20 20 20 20 20 31 33 34 134
63970 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 56 4f 70 ..#define OP_VOp
63980 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 en
63990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
639a0 31 33 35 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 135..#define OP_
639b0 56 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 VFilter
639c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
639d0 20 20 20 31 33 36 0d 0a 23 64 65 66 69 6e 65 20 136..#define
639e0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 20 20 20 20 20 OP_VColumn
639f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63a00 20 20 20 20 20 20 31 33 37 0d 0a 23 64 65 66 69 137..#defi
63a10 6e 65 20 4f 50 5f 56 4e 65 78 74 20 20 20 20 20 ne OP_VNext
63a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63a30 20 20 20 20 20 20 20 20 20 31 33 38 0d 0a 23 64 138..#d
63a40 65 66 69 6e 65 20 4f 50 5f 56 52 65 6e 61 6d 65 efine OP_VRename
63a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63a60 20 20 20 20 20 20 20 20 20 20 20 20 31 33 39 0d 139.
63a70 0a 23 64 65 66 69 6e 65 20 4f 50 5f 56 55 70 64 .#define OP_VUpd
63a80 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ate
63a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
63aa0 34 30 0d 0a 23 64 65 66 69 6e 65 20 4f 50 5f 50 40..#define OP_P
63ab0 61 67 65 63 6f 75 6e 74 20 20 20 20 20 20 20 20 agecount
63ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63ad0 20 20 31 34 36 0d 0a 23 64 65 66 69 6e 65 20 4f 146..#define O
63ae0 50 5f 4d 61 78 50 67 63 6e 74 20 20 20 20 20 20 P_MaxPgcnt
63af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63b00 20 20 20 20 20 31 34 37 0d 0a 23 64 65 66 69 6e 147..#defin
63b10 65 20 4f 50 5f 54 72 61 63 65 20 20 20 20 20 20 e OP_Trace
63b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63b30 20 20 20 20 20 20 20 20 31 34 38 0d 0a 23 64 65 148..#de
63b40 66 69 6e 65 20 4f 50 5f 4e 6f 6f 70 20 20 20 20 fine OP_Noop
63b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63b60 20 20 20 20 20 20 20 20 20 20 20 31 34 39 0d 0a 149..
63b70 23 64 65 66 69 6e 65 20 4f 50 5f 45 78 70 6c 61 #define OP_Expla
63b80 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 in
63b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35 15
63ba0 30 0d 0a 0d 0a 0d 0a 2f 2a 20 50 72 6f 70 65 72 0....../* Proper
63bb0 74 69 65 73 20 73 75 63 68 20 61 73 20 22 6f 75 ties such as "ou
63bc0 74 32 22 20 6f 72 20 22 6a 75 6d 70 22 20 74 68 t2" or "jump" th
63bd0 61 74 20 61 72 65 20 73 70 65 63 69 66 69 65 64 at are specified
63be0 20 69 6e 0d 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 in..** comments
63bf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 following the "
63c00 63 61 73 65 22 20 66 6f 72 20 65 61 63 68 20 6f case" for each o
63c10 70 63 6f 64 65 20 69 6e 20 74 68 65 20 76 64 62 pcode in the vdb
63c20 65 2e 63 0d 0a 2a 2a 20 61 72 65 20 65 6e 63 6f e.c..** are enco
63c30 64 65 64 20 69 6e 74 6f 20 62 69 74 76 65 63 74 ded into bitvect
63c40 6f 72 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d ors as follows:.
63c50 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 46 .*/..#define OPF
63c60 4c 47 5f 4a 55 4d 50 20 20 20 20 20 20 20 20 20 LG_JUMP
63c70 20 20 20 30 78 30 30 30 31 20 20 2f 2a 20 6a 75 0x0001 /* ju
63c80 6d 70 3a 20 20 50 32 20 68 6f 6c 64 73 20 6a 6d mp: P2 holds jm
63c90 70 20 74 61 72 67 65 74 20 2a 2f 0d 0a 23 64 65 p target */..#de
63ca0 66 69 6e 65 20 4f 50 46 4c 47 5f 4f 55 54 32 5f fine OPFLG_OUT2_
63cb0 50 52 45 52 45 4c 45 41 53 45 20 30 78 30 30 30 PRERELEASE 0x000
63cc0 32 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 2 /* out2-prere
63cd0 6c 65 61 73 65 3a 20 2a 2f 0d 0a 23 64 65 66 69 lease: */..#defi
63ce0 6e 65 20 4f 50 46 4c 47 5f 49 4e 31 20 20 20 20 ne OPFLG_IN1
63cf0 20 20 20 20 20 20 20 20 20 30 78 30 30 30 34 20 0x0004
63d00 20 2f 2a 20 69 6e 31 3a 20 20 20 50 31 20 69 73 /* in1: P1 is
63d10 20 61 6e 20 69 6e 70 75 74 20 2a 2f 0d 0a 23 64 an input */..#d
63d20 65 66 69 6e 65 20 4f 50 46 4c 47 5f 49 4e 32 20 efine OPFLG_IN2
63d30 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 0x00
63d40 30 38 20 20 2f 2a 20 69 6e 32 3a 20 20 20 50 32 08 /* in2: P2
63d50 20 69 73 20 61 6e 20 69 6e 70 75 74 20 2a 2f 0d is an input */.
63d60 0a 23 64 65 66 69 6e 65 20 4f 50 46 4c 47 5f 49 .#define OPFLG_I
63d70 4e 33 20 20 20 20 20 20 20 20 20 20 20 20 20 30 N3 0
63d80 78 30 30 31 30 20 20 2f 2a 20 69 6e 33 3a 20 20 x0010 /* in3:
63d90 20 50 33 20 69 73 20 61 6e 20 69 6e 70 75 74 20 P3 is an input
63da0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 46 4c */..#define OPFL
63db0 47 5f 4f 55 54 32 20 20 20 20 20 20 20 20 20 20 G_OUT2
63dc0 20 20 30 78 30 30 32 30 20 20 2f 2a 20 6f 75 74 0x0020 /* out
63dd0 32 3a 20 20 50 32 20 69 73 20 61 6e 20 6f 75 74 2: P2 is an out
63de0 70 75 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 put */..#define
63df0 4f 50 46 4c 47 5f 4f 55 54 33 20 20 20 20 20 20 OPFLG_OUT3
63e00 20 20 20 20 20 20 30 78 30 30 34 30 20 20 2f 2a 0x0040 /*
63e10 20 6f 75 74 33 3a 20 20 50 33 20 69 73 20 61 6e out3: P3 is an
63e20 20 6f 75 74 70 75 74 20 2a 2f 0d 0a 23 64 65 66 output */..#def
63e30 69 6e 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 ine OPFLG_INITIA
63e40 4c 49 5a 45 52 20 7b 5c 0d 0a 2f 2a 20 20 20 30 LIZER {\../* 0
63e50 20 2a 2f 20 30 78 30 30 2c 20 30 78 30 31 2c 20 */ 0x00, 0x01,
63e60 30 78 30 31 2c 20 30 78 30 34 2c 20 30 78 30 34 0x01, 0x04, 0x04
63e70 2c 20 30 78 31 30 2c 20 30 78 30 30 2c 20 30 78 , 0x10, 0x00, 0x
63e80 30 32 2c 5c 0d 0a 2f 2a 20 20 20 38 20 2a 2f 20 02,\../* 8 */
63e90 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32 0x02, 0x02, 0x02
63ea0 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 , 0x02, 0x02, 0x
63eb0 30 30 2c 20 30 78 32 34 2c 20 30 78 32 34 2c 5c 00, 0x24, 0x24,\
63ec0 0d 0a 2f 2a 20 20 31 36 20 2a 2f 20 30 78 30 30 ../* 16 */ 0x00
63ed0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
63ee0 32 34 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 24, 0x04, 0x05,
63ef0 30 78 30 34 2c 20 30 78 30 30 2c 5c 0d 0a 2f 2a 0x04, 0x00,\../*
63f00 20 20 32 34 20 2a 2f 20 30 78 30 30 2c 20 30 78 24 */ 0x00, 0x
63f10 30 31 2c 20 30 78 30 31 2c 20 30 78 30 35 2c 20 01, 0x01, 0x05,
63f20 30 78 30 35 2c 20 30 78 30 30 2c 20 30 78 30 30 0x05, 0x00, 0x00
63f30 2c 20 30 78 30 30 2c 5c 0d 0a 2f 2a 20 20 33 32 , 0x00,\../* 32
63f40 20 2a 2f 20 30 78 30 32 2c 20 30 78 30 30 2c 20 */ 0x02, 0x00,
63f50 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 32 0x00, 0x00, 0x02
63f60 2c 20 30 78 31 30 2c 20 30 78 30 30 2c 20 30 78 , 0x10, 0x00, 0x
63f70 30 30 2c 5c 0d 0a 2f 2a 20 20 34 30 20 2a 2f 20 00,\../* 40 */
63f80 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
63f90 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
63fa0 30 30 2c 20 30 78 31 31 2c 20 30 78 31 31 2c 5c 00, 0x11, 0x11,\
63fb0 0d 0a 2f 2a 20 20 34 38 20 2a 2f 20 30 78 31 31 ../* 48 */ 0x11
63fc0 2c 20 30 78 31 31 2c 20 30 78 30 38 2c 20 30 78 , 0x11, 0x08, 0x
63fd0 31 31 2c 20 30 78 31 31 2c 20 30 78 31 31 2c 20 11, 0x11, 0x11,
63fe0 30 78 31 31 2c 20 30 78 30 32 2c 5c 0d 0a 2f 2a 0x11, 0x02,\../*
63ff0 20 20 35 36 20 2a 2f 20 30 78 30 32 2c 20 30 78 56 */ 0x02, 0x
64000 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 00, 0x00, 0x00,
64010 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
64020 2c 20 30 78 30 30 2c 5c 0d 0a 2f 2a 20 20 36 34 , 0x00,\../* 64
64030 20 2a 2f 20 30 78 30 30 2c 20 30 78 30 32 2c 20 */ 0x00, 0x02,
64040 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 34 63 0x00, 0x01, 0x4c
64050 2c 20 30 78 34 63 2c 20 30 78 30 31 2c 20 30 78 , 0x4c, 0x01, 0x
64060 30 31 2c 5c 0d 0a 2f 2a 20 20 37 32 20 2a 2f 20 01,\../* 72 */
64070 30 78 30 31 2c 20 30 78 30 35 2c 20 30 78 30 35 0x01, 0x05, 0x05
64080 2c 20 30 78 31 35 2c 20 30 78 31 35 2c 20 30 78 , 0x15, 0x15, 0x
64090 31 35 2c 20 30 78 31 35 2c 20 30 78 31 35 2c 5c 15, 0x15, 0x15,\
640a0 0d 0a 2f 2a 20 20 38 30 20 2a 2f 20 30 78 31 35 ../* 80 */ 0x15
640b0 2c 20 30 78 30 31 2c 20 30 78 34 63 2c 20 30 78 , 0x01, 0x4c, 0x
640c0 34 63 2c 20 30 78 34 63 2c 20 30 78 34 63 2c 20 4c, 0x4c, 0x4c,
640d0 30 78 34 63 2c 20 30 78 34 63 2c 5c 0d 0a 2f 2a 0x4c, 0x4c,\../*
640e0 20 20 38 38 20 2a 2f 20 30 78 34 63 2c 20 30 78 88 */ 0x4c, 0x
640f0 34 63 2c 20 30 78 34 63 2c 20 30 78 34 63 2c 20 4c, 0x4c, 0x4c,
64100 30 78 30 31 2c 20 30 78 32 34 2c 20 30 78 30 32 0x01, 0x24, 0x02
64110 2c 20 30 78 30 31 2c 5c 0d 0a 2f 2a 20 20 39 36 , 0x01,\../* 96
64120 20 2a 2f 20 30 78 30 38 2c 20 30 78 30 38 2c 20 */ 0x08, 0x08,
64130 30 78 30 30 2c 20 30 78 30 32 2c 20 30 78 30 31 0x00, 0x02, 0x01
64140 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 , 0x01, 0x02, 0x
64150 30 30 2c 5c 0d 0a 2f 2a 20 31 30 34 20 2a 2f 20 00,\../* 104 */
64160 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 30 0x02, 0x02, 0x00
64170 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
64180 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 5c 00, 0x00, 0x00,\
64190 0d 0a 2f 2a 20 31 31 32 20 2a 2f 20 30 78 30 63 ../* 112 */ 0x0c
641a0 2c 20 30 78 34 35 2c 20 30 78 31 35 2c 20 30 78 , 0x45, 0x15, 0x
641b0 30 31 2c 20 30 78 30 32 2c 20 30 78 30 30 2c 20 01, 0x02, 0x00,
641c0 30 78 30 31 2c 20 30 78 30 38 2c 5c 0d 0a 2f 2a 0x01, 0x08,\../*
641d0 20 31 32 30 20 2a 2f 20 30 78 30 35 2c 20 30 78 120 */ 0x05, 0x
641e0 30 35 2c 20 30 78 30 35 2c 20 30 78 30 30 2c 20 05, 0x05, 0x00,
641f0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 32 0x00, 0x00, 0x02
64200 2c 20 30 78 30 30 2c 5c 0d 0a 2f 2a 20 31 32 38 , 0x00,\../* 128
64210 20 2a 2f 20 30 78 30 31 2c 20 30 78 30 30 2c 20 */ 0x01, 0x00,
64220 30 78 30 32 2c 20 30 78 30 30 2c 20 30 78 30 30 0x02, 0x00, 0x00
64230 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
64240 30 30 2c 5c 0d 0a 2f 2a 20 31 33 36 20 2a 2f 20 00,\../* 136 */
64250 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78 30 31 0x01, 0x00, 0x01
64260 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
64270 30 34 2c 20 30 78 30 34 2c 20 30 78 30 34 2c 5c 04, 0x04, 0x04,\
64280 0d 0a 2f 2a 20 31 34 34 20 2a 2f 20 30 78 30 34 ../* 144 */ 0x04
64290 2c 20 30 78 30 34 2c 20 30 78 30 32 2c 20 30 78 , 0x04, 0x02, 0x
642a0 30 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 02, 0x00, 0x00,
642b0 30 78 30 30 2c 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 0x00,}..../*****
642c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 ********* End of
642d0 20 6f 70 63 6f 64 65 73 2e 68 20 2a 2a 2a 2a 2a opcodes.h *****
642e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
642f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
64300 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
64310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 ********** Conti
64320 6e 75 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c nuing where we l
64330 65 66 74 20 6f 66 66 20 69 6e 20 76 64 62 65 2e eft off in vdbe.
64340 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
64350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a *********/..../*
64360 0d 0a 2a 2a 20 50 72 6f 74 6f 74 79 70 65 73 20 ..** Prototypes
64370 66 6f 72 20 74 68 65 20 56 44 42 45 20 69 6e 74 for the VDBE int
64380 65 72 66 61 63 65 2e 20 20 53 65 65 20 63 6f 6d erface. See com
64390 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 69 6d 70 ments on the imp
643a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 0d 0a 2a 2a 20 lementation..**
643b0 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f for a descriptio
643c0 6e 20 6f 66 20 77 68 61 74 20 65 61 63 68 20 6f n of what each o
643d0 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 f these routines
643e0 20 64 6f 65 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 does...*/..SQLI
643f0 54 45 5f 50 52 49 56 41 54 45 20 56 64 62 65 20 TE_PRIVATE Vdbe
64400 2a 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 *sqlite3VdbeCrea
64410 74 65 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 53 te(sqlite3*);..S
64420 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
64430 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
64440 4f 70 30 28 56 64 62 65 2a 2c 69 6e 74 29 3b 0d Op0(Vdbe*,int);.
64450 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
64460 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
64470 64 64 4f 70 31 28 56 64 62 65 2a 2c 69 6e 74 2c ddOp1(Vdbe*,int,
64480 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
64490 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
644a0 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 3VdbeAddOp2(Vdbe
644b0 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 3b 0d *,int,int,int);.
644c0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
644d0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
644e0 64 64 4f 70 33 28 56 64 62 65 2a 2c 69 6e 74 2c ddOp3(Vdbe*,int,
644f0 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 3b 0d 0a 53 int,int,int);..S
64500 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
64510 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
64520 4f 70 34 28 56 64 62 65 2a 2c 69 6e 74 2c 69 6e Op4(Vdbe*,int,in
64530 74 2c 69 6e 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 t,int,int,const
64540 63 68 61 72 20 2a 7a 50 34 2c 69 6e 74 29 3b 0d char *zP4,int);.
64550 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
64560 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
64570 64 64 4f 70 34 49 6e 74 28 56 64 62 65 2a 2c 69 ddOp4Int(Vdbe*,i
64580 6e 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 69 nt,int,int,int,i
64590 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
645a0 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
645b0 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 VdbeAddOpList(Vd
645c0 62 65 2a 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 be*, int nOp, Vd
645d0 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a beOpList const *
645e0 61 4f 70 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 aOp);..SQLITE_PR
645f0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
64600 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 e3VdbeAddParseSc
64610 68 65 6d 61 4f 70 28 56 64 62 65 2a 2c 69 6e 74 hemaOp(Vdbe*,int
64620 2c 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 ,char*);..SQLITE
64630 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
64640 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 lite3VdbeChangeP
64650 31 28 56 64 62 65 2a 2c 20 75 33 32 20 61 64 64 1(Vdbe*, u32 add
64660 72 2c 20 69 6e 74 20 50 31 29 3b 0d 0a 53 51 4c r, int P1);..SQL
64670 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
64680 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
64690 67 65 50 32 28 56 64 62 65 2a 2c 20 75 33 32 20 geP2(Vdbe*, u32
646a0 61 64 64 72 2c 20 69 6e 74 20 50 32 29 3b 0d 0a addr, int P2);..
646b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
646c0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
646d0 68 61 6e 67 65 50 33 28 56 64 62 65 2a 2c 20 75 hangeP3(Vdbe*, u
646e0 33 32 20 61 64 64 72 2c 20 69 6e 74 20 50 33 29 32 addr, int P3)
646f0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
64700 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 E void sqlite3Vd
64710 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 2a beChangeP5(Vdbe*
64720 2c 20 75 38 20 50 35 29 3b 0d 0a 53 51 4c 49 54 , u8 P5);..SQLIT
64730 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
64740 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 qlite3VdbeJumpHe
64750 72 65 28 56 64 62 65 2a 2c 20 69 6e 74 20 61 64 re(Vdbe*, int ad
64760 64 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 dr);..SQLITE_PRI
64770 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
64780 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 3VdbeChangeToNoo
64790 70 28 56 64 62 65 2a 2c 20 69 6e 74 20 61 64 64 p(Vdbe*, int add
647a0 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 r);..SQLITE_PRIV
647b0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
647c0 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 VdbeChangeP4(Vdb
647d0 65 2a 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f e*, int addr, co
647e0 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 nst char *zP4, i
647f0 6e 74 20 4e 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 nt N);..SQLITE_P
64800 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
64810 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 te3VdbeUsesBtree
64820 28 56 64 62 65 2a 2c 20 69 6e 74 29 3b 0d 0a 53 (Vdbe*, int);..S
64830 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 56 64 QLITE_PRIVATE Vd
64840 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 beOp *sqlite3Vdb
64850 65 47 65 74 4f 70 28 56 64 62 65 2a 2c 20 69 6e eGetOp(Vdbe*, in
64860 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
64870 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 ATE int sqlite3V
64880 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 dbeMakeLabel(Vdb
64890 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 e*);..SQLITE_PRI
648a0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
648b0 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 3VdbeRunOnlyOnce
648c0 28 56 64 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 (Vdbe*);..SQLITE
648d0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
648e0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 lite3VdbeDelete(
648f0 56 64 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f Vdbe*);..SQLITE_
64900 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
64910 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 ite3VdbeDeleteOb
64920 6a 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 56 64 ject(sqlite3*,Vd
64930 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 be*);..SQLITE_PR
64940 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
64950 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 e3VdbeMakeReady(
64960 56 64 62 65 2a 2c 50 61 72 73 65 2a 29 3b 0d 0a Vdbe*,Parse*);..
64970 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
64980 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 nt sqlite3VdbeFi
64990 6e 61 6c 69 7a 65 28 56 64 62 65 2a 29 3b 0d 0a nalize(Vdbe*);..
649a0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
649b0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 oid sqlite3VdbeR
649c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 esolveLabel(Vdbe
649d0 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
649e0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
649f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 ite3VdbeCurrentA
64a00 64 64 72 28 56 64 62 65 2a 29 3b 0d 0a 23 69 66 ddr(Vdbe*);..#if
64a10 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
64a20 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
64a30 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 int sqlite3Vd
64a40 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 beAssertMayAbort
64a50 28 56 64 62 65 20 2a 2c 20 69 6e 74 29 3b 0d 0a (Vdbe *, int);..
64a60 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
64a70 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 void sqlite3Vdb
64a80 65 54 72 61 63 65 28 56 64 62 65 2a 2c 46 49 4c eTrace(Vdbe*,FIL
64a90 45 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 53 51 E*);..#endif..SQ
64aa0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
64ab0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 d sqlite3VdbeRes
64ac0 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 etStepResult(Vdb
64ad0 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 e*);..SQLITE_PRI
64ae0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
64af0 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 3VdbeRewind(Vdbe
64b00 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
64b10 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 ATE int sqlite3V
64b20 64 62 65 52 65 73 65 74 28 56 64 62 65 2a 29 3b dbeReset(Vdbe*);
64b30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
64b40 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 void sqlite3Vdb
64b50 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 eSetNumCols(Vdbe
64b60 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f *,int);..SQLITE_
64b70 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
64b80 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d te3VdbeSetColNam
64b90 65 28 56 64 62 65 2a 2c 20 69 6e 74 2c 20 69 6e e(Vdbe*, int, in
64ba0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c t, const char *,
64bb0 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 29 29 void(*)(void*))
64bc0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
64bd0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 E void sqlite3Vd
64be0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 beCountChanges(V
64bf0 64 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 dbe*);..SQLITE_P
64c00 52 49 56 41 54 45 20 73 71 6c 69 74 65 33 20 2a RIVATE sqlite3 *
64c10 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 sqlite3VdbeDb(Vd
64c20 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 be*);..SQLITE_PR
64c30 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
64c40 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 e3VdbeSetSql(Vdb
64c50 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a e*, const char *
64c60 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 29 3b 0d z, int n, int);.
64c70 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
64c80 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
64c90 53 77 61 70 28 56 64 62 65 2a 2c 56 64 62 65 2a Swap(Vdbe*,Vdbe*
64ca0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
64cb0 54 45 20 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 TE VdbeOp *sqlit
64cc0 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 e3VdbeTakeOpArra
64cd0 79 28 56 64 62 65 2a 2c 20 69 6e 74 2a 2c 20 69 y(Vdbe*, int*, i
64ce0 6e 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 nt*);..SQLITE_PR
64cf0 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 76 61 IVATE sqlite3_va
64d00 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 lue *sqlite3Vdbe
64d10 47 65 74 56 61 6c 75 65 28 56 64 62 65 2a 2c 20 GetValue(Vdbe*,
64d20 69 6e 74 2c 20 75 38 29 3b 0d 0a 53 51 4c 49 54 int, u8);..SQLIT
64d30 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
64d40 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 qlite3VdbeSetVar
64d50 6d 61 73 6b 28 56 64 62 65 2a 2c 20 69 6e 74 29 mask(Vdbe*, int)
64d60 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ;..#ifndef SQLIT
64d70 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0d 0a 53 51 E_OMIT_TRACE..SQ
64d80 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 63 LITE_PRIVATE c
64d90 68 61 72 20 2a 73 71 6c 69 74 65 33 56 64 62 65 har *sqlite3Vdbe
64da0 45 78 70 61 6e 64 53 71 6c 28 56 64 62 65 2a 2c ExpandSql(Vdbe*,
64db0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0d 0a const char*);..
64dc0 23 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 #endif....SQLITE
64dd0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
64de0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 lite3VdbeRecordU
64df0 6e 70 61 63 6b 28 4b 65 79 49 6e 66 6f 2a 2c 69 npack(KeyInfo*,i
64e00 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 55 nt,const void*,U
64e10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 3b npackedRecord*);
64e20 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
64e30 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 int sqlite3Vdbe
64e40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 69 6e RecordCompare(in
64e50 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 55 6e t,const void*,Un
64e60 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 3b 0d packedRecord*);.
64e70 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
64e80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a UnpackedRecord *
64e90 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 sqlite3VdbeAlloc
64ea0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 4b UnpackedRecord(K
64eb0 65 79 49 6e 66 6f 20 2a 2c 20 63 68 61 72 20 2a eyInfo *, char *
64ec0 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29 3b , int, char **);
64ed0 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 ....#ifndef SQLI
64ee0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0d TE_OMIT_TRIGGER.
64ef0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
64f00 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
64f10 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 LinkSubProgram(V
64f20 64 62 65 20 2a 2c 20 53 75 62 50 72 6f 67 72 61 dbe *, SubProgra
64f30 6d 20 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d m *);..#endif...
64f40 0a 0d 0a 2f 2f 23 69 66 6e 64 65 66 20 4e 44 45 ...//#ifndef NDE
64f50 42 55 47 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 BUG..SQLITE_PRIV
64f60 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
64f70 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 e3VdbeComment(Vd
64f80 62 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a be*, const char*
64f90 2c 20 2e 2e 2e 29 3b 0d 0a 23 20 64 65 66 69 6e , ...);..# defin
64fa0 65 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 58 29 e VdbeComment(X)
64fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d sqlite3VdbeCom
64fc0 6d 65 6e 74 20 58 0d 0a 53 51 4c 49 54 45 5f 50 ment X..SQLITE_P
64fd0 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 RIVATE void sq
64fe0 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d lite3VdbeNoopCom
64ff0 6d 65 6e 74 28 56 64 62 65 2a 2c 20 63 6f 6e 73 ment(Vdbe*, cons
65000 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a t char*, ...);..
65010 23 20 64 65 66 69 6e 65 20 56 64 62 65 4e 6f 6f # define VdbeNoo
65020 70 43 6f 6d 6d 65 6e 74 28 58 29 20 20 73 71 6c pComment(X) sql
65030 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d ite3VdbeNoopComm
65040 65 6e 74 20 58 0d 0a 2f 2f 23 65 6c 73 65 0d 0a ent X..//#else..
65050 2f 2f 23 20 64 65 66 69 6e 65 20 56 64 62 65 43 //# define VdbeC
65060 6f 6d 6d 65 6e 74 28 58 29 0d 0a 2f 2f 23 20 64 omment(X)..//# d
65070 65 66 69 6e 65 20 56 64 62 65 4e 6f 6f 70 43 6f efine VdbeNoopCo
65080 6d 6d 65 6e 74 28 58 29 0d 0a 2f 2f 23 65 6e 64 mment(X)..//#end
65090 69 66 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a if....#endif....
650a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
650b0 45 6e 64 20 6f 66 20 76 64 62 65 2e 68 20 2a 2a End of vdbe.h **
650c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
650d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
650e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
650f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
65100 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 65 72 Continuing wher
65110 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 69 6e e we left off in
65120 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2a 2a sqliteInt.h ***
65130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
65140 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
65150 2a 20 49 6e 63 6c 75 64 65 20 70 61 67 65 72 2e * Include pager.
65160 68 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 h in the middle
65170 6f 66 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a of sqliteInt.h *
65180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
65190 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /../************
651a0 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 70 61 ** Begin file pa
651b0 67 65 72 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ger.h **********
651c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
651d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
651e0 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 31 20 */../*..** 2001
651f0 53 65 70 74 65 6d 62 65 72 20 31 35 0d 0a 2a 2a September 15..**
65200 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 ..** The author
65210 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 disclaims copyri
65220 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 ght to this sour
65230 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 ce code. In pla
65240 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 ce of..** a lega
65250 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 l notice, here i
65260 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a s a blessing:..*
65270 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 *..** May you
65280 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 do good and not
65290 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 evil...** Ma
652a0 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 y you find forgi
652b0 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 veness for yours
652c0 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 elf and forgive
652d0 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d others...** M
652e0 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 ay you share fre
652f0 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e ely, never takin
65300 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 g more than you
65310 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a give...**..*****
65320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
65330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
65340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
65350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
65360 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 68 65 ****..** This he
65370 61 64 65 72 20 66 69 6c 65 20 64 65 66 69 6e 65 ader file define
65380 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 s the interface
65390 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 20 that the sqlite
653a0 70 61 67 65 20 63 61 63 68 65 0d 0a 2a 2a 20 73 page cache..** s
653b0 75 62 73 79 73 74 65 6d 2e 20 20 54 68 65 20 70 ubsystem. The p
653c0 61 67 65 20 63 61 63 68 65 20 73 75 62 73 79 73 age cache subsys
653d0 74 65 6d 20 72 65 61 64 73 20 61 6e 64 20 77 72 tem reads and wr
653e0 69 74 65 73 20 61 20 66 69 6c 65 20 61 20 70 61 ites a file a pa
653f0 67 65 0d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 ge..** at a time
65400 20 61 6e 64 20 70 72 6f 76 69 64 65 73 20 61 20 and provides a
65410 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 6c 6c journal for roll
65420 62 61 63 6b 2e 0d 0a 2a 2f 0d 0a 0d 0a 23 69 66 back...*/....#if
65430 6e 64 65 66 20 5f 50 41 47 45 52 5f 48 5f 0d 0a ndef _PAGER_H_..
65440 23 64 65 66 69 6e 65 20 5f 50 41 47 45 52 5f 48 #define _PAGER_H
65450 5f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 66 61 _..../*..** Defa
65460 75 6c 74 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 ult maximum size
65470 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 for persistent
65480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 20 41 journal files. A
65490 20 6e 65 67 61 74 69 76 65 20 0d 0a 2a 2a 20 76 negative ..** v
654a0 61 6c 75 65 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 alue means no li
654b0 6d 69 74 2e 20 54 68 69 73 20 76 61 6c 75 65 20 mit. This value
654c0 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 may be overridde
654d0 6e 20 75 73 69 6e 67 20 74 68 65 20 0d 0a 2a 2a n using the ..**
654e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 sqlite3PagerJou
654f0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 29 20 rnalSizeLimit()
65500 41 50 49 2e 20 53 65 65 20 61 6c 73 6f 20 22 50 API. See also "P
65510 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 RAGMA journal_si
65520 7a 65 5f 6c 69 6d 69 74 22 2e 0d 0a 2a 2f 0d 0a ze_limit"...*/..
65530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 #ifndef SQLITE_D
65540 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 EFAULT_JOURNAL_S
65550 49 5a 45 5f 4c 49 4d 49 54 0d 0a 20 20 23 64 65 IZE_LIMIT.. #de
65560 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 fine SQLITE_DEFA
65570 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 ULT_JOURNAL_SIZE
65580 5f 4c 49 4d 49 54 20 2d 31 0d 0a 23 65 6e 64 69 _LIMIT -1..#endi
65590 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 f..../*..** The
655a0 74 79 70 65 20 75 73 65 64 20 74 6f 20 72 65 70 type used to rep
655b0 72 65 73 65 6e 74 20 61 20 70 61 67 65 20 6e 75 resent a page nu
655c0 6d 62 65 72 2e 20 20 54 68 65 20 66 69 72 73 74 mber. The first
655d0 20 70 61 67 65 20 69 6e 20 61 20 66 69 6c 65 0d page in a file.
655e0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 70 61 .** is called pa
655f0 67 65 20 31 2e 20 20 30 20 69 73 20 75 73 65 64 ge 1. 0 is used
65600 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 22 6e to represent "n
65610 6f 74 20 61 20 70 61 67 65 22 2e 0d 0a 2a 2f 0d ot a page"...*/.
65620 0a 74 79 70 65 64 65 66 20 75 33 32 20 50 67 6e .typedef u32 Pgn
65630 6f 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 o;..../*..** Eac
65640 68 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 6d h open file is m
65650 61 6e 61 67 65 64 20 62 79 20 61 20 73 65 70 61 anaged by a sepa
65660 72 61 74 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 rate instance of
65670 20 74 68 65 20 22 50 61 67 65 72 22 20 73 74 72 the "Pager" str
65680 75 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 74 79 70 ucture...*/..typ
65690 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 edef struct Page
656a0 72 20 50 61 67 65 72 3b 0d 0a 0d 0a 2f 2a 0d 0a r Pager;..../*..
656b0 2a 2a 20 48 61 6e 64 6c 65 20 74 79 70 65 20 66 ** Handle type f
656c0 6f 72 20 70 61 67 65 73 2e 0d 0a 2a 2f 0d 0a 74 or pages...*/..t
656d0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 ypedef struct Pg
656e0 48 64 72 20 44 62 50 61 67 65 3b 0d 0a 0d 0a 2f Hdr DbPage;..../
656f0 2a 0d 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 *..** Page numbe
65700 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 r PAGER_MJ_PGNO
65710 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e is never used in
65720 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 an SQLite datab
65730 61 73 65 20 28 69 74 20 69 73 0d 0a 2a 2a 20 72 ase (it is..** r
65740 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b eserved for work
65750 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e ing around a win
65760 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d dows/posix incom
65770 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 patibility). It
65780 69 73 0d 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 is..** used in t
65790 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 he journal to si
657a0 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 gnify that the r
657b0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 emainder of the
657c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0d 0a 2a journal file ..*
657d0 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 * is devoted to
657e0 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 storing a master
657f0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 journal name -
65800 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 there are no mor
65810 65 20 70 61 67 65 73 20 74 6f 0d 0a 2a 2a 20 72 e pages to..** r
65820 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f oll back. See co
65830 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 mments for funct
65840 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a ion writeMasterJ
65850 6f 75 72 6e 61 6c 28 29 20 69 6e 20 70 61 67 65 ournal() in page
65860 72 2e 63 20 0d 0a 2a 2a 20 66 6f 72 20 64 65 74 r.c ..** for det
65870 61 69 6c 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 ails...*/..#defi
65880 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f ne PAGER_MJ_PGNO
65890 28 78 29 20 28 28 50 67 6e 6f 29 28 28 50 45 4e (x) ((Pgno)((PEN
658a0 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e DING_BYTE/((x)->
658b0 70 61 67 65 53 69 7a 65 29 29 2b 31 29 29 0d 0a pageSize))+1))..
658c0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 77 65 64 ../*..** Allowed
658d0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 values for the
658e0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 flags parameter
658f0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f to sqlite3PagerO
65900 70 65 6e 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e pen()...**..** N
65910 4f 54 45 3a 20 54 68 65 73 65 20 76 61 6c 75 65 OTE: These value
65920 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 s must match the
65930 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 42 corresponding B
65940 54 52 45 45 5f 20 76 61 6c 75 65 73 20 69 6e 20 TREE_ values in
65950 62 74 72 65 65 2e 68 2e 0d 0a 2a 2f 0d 0a 23 64 btree.h...*/..#d
65960 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 4d 49 54 efine PAGER_OMIT
65970 5f 4a 4f 55 52 4e 41 4c 20 20 30 78 30 30 30 31 _JOURNAL 0x0001
65980 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 /* Do not us
65990 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 e a rollback jou
659a0 72 6e 61 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 rnal */..#define
659b0 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f PAGER_NO_READLO
659c0 43 4b 20 20 20 30 78 30 30 30 32 20 20 20 20 2f CK 0x0002 /
659d0 2a 20 4f 6d 69 74 20 72 65 61 64 6c 6f 63 6b 73 * Omit readlocks
659e0 20 6f 6e 20 72 65 61 64 6f 6e 6c 79 20 66 69 6c on readonly fil
659f0 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 es */..#define P
65a00 41 47 45 52 5f 4d 45 4d 4f 52 59 20 20 20 20 20 AGER_MEMORY
65a10 20 20 20 30 78 30 30 30 34 20 20 20 20 2f 2a 20 0x0004 /*
65a20 49 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 In-memory databa
65a30 73 65 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 se */..../*..**
65a40 56 61 6c 69 64 20 76 61 6c 75 65 73 20 66 6f 72 Valid values for
65a50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
65a60 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 50 ment to sqlite3P
65a70 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 agerLockingMode(
65a80 29 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 )...*/..#define
65a90 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 PAGER_LOCKINGMOD
65aa0 45 5f 51 55 45 52 59 20 20 20 20 20 20 2d 31 0d E_QUERY -1.
65ab0 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4c .#define PAGER_L
65ac0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 OCKINGMODE_NORMA
65ad0 4c 20 20 20 20 20 20 30 0d 0a 23 64 65 66 69 6e L 0..#defin
65ae0 65 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d e PAGER_LOCKINGM
65af0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 20 20 ODE_EXCLUSIVE
65b00 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4e 75 6d 65 1..../*..** Nume
65b10 72 69 63 20 63 6f 6e 73 74 61 6e 74 73 20 74 68 ric constants th
65b20 61 74 20 65 6e 63 6f 64 65 20 74 68 65 20 6a 6f at encode the jo
65b30 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 0d 0a 2a 2f urnalmode. ..*/
65b40 0d 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f ..#define PAGER_
65b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 JOURNALMODE_QUER
65b60 59 20 20 20 20 20 28 2d 31 29 20 20 2f 2a 20 51 Y (-1) /* Q
65b70 75 65 72 79 20 74 68 65 20 76 61 6c 75 65 20 6f uery the value o
65b80 66 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f f journalmode */
65b90 0d 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f ..#define PAGER_
65ba0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 JOURNALMODE_DELE
65bb0 54 45 20 20 20 20 20 20 30 20 20 20 2f 2a 20 43 TE 0 /* C
65bc0 6f 6d 6d 69 74 20 62 79 20 64 65 6c 65 74 69 6e ommit by deletin
65bd0 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a g journal file *
65be0 2f 0d 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 /..#define PAGER
65bf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 _JOURNALMODE_PER
65c00 53 49 53 54 20 20 20 20 20 31 20 20 20 2f 2a 20 SIST 1 /*
65c10 43 6f 6d 6d 69 74 20 62 79 20 7a 65 72 6f 69 6e Commit by zeroin
65c20 67 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 g journal header
65c30 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 41 47 */..#define PAG
65c40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f ER_JOURNALMODE_O
65c50 46 46 20 20 20 20 20 20 20 20 20 32 20 20 20 2f FF 2 /
65c60 2a 20 4a 6f 75 72 6e 61 6c 20 6f 6d 69 74 74 65 * Journal omitte
65c70 64 2e 20 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 d. */..#define
65c80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
65c90 45 5f 54 52 55 4e 43 41 54 45 20 20 20 20 33 20 E_TRUNCATE 3
65ca0 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 62 79 20 74 /* Commit by t
65cb0 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 runcating journa
65cc0 6c 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 41 l */..#define PA
65cd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
65ce0 4d 45 4d 4f 52 59 20 20 20 20 20 20 34 20 20 20 MEMORY 4
65cf0 2f 2a 20 49 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 /* In-memory jou
65d00 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0d 0a 23 64 rnal file */..#d
65d10 65 66 69 6e 65 20 50 41 47 45 52 5f 4a 4f 55 52 efine PAGER_JOUR
65d20 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 NALMODE_WAL
65d30 20 20 20 20 35 20 20 20 2f 2a 20 55 73 65 20 77 5 /* Use w
65d40 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 67 69 rite-ahead loggi
65d50 6e 67 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ng */..../*..**
65d60 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 The remainder of
65d70 20 74 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 this file conta
65d80 69 6e 73 20 74 68 65 20 64 65 63 6c 61 72 61 74 ins the declarat
65d90 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 ions of the func
65da0 74 69 6f 6e 73 0d 0a 2a 2a 20 74 68 61 74 20 6d tions..** that m
65db0 61 6b 65 20 75 70 20 74 68 65 20 50 61 67 65 72 ake up the Pager
65dc0 20 73 75 62 2d 73 79 73 74 65 6d 20 41 50 49 2e sub-system API.
65dd0 20 53 65 65 20 73 6f 75 72 63 65 20 63 6f 64 65 See source code
65de0 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 0d 0a comments for ..
65df0 2a 2a 20 61 20 64 65 74 61 69 6c 65 64 20 64 65 ** a detailed de
65e00 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63 scription of eac
65e10 68 20 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2f 0d 0a h routine...*/..
65e20 0d 0a 2f 2a 20 4f 70 65 6e 20 61 6e 64 20 63 6c ../* Open and cl
65e30 6f 73 65 20 61 20 50 61 67 65 72 20 63 6f 6e 6e ose a Pager conn
65e40 65 63 74 69 6f 6e 2e 20 2a 2f 20 0d 0a 53 51 4c ection. */ ..SQL
65e50 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
65e60 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e sqlite3PagerOpen
65e70 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 (.. sqlite3_vfs
65e80 2a 2c 0d 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 *,.. Pager **pp
65e90 50 61 67 65 72 2c 0d 0a 20 20 63 6f 6e 73 74 20 Pager,.. const
65ea0 63 68 61 72 2a 2c 0d 0a 20 20 69 6e 74 2c 0d 0a char*,.. int,..
65eb0 20 20 69 6e 74 2c 0d 0a 20 20 69 6e 74 2c 0d 0a int,.. int,..
65ec0 20 20 76 6f 69 64 28 2a 29 28 44 62 50 61 67 65 void(*)(DbPage
65ed0 2a 29 0d 0a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 *)..);..SQLITE_P
65ee0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
65ef0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 e3PagerClose(Pag
65f00 65 72 20 2a 70 50 61 67 65 72 29 3b 0d 0a 53 51 er *pPager);..SQ
65f10 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
65f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 sqlite3PagerRea
65f30 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 dFileheader(Page
65f40 72 2a 2c 20 69 6e 74 2c 20 75 6e 73 69 67 6e 65 r*, int, unsigne
65f50 64 20 63 68 61 72 2a 29 3b 0d 0a 0d 0a 2f 2a 20 d char*);..../*
65f60 46 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 Functions used t
65f70 6f 20 63 6f 6e 66 69 67 75 72 65 20 61 20 50 61 o configure a Pa
65f80 67 65 72 20 6f 62 6a 65 63 74 2e 20 2a 2f 0d 0a ger object. */..
65f90 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
65fa0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 oid sqlite3Pager
65fb0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 SetBusyhandler(P
65fc0 61 67 65 72 2a 2c 20 69 6e 74 28 2a 29 28 76 6f ager*, int(*)(vo
65fd0 69 64 20 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0d id *), void *);.
65fe0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
65ff0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 int sqlite3Pager
66000 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 SetPagesize(Page
66010 72 2a 2c 20 75 33 32 2a 2c 20 69 6e 74 29 3b 0d r*, u32*, int);.
66020 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
66030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 int sqlite3Pager
66040 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 MaxPageCount(Pag
66050 65 72 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 er*, int);..SQLI
66060 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
66070 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 sqlite3PagerSetC
66080 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 2a 2c achesize(Pager*,
66090 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
660a0 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
660b0 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 te3PagerShrink(P
660c0 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f ager*);..SQLITE_
660d0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
660e0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 ite3PagerSetSafe
660f0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 2a 2c 69 tyLevel(Pager*,i
66100 6e 74 2c 69 6e 74 2c 69 6e 74 29 3b 0d 0a 53 51 nt,int,int);..SQ
66110 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
66120 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 sqlite3PagerLoc
66130 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a kingMode(Pager *
66140 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
66150 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
66160 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e te3PagerSetJourn
66170 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 2c 20 alMode(Pager *,
66180 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
66190 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
661a0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 3PagerGetJournal
661b0 4d 6f 64 65 28 50 61 67 65 72 2a 29 3b 0d 0a 53 Mode(Pager*);..S
661c0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
661d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b t sqlite3PagerOk
661e0 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d ToChangeJournalM
661f0 6f 64 65 28 50 61 67 65 72 2a 29 3b 0d 0a 53 51 ode(Pager*);..SQ
66200 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 36 34 LITE_PRIVATE i64
66210 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 sqlite3PagerJou
66220 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 rnalSizeLimit(Pa
66230 67 65 72 20 2a 2c 20 69 36 34 29 3b 0d 0a 53 51 ger *, i64);..SQ
66240 4c 49 54 45 5f 50 52 49 56 41 54 45 20 73 71 6c LITE_PRIVATE sql
66250 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 ite3_backup **sq
66260 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 lite3PagerBackup
66270 50 74 72 28 50 61 67 65 72 2a 29 3b 0d 0a 0d 0a Ptr(Pager*);....
66280 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 75 73 65 /* Functions use
66290 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 d to obtain and
662a0 72 65 6c 65 61 73 65 20 70 61 67 65 20 72 65 66 release page ref
662b0 65 72 65 6e 63 65 73 2e 20 2a 2f 20 0d 0a 53 51 erences. */ ..SQ
662c0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
662d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 sqlite3PagerAcq
662e0 75 69 72 65 28 50 61 67 65 72 20 2a 70 50 61 67 uire(Pager *pPag
662f0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 44 er, Pgno pgno, D
66300 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 bPage **ppPage,
66310 69 6e 74 20 63 6c 72 46 6c 61 67 29 3b 0d 0a 23 int clrFlag);..#
66320 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 50 61 define sqlite3Pa
66330 67 65 72 47 65 74 28 41 2c 42 2c 43 29 20 73 71 gerGet(A,B,C) sq
66340 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 lite3PagerAcquir
66350 65 28 41 2c 42 2c 43 2c 30 29 0d 0a 53 51 4c 49 e(A,B,C,0)..SQLI
66360 54 45 5f 50 52 49 56 41 54 45 20 44 62 50 61 67 TE_PRIVATE DbPag
66370 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c e *sqlite3PagerL
66380 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 ookup(Pager *pPa
66390 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 3b ger, Pgno pgno);
663a0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
663b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 void sqlite3Pag
663c0 65 72 52 65 66 28 44 62 50 61 67 65 2a 29 3b 0d erRef(DbPage*);.
663d0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
663e0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 void sqlite3Page
663f0 72 55 6e 72 65 66 28 44 62 50 61 67 65 2a 29 3b rUnref(DbPage*);
66400 0d 0a 0d 0a 2f 2a 20 4f 70 65 72 61 74 69 6f 6e ..../* Operation
66410 73 20 6f 6e 20 70 61 67 65 20 72 65 66 65 72 65 s on page refere
66420 6e 63 65 73 2e 20 2a 2f 0d 0a 53 51 4c 49 54 45 nces. */..SQLITE
66430 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
66440 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 ite3PagerWrite(D
66450 62 50 61 67 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 bPage*);..SQLITE
66460 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
66470 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 lite3PagerDontWr
66480 69 74 65 28 44 62 50 61 67 65 2a 29 3b 0d 0a 53 ite(DbPage*);..S
66490 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
664a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f t sqlite3PagerMo
664b0 76 65 70 61 67 65 28 50 61 67 65 72 2a 2c 44 62 vepage(Pager*,Db
664c0 50 61 67 65 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b Page*,Pgno,int);
664d0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
664e0 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
664f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 rPageRefcount(Db
66500 50 61 67 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f Page*);..SQLITE_
66510 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 PRIVATE void *sq
66520 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 lite3PagerGetDat
66530 61 28 44 62 50 61 67 65 20 2a 29 3b 20 0d 0a 53 a(DbPage *); ..S
66540 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
66550 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 id *sqlite3Pager
66560 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 GetExtra(DbPage
66570 2a 29 3b 20 0d 0a 0d 0a 2f 2a 20 46 75 6e 63 74 *); ..../* Funct
66580 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 6d 61 6e ions used to man
66590 61 67 65 20 70 61 67 65 72 20 74 72 61 6e 73 61 age pager transa
665a0 63 74 69 6f 6e 73 20 61 6e 64 20 73 61 76 65 70 ctions and savep
665b0 6f 69 6e 74 73 2e 20 2a 2f 0d 0a 53 51 4c 49 54 oints. */..SQLIT
665c0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
665d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 qlite3PagerPagec
665e0 6f 75 6e 74 28 50 61 67 65 72 2a 2c 20 69 6e 74 ount(Pager*, int
665f0 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
66600 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
66610 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 2a agerBegin(Pager*
66620 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e , int exFlag, in
66630 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
66640 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
66650 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f agerCommitPhaseO
66660 6e 65 28 50 61 67 65 72 2a 2c 63 6f 6e 73 74 20 ne(Pager*,const
66670 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 char *zMaster, i
66680 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
66690 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
666a0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f PagerExclusiveLo
666b0 63 6b 28 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c ck(Pager*);..SQL
666c0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
666d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 sqlite3PagerSync
666e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b (Pager *pPager);
666f0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
66700 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
66710 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 rCommitPhaseTwo(
66720 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 Pager*);..SQLITE
66730 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
66740 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 ite3PagerRollbac
66750 6b 28 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 k(Pager*);..SQLI
66760 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
66770 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 qlite3PagerOpenS
66780 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a avepoint(Pager *
66790 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 29 3b 0d pPager, int n);.
667a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
667b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 int sqlite3Pager
667c0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 Savepoint(Pager
667d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c *pPager, int op,
667e0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 int iSavepoint)
667f0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
66800 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 E int sqlite3Pag
66810 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 erSharedLock(Pag
66820 65 72 20 2a 70 50 61 67 65 72 29 3b 0d 0a 0d 0a er *pPager);....
66830 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
66840 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 nt sqlite3PagerC
66850 68 65 63 6b 70 6f 69 6e 74 28 50 61 67 65 72 20 heckpoint(Pager
66860 2a 70 50 61 67 65 72 2c 20 69 6e 74 2c 20 69 6e *pPager, int, in
66870 74 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 4c 49 t*, int*);..SQLI
66880 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
66890 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 qlite3PagerWalSu
668a0 70 70 6f 72 74 65 64 28 50 61 67 65 72 20 2a 70 pported(Pager *p
668b0 50 61 67 65 72 29 3b 0d 0a 53 51 4c 49 54 45 5f Pager);..SQLITE_
668c0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
668d0 74 65 33 50 61 67 65 72 57 61 6c 43 61 6c 6c 62 te3PagerWalCallb
668e0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 ack(Pager *pPage
668f0 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 r);..SQLITE_PRIV
66900 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
66910 61 67 65 72 4f 70 65 6e 57 61 6c 28 50 61 67 65 agerOpenWal(Page
66920 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a r *pPager, int *
66930 70 69 73 4f 70 65 6e 29 3b 0d 0a 53 51 4c 49 54 pisOpen);..SQLIT
66940 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
66950 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 57 lite3PagerCloseW
66960 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 al(Pager *pPager
66970 29 3b 0d 0a 0d 0a 2f 2a 20 46 75 6e 63 74 69 6f );..../* Functio
66980 6e 73 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 ns used to query
66990 20 70 61 67 65 72 20 73 74 61 74 65 20 61 6e 64 pager state and
669a0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 configuration.
669b0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
669c0 54 45 20 75 38 20 73 71 6c 69 74 65 33 50 61 67 TE u8 sqlite3Pag
669d0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 erIsreadonly(Pag
669e0 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 er*);..SQLITE_PR
669f0 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
66a00 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 3PagerRefcount(P
66a10 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f ager*);..SQLITE_
66a20 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
66a30 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 te3PagerMemUsed(
66a40 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 Pager*);..SQLITE
66a50 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 63 _PRIVATE const c
66a60 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 har *sqlite3Page
66a70 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 2a rFilename(Pager*
66a80 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
66a90 54 45 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 TE const sqlite3
66aa0 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 _vfs *sqlite3Pag
66ab0 65 72 56 66 73 28 50 61 67 65 72 2a 29 3b 0d 0a erVfs(Pager*);..
66ac0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 73 SQLITE_PRIVATE s
66ad0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c qlite3_file *sql
66ae0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 ite3PagerFile(Pa
66af0 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ger*);..SQLITE_P
66b00 52 49 56 41 54 45 20 63 6f 6e 73 74 20 63 68 61 RIVATE const cha
66b10 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a r *sqlite3PagerJ
66b20 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 ournalname(Pager
66b30 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
66b40 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
66b50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 agerNosync(Pager
66b60 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
66b70 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 ATE void *sqlite
66b80 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 3PagerTempSpace(
66b90 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 Pager*);..SQLITE
66ba0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
66bb0 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 ite3PagerIsMemdb
66bc0 28 50 61 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 (Pager*);..SQLIT
66bd0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
66be0 71 6c 69 74 65 33 50 61 67 65 72 43 61 63 68 65 qlite3PagerCache
66bf0 53 74 61 74 28 50 61 67 65 72 20 2a 2c 20 69 6e Stat(Pager *, in
66c00 74 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b 0d t, int, int *);.
66c10 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
66c20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 void sqlite3Page
66c30 72 43 6c 65 61 72 43 61 63 68 65 28 50 61 67 65 rClearCache(Page
66c40 72 20 2a 29 3b 0d 0a 0d 0a 2f 2a 20 46 75 6e 63 r *);..../* Func
66c50 74 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 74 72 tions used to tr
66c60 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 uncate the datab
66c70 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0d 0a 53 51 ase file. */..SQ
66c80 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
66c90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 d sqlite3PagerTr
66ca0 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 uncateImage(Page
66cb0 72 2a 2c 50 67 6e 6f 29 3b 0d 0a 0d 0a 23 69 66 r*,Pgno);....#if
66cc0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
66cd0 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 HAS_CODEC) && !d
66ce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
66cf0 49 54 5f 57 41 4c 29 0d 0a 53 51 4c 49 54 45 5f IT_WAL)..SQLITE_
66d00 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 PRIVATE void *sq
66d10 6c 69 74 65 33 50 61 67 65 72 43 6f 64 65 63 28 lite3PagerCodec(
66d20 44 62 50 61 67 65 20 2a 29 3b 0d 0a 23 65 6e 64 DbPage *);..#end
66d30 69 66 0d 0a 0d 0a 2f 2a 20 46 75 6e 63 74 69 6f if..../* Functio
66d40 6e 73 20 74 6f 20 73 75 70 70 6f 72 74 20 74 65 ns to support te
66d50 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 sting and debugg
66d60 69 6e 67 2e 20 2a 2f 0d 0a 23 69 66 20 21 64 65 ing. */..#if !de
66d70 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c fined(NDEBUG) ||
66d80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
66d90 54 45 53 54 29 0d 0a 53 51 4c 49 54 45 5f 50 52 TEST)..SQLITE_PR
66da0 49 56 41 54 45 20 20 20 50 67 6e 6f 20 73 71 6c IVATE Pgno sql
66db0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d ite3PagerPagenum
66dc0 62 65 72 28 44 62 50 61 67 65 2a 29 3b 0d 0a 53 ber(DbPage*);..S
66dd0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
66de0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 int sqlite3Pager
66df0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 Iswriteable(DbPa
66e00 67 65 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 ge*);..#endif..#
66e10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
66e20 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 T..SQLITE_PRIVAT
66e30 45 20 20 20 69 6e 74 20 2a 73 71 6c 69 74 65 33 E int *sqlite3
66e40 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 PagerStats(Pager
66e50 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
66e60 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
66e70 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 e3PagerRefdump(P
66e80 61 67 65 72 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 ager*);.. void
66e90 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 disable_simulate
66ea0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 d_io_errors(void
66eb0 29 3b 0d 0a 20 20 76 6f 69 64 20 65 6e 61 62 6c );.. void enabl
66ec0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 e_simulated_io_e
66ed0 72 72 6f 72 73 28 76 6f 69 64 29 3b 0d 0a 23 65 rrors(void);..#e
66ee0 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 64 69 lse..# define di
66ef0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f sable_simulated_
66f00 69 6f 5f 65 72 72 6f 72 73 28 29 0d 0a 23 20 64 io_errors()..# d
66f10 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d efine enable_sim
66f20 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 ulated_io_errors
66f30 28 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 65 ()..#endif....#e
66f40 6e 64 69 66 20 2f 2a 20 5f 50 41 47 45 52 5f 48 ndif /* _PAGER_H
66f50 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a _ */..../*******
66f60 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 70 ******* End of p
66f70 61 67 65 72 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ager.h *********
66f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
66f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
66fa0 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
66fb0 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 ******** Continu
66fc0 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 ing where we lef
66fd0 74 20 6f 66 66 20 69 6e 20 73 71 6c 69 74 65 49 t off in sqliteI
66fe0 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nt.h ***********
66ff0 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
67000 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 64 ********* Includ
67010 65 20 70 63 61 63 68 65 2e 68 20 69 6e 20 74 68 e pcache.h in th
67020 65 20 6d 69 64 64 6c 65 20 6f 66 20 73 71 6c 69 e middle of sqli
67030 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a teInt.h ********
67040 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
67050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
67060 20 66 69 6c 65 20 70 63 61 63 68 65 2e 68 20 2a file pcache.h *
67070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a *********/../*..
670a0 2a 2a 20 32 30 30 38 20 41 75 67 75 73 74 20 30 ** 2008 August 0
670b0 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 5..**..** The au
670c0 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
670d0 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
670e0 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
670f0 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 n place of..** a
67100 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
67110 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
67120 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 g:..**..** Ma
67130 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
67140 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 d not evil...**
67150 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
67160 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
67170 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
67180 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a give others...**
67190 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 May you shar
671a0 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 e freely, never
671b0 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e taking more than
671c0 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a you give...**..
671d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
671e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
671f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67210 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 *********..** Th
67220 69 73 20 68 65 61 64 65 72 20 66 69 6c 65 20 64 is header file d
67230 65 66 69 6e 65 73 20 74 68 65 20 69 6e 74 65 72 efines the inter
67240 66 61 63 65 20 74 68 61 74 20 74 68 65 20 73 71 face that the sq
67250 6c 69 74 65 20 70 61 67 65 20 63 61 63 68 65 0d lite page cache.
67260 0a 2a 2a 20 73 75 62 73 79 73 74 65 6d 2e 20 0d .** subsystem. .
67270 0a 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 5f .*/....#ifndef _
67280 50 43 41 43 48 45 5f 48 5f 0d 0a 0d 0a 74 79 70 PCACHE_H_....typ
67290 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 edef struct PgHd
672a0 72 20 50 67 48 64 72 3b 0d 0a 74 79 70 65 64 65 r PgHdr;..typede
672b0 66 20 73 74 72 75 63 74 20 50 43 61 63 68 65 20 f struct PCache
672c0 50 43 61 63 68 65 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a PCache;..../*..*
672d0 2a 20 45 76 65 72 79 20 70 61 67 65 20 69 6e 20 * Every page in
672e0 74 68 65 20 63 61 63 68 65 20 69 73 20 63 6f 6e the cache is con
672f0 74 72 6f 6c 6c 65 64 20 62 79 20 61 6e 20 69 6e trolled by an in
67300 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f stance of the fo
67310 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 73 74 72 75 llowing..** stru
67320 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 cture...*/..stru
67330 63 74 20 50 67 48 64 72 20 7b 0d 0a 20 20 73 71 ct PgHdr {.. sq
67340 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 lite3_pcache_pag
67350 65 20 2a 70 50 61 67 65 3b 20 20 20 20 2f 2a 20 e *pPage; /*
67360 50 63 61 63 68 65 20 6f 62 6a 65 63 74 20 70 61 Pcache object pa
67370 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 ge handle */..
67380 76 6f 69 64 20 2a 70 44 61 74 61 3b 20 20 20 20 void *pData;
67390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
673a0 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0d 0a * Page data */..
673b0 20 20 76 6f 69 64 20 2a 70 45 78 74 72 61 3b 20 void *pExtra;
673c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
673d0 20 2f 2a 20 45 78 74 72 61 20 63 6f 6e 74 65 6e /* Extra conten
673e0 74 20 2a 2f 0d 0a 20 20 50 67 48 64 72 20 2a 70 t */.. PgHdr *p
673f0 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 Dirty;
67400 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 69 /* Transi
67410 65 6e 74 20 6c 69 73 74 20 6f 66 20 64 69 72 74 ent list of dirt
67420 79 20 70 61 67 65 73 20 2a 2f 0d 0a 20 20 50 67 y pages */.. Pg
67430 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 no pgno;
67440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
67450 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 Page number for
67460 74 68 69 73 20 70 61 67 65 20 2a 2f 0d 0a 20 20 this page */..
67470 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 Pager *pPager;
67480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
67490 2a 20 54 68 65 20 70 61 67 65 72 20 74 68 69 73 * The pager this
674a0 20 70 61 67 65 20 69 73 20 70 61 72 74 20 6f 66 page is part of
674b0 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 */..#ifdef SQLI
674c0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0d 0a TE_CHECK_PAGES..
674d0 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 20 u32 pageHash;
674e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
674f0 20 2f 2a 20 48 61 73 68 20 6f 66 20 70 61 67 65 /* Hash of page
67500 20 63 6f 6e 74 65 6e 74 20 2a 2f 0d 0a 23 65 6e content */..#en
67510 64 69 66 0d 0a 20 20 75 31 36 20 66 6c 61 67 73 dif.. u16 flags
67520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
67530 20 20 20 20 20 20 2f 2a 20 50 47 48 44 52 20 66 /* PGHDR f
67540 6c 61 67 73 20 64 65 66 69 6e 65 64 20 62 65 6c lags defined bel
67550 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 2a 2a 2a ow */.... /****
67560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
67590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
675a0 2a 2a 0d 0a 20 20 2a 2a 20 45 6c 65 6d 65 6e 74 **.. ** Element
675b0 73 20 61 62 6f 76 65 20 61 72 65 20 70 75 62 6c s above are publ
675c0 69 63 2e 20 20 41 6c 6c 20 74 68 61 74 20 66 6f ic. All that fo
675d0 6c 6c 6f 77 73 20 69 73 20 70 72 69 76 61 74 65 llows is private
675e0 20 74 6f 20 70 63 61 63 68 65 2e 63 0d 0a 20 20 to pcache.c..
675f0 2a 2a 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f ** and should no
67600 74 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 t be accessed by
67610 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 2e 0d other modules..
67620 0a 20 20 2a 2f 0d 0a 20 20 69 31 36 20 6e 52 65 . */.. i16 nRe
67630 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 f;
67640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
67650 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 r of users of th
67660 69 73 20 70 61 67 65 20 2a 2f 0d 0a 20 20 50 43 is page */.. PC
67670 61 63 68 65 20 2a 70 43 61 63 68 65 3b 20 20 20 ache *pCache;
67680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
67690 43 61 63 68 65 20 74 68 61 74 20 6f 77 6e 73 20 Cache that owns
676a0 74 68 69 73 20 70 61 67 65 20 2a 2f 0d 0a 0d 0a this page */....
676b0 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 4e PgHdr *pDirtyN
676c0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 ext;
676d0 20 2f 2a 20 4e 65 78 74 20 65 6c 65 6d 65 6e 74 /* Next element
676e0 20 69 6e 20 6c 69 73 74 20 6f 66 20 64 69 72 74 in list of dirt
676f0 79 20 70 61 67 65 73 20 2a 2f 0d 0a 20 20 50 67 y pages */.. Pg
67700 48 64 72 20 2a 70 44 69 72 74 79 50 72 65 76 3b Hdr *pDirtyPrev;
67710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
67720 50 72 65 76 69 6f 75 73 20 65 6c 65 6d 65 6e 74 Previous element
67730 20 69 6e 20 6c 69 73 74 20 6f 66 20 64 69 72 74 in list of dirt
67740 79 20 70 61 67 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a y pages */..};..
67750 0d 0a 2f 2a 20 42 69 74 20 76 61 6c 75 65 73 20 ../* Bit values
67760 66 6f 72 20 50 67 48 64 72 2e 66 6c 61 67 73 20 for PgHdr.flags
67770 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 47 48 44 */..#define PGHD
67780 52 5f 44 49 52 54 59 20 20 20 20 20 20 20 20 20 R_DIRTY
67790 20 20 20 20 30 78 30 30 32 20 20 2f 2a 20 50 61 0x002 /* Pa
677a0 67 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a ge has changed *
677b0 2f 0d 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 /..#define PGHDR
677c0 5f 4e 45 45 44 5f 53 59 4e 43 20 20 20 20 20 20 _NEED_SYNC
677d0 20 20 20 30 78 30 30 34 20 20 2f 2a 20 46 73 79 0x004 /* Fsy
677e0 6e 63 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 nc the rollback
677f0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 0d 0a journal before..
67800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
67810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
67820 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e ** writin
67830 67 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 g this page to t
67840 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0d 0a he database */..
67850 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 4e 45 #define PGHDR_NE
67860 45 44 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 ED_READ
67870 30 78 30 30 38 20 20 2f 2a 20 43 6f 6e 74 65 6e 0x008 /* Conten
67880 74 20 69 73 20 75 6e 72 65 61 64 20 2a 2f 0d 0a t is unread */..
67890 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 52 45 #define PGHDR_RE
678a0 55 53 45 5f 55 4e 4c 49 4b 45 4c 59 20 20 20 20 USE_UNLIKELY
678b0 30 78 30 31 30 20 20 2f 2a 20 41 20 68 69 6e 74 0x010 /* A hint
678c0 20 74 68 61 74 20 72 65 75 73 65 20 69 73 20 75 that reuse is u
678d0 6e 6c 69 6b 65 6c 79 20 2a 2f 0d 0a 23 64 65 66 nlikely */..#def
678e0 69 6e 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 ine PGHDR_DONT_W
678f0 52 49 54 45 20 20 20 20 20 20 20 20 30 78 30 32 RITE 0x02
67900 30 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 0 /* Do not wri
67910 74 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 64 69 te content to di
67920 73 6b 20 2a 2f 0d 0a 0d 0a 2f 2a 20 49 6e 69 74 sk */..../* Init
67930 69 61 6c 69 7a 65 20 61 6e 64 20 73 68 75 74 64 ialize and shutd
67940 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 own the page cac
67950 68 65 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0d he subsystem */.
67960 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
67970 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 int sqlite3Pcach
67980 65 49 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 eInitialize(void
67990 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
679a0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
679b0 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 76 6f cacheShutdown(vo
679c0 69 64 29 3b 0d 0a 0d 0a 2f 2a 20 50 61 67 65 20 id);..../* Page
679d0 63 61 63 68 65 20 62 75 66 66 65 72 20 6d 61 6e cache buffer man
679e0 61 67 65 6d 65 6e 74 3a 0d 0a 2a 2a 20 54 68 65 agement:..** The
679f0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c se routines impl
67a00 65 6d 65 6e 74 20 53 51 4c 49 54 45 5f 43 4f 4e ement SQLITE_CON
67a10 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e 0d 0a FIG_PAGECACHE...
67a20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
67a30 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
67a40 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70 CacheBufferSetup
67a50 28 76 6f 69 64 20 2a 2c 20 69 6e 74 20 73 7a 2c (void *, int sz,
67a60 20 69 6e 74 20 6e 29 3b 0d 0a 0d 0a 2f 2a 20 43 int n);..../* C
67a70 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 reate a new page
67a80 72 20 63 61 63 68 65 2e 0d 0a 2a 2a 20 55 6e 64 r cache...** Und
67a90 65 72 20 6d 65 6d 6f 72 79 20 73 74 72 65 73 73 er memory stress
67aa0 2c 20 69 6e 76 6f 6b 65 20 78 53 74 72 65 73 73 , invoke xStress
67ab0 20 74 6f 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 to try to make
67ac0 70 61 67 65 73 20 63 6c 65 61 6e 2e 0d 0a 2a 2a pages clean...**
67ad0 20 4f 6e 6c 79 20 63 6c 65 61 6e 20 61 6e 64 20 Only clean and
67ae0 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 20 63 unpinned pages c
67af0 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e an be reclaimed.
67b00 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
67b10 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
67b20 33 50 63 61 63 68 65 4f 70 65 6e 28 0d 0a 20 20 3PcacheOpen(..
67b30 69 6e 74 20 73 7a 50 61 67 65 2c 20 20 20 20 20 int szPage,
67b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
67b50 2a 20 53 69 7a 65 20 6f 66 20 65 76 65 72 79 20 * Size of every
67b60 70 61 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 page */.. int s
67b70 7a 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 zExtra,
67b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 /* Ext
67b90 72 61 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 ra space associa
67ba0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 70 61 ted with each pa
67bb0 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 50 75 ge */.. int bPu
67bc0 72 67 65 61 62 6c 65 2c 20 20 20 20 20 20 20 20 rgeable,
67bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
67be0 69 66 20 70 61 67 65 73 20 61 72 65 20 6f 6e 20 if pages are on
67bf0 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 2a 2f backing store */
67c00 0d 0a 20 20 69 6e 74 20 28 2a 78 53 74 72 65 73 .. int (*xStres
67c10 73 29 28 76 6f 69 64 2a 2c 20 50 67 48 64 72 2a s)(void*, PgHdr*
67c20 29 2c 20 2f 2a 20 43 61 6c 6c 20 74 6f 20 74 72 ), /* Call to tr
67c30 79 20 74 6f 20 6d 61 6b 65 20 70 61 67 65 73 20 y to make pages
67c40 63 6c 65 61 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 clean */.. void
67c50 20 2a 70 53 74 72 65 73 73 2c 20 20 20 20 20 20 *pStress,
67c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 /* Ar
67c70 67 75 6d 65 6e 74 20 74 6f 20 78 53 74 72 65 73 gument to xStres
67c80 73 20 2a 2f 0d 0a 20 20 50 43 61 63 68 65 20 2a s */.. PCache *
67c90 70 54 6f 49 6e 69 74 20 20 20 20 20 20 20 20 20 pToInit
67ca0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 61 6c 6c /* Preall
67cb0 6f 63 61 74 65 64 20 73 70 61 63 65 20 66 6f 72 ocated space for
67cc0 20 74 68 65 20 50 43 61 63 68 65 20 2a 2f 0d 0a the PCache */..
67cd0 29 3b 0d 0a 0d 0a 2f 2a 20 4d 6f 64 69 66 79 20 );..../* Modify
67ce0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 66 the page-size af
67cf0 74 65 72 20 74 68 65 20 63 61 63 68 65 20 68 61 ter the cache ha
67d00 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 20 s been created.
67d10 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
67d20 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
67d30 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 cacheSetPageSize
67d40 28 50 43 61 63 68 65 20 2a 2c 20 69 6e 74 29 3b (PCache *, int);
67d50 0d 0a 0d 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 ..../* Return th
67d60 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 e size in bytes
67d70 6f 66 20 61 20 50 43 61 63 68 65 20 6f 62 6a 65 of a PCache obje
67d80 63 74 2e 20 20 55 73 65 64 20 74 6f 20 70 72 65 ct. Used to pre
67d90 61 6c 6c 6f 63 61 74 65 0d 0a 2a 2a 20 73 74 6f allocate..** sto
67da0 72 61 67 65 20 73 70 61 63 65 2e 0d 0a 2a 2f 0d rage space...*/.
67db0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
67dc0 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 int sqlite3Pcach
67dd0 65 53 69 7a 65 28 76 6f 69 64 29 3b 0d 0a 0d 0a eSize(void);....
67de0 2f 2a 20 4f 6e 65 20 72 65 6c 65 61 73 65 20 70 /* One release p
67df0 65 72 20 73 75 63 63 65 73 73 66 75 6c 20 66 65 er successful fe
67e00 74 63 68 2e 20 20 50 61 67 65 20 69 73 20 70 69 tch. Page is pi
67e10 6e 6e 65 64 20 75 6e 74 69 6c 20 72 65 6c 65 61 nned until relea
67e20 73 65 64 2e 0d 0a 2a 2a 20 52 65 66 65 72 65 6e sed...** Referen
67e30 63 65 20 63 6f 75 6e 74 65 64 2e 20 0d 0a 2a 2f ce counted. ..*/
67e40 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
67e50 20 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 int sqlite3Pcac
67e60 68 65 46 65 74 63 68 28 50 43 61 63 68 65 2a 2c heFetch(PCache*,
67e70 20 50 67 6e 6f 2c 20 69 6e 74 20 63 72 65 61 74 Pgno, int creat
67e80 65 46 6c 61 67 2c 20 50 67 48 64 72 2a 2a 29 3b eFlag, PgHdr**);
67e90 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
67ea0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61 void sqlite3Pca
67eb0 63 68 65 52 65 6c 65 61 73 65 28 50 67 48 64 72 cheRelease(PgHdr
67ec0 2a 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 *);....SQLITE_PR
67ed0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
67ee0 65 33 50 63 61 63 68 65 44 72 6f 70 28 50 67 48 e3PcacheDrop(PgH
67ef0 64 72 2a 29 3b 20 20 20 20 20 20 20 20 20 2f 2a dr*); /*
67f00 20 52 65 6d 6f 76 65 20 70 61 67 65 20 66 72 6f Remove page fro
67f10 6d 20 63 61 63 68 65 20 2a 2f 0d 0a 53 51 4c 49 m cache */..SQLI
67f20 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
67f30 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b sqlite3PcacheMak
67f40 65 44 69 72 74 79 28 50 67 48 64 72 2a 29 3b 20 eDirty(PgHdr*);
67f50 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
67f60 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 64 page is marked d
67f70 69 72 74 79 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f irty */..SQLITE_
67f80 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
67f90 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c ite3PcacheMakeCl
67fa0 65 61 6e 28 50 67 48 64 72 2a 29 3b 20 20 20 20 ean(PgHdr*);
67fb0 2f 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 /* Mark a single
67fc0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 2a page as clean *
67fd0 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
67fe0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 E void sqlite3Pc
67ff0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 50 43 61 acheCleanAll(PCa
68000 63 68 65 2a 29 3b 20 20 20 20 2f 2a 20 4d 61 72 che*); /* Mar
68010 6b 20 61 6c 6c 20 64 69 72 74 79 20 6c 69 73 74 k all dirty list
68020 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 20 pages as clean
68030 2a 2f 0d 0a 0d 0a 2f 2a 20 43 68 61 6e 67 65 20 */..../* Change
68040 61 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 a page number.
68050 55 73 65 64 20 62 79 20 69 6e 63 72 2d 76 61 63 Used by incr-vac
68060 75 75 6d 2e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f uum. */..SQLITE_
68070 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
68080 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 50 ite3PcacheMove(P
68090 67 48 64 72 2a 2c 20 50 67 6e 6f 29 3b 0d 0a 0d gHdr*, Pgno);...
680a0 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 70 ./* Remove all p
680b0 61 67 65 73 20 77 69 74 68 20 70 67 6e 6f 3e 78 ages with pgno>x
680c0 2e 20 20 52 65 73 65 74 20 74 68 65 20 63 61 63 . Reset the cac
680d0 68 65 20 69 66 20 78 3d 3d 30 20 2a 2f 0d 0a 53 he if x==0 */..S
680e0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
680f0 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 id sqlite3Pcache
68100 54 72 75 6e 63 61 74 65 28 50 43 61 63 68 65 2a Truncate(PCache*
68110 2c 20 50 67 6e 6f 20 78 29 3b 0d 0a 0d 0a 2f 2a , Pgno x);..../*
68120 20 47 65 74 20 61 20 6c 69 73 74 20 6f 66 20 61 Get a list of a
68130 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 69 ll dirty pages i
68140 6e 20 74 68 65 20 63 61 63 68 65 2c 20 73 6f 72 n the cache, sor
68150 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 ted by page numb
68160 65 72 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 er */..SQLITE_PR
68170 49 56 41 54 45 20 50 67 48 64 72 20 2a 73 71 6c IVATE PgHdr *sql
68180 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c ite3PcacheDirtyL
68190 69 73 74 28 50 43 61 63 68 65 2a 29 3b 0d 0a 0d ist(PCache*);...
681a0 0a 2f 2a 20 52 65 73 65 74 20 61 6e 64 20 63 6c ./* Reset and cl
681b0 6f 73 65 20 74 68 65 20 63 61 63 68 65 20 6f 62 ose the cache ob
681c0 6a 65 63 74 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f ject */..SQLITE_
681d0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
681e0 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 ite3PcacheClose(
681f0 50 43 61 63 68 65 2a 29 3b 0d 0a 0d 0a 2f 2a 20 PCache*);..../*
68200 43 6c 65 61 72 20 66 6c 61 67 73 20 66 72 6f 6d Clear flags from
68210 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 70 61 pages of the pa
68220 67 65 20 63 61 63 68 65 20 2a 2f 0d 0a 53 51 4c ge cache */..SQL
68230 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
68240 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c sqlite3PcacheCl
68250 65 61 72 53 79 6e 63 46 6c 61 67 73 28 50 43 61 earSyncFlags(PCa
68260 63 68 65 20 2a 29 3b 0d 0a 0d 0a 2f 2a 20 44 69 che *);..../* Di
68270 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e scard the conten
68280 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 ts of the cache
68290 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
682a0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
682b0 63 61 63 68 65 43 6c 65 61 72 28 50 43 61 63 68 cacheClear(PCach
682c0 65 2a 29 3b 0d 0a 0d 0a 2f 2a 20 52 65 74 75 72 e*);..../* Retur
682d0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 n the total numb
682e0 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e er of outstandin
682f0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 g page reference
68300 73 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 s */..SQLITE_PRI
68310 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
68320 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 50 PcacheRefCount(P
68330 43 61 63 68 65 2a 29 3b 0d 0a 0d 0a 2f 2a 20 49 Cache*);..../* I
68340 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 ncrement the ref
68350 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 erence count of
68360 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 an existing page
68370 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 */..SQLITE_PRIV
68380 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
68390 50 63 61 63 68 65 52 65 66 28 50 67 48 64 72 2a PcacheRef(PgHdr*
683a0 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 );....SQLITE_PRI
683b0 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
683c0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 PcachePageRefcou
683d0 6e 74 28 50 67 48 64 72 2a 29 3b 0d 0a 0d 0a 2f nt(PgHdr*);..../
683e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 * Return the tot
683f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 al number of pag
68400 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 es stored in the
68410 20 63 61 63 68 65 20 2a 2f 0d 0a 53 51 4c 49 54 cache */..SQLIT
68420 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
68430 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 lite3PcachePagec
68440 6f 75 6e 74 28 50 43 61 63 68 65 2a 29 3b 0d 0a ount(PCache*);..
68450 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
68460 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 LITE_CHECK_PAGES
68470 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c ) || defined(SQL
68480 49 54 45 5f 44 45 42 55 47 29 0d 0a 2f 2a 20 49 ITE_DEBUG)../* I
68490 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 terate through a
684a0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 ll dirty pages c
684b0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 urrently stored
684c0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 in the cache. Th
684d0 69 73 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 is..** interface
684e0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 is only availab
684f0 6c 65 20 69 66 20 53 51 4c 49 54 45 5f 43 48 45 le if SQLITE_CHE
68500 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 CK_PAGES is defi
68510 6e 65 64 20 77 68 65 6e 20 74 68 65 20 0d 0a 2a ned when the ..*
68520 2a 20 6c 69 62 72 61 72 79 20 69 73 20 62 75 69 * library is bui
68530 6c 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f lt...*/..SQLITE_
68540 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
68550 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 ite3PcacheIterat
68560 65 44 69 72 74 79 28 50 43 61 63 68 65 20 2a 70 eDirty(PCache *p
68570 43 61 63 68 65 2c 20 76 6f 69 64 20 28 2a 78 49 Cache, void (*xI
68580 74 65 72 29 28 50 67 48 64 72 20 2a 29 29 3b 0d ter)(PgHdr *));.
68590 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 53 65 .#endif..../* Se
685a0 74 20 61 6e 64 20 67 65 74 20 74 68 65 20 73 75 t and get the su
685b0 67 67 65 73 74 65 64 20 63 61 63 68 65 2d 73 69 ggested cache-si
685c0 7a 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 ze for the speci
685d0 66 69 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 fied pager-cache
685e0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 6e 6f 20 ...**..** If no
685f0 67 6c 6f 62 61 6c 20 6d 61 78 69 6d 75 6d 20 69 global maximum i
68600 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 s configured, th
68610 65 6e 20 74 68 65 20 73 79 73 74 65 6d 20 61 74 en the system at
68620 74 65 6d 70 74 73 20 74 6f 20 6c 69 6d 69 74 0d tempts to limit.
68630 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 .** the total nu
68640 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 63 61 mber of pages ca
68650 63 68 65 64 20 62 79 20 70 75 72 67 65 61 62 6c ched by purgeabl
68660 65 20 70 61 67 65 72 2d 63 61 63 68 65 73 20 74 e pager-caches t
68670 6f 20 74 68 65 20 73 75 6d 0d 0a 2a 2a 20 6f 66 o the sum..** of
68680 20 74 68 65 20 73 75 67 67 65 73 74 65 64 20 63 the suggested c
68690 61 63 68 65 2d 73 69 7a 65 73 2e 0d 0a 2a 2f 0d ache-sizes...*/.
686a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
686b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 void sqlite3Pcac
686c0 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 heSetCachesize(P
686d0 43 61 63 68 65 20 2a 2c 20 69 6e 74 29 3b 0d 0a Cache *, int);..
686e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
686f0 53 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ST..SQLITE_PRIVA
68700 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 63 TE int sqlite3Pc
68710 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 acheGetCachesize
68720 28 50 43 61 63 68 65 20 2a 29 3b 0d 0a 23 65 6e (PCache *);..#en
68730 64 69 66 0d 0a 0d 0a 2f 2a 20 46 72 65 65 20 75 dif..../* Free u
68740 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 p as much memory
68750 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f as possible fro
68760 6d 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 m the page cache
68770 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 */..SQLITE_PRIV
68780 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
68790 50 63 61 63 68 65 53 68 72 69 6e 6b 28 50 43 61 PcacheShrink(PCa
687a0 63 68 65 2a 29 3b 0d 0a 0d 0a 23 69 66 64 65 66 che*);....#ifdef
687b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d SQLITE_ENABLE_M
687c0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 EMORY_MANAGEMENT
687d0 0d 0a 2f 2a 20 54 72 79 20 74 6f 20 72 65 74 75 ../* Try to retu
687e0 72 6e 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 rn memory used b
687f0 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 y the pcache mod
68800 75 6c 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 ule to the main
68810 6d 65 6d 6f 72 79 20 68 65 61 70 20 2a 2f 0d 0a memory heap */..
68820 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
68830 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 nt sqlite3Pcache
68840 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e ReleaseMemory(in
68850 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 t);..#endif....#
68860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
68870 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 T..SQLITE_PRIVAT
68880 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 E void sqlite3Pc
68890 61 63 68 65 53 74 61 74 73 28 69 6e 74 2a 2c 69 acheStats(int*,i
688a0 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0d nt*,int*,int*);.
688b0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 .#endif....SQLIT
688c0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
688d0 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44 qlite3PCacheSetD
688e0 65 66 61 75 6c 74 28 76 6f 69 64 29 3b 0d 0a 0d efault(void);...
688f0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 50 43 41 43 .#endif /* _PCAC
68900 48 45 5f 48 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a HE_H_ */..../***
68910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 *********** End
68920 6f 66 20 70 63 61 63 68 65 2e 68 20 2a 2a 2a 2a of pcache.h ****
68930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a **********/../**
68960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e ************ Con
68970 74 69 6e 75 69 6e 67 20 77 68 65 72 65 20 77 65 tinuing where we
68980 20 6c 65 66 74 20 6f 66 66 20 69 6e 20 73 71 6c left off in sql
68990 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a iteInt.h *******
689a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a ***********/....
689b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
689c0 49 6e 63 6c 75 64 65 20 6f 73 2e 68 20 69 6e 20 Include os.h in
689d0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 73 71 the middle of sq
689e0 6c 69 74 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a liteInt.h ******
689f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
68a00 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
68a10 20 42 65 67 69 6e 20 66 69 6c 65 20 6f 73 2e 68 Begin file os.h
68a20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
68a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
68a50 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 31 20 53 65 ../*..** 2001 Se
68a60 70 74 65 6d 62 65 72 20 31 36 0d 0a 2a 2a 0d 0a ptember 16..**..
68a70 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 ** The author di
68a80 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 sclaims copyrigh
68a90 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 t to this source
68aa0 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 code. In place
68ab0 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 of..** a legal
68ac0 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 notice, here is
68ad0 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d a blessing:..**.
68ae0 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 .** May you d
68af0 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 o good and not e
68b00 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 vil...** May
68b10 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 you find forgive
68b20 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c ness for yoursel
68b30 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 f and forgive ot
68b40 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 hers...** May
68b50 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c you share freel
68b60 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 y, never taking
68b70 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 more than you gi
68b80 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a ve...**..*******
68b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
68bd0 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 *******..**..**
68be0 54 68 69 73 20 68 65 61 64 65 72 20 66 69 6c 65 This header file
68bf0 20 28 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 (together with
68c00 69 73 20 63 6f 6d 70 61 6e 69 6f 6e 20 43 20 73 is companion C s
68c10 6f 75 72 63 65 2d 63 6f 64 65 20 66 69 6c 65 0d ource-code file.
68c20 0a 2a 2a 20 22 6f 73 2e 63 22 29 20 61 74 74 65 .** "os.c") atte
68c30 6d 70 74 20 74 6f 20 61 62 73 74 72 61 63 74 20 mpt to abstract
68c40 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f the underlying o
68c50 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
68c60 73 6f 20 74 68 61 74 0d 0a 2a 2a 20 74 68 65 20 so that..** the
68c70 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 77 SQLite library w
68c80 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 62 6f 74 68 ill work on both
68c90 20 50 4f 53 49 58 20 61 6e 64 20 77 69 6e 64 6f POSIX and windo
68ca0 77 73 20 73 79 73 74 65 6d 73 2e 0d 0a 2a 2a 0d ws systems...**.
68cb0 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 .** This header
68cc0 66 69 6c 65 20 69 73 20 23 69 6e 63 6c 75 64 65 file is #include
68cd0 2d 65 64 20 62 79 20 73 71 6c 69 74 65 49 6e 74 -ed by sqliteInt
68ce0 2e 68 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 .h and thus ends
68cf0 20 75 70 0d 0a 2a 2a 20 62 65 69 6e 67 20 69 6e up..** being in
68d00 63 6c 75 64 65 64 20 62 79 20 65 76 65 72 79 20 cluded by every
68d10 73 6f 75 72 63 65 20 66 69 6c 65 2e 0d 0a 2a 2f source file...*/
68d20 0d 0a 23 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 ..#ifndef _SQLIT
68d30 45 5f 4f 53 5f 48 5f 0d 0a 23 64 65 66 69 6e 65 E_OS_H_..#define
68d40 20 5f 53 51 4c 49 54 45 5f 4f 53 5f 48 5f 0d 0a _SQLITE_OS_H_..
68d50 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 67 75 72 65 20 ../*..** Figure
68d60 6f 75 74 20 69 66 20 77 65 20 61 72 65 20 64 65 out if we are de
68d70 61 6c 69 6e 67 20 77 69 74 68 20 55 6e 69 78 2c aling with Unix,
68d80 20 57 69 6e 64 6f 77 73 2c 20 6f 72 20 73 6f 6d Windows, or som
68d90 65 20 6f 74 68 65 72 0d 0a 2a 2a 20 6f 70 65 72 e other..** oper
68da0 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 20 20 41 ating system. A
68db0 66 74 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 fter the followi
68dc0 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 70 72 65 70 ng block of prep
68dd0 72 6f 63 65 73 73 20 6d 61 63 72 6f 73 2c 0d 0a rocess macros,..
68de0 2a 2a 20 61 6c 6c 20 6f 66 20 53 51 4c 49 54 45 ** all of SQLITE
68df0 5f 4f 53 5f 55 4e 49 58 2c 20 53 51 4c 49 54 45 _OS_UNIX, SQLITE
68e00 5f 4f 53 5f 57 49 4e 2c 20 53 51 4c 49 54 45 5f _OS_WIN, SQLITE_
68e10 4f 53 5f 4f 53 32 2c 20 61 6e 64 20 53 51 4c 49 OS_OS2, and SQLI
68e20 54 45 5f 4f 53 5f 4f 54 48 45 52 20 0d 0a 2a 2a TE_OS_OTHER ..**
68e30 20 77 69 6c 6c 20 64 65 66 69 6e 65 64 20 74 6f will defined to
68e40 20 65 69 74 68 65 72 20 31 20 6f 72 20 30 2e 20 either 1 or 0.
68e50 20 4f 6e 65 20 6f 66 20 74 68 65 20 66 6f 75 72 One of the four
68e60 20 77 69 6c 6c 20 62 65 20 31 2e 20 20 54 68 65 will be 1. The
68e70 20 6f 74 68 65 72 20 0d 0a 2a 2a 20 74 68 72 65 other ..** thre
68e80 65 20 77 69 6c 6c 20 62 65 20 30 2e 0d 0a 2a 2f e will be 0...*/
68e90 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
68ea0 4c 49 54 45 5f 4f 53 5f 4f 54 48 45 52 29 0d 0a LITE_OS_OTHER)..
68eb0 23 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 4f # if SQLITE_OS_O
68ec0 54 48 45 52 3d 3d 31 0d 0a 23 20 20 20 75 6e 64 THER==1..# und
68ed0 65 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 ef SQLITE_OS_UNI
68ee0 58 0d 0a 23 20 20 20 64 65 66 69 6e 65 20 53 51 X..# define SQ
68ef0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 30 0d 0a LITE_OS_UNIX 0..
68f00 23 20 20 20 75 6e 64 65 66 20 53 51 4c 49 54 45 # undef SQLITE
68f10 5f 4f 53 5f 57 49 4e 0d 0a 23 20 20 20 64 65 66 _OS_WIN..# def
68f20 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 ine SQLITE_OS_WI
68f30 4e 20 30 0d 0a 23 20 20 20 75 6e 64 65 66 20 53 N 0..# undef S
68f40 51 4c 49 54 45 5f 4f 53 5f 4f 53 32 0d 0a 23 20 QLITE_OS_OS2..#
68f50 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f define SQLITE_
68f60 4f 53 5f 4f 53 32 20 30 0d 0a 23 20 65 6c 73 65 OS_OS2 0..# else
68f70 0d 0a 23 20 20 20 75 6e 64 65 66 20 53 51 4c 49 ..# undef SQLI
68f80 54 45 5f 4f 53 5f 4f 54 48 45 52 0d 0a 23 20 65 TE_OS_OTHER..# e
68f90 6e 64 69 66 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 ndif..#endif..#i
68fa0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
68fb0 45 5f 4f 53 5f 55 4e 49 58 29 20 26 26 20 21 64 E_OS_UNIX) && !d
68fc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 efined(SQLITE_OS
68fd0 5f 4f 54 48 45 52 29 0d 0a 23 20 64 65 66 69 6e _OTHER)..# defin
68fe0 65 20 53 51 4c 49 54 45 5f 4f 53 5f 4f 54 48 45 e SQLITE_OS_OTHE
68ff0 52 20 30 0d 0a 23 20 69 66 6e 64 65 66 20 53 51 R 0..# ifndef SQ
69000 4c 49 54 45 5f 4f 53 5f 57 49 4e 0d 0a 23 20 20 LITE_OS_WIN..#
69010 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e if defined(_WIN
69020 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 32) || defined(W
69030 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 IN32) || defined
69040 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 20 7c 7c 20 (__CYGWIN__) ||
69050 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 defined(__MINGW3
69060 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 2__) || defined(
69070 5f 5f 42 4f 52 4c 41 4e 44 43 5f 5f 29 0d 0a 23 __BORLANDC__)..#
69080 20 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 define SQLI
69090 54 45 5f 4f 53 5f 57 49 4e 20 31 0d 0a 23 20 20 TE_OS_WIN 1..#
690a0 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 define SQLITE
690b0 5f 4f 53 5f 55 4e 49 58 20 30 0d 0a 23 20 20 20 _OS_UNIX 0..#
690c0 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f define SQLITE_
690d0 4f 53 5f 4f 53 32 20 30 0d 0a 23 20 20 20 65 6c OS_OS2 0..# el
690e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 45 4d 58 if defined(__EMX
690f0 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
69100 4f 53 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 OS2) || defined(
69110 4f 53 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 OS2) || defined(
69120 5f 4f 53 32 5f 29 20 7c 7c 20 64 65 66 69 6e 65 _OS2_) || define
69130 64 28 5f 5f 4f 53 32 5f 5f 29 0d 0a 23 20 20 20 d(__OS2__)..#
69140 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f define SQLITE_
69150 4f 53 5f 57 49 4e 20 30 0d 0a 23 20 20 20 20 20 OS_WIN 0..#
69160 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 define SQLITE_OS
69170 5f 55 4e 49 58 20 30 0d 0a 23 20 20 20 20 20 64 _UNIX 0..# d
69180 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 5f efine SQLITE_OS_
69190 4f 53 32 20 31 0d 0a 23 20 20 20 65 6c 73 65 0d OS2 1..# else.
691a0 0a 23 20 20 20 20 20 64 65 66 69 6e 65 20 53 51 .# define SQ
691b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 30 0d 0a 23 LITE_OS_WIN 0..#
691c0 20 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 define SQLI
691d0 54 45 5f 4f 53 5f 55 4e 49 58 20 31 0d 0a 23 20 TE_OS_UNIX 1..#
691e0 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 define SQLIT
691f0 45 5f 4f 53 5f 4f 53 32 20 30 0d 0a 23 20 20 65 E_OS_OS2 0..# e
69200 6e 64 69 66 0d 0a 23 20 65 6c 73 65 0d 0a 23 20 ndif..# else..#
69210 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f define SQLITE_O
69220 53 5f 55 4e 49 58 20 30 0d 0a 23 20 20 64 65 66 S_UNIX 0..# def
69230 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 5f 4f 53 ine SQLITE_OS_OS
69240 32 20 30 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 65 2 0..# endif..#e
69250 6c 73 65 0d 0a 23 20 69 66 6e 64 65 66 20 53 51 lse..# ifndef SQ
69260 4c 49 54 45 5f 4f 53 5f 57 49 4e 0d 0a 23 20 20 LITE_OS_WIN..#
69270 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 define SQLITE_OS
69280 5f 57 49 4e 20 30 0d 0a 23 20 65 6e 64 69 66 0d _WIN 0..# endif.
69290 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
692a0 2a 20 44 65 66 69 6e 65 20 74 68 65 20 6d 61 78 * Define the max
692b0 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 74 imum size of a t
692c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d emporary filenam
692d0 65 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 e..*/..#if SQLIT
692e0 45 5f 4f 53 5f 57 49 4e 0d 0a 23 20 69 6e 63 6c E_OS_WIN..# incl
692f0 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0d ude <windows.h>.
69300 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 .# define SQLITE
69310 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 28 _TEMPNAME_SIZE (
69320 4d 41 58 5f 50 41 54 48 2b 35 30 29 0d 0a 23 65 MAX_PATH+50)..#e
69330 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 4f 53 lif SQLITE_OS_OS
69340 32 0d 0a 23 20 69 66 20 28 5f 5f 47 4e 55 43 5f 2..# if (__GNUC_
69350 5f 20 3e 20 33 20 7c 7c 20 5f 5f 47 4e 55 43 5f _ > 3 || __GNUC_
69360 5f 20 3d 3d 20 33 20 26 26 20 5f 5f 47 4e 55 43 _ == 3 && __GNUC
69370 5f 4d 49 4e 4f 52 5f 5f 20 3e 3d 20 33 29 20 26 _MINOR__ >= 3) &
69380 26 20 64 65 66 69 6e 65 64 28 4f 53 32 5f 48 49 & defined(OS2_HI
69390 47 48 5f 4d 45 4d 4f 52 59 29 0d 0a 23 20 20 69 GH_MEMORY)..# i
693a0 6e 63 6c 75 64 65 20 3c 6f 73 32 73 61 66 65 2e nclude <os2safe.
693b0 68 3e 20 2f 2a 20 68 61 73 20 74 6f 20 62 65 20 h> /* has to be
693c0 69 6e 63 6c 75 64 65 64 20 62 65 66 6f 72 65 20 included before
693d0 6f 73 32 2e 68 20 66 6f 72 20 6c 69 6e 6b 69 6e os2.h for linkin
693e0 67 20 74 6f 20 77 6f 72 6b 20 2a 2f 0d 0a 23 20 g to work */..#
693f0 65 6e 64 69 66 0d 0a 23 20 64 65 66 69 6e 65 20 endif..# define
69400 49 4e 43 4c 5f 44 4f 53 44 41 54 45 54 49 4d 45 INCL_DOSDATETIME
69410 0d 0a 23 20 64 65 66 69 6e 65 20 49 4e 43 4c 5f ..# define INCL_
69420 44 4f 53 46 49 4c 45 4d 47 52 0d 0a 23 20 64 65 DOSFILEMGR..# de
69430 66 69 6e 65 20 49 4e 43 4c 5f 44 4f 53 45 52 52 fine INCL_DOSERR
69440 4f 52 53 0d 0a 23 20 64 65 66 69 6e 65 20 49 4e ORS..# define IN
69450 43 4c 5f 44 4f 53 4d 49 53 43 0d 0a 23 20 64 65 CL_DOSMISC..# de
69460 66 69 6e 65 20 49 4e 43 4c 5f 44 4f 53 50 52 4f fine INCL_DOSPRO
69470 43 45 53 53 0d 0a 23 20 64 65 66 69 6e 65 20 49 CESS..# define I
69480 4e 43 4c 5f 44 4f 53 4d 4f 44 55 4c 45 4d 47 52 NCL_DOSMODULEMGR
69490 0d 0a 23 20 64 65 66 69 6e 65 20 49 4e 43 4c 5f ..# define INCL_
694a0 44 4f 53 53 45 4d 41 50 48 4f 52 45 53 0d 0a 23 DOSSEMAPHORES..#
694b0 20 69 6e 63 6c 75 64 65 20 3c 6f 73 32 2e 68 3e include <os2.h>
694c0 0d 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 63 6f ..# include <uco
694d0 6e 76 2e 68 3e 0d 0a 23 20 64 65 66 69 6e 65 20 nv.h>..# define
694e0 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f SQLITE_TEMPNAME_
694f0 53 49 5a 45 20 28 43 43 48 4d 41 58 50 41 54 48 SIZE (CCHMAXPATH
69500 43 4f 4d 50 29 0d 0a 23 65 6c 73 65 0d 0a 23 20 COMP)..#else..#
69510 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 define SQLITE_TE
69520 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 32 30 30 0d MPNAME_SIZE 200.
69530 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
69540 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 77 * Determine if w
69550 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 e are dealing wi
69560 74 68 20 57 69 6e 64 6f 77 73 20 4e 54 2e 0d 0a th Windows NT...
69570 2a 2f 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 */..#if defined(
69580 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 0d 0a 23 _WIN32_WINNT)..#
69590 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f define SQLITE_O
695a0 53 5f 57 49 4e 4e 54 20 31 0d 0a 23 65 6c 73 65 S_WINNT 1..#else
695b0 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 ..# define SQLIT
695c0 45 5f 4f 53 5f 57 49 4e 4e 54 20 30 0d 0a 23 65 E_OS_WINNT 0..#e
695d0 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 ndif..../*..** D
695e0 65 74 65 72 6d 69 6e 65 20 69 66 20 77 65 20 61 etermine if we a
695f0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 re dealing with
69600 57 69 6e 64 6f 77 73 43 45 20 2d 20 77 68 69 63 WindowsCE - whic
69610 68 20 68 61 73 20 61 20 6d 75 63 68 0d 0a 2a 2a h has a much..**
69620 20 72 65 64 75 63 65 64 20 41 50 49 2e 0d 0a 2a reduced API...*
69630 2f 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f /..#if defined(_
69640 57 49 4e 33 32 5f 57 43 45 29 0d 0a 23 20 64 65 WIN32_WCE)..# de
69650 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 5f 57 fine SQLITE_OS_W
69660 49 4e 43 45 20 31 0d 0a 23 65 6c 73 65 0d 0a 23 INCE 1..#else..#
69670 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f define SQLITE_O
69680 53 5f 57 49 4e 43 45 20 30 0d 0a 23 65 6e 64 69 S_WINCE 0..#endi
69690 66 0d 0a 0d 0a 2f 2a 20 49 66 20 74 68 65 20 53 f..../* If the S
696a0 45 54 5f 46 55 4c 4c 53 59 4e 43 20 6d 61 63 72 ET_FULLSYNC macr
696b0 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 o is not defined
696c0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 6d 61 6b above, then mak
696d0 65 20 69 74 0d 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 e it..** a no-op
696e0 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 45 ..*/..#ifndef SE
696f0 54 5f 46 55 4c 4c 53 59 4e 43 0d 0a 23 20 64 65 T_FULLSYNC..# de
69700 66 69 6e 65 20 53 45 54 5f 46 55 4c 4c 53 59 4e fine SET_FULLSYN
69710 43 28 78 2c 79 29 0d 0a 23 65 6e 64 69 66 0d 0a C(x,y)..#endif..
69720 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 64 65 66 ../*..** The def
69730 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 61 20 64 ault size of a d
69740 69 73 6b 20 73 65 63 74 6f 72 0d 0a 2a 2f 0d 0a isk sector..*/..
69750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 #ifndef SQLITE_D
69760 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 EFAULT_SECTOR_SI
69770 5a 45 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c ZE..# define SQL
69780 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 ITE_DEFAULT_SECT
69790 4f 52 5f 53 49 5a 45 20 34 30 39 36 0d 0a 23 65 OR_SIZE 4096..#e
697a0 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ndif..../*..** T
697b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 emporary files a
697c0 72 65 20 6e 61 6d 65 64 20 73 74 61 72 74 69 6e re named startin
697d0 67 20 77 69 74 68 20 74 68 69 73 20 70 72 65 66 g with this pref
697e0 69 78 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 31 ix followed by 1
697f0 36 20 72 61 6e 64 6f 6d 0d 0a 2a 2a 20 61 6c 70 6 random..** alp
69800 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 hanumeric charac
69810 74 65 72 73 2c 20 61 6e 64 20 6e 6f 20 66 69 6c ters, and no fil
69820 65 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 68 65 e extension. The
69830 79 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 y are stored in
69840 74 68 65 0d 0a 2a 2a 20 4f 53 27 73 20 73 74 61 the..** OS's sta
69850 6e 64 61 72 64 20 74 65 6d 70 6f 72 61 72 79 20 ndard temporary
69860 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 2c 20 file directory,
69870 61 6e 64 20 61 72 65 20 64 65 6c 65 74 65 64 20 and are deleted
69880 70 72 69 6f 72 20 74 6f 20 65 78 69 74 2e 0d 0a prior to exit...
69890 2a 2a 20 49 66 20 73 71 6c 69 74 65 20 69 73 20 ** If sqlite is
698a0 62 65 69 6e 67 20 65 6d 62 65 64 64 65 64 20 69 being embedded i
698b0 6e 20 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 n another progra
698c0 6d 2c 20 79 6f 75 20 6d 61 79 20 77 69 73 68 20 m, you may wish
698d0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 0d 0a 2a to change the..*
698e0 2a 20 70 72 65 66 69 78 20 74 6f 20 72 65 66 6c * prefix to refl
698f0 65 63 74 20 79 6f 75 72 20 70 72 6f 67 72 61 6d ect your program
69900 27 73 20 6e 61 6d 65 2c 20 73 6f 20 74 68 61 74 's name, so that
69910 20 69 66 20 79 6f 75 72 20 70 72 6f 67 72 61 6d if your program
69920 20 65 78 69 74 73 0d 0a 2a 2a 20 70 72 65 6d 61 exits..** prema
69930 74 75 72 65 6c 79 2c 20 6f 6c 64 20 74 65 6d 70 turely, old temp
69940 6f 72 61 72 79 20 66 69 6c 65 73 20 63 61 6e 20 orary files can
69950 62 65 20 65 61 73 69 6c 79 20 69 64 65 6e 74 69 be easily identi
69960 66 69 65 64 2e 20 54 68 69 73 20 63 61 6e 20 62 fied. This can b
69970 65 20 64 6f 6e 65 0d 0a 2a 2a 20 75 73 69 6e 67 e done..** using
69980 20 2d 44 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 -DSQLITE_TEMP_F
69990 49 4c 45 5f 50 52 45 46 49 58 3d 6d 79 70 72 65 ILE_PREFIX=mypre
699a0 66 69 78 5f 20 6f 6e 20 74 68 65 20 63 6f 6d 70 fix_ on the comp
699b0 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e iler command lin
699c0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 32 30 30 36 2d e...**..** 2006-
699d0 31 30 2d 33 31 3a 20 20 54 68 65 20 64 65 66 61 10-31: The defa
699e0 75 6c 74 20 70 72 65 66 69 78 20 75 73 65 64 20 ult prefix used
699f0 74 6f 20 62 65 20 22 73 71 6c 69 74 65 5f 22 2e to be "sqlite_".
69a00 20 20 42 75 74 20 74 68 65 6e 0d 0a 2a 2a 20 4d But then..** M
69a10 63 61 66 65 65 20 73 74 61 72 74 65 64 20 75 73 cafee started us
69a20 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 20 74 68 ing SQLite in th
69a30 65 69 72 20 61 6e 74 69 2d 76 69 72 75 73 20 70 eir anti-virus p
69a40 72 6f 64 75 63 74 20 61 6e 64 20 69 74 0d 0a 2a roduct and it..*
69a50 2a 20 73 74 61 72 74 65 64 20 70 75 74 74 69 6e * started puttin
69a60 67 20 66 69 6c 65 73 20 77 69 74 68 20 74 68 65 g files with the
69a70 20 22 73 71 6c 69 74 65 22 20 6e 61 6d 65 20 69 "sqlite" name i
69a80 6e 20 74 68 65 20 63 3a 2f 74 65 6d 70 20 66 6f n the c:/temp fo
69a90 6c 64 65 72 2e 0d 0a 2a 2a 20 54 68 69 73 20 61 lder...** This a
69aa0 6e 6e 6f 79 65 64 20 6d 61 6e 79 20 77 69 6e 64 nnoyed many wind
69ab0 6f 77 73 20 75 73 65 72 73 2e 20 20 54 68 6f 73 ows users. Thos
69ac0 65 20 75 73 65 72 73 20 77 6f 75 6c 64 20 74 68 e users would th
69ad0 65 6e 20 64 6f 20 61 20 0d 0a 2a 2a 20 47 6f 6f en do a ..** Goo
69ae0 67 6c 65 20 73 65 61 72 63 68 20 66 6f 72 20 22 gle search for "
69af0 73 71 6c 69 74 65 22 2c 20 66 69 6e 64 20 74 68 sqlite", find th
69b00 65 20 74 65 6c 65 70 68 6f 6e 65 20 6e 75 6d 62 e telephone numb
69b10 65 72 73 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 64 ers of the..** d
69b20 65 76 65 6c 6f 70 65 72 73 20 61 6e 64 20 63 61 evelopers and ca
69b30 6c 6c 20 74 6f 20 77 61 6b 65 20 74 68 65 6d 20 ll to wake them
69b40 75 70 20 61 74 20 6e 69 67 68 74 20 61 6e 64 20 up at night and
69b50 63 6f 6d 70 6c 61 69 6e 2e 0d 0a 2a 2a 20 46 6f complain...** Fo
69b60 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 r this reason, t
69b70 68 65 20 64 65 66 61 75 6c 74 20 6e 61 6d 65 20 he default name
69b80 70 72 65 66 69 78 20 69 73 20 63 68 61 6e 67 65 prefix is change
69b90 64 20 74 6f 20 62 65 20 22 73 71 6c 69 74 65 22 d to be "sqlite"
69ba0 20 0d 0a 2a 2a 20 73 70 65 6c 6c 65 64 20 62 61 ..** spelled ba
69bb0 63 6b 77 61 72 64 73 2e 20 20 53 6f 20 74 68 65 ckwards. So the
69bc0 20 74 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 temp files are
69bd0 73 74 69 6c 6c 20 69 64 65 6e 74 69 66 69 65 64 still identified
69be0 2c 20 62 75 74 0d 0a 2a 2a 20 61 6e 79 62 6f 64 , but..** anybod
69bf0 79 20 73 6d 61 72 74 20 65 6e 6f 75 67 68 20 74 y smart enough t
69c00 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 o figure out the
69c10 20 63 6f 64 65 20 69 73 20 61 6c 73 6f 20 6c 69 code is also li
69c20 6b 65 6c 79 20 73 6d 61 72 74 0d 0a 2a 2a 20 65 kely smart..** e
69c30 6e 6f 75 67 68 20 74 6f 20 6b 6e 6f 77 20 74 68 nough to know th
69c40 61 74 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 64 at calling the d
69c50 65 76 65 6c 6f 70 65 72 20 77 69 6c 6c 20 6e 6f eveloper will no
69c60 74 20 68 65 6c 70 20 67 65 74 20 72 69 64 0d 0a t help get rid..
69c70 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0d ** of the file..
69c80 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
69c90 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 ITE_TEMP_FILE_PR
69ca0 45 46 49 58 0d 0a 23 20 64 65 66 69 6e 65 20 53 EFIX..# define S
69cb0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f QLITE_TEMP_FILE_
69cc0 50 52 45 46 49 58 20 22 65 74 69 6c 71 73 5f 22 PREFIX "etilqs_"
69cd0 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
69ce0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
69cf0 20 76 61 6c 75 65 73 20 6d 61 79 20 62 65 20 70 values may be p
69d00 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 assed as the sec
69d10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 0d ond argument to.
69d20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 .** sqlite3OsLoc
69d30 6b 28 29 2e 20 54 68 65 20 76 61 72 69 6f 75 73 k(). The various
69d40 20 6c 6f 63 6b 73 20 65 78 68 69 62 69 74 20 74 locks exhibit t
69d50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 6d he following sem
69d60 61 6e 74 69 63 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 antics:..**..**
69d70 53 48 41 52 45 44 3a 20 20 20 20 41 6e 79 20 6e SHARED: Any n
69d80 75 6d 62 65 72 20 6f 66 20 70 72 6f 63 65 73 73 umber of process
69d90 65 73 20 6d 61 79 20 68 6f 6c 64 20 61 20 53 48 es may hold a SH
69da0 41 52 45 44 20 6c 6f 63 6b 20 73 69 6d 75 6c 74 ARED lock simult
69db0 61 6e 65 6f 75 73 6c 79 2e 0d 0a 2a 2a 20 52 45 aneously...** RE
69dc0 53 45 52 56 45 44 3a 20 20 41 20 73 69 6e 67 6c SERVED: A singl
69dd0 65 20 70 72 6f 63 65 73 73 20 6d 61 79 20 68 6f e process may ho
69de0 6c 64 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f ld a RESERVED lo
69df0 63 6b 20 6f 6e 20 61 20 66 69 6c 65 20 61 74 0d ck on a file at.
69e00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 61 .** a
69e10 6e 79 20 74 69 6d 65 2e 20 4f 74 68 65 72 20 70 ny time. Other p
69e20 72 6f 63 65 73 73 65 73 20 6d 61 79 20 68 6f 6c rocesses may hol
69e30 64 20 61 6e 64 20 6f 62 74 61 69 6e 20 6e 65 77 d and obtain new
69e40 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2e 0d 0a SHARED locks...
69e50 2a 2a 20 50 45 4e 44 49 4e 47 3a 20 20 20 41 20 ** PENDING: A
69e60 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 6d single process m
69e70 61 79 20 68 6f 6c 64 20 61 20 50 45 4e 44 49 4e ay hold a PENDIN
69e80 47 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 G lock on a file
69e90 20 61 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 at..**
69ea0 20 20 20 61 6e 79 20 6f 6e 65 20 74 69 6d 65 2e any one time.
69eb0 20 45 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 Existing SHARED
69ec0 20 6c 6f 63 6b 73 20 6d 61 79 20 70 65 72 73 69 locks may persi
69ed0 73 74 2c 20 62 75 74 20 6e 6f 20 6e 65 77 0d 0a st, but no new..
69ee0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 53 48 ** SH
69ef0 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 62 ARED locks may b
69f00 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 6f 74 e obtained by ot
69f10 68 65 72 20 70 72 6f 63 65 73 73 65 73 2e 0d 0a her processes...
69f20 2a 2a 20 45 58 43 4c 55 53 49 56 45 3a 20 41 6e ** EXCLUSIVE: An
69f30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 EXCLUSIVE lock
69f40 70 72 65 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 precludes all ot
69f50 68 65 72 20 6c 6f 63 6b 73 2e 0d 0a 2a 2a 0d 0a her locks...**..
69f60 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 ** PENDING_LOCK
69f70 6d 61 79 20 6e 6f 74 20 62 65 20 70 61 73 73 65 may not be passe
69f80 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 73 71 d directly to sq
69f90 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 lite3OsLock(). I
69fa0 6e 73 74 65 61 64 2c 20 61 0d 0a 2a 2a 20 70 72 nstead, a..** pr
69fb0 6f 63 65 73 73 20 74 68 61 74 20 72 65 71 75 65 ocess that reque
69fc0 73 74 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 sts an EXCLUSIVE
69fd0 20 6c 6f 63 6b 20 6d 61 79 20 61 63 74 75 61 6c lock may actual
69fe0 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 ly obtain a PEND
69ff0 49 4e 47 0d 0a 2a 2a 20 6c 6f 63 6b 2e 20 54 68 ING..** lock. Th
6a000 69 73 20 63 61 6e 20 62 65 20 75 70 67 72 61 64 is can be upgrad
6a010 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 ed to an EXCLUSI
6a020 56 45 20 6c 6f 63 6b 20 62 79 20 61 20 73 75 62 VE lock by a sub
6a030 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0d sequent call to.
6a040 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 .** sqlite3OsLoc
6a050 6b 28 29 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e k()...*/..#defin
6a060 65 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 e NO_LOCK
6a070 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 53 48 41 0..#define SHA
6a080 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 31 0d 0a RED_LOCK 1..
6a090 23 64 65 66 69 6e 65 20 52 45 53 45 52 56 45 44 #define RESERVED
6a0a0 5f 4c 4f 43 4b 20 20 20 32 0d 0a 23 64 65 66 69 _LOCK 2..#defi
6a0b0 6e 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 ne PENDING_LOCK
6a0c0 20 20 20 33 0d 0a 23 64 65 66 69 6e 65 20 45 58 3..#define EX
6a0d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 34 0d CLUSIVE_LOCK 4.
6a0e0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6c 65 20 4c .../*..** File L
6a0f0 6f 63 6b 69 6e 67 20 4e 6f 74 65 73 3a 20 20 28 ocking Notes: (
6a100 4d 6f 73 74 6c 79 20 61 62 6f 75 74 20 77 69 6e Mostly about win
6a110 64 6f 77 73 20 62 75 74 20 61 6c 73 6f 20 73 6f dows but also so
6a120 6d 65 20 69 6e 66 6f 20 66 6f 72 20 55 6e 69 78 me info for Unix
6a130 29 0d 0a 2a 2a 0d 0a 2a 2a 20 57 65 20 63 61 6e )..**..** We can
6a140 6e 6f 74 20 75 73 65 20 4c 6f 63 6b 46 69 6c 65 not use LockFile
6a150 45 78 28 29 20 6f 72 20 55 6e 6c 6f 63 6b 46 69 Ex() or UnlockFi
6a160 6c 65 45 78 28 29 20 6f 6e 20 57 69 6e 39 35 2f leEx() on Win95/
6a170 39 38 2f 4d 45 20 62 65 63 61 75 73 65 0d 0a 2a 98/ME because..*
6a180 2a 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e * those function
6a190 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 s are not availa
6a1a0 62 6c 65 2e 20 20 53 6f 20 77 65 20 75 73 65 20 ble. So we use
6a1b0 6f 6e 6c 79 20 4c 6f 63 6b 46 69 6c 65 28 29 20 only LockFile()
6a1c0 61 6e 64 0d 0a 2a 2a 20 55 6e 6c 6f 63 6b 46 69 and..** UnlockFi
6a1d0 6c 65 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4c 6f le()...**..** Lo
6a1e0 63 6b 46 69 6c 65 28 29 20 70 72 65 76 65 6e 74 ckFile() prevent
6a1f0 73 20 6e 6f 74 20 6a 75 73 74 20 77 72 69 74 69 s not just writi
6a200 6e 67 20 62 75 74 20 61 6c 73 6f 20 72 65 61 64 ng but also read
6a210 69 6e 67 20 62 79 20 6f 74 68 65 72 20 70 72 6f ing by other pro
6a220 63 65 73 73 65 73 2e 0d 0a 2a 2a 20 41 20 53 48 cesses...** A SH
6a230 41 52 45 44 5f 4c 4f 43 4b 20 69 73 20 6f 62 74 ARED_LOCK is obt
6a240 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 ained by locking
6a250 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d a single random
6a260 6c 79 2d 63 68 6f 73 65 6e 20 0d 0a 2a 2a 20 62 ly-chosen ..** b
6a270 79 74 65 20 6f 75 74 20 6f 66 20 61 20 73 70 65 yte out of a spe
6a280 63 69 66 69 63 20 72 61 6e 67 65 20 6f 66 20 62 cific range of b
6a290 79 74 65 73 2e 20 54 68 65 20 6c 6f 63 6b 20 62 ytes. The lock b
6a2a0 79 74 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 yte is obtained
6a2b0 61 74 20 0d 0a 2a 2a 20 72 61 6e 64 6f 6d 20 73 at ..** random s
6a2c0 6f 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 o two separate r
6a2d0 65 61 64 65 72 73 20 63 61 6e 20 70 72 6f 62 61 eaders can proba
6a2e0 62 6c 79 20 61 63 63 65 73 73 20 74 68 65 20 66 bly access the f
6a2f0 69 6c 65 20 61 74 20 74 68 65 20 0d 0a 2a 2a 20 ile at the ..**
6a300 73 61 6d 65 20 74 69 6d 65 2c 20 75 6e 6c 65 73 same time, unles
6a310 73 20 74 68 65 79 20 61 72 65 20 75 6e 6c 75 63 s they are unluc
6a320 6b 79 20 61 6e 64 20 63 68 6f 6f 73 65 20 74 68 ky and choose th
6a330 65 20 73 61 6d 65 20 6c 6f 63 6b 20 62 79 74 65 e same lock byte
6a340 2e 0d 0a 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 ...** An EXCLUSI
6a350 56 45 5f 4c 4f 43 4b 20 69 73 20 6f 62 74 61 69 VE_LOCK is obtai
6a360 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 61 ned by locking a
6a370 6c 6c 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 ll bytes in the
6a380 72 61 6e 67 65 2e 0d 0a 2a 2a 20 54 68 65 72 65 range...** There
6a390 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f 6e 65 can only be one
6a3a0 20 77 72 69 74 65 72 2e 20 20 41 20 52 45 53 45 writer. A RESE
6a3b0 52 56 45 44 5f 4c 4f 43 4b 20 69 73 20 6f 62 74 RVED_LOCK is obt
6a3c0 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 ained by locking
6a3d0 0d 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 62 79 ..** a single by
6a3e0 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 te of the file t
6a3f0 68 61 74 20 69 73 20 64 65 73 69 67 6e 61 74 65 hat is designate
6a400 64 20 61 73 20 74 68 65 20 72 65 73 65 72 76 65 d as the reserve
6a410 64 20 6c 6f 63 6b 20 62 79 74 65 2e 0d 0a 2a 2a d lock byte...**
6a420 20 41 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 A PENDING_LOCK
6a430 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 6c is obtained by l
6a440 6f 63 6b 69 6e 67 20 61 20 64 65 73 69 67 6e 61 ocking a designa
6a450 74 65 64 20 62 79 74 65 20 64 69 66 66 65 72 65 ted byte differe
6a460 6e 74 20 66 72 6f 6d 0d 0a 2a 2a 20 74 68 65 20 nt from..** the
6a470 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 62 79 RESERVED_LOCK by
6a480 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6e 20 57 te...**..** On W
6a490 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 79 73 74 65 inNT/2K/XP syste
6a4a0 6d 73 2c 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 ms, LockFileEx()
6a4b0 20 61 6e 64 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 and UnlockFileE
6a4c0 78 28 29 20 61 72 65 20 61 76 61 69 6c 61 62 6c x() are availabl
6a4d0 65 2c 0d 0a 2a 2a 20 77 68 69 63 68 20 6d 65 61 e,..** which mea
6a4e0 6e 73 20 77 65 20 63 61 6e 20 75 73 65 20 72 65 ns we can use re
6a4f0 61 64 65 72 2f 77 72 69 74 65 72 20 6c 6f 63 6b ader/writer lock
6a500 73 2e 20 20 57 68 65 6e 20 72 65 61 64 65 72 2f s. When reader/
6a510 77 72 69 74 65 72 20 6c 6f 63 6b 73 0d 0a 2a 2a writer locks..**
6a520 20 61 72 65 20 75 73 65 64 2c 20 74 68 65 20 6c are used, the l
6a530 6f 63 6b 20 69 73 20 70 6c 61 63 65 64 20 6f 6e ock is placed on
6a540 20 74 68 65 20 73 61 6d 65 20 72 61 6e 67 65 20 the same range
6a550 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 69 73 of bytes that is
6a560 20 75 73 65 64 0d 0a 2a 2a 20 66 6f 72 20 70 72 used..** for pr
6a570 6f 62 61 62 69 6c 69 73 74 69 63 20 6c 6f 63 6b obabilistic lock
6a580 69 6e 67 20 69 6e 20 57 69 6e 39 35 2f 39 38 2f ing in Win95/98/
6a590 4d 45 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 ME. Hence, the
6a5a0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 0d 0a locking scheme..
6a5b0 2a 2a 20 77 69 6c 6c 20 73 75 70 70 6f 72 74 20 ** will support
6a5c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 57 69 6e 39 two or more Win9
6a5d0 35 20 72 65 61 64 65 72 73 20 6f 72 20 74 77 6f 5 readers or two
6a5e0 20 6f 72 20 6d 6f 72 65 20 57 69 6e 4e 54 20 72 or more WinNT r
6a5f0 65 61 64 65 72 73 2e 0d 0a 2a 2a 20 42 75 74 20 eaders...** But
6a600 61 20 73 69 6e 67 6c 65 20 57 69 6e 39 35 20 72 a single Win95 r
6a610 65 61 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 eader will lock
6a620 6f 75 74 20 61 6c 6c 20 57 69 6e 4e 54 20 72 65 out all WinNT re
6a630 61 64 65 72 73 20 61 6e 64 20 61 20 73 69 6e 67 aders and a sing
6a640 6c 65 0d 0a 2a 2a 20 57 69 6e 4e 54 20 72 65 61 le..** WinNT rea
6a650 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f 75 der will lock ou
6a660 74 20 61 6c 6c 20 6f 74 68 65 72 20 57 69 6e 39 t all other Win9
6a670 35 20 72 65 61 64 65 72 73 2e 0d 0a 2a 2a 0d 0a 5 readers...**..
6a680 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
6a690 20 23 64 65 66 69 6e 65 73 20 73 70 65 63 69 66 #defines specif
6a6a0 79 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62 y the range of b
6a6b0 79 74 65 73 20 75 73 65 64 20 66 6f 72 20 6c 6f ytes used for lo
6a6c0 63 6b 69 6e 67 2e 0d 0a 2a 2a 20 53 48 41 52 45 cking...** SHARE
6a6d0 44 5f 53 49 5a 45 20 69 73 20 74 68 65 20 6e 75 D_SIZE is the nu
6a6e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 76 mber of bytes av
6a6f0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 70 ailable in the p
6a700 6f 6f 6c 20 66 72 6f 6d 20 77 68 69 63 68 0d 0a ool from which..
6a710 2a 2a 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 ** a random byte
6a720 20 69 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 is selected for
6a730 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 a shared lock.
6a740 20 54 68 65 20 70 6f 6f 6c 20 6f 66 20 62 79 74 The pool of byt
6a750 65 73 20 66 6f 72 0d 0a 2a 2a 20 73 68 61 72 65 es for..** share
6a760 64 20 6c 6f 63 6b 73 20 62 65 67 69 6e 73 20 61 d locks begins a
6a770 74 20 53 48 41 52 45 44 5f 46 49 52 53 54 2e 20 t SHARED_FIRST.
6a780 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 61 6d ..**..** The sam
6a790 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 e locking strate
6a7a0 67 79 20 61 6e 64 0d 0a 2a 2a 20 62 79 74 65 20 gy and..** byte
6a7b0 72 61 6e 67 65 73 20 61 72 65 20 75 73 65 64 20 ranges are used
6a7c0 66 6f 72 20 55 6e 69 78 2e 20 20 54 68 69 73 20 for Unix. This
6a7d0 6c 65 61 76 65 73 20 6f 70 65 6e 20 74 68 65 20 leaves open the
6a7e0 70 6f 73 73 69 62 6c 69 74 79 20 6f 66 20 68 61 possiblity of ha
6a7f0 76 69 6e 67 0d 0a 2a 2a 20 63 6c 69 65 6e 74 73 ving..** clients
6a800 20 6f 6e 20 77 69 6e 39 35 2c 20 77 69 6e 4e 54 on win95, winNT
6a810 2c 20 61 6e 64 20 75 6e 69 78 20 61 6c 6c 20 74 , and unix all t
6a820 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 61 alking to the sa
6a830 6d 65 20 73 68 61 72 65 64 20 66 69 6c 65 0d 0a me shared file..
6a840 2a 2a 20 61 6e 64 20 61 6c 6c 20 6c 6f 63 6b 69 ** and all locki
6a850 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 54 ng correctly. T
6a860 6f 20 64 6f 20 73 6f 20 77 6f 75 6c 64 20 72 65 o do so would re
6a870 71 75 69 72 65 20 74 68 61 74 20 73 61 6d 62 61 quire that samba
6a880 20 28 6f 72 20 77 68 61 74 65 76 65 72 0d 0a 2a (or whatever..*
6a890 2a 20 74 6f 6f 6c 20 69 73 20 62 65 69 6e 67 20 * tool is being
6a8a0 75 73 65 64 20 66 6f 72 20 66 69 6c 65 20 73 68 used for file sh
6a8b0 61 72 69 6e 67 29 20 69 6d 70 6c 65 6d 65 6e 74 aring) implement
6a8c0 73 20 6c 6f 63 6b 73 20 63 6f 72 72 65 63 74 6c s locks correctl
6a8d0 79 20 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 77 69 y between..** wi
6a8e0 6e 64 6f 77 73 20 61 6e 64 20 75 6e 69 78 2e 20 ndows and unix.
6a8f0 20 49 27 6d 20 67 75 65 73 73 69 6e 67 20 74 68 I'm guessing th
6a900 61 74 20 69 73 6e 27 74 20 6c 69 6b 65 6c 79 20 at isn't likely
6a910 74 6f 20 68 61 70 70 65 6e 2c 20 62 75 74 20 62 to happen, but b
6a920 79 0d 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 y..** using the
6a930 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e same locking ran
6a940 67 65 20 77 65 20 61 72 65 20 61 74 20 6c 65 61 ge we are at lea
6a950 73 74 20 6f 70 65 6e 20 74 6f 20 74 68 65 20 70 st open to the p
6a960 6f 73 73 69 62 69 6c 69 74 79 2e 0d 0a 2a 2a 0d ossibility...**.
6a970 0a 2a 2a 20 4c 6f 63 6b 69 6e 67 20 69 6e 20 77 .** Locking in w
6a980 69 6e 64 6f 77 73 20 69 73 20 6d 61 6e 64 69 74 indows is mandit
6a990 6f 72 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 ory. For this r
6a9a0 65 61 73 6f 6e 2c 20 77 65 20 63 61 6e 6e 6f 74 eason, we cannot
6a9b0 20 73 74 6f 72 65 0d 0a 2a 2a 20 61 63 74 75 61 store..** actua
6a9c0 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 62 79 l data in the by
6a9d0 74 65 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 tes used for loc
6a9e0 6b 69 6e 67 2e 20 20 54 68 65 20 70 61 67 65 72 king. The pager
6a9f0 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 73 never allocates
6aa00 0d 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 69 ..** the pages i
6aa10 6e 76 6f 6c 76 65 64 20 69 6e 20 6c 6f 63 6b 69 nvolved in locki
6aa20 6e 67 20 74 68 65 72 65 66 6f 72 65 2e 20 20 53 ng therefore. S
6aa30 48 41 52 45 44 5f 53 49 5a 45 20 69 73 20 73 65 HARED_SIZE is se
6aa40 6c 65 63 74 65 64 20 73 6f 0d 0a 2a 2a 20 74 68 lected so..** th
6aa50 61 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 77 69 6c at all locks wil
6aa60 6c 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c l fit on a singl
6aa70 65 20 70 61 67 65 20 65 76 65 6e 20 61 74 20 74 e page even at t
6aa80 68 65 20 6d 69 6e 69 6d 75 6d 20 70 61 67 65 20 he minimum page
6aa90 73 69 7a 65 2e 0d 0a 2a 2a 20 50 45 4e 44 49 4e size...** PENDIN
6aaa0 47 5f 42 59 54 45 20 64 65 66 69 6e 65 73 20 74 G_BYTE defines t
6aab0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 he beginning of
6aac0 74 68 65 20 6c 6f 63 6b 73 2e 20 20 42 79 20 64 the locks. By d
6aad0 65 66 61 75 6c 74 20 50 45 4e 44 49 4e 47 5f 42 efault PENDING_B
6aae0 59 54 45 0d 0a 2a 2a 20 69 73 20 73 65 74 20 68 YTE..** is set h
6aaf0 69 67 68 20 73 6f 20 74 68 61 74 20 77 65 20 64 igh so that we d
6ab00 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 61 6c 6c on't have to all
6ab10 6f 63 61 74 65 20 61 6e 20 75 6e 75 73 65 64 20 ocate an unused
6ab20 70 61 67 65 20 65 78 63 65 70 74 0d 0a 2a 2a 20 page except..**
6ab30 66 6f 72 20 76 65 72 79 20 6c 61 72 67 65 20 64 for very large d
6ab40 61 74 61 62 61 73 65 73 2e 20 20 42 75 74 20 6f atabases. But o
6ab50 6e 65 20 73 68 6f 75 6c 64 20 74 65 73 74 20 74 ne should test t
6ab60 68 65 20 70 61 67 65 20 73 6b 69 70 70 69 6e 67 he page skipping
6ab70 20 6c 6f 67 69 63 20 0d 0a 2a 2a 20 62 79 20 73 logic ..** by s
6ab80 65 74 74 69 6e 67 20 50 45 4e 44 49 4e 47 5f 42 etting PENDING_B
6ab90 59 54 45 20 6c 6f 77 20 61 6e 64 20 72 75 6e 6e YTE low and runn
6aba0 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 72 ing the entire r
6abb0 65 67 72 65 73 73 69 6f 6e 20 73 75 69 74 65 2e egression suite.
6abc0 0d 0a 2a 2a 0d 0a 2a 2a 20 43 68 61 6e 67 69 6e ..**..** Changin
6abd0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 g the value of P
6abe0 45 4e 44 49 4e 47 5f 42 59 54 45 20 72 65 73 75 ENDING_BYTE resu
6abf0 6c 74 73 20 69 6e 20 61 20 73 75 62 74 6c 79 20 lts in a subtly
6ac00 69 6e 63 6f 6d 70 61 74 69 62 6c 65 0d 0a 2a 2a incompatible..**
6ac10 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 44 file format. D
6ac20 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20 epending on how
6ac30 69 74 20 69 73 20 63 68 61 6e 67 65 64 2c 20 79 it is changed, y
6ac40 6f 75 20 6d 69 67 68 74 20 6e 6f 74 20 6e 6f 74 ou might not not
6ac50 69 63 65 0d 0a 2a 2a 20 74 68 65 20 69 6e 63 6f ice..** the inco
6ac60 6d 70 61 74 69 62 69 6c 69 74 79 20 72 69 67 68 mpatibility righ
6ac70 74 20 61 77 61 79 2c 20 65 76 65 6e 20 72 75 6e t away, even run
6ac80 6e 69 6e 67 20 61 20 66 75 6c 6c 20 72 65 67 72 ning a full regr
6ac90 65 73 73 69 6f 6e 20 74 65 73 74 2e 0d 0a 2a 2a ession test...**
6aca0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 The default loc
6acb0 61 74 69 6f 6e 20 6f 66 20 50 45 4e 44 49 4e 47 ation of PENDING
6acc0 5f 42 59 54 45 20 69 73 20 74 68 65 20 66 69 72 _BYTE is the fir
6acd0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 st byte past the
6ace0 0d 0a 2a 2a 20 31 47 42 20 62 6f 75 6e 64 61 72 ..** 1GB boundar
6acf0 79 2e 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 23 69 66 64 y...**..*/..#ifd
6ad00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 ef SQLITE_OMIT_W
6ad10 53 44 0d 0a 23 20 64 65 66 69 6e 65 20 50 45 4e SD..# define PEN
6ad20 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 28 30 DING_BYTE (0
6ad30 78 34 30 30 30 30 30 30 30 29 0d 0a 23 65 6c 73 x40000000)..#els
6ad40 65 0d 0a 23 20 64 65 66 69 6e 65 20 50 45 4e 44 e..# define PEND
6ad50 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 73 71 ING_BYTE sq
6ad60 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 lite3PendingByte
6ad70 0d 0a 23 65 6e 64 69 66 0d 0a 23 64 65 66 69 6e ..#endif..#defin
6ad80 65 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 e RESERVED_BYTE
6ad90 20 20 20 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 (PENDING_BYT
6ada0 45 2b 31 29 0d 0a 23 64 65 66 69 6e 65 20 53 48 E+1)..#define SH
6adb0 41 52 45 44 5f 46 49 52 53 54 20 20 20 20 20 20 ARED_FIRST
6adc0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 32 29 (PENDING_BYTE+2)
6add0 0d 0a 23 64 65 66 69 6e 65 20 53 48 41 52 45 44 ..#define SHARED
6ade0 5f 53 49 5a 45 20 20 20 20 20 20 20 35 31 30 0d _SIZE 510.
6adf0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 61 70 70 65 .../*..** Wrappe
6ae00 72 20 61 72 6f 75 6e 64 20 4f 53 20 73 70 65 63 r around OS spec
6ae10 69 66 69 63 20 73 71 6c 69 74 65 33 5f 6f 73 5f ific sqlite3_os_
6ae20 69 6e 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e init() function.
6ae30 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
6ae40 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
6ae50 4f 73 49 6e 69 74 28 76 6f 69 64 29 3b 0d 0a 0d OsInit(void);...
6ae60 0a 2f 2a 20 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f ./* ..** Functio
6ae70 6e 73 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 ns for accessing
6ae80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 sqlite3_file me
6ae90 74 68 6f 64 73 20 0d 0a 2a 2f 0d 0a 53 51 4c 49 thods ..*/..SQLI
6aea0 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
6aeb0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 73 71 qlite3OsClose(sq
6aec0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0d 0a 53 lite3_file*);..S
6aed0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
6aee0 74 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 t sqlite3OsRead(
6aef0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 sqlite3_file*, v
6af00 6f 69 64 2a 2c 20 69 6e 74 20 61 6d 74 2c 20 69 oid*, int amt, i
6af10 36 34 20 6f 66 66 73 65 74 29 3b 0d 0a 53 51 4c 64 offset);..SQL
6af20 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
6af30 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 73 sqlite3OsWrite(s
6af40 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 63 6f qlite3_file*, co
6af50 6e 73 74 20 76 6f 69 64 2a 2c 20 69 6e 74 20 61 nst void*, int a
6af60 6d 74 2c 20 69 36 34 20 6f 66 66 73 65 74 29 3b mt, i64 offset);
6af70 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
6af80 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72 int sqlite3OsTr
6af90 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 uncate(sqlite3_f
6afa0 69 6c 65 2a 2c 20 69 36 34 20 73 69 7a 65 29 3b ile*, i64 size);
6afb0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
6afc0 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79 int sqlite3OsSy
6afd0 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a nc(sqlite3_file*
6afe0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
6aff0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
6b000 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 73 71 te3OsFileSize(sq
6b010 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 36 34 lite3_file*, i64
6b020 20 2a 70 53 69 7a 65 29 3b 0d 0a 53 51 4c 49 54 *pSize);..SQLIT
6b030 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
6b040 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 73 71 6c 69 lite3OsLock(sqli
6b050 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b te3_file*, int);
6b060 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
6b070 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 55 6e int sqlite3OsUn
6b080 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c lock(sqlite3_fil
6b090 65 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 e*, int);..SQLIT
6b0a0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
6b0b0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 lite3OsCheckRese
6b0c0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 rvedLock(sqlite3
6b0d0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a _file *id, int *
6b0e0 70 52 65 73 4f 75 74 29 3b 0d 0a 53 51 4c 49 54 pResOut);..SQLIT
6b0f0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
6b100 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 lite3OsFileContr
6b110 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a ol(sqlite3_file*
6b120 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0d 0a 53 51 ,int,void*);..SQ
6b130 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
6b140 64 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 d sqlite3OsFileC
6b150 6f 6e 74 72 6f 6c 48 69 6e 74 28 73 71 6c 69 74 ontrolHint(sqlit
6b160 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 e3_file*,int,voi
6b170 64 2a 29 3b 0d 0a 23 64 65 66 69 6e 65 20 53 51 d*);..#define SQ
6b180 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e LITE_FCNTL_DB_UN
6b190 43 48 41 4e 47 45 44 20 30 78 63 61 30 39 33 66 CHANGED 0xca093f
6b1a0 61 30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 a0..SQLITE_PRIVA
6b1b0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 TE int sqlite3Os
6b1c0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 SectorSize(sqlit
6b1d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 3b 0d 0a 53 e3_file *id);..S
6b1e0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
6b1f0 74 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 t sqlite3OsDevic
6b200 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 eCharacteristics
6b210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
6b220 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 d);..SQLITE_PRIV
6b230 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f ATE int sqlite3O
6b240 73 53 68 6d 4d 61 70 28 73 71 6c 69 74 65 33 5f sShmMap(sqlite3_
6b250 66 69 6c 65 20 2a 2c 69 6e 74 2c 69 6e 74 2c 69 file *,int,int,i
6b260 6e 74 2c 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 nt,void volatile
6b270 20 2a 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 **);..SQLITE_PR
6b280 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
6b290 33 4f 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 3OsShmLock(sqlit
6b2a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 e3_file *id, int
6b2b0 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 , int, int);..SQ
6b2c0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
6b2d0 64 20 73 71 6c 69 74 65 33 4f 73 53 68 6d 42 61 d sqlite3OsShmBa
6b2e0 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69 rrier(sqlite3_fi
6b2f0 6c 65 20 2a 69 64 29 3b 0d 0a 53 51 4c 49 54 45 le *id);..SQLITE
6b300 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
6b310 69 74 65 33 4f 73 53 68 6d 55 6e 6d 61 70 28 73 ite3OsShmUnmap(s
6b320 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c qlite3_file *id,
6b330 20 69 6e 74 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 20 0d int);....../* .
6b340 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 6f .** Functions fo
6b350 72 20 61 63 63 65 73 73 69 6e 67 20 73 71 6c 69 r accessing sqli
6b360 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 te3_vfs methods
6b370 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
6b380 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
6b390 4f 73 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 OsOpen(sqlite3_v
6b3a0 66 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 fs *, const char
6b3b0 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 *, sqlite3_file
6b3c0 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b 0d *, int, int *);.
6b3d0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
6b3e0 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 44 65 6c int sqlite3OsDel
6b3f0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 ete(sqlite3_vfs
6b400 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c *, const char *,
6b410 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
6b420 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
6b430 65 33 4f 73 41 63 63 65 73 73 28 73 71 6c 69 74 e3OsAccess(sqlit
6b440 65 33 5f 76 66 73 20 2a 2c 20 63 6f 6e 73 74 20 e3_vfs *, const
6b450 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 char *, int, int
6b460 20 2a 70 52 65 73 4f 75 74 29 3b 0d 0a 53 51 4c *pResOut);..SQL
6b470 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
6b480 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 sqlite3OsFullPat
6b490 68 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 hname(sqlite3_vf
6b4a0 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 s *, const char
6b4b0 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b *, int, char *);
6b4c0 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
6b4d0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e _OMIT_LOAD_EXTEN
6b4e0 53 49 4f 4e 0d 0a 53 51 4c 49 54 45 5f 50 52 49 SION..SQLITE_PRI
6b4f0 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 VATE void *sqlit
6b500 65 33 4f 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 e3OsDlOpen(sqlit
6b510 65 33 5f 76 66 73 20 2a 2c 20 63 6f 6e 73 74 20 e3_vfs *, const
6b520 63 68 61 72 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 char *);..SQLITE
6b530 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
6b540 6c 69 74 65 33 4f 73 44 6c 45 72 72 6f 72 28 73 lite3OsDlError(s
6b550 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 69 6e qlite3_vfs *, in
6b560 74 2c 20 63 68 61 72 20 2a 29 3b 0d 0a 53 51 4c t, char *);..SQL
6b570 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
6b580 20 28 2a 73 71 6c 69 74 65 33 4f 73 44 6c 53 79 (*sqlite3OsDlSy
6b590 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c m(sqlite3_vfs *,
6b5a0 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20 63 void *, const c
6b5b0 68 61 72 20 2a 29 29 28 76 6f 69 64 29 3b 0d 0a har *))(void);..
6b5c0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
6b5d0 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 44 6c 43 oid sqlite3OsDlC
6b5e0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 lose(sqlite3_vfs
6b5f0 20 2a 2c 20 76 6f 69 64 20 2a 29 3b 0d 0a 23 65 *, void *);..#e
6b600 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
6b610 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 MIT_LOAD_EXTENSI
6b620 4f 4e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ON */..SQLITE_PR
6b630 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
6b640 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 3OsRandomness(sq
6b650 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 69 6e 74 lite3_vfs *, int
6b660 2c 20 63 68 61 72 20 2a 29 3b 0d 0a 53 51 4c 49 , char *);..SQLI
6b670 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
6b680 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 73 71 qlite3OsSleep(sq
6b690 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 69 6e 74 lite3_vfs *, int
6b6a0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
6b6b0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 TE int sqlite3Os
6b6c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 CurrentTimeInt64
6b6d0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 (sqlite3_vfs *,
6b6e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 3b sqlite3_int64*);
6b6f0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 ..../*..** Conve
6b700 6e 69 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 73 nience functions
6b710 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 6e 64 for opening and
6b720 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 75 closing files u
6b730 73 69 6e 67 20 0d 0a 2a 2a 20 73 71 6c 69 74 65 sing ..** sqlite
6b740 33 5f 6d 61 6c 6c 6f 63 28 29 20 74 6f 20 6f 62 3_malloc() to ob
6b750 74 61 69 6e 20 73 70 61 63 65 20 66 6f 72 20 74 tain space for t
6b760 68 65 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 73 he file-handle s
6b770 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 53 tructure...*/..S
6b780 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
6b790 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d t sqlite3OsOpenM
6b7a0 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 76 66 alloc(sqlite3_vf
6b7b0 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 s *, const char
6b7c0 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 *, sqlite3_file
6b7d0 2a 2a 2c 20 69 6e 74 2c 69 6e 74 2a 29 3b 0d 0a **, int,int*);..
6b7e0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
6b7f0 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 nt sqlite3OsClos
6b800 65 46 72 65 65 28 73 71 6c 69 74 65 33 5f 66 69 eFree(sqlite3_fi
6b810 6c 65 20 2a 29 3b 0d 0a 0d 0a 23 65 6e 64 69 66 le *);....#endif
6b820 20 2f 2a 20 5f 53 51 4c 49 54 45 5f 4f 53 5f 48 /* _SQLITE_OS_H
6b830 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a _ */..../*******
6b840 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6f ******* End of o
6b850 73 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a s.h ************
6b860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b880 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
6b890 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 ******** Continu
6b8a0 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 ing where we lef
6b8b0 74 20 6f 66 66 20 69 6e 20 73 71 6c 69 74 65 49 t off in sqliteI
6b8c0 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nt.h ***********
6b8d0 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
6b8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 64 ********* Includ
6b8f0 65 20 6d 75 74 65 78 2e 68 20 69 6e 20 74 68 65 e mutex.h in the
6b900 20 6d 69 64 64 6c 65 20 6f 66 20 73 71 6c 69 74 middle of sqlit
6b910 65 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a eInt.h *********
6b920 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
6b930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
6b940 20 66 69 6c 65 20 6d 75 74 65 78 2e 68 20 2a 2a file mutex.h **
6b950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a *********/../*..
6b980 2a 2a 20 32 30 30 37 20 41 75 67 75 73 74 20 32 ** 2007 August 2
6b990 38 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 8..**..** The au
6b9a0 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
6b9b0 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
6b9c0 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
6b9d0 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 n place of..** a
6b9e0 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
6b9f0 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
6ba00 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 g:..**..** Ma
6ba10 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
6ba20 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 d not evil...**
6ba30 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
6ba40 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
6ba50 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
6ba60 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a give others...**
6ba70 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 May you shar
6ba80 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 e freely, never
6ba90 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e taking more than
6baa0 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a you give...**..
6bab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6bac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6bad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6bae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6baf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a *********..**..*
6bb00 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
6bb10 61 69 6e 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 ains the common
6bb20 68 65 61 64 65 72 20 66 6f 72 20 61 6c 6c 20 6d header for all m
6bb30 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 utex implementat
6bb40 69 6f 6e 73 2e 0d 0a 2a 2a 20 54 68 65 20 73 71 ions...** The sq
6bb50 6c 69 74 65 49 6e 74 2e 68 20 68 65 61 64 65 72 liteInt.h header
6bb60 20 23 69 6e 63 6c 75 64 65 73 20 74 68 69 73 20 #includes this
6bb70 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 file so that it
6bb80 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 2a 2a is available..**
6bb90 20 74 6f 20 61 6c 6c 20 73 6f 75 72 63 65 20 66 to all source f
6bba0 69 6c 65 73 2e 20 20 57 65 20 62 72 65 61 6b 20 iles. We break
6bbb0 69 74 20 6f 75 74 20 69 6e 20 61 6e 20 65 66 66 it out in an eff
6bbc0 6f 72 74 20 74 6f 20 6b 65 65 70 20 74 68 65 20 ort to keep the
6bbd0 63 6f 64 65 0d 0a 2a 2a 20 62 65 74 74 65 72 20 code..** better
6bbe0 6f 72 67 61 6e 69 7a 65 64 2e 0d 0a 2a 2a 0d 0a organized...**..
6bbf0 2a 2a 20 4e 4f 54 45 3a 20 20 73 6f 75 72 63 65 ** NOTE: source
6bc00 20 66 69 6c 65 73 20 73 68 6f 75 6c 64 20 2a 6e files should *n
6bc10 6f 74 2a 20 23 69 6e 63 6c 75 64 65 20 74 68 69 ot* #include thi
6bc20 73 20 68 65 61 64 65 72 20 66 69 6c 65 20 64 69 s header file di
6bc30 72 65 63 74 6c 79 2e 0d 0a 2a 2a 20 53 6f 75 72 rectly...** Sour
6bc40 63 65 20 66 69 6c 65 73 20 73 68 6f 75 6c 64 20 ce files should
6bc50 23 69 6e 63 6c 75 64 65 20 74 68 65 20 73 71 6c #include the sql
6bc60 69 74 65 49 6e 74 2e 68 20 66 69 6c 65 20 61 6e iteInt.h file an
6bc70 64 20 6c 65 74 20 74 68 61 74 20 66 69 6c 65 0d d let that file.
6bc80 0a 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 69 73 .** include this
6bc90 20 6f 6e 65 20 69 6e 64 69 72 65 63 74 6c 79 2e one indirectly.
6bca0 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ..*/....../*..**
6bcb0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 Figure out what
6bcc0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 version of the
6bcd0 63 6f 64 65 20 74 6f 20 75 73 65 2e 20 20 54 68 code to use. Th
6bce0 65 20 63 68 6f 69 63 65 73 20 61 72 65 0d 0a 2a e choices are..*
6bcf0 2a 0d 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4d *..** SQLITE_M
6bd00 55 54 45 58 5f 4f 4d 49 54 20 20 20 20 20 20 20 UTEX_OMIT
6bd10 20 20 4e 6f 20 6d 75 74 65 78 20 6c 6f 67 69 63 No mutex logic
6bd20 2e 20 20 4e 6f 74 20 65 76 65 6e 20 73 74 75 62 . Not even stub
6bd30 73 2e 20 20 54 68 65 0d 0a 2a 2a 20 20 20 20 20 s. The..**
6bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6bd50 20 20 20 20 20 20 20 20 6d 75 74 65 78 65 73 20 mutexes
6bd60 69 6d 70 6c 65 6d 65 6e 74 69 6f 6e 20 63 61 6e implemention can
6bd70 6e 6f 74 20 62 65 20 6f 76 65 72 72 69 64 64 65 not be overridde
6bd80 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 n..**
6bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6bda0 20 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 2e at start-time.
6bdb0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 53 51 4c 49 54 ..**..** SQLIT
6bdc0 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 20 20 20 20 E_MUTEX_NOOP
6bdd0 20 20 20 20 20 46 6f 72 20 73 69 6e 67 6c 65 2d For single-
6bde0 74 68 72 65 61 64 65 64 20 61 70 70 6c 69 63 61 threaded applica
6bdf0 74 69 6f 6e 73 2e 20 20 4e 6f 0d 0a 2a 2a 20 20 tions. No..**
6be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6be10 20 20 20 20 20 20 20 20 20 20 20 6d 75 74 75 61 mutua
6be20 6c 20 65 78 63 6c 75 73 69 6f 6e 20 69 73 20 70 l exclusion is p
6be30 72 6f 76 69 64 65 64 2e 20 20 42 75 74 20 74 68 rovided. But th
6be40 69 73 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 is..**
6be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6be60 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f implementatio
6be70 6e 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 n can be overrid
6be80 64 65 6e 20 61 74 0d 0a 2a 2a 20 20 20 20 20 20 den at..**
6be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6bea0 20 20 20 20 20 20 20 73 74 61 72 74 2d 74 69 6d start-tim
6beb0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 53 51 4c e...**..** SQL
6bec0 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 ITE_MUTEX_PTHREA
6bed0 44 53 20 20 20 20 20 46 6f 72 20 6d 75 6c 74 69 DS For multi
6bee0 2d 74 68 72 65 61 64 65 64 20 61 70 70 6c 69 63 -threaded applic
6bef0 61 74 69 6f 6e 73 20 6f 6e 20 55 6e 69 78 2e 0d ations on Unix..
6bf00 0a 2a 2a 0d 0a 2a 2a 20 20 20 53 51 4c 49 54 45 .**..** SQLITE
6bf10 5f 4d 55 54 45 58 5f 57 33 32 20 20 20 20 20 20 _MUTEX_W32
6bf20 20 20 20 20 46 6f 72 20 6d 75 6c 74 69 2d 74 68 For multi-th
6bf30 72 65 61 64 65 64 20 61 70 70 6c 69 63 61 74 69 readed applicati
6bf40 6f 6e 73 20 6f 6e 20 57 69 6e 33 32 2e 0d 0a 2a ons on Win32...*
6bf50 2a 0d 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4d *..** SQLITE_M
6bf60 55 54 45 58 5f 4f 53 32 20 20 20 20 20 20 20 20 UTEX_OS2
6bf70 20 20 46 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65 For multi-thre
6bf80 61 64 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e aded application
6bf90 73 20 6f 6e 20 4f 53 2f 32 2e 0d 0a 2a 2f 0d 0a s on OS/2...*/..
6bfa0 23 69 66 20 21 53 51 4c 49 54 45 5f 54 48 52 45 #if !SQLITE_THRE
6bfb0 41 44 53 41 46 45 0d 0a 23 20 64 65 66 69 6e 65 ADSAFE..# define
6bfc0 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 4d SQLITE_MUTEX_OM
6bfd0 49 54 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 IT..#endif..#if
6bfe0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
6bff0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 E && !defined(SQ
6c000 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 29 LITE_MUTEX_NOOP)
6c010 0d 0a 23 20 20 69 66 20 53 51 4c 49 54 45 5f 4f ..# if SQLITE_O
6c020 53 5f 55 4e 49 58 0d 0a 23 20 20 20 20 64 65 66 S_UNIX..# def
6c030 69 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 ine SQLITE_MUTEX
6c040 5f 50 54 48 52 45 41 44 53 0d 0a 23 20 20 65 6c _PTHREADS..# el
6c050 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
6c060 0d 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 ..# define SQ
6c070 4c 49 54 45 5f 4d 55 54 45 58 5f 57 33 32 0d 0a LITE_MUTEX_W32..
6c080 23 20 20 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f # elif SQLITE_O
6c090 53 5f 4f 53 32 0d 0a 23 20 20 20 20 64 65 66 69 S_OS2..# defi
6c0a0 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f ne SQLITE_MUTEX_
6c0b0 4f 53 32 0d 0a 23 20 20 65 6c 73 65 0d 0a 23 20 OS2..# else..#
6c0c0 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 define SQLITE
6c0d0 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0d 0a 23 20 20 _MUTEX_NOOP..#
6c0e0 65 6e 64 69 66 0d 0a 23 65 6e 64 69 66 0d 0a 0d endif..#endif...
6c0f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d .#ifdef SQLITE_M
6c100 55 54 45 58 5f 4f 4d 49 54 0d 0a 2f 2a 0d 0a 2a UTEX_OMIT../*..*
6c110 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e * If this is a n
6c120 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 o-op implementat
6c130 69 6f 6e 2c 20 69 6d 70 6c 65 6d 65 6e 74 20 65 ion, implement e
6c140 76 65 72 79 74 68 69 6e 67 20 61 73 20 6d 61 63 verything as mac
6c150 72 6f 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e ros...*/..#defin
6c160 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f e sqlite3_mutex_
6c170 61 6c 6c 6f 63 28 58 29 20 20 20 20 28 28 73 71 alloc(X) ((sq
6c180 6c 69 74 65 33 5f 6d 75 74 65 78 2a 29 38 29 0d lite3_mutex*)8).
6c190 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 .#define sqlite3
6c1a0 5f 6d 75 74 65 78 5f 66 72 65 65 28 58 29 0d 0a _mutex_free(X)..
6c1b0 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f #define sqlite3_
6c1c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 58 29 20 20 mutex_enter(X)
6c1d0 20 20 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 ..#define sqli
6c1e0 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 58 29 te3_mutex_try(X)
6c1f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 0d SQLITE_OK.
6c200 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 .#define sqlite3
6c210 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 58 29 20 _mutex_leave(X)
6c220 20 20 20 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c ..#define sql
6c230 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
6c240 58 29 20 20 20 20 20 28 28 76 6f 69 64 29 28 58 X) ((void)(X
6c250 29 2c 31 29 0d 0a 23 64 65 66 69 6e 65 20 73 71 ),1)..#define sq
6c260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 lite3_mutex_noth
6c270 65 6c 64 28 58 29 20 20 28 28 76 6f 69 64 29 28 eld(X) ((void)(
6c280 58 29 2c 31 29 0d 0a 23 64 65 66 69 6e 65 20 73 X),1)..#define s
6c290 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 qlite3MutexAlloc
6c2a0 28 58 29 20 20 20 20 20 20 28 28 73 71 6c 69 74 (X) ((sqlit
6c2b0 65 33 5f 6d 75 74 65 78 2a 29 38 29 0d 0a 23 64 e3_mutex*)8)..#d
6c2c0 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4d 75 74 efine sqlite3Mut
6c2d0 65 78 49 6e 69 74 28 29 20 20 20 20 20 20 20 20 exInit()
6c2e0 53 51 4c 49 54 45 5f 4f 4b 0d 0a 23 64 65 66 69 SQLITE_OK..#defi
6c2f0 6e 65 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 ne sqlite3MutexE
6c300 6e 64 28 29 0d 0a 23 64 65 66 69 6e 65 20 4d 55 nd()..#define MU
6c310 54 45 58 5f 4c 4f 47 49 43 28 58 29 0d 0a 23 65 TEX_LOGIC(X)..#e
6c320 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 4d 55 54 lse..#define MUT
6c330 45 58 5f 4c 4f 47 49 43 28 58 29 20 20 20 20 20 EX_LOGIC(X)
6c340 20 20 20 20 20 20 20 58 0d 0a 23 65 6e 64 69 66 X..#endif
6c350 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 /* defined(SQLI
6c360 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 29 20 2a TE_MUTEX_OMIT) *
6c370 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
6c380 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6d 75 74 65 **** End of mute
6c390 78 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a x.h ************
6c3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c3c0 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
6c3d0 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 ***** Continuing
6c3e0 20 77 68 65 72 65 20 77 65 20 6c 65 66 74 20 6f where we left o
6c3f0 66 66 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e ff in sqliteInt.
6c400 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
6c410 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a ****/....../*..*
6c420 2a 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20 * Each database
6c430 66 69 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 file to be acces
6c440 73 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 sed by the syste
6c450 6d 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 m is an instance
6c460 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c ..** of the foll
6c470 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e owing structure.
6c480 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 72 6d There are norm
6c490 61 6c 6c 79 20 74 77 6f 20 6f 66 20 74 68 65 73 ally two of thes
6c4a0 65 20 73 74 72 75 63 74 75 72 65 73 0d 0a 2a 2a e structures..**
6c4b0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 2e 61 in the sqlite.a
6c4c0 44 62 5b 5d 20 61 72 72 61 79 2e 20 20 61 44 62 Db[] array. aDb
6c4d0 5b 30 5d 20 69 73 20 74 68 65 20 6d 61 69 6e 20 [0] is the main
6c4e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e database file an
6c4f0 64 0d 0a 2a 2a 20 61 44 62 5b 31 5d 20 69 73 20 d..** aDb[1] is
6c500 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
6c510 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 e used to hold t
6c520 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e emporary tables.
6c530 20 20 41 64 64 69 74 69 6f 6e 61 6c 0d 0a 2a 2a Additional..**
6c540 20 64 61 74 61 62 61 73 65 73 20 6d 61 79 20 62 databases may b
6c550 65 20 61 74 74 61 63 68 65 64 2e 0d 0a 2a 2f 0d e attached...*/.
6c560 0a 73 74 72 75 63 74 20 44 62 20 7b 0d 0a 20 20 .struct Db {..
6c570 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 char *zName;
6c580 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
6c590 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f this database */
6c5a0 0d 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 .. Btree *pBt;
6c5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
6c5c0 42 2a 54 72 65 65 20 73 74 72 75 63 74 75 72 65 B*Tree structure
6c5d0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 for this databa
6c5e0 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 75 38 se file */.. u8
6c5f0 20 69 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20 inTrans;
6c600 20 20 20 2f 2a 20 30 3a 20 6e 6f 74 20 77 72 69 /* 0: not wri
6c610 74 61 62 6c 65 2e 20 20 31 3a 20 54 72 61 6e 73 table. 1: Trans
6c620 61 63 74 69 6f 6e 2e 20 20 32 3a 20 43 68 65 63 action. 2: Chec
6c630 6b 70 6f 69 6e 74 20 2a 2f 0d 0a 20 20 75 38 20 kpoint */.. u8
6c640 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 20 20 20 safety_level;
6c650 20 20 2f 2a 20 48 6f 77 20 61 67 67 72 65 73 73 /* How aggress
6c660 69 76 65 20 61 74 20 73 79 6e 63 69 6e 67 20 64 ive at syncing d
6c670 61 74 61 20 74 6f 20 64 69 73 6b 20 2a 2f 0d 0a ata to disk */..
6c680 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d Schema *pSchem
6c690 61 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 a; /* Pointe
6c6a0 72 20 74 6f 20 64 61 74 61 62 61 73 65 20 73 63 r to database sc
6c6b0 68 65 6d 61 20 28 70 6f 73 73 69 62 6c 79 20 73 hema (possibly s
6c6c0 68 61 72 65 64 29 20 2a 2f 0d 0a 7d 3b 0d 0a 0d hared) */..};...
6c6d0 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 ./*..** An insta
6c6e0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nce of the follo
6c6f0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 wing structure s
6c700 74 6f 72 65 73 20 61 20 64 61 74 61 62 61 73 65 tores a database
6c710 20 73 63 68 65 6d 61 2e 0d 0a 2a 2a 0d 0a 2a 2a schema...**..**
6c720 20 4d 6f 73 74 20 53 63 68 65 6d 61 20 6f 62 6a Most Schema obj
6c730 65 63 74 73 20 61 72 65 20 61 73 73 6f 63 69 61 ects are associa
6c740 74 65 64 20 77 69 74 68 20 61 20 42 74 72 65 65 ted with a Btree
6c750 2e 20 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e . The exception
6c760 20 69 73 0d 0a 2a 2a 20 74 68 65 20 53 63 68 65 is..** the Sche
6c770 6d 61 20 66 6f 72 20 74 68 65 20 54 45 4d 50 20 ma for the TEMP
6c780 64 61 74 61 62 61 65 73 20 28 73 71 6c 69 74 65 databaes (sqlite
6c790 33 2e 61 44 62 5b 31 5d 29 20 77 68 69 63 68 20 3.aDb[1]) which
6c7a0 69 73 20 66 72 65 65 2d 73 74 61 6e 64 69 6e 67 is free-standing
6c7b0 2e 0d 0a 2a 2a 20 49 6e 20 73 68 61 72 65 64 20 ...** In shared
6c7c0 63 61 63 68 65 20 6d 6f 64 65 2c 20 61 20 73 69 cache mode, a si
6c7d0 6e 67 6c 65 20 53 63 68 65 6d 61 20 6f 62 6a 65 ngle Schema obje
6c7e0 63 74 20 63 61 6e 20 62 65 20 73 68 61 72 65 64 ct can be shared
6c7f0 20 62 79 20 6d 75 6c 74 69 70 6c 65 0d 0a 2a 2a by multiple..**
6c800 20 42 74 72 65 65 73 20 74 68 61 74 20 72 65 66 Btrees that ref
6c810 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 75 er to the same u
6c820 6e 64 65 72 6c 79 69 6e 67 20 42 74 53 68 61 72 nderlying BtShar
6c830 65 64 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 20 0d ed object...** .
6c840 0a 2a 2a 20 53 63 68 65 6d 61 20 6f 62 6a 65 63 .** Schema objec
6c850 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 ts are automatic
6c860 61 6c 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 ally deallocated
6c870 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 42 when the last B
6c880 74 72 65 65 20 74 68 61 74 0d 0a 2a 2a 20 72 65 tree that..** re
6c890 66 65 72 65 6e 63 65 73 20 74 68 65 6d 20 69 73 ferences them is
6c8a0 20 64 65 73 74 72 6f 79 65 64 2e 20 20 20 54 68 destroyed. Th
6c8b0 65 20 54 45 4d 50 20 53 63 68 65 6d 61 20 69 73 e TEMP Schema is
6c8c0 20 6d 61 6e 75 61 6c 6c 79 20 66 72 65 65 64 20 manually freed
6c8d0 62 79 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 by..** sqlite3_c
6c8e0 6c 6f 73 65 28 29 2e 0d 0a 2a 0d 0a 2a 2a 20 41 lose()...*..** A
6c8f0 20 74 68 72 65 61 64 20 6d 75 73 74 20 62 65 20 thread must be
6c900 68 6f 6c 64 69 6e 67 20 61 20 6d 75 74 65 78 20 holding a mutex
6c910 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e on the correspon
6c920 64 69 6e 67 20 42 74 72 65 65 20 69 6e 20 6f 72 ding Btree in or
6c930 64 65 72 0d 0a 2a 2a 20 74 6f 20 61 63 63 65 73 der..** to acces
6c940 73 20 53 63 68 65 6d 61 20 63 6f 6e 74 65 6e 74 s Schema content
6c950 2e 20 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 . This implies
6c960 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 that the thread
6c970 6d 75 73 74 20 61 6c 73 6f 20 62 65 0d 0a 2a 2a must also be..**
6c980 20 68 6f 6c 64 69 6e 67 20 61 20 6d 75 74 65 78 holding a mutex
6c990 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 20 on the sqlite3
6c9a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 connection point
6c9b0 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 er that owns the
6c9c0 20 42 74 72 65 65 2e 0d 0a 2a 2a 20 46 6f 72 20 Btree...** For
6c9d0 61 20 54 45 4d 50 20 53 63 68 65 6d 61 2c 20 6f a TEMP Schema, o
6c9e0 6e 6c 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 nly the connecti
6c9f0 6f 6e 20 6d 75 74 65 78 20 69 73 20 72 65 71 75 on mutex is requ
6ca00 69 72 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 ired...*/..struc
6ca10 74 20 53 63 68 65 6d 61 20 7b 0d 0a 20 20 69 6e t Schema {.. in
6ca20 74 20 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b t schema_cookie;
6ca30 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 /* Database s
6ca40 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 6e 75 chema version nu
6ca50 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 66 69 mber for this fi
6ca60 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 47 65 le */.. int iGe
6ca70 6e 65 72 61 74 69 6f 6e 3b 20 20 20 20 20 2f 2a neration; /*
6ca80 20 47 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e Generation coun
6ca90 74 65 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74 65 ter. Incremente
6caa0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e d with each chan
6cab0 67 65 20 2a 2f 0d 0a 20 20 48 61 73 68 20 74 62 ge */.. Hash tb
6cac0 6c 48 61 73 68 3b 20 20 20 20 20 20 20 20 2f 2a lHash; /*
6cad0 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 64 65 All tables inde
6cae0 78 65 64 20 62 79 20 6e 61 6d 65 20 2a 2f 0d 0a xed by name */..
6caf0 20 20 48 61 73 68 20 69 64 78 48 61 73 68 3b 20 Hash idxHash;
6cb00 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 28 6e /* All (n
6cb10 61 6d 65 64 29 20 69 6e 64 69 63 65 73 20 69 6e amed) indices in
6cb20 64 65 78 65 64 20 62 79 20 6e 61 6d 65 20 2a 2f dexed by name */
6cb30 0d 0a 20 20 48 61 73 68 20 74 72 69 67 48 61 73 .. Hash trigHas
6cb40 68 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 h; /* All
6cb50 74 72 69 67 67 65 72 73 20 69 6e 64 65 78 65 64 triggers indexed
6cb60 20 62 79 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 48 by name */.. H
6cb70 61 73 68 20 66 6b 65 79 48 61 73 68 3b 20 20 20 ash fkeyHash;
6cb80 20 20 20 20 2f 2a 20 41 6c 6c 20 66 6f 72 65 69 /* All forei
6cb90 67 6e 20 6b 65 79 73 20 62 79 20 72 65 66 65 72 gn keys by refer
6cba0 65 6e 63 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 enced table name
6cbb0 20 2a 2f 0d 0a 20 20 54 61 62 6c 65 20 2a 70 53 */.. Table *pS
6cbc0 65 71 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 eqTab; /* T
6cbd0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e he sqlite_sequen
6cbe0 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 ce table used by
6cbf0 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a AUTOINCREMENT *
6cc00 2f 0d 0a 20 20 75 38 20 66 69 6c 65 5f 66 6f 72 /.. u8 file_for
6cc10 6d 61 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 68 mat; /* Sch
6cc20 65 6d 61 20 66 6f 72 6d 61 74 20 76 65 72 73 69 ema format versi
6cc30 6f 6e 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 on for this file
6cc40 20 2a 2f 0d 0a 20 20 75 38 20 65 6e 63 3b 20 20 */.. u8 enc;
6cc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
6cc60 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 ext encoding use
6cc70 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 d by this databa
6cc80 73 65 20 2a 2f 0d 0a 20 20 75 31 36 20 66 6c 61 se */.. u16 fla
6cc90 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a gs; /*
6cca0 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 Flags associate
6ccb0 64 20 77 69 74 68 20 74 68 69 73 20 73 63 68 65 d with this sche
6ccc0 6d 61 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 61 63 ma */.. int cac
6ccd0 68 65 5f 73 69 7a 65 3b 20 20 20 20 20 20 2f 2a he_size; /*
6cce0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 Number of pages
6ccf0 20 74 6f 20 75 73 65 20 69 6e 20 74 68 65 20 63 to use in the c
6cd00 61 63 68 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f ache */..};..../
6cd10 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 *..** These macr
6cd20 6f 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 os can be used t
6cd30 6f 20 74 65 73 74 2c 20 73 65 74 2c 20 6f 72 20 o test, set, or
6cd40 63 6c 65 61 72 20 62 69 74 73 20 69 6e 20 74 68 clear bits in th
6cd50 65 20 0d 0a 2a 2a 20 44 62 2e 70 53 63 68 65 6d e ..** Db.pSchem
6cd60 61 2d 3e 66 6c 61 67 73 20 66 69 65 6c 64 2e 0d a->flags field..
6cd70 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 44 62 48 .*/..#define DbH
6cd80 61 73 50 72 6f 70 65 72 74 79 28 44 2c 49 2c 50 asProperty(D,I,P
6cd90 29 20 20 20 20 20 28 28 28 44 29 2d 3e 61 44 62 ) (((D)->aDb
6cda0 5b 49 5d 2e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 [I].pSchema->fla
6cdb0 67 73 26 28 50 29 29 3d 3d 28 50 29 29 0d 0a 23 gs&(P))==(P))..#
6cdc0 64 65 66 69 6e 65 20 44 62 48 61 73 41 6e 79 50 define DbHasAnyP
6cdd0 72 6f 70 65 72 74 79 28 44 2c 49 2c 50 29 20 20 roperty(D,I,P)
6cde0 28 28 28 44 29 2d 3e 61 44 62 5b 49 5d 2e 70 53 (((D)->aDb[I].pS
6cdf0 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 28 50 29 chema->flags&(P)
6ce00 29 21 3d 30 29 0d 0a 23 64 65 66 69 6e 65 20 44 )!=0)..#define D
6ce10 62 53 65 74 50 72 6f 70 65 72 74 79 28 44 2c 49 bSetProperty(D,I
6ce20 2c 50 29 20 20 20 20 20 28 44 29 2d 3e 61 44 62 ,P) (D)->aDb
6ce30 5b 49 5d 2e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 [I].pSchema->fla
6ce40 67 73 7c 3d 28 50 29 0d 0a 23 64 65 66 69 6e 65 gs|=(P)..#define
6ce50 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 DbClearProperty
6ce60 28 44 2c 49 2c 50 29 20 20 20 28 44 29 2d 3e 61 (D,I,P) (D)->a
6ce70 44 62 5b 49 5d 2e 70 53 63 68 65 6d 61 2d 3e 66 Db[I].pSchema->f
6ce80 6c 61 67 73 26 3d 7e 28 50 29 0d 0a 0d 0a 2f 2a lags&=~(P)..../*
6ce90 0d 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c ..** Allowed val
6cea0 75 65 73 20 66 6f 72 20 74 68 65 20 44 42 2e 70 ues for the DB.p
6ceb0 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 66 69 Schema->flags fi
6cec0 65 6c 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 eld...**..** The
6ced0 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 DB_SchemaLoaded
6cee0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 66 74 flag is set aft
6cef0 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 er the database
6cf00 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 0d schema has been.
6cf10 0a 2a 2a 20 72 65 61 64 20 69 6e 74 6f 20 69 6e .** read into in
6cf20 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c ternal hash tabl
6cf30 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 44 42 5f 55 es...**..** DB_U
6cf40 6e 72 65 73 65 74 56 69 65 77 73 20 6d 65 61 6e nresetViews mean
6cf50 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d 6f s that one or mo
6cf60 72 65 20 76 69 65 77 73 20 68 61 76 65 20 63 6f re views have co
6cf70 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 61 74 0d lumn names that.
6cf80 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 66 69 .** have been fi
6cf90 6c 6c 65 64 20 6f 75 74 2e 20 20 49 66 20 74 68 lled out. If th
6cfa0 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 e schema changes
6cfb0 2c 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 20 6e , these column n
6cfc0 61 6d 65 73 20 6d 69 67 68 74 0d 0a 2a 2a 20 63 ames might..** c
6cfd0 68 61 6e 67 65 73 20 61 6e 64 20 73 6f 20 74 68 hanges and so th
6cfe0 65 20 76 69 65 77 20 77 69 6c 6c 20 6e 65 65 64 e view will need
6cff0 20 74 6f 20 62 65 20 72 65 73 65 74 2e 0d 0a 2a to be reset...*
6d000 2f 0d 0a 23 64 65 66 69 6e 65 20 44 42 5f 53 63 /..#define DB_Sc
6d010 68 65 6d 61 4c 6f 61 64 65 64 20 20 20 20 30 78 hemaLoaded 0x
6d020 30 30 30 31 20 20 2f 2a 20 54 68 65 20 73 63 68 0001 /* The sch
6d030 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 ema has been loa
6d040 64 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ded */..#define
6d050 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 20 DB_UnresetViews
6d060 20 20 20 30 78 30 30 30 32 20 20 2f 2a 20 53 6f 0x0002 /* So
6d070 6d 65 20 76 69 65 77 73 20 68 61 76 65 20 64 65 me views have de
6d080 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d fined column nam
6d090 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 44 es */..#define D
6d0a0 42 5f 45 6d 70 74 79 20 20 20 20 20 20 20 20 20 B_Empty
6d0b0 20 20 30 78 30 30 30 34 20 20 2f 2a 20 54 68 65 0x0004 /* The
6d0c0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 28 file is empty (
6d0d0 6c 65 6e 67 74 68 20 30 20 62 79 74 65 73 29 20 length 0 bytes)
6d0e0 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 */..../*..** The
6d0f0 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 66 66 65 number of diffe
6d100 72 65 6e 74 20 6b 69 6e 64 73 20 6f 66 20 74 68 rent kinds of th
6d110 69 6e 67 73 20 74 68 61 74 20 63 61 6e 20 62 65 ings that can be
6d120 20 6c 69 6d 69 74 65 64 0d 0a 2a 2a 20 75 73 69 limited..** usi
6d130 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c ng the sqlite3_l
6d140 69 6d 69 74 28 29 20 69 6e 74 65 72 66 61 63 65 imit() interface
6d150 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ...*/..#define S
6d160 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 28 53 QLITE_N_LIMIT (S
6d170 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 QLITE_LIMIT_TRIG
6d180 47 45 52 5f 44 45 50 54 48 2b 31 29 0d 0a 0d 0a GER_DEPTH+1)....
6d190 2f 2a 0d 0a 2a 2a 20 4c 6f 6f 6b 61 73 69 64 65 /*..** Lookaside
6d1a0 20 6d 61 6c 6c 6f 63 20 69 73 20 61 20 73 65 74 malloc is a set
6d1b0 20 6f 66 20 66 69 78 65 64 2d 73 69 7a 65 20 62 of fixed-size b
6d1c0 75 66 66 65 72 73 20 74 68 61 74 20 63 61 6e 20 uffers that can
6d1d0 62 65 20 75 73 65 64 0d 0a 2a 2a 20 74 6f 20 73 be used..** to s
6d1e0 61 74 69 73 66 79 20 73 6d 61 6c 6c 20 74 72 61 atisfy small tra
6d1f0 6e 73 69 65 6e 74 20 6d 65 6d 6f 72 79 20 61 6c nsient memory al
6d200 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74 location request
6d210 73 20 66 6f 72 20 6f 62 6a 65 63 74 73 0d 0a 2a s for objects..*
6d220 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 * associated wit
6d230 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 h a particular d
6d240 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
6d250 6f 6e 2e 20 20 54 68 65 20 75 73 65 20 6f 66 0d on. The use of.
6d260 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 61 .** lookaside ma
6d270 6c 6c 6f 63 20 70 72 6f 76 69 64 65 73 20 61 20 lloc provides a
6d280 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 significant perf
6d290 6f 72 6d 61 6e 63 65 20 65 6e 68 61 6e 63 65 6d ormance enhancem
6d2a0 65 6e 74 0d 0a 2a 2a 20 28 61 70 70 72 6f 78 20 ent..** (approx
6d2b0 31 30 25 29 20 62 79 20 61 76 6f 69 64 69 6e 67 10%) by avoiding
6d2c0 20 6e 75 6d 65 72 6f 75 73 20 6d 61 6c 6c 6f 63 numerous malloc
6d2d0 2f 66 72 65 65 20 72 65 71 75 65 73 74 73 20 77 /free requests w
6d2e0 68 69 6c 65 20 70 61 72 73 69 6e 67 0d 0a 2a 2a hile parsing..**
6d2f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e SQL statements.
6d300 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 4c 6f 6f ..**..** The Loo
6d310 6b 61 73 69 64 65 20 73 74 72 75 63 74 75 72 65 kaside structure
6d320 20 68 6f 6c 64 73 20 63 6f 6e 66 69 67 75 72 61 holds configura
6d330 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e tion information
6d340 20 61 62 6f 75 74 20 74 68 65 0d 0a 2a 2a 20 6c about the..** l
6d350 6f 6f 6b 61 73 69 64 65 20 6d 61 6c 6c 6f 63 20 ookaside malloc
6d360 73 75 62 73 79 73 74 65 6d 2e 20 20 45 61 63 68 subsystem. Each
6d370 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 available memor
6d380 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 0d y allocation in.
6d390 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 .** the lookasid
6d3a0 65 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 73 e subsystem is s
6d3b0 74 6f 72 65 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 tored on a linke
6d3c0 64 20 6c 69 73 74 20 6f 66 20 4c 6f 6f 6b 61 73 d list of Lookas
6d3d0 69 64 65 53 6c 6f 74 0d 0a 2a 2a 20 6f 62 6a 65 ideSlot..** obje
6d3e0 63 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4c 6f 6f cts...**..** Loo
6d3f0 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f kaside allocatio
6d400 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 6c 6c 6f ns are only allo
6d410 77 65 64 20 66 6f 72 20 6f 62 6a 65 63 74 73 20 wed for objects
6d420 74 68 61 74 20 61 72 65 20 61 73 73 6f 63 69 61 that are associa
6d430 74 65 64 0d 0a 2a 2a 20 77 69 74 68 20 61 20 70 ted..** with a p
6d440 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 articular databa
6d450 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 se connection.
6d460 48 65 6e 63 65 2c 20 73 63 68 65 6d 61 20 69 6e Hence, schema in
6d470 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 formation cannot
6d480 0d 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 ..** be stored i
6d490 6e 20 6c 6f 6f 6b 61 73 69 64 65 20 62 65 63 61 n lookaside beca
6d4a0 75 73 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 use in shared ca
6d4b0 63 68 65 20 6d 6f 64 65 20 74 68 65 20 73 63 68 che mode the sch
6d4c0 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0d ema information.
6d4d0 0a 2a 2a 20 69 73 20 73 68 61 72 65 64 20 62 79 .** is shared by
6d4e0 20 6d 75 6c 74 69 70 6c 65 20 64 61 74 61 62 61 multiple databa
6d4f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 se connections.
6d500 20 54 68 65 72 65 66 6f 72 65 2c 20 77 68 69 6c Therefore, whil
6d510 65 20 70 61 72 73 69 6e 67 0d 0a 2a 2a 20 73 63 e parsing..** sc
6d520 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e hema information
6d530 2c 20 74 68 65 20 4c 6f 6f 6b 61 73 69 64 65 2e , the Lookaside.
6d540 62 45 6e 61 62 6c 65 64 20 66 6c 61 67 20 69 73 bEnabled flag is
6d550 20 63 6c 65 61 72 65 64 20 73 6f 20 74 68 61 74 cleared so that
6d560 0d 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 61 ..** lookaside a
6d570 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 6e llocations are n
6d580 6f 74 20 75 73 65 64 20 74 6f 20 63 6f 6e 73 74 ot used to const
6d590 72 75 63 74 20 74 68 65 20 73 63 68 65 6d 61 20 ruct the schema
6d5a0 6f 62 6a 65 63 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 objects...*/..st
6d5b0 72 75 63 74 20 4c 6f 6f 6b 61 73 69 64 65 20 7b ruct Lookaside {
6d5c0 0d 0a 20 20 75 31 36 20 73 7a 3b 20 20 20 20 20 .. u16 sz;
6d5d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
6d5e0 69 7a 65 20 6f 66 20 65 61 63 68 20 62 75 66 66 ize of each buff
6d5f0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a er in bytes */..
6d600 20 20 75 38 20 62 45 6e 61 62 6c 65 64 3b 20 20 u8 bEnabled;
6d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c /* Fal
6d620 73 65 20 74 6f 20 64 69 73 61 62 6c 65 20 6e 65 se to disable ne
6d630 77 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f w lookaside allo
6d640 63 61 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 75 38 cations */.. u8
6d650 20 62 4d 61 6c 6c 6f 63 65 64 3b 20 20 20 20 20 bMalloced;
6d660 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
6d670 20 70 53 74 61 72 74 20 6f 62 74 61 69 6e 65 64 pStart obtained
6d680 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 from sqlite3_ma
6d690 6c 6c 6f 63 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 lloc() */.. int
6d6a0 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 nOut;
6d6b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
6d6c0 66 20 62 75 66 66 65 72 73 20 63 75 72 72 65 6e f buffers curren
6d6d0 74 6c 79 20 63 68 65 63 6b 65 64 20 6f 75 74 20 tly checked out
6d6e0 2a 2f 0d 0a 20 20 69 6e 74 20 6d 78 4f 75 74 3b */.. int mxOut;
6d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6d700 20 48 69 67 68 77 61 74 65 72 20 6d 61 72 6b 20 Highwater mark
6d710 66 6f 72 20 6e 4f 75 74 20 2a 2f 0d 0a 20 20 69 for nOut */.. i
6d720 6e 74 20 61 6e 53 74 61 74 5b 33 5d 3b 20 20 20 nt anStat[3];
6d730 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 68 69 74 /* 0: hit
6d740 73 2e 20 20 31 3a 20 73 69 7a 65 20 6d 69 73 73 s. 1: size miss
6d750 65 73 2e 20 20 32 3a 20 66 75 6c 6c 20 6d 69 73 es. 2: full mis
6d760 73 65 73 20 2a 2f 0d 0a 20 20 4c 6f 6f 6b 61 73 ses */.. Lookas
6d770 69 64 65 53 6c 6f 74 20 2a 70 46 72 65 65 3b 20 ideSlot *pFree;
6d780 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 76 61 /* List of ava
6d790 69 6c 61 62 6c 65 20 62 75 66 66 65 72 73 20 2a ilable buffers *
6d7a0 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 /.. void *pStar
6d7b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 t; /*
6d7c0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 76 First byte of av
6d7d0 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 73 ailable memory s
6d7e0 70 61 63 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 pace */.. void
6d7f0 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 *pEnd;
6d800 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 /* First byte
6d810 20 70 61 73 74 20 65 6e 64 20 6f 66 20 61 76 61 past end of ava
6d820 69 6c 61 62 6c 65 20 73 70 61 63 65 20 2a 2f 0d ilable space */.
6d830 0a 7d 3b 0d 0a 73 74 72 75 63 74 20 4c 6f 6f 6b .};..struct Look
6d840 61 73 69 64 65 53 6c 6f 74 20 7b 0d 0a 20 20 4c asideSlot {.. L
6d850 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 4e ookasideSlot *pN
6d860 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 ext; /* Next
6d870 62 75 66 66 65 72 20 69 6e 20 74 68 65 20 6c 69 buffer in the li
6d880 73 74 20 6f 66 20 66 72 65 65 20 62 75 66 66 65 st of free buffe
6d890 72 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d rs */..};..../*.
6d8a0 0a 2a 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 .** A hash table
6d8b0 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 64 65 for function de
6d8c0 66 69 6e 69 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a finitions...**..
6d8d0 2a 2a 20 48 61 73 68 20 65 61 63 68 20 46 75 6e ** Hash each Fun
6d8e0 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 cDef structure i
6d8f0 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 46 nto one of the F
6d900 75 6e 63 44 65 66 48 61 73 68 2e 61 5b 5d 20 73 uncDefHash.a[] s
6d910 6c 6f 74 73 2e 0d 0a 2a 2a 20 43 6f 6c 6c 69 73 lots...** Collis
6d920 69 6f 6e 73 20 61 72 65 20 6f 6e 20 74 68 65 20 ions are on the
6d930 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20 63 68 FuncDef.pHash ch
6d940 61 69 6e 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 ain...*/..struct
6d950 20 46 75 6e 63 44 65 66 48 61 73 68 20 7b 0d 0a FuncDefHash {..
6d960 20 20 46 75 6e 63 44 65 66 20 2a 61 5b 32 33 5d FuncDef *a[23]
6d970 3b 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 ; /* Hash
6d980 74 61 62 6c 65 20 66 6f 72 20 66 75 6e 63 74 69 table for functi
6d990 6f 6e 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a ons */..};..../*
6d9a0 0d 0a 2a 2a 20 45 61 63 68 20 64 61 74 61 62 61 ..** Each databa
6d9b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 se connection is
6d9c0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
6d9d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 the following st
6d9e0 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ructure...**..**
6d9f0 20 54 68 65 20 73 71 6c 69 74 65 2e 6c 61 73 74 The sqlite.last
6da00 52 6f 77 69 64 20 72 65 63 6f 72 64 73 20 74 68 Rowid records th
6da10 65 20 6c 61 73 74 20 69 6e 73 65 72 74 20 72 6f e last insert ro
6da20 77 69 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 wid generated by
6da30 20 61 6e 0d 0a 2a 2a 20 69 6e 73 65 72 74 20 73 an..** insert s
6da40 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 73 65 72 tatement. Inser
6da50 74 73 20 6f 6e 20 76 69 65 77 73 20 64 6f 20 6e ts on views do n
6da60 6f 74 20 61 66 66 65 63 74 20 69 74 73 20 76 61 ot affect its va
6da70 6c 75 65 2e 20 20 45 61 63 68 0d 0a 2a 2a 20 74 lue. Each..** t
6da80 72 69 67 67 65 72 20 68 61 73 20 69 74 73 20 6f rigger has its o
6da90 77 6e 20 63 6f 6e 74 65 78 74 2c 20 73 6f 20 74 wn context, so t
6daa0 68 61 74 20 6c 61 73 74 52 6f 77 69 64 20 63 61 hat lastRowid ca
6dab0 6e 20 62 65 20 75 70 64 61 74 65 64 20 69 6e 73 n be updated ins
6dac0 69 64 65 0d 0a 2a 2a 20 74 72 69 67 67 65 72 73 ide..** triggers
6dad0 20 61 73 20 75 73 75 61 6c 2e 20 20 54 68 65 20 as usual. The
6dae0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 77 previous value w
6daf0 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 ill be restored
6db00 6f 6e 63 65 20 74 68 65 20 74 72 69 67 67 65 72 once the trigger
6db10 0d 0a 2a 2a 20 65 78 69 74 73 2e 20 20 55 70 6f ..** exits. Upo
6db20 6e 20 65 6e 74 65 72 69 6e 67 20 61 20 62 65 66 n entering a bef
6db30 6f 72 65 20 6f 72 20 69 6e 73 74 65 61 64 20 6f ore or instead o
6db40 66 20 74 72 69 67 67 65 72 2c 20 6c 61 73 74 52 f trigger, lastR
6db50 6f 77 69 64 20 69 73 20 6e 6f 0d 0a 2a 2a 20 6c owid is no..** l
6db60 6f 6e 67 65 72 20 28 73 69 6e 63 65 20 61 66 74 onger (since aft
6db70 65 72 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 31 er version 2.8.1
6db80 32 29 20 72 65 73 65 74 20 74 6f 20 2d 31 2e 0d 2) reset to -1..
6db90 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 .**..** The sqli
6dba0 74 65 2e 6e 43 68 61 6e 67 65 20 64 6f 65 73 20 te.nChange does
6dbb0 6e 6f 74 20 63 6f 75 6e 74 20 63 68 61 6e 67 65 not count change
6dbc0 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 s within trigger
6dbd0 73 20 61 6e 64 20 6b 65 65 70 73 20 6e 6f 0d 0a s and keeps no..
6dbe0 2a 2a 20 63 6f 6e 74 65 78 74 2e 20 20 49 74 20 ** context. It
6dbf0 69 73 20 72 65 73 65 74 20 61 74 20 73 74 61 72 is reset at star
6dc00 74 20 6f 66 20 73 71 6c 69 74 65 33 5f 65 78 65 t of sqlite3_exe
6dc10 63 2e 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 c...** The sqlit
6dc20 65 2e 6c 73 43 68 61 6e 67 65 20 72 65 70 72 65 e.lsChange repre
6dc30 73 65 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 sents the number
6dc40 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 of changes made
6dc50 20 62 79 20 74 68 65 20 6c 61 73 74 0d 0a 2a 2a by the last..**
6dc60 20 69 6e 73 65 72 74 2c 20 75 70 64 61 74 65 2c insert, update,
6dc70 20 6f 72 20 64 65 6c 65 74 65 20 73 74 61 74 65 or delete state
6dc80 6d 65 6e 74 2e 20 20 49 74 20 72 65 6d 61 69 6e ment. It remain
6dc90 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 s constant throu
6dca0 67 68 6f 75 74 20 74 68 65 0d 0a 2a 2a 20 6c 65 ghout the..** le
6dcb0 6e 67 74 68 20 6f 66 20 61 20 73 74 61 74 65 6d ngth of a statem
6dcc0 65 6e 74 20 61 6e 64 20 69 73 20 74 68 65 6e 20 ent and is then
6dcd0 75 70 64 61 74 65 64 20 62 79 20 4f 50 5f 53 65 updated by OP_Se
6dce0 74 43 6f 75 6e 74 73 2e 20 20 49 74 20 6b 65 65 tCounts. It kee
6dcf0 70 73 20 61 0d 0a 2a 2a 20 63 6f 6e 74 65 78 74 ps a..** context
6dd00 20 73 74 61 63 6b 20 6a 75 73 74 20 6c 69 6b 65 stack just like
6dd10 20 6c 61 73 74 52 6f 77 69 64 20 73 6f 20 74 68 lastRowid so th
6dd20 61 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 at the count of
6dd30 63 68 61 6e 67 65 73 0d 0a 2a 2a 20 77 69 74 68 changes..** with
6dd40 69 6e 20 61 20 74 72 69 67 67 65 72 20 69 73 20 in a trigger is
6dd50 6e 6f 74 20 73 65 65 6e 20 6f 75 74 73 69 64 65 not seen outside
6dd60 20 74 68 65 20 74 72 69 67 67 65 72 2e 20 20 43 the trigger. C
6dd70 68 61 6e 67 65 73 20 74 6f 20 76 69 65 77 73 20 hanges to views
6dd80 64 6f 20 6e 6f 74 0d 0a 2a 2a 20 61 66 66 65 63 do not..** affec
6dd90 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6c t the value of l
6dda0 73 43 68 61 6e 67 65 2e 0d 0a 2a 2a 20 54 68 65 sChange...** The
6ddb0 20 73 71 6c 69 74 65 2e 63 73 43 68 61 6e 67 65 sqlite.csChange
6ddc0 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 keeps track of
6ddd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 the number of cu
6dde0 72 72 65 6e 74 20 63 68 61 6e 67 65 73 20 28 73 rrent changes (s
6ddf0 69 6e 63 65 0d 0a 2a 2a 20 74 68 65 20 6c 61 73 ince..** the las
6de00 74 20 73 74 61 74 65 6d 65 6e 74 29 20 61 6e 64 t statement) and
6de10 20 69 73 20 75 73 65 64 20 74 6f 20 75 70 64 61 is used to upda
6de20 74 65 20 73 71 6c 69 74 65 5f 6c 73 43 68 61 6e te sqlite_lsChan
6de30 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ge...**..** The
6de40 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 member variables
6de50 20 73 71 6c 69 74 65 2e 65 72 72 43 6f 64 65 2c sqlite.errCode,
6de60 20 73 71 6c 69 74 65 2e 7a 45 72 72 4d 73 67 20 sqlite.zErrMsg
6de70 61 6e 64 20 73 71 6c 69 74 65 2e 7a 45 72 72 4d and sqlite.zErrM
6de80 73 67 31 36 0d 0a 2a 2a 20 73 74 6f 72 65 20 74 sg16..** store t
6de90 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 he most recent e
6dea0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 rror code and, i
6deb0 66 20 61 70 70 6c 69 63 61 62 6c 65 2c 20 73 74 f applicable, st
6dec0 72 69 6e 67 2e 20 54 68 65 0d 0a 2a 2a 20 69 6e ring. The..** in
6ded0 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 ternal function
6dee0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29 20 69 sqlite3Error() i
6def0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 s used to set th
6df00 65 73 65 20 76 61 72 69 61 62 6c 65 73 0d 0a 2a ese variables..*
6df10 2a 20 63 6f 6e 73 69 73 74 65 6e 74 6c 79 2e 0d * consistently..
6df20 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 73 71 6c 69 .*/..struct sqli
6df30 74 65 33 20 7b 0d 0a 20 20 73 71 6c 69 74 65 33 te3 {.. sqlite3
6df40 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 _vfs *pVfs;
6df50 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 49 6e 74 /* OS Int
6df60 65 72 66 61 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 erface */.. int
6df70 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 nDb;
6df80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
6df90 6d 62 65 72 20 6f 66 20 62 61 63 6b 65 6e 64 73 mber of backends
6dfa0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 currently in us
6dfb0 65 20 2a 2f 0d 0a 20 20 44 62 20 2a 61 44 62 3b e */.. Db *aDb;
6dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6dfd0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 62 61 63 /* All bac
6dfe0 6b 65 6e 64 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 kends */.. int
6dff0 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 flags;
6e000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 /* Mis
6e010 63 65 6c 6c 61 6e 65 6f 75 73 20 66 6c 61 67 73 cellaneous flags
6e020 2e 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0d 0a . See below */..
6e030 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f unsigned int o
6e040 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 penFlags;
6e050 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 /* Flags passed
6e060 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 to sqlite3_vfs.x
6e070 4f 70 65 6e 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 Open() */.. int
6e080 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 errCode;
6e090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f /* Mo
6e0a0 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 st recent error
6e0b0 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 2a 29 20 code (SQLITE_*)
6e0c0 2a 2f 0d 0a 20 20 69 6e 74 20 65 72 72 4d 61 73 */.. int errMas
6e0d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 k;
6e0e0 20 20 20 20 2f 2a 20 26 20 72 65 73 75 6c 74 20 /* & result
6e0f0 63 6f 64 65 73 20 77 69 74 68 20 74 68 69 73 20 codes with this
6e100 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 before returning
6e110 20 2a 2f 0d 0a 20 20 75 38 20 61 75 74 6f 43 6f */.. u8 autoCo
6e120 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 mmit;
6e130 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f /* The auto
6e140 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 20 2a 2f -commit flag. */
6e150 0d 0a 20 20 75 38 20 74 65 6d 70 5f 73 74 6f 72 .. u8 temp_stor
6e160 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
6e170 20 20 2f 2a 20 31 3a 20 66 69 6c 65 20 32 3a 20 /* 1: file 2:
6e180 6d 65 6d 6f 72 79 20 30 3a 20 64 65 66 61 75 6c memory 0: defaul
6e190 74 20 2a 2f 0d 0a 20 20 75 38 20 6d 61 6c 6c 6f t */.. u8 mallo
6e1a0 63 46 61 69 6c 65 64 3b 20 20 20 20 20 20 20 20 cFailed;
6e1b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
6e1c0 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 61 20 we have seen a
6e1d0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a malloc failure *
6e1e0 2f 0d 0a 20 20 75 38 20 64 66 6c 74 4c 6f 63 6b /.. u8 dfltLock
6e1f0 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 Mode;
6e200 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 6c 6f /* Default lo
6e210 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 61 cking-mode for a
6e220 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0d 0a ttached dbs */..
6e230 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 6e 65 signed char ne
6e240 78 74 41 75 74 6f 76 61 63 3b 20 20 20 20 20 20 xtAutovac;
6e250 2f 2a 20 41 75 74 6f 76 61 63 20 73 65 74 74 69 /* Autovac setti
6e260 6e 67 20 61 66 74 65 72 20 56 41 43 55 55 4d 20 ng after VACUUM
6e270 69 66 20 3e 3d 30 20 2a 2f 0d 0a 20 20 75 38 20 if >=0 */.. u8
6e280 73 75 70 70 72 65 73 73 45 72 72 3b 20 20 20 20 suppressErr;
6e290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f /* Do
6e2a0 20 6e 6f 74 20 69 73 73 75 65 20 65 72 72 6f 72 not issue error
6e2b0 20 6d 65 73 73 61 67 65 73 20 69 66 20 74 72 75 messages if tru
6e2c0 65 20 2a 2f 0d 0a 20 20 75 38 20 76 74 61 62 4f e */.. u8 vtabO
6e2d0 6e 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 nConflict;
6e2e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 /* Value t
6e2f0 6f 20 72 65 74 75 72 6e 20 66 6f 72 20 73 33 5f o return for s3_
6e300 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 vtab_on_conflict
6e310 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 65 78 () */.. int nex
6e320 74 50 61 67 65 73 69 7a 65 3b 20 20 20 20 20 20 tPagesize;
6e330 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 69 /* Pagesi
6e340 7a 65 20 61 66 74 65 72 20 56 41 43 55 55 4d 20 ze after VACUUM
6e350 69 66 20 3e 30 20 2a 2f 0d 0a 20 20 69 6e 74 20 if >0 */.. int
6e360 6e 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 nTable;
6e370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
6e380 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e ber of tables in
6e390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f the database */
6e3a0 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 44 66 .. CollSeq *pDf
6e3b0 6c 74 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 ltColl;
6e3c0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 /* The default
6e3d0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 collating seque
6e3e0 6e 63 65 20 28 42 49 4e 41 52 59 29 20 2a 2f 0d nce (BINARY) */.
6e3f0 0a 20 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64 . i64 lastRowid
6e400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
6e410 20 2f 2a 20 52 4f 57 49 44 20 6f 66 20 6d 6f 73 /* ROWID of mos
6e420 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 20 t recent insert
6e430 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0d 0a (see above) */..
6e440 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 u32 magic;
6e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6e460 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 /* Magic number
6e470 66 6f 72 20 64 65 74 65 63 74 20 6c 69 62 72 61 for detect libra
6e480 72 79 20 6d 69 73 75 73 65 20 2a 2f 0d 0a 20 20 ry misuse */..
6e490 69 6e 74 20 6e 43 68 61 6e 67 65 3b 20 20 20 20 int nChange;
6e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6e4b0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 Value returned
6e4c0 62 79 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 by sqlite3_chang
6e4d0 65 73 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e es() */.. int n
6e4e0 54 6f 74 61 6c 43 68 61 6e 67 65 3b 20 20 20 20 TotalChange;
6e4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 /* Valu
6e500 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 e returned by sq
6e510 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e lite3_total_chan
6e520 67 65 73 28 29 20 2a 2f 0d 0a 20 20 73 71 6c 69 ges() */.. sqli
6e530 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 te3_mutex *mutex
6e540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e ; /* Con
6e550 6e 65 63 74 69 6f 6e 20 6d 75 74 65 78 20 2a 2f nection mutex */
6e560 0d 0a 20 20 69 6e 74 20 61 4c 69 6d 69 74 5b 53 .. int aLimit[S
6e570 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 5d 3b 20 QLITE_N_LIMIT];
6e580 20 20 2f 2a 20 4c 69 6d 69 74 73 20 2a 2f 0d 0a /* Limits */..
6e590 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 struct sqlite3
6e5a0 49 6e 69 74 49 6e 66 6f 20 7b 20 20 20 20 20 20 InitInfo {
6e5b0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 /* Information u
6e5c0 73 65 64 20 64 75 72 69 6e 67 20 69 6e 69 74 69 sed during initi
6e5d0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 alization */..
6e5e0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 int iDb;
6e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6e600 20 57 68 65 6e 20 62 61 63 6b 20 69 73 20 62 65 When back is be
6e610 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 ing initialized
6e620 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 6e 65 77 54 */.. int newT
6e630 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 num;
6e640 20 20 20 20 2f 2a 20 52 6f 6f 74 70 61 67 65 20 /* Rootpage
6e650 6f 66 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 of table being i
6e660 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0d 0a 20 nitialized */..
6e670 20 20 20 75 38 20 62 75 73 79 3b 20 20 20 20 20 u8 busy;
6e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
6e690 2a 20 54 52 55 45 20 69 66 20 63 75 72 72 65 6e * TRUE if curren
6e6a0 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 tly initializing
6e6b0 20 2a 2f 0d 0a 20 20 20 20 75 38 20 6f 72 70 68 */.. u8 orph
6e6c0 61 6e 54 72 69 67 67 65 72 3b 20 20 20 20 20 20 anTrigger;
6e6d0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 73 74 61 /* Last sta
6e6e0 74 65 6d 65 6e 74 20 69 73 20 6f 72 70 68 61 6e tement is orphan
6e6f0 65 64 20 54 45 4d 50 20 74 72 69 67 67 65 72 20 ed TEMP trigger
6e700 2a 2f 0d 0a 20 20 7d 20 69 6e 69 74 3b 0d 0a 20 */.. } init;..
6e710 20 69 6e 74 20 6e 45 78 74 65 6e 73 69 6f 6e 3b int nExtension;
6e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
6e730 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 61 64 * Number of load
6e740 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 2a 2f ed extensions */
6e750 0d 0a 20 20 76 6f 69 64 20 2a 2a 61 45 78 74 65 .. void **aExte
6e760 6e 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 nsion;
6e770 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 68 /* Array of sh
6e780 61 72 65 64 20 6c 69 62 72 61 72 79 20 68 61 6e ared library han
6e790 64 6c 65 73 20 2a 2f 0d 0a 20 20 73 74 72 75 63 dles */.. struc
6e7a0 74 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 20 t Vdbe *pVdbe;
6e7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 /* List
6e7c0 20 6f 66 20 61 63 74 69 76 65 20 76 69 72 74 75 of active virtu
6e7d0 61 6c 20 6d 61 63 68 69 6e 65 73 20 2a 2f 0d 0a al machines */..
6e7e0 20 20 69 6e 74 20 61 63 74 69 76 65 56 64 62 65 int activeVdbe
6e7f0 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 Cnt;
6e800 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 44 42 /* Number of VDB
6e810 45 73 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 Es currently exe
6e820 63 75 74 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 cuting */.. int
6e830 20 77 72 69 74 65 56 64 62 65 43 6e 74 3b 20 20 writeVdbeCnt;
6e840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
6e850 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 56 mber of active V
6e860 44 42 45 73 20 74 68 61 74 20 61 72 65 20 77 72 DBEs that are wr
6e870 69 74 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 iting */.. int
6e880 76 64 62 65 45 78 65 63 43 6e 74 3b 20 20 20 20 vdbeExecCnt;
6e890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
6e8a0 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 63 61 ber of nested ca
6e8b0 6c 6c 73 20 74 6f 20 56 64 62 65 45 78 65 63 28 lls to VdbeExec(
6e8c0 29 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 ) */.. void (*x
6e8d0 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e Trace)(void*,con
6e8e0 73 74 20 63 68 61 72 2a 29 3b 20 20 20 20 20 20 st char*);
6e8f0 20 20 2f 2a 20 54 72 61 63 65 20 66 75 6e 63 74 /* Trace funct
6e900 69 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a ion */.. void *
6e910 70 54 72 61 63 65 41 72 67 3b 20 20 20 20 20 20 pTraceArg;
6e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6e930 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 /* Argument
6e940 74 6f 20 74 68 65 20 74 72 61 63 65 20 66 75 6e to the trace fun
6e950 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 ction */.. void
6e960 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 (*xProfile)(voi
6e970 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 d*,const char*,u
6e980 36 34 29 3b 20 20 2f 2a 20 50 72 6f 66 69 6c 69 64); /* Profili
6e990 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a ng function */..
6e9a0 20 20 76 6f 69 64 20 2a 70 50 72 6f 66 69 6c 65 void *pProfile
6e9b0 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 Arg;
6e9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
6e9d0 72 67 75 6d 65 6e 74 20 74 6f 20 70 72 6f 66 69 rgument to profi
6e9e0 6c 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a le function */..
6e9f0 20 20 76 6f 69 64 20 2a 70 43 6f 6d 6d 69 74 41 void *pCommitA
6ea00 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rg;
6ea10 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 /* Argument
6ea20 74 6f 20 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 to xCommitCallba
6ea30 63 6b 28 29 20 2a 2f 20 20 20 0d 0a 20 20 69 6e ck() */ .. in
6ea40 74 20 28 2a 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 t (*xCommitCallb
6ea50 61 63 6b 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 ack)(void*);
6ea60 2f 2a 20 49 6e 76 6f 6b 65 64 20 61 74 20 65 76 /* Invoked at ev
6ea70 65 72 79 20 63 6f 6d 6d 69 74 2e 20 2a 2f 0d 0a ery commit. */..
6ea80 20 20 76 6f 69 64 20 2a 70 52 6f 6c 6c 62 61 63 void *pRollbac
6ea90 6b 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 kArg;
6eaa0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 /* Argument
6eab0 74 6f 20 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c to xRollbackCall
6eac0 62 61 63 6b 28 29 20 2a 2f 20 20 20 0d 0a 20 20 back() */ ..
6ead0 76 6f 69 64 20 28 2a 78 52 6f 6c 6c 62 61 63 6b void (*xRollback
6eae0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 Callback)(void*)
6eaf0 3b 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 61 74 20 ; /* Invoked at
6eb00 65 76 65 72 79 20 63 6f 6d 6d 69 74 2e 20 2a 2f every commit. */
6eb10 0d 0a 20 20 76 6f 69 64 20 2a 70 55 70 64 61 74 .. void *pUpdat
6eb20 65 41 72 67 3b 0d 0a 20 20 76 6f 69 64 20 28 2a eArg;.. void (*
6eb30 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 xUpdateCallback)
6eb40 28 76 6f 69 64 2a 2c 69 6e 74 2c 20 63 6f 6e 73 (void*,int, cons
6eb50 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 t char*,const ch
6eb60 61 72 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 ar*,sqlite_int64
6eb70 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 );..#ifndef SQLI
6eb80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 69 TE_OMIT_WAL.. i
6eb90 6e 74 20 28 2a 78 57 61 6c 43 61 6c 6c 62 61 63 nt (*xWalCallbac
6eba0 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 k)(void *, sqlit
6ebb0 65 33 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 e3 *, const char
6ebc0 20 2a 2c 20 69 6e 74 29 3b 0d 0a 20 20 76 6f 69 *, int);.. voi
6ebd0 64 20 2a 70 57 61 6c 41 72 67 3b 0d 0a 23 65 6e d *pWalArg;..#en
6ebe0 64 69 66 0d 0a 20 20 76 6f 69 64 28 2a 78 43 6f dif.. void(*xCo
6ebf0 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c llNeeded)(void*,
6ec00 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 sqlite3*,int eTe
6ec10 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 xtRep,const char
6ec20 2a 29 3b 0d 0a 20 20 76 6f 69 64 28 2a 78 43 6f *);.. void(*xCo
6ec30 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 llNeeded16)(void
6ec40 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 *,sqlite3*,int e
6ec50 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f TextRep,const vo
6ec60 69 64 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 2a 70 id*);.. void *p
6ec70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0d 0a CollNeededArg;..
6ec80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 sqlite3_value
6ec90 2a 70 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 *pErr;
6eca0 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 65 /* Most recent e
6ecb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0d rror message */.
6ecc0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 . char *zErrMsg
6ecd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
6ece0 20 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 /* Most recent
6ecf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 55 error message (U
6ed00 54 46 2d 38 20 65 6e 63 6f 64 65 64 29 20 2a 2f TF-8 encoded) */
6ed10 0d 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 .. char *zErrMs
6ed20 67 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 g16;
6ed30 20 20 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 /* Most recent
6ed40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 error message (
6ed50 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 29 20 UTF-16 encoded)
6ed60 2a 2f 0d 0a 20 20 75 6e 69 6f 6e 20 7b 0d 0a 20 */.. union {..
6ed70 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 volatile int
6ed80 69 73 49 6e 74 65 72 72 75 70 74 65 64 3b 20 2f isInterrupted; /
6ed90 2a 20 54 72 75 65 20 69 66 20 73 71 6c 69 74 65 * True if sqlite
6eda0 33 5f 69 6e 74 65 72 72 75 70 74 20 68 61 73 20 3_interrupt has
6edb0 62 65 65 6e 20 63 61 6c 6c 65 64 20 2a 2f 0d 0a been called */..
6edc0 20 20 20 20 64 6f 75 62 6c 65 20 6e 6f 74 55 73 double notUs
6edd0 65 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 ed1;
6ede0 2f 2a 20 53 70 61 63 65 72 20 2a 2f 0d 0a 20 20 /* Spacer */..
6edf0 7d 20 75 31 3b 0d 0a 20 20 4c 6f 6f 6b 61 73 69 } u1;.. Lookasi
6ee00 64 65 20 6c 6f 6f 6b 61 73 69 64 65 3b 20 20 20 de lookaside;
6ee10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 61 73 /* Lookas
6ee20 69 64 65 20 6d 61 6c 6c 6f 63 20 63 6f 6e 66 69 ide malloc confi
6ee30 67 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 23 69 66 guration */..#if
6ee40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
6ee50 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0d 0a _AUTHORIZATION..
6ee60 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 int (*xAuth)(v
6ee70 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 oid*,int,const c
6ee80 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a har*,const char*
6ee90 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e ,const char*,con
6eea0 73 74 20 63 68 61 72 2a 29 3b 0d 0a 20 20 20 20 st char*);..
6eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6eec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
6eed0 63 63 65 73 73 20 61 75 74 68 6f 72 69 7a 61 74 ccess authorizat
6eee0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d ion function */.
6eef0 0a 20 20 76 6f 69 64 20 2a 70 41 75 74 68 41 72 . void *pAuthAr
6ef00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 g;
6ef10 20 2f 2a 20 31 73 74 20 61 72 67 75 6d 65 6e 74 /* 1st argument
6ef20 20 74 6f 20 74 68 65 20 61 63 63 65 73 73 20 61 to the access a
6ef30 75 74 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d uth function */.
6ef40 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
6ef50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f SQLITE_OMIT_PRO
6ef60 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0d 0a GRESS_CALLBACK..
6ef70 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 int (*xProgres
6ef80 73 29 28 76 6f 69 64 20 2a 29 3b 20 20 20 20 20 s)(void *);
6ef90 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 /* The progress
6efa0 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20 20 76 callback */.. v
6efb0 6f 69 64 20 2a 70 50 72 6f 67 72 65 73 73 41 72 oid *pProgressAr
6efc0 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 g; /*
6efd0 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 Argument to the
6efe0 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 progress callbac
6eff0 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 72 6f k */.. int nPro
6f000 67 72 65 73 73 4f 70 73 3b 20 20 20 20 20 20 20 gressOps;
6f010 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
6f020 6f 66 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 70 of opcodes for p
6f030 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b rogress callback
6f040 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 */..#endif..#if
6f050 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
6f060 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0d 0a 20 _VIRTUALTABLE..
6f070 20 48 61 73 68 20 61 4d 6f 64 75 6c 65 3b 20 20 Hash aModule;
6f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
6f090 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20 73 * populated by s
6f0a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f qlite3_create_mo
6f0b0 64 75 6c 65 28 29 20 2a 2f 0d 0a 20 20 56 74 61 dule() */.. Vta
6f0c0 62 43 74 78 20 2a 70 56 74 61 62 43 74 78 3b 20 bCtx *pVtabCtx;
6f0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
6f0e0 6e 74 65 78 74 20 66 6f 72 20 61 63 74 69 76 65 ntext for active
6f0f0 20 76 74 61 62 20 63 6f 6e 6e 65 63 74 2f 63 72 vtab connect/cr
6f100 65 61 74 65 20 2a 2f 0d 0a 20 20 56 54 61 62 6c eate */.. VTabl
6f110 65 20 2a 2a 61 56 54 72 61 6e 73 3b 20 20 20 20 e **aVTrans;
6f120 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 /* Virt
6f130 75 61 6c 20 74 61 62 6c 65 73 20 77 69 74 68 20 ual tables with
6f140 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e open transaction
6f150 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 56 54 72 s */.. int nVTr
6f160 61 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 ans;
6f170 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 /* Allocat
6f180 65 64 20 73 69 7a 65 20 6f 66 20 61 56 54 72 61 ed size of aVTra
6f190 6e 73 20 2a 2f 0d 0a 20 20 56 54 61 62 6c 65 20 ns */.. VTable
6f1a0 2a 70 44 69 73 63 6f 6e 6e 65 63 74 3b 20 20 20 *pDisconnect;
6f1b0 20 2f 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 74 /* Disconnect t
6f1c0 68 65 73 65 20 69 6e 20 6e 65 78 74 20 73 71 6c hese in next sql
6f1d0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a ite3_prepare() *
6f1e0 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 46 75 6e /..#endif.. Fun
6f1f0 63 44 65 66 48 61 73 68 20 61 46 75 6e 63 3b 20 cDefHash aFunc;
6f200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 /* Ha
6f210 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6e 6e sh table of conn
6f220 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 ection functions
6f230 20 2a 2f 0d 0a 20 20 48 61 73 68 20 61 43 6f 6c */.. Hash aCol
6f240 6c 53 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 lSeq;
6f250 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6c 6c /* All coll
6f260 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 ating sequences
6f270 2a 2f 0d 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 */.. BusyHandle
6f280 72 20 62 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 r busyHandler;
6f290 20 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c /* Busy call
6f2a0 62 61 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 back */.. int b
6f2b0 75 73 79 54 69 6d 65 6f 75 74 3b 20 20 20 20 20 usyTimeout;
6f2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 /* Busy
6f2d0 20 68 61 6e 64 6c 65 72 20 74 69 6d 65 6f 75 74 handler timeout
6f2e0 2c 20 69 6e 20 6d 73 65 63 20 2a 2f 0d 0a 20 20 , in msec */..
6f2f0 44 62 20 61 44 62 53 74 61 74 69 63 5b 32 5d 3b Db aDbStatic[2];
6f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6f310 20 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f Static space fo
6f320 72 20 74 68 65 20 32 20 64 65 66 61 75 6c 74 20 r the 2 default
6f330 62 61 63 6b 65 6e 64 73 20 2a 2f 0d 0a 20 20 53 backends */.. S
6f340 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 avepoint *pSavep
6f350 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 oint; /*
6f360 4c 69 73 74 20 6f 66 20 61 63 74 69 76 65 20 73 List of active s
6f370 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0d 0a 20 20 avepoints */..
6f380 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 int nSavepoint;
6f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6f3a0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 Number of non-t
6f3b0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 ransaction savep
6f3c0 6f 69 6e 74 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 oints */.. int
6f3d0 6e 53 74 61 74 65 6d 65 6e 74 3b 20 20 20 20 20 nStatement;
6f3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
6f3f0 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 73 74 ber of nested st
6f400 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 atement-transact
6f410 69 6f 6e 73 20 20 2a 2f 0d 0a 20 20 75 38 20 69 ions */.. u8 i
6f420 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 sTransactionSave
6f430 70 6f 69 6e 74 3b 20 20 20 20 2f 2a 20 54 72 75 point; /* Tru
6f440 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 6d 6f e if the outermo
6f450 73 74 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 st savepoint is
6f460 61 20 54 53 20 2a 2f 0d 0a 20 20 69 36 34 20 6e a TS */.. i64 n
6f470 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 20 20 20 DeferredCons;
6f480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 /* Net
6f490 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 deferred constra
6f4a0 69 6e 74 73 20 74 68 69 73 20 74 72 61 6e 73 61 ints this transa
6f4b0 63 74 69 6f 6e 2e 20 2a 2f 0d 0a 20 20 69 6e 74 ction. */.. int
6f4c0 20 2a 70 6e 42 79 74 65 73 46 72 65 65 64 3b 20 *pnBytesFreed;
6f4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 /* If
6f4e0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 63 72 65 not NULL, incre
6f4f0 6d 65 6e 74 20 74 68 69 73 20 69 6e 20 44 62 46 ment this in DbF
6f500 72 65 65 28 29 20 2a 2f 0d 0a 0d 0a 23 69 66 64 ree() */....#ifd
6f510 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
6f520 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0d 0a _UNLOCK_NOTIFY..
6f530 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 /* The followi
6f540 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 ng variables are
6f550 20 61 6c 6c 20 70 72 6f 74 65 63 74 65 64 20 62 all protected b
6f560 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 y the STATIC_MAS
6f570 54 45 52 20 0d 0a 20 20 2a 2a 20 6d 75 74 65 78 TER .. ** mutex
6f580 2c 20 6e 6f 74 20 62 79 20 73 71 6c 69 74 65 33 , not by sqlite3
6f590 2e 6d 75 74 65 78 2e 20 54 68 65 79 20 61 72 65 .mutex. They are
6f5a0 20 75 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e used by code in
6f5b0 20 6e 6f 74 69 66 79 2e 63 2e 20 0d 0a 20 20 2a notify.c. .. *
6f5c0 2a 0d 0a 20 20 2a 2a 20 57 68 65 6e 20 58 2e 70 *.. ** When X.p
6f5d0 55 6e 6c 6f 63 6b 43 6f 6e 6e 65 63 74 69 6f 6e UnlockConnection
6f5e0 3d 3d 59 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 ==Y, that means
6f5f0 74 68 61 74 20 58 20 69 73 20 77 61 69 74 69 6e that X is waitin
6f600 67 20 66 6f 72 20 59 20 74 6f 0d 0a 20 20 2a 2a g for Y to.. **
6f610 20 75 6e 6c 6f 63 6b 20 73 6f 20 74 68 61 74 20 unlock so that
6f620 69 74 20 63 61 6e 20 70 72 6f 63 65 65 64 2e 0d it can proceed..
6f630 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 57 68 65 6e . **.. ** When
6f640 20 58 2e 70 42 6c 6f 63 6b 69 6e 67 43 6f 6e 6e X.pBlockingConn
6f650 65 63 74 69 6f 6e 3d 3d 59 2c 20 74 68 61 74 20 ection==Y, that
6f660 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 74 means that somet
6f670 68 69 6e 67 20 74 68 61 74 20 58 20 74 72 69 65 hing that X trie
6f680 64 0d 0a 20 20 2a 2a 20 74 72 69 65 64 20 74 6f d.. ** tried to
6f690 20 64 6f 20 72 65 63 65 6e 74 6c 79 20 66 61 69 do recently fai
6f6a0 6c 65 64 20 77 69 74 68 20 61 6e 20 53 51 4c 49 led with an SQLI
6f6b0 54 45 5f 4c 4f 43 4b 45 44 20 65 72 72 6f 72 20 TE_LOCKED error
6f6c0 64 75 65 20 74 6f 20 6c 6f 63 6b 73 0d 0a 20 20 due to locks..
6f6d0 2a 2a 20 68 65 6c 64 20 62 79 20 59 2e 0d 0a 20 ** held by Y...
6f6e0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a */.. sqlite3 *
6f6f0 70 42 6c 6f 63 6b 69 6e 67 43 6f 6e 6e 65 63 74 pBlockingConnect
6f700 69 6f 6e 3b 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 ion; /* Connecti
6f710 6f 6e 20 74 68 61 74 20 63 61 75 73 65 64 20 53 on that caused S
6f720 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 2a 2f 0d QLITE_LOCKED */.
6f730 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 55 6e 6c . sqlite3 *pUnl
6f740 6f 63 6b 43 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20 ockConnection;
6f750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e /* Conn
6f760 65 63 74 69 6f 6e 20 74 6f 20 77 61 74 63 68 20 ection to watch
6f770 66 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0d 0a 20 for unlock */..
6f780 20 76 6f 69 64 20 2a 70 55 6e 6c 6f 63 6b 41 72 void *pUnlockAr
6f790 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 g;
6f7a0 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 /* Argume
6f7b0 6e 74 20 74 6f 20 78 55 6e 6c 6f 63 6b 4e 6f 74 nt to xUnlockNot
6f7c0 69 66 79 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 ify */.. void (
6f7d0 2a 78 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 28 *xUnlockNotify)(
6f7e0 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 3b 20 20 void **, int);
6f7f0 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 /* Unlock notify
6f800 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20 20 callback */..
6f810 73 71 6c 69 74 65 33 20 2a 70 4e 65 78 74 42 6c sqlite3 *pNextBl
6f820 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 2f 2a ocked; /*
6f830 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 Next in list of
6f840 20 61 6c 6c 20 62 6c 6f 63 6b 65 64 20 63 6f 6e all blocked con
6f850 6e 65 63 74 69 6f 6e 73 20 2a 2f 0d 0a 23 65 6e nections */..#en
6f860 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a dif..};..../*..*
6f870 2a 20 41 20 6d 61 63 72 6f 20 74 6f 20 64 69 73 * A macro to dis
6f880 63 6f 76 65 72 20 74 68 65 20 65 6e 63 6f 64 69 cover the encodi
6f890 6e 67 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 ng of a database
6f8a0 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 45 ...*/..#define E
6f8b0 4e 43 28 64 62 29 20 28 28 64 62 29 2d 3e 61 44 NC(db) ((db)->aD
6f8c0 62 5b 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 65 6e b[0].pSchema->en
6f8d0 63 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 73 c)..../*..** Pos
6f8e0 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 sible values for
6f8f0 20 74 68 65 20 73 71 6c 69 74 65 33 2e 66 6c 61 the sqlite3.fla
6f900 67 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 gs...*/..#define
6f910 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 SQLITE_VdbeTrac
6f920 65 20 20 20 20 20 20 30 78 30 30 30 30 30 31 30 e 0x0000010
6f930 30 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 74 72 0 /* True to tr
6f940 61 63 65 20 56 44 42 45 20 65 78 65 63 75 74 69 ace VDBE executi
6f950 6f 6e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 on */..#define S
6f960 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e QLITE_InternChan
6f970 67 65 73 20 20 30 78 30 30 30 30 30 32 30 30 20 ges 0x00000200
6f980 20 2f 2a 20 55 6e 63 6f 6d 6d 69 74 74 65 64 20 /* Uncommitted
6f990 48 61 73 68 20 74 61 62 6c 65 20 63 68 61 6e 67 Hash table chang
6f9a0 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 es */..#define S
6f9b0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d QLITE_FullColNam
6f9c0 65 73 20 20 20 30 78 30 30 30 30 30 34 30 30 20 es 0x00000400
6f9d0 20 2f 2a 20 53 68 6f 77 20 66 75 6c 6c 20 63 6f /* Show full co
6f9e0 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 6e 20 53 45 lumn names on SE
6f9f0 4c 45 43 54 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 LECT */..#define
6fa00 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c SQLITE_ShortCol
6fa10 4e 61 6d 65 73 20 20 30 78 30 30 30 30 30 38 30 Names 0x0000080
6fa20 30 20 20 2f 2a 20 53 68 6f 77 20 73 68 6f 72 74 0 /* Show short
6fa30 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 2a columns names *
6fa40 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
6fa50 45 5f 43 6f 75 6e 74 52 6f 77 73 20 20 20 20 20 E_CountRows
6fa60 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 0x00001000 /*
6fa70 43 6f 75 6e 74 20 72 6f 77 73 20 63 68 61 6e 67 Count rows chang
6fa80 65 64 20 62 79 20 49 4e 53 45 52 54 2c 20 2a 2f ed by INSERT, */
6fa90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
6faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 /*
6fac0 20 44 45 4c 45 54 45 2c 20 6f 72 20 55 50 44 41 DELETE, or UPDA
6fad0 54 45 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f TE and return */
6fae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
6faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 /*
6fb10 20 74 68 65 20 63 6f 75 6e 74 20 75 73 69 6e 67 the count using
6fb20 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0d a callback. */.
6fb30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
6fb40 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 20 20 20 30 NullCallback 0
6fb50 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20 49 6e x00002000 /* In
6fb60 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 voke the callbac
6fb70 6b 20 6f 6e 63 65 20 69 66 20 74 68 65 20 2a 2f k once if the */
6fb80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
6fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 /*
6fbb0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 result set is e
6fbc0 6d 70 74 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 mpty */..#define
6fbd0 20 53 51 4c 49 54 45 5f 53 71 6c 54 72 61 63 65 SQLITE_SqlTrace
6fbe0 20 20 20 20 20 20 20 30 78 30 30 30 30 34 30 30 0x0000400
6fbf0 30 20 20 2f 2a 20 44 65 62 75 67 20 70 72 69 6e 0 /* Debug prin
6fc00 74 20 53 51 4c 20 61 73 20 69 74 20 65 78 65 63 t SQL as it exec
6fc10 75 74 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 utes */..#define
6fc20 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 SQLITE_VdbeList
6fc30 69 6e 67 20 20 20 20 30 78 30 30 30 30 38 30 30 ing 0x0000800
6fc40 30 20 20 2f 2a 20 44 65 62 75 67 20 6c 69 73 74 0 /* Debug list
6fc50 69 6e 67 73 20 6f 66 20 56 44 42 45 20 70 72 6f ings of VDBE pro
6fc60 67 72 61 6d 73 20 2a 2f 0d 0a 23 64 65 66 69 6e grams */..#defin
6fc70 65 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 e SQLITE_WriteSc
6fc80 68 65 6d 61 20 20 20 20 30 78 30 30 30 31 30 30 hema 0x000100
6fc90 30 30 20 20 2f 2a 20 4f 4b 20 74 6f 20 75 70 64 00 /* OK to upd
6fca0 61 74 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 ate SQLITE_MASTE
6fcb0 52 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 R */..#define SQ
6fcc0 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 LITE_NoReadlock
6fcd0 20 20 20 20 30 78 30 30 30 32 30 30 30 30 20 20 0x00020000
6fce0 2f 2a 20 52 65 61 64 6c 6f 63 6b 73 20 61 72 65 /* Readlocks are
6fcf0 20 6f 6d 69 74 74 65 64 20 77 68 65 6e 20 0d 0a omitted when ..
6fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fd20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 63 63 ** acc
6fd30 65 73 73 69 6e 67 20 72 65 61 64 2d 6f 6e 6c 79 essing read-only
6fd40 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0d 0a 23 databases */..#
6fd50 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 67 define SQLITE_Ig
6fd60 6e 6f 72 65 43 68 65 63 6b 73 20 20 20 30 78 30 noreChecks 0x0
6fd70 30 30 34 30 30 30 30 20 20 2f 2a 20 44 6f 20 6e 0040000 /* Do n
6fd80 6f 74 20 65 6e 66 6f 72 63 65 20 63 68 65 63 6b ot enforce check
6fd90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0d constraints */.
6fda0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
6fdb0 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 ReadUncommitted
6fdc0 30 78 30 30 38 30 30 30 30 20 20 2f 2a 20 46 6f 0x0080000 /* Fo
6fdd0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d r shared-cache m
6fde0 6f 64 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ode */..#define
6fdf0 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c SQLITE_LegacyFil
6fe00 65 46 6d 74 20 20 30 78 30 30 31 30 30 30 30 30 eFmt 0x00100000
6fe10 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 /* Create new
6fe20 64 61 74 61 62 61 73 65 73 20 69 6e 20 66 6f 72 databases in for
6fe30 6d 61 74 20 31 20 2a 2f 0d 0a 23 64 65 66 69 6e mat 1 */..#defin
6fe40 65 20 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 e SQLITE_FullFSy
6fe50 6e 63 20 20 20 20 20 20 30 78 30 30 32 30 30 30 nc 0x002000
6fe60 30 30 20 20 2f 2a 20 55 73 65 20 66 75 6c 6c 20 00 /* Use full
6fe70 66 73 79 6e 63 20 6f 6e 20 74 68 65 20 62 61 63 fsync on the bac
6fe80 6b 65 6e 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 kend */..#define
6fe90 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c SQLITE_CkptFull
6fea0 46 53 79 6e 63 20 20 30 78 30 30 34 30 30 30 30 FSync 0x0040000
6feb0 30 20 20 2f 2a 20 55 73 65 20 66 75 6c 6c 20 66 0 /* Use full f
6fec0 73 79 6e 63 20 66 6f 72 20 63 68 65 63 6b 70 6f sync for checkpo
6fed0 69 6e 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 int */..#define
6fee0 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d SQLITE_RecoveryM
6fef0 6f 64 65 20 20 20 30 78 30 30 38 30 30 30 30 30 ode 0x00800000
6ff00 20 20 2f 2a 20 49 67 6e 6f 72 65 20 73 63 68 65 /* Ignore sche
6ff10 6d 61 20 65 72 72 6f 72 73 20 2a 2f 0d 0a 23 64 ma errors */..#d
6ff20 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 65 76 efine SQLITE_Rev
6ff30 65 72 73 65 4f 72 64 65 72 20 20 20 30 78 30 31 erseOrder 0x01
6ff40 30 30 30 30 30 30 20 20 2f 2a 20 52 65 76 65 72 000000 /* Rever
6ff50 73 65 20 75 6e 6f 72 64 65 72 65 64 20 53 45 4c se unordered SEL
6ff60 45 43 54 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ECTs */..#define
6ff70 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 SQLITE_RecTrigg
6ff80 65 72 73 20 20 20 20 30 78 30 32 30 30 30 30 30 ers 0x0200000
6ff90 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20 72 65 63 0 /* Enable rec
6ffa0 75 72 73 69 76 65 20 74 72 69 67 67 65 72 73 20 ursive triggers
6ffb0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
6ffc0 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 TE_ForeignKeys
6ffd0 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a 0x04000000 /*
6ffe0 20 45 6e 66 6f 72 63 65 20 66 6f 72 65 69 67 6e Enforce foreign
6fff0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 key constraints
70000 20 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 */..#define SQ
70010 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 20 LITE_AutoIndex
70020 20 20 20 20 30 78 30 38 30 30 30 30 30 30 20 20 0x08000000
70030 2f 2a 20 45 6e 61 62 6c 65 20 61 75 74 6f 6d 61 /* Enable automa
70040 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0d 0a tic indexes */..
70050 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 #define SQLITE_P
70060 72 65 66 65 72 42 75 69 6c 74 69 6e 20 20 30 78 referBuiltin 0x
70070 31 30 30 30 30 30 30 30 20 20 2f 2a 20 50 72 65 10000000 /* Pre
70080 66 65 72 65 6e 63 65 20 74 6f 20 62 75 69 6c 74 ference to built
70090 2d 69 6e 20 66 75 6e 63 73 20 2a 2f 0d 0a 23 64 -in funcs */..#d
700a0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 6f 61 efine SQLITE_Loa
700b0 64 45 78 74 65 6e 73 69 6f 6e 20 20 30 78 32 30 dExtension 0x20
700c0 30 30 30 30 30 30 20 20 2f 2a 20 45 6e 61 62 6c 000000 /* Enabl
700d0 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e e load_extension
700e0 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
700f0 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 ITE_EnableTrigge
70100 72 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f r 0x40000000 /
70110 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 * True to enable
70120 20 74 72 69 67 67 65 72 73 20 2a 2f 0d 0a 0d 0a triggers */....
70130 2f 2a 0d 0a 2a 2a 20 42 69 74 73 20 6f 66 20 74 /*..** Bits of t
70140 68 65 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 he sqlite3.flags
70150 20 66 69 65 6c 64 20 74 68 61 74 20 61 72 65 20 field that are
70160 75 73 65 64 20 62 79 20 74 68 65 0d 0a 2a 2a 20 used by the..**
70170 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e sqlite3_test_con
70180 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 trol(SQLITE_TEST
70190 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f CTRL_OPTIMIZATIO
701a0 4e 53 2c 2e 2e 2e 29 20 69 6e 74 65 72 66 61 63 NS,...) interfac
701b0 65 2e 0d 0a 2a 2a 20 54 68 65 73 65 20 6d 75 73 e...** These mus
701c0 74 20 62 65 20 74 68 65 20 6c 6f 77 2d 6f 72 64 t be the low-ord
701d0 65 72 20 62 69 74 73 20 6f 66 20 74 68 65 20 66 er bits of the f
701e0 6c 61 67 73 20 66 69 65 6c 64 2e 0d 0a 2a 2f 0d lags field...*/.
701f0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
70200 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 30 QueryFlattener 0
70210 78 30 31 20 20 20 20 20 20 20 20 2f 2a 20 44 69 x01 /* Di
70220 73 61 62 6c 65 20 71 75 65 72 79 20 66 6c 61 74 sable query flat
70230 74 65 6e 69 6e 67 20 2a 2f 0d 0a 23 64 65 66 69 tening */..#defi
70240 6e 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e ne SQLITE_Column
70250 43 61 63 68 65 20 20 20 20 30 78 30 32 20 20 20 Cache 0x02
70260 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 /* Disable
70270 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 the column cache
70280 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
70290 49 54 45 5f 49 6e 64 65 78 53 6f 72 74 20 20 20 ITE_IndexSort
702a0 20 20 20 30 78 30 34 20 20 20 20 20 20 20 20 2f 0x04 /
702b0 2a 20 44 69 73 61 62 6c 65 20 69 6e 64 65 78 65 * Disable indexe
702c0 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f s for sorting */
702d0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
702e0 5f 49 6e 64 65 78 53 65 61 72 63 68 20 20 20 20 _IndexSearch
702f0 30 78 30 38 20 20 20 20 20 20 20 20 2f 2a 20 44 0x08 /* D
70300 69 73 61 62 6c 65 20 69 6e 64 65 78 65 73 20 66 isable indexes f
70310 6f 72 20 73 65 61 72 63 68 69 6e 67 20 2a 2f 0d or searching */.
70320 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
70330 49 6e 64 65 78 43 6f 76 65 72 20 20 20 20 20 30 IndexCover 0
70340 78 31 30 20 20 20 20 20 20 20 20 2f 2a 20 44 69 x10 /* Di
70350 73 61 62 6c 65 20 69 6e 64 65 78 20 63 6f 76 65 sable index cove
70360 72 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0d 0a 23 ring table */..#
70370 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 47 72 define SQLITE_Gr
70380 6f 75 70 42 79 4f 72 64 65 72 20 20 20 30 78 32 oupByOrder 0x2
70390 30 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 0 /* Disa
703a0 62 6c 65 20 47 52 4f 55 50 42 59 20 63 6f 76 65 ble GROUPBY cove
703b0 72 20 6f 66 20 4f 52 44 45 52 42 59 20 2a 2f 0d r of ORDERBY */.
703c0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
703d0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 30 FactorOutConst 0
703e0 78 34 30 20 20 20 20 20 20 20 20 2f 2a 20 44 69 x40 /* Di
703f0 73 61 62 6c 65 20 66 61 63 74 6f 72 69 6e 67 20 sable factoring
70400 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f out constants */
70410 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
70420 5f 49 64 78 52 65 61 6c 41 73 49 6e 74 20 20 20 _IdxRealAsInt
70430 30 78 38 30 20 20 20 20 20 20 20 20 2f 2a 20 53 0x80 /* S
70440 74 6f 72 65 20 52 45 41 4c 20 61 73 20 49 4e 54 tore REAL as INT
70450 20 69 6e 20 69 6e 64 69 63 65 73 20 2a 2f 0d 0a in indices */..
70460 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 #define SQLITE_D
70470 69 73 74 69 6e 63 74 4f 70 74 20 20 20 20 30 78 istinctOpt 0x
70480 38 30 20 20 20 20 20 20 20 20 2f 2a 20 44 49 53 80 /* DIS
70490 54 49 4e 43 54 20 75 73 69 6e 67 20 69 6e 64 65 TINCT using inde
704a0 78 65 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 xes */..#define
704b0 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 20 20 SQLITE_OptMask
704c0 20 20 20 20 20 20 30 78 66 66 20 20 20 20 20 20 0xff
704d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c /* Mask of all
704e0 20 64 69 73 61 62 6c 61 62 6c 65 20 6f 70 74 73 disablable opts
704f0 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f */..../*..** Po
70500 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f ssible values fo
70510 72 20 74 68 65 20 73 71 6c 69 74 65 2e 6d 61 67 r the sqlite.mag
70520 69 63 20 66 69 65 6c 64 2e 0d 0a 2a 2a 20 54 68 ic field...** Th
70530 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6f 62 e numbers are ob
70540 74 61 69 6e 65 64 20 61 74 20 72 61 6e 64 6f 6d tained at random
70550 20 61 6e 64 20 68 61 76 65 20 6e 6f 20 73 70 65 and have no spe
70560 63 69 61 6c 20 6d 65 61 6e 69 6e 67 2c 20 6f 74 cial meaning, ot
70570 68 65 72 0d 0a 2a 2a 20 74 68 61 6e 20 62 65 69 her..** than bei
70580 6e 67 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d ng distinct from
70590 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 0d 0a 2a one another...*
705a0 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
705b0 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 20 20 20 E_MAGIC_OPEN
705c0 20 30 78 61 30 32 39 61 36 39 37 20 20 2f 2a 20 0xa029a697 /*
705d0 44 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e Database is open
705e0 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c */..#define SQL
705f0 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 ITE_MAGIC_CLOSED
70600 20 20 20 30 78 39 66 33 63 32 64 33 33 20 20 2f 0x9f3c2d33 /
70610 2a 20 44 61 74 61 62 61 73 65 20 69 73 20 63 6c * Database is cl
70620 6f 73 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 osed */..#define
70630 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 SQLITE_MAGIC_SI
70640 43 4b 20 20 20 20 20 30 78 34 62 37 37 31 32 39 CK 0x4b77129
70650 30 20 20 2f 2a 20 45 72 72 6f 72 20 61 6e 64 20 0 /* Error and
70660 61 77 61 69 74 69 6e 67 20 63 6c 6f 73 65 20 2a awaiting close *
70670 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
70680 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 20 20 20 E_MAGIC_BUSY
70690 20 30 78 66 30 33 62 37 39 30 36 20 20 2f 2a 20 0xf03b7906 /*
706a0 44 61 74 61 62 61 73 65 20 63 75 72 72 65 6e 74 Database current
706b0 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0d 0a 23 64 ly in use */..#d
706c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 47 efine SQLITE_MAG
706d0 49 43 5f 45 52 52 4f 52 20 20 20 20 30 78 62 35 IC_ERROR 0xb5
706e0 33 35 37 39 33 30 20 20 2f 2a 20 41 6e 20 53 51 357930 /* An SQ
706f0 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f LITE_MISUSE erro
70700 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0d 0a 0d r occurred */...
70710 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 53 51 4c ./*..** Each SQL
70720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 66 function is def
70730 69 6e 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 ined by an insta
70740 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nce of the follo
70750 77 69 6e 67 0d 0a 2a 2a 20 73 74 72 75 63 74 75 wing..** structu
70760 72 65 2e 20 20 41 20 70 6f 69 6e 74 65 72 20 74 re. A pointer t
70770 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 o this structure
70780 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 is stored in th
70790 65 20 73 71 6c 69 74 65 2e 61 46 75 6e 63 0d 0a e sqlite.aFunc..
707a0 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 ** hash table.
707b0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 66 75 When multiple fu
707c0 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 nctions have the
707d0 20 73 61 6d 65 20 6e 61 6d 65 2c 20 74 68 65 20 same name, the
707e0 68 61 73 68 20 74 61 62 6c 65 0d 0a 2a 2a 20 70 hash table..** p
707f0 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 oints to a linke
70800 64 20 6c 69 73 74 20 6f 66 20 74 68 65 73 65 20 d list of these
70810 73 74 72 75 63 74 75 72 65 73 2e 0d 0a 2a 2f 0d structures...*/.
70820 0a 73 74 72 75 63 74 20 46 75 6e 63 44 65 66 20 .struct FuncDef
70830 7b 0d 0a 20 20 69 31 36 20 6e 41 72 67 3b 20 20 {.. i16 nArg;
70840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
70850 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
70860 2e 20 20 2d 31 20 6d 65 61 6e 73 20 75 6e 6c 69 . -1 means unli
70870 6d 69 74 65 64 20 2a 2f 0d 0a 20 20 75 38 20 69 mited */.. u8 i
70880 50 72 65 66 45 6e 63 3b 20 20 20 20 20 20 20 20 PrefEnc;
70890 20 2f 2a 20 50 72 65 66 65 72 72 65 64 20 74 65 /* Preferred te
708a0 78 74 20 65 6e 63 6f 64 69 6e 67 20 28 53 51 4c xt encoding (SQL
708b0 49 54 45 5f 55 54 46 38 2c 20 31 36 4c 45 2c 20 ITE_UTF8, 16LE,
708c0 31 36 42 45 29 20 2a 2f 0d 0a 20 20 75 38 20 66 16BE) */.. u8 f
708d0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 lags;
708e0 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 62 69 6e 61 /* Some combina
708f0 74 69 6f 6e 20 6f 66 20 53 51 4c 49 54 45 5f 46 tion of SQLITE_F
70900 55 4e 43 5f 2a 20 2a 2f 0d 0a 20 20 76 6f 69 64 UNC_* */.. void
70910 20 2a 70 55 73 65 72 44 61 74 61 3b 20 20 20 20 *pUserData;
70920 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 70 61 /* User data pa
70930 72 61 6d 65 74 65 72 20 2a 2f 0d 0a 20 20 46 75 rameter */.. Fu
70940 6e 63 44 65 66 20 2a 70 4e 65 78 74 3b 20 20 20 ncDef *pNext;
70950 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 /* Next funct
70960 69 6f 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61 ion with same na
70970 6d 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a me */.. void (*
70980 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 xFunc)(sqlite3_c
70990 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 ontext*,int,sqli
709a0 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 20 2f 2a te3_value**); /*
709b0 20 52 65 67 75 6c 61 72 20 66 75 6e 63 74 69 6f Regular functio
709c0 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 n */.. void (*x
709d0 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f Step)(sqlite3_co
709e0 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 ntext*,int,sqlit
709f0 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 20 2f 2a 20 e3_value**); /*
70a00 41 67 67 72 65 67 61 74 65 20 73 74 65 70 20 2a Aggregate step *
70a10 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e /.. void (*xFin
70a20 61 6c 69 7a 65 29 28 73 71 6c 69 74 65 33 5f 63 alize)(sqlite3_c
70a30 6f 6e 74 65 78 74 2a 29 3b 20 20 20 20 20 20 20 ontext*);
70a40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67 67 72 /* Aggr
70a50 65 67 61 74 65 20 66 69 6e 61 6c 69 7a 65 72 20 egate finalizer
70a60 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d */.. char *zNam
70a70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 e; /* SQ
70a80 4c 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 L name of the fu
70a90 6e 63 74 69 6f 6e 2e 20 2a 2f 0d 0a 20 20 46 75 nction. */.. Fu
70aa0 6e 63 44 65 66 20 2a 70 48 61 73 68 3b 20 20 20 ncDef *pHash;
70ab0 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 74 68 20 /* Next with
70ac0 61 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 a different name
70ad0 20 62 75 74 20 74 68 65 20 73 61 6d 65 20 68 61 but the same ha
70ae0 73 68 20 2a 2f 0d 0a 20 20 46 75 6e 63 44 65 73 sh */.. FuncDes
70af0 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 tructor *pDestru
70b00 63 74 6f 72 3b 20 20 20 2f 2a 20 52 65 66 65 72 ctor; /* Refer
70b10 65 6e 63 65 20 63 6f 75 6e 74 65 64 20 64 65 73 ence counted des
70b20 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e tructor function
70b30 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
70b40 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 * This structure
70b50 20 65 6e 63 61 70 73 75 6c 61 74 65 73 20 61 20 encapsulates a
70b60 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 65 user-function de
70b70 73 74 72 75 63 74 6f 72 20 63 61 6c 6c 62 61 63 structor callbac
70b80 6b 20 28 61 73 0d 0a 2a 2a 20 63 6f 6e 66 69 67 k (as..** config
70b90 75 72 65 64 20 75 73 69 6e 67 20 63 72 65 61 74 ured using creat
70ba0 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 29 29 e_function_v2())
70bb0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 and a reference
70bc0 20 63 6f 75 6e 74 65 72 2e 20 57 68 65 6e 0d 0a counter. When..
70bd0 2a 2a 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 ** create_functi
70be0 6f 6e 5f 76 32 28 29 20 69 73 20 63 61 6c 6c 65 on_v2() is calle
70bf0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 d to create a fu
70c00 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 64 65 nction with a de
70c10 73 74 72 75 63 74 6f 72 2c 0d 0a 2a 2a 20 61 20 structor,..** a
70c20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 6f 66 single object of
70c30 20 74 68 69 73 20 74 79 70 65 20 69 73 20 61 6c this type is al
70c40 6c 6f 63 61 74 65 64 2e 20 46 75 6e 63 44 65 73 located. FuncDes
70c50 74 72 75 63 74 6f 72 2e 6e 52 65 66 20 69 73 20 tructor.nRef is
70c60 73 65 74 20 74 6f 20 0d 0a 2a 2a 20 74 68 65 20 set to ..** the
70c70 6e 75 6d 62 65 72 20 6f 66 20 46 75 6e 63 44 65 number of FuncDe
70c80 66 20 6f 62 6a 65 63 74 73 20 63 72 65 61 74 65 f objects create
70c90 64 20 28 65 69 74 68 65 72 20 31 20 6f 72 20 33 d (either 1 or 3
70ca0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 , depending on w
70cb0 68 65 74 68 65 72 0d 0a 2a 2a 20 6f 72 20 6e 6f hether..** or no
70cc0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 t the specified
70cd0 65 6e 63 6f 64 69 6e 67 20 69 73 20 53 51 4c 49 encoding is SQLI
70ce0 54 45 5f 41 4e 59 29 2e 20 54 68 65 20 46 75 6e TE_ANY). The Fun
70cf0 63 44 65 66 2e 70 44 65 73 74 72 75 63 74 6f 72 cDef.pDestructor
70d00 0d 0a 2a 2a 20 6d 65 6d 62 65 72 20 6f 66 20 65 ..** member of e
70d10 61 63 68 20 6f 66 20 74 68 65 20 6e 65 77 20 46 ach of the new F
70d20 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 20 69 uncDef objects i
70d30 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 s set to point t
70d40 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0d o the allocated.
70d50 0a 2a 2a 20 46 75 6e 63 44 65 73 74 72 75 63 74 .** FuncDestruct
70d60 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 or...**..** Ther
70d70 65 61 66 74 65 72 2c 20 77 68 65 6e 20 6f 6e 65 eafter, when one
70d80 20 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 of the FuncDef
70d90 6f 62 6a 65 63 74 73 20 69 73 20 64 65 6c 65 74 objects is delet
70da0 65 64 2c 20 74 68 65 20 72 65 66 65 72 65 6e 63 ed, the referenc
70db0 65 0d 0a 2a 2a 20 63 6f 75 6e 74 20 6f 6e 20 74 e..** count on t
70dc0 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 64 65 his object is de
70dd0 63 72 65 6d 65 6e 74 65 64 2e 20 57 68 65 6e 20 cremented. When
70de0 69 74 20 72 65 61 63 68 65 73 20 30 2c 20 74 68 it reaches 0, th
70df0 65 20 64 65 73 74 72 75 63 74 6f 72 0d 0a 2a 2a e destructor..**
70e00 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 6e 64 20 is invoked and
70e10 74 68 65 20 46 75 6e 63 44 65 73 74 72 75 63 74 the FuncDestruct
70e20 6f 72 20 73 74 72 75 63 74 75 72 65 20 66 72 65 or structure fre
70e30 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 ed...*/..struct
70e40 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 7b FuncDestructor {
70e50 0d 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0d 0a 20 .. int nRef;..
70e60 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 void (*xDestroy
70e70 29 28 76 6f 69 64 20 2a 29 3b 0d 0a 20 20 76 6f )(void *);.. vo
70e80 69 64 20 2a 70 55 73 65 72 44 61 74 61 3b 0d 0a id *pUserData;..
70e90 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 73 };..../*..** Pos
70ea0 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 sible values for
70eb0 20 46 75 6e 63 44 65 66 2e 66 6c 61 67 73 0d 0a FuncDef.flags..
70ec0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
70ed0 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 20 20 20 TE_FUNC_LIKE
70ee0 20 30 78 30 31 20 2f 2a 20 43 61 6e 64 69 64 61 0x01 /* Candida
70ef0 74 65 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20 te for the LIKE
70f00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0d optimization */.
70f10 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
70f20 46 55 4e 43 5f 43 41 53 45 20 20 20 20 20 30 78 FUNC_CASE 0x
70f30 30 32 20 2f 2a 20 43 61 73 65 2d 73 65 6e 73 69 02 /* Case-sensi
70f40 74 69 76 65 20 4c 49 4b 45 2d 74 79 70 65 20 66 tive LIKE-type f
70f50 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 23 64 65 66 unction */..#def
70f60 69 6e 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f ine SQLITE_FUNC_
70f70 45 50 48 45 4d 20 20 20 20 30 78 30 34 20 2f 2a EPHEM 0x04 /*
70f80 20 45 70 68 65 6d 65 72 61 6c 2e 20 20 44 65 6c Ephemeral. Del
70f90 65 74 65 20 77 69 74 68 20 56 44 42 45 20 2a 2f ete with VDBE */
70fa0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
70fb0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 30 _FUNC_NEEDCOLL 0
70fc0 78 30 38 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 x08 /* sqlite3Ge
70fd0 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 20 6d tFuncCollSeq() m
70fe0 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 2a ight be called *
70ff0 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
71000 45 5f 46 55 4e 43 5f 50 52 49 56 41 54 45 20 20 E_FUNC_PRIVATE
71010 30 78 31 30 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 0x10 /* Allowed
71020 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 for internal use
71030 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e only */..#defin
71040 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f e SQLITE_FUNC_CO
71050 55 4e 54 20 20 20 20 30 78 32 30 20 2f 2a 20 42 UNT 0x20 /* B
71060 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 2a 29 uilt-in count(*)
71070 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0d 0a 23 aggregate */..#
71080 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 55 define SQLITE_FU
71090 4e 43 5f 43 4f 41 4c 45 53 43 45 20 30 78 34 30 NC_COALESCE 0x40
710a0 20 2f 2a 20 42 75 69 6c 74 2d 69 6e 20 63 6f 61 /* Built-in coa
710b0 6c 65 73 63 65 28 29 20 6f 72 20 69 66 6e 75 6c lesce() or ifnul
710c0 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d l() function */.
710d0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f .../*..** The fo
710e0 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 6d 61 llowing three ma
710f0 63 72 6f 73 2c 20 46 55 4e 43 54 49 4f 4e 28 29 cros, FUNCTION()
71100 2c 20 4c 49 4b 45 46 55 4e 43 28 29 20 61 6e 64 , LIKEFUNC() and
71110 20 41 47 47 52 45 47 41 54 45 28 29 20 61 72 65 AGGREGATE() are
71120 0d 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63 72 65 ..** used to cre
71130 61 74 65 20 74 68 65 20 69 6e 69 74 69 61 6c 69 ate the initiali
71140 7a 65 72 73 20 66 6f 72 20 74 68 65 20 46 75 6e zers for the Fun
71150 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73 2e cDef structures.
71160 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 46 55 4e 43 54 ..**..** FUNCT
71170 49 4f 4e 28 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c ION(zName, nArg,
71180 20 69 41 72 67 2c 20 62 4e 43 2c 20 78 46 75 6e iArg, bNC, xFun
71190 63 29 0d 0a 2a 2a 20 20 20 20 20 55 73 65 64 20 c)..** Used
711a0 74 6f 20 63 72 65 61 74 65 20 61 20 73 63 61 6c to create a scal
711b0 61 72 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 ar function defi
711c0 6e 69 74 69 6f 6e 20 6f 66 20 61 20 66 75 6e 63 nition of a func
711d0 74 69 6f 6e 20 7a 4e 61 6d 65 20 0d 0a 2a 2a 20 tion zName ..**
711e0 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 implemented
711f0 62 79 20 43 20 66 75 6e 63 74 69 6f 6e 20 78 46 by C function xF
71200 75 6e 63 20 74 68 61 74 20 61 63 63 65 70 74 73 unc that accepts
71210 20 6e 41 72 67 20 61 72 67 75 6d 65 6e 74 73 2e nArg arguments.
71220 20 54 68 65 0d 0a 2a 2a 20 20 20 20 20 76 61 6c The..** val
71230 75 65 20 70 61 73 73 65 64 20 61 73 20 69 41 72 ue passed as iAr
71240 67 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 28 g is cast to a (
71250 76 6f 69 64 2a 29 20 61 6e 64 20 6d 61 64 65 20 void*) and made
71260 61 76 61 69 6c 61 62 6c 65 0d 0a 2a 2a 20 20 20 available..**
71270 20 20 61 73 20 74 68 65 20 75 73 65 72 2d 64 61 as the user-da
71280 74 61 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72 ta (sqlite3_user
71290 5f 64 61 74 61 28 29 29 20 66 6f 72 20 74 68 65 _data()) for the
712a0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 0d 0a function. If ..
712b0 2a 2a 20 20 20 20 20 61 72 67 75 6d 65 6e 74 20 ** argument
712c0 62 4e 43 20 69 73 20 74 72 75 65 2c 20 74 68 65 bNC is true, the
712d0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e n the SQLITE_FUN
712e0 43 5f 4e 45 45 44 43 4f 4c 4c 20 66 6c 61 67 20 C_NEEDCOLL flag
712f0 69 73 20 73 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 is set...**..**
71300 20 20 41 47 47 52 45 47 41 54 45 28 7a 4e 61 6d AGGREGATE(zNam
71310 65 2c 20 6e 41 72 67 2c 20 69 41 72 67 2c 20 62 e, nArg, iArg, b
71320 4e 43 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 NC, xStep, xFina
71330 6c 29 0d 0a 2a 2a 20 20 20 20 20 55 73 65 64 20 l)..** Used
71340 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 67 67 to create an agg
71350 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 regate function
71360 64 65 66 69 6e 69 74 69 6f 6e 20 69 6d 70 6c 65 definition imple
71370 6d 65 6e 74 65 64 20 62 79 0d 0a 2a 2a 20 20 20 mented by..**
71380 20 20 74 68 65 20 43 20 66 75 6e 63 74 69 6f 6e the C function
71390 73 20 78 53 74 65 70 20 61 6e 64 20 78 46 69 6e s xStep and xFin
713a0 61 6c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f al. The first fo
713b0 75 72 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 2a ur parameters..*
713c0 2a 20 20 20 20 20 61 72 65 20 69 6e 74 65 72 70 * are interp
713d0 72 65 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d reted in the sam
713e0 65 20 77 61 79 20 61 73 20 74 68 65 20 66 69 72 e way as the fir
713f0 73 74 20 34 20 70 61 72 61 6d 65 74 65 72 73 20 st 4 parameters
71400 74 6f 0d 0a 2a 2a 20 20 20 20 20 46 55 4e 43 54 to..** FUNCT
71410 49 4f 4e 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ION()...**..**
71420 20 4c 49 4b 45 46 55 4e 43 28 7a 4e 61 6d 65 2c LIKEFUNC(zName,
71430 20 6e 41 72 67 2c 20 70 41 72 67 2c 20 66 6c 61 nArg, pArg, fla
71440 67 73 29 0d 0a 2a 2a 20 20 20 20 20 55 73 65 64 gs)..** Used
71450 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 63 61 to create a sca
71460 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 lar function def
71470 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20 66 75 6e inition of a fun
71480 63 74 69 6f 6e 20 7a 4e 61 6d 65 20 0d 0a 2a 2a ction zName ..**
71490 20 20 20 20 20 74 68 61 74 20 61 63 63 65 70 74 that accept
714a0 73 20 6e 41 72 67 20 61 72 67 75 6d 65 6e 74 73 s nArg arguments
714b0 20 61 6e 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e and is implemen
714c0 74 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f ted by a call to
714d0 20 43 20 0d 0a 2a 2a 20 20 20 20 20 66 75 6e 63 C ..** func
714e0 74 69 6f 6e 20 6c 69 6b 65 46 75 6e 63 2e 20 41 tion likeFunc. A
714f0 72 67 75 6d 65 6e 74 20 70 41 72 67 20 69 73 20 rgument pArg is
71500 63 61 73 74 20 74 6f 20 61 20 28 76 6f 69 64 20 cast to a (void
71510 2a 29 20 61 6e 64 20 6d 61 64 65 0d 0a 2a 2a 20 *) and made..**
71520 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 61 73 available as
71530 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 75 73 the function us
71540 65 72 2d 64 61 74 61 20 28 73 71 6c 69 74 65 33 er-data (sqlite3
71550 5f 75 73 65 72 5f 64 61 74 61 28 29 29 2e 20 54 _user_data()). T
71560 68 65 0d 0a 2a 2a 20 20 20 20 20 46 75 6e 63 44 he..** FuncD
71570 65 66 2e 66 6c 61 67 73 20 76 61 72 69 61 62 6c ef.flags variabl
71580 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 e is set to the
71590 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 value passed as
715a0 74 68 65 20 66 6c 61 67 73 0d 0a 2a 2a 20 20 20 the flags..**
715b0 20 20 70 61 72 61 6d 65 74 65 72 2e 0d 0a 2a 2f parameter...*/
715c0 0d 0a 23 64 65 66 69 6e 65 20 46 55 4e 43 54 49 ..#define FUNCTI
715d0 4f 4e 28 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 ON(zName, nArg,
715e0 69 41 72 67 2c 20 62 4e 43 2c 20 78 46 75 6e 63 iArg, bNC, xFunc
715f0 29 20 5c 0d 0a 20 20 7b 6e 41 72 67 2c 20 53 51 ) \.. {nArg, SQ
71600 4c 49 54 45 5f 55 54 46 38 2c 20 62 4e 43 2a 53 LITE_UTF8, bNC*S
71610 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 QLITE_FUNC_NEEDC
71620 4f 4c 4c 2c 20 5c 0d 0a 20 20 20 53 51 4c 49 54 OLL, \.. SQLIT
71630 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 69 41 72 E_INT_TO_PTR(iAr
71640 67 29 2c 20 30 2c 20 78 46 75 6e 63 2c 20 30 2c g), 0, xFunc, 0,
71650 20 30 2c 20 23 7a 4e 61 6d 65 2c 20 30 2c 20 30 0, #zName, 0, 0
71660 7d 0d 0a 23 64 65 66 69 6e 65 20 53 54 52 5f 46 }..#define STR_F
71670 55 4e 43 54 49 4f 4e 28 7a 4e 61 6d 65 2c 20 6e UNCTION(zName, n
71680 41 72 67 2c 20 70 41 72 67 2c 20 62 4e 43 2c 20 Arg, pArg, bNC,
71690 78 46 75 6e 63 29 20 5c 0d 0a 20 20 7b 6e 41 72 xFunc) \.. {nAr
716a0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 g, SQLITE_UTF8,
716b0 62 4e 43 2a 53 51 4c 49 54 45 5f 46 55 4e 43 5f bNC*SQLITE_FUNC_
716c0 4e 45 45 44 43 4f 4c 4c 2c 20 5c 0d 0a 20 20 20 NEEDCOLL, \..
716d0 70 41 72 67 2c 20 30 2c 20 78 46 75 6e 63 2c 20 pArg, 0, xFunc,
716e0 30 2c 20 30 2c 20 23 7a 4e 61 6d 65 2c 20 30 2c 0, 0, #zName, 0,
716f0 20 30 7d 0d 0a 23 64 65 66 69 6e 65 20 4c 49 4b 0}..#define LIK
71700 45 46 55 4e 43 28 7a 4e 61 6d 65 2c 20 6e 41 72 EFUNC(zName, nAr
71710 67 2c 20 61 72 67 2c 20 66 6c 61 67 73 29 20 5c g, arg, flags) \
71720 0d 0a 20 20 7b 6e 41 72 67 2c 20 53 51 4c 49 54 .. {nArg, SQLIT
71730 45 5f 55 54 46 38 2c 20 66 6c 61 67 73 2c 20 28 E_UTF8, flags, (
71740 76 6f 69 64 20 2a 29 61 72 67 2c 20 30 2c 20 6c void *)arg, 0, l
71750 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 23 ikeFunc, 0, 0, #
71760 7a 4e 61 6d 65 2c 20 30 2c 20 30 7d 0d 0a 23 64 zName, 0, 0}..#d
71770 65 66 69 6e 65 20 41 47 47 52 45 47 41 54 45 28 efine AGGREGATE(
71780 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 61 72 67 zName, nArg, arg
71790 2c 20 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 , nc, xStep, xFi
717a0 6e 61 6c 29 20 5c 0d 0a 20 20 7b 6e 41 72 67 2c nal) \.. {nArg,
717b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 63 SQLITE_UTF8, nc
717c0 2a 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 *SQLITE_FUNC_NEE
717d0 44 43 4f 4c 4c 2c 20 5c 0d 0a 20 20 20 53 51 4c DCOLL, \.. SQL
717e0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 61 ITE_INT_TO_PTR(a
717f0 72 67 29 2c 20 30 2c 20 30 2c 20 78 53 74 65 70 rg), 0, 0, xStep
71800 2c 78 46 69 6e 61 6c 2c 23 7a 4e 61 6d 65 2c 30 ,xFinal,#zName,0
71810 2c 30 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c ,0}..../*..** Al
71820 6c 20 63 75 72 72 65 6e 74 20 73 61 76 65 70 6f l current savepo
71830 69 6e 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 ints are stored
71840 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 in a linked list
71850 20 73 74 61 72 74 69 6e 67 20 61 74 0d 0a 2a 2a starting at..**
71860 20 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f sqlite3.pSavepo
71870 69 6e 74 2e 20 54 68 65 20 66 69 72 73 74 20 65 int. The first e
71880 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 lement in the li
71890 73 74 20 69 73 20 74 68 65 20 6d 6f 73 74 20 72 st is the most r
718a0 65 63 65 6e 74 6c 79 0d 0a 2a 2a 20 6f 70 65 6e ecently..** open
718b0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 53 61 ed savepoint. Sa
718c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 61 64 64 vepoints are add
718d0 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 62 ed to the list b
718e0 79 20 74 68 65 20 76 64 62 65 0d 0a 2a 2a 20 4f y the vdbe..** O
718f0 50 5f 53 61 76 65 70 6f 69 6e 74 20 69 6e 73 74 P_Savepoint inst
71900 72 75 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 ruction...*/..st
71910 72 75 63 74 20 53 61 76 65 70 6f 69 6e 74 20 7b ruct Savepoint {
71920 0d 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b .. char *zName;
71930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
71940 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 70 /* Savep
71950 6f 69 6e 74 20 6e 61 6d 65 20 28 6e 75 6c 2d 74 oint name (nul-t
71960 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0d 0a 20 erminated) */..
71970 20 69 36 34 20 6e 44 65 66 65 72 72 65 64 43 6f i64 nDeferredCo
71980 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ns;
71990 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
719a0 66 20 64 65 66 65 72 72 65 64 20 66 6b 20 76 69 f deferred fk vi
719b0 6f 6c 61 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 53 olations */.. S
719c0 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 78 74 3b avepoint *pNext;
719d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
719e0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 73 61 76 /* Parent sav
719f0 65 70 6f 69 6e 74 20 28 69 66 20 61 6e 79 29 20 epoint (if any)
71a00 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
71a10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 The following a
71a20 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20 73 re used as the s
71a30 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 econd parameter
71a40 74 6f 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f to sqlite3Savepo
71a50 69 6e 74 28 29 2c 0d 0a 2a 2a 20 61 6e 64 20 61 int(),..** and a
71a60 73 20 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e s the P1 argumen
71a70 74 20 74 6f 20 74 68 65 20 4f 50 5f 53 61 76 65 t to the OP_Save
71a80 70 6f 69 6e 74 20 69 6e 73 74 72 75 63 74 69 6f point instructio
71a90 6e 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 n...*/..#define
71aa0 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 SAVEPOINT_BEGIN
71ab0 20 20 20 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 0..#define
71ac0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
71ad0 45 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 E 1..#define
71ae0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
71af0 43 4b 20 20 20 32 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a CK 2....../*..
71b00 2a 2a 20 45 61 63 68 20 53 51 4c 69 74 65 20 6d ** Each SQLite m
71b10 6f 64 75 6c 65 20 28 76 69 72 74 75 61 6c 20 74 odule (virtual t
71b20 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 29 able definition)
71b30 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 61 is defined by a
71b40 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f n..** instance o
71b50 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
71b60 73 74 72 75 63 74 75 72 65 2c 20 73 74 6f 72 65 structure, store
71b70 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 d in the sqlite3
71b80 2e 61 4d 6f 64 75 6c 65 0d 0a 2a 2a 20 68 61 73 .aModule..** has
71b90 68 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 h table...*/..st
71ba0 72 75 63 74 20 4d 6f 64 75 6c 65 20 7b 0d 0a 20 ruct Module {..
71bb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d const sqlite3_m
71bc0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 20 odule *pModule;
71bd0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 /* Callbac
71be0 6b 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0d 0a 20 k pointers */..
71bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
71c00 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 me;
71c10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 70 61 /* Name pa
71c20 73 73 65 64 20 74 6f 20 63 72 65 61 74 65 5f 6d ssed to create_m
71c30 6f 64 75 6c 65 28 29 20 2a 2f 0d 0a 20 20 76 6f odule() */.. vo
71c40 69 64 20 2a 70 41 75 78 3b 20 20 20 20 20 20 20 id *pAux;
71c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
71c60 20 20 20 2f 2a 20 70 41 75 78 20 70 61 73 73 65 /* pAux passe
71c70 64 20 74 6f 20 63 72 65 61 74 65 5f 6d 6f 64 75 d to create_modu
71c80 6c 65 28 29 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 le() */.. void
71c90 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 (*xDestroy)(void
71ca0 20 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 *);
71cb0 2f 2a 20 4d 6f 64 75 6c 65 20 64 65 73 74 72 75 /* Module destru
71cc0 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f ctor function */
71cd0 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 69 ..};..../*..** i
71ce0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 nformation about
71cf0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 each column of
71d00 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 69 73 20 an SQL table is
71d10 68 65 6c 64 20 69 6e 20 61 6e 20 69 6e 73 74 61 held in an insta
71d20 6e 63 65 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 nce..** of this
71d30 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a structure...*/..
71d40 73 74 72 75 63 74 20 43 6f 6c 75 6d 6e 20 7b 0d struct Column {.
71d50 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 . char *zName;
71d60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 /* Name of t
71d70 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 his column */..
71d80 20 45 78 70 72 20 2a 70 44 66 6c 74 3b 20 20 20 Expr *pDflt;
71d90 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c /* Default val
71da0 75 65 20 6f 66 20 74 68 69 73 20 63 6f 6c 75 6d ue of this colum
71db0 6e 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 44 n */.. char *zD
71dc0 66 6c 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 flt; /* Orig
71dd0 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 inal text of the
71de0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a default value *
71df0 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 /.. char *zType
71e00 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 79 ; /* Data ty
71e10 70 65 20 66 6f 72 20 74 68 69 73 20 63 6f 6c 75 pe for this colu
71e20 6d 6e 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a mn */.. char *z
71e30 43 6f 6c 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 6c Coll; /* Col
71e40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e lating sequence.
71e50 20 20 49 66 20 4e 55 4c 4c 2c 20 75 73 65 20 74 If NULL, use t
71e60 68 65 20 64 65 66 61 75 6c 74 20 2a 2f 0d 0a 20 he default */..
71e70 20 75 38 20 6e 6f 74 4e 75 6c 6c 3b 20 20 20 20 u8 notNull;
71e80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 /* True if the
71e90 72 65 20 69 73 20 61 20 4e 4f 54 20 4e 55 4c 4c re is a NOT NULL
71ea0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a constraint */..
71eb0 20 20 75 38 20 69 73 50 72 69 6d 4b 65 79 3b 20 u8 isPrimKey;
71ec0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 /* True if th
71ed0 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72 is column is par
71ee0 74 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 t of the PRIMARY
71ef0 20 4b 45 59 20 2a 2f 0d 0a 20 20 63 68 61 72 20 KEY */.. char
71f00 61 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 4f affinity; /* O
71f10 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 ne of the SQLITE
71f20 5f 41 46 46 5f 2e 2e 2e 20 76 61 6c 75 65 73 20 _AFF_... values
71f30 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
71f40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
71f50 41 42 4c 45 0d 0a 20 20 75 38 20 69 73 48 69 64 ABLE.. u8 isHid
71f60 64 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 den; /* True
71f70 20 69 66 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 if this column
71f80 69 73 20 27 68 69 64 64 65 6e 27 20 2a 2f 0d 0a is 'hidden' */..
71f90 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a #endif..};..../*
71fa0 0d 0a 2a 2a 20 41 20 22 43 6f 6c 6c 61 74 69 6e ..** A "Collatin
71fb0 67 20 53 65 71 75 65 6e 63 65 22 20 69 73 20 64 g Sequence" is d
71fc0 65 66 69 6e 65 64 20 62 79 20 61 6e 20 69 6e 73 efined by an ins
71fd0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c tance of the fol
71fe0 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 73 74 72 75 63 lowing..** struc
71ff0 74 75 72 65 2e 20 43 6f 6e 63 65 70 74 75 61 6c ture. Conceptual
72000 6c 79 2c 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 ly, a collating
72010 73 65 71 75 65 6e 63 65 20 63 6f 6e 73 69 73 74 sequence consist
72020 73 20 6f 66 20 61 20 6e 61 6d 65 20 61 6e 64 0d s of a name and.
72030 0a 2a 2a 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e .** a comparison
72040 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 65 routine that de
72050 66 69 6e 65 73 20 74 68 65 20 6f 72 64 65 72 20 fines the order
72060 6f 66 20 74 68 61 74 20 73 65 71 75 65 6e 63 65 of that sequence
72070 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 20 ...**..** There
72080 6d 61 79 20 74 77 6f 20 73 65 70 61 72 61 74 65 may two separate
72090 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 implementations
720a0 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f of the collatio
720b0 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 6e 65 0d n function, one.
720c0 0a 2a 2a 20 74 68 61 74 20 70 72 6f 63 65 73 73 .** that process
720d0 65 73 20 74 65 78 74 20 69 6e 20 55 54 46 2d 38 es text in UTF-8
720e0 20 65 6e 63 6f 64 69 6e 67 20 28 43 6f 6c 6c 53 encoding (CollS
720f0 65 71 2e 78 43 6d 70 29 20 61 6e 64 20 61 6e 6f eq.xCmp) and ano
72100 74 68 65 72 20 74 68 61 74 0d 0a 2a 2a 20 70 72 ther that..** pr
72110 6f 63 65 73 73 65 73 20 74 65 78 74 20 65 6e 63 ocesses text enc
72120 6f 64 65 64 20 69 6e 20 55 54 46 2d 31 36 20 28 oded in UTF-16 (
72130 43 6f 6c 6c 53 65 71 2e 78 43 6d 70 31 36 29 2c CollSeq.xCmp16),
72140 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 68 69 using the machi
72150 6e 65 0d 0a 2a 2a 20 6e 61 74 69 76 65 20 62 79 ne..** native by
72160 74 65 20 6f 72 64 65 72 2e 20 57 68 65 6e 20 61 te order. When a
72170 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 collation seque
72180 6e 63 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 nce is invoked,
72190 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 0d 0a SQLite selects..
721a0 2a 2a 20 74 68 65 20 76 65 72 73 69 6f 6e 20 74 ** the version t
721b0 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 hat will require
721c0 20 74 68 65 20 6c 65 61 73 74 20 65 78 70 65 6e the least expen
721d0 73 69 76 65 20 65 6e 63 6f 64 69 6e 67 0d 0a 2a sive encoding..*
721e0 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73 2c 20 * translations,
721f0 69 66 20 61 6e 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 if any...**..**
72200 54 68 65 20 43 6f 6c 6c 53 65 71 2e 70 55 73 65 The CollSeq.pUse
72210 72 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c r member variabl
72220 65 20 69 73 20 61 6e 20 65 78 74 72 61 20 70 61 e is an extra pa
72230 72 61 6d 65 74 65 72 20 74 68 61 74 20 70 61 73 rameter that pas
72240 73 65 64 20 69 6e 0d 0a 2a 2a 20 61 73 20 74 68 sed in..** as th
72250 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 e first argument
72260 20 74 6f 20 74 68 65 20 55 54 46 2d 38 20 63 6f to the UTF-8 co
72270 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f mparison functio
72280 6e 2c 20 78 43 6d 70 2e 0d 0a 2a 2a 20 43 6f 6c n, xCmp...** Col
72290 6c 53 65 71 2e 70 55 73 65 72 31 36 20 69 73 20 lSeq.pUser16 is
722a0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 the equivalent f
722b0 6f 72 20 74 68 65 20 55 54 46 2d 31 36 20 63 6f or the UTF-16 co
722c0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f mparison functio
722d0 6e 2c 0d 0a 2a 2a 20 78 43 6d 70 31 36 2e 0d 0a n,..** xCmp16...
722e0 2a 2a 0d 0a 2a 2a 20 49 66 20 62 6f 74 68 20 43 **..** If both C
722f0 6f 6c 6c 53 65 71 2e 78 43 6d 70 20 61 6e 64 20 ollSeq.xCmp and
72300 43 6f 6c 6c 53 65 71 2e 78 43 6d 70 31 36 20 61 CollSeq.xCmp16 a
72310 72 65 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e re NULL, it mean
72320 73 20 74 68 61 74 20 74 68 65 0d 0a 2a 2a 20 63 s that the..** c
72330 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 ollating sequenc
72340 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 e is undefined.
72350 20 49 6e 64 69 63 65 73 20 62 75 69 6c 74 20 6f Indices built o
72360 6e 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0d 0a n an undefined..
72370 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 ** collating seq
72380 75 65 6e 63 65 20 6d 61 79 20 6e 6f 74 20 62 65 uence may not be
72390 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e read or written
723a0 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 43 6f ...*/..struct Co
723b0 6c 6c 53 65 71 20 7b 0d 0a 20 20 63 68 61 72 20 llSeq {.. char
723c0 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 *zName;
723d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 /* Name of the
723e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
723f0 63 65 2c 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 ce, UTF-8 encode
72400 64 20 2a 2f 0d 0a 20 20 75 38 20 65 6e 63 3b 20 d */.. u8 enc;
72410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
72420 20 54 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 68 Text encoding h
72430 61 6e 64 6c 65 64 20 62 79 20 78 43 6d 70 28 29 andled by xCmp()
72440 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 55 73 */.. void *pUs
72450 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 er; /*
72460 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 First argument t
72470 6f 20 78 43 6d 70 28 29 20 2a 2f 0d 0a 20 20 69 o xCmp() */.. i
72480 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a nt (*xCmp)(void*
72490 2c 69 6e 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 ,int, const void
724a0 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 76 6f *, int, const vo
724b0 69 64 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a id*);.. void (*
724c0 78 44 65 6c 29 28 76 6f 69 64 2a 29 3b 20 20 2f xDel)(void*); /
724d0 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 * Destructor for
724e0 20 70 55 73 65 72 20 2a 2f 0d 0a 7d 3b 0d 0a 0d pUser */..};...
724f0 0a 2f 2a 0d 0a 2a 2a 20 41 20 73 6f 72 74 20 6f ./*..** A sort o
72500 72 64 65 72 20 63 61 6e 20 62 65 20 65 69 74 68 rder can be eith
72510 65 72 20 41 53 43 20 6f 72 20 44 45 53 43 2e 0d er ASC or DESC..
72520 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c .*/..#define SQL
72530 49 54 45 5f 53 4f 5f 41 53 43 20 20 20 20 20 20 ITE_SO_ASC
72540 20 30 20 20 2f 2a 20 53 6f 72 74 20 69 6e 20 61 0 /* Sort in a
72550 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a scending order *
72560 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
72570 45 5f 53 4f 5f 44 45 53 43 20 20 20 20 20 20 31 E_SO_DESC 1
72580 20 20 2f 2a 20 53 6f 72 74 20 69 6e 20 61 73 63 /* Sort in asc
72590 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0d ending order */.
725a0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6c 75 6d 6e .../*..** Column
725b0 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 73 2e affinity types.
725c0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 75 ..**..** These u
725d0 73 65 64 20 74 6f 20 68 61 76 65 20 6d 6e 65 6d sed to have mnem
725e0 6f 6e 69 63 20 6e 61 6d 65 20 6c 69 6b 65 20 27 onic name like '
725f0 69 27 20 66 6f 72 20 53 51 4c 49 54 45 5f 41 46 i' for SQLITE_AF
72600 46 5f 49 4e 54 45 47 45 52 20 61 6e 64 0d 0a 2a F_INTEGER and..*
72610 2a 20 27 74 27 20 66 6f 72 20 53 51 4c 49 54 45 * 't' for SQLITE
72620 5f 41 46 46 5f 54 45 58 54 2e 20 20 42 75 74 20 _AFF_TEXT. But
72630 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 69 we can save a li
72640 74 74 6c 65 20 73 70 61 63 65 20 61 6e 64 20 69 ttle space and i
72650 6d 70 72 6f 76 65 0d 0a 2a 2a 20 74 68 65 20 73 mprove..** the s
72660 70 65 65 64 20 61 20 6c 69 74 74 6c 65 20 62 79 peed a little by
72670 20 6e 75 6d 62 65 72 69 6e 67 20 74 68 65 20 76 numbering the v
72680 61 6c 75 65 73 20 63 6f 6e 73 65 63 75 74 69 76 alues consecutiv
72690 65 6c 79 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 42 ely. ..**..** B
726a0 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 73 ut rather than s
726b0 74 61 72 74 20 77 69 74 68 20 30 20 6f 72 20 31 tart with 0 or 1
726c0 2c 20 77 65 20 62 65 67 69 6e 20 77 69 74 68 20 , we begin with
726d0 27 61 27 2e 20 20 54 68 61 74 20 77 61 79 2c 0d 'a'. That way,.
726e0 0a 2a 2a 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c .** when multipl
726f0 65 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 73 e affinity types
72700 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 are concatenate
72710 64 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 d into a string
72720 61 6e 64 0d 0a 2a 2a 20 75 73 65 64 20 61 73 20 and..** used as
72730 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 2c 20 the P4 operand,
72740 74 68 65 79 20 77 69 6c 6c 20 62 65 20 6d 6f 72 they will be mor
72750 65 20 72 65 61 64 61 62 6c 65 2e 0d 0a 2a 2a 0d e readable...**.
72760 0a 2a 2a 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 .** Note also th
72770 61 74 20 74 68 65 20 6e 75 6d 65 72 69 63 20 74 at the numeric t
72780 79 70 65 73 20 61 72 65 20 67 72 6f 75 70 65 64 ypes are grouped
72790 20 74 6f 67 65 74 68 65 72 20 73 6f 20 74 68 61 together so tha
727a0 74 20 74 65 73 74 69 6e 67 0d 0a 2a 2a 20 66 6f t testing..** fo
727b0 72 20 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65 r a numeric type
727c0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d is a single com
727d0 70 61 72 69 73 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 64 parison...*/..#d
727e0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 46 46 efine SQLITE_AFF
727f0 5f 54 45 58 54 20 20 20 20 20 27 61 27 0d 0a 23 _TEXT 'a'..#
72800 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 46 define SQLITE_AF
72810 46 5f 4e 4f 4e 45 20 20 20 20 20 27 62 27 0d 0a F_NONE 'b'..
72820 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 #define SQLITE_A
72830 46 46 5f 4e 55 4d 45 52 49 43 20 20 27 63 27 0d FF_NUMERIC 'c'.
72840 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
72850 41 46 46 5f 49 4e 54 45 47 45 52 20 20 27 64 27 AFF_INTEGER 'd'
72860 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
72870 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 20 27 65 _AFF_REAL 'e
72880 27 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c '....#define sql
72890 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 ite3IsNumericAff
728a0 69 6e 69 74 79 28 58 29 20 20 28 28 58 29 3e 3d inity(X) ((X)>=
728b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 SQLITE_AFF_NUMER
728c0 49 43 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 IC)..../*..** Th
728d0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 e SQLITE_AFF_MAS
728e0 4b 20 76 61 6c 75 65 73 20 6d 61 73 6b 73 20 6f K values masks o
728f0 66 66 20 74 68 65 20 73 69 67 6e 69 66 69 63 61 ff the significa
72900 6e 74 20 62 69 74 73 20 6f 66 20 61 6e 0d 0a 2a nt bits of an..*
72910 2a 20 61 66 66 69 6e 69 74 79 20 76 61 6c 75 65 * affinity value
72920 2e 20 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 . ..*/..#define
72930 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 SQLITE_AFF_MASK
72940 20 20 20 20 30 78 36 37 0d 0a 0d 0a 2f 2a 0d 0a 0x67..../*..
72950 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 62 69 ** Additional bi
72960 74 20 76 61 6c 75 65 73 20 74 68 61 74 20 63 61 t values that ca
72970 6e 20 62 65 20 4f 52 65 64 20 77 69 74 68 20 61 n be ORed with a
72980 6e 20 61 66 66 69 6e 69 74 79 20 77 69 74 68 6f n affinity witho
72990 75 74 0d 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 ut..** changing
729a0 74 68 65 20 61 66 66 69 6e 69 74 79 2e 0d 0a 2a the affinity...*
729b0 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 /..#define SQLIT
729c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 20 20 30 E_JUMPIFNULL 0
729d0 78 30 38 20 20 2f 2a 20 6a 75 6d 70 73 20 69 66 x08 /* jumps if
729e0 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 either operand
729f0 69 73 20 4e 55 4c 4c 20 2a 2f 0d 0a 23 64 65 66 is NULL */..#def
72a00 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 ine SQLITE_STORE
72a10 50 32 20 20 20 20 20 20 30 78 31 30 20 20 2f 2a P2 0x10 /*
72a20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 20 69 6e Store result in
72a30 20 72 65 67 5b 50 32 5d 20 72 61 74 68 65 72 20 reg[P2] rather
72a40 74 68 61 6e 20 6a 75 6d 70 20 2a 2f 0d 0a 23 64 than jump */..#d
72a50 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 55 4c efine SQLITE_NUL
72a60 4c 45 51 20 20 20 20 20 20 20 30 78 38 30 20 20 LEQ 0x80
72a70 2f 2a 20 4e 55 4c 4c 3d 4e 55 4c 4c 20 2a 2f 0d /* NULL=NULL */.
72a80 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 6f 62 6a .../*..** An obj
72a90 65 63 74 20 6f 66 20 74 68 69 73 20 74 79 70 65 ect of this type
72aa0 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 is created for
72ab0 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 each virtual tab
72ac0 6c 65 20 70 72 65 73 65 6e 74 20 69 6e 0d 0a 2a le present in..*
72ad0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 * the database s
72ae0 63 68 65 6d 61 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 chema. ..**..**
72af0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 If the database
72b00 73 63 68 65 6d 61 20 69 73 20 73 68 61 72 65 64 schema is shared
72b10 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 , then there is
72b20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 one instance of
72b30 74 68 69 73 0d 0a 2a 2a 20 73 74 72 75 63 74 75 this..** structu
72b40 72 65 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 re for each data
72b50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
72b60 28 73 71 6c 69 74 65 33 2a 29 20 74 68 61 74 20 (sqlite3*) that
72b70 75 73 65 73 20 74 68 65 20 73 68 61 72 65 64 0d uses the shared.
72b80 0a 2a 2a 20 73 63 68 65 6d 61 2e 20 54 68 69 73 .** schema. This
72b90 20 69 73 20 62 65 63 61 75 73 65 20 65 61 63 68 is because each
72ba0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
72bb0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 69 74 tion requires it
72bc0 73 20 6f 77 6e 20 75 6e 69 71 75 65 0d 0a 2a 2a s own unique..**
72bd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
72be0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 20 68 sqlite3_vtab* h
72bf0 61 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 61 63 andle used to ac
72c00 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c cess the virtual
72c10 20 74 61 62 6c 65 20 0d 0a 2a 2a 20 69 6d 70 6c table ..** impl
72c20 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 73 71 6c 69 ementation. sqli
72c30 74 65 33 5f 76 74 61 62 2a 20 68 61 6e 64 6c 65 te3_vtab* handle
72c40 73 20 63 61 6e 20 6e 6f 74 20 62 65 20 73 68 61 s can not be sha
72c50 72 65 64 20 62 65 74 77 65 65 6e 20 0d 0a 2a 2a red between ..**
72c60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
72c70 74 69 6f 6e 73 2c 20 65 76 65 6e 20 77 68 65 6e tions, even when
72c80 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 the rest of the
72c90 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 in-memory datab
72ca0 61 73 65 20 0d 0a 2a 2a 20 73 63 68 65 6d 61 20 ase ..** schema
72cb0 69 73 20 73 68 61 72 65 64 2c 20 61 73 20 74 68 is shared, as th
72cc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e e implementation
72cd0 20 6f 66 74 65 6e 20 73 74 6f 72 65 73 20 74 68 often stores th
72ce0 65 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 e database..** c
72cf0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 onnection handle
72d00 20 70 61 73 73 65 64 20 74 6f 20 69 74 20 76 69 passed to it vi
72d10 61 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 a the xConnect()
72d20 20 6f 72 20 78 43 72 65 61 74 65 28 29 20 6d 65 or xCreate() me
72d30 74 68 6f 64 0d 0a 2a 2a 20 64 75 72 69 6e 67 20 thod..** during
72d40 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 initialization i
72d50 6e 74 65 72 6e 61 6c 6c 79 2e 20 54 68 69 73 20 nternally. This
72d60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
72d70 69 6f 6e 20 68 61 6e 64 6c 65 20 6d 61 79 0d 0a ion handle may..
72d80 2a 2a 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 ** then be used
72d90 62 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 by the virtual t
72da0 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 able implementat
72db0 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20 72 65 ion to access re
72dc0 61 6c 20 74 61 62 6c 65 73 20 0d 0a 2a 2a 20 77 al tables ..** w
72dd0 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61 ithin the databa
72de0 73 65 2e 20 53 6f 20 74 68 61 74 20 74 68 65 79 se. So that they
72df0 20 61 70 70 65 61 72 20 61 73 20 70 61 72 74 20 appear as part
72e00 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 73 20 0d of the callers .
72e10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c .** transaction,
72e20 20 74 68 65 73 65 20 61 63 63 65 73 73 65 73 20 these accesses
72e30 6e 65 65 64 20 74 6f 20 62 65 20 6d 61 64 65 20 need to be made
72e40 76 69 61 20 74 68 65 20 73 61 6d 65 20 64 61 74 via the same dat
72e50 61 62 61 73 65 20 0d 0a 2a 2a 20 63 6f 6e 6e 65 abase ..** conne
72e60 63 74 69 6f 6e 20 61 73 20 74 68 61 74 20 75 73 ction as that us
72e70 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 ed to execute SQ
72e80 4c 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 L operations on
72e90 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c the virtual tabl
72ea0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 56 e...**..** All V
72eb0 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 74 68 Table objects th
72ec0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f at correspond to
72ed0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 a single table
72ee0 69 6e 20 61 20 73 68 61 72 65 64 0d 0a 2a 2a 20 in a shared..**
72ef0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 database schema
72f00 61 72 65 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 are initially st
72f10 6f 72 65 64 20 69 6e 20 61 20 6c 69 6e 6b 65 64 ored in a linked
72f20 2d 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f -list pointed to
72f30 20 62 79 0d 0a 2a 2a 20 74 68 65 20 54 61 62 6c by..** the Tabl
72f40 65 2e 70 56 54 61 62 6c 65 20 6d 65 6d 62 65 72 e.pVTable member
72f50 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65 variable of the
72f60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 corresponding T
72f70 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a able object...**
72f80 20 57 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 When an sqlite3
72f90 5f 70 72 65 70 61 72 65 28 29 20 6f 70 65 72 61 _prepare() opera
72fa0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 tion is required
72fb0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 to access the v
72fc0 69 72 74 75 61 6c 0d 0a 2a 2a 20 74 61 62 6c 65 irtual..** table
72fd0 2c 20 69 74 20 73 65 61 72 63 68 65 73 20 74 68 , it searches th
72fe0 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 56 e list for the V
72ff0 54 61 62 6c 65 20 74 68 61 74 20 63 6f 72 72 65 Table that corre
73000 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 0d 0a 2a sponds to the..*
73010 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 * database conne
73020 63 74 69 6f 6e 20 64 6f 69 6e 67 20 74 68 65 20 ction doing the
73030 70 72 65 70 61 72 69 6e 67 20 73 6f 20 61 73 20 preparing so as
73040 74 6f 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 to use the corre
73050 63 74 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 ct..** sqlite3_v
73060 74 61 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 tab* handle in t
73070 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 he compiled quer
73080 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 y...**..** When
73090 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 54 61 62 an in-memory Tab
730a0 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 64 65 6c le object is del
730b0 65 74 65 64 20 28 66 6f 72 20 65 78 61 6d 70 6c eted (for exampl
730c0 65 20 77 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 73 e when the..** s
730d0 63 68 65 6d 61 20 69 73 20 62 65 69 6e 67 20 72 chema is being r
730e0 65 6c 6f 61 64 65 64 20 66 6f 72 20 73 6f 6d 65 eloaded for some
730f0 20 72 65 61 73 6f 6e 29 2c 20 74 68 65 20 56 54 reason), the VT
73100 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 able objects are
73110 20 6e 6f 74 20 0d 0a 2a 2a 20 64 65 6c 65 74 65 not ..** delete
73120 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 d and the sqlite
73130 33 5f 76 74 61 62 2a 20 68 61 6e 64 6c 65 73 20 3_vtab* handles
73140 61 72 65 20 6e 6f 74 20 78 44 69 73 63 6f 6e 6e are not xDisconn
73150 65 63 74 28 29 65 64 20 0d 0a 2a 2a 20 69 6d 6d ect()ed ..** imm
73160 65 64 69 61 74 65 6c 79 2e 20 49 6e 73 74 65 61 ediately. Instea
73170 64 2c 20 74 68 65 79 20 61 72 65 20 6d 6f 76 65 d, they are move
73180 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 d from the Table
73190 2e 70 56 54 61 62 6c 65 20 6c 69 73 74 20 74 6f .pVTable list to
731a0 0d 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 6c 69 6e ..** another lin
731b0 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 ked list headed
731c0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 by the sqlite3.p
731d0 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 6d 62 65 Disconnect membe
731e0 72 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 63 6f 72 r of the..** cor
731f0 72 65 73 70 6f 6e 64 69 6e 67 20 73 71 6c 69 74 responding sqlit
73200 65 33 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 e3 structure. Th
73210 65 79 20 61 72 65 20 74 68 65 6e 20 64 65 6c 65 ey are then dele
73220 74 65 64 2f 78 44 69 73 63 6f 6e 6e 65 63 74 65 ted/xDisconnecte
73230 64 20 0d 0a 2a 2a 20 6e 65 78 74 20 74 69 6d 65 d ..** next time
73240 20 61 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 a statement is
73250 70 72 65 70 61 72 65 64 20 75 73 69 6e 67 20 73 prepared using s
73260 61 69 64 20 73 71 6c 69 74 65 33 2a 2e 20 54 68 aid sqlite3*. Th
73270 69 73 20 69 73 20 64 6f 6e 65 0d 0a 2a 2a 20 74 is is done..** t
73280 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b o avoid deadlock
73290 20 69 73 73 75 65 73 20 69 6e 76 6f 6c 76 69 6e issues involvin
732a0 67 20 6d 75 6c 74 69 70 6c 65 20 73 71 6c 69 74 g multiple sqlit
732b0 65 33 2e 6d 75 74 65 78 20 6d 75 74 65 78 65 73 e3.mutex mutexes
732c0 2e 0d 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 ...** Refer to c
732d0 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 omments above fu
732e0 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 56 74 nction sqlite3Vt
732f0 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 29 20 66 abUnlockList() f
73300 6f 72 20 61 6e 0d 0a 2a 2a 20 65 78 70 6c 61 6e or an..** explan
73310 61 74 69 6f 6e 20 61 73 20 74 6f 20 77 68 79 20 ation as to why
73320 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 64 it is safe to ad
73330 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 61 6e d an entry to an
73340 20 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e sqlite3.pDiscon
73350 6e 65 63 74 0d 0a 2a 2a 20 6c 69 73 74 20 77 69 nect..** list wi
73360 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20 74 68 thout holding th
73370 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 e corresponding
73380 73 71 6c 69 74 65 33 2e 6d 75 74 65 78 20 6d 75 sqlite3.mutex mu
73390 74 65 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 tex...**..** The
733a0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 6f 62 6a 65 memory for obje
733b0 63 74 73 20 6f 66 20 74 68 69 73 20 74 79 70 65 cts of this type
733c0 20 69 73 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 is always alloc
733d0 61 74 65 64 20 62 79 20 0d 0a 2a 2a 20 73 71 6c ated by ..** sql
733e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2c 20 ite3DbMalloc(),
733f0 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 using the connec
73400 74 69 6f 6e 20 68 61 6e 64 6c 65 20 73 74 6f 72 tion handle stor
73410 65 64 20 69 6e 20 56 54 61 62 6c 65 2e 64 62 20 ed in VTable.db
73420 61 73 20 0d 0a 2a 2a 20 74 68 65 20 66 69 72 73 as ..** the firs
73430 74 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d t argument...*/.
73440 0a 73 74 72 75 63 74 20 56 54 61 62 6c 65 20 7b .struct VTable {
73450 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b .. sqlite3 *db;
73460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
73470 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 Database connec
73480 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 tion associated
73490 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 20 with this table
734a0 2a 2f 0d 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d */.. Module *pM
734b0 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 od;
734c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6d 6f /* Pointer to mo
734d0 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 dule implementat
734e0 69 6f 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 ion */.. sqlite
734f0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 20 20 3_vtab *pVtab;
73500 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
73510 6f 20 76 74 61 62 20 69 6e 73 74 61 6e 63 65 20 o vtab instance
73520 2a 2f 0d 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 */.. int nRef;
73530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 /* Number of poi
73550 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 nters to this st
73560 72 75 63 74 75 72 65 20 2a 2f 0d 0a 20 20 75 38 ructure */.. u8
73570 20 62 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 bConstraint;
73580 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
73590 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 if constraints a
735a0 72 65 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0d re supported */.
735b0 0a 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e . int iSavepoin
735c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 t; /*
735d0 44 65 70 74 68 20 6f 66 20 74 68 65 20 53 41 56 Depth of the SAV
735e0 45 50 4f 49 4e 54 20 73 74 61 63 6b 20 2a 2f 0d EPOINT stack */.
735f0 0a 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78 74 . VTable *pNext
73600 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
73610 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20 6c Next in linked l
73620 69 73 74 20 28 73 65 65 20 61 62 6f 76 65 29 20 ist (see above)
73630 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
73640 20 45 61 63 68 20 53 51 4c 20 74 61 62 6c 65 20 Each SQL table
73650 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 69 is represented i
73660 6e 20 6d 65 6d 6f 72 79 20 62 79 20 61 6e 20 69 n memory by an i
73670 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0d 0a nstance of the..
73680 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 ** following str
73690 75 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ucture...**..**
736a0 54 61 62 6c 65 2e 7a 4e 61 6d 65 20 69 73 20 74 Table.zName is t
736b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 he name of the t
736c0 61 62 6c 65 2e 20 20 54 68 65 20 63 61 73 65 20 able. The case
736d0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0d of the original.
736e0 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 .** CREATE TABLE
736f0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 statement is st
73700 6f 72 65 64 2c 20 62 75 74 20 63 61 73 65 20 69 ored, but case i
73710 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e s not significan
73720 74 20 66 6f 72 0d 0a 2a 2a 20 63 6f 6d 70 61 72 t for..** compar
73730 69 73 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 isons...**..** T
73740 61 62 6c 65 2e 6e 43 6f 6c 20 69 73 20 74 68 65 able.nCol is the
73750 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d number of colum
73760 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 ns in this table
73770 2e 20 20 54 61 62 6c 65 2e 61 43 6f 6c 20 69 73 . Table.aCol is
73780 20 61 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 a..** pointer t
73790 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 43 6f o an array of Co
737a0 6c 75 6d 6e 20 73 74 72 75 63 74 75 72 65 73 2c lumn structures,
737b0 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 63 6f one for each co
737c0 6c 75 6d 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 lumn...**..** If
737d0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 the table has a
737e0 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 n INTEGER PRIMAR
737f0 59 20 4b 45 59 2c 20 74 68 65 6e 20 54 61 62 6c Y KEY, then Tabl
73800 65 2e 69 50 4b 65 79 20 69 73 20 74 68 65 20 69 e.iPKey is the i
73810 6e 64 65 78 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 ndex of..** the
73820 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 74 column that is t
73830 68 61 74 20 6b 65 79 2e 20 20 20 4f 74 68 65 72 hat key. Other
73840 77 69 73 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 wise Table.iPKey
73850 20 69 73 20 6e 65 67 61 74 69 76 65 2e 20 20 4e is negative. N
73860 6f 74 65 0d 0a 2a 2a 20 74 68 61 74 20 74 68 65 ote..** that the
73870 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65 datatype of the
73880 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 PRIMARY KEY mus
73890 74 20 62 65 20 49 4e 54 45 47 45 52 20 66 6f 72 t be INTEGER for
738a0 20 74 68 69 73 20 66 69 65 6c 64 20 74 6f 0d 0a this field to..
738b0 2a 2a 20 62 65 20 73 65 74 2e 20 20 41 6e 20 49 ** be set. An I
738c0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
738d0 45 59 20 69 73 20 75 73 65 64 20 61 73 20 74 68 EY is used as th
738e0 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61 63 68 e rowid for each
738f0 20 72 6f 77 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 row of..** the
73900 74 61 62 6c 65 2e 20 20 49 66 20 61 20 74 61 62 table. If a tab
73910 6c 65 20 68 61 73 20 6e 6f 20 49 4e 54 45 47 45 le has no INTEGE
73920 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 R PRIMARY KEY, t
73930 68 65 6e 20 61 20 72 61 6e 64 6f 6d 20 72 6f 77 hen a random row
73940 69 64 0d 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 id..** is genera
73950 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 ted for each row
73960 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 of the table.
73970 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 TF_HasPrimaryKey
73980 20 69 73 20 73 65 74 20 69 66 0d 0a 2a 2a 20 74 is set if..** t
73990 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 79 he table has any
739a0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 49 4e PRIMARY KEY, IN
739b0 54 45 47 45 52 20 6f 72 20 6f 74 68 65 72 77 69 TEGER or otherwi
739c0 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 61 62 6c se...**..** Tabl
739d0 65 2e 74 6e 75 6d 20 69 73 20 74 68 65 20 70 61 e.tnum is the pa
739e0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 ge number for th
739f0 65 20 72 6f 6f 74 20 42 54 72 65 65 20 70 61 67 e root BTree pag
73a00 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 e of the table i
73a10 6e 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 n the..** databa
73a20 73 65 20 66 69 6c 65 2e 20 20 49 66 20 54 61 62 se file. If Tab
73a30 6c 65 2e 69 44 62 20 69 73 20 74 68 65 20 69 6e le.iDb is the in
73a40 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 dex of the datab
73a50 61 73 65 20 74 61 62 6c 65 20 62 61 63 6b 65 6e ase table backen
73a60 64 0d 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 2e d..** in sqlite.
73a70 61 44 62 5b 5d 2e 20 20 30 20 69 73 20 66 6f 72 aDb[]. 0 is for
73a80 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 the main databa
73a90 73 65 20 61 6e 64 20 31 20 69 73 20 66 6f 72 20 se and 1 is for
73aa0 74 68 65 20 66 69 6c 65 20 74 68 61 74 0d 0a 2a the file that..*
73ab0 2a 20 68 6f 6c 64 73 20 74 65 6d 70 6f 72 61 72 * holds temporar
73ac0 79 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 y tables and ind
73ad0 69 63 65 73 2e 20 20 49 66 20 54 46 5f 45 70 68 ices. If TF_Eph
73ae0 65 6d 65 72 61 6c 20 69 73 20 73 65 74 0d 0a 2a emeral is set..*
73af0 2a 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 * then the table
73b00 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 is stored in a
73b10 66 69 6c 65 20 74 68 61 74 20 69 73 20 61 75 74 file that is aut
73b20 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 omatically delet
73b30 65 64 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 ed..** when the
73b40 56 44 42 45 20 63 75 72 73 6f 72 20 74 6f 20 74 VDBE cursor to t
73b50 68 65 20 74 61 62 6c 65 20 69 73 20 63 6c 6f 73 he table is clos
73b60 65 64 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 ed. In this cas
73b70 65 20 54 61 62 6c 65 2e 74 6e 75 6d 20 0d 0a 2a e Table.tnum ..*
73b80 2a 20 72 65 66 65 72 73 20 56 44 42 45 20 63 75 * refers VDBE cu
73b90 72 73 6f 72 20 6e 75 6d 62 65 72 20 74 68 61 74 rsor number that
73ba0 20 68 6f 6c 64 73 20 74 68 65 20 74 61 62 6c 65 holds the table
73bb0 20 6f 70 65 6e 2c 20 6e 6f 74 20 74 6f 20 74 68 open, not to th
73bc0 65 20 72 6f 6f 74 0d 0a 2a 2a 20 70 61 67 65 20 e root..** page
73bd0 6e 75 6d 62 65 72 2e 20 20 54 72 61 6e 73 69 65 number. Transie
73be0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 nt tables are us
73bf0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 ed to hold the r
73c00 65 73 75 6c 74 73 20 6f 66 20 61 0d 0a 2a 2a 20 esults of a..**
73c10 73 75 62 2d 71 75 65 72 79 20 74 68 61 74 20 61 sub-query that a
73c20 70 70 65 61 72 73 20 69 6e 73 74 65 61 64 20 6f ppears instead o
73c30 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 6e f a real table n
73c40 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 ame in the FROM
73c50 63 6c 61 75 73 65 20 0d 0a 2a 2a 20 6f 66 20 61 clause ..** of a
73c60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e SELECT statemen
73c70 74 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 54 t...*/..struct T
73c80 61 62 6c 65 20 7b 0d 0a 20 20 63 68 61 72 20 2a able {.. char *
73c90 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f zName; /
73ca0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 * Name of the ta
73cb0 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0d 0a ble or view */..
73cc0 20 20 69 6e 74 20 69 50 4b 65 79 3b 20 20 20 20 int iPKey;
73cd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 /* If not
73ce0 20 6e 65 67 61 74 69 76 65 2c 20 75 73 65 20 61 negative, use a
73cf0 43 6f 6c 5b 69 50 4b 65 79 5d 20 61 73 20 74 68 Col[iPKey] as th
73d00 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f e primary key */
73d10 0d 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 .. int nCol;
73d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
73d30 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e er of columns in
73d40 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0d 0a this table */..
73d50 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 20 Column *aCol;
73d60 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d /* Inform
73d70 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 ation about each
73d80 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20 49 6e column */.. In
73d90 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 dex *pIndex;
73da0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 /* List of SQ
73db0 4c 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 69 L indexes on thi
73dc0 73 20 74 61 62 6c 65 2e 20 2a 2f 0d 0a 20 20 69 s table. */.. i
73dd0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 nt tnum;
73de0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 42 54 72 65 /* Root BTre
73df0 65 20 6e 6f 64 65 20 66 6f 72 20 74 68 69 73 20 e node for this
73e00 74 61 62 6c 65 20 28 73 65 65 20 6e 6f 74 65 20 table (see note
73e10 61 62 6f 76 65 29 20 2a 2f 0d 0a 20 20 74 52 6f above) */.. tRo
73e20 77 63 6e 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 wcnt nRowEst;
73e30 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72 /* Estimated r
73e40 6f 77 73 20 69 6e 20 74 61 62 6c 65 20 2d 20 66 ows in table - f
73e50 72 6f 6d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 rom sqlite_stat1
73e60 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 53 65 6c table */.. Sel
73e70 65 63 74 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 ect *pSelect;
73e80 20 20 2f 2a 20 4e 55 4c 4c 20 66 6f 72 20 74 61 /* NULL for ta
73e90 62 6c 65 73 2e 20 20 50 6f 69 6e 74 73 20 74 6f bles. Points to
73ea0 20 64 65 66 69 6e 69 74 69 6f 6e 20 69 66 20 61 definition if a
73eb0 20 76 69 65 77 2e 20 2a 2f 0d 0a 20 20 75 31 36 view. */.. u16
73ec0 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 nRef;
73ed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 /* Number of p
73ee0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 ointers to this
73ef0 54 61 62 6c 65 20 2a 2f 0d 0a 20 20 75 38 20 74 Table */.. u8 t
73f00 61 62 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 abFlags;
73f10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 54 46 5f 2a /* Mask of TF_*
73f20 20 76 61 6c 75 65 73 20 2a 2f 0d 0a 20 20 75 38 values */.. u8
73f30 20 6b 65 79 43 6f 6e 66 3b 20 20 20 20 20 20 20 keyConf;
73f40 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f /* What to do
73f50 20 69 6e 20 63 61 73 65 20 6f 66 20 75 6e 69 71 in case of uniq
73f60 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 ueness conflict
73f70 6f 6e 20 69 50 4b 65 79 20 2a 2f 0d 0a 20 20 46 on iPKey */.. F
73f80 4b 65 79 20 2a 70 46 4b 65 79 3b 20 20 20 20 20 Key *pFKey;
73f90 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 /* Linked li
73fa0 73 74 20 6f 66 20 61 6c 6c 20 66 6f 72 65 69 67 st of all foreig
73fb0 6e 20 6b 65 79 73 20 69 6e 20 74 68 69 73 20 74 n keys in this t
73fc0 61 62 6c 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 able */.. char
73fd0 2a 7a 43 6f 6c 41 66 66 3b 20 20 20 20 20 20 20 *zColAff;
73fe0 2f 2a 20 53 74 72 69 6e 67 20 64 65 66 69 6e 69 /* String defini
73ff0 6e 67 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 ng the affinity
74000 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a of each column *
74010 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
74020 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0d 0a 20 20 E_OMIT_CHECK..
74030 45 78 70 72 20 2a 70 43 68 65 63 6b 3b 20 20 20 Expr *pCheck;
74040 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 /* The AND
74050 6f 66 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e of all CHECK con
74060 73 74 72 61 69 6e 74 73 20 2a 2f 0d 0a 23 65 6e straints */..#en
74070 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c dif..#ifndef SQL
74080 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 ITE_OMIT_ALTERTA
74090 42 4c 45 0d 0a 20 20 69 6e 74 20 61 64 64 43 6f BLE.. int addCo
740a0 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f lOffset; /* O
740b0 66 66 73 65 74 20 69 6e 20 43 52 45 41 54 45 20 ffset in CREATE
740c0 54 41 42 4c 45 20 73 74 6d 74 20 74 6f 20 61 64 TABLE stmt to ad
740d0 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 2a d a new column *
740e0 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 /..#endif..#ifnd
740f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ef SQLITE_OMIT_V
74100 49 52 54 55 41 4c 54 41 42 4c 45 0d 0a 20 20 56 IRTUALTABLE.. V
74110 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b 20 Table *pVTable;
74120 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 56 /* List of V
74130 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 2e 20 2a Table objects. *
74140 2f 0d 0a 20 20 69 6e 74 20 6e 4d 6f 64 75 6c 65 /.. int nModule
74150 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d Arg; /* Num
74160 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
74170 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a to the module *
74180 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4d 6f /.. char **azMo
74190 64 75 6c 65 41 72 67 3b 20 20 2f 2a 20 54 65 78 duleArg; /* Tex
741a0 74 20 6f 66 20 61 6c 6c 20 6d 6f 64 75 6c 65 20 t of all module
741b0 61 72 67 73 2e 20 5b 30 5d 20 69 73 20 6d 6f 64 args. [0] is mod
741c0 75 6c 65 20 6e 61 6d 65 20 2a 2f 0d 0a 23 65 6e ule name */..#en
741d0 64 69 66 0d 0a 20 20 54 72 69 67 67 65 72 20 2a dif.. Trigger *
741e0 70 54 72 69 67 67 65 72 3b 20 20 20 2f 2a 20 4c pTrigger; /* L
741f0 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 ist of triggers
74200 73 74 6f 72 65 64 20 69 6e 20 70 53 63 68 65 6d stored in pSchem
74210 61 20 2a 2f 0d 0a 20 20 53 63 68 65 6d 61 20 2a a */.. Schema *
74220 70 53 63 68 65 6d 61 3b 20 20 20 20 20 2f 2a 20 pSchema; /*
74230 53 63 68 65 6d 61 20 74 68 61 74 20 63 6f 6e 74 Schema that cont
74240 61 69 6e 73 20 74 68 69 73 20 74 61 62 6c 65 20 ains this table
74250 2a 2f 0d 0a 20 20 54 61 62 6c 65 20 2a 70 4e 65 */.. Table *pNe
74260 78 74 5a 6f 6d 62 69 65 3b 20 20 2f 2a 20 4e 65 xtZombie; /* Ne
74270 78 74 20 6f 6e 20 74 68 65 20 50 61 72 73 65 2e xt on the Parse.
74280 70 5a 6f 6d 62 69 65 54 61 62 20 6c 69 73 74 20 pZombieTab list
74290 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
742a0 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 Allowed values
742b0 66 6f 72 20 54 61 62 65 2e 74 61 62 46 6c 61 67 for Tabe.tabFlag
742c0 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 s...*/..#define
742d0 54 46 5f 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 TF_Readonly
742e0 20 20 20 30 78 30 31 20 20 20 20 2f 2a 20 52 65 0x01 /* Re
742f0 61 64 2d 6f 6e 6c 79 20 73 79 73 74 65 6d 20 74 ad-only system t
74300 61 62 6c 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 able */..#define
74310 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 20 20 TF_Ephemeral
74320 20 20 20 20 30 78 30 32 20 20 20 20 2f 2a 20 41 0x02 /* A
74330 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c n ephemeral tabl
74340 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 54 46 e */..#define TF
74350 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 20 _HasPrimaryKey
74360 20 30 78 30 34 20 20 20 20 2f 2a 20 54 61 62 6c 0x04 /* Tabl
74370 65 20 68 61 73 20 61 20 70 72 69 6d 61 72 79 20 e has a primary
74380 6b 65 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 key */..#define
74390 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 TF_Autoincrement
743a0 20 20 20 30 78 30 38 20 20 20 20 2f 2a 20 49 6e 0x08 /* In
743b0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 teger primary ke
743c0 79 20 69 73 20 61 75 74 6f 69 6e 63 72 65 6d 65 y is autoincreme
743d0 6e 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 54 nt */..#define T
743e0 46 5f 56 69 72 74 75 61 6c 20 20 20 20 20 20 20 F_Virtual
743f0 20 20 30 78 31 30 20 20 20 20 2f 2a 20 49 73 20 0x10 /* Is
74400 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 a virtual table
74410 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 54 46 5f 4e */..#define TF_N
74420 65 65 64 4d 65 74 61 64 61 74 61 20 20 20 20 30 eedMetadata 0
74430 78 32 30 20 20 20 20 2f 2a 20 61 43 6f 6c 5b 5d x20 /* aCol[]
74440 2e 7a 54 79 70 65 20 61 6e 64 20 61 43 6f 6c 5b .zType and aCol[
74450 5d 2e 70 43 6f 6c 6c 20 6d 69 73 73 69 6e 67 20 ].pColl missing
74460 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */......../*..**
74470 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 Test to see whe
74480 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 74 61 ther or not a ta
74490 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c ble is a virtual
744a0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 table. This is
744b0 0d 0a 2a 2a 20 64 6f 6e 65 20 61 73 20 61 20 6d ..** done as a m
744c0 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 74 20 acro so that it
744d0 77 69 6c 6c 20 62 65 20 6f 70 74 69 6d 69 7a 65 will be optimize
744e0 64 20 6f 75 74 20 77 68 65 6e 20 76 69 72 74 75 d out when virtu
744f0 61 6c 0d 0a 2a 2a 20 74 61 62 6c 65 20 73 75 70 al..** table sup
74500 70 6f 72 74 20 69 73 20 6f 6d 69 74 74 65 64 20 port is omitted
74510 66 72 6f 6d 20 74 68 65 20 62 75 69 6c 64 2e 0d from the build..
74520 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
74530 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
74540 54 41 42 4c 45 0d 0a 23 20 20 64 65 66 69 6e 65 TABLE..# define
74550 20 49 73 56 69 72 74 75 61 6c 28 58 29 20 20 20 IsVirtual(X)
74560 20 20 20 28 28 28 58 29 2d 3e 74 61 62 46 6c 61 (((X)->tabFla
74570 67 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c 29 gs & TF_Virtual)
74580 21 3d 30 29 0d 0a 23 20 20 64 65 66 69 6e 65 20 !=0)..# define
74590 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 58 IsHiddenColumn(X
745a0 29 20 28 28 58 29 2d 3e 69 73 48 69 64 64 65 6e ) ((X)->isHidden
745b0 29 0d 0a 23 65 6c 73 65 0d 0a 23 20 20 64 65 66 )..#else..# def
745c0 69 6e 65 20 49 73 56 69 72 74 75 61 6c 28 58 29 ine IsVirtual(X)
745d0 20 20 20 20 20 20 30 0d 0a 23 20 20 64 65 66 69 0..# defi
745e0 6e 65 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d ne IsHiddenColum
745f0 6e 28 58 29 20 30 0d 0a 23 65 6e 64 69 66 0d 0a n(X) 0..#endif..
74600 0d 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 66 6f ../*..** Each fo
74610 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 reign key constr
74620 61 69 6e 74 20 69 73 20 61 6e 20 69 6e 73 74 61 aint is an insta
74630 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nce of the follo
74640 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0d wing structure..
74650 0a 2a 2a 0d 0a 2a 2a 20 41 20 66 6f 72 65 69 67 .**..** A foreig
74660 6e 20 6b 65 79 20 69 73 20 61 73 73 6f 63 69 61 n key is associa
74670 74 65 64 20 77 69 74 68 20 74 77 6f 20 74 61 62 ted with two tab
74680 6c 65 73 2e 20 20 54 68 65 20 22 66 72 6f 6d 22 les. The "from"
74690 20 74 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 74 68 table is..** th
746a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e e table that con
746b0 74 61 69 6e 73 20 74 68 65 20 52 45 46 45 52 45 tains the REFERE
746c0 4e 43 45 53 20 63 6c 61 75 73 65 20 74 68 61 74 NCES clause that
746d0 20 63 72 65 61 74 65 73 20 74 68 65 20 66 6f 72 creates the for
746e0 65 69 67 6e 0d 0a 2a 2a 20 6b 65 79 2e 20 20 54 eign..** key. T
746f0 68 65 20 22 74 6f 22 20 74 61 62 6c 65 20 69 73 he "to" table is
74700 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 the table that
74710 69 73 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 is named in the
74720 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 REFERENCES claus
74730 65 2e 0d 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 e...** Consider
74740 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0d 0a 2a this example:..*
74750 2a 0d 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 *..** CREATE
74760 20 54 41 42 4c 45 20 65 78 31 28 0d 0a 2a 2a 20 TABLE ex1(..**
74770 20 20 20 20 20 20 61 20 49 4e 54 45 47 45 52 20 a INTEGER
74780 50 52 49 4d 41 52 59 20 4b 45 59 2c 0d 0a 2a 2a PRIMARY KEY,..**
74790 20 20 20 20 20 20 20 62 20 49 4e 54 45 47 45 52 b INTEGER
747a0 20 43 4f 4e 53 54 52 41 49 4e 54 20 66 6b 31 20 CONSTRAINT fk1
747b0 52 45 46 45 52 45 4e 43 45 53 20 65 78 32 28 78 REFERENCES ex2(x
747c0 29 0d 0a 2a 2a 20 20 20 20 20 29 3b 0d 0a 2a 2a )..** );..**
747d0 0d 0a 2a 2a 20 46 6f 72 20 66 6f 72 65 69 67 6e ..** For foreign
747e0 20 6b 65 79 20 22 66 6b 31 22 2c 20 74 68 65 20 key "fk1", the
747f0 66 72 6f 6d 2d 74 61 62 6c 65 20 69 73 20 22 65 from-table is "e
74800 78 31 22 20 61 6e 64 20 74 68 65 20 74 6f 2d 74 x1" and the to-t
74810 61 62 6c 65 20 69 73 20 22 65 78 32 22 2e 0d 0a able is "ex2"...
74820 2a 2a 0d 0a 2a 2a 20 45 61 63 68 20 52 45 46 45 **..** Each REFE
74830 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 67 65 RENCES clause ge
74840 6e 65 72 61 74 65 73 20 61 6e 20 69 6e 73 74 61 nerates an insta
74850 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nce of the follo
74860 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 0d 0a wing structure..
74870 2a 2a 20 77 68 69 63 68 20 69 73 20 61 74 74 61 ** which is atta
74880 63 68 65 64 20 74 6f 20 74 68 65 20 66 72 6f 6d ched to the from
74890 2d 74 61 62 6c 65 2e 20 20 54 68 65 20 74 6f 2d -table. The to-
748a0 74 61 62 6c 65 20 6e 65 65 64 20 6e 6f 74 20 65 table need not e
748b0 78 69 73 74 20 77 68 65 6e 0d 0a 2a 2a 20 74 68 xist when..** th
748c0 65 20 66 72 6f 6d 2d 74 61 62 6c 65 20 69 73 20 e from-table is
748d0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 78 created. The ex
748e0 69 73 74 65 6e 63 65 20 6f 66 20 74 68 65 20 74 istence of the t
748f0 6f 2d 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63 o-table is not c
74900 68 65 63 6b 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 72 hecked...*/..str
74910 75 63 74 20 46 4b 65 79 20 7b 0d 0a 20 20 54 61 uct FKey {.. Ta
74920 62 6c 65 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 ble *pFrom;
74930 2f 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e /* Table contain
74940 69 6e 67 20 74 68 65 20 52 45 46 45 52 45 4e 43 ing the REFERENC
74950 45 53 20 63 6c 61 75 73 65 20 28 61 6b 61 3a 20 ES clause (aka:
74960 43 68 69 6c 64 29 20 2a 2f 0d 0a 20 20 46 4b 65 Child) */.. FKe
74970 79 20 2a 70 4e 65 78 74 46 72 6f 6d 3b 20 20 2f y *pNextFrom; /
74980 2a 20 4e 65 78 74 20 66 6f 72 65 69 67 6e 20 6b * Next foreign k
74990 65 79 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0d 0a ey in pFrom */..
749a0 20 20 63 68 61 72 20 2a 7a 54 6f 3b 20 20 20 20 char *zTo;
749b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 /* Name of t
749c0 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 6b 65 able that the ke
749d0 79 20 70 6f 69 6e 74 73 20 74 6f 20 28 61 6b 61 y points to (aka
749e0 3a 20 50 61 72 65 6e 74 29 20 2a 2f 0d 0a 20 20 : Parent) */..
749f0 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 20 20 FKey *pNextTo;
74a00 20 20 2f 2a 20 4e 65 78 74 20 66 6f 72 65 69 67 /* Next foreig
74a10 6e 20 6b 65 79 20 6f 6e 20 74 61 62 6c 65 20 6e n key on table n
74a20 61 6d 65 64 20 7a 54 6f 20 2a 2f 0d 0a 20 20 46 amed zTo */.. F
74a30 4b 65 79 20 2a 70 50 72 65 76 54 6f 3b 20 20 20 Key *pPrevTo;
74a40 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 66 6f 72 /* Previous for
74a50 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 61 62 6c eign key on tabl
74a60 65 20 6e 61 6d 65 64 20 7a 54 6f 20 2a 2f 0d 0a e named zTo */..
74a70 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 int nCol;
74a80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
74a90 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 columns in this
74aa0 20 6b 65 79 20 2a 2f 0d 0a 20 20 2f 2a 20 45 56 key */.. /* EV
74ab0 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 : R-30323-21917
74ac0 2a 2f 0d 0a 20 20 75 38 20 69 73 44 65 66 65 72 */.. u8 isDefer
74ad0 72 65 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 red; /* True
74ae0 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 if constraint ch
74af0 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 ecking is deferr
74b00 65 64 20 74 69 6c 6c 20 43 4f 4d 4d 49 54 20 2a ed till COMMIT *
74b10 2f 0d 0a 20 20 75 38 20 61 41 63 74 69 6f 6e 5b /.. u8 aAction[
74b20 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2]; /*
74b30 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e ON DELETE and ON
74b40 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 73 2c UPDATE actions,
74b50 20 72 65 73 70 65 63 74 69 76 65 6c 79 20 2a 2f respectively */
74b60 0d 0a 20 20 54 72 69 67 67 65 72 20 2a 61 70 54 .. Trigger *apT
74b70 72 69 67 67 65 72 5b 32 5d 3b 20 20 2f 2a 20 54 rigger[2]; /* T
74b80 72 69 67 67 65 72 73 20 66 6f 72 20 61 41 63 74 riggers for aAct
74b90 69 6f 6e 5b 5d 20 61 63 74 69 6f 6e 73 20 2a 2f ion[] actions */
74ba0 0d 0a 20 20 73 74 72 75 63 74 20 73 43 6f 6c 4d .. struct sColM
74bb0 61 70 20 7b 20 20 2f 2a 20 4d 61 70 70 69 6e 67 ap { /* Mapping
74bc0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 of columns in p
74bd0 46 72 6f 6d 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 From to columns
74be0 69 6e 20 7a 54 6f 20 2a 2f 0d 0a 20 20 20 20 69 in zTo */.. i
74bf0 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 nt iFrom;
74c00 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f /* Index of co
74c10 6c 75 6d 6e 20 69 6e 20 70 46 72 6f 6d 20 2a 2f lumn in pFrom */
74c20 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c .. char *zCol
74c30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 ; /* Name
74c40 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 7a 54 of column in zT
74c50 6f 2e 20 20 49 66 20 30 20 75 73 65 20 50 52 49 o. If 0 use PRI
74c60 4d 41 52 59 20 4b 45 59 20 2a 2f 0d 0a 20 20 7d MARY KEY */.. }
74c70 20 61 43 6f 6c 5b 31 5d 3b 20 20 20 20 20 20 20 aCol[1];
74c80 20 2f 2a 20 4f 6e 65 20 65 6e 74 72 79 20 66 6f /* One entry fo
74c90 72 20 65 61 63 68 20 6f 66 20 6e 43 6f 6c 20 63 r each of nCol c
74ca0 6f 6c 75 6d 6e 20 73 20 2a 2f 0d 0a 7d 3b 0d 0a olumn s */..};..
74cb0 0d 0a 2f 2a 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 ../*..** SQLite
74cc0 73 75 70 70 6f 72 74 73 20 6d 61 6e 79 20 64 69 supports many di
74cd0 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 6f 20 fferent ways to
74ce0 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 73 74 72 resolve a constr
74cf0 61 69 6e 74 0d 0a 2a 2a 20 65 72 72 6f 72 2e 20 aint..** error.
74d00 20 52 4f 4c 4c 42 41 43 4b 20 70 72 6f 63 65 73 ROLLBACK proces
74d10 73 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 sing means that
74d20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f a constraint vio
74d30 6c 61 74 69 6f 6e 0d 0a 2a 2a 20 63 61 75 73 65 lation..** cause
74d40 73 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 s the operation
74d50 69 6e 20 70 72 6f 63 65 73 73 20 74 6f 20 66 61 in process to fa
74d60 69 6c 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 il and for the c
74d70 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 urrent transacti
74d80 6f 6e 0d 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c on..** to be rol
74d90 6c 65 64 20 62 61 63 6b 2e 20 20 41 42 4f 52 54 led back. ABORT
74da0 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 65 61 6e processing mean
74db0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 s the operation
74dc0 69 6e 20 70 72 6f 63 65 73 73 0d 0a 2a 2a 20 66 in process..** f
74dd0 61 69 6c 73 20 61 6e 64 20 61 6e 79 20 70 72 69 ails and any pri
74de0 6f 72 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 or changes from
74df0 74 68 61 74 20 6f 6e 65 20 6f 70 65 72 61 74 69 that one operati
74e00 6f 6e 20 61 72 65 20 62 61 63 6b 65 64 20 6f 75 on are backed ou
74e10 74 2c 0d 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 t,..** but the t
74e20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f ransaction is no
74e30 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 t rolled back.
74e40 46 41 49 4c 20 70 72 6f 63 65 73 73 69 6e 67 20 FAIL processing
74e50 6d 65 61 6e 73 20 74 68 61 74 0d 0a 2a 2a 20 74 means that..** t
74e60 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 he operation in
74e70 70 72 6f 67 72 65 73 73 20 73 74 6f 70 73 20 61 progress stops a
74e80 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 nd returns an er
74e90 72 6f 72 20 63 6f 64 65 2e 20 20 42 75 74 20 70 ror code. But p
74ea0 72 69 6f 72 0d 0a 2a 2a 20 63 68 61 6e 67 65 73 rior..** changes
74eb0 20 64 75 65 20 74 6f 20 74 68 65 20 73 61 6d 65 due to the same
74ec0 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 20 6e operation are n
74ed0 6f 74 20 62 61 63 6b 65 64 20 6f 75 74 20 61 6e ot backed out an
74ee0 64 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 0d 0a 2a d no rollback..*
74ef0 2a 20 6f 63 63 75 72 73 2e 20 20 49 47 4e 4f 52 * occurs. IGNOR
74f00 45 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 E means that the
74f10 20 70 61 72 74 69 63 75 6c 61 72 20 72 6f 77 20 particular row
74f20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65 20 that caused the
74f30 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 2a 2a 20 65 constraint..** e
74f40 72 72 6f 72 20 69 73 20 6e 6f 74 20 69 6e 73 65 rror is not inse
74f50 72 74 65 64 20 6f 72 20 75 70 64 61 74 65 64 2e rted or updated.
74f60 20 20 50 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e Processing con
74f70 74 69 6e 75 65 73 20 61 6e 64 20 6e 6f 20 65 72 tinues and no er
74f80 72 6f 72 0d 0a 2a 2a 20 69 73 20 72 65 74 75 72 ror..** is retur
74f90 6e 65 64 2e 20 20 52 45 50 4c 41 43 45 20 6d 65 ned. REPLACE me
74fa0 61 6e 73 20 74 68 61 74 20 70 72 65 65 78 69 73 ans that preexis
74fb0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 6f ting database ro
74fc0 77 73 20 74 68 61 74 20 63 61 75 73 65 64 0d 0a ws that caused..
74fd0 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 ** a UNIQUE cons
74fe0 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e traint violation
74ff0 20 61 72 65 20 72 65 6d 6f 76 65 64 20 73 6f 20 are removed so
75000 74 68 61 74 20 74 68 65 20 6e 65 77 20 69 6e 73 that the new ins
75010 65 72 74 20 6f 72 0d 0a 2a 2a 20 75 70 64 61 74 ert or..** updat
75020 65 20 63 61 6e 20 70 72 6f 63 65 65 64 2e 20 20 e can proceed.
75030 50 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 69 Processing conti
75040 6e 75 65 73 20 61 6e 64 20 6e 6f 20 65 72 72 6f nues and no erro
75050 72 20 69 73 20 72 65 70 6f 72 74 65 64 2e 0d 0a r is reported...
75060 2a 2a 0d 0a 2a 2a 20 52 45 53 54 52 49 43 54 2c **..** RESTRICT,
75070 20 53 45 54 4e 55 4c 4c 2c 20 61 6e 64 20 43 41 SETNULL, and CA
75080 53 43 41 44 45 20 61 63 74 69 6f 6e 73 20 61 70 SCADE actions ap
75090 70 6c 79 20 6f 6e 6c 79 20 74 6f 20 66 6f 72 65 ply only to fore
750a0 69 67 6e 20 6b 65 79 73 2e 0d 0a 2a 2a 20 52 45 ign keys...** RE
750b0 53 54 52 49 43 54 20 69 73 20 74 68 65 20 73 61 STRICT is the sa
750c0 6d 65 20 61 73 20 41 42 4f 52 54 20 66 6f 72 20 me as ABORT for
750d0 49 4d 4d 45 44 49 41 54 45 20 66 6f 72 65 69 67 IMMEDIATE foreig
750e0 6e 20 6b 65 79 73 20 61 6e 64 20 74 68 65 0d 0a n keys and the..
750f0 2a 2a 20 73 61 6d 65 20 61 73 20 52 4f 4c 4c 42 ** same as ROLLB
75100 41 43 4b 20 66 6f 72 20 44 45 46 45 52 52 45 44 ACK for DEFERRED
75110 20 6b 65 79 73 2e 20 20 53 45 54 4e 55 4c 4c 20 keys. SETNULL
75120 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 means that the f
75130 6f 72 65 69 67 6e 0d 0a 2a 2a 20 6b 65 79 20 69 oreign..** key i
75140 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 s set to NULL.
75150 43 41 53 43 41 44 45 20 6d 65 61 6e 73 20 74 68 CASCADE means th
75160 61 74 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 at a DELETE or U
75170 50 44 41 54 45 20 6f 66 20 74 68 65 0d 0a 2a 2a PDATE of the..**
75180 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c referenced tabl
75190 65 20 72 6f 77 20 69 73 20 70 72 6f 70 61 67 61 e row is propaga
751a0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 77 ted into the row
751b0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0d that holds the.
751c0 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e .** foreign key.
751d0 0d 0a 2a 2a 20 0d 0a 2a 2a 20 54 68 65 20 66 6f ..** ..** The fo
751e0 6c 6c 6f 77 69 6e 67 20 73 79 6d 62 6f 6c 69 63 llowing symbolic
751f0 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 values are used
75200 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 to record which
75210 20 74 79 70 65 0d 0a 2a 2a 20 6f 66 20 61 63 74 type..** of act
75220 69 6f 6e 20 74 6f 20 74 61 6b 65 2e 0d 0a 2a 2f ion to take...*/
75230 0d 0a 23 64 65 66 69 6e 65 20 4f 45 5f 4e 6f 6e ..#define OE_Non
75240 65 20 20 20 20 20 30 20 20 20 2f 2a 20 54 68 65 e 0 /* The
75250 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73 74 72 61 re is no constra
75260 69 6e 74 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0d int to check */.
75270 0a 23 64 65 66 69 6e 65 20 4f 45 5f 52 6f 6c 6c .#define OE_Roll
75280 62 61 63 6b 20 31 20 20 20 2f 2a 20 46 61 69 6c back 1 /* Fail
75290 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 the operation a
752a0 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 nd rollback the
752b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0d 0a transaction */..
752c0 23 64 65 66 69 6e 65 20 4f 45 5f 41 62 6f 72 74 #define OE_Abort
752d0 20 20 20 20 32 20 20 20 2f 2a 20 42 61 63 6b 20 2 /* Back
752e0 6f 75 74 20 63 68 61 6e 67 65 73 20 62 75 74 20 out changes but
752f0 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 do no rollback t
75300 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0d 0a 23 ransaction */..#
75310 64 65 66 69 6e 65 20 4f 45 5f 46 61 69 6c 20 20 define OE_Fail
75320 20 20 20 33 20 20 20 2f 2a 20 53 74 6f 70 20 74 3 /* Stop t
75330 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 62 75 74 he operation but
75340 20 6c 65 61 76 65 20 61 6c 6c 20 70 72 69 6f 72 leave all prior
75350 20 63 68 61 6e 67 65 73 20 2a 2f 0d 0a 23 64 65 changes */..#de
75360 66 69 6e 65 20 4f 45 5f 49 67 6e 6f 72 65 20 20 fine OE_Ignore
75370 20 34 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 4 /* Ignore t
75380 68 65 20 65 72 72 6f 72 2e 20 44 6f 20 6e 6f 74 he error. Do not
75390 20 64 6f 20 74 68 65 20 49 4e 53 45 52 54 20 6f do the INSERT o
753a0 72 20 55 50 44 41 54 45 20 2a 2f 0d 0a 23 64 65 r UPDATE */..#de
753b0 66 69 6e 65 20 4f 45 5f 52 65 70 6c 61 63 65 20 fine OE_Replace
753c0 20 35 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 5 /* Delete e
753d0 78 69 73 74 69 6e 67 20 72 65 63 6f 72 64 2c 20 xisting record,
753e0 74 68 65 6e 20 64 6f 20 49 4e 53 45 52 54 20 6f then do INSERT o
753f0 72 20 55 50 44 41 54 45 20 2a 2f 0d 0a 0d 0a 23 r UPDATE */....#
75400 64 65 66 69 6e 65 20 4f 45 5f 52 65 73 74 72 69 define OE_Restri
75410 63 74 20 36 20 20 20 2f 2a 20 4f 45 5f 41 62 6f ct 6 /* OE_Abo
75420 72 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 rt for IMMEDIATE
75430 2c 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 66 6f , OE_Rollback fo
75440 72 20 44 45 46 45 52 52 45 44 20 2a 2f 0d 0a 23 r DEFERRED */..#
75450 64 65 66 69 6e 65 20 4f 45 5f 53 65 74 4e 75 6c define OE_SetNul
75460 6c 20 20 37 20 20 20 2f 2a 20 53 65 74 20 74 68 l 7 /* Set th
75470 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 61 e foreign key va
75480 6c 75 65 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0d 0a lue to NULL */..
75490 23 64 65 66 69 6e 65 20 4f 45 5f 53 65 74 44 66 #define OE_SetDf
754a0 6c 74 20 20 38 20 20 20 2f 2a 20 53 65 74 20 74 lt 8 /* Set t
754b0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 he foreign key v
754c0 61 6c 75 65 20 74 6f 20 69 74 73 20 64 65 66 61 alue to its defa
754d0 75 6c 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ult */..#define
754e0 4f 45 5f 43 61 73 63 61 64 65 20 20 39 20 20 20 OE_Cascade 9
754f0 2f 2a 20 43 61 73 63 61 64 65 20 74 68 65 20 63 /* Cascade the c
75500 68 61 6e 67 65 73 20 2a 2f 0d 0a 0d 0a 23 64 65 hanges */....#de
75510 66 69 6e 65 20 4f 45 5f 44 65 66 61 75 6c 74 20 fine OE_Default
75520 20 39 39 20 20 2f 2a 20 44 6f 20 77 68 61 74 65 99 /* Do whate
75530 76 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 ver the default
75540 61 63 74 69 6f 6e 20 69 73 20 2a 2f 0d 0a 0d 0a action is */....
75550 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 ../*..** An inst
75560 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c ance of the foll
75570 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 owing structure
75580 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 is passed as the
75590 20 66 69 72 73 74 0d 0a 2a 2a 20 61 72 67 75 6d first..** argum
755a0 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 56 64 ent to sqlite3Vd
755b0 62 65 4b 65 79 43 6f 6d 70 61 72 65 20 61 6e 64 beKeyCompare and
755c0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 is used to cont
755d0 72 6f 6c 20 74 68 65 20 0d 0a 2a 2a 20 63 6f 6d rol the ..** com
755e0 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 74 parison of the t
755f0 77 6f 20 69 6e 64 65 78 20 6b 65 79 73 2e 0d 0a wo index keys...
75600 2a 2f 0d 0a 73 74 72 75 63 74 20 4b 65 79 49 6e */..struct KeyIn
75610 66 6f 20 7b 0d 0a 20 20 73 71 6c 69 74 65 33 20 fo {.. sqlite3
75620 2a 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 *db; /* T
75630 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e he database conn
75640 65 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 75 38 20 ection */.. u8
75650 65 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 enc;
75660 20 2f 2a 20 54 65 78 74 20 65 6e 63 6f 64 69 6e /* Text encodin
75670 67 20 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 g - one of the S
75680 51 4c 49 54 45 5f 55 54 46 2a 20 76 61 6c 75 65 QLITE_UTF* value
75690 73 20 2a 2f 0d 0a 20 20 75 31 36 20 6e 46 69 65 s */.. u16 nFie
756a0 6c 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e ld; /* N
756b0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
756c0 20 69 6e 20 61 43 6f 6c 6c 5b 5d 20 2a 2f 0d 0a in aColl[] */..
756d0 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 u8 *aSortOrder
756e0 3b 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 ; /* Sort or
756f0 64 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c der for each col
75700 75 6d 6e 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c umn. May be NUL
75710 4c 20 2a 2f 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 L */.. CollSeq
75720 2a 61 43 6f 6c 6c 5b 31 5d 3b 20 20 2f 2a 20 43 *aColl[1]; /* C
75730 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 ollating sequenc
75740 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 e for each term
75750 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0d 0a 7d of the key */..}
75760 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 ;..../*..** An i
75770 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 nstance of the f
75780 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
75790 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 re holds informa
757a0 74 69 6f 6e 20 61 62 6f 75 74 20 61 0d 0a 2a 2a tion about a..**
757b0 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 72 65 single index re
757c0 63 6f 72 64 20 74 68 61 74 20 68 61 73 20 61 6c cord that has al
757d0 72 65 61 64 79 20 62 65 65 6e 20 70 61 72 73 65 ready been parse
757e0 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 64 69 76 d out into indiv
757f0 69 64 75 61 6c 0d 0a 2a 2a 20 76 61 6c 75 65 73 idual..** values
75800 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 72 65 63 6f ...**..** A reco
75810 72 64 20 69 73 20 61 6e 20 6f 62 6a 65 63 74 20 rd is an object
75820 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e that contains on
75830 65 20 6f 72 20 6d 6f 72 65 20 66 69 65 6c 64 73 e or more fields
75840 20 6f 66 20 64 61 74 61 2e 0d 0a 2a 2a 20 52 65 of data...** Re
75850 63 6f 72 64 73 20 61 72 65 20 75 73 65 64 20 74 cords are used t
75860 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 o store the cont
75870 65 6e 74 20 6f 66 20 61 20 74 61 62 6c 65 20 72 ent of a table r
75880 6f 77 20 61 6e 64 20 74 6f 20 73 74 6f 72 65 0d ow and to store.
75890 0a 2a 2a 20 74 68 65 20 6b 65 79 20 6f 66 20 61 .** the key of a
758a0 6e 20 69 6e 64 65 78 2e 20 20 41 20 62 6c 6f 62 n index. A blob
758b0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 encoding of a r
758c0 65 63 6f 72 64 20 69 73 20 63 72 65 61 74 65 64 ecord is created
758d0 20 62 79 0d 0a 2a 2a 20 74 68 65 20 4f 50 5f 4d by..** the OP_M
758e0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
758f0 20 6f 66 20 74 68 65 20 56 44 42 45 20 61 6e 64 of the VDBE and
75900 20 69 73 20 64 69 73 61 73 73 65 6d 62 6c 65 64 is disassembled
75910 20 62 79 20 74 68 65 0d 0a 2a 2a 20 4f 50 5f 43 by the..** OP_C
75920 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 0d 0a 2a olumn opcode...*
75930 2a 0d 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 *..** This struc
75940 74 75 72 65 20 68 6f 6c 64 73 20 61 20 72 65 63 ture holds a rec
75950 6f 72 64 20 74 68 61 74 20 68 61 73 20 61 6c 72 ord that has alr
75960 65 61 64 79 20 62 65 65 6e 20 64 69 73 61 73 73 eady been disass
75970 65 6d 62 6c 65 64 0d 0a 2a 2a 20 69 6e 74 6f 20 embled..** into
75980 69 74 73 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 its constituent
75990 66 69 65 6c 64 73 2e 0d 0a 2a 2f 0d 0a 73 74 72 fields...*/..str
759a0 75 63 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f uct UnpackedReco
759b0 72 64 20 7b 0d 0a 20 20 4b 65 79 49 6e 66 6f 20 rd {.. KeyInfo
759c0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 43 *pKeyInfo; /* C
759d0 6f 6c 6c 61 74 69 6f 6e 20 61 6e 64 20 73 6f 72 ollation and sor
759e0 74 2d 6f 72 64 65 72 20 69 6e 66 6f 72 6d 61 74 t-order informat
759f0 69 6f 6e 20 2a 2f 0d 0a 20 20 75 31 36 20 6e 46 ion */.. u16 nF
75a00 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 2f 2a ield; /*
75a10 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 Number of entri
75a20 65 73 20 69 6e 20 61 70 4d 65 6d 5b 5d 20 2a 2f es in apMem[] */
75a30 0d 0a 20 20 75 38 20 66 6c 61 67 73 3b 20 20 20 .. u8 flags;
75a40 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 /* Boole
75a50 61 6e 20 73 65 74 74 69 6e 67 73 2e 20 20 55 4e an settings. UN
75a60 50 41 43 4b 45 44 5f 2e 2e 2e 20 62 65 6c 6f 77 PACKED_... below
75a70 20 2a 2f 0d 0a 20 20 69 36 34 20 72 6f 77 69 64 */.. i64 rowid
75a80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 ; /* Us
75a90 65 64 20 62 79 20 55 4e 50 41 43 4b 45 44 5f 50 ed by UNPACKED_P
75aa0 52 45 46 49 58 5f 53 45 41 52 43 48 20 2a 2f 0d REFIX_SEARCH */.
75ab0 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 3b 20 20 20 . Mem *aMem;
75ac0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 /* Values
75ad0 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
75ae0 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 * Allowed values
75af0 20 6f 66 20 55 6e 70 61 63 6b 65 64 52 65 63 6f of UnpackedReco
75b00 72 64 2e 66 6c 61 67 73 0d 0a 2a 2f 0d 0a 23 64 rd.flags..*/..#d
75b10 65 66 69 6e 65 20 55 4e 50 41 43 4b 45 44 5f 49 efine UNPACKED_I
75b20 4e 43 52 4b 45 59 20 20 20 20 20 20 20 30 78 30 NCRKEY 0x0
75b30 31 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 1 /* Make this
75b40 6b 65 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 6c key an epsilon l
75b50 61 72 67 65 72 20 2a 2f 0d 0a 23 64 65 66 69 6e arger */..#defin
75b60 65 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 e UNPACKED_PREFI
75b70 58 5f 4d 41 54 43 48 20 20 30 78 30 32 20 20 2f X_MATCH 0x02 /
75b80 2a 20 41 20 70 72 65 66 69 78 20 6d 61 74 63 68 * A prefix match
75b90 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 4f is considered O
75ba0 4b 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 55 4e K */..#define UN
75bb0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 PACKED_PREFIX_SE
75bc0 41 52 43 48 20 30 78 30 34 20 20 2f 2a 20 49 67 ARCH 0x04 /* Ig
75bd0 6e 6f 72 65 20 66 69 6e 61 6c 20 28 72 6f 77 69 nore final (rowi
75be0 64 29 20 66 69 65 6c 64 20 2a 2f 0d 0a 0d 0a 2f d) field */..../
75bf0 2a 0d 0a 2a 2a 20 45 61 63 68 20 53 51 4c 20 69 *..** Each SQL i
75c00 6e 64 65 78 20 69 73 20 72 65 70 72 65 73 65 6e ndex is represen
75c10 74 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 79 ted in memory by
75c20 20 61 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 an..** instance
75c30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
75c40 67 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a g structure...**
75c50 0d 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 ..** The columns
75c60 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 of the table th
75c70 61 74 20 61 72 65 20 74 6f 20 62 65 20 69 6e 64 at are to be ind
75c80 65 78 65 64 20 61 72 65 20 64 65 73 63 72 69 62 exed are describ
75c90 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 61 69 ed..** by the ai
75ca0 43 6f 6c 75 6d 6e 5b 5d 20 66 69 65 6c 64 20 6f Column[] field o
75cb0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 f this structure
75cc0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 . For example,
75cd0 73 75 70 70 6f 73 65 0d 0a 2a 2a 20 77 65 20 68 suppose..** we h
75ce0 61 76 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e ave the followin
75cf0 67 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 g table and inde
75d00 78 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 43 x:..**..** C
75d10 52 45 41 54 45 20 54 41 42 4c 45 20 45 78 31 28 REATE TABLE Ex1(
75d20 63 31 20 69 6e 74 2c 20 63 32 20 69 6e 74 2c 20 c1 int, c2 int,
75d30 63 33 20 74 65 78 74 29 3b 0d 0a 2a 2a 20 20 20 c3 text);..**
75d40 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 45 CREATE INDEX E
75d50 78 32 20 4f 4e 20 45 78 31 28 63 33 2c 63 31 29 x2 ON Ex1(c3,c1)
75d60 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 74 68 65 ;..**..** In the
75d70 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 Table structure
75d80 20 64 65 73 63 72 69 62 69 6e 67 20 45 78 31 2c describing Ex1,
75d90 20 6e 43 6f 6c 3d 3d 33 20 62 65 63 61 75 73 65 nCol==3 because
75da0 20 74 68 65 72 65 20 61 72 65 0d 0a 2a 2a 20 74 there are..** t
75db0 68 72 65 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 hree columns in
75dc0 74 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 74 the table. In t
75dd0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 he Index structu
75de0 72 65 20 64 65 73 63 72 69 62 69 6e 67 0d 0a 2a re describing..*
75df0 2a 20 45 78 32 2c 20 6e 43 6f 6c 75 6d 6e 3d 3d * Ex2, nColumn==
75e00 32 20 73 69 6e 63 65 20 32 20 6f 66 20 74 68 65 2 since 2 of the
75e10 20 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 45 78 3 columns of Ex
75e20 31 20 61 72 65 20 69 6e 64 65 78 65 64 2e 0d 0a 1 are indexed...
75e30 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 ** The value of
75e40 61 69 43 6f 6c 75 6d 6e 20 69 73 20 7b 32 2c 20 aiColumn is {2,
75e50 30 7d 2e 20 20 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0}. aiColumn[0]
75e60 3d 3d 32 20 62 65 63 61 75 73 65 20 74 68 65 20 ==2 because the
75e70 0d 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d ..** first colum
75e80 6e 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 n to be indexed
75e90 28 63 33 29 20 68 61 73 20 61 6e 20 69 6e 64 65 (c3) has an inde
75ea0 78 20 6f 66 20 32 20 69 6e 20 45 78 31 2e 61 43 x of 2 in Ex1.aC
75eb0 6f 6c 5b 5d 2e 0d 0a 2a 2a 20 54 68 65 20 73 65 ol[]...** The se
75ec0 63 6f 6e 64 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 cond column to b
75ed0 65 20 69 6e 64 65 78 65 64 20 28 63 31 29 20 68 e indexed (c1) h
75ee0 61 73 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 30 as an index of 0
75ef0 20 69 6e 0d 0a 2a 2a 20 45 78 31 2e 61 43 6f 6c in..** Ex1.aCol
75f00 5b 5d 2c 20 68 65 6e 63 65 20 45 78 32 2e 61 69 [], hence Ex2.ai
75f10 43 6f 6c 75 6d 6e 5b 31 5d 3d 3d 30 2e 0d 0a 2a Column[1]==0...*
75f20 2a 0d 0a 2a 2a 20 54 68 65 20 49 6e 64 65 78 2e *..** The Index.
75f30 6f 6e 45 72 72 6f 72 20 66 69 65 6c 64 20 64 65 onError field de
75f40 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 termines whether
75f50 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 or not the inde
75f60 78 65 64 20 63 6f 6c 75 6d 6e 73 0d 0a 2a 2a 20 xed columns..**
75f70 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 61 must be unique a
75f80 6e 64 20 77 68 61 74 20 74 6f 20 64 6f 20 69 66 nd what to do if
75f90 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 they are not.
75fa0 57 68 65 6e 20 49 6e 64 65 78 2e 6f 6e 45 72 72 When Index.onErr
75fb0 6f 72 3d 4f 45 5f 4e 6f 6e 65 2c 0d 0a 2a 2a 20 or=OE_None,..**
75fc0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 it means this is
75fd0 20 6e 6f 74 20 61 20 75 6e 69 71 75 65 20 69 6e not a unique in
75fe0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 dex. Otherwise
75ff0 69 74 20 69 73 20 61 20 75 6e 69 71 75 65 20 69 it is a unique i
76000 6e 64 65 78 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 ndex..** and the
76010 20 76 61 6c 75 65 20 6f 66 20 49 6e 64 65 78 2e value of Index.
76020 6f 6e 45 72 72 6f 72 20 69 6e 64 69 63 61 74 65 onError indicate
76030 20 74 68 65 20 77 68 69 63 68 20 63 6f 6e 66 6c the which confl
76040 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 0d ict resolution .
76050 0a 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f .** algorithm to
76060 20 65 6d 70 6c 6f 79 20 77 68 65 6e 65 76 65 72 employ whenever
76070 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d an attempt is m
76080 61 64 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20 ade to insert a
76090 6e 6f 6e 2d 75 6e 69 71 75 65 0d 0a 2a 2a 20 65 non-unique..** e
760a0 6c 65 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 72 lement...*/..str
760b0 75 63 74 20 49 6e 64 65 78 20 7b 0d 0a 20 20 63 uct Index {.. c
760c0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 har *zName;
760d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 /* Name of this
760e0 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 index */.. int
760f0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 2f 2a 20 nColumn; /*
76100 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e Number of column
76110 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 75 s in the table u
76120 73 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 sed by this inde
76130 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 61 69 43 x */.. int *aiC
76140 6f 6c 75 6d 6e 3b 20 20 20 2f 2a 20 57 68 69 63 olumn; /* Whic
76150 68 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 75 73 h columns are us
76160 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 ed by this index
76170 2e 20 20 31 73 74 20 69 73 20 30 20 2a 2f 0d 0a . 1st is 0 */..
76180 20 20 74 52 6f 77 63 6e 74 20 2a 61 69 52 6f 77 tRowcnt *aiRow
76190 45 73 74 3b 20 2f 2a 20 52 65 73 75 6c 74 20 6f Est; /* Result o
761a0 66 20 41 4e 41 4c 59 5a 45 3a 20 45 73 74 2e 20 f ANALYZE: Est.
761b0 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20 62 79 rows selected by
761c0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0d each column */.
761d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 . Table *pTable
761e0 3b 20 20 20 2f 2a 20 54 68 65 20 53 51 4c 20 74 ; /* The SQL t
761f0 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 able being index
76200 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 74 6e 75 ed */.. int tnu
76210 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 m; /* Pag
76220 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f e containing roo
76230 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20 t of this index
76240 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 in database file
76250 20 2a 2f 0d 0a 20 20 75 38 20 6f 6e 45 72 72 6f */.. u8 onErro
76260 72 3b 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 r; /* OE_Ab
76270 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 ort, OE_Ignore,
76280 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f OE_Replace, or O
76290 45 5f 4e 6f 6e 65 20 2a 2f 0d 0a 20 20 75 38 20 E_None */.. u8
762a0 61 75 74 6f 49 6e 64 65 78 3b 20 20 20 20 2f 2a autoIndex; /*
762b0 20 54 72 75 65 20 69 66 20 69 73 20 61 75 74 6f True if is auto
762c0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 matically create
762d0 64 20 28 65 78 3a 20 62 79 20 55 4e 49 51 55 45 d (ex: by UNIQUE
762e0 29 20 2a 2f 0d 0a 20 20 75 38 20 62 55 6e 6f 72 ) */.. u8 bUnor
762f0 64 65 72 65 64 3b 20 20 20 2f 2a 20 55 73 65 20 dered; /* Use
76300 74 68 69 73 20 69 6e 64 65 78 20 66 6f 72 20 3d this index for =
76310 3d 20 6f 72 20 49 4e 20 71 75 65 72 69 65 73 20 = or IN queries
76320 6f 6e 6c 79 20 2a 2f 0d 0a 20 20 63 68 61 72 20 only */.. char
76330 2a 7a 43 6f 6c 41 66 66 3b 20 20 20 2f 2a 20 53 *zColAff; /* S
76340 74 72 69 6e 67 20 64 65 66 69 6e 69 6e 67 20 74 tring defining t
76350 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 he affinity of e
76360 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 ach column */..
76370 20 49 6e 64 65 78 20 2a 70 4e 65 78 74 3b 20 20 Index *pNext;
76380 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 6e /* The next in
76390 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 dex associated w
763a0 69 74 68 20 74 68 65 20 73 61 6d 65 20 74 61 62 ith the same tab
763b0 6c 65 20 2a 2f 0d 0a 20 20 53 63 68 65 6d 61 20 le */.. Schema
763c0 2a 70 53 63 68 65 6d 61 3b 20 2f 2a 20 53 63 68 *pSchema; /* Sch
763d0 65 6d 61 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ema containing t
763e0 68 69 73 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 his index */..
763f0 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 20 u8 *aSortOrder;
76400 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 69 7a /* Array of siz
76410 65 20 49 6e 64 65 78 2e 6e 43 6f 6c 75 6d 6e 2e e Index.nColumn.
76420 20 54 72 75 65 3d 3d 44 45 53 43 2c 20 46 61 6c True==DESC, Fal
76430 73 65 3d 3d 41 53 43 20 2a 2f 0d 0a 20 20 63 68 se==ASC */.. ch
76440 61 72 20 2a 2a 61 7a 43 6f 6c 6c 3b 20 20 20 2f ar **azColl; /
76450 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 6c 61 * Array of colla
76460 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 tion sequence na
76470 6d 65 73 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f mes for index */
76480 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
76490 45 4e 41 42 4c 45 5f 53 54 41 54 33 0d 0a 20 20 ENABLE_STAT3..
764a0 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20 20 20 20 int nSample;
764b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
764c0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 er of elements i
764d0 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0d 0a n aSample[] */..
764e0 20 20 74 52 6f 77 63 6e 74 20 61 76 67 45 71 3b tRowcnt avgEq;
764f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 /* Av
76500 65 72 61 67 65 20 6e 45 71 20 76 61 6c 75 65 20 erage nEq value
76510 66 6f 72 20 6b 65 79 20 76 61 6c 75 65 73 20 6e for key values n
76520 6f 74 20 69 6e 20 61 53 61 6d 70 6c 65 20 2a 2f ot in aSample */
76530 0d 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 .. IndexSample
76540 2a 61 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 *aSample; /*
76550 53 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 6c Samples of the l
76560 65 66 74 2d 6d 6f 73 74 20 6b 65 79 20 2a 2f 0d eft-most key */.
76570 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f .#endif..};..../
76580 2a 0d 0a 2a 2a 20 45 61 63 68 20 73 61 6d 70 6c *..** Each sampl
76590 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 e stored in the
765a0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 sqlite_stat3 tab
765b0 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 le is represente
765c0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 0d 0a 2a 2a d in memory ..**
765d0 20 75 73 69 6e 67 20 61 20 73 74 72 75 63 74 75 using a structu
765e0 72 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e re of this type.
765f0 20 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 61 74 See documentat
76600 69 6f 6e 20 61 74 20 74 68 65 20 74 6f 70 20 6f ion at the top o
76610 66 20 74 68 65 0d 0a 2a 2a 20 61 6e 61 6c 79 7a f the..** analyz
76620 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 e.c source file
76630 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 for additional i
76640 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d nformation...*/.
76650 0a 73 74 72 75 63 74 20 49 6e 64 65 78 53 61 6d .struct IndexSam
76660 70 6c 65 20 7b 0d 0a 20 20 75 6e 69 6f 6e 20 7b ple {.. union {
76670 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 20 20 .. char *z;
76680 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 /* Value i
76690 66 20 65 54 79 70 65 20 69 73 20 53 51 4c 49 54 f eType is SQLIT
766a0 45 5f 54 45 58 54 20 6f 72 20 53 51 4c 49 54 45 E_TEXT or SQLITE
766b0 5f 42 4c 4f 42 20 2a 2f 0d 0a 20 20 20 20 64 6f _BLOB */.. do
766c0 75 62 6c 65 20 72 3b 20 20 20 20 20 20 20 2f 2a uble r; /*
766d0 20 56 61 6c 75 65 20 69 66 20 65 54 79 70 65 20 Value if eType
766e0 69 73 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 is SQLITE_FLOAT
766f0 2a 2f 0d 0a 20 20 20 20 69 36 34 20 69 3b 20 20 */.. i64 i;
76700 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 /* Value
76710 20 69 66 20 65 54 79 70 65 20 69 73 20 53 51 4c if eType is SQL
76720 49 54 45 5f 49 4e 54 45 47 45 52 20 2a 2f 0d 0a ITE_INTEGER */..
76730 20 20 7d 20 75 3b 0d 0a 20 20 75 38 20 65 54 79 } u;.. u8 eTy
76740 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 pe; /* S
76750 51 4c 49 54 45 5f 4e 55 4c 4c 2c 20 53 51 4c 49 QLITE_NULL, SQLI
76760 54 45 5f 49 4e 54 45 47 45 52 20 2e 2e 2e 20 65 TE_INTEGER ... e
76770 74 63 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 tc. */.. int nB
76780 79 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 yte; /* S
76790 69 7a 65 20 69 6e 20 62 79 74 65 20 6f 66 20 74 ize in byte of t
767a0 65 78 74 20 6f 72 20 62 6c 6f 62 2e 20 2a 2f 0d ext or blob. */.
767b0 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 3b 20 . tRowcnt nEq;
767c0 20 20 20 20 20 2f 2a 20 45 73 74 2e 20 6e 75 6d /* Est. num
767d0 62 65 72 20 6f 66 20 72 6f 77 73 20 77 68 65 72 ber of rows wher
767e0 65 20 74 68 65 20 6b 65 79 20 65 71 75 61 6c 73 e the key equals
767f0 20 74 68 69 73 20 73 61 6d 70 6c 65 20 2a 2f 0d this sample */.
76800 0a 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 3b 20 . tRowcnt nLt;
76810 20 20 20 20 20 2f 2a 20 45 73 74 2e 20 6e 75 6d /* Est. num
76820 62 65 72 20 6f 66 20 72 6f 77 73 20 77 68 65 72 ber of rows wher
76830 65 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 e key is less th
76840 61 6e 20 74 68 69 73 20 73 61 6d 70 6c 65 20 2a an this sample *
76850 2f 0d 0a 20 20 74 52 6f 77 63 6e 74 20 6e 44 4c /.. tRowcnt nDL
76860 74 3b 20 20 20 20 20 2f 2a 20 45 73 74 2e 20 6e t; /* Est. n
76870 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 umber of distinc
76880 74 20 6b 65 79 73 20 6c 65 73 73 20 74 68 61 6e t keys less than
76890 20 74 68 69 73 20 73 61 6d 70 6c 65 20 2a 2f 0d this sample */.
768a0 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 61 .};..../*..** Ea
768b0 63 68 20 74 6f 6b 65 6e 20 63 6f 6d 69 6e 67 20 ch token coming
768c0 6f 75 74 20 6f 66 20 74 68 65 20 6c 65 78 65 72 out of the lexer
768d0 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 is an instance
768e0 6f 66 0d 0a 2a 2a 20 74 68 69 73 20 73 74 72 75 of..** this stru
768f0 63 74 75 72 65 2e 20 20 54 6f 6b 65 6e 73 20 61 cture. Tokens a
76900 72 65 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 re also used as
76910 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 part of an expre
76920 73 73 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e ssion...**..** N
76930 6f 74 65 20 69 66 20 54 6f 6b 65 6e 2e 7a 3d 3d ote if Token.z==
76940 30 20 74 68 65 6e 20 54 6f 6b 65 6e 2e 64 79 6e 0 then Token.dyn
76950 20 61 6e 64 20 54 6f 6b 65 6e 2e 6e 20 61 72 65 and Token.n are
76960 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0d 0a undefined and..
76970 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 72 ** may contain r
76980 61 6e 64 6f 6d 20 76 61 6c 75 65 73 2e 20 20 44 andom values. D
76990 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 61 o not make any a
769a0 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 ssumptions about
769b0 20 54 6f 6b 65 6e 2e 64 79 6e 0d 0a 2a 2a 20 61 Token.dyn..** a
769c0 6e 64 20 54 6f 6b 65 6e 2e 6e 20 77 68 65 6e 20 nd Token.n when
769d0 54 6f 6b 65 6e 2e 7a 3d 3d 30 2e 0d 0a 2a 2f 0d Token.z==0...*/.
769e0 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e 20 7b 0d .struct Token {.
769f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
76a00 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 ; /* Text of
76a10 20 74 68 65 20 74 6f 6b 65 6e 2e 20 20 4e 6f 74 the token. Not
76a20 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 NULL-terminated
76a30 21 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 ! */.. unsigned
76a40 20 69 6e 74 20 6e 3b 20 20 20 20 2f 2a 20 4e 75 int n; /* Nu
76a50 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 mber of characte
76a60 72 73 20 69 6e 20 74 68 69 73 20 74 6f 6b 65 6e rs in this token
76a70 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
76a80 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 * An instance of
76a90 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 this structure
76aa0 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 contains informa
76ab0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 67 tion needed to g
76ac0 65 6e 65 72 61 74 65 0d 0a 2a 2a 20 63 6f 64 65 enerate..** code
76ad0 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 74 68 for a SELECT th
76ae0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 at contains aggr
76af0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e egate functions.
76b00 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 45 78 70 72 ..**..** If Expr
76b10 2e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 .op==TK_AGG_COLU
76b20 4d 4e 20 6f 72 20 54 4b 5f 41 47 47 5f 46 55 4e MN or TK_AGG_FUN
76b30 43 54 49 4f 4e 20 74 68 65 6e 20 45 78 70 72 2e CTION then Expr.
76b40 70 41 67 67 49 6e 66 6f 20 69 73 20 61 0d 0a 2a pAggInfo is a..*
76b50 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 * pointer to thi
76b60 73 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 s structure. Th
76b70 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 66 e Expr.iColumn f
76b80 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 ield is the inde
76b90 78 20 69 6e 0d 0a 2a 2a 20 41 67 67 49 6e 66 6f x in..** AggInfo
76ba0 2e 61 43 6f 6c 5b 5d 20 6f 72 20 41 67 67 49 6e .aCol[] or AggIn
76bb0 66 6f 2e 61 46 75 6e 63 5b 5d 20 6f 66 20 69 6e fo.aFunc[] of in
76bc0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 formation needed
76bd0 20 74 6f 20 67 65 6e 65 72 61 74 65 0d 0a 2a 2a to generate..**
76be0 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6e code for that n
76bf0 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 67 67 ode...**..** Agg
76c00 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 61 6e Info.pGroupBy an
76c10 64 20 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 2e d AggInfo.aFunc.
76c20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 66 pExpr point to f
76c30 69 65 6c 64 73 20 77 69 74 68 69 6e 20 74 68 65 ields within the
76c40 0d 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 53 65 ..** original Se
76c50 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74 lect structure t
76c60 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 hat describes th
76c70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 e SELECT stateme
76c80 6e 74 2e 20 20 54 68 65 73 65 0d 0a 2a 2a 20 66 nt. These..** f
76c90 69 65 6c 64 73 20 64 6f 20 6e 6f 74 20 6e 65 65 ields do not nee
76ca0 64 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 d to be freed wh
76cb0 65 6e 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 en deallocating
76cc0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 the AggInfo stru
76cd0 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 cture...*/..stru
76ce0 63 74 20 41 67 67 49 6e 66 6f 20 7b 0d 0a 20 20 ct AggInfo {..
76cf0 75 38 20 64 69 72 65 63 74 4d 6f 64 65 3b 20 20 u8 directMode;
76d00 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 /* Direc
76d10 74 20 72 65 6e 64 65 72 69 6e 67 20 6d 6f 64 65 t rendering mode
76d20 20 6d 65 61 6e 73 20 74 61 6b 65 20 64 61 74 61 means take data
76d30 20 64 69 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 directly..
76d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
76d50 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 73 6f 75 ** from sou
76d60 72 63 65 20 74 61 62 6c 65 73 20 72 61 74 68 65 rce tables rathe
76d70 72 20 74 68 61 6e 20 66 72 6f 6d 20 61 63 63 75 r than from accu
76d80 6d 75 6c 61 74 6f 72 73 20 2a 2f 0d 0a 20 20 75 mulators */.. u
76d90 38 20 75 73 65 53 6f 72 74 69 6e 67 49 64 78 3b 8 useSortingIdx;
76da0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 69 72 /* In dir
76db0 65 63 74 20 6d 6f 64 65 2c 20 72 65 66 65 72 65 ect mode, refere
76dc0 6e 63 65 20 74 68 65 20 73 6f 72 74 69 6e 67 20 nce the sorting
76dd0 69 6e 64 65 78 20 72 61 74 68 65 72 0d 0a 20 20 index rather..
76de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
76df0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 ** than
76e00 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 the source table
76e10 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 6f 72 74 69 */.. int sorti
76e20 6e 67 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f ngIdx; /
76e30 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 * Cursor number
76e40 6f 66 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 of the sorting i
76e50 6e 64 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 ndex */.. int s
76e60 6f 72 74 69 6e 67 49 64 78 50 54 61 62 3b 20 20 ortingIdxPTab;
76e70 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d /* Cursor num
76e80 62 65 72 20 6f 66 20 70 73 65 75 64 6f 2d 74 61 ber of pseudo-ta
76e90 62 6c 65 20 2a 2f 0d 0a 20 20 45 78 70 72 4c 69 ble */.. ExprLi
76ea0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 st *pGroupBy;
76eb0 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 /* The group b
76ec0 79 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20 20 69 y clause */.. i
76ed0 6e 74 20 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d nt nSortingColum
76ee0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 n; /* Number
76ef0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 of columns in t
76f00 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 he sorting index
76f10 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 41 67 */.. struct Ag
76f20 67 49 6e 66 6f 5f 63 6f 6c 20 7b 20 20 20 20 2f gInfo_col { /
76f30 2a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d * For each colum
76f40 6e 20 75 73 65 64 20 69 6e 20 73 6f 75 72 63 65 n used in source
76f50 20 74 61 62 6c 65 73 20 2a 2f 0d 0a 20 20 20 20 tables */..
76f60 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 Table *pTab;
76f70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 /* Sour
76f80 63 65 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 ce table */..
76f90 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 int iTable;
76fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 /* Cur
76fb0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 sor number of th
76fc0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a e source table *
76fd0 2f 0d 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 /.. int iColu
76fe0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 mn;
76ff0 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 /* Column number
77000 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 75 72 within the sour
77010 63 65 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 ce table */..
77020 20 69 6e 74 20 69 53 6f 72 74 65 72 43 6f 6c 75 int iSorterColu
77030 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c mn; /* Col
77040 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 umn number in th
77050 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 e sorting index
77060 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d */.. int iMem
77070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
77080 20 2f 2a 20 4d 65 6d 6f 72 79 20 6c 6f 63 61 74 /* Memory locat
77090 69 6f 6e 20 74 68 61 74 20 61 63 74 73 20 61 73 ion that acts as
770a0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0d accumulator */.
770b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 . Expr *pExpr
770c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
770d0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 The original ex
770e0 70 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20 20 7d pression */.. }
770f0 20 2a 61 43 6f 6c 3b 0d 0a 20 20 69 6e 74 20 6e *aCol;.. int n
77100 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 Column;
77110 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
77120 75 73 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 used entries in
77130 61 43 6f 6c 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 aCol[] */.. int
77140 20 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 3b 20 20 nColumnAlloc;
77150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
77160 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 f slots allocate
77170 64 20 66 6f 72 20 61 43 6f 6c 5b 5d 20 2a 2f 0d d for aCol[] */.
77180 0a 20 20 69 6e 74 20 6e 41 63 63 75 6d 75 6c 61 . int nAccumula
77190 74 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 tor; /* Nu
771a0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 mber of columns
771b0 74 68 61 74 20 73 68 6f 77 20 74 68 72 6f 75 67 that show throug
771c0 68 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e h to the output.
771d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
771e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 ** A
771f0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e dditional column
77200 73 20 61 72 65 20 75 73 65 64 20 6f 6e 6c 79 20 s are used only
77210 61 73 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f as parameters to
77220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
77230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 ** a
77240 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f ggregate functio
77250 6e 73 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 ns */.. struct
77260 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 7b 20 20 AggInfo_func {
77270 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 61 67 67 /* For each agg
77280 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 regate function
77290 2a 2f 0d 0a 20 20 20 20 45 78 70 72 20 2a 70 45 */.. Expr *pE
772a0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 xpr;
772b0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 65 /* Expression e
772c0 6e 63 6f 64 69 6e 67 20 74 68 65 20 66 75 6e 63 ncoding the func
772d0 74 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 46 75 6e tion */.. Fun
772e0 63 44 65 66 20 2a 70 46 75 6e 63 3b 20 20 20 20 cDef *pFunc;
772f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 67 67 /* The agg
77300 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 regate function
77310 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a implementation *
77320 2f 0d 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b /.. int iMem;
77330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
77340 2f 2a 20 4d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 /* Memory locati
77350 6f 6e 20 74 68 61 74 20 61 63 74 73 20 61 73 20 on that acts as
77360 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0d 0a accumulator */..
77370 20 20 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 int iDistinc
77380 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 t; /*
77390 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 Ephemeral table
773a0 75 73 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 used to enforce
773b0 44 49 53 54 49 4e 43 54 20 2a 2f 0d 0a 20 20 7d DISTINCT */.. }
773c0 20 2a 61 46 75 6e 63 3b 0d 0a 20 20 69 6e 74 20 *aFunc;.. int
773d0 6e 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 nFunc;
773e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
773f0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 46 75 6e entries in aFun
77400 63 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 46 c[] */.. int nF
77410 75 6e 63 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 uncAlloc;
77420 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 /* Number of s
77430 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 lots allocated f
77440 6f 72 20 61 46 75 6e 63 5b 5d 20 2a 2f 0d 0a 7d or aFunc[] */..}
77450 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 ;..../*..** The
77460 64 61 74 61 74 79 70 65 20 79 6e 56 61 72 20 69 datatype ynVar i
77470 73 20 61 20 73 69 67 6e 65 64 20 69 6e 74 65 67 s a signed integ
77480 65 72 2c 20 65 69 74 68 65 72 20 31 36 2d 62 69 er, either 16-bi
77490 74 20 6f 72 20 33 32 2d 62 69 74 2e 0d 0a 2a 2a t or 32-bit...**
774a0 20 55 73 75 61 6c 6c 79 20 69 74 20 69 73 20 31 Usually it is 1
774b0 36 2d 62 69 74 73 2e 20 20 42 75 74 20 69 66 20 6-bits. But if
774c0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 SQLITE_MAX_VARIA
774d0 42 4c 45 5f 4e 55 4d 42 45 52 20 69 73 20 67 72 BLE_NUMBER is gr
774e0 65 61 74 65 72 0d 0a 2a 2a 20 74 68 61 6e 20 33 eater..** than 3
774f0 32 37 36 37 20 77 65 20 68 61 76 65 20 74 6f 20 2767 we have to
77500 6d 61 6b 65 20 69 74 20 33 32 2d 62 69 74 2e 20 make it 32-bit.
77510 20 31 36 2d 62 69 74 20 69 73 20 70 72 65 66 65 16-bit is prefe
77520 72 72 65 64 20 62 65 63 61 75 73 65 0d 0a 2a 2a rred because..**
77530 20 69 74 20 75 73 65 73 20 6c 65 73 73 20 6d 65 it uses less me
77540 6d 6f 72 79 20 69 6e 20 74 68 65 20 45 78 70 72 mory in the Expr
77550 20 6f 62 6a 65 63 74 2c 20 77 68 69 63 68 20 69 object, which i
77560 73 20 61 20 62 69 67 20 6d 65 6d 6f 72 79 20 75 s a big memory u
77570 73 65 72 0d 0a 2a 2a 20 69 6e 20 73 79 73 74 65 ser..** in syste
77580 6d 73 20 77 69 74 68 20 6c 6f 74 73 20 6f 66 20 ms with lots of
77590 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
775a0 6e 74 73 2e 20 20 41 6e 64 20 66 65 77 20 61 70 nts. And few ap
775b0 70 6c 69 63 61 74 69 6f 6e 73 0d 0a 2a 2a 20 6e plications..** n
775c0 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 61 62 eed more than ab
775d0 6f 75 74 20 31 30 20 6f 72 20 32 30 20 76 61 72 out 10 or 20 var
775e0 69 61 62 6c 65 73 2e 20 20 42 75 74 20 73 6f 6d iables. But som
775f0 65 20 65 78 74 72 65 6d 65 20 75 73 65 72 73 20 e extreme users
77600 77 61 6e 74 0d 0a 2a 2a 20 74 6f 20 68 61 76 65 want..** to have
77610 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
77620 65 6e 74 73 20 77 69 74 68 20 6f 76 65 72 20 33 ents with over 3
77630 32 37 36 37 20 76 61 72 69 61 62 6c 65 73 2c 20 2767 variables,
77640 61 6e 64 20 66 6f 72 20 74 68 65 6d 0d 0a 2a 2a and for them..**
77650 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 61 the option is a
77660 76 61 69 6c 61 62 6c 65 20 28 61 74 20 63 6f 6d vailable (at com
77670 70 69 6c 65 2d 74 69 6d 65 29 2e 0d 0a 2a 2f 0d pile-time)...*/.
77680 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f .#if SQLITE_MAX_
77690 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 3c VARIABLE_NUMBER<
776a0 3d 33 32 37 36 37 0d 0a 74 79 70 65 64 65 66 20 =32767..typedef
776b0 69 31 36 20 79 6e 56 61 72 3b 0d 0a 23 65 6c 73 i16 ynVar;..#els
776c0 65 0d 0a 74 79 70 65 64 65 66 20 69 6e 74 20 79 e..typedef int y
776d0 6e 56 61 72 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d nVar;..#endif...
776e0 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 ./*..** Each nod
776f0 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 e of an expressi
77700 6f 6e 20 69 6e 20 74 68 65 20 70 61 72 73 65 20 on in the parse
77710 74 72 65 65 20 69 73 20 61 6e 20 69 6e 73 74 61 tree is an insta
77720 6e 63 65 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 nce..** of this
77730 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a structure...**..
77740 2a 2a 20 45 78 70 72 2e 6f 70 20 69 73 20 74 68 ** Expr.op is th
77750 65 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 69 6e e opcode. The in
77760 74 65 67 65 72 20 70 61 72 73 65 72 20 74 6f 6b teger parser tok
77770 65 6e 20 63 6f 64 65 73 20 61 72 65 20 72 65 75 en codes are reu
77780 73 65 64 0d 0a 2a 2a 20 61 73 20 6f 70 63 6f 64 sed..** as opcod
77790 65 73 20 68 65 72 65 2e 20 46 6f 72 20 65 78 61 es here. For exa
777a0 6d 70 6c 65 2c 20 74 68 65 20 70 61 72 73 65 72 mple, the parser
777b0 20 64 65 66 69 6e 65 73 20 54 4b 5f 47 45 20 74 defines TK_GE t
777c0 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 0d o be an integer.
777d0 0a 2a 2a 20 63 6f 64 65 20 72 65 70 72 65 73 65 .** code represe
777e0 6e 74 69 6e 67 20 74 68 65 20 22 3e 3d 22 20 6f nting the ">=" o
777f0 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73 61 perator. This sa
77800 6d 65 20 69 6e 74 65 67 65 72 20 63 6f 64 65 20 me integer code
77810 69 73 20 72 65 75 73 65 64 0d 0a 2a 2a 20 74 6f is reused..** to
77820 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 67 represent the g
77830 72 65 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d 65 reater-than-or-e
77840 71 75 61 6c 2d 74 6f 20 6f 70 65 72 61 74 6f 72 qual-to operator
77850 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 in the expressi
77860 6f 6e 0d 0a 2a 2a 20 74 72 65 65 2e 0d 0a 2a 2a on..** tree...**
77870 0d 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 ..** If the expr
77880 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c ession is an SQL
77890 20 6c 69 74 65 72 61 6c 20 28 54 4b 5f 49 4e 54 literal (TK_INT
778a0 45 47 45 52 2c 20 54 4b 5f 46 4c 4f 41 54 2c 20 EGER, TK_FLOAT,
778b0 54 4b 5f 42 4c 4f 42 2c 20 0d 0a 2a 2a 20 6f 72 TK_BLOB, ..** or
778c0 20 54 4b 5f 53 54 52 49 4e 47 29 2c 20 74 68 65 TK_STRING), the
778d0 6e 20 45 78 70 72 2e 74 6f 6b 65 6e 20 63 6f 6e n Expr.token con
778e0 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f tains the text o
778f0 66 20 74 68 65 20 53 51 4c 20 6c 69 74 65 72 61 f the SQL litera
77900 6c 2e 20 49 66 0d 0a 2a 2a 20 74 68 65 20 65 78 l. If..** the ex
77910 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 pression is a va
77920 72 69 61 62 6c 65 20 28 54 4b 5f 56 41 52 49 41 riable (TK_VARIA
77930 42 4c 45 29 2c 20 74 68 65 6e 20 45 78 70 72 2e BLE), then Expr.
77940 74 6f 6b 65 6e 20 63 6f 6e 74 61 69 6e 73 20 74 token contains t
77950 68 65 20 0d 0a 2a 2a 20 76 61 72 69 61 62 6c 65 he ..** variable
77960 20 6e 61 6d 65 2e 20 46 69 6e 61 6c 6c 79 2c 20 name. Finally,
77970 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f if the expressio
77980 6e 20 69 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 n is an SQL func
77990 74 69 6f 6e 20 28 54 4b 5f 46 55 4e 43 54 49 4f tion (TK_FUNCTIO
779a0 4e 29 2c 0d 0a 2a 2a 20 74 68 65 6e 20 45 78 70 N),..** then Exp
779b0 72 2e 74 6f 6b 65 6e 20 63 6f 6e 74 61 69 6e 73 r.token contains
779c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
779d0 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a function...**..
779e0 2a 2a 20 45 78 70 72 2e 70 52 69 67 68 74 20 61 ** Expr.pRight a
779f0 6e 64 20 45 78 70 72 2e 70 4c 65 66 74 20 61 72 nd Expr.pLeft ar
77a00 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 e the left and r
77a10 69 67 68 74 20 73 75 62 65 78 70 72 65 73 73 69 ight subexpressi
77a20 6f 6e 73 20 6f 66 20 61 0d 0a 2a 2a 20 62 69 6e ons of a..** bin
77a30 61 72 79 20 6f 70 65 72 61 74 6f 72 2e 20 45 69 ary operator. Ei
77a40 74 68 65 72 20 6f 72 20 62 6f 74 68 20 6d 61 79 ther or both may
77a50 20 62 65 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a 2a be NULL...**..*
77a60 2a 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 * Expr.x.pList i
77a70 73 20 61 20 6c 69 73 74 20 6f 66 20 61 72 67 75 s a list of argu
77a80 6d 65 6e 74 73 20 69 66 20 74 68 65 20 65 78 70 ments if the exp
77a90 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 53 51 ression is an SQ
77aa0 4c 20 66 75 6e 63 74 69 6f 6e 2c 0d 0a 2a 2a 20 L function,..**
77ab0 61 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f a CASE expressio
77ac0 6e 20 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 n or an IN expre
77ad0 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 ssion of the for
77ae0 6d 20 22 3c 6c 68 73 3e 20 49 4e 20 28 3c 79 3e m "<lhs> IN (<y>
77af0 2c 20 3c 7a 3e 2e 2e 2e 29 22 2e 0d 0a 2a 2a 20 , <z>...)"...**
77b00 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 69 Expr.x.pSelect i
77b10 73 20 75 73 65 64 20 69 66 20 74 68 65 20 65 78 s used if the ex
77b20 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 pression is a su
77b30 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 6e 20 65 b-select or an e
77b40 78 70 72 65 73 73 69 6f 6e 20 6f 66 0d 0a 2a 2a xpression of..**
77b50 20 74 68 65 20 66 6f 72 6d 20 22 3c 6c 68 73 3e the form "<lhs>
77b60 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 IN (SELECT ...)
77b70 22 2e 20 49 66 20 74 68 65 20 45 50 5f 78 49 73 ". If the EP_xIs
77b80 53 65 6c 65 63 74 20 62 69 74 20 69 73 20 73 65 Select bit is se
77b90 74 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 45 78 70 t in the..** Exp
77ba0 72 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 r.flags mask, th
77bb0 65 6e 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 en Expr.x.pSelec
77bc0 74 20 69 73 20 76 61 6c 69 64 2e 20 4f 74 68 65 t is valid. Othe
77bd0 72 77 69 73 65 2c 20 45 78 70 72 2e 78 2e 70 4c rwise, Expr.x.pL
77be0 69 73 74 20 69 73 20 0d 0a 2a 2a 20 76 61 6c 69 ist is ..** vali
77bf0 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6e 20 65 78 d...**..** An ex
77c00 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 pression of the
77c10 66 6f 72 6d 20 49 44 20 6f 72 20 49 44 2e 49 44 form ID or ID.ID
77c20 20 72 65 66 65 72 73 20 74 6f 20 61 20 63 6f 6c refers to a col
77c30 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 0d umn in a table..
77c40 0a 2a 2a 20 46 6f 72 20 73 75 63 68 20 65 78 70 .** For such exp
77c50 72 65 73 73 69 6f 6e 73 2c 20 45 78 70 72 2e 6f ressions, Expr.o
77c60 70 20 69 73 20 73 65 74 20 74 6f 20 54 4b 5f 43 p is set to TK_C
77c70 4f 4c 55 4d 4e 20 61 6e 64 20 45 78 70 72 2e 69 OLUMN and Expr.i
77c80 54 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 74 68 65 Table is..** the
77c90 20 69 6e 74 65 67 65 72 20 63 75 72 73 6f 72 20 integer cursor
77ca0 6e 75 6d 62 65 72 20 6f 66 20 61 20 56 44 42 45 number of a VDBE
77cb0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 cursor pointing
77cc0 20 74 6f 20 74 68 61 74 20 74 61 62 6c 65 20 61 to that table a
77cd0 6e 64 0d 0a 2a 2a 20 45 78 70 72 2e 69 43 6f 6c nd..** Expr.iCol
77ce0 75 6d 6e 20 69 73 20 74 68 65 20 63 6f 6c 75 6d umn is the colum
77cf0 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 n number for the
77d00 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e specific column
77d10 2e 20 20 49 66 20 74 68 65 0d 0a 2a 2a 20 65 78 . If the..** ex
77d20 70 72 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 pression is used
77d30 20 61 73 20 61 20 72 65 73 75 6c 74 20 69 6e 20 as a result in
77d40 61 6e 20 61 67 67 72 65 67 61 74 65 20 53 45 4c an aggregate SEL
77d50 45 43 54 2c 20 74 68 65 6e 20 74 68 65 0d 0a 2a ECT, then the..*
77d60 2a 20 76 61 6c 75 65 20 69 73 20 61 6c 73 6f 20 * value is also
77d70 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 45 78 stored in the Ex
77d80 70 72 2e 69 41 67 67 20 63 6f 6c 75 6d 6e 20 69 pr.iAgg column i
77d90 6e 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 n the aggregate
77da0 73 6f 20 74 68 61 74 0d 0a 2a 2a 20 69 74 20 63 so that..** it c
77db0 61 6e 20 62 65 20 61 63 63 65 73 73 65 64 20 61 an be accessed a
77dc0 66 74 65 72 20 61 6c 6c 20 61 67 67 72 65 67 61 fter all aggrega
77dd0 74 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 tes are computed
77de0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
77df0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 expression is a
77e00 6e 20 75 6e 62 6f 75 6e 64 20 76 61 72 69 61 62 n unbound variab
77e10 6c 65 20 6d 61 72 6b 65 72 20 28 61 20 71 75 65 le marker (a que
77e20 73 74 69 6f 6e 20 6d 61 72 6b 20 0d 0a 2a 2a 20 stion mark ..**
77e30 63 68 61 72 61 63 74 65 72 20 27 3f 27 20 69 6e character '?' in
77e40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 the original SQ
77e50 4c 29 20 74 68 65 6e 20 74 68 65 20 45 78 70 72 L) then the Expr
77e60 2e 69 54 61 62 6c 65 20 68 6f 6c 64 73 20 74 68 .iTable holds th
77e70 65 20 69 6e 64 65 78 20 0d 0a 2a 2a 20 6e 75 6d e index ..** num
77e80 62 65 72 20 66 6f 72 20 74 68 61 74 20 76 61 72 ber for that var
77e90 69 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 iable...**..** I
77ea0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e f the expression
77eb0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 is a subquery t
77ec0 68 65 6e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e hen Expr.iColumn
77ed0 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 holds an intege
77ee0 72 0d 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6e r..** register n
77ef0 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 umber containing
77f00 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 the result of t
77f10 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 he subquery. If
77f20 20 74 68 65 0d 0a 2a 2a 20 73 75 62 71 75 65 72 the..** subquer
77f30 79 20 67 69 76 65 73 20 61 20 63 6f 6e 73 74 61 y gives a consta
77f40 6e 74 20 72 65 73 75 6c 74 2c 20 74 68 65 6e 20 nt result, then
77f50 69 54 61 62 6c 65 20 69 73 20 2d 31 2e 20 20 49 iTable is -1. I
77f60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0d 0a f the subquery..
77f70 2a 2a 20 67 69 76 65 73 20 61 20 64 69 66 66 65 ** gives a diffe
77f80 72 65 6e 74 20 61 6e 73 77 65 72 20 61 74 20 64 rent answer at d
77f90 69 66 66 65 72 65 6e 74 20 74 69 6d 65 73 20 64 ifferent times d
77fa0 75 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 uring statement
77fb0 70 72 6f 63 65 73 73 69 6e 67 0d 0a 2a 2a 20 74 processing..** t
77fc0 68 65 6e 20 69 54 61 62 6c 65 20 69 73 20 74 68 hen iTable is th
77fd0 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 73 e address of a s
77fe0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 ubroutine that c
77ff0 6f 6d 70 75 74 65 73 20 74 68 65 20 73 75 62 71 omputes the subq
78000 75 65 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 uery...**..** If
78010 20 74 68 65 20 45 78 70 72 20 69 73 20 6f 66 20 the Expr is of
78020 74 79 70 65 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 type OP_Column,
78030 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 74 and the table it
78040 20 69 73 20 73 65 6c 65 63 74 69 6e 67 20 66 72 is selecting fr
78050 6f 6d 0d 0a 2a 2a 20 69 73 20 61 20 64 69 73 6b om..** is a disk
78060 20 74 61 62 6c 65 20 6f 72 20 74 68 65 20 22 6f table or the "o
78070 6c 64 2e 2a 22 20 70 73 65 75 64 6f 2d 74 61 62 ld.*" pseudo-tab
78080 6c 65 2c 20 74 68 65 6e 20 70 54 61 62 20 70 6f le, then pTab po
78090 69 6e 74 73 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 ints to the..**
780a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 corresponding ta
780b0 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0d ble definition..
780c0 0a 2a 2a 0d 0a 2a 2a 20 41 4c 4c 4f 43 41 54 49 .**..** ALLOCATI
780d0 4f 4e 20 4e 4f 54 45 53 3a 0d 0a 2a 2a 0d 0a 2a ON NOTES:..**..*
780e0 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 63 * Expr objects c
780f0 61 6e 20 75 73 65 20 61 20 6c 6f 74 20 6f 66 20 an use a lot of
78100 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 69 6e 20 memory space in
78110 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e database schema.
78120 20 20 54 6f 0d 0a 2a 2a 20 68 65 6c 70 20 72 65 To..** help re
78130 64 75 63 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 duce memory requ
78140 69 72 65 6d 65 6e 74 73 2c 20 73 6f 6d 65 74 69 irements, someti
78150 6d 65 73 20 61 6e 20 45 78 70 72 20 6f 62 6a 65 mes an Expr obje
78160 63 74 20 77 69 6c 6c 20 62 65 0d 0a 2a 2a 20 74 ct will be..** t
78170 72 75 6e 63 61 74 65 64 2e 20 20 41 6e 64 20 74 runcated. And t
78180 6f 20 72 65 64 75 63 65 20 74 68 65 20 6e 75 6d o reduce the num
78190 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c ber of memory al
781a0 6c 6f 63 61 74 69 6f 6e 73 2c 20 73 6f 6d 65 74 locations, somet
781b0 69 6d 65 73 0d 0a 2a 2a 20 74 77 6f 20 6f 72 20 imes..** two or
781c0 6d 6f 72 65 20 45 78 70 72 20 6f 62 6a 65 63 74 more Expr object
781d0 73 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 s will be stored
781e0 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 6d 65 6d in a single mem
781f0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0d ory allocation,.
78200 0a 2a 2a 20 74 6f 67 65 74 68 65 72 20 77 69 74 .** together wit
78210 68 20 45 78 70 72 2e 7a 54 6f 6b 65 6e 20 73 74 h Expr.zToken st
78220 72 69 6e 67 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 rings...**..** I
78230 66 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 f the EP_Reduced
78240 20 61 6e 64 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c and EP_TokenOnl
78250 79 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20 y flags are set
78260 77 68 65 6e 0d 0a 2a 2a 20 61 6e 20 45 78 70 72 when..** an Expr
78270 20 6f 62 6a 65 63 74 20 69 73 20 74 72 75 6e 63 object is trunc
78280 61 74 65 64 2e 20 20 57 68 65 6e 20 45 50 5f 52 ated. When EP_R
78290 65 64 75 63 65 64 20 69 73 20 73 65 74 2c 20 74 educed is set, t
782a0 68 65 6e 20 61 6c 6c 0d 0a 2a 2a 20 74 68 65 20 hen all..** the
782b0 63 68 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 child Expr objec
782c0 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 70 ts in the Expr.p
782d0 4c 65 66 74 20 61 6e 64 20 45 78 70 72 2e 70 52 Left and Expr.pR
782e0 69 67 68 74 20 73 75 62 74 72 65 65 73 0d 0a 2a ight subtrees..*
782f0 2a 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 * are contained
78300 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 within the same
78310 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
78320 6e 2e 20 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65 n. Note, howeve
78330 72 2c 20 74 68 61 74 0d 0a 2a 2a 20 74 68 65 20 r, that..** the
78340 73 75 62 74 72 65 65 73 20 69 6e 20 45 78 70 72 subtrees in Expr
78350 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 .x.pList or Expr
78360 2e 78 2e 70 53 65 6c 65 63 74 20 61 72 65 20 61 .x.pSelect are a
78370 6c 77 61 79 73 20 73 65 70 61 72 61 74 65 6c 79 lways separately
78380 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 ..** allocated,
78390 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 regardless of wh
783a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 45 50 5f ether or not EP_
783b0 52 65 64 75 63 65 64 20 69 73 20 73 65 74 2e 0d Reduced is set..
783c0 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 45 78 70 72 .*/..struct Expr
783d0 20 7b 0d 0a 20 20 75 38 20 6f 70 3b 20 20 20 20 {.. u8 op;
783e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
783f0 4f 70 65 72 61 74 69 6f 6e 20 70 65 72 66 6f 72 Operation perfor
78400 6d 65 64 20 62 79 20 74 68 69 73 20 6e 6f 64 65 med by this node
78410 20 2a 2f 0d 0a 20 20 63 68 61 72 20 61 66 66 69 */.. char affi
78420 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 2f 2a nity; /*
78430 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 The affinity of
78440 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 72 20 30 the column or 0
78450 20 69 66 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e if not a column
78460 20 2a 2f 0d 0a 20 20 75 31 36 20 66 6c 61 67 73 */.. u16 flags
78470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
78480 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 2e 20 Various flags.
78490 20 45 50 5f 2a 20 53 65 65 20 62 65 6c 6f 77 20 EP_* See below
784a0 2a 2f 0d 0a 20 20 75 6e 69 6f 6e 20 7b 0d 0a 20 */.. union {..
784b0 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b char *zToken;
784c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b /* Tok
784d0 65 6e 20 76 61 6c 75 65 2e 20 5a 65 72 6f 20 74 en value. Zero t
784e0 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 64 65 erminated and de
784f0 71 75 6f 74 65 64 20 2a 2f 0d 0a 20 20 20 20 69 quoted */.. i
78500 6e 74 20 69 56 61 6c 75 65 3b 20 20 20 20 20 20 nt iValue;
78510 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 6e 65 67 /* Non-neg
78520 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 76 61 ative integer va
78530 6c 75 65 20 69 66 20 45 50 5f 49 6e 74 56 61 6c lue if EP_IntVal
78540 75 65 20 2a 2f 0d 0a 20 20 7d 20 75 3b 0d 0a 0d ue */.. } u;...
78550 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 45 50 5f . /* If the EP_
78560 54 6f 6b 65 6e 4f 6e 6c 79 20 66 6c 61 67 20 69 TokenOnly flag i
78570 73 20 73 65 74 20 69 6e 20 74 68 65 20 45 78 70 s set in the Exp
78580 72 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 r.flags mask, th
78590 65 6e 20 6e 6f 0d 0a 20 20 2a 2a 20 73 70 61 63 en no.. ** spac
785a0 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 e is allocated f
785b0 6f 72 20 74 68 65 20 66 69 65 6c 64 73 20 62 65 or the fields be
785c0 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 low this point.
785d0 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 An attempt to..
785e0 20 2a 2a 20 61 63 63 65 73 73 20 74 68 65 6d 20 ** access them
785f0 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 will result in a
78600 20 73 65 67 66 61 75 6c 74 20 6f 72 20 6d 61 6c segfault or mal
78610 66 75 6e 63 74 69 6f 6e 2e 20 0d 0a 20 20 2a 2a function. .. **
78620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78660 2a 2a 2a 2f 0d 0a 0d 0a 20 20 45 78 70 72 20 2a ***/.... Expr *
78670 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 pLeft;
78680 20 2f 2a 20 4c 65 66 74 20 73 75 62 6e 6f 64 65 /* Left subnode
78690 20 2a 2f 0d 0a 20 20 45 78 70 72 20 2a 70 52 69 */.. Expr *pRi
786a0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a ght; /*
786b0 20 52 69 67 68 74 20 73 75 62 6e 6f 64 65 20 2a Right subnode *
786c0 2f 0d 0a 20 20 75 6e 69 6f 6e 20 7b 0d 0a 20 20 /.. union {..
786d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 ExprList *pLis
786e0 74 3b 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 t; /* Functi
786f0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 on arguments or
78700 69 6e 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 3c in "<expr> IN (<
78710 65 78 70 72 2d 6c 69 73 74 29 22 20 2a 2f 0d 0a expr-list)" */..
78720 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c Select *pSel
78730 65 63 74 3b 20 20 20 20 20 2f 2a 20 55 73 65 64 ect; /* Used
78740 20 66 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 for sub-selects
78750 20 61 6e 64 20 22 3c 65 78 70 72 3e 20 49 4e 20 and "<expr> IN
78760 28 3c 73 65 6c 65 63 74 3e 29 22 20 2a 2f 0d 0a (<select>)" */..
78770 20 20 7d 20 78 3b 0d 0a 20 20 43 6f 6c 6c 53 65 } x;.. CollSe
78780 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 q *pColl;
78790 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f /* The collatio
787a0 6e 20 74 79 70 65 20 6f 66 20 74 68 65 20 63 6f n type of the co
787b0 6c 75 6d 6e 20 6f 72 20 30 20 2a 2f 0d 0a 0d 0a lumn or 0 */....
787c0 20 20 2f 2a 20 49 66 20 74 68 65 20 45 50 5f 52 /* If the EP_R
787d0 65 64 75 63 65 64 20 66 6c 61 67 20 69 73 20 73 educed flag is s
787e0 65 74 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 et in the Expr.f
787f0 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20 lags mask, then
78800 6e 6f 0d 0a 20 20 2a 2a 20 73 70 61 63 65 20 69 no.. ** space i
78810 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 s allocated for
78820 74 68 65 20 66 69 65 6c 64 73 20 62 65 6c 6f 77 the fields below
78830 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 41 6e 20 this point. An
78840 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 20 2a 2a attempt to.. **
78850 20 61 63 63 65 73 73 20 74 68 65 6d 20 77 69 6c access them wil
78860 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 73 65 l result in a se
78870 67 66 61 75 6c 74 20 6f 72 20 6d 61 6c 66 75 6e gfault or malfun
78880 63 74 69 6f 6e 2e 0d 0a 20 20 2a 2a 2a 2a 2a 2a ction... ******
78890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
788a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
788b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
788c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
788d0 0d 0a 0d 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 .... int iTable
788e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
788f0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 63 75 72 73 6f TK_COLUMN: curso
78900 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c r number of tabl
78910 65 20 68 6f 6c 64 69 6e 67 20 63 6f 6c 75 6d 6e e holding column
78920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
78930 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 4b ** TK
78940 5f 52 45 47 49 53 54 45 52 3a 20 72 65 67 69 73 _REGISTER: regis
78950 74 65 72 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 ter number..
78960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
78970 20 20 20 20 20 2a 2a 20 54 4b 5f 54 52 49 47 47 ** TK_TRIGG
78980 45 52 3a 20 31 20 2d 3e 20 6e 65 77 2c 20 30 20 ER: 1 -> new, 0
78990 2d 3e 20 6f 6c 64 20 2a 2f 0d 0a 20 20 79 6e 56 -> old */.. ynV
789a0 61 72 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 ar iColumn;
789b0 20 20 20 20 2f 2a 20 54 4b 5f 43 4f 4c 55 4d 4e /* TK_COLUMN
789c0 3a 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 2e 20 : column index.
789d0 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 2e 0d 0a -1 for rowid...
789e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
789f0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 4b 5f 56 ** TK_V
78a00 41 52 49 41 42 4c 45 3a 20 76 61 72 69 61 62 6c ARIABLE: variabl
78a10 65 20 6e 75 6d 62 65 72 20 28 61 6c 77 61 79 73 e number (always
78a20 20 3e 3d 20 31 29 2e 20 2a 2f 0d 0a 20 20 69 31 >= 1). */.. i1
78a30 36 20 69 41 67 67 3b 20 20 20 20 20 20 20 20 20 6 iAgg;
78a40 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 65 6e /* Which en
78a50 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d try in pAggInfo-
78a60 3e 61 43 6f 6c 5b 5d 20 6f 72 20 2d 3e 61 46 75 >aCol[] or ->aFu
78a70 6e 63 5b 5d 20 2a 2f 0d 0a 20 20 69 31 36 20 69 nc[] */.. i16 i
78a80 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 20 RightJoinTable;
78a90 20 20 2f 2a 20 49 66 20 45 50 5f 46 72 6f 6d 4a /* If EP_FromJ
78aa0 6f 69 6e 2c 20 74 68 65 20 72 69 67 68 74 20 74 oin, the right t
78ab0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e able of the join
78ac0 20 2a 2f 0d 0a 20 20 75 38 20 66 6c 61 67 73 32 */.. u8 flags2
78ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
78ae0 20 53 65 63 6f 6e 64 20 73 65 74 20 6f 66 20 66 Second set of f
78af0 6c 61 67 73 2e 20 20 45 50 32 5f 2e 2e 2e 20 2a lags. EP2_... *
78b00 2f 0d 0a 20 20 75 38 20 6f 70 32 3b 20 20 20 20 /.. u8 op2;
78b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
78b20 66 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 2c f a TK_REGISTER,
78b30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 the original va
78b40 6c 75 65 20 6f 66 20 45 78 70 72 2e 6f 70 20 2a lue of Expr.op *
78b50 2f 0d 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 /.. AggInfo *pA
78b60 67 67 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 55 ggInfo; /* U
78b70 73 65 64 20 62 79 20 54 4b 5f 41 47 47 5f 43 4f sed by TK_AGG_CO
78b80 4c 55 4d 4e 20 61 6e 64 20 54 4b 5f 41 47 47 5f LUMN and TK_AGG_
78b90 46 55 4e 43 54 49 4f 4e 20 2a 2f 0d 0a 20 20 54 FUNCTION */.. T
78ba0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 able *pTab;
78bb0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 66 /* Table f
78bc0 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 or TK_COLUMN exp
78bd0 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0d 0a 23 69 ressions. */..#i
78be0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 f SQLITE_MAX_EXP
78bf0 52 5f 44 45 50 54 48 3e 30 0d 0a 20 20 69 6e 74 R_DEPTH>0.. int
78c00 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 nHeight;
78c10 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 /* Height of
78c20 20 74 68 65 20 74 72 65 65 20 68 65 61 64 65 64 the tree headed
78c30 20 62 79 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f by this node */
78c40 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a ..#endif..};....
78c50 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f /*..** The follo
78c60 77 69 6e 67 20 61 72 65 20 74 68 65 20 6d 65 61 wing are the mea
78c70 6e 69 6e 67 73 20 6f 66 20 62 69 74 73 20 69 6e nings of bits in
78c80 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 the Expr.flags
78c90 66 69 65 6c 64 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 field...*/..#def
78ca0 69 6e 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 ine EP_FromJoin
78cb0 20 20 30 78 30 30 30 31 20 20 2f 2a 20 4f 72 69 0x0001 /* Ori
78cc0 67 69 6e 61 74 65 64 20 69 6e 20 4f 4e 20 6f 72 ginated in ON or
78cd0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 USING clause of
78ce0 20 61 20 6a 6f 69 6e 20 2a 2f 0d 0a 23 64 65 66 a join */..#def
78cf0 69 6e 65 20 45 50 5f 41 67 67 20 20 20 20 20 20 ine EP_Agg
78d00 20 20 30 78 30 30 30 32 20 20 2f 2a 20 43 6f 6e 0x0002 /* Con
78d10 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 tains one or mor
78d20 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 e aggregate func
78d30 74 69 6f 6e 73 20 2a 2f 0d 0a 23 64 65 66 69 6e tions */..#defin
78d40 65 20 45 50 5f 52 65 73 6f 6c 76 65 64 20 20 20 e EP_Resolved
78d50 30 78 30 30 30 34 20 20 2f 2a 20 49 44 73 20 68 0x0004 /* IDs h
78d60 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 ave been resolve
78d70 64 20 74 6f 20 43 4f 4c 55 4d 4e 73 20 2a 2f 0d d to COLUMNs */.
78d80 0a 23 64 65 66 69 6e 65 20 45 50 5f 45 72 72 6f .#define EP_Erro
78d90 72 20 20 20 20 20 20 30 78 30 30 30 38 20 20 2f r 0x0008 /
78da0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e * Expression con
78db0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 tains one or mor
78dc0 65 20 65 72 72 6f 72 73 20 2a 2f 0d 0a 23 64 65 e errors */..#de
78dd0 66 69 6e 65 20 45 50 5f 44 69 73 74 69 6e 63 74 fine EP_Distinct
78de0 20 20 20 30 78 30 30 31 30 20 20 2f 2a 20 41 67 0x0010 /* Ag
78df0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e gregate function
78e00 20 77 69 74 68 20 44 49 53 54 49 4e 43 54 20 6b with DISTINCT k
78e10 65 79 77 6f 72 64 20 2a 2f 0d 0a 23 64 65 66 69 eyword */..#defi
78e20 6e 65 20 45 50 5f 56 61 72 53 65 6c 65 63 74 20 ne EP_VarSelect
78e30 20 30 78 30 30 32 30 20 20 2f 2a 20 70 53 65 6c 0x0020 /* pSel
78e40 65 63 74 20 69 73 20 63 6f 72 72 65 6c 61 74 65 ect is correlate
78e50 64 2c 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 d, not constant
78e60 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 45 50 5f 44 */..#define EP_D
78e70 62 6c 51 75 6f 74 65 64 20 20 30 78 30 30 34 30 blQuoted 0x0040
78e80 20 20 2f 2a 20 74 6f 6b 65 6e 2e 7a 20 77 61 73 /* token.z was
78e90 20 6f 72 69 67 69 6e 61 6c 6c 79 20 69 6e 20 22 originally in "
78ea0 2e 2e 2e 22 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ..." */..#define
78eb0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 20 20 30 EP_InfixFunc 0
78ec0 78 30 30 38 30 20 20 2f 2a 20 54 72 75 65 20 66 x0080 /* True f
78ed0 6f 72 20 61 6e 20 69 6e 66 69 78 20 66 75 6e 63 or an infix func
78ee0 74 69 6f 6e 3a 20 4c 49 4b 45 2c 20 47 4c 4f 42 tion: LIKE, GLOB
78ef0 2c 20 65 74 63 20 2a 2f 0d 0a 23 64 65 66 69 6e , etc */..#defin
78f00 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 e EP_ExpCollate
78f10 30 78 30 31 30 30 20 20 2f 2a 20 43 6f 6c 6c 61 0x0100 /* Colla
78f20 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 73 70 ting sequence sp
78f30 65 63 69 66 69 65 64 20 65 78 70 6c 69 63 69 74 ecified explicit
78f40 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 45 ly */..#define E
78f50 50 5f 46 69 78 65 64 44 65 73 74 20 20 30 78 30 P_FixedDest 0x0
78f60 32 30 30 20 20 2f 2a 20 52 65 73 75 6c 74 20 6e 200 /* Result n
78f70 65 65 64 65 64 20 69 6e 20 61 20 73 70 65 63 69 eeded in a speci
78f80 66 69 63 20 72 65 67 69 73 74 65 72 20 2a 2f 0d fic register */.
78f90 0a 23 64 65 66 69 6e 65 20 45 50 5f 49 6e 74 56 .#define EP_IntV
78fa0 61 6c 75 65 20 20 20 30 78 30 34 30 30 20 20 2f alue 0x0400 /
78fb0 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 * Integer value
78fc0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 75 2e 69 contained in u.i
78fd0 56 61 6c 75 65 20 2a 2f 0d 0a 23 64 65 66 69 6e Value */..#defin
78fe0 65 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 20 e EP_xIsSelect
78ff0 30 78 30 38 30 30 20 20 2f 2a 20 78 2e 70 53 65 0x0800 /* x.pSe
79000 6c 65 63 74 20 69 73 20 76 61 6c 69 64 20 28 6f lect is valid (o
79010 74 68 65 72 77 69 73 65 20 78 2e 70 4c 69 73 74 therwise x.pList
79020 20 69 73 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 is) */..#define
79030 20 45 50 5f 48 69 6e 74 20 20 20 20 20 20 20 30 EP_Hint 0
79040 78 31 30 30 30 20 20 2f 2a 20 4f 70 74 69 6d 69 x1000 /* Optimi
79050 7a 65 72 20 68 69 6e 74 2e 20 4e 6f 74 20 72 65 zer hint. Not re
79060 71 75 69 72 65 64 20 66 6f 72 20 63 6f 72 72 65 quired for corre
79070 63 74 6e 65 73 73 20 2a 2f 0d 0a 23 64 65 66 69 ctness */..#defi
79080 6e 65 20 45 50 5f 52 65 64 75 63 65 64 20 20 20 ne EP_Reduced
79090 20 30 78 32 30 30 30 20 20 2f 2a 20 45 78 70 72 0x2000 /* Expr
790a0 20 73 74 72 75 63 74 20 69 73 20 45 58 50 52 5f struct is EXPR_
790b0 52 45 44 55 43 45 44 53 49 5a 45 20 62 79 74 65 REDUCEDSIZE byte
790c0 73 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 s only */..#defi
790d0 6e 65 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 20 ne EP_TokenOnly
790e0 20 30 78 34 30 30 30 20 20 2f 2a 20 45 78 70 72 0x4000 /* Expr
790f0 20 73 74 72 75 63 74 20 69 73 20 45 58 50 52 5f struct is EXPR_
79100 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 62 79 TOKENONLYSIZE by
79110 74 65 73 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 tes only */..#de
79120 66 69 6e 65 20 45 50 5f 53 74 61 74 69 63 20 20 fine EP_Static
79130 20 20 20 30 78 38 30 30 30 20 20 2f 2a 20 48 65 0x8000 /* He
79140 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6e 6f 74 ld in memory not
79150 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d obtained from m
79160 61 6c 6c 6f 63 28 29 20 2a 2f 0d 0a 0d 0a 2f 2a alloc() */..../*
79170 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 ..** The followi
79180 6e 67 20 61 72 65 20 74 68 65 20 6d 65 61 6e 69 ng are the meani
79190 6e 67 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 ngs of bits in t
791a0 68 65 20 45 78 70 72 2e 66 6c 61 67 73 32 20 66 he Expr.flags2 f
791b0 69 65 6c 64 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 ield...*/..#defi
791c0 6e 65 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 ne EP2_MallocedT
791d0 6f 6b 65 6e 20 20 30 78 30 30 30 31 20 20 2f 2a oken 0x0001 /*
791e0 20 4e 65 65 64 20 74 6f 20 73 71 6c 69 74 65 33 Need to sqlite3
791f0 44 62 46 72 65 65 28 29 20 45 78 70 72 2e 7a 54 DbFree() Expr.zT
79200 6f 6b 65 6e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 oken */..#define
79210 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 EP2_Irreducible
79220 20 20 20 20 30 78 30 30 30 32 20 20 2f 2a 20 43 0x0002 /* C
79230 61 6e 6e 6f 74 20 45 58 50 52 44 55 50 5f 52 45 annot EXPRDUP_RE
79240 44 55 43 45 20 74 68 69 73 20 45 78 70 72 20 2a DUCE this Expr *
79250 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 /..../*..** The
79260 70 73 65 75 64 6f 2d 72 6f 75 74 69 6e 65 20 73 pseudo-routine s
79270 71 6c 69 74 65 33 45 78 70 72 53 65 74 49 72 72 qlite3ExprSetIrr
79280 65 64 75 63 69 62 6c 65 20 73 65 74 73 20 74 68 educible sets th
79290 65 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c e EP2_Irreducibl
792a0 65 0d 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 61 6e e..** flag on an
792b0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 expression stru
792c0 63 74 75 72 65 2e 20 20 54 68 69 73 20 66 6c 61 cture. This fla
792d0 67 20 69 73 20 75 73 65 64 20 66 6f 72 20 56 56 g is used for VV
792e0 26 41 20 6f 6e 6c 79 2e 20 20 54 68 65 0d 0a 2a &A only. The..*
792f0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6d 70 * routine is imp
79300 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 lemented as a ma
79310 63 72 6f 20 74 68 61 74 20 6f 6e 6c 79 20 77 6f cro that only wo
79320 72 6b 73 20 77 68 65 6e 20 69 6e 20 64 65 62 75 rks when in debu
79330 67 67 69 6e 67 20 6d 6f 64 65 2c 0d 0a 2a 2a 20 gging mode,..**
79340 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 62 75 72 so as not to bur
79350 64 65 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 den production c
79360 6f 64 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 ode...*/..#ifdef
79370 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 23 SQLITE_DEBUG..#
79380 20 64 65 66 69 6e 65 20 45 78 70 72 53 65 74 49 define ExprSetI
79390 72 72 65 64 75 63 69 62 6c 65 28 58 29 20 20 28 rreducible(X) (
793a0 58 29 2d 3e 66 6c 61 67 73 32 20 7c 3d 20 45 50 X)->flags2 |= EP
793b0 32 5f 49 72 72 65 64 75 63 69 62 6c 65 0d 0a 23 2_Irreducible..#
793c0 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 45 else..# define E
793d0 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c xprSetIrreducibl
793e0 65 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a e(X)..#endif....
793f0 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 /*..** These mac
79400 72 6f 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 ros can be used
79410 74 6f 20 74 65 73 74 2c 20 73 65 74 2c 20 6f 72 to test, set, or
79420 20 63 6c 65 61 72 20 62 69 74 73 20 69 6e 20 74 clear bits in t
79430 68 65 20 0d 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 he ..** Expr.fla
79440 67 73 20 66 69 65 6c 64 2e 0d 0a 2a 2f 0d 0a 23 gs field...*/..#
79450 64 65 66 69 6e 65 20 45 78 70 72 48 61 73 50 72 define ExprHasPr
79460 6f 70 65 72 74 79 28 45 2c 50 29 20 20 20 20 20 operty(E,P)
79470 28 28 28 45 29 2d 3e 66 6c 61 67 73 26 28 50 29 (((E)->flags&(P)
79480 29 3d 3d 28 50 29 29 0d 0a 23 64 65 66 69 6e 65 )==(P))..#define
79490 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 ExprHasAnyPrope
794a0 72 74 79 28 45 2c 50 29 20 20 28 28 28 45 29 2d rty(E,P) (((E)-
794b0 3e 66 6c 61 67 73 26 28 50 29 29 21 3d 30 29 0d >flags&(P))!=0).
794c0 0a 23 64 65 66 69 6e 65 20 45 78 70 72 53 65 74 .#define ExprSet
794d0 50 72 6f 70 65 72 74 79 28 45 2c 50 29 20 20 20 Property(E,P)
794e0 20 20 28 45 29 2d 3e 66 6c 61 67 73 7c 3d 28 50 (E)->flags|=(P
794f0 29 0d 0a 23 64 65 66 69 6e 65 20 45 78 70 72 43 )..#define ExprC
79500 6c 65 61 72 50 72 6f 70 65 72 74 79 28 45 2c 50 learProperty(E,P
79510 29 20 20 20 28 45 29 2d 3e 66 6c 61 67 73 26 3d ) (E)->flags&=
79520 7e 28 50 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d ~(P)..../*..** M
79530 61 63 72 6f 73 20 74 6f 20 64 65 74 65 72 6d 69 acros to determi
79540 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ne the number of
79550 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 bytes required
79560 62 79 20 61 20 6e 6f 72 6d 61 6c 20 45 78 70 72 by a normal Expr
79570 20 0d 0a 2a 2a 20 73 74 72 75 63 74 2c 20 61 6e ..** struct, an
79580 20 45 78 70 72 20 73 74 72 75 63 74 20 77 69 74 Expr struct wit
79590 68 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 h the EP_Reduced
795a0 20 66 6c 61 67 20 73 65 74 20 69 6e 20 45 78 70 flag set in Exp
795b0 72 2e 66 6c 61 67 73 20 0d 0a 2a 2a 20 61 6e 64 r.flags ..** and
795c0 20 61 6e 20 45 78 70 72 20 73 74 72 75 63 74 20 an Expr struct
795d0 77 69 74 68 20 74 68 65 20 45 50 5f 54 6f 6b 65 with the EP_Toke
795e0 6e 4f 6e 6c 79 20 66 6c 61 67 20 73 65 74 2e 0d nOnly flag set..
795f0 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 45 58 50 .*/..#define EXP
79600 52 5f 46 55 4c 4c 53 49 5a 45 20 20 20 20 20 20 R_FULLSIZE
79610 20 20 20 20 20 73 69 7a 65 6f 66 28 45 78 70 72 sizeof(Expr
79620 29 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 ) /* F
79630 75 6c 6c 20 73 69 7a 65 20 2a 2f 0d 0a 23 64 65 ull size */..#de
79640 66 69 6e 65 20 45 58 50 52 5f 52 45 44 55 43 45 fine EXPR_REDUCE
79650 44 53 49 5a 45 20 20 20 20 20 20 20 20 6f 66 66 DSIZE off
79660 73 65 74 6f 66 28 45 78 70 72 2c 69 54 61 62 6c setof(Expr,iTabl
79670 65 29 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 66 65 e) /* Common fe
79680 61 74 75 72 65 73 20 2a 2f 0d 0a 23 64 65 66 69 atures */..#defi
79690 6e 65 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c ne EXPR_TOKENONL
796a0 59 53 49 5a 45 20 20 20 20 20 20 6f 66 66 73 65 YSIZE offse
796b0 74 6f 66 28 45 78 70 72 2c 70 4c 65 66 74 29 20 tof(Expr,pLeft)
796c0 20 20 2f 2a 20 46 65 77 65 72 20 66 65 61 74 75 /* Fewer featu
796d0 72 65 73 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a res */..../*..**
796e0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f Flags passed to
796f0 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 the sqlite3Expr
79700 44 75 70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 Dup() function.
79710 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 See the header c
79720 6f 6d 6d 65 6e 74 20 0d 0a 2a 2a 20 61 62 6f 76 omment ..** abov
79730 65 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 e sqlite3ExprDup
79740 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0d () for details..
79750 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 45 58 50 .*/..#define EXP
79760 52 44 55 50 5f 52 45 44 55 43 45 20 20 20 20 20 RDUP_REDUCE
79770 20 20 20 20 30 78 30 30 30 31 20 20 2f 2a 20 55 0x0001 /* U
79780 73 65 64 20 72 65 64 75 63 65 64 2d 73 69 7a 65 sed reduced-size
79790 20 45 78 70 72 20 6e 6f 64 65 73 20 2a 2f 0d 0a Expr nodes */..
797a0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 6c 69 73 74 20 ../*..** A list
797b0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 of expressions.
797c0 20 45 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e Each expression
797d0 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 may optionally
797e0 68 61 76 65 20 61 0d 0a 2a 2a 20 6e 61 6d 65 2e have a..** name.
797f0 20 20 41 6e 20 65 78 70 72 2f 6e 61 6d 65 20 63 An expr/name c
79800 6f 6d 62 69 6e 61 74 69 6f 6e 20 63 61 6e 20 62 ombination can b
79810 65 20 75 73 65 64 20 69 6e 20 73 65 76 65 72 61 e used in severa
79820 6c 20 77 61 79 73 2c 20 73 75 63 68 0d 0a 2a 2a l ways, such..**
79830 20 61 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 as the list of
79840 22 65 78 70 72 20 41 53 20 49 44 22 20 66 69 65 "expr AS ID" fie
79850 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 lds following a
79860 22 53 45 4c 45 43 54 22 20 6f 72 20 69 6e 20 74 "SELECT" or in t
79870 68 65 0d 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 22 he..** list of "
79880 49 44 20 3d 20 65 78 70 72 22 20 69 74 65 6d 73 ID = expr" items
79890 20 69 6e 20 61 6e 20 55 50 44 41 54 45 2e 20 20 in an UPDATE.
798a0 41 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 A list of expres
798b0 73 69 6f 6e 73 20 63 61 6e 0d 0a 2a 2a 20 61 6c sions can..** al
798c0 73 6f 20 62 65 20 75 73 65 64 20 61 73 20 74 68 so be used as th
798d0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 20 e argument to a
798e0 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 function, in whi
798f0 63 68 20 63 61 73 65 20 74 68 65 20 61 2e 7a 4e ch case the a.zN
79900 61 6d 65 0d 0a 2a 2a 20 66 69 65 6c 64 20 69 73 ame..** field is
79910 20 6e 6f 74 20 75 73 65 64 2e 0d 0a 2a 2f 0d 0a not used...*/..
79920 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 20 struct ExprList
79930 7b 0d 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 {.. int nExpr;
79940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
79950 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 umber of express
79960 69 6f 6e 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 ions on the list
79970 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f */.. int nAllo
79980 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a c; /*
79990 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 Number of entri
799a0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 6c es allocated bel
799b0 6f 77 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 45 43 ow */.. int iEC
799c0 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 ursor;
799d0 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72 20 61 /* VDBE Cursor a
799e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
799f0 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0d his ExprList */.
79a00 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 . struct ExprLi
79a10 73 74 5f 69 74 65 6d 20 7b 0d 0a 20 20 20 20 45 st_item {.. E
79a20 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 xpr *pExpr;
79a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 /* The lis
79a40 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 t of expressions
79a50 20 2a 2f 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a */.. char *z
79a60 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 Name;
79a70 2f 2a 20 54 6f 6b 65 6e 20 61 73 73 6f 63 69 61 /* Token associa
79a80 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 ted with this ex
79a90 70 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20 20 20 pression */..
79aa0 20 63 68 61 72 20 2a 7a 53 70 61 6e 3b 20 20 20 char *zSpan;
79ab0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 /* Origi
79ac0 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 nal text of the
79ad0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20 expression */..
79ae0 20 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b u8 sortOrder;
79af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 /* 1 f
79b00 6f 72 20 44 45 53 43 20 6f 72 20 30 20 66 6f 72 or DESC or 0 for
79b10 20 41 53 43 20 2a 2f 0d 0a 20 20 20 20 75 38 20 ASC */.. u8
79b20 64 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 done;
79b30 20 20 20 20 2f 2a 20 41 20 66 6c 61 67 20 74 6f /* A flag to
79b40 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 70 indicate when p
79b50 72 6f 63 65 73 73 69 6e 67 20 69 73 20 66 69 6e rocessing is fin
79b60 69 73 68 65 64 20 2a 2f 0d 0a 20 20 20 20 75 31 ished */.. u1
79b70 36 20 69 4f 72 64 65 72 42 79 43 6f 6c 3b 20 20 6 iOrderByCol;
79b80 20 20 20 20 20 2f 2a 20 46 6f 72 20 4f 52 44 45 /* For ORDE
79b90 52 20 42 59 2c 20 63 6f 6c 75 6d 6e 20 6e 75 6d R BY, column num
79ba0 62 65 72 20 69 6e 20 72 65 73 75 6c 74 20 73 65 ber in result se
79bb0 74 20 2a 2f 0d 0a 20 20 20 20 75 31 36 20 69 41 t */.. u16 iA
79bc0 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 lias;
79bd0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 50 /* Index into P
79be0 61 72 73 65 2e 61 41 6c 69 61 73 5b 5d 20 66 6f arse.aAlias[] fo
79bf0 72 20 7a 4e 61 6d 65 20 2a 2f 0d 0a 20 20 7d 20 r zName */.. }
79c00 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *a;
79c10 20 20 20 20 20 2f 2a 20 4f 6e 65 20 65 6e 74 72 /* One entr
79c20 79 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 y for each expre
79c30 73 73 69 6f 6e 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a ssion */..};....
79c40 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e /*..** An instan
79c50 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 ce of this struc
79c60 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 ture is used by
79c70 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 72 65 the parser to re
79c80 63 6f 72 64 20 62 6f 74 68 0d 0a 2a 2a 20 74 68 cord both..** th
79c90 65 20 70 61 72 73 65 20 74 72 65 65 20 66 6f 72 e parse tree for
79ca0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 an expression a
79cb0 6e 64 20 74 68 65 20 73 70 61 6e 20 6f 66 20 69 nd the span of i
79cc0 6e 70 75 74 20 74 65 78 74 20 66 6f 72 20 61 6e nput text for an
79cd0 0d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e ..** expression.
79ce0 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 45 78 70 ..*/..struct Exp
79cf0 72 53 70 61 6e 20 7b 0d 0a 20 20 45 78 70 72 20 rSpan {.. Expr
79d00 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 *pExpr;
79d10 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 /* The expressi
79d20 6f 6e 20 70 61 72 73 65 20 74 72 65 65 20 2a 2f on parse tree */
79d30 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
79d40 7a 53 74 61 72 74 3b 20 20 20 2f 2a 20 46 69 72 zStart; /* Fir
79d50 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 st character of
79d60 69 6e 70 75 74 20 74 65 78 74 20 2a 2f 0d 0a 20 input text */..
79d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e const char *zEn
79d80 64 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 d; /* One ch
79d90 61 72 61 63 74 65 72 20 70 61 73 74 20 74 68 65 aracter past the
79da0 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 74 65 end of input te
79db0 78 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d xt */..};..../*.
79dc0 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 .** An instance
79dd0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 of this structur
79de0 65 20 63 61 6e 20 68 6f 6c 64 20 61 20 73 69 6d e can hold a sim
79df0 70 6c 65 20 6c 69 73 74 20 6f 66 20 69 64 65 6e ple list of iden
79e00 74 69 66 69 65 72 73 2c 0d 0a 2a 2a 20 73 75 63 tifiers,..** suc
79e10 68 20 61 73 20 74 68 65 20 6c 69 73 74 20 22 61 h as the list "a
79e20 2c 62 2c 63 22 20 69 6e 20 74 68 65 20 66 6f 6c ,b,c" in the fol
79e30 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 lowing statement
79e40 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 s:..**..**
79e50 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 28 61 2c INSERT INTO t(a,
79e60 62 2c 63 29 20 56 41 4c 55 45 53 20 2e 2e 2e 3b b,c) VALUES ...;
79e70 0d 0a 2a 2a 20 20 20 20 20 20 43 52 45 41 54 45 ..** CREATE
79e80 20 49 4e 44 45 58 20 69 64 78 20 4f 4e 20 74 28 INDEX idx ON t(
79e90 61 2c 62 2c 63 29 3b 0d 0a 2a 2a 20 20 20 20 20 a,b,c);..**
79ea0 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 CREATE TRIGGER
79eb0 74 72 69 67 20 42 45 46 4f 52 45 20 55 50 44 41 trig BEFORE UPDA
79ec0 54 45 20 4f 4e 20 74 28 61 2c 62 2c 63 29 20 2e TE ON t(a,b,c) .
79ed0 2e 2e 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ..;..**..** The
79ee0 49 64 4c 69 73 74 2e 61 2e 69 64 78 20 66 69 65 IdList.a.idx fie
79ef0 6c 64 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 ld is used when
79f00 74 68 65 20 49 64 4c 69 73 74 20 72 65 70 72 65 the IdList repre
79f10 73 65 6e 74 73 20 74 68 65 20 6c 69 73 74 20 6f sents the list o
79f20 66 0d 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d f..** column nam
79f30 65 73 20 61 66 74 65 72 20 61 20 74 61 62 6c 65 es after a table
79f40 20 6e 61 6d 65 20 69 6e 20 61 6e 20 49 4e 53 45 name in an INSE
79f50 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 RT statement. I
79f60 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0d n the statement.
79f70 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 49 4e 53 45 .**..** INSE
79f80 52 54 20 49 4e 54 4f 20 74 28 61 2c 62 2c 63 29 RT INTO t(a,b,c)
79f90 20 2e 2e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 .....**..** If
79fa0 22 61 22 20 69 73 20 74 68 65 20 6b 2d 74 68 20 "a" is the k-th
79fb0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 column of table
79fc0 22 74 22 2c 20 74 68 65 6e 20 49 64 4c 69 73 74 "t", then IdList
79fd0 2e 61 5b 30 5d 2e 69 64 78 3d 3d 6b 2e 0d 0a 2a .a[0].idx==k...*
79fe0 2f 0d 0a 73 74 72 75 63 74 20 49 64 4c 69 73 74 /..struct IdList
79ff0 20 7b 0d 0a 20 20 73 74 72 75 63 74 20 49 64 4c {.. struct IdL
7a000 69 73 74 5f 69 74 65 6d 20 7b 0d 0a 20 20 20 20 ist_item {..
7a010 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 char *zName;
7a020 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 /* Name of the
7a030 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0d 0a identifier */..
7a040 20 20 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 int idx;
7a050 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 /* Index i
7a060 6e 20 73 6f 6d 65 20 54 61 62 6c 65 2e 61 43 6f n some Table.aCo
7a070 6c 5b 5d 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 l[] of a column
7a080 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 2a 2f 0d 0a named zName */..
7a090 20 20 7d 20 2a 61 3b 0d 0a 20 20 69 6e 74 20 6e } *a;.. int n
7a0a0 49 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e Id; /* N
7a0b0 75 6d 62 65 72 20 6f 66 20 69 64 65 6e 74 69 66 umber of identif
7a0c0 69 65 72 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 iers on the list
7a0d0 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f */.. int nAllo
7a0e0 63 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 c; /* Numbe
7a0f0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 6c r of entries all
7a100 6f 63 61 74 65 64 20 66 6f 72 20 61 5b 5d 20 62 ocated for a[] b
7a110 65 6c 6f 77 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f elow */..};..../
7a120 2a 0d 0a 2a 2a 20 54 68 65 20 62 69 74 6d 61 73 *..** The bitmas
7a130 6b 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e k datatype defin
7a140 65 64 20 62 65 6c 6f 77 20 69 73 20 75 73 65 64 ed below is used
7a150 20 66 6f 72 20 76 61 72 69 6f 75 73 20 6f 70 74 for various opt
7a160 69 6d 69 7a 61 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d imizations...**.
7a170 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 69 .** Changing thi
7a180 73 20 66 72 6f 6d 20 61 20 36 34 2d 62 69 74 20 s from a 64-bit
7a190 74 6f 20 61 20 33 32 2d 62 69 74 20 74 79 70 65 to a 32-bit type
7a1a0 20 6c 69 6d 69 74 73 20 74 68 65 20 6e 75 6d 62 limits the numb
7a1b0 65 72 20 6f 66 0d 0a 2a 2a 20 74 61 62 6c 65 73 er of..** tables
7a1c0 20 69 6e 20 61 20 6a 6f 69 6e 20 74 6f 20 33 32 in a join to 32
7a1d0 20 69 6e 73 74 65 61 64 20 6f 66 20 36 34 2e 20 instead of 64.
7a1e0 20 42 75 74 20 69 74 20 61 6c 73 6f 20 72 65 64 But it also red
7a1f0 75 63 65 73 20 74 68 65 20 73 69 7a 65 0d 0a 2a uces the size..*
7a200 2a 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 * of the library
7a210 20 62 79 20 37 33 38 20 62 79 74 65 73 20 6f 6e by 738 bytes on
7a220 20 69 78 38 36 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 ix86...*/..type
7a230 64 65 66 20 75 36 34 20 42 69 74 6d 61 73 6b 3b def u64 Bitmask;
7a240 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 6e ..../*..** The n
7a250 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e umber of bits in
7a260 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 22 42 4d a Bitmask. "BM
7a270 53 22 20 6d 65 61 6e 73 20 22 42 69 74 4d 61 73 S" means "BitMas
7a280 6b 20 53 69 7a 65 22 2e 0d 0a 2a 2f 0d 0a 23 64 k Size"...*/..#d
7a290 65 66 69 6e 65 20 42 4d 53 20 20 28 28 69 6e 74 efine BMS ((int
7a2a0 29 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b )(sizeof(Bitmask
7a2b0 29 2a 38 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 )*8))..../*..**
7a2c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 The following st
7a2d0 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 ructure describe
7a2e0 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 s the FROM claus
7a2f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 e of a SELECT st
7a300 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2a 20 45 61 63 atement...** Eac
7a310 68 20 74 61 62 6c 65 20 6f 72 20 73 75 62 71 75 h table or subqu
7a320 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 ery in the FROM
7a330 63 6c 61 75 73 65 20 69 73 20 61 20 73 65 70 61 clause is a sepa
7a340 72 61 74 65 20 65 6c 65 6d 65 6e 74 20 6f 66 0d rate element of.
7a350 0a 2a 2a 20 74 68 65 20 53 72 63 4c 69 73 74 2e .** the SrcList.
7a360 61 5b 5d 20 61 72 72 61 79 2e 0d 0a 2a 2a 0d 0a a[] array...**..
7a370 2a 2a 20 57 69 74 68 20 74 68 65 20 61 64 64 69 ** With the addi
7a380 74 69 6f 6e 20 6f 66 20 6d 75 6c 74 69 70 6c 65 tion of multiple
7a390 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 database suppor
7a3a0 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 t, the following
7a3b0 20 73 74 72 75 63 74 75 72 65 0d 0a 2a 2a 20 63 structure..** c
7a3c0 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 an also be used
7a3d0 74 6f 20 64 65 73 63 72 69 62 65 20 61 20 70 61 to describe a pa
7a3e0 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 73 rticular table s
7a3f0 75 63 68 20 61 73 20 74 68 65 20 74 61 62 6c 65 uch as the table
7a400 20 74 68 61 74 0d 0a 2a 2a 20 69 73 20 6d 6f 64 that..** is mod
7a410 69 66 69 65 64 20 62 79 20 61 6e 20 49 4e 53 45 ified by an INSE
7a420 52 54 2c 20 44 45 4c 45 54 45 2c 20 6f 72 20 55 RT, DELETE, or U
7a430 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e PDATE statement.
7a440 20 20 49 6e 20 73 74 61 6e 64 61 72 64 20 53 51 In standard SQ
7a450 4c 2c 0d 0a 2a 2a 20 73 75 63 68 20 61 20 74 61 L,..** such a ta
7a460 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 73 69 ble must be a si
7a470 6d 70 6c 65 20 6e 61 6d 65 3a 20 49 44 2e 20 20 mple name: ID.
7a480 42 75 74 20 69 6e 20 53 51 4c 69 74 65 2c 20 74 But in SQLite, t
7a490 68 65 20 74 61 62 6c 65 20 63 61 6e 0d 0a 2a 2a he table can..**
7a4a0 20 6e 6f 77 20 62 65 20 69 64 65 6e 74 69 66 69 now be identifi
7a4b0 65 64 20 62 79 20 61 20 64 61 74 61 62 61 73 65 ed by a database
7a4c0 20 6e 61 6d 65 2c 20 61 20 64 6f 74 2c 20 74 68 name, a dot, th
7a4d0 65 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d en the table nam
7a4e0 65 3a 20 49 44 2e 49 44 2e 0d 0a 2a 2a 0d 0a 2a e: ID.ID...**..*
7a4f0 2a 20 54 68 65 20 6a 6f 69 6e 74 79 70 65 20 73 * The jointype s
7a500 74 61 72 74 73 20 6f 75 74 20 73 68 6f 77 69 6e tarts out showin
7a510 67 20 74 68 65 20 6a 6f 69 6e 20 74 79 70 65 20 g the join type
7a520 62 65 74 77 65 65 6e 20 74 68 65 20 63 75 72 72 between the curr
7a530 65 6e 74 20 74 61 62 6c 65 0d 0a 2a 2a 20 61 6e ent table..** an
7a540 64 20 74 68 65 20 6e 65 78 74 20 74 61 62 6c 65 d the next table
7a550 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 54 on the list. T
7a560 68 65 20 70 61 72 73 65 72 20 62 75 69 6c 64 73 he parser builds
7a570 20 74 68 65 20 6c 69 73 74 20 74 68 69 73 20 77 the list this w
7a580 61 79 2e 0d 0a 2a 2a 20 42 75 74 20 73 71 6c 69 ay...** But sqli
7a590 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a te3SrcListShiftJ
7a5a0 6f 69 6e 54 79 70 65 28 29 20 6c 61 74 65 72 20 oinType() later
7a5b0 73 68 69 66 74 73 20 74 68 65 20 6a 6f 69 6e 74 shifts the joint
7a5c0 79 70 65 73 20 73 6f 20 74 68 61 74 20 65 61 63 ypes so that eac
7a5d0 68 0d 0a 2a 2a 20 6a 6f 69 6e 74 79 70 65 20 65 h..** jointype e
7a5e0 78 70 72 65 73 73 65 73 20 74 68 65 20 6a 6f 69 xpresses the joi
7a5f0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 61 n between the ta
7a600 62 6c 65 20 61 6e 64 20 74 68 65 20 70 72 65 76 ble and the prev
7a610 69 6f 75 73 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d ious table...**.
7a620 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 6c 55 73 .** In the colUs
7a630 65 64 20 66 69 65 6c 64 2c 20 74 68 65 20 68 69 ed field, the hi
7a640 67 68 2d 6f 72 64 65 72 20 62 69 74 20 28 62 69 gh-order bit (bi
7a650 74 20 36 33 29 20 69 73 20 73 65 74 20 69 66 20 t 63) is set if
7a660 74 68 65 20 74 61 62 6c 65 0d 0a 2a 2a 20 63 6f the table..** co
7a670 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e ntains more than
7a680 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 63 columns and
7a690 74 68 65 20 36 34 2d 74 68 20 6f 72 20 6c 61 74 the 64-th or lat
7a6a0 65 72 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 er column is use
7a6b0 64 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 53 d...*/..struct S
7a6c0 72 63 4c 69 73 74 20 7b 0d 0a 20 20 69 31 36 20 rcList {.. i16
7a6d0 6e 53 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 nSrc; /*
7a6e0 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 Number of tables
7a6f0 20 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 69 or subqueries i
7a700 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 n the FROM claus
7a710 65 20 2a 2f 0d 0a 20 20 69 31 36 20 6e 41 6c 6c e */.. i16 nAll
7a720 6f 63 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 oc; /* Numb
7a730 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c er of entries al
7a740 6c 6f 63 61 74 65 64 20 69 6e 20 61 5b 5d 20 62 located in a[] b
7a750 65 6c 6f 77 20 2a 2f 0d 0a 20 20 73 74 72 75 63 elow */.. struc
7a760 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 7b t SrcList_item {
7a770 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 .. char *zDat
7a780 61 62 61 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 abase; /* Name
7a790 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 of database hold
7a7a0 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a ing this table *
7a7b0 2f 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 /.. char *zNa
7a7c0 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 me; /* Name
7a7d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f of the table */
7a7e0 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 6c 69 .. char *zAli
7a7f0 61 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 as; /* The "
7a800 42 22 20 70 61 72 74 20 6f 66 20 61 20 22 41 20 B" part of a "A
7a810 41 53 20 42 22 20 70 68 72 61 73 65 2e 20 20 7a AS B" phrase. z
7a820 4e 61 6d 65 20 69 73 20 74 68 65 20 22 41 22 20 Name is the "A"
7a830 2a 2f 0d 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 */.. Table *p
7a840 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 Tab; /* An
7a850 53 51 4c 20 74 61 62 6c 65 20 63 6f 72 72 65 73 SQL table corres
7a860 70 6f 6e 64 69 6e 67 20 74 6f 20 7a 4e 61 6d 65 ponding to zName
7a870 20 2a 2f 0d 0a 20 20 20 20 53 65 6c 65 63 74 20 */.. Select
7a880 2a 70 53 65 6c 65 63 74 3b 20 20 2f 2a 20 41 20 *pSelect; /* A
7a890 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 SELECT statement
7a8a0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f used in place o
7a8b0 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a f a table name *
7a8c0 2f 0d 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 /.. int addrF
7a8d0 69 6c 6c 53 75 62 3b 20 20 2f 2a 20 41 64 64 72 illSub; /* Addr
7a8e0 65 73 73 20 6f 66 20 73 75 62 72 6f 75 74 69 6e ess of subroutin
7a8f0 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 61 20 e to manifest a
7a900 73 75 62 71 75 65 72 79 20 2a 2f 0d 0a 20 20 20 subquery */..
7a910 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 3b 20 int regReturn;
7a920 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 /* Register h
7a930 6f 6c 64 69 6e 67 20 72 65 74 75 72 6e 20 61 64 olding return ad
7a940 64 72 65 73 73 20 6f 66 20 61 64 64 72 46 69 6c dress of addrFil
7a950 6c 53 75 62 20 2a 2f 0d 0a 20 20 20 20 75 38 20 lSub */.. u8
7a960 6a 6f 69 6e 74 79 70 65 3b 20 20 20 20 20 20 2f jointype; /
7a970 2a 20 54 79 70 65 20 6f 66 20 6a 6f 69 6e 20 62 * Type of join b
7a980 65 74 77 65 65 6e 20 74 68 69 73 20 61 62 6c 65 etween this able
7a990 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 and the previou
7a9a0 73 20 2a 2f 0d 0a 20 20 20 20 75 38 20 6e 6f 74 s */.. u8 not
7a9b0 49 6e 64 65 78 65 64 3b 20 20 20 20 2f 2a 20 54 Indexed; /* T
7a9c0 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 rue if there is
7a9d0 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c a NOT INDEXED cl
7a9e0 61 75 73 65 20 2a 2f 0d 0a 20 20 20 20 75 38 20 ause */.. u8
7a9f0 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 20 20 2f isCorrelated; /
7aa00 2a 20 54 72 75 65 20 69 66 20 73 75 62 2d 71 75 * True if sub-qu
7aa10 65 72 79 20 69 73 20 63 6f 72 72 65 6c 61 74 65 ery is correlate
7aa20 64 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 d */..#ifndef SQ
7aa30 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 LITE_OMIT_EXPLAI
7aa40 4e 0d 0a 20 20 20 20 75 38 20 69 53 65 6c 65 63 N.. u8 iSelec
7aa50 74 49 64 3b 20 20 20 20 20 2f 2a 20 49 66 20 70 tId; /* If p
7aa60 53 65 6c 65 63 74 21 3d 30 2c 20 74 68 65 20 69 Select!=0, the i
7aa70 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c d of the sub-sel
7aa80 65 63 74 20 69 6e 20 45 51 50 20 2a 2f 0d 0a 23 ect in EQP */..#
7aa90 65 6e 64 69 66 0d 0a 20 20 20 20 69 6e 74 20 69 endif.. int i
7aaa0 43 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 Cursor; /*
7aab0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 The VDBE cursor
7aac0 6e 75 6d 62 65 72 20 75 73 65 64 20 74 6f 20 61 number used to a
7aad0 63 63 65 73 73 20 74 68 69 73 20 74 61 62 6c 65 ccess this table
7aae0 20 2a 2f 0d 0a 20 20 20 20 45 78 70 72 20 2a 70 */.. Expr *p
7aaf0 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 On; /* Th
7ab00 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 e ON clause of a
7ab10 20 6a 6f 69 6e 20 2a 2f 0d 0a 20 20 20 20 49 64 join */.. Id
7ab20 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 20 20 20 List *pUsing;
7ab30 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 /* The USING cla
7ab40 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f use of a join */
7ab50 0d 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f .. Bitmask co
7ab60 6c 55 73 65 64 3b 20 20 2f 2a 20 42 69 74 20 4e lUsed; /* Bit N
7ab70 20 28 31 3c 3c 4e 29 20 73 65 74 20 69 66 20 63 (1<<N) set if c
7ab80 6f 6c 75 6d 6e 20 4e 20 6f 66 20 70 54 61 62 20 olumn N of pTab
7ab90 69 73 20 75 73 65 64 20 2a 2f 0d 0a 20 20 20 20 is used */..
7aba0 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 char *zIndex;
7abb0 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 20 /* Identifier
7abc0 66 72 6f 6d 20 22 49 4e 44 45 58 45 44 20 42 59 from "INDEXED BY
7abd0 20 3c 7a 49 6e 64 65 78 3e 22 20 63 6c 61 75 73 <zIndex>" claus
7abe0 65 20 2a 2f 0d 0a 20 20 20 20 49 6e 64 65 78 20 e */.. Index
7abf0 2a 70 49 6e 64 65 78 3b 20 20 20 20 2f 2a 20 49 *pIndex; /* I
7ac00 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 63 ndex structure c
7ac10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 orresponding to
7ac20 7a 49 6e 64 65 78 2c 20 69 66 20 61 6e 79 20 2a zIndex, if any *
7ac30 2f 0d 0a 20 20 7d 20 61 5b 31 5d 3b 20 20 20 20 /.. } a[1];
7ac40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 /* One
7ac50 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 69 entry for each i
7ac60 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 dentifier on the
7ac70 20 6c 69 73 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a list */..};....
7ac80 2f 2a 0d 0a 2a 2a 20 50 65 72 6d 69 74 74 65 64 /*..** Permitted
7ac90 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53 values of the S
7aca0 72 63 4c 69 73 74 2e 61 2e 6a 6f 69 6e 74 79 70 rcList.a.jointyp
7acb0 65 20 66 69 65 6c 64 0d 0a 2a 2f 0d 0a 23 64 65 e field..*/..#de
7acc0 66 69 6e 65 20 4a 54 5f 49 4e 4e 45 52 20 20 20 fine JT_INNER
7acd0 20 20 30 78 30 30 30 31 20 20 20 20 2f 2a 20 41 0x0001 /* A
7ace0 6e 79 20 6b 69 6e 64 20 6f 66 20 69 6e 6e 65 72 ny kind of inner
7acf0 20 6f 72 20 63 72 6f 73 73 20 6a 6f 69 6e 20 2a or cross join *
7ad00 2f 0d 0a 23 64 65 66 69 6e 65 20 4a 54 5f 43 52 /..#define JT_CR
7ad10 4f 53 53 20 20 20 20 20 30 78 30 30 30 32 20 20 OSS 0x0002
7ad20 20 20 2f 2a 20 45 78 70 6c 69 63 69 74 20 75 73 /* Explicit us
7ad30 65 20 6f 66 20 74 68 65 20 43 52 4f 53 53 20 6b e of the CROSS k
7ad40 65 79 77 6f 72 64 20 2a 2f 0d 0a 23 64 65 66 69 eyword */..#defi
7ad50 6e 65 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 ne JT_NATURAL
7ad60 30 78 30 30 30 34 20 20 20 20 2f 2a 20 54 72 75 0x0004 /* Tru
7ad70 65 20 66 6f 72 20 61 20 22 6e 61 74 75 72 61 6c e for a "natural
7ad80 22 20 6a 6f 69 6e 20 2a 2f 0d 0a 23 64 65 66 69 " join */..#defi
7ad90 6e 65 20 4a 54 5f 4c 45 46 54 20 20 20 20 20 20 ne JT_LEFT
7ada0 30 78 30 30 30 38 20 20 20 20 2f 2a 20 4c 65 66 0x0008 /* Lef
7adb0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 20 2a 2f 0d t outer join */.
7adc0 0a 23 64 65 66 69 6e 65 20 4a 54 5f 52 49 47 48 .#define JT_RIGH
7add0 54 20 20 20 20 20 30 78 30 30 31 30 20 20 20 20 T 0x0010
7ade0 2f 2a 20 52 69 67 68 74 20 6f 75 74 65 72 20 6a /* Right outer j
7adf0 6f 69 6e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 oin */..#define
7ae00 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 30 78 30 JT_OUTER 0x0
7ae10 30 32 30 20 20 20 20 2f 2a 20 54 68 65 20 22 4f 020 /* The "O
7ae20 55 54 45 52 22 20 6b 65 79 77 6f 72 64 20 69 73 UTER" keyword is
7ae30 20 70 72 65 73 65 6e 74 20 2a 2f 0d 0a 23 64 65 present */..#de
7ae40 66 69 6e 65 20 4a 54 5f 45 52 52 4f 52 20 20 20 fine JT_ERROR
7ae50 20 20 30 78 30 30 34 30 20 20 20 20 2f 2a 20 75 0x0040 /* u
7ae60 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 nknown or unsupp
7ae70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 orted join type
7ae80 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 */....../*..** A
7ae90 20 57 68 65 72 65 50 6c 61 6e 20 6f 62 6a 65 63 WherePlan objec
7aea0 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 t holds informat
7aeb0 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 ion that describ
7aec0 65 73 20 61 20 6c 6f 6f 6b 75 70 0d 0a 2a 2a 20 es a lookup..**
7aed0 73 74 72 61 74 65 67 79 2e 0d 0a 2a 2a 0d 0a 2a strategy...**..*
7aee0 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 * This object is
7aef0 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 intended to be
7af00 6f 70 61 71 75 65 20 6f 75 74 73 69 64 65 20 6f opaque outside o
7af10 66 20 74 68 65 20 77 68 65 72 65 2e 63 20 6d 6f f the where.c mo
7af20 64 75 6c 65 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 dule...** It is
7af30 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20 6f 6e included here on
7af40 6c 79 20 73 6f 20 74 68 61 74 20 74 68 61 74 20 ly so that that
7af50 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6b 6e compiler will kn
7af60 6f 77 20 68 6f 77 20 62 69 67 20 69 74 0d 0a 2a ow how big it..*
7af70 2a 20 69 73 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 * is. None of t
7af80 68 65 20 66 69 65 6c 64 73 20 69 6e 20 74 68 69 he fields in thi
7af90 73 20 6f 62 6a 65 63 74 20 73 68 6f 75 6c 64 20 s object should
7afa0 62 65 20 75 73 65 64 20 6f 75 74 73 69 64 65 20 be used outside
7afb0 6f 66 0d 0a 2a 2a 20 74 68 65 20 77 68 65 72 65 of..** the where
7afc0 2e 63 20 6d 6f 64 75 6c 65 2e 0d 0a 2a 2a 0d 0a .c module...**..
7afd0 2a 2a 20 57 69 74 68 69 6e 20 74 68 65 20 75 6e ** Within the un
7afe0 69 6f 6e 2c 20 70 49 64 78 20 69 73 20 6f 6e 6c ion, pIdx is onl
7aff0 79 20 75 73 65 64 20 77 68 65 6e 20 77 73 46 6c y used when wsFl
7b000 61 67 73 26 57 48 45 52 45 5f 49 4e 44 45 58 45 ags&WHERE_INDEXE
7b010 44 20 69 73 20 74 72 75 65 2e 0d 0a 2a 2a 20 70 D is true...** p
7b020 54 65 72 6d 20 69 73 20 6f 6e 6c 79 20 75 73 65 Term is only use
7b030 64 20 77 68 65 6e 20 77 73 46 6c 61 67 73 26 57 d when wsFlags&W
7b040 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 69 73 HERE_MULTI_OR is
7b050 20 74 72 75 65 2e 20 20 41 6e 64 20 70 56 74 61 true. And pVta
7b060 62 49 64 78 0d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 bIdx..** is only
7b070 20 75 73 65 64 20 77 68 65 6e 20 77 73 46 6c 61 used when wsFla
7b080 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c gs&WHERE_VIRTUAL
7b090 54 41 42 4c 45 20 69 73 20 74 72 75 65 2e 20 20 TABLE is true.
7b0a0 49 74 20 69 73 20 6e 65 76 65 72 20 74 68 65 0d It is never the.
7b0b0 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 6d 6f .** case that mo
7b0c0 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 re than one of t
7b0d0 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 hese conditions
7b0e0 69 73 20 74 72 75 65 2e 0d 0a 2a 2f 0d 0a 73 74 is true...*/..st
7b0f0 72 75 63 74 20 57 68 65 72 65 50 6c 61 6e 20 7b ruct WherePlan {
7b100 0d 0a 20 20 75 33 32 20 77 73 46 6c 61 67 73 3b .. u32 wsFlags;
7b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7b120 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c /* WHERE_* fl
7b130 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 ags that describ
7b140 65 20 74 68 65 20 73 74 72 61 74 65 67 79 20 2a e the strategy *
7b150 2f 0d 0a 20 20 75 33 32 20 6e 45 71 3b 20 20 20 /.. u32 nEq;
7b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7b170 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
7b180 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 == constraints
7b190 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f */.. double nRo
7b1a0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 w;
7b1b0 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 /* Estimate
7b1c0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 d number of rows
7b1d0 20 28 66 6f 72 20 45 51 50 29 20 2a 2f 0d 0a 20 (for EQP) */..
7b1e0 20 75 6e 69 6f 6e 20 7b 0d 0a 20 20 20 20 49 6e union {.. In
7b1f0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 dex *pIdx;
7b200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
7b210 49 6e 64 65 78 20 77 68 65 6e 20 57 48 45 52 45 Index when WHERE
7b220 5f 49 4e 44 45 58 45 44 20 69 73 20 74 72 75 65 _INDEXED is true
7b230 20 2a 2f 0d 0a 20 20 20 20 73 74 72 75 63 74 20 */.. struct
7b240 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d WhereTerm *pTerm
7b250 3b 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 ; /* WHERE
7b260 20 63 6c 61 75 73 65 20 74 65 72 6d 20 66 6f 72 clause term for
7b270 20 4f 52 2d 73 65 61 72 63 68 20 2a 2f 0d 0a 20 OR-search */..
7b280 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 sqlite3_index
7b290 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 3b _info *pVtabIdx;
7b2a0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 /* Virtual tab
7b2b0 6c 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 le index to use
7b2c0 2a 2f 0d 0a 20 20 7d 20 75 3b 0d 0a 7d 3b 0d 0a */.. } u;..};..
7b2d0 0d 0a 2f 2a 0d 0a 2a 2a 20 46 6f 72 20 65 61 63 ../*..** For eac
7b2e0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 69 6e h nested loop in
7b2f0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 a WHERE clause
7b300 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 implementation,
7b310 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0d 0a 2a the WhereInfo..*
7b320 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 * structure cont
7b330 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e ains a single in
7b340 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 stance of this s
7b350 74 72 75 63 74 75 72 65 2e 20 20 54 68 69 73 20 tructure. This
7b360 73 74 72 75 63 74 75 72 65 0d 0a 2a 2a 20 69 73 structure..** is
7b370 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 intended to be
7b380 70 72 69 76 61 74 65 20 74 68 65 20 74 68 65 20 private the the
7b390 77 68 65 72 65 2e 63 20 6d 6f 64 75 6c 65 20 61 where.c module a
7b3a0 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 nd should not be
7b3b0 0d 0a 2a 2a 20 61 63 63 65 73 73 20 6f 72 20 6d ..** access or m
7b3c0 6f 64 69 66 69 65 64 20 62 79 20 6f 74 68 65 72 odified by other
7b3d0 20 6d 6f 64 75 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a modules...**..*
7b3e0 2a 20 54 68 65 20 70 49 64 78 49 6e 66 6f 20 66 * The pIdxInfo f
7b3f0 69 65 6c 64 20 69 73 20 75 73 65 64 20 74 6f 20 ield is used to
7b400 68 65 6c 70 20 70 69 63 6b 20 74 68 65 20 62 65 help pick the be
7b410 73 74 20 69 6e 64 65 78 20 6f 6e 20 61 0d 0a 2a st index on a..*
7b420 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e * virtual table.
7b430 20 20 54 68 65 20 70 49 64 78 49 6e 66 6f 20 70 The pIdxInfo p
7b440 6f 69 6e 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 ointer contains
7b450 69 6e 64 65 78 69 6e 67 0d 0a 2a 2a 20 69 6e 66 indexing..** inf
7b460 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 ormation for the
7b470 20 69 2d 74 68 20 74 61 62 6c 65 20 69 6e 20 74 i-th table in t
7b480 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 he FROM clause b
7b490 65 66 6f 72 65 20 72 65 6f 72 64 65 72 69 6e 67 efore reordering
7b4a0 2e 0d 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 70 49 ...** All the pI
7b4b0 64 78 49 6e 66 6f 20 70 6f 69 6e 74 65 72 73 20 dxInfo pointers
7b4c0 61 72 65 20 66 72 65 65 64 20 62 79 20 77 68 65 are freed by whe
7b4d0 72 65 49 6e 66 6f 46 72 65 65 28 29 20 69 6e 20 reInfoFree() in
7b4e0 77 68 65 72 65 2e 63 2e 0d 0a 2a 2a 20 41 6c 6c where.c...** All
7b4f0 20 6f 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 other informati
7b500 6f 6e 20 69 6e 20 74 68 65 20 69 2d 74 68 20 57 on in the i-th W
7b510 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 hereLevel object
7b520 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 61 for the i-th ta
7b530 62 6c 65 0d 0a 2a 2a 20 61 66 74 65 72 20 46 52 ble..** after FR
7b540 4f 4d 20 63 6c 61 75 73 65 20 6f 72 64 65 72 69 OM clause orderi
7b550 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 ng...*/..struct
7b560 57 68 65 72 65 4c 65 76 65 6c 20 7b 0d 0a 20 20 WhereLevel {..
7b570 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 WherePlan plan;
7b580 20 20 20 20 20 20 2f 2a 20 71 75 65 72 79 20 70 /* query p
7b590 6c 61 6e 20 66 6f 72 20 74 68 69 73 20 65 6c 65 lan for this ele
7b5a0 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d ment of the FROM
7b5b0 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20 20 69 6e clause */.. in
7b5c0 74 20 69 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 t iLeftJoin;
7b5d0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 /* Memory ce
7b5e0 6c 6c 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 ll used to imple
7b5f0 6d 65 6e 74 20 4c 45 46 54 20 4f 55 54 45 52 20 ment LEFT OUTER
7b600 4a 4f 49 4e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 JOIN */.. int i
7b610 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20 TabCur;
7b620 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 /* The VDBE cur
7b630 73 6f 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 sor used to acce
7b640 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0d ss the table */.
7b650 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 . int iIdxCur;
7b660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
7b670 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 VDBE cursor used
7b680 20 74 6f 20 61 63 63 65 73 73 20 70 49 64 78 20 to access pIdx
7b690 2a 2f 0d 0a 20 20 69 6e 74 20 61 64 64 72 42 72 */.. int addrBr
7b6a0 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a k; /* J
7b6b0 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 ump here to brea
7b6c0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f k out of the loo
7b6d0 70 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 64 64 72 p */.. int addr
7b6e0 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a Nxt; /*
7b6f0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 74 Jump here to st
7b700 61 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e 20 art the next IN
7b710 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0d 0a combination */..
7b720 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 int addrCont;
7b730 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 /* Jump
7b740 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 here to continue
7b750 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c with the next l
7b760 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0d 0a 20 20 oop cycle */..
7b770 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 int addrFirst;
7b780 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 /* First i
7b790 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e nstruction of in
7b7a0 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f terior of the lo
7b7b0 6f 70 20 2a 2f 0d 0a 20 20 75 38 20 69 46 72 6f op */.. u8 iFro
7b7c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f m; /
7b7d0 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e * Which entry in
7b7e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 the FROM clause
7b7f0 20 2a 2f 0d 0a 20 20 75 38 20 6f 70 2c 20 70 35 */.. u8 op, p5
7b800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
7b810 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 Opcode and P5 of
7b820 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74 the opcode that
7b830 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a ends the loop *
7b840 2f 0d 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b /.. int p1, p2;
7b850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 /* Op
7b860 65 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 erands of the op
7b870 63 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64 code used to end
7b880 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0d 0a 20 s the loop */..
7b890 20 75 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 union {
7b8a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d /* Inform
7b8b0 61 74 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e ation that depen
7b8c0 64 73 20 6f 6e 20 70 6c 61 6e 2e 77 73 46 6c 61 ds on plan.wsFla
7b8d0 67 73 20 2a 2f 0d 0a 20 20 20 20 73 74 72 75 63 gs */.. struc
7b8e0 74 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e t {.. int n
7b8f0 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 In;
7b900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e /* Number of en
7b910 74 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 tries in aInLoop
7b920 5b 5d 20 2a 2f 0d 0a 20 20 20 20 20 20 73 74 72 [] */.. str
7b930 75 63 74 20 49 6e 4c 6f 6f 70 20 7b 0d 0a 20 20 uct InLoop {..
7b940 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 3b 20 int iCur;
7b950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
7b960 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 The VDBE cursor
7b970 75 73 65 64 20 62 79 20 74 68 69 73 20 49 4e 20 used by this IN
7b980 6f 70 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 20 operator */..
7b990 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 54 int addrInT
7b9a0 6f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 op; /* T
7b9b0 6f 70 20 6f 66 20 74 68 65 20 49 4e 20 6c 6f 6f op of the IN loo
7b9c0 70 20 2a 2f 0d 0a 20 20 20 20 20 20 7d 20 2a 61 p */.. } *a
7b9d0 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 InLoop;
7b9e0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e /* Information
7b9f0 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 73 74 about each nest
7ba00 65 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a ed IN operator *
7ba10 2f 0d 0a 20 20 20 20 7d 20 69 6e 3b 20 20 20 20 /.. } in;
7ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
7ba30 55 73 65 64 20 77 68 65 6e 20 70 6c 61 6e 2e 77 Used when plan.w
7ba40 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49 4e 5f sFlags&WHERE_IN_
7ba50 41 42 4c 45 20 2a 2f 0d 0a 20 20 7d 20 75 3b 0d ABLE */.. } u;.
7ba60 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c ... /* The foll
7ba70 6f 77 69 6e 67 20 66 69 65 6c 64 20 69 73 20 72 owing field is r
7ba80 65 61 6c 6c 79 20 6e 6f 74 20 70 61 72 74 20 6f eally not part o
7ba90 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 f the current le
7baa0 76 65 6c 2e 20 20 42 75 74 0d 0a 20 20 2a 2a 20 vel. But.. **
7bab0 77 65 20 6e 65 65 64 20 61 20 70 6c 61 63 65 20 we need a place
7bac0 74 6f 20 63 61 63 68 65 20 76 69 72 74 75 61 6c to cache virtual
7bad0 20 74 61 62 6c 65 20 69 6e 64 65 78 20 69 6e 66 table index inf
7bae0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 ormation for eac
7baf0 68 0d 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 h.. ** virtual
7bb00 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f table in the FRO
7bb10 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 M clause and the
7bb20 20 57 68 65 72 65 4c 65 76 65 6c 20 73 74 72 75 WhereLevel stru
7bb30 63 74 75 72 65 20 69 73 0d 0a 20 20 2a 2a 20 61 cture is.. ** a
7bb40 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 convenient plac
7bb50 65 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 e since there is
7bb60 20 6f 6e 65 20 57 68 65 72 65 4c 65 76 65 6c 20 one WhereLevel
7bb70 66 6f 72 20 65 61 63 68 20 46 52 4f 4d 20 63 6c for each FROM cl
7bb80 61 75 73 65 0d 0a 20 20 2a 2a 20 65 6c 65 6d 65 ause.. ** eleme
7bb90 6e 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 6c nt... */.. sql
7bba0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 ite3_index_info
7bbb0 2a 70 49 64 78 49 6e 66 6f 3b 20 20 2f 2a 20 49 *pIdxInfo; /* I
7bbc0 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 6e 2d ndex info for n-
7bbd0 74 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 th source table
7bbe0 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
7bbf0 20 46 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 Flags appropria
7bc00 74 65 20 66 6f 72 20 74 68 65 20 77 63 74 72 6c te for the wctrl
7bc10 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 Flags parameter
7bc20 6f 66 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 of sqlite3WhereB
7bc30 65 67 69 6e 28 29 0d 0a 2a 2a 20 61 6e 64 20 74 egin()..** and t
7bc40 68 65 20 57 68 65 72 65 49 6e 66 6f 2e 77 63 74 he WhereInfo.wct
7bc50 72 6c 46 6c 61 67 73 20 6d 65 6d 62 65 72 2e 0d rlFlags member..
7bc60 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 48 45 .*/..#define WHE
7bc70 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 RE_ORDERBY_NORMA
7bc80 4c 20 20 20 30 78 30 30 30 30 20 2f 2a 20 4e 6f L 0x0000 /* No
7bc90 2d 6f 70 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 -op */..#define
7bca0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 WHERE_ORDERBY_MI
7bcb0 4e 20 20 20 20 20 20 30 78 30 30 30 31 20 2f 2a N 0x0001 /*
7bcc0 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 ORDER BY proces
7bcd0 73 69 6e 67 20 66 6f 72 20 6d 69 6e 28 29 20 66 sing for min() f
7bce0 75 6e 63 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 unc */..#define
7bcf0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 WHERE_ORDERBY_MA
7bd00 58 20 20 20 20 20 20 30 78 30 30 30 32 20 2f 2a X 0x0002 /*
7bd10 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 ORDER BY proces
7bd20 73 69 6e 67 20 66 6f 72 20 6d 61 78 28 29 20 66 sing for max() f
7bd30 75 6e 63 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 unc */..#define
7bd40 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 WHERE_ONEPASS_DE
7bd50 53 49 52 45 44 20 20 30 78 30 30 30 34 20 2f 2a SIRED 0x0004 /*
7bd60 20 57 61 6e 74 20 74 6f 20 64 6f 20 6f 6e 65 2d Want to do one-
7bd70 70 61 73 73 20 55 50 44 41 54 45 2f 44 45 4c 45 pass UPDATE/DELE
7bd80 54 45 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 TE */..#define W
7bd90 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f HERE_DUPLICATES_
7bda0 4f 4b 20 20 20 20 30 78 30 30 30 38 20 2f 2a 20 OK 0x0008 /*
7bdb0 4f 6b 20 74 6f 20 72 65 74 75 72 6e 20 61 20 72 Ok to return a r
7bdc0 6f 77 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 ow more than onc
7bdd0 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 48 e */..#define WH
7bde0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c ERE_OMIT_OPEN_CL
7bdf0 4f 53 45 20 20 30 78 30 30 31 30 20 2f 2a 20 54 OSE 0x0010 /* T
7be00 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72 65 able cursors are
7be10 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 2a 2f already open */
7be20 0d 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f ..#define WHERE_
7be30 46 4f 52 43 45 5f 54 41 42 4c 45 20 20 20 20 20 FORCE_TABLE
7be40 20 30 78 30 30 32 30 20 2f 2a 20 44 6f 20 6e 6f 0x0020 /* Do no
7be50 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2d 6f t use an index-o
7be60 6e 6c 79 20 73 65 61 72 63 68 20 2a 2f 0d 0a 23 nly search */..#
7be70 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 define WHERE_ONE
7be80 54 41 42 4c 45 5f 4f 4e 4c 59 20 20 20 20 30 78 TABLE_ONLY 0x
7be90 30 30 34 30 20 2f 2a 20 4f 6e 6c 79 20 63 6f 64 0040 /* Only cod
7bea0 65 20 74 68 65 20 31 73 74 20 74 61 62 6c 65 20 e the 1st table
7beb0 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0d 0a in pTabList */..
7bec0 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 4e #define WHERE_AN
7bed0 44 5f 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 30 D_ONLY 0
7bee0 78 30 30 38 30 20 2f 2a 20 44 6f 6e 27 74 20 75 x0080 /* Don't u
7bef0 73 65 20 69 6e 64 69 63 65 73 20 66 6f 72 20 4f se indices for O
7bf00 52 20 74 65 72 6d 73 20 2a 2f 0d 0a 0d 0a 2f 2a R terms */..../*
7bf10 0d 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63 ..** The WHERE c
7bf20 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 lause processing
7bf30 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f routine has two
7bf40 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0d 0a 2a halves. The..*
7bf50 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 * first part doe
7bf60 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 s the start of t
7bf70 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e he WHERE loop an
7bf80 64 20 74 68 65 20 73 65 63 6f 6e 64 0d 0a 2a 2a d the second..**
7bf90 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 half does the t
7bfa0 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 ail of the WHERE
7bfb0 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 loop. An insta
7bfc0 6e 63 65 20 6f 66 0d 0a 2a 2a 20 74 68 69 73 20 nce of..** this
7bfd0 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 structure is ret
7bfe0 75 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 urned by the fir
7bff0 73 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 st half and pass
7c000 65 64 0d 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 ed..** into the
7c010 73 65 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 second half to g
7c020 69 76 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 ive some continu
7c030 69 74 79 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 ity...*/..struct
7c040 20 57 68 65 72 65 49 6e 66 6f 20 7b 0d 0a 20 20 WhereInfo {..
7c050 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 Parse *pParse;
7c060 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 /* Parsing
7c070 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 and code generat
7c080 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a ing context */..
7c090 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 u16 wctrlFlags
7c0a0 3b 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 ; /* Flags
7c0b0 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 originally passe
7c0c0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 d to sqlite3Wher
7c0d0 65 42 65 67 69 6e 28 29 20 2a 2f 0d 0a 20 20 75 eBegin() */.. u
7c0e0 38 20 6f 6b 4f 6e 65 50 61 73 73 3b 20 20 20 20 8 okOnePass;
7c0f0 20 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 /* Ok to use
7c100 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 one-pass algori
7c110 74 68 6d 20 66 6f 72 20 55 50 44 41 54 45 20 6f thm for UPDATE o
7c120 72 20 44 45 4c 45 54 45 20 2a 2f 0d 0a 20 20 75 r DELETE */.. u
7c130 38 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3b 8 untestedTerms;
7c140 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 /* Not all W
7c150 48 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c HERE terms resol
7c160 76 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f ved by outer loo
7c170 70 20 2a 2f 0d 0a 20 20 75 38 20 65 44 69 73 74 p */.. u8 eDist
7c180 69 6e 63 74 3b 0d 0a 20 20 53 72 63 4c 69 73 74 inct;.. SrcList
7c190 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 *pTabList;
7c1a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 /* List
7c1b0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 of tables in the
7c1c0 20 6a 6f 69 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 join */.. int
7c1d0 69 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 iTop;
7c1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
7c1f0 65 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e 67 e very beginning
7c200 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f of the WHERE lo
7c210 6f 70 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f op */.. int iCo
7c220 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 ntinue;
7c230 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 /* Jump
7c240 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 here to continue
7c250 20 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 with next recor
7c260 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 42 72 65 d */.. int iBre
7c270 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ak;
7c280 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 /* Jump h
7c290 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 ere to break out
7c2a0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0d of the loop */.
7c2b0 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 . int nLevel;
7c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c2d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e /* Number of n
7c2e0 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0d 0a 20 ested loop */..
7c2f0 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 struct WhereCla
7c300 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 use *pWC;
7c310 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e /* Decomposition
7c320 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c of the WHERE cl
7c330 61 75 73 65 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c ause */.. doubl
7c340 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f e savedNQueryLoo
7c350 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 p; /* pPa
7c360 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 rse->nQueryLoop
7c370 6f 75 74 73 69 64 65 20 74 68 65 20 57 48 45 52 outside the WHER
7c380 45 20 6c 6f 6f 70 20 2a 2f 0d 0a 20 20 64 6f 75 E loop */.. dou
7c390 62 6c 65 20 6e 52 6f 77 4f 75 74 3b 20 20 20 20 ble nRowOut;
7c3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 /* E
7c3b0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 stimated number
7c3c0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a of output rows *
7c3d0 2f 0d 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 /.. WhereLevel
7c3e0 61 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 a[1];
7c3f0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 /* Informati
7c400 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e 65 on about each ne
7c410 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45 52 45 st loop in WHERE
7c420 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23 64 65 66 69 */..};....#defi
7c430 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 ne WHERE_DISTINC
7c440 54 5f 55 4e 49 51 55 45 20 31 0d 0a 23 64 65 66 T_UNIQUE 1..#def
7c450 69 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e ine WHERE_DISTIN
7c460 43 54 5f 4f 52 44 45 52 45 44 20 32 0d 0a 0d 0a CT_ORDERED 2....
7c470 2f 2a 0d 0a 2a 2a 20 41 20 4e 61 6d 65 43 6f 6e /*..** A NameCon
7c480 74 65 78 74 20 64 65 66 69 6e 65 73 20 61 20 63 text defines a c
7c490 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 ontext in which
7c4a0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 to resolve table
7c4b0 20 61 6e 64 20 63 6f 6c 75 6d 6e 0d 0a 2a 2a 20 and column..**
7c4c0 6e 61 6d 65 73 2e 20 20 54 68 65 20 63 6f 6e 74 names. The cont
7c4d0 65 78 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 ext consists of
7c4e0 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 a list of tables
7c4f0 20 28 74 68 65 20 70 53 72 63 4c 69 73 74 29 20 (the pSrcList)
7c500 66 69 65 6c 64 20 61 6e 64 0d 0a 2a 2a 20 61 20 field and..** a
7c510 6c 69 73 74 20 6f 66 20 6e 61 6d 65 64 20 65 78 list of named ex
7c520 70 72 65 73 73 69 6f 6e 20 28 70 45 4c 69 73 74 pression (pEList
7c530 29 2e 20 20 54 68 65 20 6e 61 6d 65 64 20 65 78 ). The named ex
7c540 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6d 61 pression list ma
7c550 79 0d 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2e 20 20 y..** be NULL.
7c560 54 68 65 20 70 53 72 63 20 63 6f 72 72 65 73 70 The pSrc corresp
7c570 6f 6e 64 73 20 74 6f 20 74 68 65 20 46 52 4f 4d onds to the FROM
7c580 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c clause of a SEL
7c590 45 43 54 20 6f 72 0d 0a 2a 2a 20 74 6f 20 74 68 ECT or..** to th
7c5a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70 e table being op
7c5b0 65 72 61 74 65 64 20 6f 6e 20 62 79 20 49 4e 53 erated on by INS
7c5c0 45 52 54 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 ERT, UPDATE, or
7c5d0 44 45 4c 45 54 45 2e 20 20 54 68 65 0d 0a 2a 2a DELETE. The..**
7c5e0 20 70 45 4c 69 73 74 20 63 6f 72 72 65 73 70 6f pEList correspo
7c5f0 6e 64 73 20 74 6f 20 74 68 65 20 72 65 73 75 6c nds to the resul
7c600 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 t set of a SELEC
7c610 54 20 61 6e 64 20 69 73 20 4e 55 4c 4c 20 66 6f T and is NULL fo
7c620 72 0d 0a 2a 2a 20 6f 74 68 65 72 20 73 74 61 74 r..** other stat
7c630 65 6d 65 6e 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ements...**..**
7c640 4e 61 6d 65 43 6f 6e 74 65 78 74 73 20 63 61 6e NameContexts can
7c650 20 62 65 20 6e 65 73 74 65 64 2e 20 20 57 68 65 be nested. Whe
7c660 6e 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 n resolving name
7c670 73 2c 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 s, the inner-mos
7c680 74 20 0d 0a 2a 2a 20 63 6f 6e 74 65 78 74 20 69 t ..** context i
7c690 73 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 s searched first
7c6a0 2e 20 20 49 66 20 6e 6f 20 6d 61 74 63 68 20 69 . If no match i
7c6b0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 6e 65 78 s found, the nex
7c6c0 74 20 6f 75 74 65 72 0d 0a 2a 2a 20 63 6f 6e 74 t outer..** cont
7c6d0 65 78 74 20 69 73 20 63 68 65 63 6b 65 64 2e 20 ext is checked.
7c6e0 20 49 66 20 74 68 65 72 65 20 69 73 20 73 74 69 If there is sti
7c6f0 6c 6c 20 6e 6f 20 6d 61 74 63 68 2c 20 74 68 65 ll no match, the
7c700 20 6e 65 78 74 20 63 6f 6e 74 65 78 74 0d 0a 2a next context..*
7c710 2a 20 69 73 20 63 68 65 63 6b 65 64 2e 20 20 54 * is checked. T
7c720 68 69 73 20 70 72 6f 63 65 73 73 20 63 6f 6e 74 his process cont
7c730 69 6e 75 65 73 20 75 6e 74 69 6c 20 65 69 74 68 inues until eith
7c740 65 72 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f er a match is fo
7c750 75 6e 64 0d 0a 2a 2a 20 6f 72 20 61 6c 6c 20 63 und..** or all c
7c760 6f 6e 74 65 78 74 73 20 61 72 65 20 63 68 65 63 ontexts are chec
7c770 6b 2e 20 20 57 68 65 6e 20 61 20 6d 61 74 63 68 k. When a match
7c780 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 6e is found, the n
7c790 52 65 66 20 6d 65 6d 62 65 72 20 6f 66 0d 0a 2a Ref member of..*
7c7a0 2a 20 74 68 65 20 63 6f 6e 74 65 78 74 20 63 6f * the context co
7c7b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 74 ntaining the mat
7c7c0 63 68 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 ch is incremente
7c7d0 64 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 45 61 63 68 d. ..**..** Each
7c7e0 20 73 75 62 71 75 65 72 79 20 67 65 74 73 20 61 subquery gets a
7c7f0 20 6e 65 77 20 4e 61 6d 65 43 6f 6e 74 65 78 74 new NameContext
7c800 2e 20 20 54 68 65 20 70 4e 65 78 74 20 66 69 65 . The pNext fie
7c810 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 ld points to the
7c820 0d 0a 2a 2a 20 4e 61 6d 65 43 6f 6e 74 65 78 74 ..** NameContext
7c830 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 71 in the parent q
7c840 75 65 72 79 2e 20 20 54 68 75 73 20 74 68 65 20 uery. Thus the
7c850 70 72 6f 63 65 73 73 20 6f 66 20 73 63 61 6e 6e process of scann
7c860 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 4e 61 6d 65 ing the..** Name
7c870 43 6f 6e 74 65 78 74 20 6c 69 73 74 20 63 6f 72 Context list cor
7c880 72 65 73 70 6f 6e 64 73 20 74 6f 20 73 65 61 72 responds to sear
7c890 63 68 69 6e 67 20 74 68 72 6f 75 67 68 20 73 75 ching through su
7c8a0 63 63 65 73 73 69 76 65 6c 79 20 6f 75 74 65 72 ccessively outer
7c8b0 0d 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 ..** subqueries
7c8c0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 6d 61 looking for a ma
7c8d0 74 63 68 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 tch...*/..struct
7c8e0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 7b 0d 0a NameContext {..
7c8f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b Parse *pParse;
7c900 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 /* The pa
7c910 72 73 65 72 20 2a 2f 0d 0a 20 20 53 72 63 4c 69 rser */.. SrcLi
7c920 73 74 20 2a 70 53 72 63 4c 69 73 74 3b 20 20 20 st *pSrcList;
7c930 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 /* One or more t
7c940 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 ables used to re
7c950 73 6f 6c 76 65 20 6e 61 6d 65 73 20 2a 2f 0d 0a solve names */..
7c960 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 ExprList *pELi
7c970 73 74 3b 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e st; /* Option
7c980 61 6c 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 64 al list of named
7c990 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0d expressions */.
7c9a0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 . int nRef;
7c9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
7c9c0 72 20 6f 66 20 6e 61 6d 65 73 20 72 65 73 6f 6c r of names resol
7c9d0 76 65 64 20 62 79 20 74 68 69 73 20 63 6f 6e 74 ved by this cont
7c9e0 65 78 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 45 ext */.. int nE
7c9f0 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f rr; /
7ca00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f * Number of erro
7ca10 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 rs encountered w
7ca20 68 69 6c 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e hile resolving n
7ca30 61 6d 65 73 20 2a 2f 0d 0a 20 20 75 38 20 61 6c ames */.. u8 al
7ca40 6c 6f 77 41 67 67 3b 20 20 20 20 20 20 20 20 20 lowAgg;
7ca50 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e /* Aggregate fun
7ca60 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 65 64 20 68 ctions allowed h
7ca70 65 72 65 20 2a 2f 0d 0a 20 20 75 38 20 68 61 73 ere */.. u8 has
7ca80 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f Agg; /
7ca90 2a 20 54 72 75 65 20 69 66 20 61 67 67 72 65 67 * True if aggreg
7caa0 61 74 65 73 20 61 72 65 20 73 65 65 6e 20 2a 2f ates are seen */
7cab0 0d 0a 20 20 75 38 20 69 73 43 68 65 63 6b 3b 20 .. u8 isCheck;
7cac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
7cad0 20 69 66 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 if resolving na
7cae0 6d 65 73 20 69 6e 20 61 20 43 48 45 43 4b 20 63 mes in a CHECK c
7caf0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0d 0a 20 20 onstraint */..
7cb00 69 6e 74 20 6e 44 65 70 74 68 3b 20 20 20 20 20 int nDepth;
7cb10 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 /* Depth of
7cb20 20 73 75 62 71 75 65 72 79 20 72 65 63 75 72 73 subquery recurs
7cb30 69 6f 6e 2e 20 31 20 66 6f 72 20 6e 6f 20 72 65 ion. 1 for no re
7cb40 63 75 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 41 67 cursion */.. Ag
7cb50 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 3b gInfo *pAggInfo;
7cb60 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f /* Informatio
7cb70 6e 20 61 62 6f 75 74 20 61 67 67 72 65 67 61 74 n about aggregat
7cb80 65 73 20 61 74 20 74 68 69 73 20 6c 65 76 65 6c es at this level
7cb90 20 2a 2f 0d 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 */.. NameConte
7cba0 78 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e xt *pNext; /* N
7cbb0 65 78 74 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 ext outer name c
7cbc0 6f 6e 74 65 78 74 2e 20 20 4e 55 4c 4c 20 66 6f ontext. NULL fo
7cbd0 72 20 6f 75 74 65 72 6d 6f 73 74 20 2a 2f 0d 0a r outermost */..
7cbe0 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 };..../*..** An
7cbf0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 instance of the
7cc00 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 following struct
7cc10 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c ure contains all
7cc20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a information..**
7cc30 20 6e 65 65 64 65 64 20 74 6f 20 67 65 6e 65 72 needed to gener
7cc40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 ate code for a s
7cc50 69 6e 67 6c 65 20 53 45 4c 45 43 54 20 73 74 61 ingle SELECT sta
7cc60 74 65 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 tement...**..**
7cc70 6e 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f nLimit is set to
7cc80 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 20 -1 if there is
7cc90 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e no LIMIT clause.
7cca0 20 20 6e 4f 66 66 73 65 74 20 69 73 20 73 65 74 nOffset is set
7ccb0 20 74 6f 20 30 2e 0d 0a 2a 2a 20 49 66 20 74 68 to 0...** If th
7ccc0 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 63 ere is a LIMIT c
7ccd0 6c 61 75 73 65 2c 20 74 68 65 20 70 61 72 73 65 lause, the parse
7cce0 72 20 73 65 74 73 20 6e 4c 69 6d 69 74 20 74 6f r sets nLimit to
7ccf0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
7cd00 65 0d 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 20 e..** limit and
7cd10 6e 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 76 nOffset to the v
7cd20 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 66 66 73 alue of the offs
7cd30 65 74 20 28 6f 72 20 30 20 69 66 20 74 68 65 72 et (or 0 if ther
7cd40 65 20 69 73 20 6e 6f 74 0d 0a 2a 2a 20 6f 66 66 e is not..** off
7cd50 73 65 74 29 2e 20 20 42 75 74 20 6c 61 74 65 72 set). But later
7cd60 20 6f 6e 2c 20 6e 4c 69 6d 69 74 20 61 6e 64 20 on, nLimit and
7cd70 6e 4f 66 66 73 65 74 20 62 65 63 6f 6d 65 20 74 nOffset become t
7cd80 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 he memory locati
7cd90 6f 6e 73 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 56 ons..** in the V
7cda0 44 42 45 20 74 68 61 74 20 72 65 63 6f 72 64 20 DBE that record
7cdb0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 the limit and of
7cdc0 66 73 65 74 20 63 6f 75 6e 74 65 72 73 2e 0d 0a fset counters...
7cdd0 2a 2a 0d 0a 2a 2a 20 61 64 64 72 4f 70 65 6e 45 **..** addrOpenE
7cde0 70 68 6d 5b 5d 20 65 6e 74 72 69 65 73 20 63 6f phm[] entries co
7cdf0 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 ntain the addres
7ce00 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 s of OP_OpenEphe
7ce10 6d 65 72 61 6c 20 6f 70 63 6f 64 65 73 2e 0d 0a meral opcodes...
7ce20 2a 2a 20 54 68 65 73 65 20 61 64 64 72 65 73 73 ** These address
7ce30 65 73 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 es must be store
7ce40 64 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e d so that we can
7ce50 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 66 69 6c go back and fil
7ce60 6c 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 50 34 5f l in..** the P4_
7ce70 4b 45 59 49 4e 46 4f 20 61 6e 64 20 50 32 20 70 KEYINFO and P2 p
7ce80 61 72 61 6d 65 74 65 72 73 20 6c 61 74 65 72 2e arameters later.
7ce90 20 20 4e 65 69 74 68 65 72 20 74 68 65 20 4b 65 Neither the Ke
7cea0 79 49 6e 66 6f 20 6e 6f 72 0d 0a 2a 2a 20 74 68 yInfo nor..** th
7ceb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 e number of colu
7cec0 6d 6e 73 20 69 6e 20 50 32 20 63 61 6e 20 62 65 mns in P2 can be
7ced0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 74 68 65 computed at the
7cee0 20 73 61 6d 65 20 74 69 6d 65 0d 0a 2a 2a 20 61 same time..** a
7cef0 73 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 s the OP_OpenEph
7cf00 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 m instruction is
7cf10 20 63 6f 64 65 64 20 62 65 63 61 75 73 65 20 6e coded because n
7cf20 6f 74 0d 0a 2a 2a 20 65 6e 6f 75 67 68 20 69 6e ot..** enough in
7cf30 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
7cf40 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 the compound que
7cf50 72 79 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 74 ry is known at t
7cf60 68 61 74 20 70 6f 69 6e 74 2e 0d 0a 2a 2a 20 54 hat point...** T
7cf70 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 61 he KeyInfo for a
7cf80 64 64 72 4f 70 65 6e 54 72 61 6e 5b 30 5d 20 61 ddrOpenTran[0] a
7cf90 6e 64 20 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 nd [1] contains
7cfa0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
7cfb0 63 65 73 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 ces..** for the
7cfc0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 65 result set. The
7cfd0 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 61 64 64 KeyInfo for add
7cfe0 72 4f 70 65 6e 54 72 61 6e 5b 32 5d 20 63 6f 6e rOpenTran[2] con
7cff0 74 61 69 6e 73 20 63 6f 6c 6c 61 74 69 6e 67 0d tains collating.
7d000 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 20 66 6f .** sequences fo
7d010 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 r the ORDER BY c
7d020 6c 61 75 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 lause...*/..stru
7d030 63 74 20 53 65 6c 65 63 74 20 7b 0d 0a 20 20 45 ct Select {.. E
7d040 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b xprList *pEList;
7d050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 65 /* The fie
7d060 6c 64 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c lds of the resul
7d070 74 20 2a 2f 0d 0a 20 20 75 38 20 6f 70 3b 20 20 t */.. u8 op;
7d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
7d090 2a 20 4f 6e 65 20 6f 66 3a 20 54 4b 5f 55 4e 49 * One of: TK_UNI
7d0a0 4f 4e 20 54 4b 5f 41 4c 4c 20 54 4b 5f 49 4e 54 ON TK_ALL TK_INT
7d0b0 45 52 53 45 43 54 20 54 4b 5f 45 58 43 45 50 54 ERSECT TK_EXCEPT
7d0c0 20 2a 2f 0d 0a 20 20 63 68 61 72 20 61 66 66 69 */.. char affi
7d0d0 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 2f 2a nity; /*
7d0e0 20 4d 61 6b 65 52 65 63 6f 72 64 20 77 69 74 68 MakeRecord with
7d0f0 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 66 this affinity f
7d100 6f 72 20 53 52 54 5f 53 65 74 20 2a 2f 0d 0a 20 or SRT_Set */..
7d110 20 75 31 36 20 73 65 6c 46 6c 61 67 73 3b 20 20 u16 selFlags;
7d120 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f /* Vario
7d130 75 73 20 53 46 5f 2a 20 76 61 6c 75 65 73 20 2a us SF_* values *
7d140 2f 0d 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 /.. SrcList *pS
7d150 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 rc; /* T
7d160 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a he FROM clause *
7d170 2f 0d 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 /.. Expr *pWher
7d180 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 e; /* T
7d190 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 he WHERE clause
7d1a0 2a 2f 0d 0a 20 20 45 78 70 72 4c 69 73 74 20 2a */.. ExprList *
7d1b0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 pGroupBy; /*
7d1c0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 The GROUP BY cla
7d1d0 75 73 65 20 2a 2f 0d 0a 20 20 45 78 70 72 20 2a use */.. Expr *
7d1e0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 pHaving;
7d1f0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 /* The HAVING c
7d200 6c 61 75 73 65 20 2a 2f 0d 0a 20 20 45 78 70 72 lause */.. Expr
7d210 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 List *pOrderBy;
7d220 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 /* The ORDER
7d230 42 59 20 63 6c 61 75 73 65 20 2a 2f 0d 0a 20 20 BY clause */..
7d240 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 Select *pPrior;
7d250 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6f 72 20 /* Prior
7d260 73 65 6c 65 63 74 20 69 6e 20 61 20 63 6f 6d 70 select in a comp
7d270 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 ound select stat
7d280 65 6d 65 6e 74 20 2a 2f 0d 0a 20 20 53 65 6c 65 ement */.. Sele
7d290 63 74 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 ct *pNext;
7d2a0 20 20 20 2f 2a 20 4e 65 78 74 20 73 65 6c 65 63 /* Next selec
7d2b0 74 20 74 6f 20 74 68 65 20 6c 65 66 74 20 69 6e t to the left in
7d2c0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0d 0a a compound */..
7d2d0 20 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 Select *pRight
7d2e0 6d 6f 73 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 most; /* Righ
7d2f0 74 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e t-most select in
7d300 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 a compound sele
7d310 63 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0d ct statement */.
7d320 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b . Expr *pLimit;
7d330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d /* LIM
7d340 49 54 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4e IT expression. N
7d350 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 ULL means not us
7d360 65 64 2e 20 2a 2f 0d 0a 20 20 45 78 70 72 20 2a ed. */.. Expr *
7d370 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 pOffset;
7d380 20 2f 2a 20 4f 46 46 53 45 54 20 65 78 70 72 65 /* OFFSET expre
7d390 73 73 69 6f 6e 2e 20 4e 55 4c 4c 20 6d 65 61 6e ssion. NULL mean
7d3a0 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0d 0a s not used. */..
7d3b0 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 20 69 4f int iLimit, iO
7d3c0 66 66 73 65 74 3b 20 20 20 2f 2a 20 4d 65 6d 6f ffset; /* Memo
7d3d0 72 79 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c ry registers hol
7d3e0 64 69 6e 67 20 4c 49 4d 49 54 20 26 20 4f 46 46 ding LIMIT & OFF
7d3f0 53 45 54 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0d SET counters */.
7d400 0a 20 20 69 6e 74 20 61 64 64 72 4f 70 65 6e 45 . int addrOpenE
7d410 70 68 6d 5b 33 5d 3b 20 20 20 2f 2a 20 4f 50 5f phm[3]; /* OP_
7d420 4f 70 65 6e 45 70 68 65 6d 20 6f 70 63 6f 64 65 OpenEphem opcode
7d430 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 69 s related to thi
7d440 73 20 73 65 6c 65 63 74 20 2a 2f 0d 0a 20 20 64 s select */.. d
7d450 6f 75 62 6c 65 20 6e 53 65 6c 65 63 74 52 6f 77 ouble nSelectRow
7d460 3b 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 ; /* Estimat
7d470 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 ed number of res
7d480 75 6c 74 20 72 6f 77 73 20 2a 2f 0d 0a 7d 3b 0d ult rows */..};.
7d490 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 77 65 .../*..** Allowe
7d4a0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 65 6c d values for Sel
7d4b0 65 63 74 2e 73 65 6c 46 6c 61 67 73 2e 20 20 54 ect.selFlags. T
7d4c0 68 65 20 22 53 46 22 20 70 72 65 66 69 78 20 73 he "SF" prefix s
7d4d0 74 61 6e 64 73 20 66 6f 72 0d 0a 2a 2a 20 22 53 tands for..** "S
7d4e0 65 6c 65 63 74 20 46 6c 61 67 22 2e 0d 0a 2a 2f elect Flag"...*/
7d4f0 0d 0a 23 64 65 66 69 6e 65 20 53 46 5f 44 69 73 ..#define SF_Dis
7d500 74 69 6e 63 74 20 20 20 20 20 20 20 20 30 78 30 tinct 0x0
7d510 31 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 68 6f 1 /* Output sho
7d520 75 6c 64 20 62 65 20 44 49 53 54 49 4e 43 54 20 uld be DISTINCT
7d530 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 46 5f 52 */..#define SF_R
7d540 65 73 6f 6c 76 65 64 20 20 20 20 20 20 20 20 30 esolved 0
7d550 78 30 32 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 x02 /* Identifi
7d560 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 ers have been re
7d570 73 6f 6c 76 65 64 20 2a 2f 0d 0a 23 64 65 66 69 solved */..#defi
7d580 6e 65 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 ne SF_Aggregate
7d590 20 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 43 0x04 /* C
7d5a0 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 ontains aggregat
7d5b0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a e functions */..
7d5c0 23 64 65 66 69 6e 65 20 53 46 5f 55 73 65 73 45 #define SF_UsesE
7d5d0 70 68 65 6d 65 72 61 6c 20 20 20 30 78 30 38 20 phemeral 0x08
7d5e0 20 2f 2a 20 55 73 65 73 20 74 68 65 20 4f 70 65 /* Uses the Ope
7d5f0 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 nEphemeral opcod
7d600 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 46 e */..#define SF
7d610 5f 45 78 70 61 6e 64 65 64 20 20 20 20 20 20 20 _Expanded
7d620 20 30 78 31 30 20 20 2f 2a 20 73 71 6c 69 74 65 0x10 /* sqlite
7d630 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 3SelectExpand()
7d640 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 2a called on this *
7d650 2f 0d 0a 23 64 65 66 69 6e 65 20 53 46 5f 48 61 /..#define SF_Ha
7d660 73 54 79 70 65 49 6e 66 6f 20 20 20 20 20 30 78 sTypeInfo 0x
7d670 32 30 20 20 2f 2a 20 46 52 4f 4d 20 73 75 62 71 20 /* FROM subq
7d680 75 65 72 69 65 73 20 68 61 76 65 20 54 61 62 6c ueries have Tabl
7d690 65 20 6d 65 74 61 64 61 74 61 20 2a 2f 0d 0a 23 e metadata */..#
7d6a0 64 65 66 69 6e 65 20 53 46 5f 55 73 65 53 6f 72 define SF_UseSor
7d6b0 74 65 72 20 20 20 20 20 20 20 30 78 34 30 20 20 ter 0x40
7d6c0 2f 2a 20 53 6f 72 74 20 75 73 69 6e 67 20 61 20 /* Sort using a
7d6d0 73 6f 72 74 65 72 20 2a 2f 0d 0a 0d 0a 0d 0a 2f sorter */....../
7d6e0 2a 0d 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 *..** The result
7d6f0 73 20 6f 66 20 61 20 73 65 6c 65 63 74 20 63 61 s of a select ca
7d700 6e 20 62 65 20 64 69 73 74 72 69 62 75 74 65 64 n be distributed
7d710 20 69 6e 20 73 65 76 65 72 61 6c 20 77 61 79 73 in several ways
7d720 2e 20 20 54 68 65 0d 0a 2a 2a 20 22 53 52 54 22 . The..** "SRT"
7d730 20 70 72 65 66 69 78 20 6d 65 61 6e 73 20 22 53 prefix means "S
7d740 45 4c 45 43 54 20 52 65 73 75 6c 74 20 54 79 70 ELECT Result Typ
7d750 65 22 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 e"...*/..#define
7d760 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 SRT_Union
7d770 20 20 31 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 1 /* Store re
7d780 73 75 6c 74 20 61 73 20 6b 65 79 73 20 69 6e 20 sult as keys in
7d790 61 6e 20 69 6e 64 65 78 20 2a 2f 0d 0a 23 64 65 an index */..#de
7d7a0 66 69 6e 65 20 53 52 54 5f 45 78 63 65 70 74 20 fine SRT_Except
7d7b0 20 20 20 20 20 20 32 20 20 2f 2a 20 52 65 6d 6f 2 /* Remo
7d7c0 76 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 61 ve result from a
7d7d0 20 55 4e 49 4f 4e 20 69 6e 64 65 78 20 2a 2f 0d UNION index */.
7d7e0 0a 23 64 65 66 69 6e 65 20 53 52 54 5f 45 78 69 .#define SRT_Exi
7d7f0 73 74 73 20 20 20 20 20 20 20 33 20 20 2f 2a 20 sts 3 /*
7d800 53 74 6f 72 65 20 31 20 69 66 20 74 68 65 20 72 Store 1 if the r
7d810 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 65 6d 70 esult is not emp
7d820 74 79 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 ty */..#define S
7d830 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 20 RT_Discard
7d840 34 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 4 /* Do not sav
7d850 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 6e e the results an
7d860 79 77 68 65 72 65 20 2a 2f 0d 0a 0d 0a 2f 2a 20 ywhere */..../*
7d870 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 The ORDER BY cla
7d880 75 73 65 20 69 73 20 69 67 6e 6f 72 65 64 20 66 use is ignored f
7d890 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 or all of the ab
7d8a0 6f 76 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ove */..#define
7d8b0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 IgnorableOrderby
7d8c0 28 58 29 20 28 28 58 2d 3e 65 44 65 73 74 29 3c (X) ((X->eDest)<
7d8d0 3d 53 52 54 5f 44 69 73 63 61 72 64 29 0d 0a 0d =SRT_Discard)...
7d8e0 0a 23 64 65 66 69 6e 65 20 53 52 54 5f 4f 75 74 .#define SRT_Out
7d8f0 70 75 74 20 20 20 20 20 20 20 35 20 20 2f 2a 20 put 5 /*
7d900 4f 75 74 70 75 74 20 65 61 63 68 20 72 6f 77 20 Output each row
7d910 6f 66 20 72 65 73 75 6c 74 20 2a 2f 0d 0a 23 64 of result */..#d
7d920 65 66 69 6e 65 20 53 52 54 5f 4d 65 6d 20 20 20 efine SRT_Mem
7d930 20 20 20 20 20 20 20 36 20 20 2f 2a 20 53 74 6f 6 /* Sto
7d940 72 65 20 72 65 73 75 6c 74 20 69 6e 20 61 20 6d re result in a m
7d950 65 6d 6f 72 79 20 63 65 6c 6c 20 2a 2f 0d 0a 23 emory cell */..#
7d960 64 65 66 69 6e 65 20 53 52 54 5f 53 65 74 20 20 define SRT_Set
7d970 20 20 20 20 20 20 20 20 37 20 20 2f 2a 20 53 74 7 /* St
7d980 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b ore results as k
7d990 65 79 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 20 eys in an index
7d9a0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 52 54 5f */..#define SRT_
7d9b0 54 61 62 6c 65 20 20 20 20 20 20 20 20 38 20 20 Table 8
7d9c0 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 20 /* Store result
7d9d0 61 73 20 64 61 74 61 20 77 69 74 68 20 61 6e 20 as data with an
7d9e0 61 75 74 6f 6d 61 74 69 63 20 72 6f 77 69 64 20 automatic rowid
7d9f0 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 52 54 5f */..#define SRT_
7da00 45 70 68 65 6d 54 61 62 20 20 20 20 20 39 20 20 EphemTab 9
7da10 2f 2a 20 43 72 65 61 74 65 20 74 72 61 6e 73 69 /* Create transi
7da20 65 6e 74 20 74 61 62 20 61 6e 64 20 73 74 6f 72 ent tab and stor
7da30 65 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 e like SRT_Table
7da40 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 52 54 */..#define SRT
7da50 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 31 30 20 _Coroutine 10
7da60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 /* Generate a s
7da70 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 72 65 73 ingle row of res
7da80 75 6c 74 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ult */..../*..**
7da90 20 41 20 73 74 72 75 63 74 75 72 65 20 75 73 65 A structure use
7daa0 64 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 d to customize t
7dab0 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 73 he behavior of s
7dac0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 20 qlite3Select().
7dad0 53 65 65 0d 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 See..** comments
7dae0 20 61 62 6f 76 65 20 73 71 6c 69 74 65 33 53 65 above sqlite3Se
7daf0 6c 65 63 74 28 29 20 66 6f 72 20 64 65 74 61 69 lect() for detai
7db00 6c 73 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 ls...*/..typedef
7db10 20 73 74 72 75 63 74 20 53 65 6c 65 63 74 44 65 struct SelectDe
7db20 73 74 20 53 65 6c 65 63 74 44 65 73 74 3b 0d 0a st SelectDest;..
7db30 73 74 72 75 63 74 20 53 65 6c 65 63 74 44 65 73 struct SelectDes
7db40 74 20 7b 0d 0a 20 20 75 38 20 65 44 65 73 74 3b t {.. u8 eDest;
7db50 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 /* How
7db60 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 to dispose of th
7db70 65 20 72 65 73 75 6c 74 73 20 2a 2f 0d 0a 20 20 e results */..
7db80 75 38 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 u8 affinity;
7db90 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 75 73 /* Affinity us
7dba0 65 64 20 77 68 65 6e 20 65 44 65 73 74 3d 3d 53 ed when eDest==S
7dbb0 52 54 5f 53 65 74 20 2a 2f 0d 0a 20 20 69 6e 74 RT_Set */.. int
7dbc0 20 69 50 61 72 6d 3b 20 20 20 20 20 20 20 20 2f iParm; /
7dbd0 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 * A parameter us
7dbe0 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20 ed by the eDest
7dbf0 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 disposal method
7dc00 2a 2f 0d 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 20 */.. int iMem;
7dc10 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 /* Base
7dc20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 register where r
7dc30 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 esults are writt
7dc40 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4d 65 en */.. int nMe
7dc50 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 m; /* Nu
7dc60 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 mber of register
7dc70 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0d 0a s allocated */..
7dc80 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 75 72 };..../*..** Dur
7dc90 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 ing code generat
7dca0 69 6f 6e 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 ion of statement
7dcb0 73 20 74 68 61 74 20 64 6f 20 69 6e 73 65 72 74 s that do insert
7dcc0 73 20 69 6e 74 6f 20 41 55 54 4f 49 4e 43 52 45 s into AUTOINCRE
7dcd0 4d 45 4e 54 20 0d 0a 2a 2a 20 74 61 62 6c 65 73 MENT ..** tables
7dce0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 , the following
7dcf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 information is a
7dd00 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 54 ttached to the T
7dd10 61 62 6c 65 2e 75 2e 61 75 74 6f 49 6e 63 2e 70 able.u.autoInc.p
7dd20 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 ..** pointer of
7dd30 65 61 63 68 20 61 75 74 6f 69 6e 63 72 65 6d 65 each autoincreme
7dd40 6e 74 20 74 61 62 6c 65 20 74 6f 20 72 65 63 6f nt table to reco
7dd50 72 64 20 73 6f 6d 65 20 73 69 64 65 20 69 6e 66 rd some side inf
7dd60 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0d 0a 2a ormation that..*
7dd70 2a 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 * the code gener
7dd80 61 74 6f 72 20 6e 65 65 64 73 2e 20 20 57 65 20 ator needs. We
7dd90 68 61 76 65 20 74 6f 20 6b 65 65 70 20 70 65 72 have to keep per
7dda0 2d 74 61 62 6c 65 20 61 75 74 6f 69 6e 63 72 65 -table autoincre
7ddb0 6d 65 6e 74 0d 0a 2a 2a 20 69 6e 66 6f 72 6d 61 ment..** informa
7ddc0 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 69 6e 73 tion in case ins
7ddd0 65 72 74 73 20 61 72 65 20 64 6f 77 6e 20 77 69 erts are down wi
7dde0 74 68 69 6e 20 74 72 69 67 67 65 72 73 2e 20 20 thin triggers.
7ddf0 54 72 69 67 67 65 72 73 20 64 6f 20 6e 6f 74 0d Triggers do not.
7de00 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6f .** normally coo
7de10 72 64 69 6e 61 74 65 20 74 68 65 69 72 20 61 63 rdinate their ac
7de20 74 69 76 69 74 69 65 73 2c 20 62 75 74 20 77 65 tivities, but we
7de30 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6f 72 do need to coor
7de40 64 69 6e 61 74 65 20 74 68 65 0d 0a 2a 2a 20 6c dinate the..** l
7de50 6f 61 64 69 6e 67 20 61 6e 64 20 73 61 76 69 6e oading and savin
7de60 67 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 g of autoincreme
7de70 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d nt information..
7de80 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 41 75 74 6f .*/..struct Auto
7de90 69 6e 63 49 6e 66 6f 20 7b 0d 0a 20 20 41 75 74 incInfo {.. Aut
7dea0 6f 69 6e 63 49 6e 66 6f 20 2a 70 4e 65 78 74 3b oincInfo *pNext;
7deb0 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 66 6f 20 /* Next info
7dec0 62 6c 6f 63 6b 20 69 6e 20 61 20 6c 69 73 74 20 block in a list
7ded0 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0d 0a of them all */..
7dee0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 Table *pTab;
7def0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 /* Table
7df00 20 74 68 69 73 20 69 6e 66 6f 20 62 6c 6f 63 6b this info block
7df10 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0d 0a 20 refers to */..
7df20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 int iDb;
7df30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 /* Index
7df40 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d in sqlite3.aDb[]
7df50 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c of database hol
7df60 64 69 6e 67 20 70 54 61 62 20 2a 2f 0d 0a 20 20 ding pTab */..
7df70 69 6e 74 20 72 65 67 43 74 72 3b 20 20 20 20 20 int regCtr;
7df80 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 /* Memory
7df90 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 register holding
7dfa0 20 74 68 65 20 72 6f 77 69 64 20 63 6f 75 6e 74 the rowid count
7dfb0 65 72 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d er */..};..../*.
7dfc0 0a 2a 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 .** Size of the
7dfd0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0d 0a 2a 2f column cache..*/
7dfe0 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
7dff0 5f 4e 5f 43 4f 4c 43 41 43 48 45 0d 0a 23 20 64 _N_COLCACHE..# d
7e000 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 5f 43 efine SQLITE_N_C
7e010 4f 4c 43 41 43 48 45 20 31 30 0d 0a 23 65 6e 64 OLCACHE 10..#end
7e020 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 74 20 if..../*..** At
7e030 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e least one instan
7e040 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ce of the follow
7e050 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 ing structure is
7e060 20 63 72 65 61 74 65 64 20 66 6f 72 20 65 61 63 created for eac
7e070 68 20 0d 0a 2a 2a 20 74 72 69 67 67 65 72 20 74 h ..** trigger t
7e080 68 61 74 20 6d 61 79 20 62 65 20 66 69 72 65 64 hat may be fired
7e090 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 while parsing a
7e0a0 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 n INSERT, UPDATE
7e0b0 20 6f 72 20 44 45 4c 45 54 45 0d 0a 2a 2a 20 73 or DELETE..** s
7e0c0 74 61 74 65 6d 65 6e 74 2e 20 41 6c 6c 20 73 75 tatement. All su
7e0d0 63 68 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73 ch objects are s
7e0e0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 69 6e tored in the lin
7e0f0 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 ked list headed
7e100 61 74 0d 0a 2a 2a 20 50 61 72 73 65 2e 70 54 72 at..** Parse.pTr
7e110 69 67 67 65 72 50 72 67 20 61 6e 64 20 64 65 6c iggerPrg and del
7e120 65 74 65 64 20 6f 6e 63 65 20 73 74 61 74 65 6d eted once statem
7e130 65 6e 74 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 ent compilation
7e140 68 61 73 20 62 65 65 6e 0d 0a 2a 2a 20 63 6f 6d has been..** com
7e150 70 6c 65 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 pleted...**..**
7e160 41 20 56 64 62 65 20 73 75 62 2d 70 72 6f 67 72 A Vdbe sub-progr
7e170 61 6d 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e am that implemen
7e180 74 73 20 74 68 65 20 62 6f 64 79 20 61 6e 64 20 ts the body and
7e190 57 48 45 4e 20 63 6c 61 75 73 65 20 6f 66 20 74 WHEN clause of t
7e1a0 72 69 67 67 65 72 0d 0a 2a 2a 20 54 72 69 67 67 rigger..** Trigg
7e1b0 65 72 50 72 67 2e 70 54 72 69 67 67 65 72 2c 20 erPrg.pTrigger,
7e1c0 61 73 73 75 6d 69 6e 67 20 61 20 64 65 66 61 75 assuming a defau
7e1d0 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 lt ON CONFLICT c
7e1e0 6c 61 75 73 65 20 6f 66 0d 0a 2a 2a 20 54 72 69 lause of..** Tri
7e1f0 67 67 65 72 50 72 67 2e 6f 72 63 6f 6e 66 2c 20 ggerPrg.orconf,
7e200 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 is stored in the
7e210 20 54 72 69 67 67 65 72 50 72 67 2e 70 50 72 6f TriggerPrg.pPro
7e220 67 72 61 6d 20 76 61 72 69 61 62 6c 65 2e 0d 0a gram variable...
7e230 2a 2a 20 54 68 65 20 50 61 72 73 65 2e 70 54 72 ** The Parse.pTr
7e240 69 67 67 65 72 50 72 67 20 6c 69 73 74 20 6e 65 iggerPrg list ne
7e250 76 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f ver contains two
7e260 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 74 68 entries with th
7e270 65 20 73 61 6d 65 0d 0a 2a 2a 20 76 61 6c 75 65 e same..** value
7e280 73 20 66 6f 72 20 62 6f 74 68 20 70 54 72 69 67 s for both pTrig
7e290 67 65 72 20 61 6e 64 20 6f 72 63 6f 6e 66 2e 0d ger and orconf..
7e2a0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 54 72 69 67 .**..** The Trig
7e2b0 67 65 72 50 72 67 2e 61 43 6f 6c 6d 61 73 6b 5b gerPrg.aColmask[
7e2c0 30 5d 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 0] variable is s
7e2d0 65 74 20 74 6f 20 61 20 6d 61 73 6b 20 6f 66 20 et to a mask of
7e2e0 6f 6c 64 2e 2a 20 63 6f 6c 75 6d 6e 73 0d 0a 2a old.* columns..*
7e2f0 2a 20 61 63 63 65 73 73 65 64 20 28 6f 72 20 73 * accessed (or s
7e300 65 74 20 74 6f 20 30 20 66 6f 72 20 74 72 69 67 et to 0 for trig
7e310 67 65 72 73 20 66 69 72 65 64 20 61 73 20 61 20 gers fired as a
7e320 72 65 73 75 6c 74 20 6f 66 20 49 4e 53 45 52 54 result of INSERT
7e330 20 0d 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 ..** statements
7e340 29 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 ). Similarly, th
7e350 65 20 54 72 69 67 67 65 72 50 72 67 2e 61 43 6f e TriggerPrg.aCo
7e360 6c 6d 61 73 6b 5b 31 5d 20 76 61 72 69 61 62 6c lmask[1] variabl
7e370 65 20 69 73 20 73 65 74 20 74 6f 0d 0a 2a 2a 20 e is set to..**
7e380 61 20 6d 61 73 6b 20 6f 66 20 6e 65 77 2e 2a 20 a mask of new.*
7e390 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 62 79 20 columns used by
7e3a0 74 68 65 20 70 72 6f 67 72 61 6d 2e 0d 0a 2a 2f the program...*/
7e3b0 0d 0a 73 74 72 75 63 74 20 54 72 69 67 67 65 72 ..struct Trigger
7e3c0 50 72 67 20 7b 0d 0a 20 20 54 72 69 67 67 65 72 Prg {.. Trigger
7e3d0 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20 20 *pTrigger;
7e3e0 20 2f 2a 20 54 72 69 67 67 65 72 20 74 68 69 73 /* Trigger this
7e3f0 20 70 72 6f 67 72 61 6d 20 77 61 73 20 63 6f 64 program was cod
7e400 65 64 20 66 72 6f 6d 20 2a 2f 0d 0a 20 20 69 6e ed from */.. in
7e410 74 20 6f 72 63 6f 6e 66 3b 20 20 20 20 20 20 20 t orconf;
7e420 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 /* Default
7e430 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c ON CONFLICT pol
7e440 69 63 79 20 2a 2f 0d 0a 20 20 53 75 62 50 72 6f icy */.. SubPro
7e450 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 gram *pProgram;
7e460 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 69 6d 70 /* Program imp
7e470 6c 65 6d 65 6e 74 69 6e 67 20 70 54 72 69 67 67 lementing pTrigg
7e480 65 72 2f 6f 72 63 6f 6e 66 20 2a 2f 0d 0a 20 20 er/orconf */..
7e490 75 33 32 20 61 43 6f 6c 6d 61 73 6b 5b 32 5d 3b u32 aColmask[2];
7e4a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 73 /* Masks
7e4b0 20 6f 66 20 6f 6c 64 2e 2a 2c 20 6e 65 77 2e 2a of old.*, new.*
7e4c0 20 63 6f 6c 75 6d 6e 73 20 61 63 63 65 73 73 65 columns accesse
7e4d0 64 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 72 50 d */.. TriggerP
7e4e0 72 67 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 rg *pNext;
7e4f0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 6e /* Next entry in
7e500 20 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 Parse.pTriggerP
7e510 72 67 20 6c 69 73 74 20 2a 2f 0d 0a 7d 3b 0d 0a rg list */..};..
7e520 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 79 44 62 ../*..** The yDb
7e530 4d 61 73 6b 20 64 61 74 61 74 79 70 65 20 66 6f Mask datatype fo
7e540 72 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 r the bitmask of
7e550 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 all attached da
7e560 74 61 62 61 73 65 73 2e 0d 0a 2a 2f 0d 0a 23 69 tabases...*/..#i
7e570 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 f SQLITE_MAX_ATT
7e580 41 43 48 45 44 3e 33 30 0d 0a 20 20 74 79 70 65 ACHED>30.. type
7e590 64 65 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 def sqlite3_uint
7e5a0 36 34 20 79 44 62 4d 61 73 6b 3b 0d 0a 23 65 6c 64 yDbMask;..#el
7e5b0 73 65 0d 0a 20 20 74 79 70 65 64 65 66 20 75 6e se.. typedef un
7e5c0 73 69 67 6e 65 64 20 69 6e 74 20 79 44 62 4d 61 signed int yDbMa
7e5d0 73 6b 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f sk;..#endif..../
7e5e0 2a 0d 0a 2a 2a 20 41 6e 20 53 51 4c 20 70 61 72 *..** An SQL par
7e5f0 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 41 20 ser context. A
7e600 63 6f 70 79 20 6f 66 20 74 68 69 73 20 73 74 72 copy of this str
7e610 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65 64 ucture is passed
7e620 20 74 68 72 6f 75 67 68 0d 0a 2a 2a 20 74 68 65 through..** the
7e630 20 70 61 72 73 65 72 20 61 6e 64 20 64 6f 77 6e parser and down
7e640 20 69 6e 74 6f 20 61 6c 6c 20 74 68 65 20 70 61 into all the pa
7e650 72 73 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 rser action rout
7e660 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0d ine in order to.
7e670 0a 2a 2a 20 63 61 72 72 79 20 61 72 6f 75 6e 64 .** carry around
7e680 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 information tha
7e690 74 20 69 73 20 67 6c 6f 62 61 6c 20 74 6f 20 74 t is global to t
7e6a0 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65 2e he entire parse.
7e6b0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 74 72 ..**..** The str
7e6c0 75 63 74 75 72 65 20 69 73 20 64 69 76 69 64 65 ucture is divide
7e6d0 64 20 69 6e 74 6f 20 74 77 6f 20 70 61 72 74 73 d into two parts
7e6e0 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 . When the pars
7e6f0 65 72 20 61 6e 64 20 63 6f 64 65 0d 0a 2a 2a 20 er and code..**
7e700 67 65 6e 65 72 61 74 65 20 63 61 6c 6c 20 74 68 generate call th
7e710 65 6d 73 65 6c 76 65 73 20 72 65 63 75 72 73 69 emselves recursi
7e720 76 65 6c 79 2c 20 74 68 65 20 66 69 72 73 74 20 vely, the first
7e730 70 61 72 74 20 6f 66 20 74 68 65 20 73 74 72 75 part of the stru
7e740 63 74 75 72 65 0d 0a 2a 2a 20 69 73 20 63 6f 6e cture..** is con
7e750 73 74 61 6e 74 20 62 75 74 20 74 68 65 20 73 65 stant but the se
7e760 63 6f 6e 64 20 70 61 72 74 20 69 73 20 72 65 73 cond part is res
7e770 65 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e et at the beginn
7e780 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 0d 0a ing and end of..
7e790 2a 2a 20 65 61 63 68 20 72 65 63 75 72 73 69 6f ** each recursio
7e7a0 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6e n...**..** The n
7e7b0 54 61 62 6c 65 4c 6f 63 6b 20 61 6e 64 20 61 54 TableLock and aT
7e7c0 61 62 6c 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c ableLock variabl
7e7d0 65 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 es are only used
7e7e0 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 if the shared-c
7e7f0 61 63 68 65 20 0d 0a 2a 2a 20 66 65 61 74 75 72 ache ..** featur
7e800 65 20 69 73 20 65 6e 61 62 6c 65 64 20 28 69 66 e is enabled (if
7e810 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 75 sqlite3Tsd()->u
7e820 73 65 53 68 61 72 65 64 44 61 74 61 20 69 73 20 seSharedData is
7e830 74 72 75 65 29 2e 20 54 68 65 79 20 61 72 65 0d true). They are.
7e840 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 .** used to stor
7e850 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 e the set of tab
7e860 6c 65 2d 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 le-locks require
7e870 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 d by the stateme
7e880 6e 74 20 62 65 69 6e 67 0d 0a 2a 2a 20 63 6f 6d nt being..** com
7e890 70 69 6c 65 64 2e 20 46 75 6e 63 74 69 6f 6e 20 piled. Function
7e8a0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b sqlite3TableLock
7e8b0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 () is used to ad
7e8c0 64 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 d entries to the
7e8d0 0d 0a 2a 2a 20 6c 69 73 74 2e 0d 0a 2a 2f 0d 0a ..** list...*/..
7e8e0 73 74 72 75 63 74 20 50 61 72 73 65 20 7b 0d 0a struct Parse {..
7e8f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 sqlite3 *db;
7e900 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 /* The ma
7e910 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 in database stru
7e920 63 74 75 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 cture */.. int
7e930 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
7e940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
7e950 66 72 6f 6d 20 65 78 65 63 75 74 69 6f 6e 20 2a from execution *
7e960 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d /.. char *zErrM
7e970 73 67 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 sg; /* An
7e980 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f error message */
7e990 0d 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b .. Vdbe *pVdbe;
7e9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 /* An e
7e9b0 6e 67 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 ngine for execut
7e9c0 69 6e 67 20 64 61 74 61 62 61 73 65 20 62 79 74 ing database byt
7e9d0 65 63 6f 64 65 20 2a 2f 0d 0a 20 20 75 38 20 63 ecode */.. u8 c
7e9e0 6f 6c 4e 61 6d 65 73 53 65 74 3b 20 20 20 20 20 olNamesSet;
7e9f0 20 2f 2a 20 54 52 55 45 20 61 66 74 65 72 20 4f /* TRUE after O
7ea00 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 20 68 61 73 P_ColumnName has
7ea10 20 62 65 65 6e 20 69 73 73 75 65 64 20 74 6f 20 been issued to
7ea20 70 56 64 62 65 20 2a 2f 0d 0a 20 20 75 38 20 63 pVdbe */.. u8 c
7ea30 68 65 63 6b 53 63 68 65 6d 61 3b 20 20 20 20 20 heckSchema;
7ea40 20 2f 2a 20 43 61 75 73 65 73 20 73 63 68 65 6d /* Causes schem
7ea50 61 20 63 6f 6f 6b 69 65 20 63 68 65 63 6b 20 61 a cookie check a
7ea60 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 2a 2f fter an error */
7ea70 0d 0a 20 20 75 38 20 6e 65 73 74 65 64 3b 20 20 .. u8 nested;
7ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
7ea90 65 72 20 6f 66 20 6e 65 73 74 65 64 20 63 61 6c er of nested cal
7eaa0 6c 73 20 74 6f 20 74 68 65 20 70 61 72 73 65 72 ls to the parser
7eab0 2f 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 /code generator
7eac0 2a 2f 0d 0a 20 20 75 38 20 6e 54 65 6d 70 52 65 */.. u8 nTempRe
7ead0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 g; /* Nu
7eae0 6d 62 65 72 20 6f 66 20 74 65 6d 70 6f 72 61 72 mber of temporar
7eaf0 79 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 61 y registers in a
7eb00 54 65 6d 70 52 65 67 5b 5d 20 2a 2f 0d 0a 20 20 TempReg[] */..
7eb10 75 38 20 6e 54 65 6d 70 49 6e 55 73 65 3b 20 20 u8 nTempInUse;
7eb20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
7eb30 66 20 61 54 65 6d 70 52 65 67 5b 5d 20 63 75 72 f aTempReg[] cur
7eb40 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f rently checked o
7eb50 75 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 54 65 ut */.. int aTe
7eb60 6d 70 52 65 67 5b 38 5d 3b 20 20 20 20 20 2f 2a mpReg[8]; /*
7eb70 20 48 6f 6c 64 69 6e 67 20 61 72 65 61 20 66 6f Holding area fo
7eb80 72 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 r temporary regi
7eb90 73 74 65 72 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 sters */.. int
7eba0 6e 52 61 6e 67 65 52 65 67 3b 20 20 20 20 20 20 nRangeReg;
7ebb0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 /* Size of the
7ebc0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 temporary regist
7ebd0 65 72 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 er block */.. i
7ebe0 6e 74 20 69 52 61 6e 67 65 52 65 67 3b 20 20 20 nt iRangeReg;
7ebf0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 /* First reg
7ec00 69 73 74 65 72 20 69 6e 20 74 65 6d 70 6f 72 61 ister in tempora
7ec10 72 79 20 72 65 67 69 73 74 65 72 20 62 6c 6f 63 ry register bloc
7ec20 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 45 72 72 k */.. int nErr
7ec30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
7ec40 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 Number of errors
7ec50 20 73 65 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 seen */.. int
7ec60 6e 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 nTab;
7ec70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 /* Number of pr
7ec80 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 eviously allocat
7ec90 65 64 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 ed VDBE cursors
7eca0 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 */.. int nMem;
7ecb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
7ecc0 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 mber of memory c
7ecd0 65 6c 6c 73 20 75 73 65 64 20 73 6f 20 66 61 72 ells used so far
7ece0 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 53 65 74 3b */.. int nSet;
7ecf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
7ed00 75 6d 62 65 72 20 6f 66 20 73 65 74 73 20 75 73 umber of sets us
7ed10 65 64 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20 ed so far */..
7ed20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 int nOnce;
7ed30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
7ed40 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 f OP_Once instru
7ed50 63 74 69 6f 6e 73 20 73 6f 20 66 61 72 20 2a 2f ctions so far */
7ed60 0d 0a 20 20 69 6e 74 20 63 6b 42 61 73 65 3b 20 .. int ckBase;
7ed70 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 /* Base
7ed80 20 72 65 67 69 73 74 65 72 20 6f 66 20 64 61 74 register of dat
7ed90 61 20 64 75 72 69 6e 67 20 63 68 65 63 6b 20 63 a during check c
7eda0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0d 0a 20 onstraints */..
7edb0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c int iCacheLevel
7edc0 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 43 61 63 68 ; /* ColCach
7edd0 65 20 76 61 6c 69 64 20 77 68 65 6e 20 61 43 6f e valid when aCo
7ede0 6c 43 61 63 68 65 5b 5d 2e 69 4c 65 76 65 6c 3c lCache[].iLevel<
7edf0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 2a 2f 0d =iCacheLevel */.
7ee00 0a 20 20 69 6e 74 20 69 43 61 63 68 65 43 6e 74 . int iCacheCnt
7ee10 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 ; /* Count
7ee20 65 72 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 er used to gener
7ee30 61 74 65 20 61 43 6f 6c 43 61 63 68 65 5b 5d 2e ate aColCache[].
7ee40 6c 72 75 20 76 61 6c 75 65 73 20 2a 2f 0d 0a 20 lru values */..
7ee50 20 75 38 20 6e 43 6f 6c 43 61 63 68 65 3b 20 20 u8 nColCache;
7ee60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
7ee70 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 43 of entries in aC
7ee80 6f 6c 43 61 63 68 65 5b 5d 20 2a 2f 0d 0a 20 20 olCache[] */..
7ee90 75 38 20 69 43 6f 6c 43 61 63 68 65 3b 20 20 20 u8 iColCache;
7eea0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 /* Next ent
7eeb0 72 79 20 69 6e 20 61 43 6f 6c 43 61 63 68 65 5b ry in aColCache[
7eec0 5d 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0d ] to replace */.
7eed0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 . struct yColCa
7eee0 63 68 65 20 7b 0d 0a 20 20 20 20 69 6e 74 20 69 che {.. int i
7eef0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 Table;
7ef00 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 /* Table cursor
7ef10 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 20 20 number */..
7ef20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 int iColumn;
7ef30 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 /* Table c
7ef40 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0d olumn number */.
7ef50 0a 20 20 20 20 75 38 20 74 65 6d 70 52 65 67 3b . u8 tempReg;
7ef60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 52 /* iR
7ef70 65 67 20 69 73 20 61 20 74 65 6d 70 20 72 65 67 eg is a temp reg
7ef80 69 73 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 ister that needs
7ef90 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0d to be freed */.
7efa0 0a 20 20 20 20 69 6e 74 20 69 4c 65 76 65 6c 3b . int iLevel;
7efb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
7efc0 73 74 69 6e 67 20 6c 65 76 65 6c 20 2a 2f 0d 0a sting level */..
7efd0 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 int iReg;
7efe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 /* Reg
7eff0 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20 74 with value of t
7f000 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 30 20 6d 65 his column. 0 me
7f010 61 6e 73 20 6e 6f 6e 65 2e 20 2a 2f 0d 0a 20 20 ans none. */..
7f020 20 20 69 6e 74 20 6c 72 75 3b 20 20 20 20 20 20 int lru;
7f030 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 /* Least
7f040 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65 recently used e
7f050 6e 74 72 79 20 68 61 73 20 74 68 65 20 73 6d 61 ntry has the sma
7f060 6c 6c 65 73 74 20 76 61 6c 75 65 20 2a 2f 0d 0a llest value */..
7f070 20 20 7d 20 61 43 6f 6c 43 61 63 68 65 5b 53 51 } aColCache[SQ
7f080 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 5d LITE_N_COLCACHE]
7f090 3b 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65 61 ; /* One for ea
7f0a0 63 68 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 ch column cache
7f0b0 65 6e 74 72 79 20 2a 2f 0d 0a 20 20 79 44 62 4d entry */.. yDbM
7f0c0 61 73 6b 20 77 72 69 74 65 4d 61 73 6b 3b 20 20 ask writeMask;
7f0d0 20 2f 2a 20 53 74 61 72 74 20 61 20 77 72 69 74 /* Start a writ
7f0e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e e transaction on
7f0f0 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 these databases
7f100 20 2a 2f 0d 0a 20 20 79 44 62 4d 61 73 6b 20 63 */.. yDbMask c
7f110 6f 6f 6b 69 65 4d 61 73 6b 3b 20 20 2f 2a 20 42 ookieMask; /* B
7f120 69 74 6d 61 73 6b 20 6f 66 20 73 63 68 65 6d 61 itmask of schema
7f130 20 76 65 72 69 66 69 65 64 20 64 61 74 61 62 61 verified databa
7f140 73 65 73 20 2a 2f 0d 0a 20 20 75 38 20 69 73 4d ses */.. u8 isM
7f150 75 6c 74 69 57 72 69 74 65 3b 20 20 20 20 20 2f ultiWrite; /
7f160 2a 20 54 72 75 65 20 69 66 20 73 74 61 74 65 6d * True if statem
7f170 65 6e 74 20 6d 61 79 20 61 66 66 65 63 74 2f 69 ent may affect/i
7f180 6e 73 65 72 74 20 6d 75 6c 74 69 70 6c 65 20 72 nsert multiple r
7f190 6f 77 73 20 2a 2f 0d 0a 20 20 75 38 20 6d 61 79 ows */.. u8 may
7f1a0 41 62 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f Abort; /
7f1b0 2a 20 54 72 75 65 20 69 66 20 73 74 61 74 65 6d * True if statem
7f1c0 65 6e 74 20 6d 61 79 20 74 68 72 6f 77 20 61 6e ent may throw an
7f1d0 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e ABORT exception
7f1e0 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 6f 6f 6b 69 */.. int cooki
7f1f0 65 47 6f 74 6f 3b 20 20 20 20 20 20 2f 2a 20 41 eGoto; /* A
7f200 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 47 6f 74 ddress of OP_Got
7f210 6f 20 74 6f 20 63 6f 6f 6b 69 65 20 76 65 72 69 o to cookie veri
7f220 66 69 65 72 20 73 75 62 72 6f 75 74 69 6e 65 20 fier subroutine
7f230 2a 2f 0d 0a 20 20 69 6e 74 20 63 6f 6f 6b 69 65 */.. int cookie
7f240 56 61 6c 75 65 5b 53 51 4c 49 54 45 5f 4d 41 58 Value[SQLITE_MAX
7f250 5f 41 54 54 41 43 48 45 44 2b 32 5d 3b 20 20 2f _ATTACHED+2]; /
7f260 2a 20 56 61 6c 75 65 73 20 6f 66 20 63 6f 6f 6b * Values of cook
7f270 69 65 73 20 74 6f 20 76 65 72 69 66 79 20 2a 2f ies to verify */
7f280 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
7f290 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 _OMIT_SHARED_CAC
7f2a0 48 45 0d 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 HE.. int nTable
7f2b0 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 Lock; /*
7f2c0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 Number of locks
7f2d0 69 6e 20 61 54 61 62 6c 65 4c 6f 63 6b 20 2a 2f in aTableLock */
7f2e0 0d 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 61 .. TableLock *a
7f2f0 54 61 62 6c 65 4c 6f 63 6b 3b 20 2f 2a 20 52 65 TableLock; /* Re
7f300 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 quired table loc
7f310 6b 73 20 66 6f 72 20 73 68 61 72 65 64 2d 63 61 ks for shared-ca
7f320 63 68 65 20 6d 6f 64 65 20 2a 2f 0d 0a 23 65 6e che mode */..#en
7f330 64 69 66 0d 0a 20 20 69 6e 74 20 72 65 67 52 6f dif.. int regRo
7f340 77 69 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 wid; /* R
7f350 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 egister holding
7f360 72 6f 77 69 64 20 6f 66 20 43 52 45 41 54 45 20 rowid of CREATE
7f370 54 41 42 4c 45 20 65 6e 74 72 79 20 2a 2f 0d 0a TABLE entry */..
7f380 20 20 69 6e 74 20 72 65 67 52 6f 6f 74 3b 20 20 int regRoot;
7f390 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 /* Regist
7f3a0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 6f 74 20 er holding root
7f3b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 page number for
7f3c0 6e 65 77 20 6f 62 6a 65 63 74 73 20 2a 2f 0d 0a new objects */..
7f3d0 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 AutoincInfo *p
7f3e0 41 69 6e 63 3b 20 20 2f 2a 20 49 6e 66 6f 72 6d Ainc; /* Inform
7f3f0 61 74 69 6f 6e 20 61 62 6f 75 74 20 41 55 54 4f ation about AUTO
7f400 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75 6e 74 65 INCREMENT counte
7f410 72 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4d 61 rs */.. int nMa
7f420 78 41 72 67 3b 20 20 20 20 20 20 20 20 20 2f 2a xArg; /*
7f430 20 4d 61 78 20 61 72 67 73 20 70 61 73 73 65 64 Max args passed
7f440 20 74 6f 20 75 73 65 72 20 66 75 6e 63 74 69 6f to user functio
7f450 6e 20 62 79 20 73 75 62 2d 70 72 6f 67 72 61 6d n by sub-program
7f460 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 66 6f */.... /* Info
7f470 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 77 68 69 rmation used whi
7f480 6c 65 20 63 6f 64 69 6e 67 20 74 72 69 67 67 65 le coding trigge
7f490 72 20 70 72 6f 67 72 61 6d 73 2e 20 2a 2f 0d 0a r programs. */..
7f4a0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 Parse *pToplev
7f4b0 65 6c 3b 20 20 20 20 2f 2a 20 50 61 72 73 65 20 el; /* Parse
7f4c0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 6d 61 structure for ma
7f4d0 69 6e 20 70 72 6f 67 72 61 6d 20 28 6f 72 20 4e in program (or N
7f4e0 55 4c 4c 29 20 2a 2f 0d 0a 20 20 54 61 62 6c 65 ULL) */.. Table
7f4f0 20 2a 70 54 72 69 67 67 65 72 54 61 62 3b 20 20 *pTriggerTab;
7f500 2f 2a 20 54 61 62 6c 65 20 74 72 69 67 67 65 72 /* Table trigger
7f510 73 20 61 72 65 20 62 65 69 6e 67 20 63 6f 64 65 s are being code
7f520 64 20 66 6f 72 20 2a 2f 0d 0a 20 20 75 33 32 20 d for */.. u32
7f530 6f 6c 64 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 oldmask;
7f540 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 6c 64 2e /* Mask of old.
7f550 2a 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 * columns refere
7f560 6e 63 65 64 20 2a 2f 0d 0a 20 20 75 33 32 20 6e nced */.. u32 n
7f570 65 77 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 ewmask;
7f580 2f 2a 20 4d 61 73 6b 20 6f 66 20 6e 65 77 2e 2a /* Mask of new.*
7f590 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e columns referen
7f5a0 63 65 64 20 2a 2f 0d 0a 20 20 75 38 20 65 54 72 ced */.. u8 eTr
7f5b0 69 67 67 65 72 4f 70 3b 20 20 20 20 20 20 20 2f iggerOp; /
7f5c0 2a 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f * TK_UPDATE, TK_
7f5d0 49 4e 53 45 52 54 20 6f 72 20 54 4b 5f 44 45 4c INSERT or TK_DEL
7f5e0 45 54 45 20 2a 2f 0d 0a 20 20 75 38 20 65 4f 72 ETE */.. u8 eOr
7f5f0 63 6f 6e 66 3b 20 20 20 20 20 20 20 20 20 20 2f conf; /
7f600 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e * Default ON CON
7f610 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 FLICT policy for
7f620 20 74 72 69 67 67 65 72 20 73 74 65 70 73 20 2a trigger steps *
7f630 2f 0d 0a 20 20 75 38 20 64 69 73 61 62 6c 65 54 /.. u8 disableT
7f640 72 69 67 67 65 72 73 3b 20 20 2f 2a 20 54 72 75 riggers; /* Tru
7f650 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 72 69 e to disable tri
7f660 67 67 65 72 73 20 2a 2f 0d 0a 20 20 64 6f 75 62 ggers */.. doub
7f670 6c 65 20 6e 51 75 65 72 79 4c 6f 6f 70 3b 20 20 le nQueryLoop;
7f680 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 /* Estimated nu
7f690 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f mber of iteratio
7f6a0 6e 73 20 6f 66 20 61 20 71 75 65 72 79 20 2a 2f ns of a query */
7f6b0 0d 0a 0d 0a 20 20 2f 2a 20 41 62 6f 76 65 20 69 .... /* Above i
7f6c0 73 20 63 6f 6e 73 74 61 6e 74 20 62 65 74 77 65 s constant betwe
7f6d0 65 6e 20 72 65 63 75 72 73 69 6f 6e 73 2e 20 20 en recursions.
7f6e0 42 65 6c 6f 77 20 69 73 20 72 65 73 65 74 20 62 Below is reset b
7f6f0 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72 0d efore and after.
7f700 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 75 72 . ** each recur
7f710 73 69 6f 6e 20 2a 2f 0d 0a 0d 0a 20 20 69 6e 74 sion */.... int
7f720 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 nVar;
7f730 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 /* Number of '
7f740 3f 27 20 76 61 72 69 61 62 6c 65 73 20 73 65 65 ?' variables see
7f750 6e 20 69 6e 20 74 68 65 20 53 51 4c 20 73 6f 20 n in the SQL so
7f760 66 61 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 7a far */.. int nz
7f770 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f Var; /
7f780 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 * Number of avai
7f790 6c 61 62 6c 65 20 73 6c 6f 74 73 20 69 6e 20 61 lable slots in a
7f7a0 7a 56 61 72 5b 5d 20 2a 2f 0d 0a 20 20 63 68 61 zVar[] */.. cha
7f7b0 72 20 2a 2a 61 7a 56 61 72 3b 20 20 20 20 20 20 r **azVar;
7f7c0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f /* Pointers to
7f7d0 20 6e 61 6d 65 73 20 6f 66 20 70 61 72 61 6d 65 names of parame
7f7e0 74 65 72 73 20 2a 2f 0d 0a 20 20 56 64 62 65 20 ters */.. Vdbe
7f7f0 2a 70 52 65 70 72 65 70 61 72 65 3b 20 20 20 20 *pReprepare;
7f800 2f 2a 20 56 4d 20 62 65 69 6e 67 20 72 65 70 72 /* VM being repr
7f810 65 70 61 72 65 64 20 28 73 71 6c 69 74 65 33 52 epared (sqlite3R
7f820 65 70 72 65 70 61 72 65 28 29 29 20 2a 2f 0d 0a eprepare()) */..
7f830 20 20 69 6e 74 20 6e 41 6c 69 61 73 3b 20 20 20 int nAlias;
7f840 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
7f850 20 6f 66 20 61 6c 69 61 73 65 64 20 72 65 73 75 of aliased resu
7f860 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a lt set columns *
7f870 2f 0d 0a 20 20 69 6e 74 20 2a 61 41 6c 69 61 73 /.. int *aAlias
7f880 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 ; /* Reg
7f890 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 68 6f ister used to ho
7f8a0 6c 64 20 61 6c 69 61 73 65 64 20 72 65 73 75 6c ld aliased resul
7f8b0 74 20 2a 2f 0d 0a 20 20 75 38 20 65 78 70 6c 61 t */.. u8 expla
7f8c0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 in; /*
7f8d0 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c True if the EXPL
7f8e0 41 49 4e 20 66 6c 61 67 20 69 73 20 66 6f 75 6e AIN flag is foun
7f8f0 64 20 6f 6e 20 74 68 65 20 71 75 65 72 79 20 2a d on the query *
7f900 2f 0d 0a 20 20 54 6f 6b 65 6e 20 73 4e 61 6d 65 /.. Token sName
7f910 54 6f 6b 65 6e 3b 20 20 20 20 2f 2a 20 54 6f 6b Token; /* Tok
7f920 65 6e 20 77 69 74 68 20 75 6e 71 75 61 6c 69 66 en with unqualif
7f930 69 65 64 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 ied schema objec
7f940 74 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 54 6f 6b t name */.. Tok
7f950 65 6e 20 73 4c 61 73 74 54 6f 6b 65 6e 3b 20 20 en sLastToken;
7f960 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 74 6f /* The last to
7f970 6b 65 6e 20 70 61 72 73 65 64 20 2a 2f 0d 0a 20 ken parsed */..
7f980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 const char *zTa
7f990 69 6c 3b 20 20 20 2f 2a 20 41 6c 6c 20 53 51 4c il; /* All SQL
7f9a0 20 74 65 78 74 20 70 61 73 74 20 74 68 65 20 6c text past the l
7f9b0 61 73 74 20 73 65 6d 69 63 6f 6c 6f 6e 20 70 61 ast semicolon pa
7f9c0 72 73 65 64 20 2a 2f 0d 0a 20 20 54 61 62 6c 65 rsed */.. Table
7f9d0 20 2a 70 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 *pNewTable;
7f9e0 2f 2a 20 41 20 74 61 62 6c 65 20 62 65 69 6e 67 /* A table being
7f9f0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 constructed by
7fa00 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0d CREATE TABLE */.
7fa10 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4e 65 77 . Trigger *pNew
7fa20 54 72 69 67 67 65 72 3b 20 20 20 20 20 2f 2a 20 Trigger; /*
7fa30 54 72 69 67 67 65 72 20 75 6e 64 65 72 20 63 6f Trigger under co
7fa40 6e 73 74 72 75 63 74 20 62 79 20 61 20 43 52 45 nstruct by a CRE
7fa50 41 54 45 20 54 52 49 47 47 45 52 20 2a 2f 0d 0a ATE TRIGGER */..
7fa60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 const char *zA
7fa70 75 74 68 43 6f 6e 74 65 78 74 3b 20 2f 2a 20 54 uthContext; /* T
7fa80 68 65 20 36 74 68 20 70 61 72 61 6d 65 74 65 72 he 6th parameter
7fa90 20 74 6f 20 64 62 2d 3e 78 41 75 74 68 20 63 61 to db->xAuth ca
7faa0 6c 6c 62 61 63 6b 73 20 2a 2f 0d 0a 23 69 66 6e llbacks */..#ifn
7fab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
7fac0 56 49 52 54 55 41 4c 54 41 42 4c 45 0d 0a 20 20 VIRTUALTABLE..
7fad0 54 6f 6b 65 6e 20 73 41 72 67 3b 20 20 20 20 20 Token sArg;
7fae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
7faf0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 61 mplete text of a
7fb00 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 module argument
7fb10 20 2a 2f 0d 0a 20 20 75 38 20 64 65 63 6c 61 72 */.. u8 declar
7fb20 65 56 74 61 62 3b 20 20 20 20 20 20 20 20 20 20 eVtab;
7fb30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 73 /* True if ins
7fb40 69 64 65 20 73 71 6c 69 74 65 33 5f 64 65 63 6c ide sqlite3_decl
7fb50 61 72 65 5f 76 74 61 62 28 29 20 2a 2f 0d 0a 20 are_vtab() */..
7fb60 20 69 6e 74 20 6e 56 74 61 62 4c 6f 63 6b 3b 20 int nVtabLock;
7fb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
7fb80 75 6d 62 65 72 20 6f 66 20 76 69 72 74 75 61 6c umber of virtual
7fb90 20 74 61 62 6c 65 73 20 74 6f 20 6c 6f 63 6b 20 tables to lock
7fba0 2a 2f 0d 0a 20 20 54 61 62 6c 65 20 2a 2a 61 70 */.. Table **ap
7fbb0 56 74 61 62 4c 6f 63 6b 3b 20 20 20 20 20 20 20 VtabLock;
7fbc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 /* Pointer to v
7fbd0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6e 65 irtual tables ne
7fbe0 65 64 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f eding locking */
7fbf0 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74 20 ..#endif.. int
7fc00 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 nHeight;
7fc10 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f /* Expressio
7fc20 6e 20 74 72 65 65 20 68 65 69 67 68 74 20 6f 66 n tree height of
7fc30 20 63 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c current sub-sel
7fc40 65 63 74 20 2a 2f 0d 0a 20 20 54 61 62 6c 65 20 ect */.. Table
7fc50 2a 70 5a 6f 6d 62 69 65 54 61 62 3b 20 20 20 20 *pZombieTab;
7fc60 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 54 61 62 /* List of Tab
7fc70 6c 65 20 6f 62 6a 65 63 74 73 20 74 6f 20 64 65 le objects to de
7fc80 6c 65 74 65 20 61 66 74 65 72 20 63 6f 64 65 20 lete after code
7fc90 67 65 6e 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 gen */.. Trigge
7fca0 72 50 72 67 20 2a 70 54 72 69 67 67 65 72 50 72 rPrg *pTriggerPr
7fcb0 67 3b 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 g; /* Linked
7fcc0 6c 69 73 74 20 6f 66 20 63 6f 64 65 64 20 74 72 list of coded tr
7fcd0 69 67 67 65 72 73 20 2a 2f 0d 0a 0d 0a 23 69 66 iggers */....#if
7fce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
7fcf0 5f 45 58 50 4c 41 49 4e 0d 0a 20 20 69 6e 74 20 _EXPLAIN.. int
7fd00 69 53 65 6c 65 63 74 49 64 3b 0d 0a 20 20 69 6e iSelectId;.. in
7fd10 74 20 69 4e 65 78 74 53 65 6c 65 63 74 49 64 3b t iNextSelectId;
7fd20 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a ..#endif..};....
7fd30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
7fd40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0d IT_VIRTUALTABLE.
7fd50 0a 20 20 23 64 65 66 69 6e 65 20 49 4e 5f 44 45 . #define IN_DE
7fd60 43 4c 41 52 45 5f 56 54 41 42 20 30 0d 0a 23 65 CLARE_VTAB 0..#e
7fd70 6c 73 65 0d 0a 20 20 23 64 65 66 69 6e 65 20 49 lse.. #define I
7fd80 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 28 N_DECLARE_VTAB (
7fd90 70 50 61 72 73 65 2d 3e 64 65 63 6c 61 72 65 56 pParse->declareV
7fda0 74 61 62 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a tab)..#endif....
7fdb0 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e /*..** An instan
7fdc0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ce of the follow
7fdd0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 ing structure ca
7fde0 6e 20 62 65 20 64 65 63 6c 61 72 65 64 20 6f 6e n be declared on
7fdf0 20 61 20 73 74 61 63 6b 20 61 6e 64 20 75 73 65 a stack and use
7fe00 64 0d 0a 2a 2a 20 74 6f 20 73 61 76 65 20 74 68 d..** to save th
7fe10 65 20 50 61 72 73 65 2e 7a 41 75 74 68 43 6f 6e e Parse.zAuthCon
7fe20 74 65 78 74 20 76 61 6c 75 65 20 73 6f 20 74 68 text value so th
7fe30 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 at it can be res
7fe40 74 6f 72 65 64 20 6c 61 74 65 72 2e 0d 0a 2a 2f tored later...*/
7fe50 0d 0a 73 74 72 75 63 74 20 41 75 74 68 43 6f 6e ..struct AuthCon
7fe60 74 65 78 74 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 text {.. const
7fe70 63 68 61 72 20 2a 7a 41 75 74 68 43 6f 6e 74 65 char *zAuthConte
7fe80 78 74 3b 20 20 20 2f 2a 20 50 75 74 20 73 61 76 xt; /* Put sav
7fe90 65 64 20 50 61 72 73 65 2e 7a 41 75 74 68 43 6f ed Parse.zAuthCo
7fea0 6e 74 65 78 74 20 68 65 72 65 20 2a 2f 0d 0a 20 ntext here */..
7feb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 Parse *pParse;
7fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
7fed0 54 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 The Parse struct
7fee0 75 72 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a ure */..};..../*
7fef0 0d 0a 2a 2a 20 42 69 74 66 69 65 6c 64 20 66 6c ..** Bitfield fl
7ff00 61 67 73 20 66 6f 72 20 50 35 20 76 61 6c 75 65 ags for P5 value
7ff10 20 69 6e 20 4f 50 5f 49 6e 73 65 72 74 20 61 6e in OP_Insert an
7ff20 64 20 4f 50 5f 44 65 6c 65 74 65 0d 0a 2a 2f 0d d OP_Delete..*/.
7ff30 0a 23 64 65 66 69 6e 65 20 4f 50 46 4c 41 47 5f .#define OPFLAG_
7ff40 4e 43 48 41 4e 47 45 20 20 20 20 20 20 20 30 78 NCHANGE 0x
7ff50 30 31 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 01 /* Set to
7ff60 75 70 64 61 74 65 20 64 62 2d 3e 6e 43 68 61 6e update db->nChan
7ff70 67 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f ge */..#define O
7ff80 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 PFLAG_LASTROWID
7ff90 20 20 20 20 30 78 30 32 20 20 20 20 2f 2a 20 53 0x02 /* S
7ffa0 65 74 20 74 6f 20 75 70 64 61 74 65 20 64 62 2d et to update db-
7ffb0 3e 6c 61 73 74 52 6f 77 69 64 20 2a 2f 0d 0a 23 >lastRowid */..#
7ffc0 64 65 66 69 6e 65 20 4f 50 46 4c 41 47 5f 49 53 define OPFLAG_IS
7ffd0 55 50 44 41 54 45 20 20 20 20 20 20 30 78 30 34 UPDATE 0x04
7ffe0 20 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f 49 /* This OP_I
7fff0 6e 73 65 72 74 20 69 73 20 61 6e 20 73 71 6c 20 nsert is an sql
80000 55 50 44 41 54 45 20 2a 2f 0d 0a 23 64 65 66 69 UPDATE */..#defi
80010 6e 65 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 ne OPFLAG_APPEND
80020 20 20 20 20 20 20 20 20 30 78 30 38 20 20 20 20 0x08
80030 2f 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 6c /* This is likel
80040 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e y to be an appen
80050 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f 50 d */..#define OP
80060 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 FLAG_USESEEKRESU
80070 4c 54 20 30 78 31 30 20 20 20 20 2f 2a 20 54 72 LT 0x10 /* Tr
80080 79 20 74 6f 20 61 76 6f 69 64 20 61 20 73 65 65 y to avoid a see
80090 6b 20 69 6e 20 42 74 72 65 65 49 6e 73 65 72 74 k in BtreeInsert
800a0 28 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4f () */..#define O
800b0 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 PFLAG_CLEARCACHE
800c0 20 20 20 20 30 78 32 30 20 20 20 20 2f 2a 20 43 0x20 /* C
800d0 6c 65 61 72 20 70 73 65 75 64 6f 2d 74 61 62 6c lear pseudo-tabl
800e0 65 20 63 61 63 68 65 20 69 6e 20 4f 50 5f 43 6f e cache in OP_Co
800f0 6c 75 6d 6e 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 20 lumn */..../*..
80100 2a 20 45 61 63 68 20 74 72 69 67 67 65 72 20 70 * Each trigger p
80110 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 resent in the da
80120 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 tabase schema is
80130 20 73 74 6f 72 65 64 20 61 73 20 61 6e 20 69 6e stored as an in
80140 73 74 61 6e 63 65 20 6f 66 0d 0a 20 2a 20 73 74 stance of.. * st
80150 72 75 63 74 20 54 72 69 67 67 65 72 2e 20 0d 0a ruct Trigger. ..
80160 20 2a 0d 0a 20 2a 20 50 6f 69 6e 74 65 72 73 20 *.. * Pointers
80170 74 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 to instances of
80180 73 74 72 75 63 74 20 54 72 69 67 67 65 72 20 61 struct Trigger a
80190 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 77 6f re stored in two
801a0 20 77 61 79 73 2e 0d 0a 20 2a 20 31 2e 20 49 6e ways... * 1. In
801b0 20 74 68 65 20 22 74 72 69 67 48 61 73 68 22 20 the "trigHash"
801c0 68 61 73 68 20 74 61 62 6c 65 20 28 70 61 72 74 hash table (part
801d0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 2a of the sqlite3*
801e0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 that represents
801f0 20 74 68 65 20 0d 0a 20 2a 20 20 20 20 64 61 74 the .. * dat
80200 61 62 61 73 65 29 2e 20 54 68 69 73 20 61 6c 6c abase). This all
80210 6f 77 73 20 54 72 69 67 67 65 72 20 73 74 72 75 ows Trigger stru
80220 63 74 75 72 65 73 20 74 6f 20 62 65 20 72 65 74 ctures to be ret
80230 72 69 65 76 65 64 20 62 79 20 6e 61 6d 65 2e 0d rieved by name..
80240 0a 20 2a 20 32 2e 20 41 6c 6c 20 74 72 69 67 67 . * 2. All trigg
80250 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 ers associated w
80260 69 74 68 20 61 20 73 69 6e 67 6c 65 20 74 61 62 ith a single tab
80270 6c 65 20 66 6f 72 6d 20 61 20 6c 69 6e 6b 65 64 le form a linked
80280 20 6c 69 73 74 2c 20 75 73 69 6e 67 20 74 68 65 list, using the
80290 0d 0a 20 2a 20 20 20 20 70 4e 65 78 74 20 6d 65 .. * pNext me
802a0 6d 62 65 72 20 6f 66 20 73 74 72 75 63 74 20 54 mber of struct T
802b0 72 69 67 67 65 72 2e 20 41 20 70 6f 69 6e 74 65 rigger. A pointe
802c0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 r to the first e
802d0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 0d 0a 20 lement of the..
802e0 2a 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 * linked list
802f0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 74 68 is stored as th
80300 65 20 22 70 54 72 69 67 67 65 72 22 20 6d 65 6d e "pTrigger" mem
80310 62 65 72 20 6f 66 20 74 68 65 20 61 73 73 6f 63 ber of the assoc
80320 69 61 74 65 64 0d 0a 20 2a 20 20 20 20 73 74 72 iated.. * str
80330 75 63 74 20 54 61 62 6c 65 2e 0d 0a 20 2a 0d 0a uct Table... *..
80340 20 2a 20 54 68 65 20 22 73 74 65 70 5f 6c 69 73 * The "step_lis
80350 74 22 20 6d 65 6d 62 65 72 20 70 6f 69 6e 74 73 t" member points
80360 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6c to the first el
80370 65 6d 65 6e 74 20 6f 66 20 61 20 6c 69 6e 6b 65 ement of a linke
80380 64 20 6c 69 73 74 0d 0a 20 2a 20 63 6f 6e 74 61 d list.. * conta
80390 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 ining the SQL st
803a0 61 74 65 6d 65 6e 74 73 20 73 70 65 63 69 66 69 atements specifi
803b0 65 64 20 61 73 20 74 68 65 20 74 72 69 67 67 65 ed as the trigge
803c0 72 20 70 72 6f 67 72 61 6d 2e 0d 0a 20 2a 2f 0d r program... */.
803d0 0a 73 74 72 75 63 74 20 54 72 69 67 67 65 72 20 .struct Trigger
803e0 7b 0d 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 {.. char *zName
803f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
80400 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 The name of the
80410 74 72 69 67 67 65 72 20 20 20 20 20 20 20 20 20 trigger
80420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a *
80430 2f 0d 0a 20 20 63 68 61 72 20 2a 74 61 62 6c 65 /.. char *table
80440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
80450 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 The table or vie
80460 77 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 74 w to which the t
80470 72 69 67 67 65 72 20 61 70 70 6c 69 65 73 20 2a rigger applies *
80480 2f 0d 0a 20 20 75 38 20 6f 70 3b 20 20 20 20 20 /.. u8 op;
80490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
804a0 4f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 One of TK_DELETE
804b0 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f , TK_UPDATE, TK_
804c0 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 2a INSERT *
804d0 2f 0d 0a 20 20 75 38 20 74 72 5f 74 6d 3b 20 20 /.. u8 tr_tm;
804e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
804f0 4f 6e 65 20 6f 66 20 54 52 49 47 47 45 52 5f 42 One of TRIGGER_B
80500 45 46 4f 52 45 2c 20 54 52 49 47 47 45 52 5f 41 EFORE, TRIGGER_A
80510 46 54 45 52 20 2a 2f 0d 0a 20 20 45 78 70 72 20 FTER */.. Expr
80520 2a 70 57 68 65 6e 3b 20 20 20 20 20 20 20 20 20 *pWhen;
80530 20 20 20 2f 2a 20 54 68 65 20 57 48 45 4e 20 63 /* The WHEN c
80540 6c 61 75 73 65 20 6f 66 20 74 68 65 20 65 78 70 lause of the exp
80550 72 65 73 73 69 6f 6e 20 28 6d 61 79 20 62 65 20 ression (may be
80560 4e 55 4c 4c 29 20 2a 2f 0d 0a 20 20 49 64 4c 69 NULL) */.. IdLi
80570 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 3b 20 20 20 st *pColumns;
80580 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 /* If this i
80590 73 20 61 6e 20 55 50 44 41 54 45 20 4f 46 20 3c s an UPDATE OF <
805a0 63 6f 6c 75 6d 6e 2d 6c 69 73 74 3e 20 74 72 69 column-list> tri
805b0 67 67 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 gger,..
805c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
805d0 20 20 20 20 74 68 65 20 3c 63 6f 6c 75 6d 6e 2d the <column-
805e0 6c 69 73 74 3e 20 69 73 20 73 74 6f 72 65 64 20 list> is stored
805f0 68 65 72 65 20 2a 2f 0d 0a 20 20 53 63 68 65 6d here */.. Schem
80600 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 a *pSchema;
80610 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 63 6f 6e /* Schema con
80620 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 taining the trig
80630 67 65 72 20 2a 2f 0d 0a 20 20 53 63 68 65 6d 61 ger */.. Schema
80640 20 2a 70 54 61 62 53 63 68 65 6d 61 3b 20 20 20 *pTabSchema;
80650 20 20 2f 2a 20 53 63 68 65 6d 61 20 63 6f 6e 74 /* Schema cont
80660 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 aining the table
80670 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 72 53 74 */.. TriggerSt
80680 65 70 20 2a 73 74 65 70 5f 6c 69 73 74 3b 20 2f ep *step_list; /
80690 2a 20 4c 69 6e 6b 20 6c 69 73 74 20 6f 66 20 74 * Link list of t
806a0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 73 rigger program s
806b0 74 65 70 73 20 20 20 20 20 20 20 20 20 20 20 20 teps
806c0 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 72 20 2a */.. Trigger *
806d0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f pNext; /
806e0 2a 20 4e 65 78 74 20 74 72 69 67 67 65 72 20 61 * Next trigger a
806f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
80700 68 65 20 74 61 62 6c 65 20 2a 2f 0d 0a 7d 3b 0d he table */..};.
80710 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 74 72 69 67 .../*..** A trig
80720 67 65 72 20 69 73 20 65 69 74 68 65 72 20 61 20 ger is either a
80730 42 45 46 4f 52 45 20 6f 72 20 61 6e 20 41 46 54 BEFORE or an AFT
80740 45 52 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 ER trigger. The
80750 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 following const
80760 61 6e 74 73 0d 0a 2a 2a 20 64 65 74 65 72 6d 69 ants..** determi
80770 6e 65 20 77 68 69 63 68 2e 20 0d 0a 2a 2a 0d 0a ne which. ..**..
80780 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 ** If there are
80790 6d 75 6c 74 69 70 6c 65 20 74 72 69 67 67 65 72 multiple trigger
807a0 73 2c 20 79 6f 75 20 6d 69 67 68 74 20 6f 66 20 s, you might of
807b0 73 6f 6d 65 20 42 45 46 4f 52 45 20 61 6e 64 20 some BEFORE and
807c0 73 6f 6d 65 20 41 46 54 45 52 2e 0d 0a 2a 2a 20 some AFTER...**
807d0 49 6e 20 74 68 61 74 20 63 61 73 65 73 2c 20 74 In that cases, t
807e0 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 62 65 6c he constants bel
807f0 6f 77 20 63 61 6e 20 62 65 20 4f 52 65 64 20 74 ow can be ORed t
80800 6f 67 65 74 68 65 72 2e 0d 0a 2a 2f 0d 0a 23 64 ogether...*/..#d
80810 65 66 69 6e 65 20 54 52 49 47 47 45 52 5f 42 45 efine TRIGGER_BE
80820 46 4f 52 45 20 20 31 0d 0a 23 64 65 66 69 6e 65 FORE 1..#define
80830 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 20 TRIGGER_AFTER
80840 20 32 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 20 41 6e 20 2..../*.. * An
80850 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72 75 instance of stru
80860 63 74 20 54 72 69 67 67 65 72 53 74 65 70 20 69 ct TriggerStep i
80870 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 s used to store
80880 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 a single SQL sta
80890 74 65 6d 65 6e 74 0d 0a 20 2a 20 74 68 61 74 20 tement.. * that
808a0 69 73 20 61 20 70 61 72 74 20 6f 66 20 61 20 74 is a part of a t
808b0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 2e 20 rigger-program.
808c0 0d 0a 20 2a 0d 0a 20 2a 20 49 6e 73 74 61 6e 63 .. *.. * Instanc
808d0 65 73 20 6f 66 20 73 74 72 75 63 74 20 54 72 69 es of struct Tri
808e0 67 67 65 72 53 74 65 70 20 61 72 65 20 73 74 6f ggerStep are sto
808f0 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 79 20 red in a singly
80900 6c 69 6e 6b 65 64 20 6c 69 73 74 20 28 6c 69 6e linked list (lin
80910 6b 65 64 0d 0a 20 2a 20 75 73 69 6e 67 20 74 68 ked.. * using th
80920 65 20 22 70 4e 65 78 74 22 20 6d 65 6d 62 65 72 e "pNext" member
80930 29 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 ) referenced by
80940 74 68 65 20 22 73 74 65 70 5f 6c 69 73 74 22 20 the "step_list"
80950 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0d 0a member of the ..
80960 20 2a 20 61 73 73 6f 63 69 61 74 65 64 20 73 74 * associated st
80970 72 75 63 74 20 54 72 69 67 67 65 72 20 69 6e 73 ruct Trigger ins
80980 74 61 6e 63 65 2e 20 54 68 65 20 66 69 72 73 74 tance. The first
80990 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 element of the
809a0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 0d 0a linked list is..
809b0 20 2a 20 74 68 65 20 66 69 72 73 74 20 73 74 65 * the first ste
809c0 70 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 p of the trigger
809d0 2d 70 72 6f 67 72 61 6d 2e 0d 0a 20 2a 20 0d 0a -program... * ..
809e0 20 2a 20 54 68 65 20 22 6f 70 22 20 6d 65 6d 62 * The "op" memb
809f0 65 72 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 er indicates whe
80a00 74 68 65 72 20 74 68 69 73 20 69 73 20 61 20 22 ther this is a "
80a10 44 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 DELETE", "INSERT
80a20 22 2c 20 22 55 50 44 41 54 45 22 20 6f 72 0d 0a ", "UPDATE" or..
80a30 20 2a 20 22 53 45 4c 45 43 54 22 20 73 74 61 74 * "SELECT" stat
80a40 65 6d 65 6e 74 2e 20 54 68 65 20 6d 65 61 6e 69 ement. The meani
80a50 6e 67 73 20 6f 66 20 74 68 65 20 6f 74 68 65 72 ngs of the other
80a60 20 6d 65 6d 62 65 72 73 20 69 73 20 64 65 74 65 members is dete
80a70 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 0d 0a rmined by the ..
80a80 20 2a 20 76 61 6c 75 65 20 6f 66 20 22 6f 70 22 * value of "op"
80a90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 20 2a as follows:.. *
80aa0 0d 0a 20 2a 20 28 6f 70 20 3d 3d 20 54 4b 5f 49 .. * (op == TK_I
80ab0 4e 53 45 52 54 29 0d 0a 20 2a 20 6f 72 63 6f 6e NSERT).. * orcon
80ac0 66 20 20 20 20 2d 3e 20 73 74 6f 72 65 73 20 74 f -> stores t
80ad0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 he ON CONFLICT a
80ae0 6c 67 6f 72 69 74 68 6d 0d 0a 20 2a 20 70 53 65 lgorithm.. * pSe
80af0 6c 65 63 74 20 20 20 2d 3e 20 49 66 20 74 68 69 lect -> If thi
80b00 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 49 s is an INSERT I
80b10 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20 2e NTO ... SELECT .
80b20 2e 2e 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 .. statement, th
80b30 65 6e 0d 0a 20 2a 20 20 20 20 20 20 20 20 20 20 en.. *
80b40 20 20 20 20 74 68 69 73 20 73 74 6f 72 65 73 20 this stores
80b50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
80b60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e SELECT statemen
80b70 74 2e 20 4f 74 68 65 72 77 69 73 65 20 4e 55 4c t. Otherwise NUL
80b80 4c 2e 0d 0a 20 2a 20 74 61 72 67 65 74 20 20 20 L... * target
80b90 20 2d 3e 20 41 20 74 6f 6b 65 6e 20 68 6f 6c 64 -> A token hold
80ba0 69 6e 67 20 74 68 65 20 71 75 6f 74 65 64 20 6e ing the quoted n
80bb0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 ame of the table
80bc0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 2e to insert into.
80bd0 0d 0a 20 2a 20 70 45 78 70 72 4c 69 73 74 20 2d .. * pExprList -
80be0 3e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 > If this is an
80bf0 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 INSERT INTO ...
80c00 56 41 4c 55 45 53 20 2e 2e 2e 20 73 74 61 74 65 VALUES ... state
80c10 6d 65 6e 74 2c 20 74 68 65 6e 0d 0a 20 2a 20 20 ment, then.. *
80c20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 this
80c30 20 73 74 6f 72 65 73 20 76 61 6c 75 65 73 20 74 stores values t
80c40 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 4f o be inserted. O
80c50 74 68 65 72 77 69 73 65 20 4e 55 4c 4c 2e 0d 0a therwise NULL...
80c60 20 2a 20 70 49 64 4c 69 73 74 20 20 20 2d 3e 20 * pIdList ->
80c70 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e If this is an IN
80c80 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 28 3c SERT INTO ... (<
80c90 63 6f 6c 75 6d 6e 2d 6e 61 6d 65 73 3e 29 20 56 column-names>) V
80ca0 41 4c 55 45 53 20 2e 2e 2e 20 0d 0a 20 2a 20 20 ALUES ... .. *
80cb0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 stat
80cc0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 ement, then this
80cd0 20 73 74 6f 72 65 73 20 74 68 65 20 63 6f 6c 75 stores the colu
80ce0 6d 6e 2d 6e 61 6d 65 73 20 74 6f 20 62 65 0d 0a mn-names to be..
80cf0 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
80d00 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 0d 0a inserted into...
80d10 20 2a 0d 0a 20 2a 20 28 6f 70 20 3d 3d 20 54 4b *.. * (op == TK
80d20 5f 44 45 4c 45 54 45 29 0d 0a 20 2a 20 74 61 72 _DELETE).. * tar
80d30 67 65 74 20 20 20 20 2d 3e 20 41 20 74 6f 6b 65 get -> A toke
80d40 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 71 75 n holding the qu
80d50 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 oted name of the
80d60 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 table to delete
80d70 20 66 72 6f 6d 2e 0d 0a 20 2a 20 70 57 68 65 72 from... * pWher
80d80 65 20 20 20 20 2d 3e 20 54 68 65 20 57 48 45 52 e -> The WHER
80d90 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 E clause of the
80da0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 DELETE statement
80db0 20 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63 69 if one is speci
80dc0 66 69 65 64 2e 0d 0a 20 2a 20 20 20 20 20 20 20 fied... *
80dd0 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73 65 Otherwise
80de0 20 4e 55 4c 4c 2e 0d 0a 20 2a 20 0d 0a 20 2a 20 NULL... * .. *
80df0 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 (op == TK_UPDATE
80e00 29 0d 0a 20 2a 20 74 61 72 67 65 74 20 20 20 20 ).. * target
80e10 2d 3e 20 41 20 74 6f 6b 65 6e 20 68 6f 6c 64 69 -> A token holdi
80e20 6e 67 20 74 68 65 20 71 75 6f 74 65 64 20 6e 61 ng the quoted na
80e30 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 me of the table
80e40 74 6f 20 75 70 64 61 74 65 20 72 6f 77 73 20 6f to update rows o
80e50 66 2e 0d 0a 20 2a 20 70 57 68 65 72 65 20 20 20 f... * pWhere
80e60 20 2d 3e 20 54 68 65 20 57 48 45 52 45 20 63 6c -> The WHERE cl
80e70 61 75 73 65 20 6f 66 20 74 68 65 20 55 50 44 41 ause of the UPDA
80e80 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 TE statement if
80e90 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69 65 64 one is specified
80ea0 2e 0d 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 ... *
80eb0 20 20 20 4f 74 68 65 72 77 69 73 65 20 4e 55 4c Otherwise NUL
80ec0 4c 2e 0d 0a 20 2a 20 70 45 78 70 72 4c 69 73 74 L... * pExprList
80ed0 20 2d 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 68 -> A list of th
80ee0 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 e columns to upd
80ef0 61 74 65 20 61 6e 64 20 74 68 65 20 65 78 70 72 ate and the expr
80f00 65 73 73 69 6f 6e 73 20 74 6f 20 75 70 64 61 74 essions to updat
80f10 65 0d 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 e.. *
80f20 20 20 20 74 68 65 6d 20 74 6f 2e 20 53 65 65 20 them to. See
80f30 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 29 20 sqlite3Update()
80f40 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 documentation of
80f50 20 22 70 43 68 61 6e 67 65 73 22 0d 0a 20 2a 20 "pChanges".. *
80f60 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 arg
80f70 75 6d 65 6e 74 2e 0d 0a 20 2a 20 0d 0a 20 2a 2f ument... * .. */
80f80 0d 0a 73 74 72 75 63 74 20 54 72 69 67 67 65 72 ..struct Trigger
80f90 53 74 65 70 20 7b 0d 0a 20 20 75 38 20 6f 70 3b Step {.. u8 op;
80fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
80fb0 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 * One of TK_DELE
80fc0 54 45 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 TE, TK_UPDATE, T
80fd0 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 53 45 4c K_INSERT, TK_SEL
80fe0 45 43 54 20 2a 2f 0d 0a 20 20 75 38 20 6f 72 63 ECT */.. u8 orc
80ff0 6f 6e 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f onf; /
81000 2a 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 65 74 * OE_Rollback et
81010 63 2e 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 72 c. */.. Trigger
81020 20 2a 70 54 72 69 67 3b 20 20 20 20 20 20 2f 2a *pTrig; /*
81030 20 54 68 65 20 74 72 69 67 67 65 72 20 74 68 61 The trigger tha
81040 74 20 74 68 69 73 20 73 74 65 70 20 69 73 20 61 t this step is a
81050 20 70 61 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 53 part of */.. S
81060 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 3b 20 elect *pSelect;
81070 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 /* SELECT st
81080 61 74 6d 65 6e 74 20 6f 72 20 52 48 53 20 6f 66 atment or RHS of
81090 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 20 INSERT INTO ..
810a0 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0d 0a 20 SELECT ... */..
810b0 20 54 6f 6b 65 6e 20 74 61 72 67 65 74 3b 20 20 Token target;
810c0 20 20 20 20 20 20 2f 2a 20 54 61 72 67 65 74 20 /* Target
810d0 74 61 62 6c 65 20 66 6f 72 20 44 45 4c 45 54 45 table for DELETE
810e0 2c 20 55 50 44 41 54 45 2c 20 49 4e 53 45 52 54 , UPDATE, INSERT
810f0 20 2a 2f 0d 0a 20 20 45 78 70 72 20 2a 70 57 68 */.. Expr *pWh
81100 65 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 ere; /* T
81110 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 he WHERE clause
81120 66 6f 72 20 44 45 4c 45 54 45 20 6f 72 20 55 50 for DELETE or UP
81130 44 41 54 45 20 73 74 65 70 73 20 2a 2f 0d 0a 20 DATE steps */..
81140 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 70 72 ExprList *pExpr
81150 4c 69 73 74 3b 20 2f 2a 20 53 45 54 20 63 6c 61 List; /* SET cla
81160 75 73 65 20 66 6f 72 20 55 50 44 41 54 45 2e 20 use for UPDATE.
81170 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 66 VALUES clause f
81180 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0d 0a 20 20 or INSERT */..
81190 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 3b IdList *pIdList;
811a0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e /* Column n
811b0 61 6d 65 73 20 66 6f 72 20 49 4e 53 45 52 54 20 ames for INSERT
811c0 2a 2f 0d 0a 20 20 54 72 69 67 67 65 72 53 74 65 */.. TriggerSte
811d0 70 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 p *pNext; /* Ne
811e0 78 74 20 69 6e 20 74 68 65 20 6c 69 6e 6b 2d 6c xt in the link-l
811f0 69 73 74 20 2a 2f 0d 0a 20 20 54 72 69 67 67 65 ist */.. Trigge
81200 72 53 74 65 70 20 2a 70 4c 61 73 74 3b 20 20 2f rStep *pLast; /
81210 2a 20 4c 61 73 74 20 65 6c 65 6d 65 6e 74 20 69 * Last element i
81220 6e 20 6c 69 6e 6b 2d 6c 69 73 74 2e 20 56 61 6c n link-list. Val
81230 69 64 20 66 6f 72 20 31 73 74 20 65 6c 65 6d 20 id for 1st elem
81240 6f 6e 6c 79 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f only */..};..../
81250 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 *..** The follow
81260 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 6f ing structure co
81270 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 ntains informati
81280 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 73 on used by the s
81290 71 6c 69 74 65 46 69 78 2e 2e 2e 0d 0a 2a 2a 20 qliteFix.....**
812a0 72 6f 75 74 69 6e 65 73 20 61 73 20 74 68 65 79 routines as they
812b0 20 77 61 6c 6b 20 74 68 65 20 70 61 72 73 65 20 walk the parse
812c0 74 72 65 65 20 74 6f 20 6d 61 6b 65 20 64 61 74 tree to make dat
812d0 61 62 61 73 65 20 72 65 66 65 72 65 6e 63 65 73 abase references
812e0 0d 0a 2a 2a 20 65 78 70 6c 69 63 69 74 2e 20 20 ..** explicit.
812f0 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 ..*/..typedef st
81300 72 75 63 74 20 44 62 46 69 78 65 72 20 44 62 46 ruct DbFixer DbF
81310 69 78 65 72 3b 0d 0a 73 74 72 75 63 74 20 44 62 ixer;..struct Db
81320 46 69 78 65 72 20 7b 0d 0a 20 20 50 61 72 73 65 Fixer {.. Parse
81330 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 2f *pParse; /
81340 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f * The parsing co
81350 6e 74 65 78 74 2e 20 20 45 72 72 6f 72 20 6d 65 ntext. Error me
81360 73 73 61 67 65 73 20 77 72 69 74 74 65 6e 20 68 ssages written h
81370 65 72 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 ere */.. const
81380 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 2f 2a char *zDb; /*
81390 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6f Make sure all o
813a0 62 6a 65 63 74 73 20 61 72 65 20 63 6f 6e 74 61 bjects are conta
813b0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 64 61 74 ined in this dat
813c0 61 62 61 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 abase */.. cons
813d0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 t char *zType;
813e0 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 63 /* Type of the c
813f0 6f 6e 74 61 69 6e 65 72 20 2d 20 75 73 65 64 20 ontainer - used
81400 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 for error messag
81410 65 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 54 es */.. const T
81420 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 2f 2a 20 oken *pName; /*
81430 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 Name of the cont
81440 61 69 6e 65 72 20 2d 20 75 73 65 64 20 66 6f 72 ainer - used for
81450 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
81460 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
81470 20 41 6e 20 6f 62 6a 65 63 74 65 64 20 75 73 65 An objected use
81480 64 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 d to accumulate
81490 74 68 65 20 74 65 78 74 20 6f 66 20 61 20 73 74 the text of a st
814a0 72 69 6e 67 20 77 68 65 72 65 20 77 65 0d 0a 2a ring where we..*
814b0 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 * do not necessa
814c0 72 69 6c 79 20 6b 6e 6f 77 20 68 6f 77 20 62 69 rily know how bi
814d0 67 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 6c g the string wil
814e0 6c 20 62 65 20 69 6e 20 74 68 65 20 65 6e 64 2e l be in the end.
814f0 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 53 74 72 ..*/..struct Str
81500 41 63 63 75 6d 20 7b 0d 0a 20 20 73 71 6c 69 74 Accum {.. sqlit
81510 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 e3 *db;
81520 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 64 61 74 61 /* Optional data
81530 62 61 73 65 20 66 6f 72 20 6c 6f 6f 6b 61 73 69 base for lookasi
81540 64 65 2e 20 20 43 61 6e 20 62 65 20 4e 55 4c 4c de. Can be NULL
81550 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 42 61 */.. char *zBa
81560 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 se; /* A
81570 20 62 61 73 65 20 61 6c 6c 6f 63 61 74 69 6f 6e base allocation
81580 2e 20 20 4e 6f 74 20 66 72 6f 6d 20 6d 61 6c 6c . Not from mall
81590 6f 63 2e 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a oc. */.. char *
815a0 7a 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f zText; /
815b0 2a 20 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6c * The string col
815c0 6c 65 63 74 65 64 20 73 6f 20 66 61 72 20 2a 2f lected so far */
815d0 0d 0a 20 20 69 6e 74 20 20 6e 43 68 61 72 3b 20 .. int nChar;
815e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 /* Leng
815f0 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 th of the string
81600 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20 69 6e so far */.. in
81610 74 20 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 t nAlloc;
81620 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 /* Amount of
81630 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 space allocated
81640 69 6e 20 7a 54 65 78 74 20 2a 2f 0d 0a 20 20 69 in zText */.. i
81650 6e 74 20 20 6d 78 41 6c 6c 6f 63 3b 20 20 20 20 nt mxAlloc;
81660 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 /* Maximum a
81670 6c 6c 6f 77 65 64 20 73 74 72 69 6e 67 20 6c 65 llowed string le
81680 6e 67 74 68 20 2a 2f 0d 0a 20 20 75 38 20 20 20 ngth */.. u8
81690 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 20 20 mallocFailed;
816a0 2f 2a 20 42 65 63 6f 6d 65 73 20 74 72 75 65 20 /* Becomes true
816b0 69 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c if any memory al
816c0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 2a location fails *
816d0 2f 0d 0a 20 20 75 38 20 20 20 75 73 65 4d 61 6c /.. u8 useMal
816e0 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20 30 3a 20 loc; /* 0:
816f0 6e 6f 6e 65 2c 20 20 31 3a 20 73 71 6c 69 74 65 none, 1: sqlite
81700 33 44 62 4d 61 6c 6c 6f 63 2c 20 20 32 3a 20 73 3DbMalloc, 2: s
81710 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 2a 2f qlite3_malloc */
81720 0d 0a 20 20 75 38 20 20 20 74 6f 6f 42 69 67 3b .. u8 tooBig;
81730 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 6f /* Beco
81740 6d 65 73 20 74 72 75 65 20 69 66 20 73 74 72 69 mes true if stri
81750 6e 67 20 73 69 7a 65 20 65 78 63 65 65 64 73 20 ng size exceeds
81760 6c 69 6d 69 74 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d limits */..};...
81770 0a 2f 2a 0d 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 ./*..** A pointe
81780 72 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 r to this struct
81790 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 ure is used to c
817a0 6f 6d 6d 75 6e 69 63 61 74 65 20 69 6e 66 6f 72 ommunicate infor
817b0 6d 61 74 69 6f 6e 0d 0a 2a 2a 20 66 72 6f 6d 20 mation..** from
817c0 73 71 6c 69 74 65 33 49 6e 69 74 20 61 6e 64 20 sqlite3Init and
817d0 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 69 OP_ParseSchema i
817e0 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 49 nto the sqlite3I
817f0 6e 69 74 43 61 6c 6c 62 61 63 6b 2e 0d 0a 2a 2f nitCallback...*/
81800 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
81810 20 7b 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 {.. sqlite3 *d
81820 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 b; /* The
81830 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 database being
81840 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0d 0a initialized */..
81850 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 int iDb;
81860 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d /* 0 for m
81870 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 20 31 ain database. 1
81880 20 66 6f 72 20 54 45 4d 50 2c 20 32 2e 2e 20 66 for TEMP, 2.. f
81890 6f 72 20 41 54 54 41 43 48 65 64 20 2a 2f 0d 0a or ATTACHed */..
818a0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 char **pzErrMs
818b0 67 3b 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d g; /* Error m
818c0 65 73 73 61 67 65 20 73 74 6f 72 65 64 20 68 65 essage stored he
818d0 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 3b re */.. int rc;
818e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
818f0 52 65 73 75 6c 74 20 63 6f 64 65 20 73 74 6f 72 Result code stor
81900 65 64 20 68 65 72 65 20 2a 2f 0d 0a 7d 20 49 6e ed here */..} In
81910 69 74 44 61 74 61 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a itData;..../*..*
81920 2a 20 53 74 72 75 63 74 75 72 65 20 63 6f 6e 74 * Structure cont
81930 61 69 6e 69 6e 67 20 67 6c 6f 62 61 6c 20 63 6f aining global co
81940 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 nfiguration data
81950 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 for the SQLite
81960 6c 69 62 72 61 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a library...**..**
81970 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 This structure
81980 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 73 6f also contains so
81990 6d 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 me state informa
819a0 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 tion...*/..struc
819b0 74 20 53 71 6c 69 74 65 33 43 6f 6e 66 69 67 20 t Sqlite3Config
819c0 7b 0d 0a 20 20 69 6e 74 20 62 4d 65 6d 73 74 61 {.. int bMemsta
819d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
819e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 /* True t
819f0 6f 20 65 6e 61 62 6c 65 20 6d 65 6d 6f 72 79 20 o enable memory
81a00 73 74 61 74 75 73 20 2a 2f 0d 0a 20 20 69 6e 74 status */.. int
81a10 20 62 43 6f 72 65 4d 75 74 65 78 3b 20 20 20 20 bCoreMutex;
81a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
81a30 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 * True to enable
81a40 20 63 6f 72 65 20 6d 75 74 65 78 69 6e 67 20 2a core mutexing *
81a50 2f 0d 0a 20 20 69 6e 74 20 62 46 75 6c 6c 4d 75 /.. int bFullMu
81a60 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 tex;
81a70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 /* True t
81a80 6f 20 65 6e 61 62 6c 65 20 66 75 6c 6c 20 6d 75 o enable full mu
81a90 74 65 78 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 texing */.. int
81aa0 20 62 4f 70 65 6e 55 72 69 3b 20 20 20 20 20 20 bOpenUri;
81ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
81ac0 2a 20 54 72 75 65 20 74 6f 20 69 6e 74 65 72 70 * True to interp
81ad0 72 65 74 20 66 69 6c 65 6e 61 6d 65 73 20 61 73 ret filenames as
81ae0 20 55 52 49 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 URIs */.. int
81af0 6d 78 53 74 72 6c 65 6e 3b 20 20 20 20 20 20 20 mxStrlen;
81b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
81b10 20 4d 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 Maximum string
81b20 6c 65 6e 67 74 68 20 2a 2f 0d 0a 20 20 69 6e 74 length */.. int
81b30 20 73 7a 4c 6f 6f 6b 61 73 69 64 65 3b 20 20 20 szLookaside;
81b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
81b50 2a 20 44 65 66 61 75 6c 74 20 6c 6f 6f 6b 61 73 * Default lookas
81b60 69 64 65 20 62 75 66 66 65 72 20 73 69 7a 65 20 ide buffer size
81b70 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 */.. int nLooka
81b80 73 69 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 side;
81b90 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 /* Defau
81ba0 6c 74 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 lt lookaside buf
81bb0 66 65 72 20 63 6f 75 6e 74 20 2a 2f 0d 0a 20 20 fer count */..
81bc0 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
81bd0 6f 64 73 20 6d 3b 20 20 20 20 20 20 20 20 20 20 ods m;
81be0 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 6d /* Low-level m
81bf0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
81c00 20 69 6e 74 65 72 66 61 63 65 20 2a 2f 0d 0a 20 interface */..
81c10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d sqlite3_mutex_m
81c20 65 74 68 6f 64 73 20 6d 75 74 65 78 3b 20 20 20 ethods mutex;
81c30 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 /* Low-level
81c40 6d 75 74 65 78 20 69 6e 74 65 72 66 61 63 65 20 mutex interface
81c50 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 */.. sqlite3_pc
81c60 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 20 70 63 ache_methods2 pc
81c70 61 63 68 65 32 3b 20 20 2f 2a 20 4c 6f 77 2d 6c ache2; /* Low-l
81c80 65 76 65 6c 20 70 61 67 65 2d 63 61 63 68 65 20 evel page-cache
81c90 69 6e 74 65 72 66 61 63 65 20 2a 2f 0d 0a 20 20 interface */..
81ca0 76 6f 69 64 20 2a 70 48 65 61 70 3b 20 20 20 20 void *pHeap;
81cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81cc0 20 20 2f 2a 20 48 65 61 70 20 73 74 6f 72 61 67 /* Heap storag
81cd0 65 20 73 70 61 63 65 20 2a 2f 0d 0a 20 20 69 6e e space */.. in
81ce0 74 20 6e 48 65 61 70 3b 20 20 20 20 20 20 20 20 t nHeap;
81cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81d00 2f 2a 20 53 69 7a 65 20 6f 66 20 70 48 65 61 70 /* Size of pHeap
81d10 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 6d 6e 52 [] */.. int mnR
81d20 65 71 2c 20 6d 78 52 65 71 3b 20 20 20 20 20 20 eq, mxReq;
81d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 /* Mi
81d40 6e 20 61 6e 64 20 6d 61 78 20 68 65 61 70 20 72 n and max heap r
81d50 65 71 75 65 73 74 73 20 73 69 7a 65 73 20 2a 2f equests sizes */
81d60 0d 0a 20 20 76 6f 69 64 20 2a 70 53 63 72 61 74 .. void *pScrat
81d70 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ch;
81d80 20 20 20 20 20 20 2f 2a 20 53 63 72 61 74 63 68 /* Scratch
81d90 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 69 6e memory */.. in
81da0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 t szScratch;
81db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81dc0 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 /* Size of each
81dd0 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20 2a scratch buffer *
81de0 2f 0d 0a 20 20 69 6e 74 20 6e 53 63 72 61 74 63 /.. int nScratc
81df0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 h;
81e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
81e10 20 6f 66 20 73 63 72 61 74 63 68 20 62 75 66 66 of scratch buff
81e20 65 72 73 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a ers */.. void *
81e30 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 pPage;
81e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
81e50 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 age cache memory
81e60 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 50 61 67 */.. int szPag
81e70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
81e80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
81e90 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e of each page in
81ea0 20 70 50 61 67 65 5b 5d 20 2a 2f 0d 0a 20 20 69 pPage[] */.. i
81eb0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 nt nPage;
81ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
81ee0 67 65 73 20 69 6e 20 70 50 61 67 65 5b 5d 20 2a ges in pPage[] *
81ef0 2f 0d 0a 20 20 69 6e 74 20 6d 78 50 61 72 73 65 /.. int mxParse
81f00 72 53 74 61 63 6b 3b 20 20 20 20 20 20 20 20 20 rStack;
81f10 20 20 20 20 20 20 20 2f 2a 20 6d 61 78 69 6d 75 /* maximu
81f20 6d 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 70 m depth of the p
81f30 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0d 0a arser stack */..
81f40 20 20 69 6e 74 20 73 68 61 72 65 64 43 61 63 68 int sharedCach
81f50 65 45 6e 61 62 6c 65 64 3b 20 20 20 20 20 20 20 eEnabled;
81f60 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 73 /* true if s
81f70 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
81f80 20 65 6e 61 62 6c 65 64 20 2a 2f 0d 0a 20 20 2f enabled */.. /
81f90 2a 20 54 68 65 20 61 62 6f 76 65 20 6d 69 67 68 * The above migh
81fa0 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 t be initialized
81fb0 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 54 to non-zero. T
81fc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 65 he following nee
81fd0 64 20 74 6f 20 61 6c 77 61 79 73 0d 0a 20 20 2a d to always.. *
81fe0 2a 20 69 6e 69 74 69 61 6c 6c 79 20 62 65 20 7a * initially be z
81ff0 65 72 6f 2c 20 68 6f 77 65 76 65 72 2e 20 2a 2f ero, however. */
82000 0d 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 20 .. int isInit;
82010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82020 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66 /* True af
82030 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 ter initializati
82040 6f 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 on has finished
82050 2a 2f 0d 0a 20 20 69 6e 74 20 69 6e 50 72 6f 67 */.. int inProg
82060 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 ress;
82070 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
82080 77 68 69 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 while initializa
82090 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 tion in progress
820a0 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 73 4d 75 74 */.. int isMut
820b0 65 78 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 exInit;
820c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
820d0 20 61 66 74 65 72 20 6d 75 74 65 78 65 73 20 61 after mutexes a
820e0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a re initialized *
820f0 2f 0d 0a 20 20 69 6e 74 20 69 73 4d 61 6c 6c 6f /.. int isMallo
82100 63 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 cInit;
82110 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 /* True a
82120 66 74 65 72 20 6d 61 6c 6c 6f 63 20 69 73 20 69 fter malloc is i
82130 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0d 0a 20 nitialized */..
82140 20 69 6e 74 20 69 73 50 43 61 63 68 65 49 6e 69 int isPCacheIni
82150 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
82160 20 20 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72 /* True after
82170 20 6d 61 6c 6c 6f 63 20 69 73 20 69 6e 69 74 69 malloc is initi
82180 61 6c 69 7a 65 64 20 2a 2f 0d 0a 20 20 73 71 6c alized */.. sql
82190 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 49 6e 69 ite3_mutex *pIni
821a0 74 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 2f tMutex; /
821b0 2a 20 4d 75 74 65 78 20 75 73 65 64 20 62 79 20 * Mutex used by
821c0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 sqlite3_initiali
821d0 7a 65 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e ze() */.. int n
821e0 52 65 66 49 6e 69 74 4d 75 74 65 78 3b 20 20 20 RefInitMutex;
821f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
82200 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 Number of users
82210 6f 66 20 70 49 6e 69 74 4d 75 74 65 78 20 2a 2f of pInitMutex */
82220 0d 0a 20 20 76 6f 69 64 20 28 2a 78 4c 6f 67 29 .. void (*xLog)
82230 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 (void*,int,const
82240 20 63 68 61 72 2a 29 3b 20 2f 2a 20 46 75 6e 63 char*); /* Func
82250 74 69 6f 6e 20 66 6f 72 20 6c 6f 67 67 69 6e 67 tion for logging
82260 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 4c 6f */.. void *pLo
82270 67 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 gArg;
82280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
82290 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f irst argument to
822a0 20 78 4c 6f 67 28 29 20 2a 2f 0d 0a 20 20 69 6e xLog() */.. in
822b0 74 20 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c t bLocaltimeFaul
822c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
822d0 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69 6c 20 /* True to fail
822e0 6c 6f 63 61 6c 74 69 6d 65 28 29 20 63 61 6c 6c localtime() call
822f0 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a s */..};..../*..
82300 2a 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 ** Context point
82310 65 72 20 70 61 73 73 65 64 20 64 6f 77 6e 20 74 er passed down t
82320 68 72 6f 75 67 68 20 74 68 65 20 74 72 65 65 2d hrough the tree-
82330 77 61 6c 6b 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 walk...*/..struc
82340 74 20 57 61 6c 6b 65 72 20 7b 0d 0a 20 20 69 6e t Walker {.. in
82350 74 20 28 2a 78 45 78 70 72 43 61 6c 6c 62 61 63 t (*xExprCallbac
82360 6b 29 28 57 61 6c 6b 65 72 2a 2c 20 45 78 70 72 k)(Walker*, Expr
82370 2a 29 3b 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 *); /* Callb
82380 61 63 6b 20 66 6f 72 20 65 78 70 72 65 73 73 69 ack for expressi
82390 6f 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a ons */.. int (*
823a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 29 xSelectCallback)
823b0 28 57 61 6c 6b 65 72 2a 2c 53 65 6c 65 63 74 2a (Walker*,Select*
823c0 29 3b 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 ); /* Callback
823d0 66 6f 72 20 53 45 4c 45 43 54 73 20 2a 2f 0d 0a for SELECTs */..
823e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b Parse *pParse;
823f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
82410 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 arser context.
82420 2a 2f 0d 0a 20 20 75 6e 69 6f 6e 20 7b 20 20 20 */.. union {
82430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82450 2f 2a 20 45 78 74 72 61 20 64 61 74 61 20 66 6f /* Extra data fo
82460 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20 r callback */..
82470 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a NameContext *
82480 70 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 pNC;
82490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
824a0 20 4e 61 6d 69 6e 67 20 63 6f 6e 74 65 78 74 20 Naming context
824b0 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 */.. int i;
824c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
824d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
824e0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 /* Integer va
824f0 6c 75 65 20 2a 2f 0d 0a 20 20 7d 20 75 3b 0d 0a lue */.. } u;..
82500 7d 3b 0d 0a 0d 0a 2f 2a 20 46 6f 72 77 61 72 64 };..../* Forward
82510 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f declarations */
82520 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
82530 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 6b int sqlite3Walk
82540 45 78 70 72 28 57 61 6c 6b 65 72 2a 2c 20 45 78 Expr(Walker*, Ex
82550 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 pr*);..SQLITE_PR
82560 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
82570 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 57 61 3WalkExprList(Wa
82580 6c 6b 65 72 2a 2c 20 45 78 70 72 4c 69 73 74 2a lker*, ExprList*
82590 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
825a0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 TE int sqlite3Wa
825b0 6c 6b 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 2a lkSelect(Walker*
825c0 2c 20 53 65 6c 65 63 74 2a 29 3b 0d 0a 53 51 4c , Select*);..SQL
825d0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
825e0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 sqlite3WalkSelec
825f0 74 45 78 70 72 28 57 61 6c 6b 65 72 2a 2c 20 53 tExpr(Walker*, S
82600 65 6c 65 63 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 elect*);..SQLITE
82610 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
82620 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 46 72 ite3WalkSelectFr
82630 6f 6d 28 57 61 6c 6b 65 72 2a 2c 20 53 65 6c 65 om(Walker*, Sele
82640 63 74 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ct*);..../*..**
82650 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d Return code from
82660 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 the parse-tree
82670 77 61 6c 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 walking primitiv
82680 65 73 20 61 6e 64 20 74 68 65 69 72 0d 0a 2a 2a es and their..**
82690 20 63 61 6c 6c 62 61 63 6b 73 2e 0d 0a 2a 2f 0d callbacks...*/.
826a0 0a 23 64 65 66 69 6e 65 20 57 52 43 5f 43 6f 6e .#define WRC_Con
826b0 74 69 6e 75 65 20 20 20 20 30 20 20 20 2f 2a 20 tinue 0 /*
826c0 43 6f 6e 74 69 6e 75 65 20 64 6f 77 6e 20 69 6e Continue down in
826d0 74 6f 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0d 0a to children */..
826e0 23 64 65 66 69 6e 65 20 57 52 43 5f 50 72 75 6e #define WRC_Prun
826f0 65 20 20 20 20 20 20 20 31 20 20 20 2f 2a 20 4f e 1 /* O
82700 6d 69 74 20 63 68 69 6c 64 72 65 6e 20 62 75 74 mit children but
82710 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e continue walkin
82720 67 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0d 0a 23 g siblings */..#
82730 64 65 66 69 6e 65 20 57 52 43 5f 41 62 6f 72 74 define WRC_Abort
82740 20 20 20 20 20 20 20 32 20 20 20 2f 2a 20 41 62 2 /* Ab
82750 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 andon the tree w
82760 61 6c 6b 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a alk */..../*..**
82770 20 41 73 73 75 6d 69 6e 67 20 7a 49 6e 20 70 6f Assuming zIn po
82780 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 ints to the firs
82790 74 20 62 79 74 65 20 6f 66 20 61 20 55 54 46 2d t byte of a UTF-
827a0 38 20 63 68 61 72 61 63 74 65 72 2c 0d 0a 2a 2a 8 character,..**
827b0 20 61 64 76 61 6e 63 65 20 7a 49 6e 20 74 6f 20 advance zIn to
827c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 point to the fir
827d0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e st byte of the n
827e0 65 78 74 20 55 54 46 2d 38 20 63 68 61 72 61 63 ext UTF-8 charac
827f0 74 65 72 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e ter...*/..#defin
82800 65 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 e SQLITE_SKIP_UT
82810 46 38 28 7a 49 6e 29 20 7b 20 20 20 20 20 20 20 F8(zIn) {
82820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82830 20 5c 0d 0a 20 20 69 66 28 20 28 2a 28 7a 49 6e \.. if( (*(zIn
82840 2b 2b 29 29 3e 3d 30 78 63 30 20 29 7b 20 20 20 ++))>=0xc0 ){
82850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82860 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
82870 20 20 77 68 69 6c 65 28 20 28 2a 7a 49 6e 20 26 while( (*zIn &
82880 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 0xc0)==0x80 ){
82890 7a 49 6e 2b 2b 3b 20 7d 20 20 20 20 20 20 20 20 zIn++; }
828a0 20 20 20 20 20 5c 0d 0a 20 20 7d 20 20 20 20 20 \.. }
828b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
828c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
828d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
828e0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
828f0 65 20 53 51 4c 49 54 45 5f 2a 5f 42 4b 50 54 20 e SQLITE_*_BKPT
82900 6d 61 63 72 6f 73 20 61 72 65 20 73 75 62 73 74 macros are subst
82910 69 74 75 74 65 73 20 66 6f 72 20 74 68 65 20 65 itutes for the e
82920 72 72 6f 72 20 63 6f 64 65 73 20 77 69 74 68 0d rror codes with.
82930 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 6e 61 6d .** the same nam
82940 65 20 62 75 74 20 77 69 74 68 6f 75 74 20 74 68 e but without th
82950 65 20 5f 42 4b 50 54 20 73 75 66 66 69 78 2e 20 e _BKPT suffix.
82960 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 69 6e These macros in
82970 76 6f 6b 65 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 voke..** routine
82980 73 20 74 68 61 74 20 72 65 70 6f 72 74 20 74 68 s that report th
82990 65 20 6c 69 6e 65 2d 6e 75 6d 62 65 72 20 6f 6e e line-number on
829a0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 which the error
829b0 20 6f 72 69 67 69 6e 61 74 65 64 0d 0a 2a 2a 20 originated..**
829c0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f using sqlite3_lo
829d0 67 28 29 2e 20 20 54 68 65 20 72 6f 75 74 69 6e g(). The routin
829e0 65 73 20 61 6c 73 6f 20 70 72 6f 76 69 64 65 20 es also provide
829f0 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 a convenient pla
82a00 63 65 0d 0a 2a 2a 20 74 6f 20 73 65 74 20 61 20 ce..** to set a
82a10 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f debugger breakpo
82a20 69 6e 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 int...*/..SQLITE
82a30 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
82a40 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 ite3CorruptError
82a50 28 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 (int);..SQLITE_P
82a60 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
82a70 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e e3MisuseError(in
82a80 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
82a90 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 43 ATE int sqlite3C
82aa0 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 antopenError(int
82ab0 29 3b 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 );..#define SQLI
82ac0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 20 TE_CORRUPT_BKPT
82ad0 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 sqlite3CorruptEr
82ae0 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 29 0d 0a 23 ror(__LINE__)..#
82af0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 define SQLITE_MI
82b00 53 55 53 45 5f 42 4b 50 54 20 73 71 6c 69 74 65 SUSE_BKPT sqlite
82b10 33 4d 69 73 75 73 65 45 72 72 6f 72 28 5f 5f 4c 3MisuseError(__L
82b20 49 4e 45 5f 5f 29 0d 0a 23 64 65 66 69 6e 65 20 INE__)..#define
82b30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f SQLITE_CANTOPEN_
82b40 42 4b 50 54 20 73 71 6c 69 74 65 33 43 61 6e 74 BKPT sqlite3Cant
82b50 6f 70 65 6e 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 openError(__LINE
82b60 5f 5f 29 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 __)....../*..**
82b70 46 54 53 34 20 69 73 20 72 65 61 6c 6c 79 20 61 FTS4 is really a
82b80 6e 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 n extension for
82b90 46 54 53 33 2e 20 20 49 74 20 69 73 20 65 6e 61 FTS3. It is ena
82ba0 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 0d 0a bled using the..
82bb0 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ** SQLITE_ENABLE
82bc0 5f 46 54 53 33 20 6d 61 63 72 6f 2e 20 20 42 75 _FTS3 macro. Bu
82bd0 74 20 74 6f 20 61 76 6f 69 64 20 63 6f 6e 66 75 t to avoid confu
82be0 73 69 6f 6e 20 77 65 20 61 6c 73 6f 20 61 6c 6c sion we also all
82bf0 0d 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f ..** the SQLITE_
82c00 45 4e 41 42 4c 45 5f 46 54 53 34 20 6d 61 63 72 ENABLE_FTS4 macr
82c10 6f 20 74 6f 20 73 65 72 76 65 20 61 73 20 61 6e o to serve as an
82c20 20 61 6c 69 73 73 65 20 66 6f 72 20 53 51 4c 49 alisse for SQLI
82c30 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 2e 0d TE_ENABLE_FTS3..
82c40 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 .*/..#if defined
82c50 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 (SQLITE_ENABLE_F
82c60 54 53 34 29 20 26 26 20 21 64 65 66 69 6e 65 64 TS4) && !defined
82c70 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 (SQLITE_ENABLE_F
82c80 54 53 33 29 0d 0a 23 20 64 65 66 69 6e 65 20 53 TS3)..# define S
82c90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 QLITE_ENABLE_FTS
82ca0 33 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 3..#endif..../*.
82cb0 0a 2a 2a 20 54 68 65 20 63 74 79 70 65 2e 68 20 .** The ctype.h
82cc0 68 65 61 64 65 72 20 69 73 20 6e 65 65 64 65 64 header is needed
82cd0 20 66 6f 72 20 6e 6f 6e 2d 41 53 43 49 49 20 73 for non-ASCII s
82ce0 79 73 74 65 6d 73 2e 20 20 49 74 20 69 73 20 61 ystems. It is a
82cf0 6c 73 6f 0d 0a 2a 2a 20 6e 65 65 64 65 64 20 62 lso..** needed b
82d00 79 20 46 54 53 33 20 77 68 65 6e 20 46 54 53 33 y FTS3 when FTS3
82d10 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 is included in
82d20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e the amalgamation
82d30 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 21 64 65 66 69 ...*/..#if !defi
82d40 6e 65 64 28 53 51 4c 49 54 45 5f 41 53 43 49 49 ned(SQLITE_ASCII
82d50 29 20 7c 7c 20 5c 0d 0a 20 20 20 20 28 64 65 66 ) || \.. (def
82d60 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 ined(SQLITE_ENAB
82d70 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66 69 LE_FTS3) && defi
82d80 6e 65 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 ned(SQLITE_AMALG
82d90 41 4d 41 54 49 4f 4e 29 29 0d 0a 23 20 69 6e 63 AMATION))..# inc
82da0 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0d 0a lude <ctype.h>..
82db0 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
82dc0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d The following m
82dd0 61 63 72 6f 73 20 6d 69 6d 69 63 20 74 68 65 20 acros mimic the
82de0 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61 72 79 standard library
82df0 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 75 70 70 functions toupp
82e00 65 72 28 29 2c 0d 0a 2a 2a 20 69 73 73 70 61 63 er(),..** isspac
82e10 65 28 29 2c 20 69 73 61 6c 6e 75 6d 28 29 2c 20 e(), isalnum(),
82e20 69 73 64 69 67 69 74 28 29 20 61 6e 64 20 69 73 isdigit() and is
82e30 78 64 69 67 69 74 28 29 2c 20 72 65 73 70 65 63 xdigit(), respec
82e40 74 69 76 65 6c 79 2e 20 54 68 65 0d 0a 2a 2a 20 tively. The..**
82e50 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 73 20 sqlite versions
82e60 6f 6e 6c 79 20 77 6f 72 6b 20 66 6f 72 20 41 53 only work for AS
82e70 43 49 49 20 63 68 61 72 61 63 74 65 72 73 2c 20 CII characters,
82e80 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6c 6f regardless of lo
82e90 63 61 6c 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 cale...*/..#ifde
82ea0 66 20 53 51 4c 49 54 45 5f 41 53 43 49 49 0d 0a f SQLITE_ASCII..
82eb0 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 # define sqlite3
82ec0 54 6f 75 70 70 65 72 28 78 29 20 20 28 28 78 29 Toupper(x) ((x)
82ed0 26 7e 28 73 71 6c 69 74 65 33 43 74 79 70 65 4d &~(sqlite3CtypeM
82ee0 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61 ap[(unsigned cha
82ef0 72 29 28 78 29 5d 26 30 78 32 30 29 29 0d 0a 23 r)(x)]&0x20))..#
82f00 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 49 define sqlite3I
82f10 73 73 70 61 63 65 28 78 29 20 20 20 28 73 71 6c sspace(x) (sql
82f20 69 74 65 33 43 74 79 70 65 4d 61 70 5b 28 75 6e ite3CtypeMap[(un
82f30 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 5d signed char)(x)]
82f40 26 30 78 30 31 29 0d 0a 23 20 64 65 66 69 6e 65 &0x01)..# define
82f50 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 sqlite3Isalnum(
82f60 78 29 20 20 20 28 73 71 6c 69 74 65 33 43 74 79 x) (sqlite3Cty
82f70 70 65 4d 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 peMap[(unsigned
82f80 63 68 61 72 29 28 78 29 5d 26 30 78 30 36 29 0d char)(x)]&0x06).
82f90 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 .# define sqlite
82fa0 33 49 73 61 6c 70 68 61 28 78 29 20 20 20 28 73 3Isalpha(x) (s
82fb0 71 6c 69 74 65 33 43 74 79 70 65 4d 61 70 5b 28 qlite3CtypeMap[(
82fc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 unsigned char)(x
82fd0 29 5d 26 30 78 30 32 29 0d 0a 23 20 64 65 66 69 )]&0x02)..# defi
82fe0 6e 65 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 ne sqlite3Isdigi
82ff0 74 28 78 29 20 20 20 28 73 71 6c 69 74 65 33 43 t(x) (sqlite3C
83000 74 79 70 65 4d 61 70 5b 28 75 6e 73 69 67 6e 65 typeMap[(unsigne
83010 64 20 63 68 61 72 29 28 78 29 5d 26 30 78 30 34 d char)(x)]&0x04
83020 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 )..# define sqli
83030 74 65 33 49 73 78 64 69 67 69 74 28 78 29 20 20 te3Isxdigit(x)
83040 28 73 71 6c 69 74 65 33 43 74 79 70 65 4d 61 70 (sqlite3CtypeMap
83050 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 [(unsigned char)
83060 28 78 29 5d 26 30 78 30 38 29 0d 0a 23 20 64 65 (x)]&0x08)..# de
83070 66 69 6e 65 20 73 71 6c 69 74 65 33 54 6f 6c 6f fine sqlite3Tolo
83080 77 65 72 28 78 29 20 20 20 28 6f 61 73 55 70 70 wer(x) (oasUpp
83090 65 72 32 4c 6f 77 65 72 5b 28 75 6e 73 69 67 6e er2Lower[(unsign
830a0 65 64 20 63 68 61 72 29 28 78 29 5d 29 0d 0a 23 ed char)(x)])..#
830b0 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 73 else..# define s
830c0 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 78 29 qlite3Toupper(x)
830d0 20 20 20 74 6f 75 70 70 65 72 28 28 75 6e 73 69 toupper((unsi
830e0 67 6e 65 64 20 63 68 61 72 29 28 78 29 29 0d 0a gned char)(x))..
830f0 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 # define sqlite3
83100 49 73 73 70 61 63 65 28 78 29 20 20 20 69 73 73 Isspace(x) iss
83110 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 pace((unsigned c
83120 68 61 72 29 28 78 29 29 0d 0a 23 20 64 65 66 69 har)(x))..# defi
83130 6e 65 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 ne sqlite3Isalnu
83140 6d 28 78 29 20 20 20 69 73 61 6c 6e 75 6d 28 28 m(x) isalnum((
83150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 unsigned char)(x
83160 29 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c ))..# define sql
83170 69 74 65 33 49 73 61 6c 70 68 61 28 78 29 20 20 ite3Isalpha(x)
83180 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e isalpha((unsign
83190 65 64 20 63 68 61 72 29 28 78 29 29 0d 0a 23 20 ed char)(x))..#
831a0 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 49 73 define sqlite3Is
831b0 64 69 67 69 74 28 78 29 20 20 20 69 73 64 69 67 digit(x) isdig
831c0 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 it((unsigned cha
831d0 72 29 28 78 29 29 0d 0a 23 20 64 65 66 69 6e 65 r)(x))..# define
831e0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 sqlite3Isxdigit
831f0 28 78 29 20 20 69 73 78 64 69 67 69 74 28 28 75 (x) isxdigit((u
83200 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 nsigned char)(x)
83210 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 )..# define sqli
83220 74 65 33 54 6f 6c 6f 77 65 72 28 78 29 20 20 20 te3Tolower(x)
83230 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 tolower((unsigne
83240 64 20 63 68 61 72 29 28 78 29 29 0d 0a 23 65 6e d char)(x))..#en
83250 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e dif..../*..** In
83260 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 ternal function
83270 70 72 6f 74 6f 74 79 70 65 73 0d 0a 2a 2f 0d 0a prototypes..*/..
83280 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
83290 6e 74 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d nt sqlite3StrICm
832a0 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 p(const char *,
832b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0d 0a const char *);..
832c0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
832d0 6e 74 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e nt sqlite3Strlen
832e0 33 30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 30(const char*);
832f0 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 ..#define sqlite
83300 33 53 74 72 4e 49 43 6d 70 20 73 71 6c 69 74 65 3StrNICmp sqlite
83310 33 5f 73 74 72 6e 69 63 6d 70 0d 0a 0d 0a 53 51 3_strnicmp....SQ
83320 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
83330 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e sqlite3MallocIn
83340 69 74 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 it(void);..SQLIT
83350 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
83360 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 qlite3MallocEnd(
83370 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 void);..SQLITE_P
83380 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c RIVATE void *sql
83390 69 74 65 33 4d 61 6c 6c 6f 63 28 69 6e 74 29 3b ite3Malloc(int);
833a0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
833b0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 61 void *sqlite3Ma
833c0 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 29 3b 0d 0a llocZero(int);..
833d0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
833e0 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61 oid *sqlite3DbMa
833f0 6c 6c 6f 63 5a 65 72 6f 28 73 71 6c 69 74 65 33 llocZero(sqlite3
83400 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
83410 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 _PRIVATE void *s
83420 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 qlite3DbMallocRa
83430 77 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 29 w(sqlite3*, int)
83440 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
83450 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 44 E char *sqlite3D
83460 62 53 74 72 44 75 70 28 73 71 6c 69 74 65 33 2a bStrDup(sqlite3*
83470 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0d 0a ,const char*);..
83480 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 SQLITE_PRIVATE c
83490 68 61 72 20 2a 73 71 6c 69 74 65 33 44 62 53 74 har *sqlite3DbSt
834a0 72 4e 44 75 70 28 73 71 6c 69 74 65 33 2a 2c 63 rNDup(sqlite3*,c
834b0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 onst char*, int)
834c0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
834d0 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 52 E void *sqlite3R
834e0 65 61 6c 6c 6f 63 28 76 6f 69 64 2a 2c 20 69 6e ealloc(void*, in
834f0 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
83500 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 ATE void *sqlite
83510 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 3DbReallocOrFree
83520 28 73 71 6c 69 74 65 33 20 2a 2c 20 76 6f 69 64 (sqlite3 *, void
83530 20 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 *, int);..SQLIT
83540 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a E_PRIVATE void *
83550 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
83560 28 73 71 6c 69 74 65 33 20 2a 2c 20 76 6f 69 64 (sqlite3 *, void
83570 20 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 *, int);..SQLIT
83580 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
83590 71 6c 69 74 65 33 44 62 46 72 65 65 28 73 71 6c qlite3DbFree(sql
835a0 69 74 65 33 2a 2c 20 76 6f 69 64 2a 29 3b 0d 0a ite3*, void*);..
835b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
835c0 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 nt sqlite3Malloc
835d0 53 69 7a 65 28 76 6f 69 64 2a 29 3b 0d 0a 53 51 Size(void*);..SQ
835e0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
835f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
83600 53 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 76 Size(sqlite3*, v
83610 6f 69 64 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 oid*);..SQLITE_P
83620 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c RIVATE void *sql
83630 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f ite3ScratchMallo
83640 63 28 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f c(int);..SQLITE_
83650 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
83660 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 ite3ScratchFree(
83670 76 6f 69 64 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f void*);..SQLITE_
83680 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 PRIVATE void *sq
83690 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 lite3PageMalloc(
836a0 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
836b0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
836c0 65 33 50 61 67 65 46 72 65 65 28 76 6f 69 64 2a e3PageFree(void*
836d0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
836e0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d TE void sqlite3M
836f0 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 emSetDefault(voi
83700 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 d);..SQLITE_PRIV
83710 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
83720 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b BenignMallocHook
83730 73 28 76 6f 69 64 20 28 2a 29 28 76 6f 69 64 29 s(void (*)(void)
83740 2c 20 76 6f 69 64 20 28 2a 29 28 76 6f 69 64 29 , void (*)(void)
83750 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
83760 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 48 65 TE int sqlite3He
83770 61 70 4e 65 61 72 6c 79 46 75 6c 6c 28 76 6f 69 apNearlyFull(voi
83780 64 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 6e d);..../*..** On
83790 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 61 6d systems with am
837a0 70 6c 65 20 73 74 61 63 6b 20 73 70 61 63 65 20 ple stack space
837b0 61 6e 64 20 74 68 61 74 20 73 75 70 70 6f 72 74 and that support
837c0 20 61 6c 6c 6f 63 61 28 29 2c 20 6d 61 6b 65 0d alloca(), make.
837d0 0a 2a 2a 20 75 73 65 20 6f 66 20 61 6c 6c 6f 63 .** use of alloc
837e0 61 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 73 70 a() to obtain sp
837f0 61 63 65 20 66 6f 72 20 6c 61 72 67 65 20 61 75 ace for large au
83800 74 6f 6d 61 74 69 63 20 6f 62 6a 65 63 74 73 2e tomatic objects.
83810 20 20 42 79 20 64 65 66 61 75 6c 74 2c 0d 0a 2a By default,..*
83820 2a 20 6f 62 74 61 69 6e 20 73 70 61 63 65 20 66 * obtain space f
83830 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a rom malloc()...*
83840 2a 0d 0a 2a 2a 20 54 68 65 20 61 6c 6c 6f 63 61 *..** The alloca
83850 28 29 20 72 6f 75 74 69 6e 65 20 6e 65 76 65 72 () routine never
83860 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 returns NULL.
83870 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 This will cause
83880 63 6f 64 65 20 70 61 74 68 73 0d 0a 2a 2a 20 74 code paths..** t
83890 68 61 74 20 64 65 61 6c 20 77 69 74 68 20 73 71 hat deal with sq
838a0 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 28 lite3StackAlloc(
838b0 29 20 66 61 69 6c 75 72 65 73 20 74 6f 20 62 65 ) failures to be
838c0 20 75 6e 72 65 61 63 68 61 62 6c 65 2e 0d 0a 2a unreachable...*
838d0 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
838e0 5f 55 53 45 5f 41 4c 4c 4f 43 41 0d 0a 23 20 64 _USE_ALLOCA..# d
838f0 65 66 69 6e 65 20 73 71 6c 69 74 65 33 53 74 61 efine sqlite3Sta
83900 63 6b 41 6c 6c 6f 63 52 61 77 28 44 2c 4e 29 20 ckAllocRaw(D,N)
83910 20 20 61 6c 6c 6f 63 61 28 4e 29 0d 0a 23 20 64 alloca(N)..# d
83920 65 66 69 6e 65 20 73 71 6c 69 74 65 33 53 74 61 efine sqlite3Sta
83930 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 44 2c 4e 29 ckAllocZero(D,N)
83940 20 20 6d 65 6d 73 65 74 28 61 6c 6c 6f 63 61 28 memset(alloca(
83950 4e 29 2c 20 30 2c 20 4e 29 0d 0a 23 20 64 65 66 N), 0, N)..# def
83960 69 6e 65 20 73 71 6c 69 74 65 33 53 74 61 63 6b ine sqlite3Stack
83970 46 72 65 65 28 44 2c 50 29 20 20 20 20 20 20 20 Free(D,P)
83980 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
83990 65 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c e sqlite3StackAl
839a0 6c 6f 63 52 61 77 28 44 2c 4e 29 20 20 20 73 71 locRaw(D,N) sq
839b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 lite3DbMallocRaw
839c0 28 44 2c 4e 29 0d 0a 23 20 64 65 66 69 6e 65 20 (D,N)..# define
839d0 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f sqlite3StackAllo
839e0 63 5a 65 72 6f 28 44 2c 4e 29 20 20 73 71 6c 69 cZero(D,N) sqli
839f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 te3DbMallocZero(
83a00 44 2c 4e 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 D,N)..# define s
83a10 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 qlite3StackFree(
83a20 44 2c 50 29 20 20 20 20 20 20 20 73 71 6c 69 74 D,P) sqlit
83a30 65 33 44 62 46 72 65 65 28 44 2c 50 29 0d 0a 23 e3DbFree(D,P)..#
83a40 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 64 65 66 20 endif....#ifdef
83a50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 SQLITE_ENABLE_ME
83a60 4d 53 59 53 33 0d 0a 53 51 4c 49 54 45 5f 50 52 MSYS3..SQLITE_PR
83a70 49 56 41 54 45 20 63 6f 6e 73 74 20 73 71 6c 69 IVATE const sqli
83a80 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 te3_mem_methods
83a90 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 *sqlite3MemGetMe
83aa0 6d 73 79 73 33 28 76 6f 69 64 29 3b 0d 0a 23 65 msys3(void);..#e
83ab0 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c ndif..#ifdef SQL
83ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 ITE_ENABLE_MEMSY
83ad0 53 35 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 S5..SQLITE_PRIVA
83ae0 54 45 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 TE const sqlite3
83af0 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 _mem_methods *sq
83b00 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 lite3MemGetMemsy
83b10 73 35 28 76 6f 69 64 29 3b 0d 0a 23 65 6e 64 69 s5(void);..#endi
83b20 66 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 f......#ifndef S
83b30 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 QLITE_MUTEX_OMIT
83b40 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
83b50 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 sqlite3_mutex
83b60 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a _methods const *
83b70 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 sqlite3DefaultMu
83b80 74 65 78 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 tex(void);..SQLI
83b90 54 45 5f 50 52 49 56 41 54 45 20 20 20 73 71 6c TE_PRIVATE sql
83ba0 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f ite3_mutex_metho
83bb0 64 73 20 63 6f 6e 73 74 20 2a 73 71 6c 69 74 65 ds const *sqlite
83bc0 33 4e 6f 6f 70 4d 75 74 65 78 28 76 6f 69 64 29 3NoopMutex(void)
83bd0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
83be0 45 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 E sqlite3_mute
83bf0 78 20 2a 73 71 6c 69 74 65 33 4d 75 74 65 78 41 x *sqlite3MutexA
83c00 6c 6c 6f 63 28 69 6e 74 29 3b 0d 0a 53 51 4c 49 lloc(int);..SQLI
83c10 54 45 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 TE_PRIVATE int
83c20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 sqlite3MutexIni
83c30 74 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 45 t(void);..SQLITE
83c40 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 _PRIVATE int s
83c50 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 76 qlite3MutexEnd(v
83c60 6f 69 64 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d oid);..#endif...
83c70 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
83c80 69 6e 74 20 73 71 6c 69 74 65 33 53 74 61 74 75 int sqlite3Statu
83c90 73 56 61 6c 75 65 28 69 6e 74 29 3b 0d 0a 53 51 sValue(int);..SQ
83ca0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
83cb0 64 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 d sqlite3StatusA
83cc0 64 64 28 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 dd(int, int);..S
83cd0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
83ce0 69 64 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 id sqlite3Status
83cf0 53 65 74 28 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a Set(int, int);..
83d00 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
83d10 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 _OMIT_FLOATING_P
83d20 4f 49 4e 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 OINT..SQLITE_PRI
83d30 56 41 54 45 20 20 20 69 6e 74 20 73 71 6c 69 74 VATE int sqlit
83d40 65 33 49 73 4e 61 4e 28 64 6f 75 62 6c 65 29 3b e3IsNaN(double);
83d50 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
83d60 65 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 58 e sqlite3IsNaN(X
83d70 29 20 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ) 0..#endif....
83d80 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
83d90 6f 69 64 20 73 71 6c 69 74 65 33 56 58 50 72 69 oid sqlite3VXPri
83da0 6e 74 66 28 53 74 72 41 63 63 75 6d 2a 2c 20 69 ntf(StrAccum*, i
83db0 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c nt, const char*,
83dc0 20 76 61 5f 6c 69 73 74 29 3b 0d 0a 23 69 66 6e va_list);..#ifn
83dd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
83de0 54 52 41 43 45 0d 0a 53 51 4c 49 54 45 5f 50 52 TRACE..SQLITE_PR
83df0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
83e00 65 33 58 50 72 69 6e 74 66 28 53 74 72 41 63 63 e3XPrintf(StrAcc
83e10 75 6d 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a um*, const char*
83e20 2c 20 2e 2e 2e 29 3b 0d 0a 23 65 6e 64 69 66 0d , ...);..#endif.
83e30 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
83e40 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4d 50 72 char *sqlite3MPr
83e50 69 6e 74 66 28 73 71 6c 69 74 65 33 2a 2c 63 6f intf(sqlite3*,co
83e60 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b nst char*, ...);
83e70 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
83e80 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 4d char *sqlite3VM
83e90 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 2a 2c Printf(sqlite3*,
83ea0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 76 61 5f const char*, va_
83eb0 6c 69 73 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 list);..SQLITE_P
83ec0 52 49 56 41 54 45 20 63 68 61 72 20 2a 73 71 6c RIVATE char *sql
83ed0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 73 71 6c ite3MAppendf(sql
83ee0 69 74 65 33 2a 2c 63 68 61 72 2a 2c 63 6f 6e 73 ite3*,char*,cons
83ef0 74 20 63 68 61 72 2a 2c 2e 2e 2e 29 3b 0d 0a 23 t char*,...);..#
83f00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
83f10 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e E_TEST) || defin
83f20 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 ed(SQLITE_DEBUG)
83f30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
83f40 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 void sqlite3D
83f50 65 62 75 67 50 72 69 6e 74 66 28 63 6f 6e 73 74 ebugPrintf(const
83f60 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a 23 char*, ...);..#
83f70 65 6e 64 69 66 0d 0a 23 69 66 20 64 65 66 69 6e endif..#if defin
83f80 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0d ed(SQLITE_TEST).
83f90 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
83fa0 20 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 54 void *sqlite3T
83fb0 65 73 74 54 65 78 74 54 6f 50 74 72 28 63 6f 6e estTextToPtr(con
83fc0 73 74 20 63 68 61 72 2a 29 3b 0d 0a 23 65 6e 64 st char*);..#end
83fd0 69 66 0d 0a 0d 0a 2f 2a 20 4f 75 74 70 75 74 20 if..../* Output
83fe0 66 6f 72 6d 61 74 74 69 6e 67 20 66 6f 72 20 53 formatting for S
83ff0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 QLITE_TESTCTRL_E
84000 58 50 4c 41 49 4e 20 2a 2f 0d 0a 23 69 66 20 64 XPLAIN */..#if d
84010 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
84020 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 ABLE_TREE_EXPLAI
84030 4e 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 N)..SQLITE_PRIVA
84040 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
84050 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 56 64 3ExplainBegin(Vd
84060 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 be*);..SQLITE_PR
84070 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c IVATE void sql
84080 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 ite3ExplainPrint
84090 66 28 56 64 62 65 2a 2c 20 63 6f 6e 73 74 20 63 f(Vdbe*, const c
840a0 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a 53 51 4c har*, ...);..SQL
840b0 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
840c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 id sqlite3Explai
840d0 6e 4e 4c 28 56 64 62 65 2a 29 3b 0d 0a 53 51 4c nNL(Vdbe*);..SQL
840e0 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
840f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 id sqlite3Explai
84100 6e 50 75 73 68 28 56 64 62 65 2a 29 3b 0d 0a 53 nPush(Vdbe*);..S
84110 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
84120 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c void sqlite3Expl
84130 61 69 6e 50 6f 70 28 56 64 62 65 2a 29 3b 0d 0a ainPop(Vdbe*);..
84140 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
84150 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 void sqlite3Exp
84160 6c 61 69 6e 46 69 6e 69 73 68 28 56 64 62 65 2a lainFinish(Vdbe*
84170 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
84180 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
84190 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 3ExplainSelect(V
841a0 64 62 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0d dbe*, Select*);.
841b0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
841c0 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 void sqlite3Ex
841d0 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 2a 2c plainExpr(Vdbe*,
841e0 20 45 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 Expr*);..SQLITE
841f0 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 _PRIVATE void
84200 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 sqlite3ExplainEx
84210 70 72 4c 69 73 74 28 56 64 62 65 2a 2c 20 45 78 prList(Vdbe*, Ex
84220 70 72 4c 69 73 74 2a 29 3b 0d 0a 53 51 4c 49 54 prList*);..SQLIT
84230 45 5f 50 52 49 56 41 54 45 20 20 20 63 6f 6e 73 E_PRIVATE cons
84240 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 t char *sqlite3V
84250 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 56 dbeExplanation(V
84260 64 62 65 2a 29 3b 0d 0a 23 65 6c 73 65 0d 0a 23 dbe*);..#else..#
84270 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 45 define sqlite3E
84280 78 70 6c 61 69 6e 42 65 67 69 6e 28 58 29 0d 0a xplainBegin(X)..
84290 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 # define sqlite3
842a0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 41 2c ExplainSelect(A,
842b0 42 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c B)..# define sql
842c0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 ite3ExplainExpr(
842d0 41 2c 42 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 A,B)..# define s
842e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 qlite3ExplainExp
842f0 72 4c 69 73 74 28 41 2c 42 29 0d 0a 23 20 64 65 rList(A,B)..# de
84300 66 69 6e 65 20 73 71 6c 69 74 65 33 45 78 70 6c fine sqlite3Expl
84310 61 69 6e 46 69 6e 69 73 68 28 58 29 0d 0a 23 20 ainFinish(X)..#
84320 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 56 64 define sqlite3Vd
84330 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 58 29 beExplanation(X)
84340 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 0..#endif......
84350 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
84360 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 oid sqlite3SetSt
84370 72 69 6e 67 28 63 68 61 72 20 2a 2a 2c 20 73 71 ring(char **, sq
84380 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 lite3*, const ch
84390 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a 53 51 4c 49 ar*, ...);..SQLI
843a0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
843b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 sqlite3ErrorMsg(
843c0 50 61 72 73 65 2a 2c 20 63 6f 6e 73 74 20 63 68 Parse*, const ch
843d0 61 72 2a 2c 20 2e 2e 2e 29 3b 0d 0a 53 51 4c 49 ar*, ...);..SQLI
843e0 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
843f0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 63 68 qlite3Dequote(ch
84400 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 ar*);..SQLITE_PR
84410 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
84420 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 63 6f 6e 3KeywordCode(con
84430 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
84440 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
84450 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
84460 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 50 61 ite3RunParser(Pa
84470 72 73 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 rse*, const char
84480 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0d 0a 53 51 *, char **);..SQ
84490 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
844a0 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 d sqlite3FinishC
844b0 6f 64 69 6e 67 28 50 61 72 73 65 2a 29 3b 0d 0a oding(Parse*);..
844c0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
844d0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d nt sqlite3GetTem
844e0 70 52 65 67 28 50 61 72 73 65 2a 29 3b 0d 0a 53 pReg(Parse*);..S
844f0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
84500 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 id sqlite3Releas
84510 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 2a 2c eTempReg(Parse*,
84520 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
84530 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
84540 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 3GetTempRange(Pa
84550 72 73 65 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 rse*,int);..SQLI
84560 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
84570 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 sqlite3ReleaseTe
84580 6d 70 52 61 6e 67 65 28 50 61 72 73 65 2a 2c 69 mpRange(Parse*,i
84590 6e 74 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 nt,int);..SQLITE
845a0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
845b0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 lite3ClearTempRe
845c0 67 43 61 63 68 65 28 50 61 72 73 65 2a 29 3b 0d gCache(Parse*);.
845d0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
845e0 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 Expr *sqlite3Exp
845f0 72 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 2a 2c rAlloc(sqlite3*,
84600 69 6e 74 2c 63 6f 6e 73 74 20 54 6f 6b 65 6e 2a int,const Token*
84610 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ,int);..SQLITE_P
84620 52 49 56 41 54 45 20 45 78 70 72 20 2a 73 71 6c RIVATE Expr *sql
84630 69 74 65 33 45 78 70 72 28 73 71 6c 69 74 65 33 ite3Expr(sqlite3
84640 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 *,int,const char
84650 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
84660 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
84670 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 ExprAttachSubtre
84680 65 73 28 73 71 6c 69 74 65 33 2a 2c 45 78 70 72 es(sqlite3*,Expr
84690 2a 2c 45 78 70 72 2a 2c 45 78 70 72 2a 29 3b 0d *,Expr*,Expr*);.
846a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
846b0 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 Expr *sqlite3PEx
846c0 70 72 28 50 61 72 73 65 2a 2c 20 69 6e 74 2c 20 pr(Parse*, int,
846d0 45 78 70 72 2a 2c 20 45 78 70 72 2a 2c 20 63 6f Expr*, Expr*, co
846e0 6e 73 74 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 nst Token*);..SQ
846f0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 45 78 70 LITE_PRIVATE Exp
84700 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e r *sqlite3ExprAn
84710 64 28 73 71 6c 69 74 65 33 2a 2c 45 78 70 72 2a d(sqlite3*,Expr*
84720 2c 20 45 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 , Expr*);..SQLIT
84730 45 5f 50 52 49 56 41 54 45 20 45 78 70 72 20 2a E_PRIVATE Expr *
84740 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 sqlite3ExprFunct
84750 69 6f 6e 28 50 61 72 73 65 2a 2c 45 78 70 72 4c ion(Parse*,ExprL
84760 69 73 74 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a ist*, Token*);..
84770 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
84780 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 oid sqlite3ExprA
84790 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 ssignVarNumber(P
847a0 61 72 73 65 2a 2c 20 45 78 70 72 2a 29 3b 0d 0a arse*, Expr*);..
847b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
847c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 oid sqlite3ExprD
847d0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 2a 2c 20 elete(sqlite3*,
847e0 45 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f Expr*);..SQLITE_
847f0 50 52 49 56 41 54 45 20 45 78 70 72 4c 69 73 74 PRIVATE ExprList
84800 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 *sqlite3ExprLis
84810 74 41 70 70 65 6e 64 28 50 61 72 73 65 2a 2c 45 tAppend(Parse*,E
84820 78 70 72 4c 69 73 74 2a 2c 45 78 70 72 2a 29 3b xprList*,Expr*);
84830 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
84840 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 void sqlite3Exp
84850 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 50 61 72 rListSetName(Par
84860 73 65 2a 2c 45 78 70 72 4c 69 73 74 2a 2c 54 6f se*,ExprList*,To
84870 6b 65 6e 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 ken*,int);..SQLI
84880 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
84890 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 sqlite3ExprListS
848a0 65 74 53 70 61 6e 28 50 61 72 73 65 2a 2c 45 78 etSpan(Parse*,Ex
848b0 70 72 4c 69 73 74 2a 2c 45 78 70 72 53 70 61 6e prList*,ExprSpan
848c0 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
848d0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
848e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 ExprListDelete(s
848f0 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 qlite3*, ExprLis
84900 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 t*);..SQLITE_PRI
84910 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
84920 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 20 63 Init(sqlite3*, c
84930 68 61 72 2a 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f har**);..SQLITE_
84940 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
84950 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 te3InitCallback(
84960 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 68 61 72 void*, int, char
84970 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 53 51 **, char**);..SQ
84980 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
84990 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 d sqlite3Pragma(
849a0 50 61 72 73 65 2a 2c 54 6f 6b 65 6e 2a 2c 54 6f Parse*,Token*,To
849b0 6b 65 6e 2a 2c 54 6f 6b 65 6e 2a 2c 69 6e 74 29 ken*,Token*,int)
849c0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
849d0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 E void sqlite3Re
849e0 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d setInternalSchem
849f0 61 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 29 a(sqlite3*, int)
84a00 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
84a10 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 E void sqlite3Be
84a20 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 2a 2c ginParse(Parse*,
84a30 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
84a40 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
84a50 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c e3CommitInternal
84a60 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 2a Changes(sqlite3*
84a70 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
84a80 54 45 20 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 TE Table *sqlite
84a90 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 3ResultSetOfSele
84aa0 63 74 28 50 61 72 73 65 2a 2c 53 65 6c 65 63 74 ct(Parse*,Select
84ab0 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
84ac0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
84ad0 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 OpenMasterTable(
84ae0 50 61 72 73 65 20 2a 2c 20 69 6e 74 29 3b 0d 0a Parse *, int);..
84af0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
84b00 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 oid sqlite3Start
84b10 54 61 62 6c 65 28 50 61 72 73 65 2a 2c 54 6f 6b Table(Parse*,Tok
84b20 65 6e 2a 2c 54 6f 6b 65 6e 2a 2c 69 6e 74 2c 69 en*,Token*,int,i
84b30 6e 74 2c 69 6e 74 2c 69 6e 74 29 3b 0d 0a 53 51 nt,int,int);..SQ
84b40 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
84b50 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 d sqlite3AddColu
84b60 6d 6e 28 50 61 72 73 65 2a 2c 54 6f 6b 65 6e 2a mn(Parse*,Token*
84b70 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
84b80 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 TE void sqlite3A
84b90 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 2a ddNotNull(Parse*
84ba0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
84bb0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
84bc0 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 ite3AddPrimaryKe
84bd0 79 28 50 61 72 73 65 2a 2c 20 45 78 70 72 4c 69 y(Parse*, ExprLi
84be0 73 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 st*, int, int, i
84bf0 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
84c00 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
84c10 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 3AddCheckConstra
84c20 69 6e 74 28 50 61 72 73 65 2a 2c 20 45 78 70 72 int(Parse*, Expr
84c30 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
84c40 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
84c50 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 AddColumnType(Pa
84c60 72 73 65 2a 2c 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 rse*,Token*);..S
84c70 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
84c80 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 id sqlite3AddDef
84c90 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 2a aultValue(Parse*
84ca0 2c 45 78 70 72 53 70 61 6e 2a 29 3b 0d 0a 53 51 ,ExprSpan*);..SQ
84cb0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
84cc0 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c d sqlite3AddColl
84cd0 61 74 65 54 79 70 65 28 50 61 72 73 65 2a 2c 20 ateType(Parse*,
84ce0 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 Token*);..SQLITE
84cf0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
84d00 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 lite3EndTable(Pa
84d10 72 73 65 2a 2c 54 6f 6b 65 6e 2a 2c 54 6f 6b 65 rse*,Token*,Toke
84d20 6e 2a 2c 53 65 6c 65 63 74 2a 29 3b 0d 0a 53 51 n*,Select*);..SQ
84d30 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
84d40 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 sqlite3ParseUri
84d50 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e (const char*,con
84d60 73 74 20 63 68 61 72 2a 2c 75 6e 73 69 67 6e 65 st char*,unsigne
84d70 64 20 69 6e 74 2a 2c 0d 0a 20 20 20 20 20 20 20 d int*,..
84d80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
84d90 69 74 65 33 5f 76 66 73 2a 2a 2c 63 68 61 72 2a ite3_vfs**,char*
84da0 2a 2c 63 68 61 72 20 2a 2a 29 3b 0d 0a 53 51 4c *,char **);..SQL
84db0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
84dc0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 sqlite3CodeOnce(
84dd0 50 61 72 73 65 20 2a 29 3b 0d 0a 0d 0a 53 51 4c Parse *);....SQL
84de0 49 54 45 5f 50 52 49 56 41 54 45 20 42 69 74 76 ITE_PRIVATE Bitv
84df0 65 63 20 2a 73 71 6c 69 74 65 33 42 69 74 76 65 ec *sqlite3Bitve
84e00 63 43 72 65 61 74 65 28 75 33 32 29 3b 0d 0a 53 cCreate(u32);..S
84e10 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
84e20 74 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 t sqlite3BitvecT
84e30 65 73 74 28 42 69 74 76 65 63 2a 2c 20 75 33 32 est(Bitvec*, u32
84e40 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
84e50 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 69 TE int sqlite3Bi
84e60 74 76 65 63 53 65 74 28 42 69 74 76 65 63 2a 2c tvecSet(Bitvec*,
84e70 20 75 33 32 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 u32);..SQLITE_P
84e80 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
84e90 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 42 te3BitvecClear(B
84ea0 69 74 76 65 63 2a 2c 20 75 33 32 2c 20 76 6f 69 itvec*, u32, voi
84eb0 64 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 d*);..SQLITE_PRI
84ec0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
84ed0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 42 3BitvecDestroy(B
84ee0 69 74 76 65 63 2a 29 3b 0d 0a 53 51 4c 49 54 45 itvec*);..SQLITE
84ef0 5f 50 52 49 56 41 54 45 20 75 33 32 20 73 71 6c _PRIVATE u32 sql
84f00 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 42 ite3BitvecSize(B
84f10 69 74 76 65 63 2a 29 3b 0d 0a 53 51 4c 49 54 45 itvec*);..SQLITE
84f20 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
84f30 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 ite3BitvecBuilti
84f40 6e 54 65 73 74 28 69 6e 74 2c 69 6e 74 2a 29 3b nTest(int,int*);
84f50 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ....SQLITE_PRIVA
84f60 54 45 20 52 6f 77 53 65 74 20 2a 73 71 6c 69 74 TE RowSet *sqlit
84f70 65 33 52 6f 77 53 65 74 49 6e 69 74 28 73 71 6c e3RowSetInit(sql
84f80 69 74 65 33 2a 2c 20 76 6f 69 64 2a 2c 20 75 6e ite3*, void*, un
84f90 73 69 67 6e 65 64 20 69 6e 74 29 3b 0d 0a 53 51 signed int);..SQ
84fa0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
84fb0 64 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 d sqlite3RowSetC
84fc0 6c 65 61 72 28 52 6f 77 53 65 74 2a 29 3b 0d 0a lear(RowSet*);..
84fd0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
84fe0 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 53 65 oid sqlite3RowSe
84ff0 74 49 6e 73 65 72 74 28 52 6f 77 53 65 74 2a 2c tInsert(RowSet*,
85000 20 69 36 34 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 i64);..SQLITE_P
85010 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
85020 65 33 52 6f 77 53 65 74 54 65 73 74 28 52 6f 77 e3RowSetTest(Row
85030 53 65 74 2a 2c 20 75 38 20 69 42 61 74 63 68 2c Set*, u8 iBatch,
85040 20 69 36 34 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 i64);..SQLITE_P
85050 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
85060 65 33 52 6f 77 53 65 74 4e 65 78 74 28 52 6f 77 e3RowSetNext(Row
85070 53 65 74 2a 2c 20 69 36 34 2a 29 3b 0d 0a 0d 0a Set*, i64*);....
85080 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
85090 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 oid sqlite3Creat
850a0 65 56 69 65 77 28 50 61 72 73 65 2a 2c 54 6f 6b eView(Parse*,Tok
850b0 65 6e 2a 2c 54 6f 6b 65 6e 2a 2c 54 6f 6b 65 6e en*,Token*,Token
850c0 2a 2c 53 65 6c 65 63 74 2a 2c 69 6e 74 2c 69 6e *,Select*,int,in
850d0 74 29 3b 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 t);....#if !defi
850e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
850f0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 VIEW) || !define
85100 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 d(SQLITE_OMIT_VI
85110 52 54 55 41 4c 54 41 42 4c 45 29 0d 0a 53 51 4c RTUALTABLE)..SQL
85120 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 69 6e ITE_PRIVATE in
85130 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 t sqlite3ViewGet
85140 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 ColumnNames(Pars
85150 65 2a 2c 54 61 62 6c 65 2a 29 3b 0d 0a 23 65 6c e*,Table*);..#el
85160 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c se..# define sql
85170 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d ite3ViewGetColum
85180 6e 4e 61 6d 65 73 28 41 2c 42 29 20 30 0d 0a 23 nNames(A,B) 0..#
85190 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f endif....SQLITE_
851a0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
851b0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 ite3DropTable(Pa
851c0 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 2a 2c 20 rse*, SrcList*,
851d0 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 int, int);..SQLI
851e0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
851f0 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 sqlite3CodeDropT
85200 61 62 6c 65 28 50 61 72 73 65 2a 2c 20 54 61 62 able(Parse*, Tab
85210 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d le*, int, int);.
85220 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
85230 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 void sqlite3Dele
85240 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 2a teTable(sqlite3*
85250 2c 20 54 61 62 6c 65 2a 29 3b 0d 0a 23 69 66 6e , Table*);..#ifn
85260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
85270 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0d 0a 53 AUTOINCREMENT..S
85280 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
85290 76 6f 69 64 20 73 71 6c 69 74 65 33 41 75 74 6f void sqlite3Auto
852a0 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 50 incrementBegin(P
852b0 61 72 73 65 20 2a 70 50 61 72 73 65 29 3b 0d 0a arse *pParse);..
852c0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
852d0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 75 74 void sqlite3Aut
852e0 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 50 61 oincrementEnd(Pa
852f0 72 73 65 20 2a 70 50 61 72 73 65 29 3b 0d 0a 23 rse *pParse);..#
85300 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 73 else..# define s
85310 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d qlite3Autoincrem
85320 65 6e 74 42 65 67 69 6e 28 58 29 0d 0a 23 20 64 entBegin(X)..# d
85330 65 66 69 6e 65 20 73 71 6c 69 74 65 33 41 75 74 efine sqlite3Aut
85340 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 58 29 oincrementEnd(X)
85350 0d 0a 23 65 6e 64 69 66 0d 0a 53 51 4c 49 54 45 ..#endif..SQLITE
85360 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
85370 6c 69 74 65 33 49 6e 73 65 72 74 28 50 61 72 73 lite3Insert(Pars
85380 65 2a 2c 20 53 72 63 4c 69 73 74 2a 2c 20 45 78 e*, SrcList*, Ex
85390 70 72 4c 69 73 74 2a 2c 20 53 65 6c 65 63 74 2a prList*, Select*
853a0 2c 20 49 64 4c 69 73 74 2a 2c 20 69 6e 74 29 3b , IdList*, int);
853b0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
853c0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 void *sqlite3Ar
853d0 72 61 79 41 6c 6c 6f 63 61 74 65 28 73 71 6c 69 rayAllocate(sqli
853e0 74 65 33 2a 2c 76 6f 69 64 2a 2c 69 6e 74 2c 69 te3*,void*,int,i
853f0 6e 74 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 nt,int*,int*,int
85400 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
85410 41 54 45 20 49 64 4c 69 73 74 20 2a 73 71 6c 69 ATE IdList *sqli
85420 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 te3IdListAppend(
85430 73 71 6c 69 74 65 33 2a 2c 20 49 64 4c 69 73 74 sqlite3*, IdList
85440 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c *, Token*);..SQL
85450 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
85460 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 sqlite3IdListInd
85470 65 78 28 49 64 4c 69 73 74 2a 2c 63 6f 6e 73 74 ex(IdList*,const
85480 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 char*);..SQLITE
85490 5f 50 52 49 56 41 54 45 20 53 72 63 4c 69 73 74 _PRIVATE SrcList
854a0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 *sqlite3SrcList
854b0 45 6e 6c 61 72 67 65 28 73 71 6c 69 74 65 33 2a Enlarge(sqlite3*
854c0 2c 20 53 72 63 4c 69 73 74 2a 2c 20 69 6e 74 2c , SrcList*, int,
854d0 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
854e0 52 49 56 41 54 45 20 53 72 63 4c 69 73 74 20 2a RIVATE SrcList *
854f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 sqlite3SrcListAp
85500 70 65 6e 64 28 73 71 6c 69 74 65 33 2a 2c 20 53 pend(sqlite3*, S
85510 72 63 4c 69 73 74 2a 2c 20 54 6f 6b 65 6e 2a 2c rcList*, Token*,
85520 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c 49 54 Token*);..SQLIT
85530 45 5f 50 52 49 56 41 54 45 20 53 72 63 4c 69 73 E_PRIVATE SrcLis
85540 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 t *sqlite3SrcLis
85550 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 tAppendFromTerm(
85560 50 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 2a Parse*, SrcList*
85570 2c 20 54 6f 6b 65 6e 2a 2c 20 54 6f 6b 65 6e 2a , Token*, Token*
85580 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
85590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
855a0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 2a 2c Token*,
855b0 20 53 65 6c 65 63 74 2a 2c 20 45 78 70 72 2a 2c Select*, Expr*,
855c0 20 49 64 4c 69 73 74 2a 29 3b 0d 0a 53 51 4c 49 IdList*);..SQLI
855d0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
855e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e sqlite3SrcListIn
855f0 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 2c dexedBy(Parse *,
85600 20 53 72 63 4c 69 73 74 20 2a 2c 20 54 6f 6b 65 SrcList *, Toke
85610 6e 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 n *);..SQLITE_PR
85620 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
85630 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 3IndexedByLookup
85640 28 50 61 72 73 65 20 2a 2c 20 73 74 72 75 63 74 (Parse *, struct
85650 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 29 SrcList_item *)
85660 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
85670 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 E void sqlite3Sr
85680 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 cListShiftJoinTy
85690 70 65 28 53 72 63 4c 69 73 74 2a 29 3b 0d 0a 53 pe(SrcList*);..S
856a0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
856b0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 id sqlite3SrcLis
856c0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 tAssignCursors(P
856d0 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 2a 29 arse*, SrcList*)
856e0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
856f0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 E void sqlite3Id
85700 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 ListDelete(sqlit
85710 65 33 2a 2c 20 49 64 4c 69 73 74 2a 29 3b 0d 0a e3*, IdList*);..
85720 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
85730 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 oid sqlite3SrcLi
85740 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 stDelete(sqlite3
85750 2a 2c 20 53 72 63 4c 69 73 74 2a 29 3b 0d 0a 53 *, SrcList*);..S
85760 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 49 6e QLITE_PRIVATE In
85770 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 dex *sqlite3Crea
85780 74 65 49 6e 64 65 78 28 50 61 72 73 65 2a 2c 54 teIndex(Parse*,T
85790 6f 6b 65 6e 2a 2c 54 6f 6b 65 6e 2a 2c 53 72 63 oken*,Token*,Src
857a0 4c 69 73 74 2a 2c 45 78 70 72 4c 69 73 74 2a 2c List*,ExprList*,
857b0 69 6e 74 2c 54 6f 6b 65 6e 2a 2c 0d 0a 20 20 20 int,Token*,..
857c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
857d0 20 20 20 20 20 54 6f 6b 65 6e 2a 2c 20 69 6e 74 Token*, int
857e0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
857f0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
85800 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 ite3DropIndex(Pa
85810 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 2a 2c 20 rse*, SrcList*,
85820 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
85830 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
85840 33 53 65 6c 65 63 74 28 50 61 72 73 65 2a 2c 20 3Select(Parse*,
85850 53 65 6c 65 63 74 2a 2c 20 53 65 6c 65 63 74 44 Select*, SelectD
85860 65 73 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 est*);..SQLITE_P
85870 52 49 56 41 54 45 20 53 65 6c 65 63 74 20 2a 73 RIVATE Select *s
85880 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 qlite3SelectNew(
85890 50 61 72 73 65 2a 2c 45 78 70 72 4c 69 73 74 2a Parse*,ExprList*
858a0 2c 53 72 63 4c 69 73 74 2a 2c 45 78 70 72 2a 2c ,SrcList*,Expr*,
858b0 45 78 70 72 4c 69 73 74 2a 2c 0d 0a 20 20 20 20 ExprList*,..
858c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
858d0 20 20 20 20 20 45 78 70 72 2a 2c 45 78 70 72 4c Expr*,ExprL
858e0 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 2a 2c 45 ist*,int,Expr*,E
858f0 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 xpr*);..SQLITE_P
85900 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
85910 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 te3SelectDelete(
85920 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 sqlite3*, Select
85930 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
85940 41 54 45 20 54 61 62 6c 65 20 2a 73 71 6c 69 74 ATE Table *sqlit
85950 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 e3SrcListLookup(
85960 50 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 2a Parse*, SrcList*
85970 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
85980 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 49 73 TE int sqlite3Is
85990 52 65 61 64 4f 6e 6c 79 28 50 61 72 73 65 2a 2c ReadOnly(Parse*,
859a0 20 54 61 62 6c 65 2a 2c 20 69 6e 74 29 3b 0d 0a Table*, int);..
859b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
859c0 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 oid sqlite3OpenT
859d0 61 62 6c 65 28 50 61 72 73 65 2a 2c 20 69 6e 74 able(Parse*, int
859e0 20 69 43 75 72 2c 20 69 6e 74 20 69 44 62 2c 20 iCur, int iDb,
859f0 54 61 62 6c 65 2a 2c 20 69 6e 74 29 3b 0d 0a 23 Table*, int);..#
85a00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
85a10 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f E_ENABLE_UPDATE_
85a20 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 DELETE_LIMIT) &&
85a30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
85a40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0d _OMIT_SUBQUERY).
85a50 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
85a60 45 78 70 72 20 2a 73 71 6c 69 74 65 33 4c 69 6d Expr *sqlite3Lim
85a70 69 74 57 68 65 72 65 28 50 61 72 73 65 20 2a 2c itWhere(Parse *,
85a80 20 53 72 63 4c 69 73 74 20 2a 2c 20 45 78 70 72 SrcList *, Expr
85a90 20 2a 2c 20 45 78 70 72 4c 69 73 74 20 2a 2c 20 *, ExprList *,
85aa0 45 78 70 72 20 2a 2c 20 45 78 70 72 20 2a 2c 20 Expr *, Expr *,
85ab0 63 68 61 72 20 2a 29 3b 0d 0a 23 65 6e 64 69 66 char *);..#endif
85ac0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
85ad0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c void sqlite3Del
85ae0 65 74 65 46 72 6f 6d 28 50 61 72 73 65 2a 2c 20 eteFrom(Parse*,
85af0 53 72 63 4c 69 73 74 2a 2c 20 45 78 70 72 2a 29 SrcList*, Expr*)
85b00 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
85b10 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 55 70 E void sqlite3Up
85b20 64 61 74 65 28 50 61 72 73 65 2a 2c 20 53 72 63 date(Parse*, Src
85b30 4c 69 73 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a List*, ExprList*
85b40 2c 20 45 78 70 72 2a 2c 20 69 6e 74 29 3b 0d 0a , Expr*, int);..
85b50 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 57 SQLITE_PRIVATE W
85b60 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 hereInfo *sqlite
85b70 33 57 68 65 72 65 42 65 67 69 6e 28 50 61 72 73 3WhereBegin(Pars
85b80 65 2a 2c 20 53 72 63 4c 69 73 74 2a 2c 20 45 78 e*, SrcList*, Ex
85b90 70 72 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2a 2c pr*, ExprList**,
85ba0 45 78 70 72 4c 69 73 74 2a 2c 75 31 36 29 3b 0d ExprList*,u16);.
85bb0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
85bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 void sqlite3Wher
85bd0 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 2a 29 eEnd(WhereInfo*)
85be0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
85bf0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 E int sqlite3Exp
85c00 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 50 rCodeGetColumn(P
85c10 61 72 73 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 69 arse*, Table*, i
85c20 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a nt, int, int);..
85c30 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
85c40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 oid sqlite3ExprC
85c50 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 odeGetColumnOfTa
85c60 62 6c 65 28 56 64 62 65 2a 2c 20 54 61 62 6c 65 ble(Vdbe*, Table
85c70 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 *, int, int, int
85c80 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
85c90 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 TE void sqlite3E
85ca0 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 xprCodeMove(Pars
85cb0 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e e*, int, int, in
85cc0 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
85cd0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
85ce0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 ExprCodeCopy(Par
85cf0 73 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 se*, int, int, i
85d00 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
85d10 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
85d20 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 3ExprCacheStore(
85d30 50 61 72 73 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 Parse*, int, int
85d40 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
85d50 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
85d60 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 ite3ExprCachePus
85d70 68 28 50 61 72 73 65 2a 29 3b 0d 0a 53 51 4c 49 h(Parse*);..SQLI
85d80 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
85d90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 sqlite3ExprCache
85da0 50 6f 70 28 50 61 72 73 65 2a 2c 20 69 6e 74 29 Pop(Parse*, int)
85db0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
85dc0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 E void sqlite3Ex
85dd0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 prCacheRemove(Pa
85de0 72 73 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b rse*, int, int);
85df0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
85e00 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 void sqlite3Exp
85e10 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 rCacheClear(Pars
85e20 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 e*);..SQLITE_PRI
85e30 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
85e40 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 3ExprCacheAffini
85e50 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 2a 2c tyChange(Parse*,
85e60 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c int, int);..SQL
85e70 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
85e80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 sqlite3ExprCode(
85e90 50 61 72 73 65 2a 2c 20 45 78 70 72 2a 2c 20 69 Parse*, Expr*, i
85ea0 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
85eb0 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
85ec0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 ExprCodeTemp(Par
85ed0 73 65 2a 2c 20 45 78 70 72 2a 2c 20 69 6e 74 2a se*, Expr*, int*
85ee0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
85ef0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 TE int sqlite3Ex
85f00 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 prCodeTarget(Par
85f10 73 65 2a 2c 20 45 78 70 72 2a 2c 20 69 6e 74 29 se*, Expr*, int)
85f20 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
85f30 45 20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 E int sqlite3Exp
85f40 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 rCodeAndCache(Pa
85f50 72 73 65 2a 2c 20 45 78 70 72 2a 2c 20 69 6e 74 rse*, Expr*, int
85f60 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
85f70 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 TE void sqlite3E
85f80 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 xprCodeConstants
85f90 28 50 61 72 73 65 2a 2c 20 45 78 70 72 2a 29 3b (Parse*, Expr*);
85fa0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
85fb0 20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 int sqlite3Expr
85fc0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 50 61 72 CodeExprList(Par
85fd0 73 65 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 se*, ExprList*,
85fe0 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 int, int);..SQLI
85ff0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
86000 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 sqlite3ExprIfTru
86010 65 28 50 61 72 73 65 2a 2c 20 45 78 70 72 2a 2c e(Parse*, Expr*,
86020 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c int, int);..SQL
86030 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
86040 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 sqlite3ExprIfFa
86050 6c 73 65 28 50 61 72 73 65 2a 2c 20 45 78 70 72 lse(Parse*, Expr
86060 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 *, int, int);..S
86070 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 54 61 QLITE_PRIVATE Ta
86080 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 ble *sqlite3Find
86090 54 61 62 6c 65 28 73 71 6c 69 74 65 33 2a 2c 63 Table(sqlite3*,c
860a0 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 6f 6e 73 onst char*, cons
860b0 74 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 t char*);..SQLIT
860c0 45 5f 50 52 49 56 41 54 45 20 54 61 62 6c 65 20 E_PRIVATE Table
860d0 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 *sqlite3LocateTa
860e0 62 6c 65 28 50 61 72 73 65 2a 2c 69 6e 74 20 69 ble(Parse*,int i
860f0 73 56 69 65 77 2c 63 6f 6e 73 74 20 63 68 61 72 sView,const char
86100 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b *, const char*);
86110 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
86120 20 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 Index *sqlite3F
86130 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 indIndex(sqlite3
86140 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 *,const char*, c
86150 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0d 0a 53 51 onst char*);..SQ
86160 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
86170 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 d sqlite3UnlinkA
86180 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 ndDeleteTable(sq
86190 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 6f 6e 73 74 lite3*,int,const
861a0 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 char*);..SQLITE
861b0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
861c0 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 lite3UnlinkAndDe
861d0 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 leteIndex(sqlite
861e0 33 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 3*,int,const cha
861f0 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 r*);..SQLITE_PRI
86200 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
86210 33 56 61 63 75 75 6d 28 50 61 72 73 65 2a 29 3b 3Vacuum(Parse*);
86220 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
86230 20 69 6e 74 20 73 71 6c 69 74 65 33 52 75 6e 56 int sqlite3RunV
86240 61 63 75 75 6d 28 63 68 61 72 2a 2a 2c 20 73 71 acuum(char**, sq
86250 6c 69 74 65 33 2a 29 3b 0d 0a 53 51 4c 49 54 45 lite3*);..SQLITE
86260 5f 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 73 _PRIVATE char *s
86270 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f qlite3NameFromTo
86280 6b 65 6e 28 73 71 6c 69 74 65 33 2a 2c 20 54 6f ken(sqlite3*, To
86290 6b 65 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ken*);..SQLITE_P
862a0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
862b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 e3ExprCompare(Ex
862c0 70 72 2a 2c 20 45 78 70 72 2a 29 3b 0d 0a 53 51 pr*, Expr*);..SQ
862d0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
862e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 sqlite3ExprList
862f0 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 Compare(ExprList
86300 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0d 0a *, ExprList*);..
86310 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
86320 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 oid sqlite3ExprA
86330 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 nalyzeAggregates
86340 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 2c 20 45 (NameContext*, E
86350 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 xpr*);..SQLITE_P
86360 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
86370 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 te3ExprAnalyzeAg
86380 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 gList(NameContex
86390 74 2a 2c 45 78 70 72 4c 69 73 74 2a 29 3b 0d 0a t*,ExprList*);..
863a0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 56 SQLITE_PRIVATE V
863b0 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 dbe *sqlite3GetV
863c0 64 62 65 28 50 61 72 73 65 2a 29 3b 0d 0a 53 51 dbe(Parse*);..SQ
863d0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
863e0 64 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 d sqlite3PrngSav
863f0 65 53 74 61 74 65 28 76 6f 69 64 29 3b 0d 0a 53 eState(void);..S
86400 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
86410 69 64 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 id sqlite3PrngRe
86420 73 74 6f 72 65 53 74 61 74 65 28 76 6f 69 64 29 storeState(void)
86430 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
86440 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 E void sqlite3Pr
86450 6e 67 52 65 73 65 74 53 74 61 74 65 28 76 6f 69 ngResetState(voi
86460 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 d);..SQLITE_PRIV
86470 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
86480 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 RollbackAll(sqli
86490 74 65 33 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 te3*);..SQLITE_P
864a0 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
864b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 te3CodeVerifySch
864c0 65 6d 61 28 50 61 72 73 65 2a 2c 20 69 6e 74 29 ema(Parse*, int)
864d0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
864e0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f E void sqlite3Co
864f0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 deVerifyNamedSch
86500 65 6d 61 28 50 61 72 73 65 2a 2c 20 63 6f 6e 73 ema(Parse*, cons
86510 74 20 63 68 61 72 20 2a 7a 44 62 29 3b 0d 0a 53 t char *zDb);..S
86520 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
86530 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 id sqlite3BeginT
86540 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 ransaction(Parse
86550 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
86560 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
86570 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 lite3CommitTrans
86580 61 63 74 69 6f 6e 28 50 61 72 73 65 2a 29 3b 0d action(Parse*);.
86590 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
865a0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c void sqlite3Roll
865b0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 backTransaction(
865c0 50 61 72 73 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 Parse*);..SQLITE
865d0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
865e0 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 lite3Savepoint(P
865f0 61 72 73 65 2a 2c 20 69 6e 74 2c 20 54 6f 6b 65 arse*, int, Toke
86600 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 n*);..SQLITE_PRI
86610 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
86620 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 3CloseSavepoints
86630 28 73 71 6c 69 74 65 33 20 2a 29 3b 0d 0a 53 51 (sqlite3 *);..SQ
86640 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
86650 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f sqlite3ExprIsCo
86660 6e 73 74 61 6e 74 28 45 78 70 72 2a 29 3b 0d 0a nstant(Expr*);..
86670 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
86680 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 nt sqlite3ExprIs
86690 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 ConstantNotJoin(
866a0 45 78 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f Expr*);..SQLITE_
866b0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
866c0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e te3ExprIsConstan
866d0 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 tOrFunction(Expr
866e0 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
866f0 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 45 ATE int sqlite3E
86700 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 xprIsInteger(Exp
86710 72 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 4c 49 r*, int*);..SQLI
86720 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
86730 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e qlite3ExprCanBeN
86740 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 2a 29 ull(const Expr*)
86750 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
86760 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 E void sqlite3Ex
86770 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 prCodeIsNullJump
86780 28 56 64 62 65 2a 2c 20 63 6f 6e 73 74 20 45 78 (Vdbe*, const Ex
86790 70 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d pr*, int, int);.
867a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
867b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e int sqlite3ExprN
867c0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 eedsNoAffinityCh
867d0 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 2a ange(const Expr*
867e0 2c 20 63 68 61 72 29 3b 0d 0a 53 51 4c 49 54 45 , char);..SQLITE
867f0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
86800 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 ite3IsRowid(cons
86810 74 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 t char*);..SQLIT
86820 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
86830 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f qlite3GenerateRo
86840 77 44 65 6c 65 74 65 28 50 61 72 73 65 2a 2c 20 wDelete(Parse*,
86850 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 Table*, int, int
86860 2c 20 69 6e 74 2c 20 54 72 69 67 67 65 72 20 2a , int, Trigger *
86870 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
86880 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
86890 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 ite3GenerateRowI
868a0 6e 64 65 78 44 65 6c 65 74 65 28 50 61 72 73 65 ndexDelete(Parse
868b0 2a 2c 20 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 *, Table*, int,
868c0 69 6e 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int*);..SQLITE_P
868d0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
868e0 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b e3GenerateIndexK
868f0 65 79 28 50 61 72 73 65 2a 2c 20 49 6e 64 65 78 ey(Parse*, Index
86900 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 *, int, int, int
86910 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
86920 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 47 TE void sqlite3G
86930 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e enerateConstrain
86940 74 43 68 65 63 6b 73 28 50 61 72 73 65 2a 2c 54 tChecks(Parse*,T
86950 61 62 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 0d 0a able*,int,int,..
86960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
86970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
86980 20 20 20 20 20 69 6e 74 2a 2c 69 6e 74 2c 69 6e int*,int,in
86990 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2a 29 3b t,int,int,int*);
869a0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
869b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d void sqlite3Com
869c0 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 50 pleteInsertion(P
869d0 61 72 73 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 69 arse*, Table*, i
869e0 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2a 2c 20 69 nt, int, int*, i
869f0 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a nt, int, int);..
86a00 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
86a10 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 nt sqlite3OpenTa
86a20 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 50 61 bleAndIndices(Pa
86a30 72 73 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 69 6e rse*, Table*, in
86a40 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 t, int);..SQLITE
86a50 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
86a60 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f lite3BeginWriteO
86a70 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 2a 2c peration(Parse*,
86a80 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c int, int);..SQL
86a90 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
86aa0 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 sqlite3MultiWri
86ab0 74 65 28 50 61 72 73 65 2a 29 3b 0d 0a 53 51 4c te(Parse*);..SQL
86ac0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
86ad0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 sqlite3MayAbort
86ae0 28 50 61 72 73 65 2a 29 3b 0d 0a 53 51 4c 49 54 (Parse*);..SQLIT
86af0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
86b00 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 qlite3HaltConstr
86b10 61 69 6e 74 28 50 61 72 73 65 2a 2c 20 69 6e 74 aint(Parse*, int
86b20 2c 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0d 0a , char*, int);..
86b30 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 45 SQLITE_PRIVATE E
86b40 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 xpr *sqlite3Expr
86b50 44 75 70 28 73 71 6c 69 74 65 33 2a 2c 45 78 70 Dup(sqlite3*,Exp
86b60 72 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 r*,int);..SQLITE
86b70 5f 50 52 49 56 41 54 45 20 45 78 70 72 4c 69 73 _PRIVATE ExprLis
86b80 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 t *sqlite3ExprLi
86b90 73 74 44 75 70 28 73 71 6c 69 74 65 33 2a 2c 45 stDup(sqlite3*,E
86ba0 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b 0d 0a xprList*,int);..
86bb0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 53 SQLITE_PRIVATE S
86bc0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 rcList *sqlite3S
86bd0 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 rcListDup(sqlite
86be0 33 2a 2c 53 72 63 4c 69 73 74 2a 2c 69 6e 74 29 3*,SrcList*,int)
86bf0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
86c00 45 20 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 E IdList *sqlite
86c10 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 3IdListDup(sqlit
86c20 65 33 2a 2c 49 64 4c 69 73 74 2a 29 3b 0d 0a 53 e3*,IdList*);..S
86c30 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 53 65 QLITE_PRIVATE Se
86c40 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c lect *sqlite3Sel
86c50 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 2a 2c ectDup(sqlite3*,
86c60 53 65 6c 65 63 74 2a 2c 69 6e 74 29 3b 0d 0a 53 Select*,int);..S
86c70 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
86c80 69 64 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 id sqlite3FuncDe
86c90 66 49 6e 73 65 72 74 28 46 75 6e 63 44 65 66 48 fInsert(FuncDefH
86ca0 61 73 68 2a 2c 20 46 75 6e 63 44 65 66 2a 29 3b ash*, FuncDef*);
86cb0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
86cc0 20 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65 FuncDef *sqlite
86cd0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 73 71 3FindFunction(sq
86ce0 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 lite3*,const cha
86cf0 72 2a 2c 69 6e 74 2c 69 6e 74 2c 75 38 2c 69 6e r*,int,int,u8,in
86d00 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
86d10 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
86d20 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 RegisterBuiltinF
86d30 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 unctions(sqlite3
86d40 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
86d50 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
86d60 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 RegisterDateTime
86d70 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 3b Functions(void);
86d80 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
86d90 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 void sqlite3Reg
86da0 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 isterGlobalFunct
86db0 69 6f 6e 73 28 76 6f 69 64 29 3b 0d 0a 53 51 4c ions(void);..SQL
86dc0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
86dd0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 sqlite3SafetyChe
86de0 63 6b 4f 6b 28 73 71 6c 69 74 65 33 2a 29 3b 0d ckOk(sqlite3*);.
86df0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
86e00 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 74 int sqlite3Safet
86e10 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 73 yCheckSickOrOk(s
86e20 71 6c 69 74 65 33 2a 29 3b 0d 0a 53 51 4c 49 54 qlite3*);..SQLIT
86e30 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
86e40 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b qlite3ChangeCook
86e50 69 65 28 50 61 72 73 65 2a 2c 20 69 6e 74 29 3b ie(Parse*, int);
86e60 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 ....#if !defined
86e70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 (SQLITE_OMIT_VIE
86e80 57 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 W) && !defined(S
86e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 QLITE_OMIT_TRIGG
86ea0 45 52 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ER)..SQLITE_PRIV
86eb0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
86ec0 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 MaterializeView(
86ed0 50 61 72 73 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 Parse*, Table*,
86ee0 45 78 70 72 2a 2c 20 69 6e 74 29 3b 0d 0a 23 65 Expr*, int);..#e
86ef0 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 ndif....#ifndef
86f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 SQLITE_OMIT_TRIG
86f10 47 45 52 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 GER..SQLITE_PRIV
86f20 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
86f30 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28 50 e3BeginTrigger(P
86f40 61 72 73 65 2a 2c 20 54 6f 6b 65 6e 2a 2c 54 6f arse*, Token*,To
86f50 6b 65 6e 2a 2c 69 6e 74 2c 69 6e 74 2c 49 64 4c ken*,int,int,IdL
86f60 69 73 74 2a 2c 53 72 63 4c 69 73 74 2a 2c 0d 0a ist*,SrcList*,..
86f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
86f80 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 2a Expr*
86f90 2c 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c ,int, int);..SQL
86fa0 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
86fb0 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 id sqlite3Finish
86fc0 54 72 69 67 67 65 72 28 50 61 72 73 65 2a 2c 20 Trigger(Parse*,
86fd0 54 72 69 67 67 65 72 53 74 65 70 2a 2c 20 54 6f TriggerStep*, To
86fe0 6b 65 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ken*);..SQLITE_P
86ff0 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 RIVATE void sq
87000 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 lite3DropTrigger
87010 28 50 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 (Parse*, SrcList
87020 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
87030 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 _PRIVATE void
87040 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 sqlite3DropTrigg
87050 65 72 50 74 72 28 50 61 72 73 65 2a 2c 20 54 72 erPtr(Parse*, Tr
87060 69 67 67 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 igger*);..SQLITE
87070 5f 50 52 49 56 41 54 45 20 20 20 54 72 69 67 67 _PRIVATE Trigg
87080 65 72 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 er *sqlite3Trigg
87090 65 72 73 45 78 69 73 74 28 50 61 72 73 65 20 2a ersExist(Parse *
870a0 2c 20 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 45 , Table*, int, E
870b0 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 20 2a 70 xprList*, int *p
870c0 4d 61 73 6b 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 Mask);..SQLITE_P
870d0 52 49 56 41 54 45 20 20 20 54 72 69 67 67 65 72 RIVATE Trigger
870e0 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 *sqlite3Trigger
870f0 4c 69 73 74 28 50 61 72 73 65 20 2a 2c 20 54 61 List(Parse *, Ta
87100 62 6c 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f ble *);..SQLITE_
87110 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 PRIVATE void s
87120 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 qlite3CodeRowTri
87130 67 67 65 72 28 50 61 72 73 65 2a 2c 20 54 72 69 gger(Parse*, Tri
87140 67 67 65 72 20 2a 2c 20 69 6e 74 2c 20 45 78 70 gger *, int, Exp
87150 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 54 61 62 rList*, int, Tab
87160 6c 65 20 2a 2c 0d 0a 20 20 20 20 20 20 20 20 20 le *,..
87170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
87180 20 20 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 int, int, int
87190 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
871a0 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
871b0 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 44 3CodeRowTriggerD
871c0 69 72 65 63 74 28 50 61 72 73 65 20 2a 2c 20 54 irect(Parse *, T
871d0 72 69 67 67 65 72 20 2a 2c 20 54 61 62 6c 65 20 rigger *, Table
871e0 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 *, int, int, int
871f0 29 3b 0d 0a 20 20 76 6f 69 64 20 73 71 6c 69 74 );.. void sqlit
87200 65 56 69 65 77 54 72 69 67 67 65 72 73 28 50 61 eViewTriggers(Pa
87210 72 73 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 45 78 rse*, Table*, Ex
87220 70 72 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 pr*, int, ExprLi
87230 73 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 st*);..SQLITE_PR
87240 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c IVATE void sql
87250 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 ite3DeleteTrigge
87260 72 53 74 65 70 28 73 71 6c 69 74 65 33 2a 2c 20 rStep(sqlite3*,
87270 54 72 69 67 67 65 72 53 74 65 70 2a 29 3b 0d 0a TriggerStep*);..
87280 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
87290 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 TriggerStep *sq
872a0 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65 lite3TriggerSele
872b0 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 2a 2c ctStep(sqlite3*,
872c0 53 65 6c 65 63 74 2a 29 3b 0d 0a 53 51 4c 49 54 Select*);..SQLIT
872d0 45 5f 50 52 49 56 41 54 45 20 20 20 54 72 69 67 E_PRIVATE Trig
872e0 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 gerStep *sqlite3
872f0 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 TriggerInsertSte
87300 70 28 73 71 6c 69 74 65 33 2a 2c 54 6f 6b 65 6e p(sqlite3*,Token
87310 2a 2c 20 49 64 4c 69 73 74 2a 2c 0d 0a 20 20 20 *, IdList*,..
87320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
87330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
87340 20 20 20 20 20 45 78 70 72 4c 69 73 74 2a 2c 53 ExprList*,S
87350 65 6c 65 63 74 2a 2c 75 38 29 3b 0d 0a 53 51 4c elect*,u8);..SQL
87360 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 54 72 ITE_PRIVATE Tr
87370 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 iggerStep *sqlit
87380 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53 e3TriggerUpdateS
87390 74 65 70 28 73 71 6c 69 74 65 33 2a 2c 54 6f 6b tep(sqlite3*,Tok
873a0 65 6e 2a 2c 45 78 70 72 4c 69 73 74 2a 2c 20 45 en*,ExprList*, E
873b0 78 70 72 2a 2c 20 75 38 29 3b 0d 0a 53 51 4c 49 xpr*, u8);..SQLI
873c0 54 45 5f 50 52 49 56 41 54 45 20 20 20 54 72 69 TE_PRIVATE Tri
873d0 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 ggerStep *sqlite
873e0 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74 3TriggerDeleteSt
873f0 65 70 28 73 71 6c 69 74 65 33 2a 2c 54 6f 6b 65 ep(sqlite3*,Toke
87400 6e 2a 2c 20 45 78 70 72 2a 29 3b 0d 0a 53 51 4c n*, Expr*);..SQL
87410 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
87420 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 id sqlite3Delete
87430 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 2a Trigger(sqlite3*
87440 2c 20 54 72 69 67 67 65 72 2a 29 3b 0d 0a 53 51 , Trigger*);..SQ
87450 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 LITE_PRIVATE v
87460 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e oid sqlite3Unlin
87470 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 kAndDeleteTrigge
87480 72 28 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 r(sqlite3*,int,c
87490 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0d 0a 53 51 onst char*);..SQ
874a0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 75 LITE_PRIVATE u
874b0 33 32 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 32 sqlite3Trigge
874c0 72 43 6f 6c 6d 61 73 6b 28 50 61 72 73 65 2a 2c rColmask(Parse*,
874d0 54 72 69 67 67 65 72 2a 2c 45 78 70 72 4c 69 73 Trigger*,ExprLis
874e0 74 2a 2c 69 6e 74 2c 69 6e 74 2c 54 61 62 6c 65 t*,int,int,Table
874f0 2a 2c 69 6e 74 29 3b 0d 0a 23 20 64 65 66 69 6e *,int);..# defin
87500 65 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f e sqlite3ParseTo
87510 70 6c 65 76 65 6c 28 70 29 20 28 28 70 29 2d 3e plevel(p) ((p)->
87520 70 54 6f 70 6c 65 76 65 6c 20 3f 20 28 70 29 2d pToplevel ? (p)-
87530 3e 70 54 6f 70 6c 65 76 65 6c 20 3a 20 28 70 29 >pToplevel : (p)
87540 29 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 )..#else..# defi
87550 6e 65 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 ne sqlite3Trigge
87560 72 73 45 78 69 73 74 28 42 2c 43 2c 44 2c 45 2c rsExist(B,C,D,E,
87570 46 29 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 73 F) 0..# define s
87580 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 qlite3DeleteTrig
87590 67 65 72 28 41 2c 42 29 0d 0a 23 20 64 65 66 69 ger(A,B)..# defi
875a0 6e 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 ne sqlite3DropTr
875b0 69 67 67 65 72 50 74 72 28 41 2c 42 29 0d 0a 23 iggerPtr(A,B)..#
875c0 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55 define sqlite3U
875d0 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 nlinkAndDeleteTr
875e0 69 67 67 65 72 28 41 2c 42 2c 43 29 0d 0a 23 20 igger(A,B,C)..#
875f0 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 43 6f define sqlite3Co
87600 64 65 52 6f 77 54 72 69 67 67 65 72 28 41 2c 42 deRowTrigger(A,B
87610 2c 43 2c 44 2c 45 2c 46 2c 47 2c 48 2c 49 29 0d ,C,D,E,F,G,H,I).
87620 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 .# define sqlite
87630 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 44 3CodeRowTriggerD
87640 69 72 65 63 74 28 41 2c 42 2c 43 2c 44 2c 45 2c irect(A,B,C,D,E,
87650 46 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c F)..# define sql
87660 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 ite3TriggerList(
87670 58 2c 20 59 29 20 30 0d 0a 23 20 64 65 66 69 6e X, Y) 0..# defin
87680 65 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f e sqlite3ParseTo
87690 70 6c 65 76 65 6c 28 70 29 20 70 0d 0a 23 20 64 plevel(p) p..# d
876a0 65 66 69 6e 65 20 73 71 6c 69 74 65 33 54 72 69 efine sqlite3Tri
876b0 67 67 65 72 43 6f 6c 6d 61 73 6b 28 41 2c 42 2c ggerColmask(A,B,
876c0 43 2c 44 2c 45 2c 46 2c 47 29 20 30 0d 0a 23 65 C,D,E,F,G) 0..#e
876d0 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 ndif....SQLITE_P
876e0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
876f0 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 e3JoinType(Parse
87700 2a 2c 20 54 6f 6b 65 6e 2a 2c 20 54 6f 6b 65 6e *, Token*, Token
87710 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c *, Token*);..SQL
87720 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
87730 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f sqlite3CreateFo
87740 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 2a 2c reignKey(Parse*,
87750 20 45 78 70 72 4c 69 73 74 2a 2c 20 54 6f 6b 65 ExprList*, Toke
87760 6e 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 n*, ExprList*, i
87770 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
87780 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
87790 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 3DeferForeignKey
877a0 28 50 61 72 73 65 2a 2c 20 69 6e 74 29 3b 0d 0a (Parse*, int);..
877b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
877c0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f MIT_AUTHORIZATIO
877d0 4e 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 N..SQLITE_PRIVAT
877e0 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 E void sqlite3
877f0 41 75 74 68 52 65 61 64 28 50 61 72 73 65 2a 2c AuthRead(Parse*,
87800 45 78 70 72 2a 2c 53 63 68 65 6d 61 2a 2c 53 72 Expr*,Schema*,Sr
87810 63 4c 69 73 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 cList*);..SQLITE
87820 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 _PRIVATE int s
87830 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 qlite3AuthCheck(
87840 50 61 72 73 65 2a 2c 69 6e 74 2c 20 63 6f 6e 73 Parse*,int, cons
87850 74 20 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 t char*, const c
87860 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 har*, const char
87870 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
87880 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
87890 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 e3AuthContextPus
878a0 68 28 50 61 72 73 65 2a 2c 20 41 75 74 68 43 6f h(Parse*, AuthCo
878b0 6e 74 65 78 74 2a 2c 20 63 6f 6e 73 74 20 63 68 ntext*, const ch
878c0 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 ar*);..SQLITE_PR
878d0 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c IVATE void sql
878e0 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 ite3AuthContextP
878f0 6f 70 28 41 75 74 68 43 6f 6e 74 65 78 74 2a 29 op(AuthContext*)
87900 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
87910 45 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 41 E int sqlite3A
87920 75 74 68 52 65 61 64 43 6f 6c 28 50 61 72 73 65 uthReadCol(Parse
87930 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c *, const char *,
87940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 const char *, i
87950 6e 74 29 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 nt);..#else..# d
87960 65 66 69 6e 65 20 73 71 6c 69 74 65 33 41 75 74 efine sqlite3Aut
87970 68 52 65 61 64 28 61 2c 62 2c 63 2c 64 29 0d 0a hRead(a,b,c,d)..
87980 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 # define sqlite3
87990 41 75 74 68 43 68 65 63 6b 28 61 2c 62 2c 63 2c AuthCheck(a,b,c,
879a0 64 2c 65 29 20 20 20 20 53 51 4c 49 54 45 5f 4f d,e) SQLITE_O
879b0 4b 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 K..# define sqli
879c0 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 te3AuthContextPu
879d0 73 68 28 61 2c 62 2c 63 29 0d 0a 23 20 64 65 66 sh(a,b,c)..# def
879e0 69 6e 65 20 73 71 6c 69 74 65 33 41 75 74 68 43 ine sqlite3AuthC
879f0 6f 6e 74 65 78 74 50 6f 70 28 61 29 20 20 28 28 ontextPop(a) ((
87a00 76 6f 69 64 29 28 61 29 29 0d 0a 23 65 6e 64 69 void)(a))..#endi
87a10 66 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 f..SQLITE_PRIVAT
87a20 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 74 E void sqlite3At
87a30 74 61 63 68 28 50 61 72 73 65 2a 2c 20 45 78 70 tach(Parse*, Exp
87a40 72 2a 2c 20 45 78 70 72 2a 2c 20 45 78 70 72 2a r*, Expr*, Expr*
87a50 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
87a60 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 TE void sqlite3D
87a70 65 74 61 63 68 28 50 61 72 73 65 2a 2c 20 45 78 etach(Parse*, Ex
87a80 70 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 pr*);..SQLITE_PR
87a90 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
87aa0 33 46 69 78 49 6e 69 74 28 44 62 46 69 78 65 72 3FixInit(DbFixer
87ab0 2a 2c 20 50 61 72 73 65 2a 2c 20 69 6e 74 2c 20 *, Parse*, int,
87ac0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 6f 6e const char*, con
87ad0 73 74 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c st Token*);..SQL
87ae0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
87af0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 sqlite3FixSrcLis
87b00 74 28 44 62 46 69 78 65 72 2a 2c 20 53 72 63 4c t(DbFixer*, SrcL
87b10 69 73 74 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ist*);..SQLITE_P
87b20 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
87b30 65 33 46 69 78 53 65 6c 65 63 74 28 44 62 46 69 e3FixSelect(DbFi
87b40 78 65 72 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0d xer*, Select*);.
87b50 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
87b60 69 6e 74 20 73 71 6c 69 74 65 33 46 69 78 45 78 int sqlite3FixEx
87b70 70 72 28 44 62 46 69 78 65 72 2a 2c 20 45 78 70 pr(DbFixer*, Exp
87b80 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 r*);..SQLITE_PRI
87b90 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
87ba0 46 69 78 45 78 70 72 4c 69 73 74 28 44 62 46 69 FixExprList(DbFi
87bb0 78 65 72 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 xer*, ExprList*)
87bc0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
87bd0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 46 69 78 E int sqlite3Fix
87be0 54 72 69 67 67 65 72 53 74 65 70 28 44 62 46 69 TriggerStep(DbFi
87bf0 78 65 72 2a 2c 20 54 72 69 67 67 65 72 53 74 65 xer*, TriggerSte
87c00 70 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 p*);..SQLITE_PRI
87c10 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
87c20 41 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72 20 AtoF(const char
87c30 2a 7a 2c 20 64 6f 75 62 6c 65 2a 2c 20 69 6e 74 *z, double*, int
87c40 2c 20 75 38 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 , u8);..SQLITE_P
87c50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
87c60 65 33 47 65 74 49 6e 74 33 32 28 63 6f 6e 73 74 e3GetInt32(const
87c70 20 63 68 61 72 20 2a 2c 20 69 6e 74 2a 29 3b 0d char *, int*);.
87c80 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
87c90 69 6e 74 20 73 71 6c 69 74 65 33 41 74 6f 69 28 int sqlite3Atoi(
87ca0 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0d 0a 53 const char*);..S
87cb0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
87cc0 74 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79 t sqlite3Utf16By
87cd0 74 65 4c 65 6e 28 63 6f 6e 73 74 20 76 6f 69 64 teLen(const void
87ce0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 43 68 *pData, int nCh
87cf0 61 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ar);..SQLITE_PRI
87d00 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
87d10 55 74 66 38 43 68 61 72 4c 65 6e 28 63 6f 6e 73 Utf8CharLen(cons
87d20 74 20 63 68 61 72 20 2a 70 44 61 74 61 2c 20 69 t char *pData, i
87d30 6e 74 20 6e 42 79 74 65 29 3b 0d 0a 53 51 4c 49 nt nByte);..SQLI
87d40 54 45 5f 50 52 49 56 41 54 45 20 75 33 32 20 73 TE_PRIVATE u32 s
87d50 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 63 qlite3Utf8Read(c
87d60 6f 6e 73 74 20 75 38 2a 2c 20 63 6f 6e 73 74 20 onst u8*, const
87d70 75 38 2a 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a u8**);..../*..**
87d80 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 Routines to rea
87d90 64 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 d and write vari
87da0 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 able-length inte
87db0 67 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 gers. These use
87dc0 64 20 74 6f 0d 0a 2a 2a 20 62 65 20 64 65 66 69 d to..** be defi
87dd0 6e 65 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 ned locally, but
87de0 20 6e 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 now we use the
87df0 76 61 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 varint routines
87e00 69 6e 20 74 68 65 20 75 74 69 6c 2e 63 0d 0a 2a in the util.c..*
87e10 2a 20 66 69 6c 65 2e 20 20 43 6f 64 65 20 73 68 * file. Code sh
87e20 6f 75 6c 64 20 75 73 65 20 74 68 65 20 4d 41 43 ould use the MAC
87e30 52 4f 20 66 6f 72 6d 73 20 62 65 6c 6f 77 2c 20 RO forms below,
87e40 61 73 20 74 68 65 20 56 61 72 69 6e 74 33 32 20 as the Varint32
87e50 76 65 72 73 69 6f 6e 73 0d 0a 2a 2a 20 61 72 65 versions..** are
87e60 20 63 6f 64 65 64 20 74 6f 20 61 73 73 75 6d 65 coded to assume
87e70 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79 74 65 the single byte
87e80 20 63 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 case is already
87e90 20 68 61 6e 64 6c 65 64 20 28 77 68 69 63 68 20 handled (which
87ea0 0d 0a 2a 2a 20 74 68 65 20 4d 41 43 52 4f 20 66 ..** the MACRO f
87eb0 6f 72 6d 20 64 6f 65 73 29 2e 0d 0a 2a 2f 0d 0a orm does)...*/..
87ec0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
87ed0 6e 74 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 nt sqlite3PutVar
87ee0 69 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 int(unsigned cha
87ef0 72 2a 2c 20 75 36 34 29 3b 0d 0a 53 51 4c 49 54 r*, u64);..SQLIT
87f00 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
87f10 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 33 32 lite3PutVarint32
87f20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c (unsigned char*,
87f30 20 75 33 32 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 u32);..SQLITE_P
87f40 52 49 56 41 54 45 20 75 38 20 73 71 6c 69 74 65 RIVATE u8 sqlite
87f50 33 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 3GetVarint(const
87f60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
87f70 2c 20 75 36 34 20 2a 29 3b 0d 0a 53 51 4c 49 54 , u64 *);..SQLIT
87f80 45 5f 50 52 49 56 41 54 45 20 75 38 20 73 71 6c E_PRIVATE u8 sql
87f90 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 ite3GetVarint32(
87fa0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
87fb0 68 61 72 20 2a 2c 20 75 33 32 20 2a 29 3b 0d 0a har *, u32 *);..
87fc0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
87fd0 6e 74 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 nt sqlite3Varint
87fe0 4c 65 6e 28 75 36 34 20 76 29 3b 0d 0a 0d 0a 2f Len(u64 v);..../
87ff0 2a 0d 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72 *..** The header
88000 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e of a record con
88010 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75 65 sists of a seque
88020 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e nce variable-len
88030 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0d 0a 2a gth integers...*
88040 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 * These integers
88050 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 are almost alwa
88060 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 ys small and are
88070 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69 encoded as a si
88080 6e 67 6c 65 20 62 79 74 65 2e 0d 0a 2a 2a 20 54 ngle byte...** T
88090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 he following mac
880a0 72 6f 73 20 74 61 6b 65 20 61 64 76 61 6e 74 61 ros take advanta
880b0 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 ge this fact to
880c0 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 65 provide a fast e
880d0 6e 63 6f 64 65 0d 0a 2a 2a 20 61 6e 64 20 64 65 ncode..** and de
880e0 63 6f 64 65 20 6f 66 20 74 68 65 20 69 6e 74 65 code of the inte
880f0 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 gers in a record
88100 20 68 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 header. It is
88110 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 faster for the c
88120 6f 6d 6d 6f 6e 0d 0a 2a 2a 20 63 61 73 65 20 77 ommon..** case w
88130 68 65 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 here the integer
88140 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 is a single byt
88150 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74 74 e. It is a litt
88160 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 le slower when t
88170 68 65 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 he..** integer i
88180 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 s two or more by
88190 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c tes. But overal
881a0 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e 0d l it is faster..
881b0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c .**..** The foll
881c0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e owing expression
881d0 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 s are equivalent
881e0 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 78 20 :..**..** x
881f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 = sqlite3GetVari
88200 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0d 0a nt32( A, &B );..
88210 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 ** x = sqlit
88220 65 33 50 75 74 56 61 72 69 6e 74 33 32 28 20 41 e3PutVarint32( A
88230 2c 20 42 20 29 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 20 , B );..**..**
88240 20 20 20 78 20 3d 20 67 65 74 56 61 72 69 6e 74 x = getVarint
88250 33 32 28 20 41 2c 20 42 20 29 3b 0d 0a 2a 2a 20 32( A, B );..**
88260 20 20 20 20 78 20 3d 20 70 75 74 56 61 72 69 6e x = putVarin
88270 74 33 32 28 20 41 2c 20 42 20 29 3b 0d 0a 2a 2a t32( A, B );..**
88280 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 67 65 ..*/..#define ge
88290 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20 tVarint32(A,B)
882a0 28 75 38 29 28 28 2a 28 41 29 3c 28 75 38 29 30 (u8)((*(A)<(u8)0
882b0 78 38 30 29 20 3f 20 28 28 42 29 20 3d 20 28 75 x80) ? ((B) = (u
882c0 33 32 29 2a 28 41 29 29 2c 31 20 3a 20 73 71 6c 32)*(A)),1 : sql
882d0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 ite3GetVarint32(
882e0 28 41 29 2c 20 28 75 33 32 20 2a 29 26 28 42 29 (A), (u32 *)&(B)
882f0 29 29 0d 0a 23 64 65 66 69 6e 65 20 70 75 74 56 ))..#define putV
88300 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20 28 75 arint32(A,B) (u
88310 38 29 28 28 28 75 33 32 29 28 42 29 3c 28 75 33 8)(((u32)(B)<(u3
88320 32 29 30 78 38 30 29 20 3f 20 28 2a 28 41 29 20 2)0x80) ? (*(A)
88330 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 = (unsigned char
88340 29 28 42 29 29 2c 31 20 3a 20 73 71 6c 69 74 65 )(B)),1 : sqlite
88350 33 50 75 74 56 61 72 69 6e 74 33 32 28 28 41 29 3PutVarint32((A)
88360 2c 20 28 42 29 29 29 0d 0a 23 64 65 66 69 6e 65 , (B)))..#define
88370 20 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 getVarint sq
88380 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 0d 0a lite3GetVarint..
88390 23 64 65 66 69 6e 65 20 70 75 74 56 61 72 69 6e #define putVarin
883a0 74 20 20 20 20 73 71 6c 69 74 65 33 50 75 74 56 t sqlite3PutV
883b0 61 72 69 6e 74 0d 0a 0d 0a 0d 0a 53 51 4c 49 54 arint......SQLIT
883c0 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 E_PRIVATE const
883d0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 49 6e 64 char *sqlite3Ind
883e0 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 56 64 exAffinityStr(Vd
883f0 62 65 20 2a 2c 20 49 6e 64 65 78 20 2a 29 3b 0d be *, Index *);.
88400 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
88410 76 6f 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c void sqlite3Tabl
88420 65 41 66 66 69 6e 69 74 79 53 74 72 28 56 64 62 eAffinityStr(Vdb
88430 65 20 2a 2c 20 54 61 62 6c 65 20 2a 29 3b 0d 0a e *, Table *);..
88440 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 SQLITE_PRIVATE c
88450 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 har sqlite3Compa
88460 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 reAffinity(Expr
88470 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 *pExpr, char aff
88480 32 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 2);..SQLITE_PRIV
88490 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 49 ATE int sqlite3I
884a0 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 ndexAffinityOk(E
884b0 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 xpr *pExpr, char
884c0 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0d idx_affinity);.
884d0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
884e0 63 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 char sqlite3Expr
884f0 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 Affinity(Expr *p
88500 45 78 70 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 Expr);..SQLITE_P
88510 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
88520 65 33 41 74 6f 69 36 34 28 63 6f 6e 73 74 20 63 e3Atoi64(const c
88530 68 61 72 2a 2c 20 69 36 34 2a 2c 20 69 6e 74 2c har*, i64*, int,
88540 20 75 38 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 u8);..SQLITE_PR
88550 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
88560 65 33 45 72 72 6f 72 28 73 71 6c 69 74 65 33 2a e3Error(sqlite3*
88570 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 , int, const cha
88580 72 2a 2c 2e 2e 2e 29 3b 0d 0a 53 51 4c 49 54 45 r*,...);..SQLITE
88590 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 _PRIVATE void *s
885a0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 qlite3HexToBlob(
885b0 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 sqlite3*, const
885c0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 3b char *z, int n);
885d0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
885e0 20 75 38 20 73 71 6c 69 74 65 33 48 65 78 54 6f u8 sqlite3HexTo
885f0 49 6e 74 28 69 6e 74 20 68 29 3b 0d 0a 53 51 4c Int(int h);..SQL
88600 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
88610 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 sqlite3TwoPartNa
88620 6d 65 28 50 61 72 73 65 20 2a 2c 20 54 6f 6b 65 me(Parse *, Toke
88630 6e 20 2a 2c 20 54 6f 6b 65 6e 20 2a 2c 20 54 6f n *, Token *, To
88640 6b 65 6e 20 2a 2a 29 3b 0d 0a 53 51 4c 49 54 45 ken **);..SQLITE
88650 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 63 _PRIVATE const c
88660 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 har *sqlite3ErrS
88670 74 72 28 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 tr(int);..SQLITE
88680 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
88690 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 50 ite3ReadSchema(P
886a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 3b 0d 0a arse *pParse);..
886b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 43 SQLITE_PRIVATE C
886c0 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 46 ollSeq *sqlite3F
886d0 69 6e 64 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 indCollSeq(sqlit
886e0 65 33 2a 2c 75 38 20 65 6e 63 2c 20 63 6f 6e 73 e3*,u8 enc, cons
886f0 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0d 0a 53 t char*,int);..S
88700 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 43 6f QLITE_PRIVATE Co
88710 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f llSeq *sqlite3Lo
88720 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 cateCollSeq(Pars
88730 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 e *pParse, const
88740 20 63 68 61 72 2a 7a 4e 61 6d 65 29 3b 0d 0a 53 char*zName);..S
88750 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 43 6f QLITE_PRIVATE Co
88760 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 llSeq *sqlite3Ex
88770 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 prCollSeq(Parse
88780 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 *pParse, Expr *p
88790 45 78 70 72 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 Expr);..SQLITE_P
887a0 52 49 56 41 54 45 20 45 78 70 72 20 2a 73 71 6c RIVATE Expr *sql
887b0 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 ite3ExprSetColl(
887c0 45 78 70 72 2a 2c 20 43 6f 6c 6c 53 65 71 2a 29 Expr*, CollSeq*)
887d0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
887e0 45 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 E Expr *sqlite3E
887f0 78 70 72 53 65 74 43 6f 6c 6c 42 79 54 6f 6b 65 xprSetCollByToke
88800 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c n(Parse *pParse,
88810 20 45 78 70 72 2a 2c 20 54 6f 6b 65 6e 2a 29 3b Expr*, Token*);
88820 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
88830 20 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 int sqlite3Chec
88840 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a kCollSeq(Parse *
88850 2c 20 43 6f 6c 6c 53 65 71 20 2a 29 3b 0d 0a 53 , CollSeq *);..S
88860 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
88870 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 t sqlite3CheckOb
88880 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a jectName(Parse *
88890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b , const char *);
888a0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
888b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 void sqlite3Vdb
888c0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 eSetChanges(sqli
888d0 74 65 33 20 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 te3 *, int);..SQ
888e0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
888f0 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 sqlite3AddInt64
88900 28 69 36 34 2a 2c 69 36 34 29 3b 0d 0a 53 51 4c (i64*,i64);..SQL
88910 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
88920 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 sqlite3SubInt64(
88930 69 36 34 2a 2c 69 36 34 29 3b 0d 0a 53 51 4c 49 i64*,i64);..SQLI
88940 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
88950 71 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 69 qlite3MulInt64(i
88960 36 34 2a 2c 69 36 34 29 3b 0d 0a 53 51 4c 49 54 64*,i64);..SQLIT
88970 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
88980 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 69 6e lite3AbsInt32(in
88990 74 29 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 t);..#ifdef SQLI
889a0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 TE_ENABLE_8_3_NA
889b0 4d 45 53 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 MES..SQLITE_PRIV
889c0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
889d0 46 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e 73 FileSuffix3(cons
889e0 74 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b t char*, char*);
889f0 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
88a00 65 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 e sqlite3FileSuf
88a10 66 69 78 33 28 58 2c 59 29 0d 0a 23 65 6e 64 69 fix3(X,Y)..#endi
88a20 66 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 f..SQLITE_PRIVAT
88a30 45 20 75 38 20 73 71 6c 69 74 65 33 47 65 74 42 E u8 sqlite3GetB
88a40 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 oolean(const cha
88a50 72 20 2a 7a 29 3b 0d 0a 0d 0a 53 51 4c 49 54 45 r *z);....SQLITE
88a60 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 76 _PRIVATE const v
88a70 6f 69 64 20 2a 73 71 6c 69 74 65 33 56 61 6c 75 oid *sqlite3Valu
88a80 65 54 65 78 74 28 73 71 6c 69 74 65 33 5f 76 61 eText(sqlite3_va
88a90 6c 75 65 2a 2c 20 75 38 29 3b 0d 0a 53 51 4c 49 lue*, u8);..SQLI
88aa0 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
88ab0 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 qlite3ValueBytes
88ac0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c (sqlite3_value*,
88ad0 20 75 38 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 u8);..SQLITE_PR
88ae0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
88af0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 73 71 e3ValueSetStr(sq
88b00 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e lite3_value*, in
88b10 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c t, const void *,
88b20 75 38 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 u8, ..
88b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f vo
88b40 69 64 28 2a 29 28 76 6f 69 64 2a 29 29 3b 0d 0a id(*)(void*));..
88b50 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
88b60 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65 oid sqlite3Value
88b70 46 72 65 65 28 73 71 6c 69 74 65 33 5f 76 61 6c Free(sqlite3_val
88b80 75 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 ue*);..SQLITE_PR
88b90 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 76 61 IVATE sqlite3_va
88ba0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 61 6c 75 lue *sqlite3Valu
88bb0 65 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 29 3b eNew(sqlite3 *);
88bc0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
88bd0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 55 74 char *sqlite3Ut
88be0 66 31 36 74 6f 38 28 73 71 6c 69 74 65 33 20 2a f16to8(sqlite3 *
88bf0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69 , const void*, i
88c00 6e 74 2c 20 75 38 29 3b 0d 0a 23 69 66 64 65 66 nt, u8);..#ifdef
88c10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 SQLITE_ENABLE_S
88c20 54 41 54 33 0d 0a 53 51 4c 49 54 45 5f 50 52 49 TAT3..SQLITE_PRI
88c30 56 41 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 VATE char *sqlit
88c40 65 33 55 74 66 38 74 6f 31 36 28 73 71 6c 69 74 e3Utf8to16(sqlit
88c50 65 33 20 2a 2c 20 75 38 2c 20 63 68 61 72 20 2a e3 *, u8, char *
88c60 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b 0d 0a , int, int *);..
88c70 23 65 6e 64 69 66 0d 0a 53 51 4c 49 54 45 5f 50 #endif..SQLITE_P
88c80 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
88c90 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 e3ValueFromExpr(
88ca0 73 71 6c 69 74 65 33 20 2a 2c 20 45 78 70 72 20 sqlite3 *, Expr
88cb0 2a 2c 20 75 38 2c 20 75 38 2c 20 73 71 6c 69 74 *, u8, u8, sqlit
88cc0 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0d 0a 53 e3_value **);..S
88cd0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
88ce0 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 id sqlite3ValueA
88cf0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 73 71 6c pplyAffinity(sql
88d00 69 74 65 33 5f 76 61 6c 75 65 20 2a 2c 20 75 38 ite3_value *, u8
88d10 2c 20 75 38 29 3b 0d 0a 23 69 66 6e 64 65 66 20 , u8);..#ifndef
88d20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 SQLITE_AMALGAMAT
88d30 49 4f 4e 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ION..SQLITE_PRIV
88d40 41 54 45 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e ATE const unsign
88d50 65 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 4f ed char sqlite3O
88d60 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d 3b pcodeProperty[];
88d70 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
88d80 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
88d90 63 68 61 72 20 73 71 6c 69 74 65 33 55 70 70 65 char sqlite3Uppe
88da0 72 54 6f 4c 6f 77 65 72 5b 5d 3b 0d 0a 53 51 4c rToLower[];..SQL
88db0 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 ITE_PRIVATE cons
88dc0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
88dd0 73 71 6c 69 74 65 33 43 74 79 70 65 4d 61 70 5b sqlite3CtypeMap[
88de0 5d 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ];..SQLITE_PRIVA
88df0 54 45 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 73 TE const Token s
88e00 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b qlite3IntTokens[
88e10 5d 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ];..SQLITE_PRIVA
88e20 54 45 20 53 51 4c 49 54 45 5f 57 53 44 20 73 74 TE SQLITE_WSD st
88e30 72 75 63 74 20 53 71 6c 69 74 65 33 43 6f 6e 66 ruct Sqlite3Conf
88e40 69 67 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 ig sqlite3Config
88e50 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
88e60 45 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75 6e E SQLITE_WSD Fun
88e70 63 44 65 66 48 61 73 68 20 73 71 6c 69 74 65 33 cDefHash sqlite3
88e80 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 3b GlobalFunctions;
88e90 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
88ea0 5f 4f 4d 49 54 5f 57 53 44 0d 0a 53 51 4c 49 54 _OMIT_WSD..SQLIT
88eb0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
88ec0 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 lite3PendingByte
88ed0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 65 6e 64 69 ;..#endif..#endi
88ee0 66 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 f..SQLITE_PRIVAT
88ef0 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f E void sqlite3Ro
88f00 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 otPageMoved(sqli
88f10 74 65 33 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 te3*, int, int,
88f20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
88f30 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
88f40 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 2a e3Reindex(Parse*
88f50 2c 20 54 6f 6b 65 6e 2a 2c 20 54 6f 6b 65 6e 2a , Token*, Token*
88f60 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
88f70 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 TE void sqlite3A
88f80 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 76 6f lterFunctions(vo
88f90 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 id);..SQLITE_PRI
88fa0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
88fb0 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 3AlterRenameTabl
88fc0 65 28 50 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 e(Parse*, SrcLis
88fd0 74 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 t*, Token*);..SQ
88fe0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
88ff0 20 73 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e sqlite3GetToken
89000 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
89010 63 68 61 72 20 2a 2c 20 69 6e 74 20 2a 29 3b 0d char *, int *);.
89020 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
89030 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 void sqlite3Nest
89040 65 64 50 61 72 73 65 28 50 61 72 73 65 2a 2c 20 edParse(Parse*,
89050 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e const char*, ...
89060 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
89070 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 TE void sqlite3E
89080 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 xpirePreparedSta
89090 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 2a tements(sqlite3*
890a0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
890b0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6f TE int sqlite3Co
890c0 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 deSubselect(Pars
890d0 65 20 2a 2c 20 45 78 70 72 20 2a 2c 20 69 6e 74 e *, Expr *, int
890e0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
890f0 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
89100 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 50 ite3SelectPrep(P
89110 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 arse*, Select*,
89120 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a NameContext*);..
89130 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
89140 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 nt sqlite3Resolv
89150 65 45 78 70 72 4e 61 6d 65 73 28 4e 61 6d 65 43 eExprNames(NameC
89160 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 2a 29 3b ontext*, Expr*);
89170 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
89180 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 void sqlite3Res
89190 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 olveSelectNames(
891a0 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 2c Parse*, Select*,
891b0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 3b 0d NameContext*);.
891c0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
891d0 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c int sqlite3Resol
891e0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 50 veOrderGroupBy(P
891f0 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 arse*, Select*,
89200 45 78 70 72 4c 69 73 74 2a 2c 20 63 6f 6e 73 74 ExprList*, const
89210 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 char*);..SQLITE
89220 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
89230 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 lite3ColumnDefau
89240 6c 74 28 56 64 62 65 20 2a 2c 20 54 61 62 6c 65 lt(Vdbe *, Table
89250 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a *, int, int);..
89260 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
89270 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72 oid sqlite3Alter
89280 46 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 FinishAddColumn(
89290 50 61 72 73 65 20 2a 2c 20 54 6f 6b 65 6e 20 2a Parse *, Token *
892a0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
892b0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 TE void sqlite3A
892c0 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f 6c 75 lterBeginAddColu
892d0 6d 6e 28 50 61 72 73 65 20 2a 2c 20 53 72 63 4c mn(Parse *, SrcL
892e0 69 73 74 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f ist *);..SQLITE_
892f0 50 52 49 56 41 54 45 20 43 6f 6c 6c 53 65 71 20 PRIVATE CollSeq
89300 2a 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 *sqlite3GetCollS
89310 65 71 28 73 71 6c 69 74 65 33 2a 2c 20 75 38 2c eq(sqlite3*, u8,
89320 20 43 6f 6c 6c 53 65 71 20 2a 2c 20 63 6f 6e 73 CollSeq *, cons
89330 74 20 63 68 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 t char*);..SQLIT
89340 45 5f 50 52 49 56 41 54 45 20 63 68 61 72 20 73 E_PRIVATE char s
89350 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 qlite3AffinityTy
89360 70 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b pe(const char*);
89370 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
89380 20 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6e 61 void sqlite3Ana
89390 6c 79 7a 65 28 50 61 72 73 65 2a 2c 20 54 6f 6b lyze(Parse*, Tok
893a0 65 6e 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a 53 en*, Token*);..S
893b0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
893c0 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 t sqlite3InvokeB
893d0 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 usyHandler(BusyH
893e0 61 6e 64 6c 65 72 2a 29 3b 0d 0a 53 51 4c 49 54 andler*);..SQLIT
893f0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
89400 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 lite3FindDb(sqli
89410 74 65 33 2a 2c 20 54 6f 6b 65 6e 2a 29 3b 0d 0a te3*, Token*);..
89420 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
89430 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 nt sqlite3FindDb
89440 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 2c 20 Name(sqlite3 *,
89450 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0d 0a const char *);..
89460 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
89470 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 nt sqlite3Analys
89480 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 2a 2c isLoad(sqlite3*,
89490 69 6e 74 20 69 44 42 29 3b 0d 0a 53 51 4c 49 54 int iDB);..SQLIT
894a0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
894b0 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 qlite3DeleteInde
894c0 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 xSamples(sqlite3
894d0 2a 2c 49 6e 64 65 78 2a 29 3b 0d 0a 53 51 4c 49 *,Index*);..SQLI
894e0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
894f0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f sqlite3DefaultRo
89500 77 45 73 74 28 49 6e 64 65 78 2a 29 3b 0d 0a 53 wEst(Index*);..S
89510 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
89520 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 id sqlite3Regist
89530 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 erLikeFunctions(
89540 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 29 3b 0d sqlite3*, int);.
89550 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
89560 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b int sqlite3IsLik
89570 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 eFunction(sqlite
89580 33 2a 2c 45 78 70 72 2a 2c 69 6e 74 2a 2c 63 68 3*,Expr*,int*,ch
89590 61 72 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 ar*);..SQLITE_PR
895a0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
895b0 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 e3MinimumFileFor
895c0 6d 61 74 28 50 61 72 73 65 2a 2c 20 69 6e 74 2c mat(Parse*, int,
895d0 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
895e0 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
895f0 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 76 te3SchemaClear(v
89600 6f 69 64 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f oid *);..SQLITE_
89610 50 52 49 56 41 54 45 20 53 63 68 65 6d 61 20 2a PRIVATE Schema *
89620 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 sqlite3SchemaGet
89630 28 73 71 6c 69 74 65 33 20 2a 2c 20 42 74 72 65 (sqlite3 *, Btre
89640 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 e *);..SQLITE_PR
89650 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
89660 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 73 3SchemaToIndex(s
89670 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 63 68 65 qlite3 *db, Sche
89680 6d 61 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ma *);..SQLITE_P
89690 52 49 56 41 54 45 20 4b 65 79 49 6e 66 6f 20 2a RIVATE KeyInfo *
896a0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 sqlite3IndexKeyi
896b0 6e 66 6f 28 50 61 72 73 65 20 2a 2c 20 49 6e 64 nfo(Parse *, Ind
896c0 65 78 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ex *);..SQLITE_P
896d0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
896e0 65 33 43 72 65 61 74 65 46 75 6e 63 28 73 71 6c e3CreateFunc(sql
896f0 69 74 65 33 20 2a 2c 20 63 6f 6e 73 74 20 63 68 ite3 *, const ch
89700 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 ar *, int, int,
89710 76 6f 69 64 20 2a 2c 20 0d 0a 20 20 76 6f 69 64 void *, .. void
89720 20 28 2a 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e (*)(sqlite3_con
89730 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 text*,int,sqlite
89740 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0d 0a 20 20 3_value **),..
89750 76 6f 69 64 20 28 2a 29 28 73 71 6c 69 74 65 33 void (*)(sqlite3
89760 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 _context*,int,sq
89770 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c lite3_value **),
89780 20 76 6f 69 64 20 28 2a 29 28 73 71 6c 69 74 65 void (*)(sqlite
89790 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0d 0a 20 20 3_context*),..
897a0 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a FuncDestructor *
897b0 70 44 65 73 74 72 75 63 74 6f 72 0d 0a 29 3b 0d pDestructor..);.
897c0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
897d0 69 6e 74 20 73 71 6c 69 74 65 33 41 70 69 45 78 int sqlite3ApiEx
897e0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 it(sqlite3 *db,
897f0 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
89800 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
89810 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 3OpenTempDatabas
89820 65 28 50 61 72 73 65 20 2a 29 3b 0d 0a 0d 0a 53 e(Parse *);....S
89830 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
89840 69 64 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 id sqlite3StrAcc
89850 75 6d 49 6e 69 74 28 53 74 72 41 63 63 75 6d 2a umInit(StrAccum*
89860 2c 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e , char*, int, in
89870 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
89880 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
89890 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 53 StrAccumAppend(S
898a0 74 72 41 63 63 75 6d 2a 2c 63 6f 6e 73 74 20 63 trAccum*,const c
898b0 68 61 72 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c 49 har*,int);..SQLI
898c0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
898d0 73 71 6c 69 74 65 33 41 70 70 65 6e 64 53 70 61 sqlite3AppendSpa
898e0 63 65 28 53 74 72 41 63 63 75 6d 2a 2c 69 6e 74 ce(StrAccum*,int
898f0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
89900 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 TE char *sqlite3
89910 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 53 StrAccumFinish(S
89920 74 72 41 63 63 75 6d 2a 29 3b 0d 0a 53 51 4c 49 trAccum*);..SQLI
89930 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
89940 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 sqlite3StrAccumR
89950 65 73 65 74 28 53 74 72 41 63 63 75 6d 2a 29 3b eset(StrAccum*);
89960 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
89970 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c void sqlite3Sel
89980 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 ectDestInit(Sele
89990 63 74 44 65 73 74 2a 2c 69 6e 74 2c 69 6e 74 29 ctDest*,int,int)
899a0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
899b0 45 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 E Expr *sqlite3C
899c0 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 reateColumnExpr(
899d0 73 71 6c 69 74 65 33 20 2a 2c 20 53 72 63 4c 69 sqlite3 *, SrcLi
899e0 73 74 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b st *, int, int);
899f0 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ....SQLITE_PRIVA
89a00 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 TE void sqlite3B
89a10 61 63 6b 75 70 52 65 73 74 61 72 74 28 73 71 6c ackupRestart(sql
89a20 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 29 3b 0d ite3_backup *);.
89a30 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
89a40 76 6f 69 64 20 73 71 6c 69 74 65 33 42 61 63 6b void sqlite3Back
89a50 75 70 55 70 64 61 74 65 28 73 71 6c 69 74 65 33 upUpdate(sqlite3
89a60 5f 62 61 63 6b 75 70 20 2a 2c 20 50 67 6e 6f 2c _backup *, Pgno,
89a70 20 63 6f 6e 73 74 20 75 38 20 2a 29 3b 0d 0a 0d const u8 *);...
89a80 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 74 65 ./*..** The inte
89a90 72 66 61 63 65 20 74 6f 20 74 68 65 20 4c 45 4d rface to the LEM
89aa0 4f 4e 2d 67 65 6e 65 72 61 74 65 64 20 70 61 72 ON-generated par
89ab0 73 65 72 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ser..*/..SQLITE_
89ac0 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 PRIVATE void *sq
89ad0 6c 69 74 65 33 50 61 72 73 65 72 41 6c 6c 6f 63 lite3ParserAlloc
89ae0 28 76 6f 69 64 2a 28 2a 29 28 73 69 7a 65 5f 74 (void*(*)(size_t
89af0 29 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ));..SQLITE_PRIV
89b00 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
89b10 50 61 72 73 65 72 46 72 65 65 28 76 6f 69 64 2a ParserFree(void*
89b20 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 29 , void(*)(void*)
89b30 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
89b40 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
89b50 61 72 73 65 72 28 76 6f 69 64 2a 2c 20 69 6e 74 arser(void*, int
89b60 2c 20 54 6f 6b 65 6e 2c 20 50 61 72 73 65 2a 29 , Token, Parse*)
89b70 3b 0d 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 ;..#ifdef YYTRAC
89b80 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0d 0a KMAXSTACKDEPTH..
89b90 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
89ba0 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 int sqlite3Pars
89bb0 65 72 53 74 61 63 6b 50 65 61 6b 28 76 6f 69 64 erStackPeak(void
89bc0 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 53 *);..#endif....S
89bd0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
89be0 69 64 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f id sqlite3AutoLo
89bf0 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 73 71 6c adExtensions(sql
89c00 69 74 65 33 2a 29 3b 0d 0a 23 69 66 6e 64 65 66 ite3*);..#ifndef
89c10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 SQLITE_OMIT_LOA
89c20 44 5f 45 58 54 45 4e 53 49 4f 4e 0d 0a 53 51 4c D_EXTENSION..SQL
89c30 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
89c40 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 id sqlite3CloseE
89c50 78 74 65 6e 73 69 6f 6e 73 28 73 71 6c 69 74 65 xtensions(sqlite
89c60 33 2a 29 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 3*);..#else..# d
89c70 65 66 69 6e 65 20 73 71 6c 69 74 65 33 43 6c 6f efine sqlite3Clo
89c80 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 58 29 0d seExtensions(X).
89c90 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 .#endif....#ifnd
89ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 ef SQLITE_OMIT_S
89cb0 48 41 52 45 44 5f 43 41 43 48 45 0d 0a 53 51 4c HARED_CACHE..SQL
89cc0 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
89cd0 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c id sqlite3TableL
89ce0 6f 63 6b 28 50 61 72 73 65 20 2a 2c 20 69 6e 74 ock(Parse *, int
89cf0 2c 20 69 6e 74 2c 20 75 38 2c 20 63 6f 6e 73 74 , int, u8, const
89d00 20 63 68 61 72 20 2a 29 3b 0d 0a 23 65 6c 73 65 char *);..#else
89d10 0d 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 .. #define sqli
89d20 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 76 2c 77 te3TableLock(v,w
89d30 2c 78 2c 79 2c 7a 29 0d 0a 23 65 6e 64 69 66 0d ,x,y,z)..#endif.
89d40 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
89d50 5f 54 45 53 54 0d 0a 53 51 4c 49 54 45 5f 50 52 _TEST..SQLITE_PR
89d60 49 56 41 54 45 20 20 20 69 6e 74 20 73 71 6c 69 IVATE int sqli
89d70 74 65 33 55 74 66 38 54 6f 38 28 75 6e 73 69 67 te3Utf8To8(unsig
89d80 6e 65 64 20 63 68 61 72 2a 29 3b 0d 0a 23 65 6e ned char*);..#en
89d90 64 69 66 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 dif....#ifdef SQ
89da0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
89db0 4c 54 41 42 4c 45 0d 0a 23 20 20 64 65 66 69 6e LTABLE..# defin
89dc0 65 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 e sqlite3VtabCle
89dd0 61 72 28 59 29 0d 0a 23 20 20 64 65 66 69 6e 65 ar(Y)..# define
89de0 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 sqlite3VtabSync
89df0 28 58 2c 59 29 20 53 51 4c 49 54 45 5f 4f 4b 0d (X,Y) SQLITE_OK.
89e00 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c 69 74 .# define sqlit
89e10 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 58 e3VtabRollback(X
89e20 29 0d 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c )..# define sql
89e30 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 58 ite3VtabCommit(X
89e40 29 0d 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c )..# define sql
89e50 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 ite3VtabInSync(d
89e60 62 29 20 30 0d 0a 23 20 20 64 65 66 69 6e 65 20 b) 0..# define
89e70 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 sqlite3VtabLock(
89e80 58 29 20 0d 0a 23 20 20 64 65 66 69 6e 65 20 73 X) ..# define s
89e90 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b qlite3VtabUnlock
89ea0 28 58 29 0d 0a 23 20 20 64 65 66 69 6e 65 20 73 (X)..# define s
89eb0 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b qlite3VtabUnlock
89ec0 4c 69 73 74 28 58 29 0d 0a 23 20 20 64 65 66 69 List(X)..# defi
89ed0 6e 65 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 ne sqlite3VtabSa
89ee0 76 65 70 6f 69 6e 74 28 58 2c 20 59 2c 20 5a 29 vepoint(X, Y, Z)
89ef0 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 23 20 20 64 SQLITE_OK..# d
89f00 65 66 69 6e 65 20 73 71 6c 69 74 65 33 47 65 74 efine sqlite3Get
89f10 56 54 61 62 6c 65 28 58 2c 59 29 20 20 28 28 56 VTable(X,Y) ((V
89f20 54 61 62 6c 65 2a 29 30 29 0d 0a 23 65 6c 73 65 Table*)0)..#else
89f30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
89f40 20 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 void sqlite3
89f50 56 74 61 62 43 6c 65 61 72 28 73 71 6c 69 74 65 VtabClear(sqlite
89f60 33 20 2a 64 62 2c 20 54 61 62 6c 65 2a 29 3b 0d 3 *db, Table*);.
89f70 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
89f80 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 56 74 int sqlite3Vt
89f90 61 62 53 79 6e 63 28 73 71 6c 69 74 65 33 20 2a abSync(sqlite3 *
89fa0 64 62 2c 20 63 68 61 72 20 2a 2a 29 3b 0d 0a 53 db, char **);..S
89fb0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
89fc0 20 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 int sqlite3Vtab
89fd0 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 Rollback(sqlite3
89fe0 20 2a 64 62 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 *db);..SQLITE_P
89ff0 52 49 56 41 54 45 20 20 20 20 69 6e 74 20 73 71 RIVATE int sq
8a000 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 lite3VtabCommit(
8a010 73 71 6c 69 74 65 33 20 2a 64 62 29 3b 0d 0a 53 sqlite3 *db);..S
8a020 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 QLITE_PRIVATE
8a030 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 void sqlite3Vta
8a040 62 4c 6f 63 6b 28 56 54 61 62 6c 65 20 2a 29 3b bLock(VTable *);
8a050 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
8a060 20 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 void sqlite3
8a070 56 74 61 62 55 6e 6c 6f 63 6b 28 56 54 61 62 6c VtabUnlock(VTabl
8a080 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 e *);..SQLITE_PR
8a090 49 56 41 54 45 20 20 20 20 76 6f 69 64 20 73 71 IVATE void sq
8a0a0 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c lite3VtabUnlockL
8a0b0 69 73 74 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a ist(sqlite3*);..
8a0c0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
8a0d0 20 20 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 int sqlite3Vta
8a0e0 62 53 61 76 65 70 6f 69 6e 74 28 73 71 6c 69 74 bSavepoint(sqlit
8a0f0 65 33 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b e3 *, int, int);
8a100 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
8a110 20 20 20 20 56 54 61 62 6c 65 20 2a 73 71 6c 69 VTable *sqli
8a120 74 65 33 47 65 74 56 54 61 62 6c 65 28 73 71 6c te3GetVTable(sql
8a130 69 74 65 33 2a 2c 20 54 61 62 6c 65 2a 29 3b 0d ite3*, Table*);.
8a140 0a 23 20 20 64 65 66 69 6e 65 20 73 71 6c 69 74 .# define sqlit
8a150 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 e3VtabInSync(db)
8a160 20 28 28 64 62 29 2d 3e 6e 56 54 72 61 6e 73 3e ((db)->nVTrans>
8a170 30 20 26 26 20 28 64 62 29 2d 3e 61 56 54 72 61 0 && (db)->aVTra
8a180 6e 73 3d 3d 30 29 0d 0a 23 65 6e 64 69 66 0d 0a ns==0)..#endif..
8a190 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
8a1a0 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 4d oid sqlite3VtabM
8a1b0 61 6b 65 57 72 69 74 61 62 6c 65 28 50 61 72 73 akeWritable(Pars
8a1c0 65 2a 2c 54 61 62 6c 65 2a 29 3b 0d 0a 53 51 4c e*,Table*);..SQL
8a1d0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
8a1e0 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 sqlite3VtabBegi
8a1f0 6e 50 61 72 73 65 28 50 61 72 73 65 2a 2c 20 54 nParse(Parse*, T
8a200 6f 6b 65 6e 2a 2c 20 54 6f 6b 65 6e 2a 2c 20 54 oken*, Token*, T
8a210 6f 6b 65 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f oken*);..SQLITE_
8a220 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
8a230 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61 ite3VtabFinishPa
8a240 72 73 65 28 50 61 72 73 65 2a 2c 20 54 6f 6b 65 rse(Parse*, Toke
8a250 6e 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 n*);..SQLITE_PRI
8a260 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
8a270 33 56 74 61 62 41 72 67 49 6e 69 74 28 50 61 72 3VtabArgInit(Par
8a280 73 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 se*);..SQLITE_PR
8a290 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
8a2a0 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 e3VtabArgExtend(
8a2b0 50 61 72 73 65 2a 2c 20 54 6f 6b 65 6e 2a 29 3b Parse*, Token*);
8a2c0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
8a2d0 20 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 int sqlite3Vtab
8a2e0 43 61 6c 6c 43 72 65 61 74 65 28 73 71 6c 69 74 CallCreate(sqlit
8a2f0 65 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 e3*, int, const
8a300 63 68 61 72 20 2a 2c 20 63 68 61 72 20 2a 2a 29 char *, char **)
8a310 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8a320 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 E int sqlite3Vta
8a330 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61 72 bCallConnect(Par
8a340 73 65 2a 2c 20 54 61 62 6c 65 2a 29 3b 0d 0a 53 se*, Table*);..S
8a350 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
8a360 74 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c t sqlite3VtabCal
8a370 6c 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 lDestroy(sqlite3
8a380 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 *, int, const ch
8a390 61 72 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 ar *);..SQLITE_P
8a3a0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
8a3b0 65 33 56 74 61 62 42 65 67 69 6e 28 73 71 6c 69 e3VtabBegin(sqli
8a3c0 74 65 33 20 2a 2c 20 56 54 61 62 6c 65 20 2a 29 te3 *, VTable *)
8a3d0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8a3e0 45 20 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 E FuncDef *sqlit
8a3f0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 e3VtabOverloadFu
8a400 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a nction(sqlite3 *
8a410 2c 46 75 6e 63 44 65 66 2a 2c 20 69 6e 74 20 6e ,FuncDef*, int n
8a420 41 72 67 2c 20 45 78 70 72 2a 29 3b 0d 0a 53 51 Arg, Expr*);..SQ
8a430 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
8a440 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 d sqlite3Invalid
8a450 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 Function(sqlite3
8a460 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 _context*,int,sq
8a470 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0d lite3_value**);.
8a480 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
8a490 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 50 int sqlite3VdbeP
8a4a0 61 72 61 6d 65 74 65 72 49 6e 64 65 78 28 56 64 arameterIndex(Vd
8a4b0 62 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a be*, const char*
8a4c0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
8a4d0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
8a4e0 74 65 33 54 72 61 6e 73 66 65 72 42 69 6e 64 69 te3TransferBindi
8a4f0 6e 67 73 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 ngs(sqlite3_stmt
8a500 20 2a 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 *, sqlite3_stmt
8a510 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 *);..SQLITE_PRI
8a520 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
8a530 52 65 70 72 65 70 61 72 65 28 56 64 62 65 2a 29 Reprepare(Vdbe*)
8a540 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8a550 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 E void sqlite3Ex
8a560 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 prListCheckLengt
8a570 68 28 50 61 72 73 65 2a 2c 20 45 78 70 72 4c 69 h(Parse*, ExprLi
8a580 73 74 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a st*, const char*
8a590 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
8a5a0 54 45 20 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 TE CollSeq *sqli
8a5b0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 te3BinaryCompare
8a5c0 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 2c CollSeq(Parse *,
8a5d0 20 45 78 70 72 20 2a 2c 20 45 78 70 72 20 2a 29 Expr *, Expr *)
8a5e0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8a5f0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d E int sqlite3Tem
8a600 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 pInMemory(const
8a610 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 53 51 4c 49 sqlite3*);..SQLI
8a620 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 TE_PRIVATE const
8a630 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f char *sqlite3Jo
8a640 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e urnalModename(in
8a650 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
8a660 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 43 ATE int sqlite3C
8a670 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 heckpoint(sqlite
8a680 33 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 3*, int, int, in
8a690 74 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 53 51 4c 49 t*, int*);..SQLI
8a6a0 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
8a6b0 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 qlite3WalDefault
8a6c0 48 6f 6f 6b 28 76 6f 69 64 2a 2c 73 71 6c 69 74 Hook(void*,sqlit
8a6d0 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c e3*,const char*,
8a6e0 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 20 44 65 63 6c int);..../* Decl
8a6f0 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 66 75 6e arations for fun
8a700 63 74 69 6f 6e 73 20 69 6e 20 66 6b 65 79 2e 63 ctions in fkey.c
8a710 2e 20 41 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 . All of these a
8a720 72 65 20 72 65 70 6c 61 63 65 64 20 62 79 0d 0a re replaced by..
8a730 2a 2a 20 6e 6f 2d 6f 70 20 6d 61 63 72 6f 73 20 ** no-op macros
8a740 69 66 20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f if OMIT_FOREIGN_
8a750 4b 45 59 20 69 73 20 64 65 66 69 6e 65 64 2e 20 KEY is defined.
8a760 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 In this case no
8a770 66 6f 72 65 69 67 6e 0d 0a 2a 2a 20 6b 65 79 20 foreign..** key
8a780 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 69 73 functionality is
8a790 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 66 20 4f available. If O
8a7a0 4d 49 54 5f 54 52 49 47 47 45 52 20 69 73 20 64 MIT_TRIGGER is d
8a7b0 65 66 69 6e 65 64 20 62 75 74 0d 0a 2a 2a 20 4f efined but..** O
8a7c0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 MIT_FOREIGN_KEY
8a7d0 69 73 20 6e 6f 74 2c 20 6f 6e 6c 79 20 73 6f 6d is not, only som
8a7e0 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f e of the functio
8a7f0 6e 73 20 61 72 65 20 6e 6f 2d 6f 70 65 64 2e 20 ns are no-oped.
8a800 49 6e 0d 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 In..** this case
8a810 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 foreign keys ar
8a820 65 20 70 61 72 73 65 64 2c 20 62 75 74 20 6e 6f e parsed, but no
8a830 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 61 other functiona
8a840 6c 69 74 79 20 69 73 20 0d 0a 2a 2a 20 70 72 6f lity is ..** pro
8a850 76 69 64 65 64 20 28 65 6e 66 6f 72 63 65 6d 65 vided (enforceme
8a860 6e 74 20 6f 66 20 46 4b 20 63 6f 6e 73 74 72 61 nt of FK constra
8a870 69 6e 74 73 20 72 65 71 75 69 72 65 73 20 74 68 ints requires th
8a880 65 20 74 72 69 67 67 65 72 73 20 73 75 62 2d 73 e triggers sub-s
8a890 79 73 74 65 6d 29 2e 0d 0a 2a 2f 0d 0a 23 69 66 ystem)...*/..#if
8a8a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
8a8b0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 _OMIT_FOREIGN_KE
8a8c0 59 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 Y) && !defined(S
8a8d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 QLITE_OMIT_TRIGG
8a8e0 45 52 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ER)..SQLITE_PRIV
8a8f0 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
8a900 65 33 46 6b 43 68 65 63 6b 28 50 61 72 73 65 2a e3FkCheck(Parse*
8a910 2c 20 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 69 , Table*, int, i
8a920 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
8a930 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 VATE void sqli
8a940 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 50 te3FkDropTable(P
8a950 61 72 73 65 2a 2c 20 53 72 63 4c 69 73 74 20 2a arse*, SrcList *
8a960 2c 20 54 61 62 6c 65 2a 29 3b 0d 0a 53 51 4c 49 , Table*);..SQLI
8a970 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 TE_PRIVATE voi
8a980 64 20 73 71 6c 69 74 65 33 46 6b 41 63 74 69 6f d sqlite3FkActio
8a990 6e 73 28 50 61 72 73 65 2a 2c 20 54 61 62 6c 65 ns(Parse*, Table
8a9a0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e *, ExprList*, in
8a9b0 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 t);..SQLITE_PRIV
8a9c0 41 54 45 20 20 20 69 6e 74 20 73 71 6c 69 74 65 ATE int sqlite
8a9d0 33 46 6b 52 65 71 75 69 72 65 64 28 50 61 72 73 3FkRequired(Pars
8a9e0 65 2a 2c 20 54 61 62 6c 65 2a 2c 20 69 6e 74 2a e*, Table*, int*
8a9f0 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
8aa00 50 52 49 56 41 54 45 20 20 20 75 33 32 20 73 71 PRIVATE u32 sq
8aa10 6c 69 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 50 lite3FkOldmask(P
8aa20 61 72 73 65 2a 2c 20 54 61 62 6c 65 2a 29 3b 0d arse*, Table*);.
8aa30 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
8aa40 20 20 46 4b 65 79 20 2a 73 71 6c 69 74 65 33 46 FKey *sqlite3F
8aa50 6b 52 65 66 65 72 65 6e 63 65 73 28 54 61 62 6c kReferences(Tabl
8aa60 65 20 2a 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 e *);..#else..
8aa70 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 #define sqlite3F
8aa80 6b 41 63 74 69 6f 6e 73 28 61 2c 62 2c 63 2c 64 kActions(a,b,c,d
8aa90 29 0d 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c ).. #define sql
8aaa0 69 74 65 33 46 6b 43 68 65 63 6b 28 61 2c 62 2c ite3FkCheck(a,b,
8aab0 63 2c 64 29 0d 0a 20 20 23 64 65 66 69 6e 65 20 c,d).. #define
8aac0 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 sqlite3FkDropTab
8aad0 6c 65 28 61 2c 62 2c 63 29 0d 0a 20 20 23 64 65 le(a,b,c).. #de
8aae0 66 69 6e 65 20 73 71 6c 69 74 65 33 46 6b 4f 6c fine sqlite3FkOl
8aaf0 64 6d 61 73 6b 28 61 2c 62 29 20 20 20 20 20 20 dmask(a,b)
8ab00 30 0d 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 0.. #define sql
8ab10 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 61 ite3FkRequired(a
8ab20 2c 62 2c 63 2c 64 29 20 30 0d 0a 23 65 6e 64 69 ,b,c,d) 0..#endi
8ab30 66 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 f..#ifndef SQLIT
8ab40 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b E_OMIT_FOREIGN_K
8ab50 45 59 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 EY..SQLITE_PRIVA
8ab60 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
8ab70 33 46 6b 44 65 6c 65 74 65 28 73 71 6c 69 74 65 3FkDelete(sqlite
8ab80 33 20 2a 2c 20 54 61 62 6c 65 2a 29 3b 0d 0a 23 3 *, Table*);..#
8ab90 65 6c 73 65 0d 0a 20 20 23 64 65 66 69 6e 65 20 else.. #define
8aba0 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 sqlite3FkDelete(
8abb0 61 2c 62 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a a,b)..#endif....
8abc0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 76 61 69 6c 61 62 ../*..** Availab
8abd0 6c 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f le fault injecto
8abe0 72 73 2e 20 20 53 68 6f 75 6c 64 20 62 65 20 6e rs. Should be n
8abf0 75 6d 62 65 72 65 64 20 62 65 67 69 6e 6e 69 6e umbered beginnin
8ac00 67 20 77 69 74 68 20 30 2e 0d 0a 2a 2f 0d 0a 23 g with 0...*/..#
8ac10 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 41 define SQLITE_FA
8ac20 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c ULTINJECTOR_MALL
8ac30 4f 43 20 20 20 20 20 30 0d 0a 23 64 65 66 69 6e OC 0..#defin
8ac40 65 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e e SQLITE_FAULTIN
8ac50 4a 45 43 54 4f 52 5f 43 4f 55 4e 54 20 20 20 20 JECTOR_COUNT
8ac60 20 20 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 1..../*..** Th
8ac70 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 e interface to t
8ac80 68 65 20 63 6f 64 65 20 69 6e 20 66 61 75 6c 74 he code in fault
8ac90 2e 63 20 75 73 65 64 20 66 6f 72 20 69 64 65 6e .c used for iden
8aca0 74 69 66 79 69 6e 67 20 22 62 65 6e 69 67 6e 22 tifying "benign"
8acb0 0d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c ..** malloc fail
8acc0 75 72 65 73 2e 20 54 68 69 73 20 69 73 20 6f 6e ures. This is on
8acd0 6c 79 20 70 72 65 73 65 6e 74 20 69 66 20 53 51 ly present if SQ
8ace0 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 LITE_OMIT_BUILTI
8acf0 4e 5f 54 45 53 54 0d 0a 2a 2a 20 69 73 20 6e 6f N_TEST..** is no
8ad00 74 20 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a t defined...*/..
8ad10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
8ad20 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 MIT_BUILTIN_TEST
8ad30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
8ad40 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 void sqlite3B
8ad50 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 eginBenignMalloc
8ad60 28 76 6f 69 64 29 3b 0d 0a 53 51 4c 49 54 45 5f (void);..SQLITE_
8ad70 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 PRIVATE void s
8ad80 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d qlite3EndBenignM
8ad90 61 6c 6c 6f 63 28 76 6f 69 64 29 3b 0d 0a 23 65 alloc(void);..#e
8ada0 6c 73 65 0d 0a 20 20 23 64 65 66 69 6e 65 20 73 lse.. #define s
8adb0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 qlite3BeginBenig
8adc0 6e 4d 61 6c 6c 6f 63 28 29 0d 0a 20 20 23 64 65 nMalloc().. #de
8add0 66 69 6e 65 20 73 71 6c 69 74 65 33 45 6e 64 42 fine sqlite3EndB
8ade0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 0d 0a 23 enignMalloc()..#
8adf0 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 endif....#define
8ae00 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 IN_INDEX_ROWID
8ae10 20 20 20 20 20 20 20 20 20 20 31 0d 0a 23 64 65 1..#de
8ae20 66 69 6e 65 20 49 4e 5f 49 4e 44 45 58 5f 45 50 fine IN_INDEX_EP
8ae30 48 20 20 20 20 20 20 20 20 20 20 20 20 20 32 0d H 2.
8ae40 0a 23 64 65 66 69 6e 65 20 49 4e 5f 49 4e 44 45 .#define IN_INDE
8ae50 58 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 X_INDEX
8ae60 20 20 33 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 3..SQLITE_PRIV
8ae70 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 46 ATE int sqlite3F
8ae80 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 indInIndex(Parse
8ae90 20 2a 2c 20 45 78 70 72 20 2a 2c 20 69 6e 74 2a *, Expr *, int*
8aea0 29 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c );....#ifdef SQL
8aeb0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 ITE_ENABLE_ATOMI
8aec0 43 5f 57 52 49 54 45 0d 0a 53 51 4c 49 54 45 5f C_WRITE..SQLITE_
8aed0 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 71 PRIVATE int sq
8aee0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e lite3JournalOpen
8aef0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 (sqlite3_vfs *,
8af00 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73 71 const char *, sq
8af10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2c 20 69 6e lite3_file *, in
8af20 74 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 t, int);..SQLITE
8af30 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 _PRIVATE int s
8af40 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a qlite3JournalSiz
8af50 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 e(sqlite3_vfs *)
8af60 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8af70 45 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4a E int sqlite3J
8af80 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 73 71 6c ournalCreate(sql
8af90 69 74 65 33 5f 66 69 6c 65 20 2a 29 3b 0d 0a 23 ite3_file *);..#
8afa0 65 6c 73 65 0d 0a 20 20 23 64 65 66 69 6e 65 20 else.. #define
8afb0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 sqlite3JournalSi
8afc0 7a 65 28 70 56 66 73 29 20 28 28 70 56 66 73 29 ze(pVfs) ((pVfs)
8afd0 2d 3e 73 7a 4f 73 46 69 6c 65 29 0d 0a 23 65 6e ->szOsFile)..#en
8afe0 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 dif....SQLITE_PR
8aff0 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
8b000 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e e3MemJournalOpen
8b010 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 (sqlite3_file *)
8b020 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8b030 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d E int sqlite3Mem
8b040 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 76 6f 69 64 JournalSize(void
8b050 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
8b060 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 49 73 TE int sqlite3Is
8b070 4d 65 6d 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 MemJournal(sqlit
8b080 65 33 5f 66 69 6c 65 20 2a 29 3b 0d 0a 0d 0a 23 e3_file *);....#
8b090 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 if SQLITE_MAX_EX
8b0a0 50 52 5f 44 45 50 54 48 3e 30 0d 0a 53 51 4c 49 PR_DEPTH>0..SQLI
8b0b0 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 TE_PRIVATE voi
8b0c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 d sqlite3ExprSet
8b0d0 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 Height(Parse *pP
8b0e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 3b 0d arse, Expr *p);.
8b0f0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
8b100 20 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c int sqlite3Sel
8b110 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 ectExprHeight(Se
8b120 6c 65 63 74 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 lect *);..SQLITE
8b130 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 73 _PRIVATE int s
8b140 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 qlite3ExprCheckH
8b150 65 69 67 68 74 28 50 61 72 73 65 2a 2c 20 69 6e eight(Parse*, in
8b160 74 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 23 64 t);..#else.. #d
8b170 65 66 69 6e 65 20 73 71 6c 69 74 65 33 45 78 70 efine sqlite3Exp
8b180 72 53 65 74 48 65 69 67 68 74 28 78 2c 79 29 0d rSetHeight(x,y).
8b190 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 . #define sqlit
8b1a0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 e3SelectExprHeig
8b1b0 68 74 28 78 29 20 30 0d 0a 20 20 23 64 65 66 69 ht(x) 0.. #defi
8b1c0 6e 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 ne sqlite3ExprCh
8b1d0 65 63 6b 48 65 69 67 68 74 28 78 2c 79 29 0d 0a eckHeight(x,y)..
8b1e0 23 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 #endif....SQLITE
8b1f0 5f 50 52 49 56 41 54 45 20 75 33 32 20 73 71 6c _PRIVATE u32 sql
8b200 69 74 65 33 47 65 74 34 62 79 74 65 28 63 6f 6e ite3Get4byte(con
8b210 73 74 20 75 38 2a 29 3b 0d 0a 53 51 4c 49 54 45 st u8*);..SQLITE
8b220 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
8b230 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 75 38 lite3Put4byte(u8
8b240 2a 2c 20 75 33 32 29 3b 0d 0a 0d 0a 23 69 66 64 *, u32);....#ifd
8b250 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
8b260 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0d 0a _UNLOCK_NOTIFY..
8b270 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
8b280 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6e void sqlite3Con
8b290 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 73 nectionBlocked(s
8b2a0 71 6c 69 74 65 33 20 2a 2c 20 73 71 6c 69 74 65 qlite3 *, sqlite
8b2b0 33 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 3 *);..SQLITE_PR
8b2c0 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c IVATE void sql
8b2d0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e ite3ConnectionUn
8b2e0 6c 6f 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a locked(sqlite3 *
8b2f0 64 62 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 db);..SQLITE_PRI
8b300 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 VATE void sqli
8b310 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f te3ConnectionClo
8b320 73 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 sed(sqlite3 *db)
8b330 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 23 64 65 66 ;..#else.. #def
8b340 69 6e 65 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 ine sqlite3Conne
8b350 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 78 2c 79 ctionBlocked(x,y
8b360 29 0d 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c ).. #define sql
8b370 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e ite3ConnectionUn
8b380 6c 6f 63 6b 65 64 28 78 29 0d 0a 20 20 23 64 65 locked(x).. #de
8b390 66 69 6e 65 20 73 71 6c 69 74 65 33 43 6f 6e 6e fine sqlite3Conn
8b3a0 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 78 29 0d ectionClosed(x).
8b3b0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 64 65 .#endif....#ifde
8b3c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a f SQLITE_DEBUG..
8b3d0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
8b3e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 72 void sqlite3Par
8b3f0 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 serTrace(FILE*,
8b400 63 68 61 72 20 2a 29 3b 0d 0a 23 65 6e 64 69 66 char *);..#endif
8b410 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 ..../*..** If th
8b420 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 20 e SQLITE_ENABLE
8b430 49 4f 54 52 41 43 45 20 65 78 69 73 74 73 20 74 IOTRACE exists t
8b440 68 65 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 hen the global v
8b450 61 72 69 61 62 6c 65 0d 0a 2a 2a 20 73 71 6c 69 ariable..** sqli
8b460 74 65 33 49 6f 54 72 61 63 65 20 69 73 20 61 20 te3IoTrace is a
8b470 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 pointer to a pri
8b480 6e 74 66 2d 6c 69 6b 65 20 72 6f 75 74 69 6e 65 ntf-like routine
8b490 20 75 73 65 64 20 74 6f 0d 0a 2a 2a 20 70 72 69 used to..** pri
8b4a0 6e 74 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 6d nt I/O tracing m
8b4b0 65 73 73 61 67 65 73 2e 20 0d 0a 2a 2f 0d 0a 23 essages. ..*/..#
8b4c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
8b4d0 42 4c 45 5f 49 4f 54 52 41 43 45 0d 0a 23 20 64 BLE_IOTRACE..# d
8b4e0 65 66 69 6e 65 20 49 4f 54 52 41 43 45 28 41 29 efine IOTRACE(A)
8b4f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 if( sqlite3IoT
8b500 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 49 race ){ sqlite3I
8b510 6f 54 72 61 63 65 20 41 3b 20 7d 0d 0a 53 51 4c oTrace A; }..SQL
8b520 49 54 45 5f 50 52 49 56 41 54 45 20 20 20 76 6f ITE_PRIVATE vo
8b530 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f id sqlite3VdbeIO
8b540 54 72 61 63 65 53 71 6c 28 56 64 62 65 2a 29 3b TraceSql(Vdbe*);
8b550 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
8b560 20 76 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 void (*sqlite3I
8b570 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 oTrace)(const ch
8b580 61 72 2a 2c 2e 2e 2e 29 3b 0d 0a 23 65 6c 73 65 ar*,...);..#else
8b590 0d 0a 23 20 64 65 66 69 6e 65 20 49 4f 54 52 41 ..# define IOTRA
8b5a0 43 45 28 41 29 0d 0a 23 20 64 65 66 69 6e 65 20 CE(A)..# define
8b5b0 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 sqlite3VdbeIOTra
8b5c0 63 65 53 71 6c 28 58 29 0d 0a 23 65 6e 64 69 66 ceSql(X)..#endif
8b5d0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 ..../*..** These
8b5e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 76 routines are av
8b5f0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 ailable for the
8b600 6d 65 6d 32 2e 63 20 64 65 62 75 67 67 69 6e 67 mem2.c debugging
8b610 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f memory allocato
8b620 72 0d 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 r..** only. The
8b630 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 76 65 y are used to ve
8b640 72 69 66 79 20 74 68 61 74 20 64 69 66 66 65 72 rify that differ
8b650 65 6e 74 20 22 74 79 70 65 73 22 20 6f 66 20 6d ent "types" of m
8b660 65 6d 6f 72 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 emory..** alloca
8b670 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 70 65 72 tions are proper
8b680 6c 79 20 74 72 61 63 6b 65 64 20 62 79 20 74 68 ly tracked by th
8b690 65 20 73 79 73 74 65 6d 2e 0d 0a 2a 2a 0d 0a 2a e system...**..*
8b6a0 2a 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 * sqlite3Memdebu
8b6b0 67 53 65 74 54 79 70 65 28 29 20 73 65 74 73 20 gSetType() sets
8b6c0 74 68 65 20 22 74 79 70 65 22 20 6f 66 20 61 6e the "type" of an
8b6d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6f allocation to o
8b6e0 6e 65 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 4d 45 ne of..** the ME
8b6f0 4d 54 59 50 45 5f 2a 20 6d 61 63 72 6f 73 20 64 MTYPE_* macros d
8b700 65 66 69 6e 65 64 20 62 65 6c 6f 77 2e 20 20 54 efined below. T
8b710 68 65 20 74 79 70 65 20 6d 75 73 74 20 62 65 20 he type must be
8b720 61 20 62 69 74 6d 61 73 6b 20 77 69 74 68 0d 0a a bitmask with..
8b730 2a 2a 20 61 20 73 69 6e 67 6c 65 20 62 69 74 20 ** a single bit
8b740 73 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 73 71 6c set...**..** sql
8b750 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 ite3MemdebugHasT
8b760 79 70 65 28 29 20 72 65 74 75 72 6e 73 20 74 72 ype() returns tr
8b770 75 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 ue if any of the
8b780 20 62 69 74 73 20 69 6e 20 69 74 73 20 73 65 63 bits in its sec
8b790 6f 6e 64 0d 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 ond..** argument
8b7a0 20 6d 61 74 63 68 20 74 68 65 20 74 79 70 65 20 match the type
8b7b0 73 65 74 20 62 79 20 74 68 65 20 70 72 65 76 69 set by the previ
8b7c0 6f 75 73 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 ous sqlite3Memde
8b7d0 62 75 67 53 65 74 54 79 70 65 28 29 2e 0d 0a 2a bugSetType()...*
8b7e0 2a 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 * sqlite3Memdebu
8b7f0 67 48 61 73 54 79 70 65 28 29 20 69 73 20 69 6e gHasType() is in
8b800 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 tended for use i
8b810 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 20 73 nside assert() s
8b820 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 2a 2a 0d 0a tatements...**..
8b830 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 ** sqlite3Memdeb
8b840 75 67 4e 6f 54 79 70 65 28 29 20 72 65 74 75 72 ugNoType() retur
8b850 6e 73 20 74 72 75 65 20 69 66 20 6e 6f 6e 65 20 ns true if none
8b860 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 69 of the bits in i
8b870 74 73 20 73 65 63 6f 6e 64 0d 0a 2a 2a 20 61 72 ts second..** ar
8b880 67 75 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 gument match the
8b890 20 74 79 70 65 20 73 65 74 20 62 79 20 74 68 65 type set by the
8b8a0 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 previous sqlite
8b8b0 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 3MemdebugSetType
8b8c0 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 65 72 68 ()...**..** Perh
8b8d0 61 70 73 20 74 68 65 20 6d 6f 73 74 20 69 6d 70 aps the most imp
8b8e0 6f 72 74 61 6e 74 20 70 6f 69 6e 74 20 69 73 20 ortant point is
8b8f0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 the difference b
8b900 65 74 77 65 65 6e 20 4d 45 4d 54 59 50 45 5f 48 etween MEMTYPE_H
8b910 45 41 50 0d 0a 2a 2a 20 61 6e 64 20 4d 45 4d 54 EAP..** and MEMT
8b920 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 2e 20 20 YPE_LOOKASIDE.
8b930 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e If an allocation
8b940 20 69 73 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b is MEMTYPE_LOOK
8b950 41 53 49 44 45 2c 20 74 68 61 74 20 6d 65 61 6e ASIDE, that mean
8b960 73 0d 0a 2a 2a 20 69 74 20 6d 69 67 68 74 20 68 s..** it might h
8b970 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 ave been allocat
8b980 65 64 20 62 79 20 6c 6f 6f 6b 61 73 69 64 65 2c ed by lookaside,
8b990 20 65 78 63 65 70 74 20 74 68 65 20 61 6c 6c 6f except the allo
8b9a0 63 61 74 69 6f 6e 20 77 61 73 0d 0a 2a 2a 20 74 cation was..** t
8b9b0 6f 6f 20 6c 61 72 67 65 20 6f 72 20 6c 6f 6f 6b oo large or look
8b9c0 61 73 69 64 65 20 77 61 73 20 61 6c 72 65 61 64 aside was alread
8b9d0 79 20 66 75 6c 6c 2e 20 20 49 74 20 69 73 20 69 y full. It is i
8b9e0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 76 65 72 69 mportant to veri
8b9f0 66 79 0d 0a 2a 2a 20 74 68 61 74 20 61 6c 6c 6f fy..** that allo
8ba00 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 cations that mig
8ba10 68 74 20 68 61 76 65 20 62 65 65 6e 20 73 61 74 ht have been sat
8ba20 69 73 66 69 65 64 20 62 79 20 6c 6f 6f 6b 61 73 isfied by lookas
8ba30 69 64 65 20 61 72 65 20 6e 6f 74 0d 0a 2a 2a 20 ide are not..**
8ba40 70 61 73 73 65 64 20 62 61 63 6b 20 74 6f 20 6e passed back to n
8ba50 6f 6e 2d 6c 6f 6f 6b 61 73 69 64 65 20 66 72 65 on-lookaside fre
8ba60 65 28 29 20 72 6f 75 74 69 6e 65 73 2e 20 20 41 e() routines. A
8ba70 73 73 65 72 74 73 20 73 75 63 68 20 61 73 20 74 sserts such as t
8ba80 68 65 0d 0a 2a 2a 20 65 78 61 6d 70 6c 65 20 61 he..** example a
8ba90 62 6f 76 65 20 61 72 65 20 70 6c 61 63 65 64 20 bove are placed
8baa0 6f 6e 20 74 68 65 20 6e 6f 6e 2d 6c 6f 6f 6b 61 on the non-looka
8bab0 73 69 64 65 20 66 72 65 65 28 29 20 72 6f 75 74 side free() rout
8bac0 69 6e 65 73 20 74 6f 20 76 65 72 69 66 79 0d 0a ines to verify..
8bad0 2a 2a 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 ** this constrai
8bae0 6e 74 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c nt. ..**..** All
8baf0 20 6f 66 20 74 68 69 73 20 69 73 20 6e 6f 2d 6f of this is no-o
8bb00 70 20 66 6f 72 20 61 20 70 72 6f 64 75 63 74 69 p for a producti
8bb10 6f 6e 20 62 75 69 6c 64 2e 20 20 49 74 20 6f 6e on build. It on
8bb20 6c 79 20 63 6f 6d 65 73 20 69 6e 74 6f 0d 0a 2a ly comes into..*
8bb30 2a 20 70 6c 61 79 20 77 68 65 6e 20 74 68 65 20 * play when the
8bb40 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 SQLITE_MEMDEBUG
8bb50 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 compile-time opt
8bb60 69 6f 6e 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2f ion is used...*/
8bb70 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
8bb80 4d 45 4d 44 45 42 55 47 0d 0a 53 51 4c 49 54 45 MEMDEBUG..SQLITE
8bb90 5f 50 52 49 56 41 54 45 20 20 20 76 6f 69 64 20 _PRIVATE void
8bba0 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 sqlite3MemdebugS
8bbb0 65 74 54 79 70 65 28 76 6f 69 64 2a 2c 75 38 29 etType(void*,u8)
8bbc0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
8bbd0 45 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4d E int sqlite3M
8bbe0 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 76 emdebugHasType(v
8bbf0 6f 69 64 2a 2c 75 38 29 3b 0d 0a 53 51 4c 49 54 oid*,u8);..SQLIT
8bc00 45 5f 50 52 49 56 41 54 45 20 20 20 69 6e 74 20 E_PRIVATE int
8bc10 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4e sqlite3MemdebugN
8bc20 6f 54 79 70 65 28 76 6f 69 64 2a 2c 75 38 29 3b oType(void*,u8);
8bc30 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
8bc40 65 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 e sqlite3Memdebu
8bc50 67 53 65 74 54 79 70 65 28 58 2c 59 29 20 20 2f gSetType(X,Y) /
8bc60 2a 20 6e 6f 2d 6f 70 20 2a 2f 0d 0a 23 20 64 65 * no-op */..# de
8bc70 66 69 6e 65 20 73 71 6c 69 74 65 33 4d 65 6d 64 fine sqlite3Memd
8bc80 65 62 75 67 48 61 73 54 79 70 65 28 58 2c 59 29 ebugHasType(X,Y)
8bc90 20 20 31 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 1..# define sq
8bca0 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 lite3MemdebugNoT
8bcb0 79 70 65 28 58 2c 59 29 20 20 20 31 0d 0a 23 65 ype(X,Y) 1..#e
8bcc0 6e 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 4d 45 ndif..#define ME
8bcd0 4d 54 59 50 45 5f 48 45 41 50 20 20 20 20 20 20 MTYPE_HEAP
8bce0 20 30 78 30 31 20 20 2f 2a 20 47 65 6e 65 72 61 0x01 /* Genera
8bcf0 6c 20 68 65 61 70 20 61 6c 6c 6f 63 61 74 69 6f l heap allocatio
8bd00 6e 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d ns */..#define M
8bd10 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 EMTYPE_LOOKASIDE
8bd20 20 20 30 78 30 32 20 20 2f 2a 20 4d 69 67 68 74 0x02 /* Might
8bd30 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 6f 6b 61 have been looka
8bd40 73 69 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a side memory */..
8bd50 23 64 65 66 69 6e 65 20 4d 45 4d 54 59 50 45 5f #define MEMTYPE_
8bd60 53 43 52 41 54 43 48 20 20 20 20 30 78 30 34 20 SCRATCH 0x04
8bd70 20 2f 2a 20 53 63 72 61 74 63 68 20 61 6c 6c 6f /* Scratch allo
8bd80 63 61 74 69 6f 6e 73 20 2a 2f 0d 0a 23 64 65 66 cations */..#def
8bd90 69 6e 65 20 4d 45 4d 54 59 50 45 5f 50 43 41 43 ine MEMTYPE_PCAC
8bda0 48 45 20 20 20 20 20 30 78 30 38 20 20 2f 2a 20 HE 0x08 /*
8bdb0 50 61 67 65 20 63 61 63 68 65 20 61 6c 6c 6f 63 Page cache alloc
8bdc0 61 74 69 6f 6e 73 20 2a 2f 0d 0a 23 64 65 66 69 ations */..#defi
8bdd0 6e 65 20 4d 45 4d 54 59 50 45 5f 44 42 20 20 20 ne MEMTYPE_DB
8bde0 20 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 55 0x10 /* U
8bdf0 73 65 73 20 73 71 6c 69 74 65 33 44 62 4d 61 6c ses sqlite3DbMal
8be00 6c 6f 63 2c 20 6e 6f 74 20 73 71 6c 69 74 65 5f loc, not sqlite_
8be10 6d 61 6c 6c 6f 63 20 2a 2f 0d 0a 0d 0a 23 65 6e malloc */....#en
8be20 64 69 66 20 2f 2a 20 5f 53 51 4c 49 54 45 49 4e dif /* _SQLITEIN
8be30 54 5f 48 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a T_H_ */..../****
8be40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
8be50 66 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2a f sqliteInt.h **
8be60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8be70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8be80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
8be90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
8bea0 6e 20 66 69 6c 65 20 67 6c 6f 62 61 6c 2e 63 20 n file global.c
8beb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8bec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8bed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
8bee0 0a 2a 2a 20 32 30 30 38 20 4a 75 6e 65 20 31 33 .** 2008 June 13
8bef0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 ..**..** The aut
8bf00 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f hor disclaims co
8bf10 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 pyright to this
8bf20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e source code. In
8bf30 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 place of..** a
8bf40 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 legal notice, he
8bf50 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 re is a blessing
8bf60 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 :..**..** May
8bf70 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 you do good and
8bf80 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 not evil...**
8bf90 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
8bfa0 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
8bfb0 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
8bfc0 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 ive others...**
8bfd0 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
8bfe0 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
8bff0 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
8c000 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a you give...**..*
8c010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8c020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8c030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8c040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8c050 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a ********..**..**
8c060 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 This file conta
8c070 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 ins definitions
8c080 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 of global variab
8c090 6c 65 73 20 61 6e 64 20 63 6f 6e 74 61 6e 74 73 les and contants
8c0a0 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 20 41 6e 20 61 ...*/..../* An a
8c0b0 72 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20 rray to map all
8c0c0 75 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61 upper-case chara
8c0d0 63 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72 cters into their
8c0e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0d 0a corresponding..
8c0f0 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 ** lower-case ch
8c100 61 72 61 63 74 65 72 2e 20 0d 0a 2a 2a 0d 0a 2a aracter. ..**..*
8c110 2a 20 53 51 4c 69 74 65 20 6f 6e 6c 79 20 63 6f * SQLite only co
8c120 6e 73 69 64 65 72 73 20 55 53 2d 41 53 43 49 49 nsiders US-ASCII
8c130 20 28 6f 72 20 45 42 43 44 49 43 29 20 63 68 61 (or EBCDIC) cha
8c140 72 61 63 74 65 72 73 2e 20 20 57 65 20 64 6f 20 racters. We do
8c150 6e 6f 74 0d 0a 2a 2a 20 68 61 6e 64 6c 65 20 63 not..** handle c
8c160 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 ase conversions
8c170 66 6f 72 20 74 68 65 20 55 54 46 20 63 68 61 72 for the UTF char
8c180 61 63 74 65 72 20 73 65 74 20 73 69 6e 63 65 20 acter set since
8c190 74 68 65 20 74 61 62 6c 65 73 0d 0a 2a 2a 20 69 the tables..** i
8c1a0 6e 76 6f 6c 76 65 64 20 61 72 65 20 6e 65 61 72 nvolved are near
8c1b0 6c 79 20 61 73 20 62 69 67 20 6f 72 20 62 69 67 ly as big or big
8c1c0 67 65 72 20 74 68 61 6e 20 53 51 4c 69 74 65 20 ger than SQLite
8c1d0 69 74 73 65 6c 66 2e 0d 0a 2a 2f 0d 0a 65 78 74 itself...*/..ext
8c1e0 65 72 6e 20 75 6e 73 69 67 6e 65 64 20 73 68 6f ern unsigned sho
8c1f0 72 74 20 6f 61 73 55 70 70 65 72 32 4c 6f 77 65 rt oasUpper2Lowe
8c200 72 5b 30 78 46 46 46 46 5d 3b 0d 0a 2f 2f 20 cd r[0xFFFF];..// .
8c210 e5 20 e8 f1 ef ee eb fc e7 f3 e5 f2 f1 ff 0d 0a . ..............
8c220 23 69 66 20 30 0d 0a 53 51 4c 49 54 45 5f 50 52 #if 0..SQLITE_PR
8c230 49 56 41 54 45 20 63 6f 6e 73 74 20 75 6e 73 69 IVATE const unsi
8c240 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65 gned char sqlite
8c250 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 5d 20 3UpperToLower[]
8c260 3d 20 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 = {..#ifdef SQLI
8c270 54 45 5f 41 53 43 49 49 0d 0a 20 20 20 20 20 20 TE_ASCII..
8c280 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 0, 1, 2, 3,
8c290 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 4, 5, 6, 7,
8c2a0 38 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 8, 9, 10, 11, 1
8c2b0 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 2, 13, 14, 15, 1
8c2c0 36 2c 20 31 37 2c 0d 0a 20 20 20 20 20 31 38 2c 6, 17,.. 18,
8c2d0 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 19, 20, 21, 22,
8c2e0 20 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 23, 24, 25, 26,
8c2f0 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 27, 28, 29, 30,
8c300 20 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 31, 32, 33, 34,
8c310 20 33 35 2c 0d 0a 20 20 20 20 20 33 36 2c 20 33 35,.. 36, 3
8c320 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 7, 38, 39, 40, 4
8c330 31 2c 20 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 1, 42, 43, 44, 4
8c340 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 5, 46, 47, 48, 4
8c350 39 2c 20 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 9, 50, 51, 52, 5
8c360 33 2c 0d 0a 20 20 20 20 20 35 34 2c 20 35 35 2c 3,.. 54, 55,
8c370 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 56, 57, 58, 59,
8c380 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36 33 2c 60, 61, 62, 63,
8c390 20 36 34 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 64, 97, 98, 99,
8c3a0 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 100,101,102,103,
8c3b0 0d 0a 20 20 20 20 31 30 34 2c 31 30 35 2c 31 30 .. 104,105,10
8c3c0 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c 31 31 6,107,108,109,11
8c3d0 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31 0,111,112,113,11
8c3e0 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31 4,115,116,117,11
8c3f0 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 0d 0a 8,119,120,121,..
8c400 20 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32 2c 122, 91, 92,
8c410 20 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c 93, 94, 95, 96,
8c420 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 97, 98, 99,100,
8c430 31 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c 101,102,103,104,
8c440 31 30 35 2c 31 30 36 2c 31 30 37 2c 0d 0a 20 20 105,106,107,..
8c450 20 20 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 108,109,110,11
8c460 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 1,112,113,114,11
8c470 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 5,116,117,118,11
8c480 39 2c 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32 9,120,121,122,12
8c490 33 2c 31 32 34 2c 31 32 35 2c 0d 0a 20 20 20 20 3,124,125,..
8c4a0 31 32 36 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 126,127,128,129,
8c4b0 31 33 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 130,131,132,133,
8c4c0 31 33 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 134,135,136,137,
8c4d0 31 33 38 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 138,139,140,141,
8c4e0 31 34 32 2c 31 34 33 2c 0d 0a 20 20 20 20 31 34 142,143,.. 14
8c4f0 34 2c 31 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 4,145,146,147,14
8c500 38 2c 31 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 8,149,150,151,15
8c510 32 2c 31 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 2,153,154,155,15
8c520 36 2c 31 35 37 2c 31 35 38 2c 31 35 39 2c 31 36 6,157,158,159,16
8c530 30 2c 31 36 31 2c 0d 0a 20 20 20 20 31 36 32 2c 0,161,.. 162,
8c540 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 36 36 2c 163,164,165,166,
8c550 31 36 37 2c 31 36 38 2c 31 36 39 2c 31 37 30 2c 167,168,169,170,
8c560 31 37 31 2c 31 37 32 2c 31 37 33 2c 31 37 34 2c 171,172,173,174,
8c570 31 37 35 2c 31 37 36 2c 31 37 37 2c 31 37 38 2c 175,176,177,178,
8c580 31 37 39 2c 0d 0a 20 20 20 20 31 38 30 2c 31 38 179,.. 180,18
8c590 31 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38 1,182,183,184,18
8c5a0 35 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38 5,186,187,188,18
8c5b0 39 2c 31 39 30 2c 31 39 31 2c 31 39 32 2c 31 39 9,190,191,192,19
8c5c0 33 2c 31 39 34 2c 31 39 35 2c 31 39 36 2c 31 39 3,194,195,196,19
8c5d0 37 2c 0d 0a 20 20 20 20 31 39 38 2c 31 39 39 2c 7,.. 198,199,
8c5e0 32 30 30 2c 32 30 31 2c 32 30 32 2c 32 30 33 2c 200,201,202,203,
8c5f0 32 30 34 2c 32 30 35 2c 32 30 36 2c 32 30 37 2c 204,205,206,207,
8c600 32 30 38 2c 32 30 39 2c 32 31 30 2c 32 31 31 2c 208,209,210,211,
8c610 32 31 32 2c 32 31 33 2c 32 31 34 2c 32 31 35 2c 212,213,214,215,
8c620 0d 0a 20 20 20 20 32 31 36 2c 32 31 37 2c 32 31 .. 216,217,21
8c630 38 2c 32 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 8,219,220,221,22
8c640 32 2c 32 32 33 2c 32 32 34 2c 32 32 35 2c 32 32 2,223,224,225,22
8c650 36 2c 32 32 37 2c 32 32 38 2c 32 32 39 2c 32 33 6,227,228,229,23
8c660 30 2c 32 33 31 2c 32 33 32 2c 32 33 33 2c 0d 0a 0,231,232,233,..
8c670 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33 36 2c 234,235,236,
8c680 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34 30 2c 237,238,239,240,
8c690 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34 34 2c 241,242,243,244,
8c6a0 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34 38 2c 245,246,247,248,
8c6b0 32 34 39 2c 32 35 30 2c 32 35 31 2c 0d 0a 20 20 249,250,251,..
8c6c0 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32 35 252,253,254,25
8c6d0 35 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 5..#endif..#ifde
8c6e0 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0d f SQLITE_EBCDIC.
8c6f0 0a 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32 . 0, 1, 2
8c700 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 , 3, 4, 5, 6
8c710 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 , 7, 8, 9, 10
8c720 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 , 11, 12, 13, 14
8c730 2c 20 31 35 2c 20 2f 2a 20 30 78 20 2a 2f 0d 0a , 15, /* 0x */..
8c740 20 20 20 20 20 31 36 2c 20 31 37 2c 20 31 38 2c 16, 17, 18,
8c750 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 19, 20, 21, 22,
8c760 20 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 23, 24, 25, 26,
8c770 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 27, 28, 29, 30,
8c780 20 33 31 2c 20 2f 2a 20 31 78 20 2a 2f 0d 0a 20 31, /* 1x */..
8c790 20 20 20 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 32, 33, 34,
8c7a0 33 35 2c 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 35, 36, 37, 38,
8c7b0 33 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 39, 40, 41, 42,
8c7c0 34 33 2c 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 43, 44, 45, 46,
8c7d0 34 37 2c 20 2f 2a 20 32 78 20 2a 2f 0d 0a 20 20 47, /* 2x */..
8c7e0 20 20 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 48, 49, 50, 5
8c7f0 31 2c 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 1, 52, 53, 54, 5
8c800 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 5, 56, 57, 58, 5
8c810 39 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36 9, 60, 61, 62, 6
8c820 33 2c 20 2f 2a 20 33 78 20 2a 2f 0d 0a 20 20 20 3, /* 3x */..
8c830 20 20 36 34 2c 20 36 35 2c 20 36 36 2c 20 36 37 64, 65, 66, 67
8c840 2c 20 36 38 2c 20 36 39 2c 20 37 30 2c 20 37 31 , 68, 69, 70, 71
8c850 2c 20 37 32 2c 20 37 33 2c 20 37 34 2c 20 37 35 , 72, 73, 74, 75
8c860 2c 20 37 36 2c 20 37 37 2c 20 37 38 2c 20 37 39 , 76, 77, 78, 79
8c870 2c 20 2f 2a 20 34 78 20 2a 2f 0d 0a 20 20 20 20 , /* 4x */..
8c880 20 38 30 2c 20 38 31 2c 20 38 32 2c 20 38 33 2c 80, 81, 82, 83,
8c890 20 38 34 2c 20 38 35 2c 20 38 36 2c 20 38 37 2c 84, 85, 86, 87,
8c8a0 20 38 38 2c 20 38 39 2c 20 39 30 2c 20 39 31 2c 88, 89, 90, 91,
8c8b0 20 39 32 2c 20 39 33 2c 20 39 34 2c 20 39 35 2c 92, 93, 94, 95,
8c8c0 20 2f 2a 20 35 78 20 2a 2f 0d 0a 20 20 20 20 20 /* 5x */..
8c8d0 39 36 2c 20 39 37 2c 20 36 36 2c 20 36 37 2c 20 96, 97, 66, 67,
8c8e0 36 38 2c 20 36 39 2c 20 37 30 2c 20 37 31 2c 20 68, 69, 70, 71,
8c8f0 37 32 2c 20 37 33 2c 31 30 36 2c 31 30 37 2c 31 72, 73,106,107,1
8c900 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c 20 08,109,110,111,
8c910 2f 2a 20 36 78 20 2a 2f 0d 0a 20 20 20 20 31 31 /* 6x */.. 11
8c920 32 2c 20 38 31 2c 20 38 32 2c 20 38 33 2c 20 38 2, 81, 82, 83, 8
8c930 34 2c 20 38 35 2c 20 38 36 2c 20 38 37 2c 20 38 4, 85, 86, 87, 8
8c940 38 2c 20 38 39 2c 31 32 32 2c 31 32 33 2c 31 32 8, 89,122,123,12
8c950 34 2c 31 32 35 2c 31 32 36 2c 31 32 37 2c 20 2f 4,125,126,127, /
8c960 2a 20 37 78 20 2a 2f 0d 0a 20 20 20 20 31 32 38 * 7x */.. 128
8c970 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c 31 33 32 ,129,130,131,132
8c980 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c 31 33 36 ,133,134,135,136
8c990 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c 31 34 30 ,137,138,139,140
8c9a0 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c 20 2f 2a ,141,142,143, /*
8c9b0 20 38 78 20 2a 2f 0d 0a 20 20 20 20 31 34 34 2c 8x */.. 144,
8c9c0 31 34 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c 145,146,147,148,
8c9d0 31 34 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c 149,150,151,152,
8c9e0 31 35 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c 153,154,155,156,
8c9f0 31 35 37 2c 31 35 36 2c 31 35 39 2c 20 2f 2a 20 157,156,159, /*
8ca00 39 78 20 2a 2f 0d 0a 20 20 20 20 31 36 30 2c 31 9x */.. 160,1
8ca10 36 31 2c 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 61,162,163,164,1
8ca20 36 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 65,166,167,168,1
8ca30 36 39 2c 31 37 30 2c 31 37 31 2c 31 34 30 2c 31 69,170,171,140,1
8ca40 34 31 2c 31 34 32 2c 31 37 35 2c 20 2f 2a 20 41 41,142,175, /* A
8ca50 78 20 2a 2f 0d 0a 20 20 20 20 31 37 36 2c 31 37 x */.. 176,17
8ca60 37 2c 31 37 38 2c 31 37 39 2c 31 38 30 2c 31 38 7,178,179,180,18
8ca70 31 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38 1,182,183,184,18
8ca80 35 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38 5,186,187,188,18
8ca90 39 2c 31 39 30 2c 31 39 31 2c 20 2f 2a 20 42 78 9,190,191, /* Bx
8caa0 20 2a 2f 0d 0a 20 20 20 20 31 39 32 2c 31 32 39 */.. 192,129
8cab0 2c 31 33 30 2c 31 33 31 2c 31 33 32 2c 31 33 33 ,130,131,132,133
8cac0 2c 31 33 34 2c 31 33 35 2c 31 33 36 2c 31 33 37 ,134,135,136,137
8cad0 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32 30 35 ,202,203,204,205
8cae0 2c 32 30 36 2c 32 30 37 2c 20 2f 2a 20 43 78 20 ,206,207, /* Cx
8caf0 2a 2f 0d 0a 20 20 20 20 32 30 38 2c 31 34 35 2c */.. 208,145,
8cb00 31 34 36 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 146,147,148,149,
8cb10 31 35 30 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 150,151,152,153,
8cb20 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31 2c 218,219,220,221,
8cb30 32 32 32 2c 32 32 33 2c 20 2f 2a 20 44 78 20 2a 222,223, /* Dx *
8cb40 2f 0d 0a 20 20 20 20 32 32 34 2c 32 32 35 2c 31 /.. 224,225,1
8cb50 36 32 2c 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 62,163,164,165,1
8cb60 36 36 2c 31 36 37 2c 31 36 38 2c 31 36 39 2c 32 66,167,168,169,2
8cb70 33 32 2c 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 32,203,204,205,2
8cb80 30 36 2c 32 30 37 2c 20 2f 2a 20 45 78 20 2a 2f 06,207, /* Ex */
8cb90 0d 0a 20 20 20 20 32 33 39 2c 32 34 30 2c 32 34 .. 239,240,24
8cba0 31 2c 32 34 32 2c 32 34 33 2c 32 34 34 2c 32 34 1,242,243,244,24
8cbb0 35 2c 32 34 36 2c 32 34 37 2c 32 34 38 2c 32 34 5,246,247,248,24
8cbc0 39 2c 32 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 9,219,220,221,22
8cbd0 32 2c 32 35 35 2c 20 2f 2a 20 46 78 20 2a 2f 0d 2,255, /* Fx */.
8cbe0 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 23 65 6e .#endif..};..#en
8cbf0 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 dif..../*..** Th
8cc00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 32 35 36 20 e following 256
8cc10 62 79 74 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c byte lookup tabl
8cc20 65 20 69 73 20 75 73 65 64 20 74 6f 20 73 75 70 e is used to sup
8cc30 70 6f 72 74 20 53 51 4c 69 74 65 73 20 62 75 69 port SQLites bui
8cc40 6c 74 2d 69 6e 0d 0a 2a 2a 20 65 71 75 69 76 61 lt-in..** equiva
8cc50 6c 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 6c lents to the fol
8cc60 6c 6f 77 69 6e 67 20 73 74 61 6e 64 61 72 64 20 lowing standard
8cc70 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e library function
8cc80 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 69 73 73 s:..**..** iss
8cc90 70 61 63 65 28 29 20 20 20 20 20 20 20 20 20 20 pace()
8cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
8ccb0 30 31 0d 0a 2a 2a 20 20 20 69 73 61 6c 70 68 61 01..** isalpha
8ccc0 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ()
8ccd0 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0d 0a 0x02..
8cce0 2a 2a 20 20 20 69 73 64 69 67 69 74 28 29 20 20 ** isdigit()
8ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8cd00 20 20 20 20 20 20 30 78 30 34 0d 0a 2a 2a 20 20 0x04..**
8cd10 20 69 73 61 6c 6e 75 6d 28 29 20 20 20 20 20 20 isalnum()
8cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8cd30 20 20 30 78 30 36 0d 0a 2a 2a 20 20 20 69 73 78 0x06..** isx
8cd40 64 69 67 69 74 28 29 20 20 20 20 20 20 20 20 20 digit()
8cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
8cd60 30 38 0d 0a 2a 2a 20 20 20 74 6f 75 70 70 65 72 08..** toupper
8cd70 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ()
8cd80 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0d 0a 0x20..
8cd90 2a 2a 20 20 20 53 51 4c 69 74 65 20 69 64 65 6e ** SQLite iden
8cda0 74 69 66 69 65 72 20 63 68 61 72 61 63 74 65 72 tifier character
8cdb0 20 20 20 20 20 20 30 78 34 30 0d 0a 2a 2a 0d 0a 0x40..**..
8cdc0 2a 2a 20 42 69 74 20 30 78 32 30 20 69 73 20 73 ** Bit 0x20 is s
8cdd0 65 74 20 69 66 20 74 68 65 20 6d 61 70 70 65 64 et if the mapped
8cde0 20 63 68 61 72 61 63 74 65 72 20 72 65 71 75 69 character requi
8cdf0 72 65 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 res translation
8ce00 74 6f 20 75 70 70 65 72 0d 0a 2a 2a 20 63 61 73 to upper..** cas
8ce10 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 20 63 e. i.e. if the c
8ce20 68 61 72 61 63 74 65 72 20 69 73 20 61 20 6c 6f haracter is a lo
8ce30 77 65 72 2d 63 61 73 65 20 41 53 43 49 49 20 63 wer-case ASCII c
8ce40 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2a 20 49 66 haracter...** If
8ce50 20 78 20 69 73 20 61 20 6c 6f 77 65 72 2d 63 61 x is a lower-ca
8ce60 73 65 20 41 53 43 49 49 20 63 68 61 72 61 63 74 se ASCII charact
8ce70 65 72 2c 20 74 68 65 6e 20 69 74 73 20 75 70 70 er, then its upp
8ce80 65 72 2d 63 61 73 65 20 65 71 75 69 76 61 6c 65 er-case equivale
8ce90 6e 74 0d 0a 2a 2a 20 69 73 20 28 78 20 2d 20 30 nt..** is (x - 0
8cea0 78 32 30 29 2e 20 54 68 65 72 65 66 6f 72 65 20 x20). Therefore
8ceb0 74 6f 75 70 70 65 72 28 29 20 63 61 6e 20 62 65 toupper() can be
8cec0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a implemented as:
8ced0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 78 20 26 20 ..**..** (x &
8cee0 7e 28 6d 61 70 5b 78 5d 26 30 78 32 30 29 29 0d ~(map[x]&0x20)).
8cef0 0a 2a 2a 0d 0a 2a 2a 20 53 74 61 6e 64 61 72 64 .**..** Standard
8cf00 20 66 75 6e 63 74 69 6f 6e 20 74 6f 6c 6f 77 65 function tolowe
8cf10 72 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 r() is implement
8cf20 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c ed using the sql
8cf30 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 ite3UpperToLower
8cf40 5b 5d 0d 0a 2a 2a 20 61 72 72 61 79 2e 20 74 6f []..** array. to
8cf50 6c 6f 77 65 72 28 29 20 69 73 20 75 73 65 64 20 lower() is used
8cf60 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 more often than
8cf70 74 6f 75 70 70 65 72 28 29 20 62 79 20 53 51 4c toupper() by SQL
8cf80 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 42 69 74 ite...**..** Bit
8cf90 20 30 78 34 30 20 69 73 20 73 65 74 20 69 66 20 0x40 is set if
8cfa0 74 68 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f the character no
8cfb0 6e 2d 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 61 n-alphanumeric a
8cfc0 6e 64 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 nd can be used i
8cfd0 6e 20 61 6e 20 0d 0a 2a 2a 20 53 51 4c 69 74 65 n an ..** SQLite
8cfe0 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 49 64 identifier. Id
8cff0 65 6e 74 69 66 69 65 72 73 20 61 72 65 20 61 6c entifiers are al
8d000 70 68 61 6e 75 6d 65 72 69 63 73 2c 20 22 5f 22 phanumerics, "_"
8d010 2c 20 22 24 22 2c 20 61 6e 64 20 61 6e 79 0d 0a , "$", and any..
8d020 2a 2a 20 6e 6f 6e 2d 41 53 43 49 49 20 55 54 46 ** non-ASCII UTF
8d030 20 63 68 61 72 61 63 74 65 72 2e 20 48 65 6e 63 character. Henc
8d040 65 20 74 68 65 20 74 65 73 74 20 66 6f 72 20 77 e the test for w
8d050 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 hether or not a
8d060 63 68 61 72 61 63 74 65 72 20 69 73 0d 0a 2a 2a character is..**
8d070 20 70 61 72 74 20 6f 66 20 61 6e 20 69 64 65 6e part of an iden
8d080 74 69 66 69 65 72 20 69 73 20 30 78 34 36 2e 0d tifier is 0x46..
8d090 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 69 74 65 27 73 .**..** SQLite's
8d0a0 20 76 65 72 73 69 6f 6e 73 20 61 72 65 20 69 64 versions are id
8d0b0 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 73 entical to the s
8d0c0 74 61 6e 64 61 72 64 20 76 65 72 73 69 6f 6e 73 tandard versions
8d0d0 20 61 73 73 75 6d 69 6e 67 20 61 0d 0a 2a 2a 20 assuming a..**
8d0e0 6c 6f 63 61 6c 65 20 6f 66 20 22 43 22 2e 20 54 locale of "C". T
8d0f0 68 65 79 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e hey are implemen
8d100 74 65 64 20 61 73 20 6d 61 63 72 6f 73 20 69 6e ted as macros in
8d110 20 73 71 6c 69 74 65 49 6e 74 2e 68 2e 0d 0a 2a sqliteInt.h...*
8d120 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
8d130 5f 41 53 43 49 49 0d 0a 53 51 4c 49 54 45 5f 50 _ASCII..SQLITE_P
8d140 52 49 56 41 54 45 20 63 6f 6e 73 74 20 75 6e 73 RIVATE const uns
8d150 69 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 igned char sqlit
8d160 65 33 43 74 79 70 65 4d 61 70 5b 32 35 36 5d 20 e3CtypeMap[256]
8d170 3d 20 7b 0d 0a 20 20 30 78 30 30 2c 20 30 78 30 = {.. 0x00, 0x0
8d180 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 0, 0x00, 0x00, 0
8d190 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c x00, 0x00, 0x00,
8d1a0 20 30 78 30 30 2c 20 20 2f 2a 20 30 30 2e 2e 30 0x00, /* 00..0
8d1b0 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 7 ........ */
8d1c0 0d 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 .. 0x00, 0x01,
8d1d0 30 78 30 31 2c 20 30 78 30 31 2c 20 30 78 30 31 0x01, 0x01, 0x01
8d1e0 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78 , 0x01, 0x00, 0x
8d1f0 30 30 2c 20 20 2f 2a 20 30 38 2e 2e 30 66 20 20 00, /* 08..0f
8d200 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 ........ */..
8d210 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 0x00, 0x00, 0x0
8d220 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 0, 0x00, 0x00, 0
8d230 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c x00, 0x00, 0x00,
8d240 20 20 2f 2a 20 31 30 2e 2e 31 37 20 20 20 20 2e /* 10..17 .
8d250 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 78 ....... */.. 0x
8d260 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 00, 0x00, 0x00,
8d270 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
8d280 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 20 2f , 0x00, 0x00, /
8d290 2a 20 31 38 2e 2e 31 66 20 20 20 20 2e 2e 2e 2e * 18..1f ....
8d2a0 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 78 30 31 2c .... */.. 0x01,
8d2b0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 0x00, 0x00, 0x0
8d2c0 30 2c 20 30 78 34 30 2c 20 30 78 30 30 2c 20 30 0, 0x40, 0x00, 0
8d2d0 78 30 30 2c 20 30 78 30 30 2c 20 20 2f 2a 20 32 x00, 0x00, /* 2
8d2e0 30 2e 2e 32 37 20 20 20 20 20 21 22 23 24 25 26 0..27 !"#$%&
8d2f0 27 20 2a 2f 0d 0a 20 20 30 78 30 30 2c 20 30 78 ' */.. 0x00, 0x
8d300 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 00, 0x00, 0x00,
8d310 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
8d320 2c 20 30 78 30 30 2c 20 20 2f 2a 20 32 38 2e 2e , 0x00, /* 28..
8d330 32 66 20 20 20 20 28 29 2a 2b 2c 2d 2e 2f 20 2a 2f ()*+,-./ *
8d340 2f 0d 0a 20 20 30 78 30 63 2c 20 30 78 30 63 2c /.. 0x0c, 0x0c,
8d350 20 30 78 30 63 2c 20 30 78 30 63 2c 20 30 78 30 0x0c, 0x0c, 0x0
8d360 63 2c 20 30 78 30 63 2c 20 30 78 30 63 2c 20 30 c, 0x0c, 0x0c, 0
8d370 78 30 63 2c 20 20 2f 2a 20 33 30 2e 2e 33 37 20 x0c, /* 30..37
8d380 20 20 20 30 31 32 33 34 35 36 37 20 2a 2f 0d 0a 01234567 */..
8d390 20 20 30 78 30 63 2c 20 30 78 30 63 2c 20 30 78 0x0c, 0x0c, 0x
8d3a0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 00, 0x00, 0x00,
8d3b0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
8d3c0 2c 20 20 2f 2a 20 33 38 2e 2e 33 66 20 20 20 20 , /* 38..3f
8d3d0 38 39 3a 3b 3c 3d 3e 3f 20 2a 2f 0d 0a 0d 0a 20 89:;<=>? */....
8d3e0 20 30 78 30 30 2c 20 30 78 30 61 2c 20 30 78 30 0x00, 0x0a, 0x0
8d3f0 61 2c 20 30 78 30 61 2c 20 30 78 30 61 2c 20 30 a, 0x0a, 0x0a, 0
8d400 78 30 61 2c 20 30 78 30 61 2c 20 30 78 30 32 2c x0a, 0x0a, 0x02,
8d410 20 20 2f 2a 20 34 30 2e 2e 34 37 20 20 20 20 40 /* 40..47 @
8d420 41 42 43 44 45 46 47 20 2a 2f 0d 0a 20 20 30 78 ABCDEFG */.. 0x
8d430 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20 02, 0x02, 0x02,
8d440 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 32 0x02, 0x02, 0x02
8d450 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20 20 2f , 0x02, 0x02, /
8d460 2a 20 34 38 2e 2e 34 66 20 20 20 20 48 49 4a 4b * 48..4f HIJK
8d470 4c 4d 4e 4f 20 2a 2f 0d 0a 20 20 30 78 30 32 2c LMNO */.. 0x02,
8d480 20 30 78 30 32 2c 20 30 78 30 32 2c 20 30 78 30 0x02, 0x02, 0x0
8d490 32 2c 20 30 78 30 32 2c 20 30 78 30 32 2c 20 30 2, 0x02, 0x02, 0
8d4a0 78 30 32 2c 20 30 78 30 32 2c 20 20 2f 2a 20 35 x02, 0x02, /* 5
8d4b0 30 2e 2e 35 37 20 20 20 20 50 51 52 53 54 55 56 0..57 PQRSTUV
8d4c0 57 20 2a 2f 0d 0a 20 20 30 78 30 32 2c 20 30 78 W */.. 0x02, 0x
8d4d0 30 32 2c 20 30 78 30 32 2c 20 30 78 30 30 2c 20 02, 0x02, 0x00,
8d4e0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0x00, 0x00, 0x00
8d4f0 2c 20 30 78 34 30 2c 20 20 2f 2a 20 35 38 2e 2e , 0x40, /* 58..
8d500 35 66 20 20 20 20 58 59 5a 5b 5c 5d 5e 5f 20 2a 5f XYZ[\]^_ *
8d510 2f 0d 0a 20 20 30 78 30 30 2c 20 30 78 32 61 2c /.. 0x00, 0x2a,
8d520 20 30 78 32 61 2c 20 30 78 32 61 2c 20 30 78 32 0x2a, 0x2a, 0x2
8d530 61 2c 20 30 78 32 61 2c 20 30 78 32 61 2c 20 30 a, 0x2a, 0x2a, 0
8d540 78 32 32 2c 20 20 2f 2a 20 36 30 2e 2e 36 37 20 x22, /* 60..67
8d550 20 20 20 60 61 62 63 64 65 66 67 20 2a 2f 0d 0a `abcdefg */..
8d560 20 20 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 0x22, 0x22, 0x
8d570 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20 22, 0x22, 0x22,
8d580 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32 0x22, 0x22, 0x22
8d590 2c 20 20 2f 2a 20 36 38 2e 2e 36 66 20 20 20 20 , /* 68..6f
8d5a0 68 69 6a 6b 6c 6d 6e 6f 20 2a 2f 0d 0a 20 20 30 hijklmno */.. 0
8d5b0 78 32 32 2c 20 30 78 32 32 2c 20 30 78 32 32 2c x22, 0x22, 0x22,
8d5c0 20 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 32 0x22, 0x22, 0x2
8d5d0 32 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20 20 2, 0x22, 0x22,
8d5e0 2f 2a 20 37 30 2e 2e 37 37 20 20 20 20 70 71 72 /* 70..77 pqr
8d5f0 73 74 75 76 77 20 2a 2f 0d 0a 20 20 30 78 32 32 stuvw */.. 0x22
8d600 2c 20 30 78 32 32 2c 20 30 78 32 32 2c 20 30 78 , 0x22, 0x22, 0x
8d610 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 00, 0x00, 0x00,
8d620 30 78 30 30 2c 20 30 78 30 30 2c 20 20 2f 2a 20 0x00, 0x00, /*
8d630 37 38 2e 2e 37 66 20 20 20 20 78 79 7a 7b 7c 7d 78..7f xyz{|}
8d640 7e 2e 20 2a 2f 0d 0a 0d 0a 20 20 30 78 34 30 2c ~. */.... 0x40,
8d650 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d660 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 0, 0x40, 0x40, 0
8d670 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 38 x40, 0x40, /* 8
8d680 30 2e 2e 38 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 0..87 .......
8d690 2e 20 2a 2f 0d 0a 20 20 30 78 34 30 2c 20 30 78 . */.. 0x40, 0x
8d6a0 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d6b0 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 0x40, 0x40, 0x40
8d6c0 2c 20 30 78 34 30 2c 20 20 2f 2a 20 38 38 2e 2e , 0x40, /* 88..
8d6d0 38 66 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 8f ........ *
8d6e0 2f 0d 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c /.. 0x40, 0x40,
8d6f0 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d700 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 0, 0x40, 0x40, 0
8d710 78 34 30 2c 20 20 2f 2a 20 39 30 2e 2e 39 37 20 x40, /* 90..97
8d720 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a ........ */..
8d730 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 0x40, 0x40, 0x
8d740 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d750 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 0x40, 0x40, 0x40
8d760 2c 20 20 2f 2a 20 39 38 2e 2e 39 66 20 20 20 20 , /* 98..9f
8d770 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 ........ */.. 0
8d780 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c x40, 0x40, 0x40,
8d790 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d7a0 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 20 0, 0x40, 0x40,
8d7b0 2f 2a 20 61 30 2e 2e 61 37 20 20 20 20 2e 2e 2e /* a0..a7 ...
8d7c0 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 78 34 30 ..... */.. 0x40
8d7d0 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 , 0x40, 0x40, 0x
8d7e0 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d7f0 30 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 0x40, 0x40, /*
8d800 61 38 2e 2e 61 66 20 20 20 20 2e 2e 2e 2e 2e 2e a8..af ......
8d810 2e 2e 20 2a 2f 0d 0a 20 20 30 78 34 30 2c 20 30 .. */.. 0x40, 0
8d820 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c x40, 0x40, 0x40,
8d830 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d840 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 62 30 2e 0, 0x40, /* b0.
8d850 2e 62 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 .b7 ........
8d860 2a 2f 0d 0a 20 20 30 78 34 30 2c 20 30 78 34 30 */.. 0x40, 0x40
8d870 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 , 0x40, 0x40, 0x
8d880 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d890 30 78 34 30 2c 20 20 2f 2a 20 62 38 2e 2e 62 66 0x40, /* b8..bf
8d8a0 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d ........ */.
8d8b0 0a 0d 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c ... 0x40, 0x40,
8d8c0 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d8d0 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 0, 0x40, 0x40, 0
8d8e0 78 34 30 2c 20 20 2f 2a 20 63 30 2e 2e 63 37 20 x40, /* c0..c7
8d8f0 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a ........ */..
8d900 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 0x40, 0x40, 0x
8d910 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d920 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 0x40, 0x40, 0x40
8d930 2c 20 20 2f 2a 20 63 38 2e 2e 63 66 20 20 20 20 , /* c8..cf
8d940 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 ........ */.. 0
8d950 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c x40, 0x40, 0x40,
8d960 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8d970 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 20 0, 0x40, 0x40,
8d980 2f 2a 20 64 30 2e 2e 64 37 20 20 20 20 2e 2e 2e /* d0..d7 ...
8d990 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 30 78 34 30 ..... */.. 0x40
8d9a0 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 , 0x40, 0x40, 0x
8d9b0 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8d9c0 30 78 34 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 0x40, 0x40, /*
8d9d0 64 38 2e 2e 64 66 20 20 20 20 2e 2e 2e 2e 2e 2e d8..df ......
8d9e0 2e 2e 20 2a 2f 0d 0a 20 20 30 78 34 30 2c 20 30 .. */.. 0x40, 0
8d9f0 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c x40, 0x40, 0x40,
8da00 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8da10 30 2c 20 30 78 34 30 2c 20 20 2f 2a 20 65 30 2e 0, 0x40, /* e0.
8da20 2e 65 37 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 .e7 ........
8da30 2a 2f 0d 0a 20 20 30 78 34 30 2c 20 30 78 34 30 */.. 0x40, 0x40
8da40 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 , 0x40, 0x40, 0x
8da50 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 40, 0x40, 0x40,
8da60 30 78 34 30 2c 20 20 2f 2a 20 65 38 2e 2e 65 66 0x40, /* e8..ef
8da70 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d ........ */.
8da80 0a 20 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 . 0x40, 0x40, 0
8da90 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 2c x40, 0x40, 0x40,
8daa0 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 0x40, 0x40, 0x4
8dab0 30 2c 20 20 2f 2a 20 66 30 2e 2e 66 37 20 20 20 0, /* f0..f7
8dac0 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 20 20 ........ */..
8dad0 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 0x40, 0x40, 0x40
8dae0 2c 20 30 78 34 30 2c 20 30 78 34 30 2c 20 30 78 , 0x40, 0x40, 0x
8daf0 34 30 2c 20 30 78 34 30 2c 20 30 78 34 30 20 20 40, 0x40, 0x40
8db00 20 2f 2a 20 66 38 2e 2e 66 66 20 20 20 20 2e 2e /* f8..ff ..
8db10 2e 2e 2e 2e 2e 2e 20 2a 2f 0d 0a 7d 3b 0d 0a 23 ...... */..};..#
8db20 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 endif....#ifndef
8db30 20 53 51 4c 49 54 45 5f 55 53 45 5f 55 52 49 0d SQLITE_USE_URI.
8db40 0a 23 20 64 65 66 69 6e 65 20 20 53 51 4c 49 54 .# define SQLIT
8db50 45 5f 55 53 45 5f 55 52 49 20 30 0d 0a 23 65 6e E_USE_URI 0..#en
8db60 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 dif..../*..** Th
8db70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 69 6e 67 e following sing
8db80 6c 65 74 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 leton contains t
8db90 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 he global config
8dba0 75 72 61 74 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 uration for..**
8dbb0 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 the SQLite libra
8dbc0 72 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ry...*/..SQLITE_
8dbd0 50 52 49 56 41 54 45 20 53 51 4c 49 54 45 5f 57 PRIVATE SQLITE_W
8dbe0 53 44 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 SD struct Sqlite
8dbf0 33 43 6f 6e 66 69 67 20 73 71 6c 69 74 65 33 43 3Config sqlite3C
8dc00 6f 6e 66 69 67 20 3d 20 7b 0d 0a 20 20 20 53 51 onfig = {.. SQ
8dc10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 45 4d LITE_DEFAULT_MEM
8dc20 53 54 41 54 55 53 2c 20 20 2f 2a 20 62 4d 65 6d STATUS, /* bMem
8dc30 73 74 61 74 20 2a 2f 0d 0a 20 20 20 31 2c 20 20 stat */.. 1,
8dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8dc50 20 20 20 20 20 20 20 2f 2a 20 62 43 6f 72 65 4d /* bCoreM
8dc60 75 74 65 78 20 2a 2f 0d 0a 20 20 20 53 51 4c 49 utex */.. SQLI
8dc70 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 31 TE_THREADSAFE==1
8dc80 2c 20 20 20 20 20 20 2f 2a 20 62 46 75 6c 6c 4d , /* bFullM
8dc90 75 74 65 78 20 2a 2f 0d 0a 20 20 20 53 51 4c 49 utex */.. SQLI
8dca0 54 45 5f 55 53 45 5f 55 52 49 2c 20 20 20 20 20 TE_USE_URI,
8dcb0 20 20 20 20 20 20 20 2f 2a 20 62 4f 70 65 6e 55 /* bOpenU
8dcc0 72 69 20 2a 2f 0d 0a 20 20 20 30 78 37 66 66 66 ri */.. 0x7fff
8dcd0 66 66 66 65 2c 20 20 20 20 20 20 20 20 20 20 20 fffe,
8dce0 20 20 20 20 20 2f 2a 20 6d 78 53 74 72 6c 65 6e /* mxStrlen
8dcf0 20 2a 2f 0d 0a 20 20 20 31 32 38 2c 20 20 20 20 */.. 128,
8dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8dd10 20 20 20 2f 2a 20 73 7a 4c 6f 6f 6b 61 73 69 64 /* szLookasid
8dd20 65 20 2a 2f 0d 0a 20 20 20 35 30 30 2c 20 20 20 e */.. 500,
8dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8dd40 20 20 20 20 2f 2a 20 6e 4c 6f 6f 6b 61 73 69 64 /* nLookasid
8dd50 65 20 2a 2f 0d 0a 20 20 20 7b 30 2c 30 2c 30 2c e */.. {0,0,0,
8dd60 30 2c 30 2c 30 2c 30 2c 30 7d 2c 20 20 20 20 20 0,0,0,0,0},
8dd70 20 20 20 20 2f 2a 20 6d 20 2a 2f 0d 0a 20 20 20 /* m */..
8dd80 7b 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 {0,0,0,0,0,0,0,0
8dd90 2c 30 7d 2c 20 20 20 20 20 20 20 2f 2a 20 6d 75 ,0}, /* mu
8dda0 74 65 78 20 2a 2f 0d 0a 20 20 20 7b 30 2c 30 2c tex */.. {0,0,
8ddb0 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 0,0,0,0,0,0,0,0,
8ddc0 30 2c 30 2c 30 7d 2c 2f 2a 20 70 63 61 63 68 65 0,0,0},/* pcache
8ddd0 32 20 2a 2f 0d 0a 20 20 20 28 76 6f 69 64 2a 29 2 */.. (void*)
8dde0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8ddf0 20 20 20 20 2f 2a 20 70 48 65 61 70 20 2a 2f 0d /* pHeap */.
8de00 0a 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 . 0,
8de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8de20 2a 20 6e 48 65 61 70 20 2a 2f 0d 0a 20 20 20 30 * nHeap */.. 0
8de30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 , 0,
8de40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 6e 48 /* mnH
8de50 65 61 70 2c 20 6d 78 48 65 61 70 20 2a 2f 0d 0a eap, mxHeap */..
8de60 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20 20 20 (void*)0,
8de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8de80 20 70 53 63 72 61 74 63 68 20 2a 2f 0d 0a 20 20 pScratch */..
8de90 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8dea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
8deb0 7a 53 63 72 61 74 63 68 20 2a 2f 0d 0a 20 20 20 zScratch */..
8dec0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8ded0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 53 /* nS
8dee0 63 72 61 74 63 68 20 2a 2f 0d 0a 20 20 20 28 76 cratch */.. (v
8def0 6f 69 64 2a 29 30 2c 20 20 20 20 20 20 20 20 20 oid*)0,
8df00 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 /* pPag
8df10 65 20 2a 2f 0d 0a 20 20 20 30 2c 20 20 20 20 20 e */.. 0,
8df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8df30 20 20 20 20 2f 2a 20 73 7a 50 61 67 65 20 2a 2f /* szPage */
8df40 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 .. 0,
8df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8df60 2f 2a 20 6e 50 61 67 65 20 2a 2f 0d 0a 20 20 20 /* nPage */..
8df70 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8df80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 /* mx
8df90 50 61 72 73 65 72 53 74 61 63 6b 20 2a 2f 0d 0a ParserStack */..
8dfa0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 0,
8dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8dfc0 20 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 sharedCacheEnab
8dfd0 6c 65 64 20 2a 2f 0d 0a 20 20 20 2f 2a 20 41 6c led */.. /* Al
8dfe0 6c 20 74 68 65 20 72 65 73 74 20 73 68 6f 75 6c l the rest shoul
8dff0 64 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 d always be init
8e000 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 20 ialized to zero
8e010 2a 2f 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 20 */.. 0,
8e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e030 20 20 2f 2a 20 69 73 49 6e 69 74 20 2a 2f 0d 0a /* isInit */..
8e040 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 0,
8e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8e060 20 69 6e 50 72 6f 67 72 65 73 73 20 2a 2f 0d 0a inProgress */..
8e070 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 0,
8e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8e090 20 69 73 4d 75 74 65 78 49 6e 69 74 20 2a 2f 0d isMutexInit */.
8e0a0 0a 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 . 0,
8e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8e0c0 2a 20 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 2a * isMallocInit *
8e0d0 2f 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 20 20 /.. 0,
8e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e0f0 20 2f 2a 20 69 73 50 43 61 63 68 65 49 6e 69 74 /* isPCacheInit
8e100 20 2a 2f 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 */.. 0,
8e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e120 20 20 20 2f 2a 20 70 49 6e 69 74 4d 75 74 65 78 /* pInitMutex
8e130 20 2a 2f 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 */.. 0,
8e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e150 20 20 20 2f 2a 20 6e 52 65 66 49 6e 69 74 4d 75 /* nRefInitMu
8e160 74 65 78 20 2a 2f 0d 0a 20 20 20 30 2c 20 20 20 tex */.. 0,
8e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e180 20 20 20 20 20 20 2f 2a 20 78 4c 6f 67 20 2a 2f /* xLog */
8e190 0d 0a 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 .. 0,
8e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e1b0 2f 2a 20 70 4c 6f 67 41 72 67 20 2a 2f 0d 0a 20 /* pLogArg */..
8e1c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
8e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
8e1e0 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 bLocaltimeFault
8e1f0 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a */..};....../*..
8e200 2a 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f ** Hash table fo
8e210 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f r global functio
8e220 6e 73 20 2d 20 66 75 6e 63 74 69 6f 6e 73 20 63 ns - functions c
8e230 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 0d 0a 2a 2a ommon to all..**
8e240 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 database connec
8e250 74 69 6f 6e 73 2e 20 20 41 66 74 65 72 20 69 6e tions. After in
8e260 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2c 20 74 68 itialization, th
8e270 69 73 20 74 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 is table is..**
8e280 72 65 61 64 2d 6f 6e 6c 79 2e 0d 0a 2a 2f 0d 0a read-only...*/..
8e290 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 53 SQLITE_PRIVATE S
8e2a0 51 4c 49 54 45 5f 57 53 44 20 46 75 6e 63 44 65 QLITE_WSD FuncDe
8e2b0 66 48 61 73 68 20 73 71 6c 69 74 65 33 47 6c 6f fHash sqlite3Glo
8e2c0 62 61 6c 46 75 6e 63 74 69 6f 6e 73 3b 0d 0a 0d balFunctions;...
8e2d0 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 ./*..** Constant
8e2e0 20 74 6f 6b 65 6e 73 20 66 6f 72 20 76 61 6c 75 tokens for valu
8e2f0 65 73 20 30 20 61 6e 64 20 31 2e 0d 0a 2a 2f 0d es 0 and 1...*/.
8e300 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
8e310 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 73 71 6c 69 const Token sqli
8e320 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 5d 20 3d te3IntTokens[] =
8e330 20 7b 0d 0a 20 20 20 7b 20 22 30 22 2c 20 31 20 {.. { "0", 1
8e340 7d 2c 0d 0a 20 20 20 7b 20 22 31 22 2c 20 31 20 },.. { "1", 1
8e350 7d 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a }..};....../*..*
8e360 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 * The value of t
8e370 68 65 20 22 70 65 6e 64 69 6e 67 22 20 62 79 74 he "pending" byt
8e380 65 20 6d 75 73 74 20 62 65 20 30 78 34 30 30 30 e must be 0x4000
8e390 30 30 30 30 20 28 31 20 62 79 74 65 20 70 61 73 0000 (1 byte pas
8e3a0 74 20 74 68 65 0d 0a 2a 2a 20 31 2d 67 69 62 61 t the..** 1-giba
8e3b0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 29 20 69 byte boundary) i
8e3c0 6e 20 61 20 63 6f 6d 70 61 74 69 62 6c 65 20 64 n a compatible d
8e3d0 61 74 61 62 61 73 65 2e 20 20 53 51 4c 69 74 65 atabase. SQLite
8e3e0 20 6e 65 76 65 72 20 75 73 65 73 0d 0a 2a 2a 20 never uses..**
8e3f0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 the database pag
8e400 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 e that contains
8e410 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 the pending byte
8e420 2e 20 20 49 74 20 6e 65 76 65 72 20 61 74 74 65 . It never atte
8e430 6d 70 74 73 0d 0a 2a 2a 20 74 6f 20 72 65 61 64 mpts..** to read
8e440 20 6f 72 20 77 72 69 74 65 20 74 68 61 74 20 70 or write that p
8e450 61 67 65 2e 20 20 54 68 65 20 70 65 6e 64 69 6e age. The pendin
8e460 67 20 62 79 74 65 20 70 61 67 65 20 69 73 20 73 g byte page is s
8e470 65 74 20 61 73 73 69 67 6e 0d 0a 2a 2a 20 66 6f et assign..** fo
8e480 72 20 75 73 65 20 62 79 20 74 68 65 20 56 46 53 r use by the VFS
8e490 20 6c 61 79 65 72 73 20 61 73 20 73 70 61 63 65 layers as space
8e4a0 20 66 6f 72 20 6d 61 6e 61 67 69 6e 67 20 66 69 for managing fi
8e4b0 6c 65 20 6c 6f 63 6b 73 2e 0d 0a 2a 2a 0d 0a 2a le locks...**..*
8e4c0 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 * During testing
8e4d0 2c 20 69 74 20 69 73 20 6f 66 74 65 6e 20 64 65 , it is often de
8e4e0 73 69 72 61 62 6c 65 20 74 6f 20 6d 6f 76 65 20 sirable to move
8e4f0 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 the pending byte
8e500 20 74 6f 0d 0a 2a 2a 20 61 20 64 69 66 66 65 72 to..** a differ
8e510 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 ent position in
8e520 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 the file. This
8e530 61 6c 6c 6f 77 73 20 63 6f 64 65 20 74 68 61 74 allows code that
8e540 20 68 61 73 20 74 6f 0d 0a 2a 2a 20 64 65 61 6c has to..** deal
8e550 20 77 69 74 68 20 74 68 65 20 70 65 6e 64 69 6e with the pendin
8e560 67 20 62 79 74 65 20 74 6f 20 72 75 6e 20 6f 6e g byte to run on
8e570 20 66 69 6c 65 73 20 74 68 61 74 20 61 72 65 20 files that are
8e580 6d 75 63 68 20 73 6d 61 6c 6c 65 72 0d 0a 2a 2a much smaller..**
8e590 20 74 68 61 6e 20 31 20 47 69 42 2e 20 20 54 68 than 1 GiB. Th
8e5a0 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 e sqlite3_test_c
8e5b0 6f 6e 74 72 6f 6c 28 29 20 69 6e 74 65 72 66 61 ontrol() interfa
8e5c0 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 ce can be used t
8e5d0 6f 0d 0a 2a 2a 20 6d 6f 76 65 20 74 68 65 20 70 o..** move the p
8e5e0 65 6e 64 69 6e 67 20 62 79 74 65 2e 0d 0a 2a 2a ending byte...**
8e5f0 0d 0a 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 ..** IMPORTANT:
8e600 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 70 65 Changing the pe
8e610 6e 64 69 6e 67 20 62 79 74 65 20 74 6f 20 61 6e nding byte to an
8e620 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68 y value other th
8e630 61 6e 0d 0a 2a 2a 20 30 78 34 30 30 30 30 30 30 an..** 0x4000000
8e640 30 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 0 results in an
8e650 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 incompatible dat
8e660 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 abase file forma
8e670 74 21 0d 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 t!..** Changing
8e680 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 the pending byte
8e690 20 64 75 72 69 6e 67 20 6f 70 65 72 61 74 69 6e during operatin
8e6a0 67 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 g results in und
8e6b0 65 66 69 6e 65 64 0d 0a 2a 2a 20 61 6e 64 20 64 efined..** and d
8e6c0 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 ileterious behav
8e6d0 69 6f 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 ior...*/..#ifnde
8e6e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 f SQLITE_OMIT_WS
8e6f0 44 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 D..SQLITE_PRIVAT
8e700 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 65 6e E int sqlite3Pen
8e710 64 69 6e 67 42 79 74 65 20 3d 20 30 78 34 30 30 dingByte = 0x400
8e720 30 30 30 30 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 00000;..#endif..
8e730 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 6f 70 65 72 74 ../*..** Propert
8e740 69 65 73 20 6f 66 20 6f 70 63 6f 64 65 73 2e 20 ies of opcodes.
8e750 20 54 68 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 The OPFLG_INITI
8e760 41 4c 49 5a 45 52 20 6d 61 63 72 6f 20 69 73 0d ALIZER macro is.
8e770 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 6d .** created by m
8e780 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 64 75 72 kopcodeh.awk dur
8e790 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e ing compilation.
8e7a0 20 20 44 61 74 61 20 69 73 20 6f 62 74 61 69 6e Data is obtain
8e7b0 65 64 0d 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 ed..** from the
8e7c0 63 6f 6d 6d 65 6e 74 73 20 66 6f 6c 6c 6f 77 69 comments followi
8e7d0 6e 67 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f ng the "case OP_
8e7e0 78 78 78 78 3a 22 20 73 74 61 74 65 6d 65 6e 74 xxxx:" statement
8e7f0 73 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 76 64 62 s in..** the vdb
8e800 65 2e 63 20 66 69 6c 65 2e 20 20 0d 0a 2a 2f 0d e.c file. ..*/.
8e810 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
8e820 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
8e830 68 61 72 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 har sqlite3Opcod
8e840 65 50 72 6f 70 65 72 74 79 5b 5d 20 3d 20 4f 50 eProperty[] = OP
8e850 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b FLG_INITIALIZER;
8e860 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
8e870 2a 2a 2a 20 45 6e 64 20 6f 66 20 67 6c 6f 62 61 *** End of globa
8e880 6c 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a l.c ************
8e890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8e8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8e8b0 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
8e8c0 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
8e8d0 63 74 69 6d 65 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a ctime.c ********
8e8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8e8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8e900 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 ***/../*..** 201
8e910 30 20 46 65 62 72 75 61 72 79 20 32 33 0d 0a 2a 0 February 23..*
8e920 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 *..** The author
8e930 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 disclaims copyr
8e940 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 ight to this sou
8e950 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c rce code. In pl
8e960 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 ace of..** a leg
8e970 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
8e980 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a is a blessing:..
8e990 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f **..** May yo
8e9a0 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f u do good and no
8e9b0 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d t evil...** M
8e9c0 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 ay you find forg
8e9d0 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 iveness for your
8e9e0 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 self and forgive
8e9f0 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 others...**
8ea00 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 May you share fr
8ea10 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 eely, never taki
8ea20 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 ng more than you
8ea30 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a give...**..****
8ea40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8ea50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8ea60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8ea70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8ea80 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
8ea90 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e is file implemen
8eaa0 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64 ts routines used
8eab0 20 74 6f 20 72 65 70 6f 72 74 20 77 68 61 74 20 to report what
8eac0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 compile-time opt
8ead0 69 6f 6e 73 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 ions..** SQLite
8eae0 77 61 73 20 62 75 69 6c 74 20 77 69 74 68 2e 0d was built with..
8eaf0 0a 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 .*/....#ifndef S
8eb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 QLITE_OMIT_COMPI
8eb10 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0d 0a LEOPTION_DIAGS..
8eb20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 61 72 ..../*..** An ar
8eb30 72 61 79 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 ray of names of
8eb40 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 all compile-time
8eb50 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 options. This
8eb60 61 72 72 61 79 20 73 68 6f 75 6c 64 20 0d 0a 2a array should ..*
8eb70 2a 20 62 65 20 73 6f 72 74 65 64 20 41 2d 5a 2e * be sorted A-Z.
8eb80 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 61 72 ..**..** This ar
8eb90 72 61 79 20 6c 6f 6f 6b 73 20 6c 61 72 67 65 2c ray looks large,
8eba0 20 62 75 74 20 69 6e 20 61 20 74 79 70 69 63 61 but in a typica
8ebb0 6c 20 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 61 l installation a
8ebc0 63 74 75 61 6c 6c 79 20 75 73 65 73 0d 0a 2a 2a ctually uses..**
8ebd0 20 6f 6e 6c 79 20 61 20 68 61 6e 64 66 75 6c 20 only a handful
8ebe0 6f 66 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 of compile-time
8ebf0 6f 70 74 69 6f 6e 73 2c 20 73 6f 20 6d 6f 73 74 options, so most
8ec00 20 74 69 6d 65 73 20 74 68 69 73 20 61 72 72 61 times this arra
8ec10 79 20 69 73 20 75 73 75 61 6c 6c 79 0d 0a 2a 2a y is usually..**
8ec20 20 72 61 74 68 65 72 20 73 68 6f 72 74 20 61 6e rather short an
8ec30 64 20 75 73 65 73 20 6c 69 74 74 6c 65 20 6d 65 d uses little me
8ec40 6d 6f 72 79 20 73 70 61 63 65 2e 0d 0a 2a 2f 0d mory space...*/.
8ec50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
8ec60 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 43 6f 6d ar * const azCom
8ec70 70 69 6c 65 4f 70 74 5b 5d 20 3d 20 7b 0d 0a 0d pileOpt[] = {...
8ec80 0a 2f 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 ./* These macros
8ec90 20 61 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f are provided to
8eca0 20 22 73 74 72 69 6e 67 69 66 79 22 20 74 68 65 "stringify" the
8ecb0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 65 value of the de
8ecc0 66 69 6e 65 0d 0a 2a 2a 20 66 6f 72 20 74 68 6f fine..** for tho
8ecd0 73 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 77 68 se options in wh
8ece0 69 63 68 20 74 68 65 20 76 61 6c 75 65 20 69 73 ich the value is
8ecf0 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 20 2a 2f 0d meaningful. */.
8ed00 0a 23 64 65 66 69 6e 65 20 43 54 49 4d 45 4f 50 .#define CTIMEOP
8ed10 54 5f 56 41 4c 5f 28 6f 70 74 29 20 23 6f 70 74 T_VAL_(opt) #opt
8ed20 0d 0a 23 64 65 66 69 6e 65 20 43 54 49 4d 45 4f ..#define CTIMEO
8ed30 50 54 5f 56 41 4c 28 6f 70 74 29 20 43 54 49 4d PT_VAL(opt) CTIM
8ed40 45 4f 50 54 5f 56 41 4c 5f 28 6f 70 74 29 0d 0a EOPT_VAL_(opt)..
8ed50 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
8ed60 33 32 42 49 54 5f 52 4f 57 49 44 0d 0a 20 20 22 32BIT_ROWID.. "
8ed70 33 32 42 49 54 5f 52 4f 57 49 44 22 2c 0d 0a 23 32BIT_ROWID",..#
8ed80 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 endif..#ifdef SQ
8ed90 4c 49 54 45 5f 34 5f 42 59 54 45 5f 41 4c 49 47 LITE_4_BYTE_ALIG
8eda0 4e 45 44 5f 4d 41 4c 4c 4f 43 0d 0a 20 20 22 34 NED_MALLOC.. "4
8edb0 5f 42 59 54 45 5f 41 4c 49 47 4e 45 44 5f 4d 41 _BYTE_ALIGNED_MA
8edc0 4c 4c 4f 43 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a LLOC",..#endif..
8edd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41 #ifdef SQLITE_CA
8ede0 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b SE_SENSITIVE_LIK
8edf0 45 0d 0a 20 20 22 43 41 53 45 5f 53 45 4e 53 49 E.. "CASE_SENSI
8ee00 54 49 56 45 5f 4c 49 4b 45 22 2c 0d 0a 23 65 6e TIVE_LIKE",..#en
8ee10 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
8ee20 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0d 0a TE_CHECK_PAGES..
8ee30 20 20 22 43 48 45 43 4b 5f 50 41 47 45 53 22 2c "CHECK_PAGES",
8ee40 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
8ee50 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 SQLITE_COVERAGE
8ee60 5f 54 45 53 54 0d 0a 20 20 22 43 4f 56 45 52 41 _TEST.. "COVERA
8ee70 47 45 5f 54 45 53 54 22 2c 0d 0a 23 65 6e 64 69 GE_TEST",..#endi
8ee80 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8ee90 5f 44 45 42 55 47 0d 0a 20 20 22 44 45 42 55 47 _DEBUG.. "DEBUG
8eea0 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8eeb0 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ef SQLITE_DEFAUL
8eec0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0d 0a T_LOCKING_MODE..
8eed0 20 20 22 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 "DEFAULT_LOCKI
8eee0 4e 47 5f 4d 4f 44 45 3d 22 20 43 54 49 4d 45 4f NG_MODE=" CTIMEO
8eef0 50 54 5f 56 41 4c 28 53 51 4c 49 54 45 5f 44 45 PT_VAL(SQLITE_DE
8ef00 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f FAULT_LOCKING_MO
8ef10 44 45 29 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 DE),..#endif..#i
8ef20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 fdef SQLITE_DISA
8ef30 42 4c 45 5f 44 49 52 53 59 4e 43 0d 0a 20 20 22 BLE_DIRSYNC.. "
8ef40 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 22 DISABLE_DIRSYNC"
8ef50 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
8ef60 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 f SQLITE_DISABLE
8ef70 5f 4c 46 53 0d 0a 20 20 22 44 49 53 41 42 4c 45 _LFS.. "DISABLE
8ef80 5f 4c 46 53 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a _LFS",..#endif..
8ef90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
8efa0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 ABLE_ATOMIC_WRIT
8efb0 45 0d 0a 20 20 22 45 4e 41 42 4c 45 5f 41 54 4f E.. "ENABLE_ATO
8efc0 4d 49 43 5f 57 52 49 54 45 22 2c 0d 0a 23 65 6e MIC_WRITE",..#en
8efd0 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
8efe0 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0d TE_ENABLE_CEROD.
8eff0 0a 20 20 22 45 4e 41 42 4c 45 5f 43 45 52 4f 44 . "ENABLE_CEROD
8f000 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8f010 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
8f020 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 _COLUMN_METADATA
8f030 0d 0a 20 20 22 45 4e 41 42 4c 45 5f 43 4f 4c 55 .. "ENABLE_COLU
8f040 4d 4e 5f 4d 45 54 41 44 41 54 41 22 2c 0d 0a 23 MN_METADATA",..#
8f050 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 endif..#ifdef SQ
8f060 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 45 LITE_ENABLE_EXPE
8f070 4e 53 49 56 45 5f 41 53 53 45 52 54 0d 0a 20 20 NSIVE_ASSERT..
8f080 22 45 4e 41 42 4c 45 5f 45 58 50 45 4e 53 49 56 "ENABLE_EXPENSIV
8f090 45 5f 41 53 53 45 52 54 22 2c 0d 0a 23 65 6e 64 E_ASSERT",..#end
8f0a0 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 if..#ifdef SQLIT
8f0b0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0d 0a 20 E_ENABLE_FTS1..
8f0c0 20 22 45 4e 41 42 4c 45 5f 46 54 53 31 22 2c 0d "ENABLE_FTS1",.
8f0d0 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
8f0e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 SQLITE_ENABLE_FT
8f0f0 53 32 0d 0a 20 20 22 45 4e 41 42 4c 45 5f 46 54 S2.. "ENABLE_FT
8f100 53 32 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 S2",..#endif..#i
8f110 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
8f120 4c 45 5f 46 54 53 33 0d 0a 20 20 22 45 4e 41 42 LE_FTS3.. "ENAB
8f130 4c 45 5f 46 54 53 33 22 2c 0d 0a 23 65 6e 64 69 LE_FTS3",..#endi
8f140 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f150 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 _ENABLE_FTS3_PAR
8f160 45 4e 54 48 45 53 49 53 0d 0a 20 20 22 45 4e 41 ENTHESIS.. "ENA
8f170 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48 BLE_FTS3_PARENTH
8f180 45 53 49 53 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a ESIS",..#endif..
8f190 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
8f1a0 41 42 4c 45 5f 46 54 53 34 0d 0a 20 20 22 45 4e ABLE_FTS4.. "EN
8f1b0 41 42 4c 45 5f 46 54 53 34 22 2c 0d 0a 23 65 6e ABLE_FTS4",..#en
8f1c0 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
8f1d0 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0d 0a 20 TE_ENABLE_ICU..
8f1e0 20 22 45 4e 41 42 4c 45 5f 49 43 55 22 2c 0d 0a "ENABLE_ICU",..
8f1f0 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
8f200 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 QLITE_ENABLE_IOT
8f210 52 41 43 45 0d 0a 20 20 22 45 4e 41 42 4c 45 5f RACE.. "ENABLE_
8f220 49 4f 54 52 41 43 45 22 2c 0d 0a 23 65 6e 64 69 IOTRACE",..#endi
8f230 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f240 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 _ENABLE_LOAD_EXT
8f250 45 4e 53 49 4f 4e 0d 0a 20 20 22 45 4e 41 42 4c ENSION.. "ENABL
8f260 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e E_LOAD_EXTENSION
8f270 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8f280 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
8f290 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a _LOCKING_STYLE..
8f2a0 20 20 22 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e "ENABLE_LOCKIN
8f2b0 47 5f 53 54 59 4c 45 3d 22 20 43 54 49 4d 45 4f G_STYLE=" CTIMEO
8f2c0 50 54 5f 56 41 4c 28 53 51 4c 49 54 45 5f 45 4e PT_VAL(SQLITE_EN
8f2d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 ABLE_LOCKING_STY
8f2e0 4c 45 29 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 LE),..#endif..#i
8f2f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
8f300 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 LE_MEMORY_MANAGE
8f310 4d 45 4e 54 0d 0a 20 20 22 45 4e 41 42 4c 45 5f MENT.. "ENABLE_
8f320 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e MEMORY_MANAGEMEN
8f330 54 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 T",..#endif..#if
8f340 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
8f350 45 5f 4d 45 4d 53 59 53 33 0d 0a 20 20 22 45 4e E_MEMSYS3.. "EN
8f360 41 42 4c 45 5f 4d 45 4d 53 59 53 33 22 2c 0d 0a ABLE_MEMSYS3",..
8f370 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
8f380 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d QLITE_ENABLE_MEM
8f390 53 59 53 35 0d 0a 20 20 22 45 4e 41 42 4c 45 5f SYS5.. "ENABLE_
8f3a0 4d 45 4d 53 59 53 35 22 2c 0d 0a 23 65 6e 64 69 MEMSYS5",..#endi
8f3b0 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f3c0 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 _ENABLE_OVERSIZE
8f3d0 5f 43 45 4c 4c 5f 43 48 45 43 4b 0d 0a 20 20 22 _CELL_CHECK.. "
8f3e0 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f ENABLE_OVERSIZE_
8f3f0 43 45 4c 4c 5f 43 48 45 43 4b 22 2c 0d 0a 23 65 CELL_CHECK",..#e
8f400 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c ndif..#ifdef SQL
8f410 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 ITE_ENABLE_RTREE
8f420 0d 0a 20 20 22 45 4e 41 42 4c 45 5f 52 54 52 45 .. "ENABLE_RTRE
8f430 45 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 E",..#endif..#if
8f440 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
8f450 45 5f 53 54 41 54 33 0d 0a 20 20 22 45 4e 41 42 E_STAT3.. "ENAB
8f460 4c 45 5f 53 54 41 54 33 22 2c 0d 0a 23 65 6e 64 LE_STAT3",..#end
8f470 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 if..#ifdef SQLIT
8f480 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f E_ENABLE_UNLOCK_
8f490 4e 4f 54 49 46 59 0d 0a 20 20 22 45 4e 41 42 4c NOTIFY.. "ENABL
8f4a0 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 22 E_UNLOCK_NOTIFY"
8f4b0 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
8f4c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
8f4d0 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 UPDATE_DELETE_LI
8f4e0 4d 49 54 0d 0a 20 20 22 45 4e 41 42 4c 45 5f 55 MIT.. "ENABLE_U
8f4f0 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d PDATE_DELETE_LIM
8f500 49 54 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 IT",..#endif..#i
8f510 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f fdef SQLITE_HAS_
8f520 43 4f 44 45 43 0d 0a 20 20 22 48 41 53 5f 43 4f CODEC.. "HAS_CO
8f530 44 45 43 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 DEC",..#endif..#
8f540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 ifdef SQLITE_HAV
8f550 45 5f 49 53 4e 41 4e 0d 0a 20 20 22 48 41 56 45 E_ISNAN.. "HAVE
8f560 5f 49 53 4e 41 4e 22 2c 0d 0a 23 65 6e 64 69 66 _ISNAN",..#endif
8f570 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
8f580 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 HOMEGROWN_RECURS
8f590 49 56 45 5f 4d 55 54 45 58 0d 0a 20 20 22 48 4f IVE_MUTEX.. "HO
8f5a0 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49 56 MEGROWN_RECURSIV
8f5b0 45 5f 4d 55 54 45 58 22 2c 0d 0a 23 65 6e 64 69 E_MUTEX",..#endi
8f5c0 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f5d0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b _IGNORE_AFP_LOCK
8f5e0 5f 45 52 52 4f 52 53 0d 0a 20 20 22 49 47 4e 4f _ERRORS.. "IGNO
8f5f0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f RE_AFP_LOCK_ERRO
8f600 52 53 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 RS",..#endif..#i
8f610 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f fdef SQLITE_IGNO
8f620 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 RE_FLOCK_LOCK_ER
8f630 52 4f 52 53 0d 0a 20 20 22 49 47 4e 4f 52 45 5f RORS.. "IGNORE_
8f640 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 FLOCK_LOCK_ERROR
8f650 53 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 S",..#endif..#if
8f660 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 36 34 def SQLITE_INT64
8f670 5f 54 59 50 45 0d 0a 20 20 22 49 4e 54 36 34 5f _TYPE.. "INT64_
8f680 54 59 50 45 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a TYPE",..#endif..
8f690 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f #ifdef SQLITE_LO
8f6a0 43 4b 5f 54 52 41 43 45 0d 0a 20 20 22 4c 4f 43 CK_TRACE.. "LOC
8f6b0 4b 5f 54 52 41 43 45 22 2c 0d 0a 23 65 6e 64 69 K_TRACE",..#endi
8f6c0 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f6d0 5f 4d 41 58 5f 53 43 48 45 4d 41 5f 52 45 54 52 _MAX_SCHEMA_RETR
8f6e0 59 0d 0a 20 20 22 4d 41 58 5f 53 43 48 45 4d 41 Y.. "MAX_SCHEMA
8f6f0 5f 52 45 54 52 59 3d 22 20 43 54 49 4d 45 4f 50 _RETRY=" CTIMEOP
8f700 54 5f 56 41 4c 28 53 51 4c 49 54 45 5f 4d 41 58 T_VAL(SQLITE_MAX
8f710 5f 53 43 48 45 4d 41 5f 52 45 54 52 59 29 2c 0d _SCHEMA_RETRY),.
8f720 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
8f730 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0d SQLITE_MEMDEBUG.
8f740 0a 20 20 22 4d 45 4d 44 45 42 55 47 22 2c 0d 0a . "MEMDEBUG",..
8f750 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
8f760 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 QLITE_MIXED_ENDI
8f770 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0d 0a AN_64BIT_FLOAT..
8f780 20 20 22 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f "MIXED_ENDIAN_
8f790 36 34 42 49 54 5f 46 4c 4f 41 54 22 2c 0d 0a 23 64BIT_FLOAT",..#
8f7a0 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 endif..#ifdef SQ
8f7b0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0d 0a 20 20 LITE_NO_SYNC..
8f7c0 22 4e 4f 5f 53 59 4e 43 22 2c 0d 0a 23 65 6e 64 "NO_SYNC",..#end
8f7d0 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 if..#ifdef SQLIT
8f7e0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c E_OMIT_ALTERTABL
8f7f0 45 0d 0a 20 20 22 4f 4d 49 54 5f 41 4c 54 45 52 E.. "OMIT_ALTER
8f800 54 41 42 4c 45 22 2c 0d 0a 23 65 6e 64 69 66 0d TABLE",..#endif.
8f810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
8f820 4d 49 54 5f 41 4e 41 4c 59 5a 45 0d 0a 20 20 22 MIT_ANALYZE.. "
8f830 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 22 2c 0d 0a OMIT_ANALYZE",..
8f840 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
8f850 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 QLITE_OMIT_ATTAC
8f860 48 0d 0a 20 20 22 4f 4d 49 54 5f 41 54 54 41 43 H.. "OMIT_ATTAC
8f870 48 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 H",..#endif..#if
8f880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
8f890 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0d 0a 20 AUTHORIZATION..
8f8a0 20 22 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 "OMIT_AUTHORIZA
8f8b0 54 49 4f 4e 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a TION",..#endif..
8f8c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
8f8d0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 IT_AUTOINCREMENT
8f8e0 0d 0a 20 20 22 4f 4d 49 54 5f 41 55 54 4f 49 4e .. "OMIT_AUTOIN
8f8f0 43 52 45 4d 45 4e 54 22 2c 0d 0a 23 65 6e 64 69 CREMENT",..#endi
8f900 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f910 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0d 0a _OMIT_AUTOINIT..
8f920 20 20 22 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 "OMIT_AUTOINIT
8f930 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8f940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 ef SQLITE_OMIT_A
8f950 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0d 0a UTOMATIC_INDEX..
8f960 20 20 22 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 "OMIT_AUTOMATI
8f970 43 5f 49 4e 44 45 58 22 2c 0d 0a 23 65 6e 64 69 C_INDEX",..#endi
8f980 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8f990 5f 4f 4d 49 54 5f 41 55 54 4f 52 45 53 45 54 0d _OMIT_AUTORESET.
8f9a0 0a 20 20 22 4f 4d 49 54 5f 41 55 54 4f 52 45 53 . "OMIT_AUTORES
8f9b0 45 54 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 ET",..#endif..#i
8f9c0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
8f9d0 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 22 _AUTOVACUUM.. "
8f9e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 22 OMIT_AUTOVACUUM"
8f9f0 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
8fa00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 f SQLITE_OMIT_BE
8fa10 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 TWEEN_OPTIMIZATI
8fa20 4f 4e 0d 0a 20 20 22 4f 4d 49 54 5f 42 45 54 57 ON.. "OMIT_BETW
8fa30 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e EEN_OPTIMIZATION
8fa40 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8fa50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 ef SQLITE_OMIT_B
8fa60 4c 4f 42 5f 4c 49 54 45 52 41 4c 0d 0a 20 20 22 LOB_LITERAL.. "
8fa70 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 OMIT_BLOB_LITERA
8fa80 4c 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 L",..#endif..#if
8fa90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
8faa0 42 54 52 45 45 43 4f 55 4e 54 0d 0a 20 20 22 4f BTREECOUNT.. "O
8fab0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 22 2c MIT_BTREECOUNT",
8fac0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
8fad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 SQLITE_OMIT_BUI
8fae0 4c 54 49 4e 5f 54 45 53 54 0d 0a 20 20 22 4f 4d LTIN_TEST.. "OM
8faf0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 22 IT_BUILTIN_TEST"
8fb00 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
8fb10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 f SQLITE_OMIT_CA
8fb20 53 54 0d 0a 20 20 22 4f 4d 49 54 5f 43 41 53 54 ST.. "OMIT_CAST
8fb30 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8fb40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 ef SQLITE_OMIT_C
8fb50 48 45 43 4b 0d 0a 20 20 22 4f 4d 49 54 5f 43 48 HECK.. "OMIT_CH
8fb60 45 43 4b 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 2f ECK",..#endif../
8fb70 2a 20 2f 2f 20 72 65 64 75 6e 64 61 6e 74 0d 0a * // redundant..
8fb80 2a 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 ** #ifdef SQLITE
8fb90 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 _OMIT_COMPILEOPT
8fba0 49 4f 4e 5f 44 49 41 47 53 0d 0a 2a 2a 20 20 20 ION_DIAGS..**
8fbb0 22 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 "OMIT_COMPILEOPT
8fbc0 49 4f 4e 5f 44 49 41 47 53 22 2c 0d 0a 2a 2a 20 ION_DIAGS",..**
8fbd0 23 65 6e 64 69 66 0d 0a 2a 2f 0d 0a 23 69 66 64 #endif..*/..#ifd
8fbe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 ef SQLITE_OMIT_C
8fbf0 4f 4d 50 4c 45 54 45 0d 0a 20 20 22 4f 4d 49 54 OMPLETE.. "OMIT
8fc00 5f 43 4f 4d 50 4c 45 54 45 22 2c 0d 0a 23 65 6e _COMPLETE",..#en
8fc10 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
8fc20 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 TE_OMIT_COMPOUND
8fc30 5f 53 45 4c 45 43 54 0d 0a 20 20 22 4f 4d 49 54 _SELECT.. "OMIT
8fc40 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 _COMPOUND_SELECT
8fc50 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8fc60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 ef SQLITE_OMIT_D
8fc70 41 54 45 54 49 4d 45 5f 46 55 4e 43 53 0d 0a 20 ATETIME_FUNCS..
8fc80 20 22 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f "OMIT_DATETIME_
8fc90 46 55 4e 43 53 22 2c 0d 0a 23 65 6e 64 69 66 0d FUNCS",..#endif.
8fca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
8fcb0 4d 49 54 5f 44 45 43 4c 54 59 50 45 0d 0a 20 20 MIT_DECLTYPE..
8fcc0 22 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 22 2c "OMIT_DECLTYPE",
8fcd0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
8fce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 SQLITE_OMIT_DEP
8fcf0 52 45 43 41 54 45 44 0d 0a 20 20 22 4f 4d 49 54 RECATED.. "OMIT
8fd00 5f 44 45 50 52 45 43 41 54 45 44 22 2c 0d 0a 23 _DEPRECATED",..#
8fd10 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 endif..#ifdef SQ
8fd20 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f LITE_OMIT_DISKIO
8fd30 0d 0a 20 20 22 4f 4d 49 54 5f 44 49 53 4b 49 4f .. "OMIT_DISKIO
8fd40 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8fd50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 ef SQLITE_OMIT_E
8fd60 58 50 4c 41 49 4e 0d 0a 20 20 22 4f 4d 49 54 5f XPLAIN.. "OMIT_
8fd70 45 58 50 4c 41 49 4e 22 2c 0d 0a 23 65 6e 64 69 EXPLAIN",..#endi
8fd80 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8fd90 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d _OMIT_FLAG_PRAGM
8fda0 41 53 0d 0a 20 20 22 4f 4d 49 54 5f 46 4c 41 47 AS.. "OMIT_FLAG
8fdb0 5f 50 52 41 47 4d 41 53 22 2c 0d 0a 23 65 6e 64 _PRAGMAS",..#end
8fdc0 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 if..#ifdef SQLIT
8fdd0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f E_OMIT_FLOATING_
8fde0 50 4f 49 4e 54 0d 0a 20 20 22 4f 4d 49 54 5f 46 POINT.. "OMIT_F
8fdf0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 22 2c 0d LOATING_POINT",.
8fe00 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
8fe10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 SQLITE_OMIT_FORE
8fe20 49 47 4e 5f 4b 45 59 0d 0a 20 20 22 4f 4d 49 54 IGN_KEY.. "OMIT
8fe30 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 22 2c 0d 0a _FOREIGN_KEY",..
8fe40 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
8fe50 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 QLITE_OMIT_GET_T
8fe60 41 42 4c 45 0d 0a 20 20 22 4f 4d 49 54 5f 47 45 ABLE.. "OMIT_GE
8fe70 54 5f 54 41 42 4c 45 22 2c 0d 0a 23 65 6e 64 69 T_TABLE",..#endi
8fe80 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8fe90 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0d 0a _OMIT_INCRBLOB..
8fea0 20 20 22 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 "OMIT_INCRBLOB
8feb0 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
8fec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 ef SQLITE_OMIT_I
8fed0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0d 0a NTEGRITY_CHECK..
8fee0 20 20 22 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 "OMIT_INTEGRIT
8fef0 59 5f 43 48 45 43 4b 22 2c 0d 0a 23 65 6e 64 69 Y_CHECK",..#endi
8ff00 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8ff10 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d _OMIT_LIKE_OPTIM
8ff20 49 5a 41 54 49 4f 4e 0d 0a 20 20 22 4f 4d 49 54 IZATION.. "OMIT
8ff30 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 _LIKE_OPTIMIZATI
8ff40 4f 4e 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 ON",..#endif..#i
8ff50 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
8ff60 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0d _LOAD_EXTENSION.
8ff70 0a 20 20 22 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 . "OMIT_LOAD_EX
8ff80 54 45 4e 53 49 4f 4e 22 2c 0d 0a 23 65 6e 64 69 TENSION",..#endi
8ff90 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
8ffa0 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0d _OMIT_LOCALTIME.
8ffb0 0a 20 20 22 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 . "OMIT_LOCALTI
8ffc0 4d 45 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 ME",..#endif..#i
8ffd0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
8ffe0 5f 4c 4f 4f 4b 41 53 49 44 45 0d 0a 20 20 22 4f _LOOKASIDE.. "O
8fff0 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 22 2c 0d MIT_LOOKASIDE",.
90000 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
90010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f SQLITE_OMIT_MEMO
90020 52 59 44 42 0d 0a 20 20 22 4f 4d 49 54 5f 4d 45 RYDB.. "OMIT_ME
90030 4d 4f 52 59 44 42 22 2c 0d 0a 23 65 6e 64 69 66 MORYDB",..#endif
90040 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
90050 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0d OMIT_MERGE_SORT.
90060 0a 20 20 22 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 . "OMIT_MERGE_S
90070 4f 52 54 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 ORT",..#endif..#
90080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 ifdef SQLITE_OMI
90090 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f T_OR_OPTIMIZATIO
900a0 4e 0d 0a 20 20 22 4f 4d 49 54 5f 4f 52 5f 4f 50 N.. "OMIT_OR_OP
900b0 54 49 4d 49 5a 41 54 49 4f 4e 22 2c 0d 0a 23 65 TIMIZATION",..#e
900c0 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c ndif..#ifdef SQL
900d0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 ITE_OMIT_PAGER_P
900e0 52 41 47 4d 41 53 0d 0a 20 20 22 4f 4d 49 54 5f RAGMAS.. "OMIT_
900f0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 22 2c 0d PAGER_PRAGMAS",.
90100 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
90110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 SQLITE_OMIT_PRAG
90120 4d 41 0d 0a 20 20 22 4f 4d 49 54 5f 50 52 41 47 MA.. "OMIT_PRAG
90130 4d 41 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 MA",..#endif..#i
90140 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
90150 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 _PROGRESS_CALLBA
90160 43 4b 0d 0a 20 20 22 4f 4d 49 54 5f 50 52 4f 47 CK.. "OMIT_PROG
90170 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 22 2c 0d RESS_CALLBACK",.
90180 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
90190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 SQLITE_OMIT_QUIC
901a0 4b 42 41 4c 41 4e 43 45 0d 0a 20 20 22 4f 4d 49 KBALANCE.. "OMI
901b0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 22 2c T_QUICKBALANCE",
901c0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
901d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 SQLITE_OMIT_REI
901e0 4e 44 45 58 0d 0a 20 20 22 4f 4d 49 54 5f 52 45 NDEX.. "OMIT_RE
901f0 49 4e 44 45 58 22 2c 0d 0a 23 65 6e 64 69 66 0d INDEX",..#endif.
90200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
90210 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d MIT_SCHEMA_PRAGM
90220 41 53 0d 0a 20 20 22 4f 4d 49 54 5f 53 43 48 45 AS.. "OMIT_SCHE
90230 4d 41 5f 50 52 41 47 4d 41 53 22 2c 0d 0a 23 65 MA_PRAGMAS",..#e
90240 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c ndif..#ifdef SQL
90250 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f ITE_OMIT_SCHEMA_
90260 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0d VERSION_PRAGMAS.
90270 0a 20 20 22 4f 4d 49 54 5f 53 43 48 45 4d 41 5f . "OMIT_SCHEMA_
90280 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 22 VERSION_PRAGMAS"
90290 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
902a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 f SQLITE_OMIT_SH
902b0 41 52 45 44 5f 43 41 43 48 45 0d 0a 20 20 22 4f ARED_CACHE.. "O
902c0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
902d0 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 ",..#endif..#ifd
902e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 ef SQLITE_OMIT_S
902f0 55 42 51 55 45 52 59 0d 0a 20 20 22 4f 4d 49 54 UBQUERY.. "OMIT
90300 5f 53 55 42 51 55 45 52 59 22 2c 0d 0a 23 65 6e _SUBQUERY",..#en
90310 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
90320 54 45 5f 4f 4d 49 54 5f 54 43 4c 5f 56 41 52 49 TE_OMIT_TCL_VARI
90330 41 42 4c 45 0d 0a 20 20 22 4f 4d 49 54 5f 54 43 ABLE.. "OMIT_TC
90340 4c 5f 56 41 52 49 41 42 4c 45 22 2c 0d 0a 23 65 L_VARIABLE",..#e
90350 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c ndif..#ifdef SQL
90360 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0d ITE_OMIT_TEMPDB.
90370 0a 20 20 22 4f 4d 49 54 5f 54 45 4d 50 44 42 22 . "OMIT_TEMPDB"
90380 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
90390 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 f SQLITE_OMIT_TR
903a0 41 43 45 0d 0a 20 20 22 4f 4d 49 54 5f 54 52 41 ACE.. "OMIT_TRA
903b0 43 45 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 CE",..#endif..#i
903c0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
903d0 5f 54 52 49 47 47 45 52 0d 0a 20 20 22 4f 4d 49 _TRIGGER.. "OMI
903e0 54 5f 54 52 49 47 47 45 52 22 2c 0d 0a 23 65 6e T_TRIGGER",..#en
903f0 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
90400 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45 TE_OMIT_TRUNCATE
90410 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0d 0a 20 _OPTIMIZATION..
90420 20 22 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45 5f "OMIT_TRUNCATE_
90430 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 22 2c 0d 0a OPTIMIZATION",..
90440 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
90450 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 QLITE_OMIT_UTF16
90460 0d 0a 20 20 22 4f 4d 49 54 5f 55 54 46 31 36 22 .. "OMIT_UTF16"
90470 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 ,..#endif..#ifde
90480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 f SQLITE_OMIT_VA
90490 43 55 55 4d 0d 0a 20 20 22 4f 4d 49 54 5f 56 41 CUUM.. "OMIT_VA
904a0 43 55 55 4d 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a CUUM",..#endif..
904b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
904c0 49 54 5f 56 49 45 57 0d 0a 20 20 22 4f 4d 49 54 IT_VIEW.. "OMIT
904d0 5f 56 49 45 57 22 2c 0d 0a 23 65 6e 64 69 66 0d _VIEW",..#endif.
904e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
904f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
90500 0d 0a 20 20 22 4f 4d 49 54 5f 56 49 52 54 55 41 .. "OMIT_VIRTUA
90510 4c 54 41 42 4c 45 22 2c 0d 0a 23 65 6e 64 69 66 LTABLE",..#endif
90520 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
90530 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 22 4f 4d 49 OMIT_WAL.. "OMI
90540 54 5f 57 41 4c 22 2c 0d 0a 23 65 6e 64 69 66 0d T_WAL",..#endif.
90550 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
90560 4d 49 54 5f 57 53 44 0d 0a 20 20 22 4f 4d 49 54 MIT_WSD.. "OMIT
90570 5f 57 53 44 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a _WSD",..#endif..
90580 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
90590 49 54 5f 58 46 45 52 5f 4f 50 54 0d 0a 20 20 22 IT_XFER_OPT.. "
905a0 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 22 2c 0d OMIT_XFER_OPT",.
905b0 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 .#endif..#ifdef
905c0 53 51 4c 49 54 45 5f 50 45 52 46 4f 52 4d 41 4e SQLITE_PERFORMAN
905d0 43 45 5f 54 52 41 43 45 0d 0a 20 20 22 50 45 52 CE_TRACE.. "PER
905e0 46 4f 52 4d 41 4e 43 45 5f 54 52 41 43 45 22 2c FORMANCE_TRACE",
905f0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
90600 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 SQLITE_PROXY_DE
90610 42 55 47 0d 0a 20 20 22 50 52 4f 58 59 5f 44 45 BUG.. "PROXY_DE
90620 42 55 47 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 BUG",..#endif..#
90630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 ifdef SQLITE_SEC
90640 55 52 45 5f 44 45 4c 45 54 45 0d 0a 20 20 22 53 URE_DELETE.. "S
90650 45 43 55 52 45 5f 44 45 4c 45 54 45 22 2c 0d 0a ECURE_DELETE",..
90660 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 #endif..#ifdef S
90670 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43 QLITE_SMALL_STAC
90680 4b 0d 0a 20 20 22 53 4d 41 4c 4c 5f 53 54 41 43 K.. "SMALL_STAC
90690 4b 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 K",..#endif..#if
906a0 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 def SQLITE_SOUND
906b0 45 58 0d 0a 20 20 22 53 4f 55 4e 44 45 58 22 2c EX.. "SOUNDEX",
906c0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
906d0 20 53 51 4c 49 54 45 5f 54 43 4c 0d 0a 20 20 22 SQLITE_TCL.. "
906e0 54 43 4c 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 TCL",..#endif..#
906f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 4d ifdef SQLITE_TEM
90700 50 5f 53 54 4f 52 45 0d 0a 20 20 22 54 45 4d 50 P_STORE.. "TEMP
90710 5f 53 54 4f 52 45 3d 22 20 43 54 49 4d 45 4f 50 _STORE=" CTIMEOP
90720 54 5f 56 41 4c 28 53 51 4c 49 54 45 5f 54 45 4d T_VAL(SQLITE_TEM
90730 50 5f 53 54 4f 52 45 29 2c 0d 0a 23 65 6e 64 69 P_STORE),..#endi
90740 66 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
90750 5f 54 45 53 54 0d 0a 20 20 22 54 45 53 54 22 2c _TEST.. "TEST",
90760 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
90770 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 SQLITE_THREADSA
90780 46 45 0d 0a 20 20 22 54 48 52 45 41 44 53 41 46 FE.. "THREADSAF
90790 45 3d 22 20 43 54 49 4d 45 4f 50 54 5f 56 41 4c E=" CTIMEOPT_VAL
907a0 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 (SQLITE_THREADSA
907b0 46 45 29 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 FE),..#endif..#i
907c0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f fdef SQLITE_USE_
907d0 41 4c 4c 4f 43 41 0d 0a 20 20 22 55 53 45 5f 41 ALLOCA.. "USE_A
907e0 4c 4c 4f 43 41 22 2c 0d 0a 23 65 6e 64 69 66 0d LLOCA",..#endif.
907f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 5a .#ifdef SQLITE_Z
90800 45 52 4f 5f 4d 41 4c 4c 4f 43 0d 0a 20 20 22 5a ERO_MALLOC.. "Z
90810 45 52 4f 5f 4d 41 4c 4c 4f 43 22 0d 0a 23 65 6e ERO_MALLOC"..#en
90820 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a dif..};..../*..*
90830 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 * Given the name
90840 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 of a compile-ti
90850 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 me option, retur
90860 6e 20 74 72 75 65 20 69 66 20 74 68 61 74 20 6f n true if that o
90870 70 74 69 6f 6e 0d 0a 2a 2a 20 77 61 73 20 75 73 ption..** was us
90880 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 ed and false if
90890 6e 6f 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 not...**..** The
908a0 20 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e name can option
908b0 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20 ally begin with
908c0 22 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74 68 "SQLITE_" but th
908d0 65 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65 66 e "SQLITE_" pref
908e0 69 78 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 ix..** is not re
908f0 71 75 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74 quired for a mat
90900 63 68 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ch...*/..SQLITE_
90910 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
90920 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 compileoption_us
90930 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ed(const char *z
90940 4f 70 74 4e 61 6d 65 29 7b 0d 0a 20 20 69 6e 74 OptName){.. int
90950 20 69 2c 20 6e 3b 0d 0a 20 20 69 66 28 20 73 71 i, n;.. if( sq
90960 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f lite3StrNICmp(zO
90970 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f ptName, "SQLITE_
90980 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e ", 7)==0 ) zOptN
90990 61 6d 65 20 2b 3d 20 37 3b 0d 0a 20 20 6e 20 3d ame += 7;.. n =
909a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
909b0 28 7a 4f 70 74 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 (zOptName);....
909c0 20 2f 2a 20 53 69 6e 63 65 20 41 72 72 61 79 53 /* Since ArrayS
909d0 69 7a 65 28 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 ize(azCompileOpt
909e0 29 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e ) is normally in
909f0 20 73 69 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 single digits,
90a00 61 0d 0a 20 20 2a 2a 20 6c 69 6e 65 61 72 20 73 a.. ** linear s
90a10 65 61 72 63 68 20 69 73 20 61 64 65 71 75 61 74 earch is adequat
90a20 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 e. No need for
90a30 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e a binary search.
90a40 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 */.. for(i=0;
90a50 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 43 6f i<ArraySize(azCo
90a60 6d 70 69 6c 65 4f 70 74 29 3b 20 69 2b 2b 29 7b mpileOpt); i++){
90a70 0d 0a 20 20 20 20 69 66 28 20 20 20 28 73 71 6c .. if( (sql
90a80 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 ite3StrNICmp(zOp
90a90 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 tName, azCompile
90aa0 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 29 0d 0a Opt[i], n)==0)..
90ab0 20 20 20 20 20 20 20 26 26 20 28 20 28 61 7a 43 && ( (azC
90ac0 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 3d ompileOpt[i][n]=
90ad0 3d 30 29 20 7c 7c 20 28 61 7a 43 6f 6d 70 69 6c =0) || (azCompil
90ae0 65 4f 70 74 5b 69 5d 5b 6e 5d 3d 3d 27 3d 27 29 eOpt[i][n]=='=')
90af0 20 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a ) ) return 1;..
90b00 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b }.. return 0;
90b10 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
90b20 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f turn the N-th co
90b30 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f mpile-time optio
90b40 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 n string. If N
90b50 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c is out of range,
90b60 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 ..** return a NU
90b70 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d LL pointer...*/.
90b80 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 .SQLITE_API cons
90b90 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f t char *sqlite3_
90ba0 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 compileoption_ge
90bb0 74 28 69 6e 74 20 4e 29 7b 0d 0a 20 20 69 66 28 t(int N){.. if(
90bc0 20 4e 3e 3d 30 20 26 26 20 4e 3c 41 72 72 61 79 N>=0 && N<Array
90bd0 53 69 7a 65 28 61 7a 43 6f 6d 70 69 6c 65 4f 70 Size(azCompileOp
90be0 74 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 t) ){.. retur
90bf0 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e n azCompileOpt[N
90c00 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 ];.. }.. retur
90c10 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 n 0;..}....#endi
90c20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 f /* SQLITE_OMIT
90c30 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 _COMPILEOPTION_D
90c40 49 41 47 53 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a IAGS */..../****
90c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
90c60 66 20 63 74 69 6d 65 2e 63 20 2a 2a 2a 2a 2a 2a f ctime.c ******
90c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
90ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
90cb0 6e 20 66 69 6c 65 20 73 74 61 74 75 73 2e 63 20 n file status.c
90cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
90cf0 0a 2a 2a 20 32 30 30 38 20 4a 75 6e 65 20 31 38 .** 2008 June 18
90d00 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 ..**..** The aut
90d10 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f hor disclaims co
90d20 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 pyright to this
90d30 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e source code. In
90d40 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 place of..** a
90d50 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 legal notice, he
90d60 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 re is a blessing
90d70 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 :..**..** May
90d80 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 you do good and
90d90 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 not evil...**
90da0 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
90db0 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
90dc0 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
90dd0 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 ive others...**
90de0 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
90df0 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
90e00 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
90e10 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a you give...**..*
90e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90e60 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a ********..**..**
90e70 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 This module imp
90e80 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 71 6c 69 lements the sqli
90e90 74 65 33 5f 73 74 61 74 75 73 28 29 20 69 6e 74 te3_status() int
90ea0 65 72 66 61 63 65 20 61 6e 64 20 72 65 6c 61 74 erface and relat
90eb0 65 64 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 ed..** functiona
90ec0 6c 69 74 79 2e 0d 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a lity...*/../****
90ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 ********** Inclu
90ee0 64 65 20 76 64 62 65 49 6e 74 2e 68 20 69 6e 20 de vdbeInt.h in
90ef0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 73 74 the middle of st
90f00 61 74 75 73 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a atus.c *********
90f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
90f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
90f30 6e 20 66 69 6c 65 20 76 64 62 65 49 6e 74 2e 68 n file vdbeInt.h
90f40 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
90f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
90f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
90f70 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 6d 62 .** 2003 Septemb
90f80 65 72 20 36 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 er 6..**..** The
90f90 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
90fa0 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
90fb0 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
90fc0 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a In place of..*
90fd0 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
90fe0 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
90ff0 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 sing:..**..**
91000 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
91010 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a and not evil...
91020 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 ** May you fi
91030 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
91040 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
91050 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d forgive others..
91060 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 .** May you s
91070 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 hare freely, nev
91080 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 er taking more t
91090 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a han you give...*
910a0 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
910b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
910c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
910d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
910e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
910f0 20 54 68 69 73 20 69 73 20 74 68 65 20 68 65 61 This is the hea
91100 64 65 72 20 66 69 6c 65 20 66 6f 72 20 69 6e 66 der file for inf
91110 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 69 73 ormation that is
91120 20 70 72 69 76 61 74 65 20 74 6f 20 74 68 65 0d private to the.
91130 0a 2a 2a 20 56 44 42 45 2e 20 20 54 68 69 73 20 .** VDBE. This
91140 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 information used
91150 20 74 6f 20 61 6c 6c 20 62 65 20 61 74 20 74 68 to all be at th
91160 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 69 6e e top of the sin
91170 67 6c 65 0d 0a 2a 2a 20 73 6f 75 72 63 65 20 63 gle..** source c
91180 6f 64 65 20 66 69 6c 65 20 22 76 64 62 65 2e 63 ode file "vdbe.c
91190 22 2e 20 20 57 68 65 6e 20 74 68 61 74 20 66 69 ". When that fi
911a0 6c 65 20 62 65 63 61 6d 65 20 74 6f 6f 20 62 69 le became too bi
911b0 67 20 28 6f 76 65 72 0d 0a 2a 2a 20 36 30 30 30 g (over..** 6000
911c0 20 6c 69 6e 65 73 20 6c 6f 6e 67 29 20 69 74 20 lines long) it
911d0 77 61 73 20 73 70 6c 69 74 20 75 70 20 69 6e 74 was split up int
911e0 6f 20 73 65 76 65 72 61 6c 20 73 6d 61 6c 6c 65 o several smalle
911f0 72 20 66 69 6c 65 73 20 61 6e 64 0d 0a 2a 2a 20 r files and..**
91200 74 68 69 73 20 68 65 61 64 65 72 20 69 6e 66 6f this header info
91210 72 6d 61 74 69 6f 6e 20 77 61 73 20 66 61 63 74 rmation was fact
91220 6f 72 65 64 20 6f 75 74 2e 0d 0a 2a 2f 0d 0a 23 ored out...*/..#
91230 69 66 6e 64 65 66 20 5f 56 44 42 45 49 4e 54 5f ifndef _VDBEINT_
91240 48 5f 0d 0a 23 64 65 66 69 6e 65 20 5f 56 44 42 H_..#define _VDB
91250 45 49 4e 54 5f 48 5f 0d 0a 0d 0a 2f 2a 0d 0a 2a EINT_H_..../*..*
91260 2a 20 53 51 4c 20 69 73 20 74 72 61 6e 73 6c 61 * SQL is transla
91270 74 65 64 20 69 6e 74 6f 20 61 20 73 65 71 75 65 ted into a seque
91280 6e 63 65 20 6f 66 20 69 6e 73 74 72 75 63 74 69 nce of instructi
91290 6f 6e 73 20 74 6f 20 62 65 0d 0a 2a 2a 20 65 78 ons to be..** ex
912a0 65 63 75 74 65 64 20 62 79 20 61 20 76 69 72 74 ecuted by a virt
912b0 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 45 61 ual machine. Ea
912c0 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 ch instruction i
912d0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0d 0a 2a s an instance..*
912e0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 * of the followi
912f0 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a ng structure...*
91300 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
91310 74 20 56 64 62 65 4f 70 20 4f 70 3b 0d 0a 0d 0a t VdbeOp Op;....
91320 2f 2a 0d 0a 2a 2a 20 42 6f 6f 6c 65 61 6e 20 76 /*..** Boolean v
91330 61 6c 75 65 73 0d 0a 2a 2f 0d 0a 74 79 70 65 64 alues..*/..typed
91340 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ef unsigned char
91350 20 42 6f 6f 6c 3b 0d 0a 0d 0a 2f 2a 20 4f 70 61 Bool;..../* Opa
91360 71 75 65 20 74 79 70 65 20 75 73 65 64 20 62 79 que type used by
91370 20 63 6f 64 65 20 69 6e 20 76 64 62 65 73 6f 72 code in vdbesor
91380 74 2e 63 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 t.c */..typedef
91390 73 74 72 75 63 74 20 56 64 62 65 53 6f 72 74 65 struct VdbeSorte
913a0 72 20 56 64 62 65 53 6f 72 74 65 72 3b 0d 0a 0d r VdbeSorter;...
913b0 0a 2f 2a 20 4f 70 61 71 75 65 20 74 79 70 65 20 ./* Opaque type
913c0 75 73 65 64 20 62 79 20 74 68 65 20 65 78 70 6c used by the expl
913d0 61 69 6e 65 72 20 2a 2f 0d 0a 74 79 70 65 64 65 ainer */..typede
913e0 66 20 73 74 72 75 63 74 20 45 78 70 6c 61 69 6e f struct Explain
913f0 20 45 78 70 6c 61 69 6e 3b 0d 0a 0d 0a 2f 2a 0d Explain;..../*.
91400 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 .** A cursor is
91410 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 61 a pointer into a
91420 20 73 69 6e 67 6c 65 20 42 54 72 65 65 20 77 69 single BTree wi
91430 74 68 69 6e 20 61 20 64 61 74 61 62 61 73 65 20 thin a database
91440 66 69 6c 65 2e 0d 0a 2a 2a 20 54 68 65 20 63 75 file...** The cu
91450 72 73 6f 72 20 63 61 6e 20 73 65 65 6b 20 74 6f rsor can seek to
91460 20 61 20 42 54 72 65 65 20 65 6e 74 72 79 20 77 a BTree entry w
91470 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 ith a particular
91480 20 6b 65 79 2c 20 6f 72 0d 0a 2a 2a 20 6c 6f 6f key, or..** loo
91490 70 20 6f 76 65 72 20 61 6c 6c 20 65 6e 74 72 69 p over all entri
914a0 65 73 20 6f 66 20 74 68 65 20 42 74 72 65 65 2e es of the Btree.
914b0 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 69 You can also i
914c0 6e 73 65 72 74 20 6e 65 77 20 42 54 72 65 65 0d nsert new BTree.
914d0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 6f 72 20 72 .** entries or r
914e0 65 74 72 69 65 76 65 20 74 68 65 20 6b 65 79 20 etrieve the key
914f0 6f 72 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 or data from the
91500 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 entry that the
91510 63 75 72 73 6f 72 0d 0a 2a 2a 20 69 73 20 63 75 cursor..** is cu
91520 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 rrently pointing
91530 20 74 6f 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 45 76 to...** ..** Ev
91540 65 72 79 20 63 75 72 73 6f 72 20 74 68 61 74 20 ery cursor that
91550 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 the virtual mach
91560 69 6e 65 20 68 61 73 20 6f 70 65 6e 20 69 73 20 ine has open is
91570 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 represented by a
91580 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f n..** instance o
91590 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
915a0 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a structure...*/..
915b0 73 74 72 75 63 74 20 56 64 62 65 43 75 72 73 6f struct VdbeCurso
915c0 72 20 7b 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 r {.. BtCursor
915d0 2a 70 43 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 *pCursor; /*
915e0 54 68 65 20 63 75 72 73 6f 72 20 73 74 72 75 63 The cursor struc
915f0 74 75 72 65 20 6f 66 20 74 68 65 20 62 61 63 6b ture of the back
91600 65 6e 64 20 2a 2f 0d 0a 20 20 42 74 72 65 65 20 end */.. Btree
91610 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 *pBt;
91620 2f 2a 20 53 65 70 61 72 61 74 65 20 66 69 6c 65 /* Separate file
91630 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 holding tempora
91640 72 79 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 4b ry table */.. K
91650 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
91660 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f ; /* Info abo
91670 75 74 20 69 6e 64 65 78 20 6b 65 79 73 20 6e 65 ut index keys ne
91680 65 64 65 64 20 62 79 20 69 6e 64 65 78 20 63 75 eded by index cu
91690 72 73 6f 72 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 rsors */.. int
916a0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 iDb;
916b0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 /* Index of cu
916c0 72 73 6f 72 20 64 61 74 61 62 61 73 65 20 69 6e rsor database in
916d0 20 64 62 2d 3e 61 44 62 5b 5d 20 28 6f 72 20 2d db->aDb[] (or -
916e0 31 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 73 65 1) */.. int pse
916f0 75 64 6f 54 61 62 6c 65 52 65 67 3b 20 20 20 2f udoTableReg; /
91700 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 * Register holdi
91710 6e 67 20 70 73 65 75 64 6f 74 61 62 6c 65 20 63 ng pseudotable c
91720 6f 6e 74 65 6e 74 2e 20 2a 2f 0d 0a 20 20 69 6e ontent. */.. in
91730 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 t nField;
91740 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
91750 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 68 fields in the h
91760 65 61 64 65 72 20 2a 2f 0d 0a 20 20 42 6f 6f 6c eader */.. Bool
91770 20 7a 65 72 6f 65 64 3b 20 20 20 20 20 20 20 20 zeroed;
91780 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 65 72 /* True if zer
91790 6f 65 64 20 6f 75 74 20 61 6e 64 20 72 65 61 64 oed out and read
917a0 79 20 66 6f 72 20 72 65 75 73 65 20 2a 2f 0d 0a y for reuse */..
917b0 20 20 42 6f 6f 6c 20 72 6f 77 69 64 49 73 56 61 Bool rowidIsVa
917c0 6c 69 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 lid; /* True
917d0 69 66 20 6c 61 73 74 52 6f 77 69 64 20 69 73 20 if lastRowid is
917e0 76 61 6c 69 64 20 2a 2f 0d 0a 20 20 42 6f 6f 6c valid */.. Bool
917f0 20 61 74 46 69 72 73 74 3b 20 20 20 20 20 20 20 atFirst;
91800 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6f 69 /* True if poi
91810 6e 74 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 nting to first e
91820 6e 74 72 79 20 2a 2f 0d 0a 20 20 42 6f 6f 6c 20 ntry */.. Bool
91830 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 3b 20 useRandomRowid;
91840 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6e 65 77 /* Generate new
91850 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 record numbers
91860 73 65 6d 69 2d 72 61 6e 64 6f 6d 6c 79 20 2a 2f semi-randomly */
91870 0d 0a 20 20 42 6f 6f 6c 20 6e 75 6c 6c 52 6f 77 .. Bool nullRow
91880 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 ; /* Tru
91890 65 20 69 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f e if pointing to
918a0 20 61 20 72 6f 77 20 77 69 74 68 20 6e 6f 20 64 a row with no d
918b0 61 74 61 20 2a 2f 0d 0a 20 20 42 6f 6f 6c 20 64 ata */.. Bool d
918c0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3b 20 20 eferredMoveto;
918d0 2f 2a 20 41 20 63 61 6c 6c 20 74 6f 20 73 71 6c /* A call to sql
918e0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 ite3BtreeMoveto(
918f0 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0d 0a ) is needed */..
91900 20 20 42 6f 6f 6c 20 69 73 54 61 62 6c 65 3b 20 Bool isTable;
91910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
91920 69 66 20 61 20 74 61 62 6c 65 20 72 65 71 75 69 if a table requi
91930 72 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 ring integer key
91940 73 20 2a 2f 0d 0a 20 20 42 6f 6f 6c 20 69 73 49 s */.. Bool isI
91950 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a ndex; /*
91960 20 54 72 75 65 20 69 66 20 61 6e 20 69 6e 64 65 True if an inde
91970 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6b 65 79 x containing key
91980 73 20 6f 6e 6c 79 20 2d 20 6e 6f 20 64 61 74 61 s only - no data
91990 20 2a 2f 0d 0a 20 20 42 6f 6f 6c 20 69 73 4f 72 */.. Bool isOr
919a0 64 65 72 65 64 3b 20 20 20 20 20 20 20 2f 2a 20 dered; /*
919b0 54 72 75 65 20 69 66 20 74 68 65 20 75 6e 64 65 True if the unde
919c0 72 6c 79 69 6e 67 20 74 61 62 6c 65 20 69 73 20 rlying table is
919d0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 BTREE_UNORDERED
919e0 2a 2f 0d 0a 20 20 42 6f 6f 6c 20 69 73 53 6f 72 */.. Bool isSor
919f0 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 ter; /* T
91a00 72 75 65 20 69 66 20 61 20 6e 65 77 2d 73 74 79 rue if a new-sty
91a10 6c 65 20 73 6f 72 74 65 72 20 2a 2f 0d 0a 20 20 le sorter */..
91a20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 sqlite3_vtab_cur
91a30 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 sor *pVtabCursor
91a40 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 ; /* The cursor
91a50 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 for a virtual t
91a60 61 62 6c 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 able */.. const
91a70 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 sqlite3_module
91a80 2a 70 4d 6f 64 75 6c 65 3b 20 20 20 20 20 2f 2a *pModule; /*
91a90 20 4d 6f 64 75 6c 65 20 66 6f 72 20 63 75 72 73 Module for curs
91aa0 6f 72 20 70 56 74 61 62 43 75 72 73 6f 72 20 2a or pVtabCursor *
91ab0 2f 0d 0a 20 20 69 36 34 20 73 65 71 43 6f 75 6e /.. i64 seqCoun
91ac0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 t; /* Se
91ad0 71 75 65 6e 63 65 20 63 6f 75 6e 74 65 72 20 2a quence counter *
91ae0 2f 0d 0a 20 20 69 36 34 20 6d 6f 76 65 74 6f 54 /.. i64 movetoT
91af0 61 72 67 65 74 3b 20 20 20 20 20 2f 2a 20 41 72 arget; /* Ar
91b00 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 65 gument to the de
91b10 66 65 72 72 65 64 20 73 71 6c 69 74 65 33 42 74 ferred sqlite3Bt
91b20 72 65 65 4d 6f 76 65 74 6f 28 29 20 2a 2f 0d 0a reeMoveto() */..
91b30 20 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64 3b i64 lastRowid;
91b40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 /* Last
91b50 72 6f 77 69 64 20 66 72 6f 6d 20 61 20 4e 65 78 rowid from a Nex
91b60 74 20 6f 72 20 4e 65 78 74 49 64 78 20 6f 70 65 t or NextIdx ope
91b70 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 56 64 62 ration */.. Vdb
91b80 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 eSorter *pSorter
91b90 3b 20 20 2f 2a 20 53 6f 72 74 65 72 20 6f 62 6a ; /* Sorter obj
91ba0 65 63 74 20 66 6f 72 20 4f 50 5f 53 6f 72 74 65 ect for OP_Sorte
91bb0 72 4f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f rOpen cursors */
91bc0 0d 0a 0d 0a 20 20 2f 2a 20 52 65 73 75 6c 74 20 .... /* Result
91bd0 6f 66 20 6c 61 73 74 20 73 71 6c 69 74 65 33 42 of last sqlite3B
91be0 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 64 6f 6e treeMoveto() don
91bf0 65 20 62 79 20 61 6e 20 4f 50 5f 4e 6f 74 45 78 e by an OP_NotEx
91c00 69 73 74 73 20 6f 72 20 0d 0a 20 20 2a 2a 20 4f ists or .. ** O
91c10 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 P_IsUnique opcod
91c20 65 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 e on this cursor
91c30 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 65 65 6b . */.. int seek
91c40 52 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 2f 2a 20 Result;.... /*
91c50 43 61 63 68 65 64 20 69 6e 66 6f 72 6d 61 74 69 Cached informati
91c60 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 68 65 61 on about the hea
91c70 64 65 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 der for the data
91c80 20 72 65 63 6f 72 64 20 74 68 61 74 20 74 68 65 record that the
91c90 0d 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 69 73 .. ** cursor is
91ca0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 currently point
91cb0 69 6e 67 20 74 6f 2e 20 20 4f 6e 6c 79 20 76 61 ing to. Only va
91cc0 6c 69 64 20 69 66 20 63 61 63 68 65 53 74 61 74 lid if cacheStat
91cd0 75 73 20 6d 61 74 63 68 65 73 0d 0a 20 20 2a 2a us matches.. **
91ce0 20 56 64 62 65 2e 63 61 63 68 65 43 74 72 2e 20 Vdbe.cacheCtr.
91cf0 20 56 64 62 65 2e 63 61 63 68 65 43 74 72 20 77 Vdbe.cacheCtr w
91d00 69 6c 6c 20 6e 65 76 65 72 20 74 61 6b 65 20 6f ill never take o
91d10 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0d 0a n the value of..
91d20 20 20 2a 2a 20 43 41 43 48 45 5f 53 54 41 4c 45 ** CACHE_STALE
91d30 20 61 6e 64 20 73 6f 20 73 65 74 74 69 6e 67 20 and so setting
91d40 63 61 63 68 65 53 74 61 74 75 73 3d 43 41 43 48 cacheStatus=CACH
91d50 45 5f 53 54 41 4c 45 20 67 75 61 72 61 6e 74 65 E_STALE guarante
91d60 65 73 20 74 68 61 74 0d 0a 20 20 2a 2a 20 74 68 es that.. ** th
91d70 65 20 63 61 63 68 65 20 69 73 20 6f 75 74 20 6f e cache is out o
91d80 66 20 64 61 74 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 f date... **..
91d90 20 2a 2a 20 61 52 6f 77 20 6d 69 67 68 74 20 70 ** aRow might p
91da0 6f 69 6e 74 20 74 6f 20 28 65 70 68 65 6d 65 72 oint to (ephemer
91db0 61 6c 29 20 64 61 74 61 20 66 6f 72 20 74 68 65 al) data for the
91dc0 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 6f 72 current row, or
91dd0 20 69 74 20 6d 69 67 68 74 0d 0a 20 20 2a 2a 20 it might.. **
91de0 62 65 20 4e 55 4c 4c 2e 0d 0a 20 20 2a 2f 0d 0a be NULL... */..
91df0 20 20 75 33 32 20 63 61 63 68 65 53 74 61 74 75 u32 cacheStatu
91e00 73 3b 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 s; /* Cache
91e10 20 69 73 20 76 61 6c 69 64 20 69 66 20 74 68 69 is valid if thi
91e20 73 20 6d 61 74 63 68 65 73 20 56 64 62 65 2e 63 s matches Vdbe.c
91e30 61 63 68 65 43 74 72 20 2a 2f 0d 0a 20 20 69 6e acheCtr */.. in
91e40 74 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 20 20 t payloadSize;
91e50 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d /* Total num
91e60 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 ber of bytes in
91e70 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0d 0a 20 the record */..
91e80 20 75 33 32 20 2a 61 54 79 70 65 3b 20 20 20 20 u32 *aType;
91e90 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 76 /* Type v
91ea0 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 65 6e alues for all en
91eb0 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 63 tries in the rec
91ec0 6f 72 64 20 2a 2f 0d 0a 20 20 75 33 32 20 2a 61 ord */.. u32 *a
91ed0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 Offset;
91ee0 2f 2a 20 43 61 63 68 65 64 20 6f 66 66 73 65 74 /* Cached offset
91ef0 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f s to the start o
91f00 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 73 20 64 f each columns d
91f10 61 74 61 20 2a 2f 0d 0a 20 20 75 38 20 2a 61 52 ata */.. u8 *aR
91f20 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ow;
91f30 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 /* Data for the
91f40 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 69 66 20 current row, if
91f50 61 6c 6c 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 all on one page
91f60 2a 2f 0d 0a 7d 3b 0d 0a 74 79 70 65 64 65 66 20 */..};..typedef
91f70 73 74 72 75 63 74 20 56 64 62 65 43 75 72 73 6f struct VdbeCurso
91f80 72 20 56 64 62 65 43 75 72 73 6f 72 3b 0d 0a 0d r VdbeCursor;...
91f90 0a 2f 2a 0d 0a 2a 2a 20 57 68 65 6e 20 61 20 73 ./*..** When a s
91fa0 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 65 78 ub-program is ex
91fb0 65 63 75 74 65 64 20 28 4f 50 5f 50 72 6f 67 72 ecuted (OP_Progr
91fc0 61 6d 29 2c 20 61 20 73 74 72 75 63 74 75 72 65 am), a structure
91fd0 20 6f 66 20 74 68 69 73 20 74 79 70 65 0d 0a 2a of this type..*
91fe0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 * is allocated t
91ff0 6f 20 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 o store the curr
92000 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 ent value of the
92010 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 program counter
92020 2c 20 61 73 0d 0a 2a 2a 20 77 65 6c 6c 20 61 73 , as..** well as
92030 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 65 6d the current mem
92040 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 61 ory cell array a
92050 6e 64 20 76 61 72 69 6f 75 73 20 6f 74 68 65 72 nd various other
92060 20 66 72 61 6d 65 20 73 70 65 63 69 66 69 63 0d frame specific.
92070 0a 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65 .** values store
92080 64 20 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 d in the Vdbe st
92090 72 75 63 74 2e 20 57 68 65 6e 20 74 68 65 20 73 ruct. When the s
920a0 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 66 69 ub-program is fi
920b0 6e 69 73 68 65 64 2c 20 0d 0a 2a 2a 20 74 68 65 nished, ..** the
920c0 73 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f se values are co
920d0 70 69 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 pied back to the
920e0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 56 Vdbe from the V
920f0 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 dbeFrame structu
92100 72 65 2c 0d 0a 2a 2a 20 72 65 73 74 6f 72 69 6e re,..** restorin
92110 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 g the state of t
92120 68 65 20 56 4d 20 74 6f 20 61 73 20 69 74 20 77 he VM to as it w
92130 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 75 as before the su
92140 62 2d 70 72 6f 67 72 61 6d 0d 0a 2a 2a 20 62 65 b-program..** be
92150 67 61 6e 20 65 78 65 63 75 74 69 6e 67 2e 0d 0a gan executing...
92160 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 **..** The memor
92170 79 20 66 6f 72 20 61 20 56 64 62 65 46 72 61 6d y for a VdbeFram
92180 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f e object is allo
92190 63 61 74 65 64 20 61 6e 64 20 6d 61 6e 61 67 65 cated and manage
921a0 64 20 62 79 20 61 20 6d 65 6d 6f 72 79 0d 0a 2a d by a memory..*
921b0 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 * cell in the pa
921c0 72 65 6e 74 20 28 63 61 6c 6c 69 6e 67 29 20 66 rent (calling) f
921d0 72 61 6d 65 2e 20 57 68 65 6e 20 74 68 65 20 6d rame. When the m
921e0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20 64 65 emory cell is de
921f0 6c 65 74 65 64 20 6f 72 0d 0a 2a 2a 20 6f 76 65 leted or..** ove
92200 72 77 72 69 74 74 65 6e 2c 20 74 68 65 20 56 64 rwritten, the Vd
92210 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 69 beFrame object i
92220 73 20 6e 6f 74 20 66 72 65 65 64 20 69 6d 6d 65 s not freed imme
92230 64 69 61 74 65 6c 79 2e 20 49 6e 73 74 65 61 64 diately. Instead
92240 2c 20 69 74 0d 0a 2a 2a 20 69 73 20 6c 69 6e 6b , it..** is link
92250 65 64 20 69 6e 74 6f 20 74 68 65 20 56 64 62 65 ed into the Vdbe
92260 2e 70 44 65 6c 46 72 61 6d 65 20 6c 69 73 74 2e .pDelFrame list.
92270 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 The contents of
92280 20 74 68 65 20 56 64 62 65 2e 70 44 65 6c 46 72 the Vdbe.pDelFr
92290 61 6d 65 0d 0a 2a 2a 20 6c 69 73 74 20 69 73 20 ame..** list is
922a0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 deleted when the
922b0 20 56 4d 20 69 73 20 72 65 73 65 74 20 69 6e 20 VM is reset in
922c0 56 64 62 65 48 61 6c 74 28 29 2e 20 54 68 65 20 VdbeHalt(). The
922d0 72 65 61 73 6f 6e 20 66 6f 72 20 64 6f 69 6e 67 reason for doing
922e0 0d 0a 2a 2a 20 74 68 69 73 20 69 6e 73 74 65 61 ..** this instea
922f0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 d of deleting th
92300 65 20 56 64 62 65 46 72 61 6d 65 20 69 6d 6d 65 e VdbeFrame imme
92310 64 69 61 74 65 6c 79 20 69 73 20 74 6f 20 61 76 diately is to av
92320 6f 69 64 20 72 65 63 75 72 73 69 76 65 0d 0a 2a oid recursive..*
92330 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 * calls to sqlit
92340 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
92350 28 29 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f () when the memo
92360 72 79 20 63 65 6c 6c 73 20 62 65 6c 6f 6e 67 69 ry cells belongi
92370 6e 67 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 63 68 ng to the..** ch
92380 69 6c 64 20 66 72 61 6d 65 20 61 72 65 20 72 65 ild frame are re
92390 6c 65 61 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 leased...**..**
923a0 54 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 The currently ex
923b0 65 63 75 74 69 6e 67 20 66 72 61 6d 65 20 69 73 ecuting frame is
923c0 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e stored in Vdbe.
923d0 70 46 72 61 6d 65 2e 20 56 64 62 65 2e 70 46 72 pFrame. Vdbe.pFr
923e0 61 6d 65 20 69 73 0d 0a 2a 2a 20 73 65 74 20 74 ame is..** set t
923f0 6f 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 63 75 o NULL if the cu
92400 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e rrently executin
92410 67 20 66 72 61 6d 65 20 69 73 20 74 68 65 20 6d g frame is the m
92420 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0d 0a 2a 2f ain program...*/
92430 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
92440 20 56 64 62 65 46 72 61 6d 65 20 56 64 62 65 46 VdbeFrame VdbeF
92450 72 61 6d 65 3b 0d 0a 73 74 72 75 63 74 20 56 64 rame;..struct Vd
92460 62 65 46 72 61 6d 65 20 7b 0d 0a 20 20 56 64 62 beFrame {.. Vdb
92470 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 e *v;
92480 20 20 20 20 20 2f 2a 20 56 4d 20 74 68 69 73 20 /* VM this
92490 66 72 61 6d 65 20 62 65 6c 6f 6e 67 73 20 74 6f frame belongs to
924a0 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 63 3b 20 20 */.. int pc;
924b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
924c0 2a 20 50 72 6f 67 72 61 6d 20 43 6f 75 6e 74 65 * Program Counte
924d0 72 20 69 6e 20 70 61 72 65 6e 74 20 28 63 61 6c r in parent (cal
924e0 6c 69 6e 67 29 20 66 72 61 6d 65 20 2a 2f 0d 0a ling) frame */..
924f0 20 20 4f 70 20 2a 61 4f 70 3b 20 20 20 20 20 20 Op *aOp;
92500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f /* Pro
92510 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e gram instruction
92520 73 20 66 6f 72 20 70 61 72 65 6e 74 20 66 72 61 s for parent fra
92530 6d 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4f 70 me */.. int nOp
92540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
92550 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4f 70 20 /* Size of aOp
92560 61 72 72 61 79 20 2a 2f 0d 0a 20 20 4d 65 6d 20 array */.. Mem
92570 2a 61 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 *aMem;
92580 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 /* Array of
92590 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 memory cells for
925a0 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20 2a 2f parent frame */
925b0 0d 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 .. int nMem;
925c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
925d0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
925e0 20 69 6e 20 61 4d 65 6d 20 2a 2f 0d 0a 20 20 75 in aMem */.. u
925f0 38 20 2a 61 4f 6e 63 65 46 6c 61 67 3b 20 20 20 8 *aOnceFlag;
92600 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 /* Array
92610 6f 66 20 4f 50 5f 4f 6e 63 65 20 66 6c 61 67 73 of OP_Once flags
92620 20 66 6f 72 20 70 61 72 65 6e 74 20 66 72 61 6d for parent fram
92630 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4f 6e 63 e */.. int nOnc
92640 65 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 eFlag;
92650 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 /* Number of ent
92660 72 69 65 73 20 69 6e 20 61 4f 6e 63 65 46 6c 61 ries in aOnceFla
92670 67 20 2a 2f 0d 0a 20 20 56 64 62 65 43 75 72 73 g */.. VdbeCurs
92680 6f 72 20 2a 2a 61 70 43 73 72 3b 20 20 20 20 20 or **apCsr;
92690 2f 2a 20 41 72 72 61 79 20 6f 66 20 56 64 62 65 /* Array of Vdbe
926a0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 70 61 72 cursors for par
926b0 65 6e 74 20 66 72 61 6d 65 20 2a 2f 0d 0a 20 20 ent frame */..
926c0 75 31 36 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 u16 nCursor;
926d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
926e0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 r of entries in
926f0 61 70 43 73 72 20 2a 2f 0d 0a 20 20 76 6f 69 64 apCsr */.. void
92700 20 2a 74 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 *token;
92710 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 53 /* Copy of S
92720 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 ubProgram.token
92730 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 68 69 6c 64 */.. int nChild
92740 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a Mem; /*
92750 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 Number of memor
92760 79 20 63 65 6c 6c 73 20 66 6f 72 20 63 68 69 6c y cells for chil
92770 64 20 66 72 61 6d 65 20 2a 2f 0d 0a 20 20 69 6e d frame */.. in
92780 74 20 6e 43 68 69 6c 64 43 73 72 3b 20 20 20 20 t nChildCsr;
92790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
927a0 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 63 of cursors for c
927b0 68 69 6c 64 20 66 72 61 6d 65 20 2a 2f 0d 0a 20 hild frame */..
927c0 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64 3b 20 i64 lastRowid;
927d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 /* Last
927e0 20 69 6e 73 65 72 74 20 72 6f 77 69 64 20 28 73 insert rowid (s
927f0 71 6c 69 74 65 33 2e 6c 61 73 74 52 6f 77 69 64 qlite3.lastRowid
92800 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 68 61 ) */.. int nCha
92810 6e 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 nge;
92820 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 63 68 61 /* Statement cha
92830 6e 67 65 73 20 28 56 64 62 65 2e 6e 43 68 61 6e nges (Vdbe.nChan
92840 67 65 73 29 20 20 20 20 20 2a 2f 0d 0a 20 20 56 ges) */.. V
92850 64 62 65 46 72 61 6d 65 20 2a 70 50 61 72 65 6e dbeFrame *pParen
92860 74 3b 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 t; /* Parent
92870 20 6f 66 20 74 68 69 73 20 66 72 61 6d 65 2c 20 of this frame,
92880 6f 72 20 4e 55 4c 4c 20 69 66 20 70 61 72 65 6e or NULL if paren
92890 74 20 69 73 20 6d 61 69 6e 20 2a 2f 0d 0a 7d 3b t is main */..};
928a0 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 56 64 62 65 ....#define Vdbe
928b0 46 72 61 6d 65 4d 65 6d 28 70 29 20 28 28 4d 65 FrameMem(p) ((Me
928c0 6d 20 2a 29 26 28 28 75 38 20 2a 29 70 29 5b 52 m *)&((u8 *)p)[R
928d0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64 62 OUND8(sizeof(Vdb
928e0 65 46 72 61 6d 65 29 29 5d 29 0d 0a 0d 0a 2f 2a eFrame))])..../*
928f0 0d 0a 2a 2a 20 41 20 76 61 6c 75 65 20 66 6f 72 ..** A value for
92900 20 56 64 62 65 43 75 72 73 6f 72 2e 63 61 63 68 VdbeCursor.cach
92910 65 56 61 6c 69 64 20 74 68 61 74 20 6d 65 61 6e eValid that mean
92920 73 20 74 68 65 20 63 61 63 68 65 20 69 73 20 61 s the cache is a
92930 6c 77 61 79 73 20 69 6e 76 61 6c 69 64 2e 0d 0a lways invalid...
92940 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 43 41 43 48 */..#define CACH
92950 45 5f 53 54 41 4c 45 20 30 0d 0a 0d 0a 2f 2a 0d E_STALE 0..../*.
92960 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 .** Internally,
92970 74 68 65 20 76 64 62 65 20 6d 61 6e 69 70 75 6c the vdbe manipul
92980 61 74 65 73 20 6e 65 61 72 6c 79 20 61 6c 6c 20 ates nearly all
92990 53 51 4c 20 76 61 6c 75 65 73 20 61 73 20 4d 65 SQL values as Me
929a0 6d 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 m..** structures
929b0 2e 20 45 61 63 68 20 4d 65 6d 20 73 74 72 75 63 . Each Mem struc
929c0 74 20 6d 61 79 20 63 61 63 68 65 20 6d 75 6c 74 t may cache mult
929d0 69 70 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 iple representat
929e0 69 6f 6e 73 20 28 73 74 72 69 6e 67 2c 0d 0a 2a ions (string,..*
929f0 2a 20 69 6e 74 65 67 65 72 20 65 74 63 2e 29 20 * integer etc.)
92a00 6f 66 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 of the same valu
92a10 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 4d e...*/..struct M
92a20 65 6d 20 7b 0d 0a 20 20 73 71 6c 69 74 65 33 20 em {.. sqlite3
92a30 2a 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 *db; /* T
92a40 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 he associated da
92a50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
92a60 6e 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 3b n */.. char *z;
92a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
92a80 74 72 69 6e 67 20 6f 72 20 42 4c 4f 42 20 76 61 tring or BLOB va
92a90 6c 75 65 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 lue */.. double
92aa0 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a r; /*
92ab0 20 52 65 61 6c 20 76 61 6c 75 65 20 2a 2f 0d 0a Real value */..
92ac0 20 20 75 6e 69 6f 6e 20 7b 0d 0a 20 20 20 20 69 union {.. i
92ad0 36 34 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 64 i;
92ae0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 /* Integer va
92af0 6c 75 65 20 75 73 65 64 20 77 68 65 6e 20 4d 45 lue used when ME
92b00 4d 5f 49 6e 74 20 69 73 20 73 65 74 20 69 6e 20 M_Int is set in
92b10 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 20 20 69 6e flags */.. in
92b20 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 t nZero;
92b30 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 62 /* Used when b
92b40 69 74 20 4d 45 4d 5f 5a 65 72 6f 20 69 73 20 73 it MEM_Zero is s
92b50 65 74 20 69 6e 20 66 6c 61 67 73 20 2a 2f 0d 0a et in flags */..
92b60 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 FuncDef *pDe
92b70 66 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 f; /* Used
92b80 6f 6e 6c 79 20 77 68 65 6e 20 66 6c 61 67 73 3d only when flags=
92b90 3d 4d 45 4d 5f 41 67 67 20 2a 2f 0d 0a 20 20 20 =MEM_Agg */..
92ba0 20 52 6f 77 53 65 74 20 2a 70 52 6f 77 53 65 74 RowSet *pRowSet
92bb0 3b 20 20 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c ; /* Used onl
92bc0 79 20 77 68 65 6e 20 66 6c 61 67 73 3d 3d 4d 45 y when flags==ME
92bd0 4d 5f 52 6f 77 53 65 74 20 2a 2f 0d 0a 20 20 20 M_RowSet */..
92be0 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 VdbeFrame *pFra
92bf0 6d 65 3b 20 20 2f 2a 20 55 73 65 64 20 77 68 65 me; /* Used whe
92c00 6e 20 66 6c 61 67 73 3d 3d 4d 45 4d 5f 46 72 61 n flags==MEM_Fra
92c10 6d 65 20 2a 2f 0d 0a 20 20 7d 20 75 3b 0d 0a 20 me */.. } u;..
92c20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 int n;
92c30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
92c40 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 f characters in
92c50 73 74 72 69 6e 67 20 76 61 6c 75 65 2c 20 65 78 string value, ex
92c60 63 6c 75 64 69 6e 67 20 27 5c 30 27 20 2a 2f 0d cluding '\0' */.
92c70 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20 20 20 . u16 flags;
92c80 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 /* Some c
92c90 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4d 45 ombination of ME
92ca0 4d 5f 4e 75 6c 6c 2c 20 4d 45 4d 5f 53 74 72 2c M_Null, MEM_Str,
92cb0 20 4d 45 4d 5f 44 79 6e 2c 20 65 74 63 2e 20 2a MEM_Dyn, etc. *
92cc0 2f 0d 0a 20 20 75 38 20 20 74 79 70 65 3b 20 20 /.. u8 type;
92cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 /* One
92ce0 6f 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 2c 20 of SQLITE_NULL,
92cf0 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 53 51 4c SQLITE_TEXT, SQL
92d00 49 54 45 5f 49 4e 54 45 47 45 52 2c 20 65 74 63 ITE_INTEGER, etc
92d10 20 2a 2f 0d 0a 20 20 75 38 20 20 65 6e 63 3b 20 */.. u8 enc;
92d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 /* SQ
92d30 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 LITE_UTF8, SQLIT
92d40 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 E_UTF16BE, SQLIT
92d50 45 5f 55 54 46 31 36 4c 45 20 2a 2f 0d 0a 23 69 E_UTF16LE */..#i
92d60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 fdef SQLITE_DEBU
92d70 47 0d 0a 20 20 4d 65 6d 20 2a 70 53 63 6f 70 79 G.. Mem *pScopy
92d80 46 72 6f 6d 3b 20 20 20 20 2f 2a 20 54 68 69 73 From; /* This
92d90 20 4d 65 6d 20 69 73 20 61 20 73 68 61 6c 6c 6f Mem is a shallo
92da0 77 20 63 6f 70 79 20 6f 66 20 70 53 63 6f 70 79 w copy of pScopy
92db0 46 72 6f 6d 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 From */.. void
92dc0 2a 70 46 69 6c 6c 65 72 3b 20 20 20 20 20 20 2f *pFiller; /
92dd0 2a 20 53 6f 20 74 68 61 74 20 73 69 7a 65 6f 66 * So that sizeof
92de0 28 4d 65 6d 29 20 69 73 20 61 20 6d 75 6c 74 69 (Mem) is a multi
92df0 70 6c 65 20 6f 66 20 38 20 2a 2f 0d 0a 23 65 6e ple of 8 */..#en
92e00 64 69 66 0d 0a 20 20 76 6f 69 64 20 28 2a 78 44 dif.. void (*xD
92e10 65 6c 29 28 76 6f 69 64 20 2a 29 3b 20 20 2f 2a el)(void *); /*
92e20 20 49 66 20 6e 6f 74 20 6e 75 6c 6c 2c 20 63 61 If not null, ca
92e30 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e ll this function
92e40 20 74 6f 20 64 65 6c 65 74 65 20 4d 65 6d 2e 7a to delete Mem.z
92e50 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4d 61 */.. char *zMa
92e60 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20 44 79 lloc; /* Dy
92e70 6e 61 6d 69 63 20 62 75 66 66 65 72 20 61 6c 6c namic buffer all
92e80 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 ocated by sqlite
92e90 33 5f 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0d 0a 7d 3_malloc() */..}
92ea0 3b 0d 0a 0d 0a 2f 2a 20 4f 6e 65 20 6f 72 20 6d ;..../* One or m
92eb0 6f 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f ore of the follo
92ec0 77 69 6e 67 20 66 6c 61 67 73 20 61 72 65 20 73 wing flags are s
92ed0 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 et to indicate t
92ee0 68 65 20 76 61 6c 69 64 4f 4b 0d 0a 2a 2a 20 72 he validOK..** r
92ef0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 6f epresentations o
92f00 66 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 f the value stor
92f10 65 64 20 69 6e 20 74 68 65 20 4d 65 6d 20 73 74 ed in the Mem st
92f20 72 75 63 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 ruct...**..** If
92f30 20 74 68 65 20 4d 45 4d 5f 4e 75 6c 6c 20 66 6c the MEM_Null fl
92f40 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 ag is set, then
92f50 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 the value is an
92f60 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2e 0d SQL NULL value..
92f70 0a 2a 2a 20 4e 6f 20 6f 74 68 65 72 20 66 6c 61 .** No other fla
92f80 67 73 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e gs may be set in
92f90 20 74 68 69 73 20 63 61 73 65 2e 0d 0a 2a 2a 0d this case...**.
92fa0 0a 2a 2a 20 49 66 20 74 68 65 20 4d 45 4d 5f 53 .** If the MEM_S
92fb0 74 72 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 tr flag is set t
92fc0 68 65 6e 20 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 hen Mem.z points
92fd0 20 61 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 at a string rep
92fe0 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0d 0a 2a 2a resentation...**
92ff0 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 Usually this is
93000 20 65 6e 63 6f 64 65 64 20 69 6e 20 74 68 65 20 encoded in the
93010 73 61 6d 65 20 75 6e 69 63 6f 64 65 20 65 6e 63 same unicode enc
93020 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69 oding as the mai
93030 6e 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 28 n..** database (
93040 73 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 65 78 see below for ex
93050 63 65 70 74 69 6f 6e 73 29 2e 20 49 66 20 74 68 ceptions). If th
93060 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 e MEM_Term flag
93070 69 73 20 61 6c 73 6f 0d 0a 2a 2a 20 73 65 74 2c is also..** set,
93080 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 then the string
93090 20 69 73 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 is nul terminat
930a0 65 64 2e 20 54 68 65 20 4d 45 4d 5f 49 6e 74 20 ed. The MEM_Int
930b0 61 6e 64 20 4d 45 4d 5f 52 65 61 6c 20 0d 0a 2a and MEM_Real ..*
930c0 2a 20 66 6c 61 67 73 20 6d 61 79 20 63 6f 65 78 * flags may coex
930d0 69 73 74 20 77 69 74 68 20 74 68 65 20 4d 45 4d ist with the MEM
930e0 5f 53 74 72 20 66 6c 61 67 2e 0d 0a 2a 2f 0d 0a _Str flag...*/..
930f0 23 64 65 66 69 6e 65 20 4d 45 4d 5f 4e 75 6c 6c #define MEM_Null
93100 20 20 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 0x0001 /
93110 2a 20 56 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 * Value is NULL
93120 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 4d 5f */..#define MEM_
93130 53 74 72 20 20 20 20 20 20 20 30 78 30 30 30 32 Str 0x0002
93140 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 61 /* Value is a
93150 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 23 64 65 66 string */..#def
93160 69 6e 65 20 4d 45 4d 5f 49 6e 74 20 20 20 20 20 ine MEM_Int
93170 20 20 30 78 30 30 30 34 20 20 20 2f 2a 20 56 61 0x0004 /* Va
93180 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 lue is an intege
93190 72 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 r */..#define ME
931a0 4d 5f 52 65 61 6c 20 20 20 20 20 20 30 78 30 30 M_Real 0x00
931b0 30 38 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 08 /* Value is
931c0 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 20 2a a real number *
931d0 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 4d 5f 42 /..#define MEM_B
931e0 6c 6f 62 20 20 20 20 20 20 30 78 30 30 31 30 20 lob 0x0010
931f0 20 20 2f 2a 20 56 61 6c 75 65 20 69 73 20 61 20 /* Value is a
93200 42 4c 4f 42 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 BLOB */..#define
93210 20 4d 45 4d 5f 52 6f 77 53 65 74 20 20 20 20 30 MEM_RowSet 0
93220 78 30 30 32 30 20 20 20 2f 2a 20 56 61 6c 75 65 x0020 /* Value
93230 20 69 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a is a RowSet obj
93240 65 63 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ect */..#define
93250 4d 45 4d 5f 46 72 61 6d 65 20 20 20 20 20 30 78 MEM_Frame 0x
93260 30 30 34 30 20 20 20 2f 2a 20 56 61 6c 75 65 20 0040 /* Value
93270 69 73 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f is a VdbeFrame o
93280 62 6a 65 63 74 20 2a 2f 0d 0a 23 64 65 66 69 6e bject */..#defin
93290 65 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 20 20 e MEM_Invalid
932a0 30 78 30 30 38 30 20 20 20 2f 2a 20 56 61 6c 75 0x0080 /* Valu
932b0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 2a e is undefined *
932c0 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 4d 5f 54 /..#define MEM_T
932d0 79 70 65 4d 61 73 6b 20 20 30 78 30 30 66 66 20 ypeMask 0x00ff
932e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 79 70 /* Mask of typ
932f0 65 20 62 69 74 73 20 2a 2f 0d 0a 0d 0a 2f 2a 20 e bits */..../*
93300 57 68 65 6e 65 76 65 72 20 4d 65 6d 20 63 6f 6e Whenever Mem con
93310 74 61 69 6e 73 20 61 20 76 61 6c 69 64 20 73 74 tains a valid st
93320 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 72 65 70 ring or blob rep
93330 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 6f 6e 65 resentation, one
93340 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c of..** the foll
93350 6f 77 69 6e 67 20 66 6c 61 67 73 20 6d 75 73 74 owing flags must
93360 20 62 65 20 73 65 74 20 74 6f 20 64 65 74 65 72 be set to deter
93370 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 mine the memory
93380 6d 61 6e 61 67 65 6d 65 6e 74 0d 0a 2a 2a 20 70 management..** p
93390 6f 6c 69 63 79 20 66 6f 72 20 4d 65 6d 2e 7a 2e olicy for Mem.z.
933a0 20 20 54 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66 The MEM_Term f
933b0 6c 61 67 20 74 65 6c 6c 73 20 75 73 20 77 68 65 lag tells us whe
933c0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d ther or not the.
933d0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 5c 30 .** string is \0
933e0 30 30 20 6f 72 20 5c 75 30 30 30 30 20 74 65 72 00 or \u0000 ter
933f0 6d 69 6e 61 74 65 64 0d 0a 2a 2f 0d 0a 23 64 65 minated..*/..#de
93400 66 69 6e 65 20 4d 45 4d 5f 54 65 72 6d 20 20 20 fine MEM_Term
93410 20 20 20 30 78 30 32 30 30 20 20 20 2f 2a 20 53 0x0200 /* S
93420 74 72 69 6e 67 20 72 65 70 20 69 73 20 6e 75 6c tring rep is nul
93430 20 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0d 0a terminated */..
93440 23 64 65 66 69 6e 65 20 4d 45 4d 5f 44 79 6e 20 #define MEM_Dyn
93450 20 20 20 20 20 20 30 78 30 34 30 30 20 20 20 2f 0x0400 /
93460 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 * Need to call s
93470 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e 20 4d qliteFree() on M
93480 65 6d 2e 7a 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 em.z */..#define
93490 20 4d 45 4d 5f 53 74 61 74 69 63 20 20 20 20 30 MEM_Static 0
934a0 78 30 38 30 30 20 20 20 2f 2a 20 4d 65 6d 2e 7a x0800 /* Mem.z
934b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 61 points to a sta
934c0 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 23 tic string */..#
934d0 64 65 66 69 6e 65 20 4d 45 4d 5f 45 70 68 65 6d define MEM_Ephem
934e0 20 20 20 20 20 30 78 31 30 30 30 20 20 20 2f 2a 0x1000 /*
934f0 20 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74 6f Mem.z points to
93500 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 an ephemeral st
93510 72 69 6e 67 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ring */..#define
93520 20 4d 45 4d 5f 41 67 67 20 20 20 20 20 20 20 30 MEM_Agg 0
93530 78 32 30 30 30 20 20 20 2f 2a 20 4d 65 6d 2e 7a x2000 /* Mem.z
93540 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 67 points to an ag
93550 67 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 g function conte
93560 78 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d xt */..#define M
93570 45 4d 5f 5a 65 72 6f 20 20 20 20 20 20 30 78 34 EM_Zero 0x4
93580 30 30 30 20 20 20 2f 2a 20 4d 65 6d 2e 69 20 63 000 /* Mem.i c
93590 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74 20 6f 66 ontains count of
935a0 20 30 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 0s appended to
935b0 62 6c 6f 62 20 2a 2f 0d 0a 23 69 66 64 65 66 20 blob */..#ifdef
935c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 SQLITE_OMIT_INCR
935d0 42 4c 4f 42 0d 0a 20 20 23 75 6e 64 65 66 20 4d BLOB.. #undef M
935e0 45 4d 5f 5a 65 72 6f 0d 0a 20 20 23 64 65 66 69 EM_Zero.. #defi
935f0 6e 65 20 4d 45 4d 5f 5a 65 72 6f 20 30 78 30 30 ne MEM_Zero 0x00
93600 30 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 00..#endif..../*
93610 0d 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 79 20 65 ..** Clear any e
93620 78 69 73 74 69 6e 67 20 74 79 70 65 20 66 6c 61 xisting type fla
93630 67 73 20 66 72 6f 6d 20 61 20 4d 65 6d 20 61 6e gs from a Mem an
93640 64 20 72 65 70 6c 61 63 65 20 74 68 65 6d 20 77 d replace them w
93650 69 74 68 20 66 0d 0a 2a 2f 0d 0a 23 64 65 66 69 ith f..*/..#defi
93660 6e 65 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 ne MemSetTypeFla
93670 67 28 70 2c 20 66 29 20 5c 0d 0a 20 20 20 28 28 g(p, f) \.. ((
93680 70 29 2d 3e 66 6c 61 67 73 20 3d 20 28 28 70 29 p)->flags = ((p)
93690 2d 3e 66 6c 61 67 73 26 7e 28 4d 45 4d 5f 54 79 ->flags&~(MEM_Ty
936a0 70 65 4d 61 73 6b 7c 4d 45 4d 5f 5a 65 72 6f 29 peMask|MEM_Zero)
936b0 29 7c 66 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 )|f)..../*..** R
936c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20 eturn true if a
936d0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20 6e memory cell is n
936e0 6f 74 20 6d 61 72 6b 65 64 20 61 73 20 69 6e 76 ot marked as inv
936f0 61 6c 69 64 2e 20 20 54 68 69 73 20 6d 61 63 72 alid. This macr
93700 6f 0d 0a 2a 2a 20 69 73 20 66 6f 72 20 75 73 65 o..** is for use
93710 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 inside assert()
93720 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 statements only
93730 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 ...*/..#ifdef SQ
93740 4c 49 54 45 5f 44 45 42 55 47 0d 0a 23 64 65 66 LITE_DEBUG..#def
93750 69 6e 65 20 6d 65 6d 49 73 56 61 6c 69 64 28 4d ine memIsValid(M
93760 29 20 20 28 28 4d 29 2d 3e 66 6c 61 67 73 20 26 ) ((M)->flags &
93770 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 29 3d 3d 30 MEM_Invalid)==0
93780 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a ..#endif....../*
93790 20 41 20 56 64 62 65 46 75 6e 63 20 69 73 20 6a A VdbeFunc is j
937a0 75 73 74 20 61 20 46 75 6e 63 44 65 66 20 28 64 ust a FuncDef (d
937b0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 efined in sqlite
937c0 49 6e 74 2e 68 29 20 74 68 61 74 20 63 6f 6e 74 Int.h) that cont
937d0 61 69 6e 73 0d 0a 2a 2a 20 61 64 64 69 74 69 6f ains..** additio
937e0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 nal information
937f0 61 62 6f 75 74 20 61 75 78 69 6c 69 61 72 79 20 about auxiliary
93800 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 6f 75 6e information boun
93810 64 20 74 6f 20 61 72 67 75 6d 65 6e 74 73 0d 0a d to arguments..
93820 2a 2a 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 ** of the functi
93830 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 on. This is use
93840 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 d to implement t
93850 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 he sqlite3_get_a
93860 75 78 64 61 74 61 28 29 0d 0a 2a 2a 20 61 6e 64 uxdata()..** and
93870 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 sqlite3_set_aux
93880 64 61 74 61 28 29 20 41 50 49 73 2e 20 20 54 68 data() APIs. Th
93890 65 20 22 61 75 78 64 61 74 61 22 20 69 73 20 73 e "auxdata" is s
938a0 6f 6d 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 ome auxiliary da
938b0 74 61 0d 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 ta..** that can
938c0 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 be associated wi
938d0 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 72 th a constant ar
938e0 67 75 6d 65 6e 74 20 74 6f 20 61 20 66 75 6e 63 gument to a func
938f0 74 69 6f 6e 2e 20 20 54 68 69 73 0d 0a 2a 2a 20 tion. This..**
93900 61 6c 6c 6f 77 73 20 66 75 6e 63 74 69 6f 6e 73 allows functions
93910 20 73 75 63 68 20 61 73 20 22 72 65 67 65 78 70 such as "regexp
93920 22 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 65 " to compile the
93930 69 72 20 63 6f 6e 73 74 61 6e 74 20 72 65 67 75 ir constant regu
93940 6c 61 72 0d 0a 2a 2a 20 65 78 70 72 65 73 73 69 lar..** expressi
93950 6f 6e 20 61 72 67 75 6d 65 6e 74 20 6f 6e 63 65 on argument once
93960 20 61 6e 64 20 72 65 75 73 65 64 20 74 68 65 20 and reused the
93970 63 6f 6d 70 69 6c 65 64 20 63 6f 64 65 20 66 6f compiled code fo
93980 72 20 6d 75 6c 74 69 70 6c 65 0d 0a 2a 2a 20 69 r multiple..** i
93990 6e 76 6f 63 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d nvocations...*/.
939a0 0a 73 74 72 75 63 74 20 56 64 62 65 46 75 6e 63 .struct VdbeFunc
939b0 20 7b 0d 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 {.. FuncDef *p
939c0 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 Func;
939d0 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66 69 6e /* The defin
939e0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e ition of the fun
939f0 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 ction */.. int
93a00 6e 41 75 78 3b 20 20 20 20 20 20 20 20 20 20 20 nAux;
93a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
93a20 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 ber of entries a
93a30 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 70 41 llocated for apA
93a40 75 78 5b 5d 20 2a 2f 0d 0a 20 20 73 74 72 75 63 ux[] */.. struc
93a50 74 20 41 75 78 44 61 74 61 20 7b 0d 0a 20 20 20 t AuxData {..
93a60 20 76 6f 69 64 20 2a 70 41 75 78 3b 20 20 20 20 void *pAux;
93a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
93a80 2a 20 41 75 78 20 64 61 74 61 20 66 6f 72 20 74 * Aux data for t
93a90 68 65 20 69 2d 74 68 20 61 72 67 75 6d 65 6e 74 he i-th argument
93aa0 20 2a 2f 0d 0a 20 20 20 20 76 6f 69 64 20 28 2a */.. void (*
93ab0 78 44 65 6c 65 74 65 29 28 76 6f 69 64 20 2a 29 xDelete)(void *)
93ac0 3b 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 ; /* Destru
93ad0 63 74 6f 72 20 66 6f 72 20 74 68 65 20 61 75 78 ctor for the aux
93ae0 20 64 61 74 61 20 2a 2f 0d 0a 20 20 7d 20 61 70 data */.. } ap
93af0 41 75 78 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 Aux[1];
93b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 /* One
93b10 20 73 6c 6f 74 20 66 6f 72 20 65 61 63 68 20 66 slot for each f
93b20 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 unction argument
93b30 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
93b40 2a 20 54 68 65 20 22 63 6f 6e 74 65 78 74 22 20 * The "context"
93b50 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61 20 69 argument for a i
93b60 6e 73 74 61 6c 6c 61 62 6c 65 20 66 75 6e 63 74 nstallable funct
93b70 69 6f 6e 2e 20 20 41 20 70 6f 69 6e 74 65 72 20 ion. A pointer
93b80 74 6f 20 61 6e 0d 0a 2a 2a 20 69 6e 73 74 61 6e to an..** instan
93b90 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 ce of this struc
93ba0 74 75 72 65 20 69 73 20 74 68 65 20 66 69 72 73 ture is the firs
93bb0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 t argument to th
93bc0 65 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64 0d e routines used.
93bd0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 .** implement th
93be0 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e e SQL functions.
93bf0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 20 69 ..**..** There i
93c00 73 20 61 20 74 79 70 65 64 65 66 20 66 6f 72 20 s a typedef for
93c10 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 this structure i
93c20 6e 20 73 71 6c 69 74 65 2e 68 2e 20 20 53 6f 20 n sqlite.h. So
93c30 61 6c 6c 20 72 6f 75 74 69 6e 65 73 2c 0d 0a 2a all routines,..*
93c40 2a 20 65 76 65 6e 20 74 68 65 20 70 75 62 6c 69 * even the publi
93c50 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 53 c interface to S
93c60 51 4c 69 74 65 2c 20 63 61 6e 20 75 73 65 20 61 QLite, can use a
93c70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 pointer to this
93c80 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 20 structure...**
93c90 42 75 74 20 74 68 69 73 20 66 69 6c 65 20 69 73 But this file is
93ca0 20 74 68 65 20 6f 6e 6c 79 20 70 6c 61 63 65 20 the only place
93cb0 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 72 6e where the intern
93cc0 61 6c 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 al details of th
93cd0 69 73 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 is..** structure
93ce0 20 61 72 65 20 6b 6e 6f 77 6e 2e 0d 0a 2a 2a 0d are known...**.
93cf0 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 .** This structu
93d00 72 65 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e re is defined in
93d10 73 69 64 65 20 6f 66 20 76 64 62 65 49 6e 74 2e side of vdbeInt.
93d20 68 20 62 65 63 61 75 73 65 20 69 74 20 75 73 65 h because it use
93d30 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 0d s substructures.
93d40 0a 2a 2a 20 28 4d 65 6d 29 20 77 68 69 63 68 20 .** (Mem) which
93d50 61 72 65 20 6f 6e 6c 79 20 64 65 66 69 6e 65 64 are only defined
93d60 20 74 68 65 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 there...*/..str
93d70 75 63 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 uct sqlite3_cont
93d80 65 78 74 20 7b 0d 0a 20 20 46 75 6e 63 44 65 66 ext {.. FuncDef
93d90 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 2f *pFunc; /
93da0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 75 6e * Pointer to fun
93db0 63 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f ction informatio
93dc0 6e 2e 20 20 4d 55 53 54 20 42 45 20 46 49 52 53 n. MUST BE FIRS
93dd0 54 20 2a 2f 0d 0a 20 20 56 64 62 65 46 75 6e 63 T */.. VdbeFunc
93de0 20 2a 70 56 64 62 65 46 75 6e 63 3b 20 20 2f 2a *pVdbeFunc; /*
93df0 20 41 75 78 69 6c 61 72 79 20 64 61 74 61 2c 20 Auxilary data,
93e00 69 66 20 63 72 65 61 74 65 64 2e 20 2a 2f 0d 0a if created. */..
93e10 20 20 4d 65 6d 20 73 3b 20 20 20 20 20 20 20 20 Mem s;
93e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 /* The r
93e30 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 73 eturn value is s
93e40 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0d 0a 20 tored here */..
93e50 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 Mem *pMem;
93e60 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 /* Memory
93e70 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20 73 74 cell used to st
93e80 6f 72 65 20 61 67 67 72 65 67 61 74 65 20 63 6f ore aggregate co
93e90 6e 74 65 78 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 ntext */.. int
93ea0 69 73 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 isError;
93eb0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 /* Error code
93ec0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 returned by the
93ed0 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0d 0a 20 20 function. */..
93ee0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 CollSeq *pColl;
93ef0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 /* Collati
93f00 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0d 0a ng sequence */..
93f10 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 };..../*..** An
93f20 45 78 70 6c 61 69 6e 20 6f 62 6a 65 63 74 20 61 Explain object a
93f30 63 63 75 6d 75 6c 61 74 65 73 20 69 6e 64 65 6e ccumulates inden
93f40 74 65 64 20 6f 75 74 70 75 74 20 77 68 69 63 68 ted output which
93f50 20 69 73 20 68 65 6c 70 66 75 6c 0d 0a 2a 2a 20 is helpful..**
93f60 69 6e 20 64 65 73 63 72 69 62 69 6e 67 20 72 65 in describing re
93f70 63 75 72 73 69 76 65 20 64 61 74 61 20 73 74 72 cursive data str
93f80 75 63 74 75 72 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 uctures...*/..st
93f90 72 75 63 74 20 45 78 70 6c 61 69 6e 20 7b 0d 0a ruct Explain {..
93fa0 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 20 Vdbe *pVdbe;
93fb0 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 /* Attach t
93fc0 68 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 74 he explanation t
93fd0 6f 20 74 68 69 73 20 56 64 62 65 20 2a 2f 0d 0a o this Vdbe */..
93fe0 20 20 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 StrAccum str;
93ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 /* The stri
94000 6e 67 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c ng being accumul
94010 61 74 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e ated */.. int n
94020 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 2f 2a Indent; /*
94030 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 Number of eleme
94040 6e 74 73 20 69 6e 20 61 49 6e 64 65 6e 74 20 2a nts in aIndent *
94050 2f 0d 0a 20 20 75 31 36 20 61 49 6e 64 65 6e 74 /.. u16 aIndent
94060 5b 31 30 30 5d 3b 20 20 2f 2a 20 4c 65 76 65 6c [100]; /* Level
94070 73 20 6f 66 20 69 6e 64 65 6e 74 61 74 69 6f 6e s of indentation
94080 20 2a 2f 0d 0a 20 20 63 68 61 72 20 7a 42 61 73 */.. char zBas
94090 65 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 e[100]; /* Ini
940a0 74 69 61 6c 20 73 70 61 63 65 20 2a 2f 0d 0a 7d tial space */..}
940b0 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 ;..../*..** An i
940c0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 76 nstance of the v
940d0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 irtual machine.
940e0 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 This structure
940f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d contains the com
94100 70 6c 65 74 65 0d 0a 2a 2a 20 73 74 61 74 65 20 plete..** state
94110 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d of the virtual m
94120 61 63 68 69 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 achine...**..**
94130 54 68 65 20 22 73 71 6c 69 74 65 33 5f 73 74 6d The "sqlite3_stm
94140 74 22 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 t" structure poi
94150 6e 74 65 72 20 74 68 61 74 20 69 73 20 72 65 74 nter that is ret
94160 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 urned by sqlite3
94170 5f 70 72 65 70 61 72 65 28 29 0d 0a 2a 2a 20 69 _prepare()..** i
94180 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 s really a point
94190 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 er to an instanc
941a0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 e of this struct
941b0 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ure...**..** The
941c0 20 56 64 62 65 2e 69 6e 56 74 61 62 4d 65 74 68 Vdbe.inVtabMeth
941d0 6f 64 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 od variable is s
941e0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 66 et to non-zero f
941f0 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 or the duration
94200 6f 66 0d 0a 2a 2a 20 61 6e 79 20 76 69 72 74 75 of..** any virtu
94210 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 al table method
94220 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 invocations made
94230 20 62 79 20 74 68 65 20 76 64 62 65 20 70 72 6f by the vdbe pro
94240 67 72 61 6d 2e 20 49 74 20 69 73 0d 0a 2a 2a 20 gram. It is..**
94250 73 65 74 20 74 6f 20 32 20 66 6f 72 20 78 44 65 set to 2 for xDe
94260 73 74 72 6f 79 20 6d 65 74 68 6f 64 20 63 61 6c stroy method cal
94270 6c 73 20 61 6e 64 20 31 20 66 6f 72 20 61 6c 6c ls and 1 for all
94280 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 73 2e 20 other methods.
94290 54 68 69 73 0d 0a 2a 2a 20 76 61 72 69 61 62 6c This..** variabl
942a0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 77 e is used for tw
942b0 6f 20 70 75 72 70 6f 73 65 73 3a 20 74 6f 20 61 o purposes: to a
942c0 6c 6c 6f 77 20 78 44 65 73 74 72 6f 79 20 6d 65 llow xDestroy me
942d0 74 68 6f 64 73 20 74 6f 20 65 78 65 63 75 74 65 thods to execute
942e0 0d 0a 2a 2a 20 22 44 52 4f 50 20 54 41 42 4c 45 ..** "DROP TABLE
942f0 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 " statements and
94300 20 74 6f 20 70 72 65 76 65 6e 74 20 73 6f 6d 65 to prevent some
94310 20 6e 61 73 74 79 20 73 69 64 65 20 65 66 66 65 nasty side effe
94320 63 74 73 20 6f 66 0d 0a 2a 2a 20 6d 61 6c 6c 6f cts of..** mallo
94330 63 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 53 c failure when S
94340 51 4c 69 74 65 20 69 73 20 69 6e 76 6f 6b 65 64 QLite is invoked
94350 20 72 65 63 75 72 73 69 76 65 6c 79 20 62 79 20 recursively by
94360 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 a virtual table
94370 0d 0a 2a 2a 20 6d 65 74 68 6f 64 20 66 75 6e 63 ..** method func
94380 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 tion...*/..struc
94390 74 20 56 64 62 65 20 7b 0d 0a 20 20 73 71 6c 69 t Vdbe {.. sqli
943a0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 te3 *db;
943b0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 /* The datab
943c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 ase connection t
943d0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 73 74 hat owns this st
943e0 61 74 65 6d 65 6e 74 20 2a 2f 0d 0a 20 20 4f 70 atement */.. Op
943f0 20 2a 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 *aOp;
94400 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 /* Space t
94410 6f 20 68 6f 6c 64 20 74 68 65 20 76 69 72 74 75 o hold the virtu
94420 61 6c 20 6d 61 63 68 69 6e 65 27 73 20 70 72 6f al machine's pro
94430 67 72 61 6d 20 2a 2f 0d 0a 20 20 4d 65 6d 20 2a gram */.. Mem *
94440 61 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 aMem;
94450 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 6f 72 79 /* The memory
94460 20 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f 0d 0a 20 locations */..
94470 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 20 20 20 Mem **apArg;
94480 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 /* Argu
94490 6d 65 6e 74 73 20 74 6f 20 63 75 72 72 65 6e 74 ments to current
944a0 6c 79 20 65 78 65 63 75 74 69 6e 67 20 75 73 65 ly executing use
944b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 r function */..
944c0 20 4d 65 6d 20 2a 61 43 6f 6c 4e 61 6d 65 3b 20 Mem *aColName;
944d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 /* Colu
944e0 6d 6e 20 6e 61 6d 65 73 20 74 6f 20 72 65 74 75 mn names to retu
944f0 72 6e 20 2a 2f 0d 0a 20 20 4d 65 6d 20 2a 70 52 rn */.. Mem *pR
94500 65 73 75 6c 74 53 65 74 3b 20 20 20 20 20 20 20 esultSet;
94510 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 /* Pointer to a
94520 6e 20 61 72 72 61 79 20 6f 66 20 72 65 73 75 6c n array of resul
94530 74 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4d 65 ts */.. int nMe
94540 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m;
94550 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 /* Number of me
94560 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 63 mory locations c
94570 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 urrently allocat
94580 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4f 70 ed */.. int nOp
94590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
945a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e /* Number of in
945b0 73 74 72 75 63 74 69 6f 6e 73 20 69 6e 20 74 68 structions in th
945c0 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0d 0a 20 20 e program */..
945d0 69 6e 74 20 6e 4f 70 41 6c 6c 6f 63 3b 20 20 20 int nOpAlloc;
945e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
945f0 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 r of slots alloc
94600 61 74 65 64 20 66 6f 72 20 61 4f 70 5b 5d 20 2a ated for aOp[] *
94610 2f 0d 0a 20 20 69 6e 74 20 6e 4c 61 62 65 6c 3b /.. int nLabel;
94620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
94630 4e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c 73 Number of labels
94640 20 75 73 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 used */.. int
94650 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 20 20 20 nLabelAlloc;
94660 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
94670 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 slots allocated
94680 20 69 6e 20 61 4c 61 62 65 6c 5b 5d 20 2a 2f 0d in aLabel[] */.
94690 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 3b 20 . int *aLabel;
946a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 /* Sp
946b0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ace to hold the
946c0 6c 61 62 65 6c 73 20 2a 2f 0d 0a 20 20 75 31 36 labels */.. u16
946d0 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 20 20 20 20 nResColumn;
946e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
946f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 6e 65 f columns in one
94700 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 row of the resu
94710 6c 74 20 73 65 74 20 2a 2f 0d 0a 20 20 75 31 36 lt set */.. u16
94720 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 nCursor;
94730 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
94740 66 20 73 6c 6f 74 73 20 69 6e 20 61 70 43 73 72 f slots in apCsr
94750 5b 5d 20 2a 2f 0d 0a 20 20 75 33 32 20 6d 61 67 [] */.. u32 mag
94760 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ic;
94770 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 /* Magic number
94780 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 for sanity chec
94790 6b 69 6e 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 king */.. char
947a0 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20 20 *zErrMsg;
947b0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 /* Error mess
947c0 61 67 65 20 77 72 69 74 74 65 6e 20 68 65 72 65 age written here
947d0 20 2a 2f 0d 0a 20 20 56 64 62 65 20 2a 70 50 72 */.. Vdbe *pPr
947e0 65 76 2c 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f ev,*pNext; /
947f0 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 * Linked list of
94800 20 56 44 42 45 73 20 77 69 74 68 20 74 68 65 20 VDBEs with the
94810 73 61 6d 65 20 56 64 62 65 2e 64 62 20 2a 2f 0d same Vdbe.db */.
94820 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a . VdbeCursor **
94830 61 70 43 73 72 3b 20 20 20 20 20 2f 2a 20 4f 6e apCsr; /* On
94840 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 e element of thi
94850 73 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68 s array for each
94860 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 2a 2f 0d open cursor */.
94870 0a 20 20 4d 65 6d 20 2a 61 56 61 72 3b 20 20 20 . Mem *aVar;
94880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 /* Va
94890 6c 75 65 73 20 66 6f 72 20 74 68 65 20 4f 50 5f lues for the OP_
948a0 56 61 72 69 61 62 6c 65 20 6f 70 63 6f 64 65 2e Variable opcode.
948b0 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 61 7a */.. char **az
948c0 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f Var; /
948d0 2a 20 4e 61 6d 65 20 6f 66 20 76 61 72 69 61 62 * Name of variab
948e0 6c 65 73 20 2a 2f 0d 0a 20 20 79 6e 56 61 72 20 les */.. ynVar
948f0 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 nVar;
94900 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 /* Number of e
94910 6e 74 72 69 65 73 20 69 6e 20 61 56 61 72 5b 5d ntries in aVar[]
94920 20 2a 2f 0d 0a 20 20 79 6e 56 61 72 20 6e 7a 56 */.. ynVar nzV
94930 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f ar; /
94940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 * Number of entr
94950 69 65 73 20 69 6e 20 61 7a 56 61 72 5b 5d 20 2a ies in azVar[] *
94960 2f 0d 0a 20 20 75 33 32 20 63 61 63 68 65 43 74 /.. u32 cacheCt
94970 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 r; /*
94980 56 64 62 65 43 75 72 73 6f 72 20 72 6f 77 20 63 VdbeCursor row c
94990 61 63 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 ache generation
949a0 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 69 6e counter */.. in
949b0 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 t pc;
949c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f /* The pro
949d0 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0d gram counter */.
949e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
949f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 /* Va
94a00 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f lue to return */
94a10 0d 0a 20 20 75 38 20 65 72 72 6f 72 41 63 74 69 .. u8 errorActi
94a20 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 on; /* R
94a30 65 63 6f 76 65 72 79 20 61 63 74 69 6f 6e 20 74 ecovery action t
94a40 6f 20 64 6f 20 69 6e 20 63 61 73 65 20 6f 66 20 o do in case of
94a50 61 6e 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 75 an error */.. u
94a60 38 20 65 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 8 explain;
94a70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
94a80 66 20 45 58 50 4c 41 49 4e 20 70 72 65 73 65 6e f EXPLAIN presen
94a90 74 20 6f 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 t on SQL command
94aa0 20 2a 2f 0d 0a 20 20 75 38 20 63 68 61 6e 67 65 */.. u8 change
94ab0 43 6e 74 4f 6e 3b 20 20 20 20 20 20 20 20 20 2f CntOn; /
94ac0 2a 20 54 72 75 65 20 74 6f 20 75 70 64 61 74 65 * True to update
94ad0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e the change-coun
94ae0 74 65 72 20 2a 2f 0d 0a 20 20 75 38 20 65 78 70 ter */.. u8 exp
94af0 69 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 ired;
94b00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 /* True if the
94b10 20 56 4d 20 6e 65 65 64 73 20 74 6f 20 62 65 20 VM needs to be
94b20 72 65 63 6f 6d 70 69 6c 65 64 20 2a 2f 0d 0a 20 recompiled */..
94b30 20 75 38 20 72 75 6e 4f 6e 6c 79 4f 6e 63 65 3b u8 runOnlyOnce;
94b40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f /* Auto
94b50 6d 61 74 69 63 61 6c 6c 79 20 65 78 70 69 72 65 matically expire
94b60 20 6f 6e 20 72 65 73 65 74 20 2a 2f 0d 0a 20 20 on reset */..
94b70 75 38 20 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 u8 minWriteFileF
94b80 6f 72 6d 61 74 3b 20 20 2f 2a 20 4d 69 6e 69 6d ormat; /* Minim
94b90 75 6d 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 66 um file format f
94ba0 6f 72 20 77 72 69 74 61 62 6c 65 20 64 61 74 61 or writable data
94bb0 62 61 73 65 20 66 69 6c 65 73 20 2a 2f 0d 0a 20 base files */..
94bc0 20 75 38 20 69 6e 56 74 61 62 4d 65 74 68 6f 64 u8 inVtabMethod
94bd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 ; /* See
94be0 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 2a comments above *
94bf0 2f 0d 0a 20 20 75 38 20 75 73 65 73 53 74 6d 74 /.. u8 usesStmt
94c00 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 Journal; /*
94c10 54 72 75 65 20 69 66 20 75 73 65 73 20 61 20 73 True if uses a s
94c20 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c tatement journal
94c30 20 2a 2f 0d 0a 20 20 75 38 20 72 65 61 64 4f 6e */.. u8 readOn
94c40 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f ly; /
94c50 2a 20 54 72 75 65 20 66 6f 72 20 72 65 61 64 2d * True for read-
94c60 6f 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 73 20 only statements
94c70 2a 2f 0d 0a 20 20 75 38 20 69 73 50 72 65 70 61 */.. u8 isPrepa
94c80 72 65 56 32 3b 20 20 20 20 20 20 20 20 20 2f 2a reV2; /*
94c90 20 54 72 75 65 20 69 66 20 70 72 65 70 61 72 65 True if prepare
94ca0 64 20 77 69 74 68 20 70 72 65 70 61 72 65 5f 76 d with prepare_v
94cb0 32 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 2() */.. int nC
94cc0 68 61 6e 67 65 3b 20 20 20 20 20 20 20 20 20 20 hange;
94cd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 /* Number of d
94ce0 62 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 73 b changes made s
94cf0 69 6e 63 65 20 6c 61 73 74 20 72 65 73 65 74 20 ince last reset
94d00 2a 2f 0d 0a 20 20 79 44 62 4d 61 73 6b 20 62 74 */.. yDbMask bt
94d10 72 65 65 4d 61 73 6b 3b 20 20 20 20 20 20 2f 2a reeMask; /*
94d20 20 42 69 74 6d 61 73 6b 20 6f 66 20 64 62 2d 3e Bitmask of db->
94d30 61 44 62 5b 5d 20 65 6e 74 72 69 65 73 20 72 65 aDb[] entries re
94d40 66 65 72 65 6e 63 65 64 20 2a 2f 0d 0a 20 20 79 ferenced */.. y
94d50 44 62 4d 61 73 6b 20 6c 6f 63 6b 4d 61 73 6b 3b DbMask lockMask;
94d60 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 65 74 /* Subset
94d70 20 6f 66 20 62 74 72 65 65 4d 61 73 6b 20 74 68 of btreeMask th
94d80 61 74 20 72 65 71 75 69 72 65 73 20 61 20 6c 6f at requires a lo
94d90 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53 74 ck */.. int iSt
94da0 61 74 65 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 atement;
94db0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 6e 75 /* Statement nu
94dc0 6d 62 65 72 20 28 6f 72 20 30 20 69 66 20 68 61 mber (or 0 if ha
94dd0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 73 74 6d s not opened stm
94de0 74 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 43 6f t) */.. int aCo
94df0 75 6e 74 65 72 5b 33 5d 3b 20 20 20 20 20 20 20 unter[3];
94e00 20 2f 2a 20 43 6f 75 6e 74 65 72 73 20 75 73 65 /* Counters use
94e10 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d d by sqlite3_stm
94e20 74 5f 73 74 61 74 75 73 28 29 20 2a 2f 0d 0a 23 t_status() */..#
94e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
94e40 49 54 5f 54 52 41 43 45 0d 0a 20 20 69 36 34 20 IT_TRACE.. i64
94e50 73 74 61 72 74 54 69 6d 65 3b 20 20 20 20 20 20 startTime;
94e60 20 20 20 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e /* Time when
94e70 20 71 75 65 72 79 20 73 74 61 72 74 65 64 20 2d query started -
94e80 20 75 73 65 64 20 66 6f 72 20 70 72 6f 66 69 6c used for profil
94e90 69 6e 67 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a ing */..#endif..
94ea0 20 20 69 36 34 20 6e 46 6b 43 6f 6e 73 74 72 61 i64 nFkConstra
94eb0 69 6e 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d int; /* Num
94ec0 62 65 72 20 6f 66 20 69 6d 6d 2e 20 46 4b 20 63 ber of imm. FK c
94ed0 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 69 73 20 onstraints this
94ee0 56 4d 20 2a 2f 0d 0a 20 20 69 36 34 20 6e 53 74 VM */.. i64 nSt
94ef0 6d 74 44 65 66 43 6f 6e 73 3b 20 20 20 20 20 20 mtDefCons;
94f00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65 /* Number of de
94f10 66 2e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 f. constraints w
94f20 68 65 6e 20 73 74 6d 74 20 73 74 61 72 74 65 64 hen stmt started
94f30 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 53 71 */.. char *zSq
94f40 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f l; /
94f50 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 * Text of the SQ
94f60 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 L statement that
94f70 20 67 65 6e 65 72 61 74 65 64 20 74 68 69 73 20 generated this
94f80 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 46 72 65 */.. void *pFre
94f90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a e; /*
94fa0 20 46 72 65 65 20 74 68 69 73 20 77 68 65 6e 20 Free this when
94fb0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 76 64 62 deleting the vdb
94fc0 65 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c e */..#ifdef SQL
94fd0 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 46 49 4c ITE_DEBUG.. FIL
94fe0 45 20 2a 74 72 61 63 65 3b 20 20 20 20 20 20 20 E *trace;
94ff0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6e /* Write an
95000 20 65 78 65 63 75 74 69 6f 6e 20 74 72 61 63 65 execution trace
95010 20 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 here, if not NU
95020 4c 4c 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 LL */..#endif..#
95030 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
95040 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e BLE_TREE_EXPLAIN
95050 0d 0a 20 20 45 78 70 6c 61 69 6e 20 2a 70 45 78 .. Explain *pEx
95060 70 6c 61 69 6e 3b 20 20 20 20 20 20 2f 2a 20 54 plain; /* T
95070 68 65 20 65 78 70 6c 61 69 6e 65 72 20 2a 2f 0d he explainer */.
95080 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 . char *zExplai
95090 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 n; /* Ex
950a0 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 64 61 74 planation of dat
950b0 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0d a structures */.
950c0 0a 23 65 6e 64 69 66 0d 0a 20 20 56 64 62 65 46 .#endif.. VdbeF
950d0 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 rame *pFrame;
950e0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 66 72 61 /* Parent fra
950f0 6d 65 20 2a 2f 0d 0a 20 20 56 64 62 65 46 72 61 me */.. VdbeFra
95100 6d 65 20 2a 70 44 65 6c 46 72 61 6d 65 3b 20 20 me *pDelFrame;
95110 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d /* List of fram
95120 65 20 6f 62 6a 65 63 74 73 20 74 6f 20 66 72 65 e objects to fre
95130 65 20 6f 6e 20 56 4d 20 72 65 73 65 74 20 2a 2f e on VM reset */
95140 0d 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 3b 20 .. int nFrame;
95150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
95160 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 umber of frames
95170 69 6e 20 70 46 72 61 6d 65 20 6c 69 73 74 20 2a in pFrame list *
95180 2f 0d 0a 20 20 75 33 32 20 65 78 70 6d 61 73 6b /.. u32 expmask
95190 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
951a0 42 69 6e 64 69 6e 67 20 74 6f 20 74 68 65 73 65 Binding to these
951b0 20 76 61 72 73 20 69 6e 76 61 6c 69 64 61 74 65 vars invalidate
951c0 73 20 56 4d 20 2a 2f 0d 0a 20 20 53 75 62 50 72 s VM */.. SubPr
951d0 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b ogram *pProgram;
951e0 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 /* Linked lis
951f0 74 20 6f 66 20 61 6c 6c 20 73 75 62 2d 70 72 6f t of all sub-pro
95200 67 72 61 6d 73 20 75 73 65 64 20 62 79 20 56 4d grams used by VM
95210 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 */.. int nOnce
95220 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 2f Flag; /
95230 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 * Size of array
95240 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0d 0a aOnceFlag[] */..
95250 20 20 75 38 20 2a 61 4f 6e 63 65 46 6c 61 67 3b u8 *aOnceFlag;
95260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 /* Fla
95270 67 73 20 66 6f 72 20 4f 50 5f 4f 6e 63 65 20 2a gs for OP_Once *
95280 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 /..};..../*..**
95290 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 The following ar
952a0 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 e allowed values
952b0 20 66 6f 72 20 56 64 62 65 2e 6d 61 67 69 63 0d for Vdbe.magic.
952c0 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 56 44 42 .*/..#define VDB
952d0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 20 20 20 E_MAGIC_INIT
952e0 20 30 78 32 36 62 63 65 61 61 35 20 20 20 20 2f 0x26bceaa5 /
952f0 2a 20 42 75 69 6c 64 69 6e 67 20 61 20 56 44 42 * Building a VDB
95300 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0d 0a 23 64 E program */..#d
95310 65 66 69 6e 65 20 56 44 42 45 5f 4d 41 47 49 43 efine VDBE_MAGIC
95320 5f 52 55 4e 20 20 20 20 20 20 30 78 62 64 66 32 _RUN 0xbdf2
95330 30 64 61 33 20 20 20 20 2f 2a 20 56 44 42 45 20 0da3 /* VDBE
95340 69 73 20 72 65 61 64 79 20 74 6f 20 65 78 65 63 is ready to exec
95350 75 74 65 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 ute */..#define
95360 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 VDBE_MAGIC_HALT
95370 20 20 20 20 30 78 35 31 39 63 32 39 37 33 20 20 0x519c2973
95380 20 20 2f 2a 20 56 44 42 45 20 68 61 73 20 63 6f /* VDBE has co
95390 6d 70 6c 65 74 65 64 20 65 78 65 63 75 74 69 6f mpleted executio
953a0 6e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 56 44 n */..#define VD
953b0 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 20 20 20 BE_MAGIC_DEAD
953c0 20 20 30 78 62 36 30 36 63 33 63 38 20 20 20 20 0xb606c3c8
953d0 2f 2a 20 54 68 65 20 56 44 42 45 20 68 61 73 20 /* The VDBE has
953e0 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 been deallocated
953f0 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 75 */..../*..** Fu
95400 6e 63 74 69 6f 6e 20 70 72 6f 74 6f 74 79 70 65 nction prototype
95410 73 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 s..*/..SQLITE_PR
95420 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
95430 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 e3VdbeFreeCursor
95440 28 56 64 62 65 20 2a 2c 20 56 64 62 65 43 75 72 (Vdbe *, VdbeCur
95450 73 6f 72 2a 29 3b 0d 0a 76 6f 69 64 20 73 71 6c sor*);..void sql
95460 69 74 65 56 64 62 65 50 6f 70 53 74 61 63 6b 28 iteVdbePopStack(
95470 56 64 62 65 2a 2c 69 6e 74 29 3b 0d 0a 53 51 4c Vdbe*,int);..SQL
95480 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
95490 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f sqlite3VdbeCurso
954a0 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 rMoveto(VdbeCurs
954b0 6f 72 2a 29 3b 0d 0a 23 69 66 20 64 65 66 69 6e or*);..#if defin
954c0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 ed(SQLITE_DEBUG)
954d0 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 || defined(VDBE
954e0 5f 50 52 4f 46 49 4c 45 29 0d 0a 53 51 4c 49 54 _PROFILE)..SQLIT
954f0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
95500 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f qlite3VdbePrintO
95510 70 28 46 49 4c 45 2a 2c 20 69 6e 74 2c 20 4f 70 p(FILE*, int, Op
95520 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 53 51 4c *);..#endif..SQL
95530 49 54 45 5f 50 52 49 56 41 54 45 20 75 33 32 20 ITE_PRIVATE u32
95540 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
95550 6c 54 79 70 65 4c 65 6e 28 75 33 32 29 3b 0d 0a lTypeLen(u32);..
95560 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 75 SQLITE_PRIVATE u
95570 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 32 sqlite3VdbeSe
95580 72 69 61 6c 54 79 70 65 28 4d 65 6d 2a 2c 20 69 rialType(Mem*, i
95590 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 nt);..SQLITE_PRI
955a0 56 41 54 45 20 75 33 32 20 73 71 6c 69 74 65 33 VATE u32 sqlite3
955b0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e VdbeSerialPut(un
955c0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 69 6e signed char*, in
955d0 74 2c 20 4d 65 6d 2a 2c 20 69 6e 74 29 3b 0d 0a t, Mem*, int);..
955e0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 75 SQLITE_PRIVATE u
955f0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 32 sqlite3VdbeSe
95600 72 69 61 6c 47 65 74 28 63 6f 6e 73 74 20 75 6e rialGet(const un
95610 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 75 33 signed char*, u3
95620 32 2c 20 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 2, Mem*);..SQLIT
95630 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
95640 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
95650 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 AuxData(VdbeFunc
95660 2a 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 69 6e 74 20 *, int);....int
95670 73 71 6c 69 74 65 32 42 74 72 65 65 4b 65 79 43 sqlite2BtreeKeyC
95680 6f 6d 70 61 72 65 28 42 74 43 75 72 73 6f 72 20 ompare(BtCursor
95690 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c *, const void *,
956a0 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 20 2a int, int, int *
956b0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
956c0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
956d0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 beIdxKeyCompare(
956e0 56 64 62 65 43 75 72 73 6f 72 2a 2c 55 6e 70 61 VdbeCursor*,Unpa
956f0 63 6b 65 64 52 65 63 6f 72 64 2a 2c 69 6e 74 2a ckedRecord*,int*
95700 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
95710 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
95720 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 beIdxRowid(sqlit
95730 65 33 2a 2c 20 42 74 43 75 72 73 6f 72 20 2a 2c e3*, BtCursor *,
95740 20 69 36 34 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 i64 *);..SQLITE
95750 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
95760 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 ite3MemCompare(c
95770 6f 6e 73 74 20 4d 65 6d 2a 2c 20 63 6f 6e 73 74 onst Mem*, const
95780 20 4d 65 6d 2a 2c 20 63 6f 6e 73 74 20 43 6f 6c Mem*, const Col
95790 6c 53 65 71 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f lSeq*);..SQLITE_
957a0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
957b0 74 65 33 56 64 62 65 45 78 65 63 28 56 64 62 65 te3VdbeExec(Vdbe
957c0 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 *);..SQLITE_PRIV
957d0 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 ATE int sqlite3V
957e0 64 62 65 4c 69 73 74 28 56 64 62 65 2a 29 3b 0d dbeList(Vdbe*);.
957f0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
95800 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 int sqlite3VdbeH
95810 61 6c 74 28 56 64 62 65 2a 29 3b 0d 0a 53 51 4c alt(Vdbe*);..SQL
95820 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
95830 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
95840 65 45 6e 63 6f 64 69 6e 67 28 4d 65 6d 20 2a 2c eEncoding(Mem *,
95850 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 int);..SQLITE_P
95860 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
95870 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 e3VdbeMemTooBig(
95880 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 Mem*);..SQLITE_P
95890 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
958a0 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 4d 65 e3VdbeMemCopy(Me
958b0 6d 2a 2c 20 63 6f 6e 73 74 20 4d 65 6d 2a 29 3b m*, const Mem*);
958c0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
958d0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 void sqlite3Vdb
958e0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 eMemShallowCopy(
958f0 4d 65 6d 2a 2c 20 63 6f 6e 73 74 20 4d 65 6d 2a Mem*, const Mem*
95900 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f , int);..SQLITE_
95910 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
95920 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 ite3VdbeMemMove(
95930 4d 65 6d 2a 2c 20 4d 65 6d 2a 29 3b 0d 0a 53 51 Mem*, Mem*);..SQ
95940 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
95950 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e sqlite3VdbeMemN
95960 75 6c 54 65 72 6d 69 6e 61 74 65 28 4d 65 6d 2a ulTerminate(Mem*
95970 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
95980 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
95990 62 65 4d 65 6d 53 65 74 53 74 72 28 4d 65 6d 2a beMemSetStr(Mem*
959a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 , const char*, i
959b0 6e 74 2c 20 75 38 2c 20 76 6f 69 64 28 2a 29 28 nt, u8, void(*)(
959c0 76 6f 69 64 2a 29 29 3b 0d 0a 53 51 4c 49 54 45 void*));..SQLITE
959d0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
959e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 lite3VdbeMemSetI
959f0 6e 74 36 34 28 4d 65 6d 2a 2c 20 69 36 34 29 3b nt64(Mem*, i64);
95a00 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
95a10 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f OMIT_FLOATING_PO
95a20 49 4e 54 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 INT..# define sq
95a30 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 44 lite3VdbeMemSetD
95a40 6f 75 62 6c 65 20 73 71 6c 69 74 65 33 56 64 62 ouble sqlite3Vdb
95a50 65 4d 65 6d 53 65 74 49 6e 74 36 34 0d 0a 23 65 eMemSetInt64..#e
95a60 6c 73 65 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 lse..SQLITE_PRIV
95a70 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 ATE void sqlit
95a80 65 33 56 64 62 65 4d 65 6d 53 65 74 44 6f 75 62 e3VdbeMemSetDoub
95a90 6c 65 28 4d 65 6d 2a 2c 20 64 6f 75 62 6c 65 29 le(Mem*, double)
95aa0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 53 51 4c 49 54 ;..#endif..SQLIT
95ab0 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
95ac0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 qlite3VdbeMemSet
95ad0 4e 75 6c 6c 28 4d 65 6d 2a 29 3b 0d 0a 53 51 4c Null(Mem*);..SQL
95ae0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
95af0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
95b00 65 74 5a 65 72 6f 42 6c 6f 62 28 4d 65 6d 2a 2c etZeroBlob(Mem*,
95b10 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
95b20 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
95b30 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 e3VdbeMemSetRowS
95b40 65 74 28 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 et(Mem*);..SQLIT
95b50 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
95b60 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 lite3VdbeMemMake
95b70 57 72 69 74 65 61 62 6c 65 28 4d 65 6d 2a 29 3b Writeable(Mem*);
95b80 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
95b90 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 int sqlite3Vdbe
95ba0 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 4d 65 6d MemStringify(Mem
95bb0 2a 2c 20 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 *, int);..SQLITE
95bc0 5f 50 52 49 56 41 54 45 20 69 36 34 20 73 71 6c _PRIVATE i64 sql
95bd0 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 ite3VdbeIntValue
95be0 28 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f (Mem*);..SQLITE_
95bf0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
95c00 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 te3VdbeMemIntege
95c10 72 69 66 79 28 4d 65 6d 2a 29 3b 0d 0a 53 51 4c rify(Mem*);..SQL
95c20 49 54 45 5f 50 52 49 56 41 54 45 20 64 6f 75 62 ITE_PRIVATE doub
95c30 6c 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 le sqlite3VdbeRe
95c40 61 6c 56 61 6c 75 65 28 4d 65 6d 2a 29 3b 0d 0a alValue(Mem*);..
95c50 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
95c60 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 oid sqlite3VdbeI
95c70 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28 4d ntegerAffinity(M
95c80 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 em*);..SQLITE_PR
95c90 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
95ca0 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 3VdbeMemRealify(
95cb0 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 Mem*);..SQLITE_P
95cc0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
95cd0 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 e3VdbeMemNumerif
95ce0 79 28 4d 65 6d 2a 29 3b 0d 0a 53 51 4c 49 54 45 y(Mem*);..SQLITE
95cf0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
95d00 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 ite3VdbeMemFromB
95d10 74 72 65 65 28 42 74 43 75 72 73 6f 72 2a 2c 69 tree(BtCursor*,i
95d20 6e 74 2c 69 6e 74 2c 69 6e 74 2c 4d 65 6d 2a 29 nt,int,int,Mem*)
95d30 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
95d40 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 E void sqlite3Vd
95d50 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 4d 65 6d beMemRelease(Mem
95d60 20 2a 70 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 *p);..SQLITE_PR
95d70 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
95d80 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
95d90 45 78 74 65 72 6e 61 6c 28 4d 65 6d 20 2a 70 29 External(Mem *p)
95da0 3b 0d 0a 23 64 65 66 69 6e 65 20 56 64 62 65 4d ;..#define VdbeM
95db0 65 6d 52 65 6c 65 61 73 65 28 58 29 20 20 5c 0d emRelease(X) \.
95dc0 0a 20 20 69 66 28 28 58 29 2d 3e 66 6c 61 67 73 . if((X)->flags
95dd0 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 &(MEM_Agg|MEM_Dy
95de0 6e 7c 4d 45 4d 5f 52 6f 77 53 65 74 7c 4d 45 4d n|MEM_RowSet|MEM
95df0 5f 46 72 61 6d 65 29 29 20 5c 0d 0a 20 20 20 20 _Frame)) \..
95e00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
95e10 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 58 29 leaseExternal(X)
95e20 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
95e30 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 E int sqlite3Vdb
95e40 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 4d 65 6d eMemFinalize(Mem
95e50 2a 2c 20 46 75 6e 63 44 65 66 2a 29 3b 0d 0a 53 *, FuncDef*);..S
95e60 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f QLITE_PRIVATE co
95e70 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 nst char *sqlite
95e80 33 4f 70 63 6f 64 65 4e 61 6d 65 28 69 6e 74 29 3OpcodeName(int)
95e90 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
95ea0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 E int sqlite3Vdb
95eb0 65 4d 65 6d 47 72 6f 77 28 4d 65 6d 20 2a 70 4d eMemGrow(Mem *pM
95ec0 65 6d 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 em, int n, int p
95ed0 72 65 73 65 72 76 65 29 3b 0d 0a 53 51 4c 49 54 reserve);..SQLIT
95ee0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
95ef0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 lite3VdbeCloseSt
95f00 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 2c 20 atement(Vdbe *,
95f10 69 6e 74 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 int);..SQLITE_PR
95f20 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
95f30 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 e3VdbeFrameDelet
95f40 65 28 56 64 62 65 46 72 61 6d 65 2a 29 3b 0d 0a e(VdbeFrame*);..
95f50 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
95f60 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 nt sqlite3VdbeFr
95f70 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 ameRestore(VdbeF
95f80 72 61 6d 65 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 rame *);..SQLITE
95f90 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
95fa0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 lite3VdbeMemStor
95fb0 65 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 eType(Mem *pMem)
95fc0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
95fd0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 E int sqlite3Vdb
95fe0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 eTransferError(V
95ff0 64 62 65 20 2a 70 29 3b 0d 0a 0d 0a 23 69 66 64 dbe *p);....#ifd
96000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d ef SQLITE_OMIT_M
96010 45 52 47 45 5f 53 4f 52 54 0d 0a 23 20 64 65 66 ERGE_SORT..# def
96020 69 6e 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 ine sqlite3VdbeS
96030 6f 72 74 65 72 49 6e 69 74 28 59 2c 5a 29 20 20 orterInit(Y,Z)
96040 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 23 SQLITE_OK..#
96050 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 56 define sqlite3V
96060 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28 58 dbeSorterWrite(X
96070 2c 59 2c 5a 29 20 20 20 53 51 4c 49 54 45 5f 4f ,Y,Z) SQLITE_O
96080 4b 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 K..# define sqli
96090 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f te3VdbeSorterClo
960a0 73 65 28 59 2c 5a 29 0d 0a 23 20 64 65 66 69 6e se(Y,Z)..# defin
960b0 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 e sqlite3VdbeSor
960c0 74 65 72 52 6f 77 6b 65 79 28 59 2c 5a 29 20 20 terRowkey(Y,Z)
960d0 20 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 23 20 64 SQLITE_OK..# d
960e0 65 66 69 6e 65 20 73 71 6c 69 74 65 33 56 64 62 efine sqlite3Vdb
960f0 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 58 2c eSorterRewind(X,
96100 59 2c 5a 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0d Y,Z) SQLITE_OK.
96110 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 .# define sqlite
96120 33 56 64 62 65 53 6f 72 74 65 72 4e 65 78 74 28 3VdbeSorterNext(
96130 58 2c 59 2c 5a 29 20 20 20 20 53 51 4c 49 54 45 X,Y,Z) SQLITE
96140 5f 4f 4b 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 _OK..# define sq
96150 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 lite3VdbeSorterC
96160 6f 6d 70 61 72 65 28 58 2c 59 2c 5a 29 20 53 51 ompare(X,Y,Z) SQ
96170 4c 49 54 45 5f 4f 4b 0d 0a 23 65 6c 73 65 0d 0a LITE_OK..#else..
96180 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
96190 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f nt sqlite3VdbeSo
961a0 72 74 65 72 49 6e 69 74 28 73 71 6c 69 74 65 33 rterInit(sqlite3
961b0 20 2a 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a *, VdbeCursor *
961c0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
961d0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 TE void sqlite3V
961e0 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 73 dbeSorterClose(s
961f0 71 6c 69 74 65 33 20 2a 2c 20 56 64 62 65 43 75 qlite3 *, VdbeCu
96200 72 73 6f 72 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 rsor *);..SQLITE
96210 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
96220 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 6f ite3VdbeSorterRo
96230 77 6b 65 79 28 56 64 62 65 43 75 72 73 6f 72 20 wkey(VdbeCursor
96240 2a 2c 20 4d 65 6d 20 2a 29 3b 0d 0a 53 51 4c 49 *, Mem *);..SQLI
96250 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
96260 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 qlite3VdbeSorter
96270 4e 65 78 74 28 73 71 6c 69 74 65 33 20 2a 2c 20 Next(sqlite3 *,
96280 56 64 62 65 43 75 72 73 6f 72 20 2a 2c 20 69 6e VdbeCursor *, in
96290 74 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 t *);..SQLITE_PR
962a0 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
962b0 33 56 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 3VdbeSorterRewin
962c0 64 28 73 71 6c 69 74 65 33 20 2a 2c 20 56 64 62 d(sqlite3 *, Vdb
962d0 65 43 75 72 73 6f 72 20 2a 2c 20 69 6e 74 20 2a eCursor *, int *
962e0 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 );..SQLITE_PRIVA
962f0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
96300 62 65 53 6f 72 74 65 72 57 72 69 74 65 28 73 71 beSorterWrite(sq
96310 6c 69 74 65 33 20 2a 2c 20 56 64 62 65 43 75 72 lite3 *, VdbeCur
96320 73 6f 72 20 2a 2c 20 4d 65 6d 20 2a 29 3b 0d 0a sor *, Mem *);..
96330 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
96340 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f nt sqlite3VdbeSo
96350 72 74 65 72 43 6f 6d 70 61 72 65 28 56 64 62 65 rterCompare(Vdbe
96360 43 75 72 73 6f 72 20 2a 2c 20 4d 65 6d 20 2a 2c Cursor *, Mem *,
96370 20 69 6e 74 20 2a 29 3b 0d 0a 23 65 6e 64 69 66 int *);..#endif
96380 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 ....#if !defined
96390 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 (SQLITE_OMIT_SHA
963a0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 RED_CACHE) && SQ
963b0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e LITE_THREADSAFE>
963c0 30 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 0..SQLITE_PRIVAT
963d0 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 E void sqlite3
963e0 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 2a 29 VdbeEnter(Vdbe*)
963f0 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 ;..SQLITE_PRIVAT
96400 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 E void sqlite3
96410 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 2a 29 VdbeLeave(Vdbe*)
96420 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 ;..#else..# defi
96430 6e 65 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e ne sqlite3VdbeEn
96440 74 65 72 28 58 29 0d 0a 23 20 64 65 66 69 6e 65 ter(X)..# define
96450 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 sqlite3VdbeLeav
96460 65 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a e(X)..#endif....
96470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
96480 42 55 47 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 BUG..SQLITE_PRIV
96490 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
964a0 56 64 62 65 4d 65 6d 41 62 6f 75 74 54 6f 43 68 VdbeMemAboutToCh
964b0 61 6e 67 65 28 56 64 62 65 2a 2c 4d 65 6d 2a 29 ange(Vdbe*,Mem*)
964c0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 ;..#endif....#if
964d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
964e0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0d 0a 53 51 _FOREIGN_KEY..SQ
964f0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
96500 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 sqlite3VdbeChec
96510 6b 46 6b 28 56 64 62 65 20 2a 2c 20 69 6e 74 29 kFk(Vdbe *, int)
96520 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 ;..#else..# defi
96530 6e 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 ne sqlite3VdbeCh
96540 65 63 6b 46 6b 28 70 2c 69 29 20 30 0d 0a 23 65 eckFk(p,i) 0..#e
96550 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 ndif....SQLITE_P
96560 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
96570 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 e3VdbeMemTransla
96580 74 65 28 4d 65 6d 2a 2c 20 75 38 29 3b 0d 0a 23 te(Mem*, u8);..#
96590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
965a0 55 47 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 UG..SQLITE_PRIVA
965b0 54 45 20 20 20 76 6f 69 64 20 73 71 6c 69 74 65 TE void sqlite
965c0 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 3VdbePrintSql(Vd
965d0 62 65 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 be*);..SQLITE_PR
965e0 49 56 41 54 45 20 20 20 76 6f 69 64 20 73 71 6c IVATE void sql
965f0 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 ite3VdbeMemPrett
96600 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d yPrint(Mem *pMem
96610 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0d 0a , char *zBuf);..
96620 23 65 6e 64 69 66 0d 0a 53 51 4c 49 54 45 5f 50 #endif..SQLITE_P
96630 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
96640 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42 e3VdbeMemHandleB
96650 6f 6d 28 4d 65 6d 20 2a 70 4d 65 6d 29 3b 0d 0a om(Mem *pMem);..
96660 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
96670 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0d 0a _OMIT_INCRBLOB..
96680 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 20 SQLITE_PRIVATE
96690 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 int sqlite3Vdbe
966a0 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 4d 65 MemExpandBlob(Me
966b0 6d 20 2a 29 3b 0d 0a 20 20 23 64 65 66 69 6e 65 m *);.. #define
966c0 20 45 78 70 61 6e 64 42 6c 6f 62 28 50 29 20 28 ExpandBlob(P) (
966d0 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f ((P)->flags&MEM_
966e0 5a 65 72 6f 29 3f 73 71 6c 69 74 65 33 56 64 62 Zero)?sqlite3Vdb
966f0 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 50 eMemExpandBlob(P
96700 29 3a 30 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 23 ):0)..#else.. #
96710 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 56 64 define sqlite3Vd
96720 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 beMemExpandBlob(
96730 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 20 20 x) SQLITE_OK..
96740 23 64 65 66 69 6e 65 20 45 78 70 61 6e 64 42 6c #define ExpandBl
96750 6f 62 28 50 29 20 53 51 4c 49 54 45 5f 4f 4b 0d ob(P) SQLITE_OK.
96760 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 65 6e 64 69 .#endif....#endi
96770 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 5f 56 f /* !defined(_V
96780 44 42 45 49 4e 54 5f 48 5f 29 20 2a 2f 0d 0a 0d DBEINT_H_) */...
96790 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
967a0 20 45 6e 64 20 6f 66 20 76 64 62 65 49 6e 74 2e End of vdbeInt.
967b0 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
967c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
967d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
967e0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
967f0 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 65 * Continuing whe
96800 72 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 69 re we left off i
96810 6e 20 73 74 61 74 75 73 2e 63 20 2a 2a 2a 2a 2a n status.c *****
96820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
96830 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 56 61 72 69 /..../*..** Vari
96840 61 62 6c 65 73 20 69 6e 20 77 68 69 63 68 20 74 ables in which t
96850 6f 20 72 65 63 6f 72 64 20 73 74 61 74 75 73 20 o record status
96860 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2f information...*/
96870 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
96880 20 73 71 6c 69 74 65 33 53 74 61 74 54 79 70 65 sqlite3StatType
96890 20 73 71 6c 69 74 65 33 53 74 61 74 54 79 70 65 sqlite3StatType
968a0 3b 0d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 ;..static SQLITE
968b0 5f 57 53 44 20 73 74 72 75 63 74 20 73 71 6c 69 _WSD struct sqli
968c0 74 65 33 53 74 61 74 54 79 70 65 20 7b 0d 0a 20 te3StatType {..
968d0 20 69 6e 74 20 6e 6f 77 56 61 6c 75 65 5b 31 30 int nowValue[10
968e0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 ]; /* Cu
968f0 72 72 65 6e 74 20 76 61 6c 75 65 20 2a 2f 0d 0a rrent value */..
96900 20 20 69 6e 74 20 6d 78 56 61 6c 75 65 5b 31 30 int mxValue[10
96910 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d ]; /* M
96920 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 2a 2f 0d aximum value */.
96930 0a 7d 20 73 71 6c 69 74 65 33 53 74 61 74 20 3d .} sqlite3Stat =
96940 20 7b 20 7b 30 2c 7d 2c 20 7b 30 2c 7d 20 7d 3b { {0,}, {0,} };
96950 0d 0a 0d 0a 0d 0a 2f 2a 20 54 68 65 20 22 77 73 ....../* The "ws
96960 64 53 74 61 74 22 20 6d 61 63 72 6f 20 77 69 6c dStat" macro wil
96970 6c 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 l resolve to the
96980 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 status informat
96990 69 6f 6e 0d 0a 2a 2a 20 73 74 61 74 65 20 76 65 ion..** state ve
969a0 63 74 6f 72 2e 20 20 49 66 20 77 72 69 74 61 62 ctor. If writab
969b0 6c 65 20 73 74 61 74 69 63 20 64 61 74 61 20 69 le static data i
969c0 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6f 6e s unsupported on
969d0 20 74 68 65 20 74 61 72 67 65 74 2c 0d 0a 2a 2a the target,..**
969e0 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 63 61 we have to loca
969f0 74 65 20 74 68 65 20 73 74 61 74 65 20 76 65 63 te the state vec
96a00 74 6f 72 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e tor at run-time.
96a10 20 20 49 6e 20 74 68 65 20 6d 6f 72 65 20 63 6f In the more co
96a20 6d 6d 6f 6e 0d 0a 2a 2a 20 63 61 73 65 20 77 68 mmon..** case wh
96a30 65 72 65 20 77 72 69 74 61 62 6c 65 20 73 74 61 ere writable sta
96a40 74 69 63 20 64 61 74 61 20 69 73 20 73 75 70 70 tic data is supp
96a50 6f 72 74 65 64 2c 20 77 73 64 53 74 61 74 20 63 orted, wsdStat c
96a60 61 6e 20 72 65 66 65 72 20 64 69 72 65 63 74 6c an refer directl
96a70 79 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 22 73 71 y..** to the "sq
96a80 6c 69 74 65 33 53 74 61 74 22 20 73 74 61 74 65 lite3Stat" state
96a90 20 76 65 63 74 6f 72 20 64 65 63 6c 61 72 65 64 vector declared
96aa0 20 61 62 6f 76 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 above...*/..#if
96ab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
96ac0 57 53 44 0d 0a 23 20 64 65 66 69 6e 65 20 77 73 WSD..# define ws
96ad0 64 53 74 61 74 49 6e 69 74 20 20 73 71 6c 69 74 dStatInit sqlit
96ae0 65 33 53 74 61 74 54 79 70 65 20 2a 78 20 3d 20 e3StatType *x =
96af0 26 47 4c 4f 42 41 4c 28 73 71 6c 69 74 65 33 53 &GLOBAL(sqlite3S
96b00 74 61 74 54 79 70 65 2c 73 71 6c 69 74 65 33 53 tatType,sqlite3S
96b10 74 61 74 29 0d 0a 23 20 64 65 66 69 6e 65 20 77 tat)..# define w
96b20 73 64 53 74 61 74 20 78 5b 30 5d 0d 0a 23 65 6c sdStat x[0]..#el
96b30 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 77 73 64 se..# define wsd
96b40 53 74 61 74 49 6e 69 74 0d 0a 23 20 64 65 66 69 StatInit..# defi
96b50 6e 65 20 77 73 64 53 74 61 74 20 73 71 6c 69 74 ne wsdStat sqlit
96b60 65 33 53 74 61 74 0d 0a 23 65 6e 64 69 66 0d 0a e3Stat..#endif..
96b70 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ../*..** Return
96b80 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 the current valu
96b90 65 20 6f 66 20 61 20 73 74 61 74 75 73 20 70 61 e of a status pa
96ba0 72 61 6d 65 74 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 rameter...*/..SQ
96bb0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
96bc0 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 56 61 sqlite3StatusVa
96bd0 6c 75 65 28 69 6e 74 20 6f 70 29 7b 0d 0a 20 20 lue(int op){..
96be0 77 73 64 53 74 61 74 49 6e 69 74 3b 0d 0a 20 20 wsdStatInit;..
96bf0 61 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 assert( op>=0 &&
96c00 20 6f 70 3c 41 72 72 61 79 53 69 7a 65 28 77 73 op<ArraySize(ws
96c10 64 53 74 61 74 2e 6e 6f 77 56 61 6c 75 65 29 20 dStat.nowValue)
96c20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 77 73 64 );.. return wsd
96c30 53 74 61 74 2e 6e 6f 77 56 61 6c 75 65 5b 6f 70 Stat.nowValue[op
96c40 5d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ];..}..../*..**
96c50 41 64 64 20 4e 20 74 6f 20 74 68 65 20 76 61 6c Add N to the val
96c60 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20 72 ue of a status r
96c70 65 63 6f 72 64 2e 20 20 49 74 20 69 73 20 61 73 ecord. It is as
96c80 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0d 0a sumed that the..
96c90 2a 2a 20 63 61 6c 6c 65 72 20 68 6f 6c 64 73 20 ** caller holds
96ca0 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b appropriate lock
96cb0 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 s...*/..SQLITE_P
96cc0 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
96cd0 74 65 33 53 74 61 74 75 73 41 64 64 28 69 6e 74 te3StatusAdd(int
96ce0 20 6f 70 2c 20 69 6e 74 20 4e 29 7b 0d 0a 20 20 op, int N){..
96cf0 77 73 64 53 74 61 74 49 6e 69 74 3b 0d 0a 20 20 wsdStatInit;..
96d00 61 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 assert( op>=0 &&
96d10 20 6f 70 3c 41 72 72 61 79 53 69 7a 65 28 77 73 op<ArraySize(ws
96d20 64 53 74 61 74 2e 6e 6f 77 56 61 6c 75 65 29 20 dStat.nowValue)
96d30 29 3b 0d 0a 20 20 77 73 64 53 74 61 74 2e 6e 6f );.. wsdStat.no
96d40 77 56 61 6c 75 65 5b 6f 70 5d 20 2b 3d 20 4e 3b wValue[op] += N;
96d50 0d 0a 20 20 69 66 28 20 77 73 64 53 74 61 74 2e .. if( wsdStat.
96d60 6e 6f 77 56 61 6c 75 65 5b 6f 70 5d 3e 77 73 64 nowValue[op]>wsd
96d70 53 74 61 74 2e 6d 78 56 61 6c 75 65 5b 6f 70 5d Stat.mxValue[op]
96d80 20 29 7b 0d 0a 20 20 20 20 77 73 64 53 74 61 74 ){.. wsdStat
96d90 2e 6d 78 56 61 6c 75 65 5b 6f 70 5d 20 3d 20 77 .mxValue[op] = w
96da0 73 64 53 74 61 74 2e 6e 6f 77 56 61 6c 75 65 5b sdStat.nowValue[
96db0 6f 70 5d 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a op];.. }..}....
96dc0 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 /*..** Set the v
96dd0 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 alue of a status
96de0 20 74 6f 20 58 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 to X...*/..SQLI
96df0 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
96e00 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 74 sqlite3StatusSet
96e10 28 69 6e 74 20 6f 70 2c 20 69 6e 74 20 58 29 7b (int op, int X){
96e20 0d 0a 20 20 77 73 64 53 74 61 74 49 6e 69 74 3b .. wsdStatInit;
96e30 0d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d .. assert( op>=
96e40 30 20 26 26 20 6f 70 3c 41 72 72 61 79 53 69 7a 0 && op<ArraySiz
96e50 65 28 77 73 64 53 74 61 74 2e 6e 6f 77 56 61 6c e(wsdStat.nowVal
96e60 75 65 29 20 29 3b 0d 0a 20 20 77 73 64 53 74 61 ue) );.. wsdSta
96e70 74 2e 6e 6f 77 56 61 6c 75 65 5b 6f 70 5d 20 3d t.nowValue[op] =
96e80 20 58 3b 0d 0a 20 20 69 66 28 20 77 73 64 53 74 X;.. if( wsdSt
96e90 61 74 2e 6e 6f 77 56 61 6c 75 65 5b 6f 70 5d 3e at.nowValue[op]>
96ea0 77 73 64 53 74 61 74 2e 6d 78 56 61 6c 75 65 5b wsdStat.mxValue[
96eb0 6f 70 5d 20 29 7b 0d 0a 20 20 20 20 77 73 64 53 op] ){.. wsdS
96ec0 74 61 74 2e 6d 78 56 61 6c 75 65 5b 6f 70 5d 20 tat.mxValue[op]
96ed0 3d 20 77 73 64 53 74 61 74 2e 6e 6f 77 56 61 6c = wsdStat.nowVal
96ee0 75 65 5b 6f 70 5d 3b 0d 0a 20 20 7d 0d 0a 7d 0d ue[op];.. }..}.
96ef0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 51 75 65 72 79 20 .../*..** Query
96f00 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 status informati
96f10 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 on...**..** This
96f20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
96f30 61 73 73 75 6d 65 73 20 74 68 61 74 20 72 65 61 assumes that rea
96f40 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 ding or writing
96f50 61 6e 20 61 6c 69 67 6e 65 64 0d 0a 2a 2a 20 33 an aligned..** 3
96f60 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 2-bit integer is
96f70 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 an atomic opera
96f80 74 69 6f 6e 2e 20 20 49 66 20 74 68 61 74 20 61 tion. If that a
96f90 73 73 75 6d 70 74 69 6f 6e 20 69 73 20 6e 6f 74 ssumption is not
96fa0 20 74 72 75 65 2c 0d 0a 2a 2a 20 74 68 65 6e 20 true,..** then
96fb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
96fc0 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 0d not threadsafe..
96fd0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
96fe0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 61 74 int sqlite3_stat
96ff0 75 73 28 69 6e 74 20 6f 70 2c 20 69 6e 74 20 2a us(int op, int *
97000 70 43 75 72 72 65 6e 74 2c 20 69 6e 74 20 2a 70 pCurrent, int *p
97010 48 69 67 68 77 61 74 65 72 2c 20 69 6e 74 20 72 Highwater, int r
97020 65 73 65 74 46 6c 61 67 29 7b 0d 0a 20 20 77 73 esetFlag){.. ws
97030 64 53 74 61 74 49 6e 69 74 3b 0d 0a 20 20 69 66 dStatInit;.. if
97040 28 20 6f 70 3c 30 20 7c 7c 20 6f 70 3e 3d 41 72 ( op<0 || op>=Ar
97050 72 61 79 53 69 7a 65 28 77 73 64 53 74 61 74 2e raySize(wsdStat.
97060 6e 6f 77 56 61 6c 75 65 29 20 29 7b 0d 0a 20 20 nowValue) ){..
97070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
97080 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0d 0a 20 20 MISUSE_BKPT;..
97090 7d 0d 0a 20 20 2a 70 43 75 72 72 65 6e 74 20 3d }.. *pCurrent =
970a0 20 77 73 64 53 74 61 74 2e 6e 6f 77 56 61 6c 75 wsdStat.nowValu
970b0 65 5b 6f 70 5d 3b 0d 0a 20 20 2a 70 48 69 67 68 e[op];.. *pHigh
970c0 77 61 74 65 72 20 3d 20 77 73 64 53 74 61 74 2e water = wsdStat.
970d0 6d 78 56 61 6c 75 65 5b 6f 70 5d 3b 0d 0a 20 20 mxValue[op];..
970e0 69 66 28 20 72 65 73 65 74 46 6c 61 67 20 29 7b if( resetFlag ){
970f0 0d 0a 20 20 20 20 77 73 64 53 74 61 74 2e 6d 78 .. wsdStat.mx
97100 56 61 6c 75 65 5b 6f 70 5d 20 3d 20 77 73 64 53 Value[op] = wsdS
97110 74 61 74 2e 6e 6f 77 56 61 6c 75 65 5b 6f 70 5d tat.nowValue[op]
97120 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
97130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a SQLITE_OK;..}..
97140 0d 0a 2f 2a 0d 0a 2a 2a 20 51 75 65 72 79 20 73 ../*..** Query s
97150 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f tatus informatio
97160 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 n for a single d
97170 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
97180 6f 6e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 on..*/..SQLITE_A
97190 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 PI int sqlite3_d
971a0 62 5f 73 74 61 74 75 73 28 0d 0a 20 20 73 71 6c b_status(.. sql
971b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 ite3 *db,
971c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 /* The databa
971d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68 se connection wh
971e0 6f 73 65 20 73 74 61 74 75 73 20 69 73 20 64 65 ose status is de
971f0 73 69 72 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 sired */.. int
97200 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 op,
97210 20 20 2f 2a 20 53 74 61 74 75 73 20 76 65 72 62 /* Status verb
97220 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 43 75 72 */.. int *pCur
97230 72 65 6e 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 rent, /*
97240 57 72 69 74 65 20 63 75 72 72 65 6e 74 20 76 61 Write current va
97250 6c 75 65 20 68 65 72 65 20 2a 2f 0d 0a 20 20 69 lue here */.. i
97260 6e 74 20 2a 70 48 69 67 68 77 61 74 65 72 2c 20 nt *pHighwater,
97270 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 68 69 /* Write hi
97280 67 68 2d 77 61 74 65 72 20 6d 61 72 6b 20 68 65 gh-water mark he
97290 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 65 73 re */.. int res
972a0 65 74 46 6c 61 67 20 20 20 20 20 20 20 20 20 2f etFlag /
972b0 2a 20 52 65 73 65 74 20 68 69 67 68 2d 77 61 74 * Reset high-wat
972c0 65 72 20 6d 61 72 6b 20 69 66 20 74 72 75 65 20 er mark if true
972d0 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 */..){.. int rc
972e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 = SQLITE_OK;
972f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a /* Return code *
97300 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 /.. sqlite3_mut
97310 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 ex_enter(db->mut
97320 65 78 29 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 ex);.. switch(
97330 6f 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 op ){.. case
97340 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f SQLITE_DBSTATUS_
97350 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 3a 20 LOOKASIDE_USED:
97360 7b 0d 0a 20 20 20 20 20 20 2a 70 43 75 72 72 65 {.. *pCurre
97370 6e 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 nt = db->lookasi
97380 64 65 2e 6e 4f 75 74 3b 0d 0a 20 20 20 20 20 20 de.nOut;..
97390 2a 70 48 69 67 68 77 61 74 65 72 20 3d 20 64 62 *pHighwater = db
973a0 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6d 78 4f 75 ->lookaside.mxOu
973b0 74 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 65 t;.. if( re
973c0 73 65 74 46 6c 61 67 20 29 7b 0d 0a 20 20 20 20 setFlag ){..
973d0 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 db->lookasid
973e0 65 2e 6d 78 4f 75 74 20 3d 20 64 62 2d 3e 6c 6f e.mxOut = db->lo
973f0 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3b 0d 0a 20 okaside.nOut;..
97400 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 }.. br
97410 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 eak;.. }....
97420 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 case SQLITE_D
97430 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 BSTATUS_LOOKASID
97440 45 5f 48 49 54 3a 0d 0a 20 20 20 20 63 61 73 65 E_HIT:.. case
97450 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 SQLITE_DBSTATUS
97460 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f _LOOKASIDE_MISS_
97470 53 49 5a 45 3a 0d 0a 20 20 20 20 63 61 73 65 20 SIZE:.. case
97480 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f SQLITE_DBSTATUS_
97490 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 LOOKASIDE_MISS_F
974a0 55 4c 4c 3a 20 7b 0d 0a 20 20 20 20 20 20 74 65 ULL: {.. te
974b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 53 51 4c 49 stcase( op==SQLI
974c0 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b TE_DBSTATUS_LOOK
974d0 41 53 49 44 45 5f 48 49 54 20 29 3b 0d 0a 20 20 ASIDE_HIT );..
974e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 testcase( op
974f0 3d 3d 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 ==SQLITE_DBSTATU
97500 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 S_LOOKASIDE_MISS
97510 5f 53 49 5a 45 20 29 3b 0d 0a 20 20 20 20 20 20 _SIZE );..
97520 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 53 51 testcase( op==SQ
97530 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f LITE_DBSTATUS_LO
97540 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c OKASIDE_MISS_FUL
97550 4c 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 L );.. asse
97560 72 74 28 20 28 6f 70 2d 53 51 4c 49 54 45 5f 44 rt( (op-SQLITE_D
97570 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 BSTATUS_LOOKASID
97580 45 5f 48 49 54 29 3e 3d 30 20 29 3b 0d 0a 20 20 E_HIT)>=0 );..
97590 20 20 20 20 61 73 73 65 72 74 28 20 28 6f 70 2d assert( (op-
975a0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f SQLITE_DBSTATUS_
975b0 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 29 3c 33 LOOKASIDE_HIT)<3
975c0 20 29 3b 0d 0a 20 20 20 20 20 20 2a 70 43 75 72 );.. *pCur
975d0 72 65 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 rent = 0;..
975e0 20 2a 70 48 69 67 68 77 61 74 65 72 20 3d 20 64 *pHighwater = d
975f0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 61 6e 53 b->lookaside.anS
97600 74 61 74 5b 6f 70 20 2d 20 53 51 4c 49 54 45 5f tat[op - SQLITE_
97610 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 DBSTATUS_LOOKASI
97620 44 45 5f 48 49 54 5d 3b 0d 0a 20 20 20 20 20 20 DE_HIT];..
97630 69 66 28 20 72 65 73 65 74 46 6c 61 67 20 29 7b if( resetFlag ){
97640 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f .. db->lo
97650 6f 6b 61 73 69 64 65 2e 61 6e 53 74 61 74 5b 6f okaside.anStat[o
97660 70 20 2d 20 53 51 4c 49 54 45 5f 44 42 53 54 41 p - SQLITE_DBSTA
97670 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 TUS_LOOKASIDE_HI
97680 54 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d T] = 0;.. }
97690 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a .. break;..
976a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
976b0 0d 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 .. ** Return
976c0 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e an approximation
976d0 20 66 6f 72 20 74 68 65 20 61 6d 6f 75 6e 74 20 for the amount
976e0 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e of memory curren
976f0 74 6c 79 20 75 73 65 64 0d 0a 20 20 20 20 2a 2a tly used.. **
97700 20 62 79 20 61 6c 6c 20 70 61 67 65 72 73 20 61 by all pagers a
97710 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
97720 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 he given databas
97730 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 e connection. T
97740 68 65 0d 0a 20 20 20 20 2a 2a 20 68 69 67 68 77 he.. ** highw
97750 61 74 65 72 20 6d 61 72 6b 20 69 73 20 6d 65 61 ater mark is mea
97760 6e 69 6e 67 6c 65 73 73 20 61 6e 64 20 69 73 20 ningless and is
97770 72 65 74 75 72 6e 65 64 20 61 73 20 7a 65 72 6f returned as zero
97780 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 63 ... */.. c
97790 61 73 65 20 53 51 4c 49 54 45 5f 44 42 53 54 41 ase SQLITE_DBSTA
977a0 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 3a 20 TUS_CACHE_USED:
977b0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 74 {.. int tot
977c0 61 6c 55 73 65 64 20 3d 20 30 3b 0d 0a 20 20 20 alUsed = 0;..
977d0 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 20 int i;..
977e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
977f0 65 72 41 6c 6c 28 64 62 29 3b 0d 0a 20 20 20 20 erAll(db);..
97800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
97810 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 >nDb; i++){..
97820 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 Btree *pBt
97830 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 = db->aDb[i].pBt
97840 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 ;.. if( p
97850 42 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 Bt ){..
97860 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d Pager *pPager =
97870 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 sqlite3BtreePag
97880 65 72 28 70 42 74 29 3b 0d 0a 20 20 20 20 20 20 er(pBt);..
97890 20 20 20 20 74 6f 74 61 6c 55 73 65 64 20 2b 3d totalUsed +=
978a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d sqlite3PagerMem
978b0 55 73 65 64 28 70 50 61 67 65 72 29 3b 0d 0a 20 Used(pPager);..
978c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
978d0 7d 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }.. sqlite3
978e0 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 BtreeLeaveAll(db
978f0 29 3b 0d 0a 20 20 20 20 20 20 2a 70 43 75 72 72 );.. *pCurr
97900 65 6e 74 20 3d 20 74 6f 74 61 6c 55 73 65 64 3b ent = totalUsed;
97910 0d 0a 20 20 20 20 20 20 2a 70 48 69 67 68 77 61 .. *pHighwa
97920 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 ter = 0;..
97930 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d break;.. }...
97940 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 2a 2a 20 . /*.. **
97950 2a 70 43 75 72 72 65 6e 74 20 67 65 74 73 20 61 *pCurrent gets a
97960 6e 20 61 63 63 75 72 61 74 65 20 65 73 74 69 6d n accurate estim
97970 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e ate of the amoun
97980 74 20 6f 66 20 6d 65 6d 6f 72 79 20 75 73 65 64 t of memory used
97990 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 .. ** to stor
979a0 65 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 e the schema for
979b0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 28 all databases (
979c0 6d 61 69 6e 2c 20 74 65 6d 70 2c 20 61 6e 64 20 main, temp, and
979d0 61 6e 79 20 41 54 54 41 43 48 65 64 0d 0a 20 20 any ATTACHed..
979e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 73 2e 20 ** databases.
979f0 20 2a 70 48 69 67 68 77 61 74 65 72 20 69 73 20 *pHighwater is
97a00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0d 0a 20 20 set to zero...
97a10 20 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65 20 53 */.. case S
97a20 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 QLITE_DBSTATUS_S
97a30 43 48 45 4d 41 5f 55 53 45 44 3a 20 7b 0d 0a 20 CHEMA_USED: {..
97a40 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 int i;
97a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
97a60 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 /* Used to iter
97a70 61 74 65 20 74 68 72 6f 75 67 68 20 73 63 68 65 ate through sche
97a80 6d 61 73 20 2a 2f 0d 0a 20 20 20 20 20 20 69 6e mas */.. in
97a90 74 20 6e 42 79 74 65 20 3d 20 30 3b 20 20 20 20 t nByte = 0;
97aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 /* Use
97ab0 64 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 d to accumulate
97ac0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0d return value */.
97ad0 0a 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ... sqlite3
97ae0 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 BtreeEnterAll(db
97af0 29 3b 0d 0a 20 20 20 20 20 20 64 62 2d 3e 70 6e );.. db->pn
97b00 42 79 74 65 73 46 72 65 65 64 20 3d 20 26 6e 42 BytesFreed = &nB
97b10 79 74 65 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 yte;.. for(
97b20 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
97b30 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 53 i++){.. S
97b40 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d chema *pSchema =
97b50 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 db->aDb[i].pSch
97b60 65 6d 61 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 ema;.. if
97b70 28 20 41 4c 57 41 59 53 28 70 53 63 68 65 6d 61 ( ALWAYS(pSchema
97b80 21 3d 30 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 !=0) ){..
97b90 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0d HashElem *p;.
97ba0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 ... nBy
97bb0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 47 6c 6f te += sqlite3Glo
97bc0 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75 balConfig.m.xRou
97bd0 6e 64 75 70 28 73 69 7a 65 6f 66 28 48 61 73 68 ndup(sizeof(Hash
97be0 45 6c 65 6d 29 29 20 2a 20 28 0d 0a 20 20 20 20 Elem)) * (..
97bf0 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d pSchem
97c00 61 2d 3e 74 62 6c 48 61 73 68 2e 63 6f 75 6e 74 a->tblHash.count
97c10 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2b .. +
97c20 20 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 pSchema->trigHa
97c30 73 68 2e 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20 sh.count..
97c40 20 20 20 20 20 20 2b 20 70 53 63 68 65 6d 61 2d + pSchema-
97c50 3e 69 64 78 48 61 73 68 2e 63 6f 75 6e 74 0d 0a >idxHash.count..
97c60 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 53 + pS
97c70 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2e chema->fkeyHash.
97c80 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 count..
97c90 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e );.. n
97ca0 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 4d Byte += sqlite3M
97cb0 61 6c 6c 6f 63 53 69 7a 65 28 70 53 63 68 65 6d allocSize(pSchem
97cc0 61 2d 3e 74 62 6c 48 61 73 68 2e 68 74 29 3b 0d a->tblHash.ht);.
97cd0 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 . nByte
97ce0 20 2b 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f += sqlite3Mallo
97cf0 63 53 69 7a 65 28 70 53 63 68 65 6d 61 2d 3e 74 cSize(pSchema->t
97d00 72 69 67 48 61 73 68 2e 68 74 29 3b 0d 0a 20 20 rigHash.ht);..
97d10 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d nByte +=
97d20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 sqlite3MallocSi
97d30 7a 65 28 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 ze(pSchema->idxH
97d40 61 73 68 2e 68 74 29 3b 0d 0a 20 20 20 20 20 20 ash.ht);..
97d50 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c nByte += sql
97d60 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 ite3MallocSize(p
97d70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 Schema->fkeyHash
97d80 2e 68 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 .ht);....
97d90 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 for(p=sqliteH
97da0 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d ashFirst(&pSchem
97db0 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 20 70 3b a->trigHash); p;
97dc0 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 p=sqliteHashNex
97dd0 74 28 70 29 29 7b 0d 0a 20 20 20 20 20 20 20 20 t(p)){..
97de0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 sqlite3Delet
97df0 65 54 72 69 67 67 65 72 28 64 62 2c 20 28 54 72 eTrigger(db, (Tr
97e00 69 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 igger*)sqliteHas
97e10 68 44 61 74 61 28 70 29 29 3b 0d 0a 20 20 20 20 hData(p));..
97e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
97e30 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 for(p=sqliteH
97e40 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d ashFirst(&pSchem
97e50 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 a->tblHash); p;
97e60 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 p=sqliteHashNext
97e70 28 70 29 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 (p)){..
97e80 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 sqlite3Delete
97e90 54 61 62 6c 65 28 64 62 2c 20 28 54 61 62 6c 65 Table(db, (Table
97ea0 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 *)sqliteHashDat
97eb0 61 28 70 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 a(p));..
97ec0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a }.. }..
97ed0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 }.. d
97ee0 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 b->pnBytesFreed
97ef0 3d 20 30 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 = 0;.. sqli
97f00 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c te3BtreeLeaveAll
97f10 28 64 62 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2a (db);.... *
97f20 70 48 69 67 68 77 61 74 65 72 20 3d 20 30 3b 0d pHighwater = 0;.
97f30 0a 20 20 20 20 20 20 2a 70 43 75 72 72 65 6e 74 . *pCurrent
97f40 20 3d 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 20 = nByte;..
97f50 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a break;.. }..
97f60 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 2a 2a .. /*.. **
97f70 20 2a 70 43 75 72 72 65 6e 74 20 67 65 74 73 20 *pCurrent gets
97f80 61 6e 20 61 63 63 75 72 61 74 65 20 65 73 74 69 an accurate esti
97f90 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 mate of the amou
97fa0 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 75 73 65 nt of memory use
97fb0 64 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f d.. ** to sto
97fc0 72 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20 re all prepared
97fd0 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 statements...
97fe0 20 2a 2a 20 2a 70 48 69 67 68 77 61 74 65 72 20 ** *pHighwater
97ff0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0d is set to zero..
98000 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 63 61 73 . */.. cas
98010 65 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 e SQLITE_DBSTATU
98020 53 5f 53 54 4d 54 5f 55 53 45 44 3a 20 7b 0d 0a S_STMT_USED: {..
98030 20 20 20 20 20 20 73 74 72 75 63 74 20 56 64 62 struct Vdb
98040 65 20 2a 70 56 64 62 65 3b 20 20 20 20 20 20 20 e *pVdbe;
98050 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 /* Used to ite
98060 72 61 74 65 20 74 68 72 6f 75 67 68 20 56 4d 73 rate through VMs
98070 20 2a 2f 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e */.. int n
98080 42 79 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 Byte = 0;
98090 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 /* Used t
980a0 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 72 65 74 o accumulate ret
980b0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0d 0a 0d 0a urn value */....
980c0 20 20 20 20 20 20 64 62 2d 3e 70 6e 42 79 74 65 db->pnByte
980d0 73 46 72 65 65 64 20 3d 20 26 6e 42 79 74 65 3b sFreed = &nByte;
980e0 0d 0a 20 20 20 20 20 20 66 6f 72 28 70 56 64 62 .. for(pVdb
980f0 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64 e=db->pVdbe; pVd
98100 62 65 3b 20 70 56 64 62 65 3d 70 56 64 62 65 2d be; pVdbe=pVdbe-
98110 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 >pNext){..
98120 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c sqlite3VdbeDel
98130 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70 56 eteObject(db, pV
98140 64 62 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a dbe);.. }..
98150 20 20 20 20 20 20 64 62 2d 3e 70 6e 42 79 74 65 db->pnByte
98160 73 46 72 65 65 64 20 3d 20 30 3b 0d 0a 0d 0a 20 sFreed = 0;....
98170 20 20 20 20 20 2a 70 48 69 67 68 77 61 74 65 72 *pHighwater
98180 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 2a 70 43 = 0;.. *pC
98190 75 72 72 65 6e 74 20 3d 20 6e 42 79 74 65 3b 0d urrent = nByte;.
981a0 0a 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d ... break;.
981b0 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a . }.... /*
981c0 0d 0a 20 20 20 20 2a 2a 20 53 65 74 20 2a 70 43 .. ** Set *pC
981d0 75 72 72 65 6e 74 20 74 6f 20 74 68 65 20 74 6f urrent to the to
981e0 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 20 6f tal cache hits o
981f0 72 20 6d 69 73 73 65 73 20 65 6e 63 6f 75 6e 74 r misses encount
98200 65 72 65 64 20 62 79 20 61 6c 6c 0d 0a 20 20 20 ered by all..
98210 20 2a 2a 20 70 61 67 65 72 73 20 74 68 65 20 64 ** pagers the d
98220 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 atabase handle i
98230 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 2e 20 s connected to.
98240 2a 70 48 69 67 68 77 61 74 65 72 20 69 73 20 61 *pHighwater is a
98250 6c 77 61 79 73 20 73 65 74 20 0d 0a 20 20 20 20 lways set ..
98260 2a 2a 20 74 6f 20 7a 65 72 6f 2e 0d 0a 20 20 20 ** to zero...
98270 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65 20 53 51 */.. case SQ
98280 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 LITE_DBSTATUS_CA
98290 43 48 45 5f 48 49 54 3a 0d 0a 20 20 20 20 63 61 CHE_HIT:.. ca
982a0 73 65 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 se SQLITE_DBSTAT
982b0 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 3a 20 7b US_CACHE_MISS: {
982c0 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0d 0a .. int i;..
982d0 20 20 20 20 20 20 69 6e 74 20 6e 52 65 74 20 3d int nRet =
982e0 20 30 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 0;.. asser
982f0 74 28 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 t( SQLITE_DBSTAT
98300 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 3d 3d 53 US_CACHE_MISS==S
98310 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 QLITE_DBSTATUS_C
98320 41 43 48 45 5f 48 49 54 2b 31 20 29 3b 0d 0a 0d ACHE_HIT+1 );...
98330 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 . for(i=0;
98340 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
98350 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 .. if( db
98360 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0d ->aDb[i].pBt ){.
98370 0a 20 20 20 20 20 20 20 20 20 20 50 61 67 65 72 . Pager
98380 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 *pPager = sqlit
98390 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d e3BtreePager(db-
983a0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0d 0a 20 >aDb[i].pBt);..
983b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
983c0 50 61 67 65 72 43 61 63 68 65 53 74 61 74 28 70 PagerCacheStat(p
983d0 50 61 67 65 72 2c 20 6f 70 2c 20 72 65 73 65 74 Pager, op, reset
983e0 46 6c 61 67 2c 20 26 6e 52 65 74 29 3b 0d 0a 20 Flag, &nRet);..
983f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
98400 7d 0d 0a 20 20 20 20 20 20 2a 70 48 69 67 68 77 }.. *pHighw
98410 61 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 20 ater = 0;..
98420 20 2a 70 43 75 72 72 65 6e 74 20 3d 20 6e 52 65 *pCurrent = nRe
98430 74 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b t;.. break;
98440 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 64 .. }.... d
98450 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 20 20 20 efault: {..
98460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 rc = SQLITE_ERR
98470 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d OR;.. }.. }.
98480 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
98490 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 _leave(db->mutex
984a0 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b );.. return rc;
984b0 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ..}..../********
984c0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 74 ****** End of st
984d0 61 74 75 73 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a atus.c *********
984e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
984f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
98500 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a *****/../*******
98510 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 ******* Begin fi
98520 6c 65 20 64 61 74 65 2e 63 20 2a 2a 2a 2a 2a 2a le date.c ******
98530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
98540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
98550 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 ******/../*..**
98560 32 30 30 33 20 4f 63 74 6f 62 65 72 20 33 31 0d 2003 October 31.
98570 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 .**..** The auth
98580 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
98590 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
985a0 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
985b0 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c place of..** a l
985c0 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 egal notice, her
985d0 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a e is a blessing:
985e0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 ..**..** May
985f0 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 you do good and
98600 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 not evil...**
98610 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f May you find fo
98620 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f rgiveness for yo
98630 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 urself and forgi
98640 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 ve others...**
98650 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
98660 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
98670 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
98680 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ou give...**..**
98690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
986a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
986b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
986c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
986d0 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 *******..** This
986e0 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 file contains t
986f0 68 65 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 he C functions t
98700 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 64 61 hat implement da
98710 74 65 20 61 6e 64 20 74 69 6d 65 0d 0a 2a 2a 20 te and time..**
98720 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 53 51 functions for SQ
98730 4c 69 74 65 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 Lite. ..**..**
98740 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e There is only on
98750 65 20 65 78 70 6f 72 74 65 64 20 73 79 6d 62 6f e exported symbo
98760 6c 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 2d l in this file -
98770 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a the function..*
98780 2a 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 * sqlite3Registe
98790 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f rDateTimeFunctio
987a0 6e 73 28 29 20 66 6f 75 6e 64 20 61 74 20 74 68 ns() found at th
987b0 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 e bottom of the
987c0 66 69 6c 65 2e 0d 0a 2a 2a 20 41 6c 6c 20 6f 74 file...** All ot
987d0 68 65 72 20 63 6f 64 65 20 68 61 73 20 66 69 6c her code has fil
987e0 65 20 73 63 6f 70 65 2e 0d 0a 2a 2a 0d 0a 2a 2a e scope...**..**
987f0 20 53 51 4c 69 74 65 20 70 72 6f 63 65 73 73 65 SQLite processe
98800 73 20 61 6c 6c 20 74 69 6d 65 73 20 61 6e 64 20 s all times and
98810 64 61 74 65 73 20 61 73 20 4a 75 6c 69 61 6e 20 dates as Julian
98820 44 61 79 20 6e 75 6d 62 65 72 73 2e 20 20 54 68 Day numbers. Th
98830 65 0d 0a 2a 2a 20 64 61 74 65 73 20 61 6e 64 20 e..** dates and
98840 74 69 6d 65 73 20 61 72 65 20 73 74 6f 72 65 64 times are stored
98850 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f as the number o
98860 66 20 64 61 79 73 20 73 69 6e 63 65 20 6e 6f 6f f days since noo
98870 6e 0d 0a 2a 2a 20 69 6e 20 47 72 65 65 6e 77 69 n..** in Greenwi
98880 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 ch on November 2
98890 34 2c 20 34 37 31 34 20 42 2e 43 2e 20 61 63 63 4, 4714 B.C. acc
988a0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 47 72 ording to the Gr
988b0 65 67 6f 72 69 61 6e 0d 0a 2a 2a 20 63 61 6c 65 egorian..** cale
988c0 6e 64 61 72 20 73 79 73 74 65 6d 2e 20 0d 0a 2a ndar system. ..*
988d0 2a 0d 0a 2a 2a 20 31 39 37 30 2d 30 31 2d 30 31 *..** 1970-01-01
988e0 20 30 30 3a 30 30 3a 30 30 20 69 73 20 4a 44 20 00:00:00 is JD
988f0 32 34 34 30 35 38 37 2e 35 0d 0a 2a 2a 20 32 30 2440587.5..** 20
98900 30 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 00-01-01 00:00:0
98910 30 20 69 73 20 4a 44 20 32 34 35 31 35 34 34 2e 0 is JD 2451544.
98920 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 5..**..** This i
98930 6d 70 6c 65 6d 65 6e 74 69 6f 6e 20 72 65 71 75 mplemention requ
98940 69 72 65 73 20 79 65 61 72 73 20 74 6f 20 62 65 ires years to be
98950 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20 expressed as a
98960 34 2d 64 69 67 69 74 20 6e 75 6d 62 65 72 0d 0a 4-digit number..
98970 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 ** which means t
98980 68 61 74 20 6f 6e 6c 79 20 64 61 74 65 73 20 62 hat only dates b
98990 65 74 77 65 65 6e 20 30 30 30 30 2d 30 31 2d 30 etween 0000-01-0
989a0 31 20 61 6e 64 20 39 39 39 39 2d 31 32 2d 33 31 1 and 9999-12-31
989b0 20 63 61 6e 0d 0a 2a 2a 20 62 65 20 72 65 70 72 can..** be repr
989c0 65 73 65 6e 74 65 64 2c 20 65 76 65 6e 20 74 68 esented, even th
989d0 6f 75 67 68 20 6a 75 6c 69 61 6e 20 64 61 79 20 ough julian day
989e0 6e 75 6d 62 65 72 73 20 61 6c 6c 6f 77 20 61 20 numbers allow a
989f0 6d 75 63 68 20 77 69 64 65 72 0d 0a 2a 2a 20 72 much wider..** r
98a00 61 6e 67 65 20 6f 66 20 64 61 74 65 73 2e 0d 0a ange of dates...
98a10 2a 2a 0d 0a 2a 2a 20 54 68 65 20 47 72 65 67 6f **..** The Grego
98a20 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 20 73 79 rian calendar sy
98a30 73 74 65 6d 20 69 73 20 75 73 65 64 20 66 6f 72 stem is used for
98a40 20 61 6c 6c 20 64 61 74 65 73 20 61 6e 64 20 74 all dates and t
98a50 69 6d 65 73 2c 0d 0a 2a 2a 20 65 76 65 6e 20 74 imes,..** even t
98a60 68 6f 73 65 20 74 68 61 74 20 70 72 65 64 61 74 hose that predat
98a70 65 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 e the Gregorian
98a80 63 61 6c 65 6e 64 61 72 2e 20 20 48 69 73 74 6f calendar. Histo
98a90 72 69 61 6e 73 20 75 73 75 61 6c 6c 79 0d 0a 2a rians usually..*
98aa0 2a 20 75 73 65 20 74 68 65 20 4a 75 6c 69 61 6e * use the Julian
98ab0 20 63 61 6c 65 6e 64 61 72 20 66 6f 72 20 64 61 calendar for da
98ac0 74 65 73 20 70 72 69 6f 72 20 74 6f 20 31 35 38 tes prior to 158
98ad0 32 2d 31 30 2d 31 35 20 61 6e 64 20 66 6f 72 20 2-10-15 and for
98ae0 73 6f 6d 65 0d 0a 2a 2a 20 64 61 74 65 73 20 61 some..** dates a
98af0 66 74 65 72 77 61 72 64 73 2c 20 64 65 70 65 6e fterwards, depen
98b00 64 69 6e 67 20 6f 6e 20 6c 6f 63 61 6c 65 2e 20 ding on locale.
98b10 20 42 65 77 61 72 65 20 6f 66 20 74 68 69 73 20 Beware of this
98b20 64 69 66 66 65 72 65 6e 63 65 2e 0d 0a 2a 2a 0d difference...**.
98b30 0a 2a 2a 20 54 68 65 20 63 6f 6e 76 65 72 73 69 .** The conversi
98b40 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 on algorithms ar
98b50 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 61 e implemented ba
98b60 73 65 64 20 6f 6e 20 64 65 73 63 72 69 70 74 69 sed on descripti
98b70 6f 6e 73 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 66 ons..** in the f
98b80 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 3a 0d 0a ollowing text:..
98b90 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 4a 65 61 6e **..** Jean
98ba0 20 4d 65 65 75 73 0d 0a 2a 2a 20 20 20 20 20 20 Meeus..**
98bb0 41 73 74 72 6f 6e 6f 6d 69 63 61 6c 20 41 6c 67 Astronomical Alg
98bc0 6f 72 69 74 68 6d 73 2c 20 32 6e 64 20 45 64 69 orithms, 2nd Edi
98bd0 74 69 6f 6e 2c 20 31 39 39 38 0d 0a 2a 2a 20 20 tion, 1998..**
98be0 20 20 20 20 49 53 42 4d 20 30 2d 39 34 33 33 39 ISBM 0-94339
98bf0 36 2d 36 31 2d 31 0d 0a 2a 2a 20 20 20 20 20 20 6-61-1..**
98c00 57 69 6c 6c 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49 Willmann-Bell, I
98c10 6e 63 0d 0a 2a 2a 20 20 20 20 20 20 52 69 63 68 nc..** Rich
98c20 6d 6f 6e 64 2c 20 56 69 72 67 69 6e 69 61 20 28 mond, Virginia (
98c30 55 53 41 29 0d 0a 2a 2f 0d 0a 2f 2a 20 23 69 6e USA)..*/../* #in
98c40 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e clude <stdlib.h>
98c50 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 */../* #include
98c60 20 3c 61 73 73 65 72 74 2e 68 3e 20 2a 2f 0d 0a <assert.h> */..
98c70 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 #include <time.h
98c80 3e 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c >....#ifndef SQL
98c90 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d ITE_OMIT_DATETIM
98ca0 45 5f 46 55 4e 43 53 0d 0a 0d 0a 0d 0a 2f 2a 0d E_FUNCS....../*.
98cb0 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 .** A structure
98cc0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 61 20 73 69 for holding a si
98cd0 6e 67 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69 ngle date and ti
98ce0 6d 65 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 me...*/..typedef
98cf0 20 73 74 72 75 63 74 20 44 61 74 65 54 69 6d 65 struct DateTime
98d00 20 44 61 74 65 54 69 6d 65 3b 0d 0a 73 74 72 75 DateTime;..stru
98d10 63 74 20 44 61 74 65 54 69 6d 65 20 7b 0d 0a 20 ct DateTime {..
98d20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
98d30 4a 44 3b 20 2f 2a 20 54 68 65 20 6a 75 6c 69 61 JD; /* The julia
98d40 6e 20 64 61 79 20 6e 75 6d 62 65 72 20 74 69 6d n day number tim
98d50 65 73 20 38 36 34 30 30 30 30 30 20 2a 2f 0d 0a es 86400000 */..
98d60 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 3b 20 20 int Y, M, D;
98d70 20 20 20 20 20 2f 2a 20 59 65 61 72 2c 20 6d 6f /* Year, mo
98d80 6e 74 68 2c 20 61 6e 64 20 64 61 79 20 2a 2f 0d nth, and day */.
98d90 0a 20 20 69 6e 74 20 68 2c 20 6d 3b 20 20 20 20 . int h, m;
98da0 20 20 20 20 20 20 2f 2a 20 48 6f 75 72 20 61 6e /* Hour an
98db0 64 20 6d 69 6e 75 74 65 73 20 2a 2f 0d 0a 20 20 d minutes */..
98dc0 69 6e 74 20 74 7a 3b 20 20 20 20 20 20 20 20 20 int tz;
98dd0 20 20 20 2f 2a 20 54 69 6d 65 7a 6f 6e 65 20 6f /* Timezone o
98de0 66 66 73 65 74 20 69 6e 20 6d 69 6e 75 74 65 73 ffset in minutes
98df0 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 73 3b */.. double s;
98e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 /* Sec
98e10 6f 6e 64 73 20 2a 2f 0d 0a 20 20 63 68 61 72 20 onds */.. char
98e20 76 61 6c 69 64 59 4d 44 3b 20 20 20 20 20 2f 2a validYMD; /*
98e30 20 54 72 75 65 20 28 31 29 20 69 66 20 59 2c 4d True (1) if Y,M
98e40 2c 44 20 61 72 65 20 76 61 6c 69 64 20 2a 2f 0d ,D are valid */.
98e50 0a 20 20 63 68 61 72 20 76 61 6c 69 64 48 4d 53 . char validHMS
98e60 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31 ; /* True (1
98e70 29 20 69 66 20 68 2c 6d 2c 73 20 61 72 65 20 76 ) if h,m,s are v
98e80 61 6c 69 64 20 2a 2f 0d 0a 20 20 63 68 61 72 20 alid */.. char
98e90 76 61 6c 69 64 4a 44 3b 20 20 20 20 20 20 2f 2a validJD; /*
98ea0 20 54 72 75 65 20 28 31 29 20 69 66 20 69 4a 44 True (1) if iJD
98eb0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0d 0a 20 20 is valid */..
98ec0 63 68 61 72 20 76 61 6c 69 64 54 5a 3b 20 20 20 char validTZ;
98ed0 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20 69 /* True (1) i
98ee0 66 20 74 7a 20 69 73 20 76 61 6c 69 64 20 2a 2f f tz is valid */
98ef0 0d 0a 20 20 63 68 61 72 20 64 61 74 65 31 43 3b .. char date1C;
98f00 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ..};....../*..**
98f10 20 43 6f 6e 76 65 72 74 20 7a 44 61 74 65 20 69 Convert zDate i
98f20 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 nto one or more
98f30 69 6e 74 65 67 65 72 73 2e 20 20 41 64 64 69 74 integers. Addit
98f40 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 0d ional arguments.
98f50 0a 2a 2a 20 63 6f 6d 65 20 69 6e 20 67 72 6f 75 .** come in grou
98f60 70 73 20 6f 66 20 35 20 61 73 20 66 6f 6c 6c 6f ps of 5 as follo
98f70 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 ws:..**..**
98f80 20 20 4e 20 20 20 20 20 20 20 6e 75 6d 62 65 72 N number
98f90 20 6f 66 20 64 69 67 69 74 73 20 69 6e 20 74 68 of digits in th
98fa0 65 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 20 20 e integer..**
98fb0 20 20 20 20 6d 69 6e 20 20 20 20 20 6d 69 6e 69 min mini
98fc0 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 mum allowed valu
98fd0 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 e of the integer
98fe0 0d 0a 2a 2a 20 20 20 20 20 20 20 6d 61 78 20 20 ..** max
98ff0 20 20 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 maximum allow
99000 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 ed value of the
99010 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 20 20 20 20 integer..**
99020 20 20 6e 65 78 74 43 20 20 20 66 69 72 73 74 20 nextC first
99030 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20 character after
99040 74 68 65 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 the integer..**
99050 20 20 20 20 20 20 70 56 61 6c 20 20 20 20 77 68 pVal wh
99060 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 ere to write the
99070 20 69 6e 74 65 67 65 72 73 20 76 61 6c 75 65 2e integers value.
99080 0d 0a 2a 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 73 ..**..** Convers
99090 69 6f 6e 73 20 63 6f 6e 74 69 6e 75 65 20 75 6e ions continue un
990a0 74 69 6c 20 6f 6e 65 20 77 69 74 68 20 6e 65 78 til one with nex
990b0 74 43 3d 3d 30 20 69 73 20 65 6e 63 6f 75 6e 74 tC==0 is encount
990c0 65 72 65 64 2e 0d 0a 2a 2a 20 54 68 65 20 66 75 ered...** The fu
990d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 nction returns t
990e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 75 63 he number of suc
990f0 63 65 73 73 66 75 6c 20 63 6f 6e 76 65 72 73 69 cessful conversi
99100 6f 6e 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ons...*/..static
99110 20 69 6e 74 20 67 65 74 44 69 67 69 74 73 28 63 int getDigits(c
99120 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 onst char *zDate
99130 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 61 5f 6c 69 , ...){.. va_li
99140 73 74 20 61 70 3b 0d 0a 20 20 69 6e 74 20 76 61 st ap;.. int va
99150 6c 3b 0d 0a 20 20 69 6e 74 20 4e 3b 0d 0a 20 20 l;.. int N;..
99160 69 6e 74 20 6d 69 6e 3b 0d 0a 20 20 69 6e 74 20 int min;.. int
99170 6d 61 78 3b 0d 0a 20 20 69 6e 74 20 6e 65 78 74 max;.. int next
99180 43 3b 0d 0a 20 20 69 6e 74 20 2a 70 56 61 6c 3b C;.. int *pVal;
99190 0d 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b .. int cnt = 0;
991a0 0d 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c .. va_start(ap,
991b0 20 7a 44 61 74 65 29 3b 0d 0a 20 20 64 6f 7b 0d zDate);.. do{.
991c0 0a 20 20 20 20 4e 20 3d 20 76 61 5f 61 72 67 28 . N = va_arg(
991d0 61 70 2c 20 69 6e 74 29 3b 0d 0a 20 20 20 20 6d ap, int);.. m
991e0 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 in = va_arg(ap,
991f0 69 6e 74 29 3b 0d 0a 20 20 20 20 6d 61 78 20 3d int);.. max =
99200 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 va_arg(ap, int)
99210 3b 0d 0a 20 20 20 20 6e 65 78 74 43 20 3d 20 76 ;.. nextC = v
99220 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0d a_arg(ap, int);.
99230 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61 5f 61 . pVal = va_a
99240 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0d 0a 20 rg(ap, int*);..
99250 20 20 20 76 61 6c 20 3d 20 30 3b 0d 0a 20 20 20 val = 0;..
99260 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0d 0a while( N-- ){..
99270 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 if( !sqlit
99280 65 33 49 73 64 69 67 69 74 28 2a 7a 44 61 74 65 e3Isdigit(*zDate
99290 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 67 6f ) ){.. go
992a0 74 6f 20 65 6e 64 5f 67 65 74 44 69 67 69 74 73 to end_getDigits
992b0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
992c0 20 20 76 61 6c 20 3d 20 76 61 6c 2a 31 30 20 2b val = val*10 +
992d0 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0d 0a *zDate - '0';..
992e0 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0d 0a zDate++;..
992f0 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 76 }.. if( v
99300 61 6c 3c 6d 69 6e 20 7c 7c 20 76 61 6c 3e 6d 61 al<min || val>ma
99310 78 20 7c 7c 20 28 6e 65 78 74 43 21 3d 30 20 26 x || (nextC!=0 &
99320 26 20 6e 65 78 74 43 21 3d 2a 7a 44 61 74 65 29 & nextC!=*zDate)
99330 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 ){.. goto
99340 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0d 0a end_getDigits;..
99350 20 20 20 20 7d 0d 0a 20 20 20 20 2a 70 56 61 6c }.. *pVal
99360 20 3d 20 76 61 6c 3b 0d 0a 20 20 20 20 7a 44 61 = val;.. zDa
99370 74 65 2b 2b 3b 0d 0a 20 20 20 20 63 6e 74 2b 2b te++;.. cnt++
99380 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 6e 65 78 ;.. }while( nex
99390 74 43 20 29 3b 0d 0a 65 6e 64 5f 67 65 74 44 69 tC );..end_getDi
993a0 67 69 74 73 3a 0d 0a 20 20 76 61 5f 65 6e 64 28 gits:.. va_end(
993b0 61 70 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 63 ap);.. return c
993c0 6e 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a nt;..}..../*..**
993d0 20 50 61 72 73 65 20 61 20 74 69 6d 65 7a 6f 6e Parse a timezon
993e0 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 74 e extension on t
993f0 68 65 20 65 6e 64 20 6f 66 20 61 20 64 61 74 65 he end of a date
99400 2d 74 69 6d 65 2e 0d 0a 2a 2a 20 54 68 65 20 65 -time...** The e
99410 78 74 65 6e 73 69 6f 6e 20 69 73 20 6f 66 20 74 xtension is of t
99420 68 65 20 66 6f 72 6d 3a 0d 0a 2a 2a 0d 0a 2a 2a he form:..**..**
99430 20 20 20 20 20 20 20 20 28 2b 2f 2d 29 48 48 3a (+/-)HH:
99440 4d 4d 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 72 20 74 68 MM..**..** Or th
99450 65 20 22 7a 75 6c 75 22 20 6e 6f 74 61 74 69 6f e "zulu" notatio
99460 6e 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 n:..**..**
99470 20 20 5a 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 Z..**..** If t
99480 68 65 20 70 61 72 73 65 20 69 73 20 73 75 63 63 he parse is succ
99490 65 73 73 66 75 6c 2c 20 77 72 69 74 65 20 74 68 essful, write th
994a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6e 75 e number of minu
994b0 74 65 73 0d 0a 2a 2a 20 6f 66 20 63 68 61 6e 67 tes..** of chang
994c0 65 20 69 6e 20 70 2d 3e 74 7a 20 61 6e 64 20 72 e in p->tz and r
994d0 65 74 75 72 6e 20 30 2e 20 20 49 66 20 61 20 70 eturn 0. If a p
994e0 61 72 73 65 72 20 65 72 72 6f 72 20 6f 63 63 75 arser error occu
994f0 72 73 2c 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 6e rs,..** return n
99500 6f 6e 2d 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a on-zero...**..**
99510 20 41 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69 A missing speci
99520 66 69 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 fier is not cons
99530 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e idered an error.
99540 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
99550 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63 parseTimezone(c
99560 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 onst char *zDate
99570 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0d , DateTime *p){.
99580 0a 20 20 69 6e 74 20 73 67 6e 20 3d 20 30 3b 0d . int sgn = 0;.
99590 0a 20 20 69 6e 74 20 6e 48 72 2c 20 6e 4d 6e 3b . int nHr, nMn;
995a0 0d 0a 20 20 69 6e 74 20 63 3b 0d 0a 20 20 77 68 .. int c;.. wh
995b0 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 ile( sqlite3Issp
995c0 61 63 65 28 2a 7a 44 61 74 65 29 20 29 7b 20 7a ace(*zDate) ){ z
995d0 44 61 74 65 2b 2b 3b 20 7d 0d 0a 20 20 70 2d 3e Date++; }.. p->
995e0 74 7a 20 3d 20 30 3b 0d 0a 20 20 63 20 3d 20 2a tz = 0;.. c = *
995f0 7a 44 61 74 65 3b 0d 0a 20 20 69 66 28 20 63 3d zDate;.. if( c=
99600 3d 27 2d 27 20 29 7b 0d 0a 20 20 20 20 73 67 6e ='-' ){.. sgn
99610 20 3d 20 2d 31 3b 0d 0a 20 20 7d 65 6c 73 65 20 = -1;.. }else
99620 69 66 28 20 63 3d 3d 27 2b 27 20 29 7b 0d 0a 20 if( c=='+' ){..
99630 20 20 20 73 67 6e 20 3d 20 2b 31 3b 0d 0a 20 20 sgn = +1;..
99640 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5a 27 }else if( c=='Z'
99650 20 7c 7c 20 63 3d 3d 27 7a 27 20 29 7b 0d 0a 20 || c=='z' ){..
99660 20 20 20 7a 44 61 74 65 2b 2b 3b 0d 0a 20 20 20 zDate++;..
99670 20 67 6f 74 6f 20 7a 75 6c 75 5f 74 69 6d 65 3b goto zulu_time;
99680 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
99690 72 65 74 75 72 6e 20 63 21 3d 30 3b 0d 0a 20 20 return c!=0;..
996a0 7d 0d 0a 20 20 7a 44 61 74 65 2b 2b 3b 0d 0a 20 }.. zDate++;..
996b0 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a if( getDigits(z
996c0 44 61 74 65 2c 20 32 2c 20 30 2c 20 31 34 2c 20 Date, 2, 0, 14,
996d0 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c 20 30 2c ':', &nHr, 2, 0,
996e0 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29 21 3d 32 59, 0, &nMn)!=2
996f0 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
99700 31 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 44 61 74 65 1;.. }.. zDate
99710 20 2b 3d 20 35 3b 0d 0a 20 20 70 2d 3e 74 7a 20 += 5;.. p->tz
99720 3d 20 73 67 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 = sgn*(nMn + nHr
99730 2a 36 30 29 3b 0d 0a 7a 75 6c 75 5f 74 69 6d 65 *60);..zulu_time
99740 3a 0d 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 :.. while( sqli
99750 74 65 33 49 73 73 70 61 63 65 28 2a 7a 44 61 74 te3Isspace(*zDat
99760 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d e) ){ zDate++; }
99770 0d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 44 61 74 .. return *zDat
99780 65 21 3d 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a e!=0;..}..../*..
99790 2a 2a 20 50 61 72 73 65 20 74 69 6d 65 73 20 6f ** Parse times o
997a0 66 20 74 68 65 20 66 6f 72 6d 20 48 48 3a 4d 4d f the form HH:MM
997b0 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20 6f 72 20 or HH:MM:SS or
997c0 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46 2e 0d 0a HH:MM:SS.FFFF...
997d0 2a 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c 20 61 ** The HH, MM, a
997e0 6e 64 20 53 53 20 6d 75 73 74 20 65 61 63 68 20 nd SS must each
997f0 62 65 20 65 78 61 63 74 6c 79 20 32 20 64 69 67 be exactly 2 dig
99800 69 74 73 2e 20 20 54 68 65 0d 0a 2a 2a 20 66 72 its. The..** fr
99810 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 actional seconds
99820 20 46 46 46 46 20 63 61 6e 20 62 65 20 6f 6e 65 FFFF can be one
99830 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 2e or more digits.
99840 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ..**..** Return
99850 31 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 1 if there is a
99860 70 61 72 73 69 6e 67 20 65 72 72 6f 72 20 61 6e parsing error an
99870 64 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0d d 0 on success..
99880 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
99890 70 61 72 73 65 48 68 4d 6d 53 73 28 63 6f 6e 73 parseHhMmSs(cons
998a0 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 t char *zDate, D
998b0 61 74 65 54 69 6d 65 20 2a 70 29 7b 0d 0a 20 20 ateTime *p){..
998c0 69 6e 74 20 68 2c 20 6d 2c 20 73 3b 0d 0a 20 20 int h, m, s;..
998d0 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30 2e 30 3b double ms = 0.0;
998e0 0d 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74 .. if( getDigit
998f0 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 32 s(zDate, 2, 0, 2
99900 34 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c 20 30 4, ':', &h, 2, 0
99910 2c 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d 32 20 , 59, 0, &m)!=2
99920 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 ){.. return 1
99930 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 44 61 74 65 20 ;.. }.. zDate
99940 2b 3d 20 35 3b 0d 0a 20 20 69 66 28 20 2a 7a 44 += 5;.. if( *zD
99950 61 74 65 3d 3d 27 3a 27 20 29 7b 0d 0a 20 20 20 ate==':' ){..
99960 20 7a 44 61 74 65 2b 2b 3b 0d 0a 20 20 20 20 69 zDate++;.. i
99970 66 28 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 f( getDigits(zDa
99980 74 65 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c te, 2, 0, 59, 0,
99990 20 26 73 29 21 3d 31 20 29 7b 0d 0a 20 20 20 20 &s)!=1 ){..
999a0 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 return 1;..
999b0 20 7d 0d 0a 20 20 20 20 7a 44 61 74 65 20 2b 3d }.. zDate +=
999c0 20 32 3b 0d 0a 20 20 20 20 69 66 28 20 2a 7a 44 2;.. if( *zD
999d0 61 74 65 3d 3d 27 2e 27 20 26 26 20 73 71 6c 69 ate=='.' && sqli
999e0 74 65 33 49 73 64 69 67 69 74 28 7a 44 61 74 65 te3Isdigit(zDate
999f0 5b 31 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20 64 [1]) ){.. d
99a00 6f 75 62 6c 65 20 72 53 63 61 6c 65 20 3d 20 31 ouble rScale = 1
99a10 2e 30 3b 0d 0a 20 20 20 20 20 20 7a 44 61 74 65 .0;.. zDate
99a20 2b 2b 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 ++;.. while
99a30 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 ( sqlite3Isdigit
99a40 28 2a 7a 44 61 74 65 29 20 29 7b 0d 0a 20 20 20 (*zDate) ){..
99a50 20 20 20 20 20 6d 73 20 3d 20 6d 73 2a 31 30 2e ms = ms*10.
99a60 30 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 0 + *zDate - '0'
99a70 3b 0d 0a 20 20 20 20 20 20 20 20 72 53 63 61 6c ;.. rScal
99a80 65 20 2a 3d 20 31 30 2e 30 3b 0d 0a 20 20 20 20 e *= 10.0;..
99a90 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0d 0a 20 20 zDate++;..
99aa0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 6d 73 20 }.. ms
99ab0 2f 3d 20 72 53 63 61 6c 65 3b 0d 0a 20 20 20 20 /= rScale;..
99ac0 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }.. }else{..
99ad0 20 73 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 s = 0;.. }..
99ae0 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0d p->validJD = 0;.
99af0 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d . p->validHMS =
99b00 20 31 3b 0d 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 1;.. p->h = h;
99b10 0d 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b 0d 0a 20 .. p->m = m;..
99b20 20 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73 3b 0d p->s = s + ms;.
99b30 0a 20 20 69 66 28 20 70 61 72 73 65 54 69 6d 65 . if( parseTime
99b40 7a 6f 6e 65 28 7a 44 61 74 65 2c 20 70 29 20 29 zone(zDate, p) )
99b50 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 70 2d return 1;.. p-
99b60 3e 76 61 6c 69 64 54 5a 20 3d 20 28 70 2d 3e 74 >validTZ = (p->t
99b70 7a 21 3d 30 29 3f 31 3a 30 3b 0d 0a 20 20 72 65 z!=0)?1:0;.. re
99b80 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a turn 0;..}..../*
99b90 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 66 72 6f ..** Convert fro
99ba0 6d 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a m YYYY-MM-DD HH:
99bb0 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c 69 61 6e 20 MM:SS to julian
99bc0 64 61 79 2e 20 20 57 65 20 61 6c 77 61 79 73 20 day. We always
99bd0 61 73 73 75 6d 65 0d 0a 2a 2a 20 74 68 61 74 20 assume..** that
99be0 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44 44 20 69 the YYYY-MM-DD i
99bf0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 s according to t
99c00 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c he Gregorian cal
99c10 65 6e 64 61 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 endar...**..** R
99c20 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75 73 eference: Meeus
99c30 20 70 61 67 65 20 36 31 0d 0a 2a 2f 0d 0a 73 74 page 61..*/..st
99c40 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 atic void comput
99c50 65 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 eJD(DateTime *p)
99c60 7b 0d 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 {.. int Y, M, D
99c70 2c 20 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0d , A, B, X1, X2;.
99c80 0a 0d 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 ... if( p->vali
99c90 64 4a 44 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 dJD ) return;..
99ca0 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 59 4d 44 if( p->validYMD
99cb0 20 29 7b 0d 0a 20 20 20 20 59 20 3d 20 70 2d 3e ){.. Y = p->
99cc0 59 3b 0d 0a 20 20 20 20 4d 20 3d 20 70 2d 3e 4d Y;.. M = p->M
99cd0 3b 0d 0a 20 20 20 20 44 20 3d 20 70 2d 3e 44 3b ;.. D = p->D;
99ce0 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
99cf0 59 20 3d 20 32 30 30 30 3b 20 20 2f 2a 20 49 66 Y = 2000; /* If
99d00 20 6e 6f 20 59 4d 44 20 73 70 65 63 69 66 69 65 no YMD specifie
99d10 64 2c 20 61 73 73 75 6d 65 20 32 30 30 30 2d 4a d, assume 2000-J
99d20 61 6e 2d 30 31 20 2a 2f 0d 0a 20 20 20 20 4d 20 an-01 */.. M
99d30 3d 20 31 3b 0d 0a 20 20 20 20 44 20 3d 20 31 3b = 1;.. D = 1;
99d40 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 4d 3c 3d .. }.. if( M<=
99d50 32 20 29 7b 0d 0a 20 20 20 20 59 2d 2d 3b 0d 0a 2 ){.. Y--;..
99d60 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0d 0a 20 20 M += 12;..
99d70 7d 0d 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0d }.. A = Y/100;.
99d80 0a 20 20 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 . B = 2 - A + (
99d90 41 2f 34 29 3b 0d 0a 20 20 58 31 20 3d 20 33 36 A/4);.. X1 = 36
99da0 35 32 35 2a 28 59 2b 34 37 31 36 29 2f 31 30 30 525*(Y+4716)/100
99db0 3b 0d 0a 20 20 58 32 20 3d 20 33 30 36 30 30 31 ;.. X2 = 306001
99dc0 2a 28 4d 2b 31 29 2f 31 30 30 30 30 3b 0d 0a 20 *(M+1)/10000;..
99dd0 20 70 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 p->iJD = (sqlit
99de0 65 33 5f 69 6e 74 36 34 29 28 28 58 31 20 2b 20 e3_int64)((X1 +
99df0 58 32 20 2b 20 44 20 2b 20 42 20 2d 20 31 35 32 X2 + D + B - 152
99e00 34 2e 35 20 29 20 2a 20 38 36 34 30 30 30 30 30 4.5 ) * 86400000
99e10 29 3b 0d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 );.. p->validJD
99e20 20 3d 20 31 3b 0d 0a 20 20 69 66 28 20 70 2d 3e = 1;.. if( p->
99e30 76 61 6c 69 64 48 4d 53 20 29 7b 0d 0a 20 20 20 validHMS ){..
99e40 20 70 2d 3e 69 4a 44 20 2b 3d 20 70 2d 3e 68 2a p->iJD += p->h*
99e50 33 36 30 30 30 30 30 20 2b 20 70 2d 3e 6d 2a 36 3600000 + p->m*6
99e60 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 0000 + (sqlite3_
99e70 69 6e 74 36 34 29 28 70 2d 3e 73 2a 31 30 30 30 int64)(p->s*1000
99e80 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 76 );.. if( p->v
99e90 61 6c 69 64 54 5a 20 29 7b 0d 0a 20 20 20 20 20 alidTZ ){..
99ea0 20 70 2d 3e 69 4a 44 20 2d 3d 20 70 2d 3e 74 7a p->iJD -= p->tz
99eb0 2a 36 30 30 30 30 3b 0d 0a 20 20 20 20 20 20 70 *60000;.. p
99ec0 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20 30 3b 0d ->validYMD = 0;.
99ed0 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 . p->validH
99ee0 4d 53 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 70 MS = 0;.. p
99ef0 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0d 0a ->validTZ = 0;..
99f00 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d }.. }..}...
99f10 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 73 65 20 64 61 ./*..** Parse da
99f20 74 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0d tes of the form.
99f30 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 59 59 59 59 .**..** YYYY
99f40 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 2e -MM-DD HH:MM:SS.
99f50 46 46 46 0d 0a 2a 2a 20 20 20 20 20 59 59 59 59 FFF..** YYYY
99f60 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0d -MM-DD HH:MM:SS.
99f70 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d .** YYYY-MM-
99f80 44 44 20 48 48 3a 4d 4d 0d 0a 2a 2a 20 20 20 20 DD HH:MM..**
99f90 20 59 59 59 59 2d 4d 4d 2d 44 44 0d 0a 2a 2a 0d YYYY-MM-DD..**.
99fa0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 .** Write the re
99fb0 73 75 6c 74 20 69 6e 74 6f 20 74 68 65 20 44 61 sult into the Da
99fc0 74 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65 teTime structure
99fd0 20 61 6e 64 20 72 65 74 75 72 6e 20 30 0d 0a 2a and return 0..*
99fe0 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 * on success and
99ff0 20 31 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 1 if the input
9a000 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 61 20 string is not a
9a010 77 65 6c 6c 2d 66 6f 72 6d 65 64 0d 0a 2a 2a 20 well-formed..**
9a020 64 61 74 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 date...*/..stati
9a030 63 20 69 6e 74 20 70 61 72 73 65 59 79 79 79 4d c int parseYyyyM
9a040 6d 44 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a mDd(const char *
9a050 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20 zDate, DateTime
9a060 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 59 2c 20 4d *p){.. int Y, M
9a070 2c 20 44 2c 20 6e 65 67 3b 0d 0a 0d 0a 20 20 69 , D, neg;.... i
9a080 66 28 20 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27 f( zDate[0]=='-'
9a090 20 29 7b 0d 0a 20 20 20 20 7a 44 61 74 65 2b 2b ){.. zDate++
9a0a0 3b 0d 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0d ;.. neg = 1;.
9a0b0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6e . }else{.. n
9a0c0 65 67 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 eg = 0;.. }..
9a0d0 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a 44 if( getDigits(zD
9a0e0 61 74 65 2c 34 2c 30 2c 39 39 39 39 2c 27 2d 27 ate,4,0,9999,'-'
9a0f0 2c 26 59 2c 32 2c 31 2c 31 32 2c 27 2d 27 2c 26 ,&Y,2,1,12,'-',&
9a100 4d 2c 32 2c 31 2c 33 31 2c 30 2c 26 44 29 21 3d M,2,1,31,0,&D)!=
9a110 33 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 3 ){.. return
9a120 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 44 61 74 1;.. }.. zDat
9a130 65 20 2b 3d 20 31 30 3b 0d 0a 20 20 77 68 69 6c e += 10;.. whil
9a140 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 e( sqlite3Isspac
9a150 65 28 2a 7a 44 61 74 65 29 20 7c 7c 20 27 54 27 e(*zDate) || 'T'
9a160 3d 3d 2a 28 75 38 2a 29 7a 44 61 74 65 20 29 7b ==*(u8*)zDate ){
9a170 20 7a 44 61 74 65 2b 2b 3b 20 7d 0d 0a 20 20 69 zDate++; }.. i
9a180 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a f( parseHhMmSs(z
9a190 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0d 0a Date, p)==0 ){..
9a1a0 20 20 20 20 2f 2a 20 57 65 20 67 6f 74 20 74 68 /* We got th
9a1b0 65 20 74 69 6d 65 20 2a 2f 0d 0a 20 20 7d 65 6c e time */.. }el
9a1c0 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 30 se if( *zDate==0
9a1d0 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 76 61 6c 69 ){.. p->vali
9a1e0 64 48 4d 53 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c dHMS = 0;.. }el
9a1f0 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 se{.. return
9a200 31 3b 0d 0a 20 20 7d 0d 0a 20 20 70 2d 3e 76 61 1;.. }.. p->va
9a210 6c 69 64 4a 44 20 3d 20 30 3b 0d 0a 20 20 70 2d lidJD = 0;.. p-
9a220 3e 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0d 0a >validYMD = 1;..
9a230 20 20 70 2d 3e 59 20 3d 20 6e 65 67 20 3f 20 2d p->Y = neg ? -
9a240 59 20 3a 20 59 3b 0d 0a 20 20 70 2d 3e 4d 20 3d Y : Y;.. p->M =
9a250 20 4d 3b 0d 0a 20 20 70 2d 3e 44 20 3d 20 44 3b M;.. p->D = D;
9a260 0d 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 .. if( p->valid
9a270 54 5a 20 29 7b 0d 0a 20 20 20 20 63 6f 6d 70 75 TZ ){.. compu
9a280 74 65 4a 44 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 teJD(p);.. }..
9a290 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d return 0;..}...
9a2a0 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 ./*..** Set the
9a2b0 74 69 6d 65 20 74 6f 20 74 68 65 20 63 75 72 72 time to the curr
9a2c0 65 6e 74 20 74 69 6d 65 20 72 65 70 6f 72 74 65 ent time reporte
9a2d0 64 20 62 79 20 74 68 65 20 56 46 53 2e 0d 0a 2a d by the VFS...*
9a2e0 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 *..** Return the
9a2f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 number of error
9a300 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 s...*/..static i
9a310 6e 74 20 73 65 74 44 61 74 65 54 69 6d 65 54 6f nt setDateTimeTo
9a320 43 75 72 72 65 6e 74 28 73 71 6c 69 74 65 33 5f Current(sqlite3_
9a330 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 context *context
9a340 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0d , DateTime *p){.
9a350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
9a360 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 sqlite3_context
9a370 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 _db_handle(conte
9a380 78 74 29 3b 0d 0a 20 20 69 66 28 20 73 71 6c 69 xt);.. if( sqli
9a390 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 te3OsCurrentTime
9a3a0 49 6e 74 36 34 28 64 62 2d 3e 70 56 66 73 2c 20 Int64(db->pVfs,
9a3b0 26 70 2d 3e 69 4a 44 29 3d 3d 53 51 4c 49 54 45 &p->iJD)==SQLITE
9a3c0 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 76 _OK ){.. p->v
9a3d0 61 6c 69 64 4a 44 20 3d 20 31 3b 0d 0a 20 20 20 alidJD = 1;..
9a3e0 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 65 return 0;.. }e
9a3f0 6c 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e lse{.. return
9a400 20 31 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 1;.. }..}..../
9a410 2a 0d 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f *..** Attempt to
9a420 20 70 61 72 73 65 20 74 68 65 20 67 69 76 65 6e parse the given
9a430 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 4a string into a J
9a440 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62 65 72 ulian Day Number
9a450 2e 20 20 52 65 74 75 72 6e 0d 0a 2a 2a 20 74 68 . Return..** th
9a460 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f e number of erro
9a470 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 rs...**..** The
9a480 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63 following are ac
9a490 63 65 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66 ceptable forms f
9a4a0 6f 72 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 or the input str
9a4b0 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ing:..**..**
9a4c0 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a YYYY-MM-DD HH:
9a4d0 4d 4d 3a 53 53 2e 46 46 46 20 20 2b 2f 2d 48 48 MM:SS.FFF +/-HH
9a4e0 3a 4d 4d 0d 0a 2a 2a 20 20 20 20 20 20 44 44 44 :MM..** DDD
9a4f0 44 2e 44 44 20 0d 0a 2a 2a 20 20 20 20 20 20 6e D.DD ..** n
9a500 6f 77 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 74 68 ow..**..** In th
9a510 65 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 e first form, th
9a520 65 20 2b 2f 2d 48 48 3a 4d 4d 20 69 73 20 61 6c e +/-HH:MM is al
9a530 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 ways optional.
9a540 54 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 0d 0a The fractional..
9a550 2a 2a 20 73 65 63 6f 6e 64 73 20 65 78 74 65 6e ** seconds exten
9a560 73 69 6f 6e 20 28 74 68 65 20 22 2e 46 46 46 22 sion (the ".FFF"
9a570 29 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 ) is optional.
9a580 54 68 65 20 73 65 63 6f 6e 64 73 20 70 6f 72 74 The seconds port
9a590 69 6f 6e 0d 0a 2a 2a 20 28 22 3a 53 53 2e 46 46 ion..** (":SS.FF
9a5a0 46 22 29 20 69 73 20 6f 70 74 69 6f 6e 2e 20 20 F") is option.
9a5b0 54 68 65 20 79 65 61 72 20 61 6e 64 20 64 61 74 The year and dat
9a5c0 65 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 e can be omitted
9a5d0 20 61 73 20 6c 6f 6e 67 0d 0a 2a 2a 20 61 73 20 as long..** as
9a5e0 74 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 there is a time
9a5f0 73 74 72 69 6e 67 2e 20 20 54 68 65 20 74 69 6d string. The tim
9a600 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65 20 e string can be
9a610 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0d omitted as long.
9a620 0a 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 .** as there is
9a630 61 20 79 65 61 72 20 61 6e 64 20 64 61 74 65 2e a year and date.
9a640 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
9a650 20 70 61 72 73 65 44 61 74 65 4f 72 54 69 6d 65 parseDateOrTime
9a660 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e (.. sqlite3_con
9a670 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0d text *context, .
9a680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
9a690 44 61 74 65 2c 20 0d 0a 20 20 44 61 74 65 54 69 Date, .. DateTi
9a6a0 6d 65 20 2a 70 0d 0a 29 7b 0d 0a 20 20 64 6f 75 me *p..){.. dou
9a6b0 62 6c 65 20 72 3b 0d 0a 20 20 69 66 28 20 70 61 ble r;.. if( pa
9a6c0 72 73 65 59 79 79 79 4d 6d 44 64 28 7a 44 61 74 rseYyyyMmDd(zDat
9a6d0 65 2c 70 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 e,p)==0 ){..
9a6e0 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 65 6c return 0;.. }el
9a6f0 73 65 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d se if( parseHhMm
9a700 53 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 Ss(zDate, p)==0
9a710 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){.. return 0
9a720 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 ;.. }else if( s
9a730 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 qlite3StrICmp(zD
9a740 61 74 65 2c 22 6e 6f 77 22 29 3d 3d 30 29 7b 0d ate,"now")==0){.
9a750 0a 20 20 20 20 72 65 74 75 72 6e 20 73 65 74 44 . return setD
9a760 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e 74 ateTimeToCurrent
9a770 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0d 0a 20 (context, p);..
9a780 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 }else if( sqlit
9a790 65 33 41 74 6f 46 28 7a 44 61 74 65 2c 20 26 72 e3AtoF(zDate, &r
9a7a0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 , sqlite3Strlen3
9a7b0 30 28 7a 44 61 74 65 29 2c 20 53 51 4c 49 54 45 0(zDate), SQLITE
9a7c0 5f 55 54 46 38 29 20 29 7b 0d 0a 20 20 20 20 70 _UTF8) ){.. p
9a7d0 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 ->iJD = (sqlite3
9a7e0 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 _int64)(r*864000
9a7f0 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0d 0a 20 20 00.0 + 0.5);..
9a800 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 p->validJD = 1
9a810 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ;.. return 0;
9a820 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
9a830 31 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 1;..}..../*..**
9a840 43 6f 6d 70 75 74 65 20 74 68 65 20 59 65 61 72 Compute the Year
9a850 2c 20 4d 6f 6e 74 68 2c 20 61 6e 64 20 44 61 79 , Month, and Day
9a860 20 66 72 6f 6d 20 74 68 65 20 6a 75 6c 69 61 6e from the julian
9a870 20 64 61 79 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2f day number...*/
9a880 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f ..static void co
9a890 6d 70 75 74 65 59 4d 44 28 44 61 74 65 54 69 6d mputeYMD(DateTim
9a8a0 65 20 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 5a 2c e *p){.. int Z,
9a8b0 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 2c 20 A, B, C, D, E,
9a8c0 58 31 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 76 61 X1;.. if( p->va
9a8d0 6c 69 64 59 4d 44 20 29 20 72 65 74 75 72 6e 3b lidYMD ) return;
9a8e0 0d 0a 20 20 69 66 28 20 21 70 2d 3e 76 61 6c 69 .. if( !p->vali
9a8f0 64 4a 44 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 59 dJD ){.. p->Y
9a900 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20 70 2d = 2000;.. p-
9a910 3e 4d 20 3d 20 31 3b 0d 0a 20 20 20 20 70 2d 3e >M = 1;.. p->
9a920 44 20 3d 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b D = 1;.. }else{
9a930 0d 0a 20 20 20 20 5a 20 3d 20 28 69 6e 74 29 28 .. Z = (int)(
9a940 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 (p->iJD + 432000
9a950 30 30 29 2f 38 36 34 30 30 30 30 30 29 3b 0d 0a 00)/86400000);..
9a960 20 20 20 20 41 20 3d 20 28 69 6e 74 29 28 28 5a A = (int)((Z
9a970 20 2d 20 31 38 36 37 32 31 36 2e 32 35 29 2f 33 - 1867216.25)/3
9a980 36 35 32 34 2e 32 35 29 3b 0d 0a 20 20 20 20 41 6524.25);.. A
9a990 20 3d 20 5a 20 2b 20 31 20 2b 20 41 20 2d 20 28 = Z + 1 + A - (
9a9a0 41 2f 34 29 3b 0d 0a 20 20 20 20 42 20 3d 20 41 A/4);.. B = A
9a9b0 20 2b 20 31 35 32 34 3b 0d 0a 20 20 20 20 43 20 + 1524;.. C
9a9c0 3d 20 28 69 6e 74 29 28 28 42 20 2d 20 31 32 32 = (int)((B - 122
9a9d0 2e 31 29 2f 33 36 35 2e 32 35 29 3b 0d 0a 20 20 .1)/365.25);..
9a9e0 20 20 44 20 3d 20 28 33 36 35 32 35 2a 43 29 2f D = (36525*C)/
9a9f0 31 30 30 3b 0d 0a 20 20 20 20 45 20 3d 20 28 69 100;.. E = (i
9aa00 6e 74 29 28 28 42 2d 44 29 2f 33 30 2e 36 30 30 nt)((B-D)/30.600
9aa10 31 29 3b 0d 0a 20 20 20 20 58 31 20 3d 20 28 69 1);.. X1 = (i
9aa20 6e 74 29 28 33 30 2e 36 30 30 31 2a 45 29 3b 0d nt)(30.6001*E);.
9aa30 0a 20 20 20 20 70 2d 3e 44 20 3d 20 42 20 2d 20 . p->D = B -
9aa40 44 20 2d 20 58 31 3b 0d 0a 20 20 20 20 70 2d 3e D - X1;.. p->
9aa50 4d 20 3d 20 45 3c 31 34 20 3f 20 45 2d 31 20 3a M = E<14 ? E-1 :
9aa60 20 45 2d 31 33 3b 0d 0a 20 20 20 20 70 2d 3e 59 E-13;.. p->Y
9aa70 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43 20 2d 20 = p->M>2 ? C -
9aa80 34 37 31 36 20 3a 20 43 20 2d 20 34 37 31 35 3b 4716 : C - 4715;
9aa90 0d 0a 20 20 7d 0d 0a 20 20 70 2d 3e 76 61 6c 69 .. }.. p->vali
9aaa0 64 59 4d 44 20 3d 20 31 3b 0d 0a 7d 0d 0a 0d 0a dYMD = 1;..}....
9aab0 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 /*..** Compute t
9aac0 68 65 20 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c he Hour, Minute,
9aad0 20 61 6e 64 20 53 65 63 6f 6e 64 73 20 66 72 6f and Seconds fro
9aae0 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 m the julian day
9aaf0 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 number...*/..st
9ab00 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 atic void comput
9ab10 65 48 4d 53 28 44 61 74 65 54 69 6d 65 20 2a 70 eHMS(DateTime *p
9ab20 29 7b 0d 0a 20 20 69 6e 74 20 73 3b 0d 0a 20 20 ){.. int s;..
9ab30 69 66 28 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 if( p->validHMS
9ab40 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 63 6f 6d ) return;.. com
9ab50 70 75 74 65 4a 44 28 70 29 3b 0d 0a 20 20 73 20 puteJD(p);.. s
9ab60 3d 20 28 69 6e 74 29 28 28 70 2d 3e 69 4a 44 20 = (int)((p->iJD
9ab70 2b 20 34 33 32 30 30 30 30 30 29 20 25 20 38 36 + 43200000) % 86
9ab80 34 30 30 30 30 30 29 3b 0d 0a 20 20 70 2d 3e 73 400000);.. p->s
9ab90 20 3d 20 73 2f 31 30 30 30 2e 30 3b 0d 0a 20 20 = s/1000.0;..
9aba0 73 20 3d 20 28 69 6e 74 29 70 2d 3e 73 3b 0d 0a s = (int)p->s;..
9abb0 20 20 70 2d 3e 73 20 2d 3d 20 73 3b 0d 0a 20 20 p->s -= s;..
9abc0 70 2d 3e 68 20 3d 20 73 2f 33 36 30 30 3b 0d 0a p->h = s/3600;..
9abd0 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33 36 30 30 s -= p->h*3600
9abe0 3b 0d 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f 36 30 ;.. p->m = s/60
9abf0 3b 0d 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20 2d ;.. p->s += s -
9ac00 20 70 2d 3e 6d 2a 36 30 3b 0d 0a 20 20 70 2d 3e p->m*60;.. p->
9ac10 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0d 0a 7d validHMS = 1;..}
9ac20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 75 ..../*..** Compu
9ac30 74 65 20 62 6f 74 68 20 59 4d 44 20 61 6e 64 20 te both YMD and
9ac40 48 4d 53 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 HMS..*/..static
9ac50 76 6f 69 64 20 63 6f 6d 70 75 74 65 59 4d 44 5f void computeYMD_
9ac60 48 4d 53 28 44 61 74 65 54 69 6d 65 20 2a 70 29 HMS(DateTime *p)
9ac70 7b 0d 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 {.. computeYMD(
9ac80 70 29 3b 0d 0a 20 20 63 6f 6d 70 75 74 65 48 4d p);.. computeHM
9ac90 53 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a S(p);..}..../*..
9aca0 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 59 4d 44 ** Clear the YMD
9acb0 20 61 6e 64 20 48 4d 53 20 61 6e 64 20 74 68 65 and HMS and the
9acc0 20 54 5a 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 TZ..*/..static
9acd0 76 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f 48 4d void clearYMD_HM
9ace0 53 5f 54 5a 28 44 61 74 65 54 69 6d 65 20 2a 70 S_TZ(DateTime *p
9acf0 29 7b 0d 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d ){.. p->validYM
9ad00 44 20 3d 20 30 3b 0d 0a 20 20 70 2d 3e 76 61 6c D = 0;.. p->val
9ad10 69 64 48 4d 53 20 3d 20 30 3b 0d 0a 20 20 70 2d idHMS = 0;.. p-
9ad20 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0d 0a 7d >validTZ = 0;..}
9ad30 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 6e 20 72 65 ..../*..** On re
9ad40 63 65 6e 74 20 57 69 6e 64 6f 77 73 20 70 6c 61 cent Windows pla
9ad50 74 66 6f 72 6d 73 2c 20 74 68 65 20 6c 6f 63 61 tforms, the loca
9ad60 6c 74 69 6d 65 5f 73 28 29 20 66 75 6e 63 74 69 ltime_s() functi
9ad70 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d on is available.
9ad80 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 .** as part of t
9ad90 68 65 20 22 53 65 63 75 72 65 20 43 52 54 22 2e he "Secure CRT".
9ada0 20 49 74 20 69 73 20 65 73 73 65 6e 74 69 61 6c It is essential
9adb0 6c 79 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f ly equivalent to
9adc0 20 0d 0a 2a 2a 20 6c 6f 63 61 6c 74 69 6d 65 5f ..** localtime_
9add0 72 28 29 20 61 76 61 69 6c 61 62 6c 65 20 75 6e r() available un
9ade0 64 65 72 20 6d 6f 73 74 20 50 4f 53 49 58 20 70 der most POSIX p
9adf0 6c 61 74 66 6f 72 6d 73 2c 20 65 78 63 65 70 74 latforms, except
9ae00 20 74 68 61 74 20 74 68 65 20 0d 0a 2a 2a 20 6f that the ..** o
9ae10 72 64 65 72 20 6f 66 20 74 68 65 20 70 61 72 61 rder of the para
9ae20 6d 65 74 65 72 73 20 69 73 20 72 65 76 65 72 73 meters is revers
9ae30 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 65 20 ed...**..** See
9ae40 68 74 74 70 3a 2f 2f 6d 73 64 6e 2e 6d 69 63 72 http://msdn.micr
9ae50 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e 2d 75 73 2f osoft.com/en-us/
9ae60 6c 69 62 72 61 72 79 2f 61 34 34 32 78 33 79 65 library/a442x3ye
9ae70 28 56 53 2e 38 30 29 2e 61 73 70 78 2e 0d 0a 2a (VS.80).aspx...*
9ae80 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 *..** If the use
9ae90 72 20 68 61 73 20 6e 6f 74 20 69 6e 64 69 63 61 r has not indica
9aea0 74 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 61 6c ted to use local
9aeb0 74 69 6d 65 5f 72 28 29 20 6f 72 20 6c 6f 63 61 time_r() or loca
9aec0 6c 74 69 6d 65 5f 73 28 29 0d 0a 2a 2a 20 61 6c ltime_s()..** al
9aed0 72 65 61 64 79 2c 20 63 68 65 63 6b 20 66 6f 72 ready, check for
9aee0 20 61 6e 20 4d 53 56 43 20 62 75 69 6c 64 20 65 an MSVC build e
9aef0 6e 76 69 72 6f 6e 6d 65 6e 74 20 74 68 61 74 20 nvironment that
9af00 70 72 6f 76 69 64 65 73 20 0d 0a 2a 2a 20 6c 6f provides ..** lo
9af10 63 61 6c 74 69 6d 65 5f 73 28 29 2e 0d 0a 2a 2f caltime_s()...*/
9af20 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 ..#if !defined(H
9af30 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29 AVE_LOCALTIME_R)
9af40 20 26 26 20 21 64 65 66 69 6e 65 64 28 48 41 56 && !defined(HAV
9af50 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 29 20 26 E_LOCALTIME_S) &
9af60 26 20 5c 0d 0a 20 20 20 20 20 64 65 66 69 6e 65 & \.. define
9af70 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 64 d(_MSC_VER) && d
9af80 65 66 69 6e 65 64 28 5f 43 52 54 5f 49 4e 53 45 efined(_CRT_INSE
9af90 43 55 52 45 5f 44 45 50 52 45 43 41 54 45 29 0d CURE_DEPRECATE).
9afa0 0a 23 64 65 66 69 6e 65 20 48 41 56 45 5f 4c 4f .#define HAVE_LO
9afb0 43 41 4c 54 49 4d 45 5f 53 20 31 0d 0a 23 65 6e CALTIME_S 1..#en
9afc0 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 dif....#ifndef S
9afd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c QLITE_OMIT_LOCAL
9afe0 54 49 4d 45 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 TIME../*..** The
9aff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 following routi
9b000 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 ne implements th
9b010 65 20 72 6f 75 67 68 20 65 71 75 69 76 61 6c 65 e rough equivale
9b020 6e 74 20 6f 66 20 6c 6f 63 61 6c 74 69 6d 65 5f nt of localtime_
9b030 72 28 29 0d 0a 2a 2a 20 75 73 69 6e 67 20 77 68 r()..** using wh
9b040 61 74 65 76 65 72 20 6f 70 65 72 61 74 69 6e 67 atever operating
9b050 2d 73 79 73 74 65 6d 20 73 70 65 63 69 66 69 63 -system specific
9b060 20 6c 6f 63 61 6c 74 69 6d 65 20 66 61 63 69 6c localtime facil
9b070 69 74 79 20 74 68 61 74 0d 0a 2a 2a 20 69 73 20 ity that..** is
9b080 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 available. This
9b090 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
9b0a0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 0 on success an
9b0b0 64 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 6f d..** non-zero o
9b0c0 6e 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 n any kind of er
9b0d0 72 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 ror...**..** If
9b0e0 74 68 65 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 the sqlite3Globa
9b0f0 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 lConfig.bLocalti
9b100 6d 65 46 61 75 6c 74 20 76 61 72 69 61 62 6c 65 meFault variable
9b110 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 is true then th
9b120 69 73 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 is..** routine w
9b130 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 2e ill always fail.
9b140 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
9b150 20 6f 73 4c 6f 63 61 6c 74 69 6d 65 28 74 69 6d osLocaltime(tim
9b160 65 5f 74 20 2a 74 2c 20 73 74 72 75 63 74 20 74 e_t *t, struct t
9b170 6d 20 2a 70 54 6d 29 7b 0d 0a 20 20 69 6e 74 20 m *pTm){.. int
9b180 72 63 3b 0d 0a 23 69 66 20 28 21 64 65 66 69 6e rc;..#if (!defin
9b190 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d ed(HAVE_LOCALTIM
9b1a0 45 5f 52 29 20 7c 7c 20 21 48 41 56 45 5f 4c 4f E_R) || !HAVE_LO
9b1b0 43 41 4c 54 49 4d 45 5f 52 29 20 5c 0d 0a 20 20 CALTIME_R) \..
9b1c0 20 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 && (!defined
9b1d0 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f (HAVE_LOCALTIME_
9b1e0 53 29 20 7c 7c 20 21 48 41 56 45 5f 4c 4f 43 41 S) || !HAVE_LOCA
9b1f0 4c 54 49 4d 45 5f 53 29 0d 0a 20 20 73 74 72 75 LTIME_S).. stru
9b200 63 74 20 74 6d 20 2a 70 58 3b 0d 0a 23 69 66 20 ct tm *pX;..#if
9b210 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
9b220 45 3e 30 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d E>0.. sqlite3_m
9b230 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 utex *mutex = sq
9b240 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 lite3MutexAlloc(
9b250 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
9b260 54 49 43 5f 4d 41 53 54 45 52 29 3b 0d 0a 23 65 TIC_MASTER);..#e
9b270 6e 64 69 66 0d 0a 20 20 73 71 6c 69 74 65 33 5f ndif.. sqlite3_
9b280 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 mutex_enter(mute
9b290 78 29 3b 0d 0a 20 20 70 58 20 3d 20 6c 6f 63 61 x);.. pX = loca
9b2a0 6c 74 69 6d 65 28 74 29 3b 0d 0a 23 69 66 6e 64 ltime(t);..#ifnd
9b2b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 ef SQLITE_OMIT_B
9b2c0 55 49 4c 54 49 4e 5f 54 45 53 54 0d 0a 20 20 69 UILTIN_TEST.. i
9b2d0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c f( sqlite3Global
9b2e0 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d Config.bLocaltim
9b2f0 65 46 61 75 6c 74 20 29 20 70 58 20 3d 20 30 3b eFault ) pX = 0;
9b300 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 66 28 20 ..#endif.. if(
9b310 70 58 20 29 20 2a 70 54 6d 20 3d 20 2a 70 58 3b pX ) *pTm = *pX;
9b320 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
9b330 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0d x_leave(mutex);.
9b340 0a 20 20 72 63 20 3d 20 70 58 3d 3d 30 3b 0d 0a . rc = pX==0;..
9b350 23 65 6c 73 65 0d 0a 23 69 66 6e 64 65 66 20 53 #else..#ifndef S
9b360 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 QLITE_OMIT_BUILT
9b370 49 4e 5f 54 45 53 54 0d 0a 20 20 69 66 28 20 73 IN_TEST.. if( s
9b380 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
9b390 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 ig.bLocaltimeFau
9b3a0 6c 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a lt ) return 1;..
9b3b0 23 65 6e 64 69 66 0d 0a 23 69 66 20 64 65 66 69 #endif..#if defi
9b3c0 6e 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 ned(HAVE_LOCALTI
9b3d0 4d 45 5f 52 29 20 26 26 20 48 41 56 45 5f 4c 4f ME_R) && HAVE_LO
9b3e0 43 41 4c 54 49 4d 45 5f 52 0d 0a 20 20 72 63 20 CALTIME_R.. rc
9b3f0 3d 20 6c 6f 63 61 6c 74 69 6d 65 5f 72 28 74 2c = localtime_r(t,
9b400 20 70 54 6d 29 3d 3d 30 3b 0d 0a 23 65 6c 73 65 pTm)==0;..#else
9b410 0d 0a 20 20 72 63 20 3d 20 6c 6f 63 61 6c 74 69 .. rc = localti
9b420 6d 65 5f 73 28 70 54 6d 2c 20 74 29 3b 0d 0a 23 me_s(pTm, t);..#
9b430 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 4c 4f endif /* HAVE_LO
9b440 43 41 4c 54 49 4d 45 5f 52 20 2a 2f 0d 0a 23 65 CALTIME_R */..#e
9b450 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 4c 4f 43 ndif /* HAVE_LOC
9b460 41 4c 54 49 4d 45 5f 52 20 7c 7c 20 48 41 56 45 ALTIME_R || HAVE
9b470 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 20 2a 2f 0d _LOCALTIME_S */.
9b480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
9b490 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 ..#endif /* SQLI
9b4a0 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d TE_OMIT_LOCALTIM
9b4b0 45 20 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 E */......#ifnde
9b4c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f f SQLITE_OMIT_LO
9b4d0 43 41 4c 54 49 4d 45 0d 0a 2f 2a 0d 0a 2a 2a 20 CALTIME../*..**
9b4e0 43 6f 6d 70 75 74 65 20 74 68 65 20 64 69 66 66 Compute the diff
9b4f0 65 72 65 6e 63 65 20 28 69 6e 20 6d 69 6c 6c 69 erence (in milli
9b500 73 65 63 6f 6e 64 73 29 20 62 65 74 77 65 65 6e seconds) between
9b510 20 6c 6f 63 61 6c 74 69 6d 65 20 61 6e 64 20 55 localtime and U
9b520 54 43 0d 0a 2a 2a 20 28 61 2e 6b 2e 61 2e 20 47 TC..** (a.k.a. G
9b530 4d 54 29 20 66 6f 72 20 74 68 65 20 74 69 6d 65 MT) for the time
9b540 20 76 61 6c 75 65 20 70 20 77 68 65 72 65 20 70 value p where p
9b550 20 69 73 20 69 6e 20 55 54 43 2e 20 49 66 20 6e is in UTC. If n
9b560 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0d o error occurs,.
9b570 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 69 73 20 .** return this
9b580 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20 2a 70 value and set *p
9b590 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e Rc to SQLITE_OK.
9b5a0 20 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 72 2c 20 69 66 ..**..** Or, if
9b5b0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f an error does o
9b5c0 63 63 75 72 2c 20 73 65 74 20 2a 70 52 63 20 74 ccur, set *pRc t
9b5d0 6f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 o SQLITE_ERROR.
9b5e0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c The returned val
9b5f0 75 65 0d 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 ue..** is undefi
9b600 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 ned in this case
9b610 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 71 ...*/..static sq
9b620 6c 69 74 65 33 5f 69 6e 74 36 34 20 6c 6f 63 61 lite3_int64 loca
9b630 6c 74 69 6d 65 4f 66 66 73 65 74 28 0d 0a 20 20 ltimeOffset(..
9b640 44 61 74 65 54 69 6d 65 20 2a 70 2c 20 20 20 20 DateTime *p,
9b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9b660 2f 2a 20 44 61 74 65 20 61 74 20 77 68 69 63 68 /* Date at which
9b670 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 6f 66 to calculate of
9b680 66 73 65 74 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 fset */.. sqlit
9b690 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 e3_context *pCtx
9b6a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 , /* Wr
9b6b0 69 74 65 20 65 72 72 6f 72 20 68 65 72 65 20 69 ite error here i
9b6c0 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 2a 2f 0d f one occurs */.
9b6d0 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 . int *pRc
9b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9b6f0 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 /* OUT: Error
9b700 20 63 6f 64 65 2e 20 53 51 4c 49 54 45 5f 4f 4b code. SQLITE_OK
9b710 20 6f 72 20 45 52 52 4f 52 20 2a 2f 0d 0a 29 7b or ERROR */..){
9b720 0d 0a 20 20 44 61 74 65 54 69 6d 65 20 78 2c 20 .. DateTime x,
9b730 79 3b 0d 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0d y;.. time_t t;.
9b740 0a 20 20 73 74 72 75 63 74 20 74 6d 20 73 4c 6f . struct tm sLo
9b750 63 61 6c 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69 cal;.... /* Ini
9b760 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 tialize the cont
9b770 65 6e 74 73 20 6f 66 20 73 4c 6f 63 61 6c 20 74 ents of sLocal t
9b780 6f 20 61 76 6f 69 64 20 61 20 63 6f 6d 70 69 6c o avoid a compil
9b790 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0d 0a er warning. */..
9b7a0 20 20 6d 65 6d 73 65 74 28 26 73 4c 6f 63 61 6c memset(&sLocal
9b7b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4c 6f 63 , 0, sizeof(sLoc
9b7c0 61 6c 29 29 3b 0d 0a 0d 0a 20 20 78 20 3d 20 2a al));.... x = *
9b7d0 70 3b 0d 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 p;.. computeYMD
9b7e0 5f 48 4d 53 28 26 78 29 3b 0d 0a 20 20 69 66 28 _HMS(&x);.. if(
9b7f0 20 78 2e 59 3c 31 39 37 31 20 7c 7c 20 78 2e 59 x.Y<1971 || x.Y
9b800 3e 3d 32 30 33 38 20 29 7b 0d 0a 20 20 20 20 78 >=2038 ){.. x
9b810 2e 59 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20 .Y = 2000;..
9b820 78 2e 4d 20 3d 20 31 3b 0d 0a 20 20 20 20 78 2e x.M = 1;.. x.
9b830 44 20 3d 20 31 3b 0d 0a 20 20 20 20 78 2e 68 20 D = 1;.. x.h
9b840 3d 20 30 3b 0d 0a 20 20 20 20 78 2e 6d 20 3d 20 = 0;.. x.m =
9b850 30 3b 0d 0a 20 20 20 20 78 2e 73 20 3d 20 30 2e 0;.. x.s = 0.
9b860 30 3b 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 0;.. } else {..
9b870 20 20 20 20 69 6e 74 20 73 20 3d 20 28 69 6e 74 int s = (int
9b880 29 28 78 2e 73 20 2b 20 30 2e 35 29 3b 0d 0a 20 )(x.s + 0.5);..
9b890 20 20 20 78 2e 73 20 3d 20 73 3b 0d 0a 20 20 7d x.s = s;.. }
9b8a0 0d 0a 20 20 78 2e 74 7a 20 3d 20 30 3b 0d 0a 20 .. x.tz = 0;..
9b8b0 20 78 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0d x.validJD = 0;.
9b8c0 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 . computeJD(&x)
9b8d0 3b 0d 0a 20 20 74 20 3d 20 28 74 69 6d 65 5f 74 ;.. t = (time_t
9b8e0 29 28 78 2e 69 4a 44 2f 31 30 30 30 20 2d 20 32 )(x.iJD/1000 - 2
9b8f0 31 30 38 36 36 37 36 2a 28 69 36 34 29 31 30 30 1086676*(i64)100
9b900 30 30 29 3b 0d 0a 20 20 69 66 28 20 6f 73 4c 6f 00);.. if( osLo
9b910 63 61 6c 74 69 6d 65 28 26 74 2c 20 26 73 4c 6f caltime(&t, &sLo
9b920 63 61 6c 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c cal) ){.. sql
9b930 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f ite3_result_erro
9b940 72 28 70 43 74 78 2c 20 22 6c 6f 63 61 6c 20 74 r(pCtx, "local t
9b950 69 6d 65 20 75 6e 61 76 61 69 6c 61 62 6c 65 22 ime unavailable"
9b960 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 2a 70 52 63 , -1);.. *pRc
9b970 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b = SQLITE_ERROR;
9b980 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d .. return 0;.
9b990 0a 20 20 7d 0d 0a 20 20 79 2e 59 20 3d 20 73 4c . }.. y.Y = sL
9b9a0 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31 ocal.tm_year + 1
9b9b0 39 30 30 3b 0d 0a 20 20 79 2e 4d 20 3d 20 73 4c 900;.. y.M = sL
9b9c0 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b ocal.tm_mon + 1;
9b9d0 0d 0a 20 20 79 2e 44 20 3d 20 73 4c 6f 63 61 6c .. y.D = sLocal
9b9e0 2e 74 6d 5f 6d 64 61 79 3b 0d 0a 20 20 79 2e 68 .tm_mday;.. y.h
9b9f0 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 68 6f 75 = sLocal.tm_hou
9ba00 72 3b 0d 0a 20 20 79 2e 6d 20 3d 20 73 4c 6f 63 r;.. y.m = sLoc
9ba10 61 6c 2e 74 6d 5f 6d 69 6e 3b 0d 0a 20 20 79 2e al.tm_min;.. y.
9ba20 73 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 73 65 s = sLocal.tm_se
9ba30 63 3b 0d 0a 20 20 79 2e 76 61 6c 69 64 59 4d 44 c;.. y.validYMD
9ba40 20 3d 20 31 3b 0d 0a 20 20 79 2e 76 61 6c 69 64 = 1;.. y.valid
9ba50 48 4d 53 20 3d 20 31 3b 0d 0a 20 20 79 2e 76 61 HMS = 1;.. y.va
9ba60 6c 69 64 4a 44 20 3d 20 30 3b 0d 0a 20 20 79 2e lidJD = 0;.. y.
9ba70 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0d 0a 20 20 validTZ = 0;..
9ba80 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b 0d 0a computeJD(&y);..
9ba90 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f *pRc = SQLITE_
9baa0 4f 4b 3b 0d 0a 20 20 72 65 74 75 72 6e 20 79 2e OK;.. return y.
9bab0 69 4a 44 20 2d 20 78 2e 69 4a 44 3b 0d 0a 7d 0d iJD - x.iJD;..}.
9bac0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
9bad0 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 E_OMIT_LOCALTIME
9bae0 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 */..../*..** Pr
9baf0 6f 63 65 73 73 20 61 20 6d 6f 64 69 66 69 65 72 ocess a modifier
9bb00 20 74 6f 20 61 20 64 61 74 65 2d 74 69 6d 65 20 to a date-time
9bb10 73 74 61 6d 70 2e 20 20 54 68 65 20 6d 6f 64 69 stamp. The modi
9bb20 66 69 65 72 73 20 61 72 65 0d 0a 2a 2a 20 61 73 fiers are..** as
9bb30 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a follows:..**..*
9bb40 2a 20 20 20 20 20 4e 4e 4e 20 64 61 79 73 0d 0a * NNN days..
9bb50 2a 2a 20 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73 ** NNN hours
9bb60 0d 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 69 6e ..** NNN min
9bb70 75 74 65 73 0d 0a 2a 2a 20 20 20 20 20 4e 4e 4e utes..** NNN
9bb80 2e 4e 4e 4e 4e 20 73 65 63 6f 6e 64 73 0d 0a 2a .NNNN seconds..*
9bb90 2a 20 20 20 20 20 4e 4e 4e 20 6d 6f 6e 74 68 73 * NNN months
9bba0 0d 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 79 65 61 ..** NNN yea
9bbb0 72 73 0d 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 rs..** start
9bbc0 20 6f 66 20 6d 6f 6e 74 68 0d 0a 2a 2a 20 20 20 of month..**
9bbd0 20 20 73 74 61 72 74 20 6f 66 20 79 65 61 72 0d start of year.
9bbe0 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 .** start of
9bbf0 20 77 65 65 6b 0d 0a 2a 2a 20 20 20 20 20 73 74 week..** st
9bc00 61 72 74 20 6f 66 20 64 61 79 0d 0a 2a 2a 20 20 art of day..**
9bc10 20 20 20 77 65 65 6b 64 61 79 20 4e 0d 0a 2a 2a weekday N..**
9bc20 20 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0d 0a unixepoch..
9bc30 2a 2a 20 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 ** localtime
9bc40 0d 0a 2a 2a 20 20 20 20 20 75 74 63 0d 0a 2a 2a ..** utc..**
9bc50 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e ..** Return 0 on
9bc60 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69 success and 1 i
9bc70 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b f there is any k
9bc80 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 20 49 66 ind of error. If
9bc90 20 74 68 65 20 65 72 72 6f 72 0d 0a 2a 2a 20 69 the error..** i
9bca0 73 20 69 6e 20 61 20 73 79 73 74 65 6d 20 63 61 s in a system ca
9bcb0 6c 6c 20 28 69 2e 65 2e 20 6c 6f 63 61 6c 74 69 ll (i.e. localti
9bcc0 6d 65 28 29 29 2c 20 74 68 65 6e 20 61 6e 20 65 me()), then an e
9bcd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
9bce0 77 72 69 74 74 65 6e 0d 0a 2a 2a 20 74 6f 20 63 written..** to c
9bcf0 6f 6e 74 65 78 74 20 70 43 74 78 2e 20 49 66 20 ontext pCtx. If
9bd00 74 68 65 20 65 72 72 6f 72 20 69 73 20 61 6e 20 the error is an
9bd10 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6d 6f 64 unrecognized mod
9bd20 69 66 69 65 72 2c 20 6e 6f 20 65 72 72 6f 72 20 ifier, no error
9bd30 69 73 0d 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 is..** written t
9bd40 6f 20 70 43 74 78 2e 0d 0a 2a 2f 0d 0a 73 74 61 o pCtx...*/..sta
9bd50 74 69 63 20 69 6e 74 20 70 61 72 73 65 4d 6f 64 tic int parseMod
9bd60 69 66 69 65 72 28 73 71 6c 69 74 65 33 5f 63 6f ifier(sqlite3_co
9bd70 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 63 6f 6e ntext *pCtx, con
9bd80 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 st char *zMod, D
9bd90 61 74 65 54 69 6d 65 20 2a 70 29 7b 0d 0a 20 20 ateTime *p){..
9bda0 69 6e 74 20 72 63 20 3d 20 31 3b 0d 0a 20 20 69 int rc = 1;.. i
9bdb0 6e 74 20 6e 3b 0d 0a 20 20 64 6f 75 62 6c 65 20 nt n;.. double
9bdc0 72 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 2c 20 7a r;.. char *z, z
9bdd0 42 75 66 5b 33 30 5d 3b 0d 0a 20 20 7a 20 3d 20 Buf[30];.. z =
9bde0 7a 42 75 66 3b 0d 0a 20 20 66 6f 72 28 6e 3d 30 zBuf;.. for(n=0
9bdf0 3b 20 6e 3c 41 72 72 61 79 53 69 7a 65 28 7a 42 ; n<ArraySize(zB
9be00 75 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b 6e 5d uf)-1 && zMod[n]
9be10 3b 20 6e 2b 2b 29 7b 0d 0a 20 20 20 20 7a 5b 6e ; n++){.. z[n
9be20 5d 20 3d 20 28 63 68 61 72 29 6f 61 73 55 70 70 ] = (char)oasUpp
9be30 65 72 32 4c 6f 77 65 72 5b 28 75 38 29 7a 4d 6f er2Lower[(u8)zMo
9be40 64 5b 6e 5d 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 7a d[n]];.. }.. z
9be50 5b 6e 5d 20 3d 20 30 3b 0d 0a 20 20 73 77 69 74 [n] = 0;.. swit
9be60 63 68 28 20 7a 5b 30 5d 20 29 7b 0d 0a 23 69 66 ch( z[0] ){..#if
9be70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
9be80 5f 4c 4f 43 41 4c 54 49 4d 45 0d 0a 20 20 20 20 _LOCALTIME..
9be90 63 61 73 65 20 27 6c 27 3a 20 7b 0d 0a 20 20 20 case 'l': {..
9bea0 20 20 20 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69 /* localti
9beb0 6d 65 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 me.. **..
9bec0 20 20 20 20 2a 2a 20 41 73 73 75 6d 69 6e 67 20 ** Assuming
9bed0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 the current time
9bee0 20 76 61 6c 75 65 20 69 73 20 55 54 43 20 28 61 value is UTC (a
9bef0 2e 6b 2e 61 2e 20 47 4d 54 29 2c 20 73 68 69 66 .k.a. GMT), shif
9bf00 74 20 69 74 20 74 6f 0d 0a 20 20 20 20 20 20 2a t it to.. *
9bf10 2a 20 73 68 6f 77 20 6c 6f 63 61 6c 20 74 69 6d * show local tim
9bf20 65 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 e... */..
9bf30 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
9bf40 2c 20 22 6c 6f 63 61 6c 74 69 6d 65 22 29 3d 3d , "localtime")==
9bf50 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 0 ){.. co
9bf60 6d 70 75 74 65 4a 44 28 70 29 3b 0d 0a 20 20 20 mputeJD(p);..
9bf70 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 6c p->iJD += l
9bf80 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 ocaltimeOffset(p
9bf90 2c 20 70 43 74 78 2c 20 26 72 63 29 3b 0d 0a 20 , pCtx, &rc);..
9bfa0 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f clearYMD_
9bfb0 48 4d 53 5f 54 5a 28 70 29 3b 0d 0a 20 20 20 20 HMS_TZ(p);..
9bfc0 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b }.. break
9bfd0 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 ;.. }..#endif
9bfe0 0d 0a 20 20 20 20 63 61 73 65 20 27 75 27 3a 20 .. case 'u':
9bff0 7b 0d 0a 20 20 20 20 20 20 2f 2a 0d 0a 20 20 20 {.. /*..
9c000 20 20 20 2a 2a 20 20 20 20 75 6e 69 78 65 70 6f ** unixepo
9c010 63 68 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 ch.. **..
9c020 20 20 20 20 2a 2a 20 54 72 65 61 74 20 74 68 65 ** Treat the
9c030 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f current value o
9c040 66 20 70 2d 3e 69 4a 44 20 61 73 20 74 68 65 20 f p->iJD as the
9c050 6e 75 6d 62 65 72 20 6f 66 0d 0a 20 20 20 20 20 number of..
9c060 20 2a 2a 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 ** seconds sinc
9c070 65 20 31 39 37 30 2e 20 20 43 6f 6e 76 65 72 74 e 1970. Convert
9c080 20 74 6f 20 61 20 72 65 61 6c 20 6a 75 6c 69 61 to a real julia
9c090 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e 0d 0a 20 n day number...
9c0a0 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 */.. i
9c0b0 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 6e f( strcmp(z, "un
9c0c0 69 78 65 70 6f 63 68 22 29 3d 3d 30 20 26 26 20 ixepoch")==0 &&
9c0d0 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0d 0a 20 p->validJD ){..
9c0e0 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20 p->iJD =
9c0f0 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 29 (p->iJD + 43200)
9c100 2f 38 36 34 30 30 20 2b 20 32 31 30 38 36 36 37 /86400 + 2108667
9c110 36 2a 28 69 36 34 29 31 30 30 30 30 30 30 30 3b 6*(i64)10000000;
9c120 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 .. clearY
9c130 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0d 0a 20 MD_HMS_TZ(p);..
9c140 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a rc = 0;..
9c150 20 20 20 20 20 20 7d 0d 0a 23 69 66 6e 64 65 66 }..#ifndef
9c160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 SQLITE_OMIT_LOC
9c170 41 4c 54 49 4d 45 0d 0a 20 20 20 20 20 20 65 6c ALTIME.. el
9c180 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c se if( strcmp(z,
9c190 20 22 75 74 63 22 29 3d 3d 30 20 29 7b 0d 0a 20 "utc")==0 ){..
9c1a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 sqlite3_i
9c1b0 6e 74 36 34 20 63 31 3b 0d 0a 20 20 20 20 20 20 nt64 c1;..
9c1c0 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0d computeJD(p);.
9c1d0 0a 20 20 20 20 20 20 20 20 63 31 20 3d 20 6c 6f . c1 = lo
9c1e0 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 2c caltimeOffset(p,
9c1f0 20 70 43 74 78 2c 20 26 72 63 29 3b 0d 0a 20 20 pCtx, &rc);..
9c200 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
9c210 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
9c220 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d 20 p->iJD -=
9c230 63 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 c1;.. c
9c240 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 learYMD_HMS_TZ(p
9c250 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 2d );.. p-
9c260 3e 69 4a 44 20 2b 3d 20 63 31 20 2d 20 6c 6f 63 >iJD += c1 - loc
9c270 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 2c 20 altimeOffset(p,
9c280 70 43 74 78 2c 20 26 72 63 29 3b 0d 0a 20 20 20 pCtx, &rc);..
9c290 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d }.. }.
9c2a0 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 62 .#endif.. b
9c2b0 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 reak;.. }..
9c2c0 20 20 63 61 73 65 20 27 77 27 3a 20 7b 0d 0a 20 case 'w': {..
9c2d0 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a /*.. *
9c2e0 2a 20 20 20 20 77 65 65 6b 64 61 79 20 4e 0d 0a * weekday N..
9c2f0 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 **..
9c300 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61 74 65 ** Move the date
9c310 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 69 6d to the same tim
9c320 65 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 6f 63 e on the next oc
9c330 63 75 72 72 65 6e 63 65 20 6f 66 0d 0a 20 20 20 currence of..
9c340 20 20 20 2a 2a 20 77 65 65 6b 64 61 79 20 4e 20 ** weekday N
9c350 77 68 65 72 65 20 30 3d 3d 53 75 6e 64 61 79 2c where 0==Sunday,
9c360 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20 61 6e 64 20 1==Monday, and
9c370 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 so forth. If th
9c380 65 0d 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 65 e.. ** date
9c390 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 is already on t
9c3a0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 77 he appropriate w
9c3b0 65 65 6b 64 61 79 2c 20 74 68 69 73 20 69 73 20 eekday, this is
9c3c0 61 20 6e 6f 2d 6f 70 2e 0d 0a 20 20 20 20 20 20 a no-op...
9c3d0 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 73 74 */.. if( st
9c3e0 72 6e 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64 61 rncmp(z, "weekda
9c3f0 79 20 22 2c 20 38 29 3d 3d 30 0d 0a 20 20 20 20 y ", 8)==0..
9c400 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 && sq
9c410 6c 69 74 65 33 41 74 6f 46 28 26 7a 5b 38 5d 2c lite3AtoF(&z[8],
9c420 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c &r, sqlite3Strl
9c430 65 6e 33 30 28 26 7a 5b 38 5d 29 2c 20 53 51 4c en30(&z[8]), SQL
9c440 49 54 45 5f 55 54 46 38 29 0d 0a 20 20 20 20 20 ITE_UTF8)..
9c450 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 3d && (n=
9c460 28 69 6e 74 29 72 29 3d 3d 72 20 26 26 20 6e 3e (int)r)==r && n>
9c470 3d 30 20 26 26 20 72 3c 37 20 29 7b 0d 0a 20 20 =0 && r<7 ){..
9c480 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e sqlite3_in
9c490 74 36 34 20 5a 3b 0d 0a 20 20 20 20 20 20 20 20 t64 Z;..
9c4a0 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 computeYMD_HMS(p
9c4b0 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 );.. p->v
9c4c0 61 6c 69 64 54 5a 20 3d 20 30 3b 0d 0a 20 20 20 alidTZ = 0;..
9c4d0 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 p->validJD
9c4e0 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6f = 0;.. co
9c4f0 6d 70 75 74 65 4a 44 28 70 29 3b 0d 0a 20 20 20 mputeJD(p);..
9c500 20 20 20 20 20 5a 20 3d 20 28 28 70 2d 3e 69 4a Z = ((p->iJ
9c510 44 20 2b 20 31 32 39 36 30 30 30 30 30 29 2f 38 D + 129600000)/8
9c520 36 34 30 30 30 30 30 29 20 25 20 37 3b 0d 0a 20 6400000) % 7;..
9c530 20 20 20 20 20 20 20 69 66 28 20 5a 3e 6e 20 29 if( Z>n )
9c540 20 5a 20 2d 3d 20 37 3b 0d 0a 20 20 20 20 20 20 Z -= 7;..
9c550 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 6e 20 2d p->iJD += (n -
9c560 20 5a 29 2a 38 36 34 30 30 30 30 30 3b 0d 0a 20 Z)*86400000;..
9c570 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f clearYMD_
9c580 48 4d 53 5f 54 5a 28 70 29 3b 0d 0a 20 20 20 20 HMS_TZ(p);..
9c590 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a 20 20 20 rc = 0;..
9c5a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 }.. brea
9c5b0 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 63 k;.. }.. c
9c5c0 61 73 65 20 27 73 27 3a 20 7b 0d 0a 20 20 20 20 ase 's': {..
9c5d0 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 /*.. **
9c5e0 20 20 73 74 61 72 74 20 6f 66 20 54 54 54 54 54 start of TTTTT
9c5f0 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 .. **..
9c600 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61 ** Move the da
9c610 74 65 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 te backwards to
9c620 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 the beginning of
9c630 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 79 the current day
9c640 2c 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d ,.. ** or m
9c650 6f 6e 74 68 20 6f 72 20 79 65 61 72 2e 0d 0a 20 onth or year...
9c660 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 */.. i
9c670 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 73 f( strncmp(z, "s
9c680 74 61 72 74 20 6f 66 20 22 2c 20 39 29 21 3d 30 tart of ", 9)!=0
9c690 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 ) break;..
9c6a0 20 7a 20 2b 3d 20 39 3b 0d 0a 20 20 20 20 20 20 z += 9;..
9c6b0 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0d 0a computeYMD(p);..
9c6c0 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d p->validHM
9c6d0 53 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 70 2d S = 1;.. p-
9c6e0 3e 68 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0d 0a >h = p->m = 0;..
9c6f0 20 20 20 20 20 20 70 2d 3e 73 20 3d 20 30 2e 30 p->s = 0.0
9c700 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 ;.. p->vali
9c710 64 54 5a 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 dTZ = 0;..
9c720 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0d p->validJD = 0;.
9c730 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d . if( strcm
9c740 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 p(z,"month")==0
9c750 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 ){.. p->D
9c760 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 72 = 1;.. r
9c770 63 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 65 c = 0;.. }e
9c780 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a lse if( strcmp(z
9c790 2c 22 79 65 61 72 22 29 3d 3d 30 20 29 7b 0d 0a ,"year")==0 ){..
9c7a0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 computeY
9c7b0 4d 44 28 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 MD(p);..
9c7c0 70 2d 3e 4d 20 3d 20 31 3b 0d 0a 20 20 20 20 20 p->M = 1;..
9c7d0 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0d 0a 20 20 p->D = 1;..
9c7e0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a 20 rc = 0;..
9c7f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 }else if( s
9c800 74 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d trcmp(z,"day")==
9c810 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 0 ){.. rc
9c820 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a = 0;.. }..
9c830 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
9c840 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 20 27 2b }.. case '+
9c850 27 3a 0d 0a 20 20 20 20 63 61 73 65 20 27 2d 27 ':.. case '-'
9c860 3a 0d 0a 20 20 20 20 63 61 73 65 20 27 30 27 3a :.. case '0':
9c870 0d 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 0d .. case '1':.
9c880 0a 20 20 20 20 63 61 73 65 20 27 32 27 3a 0d 0a . case '2':..
9c890 20 20 20 20 63 61 73 65 20 27 33 27 3a 0d 0a 20 case '3':..
9c8a0 20 20 20 63 61 73 65 20 27 34 27 3a 0d 0a 20 20 case '4':..
9c8b0 20 20 63 61 73 65 20 27 35 27 3a 0d 0a 20 20 20 case '5':..
9c8c0 20 63 61 73 65 20 27 36 27 3a 0d 0a 20 20 20 20 case '6':..
9c8d0 63 61 73 65 20 27 37 27 3a 0d 0a 20 20 20 20 63 case '7':.. c
9c8e0 61 73 65 20 27 38 27 3a 0d 0a 20 20 20 20 63 61 ase '8':.. ca
9c8f0 73 65 20 27 39 27 3a 20 7b 0d 0a 20 20 20 20 20 se '9': {..
9c900 20 64 6f 75 62 6c 65 20 72 52 6f 75 6e 64 65 72 double rRounder
9c910 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 ;.. for(n=1
9c920 3b 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d ; z[n] && z[n]!=
9c930 27 3a 27 20 26 26 20 21 73 71 6c 69 74 65 33 49 ':' && !sqlite3I
9c940 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b sspace(z[n]); n+
9c950 2b 29 7b 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 +){}.. if(
9c960 21 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 !sqlite3AtoF(z,
9c970 26 72 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 55 54 &r, n, SQLITE_UT
9c980 46 38 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 F8) ){..
9c990 72 63 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 rc = 1;..
9c9a0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d break;.. }
9c9b0 0d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d .. if( z[n]
9c9c0 3d 3d 27 3a 27 20 29 7b 0d 0a 20 20 20 20 20 20 ==':' ){..
9c9d0 20 20 2f 2a 20 41 20 6d 6f 64 69 66 69 65 72 20 /* A modifier
9c9e0 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 2b 7c 2d of the form (+|-
9c9f0 29 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 61 64 )HH:MM:SS.FFF ad
9ca00 64 73 20 28 6f 72 20 73 75 62 74 72 61 63 74 73 ds (or subtracts
9ca10 29 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2a ) the.. *
9ca20 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 * specified numb
9ca30 65 72 20 6f 66 20 68 6f 75 72 73 2c 20 6d 69 6e er of hours, min
9ca40 75 74 65 73 2c 20 73 65 63 6f 6e 64 73 2c 20 61 utes, seconds, a
9ca50 6e 64 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 nd fractional se
9ca60 63 6f 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 2a conds.. *
9ca70 2a 20 74 6f 20 74 68 65 20 74 69 6d 65 2e 20 20 * to the time.
9ca80 54 68 65 20 22 2e 46 46 46 22 20 6d 61 79 20 62 The ".FFF" may b
9ca90 65 20 6f 6d 69 74 74 65 64 2e 20 20 54 68 65 20 e omitted. The
9caa0 22 3a 53 53 2e 46 46 46 22 20 6d 61 79 20 62 65 ":SS.FFF" may be
9cab0 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6d 69 .. ** omi
9cac0 74 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2a tted... *
9cad0 2f 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 /.. const
9cae0 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0d 0a char *z2 = z;..
9caf0 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 DateTime
9cb00 20 74 78 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 tx;.. sq
9cb10 6c 69 74 65 33 5f 69 6e 74 36 34 20 64 61 79 3b lite3_int64 day;
9cb20 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 .. if( !s
9cb30 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a qlite3Isdigit(*z
9cb40 32 29 20 29 20 7a 32 2b 2b 3b 0d 0a 20 20 20 20 2) ) z2++;..
9cb50 20 20 20 20 6d 65 6d 73 65 74 28 26 74 78 2c 20 memset(&tx,
9cb60 30 2c 20 73 69 7a 65 6f 66 28 74 78 29 29 3b 0d 0, sizeof(tx));.
9cb70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61 72 . if( par
9cb80 73 65 48 68 4d 6d 53 73 28 7a 32 2c 20 26 74 78 seHhMmSs(z2, &tx
9cb90 29 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 ) ) break;..
9cba0 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 74 computeJD(&t
9cbb0 78 29 3b 0d 0a 20 20 20 20 20 20 20 20 74 78 2e x);.. tx.
9cbc0 69 4a 44 20 2d 3d 20 34 33 32 30 30 30 30 30 3b iJD -= 43200000;
9cbd0 0d 0a 20 20 20 20 20 20 20 20 64 61 79 20 3d 20 .. day =
9cbe0 74 78 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 3b tx.iJD/86400000;
9cbf0 0d 0a 20 20 20 20 20 20 20 20 74 78 2e 69 4a 44 .. tx.iJD
9cc00 20 2d 3d 20 64 61 79 2a 38 36 34 30 30 30 30 30 -= day*86400000
9cc10 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a ;.. if( z
9cc20 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78 2e 69 4a [0]=='-' ) tx.iJ
9cc30 44 20 3d 20 2d 74 78 2e 69 4a 44 3b 0d 0a 20 20 D = -tx.iJD;..
9cc40 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 computeJD(
9cc50 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 p);.. cle
9cc60 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b arYMD_HMS_TZ(p);
9cc70 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 .. p->iJD
9cc80 20 2b 3d 20 74 78 2e 69 4a 44 3b 0d 0a 20 20 20 += tx.iJD;..
9cc90 20 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a 20 20 rc = 0;..
9cca0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
9ccb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7a 20 2b }.. z +
9ccc0 3d 20 6e 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c = n;.. whil
9ccd0 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 e( sqlite3Isspac
9cce0 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0d 0a 20 20 e(*z) ) z++;..
9ccf0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 n = sqlite3S
9cd00 74 72 6c 65 6e 33 30 28 7a 29 3b 0d 0a 20 20 20 trlen30(z);..
9cd10 20 20 20 69 66 28 20 6e 3e 31 30 20 7c 7c 20 6e if( n>10 || n
9cd20 3c 33 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 <3 ) break;..
9cd30 20 20 20 69 66 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 if( z[n-1]=='
9cd40 73 27 20 29 7b 20 7a 5b 6e 2d 31 5d 20 3d 20 30 s' ){ z[n-1] = 0
9cd50 3b 20 6e 2d 2d 3b 20 7d 0d 0a 20 20 20 20 20 20 ; n--; }..
9cd60 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0d 0a 20 computeJD(p);..
9cd70 20 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a 20 20 rc = 0;..
9cd80 20 20 20 20 72 52 6f 75 6e 64 65 72 20 3d 20 72 rRounder = r
9cd90 3c 30 20 3f 20 2d 30 2e 35 20 3a 20 2b 30 2e 35 <0 ? -0.5 : +0.5
9cda0 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d ;.. if( n==
9cdb0 33 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 64 3 && strcmp(z,"d
9cdc0 61 79 22 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 ay")==0 ){..
9cdd0 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 p->iJD += (s
9cde0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a qlite3_int64)(r*
9cdf0 38 36 34 30 30 30 30 30 2e 30 20 2b 20 72 52 6f 86400000.0 + rRo
9ce00 75 6e 64 65 72 29 3b 0d 0a 20 20 20 20 20 20 7d under);.. }
9ce10 65 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 else if( n==4 &&
9ce20 20 73 74 72 63 6d 70 28 7a 2c 22 68 6f 75 72 22 strcmp(z,"hour"
9ce30 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 )==0 ){..
9ce40 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 p->iJD += (sqli
9ce50 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 28 38 36 te3_int64)(r*(86
9ce60 34 30 30 30 30 30 2e 30 2f 32 34 2e 30 29 20 2b 400000.0/24.0) +
9ce70 20 72 52 6f 75 6e 64 65 72 29 3b 0d 0a 20 20 20 rRounder);..
9ce80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d }else if( n==
9ce90 36 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6 && strcmp(z,"m
9cea0 69 6e 75 74 65 22 29 3d 3d 30 20 29 7b 0d 0a 20 inute")==0 ){..
9ceb0 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d p->iJD +=
9cec0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 (sqlite3_int64)
9ced0 28 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 28 (r*(86400000.0/(
9cee0 32 34 2e 30 2a 36 30 2e 30 29 29 20 2b 20 72 52 24.0*60.0)) + rR
9cef0 6f 75 6e 64 65 72 29 3b 0d 0a 20 20 20 20 20 20 ounder);..
9cf00 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26 }else if( n==6 &
9cf10 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65 63 6f & strcmp(z,"seco
9cf20 6e 64 22 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 nd")==0 ){..
9cf30 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 p->iJD += (s
9cf40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a qlite3_int64)(r*
9cf50 28 38 36 34 30 30 30 30 30 2e 30 2f 28 32 34 2e (86400000.0/(24.
9cf60 30 2a 36 30 2e 30 2a 36 30 2e 30 29 29 20 2b 20 0*60.0*60.0)) +
9cf70 72 52 6f 75 6e 64 65 72 29 3b 0d 0a 20 20 20 20 rRounder);..
9cf80 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 35 }else if( n==5
9cf90 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6f && strcmp(z,"mo
9cfa0 6e 74 68 22 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 nth")==0 ){..
9cfb0 20 20 20 20 20 69 6e 74 20 78 2c 20 79 3b 0d 0a int x, y;..
9cfc0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 computeY
9cfd0 4d 44 5f 48 4d 53 28 70 29 3b 0d 0a 20 20 20 20 MD_HMS(p);..
9cfe0 20 20 20 20 70 2d 3e 4d 20 2b 3d 20 28 69 6e 74 p->M += (int
9cff0 29 72 3b 0d 0a 20 20 20 20 20 20 20 20 78 20 3d )r;.. x =
9d000 20 70 2d 3e 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d p->M>0 ? (p->M-
9d010 31 29 2f 31 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 1)/12 : (p->M-12
9d020 29 2f 31 32 3b 0d 0a 20 20 20 20 20 20 20 20 70 )/12;.. p
9d030 2d 3e 59 20 2b 3d 20 78 3b 0d 0a 20 20 20 20 20 ->Y += x;..
9d040 20 20 20 70 2d 3e 4d 20 2d 3d 20 78 2a 31 32 3b p->M -= x*12;
9d050 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c .. p->val
9d060 69 64 4a 44 20 3d 20 30 3b 0d 0a 20 20 20 20 20 idJD = 0;..
9d070 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b computeJD(p);
9d080 0d 0a 20 20 20 20 20 20 20 20 79 20 3d 20 28 69 .. y = (i
9d090 6e 74 29 72 3b 0d 0a 20 20 20 20 20 20 20 20 69 nt)r;.. i
9d0a0 66 28 20 79 21 3d 72 20 29 7b 0d 0a 20 20 20 20 f( y!=r ){..
9d0b0 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 p->iJD +=
9d0c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 (sqlite3_int64)(
9d0d0 28 72 20 2d 20 79 29 2a 33 30 2e 30 2a 38 36 34 (r - y)*30.0*864
9d0e0 30 30 30 30 30 2e 30 20 2b 20 72 52 6f 75 6e 64 00000.0 + rRound
9d0f0 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d er);.. }.
9d100 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
9d110 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 n==4 && strcmp(
9d120 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20 29 7b 0d z,"year")==0 ){.
9d130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 79 20 3d . int y =
9d140 20 28 69 6e 74 29 72 3b 0d 0a 20 20 20 20 20 20 (int)r;..
9d150 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 computeYMD_HMS
9d160 28 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d (p);.. p-
9d170 3e 59 20 2b 3d 20 79 3b 0d 0a 20 20 20 20 20 20 >Y += y;..
9d180 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 p->validJD = 0
9d190 3b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 ;.. compu
9d1a0 74 65 4a 44 28 70 29 3b 0d 0a 20 20 20 20 20 20 teJD(p);..
9d1b0 20 20 69 66 28 20 79 21 3d 72 20 29 7b 0d 0a 20 if( y!=r ){..
9d1c0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 p->iJD
9d1d0 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 += (sqlite3_int6
9d1e0 34 29 28 28 72 20 2d 20 79 29 2a 33 36 35 2e 30 4)((r - y)*365.0
9d1f0 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 72 52 *86400000.0 + rR
9d200 6f 75 6e 64 65 72 29 3b 0d 0a 20 20 20 20 20 20 ounder);..
9d210 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }.. }else
9d220 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {.. rc =
9d230 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 1;.. }..
9d240 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f clearYMD_HMS_
9d250 54 5a 28 70 29 3b 0d 0a 20 20 20 20 20 20 62 72 TZ(p);.. br
9d260 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 eak;.. }..
9d270 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 20 default: {..
9d280 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d break;.. }
9d290 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
9d2a0 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a rc;..}..../*..**
9d2b0 20 50 72 6f 63 65 73 73 20 74 69 6d 65 20 66 75 Process time fu
9d2c0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 nction arguments
9d2d0 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 61 20 . argv[0] is a
9d2e0 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e date-time stamp.
9d2f0 0d 0a 2a 2a 20 61 72 67 76 5b 31 5d 20 61 6e 64 ..** argv[1] and
9d300 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6d following are m
9d310 6f 64 69 66 69 65 72 73 2e 20 20 50 61 72 73 65 odifiers. Parse
9d320 20 74 68 65 6d 20 61 6c 6c 20 61 6e 64 20 77 72 them all and wr
9d330 69 74 65 0d 0a 2a 2a 20 74 68 65 20 72 65 73 75 ite..** the resu
9d340 6c 74 69 6e 67 20 74 69 6d 65 20 69 6e 74 6f 20 lting time into
9d350 74 68 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 the DateTime str
9d360 75 63 74 75 72 65 20 70 2e 20 20 52 65 74 75 72 ucture p. Retur
9d370 6e 20 30 0d 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 n 0..** on succe
9d380 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 72 ss and 1 if ther
9d390 65 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73 e are any errors
9d3a0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
9d3b0 72 65 20 61 72 65 20 7a 65 72 6f 20 70 61 72 61 re are zero para
9d3c0 6d 65 74 65 72 73 20 28 69 66 20 65 76 65 6e 20 meters (if even
9d3d0 61 72 67 76 5b 30 5d 20 69 73 20 75 6e 64 65 66 argv[0] is undef
9d3e0 69 6e 65 64 29 0d 0a 2a 2a 20 74 68 65 6e 20 61 ined)..** then a
9d3f0 73 73 75 6d 65 20 61 20 64 65 66 61 75 6c 74 20 ssume a default
9d400 76 61 6c 75 65 20 6f 66 20 22 6e 6f 77 22 20 66 value of "now" f
9d410 6f 72 20 61 72 67 76 5b 30 5d 2e 0d 0a 2a 2f 0d or argv[0]...*/.
9d420 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 61 .static int isDa
9d430 74 65 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 te(.. sqlite3_c
9d440 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c ontext *context,
9d450 20 0d 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0d .. int argc, .
9d460 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 . sqlite3_value
9d470 20 2a 2a 61 72 67 76 2c 20 0d 0a 20 20 44 61 74 **argv, .. Dat
9d480 65 54 69 6d 65 20 2a 70 0d 0a 29 7b 0d 0a 20 20 eTime *p..){..
9d490 69 6e 74 20 69 3b 0d 0a 20 20 63 6f 6e 73 74 20 int i;.. const
9d4a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a unsigned char *z
9d4b0 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 ;.. unsigned ch
9d4c0 61 72 20 64 61 74 65 31 43 5b 31 31 5d 3b 0d 0a ar date1C[11];..
9d4d0 20 20 69 6e 74 20 65 54 79 70 65 3b 0d 0a 20 20 int eType;..
9d4e0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a memset(p, 0, siz
9d4f0 65 6f 66 28 2a 70 29 29 3b 0d 0a 20 20 69 66 28 eof(*p));.. if(
9d500 20 61 72 67 63 3d 3d 30 20 29 7b 0d 0a 20 20 20 argc==0 ){..
9d510 20 72 65 74 75 72 6e 20 73 65 74 44 61 74 65 54 return setDateT
9d520 69 6d 65 54 6f 43 75 72 72 65 6e 74 28 63 6f 6e imeToCurrent(con
9d530 74 65 78 74 2c 20 70 29 3b 0d 0a 20 20 7d 0d 0a text, p);.. }..
9d540 20 20 69 66 28 20 28 65 54 79 70 65 20 3d 20 73 if( (eType = s
9d550 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 qlite3_value_typ
9d560 65 28 61 72 67 76 5b 30 5d 29 29 3d 3d 53 51 4c e(argv[0]))==SQL
9d570 49 54 45 5f 46 4c 4f 41 54 0d 0a 20 20 20 20 20 ITE_FLOAT..
9d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c ||
9d590 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 eType==SQLITE_I
9d5a0 4e 54 45 47 45 52 20 29 7b 0d 0a 20 20 20 20 70 NTEGER ){.. p
9d5b0 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 ->iJD = (sqlite3
9d5c0 5f 69 6e 74 36 34 29 28 73 71 6c 69 74 65 33 5f _int64)(sqlite3_
9d5d0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 value_double(arg
9d5e0 76 5b 30 5d 29 2a 38 36 34 30 30 30 30 30 2e 30 v[0])*86400000.0
9d5f0 20 2b 20 30 2e 35 29 3b 0d 0a 20 20 20 20 70 2d + 0.5);.. p-
9d600 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0d 0a 20 >validJD = 1;..
9d610 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 7a 20 3d }else{.. z =
9d620 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 sqlite3_value_t
9d630 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0d 0a 09 ext(argv[0]);...
9d640 69 66 28 7a 20 26 26 20 38 20 3d 3d 20 73 74 72 if(z && 8 == str
9d650 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a len((const char*
9d660 29 7a 29 29 0d 0a 09 7b 0d 0a 09 09 70 2d 3e 64 )z))...{....p->d
9d670 61 74 65 31 43 20 3d 20 31 3b 0d 0a 09 09 2a 28 ate1C = 1;....*(
9d680 44 57 4f 52 44 2a 29 64 61 74 65 31 43 20 3d 20 DWORD*)date1C =
9d690 2a 28 44 57 4f 52 44 2a 29 7a 3b 0d 0a 09 09 64 *(DWORD*)z;....d
9d6a0 61 74 65 31 43 5b 34 5d 20 3d 20 27 2d 27 3b 0d ate1C[4] = '-';.
9d6b0 0a 09 09 2a 28 57 4f 52 44 2a 29 28 64 61 74 65 ...*(WORD*)(date
9d6c0 31 43 20 2b 20 35 29 20 3d 20 2a 28 57 4f 52 44 1C + 5) = *(WORD
9d6d0 2a 29 28 7a 20 2b 20 34 29 3b 0d 0a 09 09 64 61 *)(z + 4);....da
9d6e0 74 65 31 43 5b 37 5d 20 3d 20 27 2d 27 3b 0d 0a te1C[7] = '-';..
9d6f0 09 09 2a 28 57 4f 52 44 2a 29 28 64 61 74 65 31 ..*(WORD*)(date1
9d700 43 20 2b 20 38 29 20 3d 20 2a 28 57 4f 52 44 2a C + 8) = *(WORD*
9d710 29 28 7a 20 2b 20 36 29 3b 0d 0a 09 09 64 61 74 )(z + 6);....dat
9d720 65 31 43 5b 31 30 5d 20 3d 20 30 3b 0d 0a 09 09 e1C[10] = 0;....
9d730 7a 20 3d 20 64 61 74 65 31 43 3b 0d 0a 09 7d 0d z = date1C;...}.
9d740 0a 20 20 20 20 69 66 28 21 7a 20 7c 7c 20 70 61 . if(!z || pa
9d750 72 73 65 44 61 74 65 4f 72 54 69 6d 65 28 63 6f rseDateOrTime(co
9d760 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c ntext, (char*)z,
9d770 20 70 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 p) ){.. re
9d780 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a turn 1;.. }..
9d790 20 20 7d 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 }.. for(i=1;
9d7a0 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0d 0a 20 i<argc; i++){..
9d7b0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 z = sqlite3_v
9d7c0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 alue_text(argv[i
9d7d0 5d 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a 3d 3d ]);.. if( z==
9d7e0 30 20 7c 7c 20 70 61 72 73 65 4d 6f 64 69 66 69 0 || parseModifi
9d7f0 65 72 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 er(context, (cha
9d800 72 2a 29 7a 2c 20 70 29 20 29 20 72 65 74 75 72 r*)z, p) ) retur
9d810 6e 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 n 1;.. }.. ret
9d820 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f urn 0;..}....../
9d830 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 *..** The follow
9d840 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 ing routines imp
9d850 6c 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 6f lement the vario
9d860 75 73 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 us date and time
9d870 20 66 75 6e 63 74 69 6f 6e 73 0d 0a 2a 2a 20 6f functions..** o
9d880 66 20 53 51 4c 69 74 65 2e 0d 0a 2a 2f 0d 0a 0d f SQLite...*/...
9d890 0a 2f 2a 0d 0a 2a 2a 20 20 20 20 6a 75 6c 69 61 ./*..** julia
9d8a0 6e 64 61 79 28 20 54 49 4d 45 53 54 52 49 4e 47 nday( TIMESTRING
9d8b0 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 , MOD, MOD, ...)
9d8c0 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ..**..** Return
9d8d0 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e the julian day n
9d8e0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 64 61 74 umber of the dat
9d8f0 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 e specified in t
9d900 68 65 20 61 72 67 75 6d 65 6e 74 73 0d 0a 2a 2f he arguments..*/
9d910 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 75 ..static void ju
9d920 6c 69 61 6e 64 61 79 46 75 6e 63 28 0d 0a 20 20 liandayFunc(..
9d930 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 sqlite3_context
9d940 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 69 6e 74 *context,.. int
9d950 20 61 72 67 63 2c 0d 0a 20 20 73 71 6c 69 74 65 argc,.. sqlite
9d960 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0d 0a 3_value **argv..
9d970 29 7b 0d 0a 20 20 44 61 74 65 54 69 6d 65 20 78 ){.. DateTime x
9d980 3b 0d 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 ;.. if( isDate(
9d990 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 context, argc, a
9d9a0 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0d 0a rgv, &x)==0 ){..
9d9b0 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 computeJD(&x
9d9c0 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f );.. sqlite3_
9d9d0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f result_double(co
9d9e0 6e 74 65 78 74 2c 20 78 2e 69 4a 44 2f 38 36 34 ntext, x.iJD/864
9d9f0 30 30 30 30 30 2e 30 29 3b 0d 0a 20 20 7d 0d 0a 00000.0);.. }..
9da00 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 20 20 20 64 }..../*..** d
9da10 61 74 65 74 69 6d 65 28 20 54 49 4d 45 53 54 52 atetime( TIMESTR
9da20 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e ING, MOD, MOD, .
9da30 2e 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 ..)..**..** Retu
9da40 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 rn YYYY-MM-DD HH
9da50 3a 4d 4d 3a 53 53 0d 0a 2a 2f 0d 0a 73 74 61 74 :MM:SS..*/..stat
9da60 69 63 20 76 6f 69 64 20 64 61 74 65 74 69 6d 65 ic void datetime
9da70 46 75 6e 63 28 0d 0a 20 20 73 71 6c 69 74 65 33 Func(.. sqlite3
9da80 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 _context *contex
9da90 74 2c 0d 0a 20 20 69 6e 74 20 61 72 67 63 2c 0d t,.. int argc,.
9daa0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 . sqlite3_value
9dab0 20 2a 2a 61 72 67 76 0d 0a 29 7b 0d 0a 20 20 44 **argv..){.. D
9dac0 61 74 65 54 69 6d 65 20 78 3b 0d 0a 20 20 69 66 ateTime x;.. if
9dad0 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 ( isDate(context
9dae0 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 , argc, argv, &x
9daf0 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63 68 61 )==0 ){.. cha
9db00 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0d 0a 20 20 r zBuf[100];..
9db10 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 computeYMD_HMS
9db20 28 26 78 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 (&x);.. sqlit
9db30 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 e3_snprintf(size
9db40 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 of(zBuf), zBuf,
9db50 22 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64 20 "%04d-%02d-%02d
9db60 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c %02d:%02d:%02d",
9db70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
9db80 20 20 20 20 20 20 20 78 2e 59 2c 20 78 2e 4d 2c x.Y, x.M,
9db90 20 78 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 x.D, x.h, x.m,
9dba0 28 69 6e 74 29 28 78 2e 73 29 29 3b 0d 0a 20 20 (int)(x.s));..
9dbb0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 sqlite3_result
9dbc0 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a _text(context, z
9dbd0 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f Buf, -1, SQLITE_
9dbe0 54 52 41 4e 53 49 45 4e 54 29 3b 0d 0a 20 20 7d TRANSIENT);.. }
9dbf0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 20 20 ..}..../*..**
9dc00 20 74 69 6d 65 28 20 54 49 4d 45 53 54 52 49 4e time( TIMESTRIN
9dc10 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e G, MOD, MOD, ...
9dc20 29 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e )..**..** Return
9dc30 20 48 48 3a 4d 4d 3a 53 53 0d 0a 2a 2f 0d 0a 73 HH:MM:SS..*/..s
9dc40 74 61 74 69 63 20 76 6f 69 64 20 74 69 6d 65 46 tatic void timeF
9dc50 75 6e 63 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f unc(.. sqlite3_
9dc60 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 context *context
9dc70 2c 0d 0a 20 20 69 6e 74 20 61 72 67 63 2c 0d 0a ,.. int argc,..
9dc80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 sqlite3_value
9dc90 2a 2a 61 72 67 76 0d 0a 29 7b 0d 0a 20 20 44 61 **argv..){.. Da
9dca0 74 65 54 69 6d 65 20 78 3b 0d 0a 20 20 69 66 28 teTime x;.. if(
9dcb0 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c isDate(context,
9dcc0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 argc, argv, &x)
9dcd0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63 68 61 72 ==0 ){.. char
9dce0 20 7a 42 75 66 5b 31 30 30 5d 3b 0d 0a 20 20 20 zBuf[100];..
9dcf0 20 63 6f 6d 70 75 74 65 48 4d 53 28 26 78 29 3b computeHMS(&x);
9dd00 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e .. sqlite3_sn
9dd10 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 printf(sizeof(zB
9dd20 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 32 64 uf), zBuf, "%02d
9dd30 3a 25 30 32 64 3a 25 30 32 64 22 2c 20 78 2e 68 :%02d:%02d", x.h
9dd40 2c 20 78 2e 6d 2c 20 28 69 6e 74 29 78 2e 73 29 , x.m, (int)x.s)
9dd50 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 ;.. sqlite3_r
9dd60 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 esult_text(conte
9dd70 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 xt, zBuf, -1, SQ
9dd80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b LITE_TRANSIENT);
9dd90 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
9dda0 2a 2a 20 20 20 20 64 61 74 65 28 20 54 49 4d 45 ** date( TIME
9ddb0 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 STRING, MOD, MOD
9ddc0 2c 20 2e 2e 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 52 , ...)..**..** R
9ddd0 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 eturn YYYY-MM-DD
9dde0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
9ddf0 64 20 64 61 74 65 46 75 6e 63 28 0d 0a 20 20 73 d dateFunc(.. s
9de00 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a qlite3_context *
9de10 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 69 6e 74 20 context,.. int
9de20 61 72 67 63 2c 0d 0a 20 20 73 71 6c 69 74 65 33 argc,.. sqlite3
9de30 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0d 0a 29 _value **argv..)
9de40 7b 0d 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b {.. DateTime x;
9de50 0d 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63 .. if( isDate(c
9de60 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 ontext, argc, ar
9de70 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0d 0a 20 gv, &x)==0 ){..
9de80 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 char zBuf[100
9de90 5d 3b 0d 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 ];.. computeY
9dea0 4d 44 28 26 78 29 3b 0d 0a 20 20 20 20 73 71 6c MD(&x);.. sql
9deb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
9dec0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 zeof(zBuf), zBuf
9ded0 2c 20 30 20 3d 3d 20 78 2e 64 61 74 65 31 43 20 , 0 == x.date1C
9dee0 3f 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30 32 ? "%04d-%02d-%02
9def0 64 22 20 3a 20 22 25 30 34 64 25 30 32 64 25 30 d" : "%04d%02d%0
9df00 32 64 22 2c 20 78 2e 59 2c 20 78 2e 4d 2c 20 78 2d", x.Y, x.M, x
9df10 2e 44 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 .D);.. sqlite
9df20 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 3_result_text(co
9df30 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c ntext, zBuf, -1,
9df40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e SQLITE_TRANSIEN
9df50 54 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f T);.. }..}..../
9df60 2a 0d 0a 2a 2a 20 20 20 20 73 74 72 66 74 69 6d *..** strftim
9df70 65 28 20 46 4f 52 4d 41 54 2c 20 54 49 4d 45 53 e( FORMAT, TIMES
9df80 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c TRING, MOD, MOD,
9df90 20 2e 2e 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 ...)..**..** Re
9dfa0 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 64 65 turn a string de
9dfb0 73 63 72 69 62 65 64 20 62 79 20 46 4f 52 4d 41 scribed by FORMA
9dfc0 54 2e 20 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20 T. Conversions
9dfd0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d as follows:..**.
9dfe0 0a 2a 2a 20 20 20 25 64 20 20 64 61 79 20 6f 66 .** %d day of
9dff0 20 6d 6f 6e 74 68 0d 0a 2a 2a 20 20 20 25 66 20 month..** %f
9e000 20 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 ** fractional s
9e010 65 63 6f 6e 64 73 20 20 53 53 2e 53 53 53 0d 0a econds SS.SSS..
9e020 2a 2a 20 20 20 25 48 20 20 68 6f 75 72 20 30 30 ** %H hour 00
9e030 2d 32 34 0d 0a 2a 2a 20 20 20 25 6a 20 20 64 61 -24..** %j da
9e040 79 20 6f 66 20 79 65 61 72 20 30 30 30 2d 33 36 y of year 000-36
9e050 36 0d 0a 2a 2a 20 20 20 25 4a 20 20 2a 2a 20 4a 6..** %J ** J
9e060 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 ulian day number
9e070 0d 0a 2a 2a 20 20 20 25 6d 20 20 6d 6f 6e 74 68 ..** %m month
9e080 20 30 31 2d 31 32 0d 0a 2a 2a 20 20 20 25 4d 20 01-12..** %M
9e090 20 6d 69 6e 75 74 65 20 30 30 2d 35 39 0d 0a 2a minute 00-59..*
9e0a0 2a 20 20 20 25 73 20 20 73 65 63 6f 6e 64 73 20 * %s seconds
9e0b0 73 69 6e 63 65 20 31 39 37 30 2d 30 31 2d 30 31 since 1970-01-01
9e0c0 0d 0a 2a 2a 20 20 20 25 53 20 20 73 65 63 6f 6e ..** %S secon
9e0d0 64 73 20 30 30 2d 35 39 0d 0a 2a 2a 20 20 20 25 ds 00-59..** %
9e0e0 77 20 20 64 61 79 20 6f 66 20 77 65 65 6b 20 30 w day of week 0
9e0f0 2d 36 20 20 73 75 6e 64 61 79 3d 3d 30 0d 0a 2a -6 sunday==0..*
9e100 2a 20 20 20 25 57 20 20 77 65 65 6b 20 6f 66 20 * %W week of
9e110 79 65 61 72 20 30 30 2d 35 33 0d 0a 2a 2a 20 20 year 00-53..**
9e120 20 25 59 20 20 79 65 61 72 20 30 30 30 30 2d 39 %Y year 0000-9
9e130 39 39 39 0d 0a 2a 2a 20 20 20 25 25 20 20 25 0d 999..** %% %.
9e140 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
9e150 20 73 74 72 66 74 69 6d 65 46 75 6e 63 28 0d 0a strftimeFunc(..
9e160 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 sqlite3_contex
9e170 74 20 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 69 t *context,.. i
9e180 6e 74 20 61 72 67 63 2c 0d 0a 20 20 73 71 6c 69 nt argc,.. sqli
9e190 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 te3_value **argv
9e1a0 0d 0a 29 7b 0d 0a 20 20 44 61 74 65 54 69 6d 65 ..){.. DateTime
9e1b0 20 78 3b 0d 0a 20 20 75 36 34 20 6e 3b 0d 0a 20 x;.. u64 n;..
9e1c0 20 73 69 7a 65 5f 74 20 69 2c 6a 3b 0d 0a 20 20 size_t i,j;..
9e1d0 63 68 61 72 20 2a 7a 3b 0d 0a 20 20 73 71 6c 69 char *z;.. sqli
9e1e0 74 65 33 20 2a 64 62 3b 0d 0a 20 20 63 6f 6e 73 te3 *db;.. cons
9e1f0 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 28 t char *zFmt = (
9e200 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 const char*)sqli
9e210 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 te3_value_text(a
9e220 72 67 76 5b 30 5d 29 3b 0d 0a 20 20 63 68 61 72 rgv[0]);.. char
9e230 20 7a 42 75 66 5b 31 30 30 5d 3b 0d 0a 20 20 69 zBuf[100];.. i
9e240 66 28 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73 f( zFmt==0 || is
9e250 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 Date(context, ar
9e260 67 63 2d 31 2c 20 61 72 67 76 2b 31 2c 20 26 78 gc-1, argv+1, &x
9e270 29 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 64 ) ) return;.. d
9e280 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 b = sqlite3_cont
9e290 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f ext_db_handle(co
9e2a0 6e 74 65 78 74 29 3b 0d 0a 20 20 66 6f 72 28 69 ntext);.. for(i
9e2b0 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b 69 5d =0, n=1; zFmt[i]
9e2c0 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0d 0a 20 20 ; i++, n++){..
9e2d0 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 if( zFmt[i]=='
9e2e0 25 27 20 29 7b 0d 0a 20 20 20 20 20 20 73 77 69 %' ){.. swi
9e2f0 74 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29 tch( zFmt[i+1] )
9e300 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 {.. case
9e310 27 64 27 3a 0d 0a 20 20 20 20 20 20 20 20 63 61 'd':.. ca
9e320 73 65 20 27 48 27 3a 0d 0a 20 20 20 20 20 20 20 se 'H':..
9e330 20 63 61 73 65 20 27 6d 27 3a 0d 0a 20 20 20 20 case 'm':..
9e340 20 20 20 20 63 61 73 65 20 27 4d 27 3a 0d 0a 20 case 'M':..
9e350 20 20 20 20 20 20 20 63 61 73 65 20 27 53 27 3a case 'S':
9e360 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 .. case '
9e370 57 27 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 6e W':.. n
9e380 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f ++;.. /
9e390 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0d 0a * fall thru */..
9e3a0 20 20 20 20 20 20 20 20 63 61 73 65 20 27 77 27 case 'w'
9e3b0 3a 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 :.. case
9e3c0 27 25 27 3a 0d 0a 09 09 63 61 73 65 20 27 71 27 '%':....case 'q'
9e3d0 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 :.. bre
9e3e0 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 ak;.. cas
9e3f0 65 20 27 66 27 3a 0d 0a 20 20 20 20 20 20 20 20 e 'f':..
9e400 20 20 6e 20 2b 3d 20 38 3b 0d 0a 20 20 20 20 20 n += 8;..
9e410 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 break;..
9e420 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a 0d 0a case 'j':..
9e430 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 33 n += 3
9e440 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 ;.. bre
9e450 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 ak;.. cas
9e460 65 20 27 59 27 3a 0d 0a 20 20 20 20 20 20 20 20 e 'Y':..
9e470 20 20 6e 20 2b 3d 20 38 3b 0d 0a 20 20 20 20 20 n += 8;..
9e480 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 break;..
9e490 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 0d 0a case 's':..
9e4a0 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 case 'J'
9e4b0 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b :.. n +
9e4c0 3d 20 35 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 = 50;..
9e4d0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 break;..
9e4e0 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 default:..
9e4f0 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a return; /*
9e500 20 45 52 52 4f 52 2e 20 20 72 65 74 75 72 6e 20 ERROR. return
9e510 61 20 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 20 20 20 a NULL */..
9e520 20 7d 0d 0a 20 20 20 20 20 20 69 2b 2b 3b 0d 0a }.. i++;..
9e530 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 74 65 }.. }.. te
9e540 73 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65 6f stcase( n==sizeo
9e550 66 28 7a 42 75 66 29 2d 31 20 29 3b 0d 0a 20 20 f(zBuf)-1 );..
9e560 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a testcase( n==siz
9e570 65 6f 66 28 7a 42 75 66 29 20 29 3b 0d 0a 20 20 eof(zBuf) );..
9e580 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 28 75 36 testcase( n==(u6
9e590 34 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 4)db->aLimit[SQL
9e5a0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 ITE_LIMIT_LENGTH
9e5b0 5d 2b 31 20 29 3b 0d 0a 20 20 74 65 73 74 63 61 ]+1 );.. testca
9e5c0 73 65 28 20 6e 3d 3d 28 75 36 34 29 64 62 2d 3e se( n==(u64)db->
9e5d0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 aLimit[SQLITE_LI
9e5e0 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0d 0a MIT_LENGTH] );..
9e5f0 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a if( n<sizeof(z
9e600 42 75 66 29 20 29 7b 0d 0a 20 20 20 20 7a 20 3d Buf) ){.. z =
9e610 20 7a 42 75 66 3b 0d 0a 20 20 7d 65 6c 73 65 20 zBuf;.. }else
9e620 69 66 28 20 6e 3e 28 75 36 34 29 64 62 2d 3e 61 if( n>(u64)db->a
9e630 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d Limit[SQLITE_LIM
9e640 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0d 0a 20 IT_LENGTH] ){..
9e650 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c sqlite3_resul
9e660 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 t_error_toobig(c
9e670 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 72 65 ontext);.. re
9e680 74 75 72 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d turn;.. }else{.
9e690 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 . z = sqlite3
9e6a0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 DbMallocRaw(db,
9e6b0 28 69 6e 74 29 6e 29 3b 0d 0a 20 20 20 20 69 66 (int)n);.. if
9e6c0 28 20 7a 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 ( z==0 ){..
9e6d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f sqlite3_result_
9e6e0 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 error_nomem(cont
9e6f0 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 ext);.. ret
9e700 75 72 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d urn;.. }.. }
9e710 0d 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 .. computeJD(&x
9e720 29 3b 0d 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 );.. computeYMD
9e730 5f 48 4d 53 28 26 78 29 3b 0d 0a 20 20 66 6f 72 _HMS(&x);.. for
9e740 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d 3b (i=j=0; zFmt[i];
9e750 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 i++){.. if(
9e760 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0d zFmt[i]!='%' ){.
9e770 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 . z[j++] =
9e780 7a 46 6d 74 5b 69 5d 3b 0d 0a 20 20 20 20 7d 65 zFmt[i];.. }e
9e790 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 2b 2b 3b lse{.. i++;
9e7a0 0d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 .. switch(
9e7b0 7a 46 6d 74 5b 69 5d 20 29 7b 0d 0a 20 20 20 20 zFmt[i] ){..
9e7c0 20 20 20 20 63 61 73 65 20 27 64 27 3a 20 20 73 case 'd': s
9e7d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
9e7e0 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 3, &z[j],"%02d",
9e7f0 78 2e 44 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 x.D); j+=2; brea
9e800 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 k;.. case
9e810 20 27 66 27 3a 20 7b 0d 0a 20 20 20 20 20 20 20 'f': {..
9e820 20 20 20 64 6f 75 62 6c 65 20 73 20 3d 20 78 2e double s = x.
9e830 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 s;.. if
9e840 28 20 73 3e 35 39 2e 39 39 39 20 29 20 73 20 3d ( s>59.999 ) s =
9e850 20 35 39 2e 39 39 39 3b 0d 0a 20 20 20 20 20 20 59.999;..
9e860 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
9e870 69 6e 74 66 28 37 2c 20 26 7a 5b 6a 5d 2c 22 25 intf(7, &z[j],"%
9e880 30 36 2e 33 66 22 2c 20 73 29 3b 0d 0a 20 20 20 06.3f", s);..
9e890 20 20 20 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 j += sqli
9e8a0 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a te3Strlen30(&z[j
9e8b0 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 ]);.. b
9e8c0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d reak;.. }
9e8d0 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 .. case '
9e8e0 48 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 H': sqlite3_snp
9e8f0 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 rintf(3, &z[j],"
9e900 25 30 32 64 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32 %02d",x.h); j+=2
9e910 3b 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 ; break;..
9e920 20 20 63 61 73 65 20 27 57 27 3a 20 2f 2a 20 46 case 'W': /* F
9e930 61 6c 6c 20 74 68 72 75 20 2a 2f 0d 0a 20 20 20 all thru */..
9e940 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a 20 7b case 'j': {
9e950 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 .. int
9e960 6e 44 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 nDay;
9e970 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 /* Number of d
9e980 61 79 73 20 73 69 6e 63 65 20 31 73 74 20 64 61 ays since 1st da
9e990 79 20 6f 66 20 79 65 61 72 20 2a 2f 0d 0a 20 20 y of year */..
9e9a0 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 DateTime
9e9b0 20 79 20 3d 20 78 3b 0d 0a 20 20 20 20 20 20 20 y = x;..
9e9c0 20 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 y.validJD = 0
9e9d0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 79 2e 4d ;.. y.M
9e9e0 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 = 1;..
9e9f0 20 79 2e 44 20 3d 20 31 3b 0d 0a 20 20 20 20 20 y.D = 1;..
9ea00 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 computeJD(&
9ea10 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e y);.. n
9ea20 44 61 79 20 3d 20 28 69 6e 74 29 28 28 78 2e 69 Day = (int)((x.i
9ea30 4a 44 2d 79 2e 69 4a 44 2b 34 33 32 30 30 30 30 JD-y.iJD+4320000
9ea40 30 29 2f 38 36 34 30 30 30 30 30 29 3b 0d 0a 20 0)/86400000);..
9ea50 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 6d if( zFm
9ea60 74 5b 69 5d 3d 3d 27 57 27 20 29 7b 0d 0a 20 20 t[i]=='W' ){..
9ea70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 64 int wd
9ea80 3b 20 20 20 2f 2a 20 30 3d 4d 6f 6e 64 61 79 2c ; /* 0=Monday,
9ea90 20 31 3d 54 75 65 73 64 61 79 2c 20 2e 2e 2e 20 1=Tuesday, ...
9eaa0 36 3d 53 75 6e 64 61 79 20 2a 2f 0d 0a 20 20 20 6=Sunday */..
9eab0 20 20 20 20 20 20 20 20 20 77 64 20 3d 20 28 69 wd = (i
9eac0 6e 74 29 28 28 28 78 2e 69 4a 44 2b 34 33 32 30 nt)(((x.iJD+4320
9ead0 30 30 30 30 29 2f 38 36 34 30 30 30 30 30 29 25 0000)/86400000)%
9eae0 37 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 7);..
9eaf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
9eb00 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 f(3, &z[j],"%02d
9eb10 22 2c 28 6e 44 61 79 2b 37 2d 77 64 29 2f 37 29 ",(nDay+7-wd)/7)
9eb20 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a ;.. j
9eb30 20 2b 3d 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 += 2;..
9eb40 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
9eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
9eb60 70 72 69 6e 74 66 28 34 2c 20 26 7a 5b 6a 5d 2c printf(4, &z[j],
9eb70 22 25 30 33 64 22 2c 6e 44 61 79 2b 31 29 3b 0d "%03d",nDay+1);.
9eb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b . j +
9eb90 3d 20 33 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 = 3;..
9eba0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 }.. bre
9ebb0 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a ak;.. }..
9ebc0 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 case 'J'
9ebd0 3a 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 : {.. s
9ebe0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
9ebf0 32 30 2c 20 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67 20, &z[j],"%.16g
9ec00 22 2c 78 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 ",x.iJD/86400000
9ec10 2e 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 .0);..
9ec20 6a 2b 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e j+=sqlite3Strlen
9ec30 33 30 28 26 7a 5b 6a 5d 29 3b 0d 0a 20 20 20 20 30(&z[j]);..
9ec40 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
9ec50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
9ec60 20 63 61 73 65 20 27 6d 27 3a 20 20 73 71 6c 69 case 'm': sqli
9ec70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 te3_snprintf(3,
9ec80 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 4d &z[j],"%02d",x.M
9ec90 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0d ); j+=2; break;.
9eca0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4d . case 'M
9ecb0 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 ': sqlite3_snpr
9ecc0 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 intf(3, &z[j],"%
9ecd0 30 32 64 22 2c 78 2e 6d 29 3b 20 6a 2b 3d 32 3b 02d",x.m); j+=2;
9ece0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 break;..
9ecf0 20 63 61 73 65 20 27 73 27 3a 20 7b 0d 0a 20 20 case 's': {..
9ed00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
9ed10 73 6e 70 72 69 6e 74 66 28 33 30 2c 26 7a 5b 6a snprintf(30,&z[j
9ed20 5d 2c 22 25 6c 6c 64 22 2c 0d 0a 20 20 20 20 20 ],"%lld",..
9ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ed40 20 20 20 20 20 20 28 69 36 34 29 28 78 2e 69 4a (i64)(x.iJ
9ed50 44 2f 31 30 30 30 20 2d 20 32 31 30 38 36 36 37 D/1000 - 2108667
9ed60 36 2a 28 69 36 34 29 31 30 30 30 30 29 29 3b 0d 6*(i64)10000));.
9ed70 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 . j +=
9ed80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
9ed90 26 7a 5b 6a 5d 29 3b 0d 0a 20 20 20 20 20 20 20 &z[j]);..
9eda0 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 break;..
9edb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 }.. ca
9edc0 73 65 20 27 53 27 3a 20 20 73 71 6c 69 74 65 33 se 'S': sqlite3
9edd0 5f 73 6e 70 72 69 6e 74 66 28 33 2c 26 7a 5b 6a _snprintf(3,&z[j
9ede0 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74 29 78 2e ],"%02d",(int)x.
9edf0 73 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b s); j+=2; break;
9ee00 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 .. case '
9ee10 77 27 3a 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 w': {..
9ee20 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 z[j++] = (char)
9ee30 28 28 28 78 2e 69 4a 44 2b 31 32 39 36 30 30 30 (((x.iJD+1296000
9ee40 30 30 29 2f 38 36 34 30 30 30 30 30 29 20 25 20 00)/86400000) %
9ee50 37 29 20 2b 20 27 30 27 3b 0d 0a 20 20 20 20 20 7) + '0';..
9ee60 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 break;..
9ee70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
9ee80 63 61 73 65 20 27 71 27 3a 20 7b 0d 0a 20 20 20 case 'q': {..
9ee90 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 z[j++] =
9eea0 28 63 68 61 72 29 28 28 78 2e 4d 20 2d 20 31 29 (char)((x.M - 1)
9eeb0 20 2f 20 33 29 20 2b 20 27 31 27 3b 0d 0a 20 20 / 3) + '1';..
9eec0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a break;..
9eed0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 }....
9eee0 20 20 20 20 20 63 61 73 65 20 27 59 27 3a 20 7b case 'Y': {
9eef0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 .. sqli
9ef00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 2c 26 te3_snprintf(5,&
9ef10 7a 5b 6a 5d 2c 22 25 30 34 64 22 2c 78 2e 59 29 z[j],"%04d",x.Y)
9ef20 3b 20 6a 2b 3d 73 71 6c 69 74 65 33 53 74 72 6c ; j+=sqlite3Strl
9ef30 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0d 0a 20 20 en30(&z[j]);..
9ef40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a break;..
9ef50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
9ef60 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 7a 5b default: z[
9ef70 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20 62 72 65 61 j++] = '%'; brea
9ef80 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 k;.. }..
9ef90 20 7d 0d 0a 20 20 7d 0d 0a 20 20 7a 5b 6a 5d 20 }.. }.. z[j]
9efa0 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f = 0;.. sqlite3_
9efb0 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 result_text(cont
9efc0 65 78 74 2c 20 7a 2c 20 2d 31 2c 0d 0a 20 20 20 ext, z, -1,..
9efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9efe0 20 20 20 7a 3d 3d 7a 42 75 66 20 3f 20 53 51 4c z==zBuf ? SQL
9eff0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 ITE_TRANSIENT :
9f000 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b SQLITE_DYNAMIC);
9f010 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 63 75 ..}..../*..** cu
9f020 72 72 65 6e 74 5f 74 69 6d 65 28 29 0d 0a 2a 2a rrent_time()..**
9f030 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
9f040 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 on returns the s
9f050 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 69 6d ame value as tim
9f060 65 28 27 6e 6f 77 27 29 2e 0d 0a 2a 2f 0d 0a 73 e('now')...*/..s
9f070 74 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d 65 tatic void ctime
9f080 46 75 6e 63 28 0d 0a 20 20 73 71 6c 69 74 65 33 Func(.. sqlite3
9f090 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 _context *contex
9f0a0 74 2c 0d 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 t,.. int NotUse
9f0b0 64 2c 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 d,.. sqlite3_va
9f0c0 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0d 0a lue **NotUsed2..
9f0d0 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 ){.. UNUSED_PAR
9f0e0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c AMETER2(NotUsed,
9f0f0 20 4e 6f 74 55 73 65 64 32 29 3b 0d 0a 20 20 74 NotUsed2);.. t
9f100 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c imeFunc(context,
9f110 20 30 2c 20 30 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0, 0);..}..../*
9f120 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 64 61 74 ..** current_dat
9f130 65 28 29 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 e()..**..** This
9f140 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
9f150 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 s the same value
9f160 20 61 73 20 64 61 74 65 28 27 6e 6f 77 27 29 2e as date('now').
9f170 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
9f180 64 20 63 64 61 74 65 46 75 6e 63 28 0d 0a 20 20 d cdateFunc(..
9f190 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 sqlite3_context
9f1a0 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 69 6e 74 *context,.. int
9f1b0 20 4e 6f 74 55 73 65 64 2c 0d 0a 20 20 73 71 6c NotUsed,.. sql
9f1c0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 ite3_value **Not
9f1d0 55 73 65 64 32 0d 0a 29 7b 0d 0a 20 20 55 4e 55 Used2..){.. UNU
9f1e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e SED_PARAMETER2(N
9f1f0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 otUsed, NotUsed2
9f200 29 3b 0d 0a 20 20 64 61 74 65 46 75 6e 63 28 63 );.. dateFunc(c
9f210 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29 3b 0d 0a ontext, 0, 0);..
9f220 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 63 75 72 72 }..../*..** curr
9f230 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29 0d ent_timestamp().
9f240 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e .**..** This fun
9f250 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 ction returns th
9f260 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 e same value as
9f270 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 2e datetime('now').
9f280 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
9f290 64 20 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 d ctimestampFunc
9f2a0 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e (.. sqlite3_con
9f2b0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0d 0a text *context,..
9f2c0 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0d 0a int NotUsed,..
9f2d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 sqlite3_value
9f2e0 2a 2a 4e 6f 74 55 73 65 64 32 0d 0a 29 7b 0d 0a **NotUsed2..){..
9f2f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
9f300 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 ER2(NotUsed, Not
9f310 55 73 65 64 32 29 3b 0d 0a 20 20 64 61 74 65 74 Used2);.. datet
9f320 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c imeFunc(context,
9f330 20 30 2c 20 30 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 0, 0);..}..#end
9f340 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 if /* !defined(S
9f350 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 QLITE_OMIT_DATET
9f360 49 4d 45 5f 46 55 4e 43 53 29 20 2a 2f 0d 0a 0d IME_FUNCS) */...
9f370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
9f380 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e MIT_DATETIME_FUN
9f390 43 53 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 CS../*..** If th
9f3a0 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d e library is com
9f3b0 70 69 6c 65 64 20 74 6f 20 6f 6d 69 74 20 74 68 piled to omit th
9f3c0 65 20 66 75 6c 6c 2d 73 63 61 6c 65 20 64 61 74 e full-scale dat
9f3d0 65 20 61 6e 64 20 74 69 6d 65 0d 0a 2a 2a 20 68 e and time..** h
9f3e0 61 6e 64 6c 69 6e 67 20 28 74 6f 20 67 65 74 20 andling (to get
9f3f0 61 20 73 6d 61 6c 6c 65 72 20 62 69 6e 61 72 79 a smaller binary
9f400 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ), the following
9f410 20 6d 69 6e 69 6d 61 6c 20 76 65 72 73 69 6f 6e minimal version
9f420 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 75 6e 63 ..** of the func
9f430 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 5f 74 69 tions current_ti
9f440 6d 65 28 29 2c 20 63 75 72 72 65 6e 74 5f 64 61 me(), current_da
9f450 74 65 28 29 20 61 6e 64 20 63 75 72 72 65 6e 74 te() and current
9f460 5f 74 69 6d 65 73 74 61 6d 70 28 29 0d 0a 2a 2a _timestamp()..**
9f470 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e are included in
9f480 73 74 65 61 64 2e 20 54 68 69 73 20 69 73 20 74 stead. This is t
9f490 6f 20 73 75 70 70 6f 72 74 20 63 6f 6c 75 6d 6e o support column
9f4a0 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 74 68 declarations th
9f4b0 61 74 0d 0a 2a 2a 20 69 6e 63 6c 75 64 65 20 22 at..** include "
9f4c0 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54 5f DEFAULT CURRENT_
9f4d0 54 49 4d 45 22 20 65 74 63 2e 0d 0a 2a 2a 0d 0a TIME" etc...**..
9f4e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
9f4f0 20 75 73 65 73 20 74 68 65 20 43 2d 6c 69 62 72 uses the C-libr
9f500 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 74 69 ary functions ti
9f510 6d 65 28 29 2c 20 67 6d 74 69 6d 65 28 29 0d 0a me(), gmtime()..
9f520 2a 2a 20 61 6e 64 20 73 74 72 66 74 69 6d 65 28 ** and strftime(
9f530 29 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 ). The format st
9f540 72 69 6e 67 20 74 6f 20 70 61 73 73 20 74 6f 20 ring to pass to
9f550 73 74 72 66 74 69 6d 65 28 29 20 69 73 20 73 75 strftime() is su
9f560 70 70 6c 69 65 64 0d 0a 2a 2a 20 61 73 20 74 68 pplied..** as th
9f570 65 20 75 73 65 72 2d 64 61 74 61 20 66 6f 72 20 e user-data for
9f580 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a the function...*
9f590 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 /..static void c
9f5a0 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 28 0d urrentTimeFunc(.
9f5b0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 . sqlite3_conte
9f5c0 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 xt *context,..
9f5d0 69 6e 74 20 61 72 67 63 2c 0d 0a 20 20 73 71 6c int argc,.. sql
9f5e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 ite3_value **arg
9f5f0 76 0d 0a 29 7b 0d 0a 20 20 74 69 6d 65 5f 74 20 v..){.. time_t
9f600 74 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 t;.. char *zFor
9f610 6d 61 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 mat = (char *)sq
9f620 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 lite3_user_data(
9f630 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 73 71 6c context);.. sql
9f640 69 74 65 33 20 2a 64 62 3b 0d 0a 20 20 73 71 6c ite3 *db;.. sql
9f650 69 74 65 33 5f 69 6e 74 36 34 20 69 54 3b 0d 0a ite3_int64 iT;..
9f660 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d struct tm *pTm
9f670 3b 0d 0a 20 20 73 74 72 75 63 74 20 74 6d 20 73 ;.. struct tm s
9f680 4e 6f 77 3b 0d 0a 20 20 63 68 61 72 20 7a 42 75 Now;.. char zBu
9f690 66 5b 32 30 5d 3b 0d 0a 0d 0a 20 20 55 4e 55 53 f[20];.... UNUS
9f6a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 ED_PARAMETER(arg
9f6b0 63 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 c);.. UNUSED_PA
9f6c0 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0d 0a RAMETER(argv);..
9f6d0 0d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 .. db = sqlite3
9f6e0 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 _context_db_hand
9f6f0 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 le(context);..
9f700 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 75 72 if( sqlite3OsCur
9f710 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 64 62 rentTimeInt64(db
9f720 2d 3e 70 56 66 73 2c 20 26 69 54 29 20 29 20 72 ->pVfs, &iT) ) r
9f730 65 74 75 72 6e 3b 0d 0a 20 20 74 20 3d 20 69 54 eturn;.. t = iT
9f740 2f 31 30 30 30 20 2d 20 31 30 30 30 30 2a 28 73 /1000 - 10000*(s
9f750 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 31 30 qlite3_int64)210
9f760 38 36 36 37 36 3b 0d 0a 23 69 66 64 65 66 20 48 86676;..#ifdef H
9f770 41 56 45 5f 47 4d 54 49 4d 45 5f 52 0d 0a 20 20 AVE_GMTIME_R..
9f780 70 54 6d 20 3d 20 67 6d 74 69 6d 65 5f 72 28 26 pTm = gmtime_r(&
9f790 74 2c 20 26 73 4e 6f 77 29 3b 0d 0a 23 65 6c 73 t, &sNow);..#els
9f7a0 65 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 e.. sqlite3_mut
9f7b0 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 ex_enter(sqlite3
9f7c0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 MutexAlloc(SQLIT
9f7d0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d E_MUTEX_STATIC_M
9f7e0 41 53 54 45 52 29 29 3b 0d 0a 20 20 70 54 6d 20 ASTER));.. pTm
9f7f0 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0d 0a 20 = gmtime(&t);..
9f800 20 69 66 28 20 70 54 6d 20 29 20 6d 65 6d 63 70 if( pTm ) memcp
9f810 79 28 26 73 4e 6f 77 2c 20 70 54 6d 2c 20 73 69 y(&sNow, pTm, si
9f820 7a 65 6f 66 28 73 4e 6f 77 29 29 3b 0d 0a 20 20 zeof(sNow));..
9f830 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 sqlite3_mutex_le
9f840 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 ave(sqlite3Mutex
9f850 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 Alloc(SQLITE_MUT
9f860 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 EX_STATIC_MASTER
9f870 29 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 ));..#endif.. i
9f880 66 28 20 70 54 6d 20 29 7b 0d 0a 20 20 20 20 73 f( pTm ){.. s
9f890 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 trftime(zBuf, 20
9f8a0 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 73 4e 6f 77 , zFormat, &sNow
9f8b0 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f );.. sqlite3_
9f8c0 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 result_text(cont
9f8d0 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 ext, zBuf, -1, S
9f8e0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 QLITE_TRANSIENT)
9f8f0 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e 64 69 ;.. }..}..#endi
9f900 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 f..../*..** This
9f910 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 function regist
9f920 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 ered all of the
9f930 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e above C function
9f940 73 20 61 73 20 53 51 4c 0d 0a 2a 2a 20 66 75 6e s as SQL..** fun
9f950 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 ctions. This sh
9f960 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 ould be the only
9f970 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 routine in this
9f980 20 66 69 6c 65 20 77 69 74 68 0d 0a 2a 2a 20 65 file with..** e
9f990 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e xternal linkage.
9f9a0 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
9f9b0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
9f9c0 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 3RegisterDateTim
9f9d0 65 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 eFunctions(void)
9f9e0 7b 0d 0a 20 20 73 74 61 74 69 63 20 53 51 4c 49 {.. static SQLI
9f9f0 54 45 5f 57 53 44 20 46 75 6e 63 44 65 66 20 61 TE_WSD FuncDef a
9fa00 44 61 74 65 54 69 6d 65 46 75 6e 63 73 5b 5d 20 DateTimeFuncs[]
9fa10 3d 20 7b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c = {..#ifndef SQL
9fa20 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d ITE_OMIT_DATETIM
9fa30 45 5f 46 55 4e 43 53 0d 0a 20 20 20 20 46 55 4e E_FUNCS.. FUN
9fa40 43 54 49 4f 4e 28 6a 75 6c 69 61 6e 64 61 79 2c CTION(julianday,
9fa50 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 -1, 0, 0
9fa60 2c 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63 20 , juliandayFunc
9fa70 29 2c 0d 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e ),.. FUNCTION
9fa80 28 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 (date,
9fa90 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 64 61 74 -1, 0, 0, dat
9faa0 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0d 0a 20 eFunc ),..
9fab0 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 69 6d 65 FUNCTION(time
9fac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 , -1
9fad0 2c 20 30 2c 20 30 2c 20 74 69 6d 65 46 75 6e 63 , 0, 0, timeFunc
9fae0 20 20 20 20 20 20 29 2c 0d 0a 20 20 20 20 46 55 ),.. FU
9faf0 4e 43 54 49 4f 4e 28 64 61 74 65 74 69 6d 65 2c NCTION(datetime,
9fb00 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 -1, 0,
9fb10 30 2c 20 64 61 74 65 74 69 6d 65 46 75 6e 63 20 0, datetimeFunc
9fb20 20 29 2c 0d 0a 20 20 20 20 46 55 4e 43 54 49 4f ),.. FUNCTIO
9fb30 4e 28 73 74 72 66 74 69 6d 65 2c 20 20 20 20 20 N(strftime,
9fb40 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 73 74 -1, 0, 0, st
9fb50 72 66 74 69 6d 65 46 75 6e 63 20 20 29 2c 0d 0a rftimeFunc ),..
9fb60 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72 FUNCTION(cur
9fb70 72 65 6e 74 5f 74 69 6d 65 2c 20 20 20 20 20 20 rent_time,
9fb80 30 2c 20 30 2c 20 30 2c 20 63 74 69 6d 65 46 75 0, 0, 0, ctimeFu
9fb90 6e 63 20 20 20 20 20 29 2c 0d 0a 20 20 20 20 46 nc ),.. F
9fba0 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f UNCTION(current_
9fbb0 74 69 6d 65 73 74 61 6d 70 2c 20 30 2c 20 30 2c timestamp, 0, 0,
9fbc0 20 30 2c 20 63 74 69 6d 65 73 74 61 6d 70 46 75 0, ctimestampFu
9fbd0 6e 63 29 2c 0d 0a 20 20 20 20 46 55 4e 43 54 49 nc),.. FUNCTI
9fbe0 4f 4e 28 63 75 72 72 65 6e 74 5f 64 61 74 65 2c ON(current_date,
9fbf0 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 0, 0, 0, c
9fc00 64 61 74 65 46 75 6e 63 20 20 20 20 20 29 2c 0d dateFunc ),.
9fc10 0a 23 65 6c 73 65 0d 0a 20 20 20 20 53 54 52 5f .#else.. STR_
9fc20 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74 FUNCTION(current
9fc30 5f 74 69 6d 65 2c 20 20 20 20 20 20 30 2c 20 22 _time, 0, "
9fc40 25 48 3a 25 4d 3a 25 53 22 2c 20 20 20 20 20 20 %H:%M:%S",
9fc50 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 54 69 0, currentTi
9fc60 6d 65 46 75 6e 63 29 2c 0d 0a 20 20 20 20 53 54 meFunc),.. ST
9fc70 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 R_FUNCTION(curre
9fc80 6e 74 5f 64 61 74 65 2c 20 20 20 20 20 20 30 2c nt_date, 0,
9fc90 20 22 25 59 2d 25 6d 2d 25 64 22 2c 20 20 20 20 "%Y-%m-%d",
9fca0 20 20 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 0, current
9fcb0 54 69 6d 65 46 75 6e 63 29 2c 0d 0a 20 20 20 20 TimeFunc),..
9fcc0 53 54 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 STR_FUNCTION(cur
9fcd0 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20 rent_timestamp,
9fce0 30 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 0, "%Y-%m-%d %H:
9fcf0 25 4d 3a 25 53 22 2c 20 30 2c 20 63 75 72 72 65 %M:%S", 0, curre
9fd00 6e 74 54 69 6d 65 46 75 6e 63 29 2c 0d 0a 23 65 ntTimeFunc),..#e
9fd10 6e 64 69 66 0d 0a 20 20 7d 3b 0d 0a 20 20 69 6e ndif.. };.. in
9fd20 74 20 69 3b 0d 0a 20 20 46 75 6e 63 44 65 66 48 t i;.. FuncDefH
9fd30 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c ash *pHash = &GL
9fd40 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 OBAL(FuncDefHash
9fd50 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 , sqlite3GlobalF
9fd60 75 6e 63 74 69 6f 6e 73 29 3b 0d 0a 20 20 46 75 unctions);.. Fu
9fd70 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20 28 ncDef *aFunc = (
9fd80 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41 4c FuncDef*)&GLOBAL
9fd90 28 46 75 6e 63 44 65 66 2c 20 61 44 61 74 65 54 (FuncDef, aDateT
9fda0 69 6d 65 46 75 6e 63 73 29 3b 0d 0a 0d 0a 20 20 imeFuncs);....
9fdb0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 for(i=0; i<Array
9fdc0 53 69 7a 65 28 61 44 61 74 65 54 69 6d 65 46 75 Size(aDateTimeFu
9fdd0 6e 63 73 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 ncs); i++){..
9fde0 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66 49 sqlite3FuncDefI
9fdf0 6e 73 65 72 74 28 70 48 61 73 68 2c 20 26 61 46 nsert(pHash, &aF
9fe00 75 6e 63 5b 69 5d 29 3b 0d 0a 20 20 7d 0d 0a 7d unc[i]);.. }..}
9fe10 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
9fe20 2a 2a 2a 20 45 6e 64 20 6f 66 20 64 61 74 65 2e *** End of date.
9fe30 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a c **************
9fe40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9fe50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9fe60 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
9fe70 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
9fe80 6f 73 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a os.c ***********
9fe90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9fea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9feb0 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
9fec0 35 20 4e 6f 76 65 6d 62 65 72 20 32 39 0d 0a 2a 5 November 29..*
9fed0 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 *..** The author
9fee0 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 disclaims copyr
9fef0 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 ight to this sou
9ff00 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c rce code. In pl
9ff10 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 ace of..** a leg
9ff20 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
9ff30 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a is a blessing:..
9ff40 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f **..** May yo
9ff50 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f u do good and no
9ff60 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d t evil...** M
9ff70 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 ay you find forg
9ff80 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 iveness for your
9ff90 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 self and forgive
9ffa0 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 others...**
9ffb0 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 May you share fr
9ffc0 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 eely, never taki
9ffd0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 ng more than you
9ffe0 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a give...**..****
9fff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a0000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a0010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a0020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a0030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a **********..**..
a0040 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e ** This file con
a0050 74 61 69 6e 73 20 4f 53 20 69 6e 74 65 72 66 61 tains OS interfa
a0060 63 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 ce code that is
a0070 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 0d 0a 2a common to all..*
a0080 2a 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e * architectures.
a0090 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 5f 53 ..*/..#define _S
a00a0 51 4c 49 54 45 5f 4f 53 5f 43 5f 20 31 0d 0a 23 QLITE_OS_C_ 1..#
a00b0 75 6e 64 65 66 20 5f 53 51 4c 49 54 45 5f 4f 53 undef _SQLITE_OS
a00c0 5f 43 5f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 _C_..../*..** Th
a00d0 65 20 64 65 66 61 75 6c 74 20 53 51 4c 69 74 65 e default SQLite
a00e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6d 70 sqlite3_vfs imp
a00f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 64 6f 20 lementations do
a0100 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 0d 0a 2a 2a not allocate..**
a0110 20 6d 65 6d 6f 72 79 20 28 61 63 74 75 61 6c 6c memory (actuall
a0120 79 2c 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6c 6c y, os_unix.c all
a0130 6f 63 61 74 65 73 20 61 20 73 6d 61 6c 6c 20 61 ocates a small a
a0140 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0d mount of memory.
a0150 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 .** from within
a0160 4f 73 4f 70 65 6e 28 29 29 2c 20 62 75 74 20 73 OsOpen()), but s
a0170 6f 6d 65 20 74 68 69 72 64 2d 70 61 72 74 79 20 ome third-party
a0180 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 implementations
a0190 6d 61 79 2e 0d 0a 2a 2a 20 53 6f 20 77 65 20 74 may...** So we t
a01a0 65 73 74 20 74 68 65 20 65 66 66 65 63 74 73 20 est the effects
a01b0 6f 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 of a malloc() fa
a01c0 69 6c 69 6e 67 20 61 6e 64 20 74 68 65 20 73 71 iling and the sq
a01d0 6c 69 74 65 33 4f 73 58 58 58 28 29 0d 0a 2a 2a lite3OsXXX()..**
a01e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
a01f0 69 6e 67 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 ing SQLITE_IOERR
a0200 5f 4e 4f 4d 45 4d 20 75 73 69 6e 67 20 74 68 65 _NOMEM using the
a0210 20 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 DO_OS_MALLOC_TE
a0220 53 54 20 6d 61 63 72 6f 2e 0d 0a 2a 2a 0d 0a 2a ST macro...**..*
a0230 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
a0240 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e functions are in
a0250 73 74 72 75 6d 65 6e 74 65 64 20 66 6f 72 20 6d strumented for m
a0260 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 alloc() failure
a0270 0d 0a 2a 2a 20 74 65 73 74 69 6e 67 3a 0d 0a 2a ..** testing:..*
a0280 2a 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 *..** sqlite
a0290 33 4f 73 52 65 61 64 28 29 0d 0a 2a 2a 20 20 20 3OsRead()..**
a02a0 20 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 sqlite3OsWrite
a02b0 28 29 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 ()..** sqlit
a02c0 65 33 4f 73 53 79 6e 63 28 29 0d 0a 2a 2a 20 20 e3OsSync()..**
a02d0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 sqlite3OsFile
a02e0 53 69 7a 65 28 29 0d 0a 2a 2a 20 20 20 20 20 73 Size()..** s
a02f0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 0d 0a qlite3OsLock()..
a0300 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 ** sqlite3Os
a0310 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
a0320 6b 28 29 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 k()..** sqli
a0330 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c te3OsFileControl
a0340 28 29 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 ()..** sqlit
a0350 65 33 4f 73 53 68 6d 4d 61 70 28 29 0d 0a 2a 2a e3OsShmMap()..**
a0360 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 sqlite3OsOp
a0370 65 6e 28 29 0d 0a 2a 2a 20 20 20 20 20 73 71 6c en()..** sql
a0380 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 0d 0a ite3OsDelete()..
a0390 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 ** sqlite3Os
a03a0 41 63 63 65 73 73 28 29 0d 0a 2a 2a 20 20 20 20 Access()..**
a03b0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 sqlite3OsFullPa
a03c0 74 68 6e 61 6d 65 28 29 0d 0a 2a 2a 0d 0a 2a 2f thname()..**..*/
a03d0 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
a03e0 4c 49 54 45 5f 54 45 53 54 29 0d 0a 53 51 4c 49 LITE_TEST)..SQLI
a03f0 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
a0400 65 33 5f 6d 65 6d 64 65 62 75 67 5f 76 66 73 5f e3_memdebug_vfs_
a0410 6f 6f 6d 5f 74 65 73 74 20 3d 20 31 3b 0d 0a 20 oom_test = 1;..
a0420 20 23 64 65 66 69 6e 65 20 44 4f 5f 4f 53 5f 4d #define DO_OS_M
a0430 41 4c 4c 4f 43 5f 54 45 53 54 28 78 29 20 20 20 ALLOC_TEST(x)
a0440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0460 20 20 20 20 5c 0d 0a 20 20 69 66 20 28 73 71 6c \.. if (sql
a0470 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 76 66 ite3_memdebug_vf
a0480 73 5f 6f 6f 6d 5f 74 65 73 74 20 26 26 20 28 21 s_oom_test && (!
a0490 78 20 7c 7c 20 21 73 71 6c 69 74 65 33 49 73 4d x || !sqlite3IsM
a04a0 65 6d 4a 6f 75 72 6e 61 6c 28 78 29 29 29 20 7b emJournal(x))) {
a04b0 20 20 5c 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70 \.. void *p
a04c0 54 73 74 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 TstAlloc = sqlit
a04d0 65 33 4d 61 6c 6c 6f 63 28 31 30 29 3b 20 20 20 e3Malloc(10);
a04e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a04f0 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 \..
a0500 20 69 66 20 28 21 70 54 73 74 41 6c 6c 6f 63 29 if (!pTstAlloc)
a0510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
a0520 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20 OERR_NOMEM;
a0530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0540 20 20 5c 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 \.. sqlite3
a0550 5f 66 72 65 65 28 70 54 73 74 41 6c 6c 6f 63 29 _free(pTstAlloc)
a0560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
a0570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0580 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 7d \.. }
a0590 0d 0a 23 65 6c 73 65 0d 0a 20 20 23 64 65 66 69 ..#else.. #defi
a05a0 6e 65 20 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f ne DO_OS_MALLOC_
a05b0 54 45 53 54 28 78 29 0d 0a 23 65 6e 64 69 66 0d TEST(x)..#endif.
a05c0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f .../*..** The fo
a05d0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 llowing routines
a05e0 20 61 72 65 20 63 6f 6e 76 65 6e 69 65 6e 63 65 are convenience
a05f0 20 77 72 61 70 70 65 72 73 20 61 72 6f 75 6e 64 wrappers around
a0600 20 6d 65 74 68 6f 64 73 0d 0a 2a 2a 20 6f 66 20 methods..** of
a0610 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 the sqlite3_file
a0620 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 object. This i
a0630 73 20 6d 6f 73 74 6c 79 20 6a 75 73 74 20 73 79 s mostly just sy
a0640 6e 74 61 63 74 69 63 20 73 75 67 61 72 2e 20 41 ntactic sugar. A
a0650 6c 6c 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 77 ll..** of this w
a0660 6f 75 6c 64 20 62 65 20 63 6f 6d 70 6c 65 74 65 ould be complete
a0670 6c 79 20 61 75 74 6f 6d 61 74 69 63 20 69 66 20 ly automatic if
a0680 53 51 4c 69 74 65 20 77 65 72 65 20 63 6f 64 65 SQLite were code
a0690 64 20 75 73 69 6e 67 0d 0a 2a 2a 20 43 2b 2b 20 d using..** C++
a06a0 69 6e 73 74 65 61 64 20 6f 66 20 70 6c 61 69 6e instead of plain
a06b0 20 6f 6c 64 20 43 2e 0d 0a 2a 2f 0d 0a 53 51 4c old C...*/..SQL
a06c0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
a06d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 73 sqlite3OsClose(s
a06e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 qlite3_file *pId
a06f0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 ){.. int rc = S
a0700 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 QLITE_OK;.. if(
a0710 20 70 49 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 pId->pMethods )
a0720 7b 0d 0a 20 20 20 20 72 63 20 3d 20 70 49 64 2d {.. rc = pId-
a0730 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 >pMethods->xClos
a0740 65 28 70 49 64 29 3b 0d 0a 20 20 20 20 70 49 64 e(pId);.. pId
a0750 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 30 3b 0d ->pMethods = 0;.
a0760 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
a0770 63 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 c;..}..SQLITE_PR
a0780 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
a0790 33 4f 73 52 65 61 64 28 73 71 6c 69 74 65 33 5f 3OsRead(sqlite3_
a07a0 66 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a file *id, void *
a07b0 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 2c 20 69 pBuf, int amt, i
a07c0 36 34 20 6f 66 66 73 65 74 29 7b 0d 0a 20 20 44 64 offset){.. D
a07d0 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 O_OS_MALLOC_TEST
a07e0 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 (id);.. return
a07f0 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 id->pMethods->xR
a0800 65 61 64 28 69 64 2c 20 70 42 75 66 2c 20 61 6d ead(id, pBuf, am
a0810 74 2c 20 6f 66 66 73 65 74 29 3b 0d 0a 7d 0d 0a t, offset);..}..
a0820 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
a0830 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 nt sqlite3OsWrit
a0840 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a e(sqlite3_file *
a0850 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a id, const void *
a0860 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 2c 20 69 pBuf, int amt, i
a0870 36 34 20 6f 66 66 73 65 74 29 7b 0d 0a 20 20 44 64 offset){.. D
a0880 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 O_OS_MALLOC_TEST
a0890 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 (id);.. return
a08a0 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 id->pMethods->xW
a08b0 72 69 74 65 28 69 64 2c 20 70 42 75 66 2c 20 61 rite(id, pBuf, a
a08c0 6d 74 2c 20 6f 66 66 73 65 74 29 3b 0d 0a 7d 0d mt, offset);..}.
a08d0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
a08e0 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72 75 int sqlite3OsTru
a08f0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 ncate(sqlite3_fi
a0900 6c 65 20 2a 69 64 2c 20 69 36 34 20 73 69 7a 65 le *id, i64 size
a0910 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 69 64 2d ){.. return id-
a0920 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e >pMethods->xTrun
a0930 63 61 74 65 28 69 64 2c 20 73 69 7a 65 29 3b 0d cate(id, size);.
a0940 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 .}..SQLITE_PRIVA
a0950 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 TE int sqlite3Os
a0960 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c Sync(sqlite3_fil
a0970 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 e *id, int flags
a0980 29 7b 0d 0a 20 20 44 4f 5f 4f 53 5f 4d 41 4c 4c ){.. DO_OS_MALL
a0990 4f 43 5f 54 45 53 54 28 69 64 29 3b 0d 0a 20 20 OC_TEST(id);..
a09a0 72 65 74 75 72 6e 20 69 64 2d 3e 70 4d 65 74 68 return id->pMeth
a09b0 6f 64 73 2d 3e 78 53 79 6e 63 28 69 64 2c 20 66 ods->xSync(id, f
a09c0 6c 61 67 73 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 lags);..}..SQLIT
a09d0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
a09e0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 lite3OsFileSize(
a09f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
a0a00 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0d 0a , i64 *pSize){..
a0a10 20 20 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 DO_OS_MALLOC_T
a0a20 45 53 54 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 EST(id);.. retu
a0a30 72 6e 20 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d rn id->pMethods-
a0a40 3e 78 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 70 >xFileSize(id, p
a0a50 53 69 7a 65 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 Size);..}..SQLIT
a0a60 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
a0a70 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 73 71 6c 69 lite3OsLock(sqli
a0a80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e te3_file *id, in
a0a90 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0d 0a 20 20 t lockType){..
a0aa0 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 DO_OS_MALLOC_TES
a0ab0 54 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e T(id);.. return
a0ac0 20 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 id->pMethods->x
a0ad0 4c 6f 63 6b 28 69 64 2c 20 6c 6f 63 6b 54 79 70 Lock(id, lockTyp
a0ae0 65 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 e);..}..SQLITE_P
a0af0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
a0b00 65 33 4f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 e3OsUnlock(sqlit
a0b10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 e3_file *id, int
a0b20 20 6c 6f 63 6b 54 79 70 65 29 7b 0d 0a 20 20 72 lockType){.. r
a0b30 65 74 75 72 6e 20 69 64 2d 3e 70 4d 65 74 68 6f eturn id->pMetho
a0b40 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 ds->xUnlock(id,
a0b50 6c 6f 63 6b 54 79 70 65 29 3b 0d 0a 7d 0d 0a 53 lockType);..}..S
a0b60 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
a0b70 74 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b t sqlite3OsCheck
a0b80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c ReservedLock(sql
a0b90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
a0ba0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0d 0a 20 nt *pResOut){..
a0bb0 20 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 DO_OS_MALLOC_TE
a0bc0 53 54 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 72 ST(id);.. retur
a0bd0 6e 20 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e n id->pMethods->
a0be0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f xCheckReservedLo
a0bf0 63 6b 28 69 64 2c 20 70 52 65 73 4f 75 74 29 3b ck(id, pResOut);
a0c00 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 73 ..}..../*..** Us
a0c10 65 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 e sqlite3OsFileC
a0c20 6f 6e 74 72 6f 6c 28 29 20 77 68 65 6e 20 77 65 ontrol() when we
a0c30 20 61 72 65 20 64 6f 69 6e 67 20 73 6f 6d 65 74 are doing somet
a0c40 68 69 6e 67 20 74 68 61 74 20 6d 69 67 68 74 20 hing that might
a0c50 66 61 69 6c 0d 0a 2a 2a 20 61 6e 64 20 77 65 20 fail..** and we
a0c60 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 61 62 6f need to know abo
a0c70 75 74 20 74 68 65 20 66 61 69 6c 75 72 65 73 2e ut the failures.
a0c80 20 20 55 73 65 20 73 71 6c 69 74 65 33 4f 73 46 Use sqlite3OsF
a0c90 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 29 ileControlHint()
a0ca0 0d 0a 2a 2a 20 77 68 65 6e 20 73 69 6d 70 6c 79 ..** when simply
a0cb0 20 74 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 tossing informa
a0cc0 74 69 6f 6e 20 6f 76 65 72 20 74 68 65 20 77 61 tion over the wa
a0cd0 6c 6c 20 74 6f 20 74 68 65 20 56 46 53 20 61 6e ll to the VFS an
a0ce0 64 20 77 65 20 64 6f 20 6e 6f 74 0d 0a 2a 2a 20 d we do not..**
a0cf0 72 65 61 6c 6c 79 20 63 61 72 65 20 69 66 20 74 really care if t
a0d00 68 65 20 56 46 53 20 72 65 63 65 69 76 65 73 20 he VFS receives
a0d10 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64 73 20 and understands
a0d20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 the information
a0d30 73 69 6e 63 65 20 69 74 0d 0a 2a 2a 20 69 73 20 since it..** is
a0d40 6f 6e 6c 79 20 61 20 68 69 6e 74 20 61 6e 64 20 only a hint and
a0d50 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 69 67 can be safely ig
a0d60 6e 6f 72 65 64 2e 20 20 54 68 65 20 73 71 6c 69 nored. The sqli
a0d70 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c te3OsFileControl
a0d80 48 69 6e 74 28 29 0d 0a 2a 2a 20 72 6f 75 74 69 Hint()..** routi
a0d90 6e 65 20 68 61 73 20 6e 6f 20 72 65 74 75 72 6e ne has no return
a0da0 20 76 61 6c 75 65 20 73 69 6e 63 65 20 74 68 65 value since the
a0db0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 6f return value wo
a0dc0 75 6c 64 20 62 65 20 6d 65 61 6e 69 6e 67 6c 65 uld be meaningle
a0dd0 73 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ss...*/..SQLITE_
a0de0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
a0df0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c te3OsFileControl
a0e00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
a0e10 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 d, int op, void
a0e20 2a 70 41 72 67 29 7b 0d 0a 20 20 44 4f 5f 4f 53 *pArg){.. DO_OS
a0e30 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 28 69 64 29 _MALLOC_TEST(id)
a0e40 3b 0d 0a 20 20 72 65 74 75 72 6e 20 69 64 2d 3e ;.. return id->
a0e50 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 pMethods->xFileC
a0e60 6f 6e 74 72 6f 6c 28 69 64 2c 20 6f 70 2c 20 70 ontrol(id, op, p
a0e70 41 72 67 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 Arg);..}..SQLITE
a0e80 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
a0e90 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 lite3OsFileContr
a0ea0 6f 6c 48 69 6e 74 28 73 71 6c 69 74 65 33 5f 66 olHint(sqlite3_f
a0eb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c ile *id, int op,
a0ec0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0d 0a 20 void *pArg){..
a0ed0 20 28 76 6f 69 64 29 69 64 2d 3e 70 4d 65 74 68 (void)id->pMeth
a0ee0 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f ods->xFileContro
a0ef0 6c 28 69 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b l(id, op, pArg);
a0f00 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 ..}....SQLITE_PR
a0f10 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
a0f20 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 73 71 3OsSectorSize(sq
a0f30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b lite3_file *id){
a0f40 0d 0a 20 20 69 6e 74 20 28 2a 78 53 65 63 74 6f .. int (*xSecto
a0f50 72 53 69 7a 65 29 28 73 71 6c 69 74 65 33 5f 66 rSize)(sqlite3_f
a0f60 69 6c 65 2a 29 20 3d 20 69 64 2d 3e 70 4d 65 74 ile*) = id->pMet
a0f70 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a hods->xSectorSiz
a0f80 65 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 78 53 e;.. return (xS
a0f90 65 63 74 6f 72 53 69 7a 65 20 3f 20 78 53 65 63 ectorSize ? xSec
a0fa0 74 6f 72 53 69 7a 65 28 69 64 29 20 3a 20 53 51 torSize(id) : SQ
a0fb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 LITE_DEFAULT_SEC
a0fc0 54 4f 52 5f 53 49 5a 45 29 3b 0d 0a 7d 0d 0a 53 TOR_SIZE);..}..S
a0fd0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
a0fe0 74 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 t sqlite3OsDevic
a0ff0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 eCharacteristics
a1000 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
a1010 64 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 69 64 d){.. return id
a1020 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 ->pMethods->xDev
a1030 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 iceCharacteristi
a1040 63 73 28 69 64 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 cs(id);..}..SQLI
a1050 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
a1060 71 6c 69 74 65 33 4f 73 53 68 6d 4c 6f 63 6b 28 qlite3OsShmLock(
a1070 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
a1080 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e , int offset, in
a1090 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b t n, int flags){
a10a0 0d 0a 20 20 72 65 74 75 72 6e 20 69 64 2d 3e 70 .. return id->p
a10b0 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 Methods->xShmLoc
a10c0 6b 28 69 64 2c 20 6f 66 66 73 65 74 2c 20 6e 2c k(id, offset, n,
a10d0 20 66 6c 61 67 73 29 3b 0d 0a 7d 0d 0a 53 51 4c flags);..}..SQL
a10e0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
a10f0 20 73 71 6c 69 74 65 33 4f 73 53 68 6d 42 61 72 sqlite3OsShmBar
a1100 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69 6c rier(sqlite3_fil
a1110 65 20 2a 69 64 29 7b 0d 0a 20 20 69 64 2d 3e 70 e *id){.. id->p
a1120 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72 Methods->xShmBar
a1130 72 69 65 72 28 69 64 29 3b 0d 0a 7d 0d 0a 53 51 rier(id);..}..SQ
a1140 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
a1150 20 73 71 6c 69 74 65 33 4f 73 53 68 6d 55 6e 6d sqlite3OsShmUnm
a1160 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ap(sqlite3_file
a1170 2a 69 64 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 *id, int deleteF
a1180 6c 61 67 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 lag){.. return
a1190 69 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 id->pMethods->xS
a11a0 68 6d 55 6e 6d 61 70 28 69 64 2c 20 64 65 6c 65 hmUnmap(id, dele
a11b0 74 65 46 6c 61 67 29 3b 0d 0a 7d 0d 0a 53 51 4c teFlag);..}..SQL
a11c0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
a11d0 73 71 6c 69 74 65 33 4f 73 53 68 6d 4d 61 70 28 sqlite3OsShmMap(
a11e0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 .. sqlite3_file
a11f0 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 *id,
a1200 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
a1210 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a file handle */..
a1220 20 20 69 6e 74 20 69 50 61 67 65 2c 0d 0a 20 20 int iPage,..
a1230 69 6e 74 20 70 67 73 7a 2c 0d 0a 20 20 69 6e 74 int pgsz,.. int
a1240 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 bExtend,
a1250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
a1260 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 True to extend f
a1270 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 ile if necessary
a1280 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 76 6f 6c 61 */.. void vola
a1290 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 tile **pp
a12a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 /* OUT: P
a12b0 6f 69 6e 74 65 72 20 74 6f 20 6d 61 70 70 69 6e ointer to mappin
a12c0 67 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 44 4f 5f 4f g */..){.. DO_O
a12d0 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 28 69 64 S_MALLOC_TEST(id
a12e0 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 69 64 2d );.. return id-
a12f0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d >pMethods->xShmM
a1300 61 70 28 69 64 2c 20 69 50 61 67 65 2c 20 70 67 ap(id, iPage, pg
a1310 73 7a 2c 20 62 45 78 74 65 6e 64 2c 20 70 70 29 sz, bExtend, pp)
a1320 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ;..}..../*..** T
a1330 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 he next group of
a1340 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 6f routines are co
a1350 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 nvenience wrappe
a1360 72 73 20 61 72 6f 75 6e 64 20 74 68 65 0d 0a 2a rs around the..*
a1370 2a 20 56 46 53 20 6d 65 74 68 6f 64 73 2e 0d 0a * VFS methods...
a1380 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
a1390 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 TE int sqlite3Os
a13a0 4f 70 65 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 Open(.. sqlite3
a13b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 0d 0a 20 20 _vfs *pVfs, ..
a13c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 const char *zPat
a13d0 68 2c 20 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 h, .. sqlite3_f
a13e0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0d 0a 20 20 ile *pFile, ..
a13f0 69 6e 74 20 66 6c 61 67 73 2c 20 0d 0a 20 20 69 int flags, .. i
a1400 6e 74 20 2a 70 46 6c 61 67 73 4f 75 74 0d 0a 29 nt *pFlagsOut..)
a1410 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 {.. int rc;..
a1420 44 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 DO_OS_MALLOC_TES
a1430 54 28 30 29 3b 0d 0a 20 20 2f 2a 20 30 78 38 37 T(0);.. /* 0x87
a1440 66 37 66 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 f7f is a mask of
a1450 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 20 66 6c SQLITE_OPEN_ fl
a1460 61 67 73 20 74 68 61 74 20 61 72 65 20 76 61 6c ags that are val
a1470 69 64 20 74 6f 20 62 65 20 70 61 73 73 65 64 0d id to be passed.
a1480 0a 20 20 2a 2a 20 64 6f 77 6e 20 69 6e 74 6f 20 . ** down into
a1490 74 68 65 20 56 46 53 20 6c 61 79 65 72 2e 20 20 the VFS layer.
a14a0 53 6f 6d 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e Some SQLITE_OPEN
a14b0 5f 20 66 6c 61 67 73 20 28 66 6f 72 20 65 78 61 _ flags (for exa
a14c0 6d 70 6c 65 2c 0d 0a 20 20 2a 2a 20 53 51 4c 49 mple,.. ** SQLI
a14d0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 TE_OPEN_FULLMUTE
a14e0 58 20 6f 72 20 53 51 4c 49 54 45 5f 4f 50 45 4e X or SQLITE_OPEN
a14f0 5f 53 48 41 52 45 44 43 41 43 48 45 29 20 61 72 _SHAREDCACHE) ar
a1500 65 20 62 6c 6f 63 6b 65 64 20 62 65 66 6f 72 65 e blocked before
a1510 0d 0a 20 20 2a 2a 20 72 65 61 63 68 69 6e 67 20 .. ** reaching
a1520 74 68 65 20 56 46 53 2e 20 2a 2f 0d 0a 20 20 72 the VFS. */.. r
a1530 63 20 3d 20 70 56 66 73 2d 3e 78 4f 70 65 6e 28 c = pVfs->xOpen(
a1540 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 pVfs, zPath, pFi
a1550 6c 65 2c 20 66 6c 61 67 73 20 26 20 30 78 38 37 le, flags & 0x87
a1560 66 37 66 2c 20 70 46 6c 61 67 73 4f 75 74 29 3b f7f, pFlagsOut);
a1570 0d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d .. assert( rc==
a1580 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 SQLITE_OK || pFi
a1590 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 le->pMethods==0
a15a0 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b );.. return rc;
a15b0 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ..}..SQLITE_PRIV
a15c0 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f ATE int sqlite3O
a15d0 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f sDelete(sqlite3_
a15e0 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 vfs *pVfs, const
a15f0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e char *zPath, in
a1600 74 20 64 69 72 53 79 6e 63 29 7b 0d 0a 20 20 44 t dirSync){.. D
a1610 4f 5f 4f 53 5f 4d 41 4c 4c 4f 43 5f 54 45 53 54 O_OS_MALLOC_TEST
a1620 28 30 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 (0);.. assert(
a1630 64 69 72 53 79 6e 63 3d 3d 30 20 7c 7c 20 64 69 dirSync==0 || di
a1640 72 53 79 6e 63 3d 3d 31 20 29 3b 0d 0a 20 20 72 rSync==1 );.. r
a1650 65 74 75 72 6e 20 70 56 66 73 2d 3e 78 44 65 6c eturn pVfs->xDel
a1660 65 74 65 28 70 56 66 73 2c 20 7a 50 61 74 68 2c ete(pVfs, zPath,
a1670 20 64 69 72 53 79 6e 63 29 3b 0d 0a 7d 0d 0a 53 dirSync);..}..S
a1680 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
a1690 74 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 t sqlite3OsAcces
a16a0 73 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 s(.. sqlite3_vf
a16b0 73 20 2a 70 56 66 73 2c 20 0d 0a 20 20 63 6f 6e s *pVfs, .. con
a16c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 st char *zPath,
a16d0 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0d .. int flags, .
a16e0 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0d . int *pResOut.
a16f0 0a 29 7b 0d 0a 20 20 44 4f 5f 4f 53 5f 4d 41 4c .){.. DO_OS_MAL
a1700 4c 4f 43 5f 54 45 53 54 28 30 29 3b 0d 0a 20 20 LOC_TEST(0);..
a1710 72 65 74 75 72 6e 20 70 56 66 73 2d 3e 78 41 63 return pVfs->xAc
a1720 63 65 73 73 28 70 56 66 73 2c 20 7a 50 61 74 68 cess(pVfs, zPath
a1730 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 , flags, pResOut
a1740 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 );..}..SQLITE_PR
a1750 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
a1760 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 3OsFullPathname(
a1770 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .. sqlite3_vfs
a1780 2a 70 56 66 73 2c 20 0d 0a 20 20 63 6f 6e 73 74 *pVfs, .. const
a1790 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0d 0a char *zPath, ..
a17a0 20 20 69 6e 74 20 6e 50 61 74 68 4f 75 74 2c 20 int nPathOut,
a17b0 0d 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 4f .. char *zPathO
a17c0 75 74 0d 0a 29 7b 0d 0a 20 20 44 4f 5f 4f 53 5f ut..){.. DO_OS_
a17d0 4d 41 4c 4c 4f 43 5f 54 45 53 54 28 30 29 3b 0d MALLOC_TEST(0);.
a17e0 0a 20 20 7a 50 61 74 68 4f 75 74 5b 30 5d 20 3d . zPathOut[0] =
a17f0 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 56 0;.. return pV
a1800 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d fs->xFullPathnam
a1810 65 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e e(pVfs, zPath, n
a1820 50 61 74 68 4f 75 74 2c 20 7a 50 61 74 68 4f 75 PathOut, zPathOu
a1830 74 29 3b 0d 0a 7d 0d 0a 23 69 66 6e 64 65 66 20 t);..}..#ifndef
a1840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 SQLITE_OMIT_LOAD
a1850 5f 45 58 54 45 4e 53 49 4f 4e 0d 0a 53 51 4c 49 _EXTENSION..SQLI
a1860 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
a1870 2a 73 71 6c 69 74 65 33 4f 73 44 6c 4f 70 65 6e *sqlite3OsDlOpen
a1880 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
a1890 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a fs, const char *
a18a0 7a 50 61 74 68 29 7b 0d 0a 20 20 72 65 74 75 72 zPath){.. retur
a18b0 6e 20 70 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 n pVfs->xDlOpen(
a18c0 70 56 66 73 2c 20 7a 50 61 74 68 29 3b 0d 0a 7d pVfs, zPath);..}
a18d0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
a18e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 44 void sqlite3OsD
a18f0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 lError(sqlite3_v
a1900 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 fs *pVfs, int nB
a1910 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f yte, char *zBufO
a1920 75 74 29 7b 0d 0a 20 20 70 56 66 73 2d 3e 78 44 ut){.. pVfs->xD
a1930 6c 45 72 72 6f 72 28 70 56 66 73 2c 20 6e 42 79 lError(pVfs, nBy
a1940 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0d 0a 7d te, zBufOut);..}
a1950 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
a1960 20 76 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 4f void (*sqlite3O
a1970 73 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 sDlSym(sqlite3_v
a1980 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a fs *pVfs, void *
a1990 70 48 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 pHdle, const cha
a19a0 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b r *zSym))(void){
a19b0 0d 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73 2d .. return pVfs-
a19c0 3e 78 44 6c 53 79 6d 28 70 56 66 73 2c 20 70 48 >xDlSym(pVfs, pH
a19d0 64 6c 65 2c 20 7a 53 79 6d 29 3b 0d 0a 7d 0d 0a dle, zSym);..}..
a19e0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
a19f0 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 44 6c 43 oid sqlite3OsDlC
a1a00 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 lose(sqlite3_vfs
a1a10 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 *pVfs, void *pH
a1a20 61 6e 64 6c 65 29 7b 0d 0a 20 20 70 56 66 73 2d andle){.. pVfs-
a1a30 3e 78 44 6c 43 6c 6f 73 65 28 70 56 66 73 2c 20 >xDlClose(pVfs,
a1a40 70 48 61 6e 64 6c 65 29 3b 0d 0a 7d 0d 0a 23 65 pHandle);..}..#e
a1a50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
a1a60 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 MIT_LOAD_EXTENSI
a1a70 4f 4e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ON */..SQLITE_PR
a1a80 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
a1a90 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 3OsRandomness(sq
a1aa0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
a1ab0 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 int nByte, char
a1ac0 20 2a 7a 42 75 66 4f 75 74 29 7b 0d 0a 20 20 72 *zBufOut){.. r
a1ad0 65 74 75 72 6e 20 70 56 66 73 2d 3e 78 52 61 6e eturn pVfs->xRan
a1ae0 64 6f 6d 6e 65 73 73 28 70 56 66 73 2c 20 6e 42 domness(pVfs, nB
a1af0 79 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0d 0a yte, zBufOut);..
a1b00 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 }..SQLITE_PRIVAT
a1b10 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 E int sqlite3OsS
a1b20 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 leep(sqlite3_vfs
a1b30 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 *pVfs, int nMic
a1b40 72 6f 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 ro){.. return p
a1b50 56 66 73 2d 3e 78 53 6c 65 65 70 28 70 56 66 73 Vfs->xSleep(pVfs
a1b60 2c 20 6e 4d 69 63 72 6f 29 3b 0d 0a 7d 0d 0a 53 , nMicro);..}..S
a1b70 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
a1b80 74 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 t sqlite3OsCurre
a1b90 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 ntTimeInt64(sqli
a1ba0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 te3_vfs *pVfs, s
a1bb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 54 qlite3_int64 *pT
a1bc0 69 6d 65 4f 75 74 29 7b 0d 0a 20 20 69 6e 74 20 imeOut){.. int
a1bd0 72 63 3b 0d 0a 20 20 2f 2a 20 49 4d 50 4c 45 4d rc;.. /* IMPLEM
a1be0 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 ENTATION-OF: R-4
a1bf0 39 30 34 35 2d 34 32 34 39 33 20 53 51 4c 69 74 9045-42493 SQLit
a1c00 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 78 e will use the x
a1c10 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 CurrentTimeInt64
a1c20 28 29 0d 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 20 ().. ** method
a1c30 74 6f 20 67 65 74 20 74 68 65 20 63 75 72 72 65 to get the curre
a1c40 6e 74 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 nt date and time
a1c50 20 69 66 20 74 68 61 74 20 6d 65 74 68 6f 64 20 if that method
a1c60 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 is available..
a1c70 2a 2a 20 28 69 66 20 69 56 65 72 73 69 6f 6e 20 ** (if iVersion
a1c80 69 73 20 32 20 6f 72 20 67 72 65 61 74 65 72 20 is 2 or greater
a1c90 61 6e 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e and the function
a1ca0 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 pointer is not
a1cb0 4e 55 4c 4c 29 20 61 6e 64 0d 0a 20 20 2a 2a 20 NULL) and.. **
a1cc0 77 69 6c 6c 20 66 61 6c 6c 20 62 61 63 6b 20 74 will fall back t
a1cd0 6f 20 78 43 75 72 72 65 6e 74 54 69 6d 65 28 29 o xCurrentTime()
a1ce0 20 69 66 20 78 43 75 72 72 65 6e 74 54 69 6d 65 if xCurrentTime
a1cf0 49 6e 74 36 34 28 29 20 69 73 0d 0a 20 20 2a 2a Int64() is.. **
a1d00 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 unavailable...
a1d10 20 2a 2f 0d 0a 20 20 69 66 28 20 70 56 66 73 2d */.. if( pVfs-
a1d20 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 >iVersion>=2 &&
a1d30 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 pVfs->xCurrentTi
a1d40 6d 65 49 6e 74 36 34 20 29 7b 0d 0a 20 20 20 20 meInt64 ){..
a1d50 72 63 20 3d 20 70 56 66 73 2d 3e 78 43 75 72 72 rc = pVfs->xCurr
a1d60 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 entTimeInt64(pVf
a1d70 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0d 0a 20 s, pTimeOut);..
a1d80 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 64 6f 75 }else{.. dou
a1d90 62 6c 65 20 72 3b 0d 0a 20 20 20 20 72 63 20 3d ble r;.. rc =
a1da0 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 pVfs->xCurrentT
a1db0 69 6d 65 28 70 56 66 73 2c 20 26 72 29 3b 0d 0a ime(pVfs, &r);..
a1dc0 20 20 20 20 2a 70 54 69 6d 65 4f 75 74 20 3d 20 *pTimeOut =
a1dd0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 (sqlite3_int64)(
a1de0 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0d 0a r*86400000.0);..
a1df0 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
a1e00 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 ;..}....SQLITE_P
a1e10 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
a1e20 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 0d e3OsOpenMalloc(.
a1e30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
a1e40 70 56 66 73 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 pVfs, .. const
a1e50 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 0d 0a 20 char *zFile, ..
a1e60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a sqlite3_file **
a1e70 70 70 46 69 6c 65 2c 20 0d 0a 20 20 69 6e 74 20 ppFile, .. int
a1e80 66 6c 61 67 73 2c 0d 0a 20 20 69 6e 74 20 2a 70 flags,.. int *p
a1e90 4f 75 74 46 6c 61 67 73 0d 0a 29 7b 0d 0a 20 20 OutFlags..){..
a1ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
a1eb0 4e 4f 4d 45 4d 3b 0d 0a 20 20 73 71 6c 69 74 65 NOMEM;.. sqlite
a1ec0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0d 0a 3_file *pFile;..
a1ed0 20 20 70 46 69 6c 65 20 3d 20 28 73 71 6c 69 74 pFile = (sqlit
a1ee0 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 e3_file *)sqlite
a1ef0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 3MallocZero(pVfs
a1f00 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0d 0a 20 20 ->szOsFile);..
a1f10 69 66 28 20 70 46 69 6c 65 20 29 7b 0d 0a 20 20 if( pFile ){..
a1f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
a1f30 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 Open(pVfs, zFile
a1f40 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 , pFile, flags,
a1f50 70 4f 75 74 46 6c 61 67 73 29 3b 0d 0a 20 20 20 pOutFlags);..
a1f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
a1f70 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c OK ){.. sql
a1f80 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 29 ite3_free(pFile)
a1f90 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
a1fa0 20 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 *ppFile = p
a1fb0 46 69 6c 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 File;.. }..
a1fc0 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d }.. return rc;.
a1fd0 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 .}..SQLITE_PRIVA
a1fe0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 TE int sqlite3Os
a1ff0 43 6c 6f 73 65 46 72 65 65 28 73 71 6c 69 74 65 CloseFree(sqlite
a2000 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0d 3_file *pFile){.
a2010 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
a2020 54 45 5f 4f 4b 3b 0d 0a 20 20 61 73 73 65 72 74 TE_OK;.. assert
a2030 28 20 70 46 69 6c 65 20 29 3b 0d 0a 20 20 72 63 ( pFile );.. rc
a2040 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 = sqlite3OsClos
a2050 65 28 70 46 69 6c 65 29 3b 0d 0a 20 20 73 71 6c e(pFile);.. sql
a2060 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 29 ite3_free(pFile)
a2070 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
a2080 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 .}..../*..** Thi
a2090 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 s function is a
a20a0 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 wrapper around t
a20b0 68 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 69 he OS specific i
a20c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
a20d0 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f ..** sqlite3_os_
a20e0 69 6e 69 74 28 29 2e 20 54 68 65 20 70 75 72 70 init(). The purp
a20f0 6f 73 65 20 6f 66 20 74 68 65 20 77 72 61 70 70 ose of the wrapp
a2100 65 72 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 er is to provide
a2110 20 74 68 65 0d 0a 2a 2a 20 61 62 69 6c 69 74 79 the..** ability
a2120 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 6d to simulate a m
a2130 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 2c 20 73 alloc failure, s
a2140 6f 20 74 68 61 74 20 74 68 65 20 68 61 6e 64 6c o that the handl
a2150 69 6e 67 20 6f 66 20 61 6e 0d 0a 2a 2a 20 65 72 ing of an..** er
a2160 72 6f 72 20 69 6e 20 73 71 6c 69 74 65 33 5f 6f ror in sqlite3_o
a2170 73 5f 69 6e 69 74 28 29 20 62 79 20 74 68 65 20 s_init() by the
a2180 75 70 70 65 72 20 6c 61 79 65 72 73 20 63 61 6e upper layers can
a2190 20 62 65 20 74 65 73 74 65 64 2e 0d 0a 2a 2f 0d be tested...*/.
a21a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
a21b0 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 int sqlite3OsIni
a21c0 74 28 76 6f 69 64 29 7b 0d 0a 20 20 76 6f 69 64 t(void){.. void
a21d0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 *p = sqlite3_ma
a21e0 6c 6c 6f 63 28 31 30 29 3b 0d 0a 20 20 69 66 28 lloc(10);.. if(
a21f0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 p==0 ) return S
a2200 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 QLITE_NOMEM;..
a2210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b sqlite3_free(p);
a2220 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 .. return sqlit
a2230 65 33 5f 6f 73 5f 69 6e 69 74 28 29 3b 0d 0a 7d e3_os_init();..}
a2240 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 6c ..../*..** The l
a2250 69 73 74 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 ist of all regis
a2260 74 65 72 65 64 20 56 46 53 20 69 6d 70 6c 65 6d tered VFS implem
a2270 65 6e 74 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d 0a entations...*/..
a2280 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 static sqlite3_v
a2290 66 73 20 2a 20 53 51 4c 49 54 45 5f 57 53 44 20 fs * SQLITE_WSD
a22a0 76 66 73 4c 69 73 74 20 3d 20 30 3b 0d 0a 23 64 vfsList = 0;..#d
a22b0 65 66 69 6e 65 20 76 66 73 4c 69 73 74 20 47 4c efine vfsList GL
a22c0 4f 42 41 4c 28 73 71 6c 69 74 65 33 5f 76 66 73 OBAL(sqlite3_vfs
a22d0 20 2a 2c 20 76 66 73 4c 69 73 74 29 0d 0a 0d 0a *, vfsList)....
a22e0 2f 2a 0d 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 20 /*..** Locate a
a22f0 56 46 53 20 62 79 20 6e 61 6d 65 2e 20 20 49 66 VFS by name. If
a2300 20 6e 6f 20 6e 61 6d 65 20 69 73 20 67 69 76 65 no name is give
a2310 6e 2c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e n, simply return
a2320 20 74 68 65 0d 0a 2a 2a 20 66 69 72 73 74 20 56 the..** first V
a2330 46 53 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0d FS on the list..
a2340 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
a2350 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c sqlite3_vfs *sql
a2360 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 63 6f ite3_vfs_find(co
a2370 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 29 7b nst char *zVfs){
a2380 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .. sqlite3_vfs
a2390 2a 70 56 66 73 20 3d 20 30 3b 0d 0a 23 69 66 20 *pVfs = 0;..#if
a23a0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
a23b0 45 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 E.. sqlite3_mut
a23c0 65 78 20 2a 6d 75 74 65 78 3b 0d 0a 23 65 6e 64 ex *mutex;..#end
a23d0 69 66 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 if..#ifndef SQLI
a23e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 TE_OMIT_AUTOINIT
a23f0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c .. int rc = sql
a2400 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 ite3_initialize(
a2410 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 20 72 );.. if( rc ) r
a2420 65 74 75 72 6e 20 30 3b 0d 0a 23 65 6e 64 69 66 eturn 0;..#endif
a2430 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 ..#if SQLITE_THR
a2440 45 41 44 53 41 46 45 0d 0a 20 20 6d 75 74 65 78 EADSAFE.. mutex
a2450 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 = sqlite3MutexA
a2460 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 lloc(SQLITE_MUTE
a2470 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 X_STATIC_MASTER)
a2480 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 73 71 6c ;..#endif.. sql
a2490 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 ite3_mutex_enter
a24a0 28 6d 75 74 65 78 29 3b 0d 0a 20 20 66 6f 72 28 (mutex);.. for(
a24b0 70 56 66 73 20 3d 20 76 66 73 4c 69 73 74 3b 20 pVfs = vfsList;
a24c0 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d pVfs; pVfs=pVfs-
a24d0 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 69 66 >pNext){.. if
a24e0 28 20 7a 56 66 73 3d 3d 30 20 29 20 62 72 65 61 ( zVfs==0 ) brea
a24f0 6b 3b 0d 0a 20 20 20 20 69 66 28 20 73 74 72 63 k;.. if( strc
a2500 6d 70 28 7a 56 66 73 2c 20 70 56 66 73 2d 3e 7a mp(zVfs, pVfs->z
a2510 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b Name)==0 ) break
a2520 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 ;.. }.. sqlite
a2530 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 3_mutex_leave(mu
a2540 74 65 78 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 tex);.. return
a2550 70 56 66 73 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a pVfs;..}..../*..
a2560 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 56 46 53 20 ** Unlink a VFS
a2570 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 from the linked
a2580 6c 69 73 74 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 list..*/..static
a2590 20 76 6f 69 64 20 76 66 73 55 6e 6c 69 6e 6b 28 void vfsUnlink(
a25a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
a25b0 73 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 s){.. assert( s
a25c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
a25d0 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c d(sqlite3MutexAl
a25e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
a25f0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 _STATIC_MASTER))
a2600 20 29 3b 0d 0a 20 20 69 66 28 20 70 56 66 73 3d );.. if( pVfs=
a2610 3d 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 4e 6f =0 ){.. /* No
a2620 2d 6f 70 20 2a 2f 0d 0a 20 20 7d 65 6c 73 65 20 -op */.. }else
a2630 69 66 28 20 76 66 73 4c 69 73 74 3d 3d 70 56 66 if( vfsList==pVf
a2640 73 20 29 7b 0d 0a 20 20 20 20 76 66 73 4c 69 73 s ){.. vfsLis
a2650 74 20 3d 20 70 56 66 73 2d 3e 70 4e 65 78 74 3b t = pVfs->pNext;
a2660 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 66 .. }else if( vf
a2670 73 4c 69 73 74 20 29 7b 0d 0a 20 20 20 20 73 71 sList ){.. sq
a2680 6c 69 74 65 33 5f 76 66 73 20 2a 70 20 3d 20 76 lite3_vfs *p = v
a2690 66 73 4c 69 73 74 3b 0d 0a 20 20 20 20 77 68 69 fsList;.. whi
a26a0 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 26 26 20 le( p->pNext &&
a26b0 70 2d 3e 70 4e 65 78 74 21 3d 70 56 66 73 20 29 p->pNext!=pVfs )
a26c0 7b 0d 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e {.. p = p->
a26d0 70 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 pNext;.. }..
a26e0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d if( p->pNext=
a26f0 3d 70 56 66 73 20 29 7b 0d 0a 20 20 20 20 20 20 =pVfs ){..
a2700 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 66 73 2d p->pNext = pVfs-
a2710 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a >pNext;.. }..
a2720 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
a2730 20 52 65 67 69 73 74 65 72 20 61 20 56 46 53 20 Register a VFS
a2740 77 69 74 68 20 74 68 65 20 73 79 73 74 65 6d 2e with the system.
a2750 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 It is harmless
a2760 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 to register the
a2770 20 73 61 6d 65 0d 0a 2a 2a 20 56 46 53 20 6d 75 same..** VFS mu
a2780 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 20 20 54 ltiple times. T
a2790 68 65 20 6e 65 77 20 56 46 53 20 62 65 63 6f 6d he new VFS becom
a27a0 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 es the default i
a27b0 66 20 6d 61 6b 65 44 66 6c 74 20 69 73 0d 0a 2a f makeDflt is..*
a27c0 2a 20 74 72 75 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c * true...*/..SQL
a27d0 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
a27e0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 te3_vfs_register
a27f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
a2800 66 73 2c 20 69 6e 74 20 6d 61 6b 65 44 66 6c 74 fs, int makeDflt
a2810 29 7b 0d 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 ){.. MUTEX_LOGI
a2820 43 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 C(sqlite3_mutex
a2830 2a 6d 75 74 65 78 3b 29 0d 0a 23 69 66 6e 64 65 *mutex;)..#ifnde
a2840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 f SQLITE_OMIT_AU
a2850 54 4f 49 4e 49 54 0d 0a 20 20 69 6e 74 20 72 63 TOINIT.. int rc
a2860 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 = sqlite3_initi
a2870 61 6c 69 7a 65 28 29 3b 0d 0a 20 20 69 66 28 20 alize();.. if(
a2880 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d rc ) return rc;.
a2890 0a 23 65 6e 64 69 66 0d 0a 20 20 4d 55 54 45 58 .#endif.. MUTEX
a28a0 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 20 3d 20 _LOGIC( mutex =
a28b0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f sqlite3MutexAllo
a28c0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 c(SQLITE_MUTEX_S
a28d0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 TATIC_MASTER); )
a28e0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
a28f0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0d x_enter(mutex);.
a2900 0a 20 20 76 66 73 55 6e 6c 69 6e 6b 28 70 56 66 . vfsUnlink(pVf
a2910 73 29 3b 0d 0a 20 20 69 66 28 20 6d 61 6b 65 44 s);.. if( makeD
a2920 66 6c 74 20 7c 7c 20 76 66 73 4c 69 73 74 3d 3d flt || vfsList==
a2930 30 20 29 7b 0d 0a 20 20 20 20 70 56 66 73 2d 3e 0 ){.. pVfs->
a2940 70 4e 65 78 74 20 3d 20 76 66 73 4c 69 73 74 3b pNext = vfsList;
a2950 0d 0a 20 20 20 20 76 66 73 4c 69 73 74 20 3d 20 .. vfsList =
a2960 70 56 66 73 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d pVfs;.. }else{.
a2970 0a 20 20 20 20 70 56 66 73 2d 3e 70 4e 65 78 74 . pVfs->pNext
a2980 20 3d 20 76 66 73 4c 69 73 74 2d 3e 70 4e 65 78 = vfsList->pNex
a2990 74 3b 0d 0a 20 20 20 20 76 66 73 4c 69 73 74 2d t;.. vfsList-
a29a0 3e 70 4e 65 78 74 20 3d 20 70 56 66 73 3b 0d 0a >pNext = pVfs;..
a29b0 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 76 66 }.. assert(vf
a29c0 73 4c 69 73 74 29 3b 0d 0a 20 20 73 71 6c 69 74 sList);.. sqlit
a29d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d e3_mutex_leave(m
a29e0 75 74 65 78 29 3b 0d 0a 20 20 72 65 74 75 72 6e utex);.. return
a29f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a SQLITE_OK;..}..
a2a00 0d 0a 2f 2a 0d 0a 2a 2a 20 55 6e 72 65 67 69 73 ../*..** Unregis
a2a10 74 65 72 20 61 20 56 46 53 20 73 6f 20 74 68 61 ter a VFS so tha
a2a20 74 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 t it is no longe
a2a30 72 20 61 63 63 65 73 73 69 62 6c 65 2e 0d 0a 2a r accessible...*
a2a40 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
a2a50 74 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e t sqlite3_vfs_un
a2a60 72 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 register(sqlite3
a2a70 5f 76 66 73 20 2a 70 56 66 73 29 7b 0d 0a 23 69 _vfs *pVfs){..#i
a2a80 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 f SQLITE_THREADS
a2a90 41 46 45 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d AFE.. sqlite3_m
a2aa0 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 utex *mutex = sq
a2ab0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 lite3MutexAlloc(
a2ac0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
a2ad0 54 49 43 5f 4d 41 53 54 45 52 29 3b 0d 0a 23 65 TIC_MASTER);..#e
a2ae0 6e 64 69 66 0d 0a 20 20 73 71 6c 69 74 65 33 5f ndif.. sqlite3_
a2af0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 mutex_enter(mute
a2b00 78 29 3b 0d 0a 20 20 76 66 73 55 6e 6c 69 6e 6b x);.. vfsUnlink
a2b10 28 70 56 66 73 29 3b 0d 0a 20 20 73 71 6c 69 74 (pVfs);.. sqlit
a2b20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d e3_mutex_leave(m
a2b30 75 74 65 78 29 3b 0d 0a 20 20 72 65 74 75 72 6e utex);.. return
a2b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a SQLITE_OK;..}..
a2b50 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
a2b60 2a 20 45 6e 64 20 6f 66 20 6f 73 2e 63 20 2a 2a * End of os.c **
a2b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2ba0 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /../************
a2bb0 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 66 61 ** Begin file fa
a2bc0 75 6c 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ult.c **********
a2bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2bf0 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 38 20 */../*..** 2008
a2c00 4a 61 6e 20 32 32 0d 0a 2a 2a 0d 0a 2a 2a 20 54 Jan 22..**..** T
a2c10 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 he author discla
a2c20 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f ims copyright to
a2c30 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 this source cod
a2c40 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d e. In place of.
a2c50 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 .** a legal noti
a2c60 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c ce, here is a bl
a2c70 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 essing:..**..**
a2c80 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f May you do go
a2c90 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e od and not evil.
a2ca0 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
a2cb0 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 find forgiveness
a2cc0 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e for yourself an
a2cd0 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 d forgive others
a2ce0 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
a2cf0 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e share freely, n
a2d00 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 ever taking more
a2d10 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d than you give..
a2d20 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .**..***********
a2d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a2d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a **************..
a2d70 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 **..** This file
a2d80 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 contains code t
a2d90 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 63 6f o support the co
a2da0 6e 63 65 70 74 20 6f 66 20 22 62 65 6e 69 67 6e ncept of "benign
a2db0 22 20 0d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 " ..** malloc fa
a2dc0 69 6c 75 72 65 73 20 28 77 68 65 6e 20 74 68 65 ilures (when the
a2dd0 20 78 4d 61 6c 6c 6f 63 28 29 20 6f 72 20 78 52 xMalloc() or xR
a2de0 65 61 6c 6c 6f 63 28 29 20 6d 65 74 68 6f 64 20 ealloc() method
a2df0 6f 66 20 74 68 65 0d 0a 2a 2a 20 73 71 6c 69 74 of the..** sqlit
a2e00 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 e3_mem_methods s
a2e10 74 72 75 63 74 75 72 65 20 66 61 69 6c 73 20 74 tructure fails t
a2e20 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f o allocate a blo
a2e30 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 0d 0a 2a 2a ck of memory..**
a2e40 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 29 2e and returns 0).
a2e50 20 0d 0a 2a 2a 0d 0a 2a 2a 20 4d 6f 73 74 20 6d ..**..** Most m
a2e60 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 61 alloc failures a
a2e70 72 65 20 6e 6f 6e 2d 62 65 6e 69 67 6e 2e 20 41 re non-benign. A
a2e80 66 74 65 72 20 74 68 65 79 20 6f 63 63 75 72 2c fter they occur,
a2e90 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 61 62 61 6e SQLite..** aban
a2ea0 64 6f 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 dons the current
a2eb0 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 72 operation and r
a2ec0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 eturns an error
a2ed0 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 0d 0a 2a code (usually..*
a2ee0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 * SQLITE_NOMEM)
a2ef0 74 6f 20 74 68 65 20 75 73 65 72 2e 20 48 6f 77 to the user. How
a2f00 65 76 65 72 2c 20 73 6f 6d 65 74 69 6d 65 73 20 ever, sometimes
a2f10 61 20 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 6e a fault is not n
a2f20 65 63 65 73 73 61 72 69 6c 79 0d 0a 2a 2a 20 66 ecessarily..** f
a2f30 61 74 61 6c 2e 20 46 6f 72 20 65 78 61 6d 70 6c atal. For exampl
a2f40 65 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 e, if a malloc f
a2f50 61 69 6c 73 20 77 68 69 6c 65 20 72 65 73 69 7a ails while resiz
a2f60 69 6e 67 20 61 20 68 61 73 68 20 74 61 62 6c 65 ing a hash table
a2f70 2c 20 74 68 69 73 20 0d 0a 2a 2a 20 69 73 20 63 , this ..** is c
a2f80 6f 6d 70 6c 65 74 65 6c 79 20 72 65 63 6f 76 65 ompletely recove
a2f90 72 61 62 6c 65 20 73 69 6d 70 6c 79 20 62 79 20 rable simply by
a2fa0 6e 6f 74 20 63 61 72 72 79 69 6e 67 20 6f 75 74 not carrying out
a2fb0 20 74 68 65 20 72 65 73 69 7a 65 2e 20 54 68 65 the resize. The
a2fc0 20 0d 0a 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 ..** hash table
a2fd0 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 will continue t
a2fe0 6f 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 o function norma
a2ff0 6c 6c 79 2e 20 20 53 6f 20 61 20 6d 61 6c 6c 6f lly. So a mallo
a3000 63 20 66 61 69 6c 75 72 65 20 0d 0a 2a 2a 20 64 c failure ..** d
a3010 75 72 69 6e 67 20 61 20 68 61 73 68 20 74 61 62 uring a hash tab
a3020 6c 65 20 72 65 73 69 7a 65 20 69 73 20 61 20 62 le resize is a b
a3030 65 6e 69 67 6e 20 66 61 75 6c 74 2e 0d 0a 2a 2f enign fault...*/
a3040 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 ......#ifndef SQ
a3050 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 LITE_OMIT_BUILTI
a3060 4e 5f 54 45 53 54 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a N_TEST..../*..**
a3070 20 47 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 Global variable
a3080 73 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 s...*/..typedef
a3090 73 74 72 75 63 74 20 42 65 6e 69 67 6e 4d 61 6c struct BenignMal
a30a0 6c 6f 63 48 6f 6f 6b 73 20 42 65 6e 69 67 6e 4d locHooks BenignM
a30b0 61 6c 6c 6f 63 48 6f 6f 6b 73 3b 0d 0a 73 74 61 allocHooks;..sta
a30c0 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 73 tic SQLITE_WSD s
a30d0 74 72 75 63 74 20 42 65 6e 69 67 6e 4d 61 6c 6c truct BenignMall
a30e0 6f 63 48 6f 6f 6b 73 20 7b 0d 0a 20 20 76 6f 69 ocHooks {.. voi
a30f0 64 20 28 2a 78 42 65 6e 69 67 6e 42 65 67 69 6e d (*xBenignBegin
a3100 29 28 76 6f 69 64 29 3b 0d 0a 20 20 76 6f 69 64 )(void);.. void
a3110 20 28 2a 78 42 65 6e 69 67 6e 45 6e 64 29 28 76 (*xBenignEnd)(v
a3120 6f 69 64 29 3b 0d 0a 7d 20 73 71 6c 69 74 65 33 oid);..} sqlite3
a3130 48 6f 6f 6b 73 20 3d 20 7b 20 30 2c 20 30 20 7d Hooks = { 0, 0 }
a3140 3b 0d 0a 0d 0a 2f 2a 20 54 68 65 20 22 77 73 64 ;..../* The "wsd
a3150 48 6f 6f 6b 73 22 20 6d 61 63 72 6f 20 77 69 6c Hooks" macro wil
a3160 6c 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 l resolve to the
a3170 20 61 70 70 72 6f 70 72 69 61 74 65 20 42 65 6e appropriate Ben
a3180 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 0d 0a ignMallocHooks..
a3190 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 ** structure. I
a31a0 66 20 77 72 69 74 61 62 6c 65 20 73 74 61 74 69 f writable stati
a31b0 63 20 64 61 74 61 20 69 73 20 75 6e 73 75 70 70 c data is unsupp
a31c0 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 74 61 72 orted on the tar
a31d0 67 65 74 2c 0d 0a 2a 2a 20 77 65 20 68 61 76 65 get,..** we have
a31e0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 to locate the s
a31f0 74 61 74 65 20 76 65 63 74 6f 72 20 61 74 20 72 tate vector at r
a3200 75 6e 2d 74 69 6d 65 2e 20 20 49 6e 20 74 68 65 un-time. In the
a3210 20 6d 6f 72 65 20 63 6f 6d 6d 6f 6e 0d 0a 2a 2a more common..**
a3220 20 63 61 73 65 20 77 68 65 72 65 20 77 72 69 74 case where writ
a3230 61 62 6c 65 20 73 74 61 74 69 63 20 64 61 74 61 able static data
a3240 20 69 73 20 73 75 70 70 6f 72 74 65 64 2c 20 77 is supported, w
a3250 73 64 48 6f 6f 6b 73 20 63 61 6e 20 72 65 66 65 sdHooks can refe
a3260 72 20 64 69 72 65 63 74 6c 79 0d 0a 2a 2a 20 74 r directly..** t
a3270 6f 20 74 68 65 20 22 73 71 6c 69 74 65 33 48 6f o the "sqlite3Ho
a3280 6f 6b 73 22 20 73 74 61 74 65 20 76 65 63 74 6f oks" state vecto
a3290 72 20 64 65 63 6c 61 72 65 64 20 61 62 6f 76 65 r declared above
a32a0 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 ...*/..#ifdef SQ
a32b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0d 0a 23 LITE_OMIT_WSD..#
a32c0 20 64 65 66 69 6e 65 20 77 73 64 48 6f 6f 6b 73 define wsdHooks
a32d0 49 6e 69 74 20 5c 0d 0a 20 20 42 65 6e 69 67 6e Init \.. Benign
a32e0 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 20 2a 78 20 3d MallocHooks *x =
a32f0 20 26 47 4c 4f 42 41 4c 28 42 65 6e 69 67 6e 4d &GLOBAL(BenignM
a3300 61 6c 6c 6f 63 48 6f 6f 6b 73 2c 73 71 6c 69 74 allocHooks,sqlit
a3310 65 33 48 6f 6f 6b 73 29 0d 0a 23 20 64 65 66 69 e3Hooks)..# defi
a3320 6e 65 20 77 73 64 48 6f 6f 6b 73 20 78 5b 30 5d ne wsdHooks x[0]
a3330 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e ..#else..# defin
a3340 65 20 77 73 64 48 6f 6f 6b 73 49 6e 69 74 0d 0a e wsdHooksInit..
a3350 23 20 64 65 66 69 6e 65 20 77 73 64 48 6f 6f 6b # define wsdHook
a3360 73 20 73 71 6c 69 74 65 33 48 6f 6f 6b 73 0d 0a s sqlite3Hooks..
a3370 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a #endif....../*..
a3380 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b ** Register hook
a3390 73 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 73 s to call when s
a33a0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 qlite3BeginBenig
a33b0 6e 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 0d 0a 2a nMalloc() and..*
a33c0 2a 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 * sqlite3EndBeni
a33d0 67 6e 4d 61 6c 6c 6f 63 28 29 20 61 72 65 20 63 gnMalloc() are c
a33e0 61 6c 6c 65 64 2c 20 72 65 73 70 65 63 74 69 76 alled, respectiv
a33f0 65 6c 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ely...*/..SQLITE
a3400 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
a3410 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f lite3BenignMallo
a3420 63 48 6f 6f 6b 73 28 0d 0a 20 20 76 6f 69 64 20 cHooks(.. void
a3430 28 2a 78 42 65 6e 69 67 6e 42 65 67 69 6e 29 28 (*xBenignBegin)(
a3440 76 6f 69 64 29 2c 0d 0a 20 20 76 6f 69 64 20 28 void),.. void (
a3450 2a 78 42 65 6e 69 67 6e 45 6e 64 29 28 76 6f 69 *xBenignEnd)(voi
a3460 64 29 0d 0a 29 7b 0d 0a 20 20 77 73 64 48 6f 6f d)..){.. wsdHoo
a3470 6b 73 49 6e 69 74 3b 0d 0a 20 20 77 73 64 48 6f ksInit;.. wsdHo
a3480 6f 6b 73 2e 78 42 65 6e 69 67 6e 42 65 67 69 6e oks.xBenignBegin
a3490 20 3d 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b = xBenignBegin;
a34a0 0d 0a 20 20 77 73 64 48 6f 6f 6b 73 2e 78 42 65 .. wsdHooks.xBe
a34b0 6e 69 67 6e 45 6e 64 20 3d 20 78 42 65 6e 69 67 nignEnd = xBenig
a34c0 6e 45 6e 64 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a nEnd;..}..../*..
a34d0 2a 2a 20 54 68 69 73 20 28 73 71 6c 69 74 65 33 ** This (sqlite3
a34e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 EndBenignMalloc(
a34f0 29 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 )) is called by
a3500 53 51 4c 69 74 65 20 63 6f 64 65 20 74 6f 20 69 SQLite code to i
a3510 6e 64 69 63 61 74 65 20 74 68 61 74 0d 0a 2a 2a ndicate that..**
a3520 20 73 75 62 73 65 71 75 65 6e 74 20 6d 61 6c 6c subsequent mall
a3530 6f 63 20 66 61 69 6c 75 72 65 73 20 61 72 65 20 oc failures are
a3540 62 65 6e 69 67 6e 2e 20 41 20 63 61 6c 6c 20 74 benign. A call t
a3550 6f 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 o sqlite3EndBeni
a3560 67 6e 4d 61 6c 6c 6f 63 28 29 0d 0a 2a 2a 20 69 gnMalloc()..** i
a3570 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 73 75 ndicates that su
a3580 62 73 65 71 75 65 6e 74 20 6d 61 6c 6c 6f 63 20 bsequent malloc
a3590 66 61 69 6c 75 72 65 73 20 61 72 65 20 6e 6f 6e failures are non
a35a0 2d 62 65 6e 69 67 6e 2e 0d 0a 2a 2f 0d 0a 53 51 -benign...*/..SQ
a35b0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
a35c0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 d sqlite3BeginBe
a35d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 76 6f 69 64 29 nignMalloc(void)
a35e0 7b 0d 0a 20 20 77 73 64 48 6f 6f 6b 73 49 6e 69 {.. wsdHooksIni
a35f0 74 3b 0d 0a 20 20 69 66 28 20 77 73 64 48 6f 6f t;.. if( wsdHoo
a3600 6b 73 2e 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 ks.xBenignBegin
a3610 29 7b 0d 0a 20 20 20 20 77 73 64 48 6f 6f 6b 73 ){.. wsdHooks
a3620 2e 78 42 65 6e 69 67 6e 42 65 67 69 6e 28 29 3b .xBenignBegin();
a3630 0d 0a 20 20 7d 0d 0a 7d 0d 0a 53 51 4c 49 54 45 .. }..}..SQLITE
a3640 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
a3650 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
a3660 6c 6c 6f 63 28 76 6f 69 64 29 7b 0d 0a 20 20 77 lloc(void){.. w
a3670 73 64 48 6f 6f 6b 73 49 6e 69 74 3b 0d 0a 20 20 sdHooksInit;..
a3680 69 66 28 20 77 73 64 48 6f 6f 6b 73 2e 78 42 65 if( wsdHooks.xBe
a3690 6e 69 67 6e 45 6e 64 20 29 7b 0d 0a 20 20 20 20 nignEnd ){..
a36a0 77 73 64 48 6f 6f 6b 73 2e 78 42 65 6e 69 67 6e wsdHooks.xBenign
a36b0 45 6e 64 28 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a End();.. }..}..
a36c0 0d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 ..#endif /* #i
a36d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
a36e0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a T_BUILTIN_TEST *
a36f0 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
a3700 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 66 61 75 6c **** End of faul
a3710 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a t.c ************
a3720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3740 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
a3750 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 ***** Begin file
a3760 20 6d 65 6d 30 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a mem0.c ********
a3770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3790 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 ****/../*..** 20
a37a0 30 38 20 4f 63 74 6f 62 65 72 20 32 38 0d 0a 2a 08 October 28..*
a37b0 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 *..** The author
a37c0 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 disclaims copyr
a37d0 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 ight to this sou
a37e0 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c rce code. In pl
a37f0 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 ace of..** a leg
a3800 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
a3810 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a is a blessing:..
a3820 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f **..** May yo
a3830 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f u do good and no
a3840 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d t evil...** M
a3850 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 ay you find forg
a3860 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 iveness for your
a3870 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 self and forgive
a3880 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 others...**
a3890 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 May you share fr
a38a0 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 eely, never taki
a38b0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 ng more than you
a38c0 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a give...**..****
a38d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a38e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a38f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3910 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
a3920 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 is file contains
a3930 20 61 20 6e 6f 2d 6f 70 20 6d 65 6d 6f 72 79 20 a no-op memory
a3940 61 6c 6c 6f 63 61 74 69 6f 6e 20 64 72 69 76 65 allocation drive
a3950 72 73 20 66 6f 72 20 75 73 65 20 77 68 65 6e 0d rs for use when.
a3960 0a 2a 2a 20 53 51 4c 49 54 45 5f 5a 45 52 4f 5f .** SQLITE_ZERO_
a3970 4d 41 4c 4c 4f 43 20 69 73 20 64 65 66 69 6e 65 MALLOC is define
a3980 64 2e 20 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 d. The allocati
a3990 6f 6e 20 64 72 69 76 65 72 73 20 69 6d 70 6c 65 on drivers imple
a39a0 6d 65 6e 74 65 64 0d 0a 2a 2a 20 68 65 72 65 20 mented..** here
a39b0 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 53 51 always fail. SQ
a39c0 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 6f 70 Lite will not op
a39d0 65 72 61 74 65 20 77 69 74 68 20 74 68 65 73 65 erate with these
a39e0 20 64 72 69 76 65 72 73 2e 20 20 54 68 65 73 65 drivers. These
a39f0 0d 0a 2a 2a 20 61 72 65 20 6d 65 72 65 6c 79 20 ..** are merely
a3a00 70 6c 61 63 65 68 6f 6c 64 65 72 73 2e 20 20 52 placeholders. R
a3a10 65 61 6c 20 64 72 69 76 65 72 73 20 6d 75 73 74 eal drivers must
a3a20 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 be substituted
a3a30 75 73 69 6e 67 0d 0a 2a 2a 20 73 71 6c 69 74 65 using..** sqlite
a3a40 33 5f 63 6f 6e 66 69 67 28 29 20 62 65 66 6f 72 3_config() befor
a3a50 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6f 70 e SQLite will op
a3a60 65 72 61 74 65 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a erate...*/..../*
a3a70 0d 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f ..** This versio
a3a80 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 n of the memory
a3a90 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 74 68 65 allocator is the
a3aa0 20 64 65 66 61 75 6c 74 2e 20 20 49 74 20 69 73 default. It is
a3ab0 0d 0a 2a 2a 20 75 73 65 64 20 77 68 65 6e 20 6e ..** used when n
a3ac0 6f 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 61 o other memory a
a3ad0 6c 6c 6f 63 61 74 6f 72 20 69 73 20 73 70 65 63 llocator is spec
a3ae0 69 66 69 65 64 20 75 73 69 6e 67 20 63 6f 6d 70 ified using comp
a3af0 69 6c 65 2d 74 69 6d 65 0d 0a 2a 2a 20 6d 61 63 ile-time..** mac
a3b00 72 6f 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 ros...*/..#ifdef
a3b10 20 53 51 4c 49 54 45 5f 5a 45 52 4f 5f 4d 41 4c SQLITE_ZERO_MAL
a3b20 4c 4f 43 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4e 6f LOC..../*..** No
a3b30 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 -op versions of
a3b40 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 all memory alloc
a3b50 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 0d 0a ation routines..
a3b60 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
a3b70 2a 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f *sqlite3MemMallo
a3b80 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 20 72 65 c(int nByte){ re
a3b90 74 75 72 6e 20 30 3b 20 7d 0d 0a 73 74 61 74 69 turn 0; }..stati
a3ba0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 c void sqlite3Me
a3bb0 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 mFree(void *pPri
a3bc0 6f 72 29 7b 20 72 65 74 75 72 6e 3b 20 7d 0d 0a or){ return; }..
a3bd0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c static void *sql
a3be0 69 74 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 ite3MemRealloc(v
a3bf0 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 oid *pPrior, int
a3c00 20 6e 42 79 74 65 29 7b 20 72 65 74 75 72 6e 20 nByte){ return
a3c10 30 3b 20 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 0; }..static int
a3c20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 28 sqlite3MemSize(
a3c30 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 20 72 void *pPrior){ r
a3c40 65 74 75 72 6e 20 30 3b 20 7d 0d 0a 73 74 61 74 eturn 0; }..stat
a3c50 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 ic int sqlite3Me
a3c60 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b mRoundup(int n){
a3c70 20 72 65 74 75 72 6e 20 6e 3b 20 7d 0d 0a 73 74 return n; }..st
a3c80 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 atic int sqlite3
a3c90 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 4e 6f MemInit(void *No
a3ca0 74 55 73 65 64 29 7b 20 72 65 74 75 72 6e 20 53 tUsed){ return S
a3cb0 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0d 0a 73 74 61 QLITE_OK; }..sta
a3cc0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 tic void sqlite3
a3cd0 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 MemShutdown(void
a3ce0 20 2a 4e 6f 74 55 73 65 64 29 7b 20 72 65 74 75 *NotUsed){ retu
a3cf0 72 6e 3b 20 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 rn; }..../*..**
a3d00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
a3d10 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 the only routine
a3d20 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 in this file wi
a3d30 74 68 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b th external link
a3d40 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 6f 70 age...**..** Pop
a3d50 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 ulate the low-le
a3d60 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 vel memory alloc
a3d70 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 ation function p
a3d80 6f 69 6e 74 65 72 73 20 69 6e 0d 0a 2a 2a 20 73 ointers in..** s
a3d90 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
a3da0 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 ig.m with pointe
a3db0 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e rs to the routin
a3dc0 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e es in this file.
a3dd0 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
a3de0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
a3df0 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 3MemSetDefault(v
a3e00 6f 69 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 oid){.. static
a3e10 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 const sqlite3_me
a3e20 6d 5f 6d 65 74 68 6f 64 73 20 64 65 66 61 75 6c m_methods defaul
a3e30 74 4d 65 74 68 6f 64 73 20 3d 20 7b 0d 0a 20 20 tMethods = {..
a3e40 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c sqlite3MemMal
a3e50 6c 6f 63 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 loc,.. sqlit
a3e60 65 33 4d 65 6d 46 72 65 65 2c 0d 0a 20 20 20 20 e3MemFree,..
a3e70 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c sqlite3MemReall
a3e80 6f 63 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 oc,.. sqlite
a3e90 33 4d 65 6d 53 69 7a 65 2c 0d 0a 20 20 20 20 20 3MemSize,..
a3ea0 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e 64 75 sqlite3MemRoundu
a3eb0 70 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 33 p,.. sqlite3
a3ec0 4d 65 6d 49 6e 69 74 2c 0d 0a 20 20 20 20 20 73 MemInit,.. s
a3ed0 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 qlite3MemShutdow
a3ee0 6e 2c 0d 0a 20 20 20 20 20 30 0d 0a 20 20 7d 3b n,.. 0.. };
a3ef0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 .. sqlite3_conf
a3f00 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ig(SQLITE_CONFIG
a3f10 5f 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61 75 6c _MALLOC, &defaul
a3f20 74 4d 65 74 68 6f 64 73 29 3b 0d 0a 7d 0d 0a 0d tMethods);..}...
a3f30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
a3f40 45 5f 5a 45 52 4f 5f 4d 41 4c 4c 4f 43 20 2a 2f E_ZERO_MALLOC */
a3f50 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
a3f60 2a 2a 2a 20 45 6e 64 20 6f 66 20 6d 65 6d 30 2e *** End of mem0.
a3f70 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a c **************
a3f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3fa0 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
a3fb0 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
a3fc0 6d 65 6d 31 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a mem1.c *********
a3fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a3ff0 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
a4000 37 20 41 75 67 75 73 74 20 31 34 0d 0a 2a 2a 0d 7 August 14..**.
a4010 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 .** The author d
a4020 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 isclaims copyrig
a4030 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 ht to this sourc
a4040 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 e code. In plac
a4050 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c e of..** a legal
a4060 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 notice, here is
a4070 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a a blessing:..**
a4080 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
a4090 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 do good and not
a40a0 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 evil...** May
a40b0 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 you find forgiv
a40c0 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 eness for yourse
a40d0 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f lf and forgive o
a40e0 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 thers...** Ma
a40f0 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 y you share free
a4100 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 ly, never taking
a4110 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 more than you g
a4120 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a ive...**..******
a4130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a4140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a4150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a4160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a4170 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 ***..**..** This
a4180 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c file contains l
a4190 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 ow-level memory
a41a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 64 72 69 76 65 allocation drive
a41b0 72 73 20 66 6f 72 20 77 68 65 6e 0d 0a 2a 2a 20 rs for when..**
a41c0 53 51 4c 69 74 65 20 77 69 6c 6c 20 75 73 65 20 SQLite will use
a41d0 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 2d 6c the standard C-l
a41e0 69 62 72 61 72 79 20 6d 61 6c 6c 6f 63 2f 72 65 ibrary malloc/re
a41f0 61 6c 6c 6f 63 2f 66 72 65 65 20 69 6e 74 65 72 alloc/free inter
a4200 66 61 63 65 0d 0a 2a 2a 20 74 6f 20 6f 62 74 61 face..** to obta
a4210 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 74 in the memory it
a4220 20 6e 65 65 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 needs...**..**
a4230 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 This file contai
a4240 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ns implementatio
a4250 6e 73 20 6f 66 20 74 68 65 20 6c 6f 77 2d 6c 65 ns of the low-le
a4260 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 vel memory alloc
a4270 61 74 69 6f 6e 0d 0a 2a 2a 20 72 6f 75 74 69 6e ation..** routin
a4280 65 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 es specified in
a4290 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f the sqlite3_mem_
a42a0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0d methods object..
a42b0 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 .*/..../*..** Th
a42c0 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 is version of th
a42d0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 e memory allocat
a42e0 6f 72 20 69 73 20 74 68 65 20 64 65 66 61 75 6c or is the defaul
a42f0 74 2e 20 20 49 74 20 69 73 0d 0a 2a 2a 20 75 73 t. It is..** us
a4300 65 64 20 77 68 65 6e 20 6e 6f 20 6f 74 68 65 72 ed when no other
a4310 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f memory allocato
a4320 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 r is specified u
a4330 73 69 6e 67 20 63 6f 6d 70 69 6c 65 2d 74 69 6d sing compile-tim
a4340 65 0d 0a 2a 2a 20 6d 61 63 72 6f 73 2e 0d 0a 2a e..** macros...*
a4350 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
a4360 5f 53 59 53 54 45 4d 5f 4d 41 4c 4c 4f 43 0d 0a _SYSTEM_MALLOC..
a4370 0d 0a 2f 2a 0d 0a 2a 2a 20 57 69 6e 64 6f 77 73 ../*..** Windows
a4380 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6d 61 systems have ma
a4390 6c 6c 6f 63 5f 75 73 61 62 6c 65 5f 73 69 7a 65 lloc_usable_size
a43a0 28 29 20 62 75 74 20 69 74 20 69 73 20 63 61 6c () but it is cal
a43b0 6c 65 64 20 5f 6d 73 69 7a 65 28 29 0d 0a 2a 2f led _msize()..*/
a43c0 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 ..#if !defined(H
a43d0 41 56 45 5f 4d 41 4c 4c 4f 43 5f 55 53 41 42 4c AVE_MALLOC_USABL
a43e0 45 5f 53 49 5a 45 29 20 26 26 20 53 51 4c 49 54 E_SIZE) && SQLIT
a43f0 45 5f 4f 53 5f 57 49 4e 0d 0a 23 20 64 65 66 69 E_OS_WIN..# defi
a4400 6e 65 20 48 41 56 45 5f 4d 41 4c 4c 4f 43 5f 55 ne HAVE_MALLOC_U
a4410 53 41 42 4c 45 5f 53 49 5a 45 20 31 0d 0a 23 20 SABLE_SIZE 1..#
a4420 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 5f 75 73 define malloc_us
a4430 61 62 6c 65 5f 73 69 7a 65 20 5f 6d 73 69 7a 65 able_size _msize
a4440 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 ..#endif....#if
a4450 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f defined(__APPLE_
a4460 5f 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 73 65 _)..../*..** Use
a4470 20 74 68 65 20 7a 6f 6e 65 20 61 6c 6c 6f 63 61 the zone alloca
a4480 74 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e tor available on
a4490 20 61 70 70 6c 65 20 70 72 6f 64 75 63 74 73 0d apple products.
a44a0 0a 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 .*/..#include <s
a44b0 79 73 2f 73 79 73 63 74 6c 2e 68 3e 0d 0a 23 69 ys/sysctl.h>..#i
a44c0 6e 63 6c 75 64 65 20 3c 6d 61 6c 6c 6f 63 2f 6d nclude <malloc/m
a44d0 61 6c 6c 6f 63 2e 68 3e 0d 0a 23 69 6e 63 6c 75 alloc.h>..#inclu
a44e0 64 65 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74 de <libkern/OSAt
a44f0 6f 6d 69 63 2e 68 3e 0d 0a 73 74 61 74 69 63 20 omic.h>..static
a4500 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 5f 74 2a 20 5f malloc_zone_t* _
a4510 73 71 6c 69 74 65 5a 6f 6e 65 5f 3b 0d 0a 23 64 sqliteZone_;..#d
a4520 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 4c efine SQLITE_MAL
a4530 4c 4f 43 28 78 29 20 6d 61 6c 6c 6f 63 5f 7a 6f LOC(x) malloc_zo
a4540 6e 65 5f 6d 61 6c 6c 6f 63 28 5f 73 71 6c 69 74 ne_malloc(_sqlit
a4550 65 5a 6f 6e 65 5f 2c 20 28 78 29 29 0d 0a 23 64 eZone_, (x))..#d
a4560 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 52 45 efine SQLITE_FRE
a4570 45 28 78 29 20 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 E(x) malloc_zone
a4580 5f 66 72 65 65 28 5f 73 71 6c 69 74 65 5a 6f 6e _free(_sqliteZon
a4590 65 5f 2c 20 28 78 29 29 3b 0d 0a 23 64 65 66 69 e_, (x));..#defi
a45a0 6e 65 20 53 51 4c 49 54 45 5f 52 45 41 4c 4c 4f ne SQLITE_REALLO
a45b0 43 28 78 2c 79 29 20 6d 61 6c 6c 6f 63 5f 7a 6f C(x,y) malloc_zo
a45c0 6e 65 5f 72 65 61 6c 6c 6f 63 28 5f 73 71 6c 69 ne_realloc(_sqli
a45d0 74 65 5a 6f 6e 65 5f 2c 20 28 78 29 2c 20 28 79 teZone_, (x), (y
a45e0 29 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 ))..#define SQLI
a45f0 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a 45 28 78 29 TE_MALLOCSIZE(x)
a4600 20 5c 0d 0a 20 20 20 20 20 20 20 20 28 5f 73 71 \.. (_sq
a4610 6c 69 74 65 5a 6f 6e 65 5f 20 3f 20 5f 73 71 6c liteZone_ ? _sql
a4620 69 74 65 5a 6f 6e 65 5f 2d 3e 73 69 7a 65 28 5f iteZone_->size(_
a4630 73 71 6c 69 74 65 5a 6f 6e 65 5f 2c 78 29 20 3a sqliteZone_,x) :
a4640 20 6d 61 6c 6c 6f 63 5f 73 69 7a 65 28 78 29 29 malloc_size(x))
a4650 0d 0a 0d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 ....#else /* if
a4660 6e 6f 74 20 5f 5f 41 50 50 4c 45 5f 5f 20 2a 2f not __APPLE__ */
a4670 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 73 65 20 73 ..../*..** Use s
a4680 74 61 6e 64 61 72 64 20 43 20 6c 69 62 72 61 72 tandard C librar
a4690 79 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 66 72 65 y malloc and fre
a46a0 65 20 6f 6e 20 6e 6f 6e 2d 41 70 70 6c 65 20 73 e on non-Apple s
a46b0 79 73 74 65 6d 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 ystems...*/..#de
a46c0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 4c 4c fine SQLITE_MALL
a46d0 4f 43 28 78 29 20 20 20 20 6d 61 6c 6c 6f 63 28 OC(x) malloc(
a46e0 78 29 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 x)..#define SQLI
a46f0 54 45 5f 46 52 45 45 28 78 29 20 20 20 20 20 20 TE_FREE(x)
a4700 66 72 65 65 28 78 29 0d 0a 23 64 65 66 69 6e 65 free(x)..#define
a4710 20 53 51 4c 49 54 45 5f 52 45 41 4c 4c 4f 43 28 SQLITE_REALLOC(
a4720 78 2c 79 29 20 72 65 61 6c 6c 6f 63 28 28 78 29 x,y) realloc((x)
a4730 2c 28 79 29 29 0d 0a 0d 0a 23 69 66 64 65 66 20 ,(y))....#ifdef
a4740 48 41 56 45 5f 4d 41 4c 4c 4f 43 5f 55 53 41 42 HAVE_MALLOC_USAB
a4750 4c 45 5f 53 49 5a 45 0d 0a 23 69 6e 63 6c 75 64 LE_SIZE..#includ
a4760 65 20 3c 6d 61 6c 6c 6f 63 2e 68 3e 0d 0a 23 64 e <malloc.h>..#d
a4770 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 4c efine SQLITE_MAL
a4780 4c 4f 43 53 49 5a 45 28 78 29 20 6d 61 6c 6c 6f LOCSIZE(x) mallo
a4790 63 5f 75 73 61 62 6c 65 5f 73 69 7a 65 28 78 29 c_usable_size(x)
a47a0 0d 0a 23 65 6c 73 65 0d 0a 23 75 6e 64 65 66 20 ..#else..#undef
a47b0 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a SQLITE_MALLOCSIZ
a47c0 45 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 65 6e E..#endif....#en
a47d0 64 69 66 20 2f 2a 20 5f 5f 41 50 50 4c 45 5f 5f dif /* __APPLE__
a47e0 20 6f 72 20 6e 6f 74 20 5f 5f 41 50 50 4c 45 5f or not __APPLE_
a47f0 5f 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c _ */..../*..** L
a4800 69 6b 65 20 6d 61 6c 6c 6f 63 28 29 2c 20 62 75 ike malloc(), bu
a4810 74 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 73 t remember the s
a4820 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 ize of the alloc
a4830 61 74 69 6f 6e 0d 0a 2a 2a 20 73 6f 20 74 68 61 ation..** so tha
a4840 74 20 77 65 20 63 61 6e 20 66 69 6e 64 20 69 74 t we can find it
a4850 20 6c 61 74 65 72 20 75 73 69 6e 67 20 73 71 6c later using sql
a4860 69 74 65 33 4d 65 6d 53 69 7a 65 28 29 2e 0d 0a ite3MemSize()...
a4870 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 **..** For this
a4880 6c 6f 77 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e low-level routin
a4890 65 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e e, we are guaran
a48a0 74 65 65 64 20 74 68 61 74 20 6e 42 79 74 65 3e teed that nByte>
a48b0 30 20 62 65 63 61 75 73 65 0d 0a 2a 2a 20 63 61 0 because..** ca
a48c0 73 65 73 20 6f 66 20 6e 42 79 74 65 3c 3d 30 20 ses of nByte<=0
a48d0 77 69 6c 6c 20 62 65 20 69 6e 74 65 72 63 65 70 will be intercep
a48e0 74 65 64 20 61 6e 64 20 64 65 61 6c 74 20 77 69 ted and dealt wi
a48f0 74 68 20 62 79 20 68 69 67 68 65 72 20 6c 65 76 th by higher lev
a4900 65 6c 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e el..** routines.
a4910 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
a4920 64 20 2a 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c d *sqlite3MemMal
a4930 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 0d loc(int nByte){.
a4940 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d .#ifdef SQLITE_M
a4950 41 4c 4c 4f 43 53 49 5a 45 0d 0a 20 20 76 6f 69 ALLOCSIZE.. voi
a4960 64 20 2a 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 d *p = SQLITE_MA
a4970 4c 4c 4f 43 28 20 6e 42 79 74 65 20 29 3b 0d 0a LLOC( nByte );..
a4980 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 if( p==0 ){..
a4990 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c testcase( sql
a49a0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
a49b0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0d 0a 20 20 20 .xLog!=0 );..
a49c0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c sqlite3_log(SQL
a49d0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c ITE_NOMEM, "fail
a49e0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 ed to allocate %
a49f0 75 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 u bytes of memor
a4a00 79 22 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d y", nByte);.. }
a4a10 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 23 .. return p;..#
a4a20 65 6c 73 65 0d 0a 20 20 73 71 6c 69 74 65 33 5f else.. sqlite3_
a4a30 69 6e 74 36 34 20 2a 70 3b 0d 0a 20 20 61 73 73 int64 *p;.. ass
a4a40 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0d ert( nByte>0 );.
a4a50 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 . nByte = ROUND
a4a60 38 28 6e 42 79 74 65 29 3b 0d 0a 20 20 70 20 3d 8(nByte);.. p =
a4a70 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 28 20 SQLITE_MALLOC(
a4a80 6e 42 79 74 65 2b 38 20 29 3b 0d 0a 20 20 69 66 nByte+8 );.. if
a4a90 28 20 70 20 29 7b 0d 0a 20 20 20 20 70 5b 30 5d ( p ){.. p[0]
a4aa0 20 3d 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 70 = nByte;.. p
a4ab0 2b 2b 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 ++;.. }else{..
a4ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c testcase( sql
a4ad0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
a4ae0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0d 0a 20 20 20 .xLog!=0 );..
a4af0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c sqlite3_log(SQL
a4b00 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c ITE_NOMEM, "fail
a4b10 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 ed to allocate %
a4b20 75 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 u bytes of memor
a4b30 79 22 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d y", nByte);.. }
a4b40 0d 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 .. return (void
a4b50 20 2a 29 70 3b 0d 0a 23 65 6e 64 69 66 0d 0a 7d *)p;..#endif..}
a4b60 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 69 6b 65 20 ..../*..** Like
a4b70 66 72 65 65 28 29 20 62 75 74 20 77 6f 72 6b 73 free() but works
a4b80 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 for allocations
a4b90 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
a4ba0 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28 qlite3MemMalloc(
a4bb0 29 0d 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 )..** or sqlite3
a4bc0 4d 65 6d 52 65 61 6c 6c 6f 63 28 29 2e 0d 0a 2a MemRealloc()...*
a4bd0 2a 0d 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 6c *..** For this l
a4be0 6f 77 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 ow-level routine
a4bf0 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f , we already kno
a4c00 77 20 74 68 61 74 20 70 50 72 69 6f 72 21 3d 30 w that pPrior!=0
a4c10 20 73 69 6e 63 65 0d 0a 2a 2a 20 63 61 73 65 73 since..** cases
a4c20 20 77 68 65 72 65 20 70 50 72 69 6f 72 3d 3d 30 where pPrior==0
a4c30 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 will have been
a4c40 69 6e 74 65 63 65 70 74 65 64 20 61 6e 64 20 64 intecepted and d
a4c50 65 61 6c 74 20 77 69 74 68 0d 0a 2a 2a 20 62 79 ealt with..** by
a4c60 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f higher-level ro
a4c70 75 74 69 6e 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 utines...*/..sta
a4c80 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 tic void sqlite3
a4c90 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 MemFree(void *pP
a4ca0 72 69 6f 72 29 7b 0d 0a 23 69 66 64 65 66 20 53 rior){..#ifdef S
a4cb0 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a 45 QLITE_MALLOCSIZE
a4cc0 0d 0a 20 20 53 51 4c 49 54 45 5f 46 52 45 45 28 .. SQLITE_FREE(
a4cd0 70 50 72 69 6f 72 29 3b 0d 0a 23 65 6c 73 65 0d pPrior);..#else.
a4ce0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
a4cf0 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 *p = (sqlite3_i
a4d00 6e 74 36 34 2a 29 70 50 72 69 6f 72 3b 0d 0a 20 nt64*)pPrior;..
a4d10 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 21 assert( pPrior!
a4d20 3d 30 20 29 3b 0d 0a 20 20 70 2d 2d 3b 0d 0a 20 =0 );.. p--;..
a4d30 20 53 51 4c 49 54 45 5f 46 52 45 45 28 70 29 3b SQLITE_FREE(p);
a4d40 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f ..#endif..}..../
a4d50 2a 0d 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 *..** Report the
a4d60 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 allocated size
a4d70 6f 66 20 61 20 70 72 69 6f 72 20 72 65 74 75 72 of a prior retur
a4d80 6e 20 66 72 6f 6d 20 78 4d 61 6c 6c 6f 63 28 29 n from xMalloc()
a4d90 0d 0a 2a 2a 20 6f 72 20 78 52 65 61 6c 6c 6f 63 ..** or xRealloc
a4da0 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ()...*/..static
a4db0 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 int sqlite3MemSi
a4dc0 7a 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 ze(void *pPrior)
a4dd0 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 {..#ifdef SQLITE
a4de0 5f 4d 41 4c 4c 4f 43 53 49 5a 45 0d 0a 20 20 72 _MALLOCSIZE.. r
a4df0 65 74 75 72 6e 20 70 50 72 69 6f 72 20 3f 20 28 eturn pPrior ? (
a4e00 69 6e 74 29 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f int)SQLITE_MALLO
a4e10 43 53 49 5a 45 28 70 50 72 69 6f 72 29 20 3a 20 CSIZE(pPrior) :
a4e20 30 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 73 71 6c 0;..#else.. sql
a4e30 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 3b 0d 0a ite3_int64 *p;..
a4e40 20 20 69 66 28 20 70 50 72 69 6f 72 3d 3d 30 20 if( pPrior==0
a4e50 29 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 70 ) return 0;.. p
a4e60 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 = (sqlite3_int6
a4e70 34 2a 29 70 50 72 69 6f 72 3b 0d 0a 20 20 70 2d 4*)pPrior;.. p-
a4e80 2d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e -;.. return (in
a4e90 74 29 70 5b 30 5d 3b 0d 0a 23 65 6e 64 69 66 0d t)p[0];..#endif.
a4ea0 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 69 6b .}..../*..** Lik
a4eb0 65 20 72 65 61 6c 6c 6f 63 28 29 2e 20 20 52 65 e realloc(). Re
a4ec0 73 69 7a 65 20 61 6e 20 61 6c 6c 6f 63 61 74 69 size an allocati
a4ed0 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62 on previously ob
a4ee0 74 61 69 6e 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 tained from..**
a4ef0 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 sqlite3MemMalloc
a4f00 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 ()...**..** For
a4f10 74 68 69 73 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 this low-level i
a4f20 6e 74 65 72 66 61 63 65 2c 20 77 65 20 6b 6e 6f nterface, we kno
a4f30 77 20 74 68 61 74 20 70 50 72 69 6f 72 21 3d 30 w that pPrior!=0
a4f40 2e 20 20 43 61 73 65 73 20 77 68 65 72 65 0d 0a . Cases where..
a4f50 2a 2a 20 70 50 72 69 6f 72 3d 3d 30 20 77 68 69 ** pPrior==0 whi
a4f60 6c 65 20 68 61 76 65 20 62 65 65 6e 20 69 6e 74 le have been int
a4f70 65 72 63 65 70 74 65 64 20 62 79 20 68 69 67 68 ercepted by high
a4f80 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 er-level routine
a4f90 20 61 6e 64 0d 0a 2a 2a 20 72 65 64 69 72 65 63 and..** redirec
a4fa0 74 65 64 20 74 6f 20 78 4d 61 6c 6c 6f 63 2e 20 ted to xMalloc.
a4fb0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 77 65 20 6b Similarly, we k
a4fc0 6e 6f 77 20 74 68 61 74 20 6e 42 79 74 65 3e 30 now that nByte>0
a4fd0 20 62 65 63 61 75 73 65 73 0d 0a 2a 2a 20 63 61 becauses..** ca
a4fe0 73 65 73 20 77 68 65 72 65 20 6e 42 79 74 65 3c ses where nByte<
a4ff0 3d 30 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 =0 will have bee
a5000 6e 20 69 6e 74 65 72 63 65 70 74 65 64 20 62 79 n intercepted by
a5010 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 0d 0a 2a higher-level..*
a5020 2a 20 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 72 * routines and r
a5030 65 64 69 72 65 63 74 65 64 20 74 6f 20 78 46 72 edirected to xFr
a5040 65 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ee...*/..static
a5050 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 65 6d void *sqlite3Mem
a5060 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 Realloc(void *pP
a5070 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 29 rior, int nByte)
a5080 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 {..#ifdef SQLITE
a5090 5f 4d 41 4c 4c 4f 43 53 49 5a 45 0d 0a 20 20 76 _MALLOCSIZE.. v
a50a0 6f 69 64 20 2a 70 20 3d 20 53 51 4c 49 54 45 5f oid *p = SQLITE_
a50b0 52 45 41 4c 4c 4f 43 28 70 50 72 69 6f 72 2c 20 REALLOC(pPrior,
a50c0 6e 42 79 74 65 29 3b 0d 0a 20 20 69 66 28 20 70 nByte);.. if( p
a50d0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 74 65 73 74 ==0 ){.. test
a50e0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f case( sqlite3Glo
a50f0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d balConfig.xLog!=
a5100 30 20 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 0 );.. sqlite
a5110 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 3_log(SQLITE_NOM
a5120 45 4d 2c 0d 0a 20 20 20 20 20 20 22 66 61 69 6c EM,.. "fail
a5130 65 64 20 6d 65 6d 6f 72 79 20 72 65 73 69 7a 65 ed memory resize
a5140 20 25 75 20 74 6f 20 25 75 20 62 79 74 65 73 22 %u to %u bytes"
a5150 2c 0d 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f ,.. SQLITE_
a5160 4d 41 4c 4c 4f 43 53 49 5a 45 28 70 50 72 69 6f MALLOCSIZE(pPrio
a5170 72 29 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d r), nByte);.. }
a5180 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 23 .. return p;..#
a5190 65 6c 73 65 0d 0a 20 20 73 71 6c 69 74 65 33 5f else.. sqlite3_
a51a0 69 6e 74 36 34 20 2a 70 20 3d 20 28 73 71 6c 69 int64 *p = (sqli
a51b0 74 65 33 5f 69 6e 74 36 34 2a 29 70 50 72 69 6f te3_int64*)pPrio
a51c0 72 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 r;.. assert( pP
a51d0 72 69 6f 72 21 3d 30 20 26 26 20 6e 42 79 74 65 rior!=0 && nByte
a51e0 3e 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 >0 );.. assert(
a51f0 20 6e 42 79 74 65 3d 3d 52 4f 55 4e 44 38 28 6e nByte==ROUND8(n
a5200 42 79 74 65 29 20 29 3b 20 2f 2a 20 45 56 3a 20 Byte) ); /* EV:
a5210 52 2d 34 36 31 39 39 2d 33 30 32 34 39 20 2a 2f R-46199-30249 */
a5220 0d 0a 20 20 70 2d 2d 3b 0d 0a 20 20 70 20 3d 20 .. p--;.. p =
a5230 53 51 4c 49 54 45 5f 52 45 41 4c 4c 4f 43 28 70 SQLITE_REALLOC(p
a5240 2c 20 6e 42 79 74 65 2b 38 20 29 3b 0d 0a 20 20 , nByte+8 );..
a5250 69 66 28 20 70 20 29 7b 0d 0a 20 20 20 20 70 5b if( p ){.. p[
a5260 30 5d 20 3d 20 6e 42 79 74 65 3b 0d 0a 20 20 20 0] = nByte;..
a5270 20 70 2b 2b 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d p++;.. }else{.
a5280 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 . testcase( s
a5290 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
a52a0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0d 0a 20 ig.xLog!=0 );..
a52b0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 sqlite3_log(S
a52c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0d 0a 20 20 QLITE_NOMEM,..
a52d0 20 20 20 20 22 66 61 69 6c 65 64 20 6d 65 6d 6f "failed memo
a52e0 72 79 20 72 65 73 69 7a 65 20 25 75 20 74 6f 20 ry resize %u to
a52f0 25 75 20 62 79 74 65 73 22 2c 0d 0a 20 20 20 20 %u bytes",..
a5300 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 sqlite3MemSize
a5310 28 70 50 72 69 6f 72 29 2c 20 6e 42 79 74 65 29 (pPrior), nByte)
a5320 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
a5330 20 28 76 6f 69 64 2a 29 70 3b 0d 0a 23 65 6e 64 (void*)p;..#end
a5340 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 if..}..../*..**
a5350 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 Round up a reque
a5360 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e st size to the n
a5370 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 ext valid alloca
a5380 74 69 6f 6e 20 73 69 7a 65 2e 0d 0a 2a 2f 0d 0a tion size...*/..
a5390 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 static int sqlit
a53a0 65 33 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 e3MemRoundup(int
a53b0 20 6e 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 52 n){.. return R
a53c0 4f 55 4e 44 38 28 6e 29 3b 0d 0a 7d 0d 0a 0d 0a OUND8(n);..}....
a53d0 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a /*..** Initializ
a53e0 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0d 0a e this module...
a53f0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 */..static int s
a5400 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74 28 76 6f qlite3MemInit(vo
a5410 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0d 0a 23 id *NotUsed){..#
a5420 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 if defined(__APP
a5430 4c 45 5f 5f 29 0d 0a 20 20 69 6e 74 20 63 70 75 LE__).. int cpu
a5440 43 6f 75 6e 74 3b 0d 0a 20 20 73 69 7a 65 5f 74 Count;.. size_t
a5450 20 6c 65 6e 3b 0d 0a 20 20 69 66 28 20 5f 73 71 len;.. if( _sq
a5460 6c 69 74 65 5a 6f 6e 65 5f 20 29 7b 0d 0a 20 20 liteZone_ ){..
a5470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
a5480 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 6c 65 6e 20 OK;.. }.. len
a5490 3d 20 73 69 7a 65 6f 66 28 63 70 75 43 6f 75 6e = sizeof(cpuCoun
a54a0 74 29 3b 0d 0a 20 20 2f 2a 20 4f 6e 65 20 75 73 t);.. /* One us
a54b0 75 61 6c 6c 79 20 77 61 6e 74 73 20 74 6f 20 75 ually wants to u
a54c0 73 65 20 68 77 2e 61 63 63 74 69 76 65 63 70 75 se hw.acctivecpu
a54d0 20 66 6f 72 20 4d 54 20 64 65 63 69 73 69 6f 6e for MT decision
a54e0 73 2c 20 62 75 74 20 6e 6f 74 20 68 65 72 65 20 s, but not here
a54f0 2a 2f 0d 0a 20 20 73 79 73 63 74 6c 62 79 6e 61 */.. sysctlbyna
a5500 6d 65 28 22 68 77 2e 6e 63 70 75 22 2c 20 26 63 me("hw.ncpu", &c
a5510 70 75 43 6f 75 6e 74 2c 20 26 6c 65 6e 2c 20 4e puCount, &len, N
a5520 55 4c 4c 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 ULL, 0);.. if(
a5530 63 70 75 43 6f 75 6e 74 3e 31 20 29 7b 0d 0a 20 cpuCount>1 ){..
a5540 20 20 20 2f 2a 20 64 65 66 65 72 20 4d 54 20 64 /* defer MT d
a5550 65 63 69 73 69 6f 6e 73 20 74 6f 20 73 79 73 74 ecisions to syst
a5560 65 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0d 0a 20 20 em malloc */..
a5570 20 20 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 20 3d _sqliteZone_ =
a5580 20 6d 61 6c 6c 6f 63 5f 64 65 66 61 75 6c 74 5f malloc_default_
a5590 7a 6f 6e 65 28 29 3b 0d 0a 20 20 7d 65 6c 73 65 zone();.. }else
a55a0 7b 0d 0a 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 31 {.. /* only 1
a55b0 20 63 6f 72 65 2c 20 75 73 65 20 6f 75 72 20 6f core, use our o
a55c0 77 6e 20 7a 6f 6e 65 20 74 6f 20 63 6f 6e 74 65 wn zone to conte
a55d0 6e 74 69 6f 6e 20 6f 76 65 72 20 67 6c 6f 62 61 ntion over globa
a55e0 6c 20 6c 6f 63 6b 73 2c 20 0d 0a 20 20 20 20 2a l locks, .. *
a55f0 2a 20 65 2e 67 2e 20 77 65 20 68 61 76 65 20 6f * e.g. we have o
a5600 75 72 20 6f 77 6e 20 64 65 64 69 63 61 74 65 64 ur own dedicated
a5610 20 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 20 20 62 locks */.. b
a5620 6f 6f 6c 20 73 75 63 63 65 73 73 3b 09 09 0d 0a ool success;....
a5630 20 20 20 20 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 5f malloc_zone_
a5640 74 2a 20 6e 65 77 7a 6f 6e 65 20 3d 20 6d 61 6c t* newzone = mal
a5650 6c 6f 63 5f 63 72 65 61 74 65 5f 7a 6f 6e 65 28 loc_create_zone(
a5660 34 30 39 36 2c 20 30 29 3b 0d 0a 20 20 20 20 6d 4096, 0);.. m
a5670 61 6c 6c 6f 63 5f 73 65 74 5f 7a 6f 6e 65 5f 6e alloc_set_zone_n
a5680 61 6d 65 28 6e 65 77 7a 6f 6e 65 2c 20 22 53 71 ame(newzone, "Sq
a5690 6c 69 74 65 5f 48 65 61 70 22 29 3b 0d 0a 20 20 lite_Heap");..
a56a0 20 20 64 6f 7b 0d 0a 20 20 20 20 20 20 73 75 63 do{.. suc
a56b0 63 65 73 73 20 3d 20 4f 53 41 74 6f 6d 69 63 43 cess = OSAtomicC
a56c0 6f 6d 70 61 72 65 41 6e 64 53 77 61 70 50 74 72 ompareAndSwapPtr
a56d0 42 61 72 72 69 65 72 28 4e 55 4c 4c 2c 20 6e 65 Barrier(NULL, ne
a56e0 77 7a 6f 6e 65 2c 20 0d 0a 20 20 20 20 20 20 20 wzone, ..
a56f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a5700 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 (void
a5710 2a 20 76 6f 6c 61 74 69 6c 65 20 2a 29 26 5f 73 * volatile *)&_s
a5720 71 6c 69 74 65 5a 6f 6e 65 5f 29 3b 0d 0a 20 20 qliteZone_);..
a5730 20 20 7d 77 68 69 6c 65 28 21 5f 73 71 6c 69 74 }while(!_sqlit
a5740 65 5a 6f 6e 65 5f 29 3b 0d 0a 20 20 20 20 69 66 eZone_);.. if
a5750 28 20 21 73 75 63 63 65 73 73 20 29 7b 09 0d 0a ( !success ){...
a5760 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 62 6f 64 /* somebod
a5770 79 20 72 65 67 69 73 74 65 72 65 64 20 61 20 7a y registered a z
a5780 6f 6e 65 20 66 69 72 73 74 20 2a 2f 0d 0a 20 20 one first */..
a5790 20 20 20 20 6d 61 6c 6c 6f 63 5f 64 65 73 74 72 malloc_destr
a57a0 6f 79 5f 7a 6f 6e 65 28 6e 65 77 7a 6f 6e 65 29 oy_zone(newzone)
a57b0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 ;.. }.. }..#
a57c0 65 6e 64 69 66 0d 0a 20 20 55 4e 55 53 45 44 5f endif.. UNUSED_
a57d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 PARAMETER(NotUse
a57e0 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 d);.. return SQ
a57f0 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f LITE_OK;..}..../
a5800 2a 0d 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 *..** Deinitiali
a5810 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0d ze this module..
a5820 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
a5830 20 73 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64 sqlite3MemShutd
a5840 6f 77 6e 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 own(void *NotUse
a5850 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 d){.. UNUSED_PA
a5860 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 RAMETER(NotUsed)
a5870 3b 0d 0a 20 20 72 65 74 75 72 6e 3b 0d 0a 7d 0d ;.. return;..}.
a5880 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 .../*..** This r
a5890 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e outine is the on
a58a0 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 ly routine in th
a58b0 69 73 20 66 69 6c 65 20 77 69 74 68 20 65 78 74 is file with ext
a58c0 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0d 0a ernal linkage...
a58d0 2a 2a 0d 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 **..** Populate
a58e0 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 the low-level me
a58f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
a5900 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 function pointer
a5910 73 20 69 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 s in..** sqlite3
a5920 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 GlobalConfig.m w
a5930 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 ith pointers to
a5940 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 the routines in
a5950 74 68 69 73 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a this file...*/..
a5960 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
a5970 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 oid sqlite3MemSe
a5980 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0d tDefault(void){.
a5990 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 . static const
a59a0 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
a59b0 6f 64 73 20 64 65 66 61 75 6c 74 4d 65 74 68 6f ods defaultMetho
a59c0 64 73 20 3d 20 7b 0d 0a 20 20 20 20 20 73 71 6c ds = {.. sql
a59d0 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c 0d 0a ite3MemMalloc,..
a59e0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 sqlite3MemF
a59f0 72 65 65 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 ree,.. sqlit
a5a00 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0d 0a 20 e3MemRealloc,..
a5a10 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 sqlite3MemSi
a5a20 7a 65 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 ze,.. sqlite
a5a30 33 4d 65 6d 52 6f 75 6e 64 75 70 2c 0d 0a 20 20 3MemRoundup,..
a5a40 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e 69 sqlite3MemIni
a5a50 74 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 33 t,.. sqlite3
a5a60 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0d 0a 20 20 MemShutdown,..
a5a70 20 20 20 30 0d 0a 20 20 7d 3b 0d 0a 20 20 73 71 0.. };.. sq
a5a80 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c lite3_config(SQL
a5a90 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f ITE_CONFIG_MALLO
a5aa0 43 2c 20 26 64 65 66 61 75 6c 74 4d 65 74 68 6f C, &defaultMetho
a5ab0 64 73 29 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 ds);..}....#endi
a5ac0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 59 53 54 f /* SQLITE_SYST
a5ad0 45 4d 5f 4d 41 4c 4c 4f 43 20 2a 2f 0d 0a 0d 0a EM_MALLOC */....
a5ae0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
a5af0 45 6e 64 20 6f 66 20 6d 65 6d 31 2e 63 20 2a 2a End of mem1.c **
a5b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
a5b30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
a5b40 20 42 65 67 69 6e 20 66 69 6c 65 20 6d 65 6d 32 Begin file mem2
a5b50 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .c *************
a5b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
a5b80 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 37 20 41 75 ../*..** 2007 Au
a5b90 67 75 73 74 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 gust 15..**..**
a5ba0 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c The author discl
a5bb0 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 aims copyright t
a5bc0 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f o this source co
a5bd0 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 de. In place of
a5be0 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 ..** a legal not
a5bf0 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 ice, here is a b
a5c00 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a lessing:..**..**
a5c10 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 May you do g
a5c20 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c ood and not evil
a5c30 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
a5c40 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 find forgivenes
a5c50 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 s for yourself a
a5c60 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 nd forgive other
a5c70 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f s...** May yo
a5c80 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 u share freely,
a5c90 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 never taking mor
a5ca0 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e e than you give.
a5cb0 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**..**********
a5cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a5cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
a5d00 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c .**..** This fil
a5d10 65 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 77 2d 6c e contains low-l
a5d20 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f evel memory allo
a5d30 63 61 74 69 6f 6e 20 64 72 69 76 65 72 73 20 66 cation drivers f
a5d40 6f 72 20 77 68 65 6e 0d 0a 2a 2a 20 53 51 4c 69 or when..** SQLi
a5d50 74 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 te will use the
a5d60 73 74 61 6e 64 61 72 64 20 43 2d 6c 69 62 72 61 standard C-libra
a5d70 72 79 20 6d 61 6c 6c 6f 63 2f 72 65 61 6c 6c 6f ry malloc/reallo
a5d80 63 2f 66 72 65 65 20 69 6e 74 65 72 66 61 63 65 c/free interface
a5d90 0d 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74 ..** to obtain t
a5da0 68 65 20 6d 65 6d 6f 72 79 20 69 74 20 6e 65 65 he memory it nee
a5db0 64 73 20 77 68 69 6c 65 20 61 64 64 69 6e 67 20 ds while adding
a5dc0 6c 6f 74 73 20 6f 66 20 61 64 64 69 74 69 6f 6e lots of addition
a5dd0 61 6c 20 64 65 62 75 67 67 69 6e 67 0d 0a 2a 2a al debugging..**
a5de0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 information to
a5df0 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 each allocation
a5e00 69 6e 20 6f 72 64 65 72 20 74 6f 20 68 65 6c 70 in order to help
a5e10 20 64 65 74 65 63 74 20 61 6e 64 20 66 69 78 20 detect and fix
a5e20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 6c 65 61 6b 73 memory..** leaks
a5e30 20 61 6e 64 20 6d 65 6d 6f 72 79 20 75 73 61 67 and memory usag
a5e40 65 20 65 72 72 6f 72 73 2e 0d 0a 2a 2a 0d 0a 2a e errors...**..*
a5e50 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
a5e60 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 ains implementat
a5e70 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 77 2d ions of the low-
a5e80 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c level memory all
a5e90 6f 63 61 74 69 6f 6e 0d 0a 2a 2a 20 72 6f 75 74 ocation..** rout
a5ea0 69 6e 65 73 20 73 70 65 63 69 66 69 65 64 20 69 ines specified i
a5eb0 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 n the sqlite3_me
a5ec0 6d 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 m_methods object
a5ed0 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ...*/..../*..**
a5ee0 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 This version of
a5ef0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 the memory alloc
a5f00 61 74 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c ator is used onl
a5f10 79 20 69 66 20 74 68 65 0d 0a 2a 2a 20 53 51 4c y if the..** SQL
a5f20 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 6d 61 63 ITE_MEMDEBUG mac
a5f30 72 6f 20 69 73 20 64 65 66 69 6e 65 64 0d 0a 2a ro is defined..*
a5f40 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
a5f50 5f 4d 45 4d 44 45 42 55 47 0d 0a 0d 0a 2f 2a 0d _MEMDEBUG..../*.
a5f60 0a 2a 2a 20 54 68 65 20 62 61 63 6b 74 72 61 63 .** The backtrac
a5f70 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 e functionality
a5f80 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c is only availabl
a5f90 65 20 77 69 74 68 20 47 4c 49 42 43 0d 0a 2a 2f e with GLIBC..*/
a5fa0 0d 0a 23 69 66 64 65 66 20 5f 5f 47 4c 49 42 43 ..#ifdef __GLIBC
a5fb0 5f 5f 0d 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 __.. extern int
a5fc0 20 62 61 63 6b 74 72 61 63 65 28 76 6f 69 64 2a backtrace(void*
a5fd0 2a 2c 69 6e 74 29 3b 0d 0a 20 20 65 78 74 65 72 *,int);.. exter
a5fe0 6e 20 76 6f 69 64 20 62 61 63 6b 74 72 61 63 65 n void backtrace
a5ff0 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 76 6f 69 64 _symbols_fd(void
a6000 2a 63 6f 6e 73 74 2a 2c 69 6e 74 2c 69 6e 74 29 *const*,int,int)
a6010 3b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 ;..#else..# defi
a6020 6e 65 20 62 61 63 6b 74 72 61 63 65 28 41 2c 42 ne backtrace(A,B
a6030 29 20 31 0d 0a 23 20 64 65 66 69 6e 65 20 62 61 ) 1..# define ba
a6040 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f cktrace_symbols_
a6050 66 64 28 41 2c 42 2c 43 29 0d 0a 23 65 6e 64 69 fd(A,B,C)..#endi
a6060 66 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 3c f../* #include <
a6070 73 74 64 69 6f 2e 68 3e 20 2a 2f 0d 0a 0d 0a 2f stdio.h> */..../
a6080 2a 0d 0a 2a 2a 20 45 61 63 68 20 6d 65 6d 6f 72 *..** Each memor
a6090 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 6f 6f y allocation loo
a60a0 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0d 0a 2a ks like this:..*
a60b0 2a 0d 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d *..** ---------
a60c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a60d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a60e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a60f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d ---------------.
a6100 0a 2a 2a 20 20 7c 20 54 69 74 6c 65 20 7c 20 20 .** | Title |
a6110 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e 74 65 backtrace pointe
a6120 72 73 20 7c 20 20 4d 65 6d 42 6c 6f 63 6b 48 64 rs | MemBlockHd
a6130 72 20 7c 20 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 r | allocation
a6140 7c 20 20 45 6e 64 47 75 61 72 64 20 7c 0d 0a 2a | EndGuard |..*
a6150 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * -------------
a6160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a 2a 0d -----------..**.
a61a0 0a 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61 74 .** The applicat
a61b0 69 6f 6e 20 63 6f 64 65 20 73 65 65 73 20 6f 6e ion code sees on
a61c0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ly a pointer to
a61d0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 the allocation.
a61e0 20 57 65 20 68 61 76 65 0d 0a 2a 2a 20 74 6f 20 We have..** to
a61f0 62 61 63 6b 20 75 70 20 66 72 6f 6d 20 74 68 65 back up from the
a6200 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e allocation poin
a6210 74 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 ter to find the
a6220 4d 65 6d 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68 MemBlockHdr. Th
a6230 65 0d 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 e..** MemBlockHd
a6240 72 20 74 65 6c 6c 73 20 75 73 20 74 68 65 20 73 r tells us the s
a6250 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 ize of the alloc
a6260 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6e 75 ation and the nu
a6270 6d 62 65 72 20 6f 66 0d 0a 2a 2a 20 62 61 63 6b mber of..** back
a6280 74 72 61 63 65 20 70 6f 69 6e 74 65 72 73 2e 20 trace pointers.
a6290 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 There is also a
a62a0 20 67 75 61 72 64 20 77 6f 72 64 20 61 74 20 74 guard word at t
a62b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0d 0a 2a he end of the..*
a62c0 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 2e 0d 0a * MemBlockHdr...
a62d0 2a 2f 0d 0a 73 74 72 75 63 74 20 4d 65 6d 42 6c */..struct MemBl
a62e0 6f 63 6b 48 64 72 20 7b 0d 0a 20 20 69 36 34 20 ockHdr {.. i64
a62f0 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 iSize;
a6300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a6310 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69 73 20 /* Size of this
a6320 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0d 0a 20 allocation */..
a6330 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b struct MemBlock
a6340 48 64 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 Hdr *pNext, *pPr
a6350 65 76 3b 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c ev; /* Linked l
a6360 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 ist of all unfre
a6370 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 ed memory */..
a6380 63 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 3b char nBacktrace;
a6390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a63a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
a63b0 20 62 61 63 6b 74 72 61 63 65 73 20 6f 6e 20 74 backtraces on t
a63c0 68 69 73 20 61 6c 6c 6f 63 20 2a 2f 0d 0a 20 20 his alloc */..
a63d0 63 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 53 char nBacktraceS
a63e0 6c 6f 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 lots;
a63f0 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 /* Available
a6400 20 62 61 63 6b 74 72 61 63 65 20 73 6c 6f 74 73 backtrace slots
a6410 20 2a 2f 0d 0a 20 20 75 38 20 6e 54 69 74 6c 65 */.. u8 nTitle
a6420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
a6430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 /* By
a6440 74 65 73 20 6f 66 20 74 69 74 6c 65 3b 20 69 6e tes of title; in
a6450 63 6c 75 64 65 73 20 27 5c 30 27 20 2a 2f 0d 0a cludes '\0' */..
a6460 20 20 75 38 20 65 54 79 70 65 3b 20 20 20 20 20 u8 eType;
a6470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a6480 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 /* Allocat
a6490 69 6f 6e 20 74 79 70 65 20 63 6f 64 65 20 2a 2f ion type code */
a64a0 0d 0a 20 20 69 6e 74 20 69 46 6f 72 65 47 75 61 .. int iForeGua
a64b0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rd;
a64c0 20 20 20 20 20 20 20 20 2f 2a 20 47 75 61 72 64 /* Guard
a64d0 20 77 6f 72 64 20 66 6f 72 20 73 61 6e 69 74 79 word for sanity
a64e0 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
a64f0 2a 20 47 75 61 72 64 20 77 6f 72 64 73 0d 0a 2a * Guard words..*
a6500 2f 0d 0a 23 64 65 66 69 6e 65 20 46 4f 52 45 47 /..#define FOREG
a6510 55 41 52 44 20 30 78 38 30 46 35 45 31 35 33 0d UARD 0x80F5E153.
a6520 0a 23 64 65 66 69 6e 65 20 52 45 41 52 47 55 41 .#define REARGUA
a6530 52 44 20 30 78 45 34 36 37 36 42 35 33 0d 0a 0d RD 0xE4676B53...
a6540 0a 2f 2a 0d 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f ./*..** Number o
a6550 66 20 6d 61 6c 6c 6f 63 20 73 69 7a 65 20 69 6e f malloc size in
a6560 63 72 65 6d 65 6e 74 73 20 74 6f 20 74 72 61 63 crements to trac
a6570 6b 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 k...*/..#define
a6580 4e 43 53 49 5a 45 20 20 31 30 30 30 0d 0a 0d 0a NCSIZE 1000....
a6590 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 /*..** All of th
a65a0 65 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c e static variabl
a65b0 65 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 es used by this
a65c0 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c 6c 65 module are colle
a65d0 63 74 65 64 0d 0a 2a 2a 20 69 6e 74 6f 20 61 20 cted..** into a
a65e0 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72 65 single structure
a65f0 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e 20 20 54 named "mem". T
a6600 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20 74 his is to keep t
a6610 68 65 0d 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 he..** static va
a6620 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65 riables organize
a6630 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20 d and to reduce
a6640 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74 namespace pollut
a6650 69 6f 6e 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 69 ion..** when thi
a6660 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 s module is comb
a6670 69 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72 20 ined with other
a6680 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 in the amalgamat
a6690 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ion...*/..static
a66a0 20 73 74 72 75 63 74 20 7b 0d 0a 20 20 0d 0a 20 struct {.. ..
a66b0 20 2f 2a 0d 0a 20 20 2a 2a 20 4d 75 74 65 78 20 /*.. ** Mutex
a66c0 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 to control acces
a66d0 73 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 s to the memory
a66e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 allocation subsy
a66f0 73 74 65 6d 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 stem... */.. s
a6700 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 qlite3_mutex *mu
a6710 74 65 78 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 tex;.... /*..
a6720 2a 2a 20 48 65 61 64 20 61 6e 64 20 74 61 69 6c ** Head and tail
a6730 20 6f 66 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 of a linked lis
a6740 74 20 6f 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e t of all outstan
a6750 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 ding allocations
a6760 0d 0a 20 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 .. */.. struct
a6770 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 46 MemBlockHdr *pF
a6780 69 72 73 74 3b 0d 0a 20 20 73 74 72 75 63 74 20 irst;.. struct
a6790 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4c 61 MemBlockHdr *pLa
a67a0 73 74 3b 0d 0a 20 20 0d 0a 20 20 2f 2a 0d 0a 20 st;.. .. /*..
a67b0 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f ** The number o
a67c0 66 20 6c 65 76 65 6c 73 20 6f 66 20 62 61 63 6b f levels of back
a67d0 74 72 61 63 65 20 74 6f 20 73 61 76 65 20 69 6e trace to save in
a67e0 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 new allocations
a67f0 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e ... */.. int n
a6800 42 61 63 6b 74 72 61 63 65 3b 0d 0a 20 20 76 6f Backtrace;.. vo
a6810 69 64 20 28 2a 78 42 61 63 6b 74 72 61 63 65 29 id (*xBacktrace)
a6820 28 69 6e 74 2c 20 69 6e 74 2c 20 76 6f 69 64 20 (int, int, void
a6830 2a 2a 29 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 **);.... /*..
a6840 2a 2a 20 54 69 74 6c 65 20 74 65 78 74 20 74 6f ** Title text to
a6850 20 69 6e 73 65 72 74 20 69 6e 20 66 72 6f 6e 74 insert in front
a6860 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 0d 0a of each block..
a6870 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 69 74 */.. int nTit
a6880 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79 le; /* By
a6890 74 65 73 20 6f 66 20 7a 54 69 74 6c 65 20 74 6f tes of zTitle to
a68a0 20 73 61 76 65 2e 20 20 49 6e 63 6c 75 64 65 73 save. Includes
a68b0 20 27 5c 30 27 20 61 6e 64 20 70 61 64 64 69 6e '\0' and paddin
a68c0 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 7a 54 69 g */.. char zTi
a68d0 74 6c 65 5b 31 30 30 5d 3b 20 20 2f 2a 20 54 68 tle[100]; /* Th
a68e0 65 20 74 69 74 6c 65 20 74 65 78 74 20 2a 2f 0d e title text */.
a68f0 0a 0d 0a 20 20 2f 2a 20 0d 0a 20 20 2a 2a 20 73 ... /* .. ** s
a6900 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 qlite3MallocDisa
a6910 6c 6c 6f 77 28 29 20 69 6e 63 72 65 6d 65 6e 74 llow() increment
a6920 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 s the following
a6930 63 6f 75 6e 74 65 72 2e 0d 0a 20 20 2a 2a 20 73 counter... ** s
a6940 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f qlite3MallocAllo
a6950 77 28 29 20 64 65 63 72 65 6d 65 6e 74 73 20 69 w() decrements i
a6960 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 t... */.. int
a6970 64 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44 6f 20 disallow; /* Do
a6980 6e 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f 72 79 not allow memory
a6990 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0d 0a allocation */..
a69a0 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 47 61 74 .. /*.. ** Gat
a69b0 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f her statistics o
a69c0 6e 20 74 68 65 20 73 69 7a 65 73 20 6f 66 20 6d n the sizes of m
a69d0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
a69e0 73 2e 0d 0a 20 20 2a 2a 20 6e 41 6c 6c 6f 63 5b s... ** nAlloc[
a69f0 69 5d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 i] is the number
a6a00 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 of allocation a
a6a10 74 74 65 6d 70 74 73 20 6f 66 20 69 2a 38 0d 0a ttempts of i*8..
a6a20 20 20 2a 2a 20 62 79 74 65 73 2e 20 20 69 3d 3d ** bytes. i==
a6a30 4e 43 53 49 5a 45 20 69 73 20 74 68 65 20 6e 75 NCSIZE is the nu
a6a40 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 69 mber of allocati
a6a50 6f 6e 20 61 74 74 65 6d 70 74 73 20 66 6f 72 0d on attempts for.
a6a60 0a 20 20 2a 2a 20 73 69 7a 65 73 20 6d 6f 72 65 . ** sizes more
a6a70 20 74 68 61 6e 20 4e 43 53 49 5a 45 2a 38 20 62 than NCSIZE*8 b
a6a80 79 74 65 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 ytes... */.. i
a6a90 6e 74 20 6e 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 nt nAlloc[NCSIZE
a6aa0 5d 3b 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c ]; /* Total
a6ab0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 number of alloc
a6ac0 61 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 ations */.. int
a6ad0 20 6e 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a 45 nCurrent[NCSIZE
a6ae0 5d 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 ]; /* Current
a6af0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 number of alloc
a6b00 61 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 ations */.. int
a6b10 20 6d 78 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a mxCurrent[NCSIZ
a6b20 45 5d 3b 20 20 20 2f 2a 20 48 69 67 68 77 61 74 E]; /* Highwat
a6b30 65 72 20 6d 61 72 6b 20 66 6f 72 20 6e 43 75 72 er mark for nCur
a6b40 72 65 6e 74 20 2a 2f 0d 0a 0d 0a 7d 20 6d 65 6d rent */....} mem
a6b50 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 ;....../*..** Ad
a6b60 6a 75 73 74 20 6d 65 6d 6f 72 79 20 75 73 61 67 just memory usag
a6b70 65 20 73 74 61 74 69 73 74 69 63 73 0d 0a 2a 2f e statistics..*/
a6b80 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 ..static void ad
a6b90 6a 75 73 74 53 74 61 74 73 28 69 6e 74 20 69 53 justStats(int iS
a6ba0 69 7a 65 2c 20 69 6e 74 20 69 6e 63 72 65 6d 65 ize, int increme
a6bb0 6e 74 29 7b 0d 0a 20 20 69 6e 74 20 69 20 3d 20 nt){.. int i =
a6bc0 52 4f 55 4e 44 38 28 69 53 69 7a 65 29 2f 38 3b ROUND8(iSize)/8;
a6bd0 0d 0a 20 20 69 66 28 20 69 3e 4e 43 53 49 5a 45 .. if( i>NCSIZE
a6be0 2d 31 20 29 7b 0d 0a 20 20 20 20 69 20 3d 20 4e -1 ){.. i = N
a6bf0 43 53 49 5a 45 20 2d 20 31 3b 0d 0a 20 20 7d 0d CSIZE - 1;.. }.
a6c00 0a 20 20 69 66 28 20 69 6e 63 72 65 6d 65 6e 74 . if( increment
a6c10 3e 30 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 2e 6e >0 ){.. mem.n
a6c20 41 6c 6c 6f 63 5b 69 5d 2b 2b 3b 0d 0a 20 20 20 Alloc[i]++;..
a6c30 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d mem.nCurrent[i]
a6c40 2b 2b 3b 0d 0a 20 20 20 20 69 66 28 20 6d 65 6d ++;.. if( mem
a6c50 2e 6e 43 75 72 72 65 6e 74 5b 69 5d 3e 6d 65 6d .nCurrent[i]>mem
a6c60 2e 6d 78 43 75 72 72 65 6e 74 5b 69 5d 20 29 7b .mxCurrent[i] ){
a6c70 0d 0a 20 20 20 20 20 20 6d 65 6d 2e 6d 78 43 75 .. mem.mxCu
a6c80 72 72 65 6e 74 5b 69 5d 20 3d 20 6d 65 6d 2e 6e rrent[i] = mem.n
a6c90 43 75 72 72 65 6e 74 5b 69 5d 3b 0d 0a 20 20 20 Current[i];..
a6ca0 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }.. }else{..
a6cb0 20 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 mem.nCurrent[i
a6cc0 5d 2d 2d 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 ]--;.. assert
a6cd0 28 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 ( mem.nCurrent[i
a6ce0 5d 3e 3d 30 20 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d ]>=0 );.. }..}.
a6cf0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 69 76 65 6e 20 .../*..** Given
a6d00 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66 an allocation, f
a6d10 69 6e 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b ind the MemBlock
a6d20 48 64 72 20 66 6f 72 20 74 68 61 74 20 61 6c 6c Hdr for that all
a6d30 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a ocation...**..**
a6d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 This routine ch
a6d50 65 63 6b 73 20 74 68 65 20 67 75 61 72 64 73 20 ecks the guards
a6d60 61 74 20 65 69 74 68 65 72 20 65 6e 64 20 6f 66 at either end of
a6d70 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 the allocation
a6d80 61 6e 64 0d 0a 2a 2a 20 69 66 20 74 68 65 79 20 and..** if they
a6d90 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 69 74 are incorrect it
a6da0 20 61 73 73 65 72 74 73 2e 0d 0a 2a 2f 0d 0a 73 asserts...*/..s
a6db0 74 61 74 69 63 20 73 74 72 75 63 74 20 4d 65 6d tatic struct Mem
a6dc0 42 6c 6f 63 6b 48 64 72 20 2a 73 71 6c 69 74 65 BlockHdr *sqlite
a6dd0 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 3MemsysGetHeader
a6de0 28 76 6f 69 64 20 2a 70 41 6c 6c 6f 63 61 74 69 (void *pAllocati
a6df0 6f 6e 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 4d on){.. struct M
a6e00 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 3b 0d 0a emBlockHdr *p;..
a6e10 20 20 69 6e 74 20 2a 70 49 6e 74 3b 0d 0a 20 20 int *pInt;..
a6e20 75 38 20 2a 70 55 38 3b 0d 0a 20 20 69 6e 74 20 u8 *pU8;.. int
a6e30 6e 52 65 73 65 72 76 65 3b 0d 0a 0d 0a 20 20 70 nReserve;.... p
a6e40 20 3d 20 28 73 74 72 75 63 74 20 4d 65 6d 42 6c = (struct MemBl
a6e50 6f 63 6b 48 64 72 2a 29 70 41 6c 6c 6f 63 61 74 ockHdr*)pAllocat
a6e60 69 6f 6e 3b 0d 0a 20 20 70 2d 2d 3b 0d 0a 20 20 ion;.. p--;..
a6e70 61 73 73 65 72 74 28 20 70 2d 3e 69 46 6f 72 65 assert( p->iFore
a6e80 47 75 61 72 64 3d 3d 28 69 6e 74 29 46 4f 52 45 Guard==(int)FORE
a6e90 47 55 41 52 44 20 29 3b 0d 0a 20 20 6e 52 65 73 GUARD );.. nRes
a6ea0 65 72 76 65 20 3d 20 52 4f 55 4e 44 38 28 70 2d erve = ROUND8(p-
a6eb0 3e 69 53 69 7a 65 29 3b 0d 0a 20 20 70 49 6e 74 >iSize);.. pInt
a6ec0 20 3d 20 28 69 6e 74 2a 29 70 41 6c 6c 6f 63 61 = (int*)pAlloca
a6ed0 74 69 6f 6e 3b 0d 0a 20 20 70 55 38 20 3d 20 28 tion;.. pU8 = (
a6ee0 75 38 2a 29 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b u8*)pAllocation;
a6ef0 0d 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 74 .. assert( pInt
a6f00 5b 6e 52 65 73 65 72 76 65 2f 73 69 7a 65 6f 66 [nReserve/sizeof
a6f10 28 69 6e 74 29 5d 3d 3d 28 69 6e 74 29 52 45 41 (int)]==(int)REA
a6f20 52 47 55 41 52 44 20 29 3b 0d 0a 20 20 2f 2a 20 RGUARD );.. /*
a6f30 54 68 69 73 20 63 68 65 63 6b 73 20 61 6e 79 20 This checks any
a6f40 6f 66 20 74 68 65 20 22 65 78 74 72 61 22 20 62 of the "extra" b
a6f50 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 ytes allocated d
a6f60 75 65 0d 0a 20 20 2a 2a 20 74 6f 20 72 6f 75 6e ue.. ** to roun
a6f70 64 69 6e 67 20 75 70 20 74 6f 20 61 6e 20 38 20 ding up to an 8
a6f80 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 74 6f byte boundary to
a6f90 20 65 6e 73 75 72 65 20 0d 0a 20 20 2a 2a 20 74 ensure .. ** t
a6fa0 68 65 79 20 68 61 76 65 6e 27 74 20 62 65 65 6e hey haven't been
a6fb0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0d 0a 20 overwritten...
a6fc0 20 2a 2f 0d 0a 20 20 77 68 69 6c 65 28 20 6e 52 */.. while( nR
a6fd0 65 73 65 72 76 65 2d 2d 20 3e 20 70 2d 3e 69 53 eserve-- > p->iS
a6fe0 69 7a 65 20 29 20 61 73 73 65 72 74 28 20 70 55 ize ) assert( pU
a6ff0 38 5b 6e 52 65 73 65 72 76 65 5d 3d 3d 30 78 36 8[nReserve]==0x6
a7000 35 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 5 );.. return p
a7010 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
a7020 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
a7030 20 6f 66 20 62 79 74 65 73 20 63 75 72 72 65 6e of bytes curren
a7040 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 tly allocated at
a7050 20 61 64 64 72 65 73 73 20 70 2e 0d 0a 2a 2f 0d address p...*/.
a7060 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 .static int sqli
a7070 74 65 33 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 te3MemSize(void
a7080 2a 70 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 4d *p){.. struct M
a7090 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 emBlockHdr *pHdr
a70a0 3b 0d 0a 20 20 69 66 28 20 21 70 20 29 7b 0d 0a ;.. if( !p ){..
a70b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 return 0;..
a70c0 20 7d 0d 0a 20 20 70 48 64 72 20 3d 20 73 71 6c }.. pHdr = sql
a70d0 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 ite3MemsysGetHea
a70e0 64 65 72 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 der(p);.. retur
a70f0 6e 20 70 48 64 72 2d 3e 69 53 69 7a 65 3b 0d 0a n pHdr->iSize;..
a7100 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 }..../*..** Init
a7110 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 ialize the memor
a7120 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 y allocation sub
a7130 73 79 73 74 65 6d 2e 0d 0a 2a 2f 0d 0a 73 74 61 system...*/..sta
a7140 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d tic int sqlite3M
a7150 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 4e 6f 74 emInit(void *Not
a7160 55 73 65 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 Used){.. UNUSED
a7170 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 _PARAMETER(NotUs
a7180 65 64 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ed);.. assert(
a7190 28 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 4d (sizeof(struct M
a71a0 65 6d 42 6c 6f 63 6b 48 64 72 29 26 37 29 20 3d emBlockHdr)&7) =
a71b0 3d 20 30 20 29 3b 0d 0a 20 20 69 66 28 20 21 73 = 0 );.. if( !s
a71c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
a71d0 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0d 0a ig.bMemstat ){..
a71e0 20 20 20 20 2f 2a 20 49 66 20 6d 65 6d 6f 72 79 /* If memory
a71f0 20 73 74 61 74 75 73 20 69 73 20 65 6e 61 62 6c status is enabl
a7200 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 6c ed, then the mal
a7210 6c 6f 63 2e 63 20 77 72 61 70 70 65 72 20 77 69 loc.c wrapper wi
a7220 6c 6c 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 ll already..
a7230 2a 2a 20 68 6f 6c 64 20 74 68 65 20 53 54 41 54 ** hold the STAT
a7240 49 43 5f 4d 45 4d 20 6d 75 74 65 78 20 77 68 65 IC_MEM mutex whe
a7250 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 68 n the routines h
a7260 65 72 65 20 61 72 65 20 69 6e 76 6f 6b 65 64 2e ere are invoked.
a7270 20 2a 2f 0d 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 */.. mem.mut
a7280 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 ex = sqlite3Mute
a7290 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 xAlloc(SQLITE_MU
a72a0 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b TEX_STATIC_MEM);
a72b0 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
a72c0 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d SQLITE_OK;..}...
a72d0 0a 2f 2a 0d 0a 2a 2a 20 44 65 69 6e 69 74 69 61 ./*..** Deinitia
a72e0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 lize the memory
a72f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 allocation subsy
a7300 73 74 65 6d 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 stem...*/..stati
a7310 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 c void sqlite3Me
a7320 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a mShutdown(void *
a7330 4e 6f 74 55 73 65 64 29 7b 0d 0a 20 20 55 4e 55 NotUsed){.. UNU
a7340 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f SED_PARAMETER(No
a7350 74 55 73 65 64 29 3b 0d 0a 20 20 6d 65 6d 2e 6d tUsed);.. mem.m
a7360 75 74 65 78 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a utex = 0;..}....
a7370 2f 2a 0d 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 /*..** Round up
a7380 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 a request size t
a7390 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 o the next valid
a73a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 allocation size
a73b0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
a73c0 74 20 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e t sqlite3MemRoun
a73d0 64 75 70 28 69 6e 74 20 6e 29 7b 0d 0a 20 20 72 dup(int n){.. r
a73e0 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 29 3b eturn ROUND8(n);
a73f0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 ..}..../*..** Fi
a7400 6c 6c 20 61 20 62 75 66 66 65 72 20 77 69 74 68 ll a buffer with
a7410 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 62 pseudo-random b
a7420 79 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 75 ytes. This is u
a7430 73 65 64 20 74 6f 20 70 72 65 73 65 74 0d 0a 2a sed to preset..*
a7440 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 * the content of
a7450 20 61 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6c a new memory al
a7460 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 75 6e 70 72 location to unpr
a7470 65 64 69 63 74 61 62 6c 65 20 76 61 6c 75 65 73 edictable values
a7480 20 61 6e 64 0d 0a 2a 2a 20 74 6f 20 63 6c 65 61 and..** to clea
a7490 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 r the content of
a74a0 20 61 20 66 72 65 65 64 20 61 6c 6c 6f 63 61 74 a freed allocat
a74b0 69 6f 6e 20 74 6f 20 75 6e 70 72 65 64 69 63 74 ion to unpredict
a74c0 61 62 6c 65 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f able values...*/
a74d0 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 ..static void ra
a74e0 6e 64 6f 6d 46 69 6c 6c 28 63 68 61 72 20 2a 70 ndomFill(char *p
a74f0 42 75 66 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b Buf, int nByte){
a7500 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 .. unsigned int
a7510 20 78 2c 20 79 2c 20 72 3b 0d 0a 20 20 78 20 3d x, y, r;.. x =
a7520 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 SQLITE_PTR_TO_I
a7530 4e 54 28 70 42 75 66 29 3b 0d 0a 20 20 79 20 3d NT(pBuf);.. y =
a7540 20 6e 42 79 74 65 20 7c 20 31 3b 0d 0a 20 20 77 nByte | 1;.. w
a7550 68 69 6c 65 28 20 6e 42 79 74 65 20 3e 3d 20 34 hile( nByte >= 4
a7560 20 29 7b 0d 0a 20 20 20 20 78 20 3d 20 28 78 3e ){.. x = (x>
a7570 3e 31 29 20 5e 20 28 2d 28 78 26 31 29 20 26 20 >1) ^ (-(x&1) &
a7580 30 78 64 30 30 30 30 30 30 31 29 3b 0d 0a 20 20 0xd0000001);..
a7590 20 20 79 20 3d 20 79 2a 31 31 30 33 35 31 35 32 y = y*11035152
a75a0 34 35 20 2b 20 31 32 33 34 35 3b 0d 0a 20 20 20 45 + 12345;..
a75b0 20 72 20 3d 20 78 20 5e 20 79 3b 0d 0a 20 20 20 r = x ^ y;..
a75c0 20 2a 28 69 6e 74 2a 29 70 42 75 66 20 3d 20 72 *(int*)pBuf = r
a75d0 3b 0d 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 34 ;.. pBuf += 4
a75e0 3b 0d 0a 20 20 20 20 6e 42 79 74 65 20 2d 3d 20 ;.. nByte -=
a75f0 34 3b 0d 0a 20 20 7d 0d 0a 20 20 77 68 69 6c 65 4;.. }.. while
a7600 28 20 6e 42 79 74 65 2d 2d 20 3e 20 30 20 29 7b ( nByte-- > 0 ){
a7610 0d 0a 20 20 20 20 78 20 3d 20 28 78 3e 3e 31 29 .. x = (x>>1)
a7620 20 5e 20 28 2d 28 78 26 31 29 20 26 20 30 78 64 ^ (-(x&1) & 0xd
a7630 30 30 30 30 30 30 31 29 3b 0d 0a 20 20 20 20 79 0000001);.. y
a7640 20 3d 20 79 2a 31 31 30 33 35 31 35 32 34 35 20 = y*1103515245
a7650 2b 20 31 32 33 34 35 3b 0d 0a 20 20 20 20 72 20 + 12345;.. r
a7660 3d 20 78 20 5e 20 79 3b 0d 0a 20 20 20 20 2a 28 = x ^ y;.. *(
a7670 70 42 75 66 2b 2b 29 20 3d 20 72 20 26 20 30 78 pBuf++) = r & 0x
a7680 66 66 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f ff;.. }..}..../
a7690 2a 0d 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e *..** Allocate n
a76a0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 6d 65 Byte bytes of me
a76b0 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 mory...*/..stati
a76c0 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d c void *sqlite3M
a76d0 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 emMalloc(int nBy
a76e0 74 65 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 4d te){.. struct M
a76f0 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 emBlockHdr *pHdr
a7700 3b 0d 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b ;.. void **pBt;
a7710 0d 0a 20 20 63 68 61 72 20 2a 7a 3b 0d 0a 20 20 .. char *z;..
a7720 69 6e 74 20 2a 70 49 6e 74 3b 0d 0a 20 20 76 6f int *pInt;.. vo
a7730 69 64 20 2a 70 20 3d 20 30 3b 0d 0a 20 20 69 6e id *p = 0;.. in
a7740 74 20 74 6f 74 61 6c 53 69 7a 65 3b 0d 0a 20 20 t totalSize;..
a7750 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0d 0a 20 int nReserve;..
a7760 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
a7770 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b nter(mem.mutex);
a7780 0d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e .. assert( mem.
a7790 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0d 0a disallow==0 );..
a77a0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 52 4f 55 nReserve = ROU
a77b0 4e 44 38 28 6e 42 79 74 65 29 3b 0d 0a 20 20 74 ND8(nByte);.. t
a77c0 6f 74 61 6c 53 69 7a 65 20 3d 20 6e 52 65 73 65 otalSize = nRese
a77d0 72 76 65 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 rve + sizeof(*pH
a77e0 64 72 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 dr) + sizeof(int
a77f0 29 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ) +..
a7800 20 20 20 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 mem.nBacktra
a7810 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 ce*sizeof(void*)
a7820 20 2b 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0d 0a + mem.nTitle;..
a7830 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f 74 p = malloc(tot
a7840 61 6c 53 69 7a 65 29 3b 0d 0a 20 20 69 66 28 20 alSize);.. if(
a7850 70 20 29 7b 0d 0a 20 20 20 20 7a 20 3d 20 70 3b p ){.. z = p;
a7860 0d 0a 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 .. pBt = (voi
a7870 64 2a 2a 29 26 7a 5b 6d 65 6d 2e 6e 54 69 74 6c d**)&z[mem.nTitl
a7880 65 5d 3b 0d 0a 20 20 20 20 70 48 64 72 20 3d 20 e];.. pHdr =
a7890 28 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b (struct MemBlock
a78a0 48 64 72 2a 29 26 70 42 74 5b 6d 65 6d 2e 6e 42 Hdr*)&pBt[mem.nB
a78b0 61 63 6b 74 72 61 63 65 5d 3b 0d 0a 20 20 20 20 acktrace];..
a78c0 70 48 64 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b pHdr->pNext = 0;
a78d0 0d 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72 65 .. pHdr->pPre
a78e0 76 20 3d 20 6d 65 6d 2e 70 4c 61 73 74 3b 0d 0a v = mem.pLast;..
a78f0 20 20 20 20 69 66 28 20 6d 65 6d 2e 70 4c 61 73 if( mem.pLas
a7900 74 20 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 2e t ){.. mem.
a7910 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 pLast->pNext = p
a7920 48 64 72 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b Hdr;.. }else{
a7930 0d 0a 20 20 20 20 20 20 6d 65 6d 2e 70 46 69 72 .. mem.pFir
a7940 73 74 20 3d 20 70 48 64 72 3b 0d 0a 20 20 20 20 st = pHdr;..
a7950 7d 0d 0a 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 }.. mem.pLast
a7960 20 3d 20 70 48 64 72 3b 0d 0a 20 20 20 20 70 48 = pHdr;.. pH
a7970 64 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 20 3d dr->iForeGuard =
a7980 20 46 4f 52 45 47 55 41 52 44 3b 0d 0a 20 20 20 FOREGUARD;..
a7990 20 70 48 64 72 2d 3e 65 54 79 70 65 20 3d 20 4d pHdr->eType = M
a79a0 45 4d 54 59 50 45 5f 48 45 41 50 3b 0d 0a 20 20 EMTYPE_HEAP;..
a79b0 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 pHdr->nBacktra
a79c0 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d 2e 6e 42 ceSlots = mem.nB
a79d0 61 63 6b 74 72 61 63 65 3b 0d 0a 20 20 20 20 70 acktrace;.. p
a79e0 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3d 20 6d 65 Hdr->nTitle = me
a79f0 6d 2e 6e 54 69 74 6c 65 3b 0d 0a 20 20 20 20 69 m.nTitle;.. i
a7a00 66 28 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 f( mem.nBacktrac
a7a10 65 20 29 7b 0d 0a 20 20 20 20 20 20 76 6f 69 64 e ){.. void
a7a20 20 2a 61 41 64 64 72 5b 34 30 5d 3b 0d 0a 20 20 *aAddr[40];..
a7a30 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 pHdr->nBackt
a7a40 72 61 63 65 20 3d 20 62 61 63 6b 74 72 61 63 65 race = backtrace
a7a50 28 61 41 64 64 72 2c 20 6d 65 6d 2e 6e 42 61 63 (aAddr, mem.nBac
a7a60 6b 74 72 61 63 65 2b 31 29 2d 31 3b 0d 0a 20 20 ktrace+1)-1;..
a7a70 20 20 20 20 6d 65 6d 63 70 79 28 70 42 74 2c 20 memcpy(pBt,
a7a80 26 61 41 64 64 72 5b 31 5d 2c 20 70 48 64 72 2d &aAddr[1], pHdr-
a7a90 3e 6e 42 61 63 6b 74 72 61 63 65 2a 73 69 7a 65 >nBacktrace*size
a7aa0 6f 66 28 76 6f 69 64 2a 29 29 3b 0d 0a 20 20 20 of(void*));..
a7ab0 20 20 20 61 73 73 65 72 74 28 70 42 74 5b 30 5d assert(pBt[0]
a7ac0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 6d 65 );.. if( me
a7ad0 6d 2e 78 42 61 63 6b 74 72 61 63 65 20 29 7b 0d m.xBacktrace ){.
a7ae0 0a 20 20 20 20 20 20 20 20 6d 65 6d 2e 78 42 61 . mem.xBa
a7af0 63 6b 74 72 61 63 65 28 6e 42 79 74 65 2c 20 70 cktrace(nByte, p
a7b00 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2d Hdr->nBacktrace-
a7b10 31 2c 20 26 61 41 64 64 72 5b 31 5d 29 3b 0d 0a 1, &aAddr[1]);..
a7b20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c }.. }el
a7b30 73 65 7b 0d 0a 20 20 20 20 20 20 70 48 64 72 2d se{.. pHdr-
a7b40 3e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 30 3b >nBacktrace = 0;
a7b50 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
a7b60 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 29 7b 0d 0a mem.nTitle ){..
a7b70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 memcpy(z,
a7b80 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 6d 65 6d 2e mem.zTitle, mem.
a7b90 6e 54 69 74 6c 65 29 3b 0d 0a 20 20 20 20 7d 0d nTitle);.. }.
a7ba0 0a 20 20 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 . pHdr->iSize
a7bb0 20 3d 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 61 = nByte;.. a
a7bc0 64 6a 75 73 74 53 74 61 74 73 28 6e 42 79 74 65 djustStats(nByte
a7bd0 2c 20 2b 31 29 3b 0d 0a 20 20 20 20 70 49 6e 74 , +1);.. pInt
a7be0 20 3d 20 28 69 6e 74 2a 29 26 70 48 64 72 5b 31 = (int*)&pHdr[1
a7bf0 5d 3b 0d 0a 20 20 20 20 70 49 6e 74 5b 6e 52 65 ];.. pInt[nRe
a7c00 73 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74 serve/sizeof(int
a7c10 29 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0d )] = REARGUARD;.
a7c20 0a 20 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 . randomFill(
a7c30 28 63 68 61 72 2a 29 70 49 6e 74 2c 20 6e 42 79 (char*)pInt, nBy
a7c40 74 65 29 3b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 te);.. memset
a7c50 28 28 28 63 68 61 72 2a 29 70 49 6e 74 29 2b 6e (((char*)pInt)+n
a7c60 42 79 74 65 2c 20 30 78 36 35 2c 20 6e 52 65 73 Byte, 0x65, nRes
a7c70 65 72 76 65 2d 6e 42 79 74 65 29 3b 0d 0a 20 20 erve-nByte);..
a7c80 20 20 70 20 3d 20 28 76 6f 69 64 2a 29 70 49 6e p = (void*)pIn
a7c90 74 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 t;.. }.. sqlit
a7ca0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d e3_mutex_leave(m
a7cb0 65 6d 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 72 65 em.mutex);.. re
a7cc0 74 75 72 6e 20 70 3b 20 0d 0a 7d 0d 0a 0d 0a 2f turn p; ..}..../
a7cd0 2a 0d 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 *..** Free memor
a7ce0 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 y...*/..static v
a7cf0 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 oid sqlite3MemFr
a7d00 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 ee(void *pPrior)
a7d10 7b 0d 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 {.. struct MemB
a7d20 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0d 0a lockHdr *pHdr;..
a7d30 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0d 0a 20 void **pBt;..
a7d40 20 63 68 61 72 20 2a 7a 3b 0d 0a 20 20 61 73 73 char *z;.. ass
a7d50 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 ert( sqlite3Glob
a7d60 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 alConfig.bMemsta
a7d70 74 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 t || sqlite3Glob
a7d80 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 alConfig.bCoreMu
a7d90 74 65 78 3d 3d 30 20 0d 0a 20 20 20 20 20 20 20 tex==0 ..
a7da0 7c 7c 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30 20 || mem.mutex!=0
a7db0 29 3b 0d 0a 20 20 70 48 64 72 20 3d 20 73 71 6c );.. pHdr = sql
a7dc0 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 ite3MemsysGetHea
a7dd0 64 65 72 28 70 50 72 69 6f 72 29 3b 0d 0a 20 20 der(pPrior);..
a7de0 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 pBt = (void**)pH
a7df0 64 72 3b 0d 0a 20 20 70 42 74 20 2d 3d 20 70 48 dr;.. pBt -= pH
a7e00 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c dr->nBacktraceSl
a7e10 6f 74 73 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f ots;.. sqlite3_
a7e20 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e mutex_enter(mem.
a7e30 6d 75 74 65 78 29 3b 0d 0a 20 20 69 66 28 20 70 mutex);.. if( p
a7e40 48 64 72 2d 3e 70 50 72 65 76 20 29 7b 0d 0a 20 Hdr->pPrev ){..
a7e50 20 20 20 61 73 73 65 72 74 28 20 70 48 64 72 2d assert( pHdr-
a7e60 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 >pPrev->pNext==p
a7e70 48 64 72 20 29 3b 0d 0a 20 20 20 20 70 48 64 72 Hdr );.. pHdr
a7e80 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d ->pPrev->pNext =
a7e90 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0d 0a 20 pHdr->pNext;..
a7ea0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 61 73 73 }else{.. ass
a7eb0 65 72 74 28 20 6d 65 6d 2e 70 46 69 72 73 74 3d ert( mem.pFirst=
a7ec0 3d 70 48 64 72 20 29 3b 0d 0a 20 20 20 20 6d 65 =pHdr );.. me
a7ed0 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64 72 2d m.pFirst = pHdr-
a7ee0 3e 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d 0a 20 20 >pNext;.. }..
a7ef0 69 66 28 20 70 48 64 72 2d 3e 70 4e 65 78 74 20 if( pHdr->pNext
a7f00 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){.. assert(
a7f10 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 pHdr->pNext->pPr
a7f20 65 76 3d 3d 70 48 64 72 20 29 3b 0d 0a 20 20 20 ev==pHdr );..
a7f30 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 pHdr->pNext->pP
a7f40 72 65 76 20 3d 20 70 48 64 72 2d 3e 70 50 72 65 rev = pHdr->pPre
a7f50 76 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 v;.. }else{..
a7f60 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 4c assert( mem.pL
a7f70 61 73 74 3d 3d 70 48 64 72 20 29 3b 0d 0a 20 20 ast==pHdr );..
a7f80 20 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48 mem.pLast = pH
a7f90 64 72 2d 3e 70 50 72 65 76 3b 0d 0a 20 20 7d 0d dr->pPrev;.. }.
a7fa0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 42 . z = (char*)pB
a7fb0 74 3b 0d 0a 20 20 7a 20 2d 3d 20 70 48 64 72 2d t;.. z -= pHdr-
a7fc0 3e 6e 54 69 74 6c 65 3b 0d 0a 20 20 61 64 6a 75 >nTitle;.. adju
a7fd0 73 74 53 74 61 74 73 28 70 48 64 72 2d 3e 69 53 stStats(pHdr->iS
a7fe0 69 7a 65 2c 20 2d 31 29 3b 0d 0a 20 20 72 61 6e ize, -1);.. ran
a7ff0 64 6f 6d 46 69 6c 6c 28 7a 2c 20 73 69 7a 65 6f domFill(z, sizeo
a8000 66 28 76 6f 69 64 2a 29 2a 70 48 64 72 2d 3e 6e f(void*)*pHdr->n
a8010 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 20 2b BacktraceSlots +
a8020 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b sizeof(*pHdr) +
a8030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
a8040 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 20 2b 20 pHdr->iSize +
a8050 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 70 48 sizeof(int) + pH
a8060 64 72 2d 3e 6e 54 69 74 6c 65 29 3b 0d 0a 20 20 dr->nTitle);..
a8070 66 72 65 65 28 7a 29 3b 0d 0a 20 20 73 71 6c 69 free(z);.. sqli
a8080 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
a8090 6d 65 6d 2e 6d 75 74 65 78 29 3b 20 20 0d 0a 7d mem.mutex); ..}
a80a0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e 67 ..../*..** Chang
a80b0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e e the size of an
a80c0 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 existing memory
a80d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2a allocation...**
a80e0 0d 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 64 65 ..** For this de
a80f0 62 75 67 67 69 6e 67 20 69 6d 70 6c 65 6d 65 6e bugging implemen
a8100 74 61 74 69 6f 6e 2c 20 77 65 20 2a 61 6c 77 61 tation, we *alwa
a8110 79 73 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 ys* make a copy
a8120 6f 66 20 74 68 65 0d 0a 2a 2a 20 61 6c 6c 6f 63 of the..** alloc
a8130 61 74 69 6f 6e 20 69 6e 74 6f 20 61 20 6e 65 77 ation into a new
a8140 20 70 6c 61 63 65 20 69 6e 20 6d 65 6d 6f 72 79 place in memory
a8150 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 . In this way,
a8160 69 66 20 74 68 65 20 0d 0a 2a 2a 20 68 69 67 68 if the ..** high
a8170 65 72 20 6c 65 76 65 6c 20 63 6f 64 65 20 69 73 er level code is
a8180 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72 20 74 using pointer t
a8190 6f 20 74 68 65 20 6f 6c 64 20 61 6c 6c 6f 63 61 o the old alloca
a81a0 74 69 6f 6e 2c 20 69 74 20 69 73 20 0d 0a 2a 2a tion, it is ..**
a81b0 20 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c much more likel
a81c0 79 20 74 6f 20 62 72 65 61 6b 20 61 6e 64 20 77 y to break and w
a81d0 65 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 20 e are much more
a81e0 6c 69 6b 69 6e 67 20 74 6f 20 66 69 6e 64 0d 0a liking to find..
a81f0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0d 0a 2a ** the error...*
a8200 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a /..static void *
a8210 73 71 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c 6f sqlite3MemReallo
a8220 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 c(void *pPrior,
a8230 69 6e 74 20 6e 42 79 74 65 29 7b 0d 0a 20 20 73 int nByte){.. s
a8240 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 truct MemBlockHd
a8250 72 20 2a 70 4f 6c 64 48 64 72 3b 0d 0a 20 20 76 r *pOldHdr;.. v
a8260 6f 69 64 20 2a 70 4e 65 77 3b 0d 0a 20 20 61 73 oid *pNew;.. as
a8270 73 65 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c 6c sert( mem.disall
a8280 6f 77 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 ow==0 );.. asse
a8290 72 74 28 20 28 6e 42 79 74 65 20 26 20 37 29 3d rt( (nByte & 7)=
a82a0 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 45 56 3a =0 ); /* EV:
a82b0 20 52 2d 34 36 31 39 39 2d 33 30 32 34 39 20 2a R-46199-30249 *
a82c0 2f 0d 0a 20 20 70 4f 6c 64 48 64 72 20 3d 20 73 /.. pOldHdr = s
a82d0 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 qlite3MemsysGetH
a82e0 65 61 64 65 72 28 70 50 72 69 6f 72 29 3b 0d 0a eader(pPrior);..
a82f0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 pNew = sqlite3
a8300 4d 65 6d 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 MemMalloc(nByte)
a8310 3b 0d 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b ;.. if( pNew ){
a8320 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 .. memcpy(pNe
a8330 77 2c 20 70 50 72 69 6f 72 2c 20 6e 42 79 74 65 w, pPrior, nByte
a8340 3c 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 20 <pOldHdr->iSize
a8350 3f 20 6e 42 79 74 65 20 3a 20 70 4f 6c 64 48 64 ? nByte : pOldHd
a8360 72 2d 3e 69 53 69 7a 65 29 3b 0d 0a 20 20 20 20 r->iSize);..
a8370 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c 64 48 64 if( nByte>pOldHd
a8380 72 2d 3e 69 53 69 7a 65 20 29 7b 0d 0a 20 20 20 r->iSize ){..
a8390 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 26 28 randomFill(&(
a83a0 28 63 68 61 72 2a 29 70 4e 65 77 29 5b 70 4f 6c (char*)pNew)[pOl
a83b0 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c 20 6e 42 dHdr->iSize], nB
a83c0 79 74 65 20 2d 20 70 4f 6c 64 48 64 72 2d 3e 69 yte - pOldHdr->i
a83d0 53 69 7a 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 Size);.. }..
a83e0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 sqlite3MemFre
a83f0 65 28 70 50 72 69 6f 72 29 3b 0d 0a 20 20 7d 0d e(pPrior);.. }.
a8400 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0d . return pNew;.
a8410 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 70 .}..../*..** Pop
a8420 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 ulate the low-le
a8430 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 vel memory alloc
a8440 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 ation function p
a8450 6f 69 6e 74 65 72 73 20 69 6e 0d 0a 2a 2a 20 73 ointers in..** s
a8460 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
a8470 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 ig.m with pointe
a8480 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e rs to the routin
a8490 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e es in this file.
a84a0 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
a84b0 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
a84c0 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 3MemSetDefault(v
a84d0 6f 69 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 oid){.. static
a84e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 const sqlite3_me
a84f0 6d 5f 6d 65 74 68 6f 64 73 20 64 65 66 61 75 6c m_methods defaul
a8500 74 4d 65 74 68 6f 64 73 20 3d 20 7b 0d 0a 20 20 tMethods = {..
a8510 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c sqlite3MemMal
a8520 6c 6f 63 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 loc,.. sqlit
a8530 65 33 4d 65 6d 46 72 65 65 2c 0d 0a 20 20 20 20 e3MemFree,..
a8540 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c sqlite3MemReall
a8550 6f 63 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 oc,.. sqlite
a8560 33 4d 65 6d 53 69 7a 65 2c 0d 0a 20 20 20 20 20 3MemSize,..
a8570 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e 64 75 sqlite3MemRoundu
a8580 70 2c 0d 0a 20 20 20 20 20 73 71 6c 69 74 65 33 p,.. sqlite3
a8590 4d 65 6d 49 6e 69 74 2c 0d 0a 20 20 20 20 20 73 MemInit,.. s
a85a0 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 qlite3MemShutdow
a85b0 6e 2c 0d 0a 20 20 20 20 20 30 0d 0a 20 20 7d 3b n,.. 0.. };
a85c0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 .. sqlite3_conf
a85d0 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ig(SQLITE_CONFIG
a85e0 5f 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61 75 6c _MALLOC, &defaul
a85f0 74 4d 65 74 68 6f 64 73 29 3b 0d 0a 7d 0d 0a 0d tMethods);..}...
a8600 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 ./*..** Set the
a8610 22 74 79 70 65 22 20 6f 66 20 61 6e 20 61 6c 6c "type" of an all
a8620 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 ocation...*/..SQ
a8630 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
a8640 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 d sqlite3Memdebu
a8650 67 53 65 74 54 79 70 65 28 76 6f 69 64 20 2a 70 gSetType(void *p
a8660 2c 20 75 38 20 65 54 79 70 65 29 7b 0d 0a 20 20 , u8 eType){..
a8670 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 if( p && sqlite3
a8680 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 GlobalConfig.m.x
a8690 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65 33 4d Malloc==sqlite3M
a86a0 65 6d 4d 61 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 emMalloc ){..
a86b0 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b struct MemBlock
a86c0 48 64 72 20 2a 70 48 64 72 3b 0d 0a 20 20 20 20 Hdr *pHdr;..
a86d0 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 pHdr = sqlite3Me
a86e0 6d 73 79 73 47 65 74 48 65 61 64 65 72 28 70 29 msysGetHeader(p)
a86f0 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
a8700 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d Hdr->iForeGuard=
a8710 3d 46 4f 52 45 47 55 41 52 44 20 29 3b 0d 0a 20 =FOREGUARD );..
a8720 20 20 20 70 48 64 72 2d 3e 65 54 79 70 65 20 3d pHdr->eType =
a8730 20 65 54 79 70 65 3b 0d 0a 20 20 7d 0d 0a 7d 0d eType;.. }..}.
a8740 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e .../*..** Return
a8750 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 61 73 TRUE if the mas
a8760 6b 20 6f 66 20 74 79 70 65 20 69 6e 20 65 54 79 k of type in eTy
a8770 70 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 74 pe matches the t
a8780 79 70 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 61 ype of the..** a
a8790 6c 6c 6f 63 61 74 69 6f 6e 20 70 2e 20 20 41 6c llocation p. Al
a87a0 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 so return true i
a87b0 66 20 70 3d 3d 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a f p==NULL...**..
a87c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
a87d0 69 73 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 is designed for
a87e0 75 73 65 20 77 69 74 68 69 6e 20 61 6e 20 61 73 use within an as
a87f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 sert() statement
a8800 2c 20 74 6f 0d 0a 2a 2a 20 76 65 72 69 66 79 20 , to..** verify
a8810 74 68 65 20 74 79 70 65 20 6f 66 20 61 6e 20 61 the type of an a
a8820 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 46 6f 72 20 llocation. For
a8830 65 78 61 6d 70 6c 65 3a 0d 0a 2a 2a 0d 0a 2a 2a example:..**..**
a8840 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c assert( sql
a8850 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 ite3MemdebugHasT
a8860 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 ype(p, MEMTYPE_D
a8870 42 29 20 29 3b 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 B) );..*/..SQLIT
a8880 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
a8890 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 lite3MemdebugHas
a88a0 54 79 70 65 28 76 6f 69 64 20 2a 70 2c 20 75 38 Type(void *p, u8
a88b0 20 65 54 79 70 65 29 7b 0d 0a 20 20 69 6e 74 20 eType){.. int
a88c0 72 63 20 3d 20 31 3b 0d 0a 20 20 69 66 28 20 70 rc = 1;.. if( p
a88d0 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 && sqlite3Globa
a88e0 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f lConfig.m.xMallo
a88f0 63 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c c==sqlite3MemMal
a8900 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 73 74 72 75 loc ){.. stru
a8910 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a ct MemBlockHdr *
a8920 70 48 64 72 3b 0d 0a 20 20 20 20 70 48 64 72 20 pHdr;.. pHdr
a8930 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 = sqlite3MemsysG
a8940 65 74 48 65 61 64 65 72 28 70 29 3b 0d 0a 20 20 etHeader(p);..
a8950 20 20 61 73 73 65 72 74 28 20 70 48 64 72 2d 3e assert( pHdr->
a8960 69 46 6f 72 65 47 75 61 72 64 3d 3d 46 4f 52 45 iForeGuard==FORE
a8970 47 55 41 52 44 20 29 3b 20 20 20 20 20 20 20 20 GUARD );
a8980 20 2f 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 69 /* Allocation i
a8990 73 20 76 61 6c 69 64 20 2a 2f 0d 0a 20 20 20 20 s valid */..
a89a0 69 66 28 20 28 70 48 64 72 2d 3e 65 54 79 70 65 if( (pHdr->eType
a89b0 26 65 54 79 70 65 29 3d 3d 30 20 29 7b 0d 0a 20 &eType)==0 ){..
a89c0 20 20 20 20 20 72 63 20 3d 20 30 3b 0d 0a 20 20 rc = 0;..
a89d0 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
a89e0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
a89f0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 .** Return TRUE
a8a00 69 66 20 74 68 65 20 6d 61 73 6b 20 6f 66 20 74 if the mask of t
a8a10 79 70 65 20 69 6e 20 65 54 79 70 65 20 6d 61 74 ype in eType mat
a8a20 63 68 65 73 20 6e 6f 20 62 69 74 73 20 6f 66 20 ches no bits of
a8a30 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0d the type of the.
a8a40 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 .** allocation p
a8a50 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 . Also return t
a8a60 72 75 65 20 69 66 20 70 3d 3d 4e 55 4c 4c 2e 0d rue if p==NULL..
a8a70 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 .**..** This rou
a8a80 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 tine is designed
a8a90 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 for use within
a8aa0 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 an assert() stat
a8ab0 65 6d 65 6e 74 2c 20 74 6f 0d 0a 2a 2a 20 76 65 ement, to..** ve
a8ac0 72 69 66 79 20 74 68 65 20 74 79 70 65 20 6f 66 rify the type of
a8ad0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 an allocation.
a8ae0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0d 0a 2a For example:..*
a8af0 2a 0d 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 *..** assert
a8b00 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 ( sqlite3Memdebu
a8b10 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 gNoType(p, MEMTY
a8b20 50 45 5f 44 42 29 20 29 3b 0d 0a 2a 2f 0d 0a 53 PE_DB) );..*/..S
a8b30 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
a8b40 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 t sqlite3Memdebu
a8b50 67 4e 6f 54 79 70 65 28 76 6f 69 64 20 2a 70 2c gNoType(void *p,
a8b60 20 75 38 20 65 54 79 70 65 29 7b 0d 0a 20 20 69 u8 eType){.. i
a8b70 6e 74 20 72 63 20 3d 20 31 3b 0d 0a 20 20 69 66 nt rc = 1;.. if
a8b80 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 47 6c ( p && sqlite3Gl
a8b90 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 obalConfig.m.xMa
a8ba0 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65 33 4d 65 6d lloc==sqlite3Mem
a8bb0 4d 61 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 73 Malloc ){.. s
a8bc0 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 truct MemBlockHd
a8bd0 72 20 2a 70 48 64 72 3b 0d 0a 20 20 20 20 70 48 r *pHdr;.. pH
a8be0 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 dr = sqlite3Mems
a8bf0 79 73 47 65 74 48 65 61 64 65 72 28 70 29 3b 0d ysGetHeader(p);.
a8c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 64 . assert( pHd
a8c10 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d 3d 46 r->iForeGuard==F
a8c20 4f 52 45 47 55 41 52 44 20 29 3b 20 20 20 20 20 OREGUARD );
a8c30 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 69 6f /* Allocatio
a8c40 6e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0d 0a 20 n is valid */..
a8c50 20 20 20 69 66 28 20 28 70 48 64 72 2d 3e 65 54 if( (pHdr->eT
a8c60 79 70 65 26 65 54 79 70 65 29 21 3d 30 20 29 7b ype&eType)!=0 ){
a8c70 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0d .. rc = 0;.
a8c80 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 . }.. }.. r
a8c90 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
a8ca0 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e /*..** Set the n
a8cb0 75 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 umber of backtra
a8cc0 63 65 20 6c 65 76 65 6c 73 20 6b 65 70 74 20 66 ce levels kept f
a8cd0 6f 72 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 or each allocati
a8ce0 6f 6e 2e 0d 0a 2a 2a 20 41 20 76 61 6c 75 65 20 on...** A value
a8cf0 6f 66 20 7a 65 72 6f 20 74 75 72 6e 73 20 6f 66 of zero turns of
a8d00 66 20 62 61 63 6b 74 72 61 63 69 6e 67 2e 20 20 f backtracing.
a8d10 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c The number is al
a8d20 77 61 79 73 20 72 6f 75 6e 64 65 64 0d 0a 2a 2a ways rounded..**
a8d30 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69 70 6c up to a multipl
a8d40 65 20 6f 66 20 32 2e 0d 0a 2a 2f 0d 0a 53 51 4c e of 2...*/..SQL
a8d50 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
a8d60 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 sqlite3Memdebug
a8d70 42 61 63 6b 74 72 61 63 65 28 69 6e 74 20 64 65 Backtrace(int de
a8d80 70 74 68 29 7b 0d 0a 20 20 69 66 28 20 64 65 70 pth){.. if( dep
a8d90 74 68 3c 30 20 29 7b 20 64 65 70 74 68 20 3d 20 th<0 ){ depth =
a8da0 30 3b 20 7d 0d 0a 20 20 69 66 28 20 64 65 70 74 0; }.. if( dept
a8db0 68 3e 32 30 20 29 7b 20 64 65 70 74 68 20 3d 20 h>20 ){ depth =
a8dc0 32 30 3b 20 7d 0d 0a 20 20 64 65 70 74 68 20 3d 20; }.. depth =
a8dd0 20 28 64 65 70 74 68 2b 31 29 26 30 78 66 65 3b (depth+1)&0xfe;
a8de0 0d 0a 20 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 .. mem.nBacktra
a8df0 63 65 20 3d 20 64 65 70 74 68 3b 0d 0a 7d 0d 0a ce = depth;..}..
a8e00 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
a8e10 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d void sqlite3Mem
a8e20 64 65 62 75 67 42 61 63 6b 74 72 61 63 65 43 61 debugBacktraceCa
a8e30 6c 6c 62 61 63 6b 28 76 6f 69 64 20 28 2a 78 42 llback(void (*xB
a8e40 61 63 6b 74 72 61 63 65 29 28 69 6e 74 2c 20 69 acktrace)(int, i
a8e50 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29 7b 0d 0a nt, void **)){..
a8e60 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63 65 mem.xBacktrace
a8e70 20 3d 20 78 42 61 63 6b 74 72 61 63 65 3b 0d 0a = xBacktrace;..
a8e80 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 }..../*..** Set
a8e90 74 68 65 20 74 69 74 6c 65 20 73 74 72 69 6e 67 the title string
a8ea0 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 for subsequent
a8eb0 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0d 0a 2a 2f allocations...*/
a8ec0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
a8ed0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d void sqlite3Mem
a8ee0 64 65 62 75 67 53 65 74 74 69 74 6c 65 28 63 6f debugSettitle(co
a8ef0 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 nst char *zTitle
a8f00 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 ){.. unsigned i
a8f10 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 nt n = sqlite3St
a8f20 72 6c 65 6e 33 30 28 7a 54 69 74 6c 65 29 20 2b rlen30(zTitle) +
a8f30 20 31 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 1;.. sqlite3_m
a8f40 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d utex_enter(mem.m
a8f50 75 74 65 78 29 3b 0d 0a 20 20 69 66 28 20 6e 3e utex);.. if( n>
a8f60 3d 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74 =sizeof(mem.zTit
a8f70 6c 65 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 le) ) n = sizeof
a8f80 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 2d 31 3b 0d (mem.zTitle)-1;.
a8f90 0a 20 20 6d 65 6d 63 70 79 28 6d 65 6d 2e 7a 54 . memcpy(mem.zT
a8fa0 69 74 6c 65 2c 20 7a 54 69 74 6c 65 2c 20 6e 29 itle, zTitle, n)
a8fb0 3b 0d 0a 20 20 6d 65 6d 2e 7a 54 69 74 6c 65 5b ;.. mem.zTitle[
a8fc0 6e 5d 20 3d 20 30 3b 0d 0a 20 20 6d 65 6d 2e 6e n] = 0;.. mem.n
a8fd0 54 69 74 6c 65 20 3d 20 52 4f 55 4e 44 38 28 6e Title = ROUND8(n
a8fe0 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 );.. sqlite3_mu
a8ff0 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 tex_leave(mem.mu
a9000 74 65 78 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 tex);..}....SQLI
a9010 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
a9020 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 sqlite3MemdebugS
a9030 79 6e 63 28 29 7b 0d 0a 20 20 73 74 72 75 63 74 ync(){.. struct
a9040 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 MemBlockHdr *pH
a9050 64 72 3b 0d 0a 20 20 66 6f 72 28 70 48 64 72 3d dr;.. for(pHdr=
a9060 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72 mem.pFirst; pHdr
a9070 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65 ; pHdr=pHdr->pNe
a9080 78 74 29 7b 0d 0a 20 20 20 20 76 6f 69 64 20 2a xt){.. void *
a9090 2a 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 *pBt = (void**)p
a90a0 48 64 72 3b 0d 0a 20 20 20 20 70 42 74 20 2d 3d Hdr;.. pBt -=
a90b0 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 pHdr->nBacktrac
a90c0 65 53 6c 6f 74 73 3b 0d 0a 20 20 20 20 6d 65 6d eSlots;.. mem
a90d0 2e 78 42 61 63 6b 74 72 61 63 65 28 70 48 64 72 .xBacktrace(pHdr
a90e0 2d 3e 69 53 69 7a 65 2c 20 70 48 64 72 2d 3e 6e ->iSize, pHdr->n
a90f0 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 70 42 Backtrace-1, &pB
a9100 74 5b 31 5d 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a t[1]);.. }..}..
a9110 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 70 65 6e 20 74 68 ../*..** Open th
a9120 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 e file indicated
a9130 20 61 6e 64 20 77 72 69 74 65 20 61 20 6c 6f 67 and write a log
a9140 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20 of all unfreed
a9150 6d 65 6d 6f 72 79 20 0d 0a 2a 2a 20 61 6c 6c 6f memory ..** allo
a9160 63 61 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 61 cations into tha
a9170 74 20 6c 6f 67 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 t log...*/..SQLI
a9180 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
a9190 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 44 sqlite3MemdebugD
a91a0 75 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ump(const char *
a91b0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0d 0a 20 20 46 zFilename){.. F
a91c0 49 4c 45 20 2a 6f 75 74 3b 0d 0a 20 20 73 74 72 ILE *out;.. str
a91d0 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 uct MemBlockHdr
a91e0 2a 70 48 64 72 3b 0d 0a 20 20 76 6f 69 64 20 2a *pHdr;.. void *
a91f0 2a 70 42 74 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d *pBt;.. int i;.
a9200 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a . out = fopen(z
a9210 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22 29 3b 0d Filename, "w");.
a9220 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b . if( out==0 ){
a9230 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 .. fprintf(st
a9240 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c 65 derr, "** Unable
a9250 20 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 to output memor
a9260 79 20 64 65 62 75 67 20 6f 75 74 70 75 74 20 6c y debug output l
a9270 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0d 0a 20 og: %s **\n",..
a9280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a9290 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a zFilename);..
a92a0 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d return;.. }
a92b0 0d 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d .. for(pHdr=mem
a92c0 2e 70 46 69 72 73 74 3b 20 70 48 64 72 3b 20 70 .pFirst; pHdr; p
a92d0 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 Hdr=pHdr->pNext)
a92e0 7b 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d {.. char *z =
a92f0 20 28 63 68 61 72 2a 29 70 48 64 72 3b 0d 0a 20 (char*)pHdr;..
a9300 20 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 z -= pHdr->nB
a9310 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 2a 73 69 acktraceSlots*si
a9320 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 70 48 zeof(void*) + pH
a9330 64 72 2d 3e 6e 54 69 74 6c 65 3b 0d 0a 20 20 20 dr->nTitle;..
a9340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2a fprintf(out, "*
a9350 2a 2a 2a 20 25 6c 6c 64 20 62 79 74 65 73 20 61 *** %lld bytes a
a9360 74 20 25 70 20 66 72 6f 6d 20 25 73 20 2a 2a 2a t %p from %s ***
a9370 2a 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 20 20 *\n", ..
a9380 20 20 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 2c pHdr->iSize,
a9390 20 26 70 48 64 72 5b 31 5d 2c 20 70 48 64 72 2d &pHdr[1], pHdr-
a93a0 3e 6e 54 69 74 6c 65 20 3f 20 7a 20 3a 20 22 3f >nTitle ? z : "?
a93b0 3f 3f 22 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 ??");.. if( p
a93c0 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 Hdr->nBacktrace
a93d0 29 7b 0d 0a 20 20 20 20 20 20 66 66 6c 75 73 68 ){.. fflush
a93e0 28 6f 75 74 29 3b 0d 0a 20 20 20 20 20 20 70 42 (out);.. pB
a93f0 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64 72 t = (void**)pHdr
a9400 3b 0d 0a 20 20 20 20 20 20 70 42 74 20 2d 3d 20 ;.. pBt -=
a9410 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 pHdr->nBacktrace
a9420 53 6c 6f 74 73 3b 0d 0a 20 20 20 20 20 20 62 61 Slots;.. ba
a9430 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f cktrace_symbols_
a9440 66 64 28 70 42 74 2c 20 70 48 64 72 2d 3e 6e 42 fd(pBt, pHdr->nB
a9450 61 63 6b 74 72 61 63 65 2c 20 66 69 6c 65 6e 6f acktrace, fileno
a9460 28 6f 75 74 29 29 3b 0d 0a 20 20 20 20 20 20 66 (out));.. f
a9470 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 printf(out, "\n"
a9480 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
a9490 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 fprintf(out, "
a94a0 43 4f 55 4e 54 53 3a 5c 6e 22 29 3b 0d 0a 20 20 COUNTS:\n");..
a94b0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a for(i=0; i<NCSIZ
a94c0 45 2d 31 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 E-1; i++){..
a94d0 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 if( mem.nAlloc[i
a94e0 5d 20 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 ] ){.. fpri
a94f0 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 25 35 64 ntf(out, " %5d
a9500 3a 20 25 31 30 64 20 25 31 30 64 20 25 31 30 64 : %10d %10d %10d
a9510 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 \n", ..
a9520 20 20 20 69 2a 38 2c 20 6d 65 6d 2e 6e 41 6c 6c i*8, mem.nAll
a9530 6f 63 5b 69 5d 2c 20 6d 65 6d 2e 6e 43 75 72 72 oc[i], mem.nCurr
a9540 65 6e 74 5b 69 5d 2c 20 6d 65 6d 2e 6d 78 43 75 ent[i], mem.mxCu
a9550 72 72 65 6e 74 5b 69 5d 29 3b 0d 0a 20 20 20 20 rrent[i]);..
a9560 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6d 65 }.. }.. if( me
a9570 6d 2e 6e 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d m.nAlloc[NCSIZE-
a9580 31 5d 20 29 7b 0d 0a 20 20 20 20 66 70 72 69 6e 1] ){.. fprin
a9590 74 66 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a tf(out, " %5d:
a95a0 20 25 31 30 64 20 25 31 30 64 20 25 31 30 64 5c %10d %10d %10d\
a95b0 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 n",..
a95c0 20 20 4e 43 53 49 5a 45 2a 38 2d 38 2c 20 6d 65 NCSIZE*8-8, me
a95d0 6d 2e 6e 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d m.nAlloc[NCSIZE-
a95e0 31 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 1],..
a95f0 20 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 4e mem.nCurrent[N
a9600 43 53 49 5a 45 2d 31 5d 2c 20 6d 65 6d 2e 6d 78 CSIZE-1], mem.mx
a9610 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 Current[NCSIZE-1
a9620 5d 29 3b 0d 0a 20 20 7d 0d 0a 20 20 66 63 6c 6f ]);.. }.. fclo
a9630 73 65 28 6f 75 74 29 3b 0d 0a 7d 0d 0a 0d 0a 2f se(out);..}..../
a9640 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 *..** Return the
a9650 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 number of times
a9660 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f sqlite3MemMallo
a9670 63 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c c() has been cal
a9680 6c 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 led...*/..SQLITE
a9690 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
a96a0 69 74 65 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c ite3MemdebugMall
a96b0 6f 63 43 6f 75 6e 74 28 29 7b 0d 0a 20 20 69 6e ocCount(){.. in
a96c0 74 20 69 3b 0d 0a 20 20 69 6e 74 20 6e 54 6f 74 t i;.. int nTot
a96d0 61 6c 20 3d 20 30 3b 0d 0a 20 20 66 6f 72 28 69 al = 0;.. for(i
a96e0 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 3b 20 69 2b =0; i<NCSIZE; i+
a96f0 2b 29 7b 0d 0a 20 20 20 20 6e 54 6f 74 61 6c 20 +){.. nTotal
a9700 2b 3d 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d += mem.nAlloc[i]
a9710 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
a9720 20 6e 54 6f 74 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 0d nTotal;..}.....
a9730 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
a9740 45 5f 4d 45 4d 44 45 42 55 47 20 2a 2f 0d 0a 0d E_MEMDEBUG */...
a9750 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
a9760 20 45 6e 64 20 6f 66 20 6d 65 6d 32 2e 63 20 2a End of mem2.c *
a9770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
a97a0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
a97b0 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 6d 65 6d * Begin file mem
a97c0 33 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 3.c ************
a97d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a97e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a97f0 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 37 20 4f /../*..** 2007 O
a9800 63 74 6f 62 65 72 20 31 34 0d 0a 2a 2a 0d 0a 2a ctober 14..**..*
a9810 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 * The author dis
a9820 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 claims copyright
a9830 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 to this source
a9840 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 code. In place
a9850 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e of..** a legal n
a9860 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 otice, here is a
a9870 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a blessing:..**..
a9880 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f ** May you do
a9890 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 good and not ev
a98a0 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 il...** May y
a98b0 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e ou find forgiven
a98c0 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 ess for yourself
a98d0 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 and forgive oth
a98e0 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 ers...** May
a98f0 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 you share freely
a9900 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d , never taking m
a9910 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 ore than you giv
a9920 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a e...**..********
a9930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a9970 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 *..** This file
a9980 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20 66 contains the C f
a9990 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69 6d unctions that im
a99a0 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 plement a memory
a99b0 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 ..** allocation
a99c0 73 75 62 73 79 73 74 65 6d 20 66 6f 72 20 75 73 subsystem for us
a99d0 65 20 62 79 20 53 51 4c 69 74 65 2e 20 0d 0a 2a e by SQLite. ..*
a99e0 2a 0d 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 *..** This versi
a99f0 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 on of the memory
a9a00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 allocation subs
a9a10 79 73 74 65 6d 20 6f 6d 69 74 73 20 61 6c 6c 0d ystem omits all.
a9a20 0a 2a 2a 20 75 73 65 20 6f 66 20 6d 61 6c 6c 6f .** use of mallo
a9a30 63 28 29 2e 20 54 68 65 20 53 51 4c 69 74 65 20 c(). The SQLite
a9a40 75 73 65 72 20 73 75 70 70 6c 69 65 73 20 61 20 user supplies a
a9a50 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 0d block of memory.
a9a60 0a 2a 2a 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 .** before calli
a9a70 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 ng sqlite3_initi
a9a80 61 6c 69 7a 65 28 29 20 66 72 6f 6d 20 77 68 69 alize() from whi
a9a90 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0d 0a ch allocations..
a9aa0 2a 2a 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 ** are made and
a9ab0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 returned by the
a9ac0 78 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 78 52 xMalloc() and xR
a9ad0 65 61 6c 6c 6f 63 28 29 20 0d 0a 2a 2a 20 69 6d ealloc() ..** im
a9ae0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 20 4f plementations. O
a9af0 6e 63 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 nce sqlite3_init
a9b00 69 61 6c 69 7a 65 28 29 20 68 61 73 20 62 65 65 ialize() has bee
a9b10 6e 20 63 61 6c 6c 65 64 2c 0d 0a 2a 2a 20 74 68 n called,..** th
a9b20 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f e amount of memo
a9b30 72 79 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 ry available to
a9b40 53 51 4c 69 74 65 20 69 73 20 66 69 78 65 64 20 SQLite is fixed
a9b50 61 6e 64 20 63 61 6e 6e 6f 74 0d 0a 2a 2a 20 62 and cannot..** b
a9b60 65 20 63 68 61 6e 67 65 64 2e 0d 0a 2a 2a 0d 0a e changed...**..
a9b70 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 ** This version
a9b80 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c of the memory al
a9b90 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 location subsyst
a9ba0 65 6d 20 69 73 20 69 6e 63 6c 75 64 65 64 0d 0a em is included..
a9bb0 2a 2a 20 69 6e 20 74 68 65 20 62 75 69 6c 64 20 ** in the build
a9bc0 6f 6e 6c 79 20 69 66 20 53 51 4c 49 54 45 5f 45 only if SQLITE_E
a9bd0 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 69 73 NABLE_MEMSYS3 is
a9be0 20 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 0d defined...*/...
a9bf0 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 76 65 72 ./*..** This ver
a9c00 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f sion of the memo
a9c10 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 ry allocator is
a9c20 6f 6e 6c 79 20 62 75 69 6c 74 20 69 6e 74 6f 20 only built into
a9c30 74 68 65 20 6c 69 62 72 61 72 79 0d 0a 2a 2a 20 the library..**
a9c40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 SQLITE_ENABLE_ME
a9c50 4d 53 59 53 33 20 69 73 20 64 65 66 69 6e 65 64 MSYS3 is defined
a9c60 2e 20 44 65 66 69 6e 69 6e 67 20 74 68 69 73 20 . Defining this
a9c70 73 79 6d 62 6f 6c 20 64 6f 65 73 20 6e 6f 74 0d symbol does not.
a9c80 0a 2a 2a 20 6d 65 61 6e 20 74 68 61 74 20 74 68 .** mean that th
a9c90 65 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 75 e library will u
a9ca0 73 65 20 61 20 6d 65 6d 6f 72 79 2d 70 6f 6f 6c se a memory-pool
a9cb0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6a 75 73 by default, jus
a9cc0 74 20 74 68 61 74 0d 0a 2a 2a 20 69 74 20 69 73 t that..** it is
a9cd0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 available. The
a9ce0 6d 65 6d 70 6f 6f 6c 20 61 6c 6c 6f 63 61 74 6f mempool allocato
a9cf0 72 20 69 73 20 61 63 74 69 76 61 74 65 64 20 62 r is activated b
a9d00 79 20 63 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 73 71 y calling..** sq
a9d10 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2e 0d lite3_config()..
a9d20 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 .*/..#ifdef SQLI
a9d30 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 TE_ENABLE_MEMSYS
a9d40 33 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 78 69 3..../*..** Maxi
a9d50 6d 75 6d 20 73 69 7a 65 20 28 69 6e 20 4d 65 6d mum size (in Mem
a9d60 33 42 6c 6f 63 6b 73 29 20 6f 66 20 61 20 22 73 3Blocks) of a "s
a9d70 6d 61 6c 6c 22 20 63 68 75 6e 6b 2e 0d 0a 2a 2f mall" chunk...*/
a9d80 0d 0a 23 64 65 66 69 6e 65 20 4d 58 5f 53 4d 41 ..#define MX_SMA
a9d90 4c 4c 20 31 30 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a LL 10....../*..*
a9da0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 * Number of free
a9db0 6c 69 73 74 20 68 61 73 68 20 73 6c 6f 74 73 0d list hash slots.
a9dc0 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4e 5f 48 .*/..#define N_H
a9dd0 41 53 48 20 20 36 31 0d 0a 0d 0a 2f 2a 0d 0a 2a ASH 61..../*..*
a9de0 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 * A memory alloc
a9df0 61 74 69 6f 6e 20 28 61 6c 73 6f 20 63 61 6c 6c ation (also call
a9e00 65 64 20 61 20 22 63 68 75 6e 6b 22 29 20 63 6f ed a "chunk") co
a9e10 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 nsists of two or
a9e20 20 0d 0a 2a 2a 20 6d 6f 72 65 20 62 6c 6f 63 6b ..** more block
a9e30 73 20 77 68 65 72 65 20 65 61 63 68 20 62 6c 6f s where each blo
a9e40 63 6b 20 69 73 20 38 20 62 79 74 65 73 2e 20 20 ck is 8 bytes.
a9e50 54 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 The first 8 byte
a9e60 73 20 61 72 65 20 0d 0a 2a 2a 20 61 20 68 65 61 s are ..** a hea
a9e70 64 65 72 20 74 68 61 74 20 69 73 20 6e 6f 74 20 der that is not
a9e80 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 returned to the
a9e90 75 73 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 user...**..** A
a9ea0 63 68 75 6e 6b 20 69 73 20 74 77 6f 20 6f 72 20 chunk is two or
a9eb0 6d 6f 72 65 20 62 6c 6f 63 6b 73 20 74 68 61 74 more blocks that
a9ec0 20 69 73 20 65 69 74 68 65 72 20 63 68 65 63 6b is either check
a9ed0 65 64 20 6f 75 74 20 6f 72 0d 0a 2a 2a 20 66 72 ed out or..** fr
a9ee0 65 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 62 ee. The first b
a9ef0 6c 6f 63 6b 20 68 61 73 20 66 6f 72 6d 61 74 20 lock has format
a9f00 75 2e 68 64 72 2e 20 20 75 2e 68 64 72 2e 73 69 u.hdr. u.hdr.si
a9f10 7a 65 34 78 20 69 73 20 34 20 74 69 6d 65 73 20 ze4x is 4 times
a9f20 74 68 65 0d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 the..** size of
a9f30 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 the allocation i
a9f40 6e 20 62 6c 6f 63 6b 73 20 69 66 20 74 68 65 20 n blocks if the
a9f50 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 72 allocation is fr
a9f60 65 65 2e 0d 0a 2a 2a 20 54 68 65 20 75 2e 68 64 ee...** The u.hd
a9f70 72 2e 73 69 7a 65 34 78 26 31 20 62 69 74 20 69 r.size4x&1 bit i
a9f80 73 20 74 72 75 65 20 69 66 20 74 68 65 20 63 68 s true if the ch
a9f90 75 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 20 6f unk is checked o
a9fa0 75 74 20 61 6e 64 0d 0a 2a 2a 20 66 61 6c 73 65 ut and..** false
a9fb0 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69 73 if the chunk is
a9fc0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 on the freelist
a9fd0 2e 20 20 54 68 65 20 75 2e 68 64 72 2e 73 69 7a . The u.hdr.siz
a9fe0 65 34 78 26 32 20 62 69 74 0d 0a 2a 2a 20 69 73 e4x&2 bit..** is
a9ff0 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72 65 true if the pre
aa000 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 73 20 63 vious chunk is c
aa010 68 65 63 6b 65 64 20 6f 75 74 20 61 6e 64 20 66 hecked out and f
aa020 61 6c 73 65 20 69 66 20 74 68 65 0d 0a 2a 2a 20 alse if the..**
aa030 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 previous chunk i
aa040 73 20 66 72 65 65 2e 20 20 54 68 65 20 75 2e 68 s free. The u.h
aa050 64 72 2e 70 72 65 76 53 69 7a 65 20 66 69 65 6c dr.prevSize fiel
aa060 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 d is the size of
aa070 0d 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 ..** the previou
aa080 73 20 63 68 75 6e 6b 20 69 6e 20 62 6c 6f 63 6b s chunk in block
aa090 73 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 s if the previou
aa0a0 73 20 63 68 75 6e 6b 20 69 73 20 6f 6e 20 74 68 s chunk is on th
aa0b0 65 0d 0a 2a 2a 20 66 72 65 65 6c 69 73 74 2e 20 e..** freelist.
aa0c0 49 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 If the previous
aa0d0 63 68 75 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 chunk is checked
aa0e0 20 6f 75 74 2c 20 74 68 65 6e 0d 0a 2a 2a 20 75 out, then..** u
aa0f0 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 63 61 .hdr.prevSize ca
aa100 6e 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 n be part of the
aa110 20 64 61 74 61 20 66 6f 72 20 74 68 61 74 20 63 data for that c
aa120 68 75 6e 6b 20 61 6e 64 20 73 68 6f 75 6c 64 0d hunk and should.
aa130 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 20 .** not be read
aa140 6f 72 20 77 72 69 74 74 65 6e 2e 0d 0a 2a 2a 0d or written...**.
aa150 0a 2a 2a 20 57 65 20 6f 66 74 65 6e 20 69 64 65 .** We often ide
aa160 6e 74 69 66 79 20 61 20 63 68 75 6e 6b 20 62 79 ntify a chunk by
aa170 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 6d 65 its index in me
aa180 6d 33 2e 61 50 6f 6f 6c 5b 5d 2e 20 20 57 68 65 m3.aPool[]. Whe
aa190 6e 0d 0a 2a 2a 20 74 68 69 73 20 69 73 20 64 6f n..** this is do
aa1a0 6e 65 2c 20 74 68 65 20 63 68 75 6e 6b 20 69 6e ne, the chunk in
aa1b0 64 65 78 20 72 65 66 65 72 73 20 74 6f 20 74 68 dex refers to th
aa1c0 65 20 73 65 63 6f 6e 64 20 62 6c 6f 63 6b 20 6f e second block o
aa1d0 66 0d 0a 2a 2a 20 74 68 65 20 63 68 75 6e 6b 2e f..** the chunk.
aa1e0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 74 In this way, t
aa1f0 68 65 20 66 69 72 73 74 20 63 68 75 6e 6b 20 68 he first chunk h
aa200 61 73 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 31 as an index of 1
aa210 2e 0d 0a 2a 2a 20 41 20 63 68 75 6e 6b 20 69 6e ...** A chunk in
aa220 64 65 78 20 6f 66 20 30 20 6d 65 61 6e 73 20 22 dex of 0 means "
aa230 6e 6f 20 73 75 63 68 20 63 68 75 6e 6b 22 20 61 no such chunk" a
aa240 6e 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 nd is the equiva
aa250 6c 65 6e 74 0d 0a 2a 2a 20 6f 66 20 61 20 4e 55 lent..** of a NU
aa260 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2a 0d LL pointer...**.
aa270 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 62 .** The second b
aa280 6c 6f 63 6b 20 6f 66 20 66 72 65 65 20 63 68 75 lock of free chu
aa290 6e 6b 73 20 69 73 20 6f 66 20 74 68 65 20 66 6f nks is of the fo
aa2a0 72 6d 20 75 2e 6c 69 73 74 2e 20 20 54 68 65 0d rm u.list. The.
aa2b0 0a 2a 2a 20 74 77 6f 20 66 69 65 6c 64 73 20 66 .** two fields f
aa2c0 6f 72 6d 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e orm a double-lin
aa2d0 6b 65 64 20 6c 69 73 74 20 6f 66 20 63 68 75 6e ked list of chun
aa2e0 6b 73 20 6f 66 20 72 65 6c 61 74 65 64 20 73 69 ks of related si
aa2f0 7a 65 73 2e 0d 0a 2a 2a 20 50 6f 69 6e 74 65 72 zes...** Pointer
aa300 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 s to the head of
aa310 20 74 68 65 20 6c 69 73 74 20 61 72 65 20 73 74 the list are st
aa320 6f 72 65 64 20 69 6e 20 6d 65 6d 33 2e 61 69 53 ored in mem3.aiS
aa330 6d 61 6c 6c 5b 5d 20 0d 0a 2a 2a 20 66 6f 72 20 mall[] ..** for
aa340 73 6d 61 6c 6c 65 72 20 63 68 75 6e 6b 73 20 61 smaller chunks a
aa350 6e 64 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 5d nd mem3.aiHash[]
aa360 20 66 6f 72 20 6c 61 72 67 65 72 20 63 68 75 6e for larger chun
aa370 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ks...**..** The
aa380 73 65 63 6f 6e 64 20 62 6c 6f 63 6b 20 6f 66 20 second block of
aa390 61 20 63 68 75 6e 6b 20 69 73 20 75 73 65 72 20 a chunk is user
aa3a0 64 61 74 61 20 69 66 20 74 68 65 20 63 68 75 6e data if the chun
aa3b0 6b 20 69 73 20 63 68 65 63 6b 65 64 20 0d 0a 2a k is checked ..*
aa3c0 2a 20 6f 75 74 2e 20 20 49 66 20 61 20 63 68 75 * out. If a chu
aa3d0 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 nk is checked ou
aa3e0 74 2c 20 74 68 65 20 75 73 65 72 20 64 61 74 61 t, the user data
aa3f0 20 6d 61 79 20 65 78 74 65 6e 64 20 69 6e 74 6f may extend into
aa400 0d 0a 2a 2a 20 74 68 65 20 75 2e 68 64 72 2e 70 ..** the u.hdr.p
aa410 72 65 76 53 69 7a 65 20 76 61 6c 75 65 20 6f 66 revSize value of
aa420 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 the following c
aa430 68 75 6e 6b 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 hunk...*/..typed
aa440 65 66 20 73 74 72 75 63 74 20 4d 65 6d 33 42 6c ef struct Mem3Bl
aa450 6f 63 6b 20 4d 65 6d 33 42 6c 6f 63 6b 3b 0d 0a ock Mem3Block;..
aa460 73 74 72 75 63 74 20 4d 65 6d 33 42 6c 6f 63 6b struct Mem3Block
aa470 20 7b 0d 0a 20 20 75 6e 69 6f 6e 20 7b 0d 0a 20 {.. union {..
aa480 20 20 20 73 74 72 75 63 74 20 7b 0d 0a 20 20 20 struct {..
aa490 20 20 20 75 33 32 20 70 72 65 76 53 69 7a 65 3b u32 prevSize;
aa4a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 /* Size of pr
aa4b0 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 6e 20 evious chunk in
aa4c0 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d 65 6e Mem3Block elemen
aa4d0 74 73 20 2a 2f 0d 0a 20 20 20 20 20 20 75 33 32 ts */.. u32
aa4e0 20 73 69 7a 65 34 78 3b 20 20 20 20 20 2f 2a 20 size4x; /*
aa4f0 34 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20 63 4x the size of c
aa500 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 69 6e 20 urrent chunk in
aa510 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d 65 6e Mem3Block elemen
aa520 74 73 20 2a 2f 0d 0a 20 20 20 20 7d 20 68 64 72 ts */.. } hdr
aa530 3b 0d 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0d ;.. struct {.
aa540 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74 3b . u32 next;
aa550 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 /* Index
aa560 69 6e 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 5d 20 in mem3.aPool[]
aa570 6f 66 20 6e 65 78 74 20 66 72 65 65 20 63 68 75 of next free chu
aa580 6e 6b 20 2a 2f 0d 0a 20 20 20 20 20 20 75 33 32 nk */.. u32
aa590 20 70 72 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 prev; /*
aa5a0 49 6e 64 65 78 20 69 6e 20 6d 65 6d 33 2e 61 50 Index in mem3.aP
aa5b0 6f 6f 6c 5b 5d 20 6f 66 20 70 72 65 76 69 6f 75 ool[] of previou
aa5c0 73 20 66 72 65 65 20 63 68 75 6e 6b 20 2a 2f 0d s free chunk */.
aa5d0 0a 20 20 20 20 7d 20 6c 69 73 74 3b 0d 0a 20 20 . } list;..
aa5e0 7d 20 75 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a } u;..};..../*..
aa5f0 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 73 74 ** All of the st
aa600 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 atic variables u
aa610 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 sed by this modu
aa620 6c 65 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 le are collected
aa630 0d 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 ..** into a sing
aa640 6c 65 20 73 74 72 75 63 74 75 72 65 20 6e 61 6d le structure nam
aa650 65 64 20 22 6d 65 6d 33 22 2e 20 20 54 68 69 73 ed "mem3". This
aa660 20 69 73 20 74 6f 20 6b 65 65 70 20 74 68 65 0d is to keep the.
aa670 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 .** static varia
aa680 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65 64 20 61 bles organized a
aa690 6e 64 20 74 6f 20 72 65 64 75 63 65 20 6e 61 6d nd to reduce nam
aa6a0 65 73 70 61 63 65 20 70 6f 6c 6c 75 74 69 6f 6e espace pollution
aa6b0 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 6d ..** when this m
aa6c0 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69 6e 65 odule is combine
aa6d0 64 20 77 69 74 68 20 6f 74 68 65 72 20 69 6e 20 d with other in
aa6e0 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e the amalgamation
aa6f0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 53 51 ...*/..static SQ
aa700 4c 49 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 LITE_WSD struct
aa710 4d 65 6d 33 47 6c 6f 62 61 6c 20 7b 0d 0a 20 20 Mem3Global {..
aa720 2f 2a 0d 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 /*.. ** Memory
aa730 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c available for al
aa740 6c 6f 63 61 74 69 6f 6e 2e 20 6e 50 6f 6f 6c 20 location. nPool
aa750 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 is the size of t
aa760 68 65 20 61 72 72 61 79 0d 0a 20 20 2a 2a 20 28 he array.. ** (
aa770 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 20 70 in Mem3Blocks) p
aa780 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 50 6f ointed to by aPo
aa790 6f 6c 20 6c 65 73 73 20 32 2e 0d 0a 20 20 2a 2f ol less 2... */
aa7a0 0d 0a 20 20 75 33 32 20 6e 50 6f 6f 6c 3b 0d 0a .. u32 nPool;..
aa7b0 20 20 4d 65 6d 33 42 6c 6f 63 6b 20 2a 61 50 6f Mem3Block *aPo
aa7c0 6f 6c 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a ol;.... /*.. *
aa7d0 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 72 65 * True if we are
aa7e0 20 65 76 61 6c 75 61 74 69 6e 67 20 61 6e 20 6f evaluating an o
aa7f0 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 61 6c ut-of-memory cal
aa800 6c 62 61 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 lback... */..
aa810 69 6e 74 20 61 6c 61 72 6d 42 75 73 79 3b 0d 0a int alarmBusy;..
aa820 20 20 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 4d .. /*.. ** M
aa830 75 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 utex to control
aa840 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 65 access to the me
aa850 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
aa860 73 75 62 73 79 73 74 65 6d 2e 0d 0a 20 20 2a 2f subsystem... */
aa870 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
aa880 78 20 2a 6d 75 74 65 78 3b 0d 0a 20 20 0d 0a 20 x *mutex;.. ..
aa890 20 2f 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 6d 69 /*.. ** The mi
aa8a0 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 nimum amount of
aa8b0 66 72 65 65 20 73 70 61 63 65 20 74 68 61 74 20 free space that
aa8c0 77 65 20 68 61 76 65 20 73 65 65 6e 2e 0d 0a 20 we have seen...
aa8d0 20 2a 2f 0d 0a 20 20 75 33 32 20 6d 6e 4d 61 73 */.. u32 mnMas
aa8e0 74 65 72 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 ter;.... /*..
aa8f0 2a 2a 20 69 4d 61 73 74 65 72 20 69 73 20 74 68 ** iMaster is th
aa900 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d e index of the m
aa910 61 73 74 65 72 20 63 68 75 6e 6b 2e 20 20 4d 6f aster chunk. Mo
aa920 73 74 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f st new allocatio
aa930 6e 73 0d 0a 20 20 2a 2a 20 6f 63 63 75 72 20 6f ns.. ** occur o
aa940 66 66 20 6f 66 20 74 68 69 73 20 63 68 75 6e 6b ff of this chunk
aa950 2e 20 20 73 7a 4d 61 73 74 65 72 20 69 73 20 74 . szMaster is t
aa960 68 65 20 73 69 7a 65 20 28 69 6e 20 4d 65 6d 33 he size (in Mem3
aa970 42 6c 6f 63 6b 73 29 0d 0a 20 20 2a 2a 20 6f 66 Blocks).. ** of
aa980 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 73 the current mas
aa990 74 65 72 2e 20 20 69 4d 61 73 74 65 72 20 69 73 ter. iMaster is
aa9a0 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 0 if there is n
aa9b0 6f 74 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 2e ot master chunk.
aa9c0 0d 0a 20 20 2a 2a 20 54 68 65 20 6d 61 73 74 65 .. ** The maste
aa9d0 72 20 63 68 75 6e 6b 20 69 73 20 6e 6f 74 20 69 r chunk is not i
aa9e0 6e 20 65 69 74 68 65 72 20 74 68 65 20 61 69 48 n either the aiH
aa9f0 61 73 68 5b 5d 20 6f 72 20 61 69 53 6d 61 6c 6c ash[] or aiSmall
aaa00 5b 5d 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 75 33 32 []... */.. u32
aaa10 20 69 4d 61 73 74 65 72 3b 0d 0a 20 20 75 33 32 iMaster;.. u32
aaa20 20 73 7a 4d 61 73 74 65 72 3b 0d 0a 0d 0a 20 20 szMaster;....
aaa30 2f 2a 0d 0a 20 20 2a 2a 20 41 72 72 61 79 20 6f /*.. ** Array o
aaa40 66 20 6c 69 73 74 73 20 6f 66 20 66 72 65 65 20 f lists of free
aaa50 62 6c 6f 63 6b 73 20 61 63 63 6f 72 64 69 6e 67 blocks according
aaa60 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 73 69 to the block si
aaa70 7a 65 20 0d 0a 20 20 2a 2a 20 66 6f 72 20 73 6d ze .. ** for sm
aaa80 61 6c 6c 65 72 20 63 68 75 6e 6b 73 2c 20 6f 72 aller chunks, or
aaa90 20 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20 62 a hash on the b
aaaa0 6c 6f 63 6b 20 73 69 7a 65 20 66 6f 72 20 6c 61 lock size for la
aaab0 72 67 65 72 0d 0a 20 20 2a 2a 20 63 68 75 6e 6b rger.. ** chunk
aaac0 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 75 33 32 20 s... */.. u32
aaad0 61 69 53 6d 61 6c 6c 5b 4d 58 5f 53 4d 41 4c 4c aiSmall[MX_SMALL
aaae0 2d 31 5d 3b 20 20 20 2f 2a 20 46 6f 72 20 73 69 -1]; /* For si
aaaf0 7a 65 73 20 32 20 74 68 72 6f 75 67 68 20 4d 58 zes 2 through MX
aab00 5f 53 4d 41 4c 4c 2c 20 69 6e 63 6c 75 73 69 76 _SMALL, inclusiv
aab10 65 20 2a 2f 0d 0a 20 20 75 33 32 20 61 69 48 61 e */.. u32 aiHa
aab20 73 68 5b 4e 5f 48 41 53 48 5d 3b 20 20 20 20 20 sh[N_HASH];
aab30 20 20 20 2f 2a 20 46 6f 72 20 73 69 7a 65 73 20 /* For sizes
aab40 4d 58 5f 53 4d 41 4c 4c 2b 31 20 61 6e 64 20 6c MX_SMALL+1 and l
aab50 61 72 67 65 72 20 2a 2f 0d 0a 7d 20 6d 65 6d 33 arger */..} mem3
aab60 20 3d 20 7b 20 39 37 35 33 35 35 37 35 20 7d 3b = { 97535575 };
aab70 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6d 65 6d 33 ....#define mem3
aab80 20 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 4d GLOBAL(struct M
aab90 65 6d 33 47 6c 6f 62 61 6c 2c 20 6d 65 6d 33 29 em3Global, mem3)
aaba0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 6e 6c 69 6e ..../*..** Unlin
aabb0 6b 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20 6d k the chunk at m
aabc0 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 20 66 72 6f em3.aPool[i] fro
aabd0 6d 20 6c 69 73 74 20 69 74 20 69 73 20 63 75 72 m list it is cur
aabe0 72 65 6e 74 6c 79 0d 0a 2a 2a 20 6f 6e 2e 20 20 rently..** on.
aabf0 2a 70 52 6f 6f 74 20 69 73 20 74 68 65 20 6c 69 *pRoot is the li
aac00 73 74 20 74 68 61 74 20 69 20 69 73 20 61 20 6d st that i is a m
aac10 65 6d 62 65 72 20 6f 66 2e 0d 0a 2a 2f 0d 0a 73 ember of...*/..s
aac20 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 tatic void memsy
aac30 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74 s3UnlinkFromList
aac40 28 75 33 32 20 69 2c 20 75 33 32 20 2a 70 52 6f (u32 i, u32 *pRo
aac50 6f 74 29 7b 0d 0a 20 20 75 33 32 20 6e 65 78 74 ot){.. u32 next
aac60 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d = mem3.aPool[i]
aac70 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0d 0a 20 .u.list.next;..
aac80 20 75 33 32 20 70 72 65 76 20 3d 20 6d 65 6d 33 u32 prev = mem3
aac90 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 .aPool[i].u.list
aaca0 2e 70 72 65 76 3b 0d 0a 20 20 61 73 73 65 72 74 .prev;.. assert
aacb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f ( sqlite3_mutex_
aacc0 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 held(mem3.mutex)
aacd0 20 29 3b 0d 0a 20 20 69 66 28 20 70 72 65 76 3d );.. if( prev=
aace0 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70 52 6f 6f =0 ){.. *pRoo
aacf0 74 20 3d 20 6e 65 78 74 3b 0d 0a 20 20 7d 65 6c t = next;.. }el
aad00 73 65 7b 0d 0a 20 20 20 20 6d 65 6d 33 2e 61 50 se{.. mem3.aP
aad10 6f 6f 6c 5b 70 72 65 76 5d 2e 75 2e 6c 69 73 74 ool[prev].u.list
aad20 2e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0d 0a 20 .next = next;..
aad30 20 7d 0d 0a 20 20 69 66 28 20 6e 65 78 74 20 29 }.. if( next )
aad40 7b 0d 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f {.. mem3.aPoo
aad50 6c 5b 6e 65 78 74 5d 2e 75 2e 6c 69 73 74 2e 70 l[next].u.list.p
aad60 72 65 76 20 3d 20 70 72 65 76 3b 0d 0a 20 20 7d rev = prev;.. }
aad70 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 .. mem3.aPool[i
aad80 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 20 3d 20 ].u.list.next =
aad90 30 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 0;.. mem3.aPool
aada0 5b 69 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 76 20 [i].u.list.prev
aadb0 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a = 0;..}..../*..*
aadc0 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75 * Unlink the chu
aadd0 6e 6b 20 61 74 20 69 6e 64 65 78 20 69 20 66 72 nk at index i fr
aade0 6f 6d 20 0d 0a 2a 2a 20 77 68 61 74 65 76 65 72 om ..** whatever
aadf0 20 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 list is current
aae00 6c 79 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e 0d ly a member of..
aae10 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
aae20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 75 memsys3Unlink(u
aae30 33 32 20 69 29 7b 0d 0a 20 20 75 33 32 20 73 69 32 i){.. u32 si
aae40 7a 65 2c 20 68 61 73 68 3b 0d 0a 20 20 61 73 73 ze, hash;.. ass
aae50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
aae60 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 ex_held(mem3.mut
aae70 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 ex) );.. assert
aae80 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d ( (mem3.aPool[i-
aae90 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 1].u.hdr.size4x
aaea0 26 20 31 29 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 & 1)==0 );.. as
aaeb0 73 65 72 74 28 20 69 3e 3d 31 20 29 3b 0d 0a 20 sert( i>=1 );..
aaec0 20 73 69 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f size = mem3.aPo
aaed0 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 ol[i-1].u.hdr.si
aaee0 7a 65 34 78 2f 34 3b 0d 0a 20 20 61 73 73 65 72 ze4x/4;.. asser
aaef0 74 28 20 73 69 7a 65 3d 3d 6d 65 6d 33 2e 61 50 t( size==mem3.aP
aaf00 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e ool[i+size-1].u.
aaf10 68 64 72 2e 70 72 65 76 53 69 7a 65 20 29 3b 0d hdr.prevSize );.
aaf20 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e . assert( size>
aaf30 3d 32 20 29 3b 0d 0a 20 20 69 66 28 20 73 69 7a =2 );.. if( siz
aaf40 65 20 3c 3d 20 4d 58 5f 53 4d 41 4c 4c 20 29 7b e <= MX_SMALL ){
aaf50 0d 0a 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c .. memsys3Unl
aaf60 69 6e 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 inkFromList(i, &
aaf70 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 73 69 7a mem3.aiSmall[siz
aaf80 65 2d 32 5d 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b e-2]);.. }else{
aaf90 0d 0a 20 20 20 20 68 61 73 68 20 3d 20 73 69 7a .. hash = siz
aafa0 65 20 25 20 4e 5f 48 41 53 48 3b 0d 0a 20 20 20 e % N_HASH;..
aafb0 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72 memsys3UnlinkFr
aafc0 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33 2e omList(i, &mem3.
aafd0 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b 0d 0a aiHash[hash]);..
aafe0 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
aaff0 20 4c 69 6e 6b 20 74 68 65 20 63 68 75 6e 6b 20 Link the chunk
ab000 61 74 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d at mem3.aPool[i]
ab010 20 73 6f 20 74 68 61 74 20 69 73 20 6f 6e 20 74 so that is on t
ab020 68 65 20 6c 69 73 74 20 72 6f 6f 74 65 64 0d 0a he list rooted..
ab030 2a 2a 20 61 74 20 2a 70 52 6f 6f 74 2e 0d 0a 2a ** at *pRoot...*
ab040 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d /..static void m
ab050 65 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69 emsys3LinkIntoLi
ab060 73 74 28 75 33 32 20 69 2c 20 75 33 32 20 2a 70 st(u32 i, u32 *p
ab070 52 6f 6f 74 29 7b 0d 0a 20 20 61 73 73 65 72 74 Root){.. assert
ab080 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f ( sqlite3_mutex_
ab090 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 held(mem3.mutex)
ab0a0 20 29 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f );.. mem3.aPoo
ab0b0 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 l[i].u.list.next
ab0c0 20 3d 20 2a 70 52 6f 6f 74 3b 0d 0a 20 20 6d 65 = *pRoot;.. me
ab0d0 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 m3.aPool[i].u.li
ab0e0 73 74 2e 70 72 65 76 20 3d 20 30 3b 0d 0a 20 20 st.prev = 0;..
ab0f0 69 66 28 20 2a 70 52 6f 6f 74 20 29 7b 0d 0a 20 if( *pRoot ){..
ab100 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 2a 70 mem3.aPool[*p
ab110 52 6f 6f 74 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 Root].u.list.pre
ab120 76 20 3d 20 69 3b 0d 0a 20 20 7d 0d 0a 20 20 2a v = i;.. }.. *
ab130 70 52 6f 6f 74 20 3d 20 69 3b 0d 0a 7d 0d 0a 0d pRoot = i;..}...
ab140 0a 2f 2a 0d 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 ./*..** Link the
ab150 20 63 68 75 6e 6b 20 61 74 20 69 6e 64 65 78 20 chunk at index
ab160 69 20 69 6e 74 6f 20 65 69 74 68 65 72 20 74 68 i into either th
ab170 65 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 2a e appropriate..*
ab180 2a 20 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 6c 69 * small chunk li
ab190 73 74 2c 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 st, or into the
ab1a0 6c 61 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 large chunk hash
ab1b0 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 table...*/..sta
ab1c0 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 tic void memsys3
ab1d0 4c 69 6e 6b 28 75 33 32 20 69 29 7b 0d 0a 20 20 Link(u32 i){..
ab1e0 75 33 32 20 73 69 7a 65 2c 20 68 61 73 68 3b 0d u32 size, hash;.
ab1f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
ab200 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 e3_mutex_held(me
ab210 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 m3.mutex) );..
ab220 61 73 73 65 72 74 28 20 69 3e 3d 31 20 29 3b 0d assert( i>=1 );.
ab230 0a 20 20 61 73 73 65 72 74 28 20 28 6d 65 6d 33 . assert( (mem3
ab240 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 .aPool[i-1].u.hd
ab250 72 2e 73 69 7a 65 34 78 20 26 20 31 29 3d 3d 30 r.size4x & 1)==0
ab260 20 29 3b 0d 0a 20 20 73 69 7a 65 20 3d 20 6d 65 );.. size = me
ab270 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e m3.aPool[i-1].u.
ab280 68 64 72 2e 73 69 7a 65 34 78 2f 34 3b 0d 0a 20 hdr.size4x/4;..
ab290 20 61 73 73 65 72 74 28 20 73 69 7a 65 3d 3d 6d assert( size==m
ab2a0 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 em3.aPool[i+size
ab2b0 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 -1].u.hdr.prevSi
ab2c0 7a 65 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ze );.. assert(
ab2d0 20 73 69 7a 65 3e 3d 32 20 29 3b 0d 0a 20 20 69 size>=2 );.. i
ab2e0 66 28 20 73 69 7a 65 20 3c 3d 20 4d 58 5f 53 4d f( size <= MX_SM
ab2f0 41 4c 4c 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 73 ALL ){.. mems
ab300 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69 73 74 28 ys3LinkIntoList(
ab310 69 2c 20 26 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c i, &mem3.aiSmall
ab320 5b 73 69 7a 65 2d 32 5d 29 3b 0d 0a 20 20 7d 65 [size-2]);.. }e
ab330 6c 73 65 7b 0d 0a 20 20 20 20 68 61 73 68 20 3d lse{.. hash =
ab340 20 73 69 7a 65 20 25 20 4e 5f 48 41 53 48 3b 0d size % N_HASH;.
ab350 0a 20 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b . memsys3Link
ab360 49 6e 74 6f 4c 69 73 74 28 69 2c 20 26 6d 65 6d IntoList(i, &mem
ab370 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b 3.aiHash[hash]);
ab380 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
ab390 2a 2a 20 49 66 20 74 68 65 20 53 54 41 54 49 43 ** If the STATIC
ab3a0 5f 4d 45 4d 20 6d 75 74 65 78 20 69 73 20 6e 6f _MEM mutex is no
ab3b0 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 t already held,
ab3c0 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 20 54 obtain it now. T
ab3d0 68 65 20 6d 75 74 65 78 0d 0a 2a 2a 20 77 69 6c he mutex..** wil
ab3e0 6c 20 61 6c 72 65 61 64 79 20 62 65 20 68 65 6c l already be hel
ab3f0 64 20 28 6f 62 74 61 69 6e 65 64 20 62 79 20 63 d (obtained by c
ab400 6f 64 65 20 69 6e 20 6d 61 6c 6c 6f 63 2e 63 29 ode in malloc.c)
ab410 20 69 66 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 47 if..** sqlite3G
ab420 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d lobalConfig.bMem
ab430 53 74 61 74 20 69 73 20 74 72 75 65 2e 0d 0a 2a Stat is true...*
ab440 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d /..static void m
ab450 65 6d 73 79 73 33 45 6e 74 65 72 28 76 6f 69 64 emsys3Enter(void
ab460 29 7b 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 ){.. if( sqlite
ab470 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 3GlobalConfig.bM
ab480 65 6d 73 74 61 74 3d 3d 30 20 26 26 20 6d 65 6d emstat==0 && mem
ab490 33 2e 6d 75 74 65 78 3d 3d 30 20 29 7b 0d 0a 20 3.mutex==0 ){..
ab4a0 20 20 20 6d 65 6d 33 2e 6d 75 74 65 78 20 3d 20 mem3.mutex =
ab4b0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f sqlite3MutexAllo
ab4c0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 c(SQLITE_MUTEX_S
ab4d0 54 41 54 49 43 5f 4d 45 4d 29 3b 0d 0a 20 20 7d TATIC_MEM);.. }
ab4e0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
ab4f0 78 5f 65 6e 74 65 72 28 6d 65 6d 33 2e 6d 75 74 x_enter(mem3.mut
ab500 65 78 29 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 ex);..}..static
ab510 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 65 61 76 void memsys3Leav
ab520 65 28 76 6f 69 64 29 7b 0d 0a 20 20 73 71 6c 69 e(void){.. sqli
ab530 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
ab540 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0d 0a 7d 0d mem3.mutex);..}.
ab550 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c 65 64 .../*..** Called
ab560 20 77 68 65 6e 20 77 65 20 61 72 65 20 75 6e 61 when we are una
ab570 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 ble to satisfy a
ab580 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 n allocation of
ab590 6e 42 79 74 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 nBytes...*/..sta
ab5a0 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 tic void memsys3
ab5b0 4f 75 74 4f 66 4d 65 6d 6f 72 79 28 69 6e 74 20 OutOfMemory(int
ab5c0 6e 42 79 74 65 29 7b 0d 0a 20 20 69 66 28 20 21 nByte){.. if( !
ab5d0 6d 65 6d 33 2e 61 6c 61 72 6d 42 75 73 79 20 29 mem3.alarmBusy )
ab5e0 7b 0d 0a 20 20 20 20 6d 65 6d 33 2e 61 6c 61 72 {.. mem3.alar
ab5f0 6d 42 75 73 79 20 3d 20 31 3b 0d 0a 20 20 20 20 mBusy = 1;..
ab600 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
ab610 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e mutex_held(mem3.
ab620 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 20 20 73 mutex) );.. s
ab630 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
ab640 76 65 28 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0d ve(mem3.mutex);.
ab650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6c . sqlite3_rel
ab660 65 61 73 65 5f 6d 65 6d 6f 72 79 28 6e 42 79 74 ease_memory(nByt
ab670 65 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 e);.. sqlite3
ab680 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d _mutex_enter(mem
ab690 33 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 20 6d 3.mutex);.. m
ab6a0 65 6d 33 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 em3.alarmBusy =
ab6b0 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0;.. }..}......
ab6c0 2f 2a 0d 0a 2a 2a 20 43 68 75 6e 6b 20 69 20 69 /*..** Chunk i i
ab6d0 73 20 61 20 66 72 65 65 20 63 68 75 6e 6b 20 74 s a free chunk t
ab6e0 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 6e 6c hat has been unl
ab6f0 69 6e 6b 65 64 2e 20 20 41 64 6a 75 73 74 20 69 inked. Adjust i
ab700 74 73 20 0d 0a 2a 2a 20 73 69 7a 65 20 70 61 72 ts ..** size par
ab710 61 6d 65 74 65 72 73 20 66 6f 72 20 63 68 65 63 ameters for chec
ab720 6b 2d 6f 75 74 20 61 6e 64 20 72 65 74 75 72 6e k-out and return
ab730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
ab740 65 20 0d 0a 2a 2a 20 75 73 65 72 20 70 6f 72 74 e ..** user port
ab750 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 75 6e 6b ion of the chunk
ab760 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f ...*/..static vo
ab770 69 64 20 2a 6d 65 6d 73 79 73 33 43 68 65 63 6b id *memsys3Check
ab780 6f 75 74 28 75 33 32 20 69 2c 20 75 33 32 20 6e out(u32 i, u32 n
ab790 42 6c 6f 63 6b 29 7b 0d 0a 20 20 75 33 32 20 78 Block){.. u32 x
ab7a0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ;.. assert( sql
ab7b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
ab7c0 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0d 0a mem3.mutex) );..
ab7d0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 31 20 29 assert( i>=1 )
ab7e0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d ;.. assert( mem
ab7f0 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 3.aPool[i-1].u.h
ab800 64 72 2e 73 69 7a 65 34 78 2f 34 3d 3d 6e 42 6c dr.size4x/4==nBl
ab810 6f 63 6b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 ock );.. assert
ab820 28 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 6e ( mem3.aPool[i+n
ab830 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e 70 Block-1].u.hdr.p
ab840 72 65 76 53 69 7a 65 3d 3d 6e 42 6c 6f 63 6b 20 revSize==nBlock
ab850 29 3b 0d 0a 20 20 78 20 3d 20 6d 65 6d 33 2e 61 );.. x = mem3.a
ab860 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e Pool[i-1].u.hdr.
ab870 73 69 7a 65 34 78 3b 0d 0a 20 20 6d 65 6d 33 2e size4x;.. mem3.
ab880 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 aPool[i-1].u.hdr
ab890 2e 73 69 7a 65 34 78 20 3d 20 6e 42 6c 6f 63 6b .size4x = nBlock
ab8a0 2a 34 20 7c 20 31 20 7c 20 28 78 26 32 29 3b 0d *4 | 1 | (x&2);.
ab8b0 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b . mem3.aPool[i+
ab8c0 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e nBlock-1].u.hdr.
ab8d0 70 72 65 76 53 69 7a 65 20 3d 20 6e 42 6c 6f 63 prevSize = nBloc
ab8e0 6b 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c k;.. mem3.aPool
ab8f0 5b 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 [i+nBlock-1].u.h
ab900 64 72 2e 73 69 7a 65 34 78 20 7c 3d 20 32 3b 0d dr.size4x |= 2;.
ab910 0a 20 20 72 65 74 75 72 6e 20 26 6d 65 6d 33 2e . return &mem3.
ab920 61 50 6f 6f 6c 5b 69 5d 3b 0d 0a 7d 0d 0a 0d 0a aPool[i];..}....
ab930 2f 2a 0d 0a 2a 2a 20 43 61 72 76 65 20 61 20 70 /*..** Carve a p
ab940 69 65 63 65 20 6f 66 66 20 6f 66 20 74 68 65 20 iece off of the
ab950 65 6e 64 20 6f 66 20 74 68 65 20 6d 65 6d 33 2e end of the mem3.
ab960 69 4d 61 73 74 65 72 20 66 72 65 65 20 63 68 75 iMaster free chu
ab970 6e 6b 2e 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 nk...** Return a
ab980 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
ab990 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 new allocation.
ab9a0 20 4f 72 2c 20 69 66 20 74 68 65 20 6d 61 73 74 Or, if the mast
ab9b0 65 72 20 63 68 75 6e 6b 0d 0a 2a 2a 20 69 73 20 er chunk..** is
ab9c0 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 not large enough
ab9d0 2c 20 72 65 74 75 72 6e 20 30 2e 0d 0a 2a 2f 0d , return 0...*/.
ab9e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 .static void *me
ab9f0 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72 28 msys3FromMaster(
aba00 75 33 32 20 6e 42 6c 6f 63 6b 29 7b 0d 0a 20 20 u32 nBlock){..
aba10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
aba20 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e mutex_held(mem3.
aba30 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 mutex) );.. ass
aba40 65 72 74 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 ert( mem3.szMast
aba50 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 3b 0d 0a 20 er>=nBlock );..
aba60 20 69 66 28 20 6e 42 6c 6f 63 6b 3e 3d 6d 65 6d if( nBlock>=mem
aba70 33 2e 73 7a 4d 61 73 74 65 72 2d 31 20 29 7b 0d 3.szMaster-1 ){.
aba80 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 . /* Use the
aba90 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 2a 2f entire master */
abaa0 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 .. void *p =
abab0 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 memsys3Checkout(
abac0 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2c 20 6d 65 mem3.iMaster, me
abad0 6d 33 2e 73 7a 4d 61 73 74 65 72 29 3b 0d 0a 20 m3.szMaster);..
abae0 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20 mem3.iMaster
abaf0 3d 20 30 3b 0d 0a 20 20 20 20 6d 65 6d 33 2e 73 = 0;.. mem3.s
abb00 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0d 0a 20 20 zMaster = 0;..
abb10 20 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65 72 20 mem3.mnMaster
abb20 3d 20 30 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e = 0;.. return
abb30 20 70 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 p;.. }else{..
abb40 20 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 /* Split the
abb50 6d 61 73 74 65 72 20 62 6c 6f 63 6b 2e 20 20 52 master block. R
abb60 65 74 75 72 6e 20 74 68 65 20 74 61 69 6c 2e 20 eturn the tail.
abb70 2a 2f 0d 0a 20 20 20 20 75 33 32 20 6e 65 77 69 */.. u32 newi
abb80 2c 20 78 3b 0d 0a 20 20 20 20 6e 65 77 69 20 3d , x;.. newi =
abb90 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20 2b 20 mem3.iMaster +
abba0 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 2d 20 mem3.szMaster -
abbb0 6e 42 6c 6f 63 6b 3b 0d 0a 20 20 20 20 61 73 73 nBlock;.. ass
abbc0 65 72 74 28 20 6e 65 77 69 20 3e 20 6d 65 6d 33 ert( newi > mem3
abbd0 2e 69 4d 61 73 74 65 72 2b 31 20 29 3b 0d 0a 20 .iMaster+1 );..
abbe0 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 mem3.aPool[me
abbf0 6d 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d 33 2e m3.iMaster+mem3.
abc00 73 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 szMaster-1].u.hd
abc10 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 6e 42 6c r.prevSize = nBl
abc20 6f 63 6b 3b 0d 0a 20 20 20 20 6d 65 6d 33 2e 61 ock;.. mem3.a
abc30 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 Pool[mem3.iMaste
abc40 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d r+mem3.szMaster-
abc50 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 1].u.hdr.size4x
abc60 7c 3d 20 32 3b 0d 0a 20 20 20 20 6d 65 6d 33 2e |= 2;.. mem3.
abc70 61 50 6f 6f 6c 5b 6e 65 77 69 2d 31 5d 2e 75 2e aPool[newi-1].u.
abc80 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6e 42 6c hdr.size4x = nBl
abc90 6f 63 6b 2a 34 20 2b 20 31 3b 0d 0a 20 20 20 20 ock*4 + 1;..
abca0 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 2d 3d mem3.szMaster -=
abcb0 20 6e 42 6c 6f 63 6b 3b 0d 0a 20 20 20 20 6d 65 nBlock;.. me
abcc0 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 77 69 2d 31 5d m3.aPool[newi-1]
abcd0 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 .u.hdr.prevSize
abce0 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3b = mem3.szMaster;
abcf0 0d 0a 20 20 20 20 78 20 3d 20 6d 65 6d 33 2e 61 .. x = mem3.a
abd00 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 Pool[mem3.iMaste
abd10 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 r-1].u.hdr.size4
abd20 78 20 26 20 32 3b 0d 0a 20 20 20 20 6d 65 6d 33 x & 2;.. mem3
abd30 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 .aPool[mem3.iMas
abd40 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a ter-1].u.hdr.siz
abd50 65 34 78 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 e4x = mem3.szMas
abd60 74 65 72 2a 34 20 7c 20 78 3b 0d 0a 20 20 20 20 ter*4 | x;..
abd70 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 if( mem3.szMaste
abd80 72 20 3c 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65 r < mem3.mnMaste
abd90 72 20 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 33 r ){.. mem3
abda0 2e 6d 6e 4d 61 73 74 65 72 20 3d 20 6d 65 6d 33 .mnMaster = mem3
abdb0 2e 73 7a 4d 61 73 74 65 72 3b 0d 0a 20 20 20 20 .szMaster;..
abdc0 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 }.. return (v
abdd0 6f 69 64 2a 29 26 6d 65 6d 33 2e 61 50 6f 6f 6c oid*)&mem3.aPool
abde0 5b 6e 65 77 69 5d 3b 0d 0a 20 20 7d 0d 0a 7d 0d [newi];.. }..}.
abdf0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 2a 70 52 6f 6f 74 .../*..** *pRoot
abe00 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 is the head of
abe10 61 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 63 a list of free c
abe20 68 75 6e 6b 73 20 6f 66 20 74 68 65 20 73 61 6d hunks of the sam
abe30 65 20 73 69 7a 65 0d 0a 2a 2a 20 6f 72 20 73 61 e size..** or sa
abe40 6d 65 20 73 69 7a 65 20 68 61 73 68 2e 20 20 49 me size hash. I
abe50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 2a n other words, *
abe60 70 52 6f 6f 74 20 69 73 20 61 6e 20 65 6e 74 72 pRoot is an entr
abe70 79 20 69 6e 20 65 69 74 68 65 72 0d 0a 2a 2a 20 y in either..**
abe80 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 5d 20 6f mem3.aiSmall[] o
abe90 72 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 5d 2e r mem3.aiHash[].
abea0 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..**..** This
abeb0 72 6f 75 74 69 6e 65 20 65 78 61 6d 69 6e 65 73 routine examines
abec0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 6f 6e 20 all entries on
abed0 74 68 65 20 67 69 76 65 6e 20 6c 69 73 74 20 61 the given list a
abee0 6e 64 20 74 72 69 65 73 0d 0a 2a 2a 20 74 6f 20 nd tries..** to
abef0 63 6f 61 6c 65 73 63 65 20 65 61 63 68 20 65 6e coalesce each en
abf00 74 72 69 65 73 20 77 69 74 68 20 61 64 6a 61 63 tries with adjac
abf10 65 6e 74 20 66 72 65 65 20 63 68 75 6e 6b 73 2e ent free chunks.
abf20 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 69 74 ..**..** If it
abf30 20 73 65 65 73 20 61 20 63 68 75 6e 6b 20 74 68 sees a chunk th
abf40 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 at is larger tha
abf50 6e 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2c 20 n mem3.iMaster,
abf60 69 74 20 72 65 70 6c 61 63 65 73 20 0d 0a 2a 2a it replaces ..**
abf70 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 65 6d the current mem
abf80 33 2e 69 4d 61 73 74 65 72 20 77 69 74 68 20 74 3.iMaster with t
abf90 68 65 20 6e 65 77 20 6c 61 72 67 65 72 20 63 68 he new larger ch
abfa0 75 6e 6b 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 unk. In order f
abfb0 6f 72 0d 0a 2a 2a 20 74 68 69 73 20 6d 65 6d 33 or..** this mem3
abfc0 2e 69 4d 61 73 74 65 72 20 72 65 70 6c 61 63 65 .iMaster replace
abfd0 6d 65 6e 74 20 74 6f 20 77 6f 72 6b 2c 20 74 68 ment to work, th
abfe0 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 6d e master chunk m
abff0 75 73 74 20 62 65 0d 0a 2a 2a 20 6c 69 6e 6b 65 ust be..** linke
ac000 64 20 69 6e 74 6f 20 74 68 65 20 68 61 73 68 20 d into the hash
ac010 74 61 62 6c 65 73 2e 20 20 54 68 61 74 20 69 73 tables. That is
ac020 20 6e 6f 74 20 74 68 65 20 6e 6f 72 6d 61 6c 20 not the normal
ac030 73 74 61 74 65 20 6f 66 0d 0a 2a 2a 20 61 66 66 state of..** aff
ac040 61 69 72 73 2c 20 6f 66 20 63 6f 75 72 73 65 2e airs, of course.
ac050 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f The calling ro
ac060 75 74 69 6e 65 20 6d 75 73 74 20 6c 69 6e 6b 20 utine must link
ac070 74 68 65 20 6d 61 73 74 65 72 0d 0a 2a 2a 20 63 the master..** c
ac080 68 75 6e 6b 20 62 65 66 6f 72 65 20 69 6e 76 6f hunk before invo
ac090 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e king this routin
ac0a0 65 2c 20 74 68 65 6e 20 6d 75 73 74 20 75 6e 6c e, then must unl
ac0b0 69 6e 6b 20 74 68 65 20 28 70 6f 73 73 69 62 6c ink the (possibl
ac0c0 79 0d 0a 2a 2a 20 63 68 61 6e 67 65 64 29 20 6d y..** changed) m
ac0d0 61 73 74 65 72 20 63 68 75 6e 6b 20 6f 6e 63 65 aster chunk once
ac0e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 this routine ha
ac0f0 73 20 66 69 6e 69 73 68 65 64 2e 0d 0a 2a 2f 0d s finished...*/.
ac100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d .static void mem
ac110 73 79 73 33 4d 65 72 67 65 28 75 33 32 20 2a 70 sys3Merge(u32 *p
ac120 52 6f 6f 74 29 7b 0d 0a 20 20 75 33 32 20 69 4e Root){.. u32 iN
ac130 65 78 74 2c 20 70 72 65 76 2c 20 73 69 7a 65 2c ext, prev, size,
ac140 20 69 2c 20 78 3b 0d 0a 0d 0a 20 20 61 73 73 65 i, x;.... asse
ac150 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
ac160 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 x_held(mem3.mute
ac170 78 29 20 29 3b 0d 0a 20 20 66 6f 72 28 69 3d 2a x) );.. for(i=*
ac180 70 52 6f 6f 74 3b 20 69 3e 30 3b 20 69 3d 69 4e pRoot; i>0; i=iN
ac190 65 78 74 29 7b 0d 0a 20 20 20 20 69 4e 65 78 74 ext){.. iNext
ac1a0 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d = mem3.aPool[i]
ac1b0 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0d 0a 20 .u.list.next;..
ac1c0 20 20 20 73 69 7a 65 20 3d 20 6d 65 6d 33 2e 61 size = mem3.a
ac1d0 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e Pool[i-1].u.hdr.
ac1e0 73 69 7a 65 34 78 3b 0d 0a 20 20 20 20 61 73 73 size4x;.. ass
ac1f0 65 72 74 28 20 28 73 69 7a 65 26 31 29 3d 3d 30 ert( (size&1)==0
ac200 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 28 73 69 );.. if( (si
ac210 7a 65 26 32 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 ze&2)==0 ){..
ac220 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b memsys3Unlink
ac230 46 72 6f 6d 4c 69 73 74 28 69 2c 20 70 52 6f 6f FromList(i, pRoo
ac240 74 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 t);.. asser
ac250 74 28 20 69 20 3e 20 6d 65 6d 33 2e 61 50 6f 6f t( i > mem3.aPoo
ac260 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 l[i-1].u.hdr.pre
ac270 76 53 69 7a 65 20 29 3b 0d 0a 20 20 20 20 20 20 vSize );..
ac280 70 72 65 76 20 3d 20 69 20 2d 20 6d 65 6d 33 2e prev = i - mem3.
ac290 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 aPool[i-1].u.hdr
ac2a0 2e 70 72 65 76 53 69 7a 65 3b 0d 0a 20 20 20 20 .prevSize;..
ac2b0 20 20 69 66 28 20 70 72 65 76 3d 3d 69 4e 65 78 if( prev==iNex
ac2c0 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 4e t ){.. iN
ac2d0 65 78 74 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c ext = mem3.aPool
ac2e0 5b 70 72 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 [prev].u.list.ne
ac2f0 78 74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 xt;.. }..
ac300 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e memsys3Unlin
ac310 6b 28 70 72 65 76 29 3b 0d 0a 20 20 20 20 20 20 k(prev);..
ac320 73 69 7a 65 20 3d 20 69 20 2b 20 73 69 7a 65 2f size = i + size/
ac330 34 20 2d 20 70 72 65 76 3b 0d 0a 20 20 20 20 20 4 - prev;..
ac340 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b x = mem3.aPool[
ac350 70 72 65 76 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 prev-1].u.hdr.si
ac360 7a 65 34 78 20 26 20 32 3b 0d 0a 20 20 20 20 20 ze4x & 2;..
ac370 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 mem3.aPool[prev
ac380 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 -1].u.hdr.size4x
ac390 20 3d 20 73 69 7a 65 2a 34 20 7c 20 78 3b 0d 0a = size*4 | x;..
ac3a0 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c mem3.aPool
ac3b0 5b 70 72 65 76 2b 73 69 7a 65 2d 31 5d 2e 75 2e [prev+size-1].u.
ac3c0 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 73 hdr.prevSize = s
ac3d0 69 7a 65 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 73 ize;.. mems
ac3e0 79 73 33 4c 69 6e 6b 28 70 72 65 76 29 3b 0d 0a ys3Link(prev);..
ac3f0 20 20 20 20 20 20 69 20 3d 20 70 72 65 76 3b 0d i = prev;.
ac400 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
ac410 20 20 20 73 69 7a 65 20 2f 3d 20 34 3b 0d 0a 20 size /= 4;..
ac420 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 73 69 }.. if( si
ac430 7a 65 3e 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 ze>mem3.szMaster
ac440 20 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 33 2e ){.. mem3.
ac450 69 4d 61 73 74 65 72 20 3d 20 69 3b 0d 0a 20 20 iMaster = i;..
ac460 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 mem3.szMaste
ac470 72 20 3d 20 73 69 7a 65 3b 0d 0a 20 20 20 20 7d r = size;.. }
ac480 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
ac490 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6c 6f 63 ** Return a bloc
ac4a0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 66 20 61 k of memory of a
ac4b0 74 20 6c 65 61 73 74 20 6e 42 79 74 65 73 20 69 t least nBytes i
ac4c0 6e 20 73 69 7a 65 2e 0d 0a 2a 2a 20 52 65 74 75 n size...** Retu
ac4d0 72 6e 20 4e 55 4c 4c 20 69 66 20 75 6e 61 62 6c rn NULL if unabl
ac4e0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 e...**..** This
ac4f0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 function assumes
ac500 20 74 68 61 74 20 74 68 65 20 6e 65 63 65 73 73 that the necess
ac510 61 72 79 20 6d 75 74 65 78 65 73 2c 20 69 66 20 ary mutexes, if
ac520 61 6e 79 2c 20 61 72 65 0d 0a 2a 2a 20 61 6c 72 any, are..** alr
ac530 65 61 64 79 20 68 65 6c 64 20 62 79 20 74 68 65 eady held by the
ac540 20 63 61 6c 6c 65 72 2e 20 48 65 6e 63 65 20 22 caller. Hence "
ac550 55 6e 73 61 66 65 22 2e 0d 0a 2a 2f 0d 0a 73 74 Unsafe"...*/..st
ac560 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 atic void *memsy
ac570 73 33 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28 69 s3MallocUnsafe(i
ac580 6e 74 20 6e 42 79 74 65 29 7b 0d 0a 20 20 75 33 nt nByte){.. u3
ac590 32 20 69 3b 0d 0a 20 20 75 33 32 20 6e 42 6c 6f 2 i;.. u32 nBlo
ac5a0 63 6b 3b 0d 0a 20 20 75 33 32 20 74 6f 46 72 65 ck;.. u32 toFre
ac5b0 65 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 e;.... assert(
ac5c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
ac5d0 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 ld(mem3.mutex) )
ac5e0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a ;.. assert( siz
ac5f0 65 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d eof(Mem3Block)==
ac600 38 20 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 8 );.. if( nByt
ac610 65 3c 3d 31 32 20 29 7b 0d 0a 20 20 20 20 6e 42 e<=12 ){.. nB
ac620 6c 6f 63 6b 20 3d 20 32 3b 0d 0a 20 20 7d 65 6c lock = 2;.. }el
ac630 73 65 7b 0d 0a 20 20 20 20 6e 42 6c 6f 63 6b 20 se{.. nBlock
ac640 3d 20 28 6e 42 79 74 65 20 2b 20 31 31 29 2f 38 = (nByte + 11)/8
ac650 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 ;.. }.. assert
ac660 28 20 6e 42 6c 6f 63 6b 3e 3d 32 20 29 3b 0d 0a ( nBlock>=2 );..
ac670 0d 0a 20 20 2f 2a 20 53 54 45 50 20 31 3a 0d 0a .. /* STEP 1:..
ac680 20 20 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e ** Look for an
ac690 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 63 6f entry of the co
ac6a0 72 72 65 63 74 20 73 69 7a 65 20 69 6e 20 65 69 rrect size in ei
ac6b0 74 68 65 72 20 74 68 65 20 73 6d 61 6c 6c 0d 0a ther the small..
ac6c0 20 20 2a 2a 20 63 68 75 6e 6b 20 74 61 62 6c 65 ** chunk table
ac6d0 20 6f 72 20 69 6e 20 74 68 65 20 6c 61 72 67 65 or in the large
ac6e0 20 63 68 75 6e 6b 20 68 61 73 68 20 74 61 62 6c chunk hash tabl
ac6f0 65 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 2a e. This is.. *
ac700 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6d 6f 73 * successful mos
ac710 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20 28 61 t of the time (a
ac720 62 6f 75 74 20 39 20 74 69 6d 65 73 20 6f 75 74 bout 9 times out
ac730 20 6f 66 20 31 30 29 2e 0d 0a 20 20 2a 2f 0d 0a of 10)... */..
ac740 20 20 69 66 28 20 6e 42 6c 6f 63 6b 20 3c 3d 20 if( nBlock <=
ac750 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0d 0a 20 20 20 MX_SMALL ){..
ac760 20 69 20 3d 20 6d 65 6d 33 2e 61 69 53 6d 61 6c i = mem3.aiSmal
ac770 6c 5b 6e 42 6c 6f 63 6b 2d 32 5d 3b 0d 0a 20 20 l[nBlock-2];..
ac780 20 20 69 66 28 20 69 3e 30 20 29 7b 0d 0a 20 20 if( i>0 ){..
ac790 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e memsys3Unlin
ac7a0 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 kFromList(i, &me
ac7b0 6d 33 2e 61 69 53 6d 61 6c 6c 5b 6e 42 6c 6f 63 m3.aiSmall[nBloc
ac7c0 6b 2d 32 5d 29 3b 0d 0a 20 20 20 20 20 20 72 65 k-2]);.. re
ac7d0 74 75 72 6e 20 6d 65 6d 73 79 73 33 43 68 65 63 turn memsys3Chec
ac7e0 6b 6f 75 74 28 69 2c 20 6e 42 6c 6f 63 6b 29 3b kout(i, nBlock);
ac7f0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 .. }.. }else
ac800 7b 0d 0a 20 20 20 20 69 6e 74 20 68 61 73 68 20 {.. int hash
ac810 3d 20 6e 42 6c 6f 63 6b 20 25 20 4e 5f 48 41 53 = nBlock % N_HAS
ac820 48 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 6d 65 H;.. for(i=me
ac830 6d 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 3b m3.aiHash[hash];
ac840 20 69 3e 30 3b 20 69 3d 6d 65 6d 33 2e 61 50 6f i>0; i=mem3.aPo
ac850 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 ol[i].u.list.nex
ac860 74 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 6d t){.. if( m
ac870 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 em3.aPool[i-1].u
ac880 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3d 3d 6e .hdr.size4x/4==n
ac890 42 6c 6f 63 6b 20 29 7b 0d 0a 20 20 20 20 20 20 Block ){..
ac8a0 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 memsys3UnlinkF
ac8b0 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33 romList(i, &mem3
ac8c0 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b 0d .aiHash[hash]);.
ac8d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
ac8e0 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 memsys3Checkout(
ac8f0 69 2c 20 6e 42 6c 6f 63 6b 29 3b 0d 0a 20 20 20 i, nBlock);..
ac900 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d }.. }.. }
ac910 0d 0a 0d 0a 20 20 2f 2a 20 53 54 45 50 20 32 3a .... /* STEP 2:
ac920 0d 0a 20 20 2a 2a 20 54 72 79 20 74 6f 20 73 61 .. ** Try to sa
ac930 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 tisfy the alloca
ac940 74 69 6f 6e 20 62 79 20 63 61 72 76 69 6e 67 20 tion by carving
ac950 61 20 70 69 65 63 65 20 6f 66 66 20 6f 66 20 74 a piece off of t
ac960 68 65 20 65 6e 64 0d 0a 20 20 2a 2a 20 6f 66 20 he end.. ** of
ac970 74 68 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b the master chunk
ac980 2e 20 20 54 68 69 73 20 73 74 65 70 20 75 73 75 . This step usu
ac990 61 6c 6c 79 20 77 6f 72 6b 73 20 69 66 20 73 74 ally works if st
ac9a0 65 70 20 31 20 66 61 69 6c 73 2e 0d 0a 20 20 2a ep 1 fails... *
ac9b0 2f 0d 0a 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a /.. if( mem3.sz
ac9c0 4d 61 73 74 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 Master>=nBlock )
ac9d0 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 65 {.. return me
ac9e0 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72 28 msys3FromMaster(
ac9f0 6e 42 6c 6f 63 6b 29 3b 0d 0a 20 20 7d 0d 0a 0d nBlock);.. }...
aca00 0a 0d 0a 20 20 2f 2a 20 53 54 45 50 20 33 3a 20 ... /* STEP 3:
aca10 20 0d 0a 20 20 2a 2a 20 4c 6f 6f 70 20 74 68 72 .. ** Loop thr
aca20 6f 75 67 68 20 74 68 65 20 65 6e 74 69 72 65 20 ough the entire
aca30 6d 65 6d 6f 72 79 20 70 6f 6f 6c 2e 20 20 43 6f memory pool. Co
aca40 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 alesce adjacent
aca50 66 72 65 65 0d 0a 20 20 2a 2a 20 63 68 75 6e 6b free.. ** chunk
aca60 73 2e 20 20 52 65 63 6f 6d 70 75 74 65 20 74 68 s. Recompute th
aca70 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 61 e master chunk a
aca80 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 66 72 s the largest fr
aca90 65 65 20 63 68 75 6e 6b 2e 0d 0a 20 20 2a 2a 20 ee chunk... **
acaa0 54 68 65 6e 20 74 72 79 20 61 67 61 69 6e 20 74 Then try again t
acab0 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c o satisfy the al
acac0 6c 6f 63 61 74 69 6f 6e 20 62 79 20 63 61 72 76 location by carv
acad0 69 6e 67 20 61 20 70 69 65 63 65 20 6f 66 66 0d ing a piece off.
acae0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 6e 64 . ** of the end
acaf0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 63 of the master c
acb00 68 75 6e 6b 2e 20 20 54 68 69 73 20 73 74 65 70 hunk. This step
acb10 20 68 61 70 70 65 6e 73 20 76 65 72 79 0d 0a 20 happens very..
acb20 20 2a 2a 20 72 61 72 65 6c 79 20 28 77 65 20 68 ** rarely (we h
acb30 6f 70 65 21 29 0d 0a 20 20 2a 2f 0d 0a 20 20 66 ope!).. */.. f
acb40 6f 72 28 74 6f 46 72 65 65 3d 6e 42 6c 6f 63 6b or(toFree=nBlock
acb50 2a 31 36 3b 20 74 6f 46 72 65 65 3c 28 6d 65 6d *16; toFree<(mem
acb60 33 2e 6e 50 6f 6f 6c 2a 31 36 29 3b 20 74 6f 46 3.nPool*16); toF
acb70 72 65 65 20 2a 3d 20 32 29 7b 0d 0a 20 20 20 20 ree *= 2){..
acb80 6d 65 6d 73 79 73 33 4f 75 74 4f 66 4d 65 6d 6f memsys3OutOfMemo
acb90 72 79 28 74 6f 46 72 65 65 29 3b 0d 0a 20 20 20 ry(toFree);..
acba0 20 69 66 28 20 6d 65 6d 33 2e 69 4d 61 73 74 65 if( mem3.iMaste
acbb0 72 20 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 73 r ){.. mems
acbc0 79 73 33 4c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 ys3Link(mem3.iMa
acbd0 73 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 6d 65 ster);.. me
acbe0 6d 33 2e 69 4d 61 73 74 65 72 20 3d 20 30 3b 0d m3.iMaster = 0;.
acbf0 0a 20 20 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 . mem3.szMa
acc00 73 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 7d ster = 0;.. }
acc10 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 .. for(i=0; i
acc20 3c 4e 5f 48 41 53 48 3b 20 69 2b 2b 29 7b 0d 0a <N_HASH; i++){..
acc30 20 20 20 20 20 20 6d 65 6d 73 79 73 33 4d 65 72 memsys3Mer
acc40 67 65 28 26 6d 65 6d 33 2e 61 69 48 61 73 68 5b ge(&mem3.aiHash[
acc50 69 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 i]);.. }..
acc60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 53 for(i=0; i<MX_S
acc70 4d 41 4c 4c 2d 31 3b 20 69 2b 2b 29 7b 0d 0a 20 MALL-1; i++){..
acc80 20 20 20 20 20 6d 65 6d 73 79 73 33 4d 65 72 67 memsys3Merg
acc90 65 28 26 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b e(&mem3.aiSmall[
acca0 69 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 i]);.. }..
accb0 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 if( mem3.szMast
accc0 65 72 20 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d er ){.. mem
accd0 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d 33 2e sys3Unlink(mem3.
acce0 69 4d 61 73 74 65 72 29 3b 0d 0a 20 20 20 20 20 iMaster);..
accf0 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 if( mem3.szMast
acd00 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 7b 0d 0a 20 er>=nBlock ){..
acd10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 65 return me
acd20 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72 28 msys3FromMaster(
acd30 6e 42 6c 6f 63 6b 29 3b 0d 0a 20 20 20 20 20 20 nBlock);..
acd40 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d }.. }.. }...
acd50 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 . /* If none of
acd60 20 74 68 65 20 61 62 6f 76 65 20 77 6f 72 6b 65 the above worke
acd70 64 2c 20 74 68 65 6e 20 77 65 20 66 61 69 6c 2e d, then we fail.
acd80 20 2a 2f 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b */.. return 0;
acd90 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 ..}..../*..** Fr
acda0 65 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e ee an outstandin
acdb0 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 g memory allocat
acdc0 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ion...**..** Thi
acdd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d s function assum
acde0 65 73 20 74 68 61 74 20 74 68 65 20 6e 65 63 65 es that the nece
acdf0 73 73 61 72 79 20 6d 75 74 65 78 65 73 2c 20 69 ssary mutexes, i
ace00 66 20 61 6e 79 2c 20 61 72 65 0d 0a 2a 2a 20 61 f any, are..** a
ace10 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 74 lready held by t
ace20 68 65 20 63 61 6c 6c 65 72 2e 20 48 65 6e 63 65 he caller. Hence
ace30 20 22 55 6e 73 61 66 65 22 2e 0d 0a 2a 2f 0d 0a "Unsafe"...*/..
ace40 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 static void mems
ace50 79 73 33 46 72 65 65 55 6e 73 61 66 65 28 76 6f ys3FreeUnsafe(vo
ace60 69 64 20 2a 70 4f 6c 64 29 7b 0d 0a 20 20 4d 65 id *pOld){.. Me
ace70 6d 33 42 6c 6f 63 6b 20 2a 70 20 3d 20 28 4d 65 m3Block *p = (Me
ace80 6d 33 42 6c 6f 63 6b 2a 29 70 4f 6c 64 3b 0d 0a m3Block*)pOld;..
ace90 20 20 69 6e 74 20 69 3b 0d 0a 20 20 75 33 32 20 int i;.. u32
acea0 73 69 7a 65 2c 20 78 3b 0d 0a 20 20 61 73 73 65 size, x;.. asse
aceb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
acec0 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 x_held(mem3.mute
aced0 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 x) );.. assert(
acee0 20 70 3e 6d 65 6d 33 2e 61 50 6f 6f 6c 20 26 26 p>mem3.aPool &&
acef0 20 70 3c 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d p<&mem3.aPool[m
acf00 65 6d 33 2e 6e 50 6f 6f 6c 5d 20 29 3b 0d 0a 20 em3.nPool] );..
acf10 20 69 20 3d 20 70 20 2d 20 6d 65 6d 33 2e 61 50 i = p - mem3.aP
acf20 6f 6f 6c 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ool;.. assert(
acf30 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d (mem3.aPool[i-1]
acf40 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 31 29 .u.hdr.size4x&1)
acf50 3d 3d 31 20 29 3b 0d 0a 20 20 73 69 7a 65 20 3d ==1 );.. size =
acf60 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d mem3.aPool[i-1]
acf70 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3b .u.hdr.size4x/4;
acf80 0d 0a 20 20 61 73 73 65 72 74 28 20 69 2b 73 69 .. assert( i+si
acf90 7a 65 3c 3d 6d 65 6d 33 2e 6e 50 6f 6f 6c 2b 31 ze<=mem3.nPool+1
acfa0 20 29 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f );.. mem3.aPoo
acfb0 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a l[i-1].u.hdr.siz
acfc0 65 34 78 20 26 3d 20 7e 31 3b 0d 0a 20 20 6d 65 e4x &= ~1;.. me
acfd0 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d m3.aPool[i+size-
acfe0 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 1].u.hdr.prevSiz
acff0 65 20 3d 20 73 69 7a 65 3b 0d 0a 20 20 6d 65 6d e = size;.. mem
ad000 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 3.aPool[i+size-1
ad010 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 ].u.hdr.size4x &
ad020 3d 20 7e 32 3b 0d 0a 20 20 6d 65 6d 73 79 73 33 = ~2;.. memsys3
ad030 4c 69 6e 6b 28 69 29 3b 0d 0a 0d 0a 20 20 2f 2a Link(i);.... /*
ad040 20 54 72 79 20 74 6f 20 65 78 70 61 6e 64 20 74 Try to expand t
ad050 68 65 20 6d 61 73 74 65 72 20 75 73 69 6e 67 20 he master using
ad060 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 the newly freed
ad070 63 68 75 6e 6b 20 2a 2f 0d 0a 20 20 69 66 28 20 chunk */.. if(
ad080 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20 29 7b 0d mem3.iMaster ){.
ad090 0a 20 20 20 20 77 68 69 6c 65 28 20 28 6d 65 6d . while( (mem
ad0a0 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 3.aPool[mem3.iMa
ad0b0 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 ster-1].u.hdr.si
ad0c0 7a 65 34 78 26 32 29 3d 3d 30 20 29 7b 0d 0a 20 ze4x&2)==0 ){..
ad0d0 20 20 20 20 20 73 69 7a 65 20 3d 20 6d 65 6d 33 size = mem3
ad0e0 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 .aPool[mem3.iMas
ad0f0 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 ter-1].u.hdr.pre
ad100 76 53 69 7a 65 3b 0d 0a 20 20 20 20 20 20 6d 65 vSize;.. me
ad110 6d 33 2e 69 4d 61 73 74 65 72 20 2d 3d 20 73 69 m3.iMaster -= si
ad120 7a 65 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 33 2e ze;.. mem3.
ad130 73 7a 4d 61 73 74 65 72 20 2b 3d 20 73 69 7a 65 szMaster += size
ad140 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33 ;.. memsys3
ad150 55 6e 6c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 73 Unlink(mem3.iMas
ad160 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 78 20 3d ter);.. x =
ad170 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 mem3.aPool[mem3
ad180 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 .iMaster-1].u.hd
ad190 72 2e 73 69 7a 65 34 78 20 26 20 32 3b 0d 0a 20 r.size4x & 2;..
ad1a0 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b mem3.aPool[
ad1b0 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e mem3.iMaster-1].
ad1c0 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6d u.hdr.size4x = m
ad1d0 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2a 34 20 7c em3.szMaster*4 |
ad1e0 20 78 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 33 2e x;.. mem3.
ad1f0 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 aPool[mem3.iMast
ad200 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 er+mem3.szMaster
ad210 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 -1].u.hdr.prevSi
ad220 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 ze = mem3.szMast
ad230 65 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 er;.. }..
ad240 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d x = mem3.aPool[m
ad250 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 em3.iMaster-1].u
ad260 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20 32 3b .hdr.size4x & 2;
ad270 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 6d 65 .. while( (me
ad280 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d m3.aPool[mem3.iM
ad290 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 aster+mem3.szMas
ad2a0 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a ter-1].u.hdr.siz
ad2b0 65 34 78 26 31 29 3d 3d 30 20 29 7b 0d 0a 20 20 e4x&1)==0 ){..
ad2c0 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e memsys3Unlin
ad2d0 6b 28 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d k(mem3.iMaster+m
ad2e0 65 6d 33 2e 73 7a 4d 61 73 74 65 72 29 3b 0d 0a em3.szMaster);..
ad2f0 20 20 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 mem3.szMas
ad300 74 65 72 20 2b 3d 20 6d 65 6d 33 2e 61 50 6f 6f ter += mem3.aPoo
ad310 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d l[mem3.iMaster+m
ad320 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e em3.szMaster-1].
ad330 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3b 0d u.hdr.size4x/4;.
ad340 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f . mem3.aPoo
ad350 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 l[mem3.iMaster-1
ad360 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 3d ].u.hdr.size4x =
ad370 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2a 34 mem3.szMaster*4
ad380 20 7c 20 78 3b 0d 0a 20 20 20 20 20 20 6d 65 6d | x;.. mem
ad390 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 3.aPool[mem3.iMa
ad3a0 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 ster+mem3.szMast
ad3b0 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 er-1].u.hdr.prev
ad3c0 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 Size = mem3.szMa
ad3d0 73 74 65 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ster;.. }..
ad3e0 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 }..}..../*..** R
ad3f0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f eturn the size o
ad400 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 f an outstanding
ad410 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 allocation, in
ad420 62 79 74 65 73 2e 20 20 54 68 65 0d 0a 2a 2a 20 bytes. The..**
ad430 73 69 7a 65 20 72 65 74 75 72 6e 65 64 20 6f 6d size returned om
ad440 69 74 73 20 74 68 65 20 38 2d 62 79 74 65 20 68 its the 8-byte h
ad450 65 61 64 65 72 20 6f 76 65 72 68 65 61 64 2e 20 eader overhead.
ad460 20 54 68 69 73 20 6f 6e 6c 79 0d 0a 2a 2a 20 77 This only..** w
ad470 6f 72 6b 73 20 66 6f 72 20 63 68 75 6e 6b 73 20 orks for chunks
ad480 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 that are current
ad490 6c 79 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 0d ly checked out..
ad4a0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
ad4b0 6d 65 6d 73 79 73 33 53 69 7a 65 28 76 6f 69 64 memsys3Size(void
ad4c0 20 2a 70 29 7b 0d 0a 20 20 4d 65 6d 33 42 6c 6f *p){.. Mem3Blo
ad4d0 63 6b 20 2a 70 42 6c 6f 63 6b 3b 0d 0a 20 20 69 ck *pBlock;.. i
ad4e0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e f( p==0 ) return
ad4f0 20 30 3b 0d 0a 20 20 70 42 6c 6f 63 6b 20 3d 20 0;.. pBlock =
ad500 28 4d 65 6d 33 42 6c 6f 63 6b 2a 29 70 3b 0d 0a (Mem3Block*)p;..
ad510 20 20 61 73 73 65 72 74 28 20 28 70 42 6c 6f 63 assert( (pBloc
ad520 6b 5b 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 k[-1].u.hdr.size
ad530 34 78 26 31 29 21 3d 30 20 29 3b 0d 0a 20 20 72 4x&1)!=0 );.. r
ad540 65 74 75 72 6e 20 28 70 42 6c 6f 63 6b 5b 2d 31 eturn (pBlock[-1
ad550 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 7e ].u.hdr.size4x&~
ad560 33 29 2a 32 20 2d 20 34 3b 0d 0a 7d 0d 0a 0d 0a 3)*2 - 4;..}....
ad570 2f 2a 0d 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 /*..** Round up
ad580 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 a request size t
ad590 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 o the next valid
ad5a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 allocation size
ad5b0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
ad5c0 74 20 6d 65 6d 73 79 73 33 52 6f 75 6e 64 75 70 t memsys3Roundup
ad5d0 28 69 6e 74 20 6e 29 7b 0d 0a 20 20 69 66 28 20 (int n){.. if(
ad5e0 6e 3c 3d 31 32 20 29 7b 0d 0a 20 20 20 20 72 65 n<=12 ){.. re
ad5f0 74 75 72 6e 20 31 32 3b 0d 0a 20 20 7d 65 6c 73 turn 12;.. }els
ad600 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 e{.. return (
ad610 28 6e 2b 31 31 29 26 7e 37 29 20 2d 20 34 3b 0d (n+11)&~7) - 4;.
ad620 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
ad630 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 * Allocate nByte
ad640 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f s of memory...*/
ad650 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d ..static void *m
ad660 65 6d 73 79 73 33 4d 61 6c 6c 6f 63 28 69 6e 74 emsys3Malloc(int
ad670 20 6e 42 79 74 65 73 29 7b 0d 0a 20 20 73 71 6c nBytes){.. sql
ad680 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 3b 0d 0a ite3_int64 *p;..
ad690 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 assert( nBytes
ad6a0 3e 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 2f >0 ); /
ad6b0 2a 20 6d 61 6c 6c 6f 63 2e 63 20 66 69 6c 74 65 * malloc.c filte
ad6c0 72 73 20 6f 75 74 20 30 20 62 79 74 65 20 72 65 rs out 0 byte re
ad6d0 71 75 65 73 74 73 20 2a 2f 0d 0a 20 20 6d 65 6d quests */.. mem
ad6e0 73 79 73 33 45 6e 74 65 72 28 29 3b 0d 0a 20 20 sys3Enter();..
ad6f0 70 20 3d 20 6d 65 6d 73 79 73 33 4d 61 6c 6c 6f p = memsys3Mallo
ad700 63 55 6e 73 61 66 65 28 6e 42 79 74 65 73 29 3b cUnsafe(nBytes);
ad710 0d 0a 20 20 6d 65 6d 73 79 73 33 4c 65 61 76 65 .. memsys3Leave
ad720 28 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 76 ();.. return (v
ad730 6f 69 64 2a 29 70 3b 20 0d 0a 7d 0d 0a 0d 0a 2f oid*)p; ..}..../
ad740 2a 0d 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 *..** Free memor
ad750 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 y...*/..static v
ad760 6f 69 64 20 6d 65 6d 73 79 73 33 46 72 65 65 28 oid memsys3Free(
ad770 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0d 0a void *pPrior){..
ad780 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 assert( pPrior
ad790 20 29 3b 0d 0a 20 20 6d 65 6d 73 79 73 33 45 6e );.. memsys3En
ad7a0 74 65 72 28 29 3b 0d 0a 20 20 6d 65 6d 73 79 73 ter();.. memsys
ad7b0 33 46 72 65 65 55 6e 73 61 66 65 28 70 50 72 69 3FreeUnsafe(pPri
ad7c0 6f 72 29 3b 0d 0a 20 20 6d 65 6d 73 79 73 33 4c or);.. memsys3L
ad7d0 65 61 76 65 28 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a eave();..}..../*
ad7e0 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 ..** Change the
ad7f0 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 size of an exist
ad800 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 ing memory alloc
ad810 61 74 69 6f 6e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ation..*/..stati
ad820 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33 52 c void *memsys3R
ad830 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 ealloc(void *pPr
ad840 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 ior, int nBytes)
ad850 7b 0d 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 0d 0a {.. int nOld;..
ad860 20 20 76 6f 69 64 20 2a 70 3b 0d 0a 20 20 69 66 void *p;.. if
ad870 28 20 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0d 0a ( pPrior==0 ){..
ad880 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 return sqlit
ad890 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 e3_malloc(nBytes
ad8a0 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6e );.. }.. if( n
ad8b0 42 79 74 65 73 3c 3d 30 20 29 7b 0d 0a 20 20 20 Bytes<=0 ){..
ad8c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 sqlite3_free(pP
ad8d0 72 69 6f 72 29 3b 0d 0a 20 20 20 20 72 65 74 75 rior);.. retu
ad8e0 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 6e 4f rn 0;.. }.. nO
ad8f0 6c 64 20 3d 20 6d 65 6d 73 79 73 33 53 69 7a 65 ld = memsys3Size
ad900 28 70 50 72 69 6f 72 29 3b 0d 0a 20 20 69 66 28 (pPrior);.. if(
ad910 20 6e 42 79 74 65 73 3c 3d 6e 4f 6c 64 20 26 26 nBytes<=nOld &&
ad920 20 6e 42 79 74 65 73 3e 3d 6e 4f 6c 64 2d 31 32 nBytes>=nOld-12
ad930 38 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 8 ){.. return
ad940 20 70 50 72 69 6f 72 3b 0d 0a 20 20 7d 0d 0a 20 pPrior;.. }..
ad950 20 6d 65 6d 73 79 73 33 45 6e 74 65 72 28 29 3b memsys3Enter();
ad960 0d 0a 20 20 70 20 3d 20 6d 65 6d 73 79 73 33 4d .. p = memsys3M
ad970 61 6c 6c 6f 63 55 6e 73 61 66 65 28 6e 42 79 74 allocUnsafe(nByt
ad980 65 73 29 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b es);.. if( p ){
ad990 0d 0a 20 20 20 20 69 66 28 20 6e 4f 6c 64 3c 6e .. if( nOld<n
ad9a0 42 79 74 65 73 20 29 7b 0d 0a 20 20 20 20 20 20 Bytes ){..
ad9b0 6d 65 6d 63 70 79 28 70 2c 20 70 50 72 69 6f 72 memcpy(p, pPrior
ad9c0 2c 20 6e 4f 6c 64 29 3b 0d 0a 20 20 20 20 7d 65 , nOld);.. }e
ad9d0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 lse{.. memc
ad9e0 70 79 28 70 2c 20 70 50 72 69 6f 72 2c 20 6e 42 py(p, pPrior, nB
ad9f0 79 74 65 73 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ytes);.. }..
ada00 20 20 20 6d 65 6d 73 79 73 33 46 72 65 65 55 6e memsys3FreeUn
ada10 73 61 66 65 28 70 50 72 69 6f 72 29 3b 0d 0a 20 safe(pPrior);..
ada20 20 7d 0d 0a 20 20 6d 65 6d 73 79 73 33 4c 65 61 }.. memsys3Lea
ada30 76 65 28 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 ve();.. return
ada40 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 p;..}..../*..**
ada50 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 Initialize this
ada60 6d 6f 64 75 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 module...*/..sta
ada70 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 33 49 tic int memsys3I
ada80 6e 69 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 nit(void *NotUse
ada90 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 d){.. UNUSED_PA
adaa0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 RAMETER(NotUsed)
adab0 3b 0d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 ;.. if( !sqlite
adac0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 3GlobalConfig.pH
adad0 65 61 70 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 eap ){.. retu
adae0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b rn SQLITE_ERROR;
adaf0 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 53 74 .. }.... /* St
adb00 6f 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f ore a pointer to
adb10 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 6c 6f 63 the memory bloc
adb20 6b 20 69 6e 20 67 6c 6f 62 61 6c 20 73 74 72 75 k in global stru
adb30 63 74 75 72 65 20 6d 65 6d 33 2e 20 2a 2f 0d 0a cture mem3. */..
adb40 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 assert( sizeof
adb50 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38 20 29 (Mem3Block)==8 )
adb60 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 20 ;.. mem3.aPool
adb70 3d 20 28 4d 65 6d 33 42 6c 6f 63 6b 20 2a 29 73 = (Mem3Block *)s
adb80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
adb90 69 67 2e 70 48 65 61 70 3b 0d 0a 20 20 6d 65 6d ig.pHeap;.. mem
adba0 33 2e 6e 50 6f 6f 6c 20 3d 20 28 73 71 6c 69 74 3.nPool = (sqlit
adbb0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e e3GlobalConfig.n
adbc0 48 65 61 70 20 2f 20 73 69 7a 65 6f 66 28 4d 65 Heap / sizeof(Me
adbd0 6d 33 42 6c 6f 63 6b 29 29 20 2d 20 32 3b 0d 0a m3Block)) - 2;..
adbe0 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a .. /* Initializ
adbf0 65 20 74 68 65 20 6d 61 73 74 65 72 20 62 6c 6f e the master blo
adc00 63 6b 2e 20 2a 2f 0d 0a 20 20 6d 65 6d 33 2e 73 ck. */.. mem3.s
adc10 7a 4d 61 73 74 65 72 20 3d 20 6d 65 6d 33 2e 6e zMaster = mem3.n
adc20 50 6f 6f 6c 3b 0d 0a 20 20 6d 65 6d 33 2e 6d 6e Pool;.. mem3.mn
adc30 4d 61 73 74 65 72 20 3d 20 6d 65 6d 33 2e 73 7a Master = mem3.sz
adc40 4d 61 73 74 65 72 3b 0d 0a 20 20 6d 65 6d 33 2e Master;.. mem3.
adc50 69 4d 61 73 74 65 72 20 3d 20 31 3b 0d 0a 20 20 iMaster = 1;..
adc60 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 30 5d 2e 75 2e mem3.aPool[0].u.
adc70 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 28 6d 65 hdr.size4x = (me
adc80 6d 33 2e 73 7a 4d 61 73 74 65 72 3c 3c 32 29 20 m3.szMaster<<2)
adc90 2b 20 32 3b 0d 0a 20 20 6d 65 6d 33 2e 61 50 6f + 2;.. mem3.aPo
adca0 6f 6c 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d 2e 75 ol[mem3.nPool].u
adcb0 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 .hdr.prevSize =
adcc0 6d 65 6d 33 2e 6e 50 6f 6f 6c 3b 0d 0a 20 20 6d mem3.nPool;.. m
adcd0 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 6e em3.aPool[mem3.n
adce0 50 6f 6f 6c 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 Pool].u.hdr.size
adcf0 34 78 20 3d 20 31 3b 0d 0a 0d 0a 20 20 72 65 74 4x = 1;.... ret
add00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
add10 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 69 6e }..../*..** Dein
add20 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f itialize this mo
add30 64 75 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 dule...*/..stati
add40 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 53 68 c void memsys3Sh
add50 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 4e 6f 74 utdown(void *Not
add60 55 73 65 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 Used){.. UNUSED
add70 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 _PARAMETER(NotUs
add80 65 64 29 3b 0d 0a 20 20 6d 65 6d 33 2e 6d 75 74 ed);.. mem3.mut
add90 65 78 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 ex = 0;.. retur
adda0 6e 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d n;..}......../*.
addb0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c .** Open the fil
addc0 65 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 e indicated and
addd0 77 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 write a log of a
adde0 6c 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 ll unfreed memor
addf0 79 20 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f y ..** allocatio
ade00 6e 73 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 ns into that log
ade10 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
ade20 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
ade30 65 33 4d 65 6d 73 79 73 33 44 75 6d 70 28 63 6f e3Memsys3Dump(co
ade40 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
ade50 61 6d 65 29 7b 0d 0a 23 69 66 64 65 66 20 53 51 ame){..#ifdef SQ
ade60 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 46 49 LITE_DEBUG.. FI
ade70 4c 45 20 2a 6f 75 74 3b 0d 0a 20 20 75 33 32 20 LE *out;.. u32
ade80 69 2c 20 6a 3b 0d 0a 20 20 75 33 32 20 73 69 7a i, j;.. u32 siz
ade90 65 3b 0d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e e;.. if( zFilen
adea0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e ame==0 || zFilen
adeb0 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0d 0a 20 20 ame[0]==0 ){..
adec0 20 20 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0d out = stdout;.
aded0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6f . }else{.. o
adee0 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 ut = fopen(zFile
adef0 6e 61 6d 65 2c 20 22 77 22 29 3b 0d 0a 20 20 20 name, "w");..
adf00 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0d 0a if( out==0 ){..
adf10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 fprintf(st
adf20 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c 65 derr, "** Unable
adf30 20 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 to output memor
adf40 79 20 64 65 62 75 67 20 6f 75 74 70 75 74 20 6c y debug output l
adf50 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0d 0a 20 og: %s **\n",..
adf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
adf70 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b zFilename);
adf80 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d .. return;.
adf90 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 6d . }.. }.. m
adfa0 65 6d 73 79 73 33 45 6e 74 65 72 28 29 3b 0d 0a emsys3Enter();..
adfb0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 fprintf(out, "
adfc0 43 48 55 4e 4b 53 3a 5c 6e 22 29 3b 0d 0a 20 20 CHUNKS:\n");..
adfd0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d 65 6d 33 for(i=1; i<=mem3
adfe0 2e 6e 50 6f 6f 6c 3b 20 69 2b 3d 73 69 7a 65 2f .nPool; i+=size/
adff0 34 29 7b 0d 0a 20 20 20 20 73 69 7a 65 20 3d 20 4){.. size =
ae000 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e mem3.aPool[i-1].
ae010 75 2e 68 64 72 2e 73 69 7a 65 34 78 3b 0d 0a 20 u.hdr.size4x;..
ae020 20 20 20 69 66 28 20 73 69 7a 65 2f 34 3c 3d 31 if( size/4<=1
ae030 20 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e ){.. fprin
ae040 74 66 28 6f 75 74 2c 20 22 25 70 20 73 69 7a 65 tf(out, "%p size
ae050 20 65 72 72 6f 72 5c 6e 22 2c 20 26 6d 65 6d 33 error\n", &mem3
ae060 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0d 0a 20 20 20 .aPool[i]);..
ae070 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0d assert( 0 );.
ae080 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 . break;..
ae090 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 28 73 }.. if( (s
ae0a0 69 7a 65 26 31 29 3d 3d 30 20 26 26 20 6d 65 6d ize&1)==0 && mem
ae0b0 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2f 34 3.aPool[i+size/4
ae0c0 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 -1].u.hdr.prevSi
ae0d0 7a 65 21 3d 73 69 7a 65 2f 34 20 29 7b 0d 0a 20 ze!=size/4 ){..
ae0e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 fprintf(out
ae0f0 2c 20 22 25 70 20 74 61 69 6c 20 73 69 7a 65 20 , "%p tail size
ae100 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 5c 6e does not match\n
ae110 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 ", &mem3.aPool[i
ae120 5d 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 ]);.. asser
ae130 74 28 20 30 20 29 3b 0d 0a 20 20 20 20 20 20 62 t( 0 );.. b
ae140 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 reak;.. }..
ae150 20 20 69 66 28 20 28 28 6d 65 6d 33 2e 61 50 6f if( ((mem3.aPo
ae160 6f 6c 5b 69 2b 73 69 7a 65 2f 34 2d 31 5d 2e 75 ol[i+size/4-1].u
ae170 2e 68 64 72 2e 73 69 7a 65 34 78 26 32 29 3e 3e .hdr.size4x&2)>>
ae180 31 29 21 3d 28 73 69 7a 65 26 31 29 20 29 7b 0d 1)!=(size&1) ){.
ae190 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f . fprintf(o
ae1a0 75 74 2c 20 22 25 70 20 74 61 69 6c 20 63 68 65 ut, "%p tail che
ae1b0 63 6b 6f 75 74 20 62 69 74 20 69 73 20 69 6e 63 ckout bit is inc
ae1c0 6f 72 72 65 63 74 5c 6e 22 2c 20 26 6d 65 6d 33 orrect\n", &mem3
ae1d0 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0d 0a 20 20 20 .aPool[i]);..
ae1e0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0d assert( 0 );.
ae1f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 . break;..
ae200 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 73 69 }.. if( si
ae210 7a 65 26 31 20 29 7b 0d 0a 20 20 20 20 20 20 66 ze&1 ){.. f
ae220 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 printf(out, "%p
ae230 25 36 64 20 62 79 74 65 73 20 63 68 65 63 6b 65 %6d bytes checke
ae240 64 20 6f 75 74 5c 6e 22 2c 20 26 6d 65 6d 33 2e d out\n", &mem3.
ae250 61 50 6f 6f 6c 5b 69 5d 2c 20 28 73 69 7a 65 2f aPool[i], (size/
ae260 34 29 2a 38 2d 38 29 3b 0d 0a 20 20 20 20 7d 65 4)*8-8);.. }e
ae270 6c 73 65 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 lse{.. fpri
ae280 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 25 36 64 ntf(out, "%p %6d
ae290 20 62 79 74 65 73 20 66 72 65 65 25 73 5c 6e 22 bytes free%s\n"
ae2a0 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d , &mem3.aPool[i]
ae2b0 2c 20 28 73 69 7a 65 2f 34 29 2a 38 2d 38 2c 0d , (size/4)*8-8,.
ae2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
ae2d0 20 20 20 69 3d 3d 6d 65 6d 33 2e 69 4d 61 73 74 i==mem3.iMast
ae2e0 65 72 20 3f 20 22 20 2a 2a 6d 61 73 74 65 72 2a er ? " **master*
ae2f0 2a 22 20 3a 20 22 22 29 3b 0d 0a 20 20 20 20 7d *" : "");.. }
ae300 0d 0a 20 20 7d 0d 0a 20 20 66 6f 72 28 69 3d 30 .. }.. for(i=0
ae310 3b 20 69 3c 4d 58 5f 53 4d 41 4c 4c 2d 31 3b 20 ; i<MX_SMALL-1;
ae320 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 6d i++){.. if( m
ae330 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 69 5d 3d 3d em3.aiSmall[i]==
ae340 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 0 ) continue;..
ae350 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
ae360 22 73 6d 61 6c 6c 28 25 32 64 29 3a 22 2c 20 69 "small(%2d):", i
ae370 29 3b 0d 0a 20 20 20 20 66 6f 72 28 6a 20 3d 20 );.. for(j =
ae380 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 69 5d 3b mem3.aiSmall[i];
ae390 20 6a 3e 30 3b 20 6a 3d 6d 65 6d 33 2e 61 50 6f j>0; j=mem3.aPo
ae3a0 6f 6c 5b 6a 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 ol[j].u.list.nex
ae3b0 74 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e t){.. fprin
ae3c0 74 66 28 6f 75 74 2c 20 22 20 25 70 28 25 64 29 tf(out, " %p(%d)
ae3d0 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a ", &mem3.aPool[j
ae3e0 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ],..
ae3f0 20 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 2d (mem3.aPool[j-
ae400 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 1].u.hdr.size4x/
ae410 34 29 2a 38 2d 38 29 3b 0d 0a 20 20 20 20 7d 0d 4)*8-8);.. }.
ae420 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 . fprintf(out
ae430 2c 20 22 5c 6e 22 29 3b 20 0d 0a 20 20 7d 0d 0a , "\n"); .. }..
ae440 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 for(i=0; i<N_H
ae450 41 53 48 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 ASH; i++){..
ae460 69 66 28 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b if( mem3.aiHash[
ae470 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 i]==0 ) continue
ae480 3b 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f ;.. fprintf(o
ae490 75 74 2c 20 22 68 61 73 68 28 25 32 64 29 3a 22 ut, "hash(%2d):"
ae4a0 2c 20 69 29 3b 0d 0a 20 20 20 20 66 6f 72 28 6a , i);.. for(j
ae4b0 20 3d 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 69 = mem3.aiHash[i
ae4c0 5d 3b 20 6a 3e 30 3b 20 6a 3d 6d 65 6d 33 2e 61 ]; j>0; j=mem3.a
ae4d0 50 6f 6f 6c 5b 6a 5d 2e 75 2e 6c 69 73 74 2e 6e Pool[j].u.list.n
ae4e0 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 ext){.. fpr
ae4f0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 70 28 25 intf(out, " %p(%
ae500 64 29 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c d)", &mem3.aPool
ae510 5b 6a 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 [j],..
ae520 20 20 20 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b (mem3.aPool[
ae530 6a 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 j-1].u.hdr.size4
ae540 78 2f 34 29 2a 38 2d 38 29 3b 0d 0a 20 20 20 20 x/4)*8-8);..
ae550 7d 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f }.. fprintf(o
ae560 75 74 2c 20 22 5c 6e 22 29 3b 20 0d 0a 20 20 7d ut, "\n"); .. }
ae570 0d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c .. fprintf(out,
ae580 20 22 6d 61 73 74 65 72 3d 25 64 5c 6e 22 2c 20 "master=%d\n",
ae590 6d 65 6d 33 2e 69 4d 61 73 74 65 72 29 3b 0d 0a mem3.iMaster);..
ae5a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 fprintf(out, "
ae5b0 6e 6f 77 55 73 65 64 3d 25 64 5c 6e 22 2c 20 6d nowUsed=%d\n", m
ae5c0 65 6d 33 2e 6e 50 6f 6f 6c 2a 38 20 2d 20 6d 65 em3.nPool*8 - me
ae5d0 6d 33 2e 73 7a 4d 61 73 74 65 72 2a 38 29 3b 0d m3.szMaster*8);.
ae5e0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 . fprintf(out,
ae5f0 22 6d 78 55 73 65 64 3d 25 64 5c 6e 22 2c 20 6d "mxUsed=%d\n", m
ae600 65 6d 33 2e 6e 50 6f 6f 6c 2a 38 20 2d 20 6d 65 em3.nPool*8 - me
ae610 6d 33 2e 6d 6e 4d 61 73 74 65 72 2a 38 29 3b 0d m3.mnMaster*8);.
ae620 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
ae630 5f 6c 65 61 76 65 28 6d 65 6d 33 2e 6d 75 74 65 _leave(mem3.mute
ae640 78 29 3b 0d 0a 20 20 69 66 28 20 6f 75 74 3d 3d x);.. if( out==
ae650 73 74 64 6f 75 74 20 29 7b 0d 0a 20 20 20 20 66 stdout ){.. f
ae660 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0d 0a flush(stdout);..
ae670 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 66 63 }else{.. fc
ae680 6c 6f 73 65 28 6f 75 74 29 3b 0d 0a 20 20 7d 0d lose(out);.. }.
ae690 0a 23 65 6c 73 65 0d 0a 20 20 55 4e 55 53 45 44 .#else.. UNUSED
ae6a0 5f 50 41 52 41 4d 45 54 45 52 28 7a 46 69 6c 65 _PARAMETER(zFile
ae6b0 6e 61 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a name);..#endif..
ae6c0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 }..../*..** This
ae6d0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 routine is the
ae6e0 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 only routine in
ae6f0 74 68 69 73 20 66 69 6c 65 20 77 69 74 68 20 65 this file with e
ae700 78 74 65 72 6e 61 6c 20 0d 0a 2a 2a 20 6c 69 6e xternal ..** lin
ae710 6b 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 6f kage...**..** Po
ae720 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c pulate the low-l
ae730 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f evel memory allo
ae740 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 cation function
ae750 70 6f 69 6e 74 65 72 73 20 69 6e 0d 0a 2a 2a 20 pointers in..**
ae760 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
ae770 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 fig.m with point
ae780 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 ers to the routi
ae790 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 nes in this file
ae7a0 2e 20 54 68 65 0d 0a 2a 2a 20 61 72 67 75 6d 65 . The..** argume
ae7b0 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 nts specify the
ae7c0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 block of memory
ae7d0 74 6f 20 6d 61 6e 61 67 65 2e 0d 0a 2a 2a 0d 0a to manage...**..
ae7e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
ae7f0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 is only called b
ae800 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 y sqlite3_config
ae810 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 (), and therefor
ae820 65 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 e..** is not req
ae830 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 uired to be thre
ae840 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f adsafe (it is no
ae850 74 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f t)...*/..SQLITE_
ae860 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 73 71 PRIVATE const sq
ae870 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 lite3_mem_method
ae880 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 s *sqlite3MemGet
ae890 4d 65 6d 73 79 73 33 28 76 6f 69 64 29 7b 0d 0a Memsys3(void){..
ae8a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 static const s
ae8b0 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f qlite3_mem_metho
ae8c0 64 73 20 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f 64 ds mempoolMethod
ae8d0 73 20 3d 20 7b 0d 0a 20 20 20 20 20 6d 65 6d 73 s = {.. mems
ae8e0 79 73 33 4d 61 6c 6c 6f 63 2c 0d 0a 20 20 20 20 ys3Malloc,..
ae8f0 20 6d 65 6d 73 79 73 33 46 72 65 65 2c 0d 0a 20 memsys3Free,..
ae900 20 20 20 20 6d 65 6d 73 79 73 33 52 65 61 6c 6c memsys3Reall
ae910 6f 63 2c 0d 0a 20 20 20 20 20 6d 65 6d 73 79 73 oc,.. memsys
ae920 33 53 69 7a 65 2c 0d 0a 20 20 20 20 20 6d 65 6d 3Size,.. mem
ae930 73 79 73 33 52 6f 75 6e 64 75 70 2c 0d 0a 20 20 sys3Roundup,..
ae940 20 20 20 6d 65 6d 73 79 73 33 49 6e 69 74 2c 0d memsys3Init,.
ae950 0a 20 20 20 20 20 6d 65 6d 73 79 73 33 53 68 75 . memsys3Shu
ae960 74 64 6f 77 6e 2c 0d 0a 20 20 20 20 20 30 0d 0a tdown,.. 0..
ae970 20 20 7d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 26 };.. return &
ae980 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f 64 73 3b 0d mempoolMethods;.
ae990 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 .}....#endif /*
ae9a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 SQLITE_ENABLE_ME
ae9b0 4d 53 59 53 33 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a MSYS3 */..../***
ae9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 *********** End
ae9d0 6f 66 20 6d 65 6d 33 2e 63 20 2a 2a 2a 2a 2a 2a of mem3.c ******
ae9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ae9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aea00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a **********/../**
aea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 ************ Beg
aea20 69 6e 20 66 69 6c 65 20 6d 65 6d 35 2e 63 20 2a in file mem5.c *
aea30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aea40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aea50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a ***********/../*
aea60 0d 0a 2a 2a 20 32 30 30 37 20 4f 63 74 6f 62 65 ..** 2007 Octobe
aea70 72 20 31 34 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 r 14..**..** The
aea80 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
aea90 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
aeaa0 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
aeab0 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a In place of..*
aeac0 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
aead0 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
aeae0 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 sing:..**..**
aeaf0 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
aeb00 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a and not evil...
aeb10 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 ** May you fi
aeb20 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
aeb30 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
aeb40 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d forgive others..
aeb50 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 .** May you s
aeb60 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 hare freely, nev
aeb70 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 er taking more t
aeb80 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a han you give...*
aeb90 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
aeba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aebb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aebc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
aebd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
aebe0 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 This file conta
aebf0 69 6e 73 20 74 68 65 20 43 20 66 75 6e 63 74 69 ins the C functi
aec00 6f 6e 73 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 ons that impleme
aec10 6e 74 20 61 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 nt a memory..**
aec20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 allocation subsy
aec30 73 74 65 6d 20 66 6f 72 20 75 73 65 20 62 79 20 stem for use by
aec40 53 51 4c 69 74 65 2e 20 0d 0a 2a 2a 0d 0a 2a 2a SQLite. ..**..**
aec50 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 This version of
aec60 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f the memory allo
aec70 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d cation subsystem
aec80 20 6f 6d 69 74 73 20 61 6c 6c 0d 0a 2a 2a 20 75 omits all..** u
aec90 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2e 20 se of malloc().
aeca0 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 The application
aecb0 67 69 76 65 73 20 53 51 4c 69 74 65 20 61 20 62 gives SQLite a b
aecc0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 0d 0a lock of memory..
aecd0 2a 2a 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e ** before callin
aece0 67 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 g sqlite3_initia
aecf0 6c 69 7a 65 28 29 20 66 72 6f 6d 20 77 68 69 63 lize() from whic
aed00 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0d 0a 2a h allocations..*
aed10 2a 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 72 * are made and r
aed20 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 eturned by the x
aed30 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 78 52 65 Malloc() and xRe
aed40 61 6c 6c 6f 63 28 29 20 0d 0a 2a 2a 20 69 6d 70 alloc() ..** imp
aed50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 20 4f 6e lementations. On
aed60 63 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 ce sqlite3_initi
aed70 61 6c 69 7a 65 28 29 20 68 61 73 20 62 65 65 6e alize() has been
aed80 20 63 61 6c 6c 65 64 2c 0d 0a 2a 2a 20 74 68 65 called,..** the
aed90 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 amount of memor
aeda0 79 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 53 y available to S
aedb0 51 4c 69 74 65 20 69 73 20 66 69 78 65 64 20 61 QLite is fixed a
aedc0 6e 64 20 63 61 6e 6e 6f 74 0d 0a 2a 2a 20 62 65 nd cannot..** be
aedd0 20 63 68 61 6e 67 65 64 2e 0d 0a 2a 2a 0d 0a 2a changed...**..*
aede0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f * This version o
aedf0 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c f the memory all
aee00 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 ocation subsyste
aee10 6d 20 69 73 20 69 6e 63 6c 75 64 65 64 0d 0a 2a m is included..*
aee20 2a 20 69 6e 20 74 68 65 20 62 75 69 6c 64 20 6f * in the build o
aee30 6e 6c 79 20 69 66 20 53 51 4c 49 54 45 5f 45 4e nly if SQLITE_EN
aee40 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 ABLE_MEMSYS5 is
aee50 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a defined...**..**
aee60 20 54 68 69 73 20 6d 65 6d 6f 72 79 20 61 6c 6c This memory all
aee70 6f 63 61 74 6f 72 20 75 73 65 73 20 74 68 65 20 ocator uses the
aee80 66 6f 6c 6c 6f 77 69 6e 67 20 61 6c 67 6f 72 69 following algori
aee90 74 68 6d 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 31 thm:..**..** 1
aeea0 2e 20 20 41 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c . All memory al
aeeb0 6c 6f 63 61 74 69 6f 6e 73 20 73 69 7a 65 73 20 locations sizes
aeec0 61 72 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 are rounded up t
aeed0 6f 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0d o a power of 2..
aeee0 0a 2a 2a 0d 0a 2a 2a 20 20 20 32 2e 20 20 49 66 .**..** 2. If
aeef0 20 74 77 6f 20 61 64 6a 61 63 65 6e 74 20 66 72 two adjacent fr
aef00 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 74 68 ee blocks are th
aef10 65 20 68 61 6c 76 65 73 20 6f 66 20 61 20 6c 61 e halves of a la
aef20 72 67 65 72 20 62 6c 6f 63 6b 2c 0d 0a 2a 2a 20 rger block,..**
aef30 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 74 then the t
aef40 77 6f 20 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f wo blocks are co
aef50 61 6c 65 73 65 64 20 69 6e 74 6f 20 74 68 65 20 alesed into the
aef60 73 69 6e 67 6c 65 20 6c 61 72 67 65 72 20 62 6c single larger bl
aef70 6f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 33 ock...**..** 3
aef80 2e 20 20 4e 65 77 20 6d 65 6d 6f 72 79 20 69 73 . New memory is
aef90 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 allocated from
aefa0 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 the first availa
aefb0 62 6c 65 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0d ble free block..
aefc0 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 61 6c 67 .**..** This alg
aefd0 6f 72 69 74 68 6d 20 69 73 20 64 65 73 63 72 69 orithm is descri
aefe0 62 65 64 20 69 6e 3a 20 4a 2e 20 4d 2e 20 52 6f bed in: J. M. Ro
aeff0 62 73 6f 6e 2e 20 22 42 6f 75 6e 64 73 20 66 6f bson. "Bounds fo
af000 72 20 53 6f 6d 65 20 46 75 6e 63 74 69 6f 6e 73 r Some Functions
af010 0d 0a 2a 2a 20 43 6f 6e 63 65 72 6e 69 6e 67 20 ..** Concerning
af020 44 79 6e 61 6d 69 63 20 53 74 6f 72 61 67 65 20 Dynamic Storage
af030 41 6c 6c 6f 63 61 74 69 6f 6e 22 2e 20 4a 6f 75 Allocation". Jou
af040 72 6e 61 6c 20 6f 66 20 74 68 65 20 41 73 73 6f rnal of the Asso
af050 63 69 61 74 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 ciation for..**
af060 43 6f 6d 70 75 74 69 6e 67 20 4d 61 63 68 69 6e Computing Machin
af070 65 72 79 2c 20 56 6f 6c 75 6d 65 20 32 31 2c 20 ery, Volume 21,
af080 4e 75 6d 62 65 72 20 38 2c 20 4a 75 6c 79 20 31 Number 8, July 1
af090 39 37 34 2c 20 70 61 67 65 73 20 34 39 31 2d 34 974, pages 491-4
af0a0 39 39 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 4c 65 74 99...** ..** Let
af0b0 20 6e 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f n be the size o
af0c0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 6c f the largest al
af0d0 6c 6f 63 61 74 69 6f 6e 20 64 69 76 69 64 65 64 location divided
af0e0 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0d by the minimum.
af0f0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 .** allocation s
af100 69 7a 65 20 28 61 66 74 65 72 20 72 6f 75 6e 64 ize (after round
af110 69 6e 67 20 61 6c 6c 20 73 69 7a 65 73 20 75 70 ing all sizes up
af120 20 74 6f 20 61 20 70 6f 77 65 72 20 6f 66 20 32 to a power of 2
af130 2e 29 20 20 4c 65 74 20 4d 0d 0a 2a 2a 20 62 65 .) Let M..** be
af140 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f the maximum amo
af150 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 65 76 unt of memory ev
af160 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 er outstanding a
af170 74 20 6f 6e 65 20 74 69 6d 65 2e 20 20 4c 65 74 t one time. Let
af180 0d 0a 2a 2a 20 4e 20 62 65 20 74 68 65 20 74 6f ..** N be the to
af190 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 tal amount of me
af1a0 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 mory available f
af1b0 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 or allocation.
af1c0 52 6f 62 73 6f 6e 0d 0a 2a 2a 20 70 72 6f 76 65 Robson..** prove
af1d0 64 20 74 68 61 74 20 74 68 69 73 20 6d 65 6d 6f d that this memo
af1e0 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 77 69 6c ry allocator wil
af1f0 6c 20 6e 65 76 65 72 20 62 72 65 61 6b 64 6f 77 l never breakdow
af200 6e 20 64 75 65 20 74 6f 20 0d 0a 2a 2a 20 66 72 n due to ..** fr
af210 61 67 6d 65 6e 74 61 74 69 6f 6e 20 61 73 20 6c agmentation as l
af220 6f 6e 67 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f ong as the follo
af230 77 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 wing constraint
af240 68 6f 6c 64 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 holds:..**..**
af250 20 20 20 20 4e 20 3e 3d 20 20 4d 2a 28 31 20 2b N >= M*(1 +
af260 20 6c 6f 67 32 28 6e 29 2f 32 29 20 2d 20 6e 20 log2(n)/2) - n
af270 2b 20 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 + 1..**..** The
af280 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 29 sqlite3_status()
af290 20 6c 6f 67 69 63 20 74 72 61 63 6b 73 20 74 68 logic tracks th
af2a0 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 73 e maximum values
af2b0 20 6f 66 20 6e 20 61 6e 64 20 4d 20 73 6f 0d 0a of n and M so..
af2c0 2a 2a 20 74 68 61 74 20 61 6e 20 61 70 70 6c 69 ** that an appli
af2d0 63 61 74 69 6f 6e 20 63 61 6e 2c 20 61 74 20 61 cation can, at a
af2e0 6e 79 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 ny time, verify
af2f0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e this constraint.
af300 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ..*/..../*..** T
af310 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 his version of t
af320 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 he memory alloca
af330 74 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 tor is used only
af340 20 77 68 65 6e 20 0d 0a 2a 2a 20 53 51 4c 49 54 when ..** SQLIT
af350 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 E_ENABLE_MEMSYS5
af360 20 69 73 20 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f is defined...*/
af370 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
af380 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0d 0a ENABLE_MEMSYS5..
af390 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 6d 69 6e 69 6d ../*..** A minim
af3a0 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 um allocation is
af3b0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
af3c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 the following st
af3d0 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 20 4c 61 72 ructure...** Lar
af3e0 67 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 ger allocations
af3f0 61 72 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 are an array of
af400 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 these structures
af410 20 77 68 65 72 65 20 74 68 65 0d 0a 2a 2a 20 73 where the..** s
af420 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 ize of the array
af430 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 is a power of 2
af440 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 69 ...**..** The si
af450 7a 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 ze of this objec
af460 74 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 t must be a powe
af470 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 r of two. That
af480 66 61 63 74 20 69 73 0d 0a 2a 2a 20 76 65 72 69 fact is..** veri
af490 66 69 65 64 20 69 6e 20 6d 65 6d 73 79 73 35 49 fied in memsys5I
af4a0 6e 69 74 28 29 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 nit()...*/..type
af4b0 64 65 66 20 73 74 72 75 63 74 20 4d 65 6d 35 4c def struct Mem5L
af4c0 69 6e 6b 20 4d 65 6d 35 4c 69 6e 6b 3b 0d 0a 73 ink Mem5Link;..s
af4d0 74 72 75 63 74 20 4d 65 6d 35 4c 69 6e 6b 20 7b truct Mem5Link {
af4e0 0d 0a 20 20 69 6e 74 20 6e 65 78 74 3b 20 20 20 .. int next;
af4f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 /* Index of
af500 6e 65 78 74 20 66 72 65 65 20 63 68 75 6e 6b 20 next free chunk
af510 2a 2f 0d 0a 20 20 69 6e 74 20 70 72 65 76 3b 20 */.. int prev;
af520 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f /* Index o
af530 66 20 70 72 65 76 69 6f 75 73 20 66 72 65 65 20 f previous free
af540 63 68 75 6e 6b 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a chunk */..};....
af550 2f 2a 0d 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 /*..** Maximum s
af560 69 7a 65 20 6f 66 20 61 6e 79 20 61 6c 6c 6f 63 ize of any alloc
af570 61 74 69 6f 6e 20 69 73 20 28 28 31 3c 3c 4c 4f ation is ((1<<LO
af580 47 4d 41 58 29 2a 6d 65 6d 35 2e 73 7a 41 74 6f GMAX)*mem5.szAto
af590 6d 29 2e 20 53 69 6e 63 65 0d 0a 2a 2a 20 6d 65 m). Since..** me
af5a0 6d 35 2e 73 7a 41 74 6f 6d 20 69 73 20 61 6c 77 m5.szAtom is alw
af5b0 61 79 73 20 61 74 20 6c 65 61 73 74 20 38 20 61 ays at least 8 a
af5c0 6e 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 nd 32-bit intege
af5d0 72 73 20 61 72 65 20 75 73 65 64 2c 0d 0a 2a 2a rs are used,..**
af5e0 20 69 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 it is not actua
af5f0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 lly possible to
af600 72 65 61 63 68 20 74 68 69 73 20 6c 69 6d 69 74 reach this limit
af610 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4c ...*/..#define L
af620 4f 47 4d 41 58 20 33 30 0d 0a 0d 0a 2f 2a 0d 0a OGMAX 30..../*..
af630 2a 2a 20 4d 61 73 6b 73 20 75 73 65 64 20 66 6f ** Masks used fo
af640 72 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 5d 20 65 r mem5.aCtrl[] e
af650 6c 65 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 23 64 lements...*/..#d
af660 65 66 69 6e 65 20 43 54 52 4c 5f 4c 4f 47 53 49 efine CTRL_LOGSI
af670 5a 45 20 20 30 78 31 66 20 20 20 20 2f 2a 20 4c ZE 0x1f /* L
af680 6f 67 32 20 53 69 7a 65 20 6f 66 20 74 68 69 73 og2 Size of this
af690 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 23 64 65 66 69 block */..#defi
af6a0 6e 65 20 43 54 52 4c 5f 46 52 45 45 20 20 20 20 ne CTRL_FREE
af6b0 20 30 78 32 30 20 20 20 20 2f 2a 20 54 72 75 65 0x20 /* True
af6c0 20 69 66 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 if not checked
af6d0 6f 75 74 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a out */..../*..**
af6e0 20 41 6c 6c 20 6f 66 20 74 68 65 20 73 74 61 74 All of the stat
af6f0 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 ic variables use
af700 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 d by this module
af710 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 0d 0a are collected..
af720 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 ** into a single
af730 20 73 74 72 75 63 74 75 72 65 20 6e 61 6d 65 64 structure named
af740 20 22 6d 65 6d 35 22 2e 20 20 54 68 69 73 20 69 "mem5". This i
af750 73 20 74 6f 20 6b 65 65 70 20 74 68 65 0d 0a 2a s to keep the..*
af760 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c * static variabl
af770 65 73 20 6f 72 67 61 6e 69 7a 65 64 20 61 6e 64 es organized and
af780 20 74 6f 20 72 65 64 75 63 65 20 6e 61 6d 65 73 to reduce names
af790 70 61 63 65 20 70 6f 6c 6c 75 74 69 6f 6e 0d 0a pace pollution..
af7a0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 ** when this mod
af7b0 75 6c 65 20 69 73 20 63 6f 6d 62 69 6e 65 64 20 ule is combined
af7c0 77 69 74 68 20 6f 74 68 65 72 20 69 6e 20 74 68 with other in th
af7d0 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0d e amalgamation..
af7e0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 53 51 4c 49 .*/..static SQLI
af7f0 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65 TE_WSD struct Me
af800 6d 35 47 6c 6f 62 61 6c 20 7b 0d 0a 20 20 2f 2a m5Global {.. /*
af810 0d 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 61 76 .. ** Memory av
af820 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f ailable for allo
af830 63 61 74 69 6f 6e 0d 0a 20 20 2a 2f 0d 0a 20 20 cation.. */..
af840 69 6e 74 20 73 7a 41 74 6f 6d 3b 20 20 20 20 20 int szAtom;
af850 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 70 6f 73 /* Smallest pos
af860 73 69 62 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e sible allocation
af870 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 in bytes */..
af880 69 6e 74 20 6e 42 6c 6f 63 6b 3b 20 20 20 20 20 int nBlock;
af890 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 7a /* Number of sz
af8a0 41 74 6f 6d 20 73 69 7a 65 64 20 62 6c 6f 63 6b Atom sized block
af8b0 73 20 69 6e 20 7a 50 6f 6f 6c 20 2a 2f 0d 0a 20 s in zPool */..
af8c0 20 75 38 20 2a 7a 50 6f 6f 6c 3b 20 20 20 20 20 u8 *zPool;
af8d0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 /* Memory avai
af8e0 6c 61 62 6c 65 20 74 6f 20 62 65 20 61 6c 6c 6f lable to be allo
af8f0 63 61 74 65 64 20 2a 2f 0d 0a 20 20 0d 0a 20 20 cated */.. ..
af900 2f 2a 0d 0a 20 20 2a 2a 20 4d 75 74 65 78 20 74 /*.. ** Mutex t
af910 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 o control access
af920 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 to the memory a
af930 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 llocation subsys
af940 74 65 6d 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 tem... */.. sq
af950 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 lite3_mutex *mut
af960 65 78 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a ex;.... /*.. *
af970 2a 20 50 65 72 66 6f 72 6d 61 6e 63 65 20 73 74 * Performance st
af980 61 74 69 73 74 69 63 73 0d 0a 20 20 2a 2f 0d 0a atistics.. */..
af990 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20 20 u64 nAlloc;
af9a0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e /* Total n
af9b0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 umber of calls t
af9c0 6f 20 6d 61 6c 6c 6f 63 20 2a 2f 0d 0a 20 20 75 o malloc */.. u
af9d0 36 34 20 74 6f 74 61 6c 41 6c 6c 6f 63 3b 20 20 64 totalAlloc;
af9e0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6f 66 20 61 /* Total of a
af9f0 6c 6c 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73 20 ll malloc calls
afa00 2d 20 69 6e 63 6c 75 64 65 73 20 69 6e 74 65 72 - includes inter
afa10 6e 61 6c 20 66 72 61 67 20 2a 2f 0d 0a 20 20 75 nal frag */.. u
afa20 36 34 20 74 6f 74 61 6c 45 78 63 65 73 73 3b 20 64 totalExcess;
afa30 20 20 20 2f 2a 20 54 6f 74 61 6c 20 69 6e 74 65 /* Total inte
afa40 72 6e 61 6c 20 66 72 61 67 6d 65 6e 74 61 74 69 rnal fragmentati
afa50 6f 6e 20 2a 2f 0d 0a 20 20 75 33 32 20 63 75 72 on */.. u32 cur
afa60 72 65 6e 74 4f 75 74 3b 20 20 20 20 20 2f 2a 20 rentOut; /*
afa70 43 75 72 72 65 6e 74 20 63 68 65 63 6b 6f 75 74 Current checkout
afa80 2c 20 69 6e 63 6c 75 64 69 6e 67 20 69 6e 74 65 , including inte
afa90 72 6e 61 6c 20 66 72 61 67 6d 65 6e 74 61 74 69 rnal fragmentati
afaa0 6f 6e 20 2a 2f 0d 0a 20 20 75 33 32 20 63 75 72 on */.. u32 cur
afab0 72 65 6e 74 43 6f 75 6e 74 3b 20 20 20 2f 2a 20 rentCount; /*
afac0 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f Current number o
afad0 66 20 64 69 73 74 69 6e 63 74 20 63 68 65 63 6b f distinct check
afae0 6f 75 74 73 20 2a 2f 0d 0a 20 20 75 33 32 20 6d outs */.. u32 m
afaf0 61 78 4f 75 74 3b 20 20 20 20 20 20 20 20 20 2f axOut; /
afb00 2a 20 4d 61 78 69 6d 75 6d 20 69 6e 73 74 61 6e * Maximum instan
afb10 74 61 6e 65 6f 75 73 20 63 75 72 72 65 6e 74 4f taneous currentO
afb20 75 74 20 2a 2f 0d 0a 20 20 75 33 32 20 6d 61 78 ut */.. u32 max
afb30 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 2f 2a 20 Count; /*
afb40 4d 61 78 69 6d 75 6d 20 69 6e 73 74 61 6e 74 61 Maximum instanta
afb50 6e 65 6f 75 73 20 63 75 72 72 65 6e 74 43 6f 75 neous currentCou
afb60 6e 74 20 2a 2f 0d 0a 20 20 75 33 32 20 6d 61 78 nt */.. u32 max
afb70 52 65 71 75 65 73 74 3b 20 20 20 20 20 2f 2a 20 Request; /*
afb80 4c 61 72 67 65 73 74 20 61 6c 6c 6f 63 61 74 69 Largest allocati
afb90 6f 6e 20 28 65 78 63 6c 75 73 69 76 65 20 6f 66 on (exclusive of
afba0 20 69 6e 74 65 72 6e 61 6c 20 66 72 61 67 29 20 internal frag)
afbb0 2a 2f 0d 0a 20 20 0d 0a 20 20 2f 2a 0d 0a 20 20 */.. .. /*..
afbc0 2a 2a 20 4c 69 73 74 73 20 6f 66 20 66 72 65 65 ** Lists of free
afbd0 20 62 6c 6f 63 6b 73 2e 20 20 61 69 46 72 65 65 blocks. aiFree
afbe0 6c 69 73 74 5b 30 5d 20 69 73 20 61 20 6c 69 73 list[0] is a lis
afbf0 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 t of free blocks
afc00 20 6f 66 0d 0a 20 20 2a 2a 20 73 69 7a 65 20 6d of.. ** size m
afc10 65 6d 35 2e 73 7a 41 74 6f 6d 2e 20 20 61 69 46 em5.szAtom. aiF
afc20 72 65 65 6c 69 73 74 5b 31 5d 20 68 6f 6c 64 73 reelist[1] holds
afc30 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 blocks of size
afc40 73 7a 41 74 6f 6d 2a 32 2e 0d 0a 20 20 2a 2a 20 szAtom*2... **
afc50 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0d 0a 20 and so forth...
afc60 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 69 46 72 65 */.. int aiFre
afc70 65 6c 69 73 74 5b 4c 4f 47 4d 41 58 2b 31 5d 3b elist[LOGMAX+1];
afc80 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 53 .... /*.. ** S
afc90 70 61 63 65 20 66 6f 72 20 74 72 61 63 6b 69 6e pace for trackin
afca0 67 20 77 68 69 63 68 20 62 6c 6f 63 6b 73 20 61 g which blocks a
afcb0 72 65 20 63 68 65 63 6b 65 64 20 6f 75 74 20 61 re checked out a
afcc0 6e 64 20 74 68 65 20 73 69 7a 65 0d 0a 20 20 2a nd the size.. *
afcd0 2a 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 2e * of each block.
afce0 20 20 4f 6e 65 20 62 79 74 65 20 70 65 72 20 62 One byte per b
afcf0 6c 6f 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 75 lock... */.. u
afd00 38 20 2a 61 43 74 72 6c 3b 0d 0a 0d 0a 7d 20 6d 8 *aCtrl;....} m
afd10 65 6d 35 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 em5;..../*..** A
afd20 63 63 65 73 73 20 74 68 65 20 73 74 61 74 69 63 ccess the static
afd30 20 76 61 72 69 61 62 6c 65 20 74 68 72 6f 75 67 variable throug
afd40 68 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 53 51 h a macro for SQ
afd50 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0d 0a 2a LITE_OMIT_WSD..*
afd60 2f 0d 0a 23 64 65 66 69 6e 65 20 6d 65 6d 35 20 /..#define mem5
afd70 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 4d 65 GLOBAL(struct Me
afd80 6d 35 47 6c 6f 62 61 6c 2c 20 6d 65 6d 35 29 0d m5Global, mem5).
afd90 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 73 73 75 6d 69 .../*..** Assumi
afda0 6e 67 20 6d 65 6d 35 2e 7a 50 6f 6f 6c 20 69 73 ng mem5.zPool is
afdb0 20 64 69 76 69 64 65 64 20 75 70 20 69 6e 74 6f divided up into
afdc0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4d 65 6d an array of Mem
afdd0 35 4c 69 6e 6b 0d 0a 2a 2a 20 73 74 72 75 63 74 5Link..** struct
afde0 75 72 65 73 2c 20 72 65 74 75 72 6e 20 61 20 70 ures, return a p
afdf0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 64 ointer to the id
afe00 78 2d 74 68 20 73 75 63 68 20 6c 69 6b 2e 0d 0a x-th such lik...
afe10 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 4d 35 */..#define MEM5
afe20 4c 49 4e 4b 28 69 64 78 29 20 28 28 4d 65 6d 35 LINK(idx) ((Mem5
afe30 4c 69 6e 6b 20 2a 29 28 26 6d 65 6d 35 2e 7a 50 Link *)(&mem5.zP
afe40 6f 6f 6c 5b 28 69 64 78 29 2a 6d 65 6d 35 2e 73 ool[(idx)*mem5.s
afe50 7a 41 74 6f 6d 5d 29 29 0d 0a 0d 0a 2f 2a 0d 0a zAtom]))..../*..
afe60 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 ** Unlink the ch
afe70 75 6e 6b 20 61 74 20 6d 65 6d 35 2e 61 50 6f 6f unk at mem5.aPoo
afe80 6c 5b 69 5d 20 66 72 6f 6d 20 6c 69 73 74 20 69 l[i] from list i
afe90 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a t is currently..
afea0 2a 2a 20 6f 6e 2e 20 20 49 74 20 73 68 6f 75 6c ** on. It shoul
afeb0 64 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 6d 65 d be found on me
afec0 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c m5.aiFreelist[iL
afed0 6f 67 73 69 7a 65 5d 2e 0d 0a 2a 2f 0d 0a 73 74 ogsize]...*/..st
afee0 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 atic void memsys
afef0 35 55 6e 6c 69 6e 6b 28 69 6e 74 20 69 2c 20 69 5Unlink(int i, i
aff00 6e 74 20 69 4c 6f 67 73 69 7a 65 29 7b 0d 0a 20 nt iLogsize){..
aff10 20 69 6e 74 20 6e 65 78 74 2c 20 70 72 65 76 3b int next, prev;
aff20 0d 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 .. assert( i>=0
aff30 20 26 26 20 69 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 && i<mem5.nBloc
aff40 6b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 k );.. assert(
aff50 69 4c 6f 67 73 69 7a 65 3e 3d 30 20 26 26 20 69 iLogsize>=0 && i
aff60 4c 6f 67 73 69 7a 65 3c 3d 4c 4f 47 4d 41 58 20 Logsize<=LOGMAX
aff70 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 6d );.. assert( (m
aff80 65 6d 35 2e 61 43 74 72 6c 5b 69 5d 20 26 20 43 em5.aCtrl[i] & C
aff90 54 52 4c 5f 4c 4f 47 53 49 5a 45 29 3d 3d 69 4c TRL_LOGSIZE)==iL
affa0 6f 67 73 69 7a 65 20 29 3b 0d 0a 0d 0a 20 20 6e ogsize );.... n
affb0 65 78 74 20 3d 20 4d 45 4d 35 4c 49 4e 4b 28 69 ext = MEM5LINK(i
affc0 29 2d 3e 6e 65 78 74 3b 0d 0a 20 20 70 72 65 76 )->next;.. prev
affd0 20 3d 20 4d 45 4d 35 4c 49 4e 4b 28 69 29 2d 3e = MEM5LINK(i)->
affe0 70 72 65 76 3b 0d 0a 20 20 69 66 28 20 70 72 65 prev;.. if( pre
afff0 76 3c 30 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 35 v<0 ){.. mem5
b0000 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f 67 .aiFreelist[iLog
b0010 73 69 7a 65 5d 20 3d 20 6e 65 78 74 3b 0d 0a 20 size] = next;..
b0020 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 4d 45 4d }else{.. MEM
b0030 35 4c 49 4e 4b 28 70 72 65 76 29 2d 3e 6e 65 78 5LINK(prev)->nex
b0040 74 20 3d 20 6e 65 78 74 3b 0d 0a 20 20 7d 0d 0a t = next;.. }..
b0050 20 20 69 66 28 20 6e 65 78 74 3e 3d 30 20 29 7b if( next>=0 ){
b0060 0d 0a 20 20 20 20 4d 45 4d 35 4c 49 4e 4b 28 6e .. MEM5LINK(n
b0070 65 78 74 29 2d 3e 70 72 65 76 20 3d 20 70 72 65 ext)->prev = pre
b0080 76 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a v;.. }..}..../*
b0090 0d 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 63 68 ..** Link the ch
b00a0 75 6e 6b 20 61 74 20 6d 65 6d 35 2e 61 50 6f 6f unk at mem5.aPoo
b00b0 6c 5b 69 5d 20 73 6f 20 74 68 61 74 20 69 73 20 l[i] so that is
b00c0 6f 6e 20 74 68 65 20 69 4c 6f 67 73 69 7a 65 0d on the iLogsize.
b00d0 0a 2a 2a 20 66 72 65 65 20 6c 69 73 74 2e 0d 0a .** free list...
b00e0 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
b00f0 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 69 6e 74 20 memsys5Link(int
b0100 69 2c 20 69 6e 74 20 69 4c 6f 67 73 69 7a 65 29 i, int iLogsize)
b0110 7b 0d 0a 20 20 69 6e 74 20 78 3b 0d 0a 20 20 61 {.. int x;.. a
b0120 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d ssert( sqlite3_m
b0130 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 35 2e 6d utex_held(mem5.m
b0140 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 utex) );.. asse
b0150 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6d 65 rt( i>=0 && i<me
b0160 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0d 0a 20 20 m5.nBlock );..
b0170 61 73 73 65 72 74 28 20 69 4c 6f 67 73 69 7a 65 assert( iLogsize
b0180 3e 3d 30 20 26 26 20 69 4c 6f 67 73 69 7a 65 3c >=0 && iLogsize<
b0190 3d 4c 4f 47 4d 41 58 20 29 3b 0d 0a 20 20 61 73 =LOGMAX );.. as
b01a0 73 65 72 74 28 20 28 6d 65 6d 35 2e 61 43 74 72 sert( (mem5.aCtr
b01b0 6c 5b 69 5d 20 26 20 43 54 52 4c 5f 4c 4f 47 53 l[i] & CTRL_LOGS
b01c0 49 5a 45 29 3d 3d 69 4c 6f 67 73 69 7a 65 20 29 IZE)==iLogsize )
b01d0 3b 0d 0a 0d 0a 20 20 78 20 3d 20 4d 45 4d 35 4c ;.... x = MEM5L
b01e0 49 4e 4b 28 69 29 2d 3e 6e 65 78 74 20 3d 20 6d INK(i)->next = m
b01f0 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 em5.aiFreelist[i
b0200 4c 6f 67 73 69 7a 65 5d 3b 0d 0a 20 20 4d 45 4d Logsize];.. MEM
b0210 35 4c 49 4e 4b 28 69 29 2d 3e 70 72 65 76 20 3d 5LINK(i)->prev =
b0220 20 2d 31 3b 0d 0a 20 20 69 66 28 20 78 3e 3d 30 -1;.. if( x>=0
b0230 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 ){.. assert(
b0240 20 78 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 x<mem5.nBlock )
b0250 3b 0d 0a 20 20 20 20 4d 45 4d 35 4c 49 4e 4b 28 ;.. MEM5LINK(
b0260 78 29 2d 3e 70 72 65 76 20 3d 20 69 3b 0d 0a 20 x)->prev = i;..
b0270 20 7d 0d 0a 20 20 6d 65 6d 35 2e 61 69 46 72 65 }.. mem5.aiFre
b0280 65 6c 69 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 20 elist[iLogsize]
b0290 3d 20 69 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a = i;..}..../*..*
b02a0 2a 20 49 66 20 74 68 65 20 53 54 41 54 49 43 5f * If the STATIC_
b02b0 4d 45 4d 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 MEM mutex is not
b02c0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f already held, o
b02d0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 20 54 68 btain it now. Th
b02e0 65 20 6d 75 74 65 78 0d 0a 2a 2a 20 77 69 6c 6c e mutex..** will
b02f0 20 61 6c 72 65 61 64 79 20 62 65 20 68 65 6c 64 already be held
b0300 20 28 6f 62 74 61 69 6e 65 64 20 62 79 20 63 6f (obtained by co
b0310 64 65 20 69 6e 20 6d 61 6c 6c 6f 63 2e 63 29 20 de in malloc.c)
b0320 69 66 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c if..** sqlite3Gl
b0330 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 53 obalConfig.bMemS
b0340 74 61 74 20 69 73 20 74 72 75 65 2e 0d 0a 2a 2f tat is true...*/
b0350 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 ..static void me
b0360 6d 73 79 73 35 45 6e 74 65 72 28 76 6f 69 64 29 msys5Enter(void)
b0370 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 {.. sqlite3_mut
b0380 65 78 5f 65 6e 74 65 72 28 6d 65 6d 35 2e 6d 75 ex_enter(mem5.mu
b0390 74 65 78 29 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 tex);..}..static
b03a0 20 76 6f 69 64 20 6d 65 6d 73 79 73 35 4c 65 61 void memsys5Lea
b03b0 76 65 28 76 6f 69 64 29 7b 0d 0a 20 20 73 71 6c ve(void){.. sql
b03c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 ite3_mutex_leave
b03d0 28 6d 65 6d 35 2e 6d 75 74 65 78 29 3b 0d 0a 7d (mem5.mutex);..}
b03e0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 ..../*..** Retur
b03f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e n the size of an
b0400 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c outstanding all
b0410 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 ocation, in byte
b0420 73 2e 20 20 54 68 65 0d 0a 2a 2a 20 73 69 7a 65 s. The..** size
b0430 20 72 65 74 75 72 6e 65 64 20 6f 6d 69 74 73 20 returned omits
b0440 74 68 65 20 38 2d 62 79 74 65 20 68 65 61 64 65 the 8-byte heade
b0450 72 20 6f 76 65 72 68 65 61 64 2e 20 20 54 68 69 r overhead. Thi
b0460 73 20 6f 6e 6c 79 0d 0a 2a 2a 20 77 6f 72 6b 73 s only..** works
b0470 20 66 6f 72 20 63 68 75 6e 6b 73 20 74 68 61 74 for chunks that
b0480 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 63 are currently c
b0490 68 65 63 6b 65 64 20 6f 75 74 2e 0d 0a 2a 2f 0d hecked out...*/.
b04a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 .static int mems
b04b0 79 73 35 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 ys5Size(void *p)
b04c0 7b 0d 0a 20 20 69 6e 74 20 69 53 69 7a 65 20 3d {.. int iSize =
b04d0 20 30 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0;.. if( p ){.
b04e0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 28 28 75 . int i = ((u
b04f0 38 20 2a 29 70 2d 6d 65 6d 35 2e 7a 50 6f 6f 6c 8 *)p-mem5.zPool
b0500 29 2f 6d 65 6d 35 2e 73 7a 41 74 6f 6d 3b 0d 0a )/mem5.szAtom;..
b0510 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 assert( i>=0
b0520 20 26 26 20 69 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 && i<mem5.nBloc
b0530 6b 20 29 3b 0d 0a 20 20 20 20 69 53 69 7a 65 20 k );.. iSize
b0540 3d 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 2a 20 = mem5.szAtom *
b0550 28 31 20 3c 3c 20 28 6d 65 6d 35 2e 61 43 74 72 (1 << (mem5.aCtr
b0560 6c 5b 69 5d 26 43 54 52 4c 5f 4c 4f 47 53 49 5a l[i]&CTRL_LOGSIZ
b0570 45 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 E));.. }.. ret
b0580 75 72 6e 20 69 53 69 7a 65 3b 0d 0a 7d 0d 0a 0d urn iSize;..}...
b0590 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68 65 ./*..** Find the
b05a0 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f 6e 20 first entry on
b05b0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 4c 6f the freelist iLo
b05c0 67 73 69 7a 65 2e 20 20 55 6e 6c 69 6e 6b 20 74 gsize. Unlink t
b05d0 68 61 74 0d 0a 2a 2a 20 65 6e 74 72 79 20 61 6e hat..** entry an
b05e0 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 d return its ind
b05f0 65 78 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ex. ..*/..static
b0600 20 69 6e 74 20 6d 65 6d 73 79 73 35 55 6e 6c 69 int memsys5Unli
b0610 6e 6b 46 69 72 73 74 28 69 6e 74 20 69 4c 6f 67 nkFirst(int iLog
b0620 73 69 7a 65 29 7b 0d 0a 20 20 69 6e 74 20 69 3b size){.. int i;
b0630 0d 0a 20 20 69 6e 74 20 69 46 69 72 73 74 3b 0d .. int iFirst;.
b0640 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 69 4c 6f ... assert( iLo
b0650 67 73 69 7a 65 3e 3d 30 20 26 26 20 69 4c 6f 67 gsize>=0 && iLog
b0660 73 69 7a 65 3c 3d 4c 4f 47 4d 41 58 20 29 3b 0d size<=LOGMAX );.
b0670 0a 20 20 69 20 3d 20 69 46 69 72 73 74 20 3d 20 . i = iFirst =
b0680 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b mem5.aiFreelist[
b0690 69 4c 6f 67 73 69 7a 65 5d 3b 0d 0a 20 20 61 73 iLogsize];.. as
b06a0 73 65 72 74 28 20 69 46 69 72 73 74 3e 3d 30 20 sert( iFirst>=0
b06b0 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 );.. while( i>0
b06c0 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 69 3c 69 ){.. if( i<i
b06d0 46 69 72 73 74 20 29 20 69 46 69 72 73 74 20 3d First ) iFirst =
b06e0 20 69 3b 0d 0a 20 20 20 20 69 20 3d 20 4d 45 4d i;.. i = MEM
b06f0 35 4c 49 4e 4b 28 69 29 2d 3e 6e 65 78 74 3b 0d 5LINK(i)->next;.
b0700 0a 20 20 7d 0d 0a 20 20 6d 65 6d 73 79 73 35 55 . }.. memsys5U
b0710 6e 6c 69 6e 6b 28 69 46 69 72 73 74 2c 20 69 4c nlink(iFirst, iL
b0720 6f 67 73 69 7a 65 29 3b 0d 0a 20 20 72 65 74 75 ogsize);.. retu
b0730 72 6e 20 69 46 69 72 73 74 3b 0d 0a 7d 0d 0a 0d rn iFirst;..}...
b0740 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ./*..** Return a
b0750 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 block of memory
b0760 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 42 79 of at least nBy
b0770 74 65 73 20 69 6e 20 73 69 7a 65 2e 0d 0a 2a 2a tes in size...**
b0780 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 Return NULL if
b0790 75 6e 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 unable. Return
b07a0 4e 55 4c 4c 20 69 66 20 6e 42 79 74 65 73 3d 3d NULL if nBytes==
b07b0 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 0...**..** The c
b07c0 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 aller guarantees
b07d0 20 74 68 61 74 20 6e 42 79 74 65 20 70 6f 73 69 that nByte posi
b07e0 74 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 tive...**..** Th
b07f0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 e caller has obt
b0800 61 69 6e 65 64 20 61 20 6d 75 74 65 78 20 70 72 ained a mutex pr
b0810 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 ior to invoking
b0820 74 68 69 73 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 this..** routine
b0830 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 so there is nev
b0840 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 er any chance th
b0850 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0d 0a at two or more..
b0860 2a 2a 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 ** threads can b
b0870 65 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e e in this routin
b0880 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 e at the same ti
b0890 6d 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 me...*/..static
b08a0 76 6f 69 64 20 2a 6d 65 6d 73 79 73 35 4d 61 6c void *memsys5Mal
b08b0 6c 6f 63 55 6e 73 61 66 65 28 69 6e 74 20 6e 42 locUnsafe(int nB
b08c0 79 74 65 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 20 yte){.. int i;
b08d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind
b08e0 65 78 20 6f 66 20 61 20 6d 65 6d 35 2e 61 50 6f ex of a mem5.aPo
b08f0 6f 6c 5b 5d 20 73 6c 6f 74 20 2a 2f 0d 0a 20 20 ol[] slot */..
b0900 69 6e 74 20 69 42 69 6e 3b 20 20 20 20 20 20 20 int iBin;
b0910 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 6d /* Index into m
b0920 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 5d em5.aiFreelist[]
b0930 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 46 75 6c 6c */.. int iFull
b0940 53 7a 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 Sz; /* Size
b0950 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f of allocation ro
b0960 75 6e 64 65 64 20 75 70 20 74 6f 20 70 6f 77 65 unded up to powe
b0970 72 20 6f 66 20 32 20 2a 2f 0d 0a 20 20 69 6e 74 r of 2 */.. int
b0980 20 69 4c 6f 67 73 69 7a 65 3b 20 20 20 20 2f 2a iLogsize; /*
b0990 20 4c 6f 67 32 20 6f 66 20 69 46 75 6c 6c 53 7a Log2 of iFullSz
b09a0 2f 50 4f 57 32 5f 4d 49 4e 20 2a 2f 0d 0a 0d 0a /POW2_MIN */....
b09b0 20 20 2f 2a 20 6e 42 79 74 65 20 6d 75 73 74 20 /* nByte must
b09c0 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 2a 2f be a positive */
b09d0 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 .. assert( nByt
b09e0 65 3e 30 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 4b e>0 );.... /* K
b09f0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 eep track of the
b0a00 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 maximum allocat
b0a10 69 6f 6e 20 72 65 71 75 65 73 74 2e 20 20 45 76 ion request. Ev
b0a20 65 6e 20 75 6e 66 75 6c 66 69 6c 6c 65 64 0d 0a en unfulfilled..
b0a30 20 20 2a 2a 20 72 65 71 75 65 73 74 73 20 61 72 ** requests ar
b0a40 65 20 63 6f 75 6e 74 65 64 20 2a 2f 0d 0a 20 20 e counted */..
b0a50 69 66 28 20 28 75 33 32 29 6e 42 79 74 65 3e 6d if( (u32)nByte>m
b0a60 65 6d 35 2e 6d 61 78 52 65 71 75 65 73 74 20 29 em5.maxRequest )
b0a70 7b 0d 0a 20 20 20 20 6d 65 6d 35 2e 6d 61 78 52 {.. mem5.maxR
b0a80 65 71 75 65 73 74 20 3d 20 6e 42 79 74 65 3b 0d equest = nByte;.
b0a90 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 41 62 6f . }.... /* Abo
b0aa0 72 74 20 69 66 20 74 68 65 20 72 65 71 75 65 73 rt if the reques
b0ab0 74 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 ted allocation s
b0ac0 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 ize is larger th
b0ad0 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 0d 0a an the largest..
b0ae0 20 20 2a 2a 20 70 6f 77 65 72 20 6f 66 20 74 77 ** power of tw
b0af0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 72 65 o that we can re
b0b00 70 72 65 73 65 6e 74 20 75 73 69 6e 67 20 33 32 present using 32
b0b10 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 -bit signed inte
b0b20 67 65 72 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 gers... */.. i
b0b30 66 28 20 6e 42 79 74 65 20 3e 20 30 78 34 30 30 f( nByte > 0x400
b0b40 30 30 30 30 30 20 29 7b 0d 0a 20 20 20 20 72 65 00000 ){.. re
b0b50 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a turn 0;.. }....
b0b60 20 20 2f 2a 20 52 6f 75 6e 64 20 6e 42 79 74 65 /* Round nByte
b0b70 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 up to the next
b0b80 76 61 6c 69 64 20 70 6f 77 65 72 20 6f 66 20 74 valid power of t
b0b90 77 6f 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 46 75 wo */.. for(iFu
b0ba0 6c 6c 53 7a 3d 6d 65 6d 35 2e 73 7a 41 74 6f 6d llSz=mem5.szAtom
b0bb0 2c 20 69 4c 6f 67 73 69 7a 65 3d 30 3b 20 69 46 , iLogsize=0; iF
b0bc0 75 6c 6c 53 7a 3c 6e 42 79 74 65 3b 20 69 46 75 ullSz<nByte; iFu
b0bd0 6c 6c 53 7a 20 2a 3d 20 32 2c 20 69 4c 6f 67 73 llSz *= 2, iLogs
b0be0 69 7a 65 2b 2b 29 7b 7d 0d 0a 0d 0a 20 20 2f 2a ize++){}.... /*
b0bf0 20 4d 61 6b 65 20 73 75 72 65 20 6d 65 6d 35 2e Make sure mem5.
b0c00 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f 67 73 aiFreelist[iLogs
b0c10 69 7a 65 5d 20 63 6f 6e 74 61 69 6e 73 20 61 74 ize] contains at
b0c20 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 0d least one free.
b0c30 0a 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 . ** block. If
b0c40 20 6e 6f 74 2c 20 74 68 65 6e 20 73 70 6c 69 74 not, then split
b0c50 20 61 20 62 6c 6f 63 6b 20 6f 66 20 74 68 65 20 a block of the
b0c60 6e 65 78 74 20 6c 61 72 67 65 72 20 70 6f 77 65 next larger powe
b0c70 72 20 6f 66 0d 0a 20 20 2a 2a 20 74 77 6f 20 69 r of.. ** two i
b0c80 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 n order to creat
b0c90 65 20 61 20 6e 65 77 20 66 72 65 65 20 62 6c 6f e a new free blo
b0ca0 63 6b 20 6f 66 20 73 69 7a 65 20 69 4c 6f 67 73 ck of size iLogs
b0cb0 69 7a 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 66 6f ize... */.. fo
b0cc0 72 28 69 42 69 6e 3d 69 4c 6f 67 73 69 7a 65 3b r(iBin=iLogsize;
b0cd0 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 mem5.aiFreelist
b0ce0 5b 69 42 69 6e 5d 3c 30 20 26 26 20 69 42 69 6e [iBin]<0 && iBin
b0cf0 3c 3d 4c 4f 47 4d 41 58 3b 20 69 42 69 6e 2b 2b <=LOGMAX; iBin++
b0d00 29 7b 7d 0d 0a 20 20 69 66 28 20 69 42 69 6e 3e ){}.. if( iBin>
b0d10 4c 4f 47 4d 41 58 20 29 7b 0d 0a 20 20 20 20 74 LOGMAX ){.. t
b0d20 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 estcase( sqlite3
b0d30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f GlobalConfig.xLo
b0d40 67 21 3d 30 20 29 3b 0d 0a 20 20 20 20 73 71 6c g!=0 );.. sql
b0d50 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f ite3_log(SQLITE_
b0d60 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 NOMEM, "failed t
b0d70 6f 20 61 6c 6c 6f 63 61 74 65 20 25 75 20 62 79 o allocate %u by
b0d80 74 65 73 22 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 tes", nByte);..
b0d90 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 return 0;..
b0da0 7d 0d 0a 20 20 69 20 3d 20 6d 65 6d 73 79 73 35 }.. i = memsys5
b0db0 55 6e 6c 69 6e 6b 46 69 72 73 74 28 69 42 69 6e UnlinkFirst(iBin
b0dc0 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 69 42 69 );.. while( iBi
b0dd0 6e 3e 69 4c 6f 67 73 69 7a 65 20 29 7b 0d 0a 20 n>iLogsize ){..
b0de0 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0d int newSize;.
b0df0 0a 0d 0a 20 20 20 20 69 42 69 6e 2d 2d 3b 0d 0a ... iBin--;..
b0e00 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 31 20 newSize = 1
b0e10 3c 3c 20 69 42 69 6e 3b 0d 0a 20 20 20 20 6d 65 << iBin;.. me
b0e20 6d 35 2e 61 43 74 72 6c 5b 69 2b 6e 65 77 53 69 m5.aCtrl[i+newSi
b0e30 7a 65 5d 20 3d 20 43 54 52 4c 5f 46 52 45 45 20 ze] = CTRL_FREE
b0e40 7c 20 69 42 69 6e 3b 0d 0a 20 20 20 20 6d 65 6d | iBin;.. mem
b0e50 73 79 73 35 4c 69 6e 6b 28 69 2b 6e 65 77 53 69 sys5Link(i+newSi
b0e60 7a 65 2c 20 69 42 69 6e 29 3b 0d 0a 20 20 7d 0d ze, iBin);.. }.
b0e70 0a 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 5d . mem5.aCtrl[i]
b0e80 20 3d 20 69 4c 6f 67 73 69 7a 65 3b 0d 0a 0d 0a = iLogsize;....
b0e90 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6c 6c 6f /* Update allo
b0ea0 63 61 74 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 cator performanc
b0eb0 65 20 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f e statistics. */
b0ec0 0d 0a 20 20 6d 65 6d 35 2e 6e 41 6c 6c 6f 63 2b .. mem5.nAlloc+
b0ed0 2b 3b 0d 0a 20 20 6d 65 6d 35 2e 74 6f 74 61 6c +;.. mem5.total
b0ee0 41 6c 6c 6f 63 20 2b 3d 20 69 46 75 6c 6c 53 7a Alloc += iFullSz
b0ef0 3b 0d 0a 20 20 6d 65 6d 35 2e 74 6f 74 61 6c 45 ;.. mem5.totalE
b0f00 78 63 65 73 73 20 2b 3d 20 69 46 75 6c 6c 53 7a xcess += iFullSz
b0f10 20 2d 20 6e 42 79 74 65 3b 0d 0a 20 20 6d 65 6d - nByte;.. mem
b0f20 35 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 2b 2b 5.currentCount++
b0f30 3b 0d 0a 20 20 6d 65 6d 35 2e 63 75 72 72 65 6e ;.. mem5.curren
b0f40 74 4f 75 74 20 2b 3d 20 69 46 75 6c 6c 53 7a 3b tOut += iFullSz;
b0f50 0d 0a 20 20 69 66 28 20 6d 65 6d 35 2e 6d 61 78 .. if( mem5.max
b0f60 43 6f 75 6e 74 3c 6d 65 6d 35 2e 63 75 72 72 65 Count<mem5.curre
b0f70 6e 74 43 6f 75 6e 74 20 29 20 6d 65 6d 35 2e 6d ntCount ) mem5.m
b0f80 61 78 43 6f 75 6e 74 20 3d 20 6d 65 6d 35 2e 63 axCount = mem5.c
b0f90 75 72 72 65 6e 74 43 6f 75 6e 74 3b 0d 0a 20 20 urrentCount;..
b0fa0 69 66 28 20 6d 65 6d 35 2e 6d 61 78 4f 75 74 3c if( mem5.maxOut<
b0fb0 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 20 mem5.currentOut
b0fc0 29 20 6d 65 6d 35 2e 6d 61 78 4f 75 74 20 3d 20 ) mem5.maxOut =
b0fd0 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 3b mem5.currentOut;
b0fe0 0d 0a 0d 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 .... /* Return
b0ff0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
b1000 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 allocated memor
b1010 79 2e 20 2a 2f 0d 0a 20 20 72 65 74 75 72 6e 20 y. */.. return
b1020 28 76 6f 69 64 2a 29 26 6d 65 6d 35 2e 7a 50 6f (void*)&mem5.zPo
b1030 6f 6c 5b 69 2a 6d 65 6d 35 2e 73 7a 41 74 6f 6d ol[i*mem5.szAtom
b1040 5d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ];..}..../*..**
b1050 46 72 65 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 Free an outstand
b1060 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 ing memory alloc
b1070 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ation...*/..stat
b1080 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 35 46 ic void memsys5F
b1090 72 65 65 55 6e 73 61 66 65 28 76 6f 69 64 20 2a reeUnsafe(void *
b10a0 70 4f 6c 64 29 7b 0d 0a 20 20 75 33 32 20 73 69 pOld){.. u32 si
b10b0 7a 65 2c 20 69 4c 6f 67 73 69 7a 65 3b 0d 0a 20 ze, iLogsize;..
b10c0 20 69 6e 74 20 69 42 6c 6f 63 6b 3b 0d 0a 0d 0a int iBlock;....
b10d0 20 20 2f 2a 20 53 65 74 20 69 42 6c 6f 63 6b 20 /* Set iBlock
b10e0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 to the index of
b10f0 74 68 65 20 62 6c 6f 63 6b 20 70 6f 69 6e 74 65 the block pointe
b1100 64 20 74 6f 20 62 79 20 70 4f 6c 64 20 69 6e 20 d to by pOld in
b1110 0d 0a 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 .. ** the array
b1120 20 6f 66 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 of mem5.szAtom
b1130 62 79 74 65 20 62 6c 6f 63 6b 73 20 70 6f 69 6e byte blocks poin
b1140 74 65 64 20 74 6f 20 62 79 20 6d 65 6d 35 2e 7a ted to by mem5.z
b1150 50 6f 6f 6c 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 Pool... */.. i
b1160 42 6c 6f 63 6b 20 3d 20 28 28 75 38 20 2a 29 70 Block = ((u8 *)p
b1170 4f 6c 64 2d 6d 65 6d 35 2e 7a 50 6f 6f 6c 29 2f Old-mem5.zPool)/
b1180 6d 65 6d 35 2e 73 7a 41 74 6f 6d 3b 0d 0a 0d 0a mem5.szAtom;....
b1190 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 /* Check that
b11a0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 4f 6c 64 the pointer pOld
b11b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c points to a val
b11c0 69 64 2c 20 6e 6f 6e 2d 66 72 65 65 20 62 6c 6f id, non-free blo
b11d0 63 6b 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 ck. */.. assert
b11e0 28 20 69 42 6c 6f 63 6b 3e 3d 30 20 26 26 20 69 ( iBlock>=0 && i
b11f0 42 6c 6f 63 6b 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 Block<mem5.nBloc
b1200 6b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 k );.. assert(
b1210 28 28 75 38 20 2a 29 70 4f 6c 64 2d 6d 65 6d 35 ((u8 *)pOld-mem5
b1220 2e 7a 50 6f 6f 6c 29 25 6d 65 6d 35 2e 73 7a 41 .zPool)%mem5.szA
b1230 74 6f 6d 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 tom==0 );.. ass
b1240 65 72 74 28 20 28 6d 65 6d 35 2e 61 43 74 72 6c ert( (mem5.aCtrl
b1250 5b 69 42 6c 6f 63 6b 5d 20 26 20 43 54 52 4c 5f [iBlock] & CTRL_
b1260 46 52 45 45 29 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 FREE)==0 );....
b1270 20 69 4c 6f 67 73 69 7a 65 20 3d 20 6d 65 6d 35 iLogsize = mem5
b1280 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 26 .aCtrl[iBlock] &
b1290 20 43 54 52 4c 5f 4c 4f 47 53 49 5a 45 3b 0d 0a CTRL_LOGSIZE;..
b12a0 20 20 73 69 7a 65 20 3d 20 31 3c 3c 69 4c 6f 67 size = 1<<iLog
b12b0 73 69 7a 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 size;.. assert(
b12c0 20 69 42 6c 6f 63 6b 2b 73 69 7a 65 2d 31 3c 28 iBlock+size-1<(
b12d0 75 33 32 29 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 u32)mem5.nBlock
b12e0 29 3b 0d 0a 0d 0a 20 20 6d 65 6d 35 2e 61 43 74 );.... mem5.aCt
b12f0 72 6c 5b 69 42 6c 6f 63 6b 5d 20 7c 3d 20 43 54 rl[iBlock] |= CT
b1300 52 4c 5f 46 52 45 45 3b 0d 0a 20 20 6d 65 6d 35 RL_FREE;.. mem5
b1310 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 2b 73 69 .aCtrl[iBlock+si
b1320 7a 65 2d 31 5d 20 7c 3d 20 43 54 52 4c 5f 46 52 ze-1] |= CTRL_FR
b1330 45 45 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6d EE;.. assert( m
b1340 65 6d 35 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 em5.currentCount
b1350 3e 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 >0 );.. assert(
b1360 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 mem5.currentOut
b1370 3e 3d 28 73 69 7a 65 2a 6d 65 6d 35 2e 73 7a 41 >=(size*mem5.szA
b1380 74 6f 6d 29 20 29 3b 0d 0a 20 20 6d 65 6d 35 2e tom) );.. mem5.
b1390 63 75 72 72 65 6e 74 43 6f 75 6e 74 2d 2d 3b 0d currentCount--;.
b13a0 0a 20 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f . mem5.currentO
b13b0 75 74 20 2d 3d 20 73 69 7a 65 2a 6d 65 6d 35 2e ut -= size*mem5.
b13c0 73 7a 41 74 6f 6d 3b 0d 0a 20 20 61 73 73 65 72 szAtom;.. asser
b13d0 74 28 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f t( mem5.currentO
b13e0 75 74 3e 30 20 7c 7c 20 6d 65 6d 35 2e 63 75 72 ut>0 || mem5.cur
b13f0 72 65 6e 74 43 6f 75 6e 74 3d 3d 30 20 29 3b 0d rentCount==0 );.
b1400 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 35 2e . assert( mem5.
b1410 63 75 72 72 65 6e 74 43 6f 75 6e 74 3e 30 20 7c currentCount>0 |
b1420 7c 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 | mem5.currentOu
b1430 74 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 6d 65 6d t==0 );.... mem
b1440 35 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 5.aCtrl[iBlock]
b1450 3d 20 43 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c = CTRL_FREE | iL
b1460 6f 67 73 69 7a 65 3b 0d 0a 20 20 77 68 69 6c 65 ogsize;.. while
b1470 28 20 41 4c 57 41 59 53 28 69 4c 6f 67 73 69 7a ( ALWAYS(iLogsiz
b1480 65 3c 4c 4f 47 4d 41 58 29 20 29 7b 0d 0a 20 20 e<LOGMAX) ){..
b1490 20 20 69 6e 74 20 69 42 75 64 64 79 3b 0d 0a 20 int iBuddy;..
b14a0 20 20 20 69 66 28 20 28 69 42 6c 6f 63 6b 3e 3e if( (iBlock>>
b14b0 69 4c 6f 67 73 69 7a 65 29 20 26 20 31 20 29 7b iLogsize) & 1 ){
b14c0 0d 0a 20 20 20 20 20 20 69 42 75 64 64 79 20 3d .. iBuddy =
b14d0 20 69 42 6c 6f 63 6b 20 2d 20 73 69 7a 65 3b 0d iBlock - size;.
b14e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
b14f0 20 20 20 69 42 75 64 64 79 20 3d 20 69 42 6c 6f iBuddy = iBlo
b1500 63 6b 20 2b 20 73 69 7a 65 3b 0d 0a 20 20 20 20 ck + size;..
b1510 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 }.. assert( i
b1520 42 75 64 64 79 3e 3d 30 20 29 3b 0d 0a 20 20 20 Buddy>=0 );..
b1530 20 69 66 28 20 28 69 42 75 64 64 79 2b 28 31 3c if( (iBuddy+(1<
b1540 3c 69 4c 6f 67 73 69 7a 65 29 29 3e 6d 65 6d 35 <iLogsize))>mem5
b1550 2e 6e 42 6c 6f 63 6b 20 29 20 62 72 65 61 6b 3b .nBlock ) break;
b1560 0d 0a 20 20 20 20 69 66 28 20 6d 65 6d 35 2e 61 .. if( mem5.a
b1570 43 74 72 6c 5b 69 42 75 64 64 79 5d 21 3d 28 43 Ctrl[iBuddy]!=(C
b1580 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 73 TRL_FREE | iLogs
b1590 69 7a 65 29 20 29 20 62 72 65 61 6b 3b 0d 0a 20 ize) ) break;..
b15a0 20 20 20 6d 65 6d 73 79 73 35 55 6e 6c 69 6e 6b memsys5Unlink
b15b0 28 69 42 75 64 64 79 2c 20 69 4c 6f 67 73 69 7a (iBuddy, iLogsiz
b15c0 65 29 3b 0d 0a 20 20 20 20 69 4c 6f 67 73 69 7a e);.. iLogsiz
b15d0 65 2b 2b 3b 0d 0a 20 20 20 20 69 66 28 20 69 42 e++;.. if( iB
b15e0 75 64 64 79 3c 69 42 6c 6f 63 6b 20 29 7b 0d 0a uddy<iBlock ){..
b15f0 20 20 20 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c mem5.aCtrl
b1600 5b 69 42 75 64 64 79 5d 20 3d 20 43 54 52 4c 5f [iBuddy] = CTRL_
b1610 46 52 45 45 20 7c 20 69 4c 6f 67 73 69 7a 65 3b FREE | iLogsize;
b1620 0d 0a 20 20 20 20 20 20 6d 65 6d 35 2e 61 43 74 .. mem5.aCt
b1630 72 6c 5b 69 42 6c 6f 63 6b 5d 20 3d 20 30 3b 0d rl[iBlock] = 0;.
b1640 0a 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d 20 . iBlock =
b1650 69 42 75 64 64 79 3b 0d 0a 20 20 20 20 7d 65 6c iBuddy;.. }el
b1660 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 35 2e se{.. mem5.
b1670 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 3d 20 aCtrl[iBlock] =
b1680 43 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 CTRL_FREE | iLog
b1690 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20 6d 65 6d size;.. mem
b16a0 35 2e 61 43 74 72 6c 5b 69 42 75 64 64 79 5d 20 5.aCtrl[iBuddy]
b16b0 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 = 0;.. }..
b16c0 20 73 69 7a 65 20 2a 3d 20 32 3b 0d 0a 20 20 7d size *= 2;.. }
b16d0 0d 0a 20 20 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 .. memsys5Link(
b16e0 69 42 6c 6f 63 6b 2c 20 69 4c 6f 67 73 69 7a 65 iBlock, iLogsize
b16f0 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 );..}..../*..**
b1700 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 Allocate nBytes
b1710 6f 66 20 6d 65 6d 6f 72 79 0d 0a 2a 2f 0d 0a 73 of memory..*/..s
b1720 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 tatic void *mems
b1730 79 73 35 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 ys5Malloc(int nB
b1740 79 74 65 73 29 7b 0d 0a 20 20 73 71 6c 69 74 65 ytes){.. sqlite
b1750 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0d 3_int64 *p = 0;.
b1760 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3e 30 20 . if( nBytes>0
b1770 29 7b 0d 0a 20 20 20 20 6d 65 6d 73 79 73 35 45 ){.. memsys5E
b1780 6e 74 65 72 28 29 3b 0d 0a 20 20 20 20 70 20 3d nter();.. p =
b1790 20 6d 65 6d 73 79 73 35 4d 61 6c 6c 6f 63 55 6e memsys5MallocUn
b17a0 73 61 66 65 28 6e 42 79 74 65 73 29 3b 0d 0a 20 safe(nBytes);..
b17b0 20 20 20 6d 65 6d 73 79 73 35 4c 65 61 76 65 28 memsys5Leave(
b17c0 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 );.. }.. retur
b17d0 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0d 0a 7d 0d n (void*)p; ..}.
b17e0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 6d .../*..** Free m
b17f0 65 6d 6f 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 emory...**..** T
b1800 68 65 20 6f 75 74 65 72 20 6c 61 79 65 72 20 6d he outer layer m
b1810 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 emory allocator
b1820 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 72 6f prevents this ro
b1830 75 74 69 6e 65 20 66 72 6f 6d 0d 0a 2a 2a 20 62 utine from..** b
b1840 65 69 6e 67 20 63 61 6c 6c 65 64 20 77 69 74 68 eing called with
b1850 20 70 50 72 69 6f 72 3d 3d 30 2e 0d 0a 2a 2f 0d pPrior==0...*/.
b1860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d .static void mem
b1870 73 79 73 35 46 72 65 65 28 76 6f 69 64 20 2a 70 sys5Free(void *p
b1880 50 72 69 6f 72 29 7b 0d 0a 20 20 61 73 73 65 72 Prior){.. asser
b1890 74 28 20 70 50 72 69 6f 72 21 3d 30 20 29 3b 0d t( pPrior!=0 );.
b18a0 0a 20 20 6d 65 6d 73 79 73 35 45 6e 74 65 72 28 . memsys5Enter(
b18b0 29 3b 0d 0a 20 20 6d 65 6d 73 79 73 35 46 72 65 );.. memsys5Fre
b18c0 65 55 6e 73 61 66 65 28 70 50 72 69 6f 72 29 3b eUnsafe(pPrior);
b18d0 0d 0a 20 20 6d 65 6d 73 79 73 35 4c 65 61 76 65 .. memsys5Leave
b18e0 28 29 3b 20 20 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a (); ..}..../*..
b18f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 ** Change the si
b1900 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e ze of an existin
b1910 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 g memory allocat
b1920 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ion...**..** The
b1930 20 6f 75 74 65 72 20 6c 61 79 65 72 20 6d 65 6d outer layer mem
b1940 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 70 72 ory allocator pr
b1950 65 76 65 6e 74 73 20 74 68 69 73 20 72 6f 75 74 events this rout
b1960 69 6e 65 20 66 72 6f 6d 0d 0a 2a 2a 20 62 65 69 ine from..** bei
b1970 6e 67 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 ng called with p
b1980 50 72 69 6f 72 3d 3d 30 2e 20 20 0d 0a 2a 2a 0d Prior==0. ..**.
b1990 0a 2a 2a 20 6e 42 79 74 65 73 20 69 73 20 61 6c .** nBytes is al
b19a0 77 61 79 73 20 61 20 76 61 6c 75 65 20 6f 62 74 ways a value obt
b19b0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 ained from a pri
b19c0 6f 72 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 6d or call to..** m
b19d0 65 6d 73 79 73 35 52 6f 75 6e 64 28 29 2e 20 20 emsys5Round().
b19e0 48 65 6e 63 65 20 6e 42 79 74 65 73 20 69 73 20 Hence nBytes is
b19f0 61 6c 77 61 79 73 20 61 20 6e 6f 6e 2d 6e 65 67 always a non-neg
b1a00 61 74 69 76 65 20 70 6f 77 65 72 0d 0a 2a 2a 20 ative power..**
b1a10 6f 66 20 74 77 6f 2e 20 20 49 66 20 6e 42 79 74 of two. If nByt
b1a20 65 73 3d 3d 30 20 74 68 61 74 20 6d 65 61 6e 73 es==0 that means
b1a30 20 74 68 61 74 20 61 6e 20 6f 76 65 72 73 69 7a that an oversiz
b1a40 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d 0a 2a 2a e allocation..**
b1a50 20 28 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 (an allocation
b1a60 6c 61 72 67 65 72 20 74 68 61 6e 20 30 78 34 30 larger than 0x40
b1a70 30 30 30 30 30 30 29 20 77 61 73 20 72 65 71 75 000000) was requ
b1a80 65 73 74 65 64 20 61 6e 64 20 74 68 69 73 0d 0a ested and this..
b1a90 2a 2a 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c ** routine shoul
b1aa0 64 20 72 65 74 75 72 6e 20 30 20 77 69 74 68 6f d return 0 witho
b1ab0 75 74 20 66 72 65 65 69 6e 67 20 70 50 72 69 6f ut freeing pPrio
b1ac0 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 r...*/..static v
b1ad0 6f 69 64 20 2a 6d 65 6d 73 79 73 35 52 65 61 6c oid *memsys5Real
b1ae0 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 loc(void *pPrior
b1af0 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0d 0a , int nBytes){..
b1b00 20 20 69 6e 74 20 6e 4f 6c 64 3b 0d 0a 20 20 76 int nOld;.. v
b1b10 6f 69 64 20 2a 70 3b 0d 0a 20 20 61 73 73 65 72 oid *p;.. asser
b1b20 74 28 20 70 50 72 69 6f 72 21 3d 30 20 29 3b 0d t( pPrior!=0 );.
b1b30 0a 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 . assert( (nByt
b1b40 65 73 26 28 6e 42 79 74 65 73 2d 31 29 29 3d 3d es&(nBytes-1))==
b1b50 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 34 0 ); /* EV: R-4
b1b60 36 31 39 39 2d 33 30 32 34 39 20 2a 2f 0d 0a 20 6199-30249 */..
b1b70 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e assert( nBytes>
b1b80 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 =0 );.. if( nBy
b1b90 74 65 73 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 tes==0 ){.. r
b1ba0 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
b1bb0 20 6e 4f 6c 64 20 3d 20 6d 65 6d 73 79 73 35 53 nOld = memsys5S
b1bc0 69 7a 65 28 70 50 72 69 6f 72 29 3b 0d 0a 20 20 ize(pPrior);..
b1bd0 69 66 28 20 6e 42 79 74 65 73 3c 3d 6e 4f 6c 64 if( nBytes<=nOld
b1be0 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
b1bf0 70 50 72 69 6f 72 3b 0d 0a 20 20 7d 0d 0a 20 20 pPrior;.. }..
b1c00 6d 65 6d 73 79 73 35 45 6e 74 65 72 28 29 3b 0d memsys5Enter();.
b1c10 0a 20 20 70 20 3d 20 6d 65 6d 73 79 73 35 4d 61 . p = memsys5Ma
b1c20 6c 6c 6f 63 55 6e 73 61 66 65 28 6e 42 79 74 65 llocUnsafe(nByte
b1c30 73 29 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d s);.. if( p ){.
b1c40 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 70 . memcpy(p, p
b1c50 50 72 69 6f 72 2c 20 6e 4f 6c 64 29 3b 0d 0a 20 Prior, nOld);..
b1c60 20 20 20 6d 65 6d 73 79 73 35 46 72 65 65 55 6e memsys5FreeUn
b1c70 73 61 66 65 28 70 50 72 69 6f 72 29 3b 0d 0a 20 safe(pPrior);..
b1c80 20 7d 0d 0a 20 20 6d 65 6d 73 79 73 35 4c 65 61 }.. memsys5Lea
b1c90 76 65 28 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 ve();.. return
b1ca0 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 p;..}..../*..**
b1cb0 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 Round up a reque
b1cc0 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e st size to the n
b1cd0 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 ext valid alloca
b1ce0 74 69 6f 6e 20 73 69 7a 65 2e 20 20 49 66 0d 0a tion size. If..
b1cf0 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f ** the allocatio
b1d00 6e 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 n is too large t
b1d10 6f 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 o be handled by
b1d20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 this allocation
b1d30 73 79 73 74 65 6d 2c 0d 0a 2a 2a 20 72 65 74 75 system,..** retu
b1d40 72 6e 20 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c rn 0...**..** Al
b1d50 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 75 l allocations mu
b1d60 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 st be a power of
b1d70 20 74 77 6f 20 61 6e 64 20 6d 75 73 74 20 62 65 two and must be
b1d80 20 65 78 70 72 65 73 73 65 64 20 62 79 20 61 0d expressed by a.
b1d90 0a 2a 2a 20 33 32 2d 62 69 74 20 73 69 67 6e 65 .** 32-bit signe
b1da0 64 20 69 6e 74 65 67 65 72 2e 20 20 48 65 6e 63 d integer. Henc
b1db0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 6c e the largest al
b1dc0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 30 78 34 30 location is 0x40
b1dd0 30 30 30 30 30 30 0d 0a 2a 2a 20 6f 72 20 31 30 000000..** or 10
b1de0 37 33 37 34 31 38 32 34 20 62 79 74 65 73 2e 0d 73741824 bytes..
b1df0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
b1e00 6d 65 6d 73 79 73 35 52 6f 75 6e 64 75 70 28 69 memsys5Roundup(i
b1e10 6e 74 20 6e 29 7b 0d 0a 20 20 69 6e 74 20 69 46 nt n){.. int iF
b1e20 75 6c 6c 53 7a 3b 0d 0a 20 20 69 66 28 20 6e 20 ullSz;.. if( n
b1e30 3e 20 30 78 34 30 30 30 30 30 30 30 20 29 20 72 > 0x40000000 ) r
b1e40 65 74 75 72 6e 20 30 3b 0d 0a 20 20 66 6f 72 28 eturn 0;.. for(
b1e50 69 46 75 6c 6c 53 7a 3d 6d 65 6d 35 2e 73 7a 41 iFullSz=mem5.szA
b1e60 74 6f 6d 3b 20 69 46 75 6c 6c 53 7a 3c 6e 3b 20 tom; iFullSz<n;
b1e70 69 46 75 6c 6c 53 7a 20 2a 3d 20 32 29 3b 0d 0a iFullSz *= 2);..
b1e80 20 20 72 65 74 75 72 6e 20 69 46 75 6c 6c 53 7a return iFullSz
b1e90 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
b1ea0 65 74 75 72 6e 20 74 68 65 20 63 65 69 6c 69 6e eturn the ceilin
b1eb0 67 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 g of the logarit
b1ec0 68 6d 20 62 61 73 65 20 32 20 6f 66 20 69 56 61 hm base 2 of iVa
b1ed0 6c 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 61 lue...**..** Exa
b1ee0 6d 70 6c 65 73 3a 20 20 20 6d 65 6d 73 79 73 35 mples: memsys5
b1ef0 4c 6f 67 28 31 29 20 2d 3e 20 30 0d 0a 2a 2a 20 Log(1) -> 0..**
b1f00 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 mems
b1f10 79 73 35 4c 6f 67 28 32 29 20 2d 3e 20 31 0d 0a ys5Log(2) -> 1..
b1f20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6d ** m
b1f30 65 6d 73 79 73 35 4c 6f 67 28 34 29 20 2d 3e 20 emsys5Log(4) ->
b1f40 32 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2..**
b1f50 20 20 6d 65 6d 73 79 73 35 4c 6f 67 28 35 29 20 memsys5Log(5)
b1f60 2d 3e 20 33 0d 0a 2a 2a 20 20 20 20 20 20 20 20 -> 3..**
b1f70 20 20 20 20 20 6d 65 6d 73 79 73 35 4c 6f 67 28 memsys5Log(
b1f80 38 29 20 2d 3e 20 33 0d 0a 2a 2a 20 20 20 20 20 8) -> 3..**
b1f90 20 20 20 20 20 20 20 20 6d 65 6d 73 79 73 35 4c memsys5L
b1fa0 6f 67 28 39 29 20 2d 3e 20 34 0d 0a 2a 2f 0d 0a og(9) -> 4..*/..
b1fb0 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 static int memsy
b1fc0 73 35 4c 6f 67 28 69 6e 74 20 69 56 61 6c 75 65 s5Log(int iValue
b1fd0 29 7b 0d 0a 20 20 69 6e 74 20 69 4c 6f 67 3b 0d ){.. int iLog;.
b1fe0 0a 20 20 66 6f 72 28 69 4c 6f 67 3d 30 3b 20 28 . for(iLog=0; (
b1ff0 69 4c 6f 67 3c 28 69 6e 74 29 28 28 73 69 7a 65 iLog<(int)((size
b2000 6f 66 28 69 6e 74 29 2a 38 29 2d 31 29 29 20 26 of(int)*8)-1)) &
b2010 26 20 28 31 3c 3c 69 4c 6f 67 29 3c 69 56 61 6c & (1<<iLog)<iVal
b2020 75 65 3b 20 69 4c 6f 67 2b 2b 29 3b 0d 0a 20 20 ue; iLog++);..
b2030 72 65 74 75 72 6e 20 69 4c 6f 67 3b 0d 0a 7d 0d return iLog;..}.
b2040 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 .../*..** Initia
b2050 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 lize the memory
b2060 61 6c 6c 6f 63 61 74 6f 72 2e 0d 0a 2a 2a 0d 0a allocator...**..
b2070 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
b2080 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 is not threadsaf
b2090 65 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d e. The caller m
b20a0 75 73 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 61 ust be holding a
b20b0 20 6d 75 74 65 78 0d 0a 2a 2a 20 74 6f 20 70 72 mutex..** to pr
b20c0 65 76 65 6e 74 20 6d 75 6c 74 69 70 6c 65 20 74 event multiple t
b20d0 68 72 65 61 64 73 20 66 72 6f 6d 20 65 6e 74 65 hreads from ente
b20e0 72 69 6e 67 20 61 74 20 74 68 65 20 73 61 6d 65 ring at the same
b20f0 20 74 69 6d 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 time...*/..stat
b2100 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 35 49 6e ic int memsys5In
b2110 69 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 it(void *NotUsed
b2120 29 7b 0d 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 ){.. int ii;
b2130 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 /* Loop
b2140 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 69 counter */.. i
b2150 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 nt nByte;
b2160 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
b2170 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 ytes of memory a
b2180 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 69 73 vailable to this
b2190 20 61 6c 6c 6f 63 61 74 6f 72 20 2a 2f 0d 0a 20 allocator */..
b21a0 20 75 38 20 2a 7a 42 79 74 65 3b 20 20 20 20 20 u8 *zByte;
b21b0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 75 73 /* Memory us
b21c0 61 62 6c 65 20 62 79 20 74 68 69 73 20 61 6c 6c able by this all
b21d0 6f 63 61 74 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 ocator */.. int
b21e0 20 6e 4d 69 6e 4c 6f 67 3b 20 20 20 20 20 20 20 nMinLog;
b21f0 2f 2a 20 4c 6f 67 20 62 61 73 65 20 32 20 6f 66 /* Log base 2 of
b2200 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 minimum allocat
b2210 69 6f 6e 20 73 69 7a 65 20 69 6e 20 62 79 74 65 ion size in byte
b2220 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 4f 66 66 s */.. int iOff
b2230 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e set; /* An
b2240 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 6d 65 6d offset into mem
b2250 35 2e 61 43 74 72 6c 5b 5d 20 2a 2f 0d 0a 0d 0a 5.aCtrl[] */....
b2260 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
b2270 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 0d 0a ER(NotUsed);....
b2280 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 70 75 72 /* For the pur
b2290 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f poses of this ro
b22a0 75 74 69 6e 65 2c 20 64 69 73 61 62 6c 65 20 74 utine, disable t
b22b0 68 65 20 6d 75 74 65 78 20 2a 2f 0d 0a 20 20 6d he mutex */.. m
b22c0 65 6d 35 2e 6d 75 74 65 78 20 3d 20 30 3b 0d 0a em5.mutex = 0;..
b22d0 0d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 .. /* The size
b22e0 6f 66 20 61 20 4d 65 6d 35 4c 69 6e 6b 20 6f 62 of a Mem5Link ob
b22f0 6a 65 63 74 20 6d 75 73 74 20 62 65 20 61 20 70 ject must be a p
b2300 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 56 65 ower of two. Ve
b2310 72 69 66 79 20 74 68 61 74 0d 0a 20 20 2a 2a 20 rify that.. **
b2320 74 68 69 73 20 69 73 20 63 61 73 65 2e 0d 0a 20 this is case...
b2330 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 28 */.. assert( (
b2340 73 69 7a 65 6f 66 28 4d 65 6d 35 4c 69 6e 6b 29 sizeof(Mem5Link)
b2350 26 28 73 69 7a 65 6f 66 28 4d 65 6d 35 4c 69 6e &(sizeof(Mem5Lin
b2360 6b 29 2d 31 29 29 3d 3d 30 20 29 3b 0d 0a 0d 0a k)-1))==0 );....
b2370 20 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 nByte = sqlite
b2380 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 3GlobalConfig.nH
b2390 65 61 70 3b 0d 0a 20 20 7a 42 79 74 65 20 3d 20 eap;.. zByte =
b23a0 28 75 38 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62 (u8*)sqlite3Glob
b23b0 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3b 0d alConfig.pHeap;.
b23c0 0a 20 20 61 73 73 65 72 74 28 20 7a 42 79 74 65 . assert( zByte
b23d0 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 !=0 ); /* sqlit
b23e0 65 33 5f 63 6f 6e 66 69 67 28 29 20 64 6f 65 73 e3_config() does
b23f0 20 6e 6f 74 20 61 6c 6c 6f 77 20 6f 74 68 65 72 not allow other
b2400 77 69 73 65 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 wise */.... /*
b2410 62 6f 75 6e 64 61 72 69 65 73 20 6f 6e 20 73 71 boundaries on sq
b2420 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
b2430 67 2e 6d 6e 52 65 71 20 61 72 65 20 65 6e 66 6f g.mnReq are enfo
b2440 72 63 65 64 20 69 6e 20 73 71 6c 69 74 65 33 5f rced in sqlite3_
b2450 63 6f 6e 66 69 67 28 29 20 2a 2f 0d 0a 20 20 6e config() */.. n
b2460 4d 69 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79 73 35 MinLog = memsys5
b2470 4c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 Log(sqlite3Globa
b2480 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 29 3b 0d lConfig.mnReq);.
b2490 0a 20 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3d . mem5.szAtom =
b24a0 20 28 31 3c 3c 6e 4d 69 6e 4c 6f 67 29 3b 0d 0a (1<<nMinLog);..
b24b0 20 20 77 68 69 6c 65 28 20 28 69 6e 74 29 73 69 while( (int)si
b24c0 7a 65 6f 66 28 4d 65 6d 35 4c 69 6e 6b 29 3e 6d zeof(Mem5Link)>m
b24d0 65 6d 35 2e 73 7a 41 74 6f 6d 20 29 7b 0d 0a 20 em5.szAtom ){..
b24e0 20 20 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3d mem5.szAtom =
b24f0 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3c 3c 20 mem5.szAtom <<
b2500 31 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 6d 65 6d 1;.. }.... mem
b2510 35 2e 6e 42 6c 6f 63 6b 20 3d 20 28 6e 42 79 74 5.nBlock = (nByt
b2520 65 20 2f 20 28 6d 65 6d 35 2e 73 7a 41 74 6f 6d e / (mem5.szAtom
b2530 2b 73 69 7a 65 6f 66 28 75 38 29 29 29 3b 0d 0a +sizeof(u8)));..
b2540 20 20 6d 65 6d 35 2e 7a 50 6f 6f 6c 20 3d 20 7a mem5.zPool = z
b2550 42 79 74 65 3b 0d 0a 20 20 6d 65 6d 35 2e 61 43 Byte;.. mem5.aC
b2560 74 72 6c 20 3d 20 28 75 38 20 2a 29 26 6d 65 6d trl = (u8 *)&mem
b2570 35 2e 7a 50 6f 6f 6c 5b 6d 65 6d 35 2e 6e 42 6c 5.zPool[mem5.nBl
b2580 6f 63 6b 2a 6d 65 6d 35 2e 73 7a 41 74 6f 6d 5d ock*mem5.szAtom]
b2590 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 69 3d 30 3b ;.... for(ii=0;
b25a0 20 69 69 3c 3d 4c 4f 47 4d 41 58 3b 20 69 69 2b ii<=LOGMAX; ii+
b25b0 2b 29 7b 0d 0a 20 20 20 20 6d 65 6d 35 2e 61 69 +){.. mem5.ai
b25c0 46 72 65 65 6c 69 73 74 5b 69 69 5d 20 3d 20 2d Freelist[ii] = -
b25d0 31 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 4f 66 1;.. }.... iOf
b25e0 66 73 65 74 20 3d 20 30 3b 0d 0a 20 20 66 6f 72 fset = 0;.. for
b25f0 28 69 69 3d 4c 4f 47 4d 41 58 3b 20 69 69 3e 3d (ii=LOGMAX; ii>=
b2600 30 3b 20 69 69 2d 2d 29 7b 0d 0a 20 20 20 20 69 0; ii--){.. i
b2610 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 28 31 3c 3c nt nAlloc = (1<<
b2620 69 69 29 3b 0d 0a 20 20 20 20 69 66 28 20 28 69 ii);.. if( (i
b2630 4f 66 66 73 65 74 2b 6e 41 6c 6c 6f 63 29 3c 3d Offset+nAlloc)<=
b2640 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 7b 0d 0a mem5.nBlock ){..
b2650 20 20 20 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c mem5.aCtrl
b2660 5b 69 4f 66 66 73 65 74 5d 20 3d 20 69 69 20 7c [iOffset] = ii |
b2670 20 43 54 52 4c 5f 46 52 45 45 3b 0d 0a 20 20 20 CTRL_FREE;..
b2680 20 20 20 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 69 memsys5Link(i
b2690 4f 66 66 73 65 74 2c 20 69 69 29 3b 0d 0a 20 20 Offset, ii);..
b26a0 20 20 20 20 69 4f 66 66 73 65 74 20 2b 3d 20 6e iOffset += n
b26b0 41 6c 6c 6f 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 Alloc;.. }..
b26c0 20 20 20 61 73 73 65 72 74 28 28 69 4f 66 66 73 assert((iOffs
b26d0 65 74 2b 6e 41 6c 6c 6f 63 29 3e 6d 65 6d 35 2e et+nAlloc)>mem5.
b26e0 6e 42 6c 6f 63 6b 29 3b 0d 0a 20 20 7d 0d 0a 0d nBlock);.. }...
b26f0 0a 20 20 2f 2a 20 49 66 20 61 20 6d 75 74 65 78 . /* If a mutex
b2700 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 is required for
b2710 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f normal operatio
b2720 6e 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 n, allocate one
b2730 2a 2f 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 */.. if( sqlite
b2740 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 3GlobalConfig.bM
b2750 65 6d 73 74 61 74 3d 3d 30 20 29 7b 0d 0a 20 20 emstat==0 ){..
b2760 20 20 6d 65 6d 35 2e 6d 75 74 65 78 20 3d 20 73 mem5.mutex = s
b2770 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 qlite3MutexAlloc
b2780 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 (SQLITE_MUTEX_ST
b2790 41 54 49 43 5f 4d 45 4d 29 3b 0d 0a 20 20 7d 0d ATIC_MEM);.. }.
b27a0 0a 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 ... return SQLI
b27b0 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d TE_OK;..}..../*.
b27c0 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 .** Deinitialize
b27d0 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0d 0a 2a this module...*
b27e0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d /..static void m
b27f0 65 6d 73 79 73 35 53 68 75 74 64 6f 77 6e 28 76 emsys5Shutdown(v
b2800 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0d 0a oid *NotUsed){..
b2810 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
b2820 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 ER(NotUsed);..
b2830 6d 65 6d 35 2e 6d 75 74 65 78 20 3d 20 30 3b 0d mem5.mutex = 0;.
b2840 0a 20 20 72 65 74 75 72 6e 3b 0d 0a 7d 0d 0a 0d . return;..}...
b2850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
b2860 45 53 54 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 70 65 6e EST../*..** Open
b2870 20 74 68 65 20 66 69 6c 65 20 69 6e 64 69 63 61 the file indica
b2880 74 65 64 20 61 6e 64 20 77 72 69 74 65 20 61 20 ted and write a
b2890 6c 6f 67 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 log of all unfre
b28a0 65 64 20 6d 65 6d 6f 72 79 20 0d 0a 2a 2a 20 61 ed memory ..** a
b28b0 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 74 6f 20 llocations into
b28c0 74 68 61 74 20 6c 6f 67 2e 0d 0a 2a 2f 0d 0a 53 that log...*/..S
b28d0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
b28e0 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 id sqlite3Memsys
b28f0 35 44 75 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 5Dump(const char
b2900 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0d 0a 20 *zFilename){..
b2910 20 46 49 4c 45 20 2a 6f 75 74 3b 0d 0a 20 20 69 FILE *out;.. i
b2920 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0d 0a 20 20 69 nt i, j, n;.. i
b2930 6e 74 20 6e 4d 69 6e 4c 6f 67 3b 0d 0a 0d 0a 20 nt nMinLog;....
b2940 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d if( zFilename==
b2950 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 0 || zFilename[0
b2960 5d 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 6f 75 74 ]==0 ){.. out
b2970 20 3d 20 73 74 64 6f 75 74 3b 0d 0a 20 20 7d 65 = stdout;.. }e
b2980 6c 73 65 7b 0d 0a 20 20 20 20 6f 75 74 20 3d 20 lse{.. out =
b2990 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c fopen(zFilename,
b29a0 20 22 77 22 29 3b 0d 0a 20 20 20 20 69 66 28 20 "w");.. if(
b29b0 6f 75 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 out==0 ){..
b29c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
b29d0 20 22 2a 2a 20 55 6e 61 62 6c 65 20 74 6f 20 6f "** Unable to o
b29e0 75 74 70 75 74 20 6d 65 6d 6f 72 79 20 64 65 62 utput memory deb
b29f0 75 67 20 6f 75 74 70 75 74 20 6c 6f 67 3a 20 25 ug output log: %
b2a00 73 20 2a 2a 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 s **\n",..
b2a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b2a20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 zFilename);..
b2a30 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 return;..
b2a40 7d 0d 0a 20 20 7d 0d 0a 20 20 6d 65 6d 73 79 73 }.. }.. memsys
b2a50 35 45 6e 74 65 72 28 29 3b 0d 0a 20 20 6e 4d 69 5Enter();.. nMi
b2a60 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79 73 35 4c 6f nLog = memsys5Lo
b2a70 67 28 6d 65 6d 35 2e 73 7a 41 74 6f 6d 29 3b 0d g(mem5.szAtom);.
b2a80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 4c . for(i=0; i<=L
b2a90 4f 47 4d 41 58 20 26 26 20 69 2b 6e 4d 69 6e 4c OGMAX && i+nMinL
b2aa0 6f 67 3c 33 32 3b 20 69 2b 2b 29 7b 0d 0a 20 20 og<32; i++){..
b2ab0 20 20 66 6f 72 28 6e 3d 30 2c 20 6a 3d 6d 65 6d for(n=0, j=mem
b2ac0 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 5d 3b 5.aiFreelist[i];
b2ad0 20 6a 3e 3d 30 3b 20 6a 20 3d 20 4d 45 4d 35 4c j>=0; j = MEM5L
b2ae0 49 4e 4b 28 6a 29 2d 3e 6e 65 78 74 2c 20 6e 2b INK(j)->next, n+
b2af0 2b 29 7b 7d 0d 0a 20 20 20 20 66 70 72 69 6e 74 +){}.. fprint
b2b00 66 28 6f 75 74 2c 20 22 66 72 65 65 6c 69 73 74 f(out, "freelist
b2b10 20 69 74 65 6d 73 20 6f 66 20 73 69 7a 65 20 25 items of size %
b2b20 64 3a 20 25 64 5c 6e 22 2c 20 6d 65 6d 35 2e 73 d: %d\n", mem5.s
b2b30 7a 41 74 6f 6d 20 3c 3c 20 69 2c 20 6e 29 3b 0d zAtom << i, n);.
b2b40 0a 20 20 7d 0d 0a 20 20 66 70 72 69 6e 74 66 28 . }.. fprintf(
b2b50 6f 75 74 2c 20 22 6d 65 6d 35 2e 6e 41 6c 6c 6f out, "mem5.nAllo
b2b60 63 20 20 20 20 20 20 20 3d 20 25 6c 6c 75 5c 6e c = %llu\n
b2b70 22 2c 20 6d 65 6d 35 2e 6e 41 6c 6c 6f 63 29 3b ", mem5.nAlloc);
b2b80 0d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c .. fprintf(out,
b2b90 20 22 6d 65 6d 35 2e 74 6f 74 61 6c 41 6c 6c 6f "mem5.totalAllo
b2ba0 63 20 20 20 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d c = %llu\n", m
b2bb0 65 6d 35 2e 74 6f 74 61 6c 41 6c 6c 6f 63 29 3b em5.totalAlloc);
b2bc0 0d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c .. fprintf(out,
b2bd0 20 22 6d 65 6d 35 2e 74 6f 74 61 6c 45 78 63 65 "mem5.totalExce
b2be0 73 73 20 20 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d ss = %llu\n", m
b2bf0 65 6d 35 2e 74 6f 74 61 6c 45 78 63 65 73 73 29 em5.totalExcess)
b2c00 3b 0d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 ;.. fprintf(out
b2c10 2c 20 22 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f , "mem5.currentO
b2c20 75 74 20 20 20 3d 20 25 75 5c 6e 22 2c 20 6d 65 ut = %u\n", me
b2c30 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 29 3b 0d m5.currentOut);.
b2c40 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 . fprintf(out,
b2c50 22 6d 65 6d 35 2e 63 75 72 72 65 6e 74 43 6f 75 "mem5.currentCou
b2c60 6e 74 20 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 nt = %u\n", mem5
b2c70 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 29 3b 0d .currentCount);.
b2c80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 . fprintf(out,
b2c90 22 6d 65 6d 35 2e 6d 61 78 4f 75 74 20 20 20 20 "mem5.maxOut
b2ca0 20 20 20 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 = %u\n", mem5
b2cb0 2e 6d 61 78 4f 75 74 29 3b 0d 0a 20 20 66 70 72 .maxOut);.. fpr
b2cc0 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65 6d 35 2e intf(out, "mem5.
b2cd0 6d 61 78 43 6f 75 6e 74 20 20 20 20 20 3d 20 25 maxCount = %
b2ce0 75 5c 6e 22 2c 20 6d 65 6d 35 2e 6d 61 78 43 6f u\n", mem5.maxCo
b2cf0 75 6e 74 29 3b 0d 0a 20 20 66 70 72 69 6e 74 66 unt);.. fprintf
b2d00 28 6f 75 74 2c 20 22 6d 65 6d 35 2e 6d 61 78 52 (out, "mem5.maxR
b2d10 65 71 75 65 73 74 20 20 20 3d 20 25 75 5c 6e 22 equest = %u\n"
b2d20 2c 20 6d 65 6d 35 2e 6d 61 78 52 65 71 75 65 73 , mem5.maxReques
b2d30 74 29 3b 0d 0a 20 20 6d 65 6d 73 79 73 35 4c 65 t);.. memsys5Le
b2d40 61 76 65 28 29 3b 0d 0a 20 20 69 66 28 20 6f 75 ave();.. if( ou
b2d50 74 3d 3d 73 74 64 6f 75 74 20 29 7b 0d 0a 20 20 t==stdout ){..
b2d60 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 fflush(stdout)
b2d70 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
b2d80 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0d 0a 20 fclose(out);..
b2d90 20 7d 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d }..}..#endif...
b2da0 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ./*..** This rou
b2db0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 tine is the only
b2dc0 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 routine in this
b2dd0 20 66 69 6c 65 20 77 69 74 68 20 65 78 74 65 72 file with exter
b2de0 6e 61 6c 20 0d 0a 2a 2a 20 6c 69 6e 6b 61 67 65 nal ..** linkage
b2df0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 70 . It returns a p
b2e00 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 ointer to a stat
b2e10 69 63 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d ic sqlite3_mem_m
b2e20 65 74 68 6f 64 73 0d 0a 2a 2a 20 73 74 72 75 63 ethods..** struc
b2e30 74 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 t populated with
b2e40 20 74 68 65 20 6d 65 6d 73 79 73 35 20 6d 65 74 the memsys5 met
b2e50 68 6f 64 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 hods...*/..SQLIT
b2e60 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 E_PRIVATE const
b2e70 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
b2e80 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 ods *sqlite3MemG
b2e90 65 74 4d 65 6d 73 79 73 35 28 76 6f 69 64 29 7b etMemsys5(void){
b2ea0 0d 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 .. static const
b2eb0 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 sqlite3_mem_met
b2ec0 68 6f 64 73 20 6d 65 6d 73 79 73 35 4d 65 74 68 hods memsys5Meth
b2ed0 6f 64 73 20 3d 20 7b 0d 0a 20 20 20 20 20 6d 65 ods = {.. me
b2ee0 6d 73 79 73 35 4d 61 6c 6c 6f 63 2c 0d 0a 20 20 msys5Malloc,..
b2ef0 20 20 20 6d 65 6d 73 79 73 35 46 72 65 65 2c 0d memsys5Free,.
b2f00 0a 20 20 20 20 20 6d 65 6d 73 79 73 35 52 65 61 . memsys5Rea
b2f10 6c 6c 6f 63 2c 0d 0a 20 20 20 20 20 6d 65 6d 73 lloc,.. mems
b2f20 79 73 35 53 69 7a 65 2c 0d 0a 20 20 20 20 20 6d ys5Size,.. m
b2f30 65 6d 73 79 73 35 52 6f 75 6e 64 75 70 2c 0d 0a emsys5Roundup,..
b2f40 20 20 20 20 20 6d 65 6d 73 79 73 35 49 6e 69 74 memsys5Init
b2f50 2c 0d 0a 20 20 20 20 20 6d 65 6d 73 79 73 35 53 ,.. memsys5S
b2f60 68 75 74 64 6f 77 6e 2c 0d 0a 20 20 20 20 20 30 hutdown,.. 0
b2f70 0d 0a 20 20 7d 3b 0d 0a 20 20 72 65 74 75 72 6e .. };.. return
b2f80 20 26 6d 65 6d 73 79 73 35 4d 65 74 68 6f 64 73 &memsys5Methods
b2f90 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f ;..}....#endif /
b2fa0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f * SQLITE_ENABLE_
b2fb0 4d 45 4d 53 59 53 35 20 2a 2f 0d 0a 0d 0a 2f 2a MEMSYS5 */..../*
b2fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
b2fd0 64 20 6f 66 20 6d 65 6d 35 2e 63 20 2a 2a 2a 2a d of mem5.c ****
b2fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b2ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b3000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
b3010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 ************** B
b3020 65 67 69 6e 20 66 69 6c 65 20 6d 75 74 65 78 2e egin file mutex.
b3030 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a c **************
b3040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b3050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
b3060 2f 2a 0d 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 /*..** 2007 Augu
b3070 73 74 20 31 34 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 st 14..**..** Th
b3080 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
b3090 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
b30a0 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
b30b0 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
b30c0 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
b30d0 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
b30e0 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
b30f0 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
b3100 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
b3110 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
b3120 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
b3130 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
b3140 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
b3150 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
b3160 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
b3170 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
b3180 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
b3190 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
b31a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b31b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b31c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b31d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a *************..*
b31e0 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
b31f0 61 69 6e 73 20 74 68 65 20 43 20 66 75 6e 63 74 ains the C funct
b3200 69 6f 6e 73 20 74 68 61 74 20 69 6d 70 6c 65 6d ions that implem
b3210 65 6e 74 20 6d 75 74 65 78 65 73 2e 0d 0a 2a 2a ent mutexes...**
b3220 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 ..** This file c
b3230 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 68 61 ontains code tha
b3240 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 61 63 72 6f t is common acro
b3250 73 73 20 61 6c 6c 20 6d 75 74 65 78 20 69 6d 70 ss all mutex imp
b3260 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0d 0a 2a lementations...*
b3270 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 /....#if defined
b3280 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 (SQLITE_DEBUG) &
b3290 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 & !defined(SQLIT
b32a0 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 29 0d 0a 2f E_MUTEX_OMIT)../
b32b0 2a 0d 0a 2a 2a 20 46 6f 72 20 64 65 62 75 67 67 *..** For debugg
b32c0 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 72 65 ing purposes, re
b32d0 63 6f 72 64 20 77 68 65 6e 20 74 68 65 20 6d 75 cord when the mu
b32e0 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 tex subsystem is
b32f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0d 0a 2a 2a initialized..**
b3300 20 61 6e 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a and uninitializ
b3310 65 64 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 ed so that we ca
b3320 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 74 68 n assert() if th
b3330 65 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 ere is an attemp
b3340 74 20 74 6f 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 t to..** allocat
b3350 65 20 61 20 6d 75 74 65 78 20 77 68 69 6c 65 20 e a mutex while
b3360 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 75 6e the system is un
b3370 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0d 0a 2a 2f initialized...*/
b3380 0d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f ..static SQLITE_
b3390 57 53 44 20 69 6e 74 20 6d 75 74 65 78 49 73 49 WSD int mutexIsI
b33a0 6e 69 74 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 nit = 0;..#endif
b33b0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 /* SQLITE_DEBUG
b33c0 20 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 */......#ifndef
b33d0 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 4d SQLITE_MUTEX_OM
b33e0 49 54 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 IT../*..** Initi
b33f0 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 alize the mutex
b3400 73 79 73 74 65 6d 2e 0d 0a 2a 2f 0d 0a 53 51 4c system...*/..SQL
b3410 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
b3420 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 sqlite3MutexInit
b3430 28 76 6f 69 64 29 7b 20 0d 0a 20 20 69 6e 74 20 (void){ .. int
b3440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d rc = SQLITE_OK;.
b3450 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 . if( !sqlite3G
b3460 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 lobalConfig.mute
b3470 78 2e 78 4d 75 74 65 78 41 6c 6c 6f 63 20 29 7b x.xMutexAlloc ){
b3480 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 .. /* If the
b3490 78 4d 75 74 65 78 41 6c 6c 6f 63 20 6d 65 74 68 xMutexAlloc meth
b34a0 6f 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 od has not been
b34b0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 75 73 set, then the us
b34c0 65 72 20 64 69 64 20 6e 6f 74 0d 0a 20 20 20 20 er did not..
b34d0 2a 2a 20 69 6e 73 74 61 6c 6c 20 61 20 6d 75 74 ** install a mut
b34e0 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ex implementatio
b34f0 6e 20 76 69 61 20 73 71 6c 69 74 65 33 5f 63 6f n via sqlite3_co
b3500 6e 66 69 67 28 29 20 70 72 69 6f 72 20 74 6f 20 nfig() prior to
b3510 0d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 .. ** sqlite3
b3520 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 62 65 _initialize() be
b3530 69 6e 67 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 ing called. This
b3540 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 70 6f block copies po
b3550 69 6e 74 65 72 73 20 74 6f 0d 0a 20 20 20 20 2a inters to.. *
b3560 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6d * the default im
b3570 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 plementation int
b3580 6f 20 74 68 65 20 73 71 6c 69 74 65 33 47 6c 6f o the sqlite3Glo
b3590 62 61 6c 43 6f 6e 66 69 67 20 73 74 72 75 63 74 balConfig struct
b35a0 75 72 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 ure... */..
b35b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
b35c0 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 methods const *p
b35d0 46 72 6f 6d 3b 0d 0a 20 20 20 20 73 71 6c 69 74 From;.. sqlit
b35e0 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 e3_mutex_methods
b35f0 20 2a 70 54 6f 20 3d 20 26 73 71 6c 69 74 65 33 *pTo = &sqlite3
b3600 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 GlobalConfig.mut
b3610 65 78 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 73 ex;.... if( s
b3620 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
b3630 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b ig.bCoreMutex ){
b3640 0d 0a 20 20 20 20 20 20 70 46 72 6f 6d 20 3d 20 .. pFrom =
b3650 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 sqlite3DefaultMu
b3660 74 65 78 28 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 tex();.. }els
b3670 65 7b 0d 0a 20 20 20 20 20 20 70 46 72 6f 6d 20 e{.. pFrom
b3680 3d 20 73 71 6c 69 74 65 33 4e 6f 6f 70 4d 75 74 = sqlite3NoopMut
b3690 65 78 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ex();.. }..
b36a0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 memcpy(pTo, pF
b36b0 72 6f 6d 2c 20 6f 66 66 73 65 74 6f 66 28 73 71 rom, offsetof(sq
b36c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 lite3_mutex_meth
b36d0 6f 64 73 2c 20 78 4d 75 74 65 78 41 6c 6c 6f 63 ods, xMutexAlloc
b36e0 29 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 ));.. memcpy(
b36f0 26 70 54 6f 2d 3e 78 4d 75 74 65 78 46 72 65 65 &pTo->xMutexFree
b3700 2c 20 26 70 46 72 6f 6d 2d 3e 78 4d 75 74 65 78 , &pFrom->xMutex
b3710 46 72 65 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 Free,..
b3720 20 20 73 69 7a 65 6f 66 28 2a 70 54 6f 29 20 2d sizeof(*pTo) -
b3730 20 6f 66 66 73 65 74 6f 66 28 73 71 6c 69 74 65 offsetof(sqlite
b3740 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2c 3_mutex_methods,
b3750 20 78 4d 75 74 65 78 46 72 65 65 29 29 3b 0d 0a xMutexFree));..
b3760 20 20 20 20 70 54 6f 2d 3e 78 4d 75 74 65 78 41 pTo->xMutexA
b3770 6c 6c 6f 63 20 3d 20 70 46 72 6f 6d 2d 3e 78 4d lloc = pFrom->xM
b3780 75 74 65 78 41 6c 6c 6f 63 3b 0d 0a 20 20 7d 0d utexAlloc;.. }.
b3790 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 47 . rc = sqlite3G
b37a0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 lobalConfig.mute
b37b0 78 2e 78 4d 75 74 65 78 49 6e 69 74 28 29 3b 0d x.xMutexInit();.
b37c0 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
b37d0 5f 44 45 42 55 47 0d 0a 20 20 47 4c 4f 42 41 4c _DEBUG.. GLOBAL
b37e0 28 69 6e 74 2c 20 6d 75 74 65 78 49 73 49 6e 69 (int, mutexIsIni
b37f0 74 29 20 3d 20 31 3b 0d 0a 23 65 6e 64 69 66 0d t) = 1;..#endif.
b3800 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ... return rc;.
b3810 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 68 75 .}..../*..** Shu
b3820 74 64 6f 77 6e 20 74 68 65 20 6d 75 74 65 78 20 tdown the mutex
b3830 73 79 73 74 65 6d 2e 20 54 68 69 73 20 63 61 6c system. This cal
b3840 6c 20 66 72 65 65 73 20 72 65 73 6f 75 72 63 65 l frees resource
b3850 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0d 0a s allocated by..
b3860 2a 2a 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 ** sqlite3MutexI
b3870 6e 69 74 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 nit()...*/..SQLI
b3880 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
b3890 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 76 qlite3MutexEnd(v
b38a0 6f 69 64 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 oid){.. int rc
b38b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
b38c0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 if( sqlite3Globa
b38d0 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d lConfig.mutex.xM
b38e0 75 74 65 78 45 6e 64 20 29 7b 0d 0a 20 20 20 20 utexEnd ){..
b38f0 72 63 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 rc = sqlite3Glob
b3900 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 alConfig.mutex.x
b3910 4d 75 74 65 78 45 6e 64 28 29 3b 0d 0a 20 20 7d MutexEnd();.. }
b3920 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ....#ifdef SQLIT
b3930 45 5f 44 45 42 55 47 0d 0a 20 20 47 4c 4f 42 41 E_DEBUG.. GLOBA
b3940 4c 28 69 6e 74 2c 20 6d 75 74 65 78 49 73 49 6e L(int, mutexIsIn
b3950 69 74 29 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 it) = 0;..#endif
b3960 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b .... return rc;
b3970 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
b3980 74 72 69 65 76 65 20 61 20 70 6f 69 6e 74 65 72 trieve a pointer
b3990 20 74 6f 20 61 20 73 74 61 74 69 63 20 6d 75 74 to a static mut
b39a0 65 78 20 6f 72 20 61 6c 6c 6f 63 61 74 65 20 61 ex or allocate a
b39b0 20 6e 65 77 20 64 79 6e 61 6d 69 63 20 6f 6e 65 new dynamic one
b39c0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
b39d0 49 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 I sqlite3_mutex
b39e0 2a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 *sqlite3_mutex_a
b39f0 6c 6c 6f 63 28 69 6e 74 20 69 64 29 7b 0d 0a 23 lloc(int id){..#
b3a00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
b3a10 49 54 5f 41 55 54 4f 49 4e 49 54 0d 0a 20 20 69 IT_AUTOINIT.. i
b3a20 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 f( sqlite3_initi
b3a30 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e alize() ) return
b3a40 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 72 0;..#endif.. r
b3a50 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 6c 6f eturn sqlite3Glo
b3a60 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e balConfig.mutex.
b3a70 78 4d 75 74 65 78 41 6c 6c 6f 63 28 69 64 29 3b xMutexAlloc(id);
b3a80 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 ..}....SQLITE_PR
b3a90 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 6d 75 IVATE sqlite3_mu
b3aa0 74 65 78 20 2a 73 71 6c 69 74 65 33 4d 75 74 65 tex *sqlite3Mute
b3ab0 78 41 6c 6c 6f 63 28 69 6e 74 20 69 64 29 7b 0d xAlloc(int id){.
b3ac0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 . if( !sqlite3G
b3ad0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 lobalConfig.bCor
b3ae0 65 4d 75 74 65 78 20 29 7b 0d 0a 20 20 20 20 72 eMutex ){.. r
b3af0 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
b3b00 20 61 73 73 65 72 74 28 20 47 4c 4f 42 41 4c 28 assert( GLOBAL(
b3b10 69 6e 74 2c 20 6d 75 74 65 78 49 73 49 6e 69 74 int, mutexIsInit
b3b20 29 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 73 ) );.. return s
b3b30 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
b3b40 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 41 ig.mutex.xMutexA
b3b50 6c 6c 6f 63 28 69 64 29 3b 0d 0a 7d 0d 0a 0d 0a lloc(id);..}....
b3b60 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 61 20 64 79 /*..** Free a dy
b3b70 6e 61 6d 69 63 20 6d 75 74 65 78 2e 0d 0a 2a 2f namic mutex...*/
b3b80 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 ..SQLITE_API voi
b3b90 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f d sqlite3_mutex_
b3ba0 66 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 free(sqlite3_mut
b3bb0 65 78 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 70 ex *p){.. if( p
b3bc0 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 ){.. sqlite3
b3bd0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 GlobalConfig.mut
b3be0 65 78 2e 78 4d 75 74 65 78 46 72 65 65 28 70 29 ex.xMutexFree(p)
b3bf0 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d ;.. }..}..../*.
b3c00 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 6d .** Obtain the m
b3c10 75 74 65 78 20 70 2e 20 49 66 20 73 6f 6d 65 20 utex p. If some
b3c20 6f 74 68 65 72 20 74 68 72 65 61 64 20 61 6c 72 other thread alr
b3c30 65 61 64 79 20 68 61 73 20 74 68 65 20 6d 75 74 eady has the mut
b3c40 65 78 2c 20 62 6c 6f 63 6b 0d 0a 2a 2a 20 75 6e ex, block..** un
b3c50 74 69 6c 20 69 74 20 63 61 6e 20 62 65 20 6f 62 til it can be ob
b3c60 74 61 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c tained...*/..SQL
b3c70 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c ITE_API void sql
b3c80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 ite3_mutex_enter
b3c90 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a (sqlite3_mutex *
b3ca0 70 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d p){.. if( p ){.
b3cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 . sqlite3Glob
b3cc0 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 alConfig.mutex.x
b3cd0 4d 75 74 65 78 45 6e 74 65 72 28 70 29 3b 0d 0a MutexEnter(p);..
b3ce0 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
b3cf0 20 4f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 Obtain the mute
b3d00 78 20 70 2e 20 49 66 20 73 75 63 63 65 73 73 66 x p. If successf
b3d10 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ul, return SQLIT
b3d20 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c E_OK. Otherwise,
b3d30 20 69 66 20 61 6e 6f 74 68 65 72 0d 0a 2a 2a 20 if another..**
b3d40 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68 65 thread holds the
b3d50 20 6d 75 74 65 78 20 61 6e 64 20 69 74 20 63 61 mutex and it ca
b3d60 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 nnot be obtained
b3d70 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
b3d80 42 55 53 59 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 BUSY...*/..SQLIT
b3d90 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
b3da0 33 5f 6d 75 74 65 78 5f 74 72 79 28 73 71 6c 69 3_mutex_try(sqli
b3db0 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a te3_mutex *p){..
b3dc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
b3dd0 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 70 20 29 E_OK;.. if( p )
b3de0 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 {.. return sq
b3df0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
b3e00 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 54 72 g.mutex.xMutexTr
b3e10 79 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 y(p);.. }.. re
b3e20 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
b3e30 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 *..** The sqlite
b3e40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 29 20 3_mutex_leave()
b3e50 72 6f 75 74 69 6e 65 20 65 78 69 74 73 20 61 20 routine exits a
b3e60 6d 75 74 65 78 20 74 68 61 74 20 77 61 73 20 70 mutex that was p
b3e70 72 65 76 69 6f 75 73 6c 79 0d 0a 2a 2a 20 65 6e reviously..** en
b3e80 74 65 72 65 64 20 62 79 20 74 68 65 20 73 61 6d tered by the sam
b3e90 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 62 e thread. The b
b3ea0 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65 66 ehavior is undef
b3eb0 69 6e 65 64 20 69 66 20 74 68 65 20 6d 75 74 65 ined if the mute
b3ec0 78 20 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75 x ..** is not cu
b3ed0 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64 2e rrently entered.
b3ee0 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 If a NULL point
b3ef0 65 72 20 69 73 20 70 61 73 73 65 64 20 61 73 20 er is passed as
b3f00 61 6e 20 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 an argument..**
b3f10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 this function is
b3f20 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 53 a no-op...*/..S
b3f30 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 QLITE_API void s
b3f40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
b3f50 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 ve(sqlite3_mutex
b3f60 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 *p){.. if( p )
b3f70 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c {.. sqlite3Gl
b3f80 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 obalConfig.mutex
b3f90 2e 78 4d 75 74 65 78 4c 65 61 76 65 28 70 29 3b .xMutexLeave(p);
b3fa0 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e .. }..}....#ifn
b3fb0 64 65 66 20 4e 44 45 42 55 47 0d 0a 2f 2a 0d 0a def NDEBUG../*..
b3fc0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d ** The sqlite3_m
b3fd0 75 74 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20 utex_held() and
b3fe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f sqlite3_mutex_no
b3ff0 74 68 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20 theld() routine
b4000 61 72 65 0d 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 are..** intended
b4010 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65 20 for use inside
b4020 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 assert() stateme
b4030 6e 74 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 nts...*/..SQLITE
b4040 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
b4050 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 _mutex_held(sqli
b4060 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a te3_mutex *p){..
b4070 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c return p==0 ||
b4080 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
b4090 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 nfig.mutex.xMute
b40a0 78 48 65 6c 64 28 70 29 3b 0d 0a 7d 0d 0a 53 51 xHeld(p);..}..SQ
b40b0 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
b40c0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 ite3_mutex_nothe
b40d0 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 ld(sqlite3_mutex
b40e0 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 *p){.. return
b40f0 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 p==0 || sqlite3G
b4100 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 lobalConfig.mute
b4110 78 2e 78 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 x.xMutexNotheld(
b4120 70 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a p);..}..#endif..
b4130 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 ..#endif /* !def
b4140 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 55 54 45 ined(SQLITE_MUTE
b4150 58 5f 4f 4d 49 54 29 20 2a 2f 0d 0a 0d 0a 2f 2a X_OMIT) */..../*
b4160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
b4170 64 20 6f 66 20 6d 75 74 65 78 2e 63 20 2a 2a 2a d of mutex.c ***
b4180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b4190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b41a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
b41b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 ************** B
b41c0 65 67 69 6e 20 66 69 6c 65 20 6d 75 74 65 78 5f egin file mutex_
b41d0 6e 6f 6f 70 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a noop.c *********
b41e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b41f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
b4200 2f 2a 0d 0a 2a 2a 20 32 30 30 38 20 4f 63 74 6f /*..** 2008 Octo
b4210 62 65 72 20 30 37 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ber 07..**..** T
b4220 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 he author discla
b4230 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f ims copyright to
b4240 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 this source cod
b4250 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d e. In place of.
b4260 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 .** a legal noti
b4270 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c ce, here is a bl
b4280 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 essing:..**..**
b4290 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f May you do go
b42a0 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e od and not evil.
b42b0 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
b42c0 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 find forgiveness
b42d0 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e for yourself an
b42e0 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 d forgive others
b42f0 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
b4300 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e share freely, n
b4310 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 ever taking more
b4320 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d than you give..
b4330 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .**..***********
b4340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b4350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b4360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b4370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a **************..
b4380 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e ** This file con
b4390 74 61 69 6e 73 20 74 68 65 20 43 20 66 75 6e 63 tains the C func
b43a0 74 69 6f 6e 73 20 74 68 61 74 20 69 6d 70 6c 65 tions that imple
b43b0 6d 65 6e 74 20 6d 75 74 65 78 65 73 2e 0d 0a 2a ment mutexes...*
b43c0 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 *..** This imple
b43d0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 69 mentation in thi
b43e0 73 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 s file does not
b43f0 70 72 6f 76 69 64 65 20 61 6e 79 20 6d 75 74 75 provide any mutu
b4400 61 6c 0d 0a 2a 2a 20 65 78 63 6c 75 73 69 6f 6e al..** exclusion
b4410 20 61 6e 64 20 69 73 20 74 68 75 73 20 73 75 69 and is thus sui
b4420 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 6f 6e table for use on
b4430 6c 79 20 69 6e 20 61 70 70 6c 69 63 61 74 69 6f ly in applicatio
b4440 6e 73 0d 0a 2a 2a 20 74 68 61 74 20 75 73 65 20 ns..** that use
b4450 53 51 4c 69 74 65 20 69 6e 20 61 20 73 69 6e 67 SQLite in a sing
b4460 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 le thread. The
b4470 72 6f 75 74 69 6e 65 73 20 64 65 66 69 6e 65 64 routines defined
b4480 0d 0a 2a 2a 20 68 65 72 65 20 61 72 65 20 70 6c ..** here are pl
b4490 61 63 65 2d 68 6f 6c 64 65 72 73 2e 20 20 41 70 ace-holders. Ap
b44a0 70 6c 69 63 61 74 69 6f 6e 73 20 63 61 6e 20 73 plications can s
b44b0 75 62 73 74 69 74 75 74 65 20 77 6f 72 6b 69 6e ubstitute workin
b44c0 67 0d 0a 2a 2a 20 6d 75 74 65 78 20 72 6f 75 74 g..** mutex rout
b44d0 69 6e 65 73 20 61 74 20 73 74 61 72 74 2d 74 69 ines at start-ti
b44e0 6d 65 20 75 73 69 6e 67 20 74 68 65 0d 0a 2a 2a me using the..**
b44f0 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 ..** sqlite3
b4500 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 _config(SQLITE_C
b4510 4f 4e 46 49 47 5f 4d 55 54 45 58 2c 2e 2e 2e 29 ONFIG_MUTEX,...)
b4520 0d 0a 2a 2a 0d 0a 2a 2a 20 69 6e 74 65 72 66 61 ..**..** interfa
b4530 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 63 ce...**..** If c
b4540 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c ompiled with SQL
b4550 49 54 45 5f 44 45 42 55 47 2c 20 74 68 65 6e 20 ITE_DEBUG, then
b4560 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 67 69 63 additional logic
b4570 20 69 73 20 69 6e 73 65 72 74 65 64 0d 0a 2a 2a is inserted..**
b4580 20 74 68 61 74 20 64 6f 65 73 20 65 72 72 6f 72 that does error
b4590 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6d 75 74 checking on mut
b45a0 65 78 65 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 exes to make sur
b45b0 65 20 74 68 65 79 20 61 72 65 20 62 65 69 6e 67 e they are being
b45c0 0d 0a 2a 2a 20 63 61 6c 6c 65 64 20 63 6f 72 72 ..** called corr
b45d0 65 63 74 6c 79 2e 0d 0a 2a 2f 0d 0a 0d 0a 23 69 ectly...*/....#i
b45e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 fndef SQLITE_MUT
b45f0 45 58 5f 4f 4d 49 54 0d 0a 0d 0a 23 69 66 6e 64 EX_OMIT....#ifnd
b4600 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
b4610 0a 2f 2a 0d 0a 2a 2a 20 53 74 75 62 20 72 6f 75 ./*..** Stub rou
b4620 74 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 6d 75 tines for all mu
b4630 74 65 78 20 6d 65 74 68 6f 64 73 2e 0d 0a 2a 2a tex methods...**
b4640 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
b4650 65 73 20 70 72 6f 76 69 64 65 20 6e 6f 20 6d 75 es provide no mu
b4660 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 6f tual exclusion o
b4670 72 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 r error checking
b4680 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
b4690 74 20 6e 6f 6f 70 4d 75 74 65 78 49 6e 69 74 28 t noopMutexInit(
b46a0 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 void){ return SQ
b46b0 4c 49 54 45 5f 4f 4b 3b 20 7d 0d 0a 73 74 61 74 LITE_OK; }..stat
b46c0 69 63 20 69 6e 74 20 6e 6f 6f 70 4d 75 74 65 78 ic int noopMutex
b46d0 45 6e 64 28 76 6f 69 64 29 7b 20 72 65 74 75 72 End(void){ retur
b46e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0d 0a n SQLITE_OK; }..
b46f0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d static sqlite3_m
b4700 75 74 65 78 20 2a 6e 6f 6f 70 4d 75 74 65 78 41 utex *noopMutexA
b4710 6c 6c 6f 63 28 69 6e 74 20 69 64 29 7b 20 0d 0a lloc(int id){ ..
b4720 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
b4730 45 52 28 69 64 29 3b 0d 0a 20 20 72 65 74 75 72 ER(id);.. retur
b4740 6e 20 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 n (sqlite3_mutex
b4750 2a 29 38 3b 20 0d 0a 7d 0d 0a 73 74 61 74 69 63 *)8; ..}..static
b4760 20 76 6f 69 64 20 6e 6f 6f 70 4d 75 74 65 78 46 void noopMutexF
b4770 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 ree(sqlite3_mute
b4780 78 20 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 x *p){ UNUSED_PA
b4790 52 41 4d 45 54 45 52 28 70 29 3b 20 72 65 74 75 RAMETER(p); retu
b47a0 72 6e 3b 20 7d 0d 0a 73 74 61 74 69 63 20 76 6f rn; }..static vo
b47b0 69 64 20 6e 6f 6f 70 4d 75 74 65 78 45 6e 74 65 id noopMutexEnte
b47c0 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 r(sqlite3_mutex
b47d0 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41 *p){ UNUSED_PARA
b47e0 4d 45 54 45 52 28 70 29 3b 20 72 65 74 75 72 6e METER(p); return
b47f0 3b 20 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 ; }..static int
b4800 6e 6f 6f 70 4d 75 74 65 78 54 72 79 28 73 71 6c noopMutexTry(sql
b4810 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d ite3_mutex *p){.
b4820 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
b4830 54 45 52 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 TER(p);.. retur
b4840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
b4850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f .static void noo
b4860 70 4d 75 74 65 78 4c 65 61 76 65 28 73 71 6c 69 pMutexLeave(sqli
b4870 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 20 55 te3_mutex *p){ U
b4880 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
b4890 70 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0d 0a 0d p); return; }...
b48a0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
b48b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 sqlite3_mutex_me
b48c0 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 73 71 6c thods const *sql
b48d0 69 74 65 33 4e 6f 6f 70 4d 75 74 65 78 28 76 6f ite3NoopMutex(vo
b48e0 69 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 63 id){.. static c
b48f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 onst sqlite3_mut
b4900 65 78 5f 6d 65 74 68 6f 64 73 20 73 4d 75 74 65 ex_methods sMute
b4910 78 20 3d 20 7b 0d 0a 20 20 20 20 6e 6f 6f 70 4d x = {.. noopM
b4920 75 74 65 78 49 6e 69 74 2c 0d 0a 20 20 20 20 6e utexInit,.. n
b4930 6f 6f 70 4d 75 74 65 78 45 6e 64 2c 0d 0a 20 20 oopMutexEnd,..
b4940 20 20 6e 6f 6f 70 4d 75 74 65 78 41 6c 6c 6f 63 noopMutexAlloc
b4950 2c 0d 0a 20 20 20 20 6e 6f 6f 70 4d 75 74 65 78 ,.. noopMutex
b4960 46 72 65 65 2c 0d 0a 20 20 20 20 6e 6f 6f 70 4d Free,.. noopM
b4970 75 74 65 78 45 6e 74 65 72 2c 0d 0a 20 20 20 20 utexEnter,..
b4980 6e 6f 6f 70 4d 75 74 65 78 54 72 79 2c 0d 0a 20 noopMutexTry,..
b4990 20 20 20 6e 6f 6f 70 4d 75 74 65 78 4c 65 61 76 noopMutexLeav
b49a0 65 2c 0d 0a 0d 0a 20 20 20 20 30 2c 0d 0a 20 20 e,.... 0,..
b49b0 20 20 30 2c 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20 20 0,.. };....
b49c0 72 65 74 75 72 6e 20 26 73 4d 75 74 65 78 3b 0d return &sMutex;.
b49d0 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 .}..#endif /* !S
b49e0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0d 0a QLITE_DEBUG */..
b49f0 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
b4a00 44 45 42 55 47 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e DEBUG../*..** In
b4a10 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 this implementa
b4a20 74 69 6f 6e 2c 20 65 72 72 6f 72 20 63 68 65 63 tion, error chec
b4a30 6b 69 6e 67 20 69 73 20 70 72 6f 76 69 64 65 64 king is provided
b4a40 20 66 6f 72 20 74 65 73 74 69 6e 67 0d 0a 2a 2a for testing..**
b4a50 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 70 and debugging p
b4a60 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 6d 75 urposes. The mu
b4a70 74 65 78 65 73 20 73 74 69 6c 6c 20 64 6f 20 6e texes still do n
b4a80 6f 74 20 70 72 6f 76 69 64 65 20 61 6e 79 0d 0a ot provide any..
b4a90 2a 2a 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 ** mutual exclus
b4aa0 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a ion...*/..../*..
b4ab0 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 62 6a ** The mutex obj
b4ac0 65 63 74 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 ect..*/..typedef
b4ad0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f struct sqlite3_
b4ae0 64 65 62 75 67 5f 6d 75 74 65 78 20 7b 0d 0a 20 debug_mutex {..
b4af0 20 69 6e 74 20 69 64 3b 20 20 20 20 20 2f 2a 20 int id; /*
b4b00 54 68 65 20 6d 75 74 65 78 20 74 79 70 65 20 2a The mutex type *
b4b10 2f 0d 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 /.. int cnt;
b4b20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e /* Number of en
b4b30 74 72 69 65 73 20 77 69 74 68 6f 75 74 20 61 20 tries without a
b4b40 6d 61 74 63 68 69 6e 67 20 6c 65 61 76 65 20 2a matching leave *
b4b50 2f 0d 0a 7d 20 73 71 6c 69 74 65 33 5f 64 65 62 /..} sqlite3_deb
b4b60 75 67 5f 6d 75 74 65 78 3b 0d 0a 0d 0a 2f 2a 0d ug_mutex;..../*.
b4b70 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f .** The sqlite3_
b4b80 6d 75 74 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 mutex_held() and
b4b90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e sqlite3_mutex_n
b4ba0 6f 74 68 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 otheld() routine
b4bb0 20 61 72 65 0d 0a 2a 2a 20 69 6e 74 65 6e 64 65 are..** intende
b4bc0 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65 d for use inside
b4bd0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d assert() statem
b4be0 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ents...*/..stati
b4bf0 63 20 69 6e 74 20 64 65 62 75 67 4d 75 74 65 78 c int debugMutex
b4c00 48 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 Held(sqlite3_mut
b4c10 65 78 20 2a 70 58 29 7b 0d 0a 20 20 73 71 6c 69 ex *pX){.. sqli
b4c20 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 20 te3_debug_mutex
b4c30 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 64 65 *p = (sqlite3_de
b4c40 62 75 67 5f 6d 75 74 65 78 2a 29 70 58 3b 0d 0a bug_mutex*)pX;..
b4c50 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c return p==0 ||
b4c60 20 70 2d 3e 63 6e 74 3e 30 3b 0d 0a 7d 0d 0a 73 p->cnt>0;..}..s
b4c70 74 61 74 69 63 20 69 6e 74 20 64 65 62 75 67 4d tatic int debugM
b4c80 75 74 65 78 4e 6f 74 68 65 6c 64 28 73 71 6c 69 utexNotheld(sqli
b4c90 74 65 33 5f 6d 75 74 65 78 20 2a 70 58 29 7b 0d te3_mutex *pX){.
b4ca0 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 62 75 67 . sqlite3_debug
b4cb0 5f 6d 75 74 65 78 20 2a 70 20 3d 20 28 73 71 6c _mutex *p = (sql
b4cc0 69 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 ite3_debug_mutex
b4cd0 2a 29 70 58 3b 0d 0a 20 20 72 65 74 75 72 6e 20 *)pX;.. return
b4ce0 70 3d 3d 30 20 7c 7c 20 70 2d 3e 63 6e 74 3d 3d p==0 || p->cnt==
b4cf0 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0;..}..../*..**
b4d00 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 Initialize and d
b4d10 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 einitialize the
b4d20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2e mutex subsystem.
b4d30 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
b4d40 20 64 65 62 75 67 4d 75 74 65 78 49 6e 69 74 28 debugMutexInit(
b4d50 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 void){ return SQ
b4d60 4c 49 54 45 5f 4f 4b 3b 20 7d 0d 0a 73 74 61 74 LITE_OK; }..stat
b4d70 69 63 20 69 6e 74 20 64 65 62 75 67 4d 75 74 65 ic int debugMute
b4d80 78 45 6e 64 28 76 6f 69 64 29 7b 20 72 65 74 75 xEnd(void){ retu
b4d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0d rn SQLITE_OK; }.
b4da0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 .../*..** The sq
b4db0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f lite3_mutex_allo
b4dc0 63 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f c() routine allo
b4dd0 63 61 74 65 73 20 61 20 6e 65 77 0d 0a 2a 2a 20 cates a new..**
b4de0 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e mutex and return
b4df0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 s a pointer to i
b4e00 74 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e t. If it return
b4e10 73 20 4e 55 4c 4c 0d 0a 2a 2a 20 74 68 61 74 20 s NULL..** that
b4e20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 75 74 means that a mut
b4e30 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ex could not be
b4e40 61 6c 6c 6f 63 61 74 65 64 2e 20 0d 0a 2a 2f 0d allocated. ..*/.
b4e50 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f .static sqlite3_
b4e60 6d 75 74 65 78 20 2a 64 65 62 75 67 4d 75 74 65 mutex *debugMute
b4e70 78 41 6c 6c 6f 63 28 69 6e 74 20 69 64 29 7b 0d xAlloc(int id){.
b4e80 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 . static sqlite
b4e90 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 20 61 53 3_debug_mutex aS
b4ea0 74 61 74 69 63 5b 36 5d 3b 0d 0a 20 20 73 71 6c tatic[6];.. sql
b4eb0 69 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 ite3_debug_mutex
b4ec0 20 2a 70 4e 65 77 20 3d 20 30 3b 0d 0a 20 20 73 *pNew = 0;.. s
b4ed0 77 69 74 63 68 28 20 69 64 20 29 7b 0d 0a 20 20 witch( id ){..
b4ee0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 case SQLITE_MU
b4ef0 54 45 58 5f 46 41 53 54 3a 0d 0a 20 20 20 20 63 TEX_FAST:.. c
b4f00 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 ase SQLITE_MUTEX
b4f10 5f 52 45 43 55 52 53 49 56 45 3a 20 7b 0d 0a 20 _RECURSIVE: {..
b4f20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 pNew = sqli
b4f30 74 65 33 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 te3Malloc(sizeof
b4f40 28 2a 70 4e 65 77 29 29 3b 0d 0a 20 20 20 20 20 (*pNew));..
b4f50 20 69 66 28 20 70 4e 65 77 20 29 7b 0d 0a 20 20 if( pNew ){..
b4f60 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d pNew->id =
b4f70 20 69 64 3b 0d 0a 20 20 20 20 20 20 20 20 70 4e id;.. pN
b4f80 65 77 2d 3e 63 6e 74 20 3d 20 30 3b 0d 0a 20 20 ew->cnt = 0;..
b4f90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 65 }.. bre
b4fa0 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ak;.. }..
b4fb0 64 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 20 20 default: {..
b4fc0 20 20 61 73 73 65 72 74 28 20 69 64 2d 32 20 3e assert( id-2 >
b4fd0 3d 20 30 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 = 0 );.. as
b4fe0 73 65 72 74 28 20 69 64 2d 32 20 3c 20 28 69 6e sert( id-2 < (in
b4ff0 74 29 28 73 69 7a 65 6f 66 28 61 53 74 61 74 69 t)(sizeof(aStati
b5000 63 29 2f 73 69 7a 65 6f 66 28 61 53 74 61 74 69 c)/sizeof(aStati
b5010 63 5b 30 5d 29 29 20 29 3b 0d 0a 20 20 20 20 20 c[0])) );..
b5020 20 70 4e 65 77 20 3d 20 26 61 53 74 61 74 69 63 pNew = &aStatic
b5030 5b 69 64 2d 32 5d 3b 0d 0a 20 20 20 20 20 20 70 [id-2];.. p
b5040 4e 65 77 2d 3e 69 64 20 3d 20 69 64 3b 0d 0a 20 New->id = id;..
b5050 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 break;..
b5060 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 }.. }.. retur
b5070 6e 20 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 n (sqlite3_mutex
b5080 2a 29 70 4e 65 77 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a *)pNew;..}..../*
b5090 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
b50a0 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 e deallocates a
b50b0 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 previously alloc
b50c0 61 74 65 64 20 6d 75 74 65 78 2e 0d 0a 2a 2f 0d ated mutex...*/.
b50d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 62 .static void deb
b50e0 75 67 4d 75 74 65 78 46 72 65 65 28 73 71 6c 69 ugMutexFree(sqli
b50f0 74 65 33 5f 6d 75 74 65 78 20 2a 70 58 29 7b 0d te3_mutex *pX){.
b5100 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 62 75 67 . sqlite3_debug
b5110 5f 6d 75 74 65 78 20 2a 70 20 3d 20 28 73 71 6c _mutex *p = (sql
b5120 69 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 ite3_debug_mutex
b5130 2a 29 70 58 3b 0d 0a 20 20 61 73 73 65 72 74 28 *)pX;.. assert(
b5140 20 70 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0d 0a 20 p->cnt==0 );..
b5150 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d assert( p->id==
b5160 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 SQLITE_MUTEX_FAS
b5170 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 T || p->id==SQLI
b5180 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 TE_MUTEX_RECURSI
b5190 56 45 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 VE );.. sqlite3
b51a0 5f 66 72 65 65 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a _free(p);..}....
b51b0 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 /*..** The sqlit
b51c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 e3_mutex_enter()
b51d0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 and sqlite3_mut
b51e0 65 78 5f 74 72 79 28 29 20 72 6f 75 74 69 6e 65 ex_try() routine
b51f0 73 20 61 74 74 65 6d 70 74 0d 0a 2a 2a 20 74 6f s attempt..** to
b5200 20 65 6e 74 65 72 20 61 20 6d 75 74 65 78 2e 20 enter a mutex.
b5210 20 49 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 If another thre
b5220 61 64 20 69 73 20 61 6c 72 65 61 64 79 20 77 69 ad is already wi
b5230 74 68 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 0d thin the mutex,.
b5240 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .** sqlite3_mute
b5250 78 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c 20 62 x_enter() will b
b5260 6c 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74 65 33 lock and sqlite3
b5270 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 77 69 6c _mutex_try() wil
b5280 6c 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 53 51 4c l return..** SQL
b5290 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 20 73 ITE_BUSY. The s
b52a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 qlite3_mutex_try
b52b0 28 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 () interface ret
b52c0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a urns SQLITE_OK..
b52d0 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65 73 73 66 ** upon successf
b52e0 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75 74 65 78 ul entry. Mutex
b52f0 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 es created using
b5300 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 SQLITE_MUTEX_RE
b5310 43 55 52 53 49 56 45 20 63 61 6e 0d 0a 2a 2a 20 CURSIVE can..**
b5320 62 65 20 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 be entered multi
b5330 70 6c 65 20 74 69 6d 65 73 20 62 79 20 74 68 65 ple times by the
b5340 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 49 same thread. I
b5350 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 n such cases the
b5360 2c 0d 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 ,..** mutex must
b5370 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 65 71 be exited an eq
b5380 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 ual number of ti
b5390 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f 74 68 mes before anoth
b53a0 65 72 20 74 68 72 65 61 64 0d 0a 2a 2a 20 63 61 er thread..** ca
b53b0 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68 65 n enter. If the
b53c0 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72 69 same thread tri
b53d0 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79 20 es to enter any
b53e0 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75 other kind of mu
b53f0 74 65 78 0d 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 tex..** more tha
b5400 6e 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61 n once, the beha
b5410 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 vior is undefine
b5420 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 d...*/..static v
b5430 6f 69 64 20 64 65 62 75 67 4d 75 74 65 78 45 6e oid debugMutexEn
b5440 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 ter(sqlite3_mute
b5450 78 20 2a 70 58 29 7b 0d 0a 20 20 73 71 6c 69 74 x *pX){.. sqlit
b5460 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 20 2a e3_debug_mutex *
b5470 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 64 65 62 p = (sqlite3_deb
b5480 75 67 5f 6d 75 74 65 78 2a 29 70 58 3b 0d 0a 20 ug_mutex*)pX;..
b5490 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d assert( p->id==
b54a0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
b54b0 55 52 53 49 56 45 20 7c 7c 20 64 65 62 75 67 4d URSIVE || debugM
b54c0 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 58 29 20 utexNotheld(pX)
b54d0 29 3b 0d 0a 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0d );.. p->cnt++;.
b54e0 0a 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 .}..static int d
b54f0 65 62 75 67 4d 75 74 65 78 54 72 79 28 73 71 6c ebugMutexTry(sql
b5500 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 58 29 7b ite3_mutex *pX){
b5510 0d 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 62 75 .. sqlite3_debu
b5520 67 5f 6d 75 74 65 78 20 2a 70 20 3d 20 28 73 71 g_mutex *p = (sq
b5530 6c 69 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 lite3_debug_mute
b5540 78 2a 29 70 58 3b 0d 0a 20 20 61 73 73 65 72 74 x*)pX;.. assert
b5550 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f ( p->id==SQLITE_
b5560 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 MUTEX_RECURSIVE
b5570 7c 7c 20 64 65 62 75 67 4d 75 74 65 78 4e 6f 74 || debugMutexNot
b5580 68 65 6c 64 28 70 58 29 20 29 3b 0d 0a 20 20 70 held(pX) );.. p
b5590 2d 3e 63 6e 74 2b 2b 3b 0d 0a 20 20 72 65 74 75 ->cnt++;.. retu
b55a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
b55b0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 ..../*..** The s
b55c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
b55d0 76 65 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 ve() routine exi
b55e0 74 73 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 ts a mutex that
b55f0 77 61 73 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 was..** previous
b5600 6c 79 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 ly entered by th
b5610 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 e same thread.
b5620 54 68 65 20 62 65 68 61 76 69 6f 72 0d 0a 2a 2a The behavior..**
b5630 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 66 is undefined if
b5640 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 6e 6f the mutex is no
b5650 74 20 63 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 t currently ente
b5660 72 65 64 20 6f 72 0d 0a 2a 2a 20 69 73 20 6e 6f red or..** is no
b5670 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f t currently allo
b5680 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65 20 77 cated. SQLite w
b5690 69 6c 6c 20 6e 65 76 65 72 20 64 6f 20 65 69 74 ill never do eit
b56a0 68 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 her...*/..static
b56b0 20 76 6f 69 64 20 64 65 62 75 67 4d 75 74 65 78 void debugMutex
b56c0 4c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 Leave(sqlite3_mu
b56d0 74 65 78 20 2a 70 58 29 7b 0d 0a 20 20 73 71 6c tex *pX){.. sql
b56e0 69 74 65 33 5f 64 65 62 75 67 5f 6d 75 74 65 78 ite3_debug_mutex
b56f0 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 64 *p = (sqlite3_d
b5700 65 62 75 67 5f 6d 75 74 65 78 2a 29 70 58 3b 0d ebug_mutex*)pX;.
b5710 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 . assert( debug
b5720 4d 75 74 65 78 48 65 6c 64 28 70 58 29 20 29 3b MutexHeld(pX) );
b5730 0d 0a 20 20 70 2d 3e 63 6e 74 2d 2d 3b 0d 0a 20 .. p->cnt--;..
b5740 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d assert( p->id==
b5750 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
b5760 55 52 53 49 56 45 20 7c 7c 20 64 65 62 75 67 4d URSIVE || debugM
b5770 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 58 29 20 utexNotheld(pX)
b5780 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f );..}....SQLITE_
b5790 50 52 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f PRIVATE sqlite3_
b57a0 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 63 6f mutex_methods co
b57b0 6e 73 74 20 2a 73 71 6c 69 74 65 33 4e 6f 6f 70 nst *sqlite3Noop
b57c0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 20 Mutex(void){..
b57d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c static const sql
b57e0 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f ite3_mutex_metho
b57f0 64 73 20 73 4d 75 74 65 78 20 3d 20 7b 0d 0a 20 ds sMutex = {..
b5800 20 20 20 64 65 62 75 67 4d 75 74 65 78 49 6e 69 debugMutexIni
b5810 74 2c 0d 0a 20 20 20 20 64 65 62 75 67 4d 75 74 t,.. debugMut
b5820 65 78 45 6e 64 2c 0d 0a 20 20 20 20 64 65 62 75 exEnd,.. debu
b5830 67 4d 75 74 65 78 41 6c 6c 6f 63 2c 0d 0a 20 20 gMutexAlloc,..
b5840 20 20 64 65 62 75 67 4d 75 74 65 78 46 72 65 65 debugMutexFree
b5850 2c 0d 0a 20 20 20 20 64 65 62 75 67 4d 75 74 65 ,.. debugMute
b5860 78 45 6e 74 65 72 2c 0d 0a 20 20 20 20 64 65 62 xEnter,.. deb
b5870 75 67 4d 75 74 65 78 54 72 79 2c 0d 0a 20 20 20 ugMutexTry,..
b5880 20 64 65 62 75 67 4d 75 74 65 78 4c 65 61 76 65 debugMutexLeave
b5890 2c 0d 0a 0d 0a 20 20 20 20 64 65 62 75 67 4d 75 ,.... debugMu
b58a0 74 65 78 48 65 6c 64 2c 0d 0a 20 20 20 20 64 65 texHeld,.. de
b58b0 62 75 67 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0d bugMutexNotheld.
b58c0 0a 20 20 7d 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 . };.... retur
b58d0 6e 20 26 73 4d 75 74 65 78 3b 0d 0a 7d 0d 0a 23 n &sMutex;..}..#
b58e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
b58f0 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a DEBUG */..../*..
b5900 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 ** If compiled w
b5910 69 74 68 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 ith SQLITE_MUTEX
b5920 5f 4e 4f 4f 50 2c 20 74 68 65 6e 20 74 68 65 20 _NOOP, then the
b5930 6e 6f 2d 6f 70 20 6d 75 74 65 78 20 69 6d 70 6c no-op mutex impl
b5940 65 6d 65 6e 74 61 74 69 6f 6e 0d 0a 2a 2a 20 69 ementation..** i
b5950 73 20 75 73 65 64 20 72 65 67 61 72 64 6c 65 73 s used regardles
b5960 73 20 6f 66 20 74 68 65 20 72 75 6e 2d 74 69 6d s of the run-tim
b5970 65 20 74 68 72 65 61 64 73 61 66 65 74 79 20 73 e threadsafety s
b5980 65 74 74 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 69 66 etting...*/..#if
b5990 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 def SQLITE_MUTEX
b59a0 5f 4e 4f 4f 50 0d 0a 53 51 4c 49 54 45 5f 50 52 _NOOP..SQLITE_PR
b59b0 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 6d 75 IVATE sqlite3_mu
b59c0 74 65 78 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 tex_methods cons
b59d0 74 20 2a 73 71 6c 69 74 65 33 44 65 66 61 75 6c t *sqlite3Defaul
b59e0 74 4d 75 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 tMutex(void){..
b59f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4e return sqlite3N
b5a00 6f 6f 70 4d 75 74 65 78 28 29 3b 0d 0a 7d 0d 0a oopMutex();..}..
b5a10 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 #endif /* define
b5a20 64 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e d(SQLITE_MUTEX_N
b5a30 4f 4f 50 29 20 2a 2f 0d 0a 23 65 6e 64 69 66 20 OOP) */..#endif
b5a40 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 /* !defined(SQLI
b5a50 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 29 20 2a TE_MUTEX_OMIT) *
b5a60 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
b5a70 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6d 75 74 65 **** End of mute
b5a80 78 5f 6e 6f 6f 70 2e 63 20 2a 2a 2a 2a 2a 2a 2a x_noop.c *******
b5a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5ab0 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
b5ac0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 ***** Begin file
b5ad0 20 6d 75 74 65 78 5f 6f 73 32 2e 63 20 2a 2a 2a mutex_os2.c ***
b5ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5b00 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 ****/../*..** 20
b5b10 30 37 20 41 75 67 75 73 74 20 32 38 0d 0a 2a 2a 07 August 28..**
b5b20 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 ..** The author
b5b30 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 disclaims copyri
b5b40 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 ght to this sour
b5b50 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 ce code. In pla
b5b60 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 ce of..** a lega
b5b70 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 l notice, here i
b5b80 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a s a blessing:..*
b5b90 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 *..** May you
b5ba0 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 do good and not
b5bb0 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 evil...** Ma
b5bc0 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 y you find forgi
b5bd0 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 veness for yours
b5be0 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 elf and forgive
b5bf0 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d others...** M
b5c00 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 ay you share fre
b5c10 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e ely, never takin
b5c20 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 g more than you
b5c30 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a give...**..*****
b5c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5c80 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 ****..** This fi
b5c90 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 le contains the
b5ca0 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 C functions that
b5cb0 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 implement mutex
b5cc0 65 73 20 66 6f 72 20 4f 53 2f 32 0d 0a 2a 2f 0d es for OS/2..*/.
b5cd0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 63 6f .../*..** The co
b5ce0 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 de in this file
b5cf0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 is only used if
b5d00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 53 32 SQLITE_MUTEX_OS2
b5d10 20 69 73 20 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a is defined...**
b5d20 20 53 65 65 20 74 68 65 20 6d 75 74 65 78 2e 68 See the mutex.h
b5d30 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c file for detail
b5d40 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 s...*/..#ifdef S
b5d50 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 53 32 0d QLITE_MUTEX_OS2.
b5d60 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
b5d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4f 53 2f 32 20 ********** OS/2
b5d80 4d 75 74 65 78 20 49 6d 70 6c 65 6d 65 6e 74 61 Mutex Implementa
b5d90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a tion ***********
b5da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d ***********..**.
b5db0 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 .** This impleme
b5dc0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 75 74 65 78 ntation of mutex
b5dd0 65 73 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e es is built usin
b5de0 67 20 74 68 65 20 4f 53 2f 32 20 41 50 49 2e 0d g the OS/2 API..
b5df0 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 .*/..../*..** Th
b5e00 65 20 6d 75 74 65 78 20 6f 62 6a 65 63 74 0d 0a e mutex object..
b5e10 2a 2a 20 45 61 63 68 20 72 65 63 75 72 73 69 76 ** Each recursiv
b5e20 65 20 6d 75 74 65 78 20 69 73 20 61 6e 20 69 6e e mutex is an in
b5e30 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f stance of the fo
b5e40 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 llowing structur
b5e50 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 73 e...*/..struct s
b5e60 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 7b 0d 0a qlite3_mutex {..
b5e70 20 20 48 4d 54 58 20 6d 75 74 65 78 3b 20 20 20 HMTX mutex;
b5e80 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e /* Mutex con
b5e90 74 72 6f 6c 6c 69 6e 67 20 74 68 65 20 6c 6f 63 trolling the loc
b5ea0 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 20 69 64 3b k */.. int id;
b5eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 /* Mut
b5ec0 65 78 20 74 79 70 65 20 2a 2f 0d 0a 23 69 66 64 ex type */..#ifd
b5ed0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
b5ee0 0a 20 69 6e 74 20 20 20 74 72 61 63 65 3b 20 20 . int trace;
b5ef0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 /* True to
b5f00 74 72 61 63 65 20 63 68 61 6e 67 65 73 20 2a 2f trace changes */
b5f10 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a ..#endif..};....
b5f20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
b5f30 42 55 47 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c BUG..#define SQL
b5f40 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 ITE3_MUTEX_INITI
b5f50 41 4c 49 5a 45 52 20 7b 20 30 2c 20 30 2c 20 30 ALIZER { 0, 0, 0
b5f60 20 7d 0d 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 }..#else..#defi
b5f70 6e 65 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 ne SQLITE3_MUTEX
b5f80 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7b 20 30 _INITIALIZER { 0
b5f90 2c 20 30 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d , 0 }..#endif...
b5fa0 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 ./*..** Initiali
b5fb0 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c ze and deinitial
b5fc0 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 ize the mutex su
b5fd0 62 73 79 73 74 65 6d 2e 0d 0a 2a 2f 0d 0a 73 74 bsystem...*/..st
b5fe0 61 74 69 63 20 69 6e 74 20 6f 73 32 4d 75 74 65 atic int os2Mute
b5ff0 78 49 6e 69 74 28 76 6f 69 64 29 7b 20 72 65 74 xInit(void){ ret
b6000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d urn SQLITE_OK; }
b6010 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 ..static int os2
b6020 4d 75 74 65 78 45 6e 64 28 76 6f 69 64 29 7b 20 MutexEnd(void){
b6030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
b6040 3b 20 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ; }..../*..** Th
b6050 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f e sqlite3_mutex_
b6060 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65 20 alloc() routine
b6070 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0d allocates a new.
b6080 0a 2a 2a 20 6d 75 74 65 78 20 61 6e 64 20 72 65 .** mutex and re
b6090 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 turns a pointer
b60a0 74 6f 20 69 74 2e 20 20 49 66 20 69 74 20 72 65 to it. If it re
b60b0 74 75 72 6e 73 20 4e 55 4c 4c 0d 0a 2a 2a 20 74 turns NULL..** t
b60c0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 hat means that a
b60d0 20 6d 75 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74 mutex could not
b60e0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0d be allocated. .
b60f0 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 .** SQLite will
b6100 75 6e 77 69 6e 64 20 69 74 73 20 73 74 61 63 6b unwind its stack
b6110 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 and return an e
b6120 72 72 6f 72 2e 20 20 54 68 65 20 61 72 67 75 6d rror. The argum
b6130 65 6e 74 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 ent..** to sqlit
b6140 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 e3_mutex_alloc()
b6150 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 is one of these
b6160 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e integer constan
b6170 74 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e ts:..**..** <ul>
b6180 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 ..** <li> SQLIT
b6190 45 5f 4d 55 54 45 58 5f 46 41 53 54 0d 0a 2a 2a E_MUTEX_FAST..**
b61a0 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 <li> SQLITE_MU
b61b0 54 45 58 5f 52 45 43 55 52 53 49 56 45 0d 0a 2a TEX_RECURSIVE..*
b61c0 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d * <li> SQLITE_M
b61d0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 UTEX_STATIC_MAST
b61e0 45 52 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c ER..** <li> SQL
b61f0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 ITE_MUTEX_STATIC
b6200 5f 4d 45 4d 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 _MEM..** <li> S
b6210 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 QLITE_MUTEX_STAT
b6220 49 43 5f 4d 45 4d 32 0d 0a 2a 2a 20 3c 6c 69 3e IC_MEM2..** <li>
b6230 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 SQLITE_MUTEX_S
b6240 54 41 54 49 43 5f 50 52 4e 47 0d 0a 2a 2a 20 3c TATIC_PRNG..** <
b6250 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 li> SQLITE_MUTE
b6260 58 5f 53 54 41 54 49 43 5f 4c 52 55 0d 0a 2a 2a X_STATIC_LRU..**
b6270 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 <li> SQLITE_MU
b6280 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 32 0d TEX_STATIC_LRU2.
b6290 0a 2a 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a .** </ul>..**..*
b62a0 2a 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 * The first two
b62b0 63 6f 6e 73 74 61 6e 74 73 20 63 61 75 73 65 20 constants cause
b62c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c sqlite3_mutex_al
b62d0 6c 6f 63 28 29 20 74 6f 20 63 72 65 61 74 65 0d loc() to create.
b62e0 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74 65 78 2e .** a new mutex.
b62f0 20 20 54 68 65 20 6e 65 77 20 6d 75 74 65 78 20 The new mutex
b6300 69 73 20 72 65 63 75 72 73 69 76 65 20 77 68 65 is recursive whe
b6310 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 n SQLITE_MUTEX_R
b6320 45 43 55 52 53 49 56 45 0d 0a 2a 2a 20 69 73 20 ECURSIVE..** is
b6330 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e 65 63 used but not nec
b6340 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68 65 6e essarily so when
b6350 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 SQLITE_MUTEX_FA
b6360 53 54 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2a 20 ST is used...**
b6370 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d The mutex implem
b6380 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f entation does no
b6390 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 t need to make a
b63a0 20 64 69 73 74 69 6e 63 74 69 6f 6e 0d 0a 2a 2a distinction..**
b63b0 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f between SQLITE_
b63c0 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 MUTEX_RECURSIVE
b63d0 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 and SQLITE_MUTEX
b63e0 5f 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 _FAST if it does
b63f0 0d 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f ..** not want to
b6400 2e 20 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 . But SQLite wi
b6410 6c 6c 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 ll only request
b6420 61 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 a recursive mute
b6430 78 20 69 6e 0d 0a 2a 2a 20 63 61 73 65 73 20 77 x in..** cases w
b6440 68 65 72 65 20 69 74 20 72 65 61 6c 6c 79 20 6e here it really n
b6450 65 65 64 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 eeds one. If a
b6460 66 61 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 faster non-recur
b6470 73 69 76 65 20 6d 75 74 65 78 0d 0a 2a 2a 20 69 sive mutex..** i
b6480 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 mplementation is
b6490 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 available on th
b64a0 65 20 68 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c e host platform,
b64b0 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 the mutex subsy
b64c0 73 74 65 6d 0d 0a 2a 2a 20 6d 69 67 68 74 20 72 stem..** might r
b64d0 65 74 75 72 6e 20 73 75 63 68 20 61 20 6d 75 74 eturn such a mut
b64e0 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 ex in response t
b64f0 6f 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 o SQLITE_MUTEX_F
b6500 41 53 54 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 AST...**..** The
b6510 20 6f 74 68 65 72 20 61 6c 6c 6f 77 65 64 20 70 other allowed p
b6520 61 72 61 6d 65 74 65 72 73 20 74 6f 20 73 71 6c arameters to sql
b6530 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 ite3_mutex_alloc
b6540 28 29 20 65 61 63 68 20 72 65 74 75 72 6e 0d 0a () each return..
b6550 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ** a pointer to
b6560 61 20 73 74 61 74 69 63 20 70 72 65 65 78 69 73 a static preexis
b6570 74 69 6e 67 20 6d 75 74 65 78 2e 20 20 53 69 78 ting mutex. Six
b6580 20 73 74 61 74 69 63 20 6d 75 74 65 78 65 73 20 static mutexes
b6590 61 72 65 0d 0a 2a 2a 20 75 73 65 64 20 62 79 20 are..** used by
b65a0 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 the current vers
b65b0 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 ion of SQLite.
b65c0 46 75 74 75 72 65 20 76 65 72 73 69 6f 6e 73 20 Future versions
b65d0 6f 66 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 6d 61 of SQLite..** ma
b65e0 79 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c y add additional
b65f0 20 73 74 61 74 69 63 20 6d 75 74 65 78 65 73 2e static mutexes.
b6600 20 20 53 74 61 74 69 63 20 6d 75 74 65 78 65 73 Static mutexes
b6610 20 61 72 65 20 66 6f 72 20 69 6e 74 65 72 6e 61 are for interna
b6620 6c 0d 0a 2a 2a 20 75 73 65 20 62 79 20 53 51 4c l..** use by SQL
b6630 69 74 65 20 6f 6e 6c 79 2e 20 20 41 70 70 6c 69 ite only. Appli
b6640 63 61 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 cations that use
b6650 20 53 51 4c 69 74 65 20 6d 75 74 65 78 65 73 20 SQLite mutexes
b6660 73 68 6f 75 6c 64 0d 0a 2a 2a 20 75 73 65 20 6f should..** use o
b6670 6e 6c 79 20 74 68 65 20 64 79 6e 61 6d 69 63 20 nly the dynamic
b6680 6d 75 74 65 78 65 73 20 72 65 74 75 72 6e 65 64 mutexes returned
b6690 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 by SQLITE_MUTEX
b66a0 5f 46 41 53 54 20 6f 72 0d 0a 2a 2a 20 53 51 4c _FAST or..** SQL
b66b0 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 ITE_MUTEX_RECURS
b66c0 49 56 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 IVE...**..** Not
b66d0 65 20 74 68 61 74 20 69 66 20 6f 6e 65 20 6f 66 e that if one of
b66e0 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6d 75 74 the dynamic mut
b66f0 65 78 20 70 61 72 61 6d 65 74 65 72 73 20 28 53 ex parameters (S
b6700 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 QLITE_MUTEX_FAST
b6710 0d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4d ..** or SQLITE_M
b6720 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 20 UTEX_RECURSIVE)
b6730 69 73 20 75 73 65 64 20 74 68 65 6e 20 73 71 6c is used then sql
b6740 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 ite3_mutex_alloc
b6750 28 29 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 ()..** returns a
b6760 20 64 69 66 66 65 72 65 6e 74 20 6d 75 74 65 78 different mutex
b6770 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20 on every call.
b6780 20 42 75 74 20 66 6f 72 20 74 68 65 20 73 74 61 But for the sta
b6790 74 69 63 0d 0a 2a 2a 20 6d 75 74 65 78 20 74 79 tic..** mutex ty
b67a0 70 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75 pes, the same mu
b67b0 74 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 20 tex is returned
b67c0 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68 on every call th
b67d0 61 74 20 68 61 73 0d 0a 2a 2a 20 74 68 65 20 73 at has..** the s
b67e0 61 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e ame type number.
b67f0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 71 6c ..*/..static sql
b6800 69 74 65 33 5f 6d 75 74 65 78 20 2a 6f 73 32 4d ite3_mutex *os2M
b6810 75 74 65 78 41 6c 6c 6f 63 28 69 6e 74 20 69 54 utexAlloc(int iT
b6820 79 70 65 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 ype){.. sqlite3
b6830 5f 6d 75 74 65 78 20 2a 70 20 3d 20 4e 55 4c 4c _mutex *p = NULL
b6840 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 69 54 79 ;.. switch( iTy
b6850 70 65 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 pe ){.. case
b6860 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 SQLITE_MUTEX_FAS
b6870 54 3a 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c T:.. case SQL
b6880 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 ITE_MUTEX_RECURS
b6890 49 56 45 3a 20 7b 0d 0a 20 20 20 20 20 20 70 20 IVE: {.. p
b68a0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a = sqlite3MallocZ
b68b0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 ero( sizeof(*p)
b68c0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 20 );.. if( p
b68d0 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 ){.. p->i
b68e0 64 20 3d 20 69 54 79 70 65 3b 0d 0a 20 20 20 20 d = iType;..
b68f0 20 20 20 20 69 66 28 20 44 6f 73 43 72 65 61 74 if( DosCreat
b6900 65 4d 75 74 65 78 53 65 6d 28 20 30 2c 20 26 70 eMutexSem( 0, &p
b6910 2d 3e 6d 75 74 65 78 2c 20 30 2c 20 46 41 4c 53 ->mutex, 0, FALS
b6920 45 20 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 E ) != NO_ERROR
b6930 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){.. sq
b6940 6c 69 74 65 33 5f 66 72 65 65 28 20 70 20 29 3b lite3_free( p );
b6950 0d 0a 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 .. p =
b6960 4e 55 4c 4c 3b 0d 0a 20 20 20 20 20 20 20 20 7d NULL;.. }
b6970 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
b6980 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a break;.. }..
b6990 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a default: {..
b69a0 20 20 20 20 20 20 73 74 61 74 69 63 20 76 6f 6c static vol
b69b0 61 74 69 6c 65 20 69 6e 74 20 69 73 49 6e 69 74 atile int isInit
b69c0 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 73 74 61 = 0;.. sta
b69d0 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 tic sqlite3_mute
b69e0 78 20 73 74 61 74 69 63 4d 75 74 65 78 65 73 5b x staticMutexes[
b69f0 36 5d 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20 20 6] = {..
b6a00 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e SQLITE3_MUTEX_IN
b6a10 49 54 49 41 4c 49 5a 45 52 2c 0d 0a 20 20 20 20 ITIALIZER,..
b6a20 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 SQLITE3_MUTE
b6a30 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0d 0a X_INITIALIZER,..
b6a40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 33 5f SQLITE3_
b6a50 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 MUTEX_INITIALIZE
b6a60 52 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 R,.. SQLI
b6a70 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 TE3_MUTEX_INITIA
b6a80 4c 49 5a 45 52 2c 0d 0a 20 20 20 20 20 20 20 20 LIZER,..
b6a90 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e SQLITE3_MUTEX_IN
b6aa0 49 54 49 41 4c 49 5a 45 52 2c 0d 0a 20 20 20 20 ITIALIZER,..
b6ab0 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 SQLITE3_MUTE
b6ac0 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0d 0a X_INITIALIZER,..
b6ad0 20 20 20 20 20 20 7d 3b 0d 0a 20 20 20 20 20 20 };..
b6ae0 69 66 20 28 20 21 69 73 49 6e 69 74 20 29 7b 0d if ( !isInit ){.
b6af0 0a 20 20 20 20 20 20 20 20 41 50 49 52 45 54 20 . APIRET
b6b00 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 50 54 49 rc;.. PTI
b6b10 42 20 70 74 69 62 3b 0d 0a 20 20 20 20 20 20 20 B ptib;..
b6b20 20 50 50 49 42 20 70 70 69 62 3b 0d 0a 20 20 20 PPIB ppib;..
b6b30 20 20 20 20 20 48 4d 54 58 20 6d 75 74 65 78 3b HMTX mutex;
b6b40 0d 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 6e .. char n
b6b50 61 6d 65 5b 33 32 5d 3b 0d 0a 20 20 20 20 20 20 ame[32];..
b6b60 20 20 44 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63 DosGetInfoBloc
b6b70 6b 73 28 20 26 70 74 69 62 2c 20 26 70 70 69 62 ks( &ptib, &ppib
b6b80 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c );.. sql
b6b90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 20 73 ite3_snprintf( s
b6ba0 69 7a 65 6f 66 28 6e 61 6d 65 29 2c 20 6e 61 6d izeof(name), nam
b6bb0 65 2c 20 22 5c 5c 53 45 4d 33 32 5c 5c 53 51 4c e, "\\SEM32\\SQL
b6bc0 49 54 45 25 30 34 78 22 2c 0d 0a 20 20 20 20 20 ITE%04x",..
b6bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b6be0 20 20 20 20 20 70 70 69 62 2d 3e 70 69 62 5f 75 ppib->pib_u
b6bf0 6c 70 69 64 20 29 3b 0d 0a 20 20 20 20 20 20 20 lpid );..
b6c00 20 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 while( !isInit
b6c10 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6d 75 ){.. mu
b6c20 74 65 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 tex = 0;..
b6c30 20 20 20 20 72 63 20 3d 20 44 6f 73 43 72 65 61 rc = DosCrea
b6c40 74 65 4d 75 74 65 78 53 65 6d 28 20 6e 61 6d 65 teMutexSem( name
b6c50 2c 20 26 6d 75 74 65 78 2c 20 30 2c 20 46 41 4c , &mutex, 0, FAL
b6c60 53 45 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 SE);..
b6c70 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 if( rc == NO_ERR
b6c80 4f 52 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 OR ){..
b6c90 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
b6ca0 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 i;..
b6cb0 69 66 28 20 21 69 73 49 6e 69 74 20 29 7b 0d 0a if( !isInit ){..
b6cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f fo
b6cd0 72 28 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 69 r( i = 0; i < si
b6ce0 7a 65 6f 66 28 73 74 61 74 69 63 4d 75 74 65 78 zeof(staticMutex
b6cf0 65 73 29 2f 73 69 7a 65 6f 66 28 73 74 61 74 69 es)/sizeof(stati
b6d00 63 4d 75 74 65 78 65 73 5b 30 5d 29 3b 20 69 2b cMutexes[0]); i+
b6d10 2b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 + ){..
b6d20 20 20 20 20 20 20 44 6f 73 43 72 65 61 74 65 4d DosCreateM
b6d30 75 74 65 78 53 65 6d 28 20 30 2c 20 26 73 74 61 utexSem( 0, &sta
b6d40 74 69 63 4d 75 74 65 78 65 73 5b 69 5d 2e 6d 75 ticMutexes[i].mu
b6d50 74 65 78 2c 20 30 2c 20 46 41 4c 53 45 20 29 3b tex, 0, FALSE );
b6d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
b6d70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 }..
b6d80 20 69 73 49 6e 69 74 20 3d 20 31 3b 0d 0a 20 20 isInit = 1;..
b6d90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 }..
b6da0 20 20 20 20 20 20 20 20 20 44 6f 73 43 6c 6f 73 DosClos
b6db0 65 4d 75 74 65 78 53 65 6d 28 20 6d 75 74 65 78 eMutexSem( mutex
b6dc0 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d );.. }
b6dd0 65 6c 73 65 20 69 66 28 20 72 63 20 3d 3d 20 45 else if( rc == E
b6de0 52 52 4f 52 5f 44 55 50 4c 49 43 41 54 45 5f 4e RROR_DUPLICATE_N
b6df0 41 4d 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 AME ){..
b6e00 20 20 20 20 44 6f 73 53 6c 65 65 70 28 20 31 20 DosSleep( 1
b6e10 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 );.. }e
b6e20 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
b6e30 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 20 20 20 return p;..
b6e40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
b6e50 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 }.. }..
b6e60 20 20 20 20 61 73 73 65 72 74 28 20 69 54 79 70 assert( iTyp
b6e70 65 2d 32 20 3e 3d 20 30 20 29 3b 0d 0a 20 20 20 e-2 >= 0 );..
b6e80 20 20 20 61 73 73 65 72 74 28 20 69 54 79 70 65 assert( iType
b6e90 2d 32 20 3c 20 73 69 7a 65 6f 66 28 73 74 61 74 -2 < sizeof(stat
b6ea0 69 63 4d 75 74 65 78 65 73 29 2f 73 69 7a 65 6f icMutexes)/sizeo
b6eb0 66 28 73 74 61 74 69 63 4d 75 74 65 78 65 73 5b f(staticMutexes[
b6ec0 30 5d 29 20 29 3b 0d 0a 20 20 20 20 20 20 70 20 0]) );.. p
b6ed0 3d 20 26 73 74 61 74 69 63 4d 75 74 65 78 65 73 = &staticMutexes
b6ee0 5b 69 54 79 70 65 2d 32 5d 3b 0d 0a 20 20 20 20 [iType-2];..
b6ef0 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b p->id = iType;
b6f00 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a .. break;..
b6f10 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 }.. }.. re
b6f20 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a turn p;..}......
b6f30 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 /*..** This rout
b6f40 69 6e 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 ine deallocates
b6f50 61 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c a previously all
b6f60 6f 63 61 74 65 64 20 6d 75 74 65 78 2e 0d 0a 2a ocated mutex...*
b6f70 2a 20 53 51 4c 69 74 65 20 69 73 20 63 61 72 65 * SQLite is care
b6f80 66 75 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 ful to deallocat
b6f90 65 20 65 76 65 72 79 20 6d 75 74 65 78 20 74 68 e every mutex th
b6fa0 61 74 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 2e at it allocates.
b6fb0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
b6fc0 64 20 6f 73 32 4d 75 74 65 78 46 72 65 65 28 73 d os2MutexFree(s
b6fd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 qlite3_mutex *p)
b6fe0 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 {..#ifdef SQLITE
b6ff0 5f 44 45 42 55 47 0d 0a 20 20 54 49 44 20 74 69 _DEBUG.. TID ti
b7000 64 3b 0d 0a 20 20 50 49 44 20 70 69 64 3b 0d 0a d;.. PID pid;..
b7010 20 20 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 3b ULONG ulCount;
b7020 0d 0a 20 20 44 6f 73 51 75 65 72 79 4d 75 74 65 .. DosQueryMute
b7030 78 53 65 6d 28 70 2d 3e 6d 75 74 65 78 2c 20 26 xSem(p->mutex, &
b7040 70 69 64 2c 20 26 74 69 64 2c 20 26 75 6c 43 6f pid, &tid, &ulCo
b7050 75 6e 74 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 unt);.. assert(
b7060 20 75 6c 43 6f 75 6e 74 3d 3d 30 20 29 3b 0d 0a ulCount==0 );..
b7070 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d assert( p->id=
b7080 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 =SQLITE_MUTEX_FA
b7090 53 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c ST || p->id==SQL
b70a0 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 ITE_MUTEX_RECURS
b70b0 49 56 45 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a IVE );..#endif..
b70c0 20 20 44 6f 73 43 6c 6f 73 65 4d 75 74 65 78 53 DosCloseMutexS
b70d0 65 6d 28 20 70 2d 3e 6d 75 74 65 78 20 29 3b 0d em( p->mutex );.
b70e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 . sqlite3_free(
b70f0 20 70 20 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 64 p );..}....#ifd
b7100 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
b7110 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 ./*..** The sqli
b7120 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 te3_mutex_held()
b7130 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 and sqlite3_mut
b7140 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75 ex_notheld() rou
b7150 74 69 6e 65 20 61 72 65 0d 0a 2a 2a 20 69 6e 74 tine are..** int
b7160 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e ended for use in
b7170 73 69 64 65 20 61 73 73 65 72 74 28 29 20 73 74 side assert() st
b7180 61 74 65 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 atements...*/..s
b7190 74 61 74 69 63 20 69 6e 74 20 6f 73 32 4d 75 74 tatic int os2Mut
b71a0 65 78 48 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d exHeld(sqlite3_m
b71b0 75 74 65 78 20 2a 70 29 7b 0d 0a 20 20 54 49 44 utex *p){.. TID
b71c0 20 74 69 64 3b 0d 0a 20 20 50 49 44 20 70 69 64 tid;.. PID pid
b71d0 3b 0d 0a 20 20 55 4c 4f 4e 47 20 75 6c 43 6f 75 ;.. ULONG ulCou
b71e0 6e 74 3b 0d 0a 20 20 50 54 49 42 20 70 74 69 62 nt;.. PTIB ptib
b71f0 3b 0d 0a 20 20 44 6f 73 51 75 65 72 79 4d 75 74 ;.. DosQueryMut
b7200 65 78 53 65 6d 28 70 2d 3e 6d 75 74 65 78 2c 20 exSem(p->mutex,
b7210 26 70 69 64 2c 20 26 74 69 64 2c 20 26 75 6c 43 &pid, &tid, &ulC
b7220 6f 75 6e 74 29 3b 0d 0a 20 20 69 66 28 20 75 6c ount);.. if( ul
b7230 43 6f 75 6e 74 3d 3d 30 20 7c 7c 20 28 20 75 6c Count==0 || ( ul
b7240 43 6f 75 6e 74 3e 31 20 26 26 20 70 2d 3e 69 64 Count>1 && p->id
b7250 21 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 !=SQLITE_MUTEX_R
b7260 45 43 55 52 53 49 56 45 20 29 20 29 0d 0a 20 20 ECURSIVE ) )..
b7270 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 44 return 0;.. D
b7280 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63 6b 73 28 osGetInfoBlocks(
b7290 26 70 74 69 62 2c 20 4e 55 4c 4c 29 3b 0d 0a 20 &ptib, NULL);..
b72a0 20 72 65 74 75 72 6e 20 74 69 64 3d 3d 70 74 69 return tid==pti
b72b0 62 2d 3e 74 69 62 5f 70 74 69 62 32 2d 3e 74 69 b->tib_ptib2->ti
b72c0 62 32 5f 75 6c 74 69 64 3b 0d 0a 7d 0d 0a 73 74 b2_ultid;..}..st
b72d0 61 74 69 63 20 69 6e 74 20 6f 73 32 4d 75 74 65 atic int os2Mute
b72e0 78 4e 6f 74 68 65 6c 64 28 73 71 6c 69 74 65 33 xNotheld(sqlite3
b72f0 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a 20 20 54 _mutex *p){.. T
b7300 49 44 20 74 69 64 3b 0d 0a 20 20 50 49 44 20 70 ID tid;.. PID p
b7310 69 64 3b 0d 0a 20 20 55 4c 4f 4e 47 20 75 6c 43 id;.. ULONG ulC
b7320 6f 75 6e 74 3b 0d 0a 20 20 50 54 49 42 20 70 74 ount;.. PTIB pt
b7330 69 62 3b 0d 0a 20 20 44 6f 73 51 75 65 72 79 4d ib;.. DosQueryM
b7340 75 74 65 78 53 65 6d 28 70 2d 3e 6d 75 74 65 78 utexSem(p->mutex
b7350 2c 20 26 70 69 64 2c 20 26 74 69 64 2c 20 26 75 , &pid, &tid, &u
b7360 6c 43 6f 75 6e 74 29 3b 0d 0a 20 20 69 66 28 20 lCount);.. if(
b7370 75 6c 43 6f 75 6e 74 3d 3d 30 20 29 0d 0a 20 20 ulCount==0 )..
b7380 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 44 return 1;.. D
b7390 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63 6b 73 28 osGetInfoBlocks(
b73a0 26 70 74 69 62 2c 20 4e 55 4c 4c 29 3b 0d 0a 20 &ptib, NULL);..
b73b0 20 72 65 74 75 72 6e 20 74 69 64 21 3d 70 74 69 return tid!=pti
b73c0 62 2d 3e 74 69 62 5f 70 74 69 62 32 2d 3e 74 69 b->tib_ptib2->ti
b73d0 62 32 5f 75 6c 74 69 64 3b 0d 0a 7d 0d 0a 73 74 b2_ultid;..}..st
b73e0 61 74 69 63 20 76 6f 69 64 20 6f 73 32 4d 75 74 atic void os2Mut
b73f0 65 78 54 72 61 63 65 28 73 71 6c 69 74 65 33 5f exTrace(sqlite3_
b7400 6d 75 74 65 78 20 2a 70 2c 20 63 68 61 72 20 2a mutex *p, char *
b7410 70 41 63 74 69 6f 6e 29 7b 0d 0a 20 20 54 49 44 pAction){.. TID
b7420 20 20 20 74 69 64 3b 0d 0a 20 20 50 49 44 20 20 tid;.. PID
b7430 20 70 69 64 3b 0d 0a 20 20 55 4c 4f 4e 47 20 75 pid;.. ULONG u
b7440 6c 43 6f 75 6e 74 3b 0d 0a 20 20 44 6f 73 51 75 lCount;.. DosQu
b7450 65 72 79 4d 75 74 65 78 53 65 6d 28 70 2d 3e 6d eryMutexSem(p->m
b7460 75 74 65 78 2c 20 26 70 69 64 2c 20 26 74 69 64 utex, &pid, &tid
b7470 2c 20 26 75 6c 43 6f 75 6e 74 29 3b 0d 0a 20 20 , &ulCount);..
b7480 70 72 69 6e 74 66 28 22 25 73 20 6d 75 74 65 78 printf("%s mutex
b7490 20 25 70 20 28 25 64 29 20 77 69 74 68 20 6e 52 %p (%d) with nR
b74a0 65 66 3d 25 6c 64 5c 6e 22 2c 20 70 41 63 74 69 ef=%ld\n", pActi
b74b0 6f 6e 2c 20 28 76 6f 69 64 2a 29 70 2c 20 70 2d on, (void*)p, p-
b74c0 3e 74 72 61 63 65 2c 20 75 6c 43 6f 75 6e 74 29 >trace, ulCount)
b74d0 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ;..}..#endif....
b74e0 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 /*..** The sqlit
b74f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 e3_mutex_enter()
b7500 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 and sqlite3_mut
b7510 65 78 5f 74 72 79 28 29 20 72 6f 75 74 69 6e 65 ex_try() routine
b7520 73 20 61 74 74 65 6d 70 74 0d 0a 2a 2a 20 74 6f s attempt..** to
b7530 20 65 6e 74 65 72 20 61 20 6d 75 74 65 78 2e 20 enter a mutex.
b7540 20 49 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 If another thre
b7550 61 64 20 69 73 20 61 6c 72 65 61 64 79 20 77 69 ad is already wi
b7560 74 68 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 0d thin the mutex,.
b7570 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .** sqlite3_mute
b7580 78 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c 20 62 x_enter() will b
b7590 6c 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74 65 33 lock and sqlite3
b75a0 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 77 69 6c _mutex_try() wil
b75b0 6c 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 53 51 4c l return..** SQL
b75c0 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 20 73 ITE_BUSY. The s
b75d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 qlite3_mutex_try
b75e0 28 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 () interface ret
b75f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a urns SQLITE_OK..
b7600 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65 73 73 66 ** upon successf
b7610 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75 74 65 78 ul entry. Mutex
b7620 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 es created using
b7630 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 SQLITE_MUTEX_RE
b7640 43 55 52 53 49 56 45 20 63 61 6e 0d 0a 2a 2a 20 CURSIVE can..**
b7650 62 65 20 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 be entered multi
b7660 70 6c 65 20 74 69 6d 65 73 20 62 79 20 74 68 65 ple times by the
b7670 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 49 same thread. I
b7680 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 n such cases the
b7690 2c 0d 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 ,..** mutex must
b76a0 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 65 71 be exited an eq
b76b0 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 ual number of ti
b76c0 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f 74 68 mes before anoth
b76d0 65 72 20 74 68 72 65 61 64 0d 0a 2a 2a 20 63 61 er thread..** ca
b76e0 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68 65 n enter. If the
b76f0 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72 69 same thread tri
b7700 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79 20 es to enter any
b7710 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75 other kind of mu
b7720 74 65 78 0d 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 tex..** more tha
b7730 6e 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61 n once, the beha
b7740 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 vior is undefine
b7750 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 d...*/..static v
b7760 6f 69 64 20 6f 73 32 4d 75 74 65 78 45 6e 74 65 oid os2MutexEnte
b7770 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 r(sqlite3_mutex
b7780 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 *p){.. assert(
b7790 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 p->id==SQLITE_MU
b77a0 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c TEX_RECURSIVE ||
b77b0 20 6f 73 32 4d 75 74 65 78 4e 6f 74 68 65 6c 64 os2MutexNotheld
b77c0 28 70 29 20 29 3b 0d 0a 20 20 44 6f 73 52 65 71 (p) );.. DosReq
b77d0 75 65 73 74 4d 75 74 65 78 53 65 6d 28 70 2d 3e uestMutexSem(p->
b77e0 6d 75 74 65 78 2c 20 53 45 4d 5f 49 4e 44 45 46 mutex, SEM_INDEF
b77f0 49 4e 49 54 45 5f 57 41 49 54 29 3b 0d 0a 23 69 INITE_WAIT);..#i
b7800 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 fdef SQLITE_DEBU
b7810 47 0d 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 G.. if( p->trac
b7820 65 20 29 20 6f 73 32 4d 75 74 65 78 54 72 61 63 e ) os2MutexTrac
b7830 65 28 70 2c 20 22 65 6e 74 65 72 22 29 3b 0d 0a e(p, "enter");..
b7840 23 65 6e 64 69 66 0d 0a 7d 0d 0a 73 74 61 74 69 #endif..}..stati
b7850 63 20 69 6e 74 20 6f 73 32 4d 75 74 65 78 54 72 c int os2MutexTr
b7860 79 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 y(sqlite3_mutex
b7870 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d *p){.. int rc =
b7880 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
b7890 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d assert( p->id==
b78a0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
b78b0 55 52 53 49 56 45 20 7c 7c 20 6f 73 32 4d 75 74 URSIVE || os2Mut
b78c0 65 78 4e 6f 74 68 65 6c 64 28 70 29 20 29 3b 0d exNotheld(p) );.
b78d0 0a 20 20 69 66 28 20 44 6f 73 52 65 71 75 65 73 . if( DosReques
b78e0 74 4d 75 74 65 78 53 65 6d 28 70 2d 3e 6d 75 74 tMutexSem(p->mut
b78f0 65 78 2c 20 53 45 4d 5f 49 4d 4d 45 44 49 41 54 ex, SEM_IMMEDIAT
b7900 45 5f 52 45 54 55 52 4e 29 20 3d 3d 20 4e 4f 5f E_RETURN) == NO_
b7910 45 52 52 4f 52 20 29 20 7b 0d 0a 20 20 20 20 72 ERROR ) {.. r
b7920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
b7930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
b7940 42 55 47 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e BUG.. if( p->
b7950 74 72 61 63 65 20 29 20 6f 73 32 4d 75 74 65 78 trace ) os2Mutex
b7960 54 72 61 63 65 28 70 2c 20 22 74 72 79 22 29 3b Trace(p, "try");
b7970 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 20 ..#endif.. }..
b7980 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
b7990 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c ../*..** The sql
b79a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 ite3_mutex_leave
b79b0 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74 73 () routine exits
b79c0 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 77 61 a mutex that wa
b79d0 73 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 s..** previously
b79e0 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 entered by the
b79f0 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68 same thread. Th
b7a00 65 20 62 65 68 61 76 69 6f 72 0d 0a 2a 2a 20 69 e behavior..** i
b7a10 73 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 s undefined if t
b7a20 68 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 he mutex is not
b7a30 63 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 currently entere
b7a40 64 20 6f 72 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 d or..** is not
b7a50 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 currently alloca
b7a60 74 65 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c ted. SQLite wil
b7a70 6c 20 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 l never do eithe
b7a80 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 r...*/..static v
b7a90 6f 69 64 20 6f 73 32 4d 75 74 65 78 4c 65 61 76 oid os2MutexLeav
b7aa0 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 e(sqlite3_mutex
b7ab0 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 *p){.. assert(
b7ac0 6f 73 32 4d 75 74 65 78 48 65 6c 64 28 70 29 20 os2MutexHeld(p)
b7ad0 29 3b 0d 0a 20 20 44 6f 73 52 65 6c 65 61 73 65 );.. DosRelease
b7ae0 4d 75 74 65 78 53 65 6d 28 70 2d 3e 6d 75 74 65 MutexSem(p->mute
b7af0 78 29 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 x);..#ifdef SQLI
b7b00 54 45 5f 44 45 42 55 47 0d 0a 20 20 69 66 28 20 TE_DEBUG.. if(
b7b10 70 2d 3e 74 72 61 63 65 20 29 20 6f 73 32 4d 75 p->trace ) os2Mu
b7b20 74 65 78 54 72 61 63 65 28 70 2c 20 22 6c 65 61 texTrace(p, "lea
b7b30 76 65 22 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 7d ve");..#endif..}
b7b40 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 ....SQLITE_PRIVA
b7b50 54 45 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 TE sqlite3_mutex
b7b60 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a _methods const *
b7b70 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 sqlite3DefaultMu
b7b80 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 20 73 74 tex(void){.. st
b7b90 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 atic const sqlit
b7ba0 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 e3_mutex_methods
b7bb0 20 73 4d 75 74 65 78 20 3d 20 7b 0d 0a 20 20 20 sMutex = {..
b7bc0 20 6f 73 32 4d 75 74 65 78 49 6e 69 74 2c 0d 0a os2MutexInit,..
b7bd0 20 20 20 20 6f 73 32 4d 75 74 65 78 45 6e 64 2c os2MutexEnd,
b7be0 0d 0a 20 20 20 20 6f 73 32 4d 75 74 65 78 41 6c .. os2MutexAl
b7bf0 6c 6f 63 2c 0d 0a 20 20 20 20 6f 73 32 4d 75 74 loc,.. os2Mut
b7c00 65 78 46 72 65 65 2c 0d 0a 20 20 20 20 6f 73 32 exFree,.. os2
b7c10 4d 75 74 65 78 45 6e 74 65 72 2c 0d 0a 20 20 20 MutexEnter,..
b7c20 20 6f 73 32 4d 75 74 65 78 54 72 79 2c 0d 0a 20 os2MutexTry,..
b7c30 20 20 20 6f 73 32 4d 75 74 65 78 4c 65 61 76 65 os2MutexLeave
b7c40 2c 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ,..#ifdef SQLITE
b7c50 5f 44 45 42 55 47 0d 0a 20 20 20 20 6f 73 32 4d _DEBUG.. os2M
b7c60 75 74 65 78 48 65 6c 64 2c 0d 0a 20 20 20 20 6f utexHeld,.. o
b7c70 73 32 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0d 0a s2MutexNotheld..
b7c80 23 65 6c 73 65 0d 0a 20 20 20 20 30 2c 0d 0a 20 #else.. 0,..
b7c90 20 20 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 0..#endif..
b7ca0 7d 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 26 };.... return &
b7cb0 73 4d 75 74 65 78 3b 0d 0a 7d 0d 0a 23 65 6e 64 sMutex;..}..#end
b7cc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55 54 if /* SQLITE_MUT
b7cd0 45 58 5f 4f 53 32 20 2a 2f 0d 0a 0d 0a 2f 2a 2a EX_OS2 */..../**
b7ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 ************ End
b7cf0 20 6f 66 20 6d 75 74 65 78 5f 6f 73 32 2e 63 20 of mutex_os2.c
b7d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a ***********/../*
b7d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 ************* Be
b7d40 67 69 6e 20 66 69 6c 65 20 6d 75 74 65 78 5f 75 gin file mutex_u
b7d50 6e 69 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nix.c **********
b7d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
b7d80 2a 0d 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73 *..** 2007 Augus
b7d90 74 20 32 38 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 t 28..**..** The
b7da0 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
b7db0 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
b7dc0 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
b7dd0 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a In place of..*
b7de0 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
b7df0 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
b7e00 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 sing:..**..**
b7e10 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
b7e20 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a and not evil...
b7e30 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 ** May you fi
b7e40 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
b7e50 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
b7e60 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d forgive others..
b7e70 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 .** May you s
b7e80 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 hare freely, nev
b7e90 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 er taking more t
b7ea0 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a han you give...*
b7eb0 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
b7ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b7ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
b7f00 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 This file conta
b7f10 69 6e 73 20 74 68 65 20 43 20 66 75 6e 63 74 69 ins the C functi
b7f20 6f 6e 73 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 ons that impleme
b7f30 6e 74 20 6d 75 74 65 78 65 73 20 66 6f 72 20 70 nt mutexes for p
b7f40 74 68 72 65 61 64 73 0d 0a 2a 2f 0d 0a 0d 0a 2f threads..*/..../
b7f50 2a 0d 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 *..** The code i
b7f60 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 6f n this file is o
b7f70 6e 6c 79 20 75 73 65 64 20 69 66 20 77 65 20 61 nly used if we a
b7f80 72 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 72 re compiling thr
b7f90 65 61 64 73 61 66 65 0d 0a 2a 2a 20 75 6e 64 65 eadsafe..** unde
b7fa0 72 20 75 6e 69 78 20 77 69 74 68 20 70 74 68 72 r unix with pthr
b7fb0 65 61 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f eads...**..** No
b7fc0 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 te that this imp
b7fd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 72 65 71 75 lementation requ
b7fe0 69 72 65 73 20 61 20 76 65 72 73 69 6f 6e 20 6f ires a version o
b7ff0 66 20 70 74 68 72 65 61 64 73 20 74 68 61 74 0d f pthreads that.
b8000 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 72 65 63 .** supports rec
b8010 75 72 73 69 76 65 20 6d 75 74 65 78 65 73 2e 0d ursive mutexes..
b8020 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 .*/..#ifdef SQLI
b8030 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44 TE_MUTEX_PTHREAD
b8040 53 0d 0a 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 70 S....#include <p
b8050 74 68 72 65 61 64 2e 68 3e 0d 0a 0d 0a 2f 2a 0d thread.h>..../*.
b8060 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f .** The sqlite3_
b8070 6d 75 74 65 78 2e 69 64 2c 20 73 71 6c 69 74 65 mutex.id, sqlite
b8080 33 5f 6d 75 74 65 78 2e 6e 52 65 66 2c 20 61 6e 3_mutex.nRef, an
b8090 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2e d sqlite3_mutex.
b80a0 6f 77 6e 65 72 20 66 69 65 6c 64 73 0d 0a 2a 2a owner fields..**
b80b0 20 61 72 65 20 6e 65 63 65 73 73 61 72 79 20 75 are necessary u
b80c0 6e 64 65 72 20 74 77 6f 20 63 6f 6e 64 69 64 74 nder two condidt
b80d0 69 6f 6e 73 3a 20 20 28 31 29 20 44 65 62 75 67 ions: (1) Debug
b80e0 20 62 75 69 6c 64 73 20 61 6e 64 20 28 32 29 20 builds and (2)
b80f0 75 73 69 6e 67 0d 0a 2a 2a 20 68 6f 6d 65 2d 67 using..** home-g
b8100 72 6f 77 6e 20 6d 75 74 65 78 65 73 2e 20 20 45 rown mutexes. E
b8110 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 73 65 ncapsulate these
b8120 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 6e 74 6f conditions into
b8130 20 61 20 73 69 6e 67 6c 65 20 23 64 65 66 69 6e a single #defin
b8140 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69 e...*/..#if defi
b8150 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
b8160 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c ) || defined(SQL
b8170 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 ITE_HOMEGROWN_RE
b8180 43 55 52 53 49 56 45 5f 4d 55 54 45 58 29 0d 0a CURSIVE_MUTEX)..
b8190 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f # define SQLITE_
b81a0 4d 55 54 45 58 5f 4e 52 45 46 20 31 0d 0a 23 65 MUTEX_NREF 1..#e
b81b0 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 lse..# define SQ
b81c0 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 20 LITE_MUTEX_NREF
b81d0 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0..#endif..../*.
b81e0 0a 2a 2a 20 45 61 63 68 20 72 65 63 75 72 73 69 .** Each recursi
b81f0 76 65 20 6d 75 74 65 78 20 69 73 20 61 6e 20 69 ve mutex is an i
b8200 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 nstance of the f
b8210 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
b8220 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 re...*/..struct
b8230 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 7b 0d sqlite3_mutex {.
b8240 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 . pthread_mutex
b8250 5f 74 20 6d 75 74 65 78 3b 20 20 20 20 20 2f 2a _t mutex; /*
b8260 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f 6c 6c 69 Mutex controlli
b8270 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0d 0a ng the lock */..
b8280 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 #if SQLITE_MUTEX
b8290 5f 4e 52 45 46 0d 0a 20 20 69 6e 74 20 69 64 3b _NREF.. int id;
b82a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b82b0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 79 70 /* Mutex typ
b82c0 65 20 2a 2f 0d 0a 20 20 76 6f 6c 61 74 69 6c 65 e */.. volatile
b82d0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 int nRef;
b82e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
b82f0 65 6e 74 72 61 6e 63 65 73 20 2a 2f 0d 0a 20 20 entrances */..
b8300 76 6f 6c 61 74 69 6c 65 20 70 74 68 72 65 61 64 volatile pthread
b8310 5f 74 20 6f 77 6e 65 72 3b 20 20 2f 2a 20 54 68 _t owner; /* Th
b8320 72 65 61 64 20 74 68 61 74 20 69 73 20 77 69 74 read that is wit
b8330 68 69 6e 20 74 68 69 73 20 6d 75 74 65 78 20 2a hin this mutex *
b8340 2f 0d 0a 20 20 69 6e 74 20 74 72 61 63 65 3b 20 /.. int trace;
b8350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b8360 2f 2a 20 54 72 75 65 20 74 6f 20 74 72 61 63 65 /* True to trace
b8370 20 63 68 61 6e 67 65 73 20 2a 2f 0d 0a 23 65 6e changes */..#en
b8380 64 69 66 0d 0a 7d 3b 0d 0a 23 69 66 20 53 51 4c dif..};..#if SQL
b8390 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 0d 0a ITE_MUTEX_NREF..
b83a0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 33 5f #define SQLITE3_
b83b0 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 MUTEX_INITIALIZE
b83c0 52 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54 45 R { PTHREAD_MUTE
b83d0 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 20 30 X_INITIALIZER, 0
b83e0 2c 20 30 2c 20 28 70 74 68 72 65 61 64 5f 74 29 , 0, (pthread_t)
b83f0 30 2c 20 30 20 7d 0d 0a 23 65 6c 73 65 0d 0a 23 0, 0 }..#else..#
b8400 64 65 66 69 6e 65 20 53 51 4c 49 54 45 33 5f 4d define SQLITE3_M
b8410 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 UTEX_INITIALIZER
b8420 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 { PTHREAD_MUTEX
b8430 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7d 0d 0a _INITIALIZER }..
b8440 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
b8450 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 The sqlite3_mut
b8460 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20 73 71 ex_held() and sq
b8470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 lite3_mutex_noth
b8480 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20 61 72 eld() routine ar
b8490 65 0d 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 66 e..** intended f
b84a0 6f 72 20 75 73 65 20 6f 6e 6c 79 20 69 6e 73 69 or use only insi
b84b0 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 de assert() stat
b84c0 65 6d 65 6e 74 73 2e 20 20 4f 6e 20 73 6f 6d 65 ements. On some
b84d0 20 70 6c 61 74 66 6f 72 6d 73 2c 0d 0a 2a 2a 20 platforms,..**
b84e0 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 there might be r
b84f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 ace conditions t
b8500 68 61 74 20 63 61 6e 20 63 61 75 73 65 20 74 68 hat can cause th
b8510 65 73 65 20 72 6f 75 74 69 6e 65 73 20 74 6f 0d ese routines to.
b8520 0a 2a 2a 20 64 65 6c 69 76 65 72 20 69 6e 63 6f .** deliver inco
b8530 72 72 65 63 74 20 72 65 73 75 6c 74 73 2e 20 20 rrect results.
b8540 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 In particular, i
b8550 66 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 f pthread_equal(
b8560 29 20 69 73 0d 0a 2a 2a 20 6e 6f 74 20 61 6e 20 ) is..** not an
b8570 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e atomic operation
b8580 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 , then these rou
b8590 74 69 6e 65 73 20 6d 69 67 68 74 20 64 65 6c 69 tines might deli
b85a0 76 65 72 79 0d 0a 2a 2a 20 69 6e 63 6f 72 72 65 very..** incorre
b85b0 63 74 20 72 65 73 75 6c 74 73 2e 20 20 4f 6e 20 ct results. On
b85c0 6d 6f 73 74 20 70 6c 61 74 66 6f 72 6d 73 2c 20 most platforms,
b85d0 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 29 20 pthread_equal()
b85e0 69 73 20 61 20 0d 0a 2a 2a 20 63 6f 6d 70 61 72 is a ..** compar
b85f0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 69 6e 74 65 ison of two inte
b8600 67 65 72 73 20 61 6e 64 20 69 73 20 74 68 65 72 gers and is ther
b8610 65 66 6f 72 65 20 61 74 6f 6d 69 63 2e 20 20 42 efore atomic. B
b8620 75 74 20 77 65 20 61 72 65 0d 0a 2a 2a 20 74 6f ut we are..** to
b8630 6c 64 20 74 68 61 74 20 48 50 55 58 20 69 73 20 ld that HPUX is
b8640 6e 6f 74 20 73 75 63 68 20 61 20 70 6c 61 74 66 not such a platf
b8650 6f 72 6d 2e 20 20 49 66 20 73 6f 2c 20 74 68 65 orm. If so, the
b8660 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 n these routines
b8670 0d 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 61 6c ..** will not al
b8680 77 61 79 73 20 77 6f 72 6b 20 63 6f 72 72 65 63 ways work correc
b8690 74 6c 79 20 6f 6e 20 48 50 55 58 2e 0d 0a 2a 2a tly on HPUX...**
b86a0 0d 0a 2a 2a 20 4f 6e 20 74 68 6f 73 65 20 70 6c ..** On those pl
b86b0 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 70 74 atforms where pt
b86c0 68 72 65 61 64 5f 65 71 75 61 6c 28 29 20 69 73 hread_equal() is
b86d0 20 6e 6f 74 20 61 74 6f 6d 69 63 2c 20 53 51 4c not atomic, SQL
b86e0 69 74 65 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 ite..** should b
b86f0 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f e compiled witho
b8700 75 74 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 ut -DSQLITE_DEBU
b8710 47 20 61 6e 64 20 77 69 74 68 20 2d 44 4e 44 45 G and with -DNDE
b8720 42 55 47 20 74 6f 0d 0a 2a 2a 20 6d 61 6b 65 20 BUG to..** make
b8730 73 75 72 65 20 6e 6f 20 61 73 73 65 72 74 28 29 sure no assert()
b8740 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 statements are
b8750 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 68 65 evaluated and he
b8760 6e 63 65 20 74 68 65 73 65 0d 0a 2a 2a 20 72 6f nce these..** ro
b8770 75 74 69 6e 65 73 20 61 72 65 20 6e 65 76 65 72 utines are never
b8780 20 63 61 6c 6c 65 64 2e 0d 0a 2a 2f 0d 0a 23 69 called...*/..#i
b8790 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 f !defined(NDEBU
b87a0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 G) || defined(SQ
b87b0 4c 49 54 45 5f 44 45 42 55 47 29 0d 0a 73 74 61 LITE_DEBUG)..sta
b87c0 74 69 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d tic int pthreadM
b87d0 75 74 65 78 48 65 6c 64 28 73 71 6c 69 74 65 33 utexHeld(sqlite3
b87e0 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a 20 20 72 _mutex *p){.. r
b87f0 65 74 75 72 6e 20 28 70 2d 3e 6e 52 65 66 21 3d eturn (p->nRef!=
b8800 30 20 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 0 && pthread_equ
b8810 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70 74 68 al(p->owner, pth
b8820 72 65 61 64 5f 73 65 6c 66 28 29 29 29 3b 0d 0a read_self()));..
b8830 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 }..static int pt
b8840 68 72 65 61 64 4d 75 74 65 78 4e 6f 74 68 65 6c hreadMutexNothel
b8850 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 d(sqlite3_mutex
b8860 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 *p){.. return p
b8870 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 74 68 ->nRef==0 || pth
b8880 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 read_equal(p->ow
b8890 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c ner, pthread_sel
b88a0 66 28 29 29 3d 3d 30 3b 0d 0a 7d 0d 0a 23 65 6e f())==0;..}..#en
b88b0 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e dif..../*..** In
b88c0 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 itialize and dei
b88d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 nitialize the mu
b88e0 74 65 78 20 73 75 62 73 79 73 74 65 6d 2e 0d 0a tex subsystem...
b88f0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 */..static int p
b8900 74 68 72 65 61 64 4d 75 74 65 78 49 6e 69 74 28 threadMutexInit(
b8910 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 void){ return SQ
b8920 4c 49 54 45 5f 4f 4b 3b 20 7d 0d 0a 73 74 61 74 LITE_OK; }..stat
b8930 69 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d 75 ic int pthreadMu
b8940 74 65 78 45 6e 64 28 76 6f 69 64 29 7b 20 72 65 texEnd(void){ re
b8950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 turn SQLITE_OK;
b8960 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 }..../*..** The
b8970 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c sqlite3_mutex_al
b8980 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65 20 61 6c loc() routine al
b8990 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0d 0a 2a locates a new..*
b89a0 2a 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 * mutex and retu
b89b0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f rns a pointer to
b89c0 20 69 74 2e 20 20 49 66 20 69 74 20 72 65 74 75 it. If it retu
b89d0 72 6e 73 20 4e 55 4c 4c 0d 0a 2a 2a 20 74 68 61 rns NULL..** tha
b89e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d t means that a m
b89f0 75 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20 62 utex could not b
b8a00 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53 51 e allocated. SQ
b8a10 4c 69 74 65 0d 0a 2a 2a 20 77 69 6c 6c 20 75 6e Lite..** will un
b8a20 77 69 6e 64 20 69 74 73 20 73 74 61 63 6b 20 61 wind its stack a
b8a30 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 nd return an err
b8a40 6f 72 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e or. The argumen
b8a50 74 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 t..** to sqlite3
b8a60 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 69 _mutex_alloc() i
b8a70 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 69 s one of these i
b8a80 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 nteger constants
b8a90 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a :..**..** <ul>..
b8aa0 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f ** <li> SQLITE_
b8ab0 4d 55 54 45 58 5f 46 41 53 54 0d 0a 2a 2a 20 3c MUTEX_FAST..** <
b8ac0 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 li> SQLITE_MUTE
b8ad0 58 5f 52 45 43 55 52 53 49 56 45 0d 0a 2a 2a 20 X_RECURSIVE..**
b8ae0 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 <li> SQLITE_MUT
b8af0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 EX_STATIC_MASTER
b8b00 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 ..** <li> SQLIT
b8b10 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d E_MUTEX_STATIC_M
b8b20 45 4d 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c EM..** <li> SQL
b8b30 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 ITE_MUTEX_STATIC
b8b40 5f 4d 45 4d 32 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 _MEM2..** <li>
b8b50 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
b8b60 54 49 43 5f 50 52 4e 47 0d 0a 2a 2a 20 3c 6c 69 TIC_PRNG..** <li
b8b70 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f > SQLITE_MUTEX_
b8b80 53 54 41 54 49 43 5f 4c 52 55 0d 0a 2a 2a 20 3c STATIC_LRU..** <
b8b90 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 li> SQLITE_MUTE
b8ba0 58 5f 53 54 41 54 49 43 5f 50 4d 45 4d 0d 0a 2a X_STATIC_PMEM..*
b8bb0 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 * </ul>..**..**
b8bc0 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f The first two co
b8bd0 6e 73 74 61 6e 74 73 20 63 61 75 73 65 20 73 71 nstants cause sq
b8be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f lite3_mutex_allo
b8bf0 63 28 29 20 74 6f 20 63 72 65 61 74 65 0d 0a 2a c() to create..*
b8c00 2a 20 61 20 6e 65 77 20 6d 75 74 65 78 2e 20 20 * a new mutex.
b8c10 54 68 65 20 6e 65 77 20 6d 75 74 65 78 20 69 73 The new mutex is
b8c20 20 72 65 63 75 72 73 69 76 65 20 77 68 65 6e 20 recursive when
b8c30 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
b8c40 55 52 53 49 56 45 0d 0a 2a 2a 20 69 73 20 75 73 URSIVE..** is us
b8c50 65 64 20 62 75 74 20 6e 6f 74 20 6e 65 63 65 73 ed but not neces
b8c60 73 61 72 69 6c 79 20 73 6f 20 77 68 65 6e 20 53 sarily so when S
b8c70 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 QLITE_MUTEX_FAST
b8c80 20 69 73 20 75 73 65 64 2e 0d 0a 2a 2a 20 54 68 is used...** Th
b8c90 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e e mutex implemen
b8ca0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 tation does not
b8cb0 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 64 need to make a d
b8cc0 69 73 74 69 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 62 istinction..** b
b8cd0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d 55 etween SQLITE_MU
b8ce0 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 61 6e TEX_RECURSIVE an
b8cf0 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 d SQLITE_MUTEX_F
b8d00 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 0d 0a AST if it does..
b8d10 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20 ** not want to.
b8d20 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c 6c But SQLite will
b8d30 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61 20 only request a
b8d40 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 recursive mutex
b8d50 69 6e 0d 0a 2a 2a 20 63 61 73 65 73 20 77 68 65 in..** cases whe
b8d60 72 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65 re it really nee
b8d70 64 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61 ds one. If a fa
b8d80 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69 ster non-recursi
b8d90 76 65 20 6d 75 74 65 78 0d 0a 2a 2a 20 69 6d 70 ve mutex..** imp
b8da0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 lementation is a
b8db0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 vailable on the
b8dc0 68 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 host platform, t
b8dd0 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 he mutex subsyst
b8de0 65 6d 0d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 em..** might ret
b8df0 75 72 6e 20 73 75 63 68 20 61 20 6d 75 74 65 78 urn such a mutex
b8e00 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 in response to
b8e10 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 SQLITE_MUTEX_FAS
b8e20 54 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f T...**..** The o
b8e30 74 68 65 72 20 61 6c 6c 6f 77 65 64 20 70 61 72 ther allowed par
b8e40 61 6d 65 74 65 72 73 20 74 6f 20 73 71 6c 69 74 ameters to sqlit
b8e50 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 e3_mutex_alloc()
b8e60 20 65 61 63 68 20 72 65 74 75 72 6e 0d 0a 2a 2a each return..**
b8e70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
b8e80 73 74 61 74 69 63 20 70 72 65 65 78 69 73 74 69 static preexisti
b8e90 6e 67 20 6d 75 74 65 78 2e 20 20 53 69 78 20 73 ng mutex. Six s
b8ea0 74 61 74 69 63 20 6d 75 74 65 78 65 73 20 61 72 tatic mutexes ar
b8eb0 65 0d 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 e..** used by th
b8ec0 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f e current versio
b8ed0 6e 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 46 75 n of SQLite. Fu
b8ee0 74 75 72 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 ture versions of
b8ef0 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 6d 61 79 20 SQLite..** may
b8f00 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 add additional s
b8f10 74 61 74 69 63 20 6d 75 74 65 78 65 73 2e 20 20 tatic mutexes.
b8f20 53 74 61 74 69 63 20 6d 75 74 65 78 65 73 20 61 Static mutexes a
b8f30 72 65 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0d re for internal.
b8f40 0a 2a 2a 20 75 73 65 20 62 79 20 53 51 4c 69 74 .** use by SQLit
b8f50 65 20 6f 6e 6c 79 2e 20 20 41 70 70 6c 69 63 61 e only. Applica
b8f60 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 53 tions that use S
b8f70 51 4c 69 74 65 20 6d 75 74 65 78 65 73 20 73 68 QLite mutexes sh
b8f80 6f 75 6c 64 0d 0a 2a 2a 20 75 73 65 20 6f 6e 6c ould..** use onl
b8f90 79 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6d 75 y the dynamic mu
b8fa0 74 65 78 65 73 20 72 65 74 75 72 6e 65 64 20 62 texes returned b
b8fb0 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 y SQLITE_MUTEX_F
b8fc0 41 53 54 20 6f 72 0d 0a 2a 2a 20 53 51 4c 49 54 AST or..** SQLIT
b8fd0 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 E_MUTEX_RECURSIV
b8fe0 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 E...**..** Note
b8ff0 74 68 61 74 20 69 66 20 6f 6e 65 20 6f 66 20 74 that if one of t
b9000 68 65 20 64 79 6e 61 6d 69 63 20 6d 75 74 65 78 he dynamic mutex
b9010 20 70 61 72 61 6d 65 74 65 72 73 20 28 53 51 4c parameters (SQL
b9020 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 0d 0a ITE_MUTEX_FAST..
b9030 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4d 55 54 ** or SQLITE_MUT
b9040 45 58 5f 52 45 43 55 52 53 49 56 45 29 20 69 73 EX_RECURSIVE) is
b9050 20 75 73 65 64 20 74 68 65 6e 20 73 71 6c 69 74 used then sqlit
b9060 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 e3_mutex_alloc()
b9070 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 64 ..** returns a d
b9080 69 66 66 65 72 65 6e 74 20 6d 75 74 65 78 20 6f ifferent mutex o
b9090 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20 20 42 n every call. B
b90a0 75 74 20 66 6f 72 20 74 68 65 20 73 74 61 74 69 ut for the stati
b90b0 63 20 0d 0a 2a 2a 20 6d 75 74 65 78 20 74 79 70 c ..** mutex typ
b90c0 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75 74 es, the same mut
b90d0 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f ex is returned o
b90e0 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68 61 n every call tha
b90f0 74 20 68 61 73 0d 0a 2a 2a 20 74 68 65 20 73 61 t has..** the sa
b9100 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 0d me type number..
b9110 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 71 6c 69 .*/..static sqli
b9120 74 65 33 5f 6d 75 74 65 78 20 2a 70 74 68 72 65 te3_mutex *pthre
b9130 61 64 4d 75 74 65 78 41 6c 6c 6f 63 28 69 6e 74 adMutexAlloc(int
b9140 20 69 54 79 70 65 29 7b 0d 0a 20 20 73 74 61 74 iType){.. stat
b9150 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 ic sqlite3_mutex
b9160 20 73 74 61 74 69 63 4d 75 74 65 78 65 73 5b 5d staticMutexes[]
b9170 20 3d 20 7b 0d 0a 20 20 20 20 53 51 4c 49 54 45 = {.. SQLITE
b9180 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b9190 5a 45 52 2c 0d 0a 20 20 20 20 53 51 4c 49 54 45 ZER,.. SQLITE
b91a0 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b91b0 5a 45 52 2c 0d 0a 20 20 20 20 53 51 4c 49 54 45 ZER,.. SQLITE
b91c0 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b91d0 5a 45 52 2c 0d 0a 20 20 20 20 53 51 4c 49 54 45 ZER,.. SQLITE
b91e0 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b91f0 5a 45 52 2c 0d 0a 20 20 20 20 53 51 4c 49 54 45 ZER,.. SQLITE
b9200 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b9210 5a 45 52 2c 0d 0a 20 20 20 20 53 51 4c 49 54 45 ZER,.. SQLITE
b9220 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
b9230 5a 45 52 0d 0a 20 20 7d 3b 0d 0a 20 20 73 71 6c ZER.. };.. sql
b9240 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 3b 0d 0a ite3_mutex *p;..
b9250 20 20 73 77 69 74 63 68 28 20 69 54 79 70 65 20 switch( iType
b9260 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c ){.. case SQL
b9270 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 ITE_MUTEX_RECURS
b9280 49 56 45 3a 20 7b 0d 0a 20 20 20 20 20 20 70 20 IVE: {.. p
b9290 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a = sqlite3MallocZ
b92a0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 ero( sizeof(*p)
b92b0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 20 );.. if( p
b92c0 29 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ){..#ifdef SQLIT
b92d0 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 E_HOMEGROWN_RECU
b92e0 52 53 49 56 45 5f 4d 55 54 45 58 0d 0a 20 20 20 RSIVE_MUTEX..
b92f0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 63 75 72 /* If recur
b9300 73 69 76 65 20 6d 75 74 65 78 65 73 20 61 72 65 sive mutexes are
b9310 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 not available,
b9320 77 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 0d we will have to.
b9330 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 75 69 6c . ** buil
b9340 64 20 6f 75 72 20 6f 77 6e 2e 20 20 53 65 65 20 d our own. See
b9350 62 65 6c 6f 77 2e 20 2a 2f 0d 0a 20 20 20 20 20 below. */..
b9360 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 pthread_mutex
b9370 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c _init(&p->mutex,
b9380 20 30 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 0);..#else..
b9390 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 65 /* Use a re
b93a0 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 66 cursive mutex if
b93b0 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 it is available
b93c0 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 70 74 68 */.. pth
b93d0 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f 74 read_mutexattr_t
b93e0 20 72 65 63 75 72 73 69 76 65 41 74 74 72 3b 0d recursiveAttr;.
b93f0 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64 . pthread
b9400 5f 6d 75 74 65 78 61 74 74 72 5f 69 6e 69 74 28 _mutexattr_init(
b9410 26 72 65 63 75 72 73 69 76 65 41 74 74 72 29 3b &recursiveAttr);
b9420 0d 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61 .. pthrea
b9430 64 5f 6d 75 74 65 78 61 74 74 72 5f 73 65 74 74 d_mutexattr_sett
b9440 79 70 65 28 26 72 65 63 75 72 73 69 76 65 41 74 ype(&recursiveAt
b9450 74 72 2c 20 50 54 48 52 45 41 44 5f 4d 55 54 45 tr, PTHREAD_MUTE
b9460 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0d 0a 20 X_RECURSIVE);..
b9470 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d pthread_m
b9480 75 74 65 78 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 utex_init(&p->mu
b9490 74 65 78 2c 20 26 72 65 63 75 72 73 69 76 65 41 tex, &recursiveA
b94a0 74 74 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 ttr);.. p
b94b0 74 68 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 thread_mutexattr
b94c0 5f 64 65 73 74 72 6f 79 28 26 72 65 63 75 72 73 _destroy(&recurs
b94d0 69 76 65 41 74 74 72 29 3b 0d 0a 23 65 6e 64 69 iveAttr);..#endi
b94e0 66 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 f..#if SQLITE_MU
b94f0 54 45 58 5f 4e 52 45 46 0d 0a 20 20 20 20 20 20 TEX_NREF..
b9500 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b p->id = iType;
b9510 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 ..#endif..
b9520 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d }.. break;.
b9530 0a 20 20 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 . }.. case
b9540 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 SQLITE_MUTEX_FA
b9550 53 54 3a 20 7b 0d 0a 20 20 20 20 20 20 70 20 3d ST: {.. p =
b9560 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 sqlite3MallocZe
b9570 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 ro( sizeof(*p) )
b9580 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 ;.. if( p )
b9590 7b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 {..#if SQLITE_MU
b95a0 54 45 58 5f 4e 52 45 46 0d 0a 20 20 20 20 20 20 TEX_NREF..
b95b0 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b p->id = iType;
b95c0 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 ..#endif..
b95d0 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f pthread_mutex_
b95e0 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c 20 init(&p->mutex,
b95f0 30 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 0);.. }..
b9600 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 break;..
b9610 7d 0d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 }.. default:
b9620 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 {.. assert(
b9630 20 69 54 79 70 65 2d 32 20 3e 3d 20 30 20 29 3b iType-2 >= 0 );
b9640 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
b9650 69 54 79 70 65 2d 32 20 3c 20 41 72 72 61 79 53 iType-2 < ArrayS
b9660 69 7a 65 28 73 74 61 74 69 63 4d 75 74 65 78 65 ize(staticMutexe
b9670 73 29 20 29 3b 0d 0a 20 20 20 20 20 20 70 20 3d s) );.. p =
b9680 20 26 73 74 61 74 69 63 4d 75 74 65 78 65 73 5b &staticMutexes[
b9690 69 54 79 70 65 2d 32 5d 3b 0d 0a 23 69 66 20 53 iType-2];..#if S
b96a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 QLITE_MUTEX_NREF
b96b0 0d 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 .. p->id =
b96c0 69 54 79 70 65 3b 0d 0a 23 65 6e 64 69 66 0d 0a iType;..#endif..
b96d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
b96e0 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
b96f0 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a rn p;..}....../*
b9700 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
b9710 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 e deallocates a
b9720 70 72 65 76 69 6f 75 73 6c 79 0d 0a 2a 2a 20 61 previously..** a
b9730 6c 6c 6f 63 61 74 65 64 20 6d 75 74 65 78 2e 20 llocated mutex.
b9740 20 53 51 4c 69 74 65 20 69 73 20 63 61 72 65 66 SQLite is caref
b9750 75 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 ul to deallocate
b9760 20 65 76 65 72 79 0d 0a 2a 2a 20 6d 75 74 65 78 every..** mutex
b9770 20 74 68 61 74 20 69 74 20 61 6c 6c 6f 63 61 74 that it allocat
b9780 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 es...*/..static
b9790 76 6f 69 64 20 70 74 68 72 65 61 64 4d 75 74 65 void pthreadMute
b97a0 78 46 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 xFree(sqlite3_mu
b97b0 74 65 78 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 tex *p){.. asse
b97c0 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 rt( p->nRef==0 )
b97d0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e ;.. assert( p->
b97e0 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 id==SQLITE_MUTEX
b97f0 5f 46 41 53 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d _FAST || p->id==
b9800 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 SQLITE_MUTEX_REC
b9810 55 52 53 49 56 45 20 29 3b 0d 0a 20 20 70 74 68 URSIVE );.. pth
b9820 72 65 61 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 read_mutex_destr
b9830 6f 79 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0d 0a oy(&p->mutex);..
b9840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
b9850 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 );..}..../*..**
b9860 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 The sqlite3_mute
b9870 78 5f 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 x_enter() and sq
b9880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 lite3_mutex_try(
b9890 29 20 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d ) routines attem
b98a0 70 74 0d 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 pt..** to enter
b98b0 61 20 6d 75 74 65 78 2e 20 20 49 66 20 61 6e 6f a mutex. If ano
b98c0 74 68 65 72 20 74 68 72 65 61 64 20 69 73 20 61 ther thread is a
b98d0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 74 68 lready within th
b98e0 65 20 6d 75 74 65 78 2c 0d 0a 2a 2a 20 73 71 6c e mutex,..** sql
b98f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 ite3_mutex_enter
b9900 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e () will block an
b9910 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f d sqlite3_mutex_
b9920 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74 75 72 try() will retur
b9930 6e 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 n..** SQLITE_BUS
b9940 59 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f Y. The sqlite3_
b9950 6d 75 74 65 78 5f 74 72 79 28 29 20 69 6e 74 65 mutex_try() inte
b9960 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 53 51 rface returns SQ
b9970 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a 20 75 70 6f 6e LITE_OK..** upon
b9980 20 73 75 63 63 65 73 73 66 75 6c 20 65 6e 74 72 successful entr
b9990 79 2e 20 20 4d 75 74 65 78 65 73 20 63 72 65 61 y. Mutexes crea
b99a0 74 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45 ted using SQLITE
b99b0 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 _MUTEX_RECURSIVE
b99c0 20 63 61 6e 0d 0a 2a 2a 20 62 65 20 65 6e 74 65 can..** be ente
b99d0 72 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d red multiple tim
b99e0 65 73 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 es by the same t
b99f0 68 72 65 61 64 2e 20 20 49 6e 20 73 75 63 68 20 hread. In such
b9a00 63 61 73 65 73 20 74 68 65 2c 0d 0a 2a 2a 20 6d cases the,..** m
b9a10 75 74 65 78 20 6d 75 73 74 20 62 65 20 65 78 69 utex must be exi
b9a20 74 65 64 20 61 6e 20 65 71 75 61 6c 20 6e 75 6d ted an equal num
b9a30 62 65 72 20 6f 66 20 74 69 6d 65 73 20 62 65 66 ber of times bef
b9a40 6f 72 65 20 61 6e 6f 74 68 65 72 20 74 68 72 65 ore another thre
b9a50 61 64 0d 0a 2a 2a 20 63 61 6e 20 65 6e 74 65 72 ad..** can enter
b9a60 2e 20 20 49 66 20 74 68 65 20 73 61 6d 65 20 74 . If the same t
b9a70 68 72 65 61 64 20 74 72 69 65 73 20 74 6f 20 65 hread tries to e
b9a80 6e 74 65 72 20 61 6e 79 20 6f 74 68 65 72 20 6b nter any other k
b9a90 69 6e 64 20 6f 66 20 6d 75 74 65 78 0d 0a 2a 2a ind of mutex..**
b9aa0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c more than once,
b9ab0 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 the behavior is
b9ac0 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f 0d undefined...*/.
b9ad0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 68 .static void pth
b9ae0 72 65 61 64 4d 75 74 65 78 45 6e 74 65 72 28 73 readMutexEnter(s
b9af0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 qlite3_mutex *p)
b9b00 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e {.. assert( p->
b9b10 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 id==SQLITE_MUTEX
b9b20 5f 52 45 43 55 52 53 49 56 45 20 7c 7c 20 70 74 _RECURSIVE || pt
b9b30 68 72 65 61 64 4d 75 74 65 78 4e 6f 74 68 65 6c hreadMutexNothel
b9b40 64 28 70 29 20 29 3b 0d 0a 0d 0a 23 69 66 64 65 d(p) );....#ifde
b9b50 66 20 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f f SQLITE_HOMEGRO
b9b60 57 4e 5f 52 45 43 55 52 53 49 56 45 5f 4d 55 54 WN_RECURSIVE_MUT
b9b70 45 58 0d 0a 20 20 2f 2a 20 49 66 20 72 65 63 75 EX.. /* If recu
b9b80 72 73 69 76 65 20 6d 75 74 65 78 65 73 20 61 72 rsive mutexes ar
b9b90 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c e not available,
b9ba0 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f then we have to
b9bb0 20 67 72 6f 77 0d 0a 20 20 2a 2a 20 6f 75 72 20 grow.. ** our
b9bc0 6f 77 6e 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 own. This imple
b9bd0 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 mentation assume
b9be0 73 20 74 68 61 74 20 70 74 68 72 65 61 64 5f 65 s that pthread_e
b9bf0 71 75 61 6c 28 29 0d 0a 20 20 2a 2a 20 69 73 20 qual().. ** is
b9c00 61 74 6f 6d 69 63 20 2d 20 74 68 61 74 20 69 74 atomic - that it
b9c10 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 63 65 69 cannot be decei
b9c20 76 65 64 20 69 6e 74 6f 20 74 68 69 6e 6b 69 6e ved into thinkin
b9c30 67 20 73 65 6c 66 0d 0a 20 20 2a 2a 20 61 6e 64 g self.. ** and
b9c40 20 70 2d 3e 6f 77 6e 65 72 20 61 72 65 20 65 71 p->owner are eq
b9c50 75 61 6c 20 69 66 20 70 2d 3e 6f 77 6e 65 72 20 ual if p->owner
b9c60 63 68 61 6e 67 65 73 20 62 65 74 77 65 65 6e 20 changes between
b9c70 74 77 6f 20 76 61 6c 75 65 73 0d 0a 20 20 2a 2a two values.. **
b9c80 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 65 71 that are not eq
b9c90 75 61 6c 20 74 6f 20 73 65 6c 66 20 77 68 69 6c ual to self whil
b9ca0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e e the comparison
b9cb0 20 69 73 20 74 61 6b 69 6e 67 20 70 6c 61 63 65 is taking place
b9cc0 2e 0d 0a 20 20 2a 2a 20 54 68 69 73 20 69 6d 70 ... ** This imp
b9cd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6c 73 6f lementation also
b9ce0 20 61 73 73 75 6d 65 73 20 61 20 63 6f 68 65 72 assumes a coher
b9cf0 65 6e 74 20 63 61 63 68 65 20 2d 20 74 68 61 74 ent cache - that
b9d00 20 0d 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 65 .. ** separate
b9d10 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 6e 6f processes canno
b9d20 74 20 72 65 61 64 20 64 69 66 66 65 72 65 6e 74 t read different
b9d30 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 values from the
b9d40 20 73 61 6d 65 0d 0a 20 20 2a 2a 20 61 64 64 72 same.. ** addr
b9d50 65 73 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 ess at the same
b9d60 74 69 6d 65 2e 20 20 49 66 20 65 69 74 68 65 72 time. If either
b9d70 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 63 6f of these two co
b9d80 6e 64 69 74 69 6f 6e 73 0d 0a 20 20 2a 2a 20 61 nditions.. ** a
b9d90 72 65 20 6e 6f 74 20 6d 65 74 2c 20 74 68 65 6e re not met, then
b9da0 20 74 68 65 20 6d 75 74 65 78 65 73 20 77 69 6c the mutexes wil
b9db0 6c 20 66 61 69 6c 20 61 6e 64 20 70 72 6f 62 6c l fail and probl
b9dc0 65 6d 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e ems will result.
b9dd0 0d 0a 20 20 2a 2f 0d 0a 20 20 7b 0d 0a 20 20 20 .. */.. {..
b9de0 20 70 74 68 72 65 61 64 5f 74 20 73 65 6c 66 20 pthread_t self
b9df0 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 = pthread_self()
b9e00 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 ;.. if( p->nR
b9e10 65 66 3e 30 20 26 26 20 70 74 68 72 65 61 64 5f ef>0 && pthread_
b9e20 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 equal(p->owner,
b9e30 73 65 6c 66 29 20 29 7b 0d 0a 20 20 20 20 20 20 self) ){..
b9e40 70 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 20 20 20 20 p->nRef++;..
b9e50 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 74 }else{.. pt
b9e60 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b hread_mutex_lock
b9e70 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 (&p->mutex);..
b9e80 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e assert( p->n
b9e90 52 65 66 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 Ref==0 );..
b9ea0 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c 66 p->owner = self
b9eb0 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 ;.. p->nRef
b9ec0 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 = 1;.. }..
b9ed0 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 2f 2a 20 55 }..#else.. /* U
b9ee0 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
b9ef0 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 65 recursive mutexe
b9f00 73 20 69 66 20 74 68 65 79 20 61 72 65 20 61 76 s if they are av
b9f10 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a ailable... */..
b9f20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f pthread_mutex_
b9f30 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b lock(&p->mutex);
b9f40 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 ..#if SQLITE_MUT
b9f50 45 58 5f 4e 52 45 46 0d 0a 20 20 61 73 73 65 72 EX_NREF.. asser
b9f60 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 t( p->nRef>0 ||
b9f70 70 2d 3e 6f 77 6e 65 72 3d 3d 30 20 29 3b 0d 0a p->owner==0 );..
b9f80 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 70 74 68 p->owner = pth
b9f90 72 65 61 64 5f 73 65 6c 66 28 29 3b 0d 0a 20 20 read_self();..
b9fa0 70 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 23 65 6e 64 p->nRef++;..#end
b9fb0 69 66 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 if..#endif....#i
b9fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 fdef SQLITE_DEBU
b9fd0 47 0d 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 G.. if( p->trac
b9fe0 65 20 29 7b 0d 0a 20 20 20 20 70 72 69 6e 74 66 e ){.. printf
b9ff0 28 22 65 6e 74 65 72 20 6d 75 74 65 78 20 25 70 ("enter mutex %p
ba000 20 28 25 64 29 20 77 69 74 68 20 6e 52 65 66 3d (%d) with nRef=
ba010 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 61 %d\n", p, p->tra
ba020 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0d 0a 20 ce, p->nRef);..
ba030 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 73 }..#endif..}..s
ba040 74 61 74 69 63 20 69 6e 74 20 70 74 68 72 65 61 tatic int pthrea
ba050 64 4d 75 74 65 78 54 72 79 28 73 71 6c 69 74 65 dMutexTry(sqlite
ba060 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a 20 20 3_mutex *p){..
ba070 69 6e 74 20 72 63 3b 0d 0a 20 20 61 73 73 65 72 int rc;.. asser
ba080 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 t( p->id==SQLITE
ba090 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 _MUTEX_RECURSIVE
ba0a0 20 7c 7c 20 70 74 68 72 65 61 64 4d 75 74 65 78 || pthreadMutex
ba0b0 4e 6f 74 68 65 6c 64 28 70 29 20 29 3b 0d 0a 0d Notheld(p) );...
ba0c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 .#ifdef SQLITE_H
ba0d0 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49 OMEGROWN_RECURSI
ba0e0 56 45 5f 4d 55 54 45 58 0d 0a 20 20 2f 2a 20 49 VE_MUTEX.. /* I
ba0f0 66 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 f recursive mute
ba100 78 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 xes are not avai
ba110 6c 61 62 6c 65 2c 20 74 68 65 6e 20 77 65 20 68 lable, then we h
ba120 61 76 65 20 74 6f 20 67 72 6f 77 0d 0a 20 20 2a ave to grow.. *
ba130 2a 20 6f 75 72 20 6f 77 6e 2e 20 20 54 68 69 73 * our own. This
ba140 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
ba150 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 74 68 assumes that pth
ba160 72 65 61 64 5f 65 71 75 61 6c 28 29 0d 0a 20 20 read_equal()..
ba170 2a 2a 20 69 73 20 61 74 6f 6d 69 63 20 2d 20 74 ** is atomic - t
ba180 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 hat it cannot be
ba190 20 64 65 63 65 69 76 65 64 20 69 6e 74 6f 20 74 deceived into t
ba1a0 68 69 6e 6b 69 6e 67 20 73 65 6c 66 0d 0a 20 20 hinking self..
ba1b0 2a 2a 20 61 6e 64 20 70 2d 3e 6f 77 6e 65 72 20 ** and p->owner
ba1c0 61 72 65 20 65 71 75 61 6c 20 69 66 20 70 2d 3e are equal if p->
ba1d0 6f 77 6e 65 72 20 63 68 61 6e 67 65 73 20 62 65 owner changes be
ba1e0 74 77 65 65 6e 20 74 77 6f 20 76 61 6c 75 65 73 tween two values
ba1f0 0d 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 .. ** that are
ba200 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 73 65 6c not equal to sel
ba210 66 20 77 68 69 6c 65 20 74 68 65 20 63 6f 6d 70 f while the comp
ba220 61 72 69 73 6f 6e 20 69 73 20 74 61 6b 69 6e 67 arison is taking
ba230 20 70 6c 61 63 65 2e 0d 0a 20 20 2a 2a 20 54 68 place... ** Th
ba240 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f is implementatio
ba250 6e 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 61 n also assumes a
ba260 20 63 6f 68 65 72 65 6e 74 20 63 61 63 68 65 20 coherent cache
ba270 2d 20 74 68 61 74 20 0d 0a 20 20 2a 2a 20 73 65 - that .. ** se
ba280 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 parate processes
ba290 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 64 69 66 cannot read dif
ba2a0 66 65 72 65 6e 74 20 76 61 6c 75 65 73 20 66 72 ferent values fr
ba2b0 6f 6d 20 74 68 65 20 73 61 6d 65 0d 0a 20 20 2a om the same.. *
ba2c0 2a 20 61 64 64 72 65 73 73 20 61 74 20 74 68 65 * address at the
ba2d0 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49 66 20 same time. If
ba2e0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 either of these
ba2f0 74 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 0d 0a two conditions..
ba300 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 6d 65 74 ** are not met
ba310 2c 20 74 68 65 6e 20 74 68 65 20 6d 75 74 65 78 , then the mutex
ba320 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 es will fail and
ba330 20 70 72 6f 62 6c 65 6d 73 20 77 69 6c 6c 20 72 problems will r
ba340 65 73 75 6c 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 esult... */..
ba350 7b 0d 0a 20 20 20 20 70 74 68 72 65 61 64 5f 74 {.. pthread_t
ba360 20 73 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f self = pthread_
ba370 73 65 6c 66 28 29 3b 0d 0a 20 20 20 20 69 66 28 self();.. if(
ba380 20 70 2d 3e 6e 52 65 66 3e 30 20 26 26 20 70 74 p->nRef>0 && pt
ba390 68 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f hread_equal(p->o
ba3a0 77 6e 65 72 2c 20 73 65 6c 66 29 20 29 7b 0d 0a wner, self) ){..
ba3b0 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b p->nRef++;
ba3c0 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c .. rc = SQL
ba3d0 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 65 6c ITE_OK;.. }el
ba3e0 73 65 20 69 66 28 20 70 74 68 72 65 61 64 5f 6d se if( pthread_m
ba3f0 75 74 65 78 5f 74 72 79 6c 6f 63 6b 28 26 70 2d utex_trylock(&p-
ba400 3e 6d 75 74 65 78 29 3d 3d 30 20 29 7b 0d 0a 20 >mutex)==0 ){..
ba410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e assert( p->
ba420 6e 52 65 66 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 nRef==0 );..
ba430 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c p->owner = sel
ba440 66 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 f;.. p->nRe
ba450 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 72 63 f = 1;.. rc
ba460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 = SQLITE_OK;..
ba470 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
ba480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 rc = SQLITE_BUS
ba490 59 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a Y;.. }.. }..
ba4a0 23 65 6c 73 65 0d 0a 20 20 2f 2a 20 55 73 65 20 #else.. /* Use
ba4b0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 72 65 63 the built-in rec
ba4c0 75 72 73 69 76 65 20 6d 75 74 65 78 65 73 20 69 ursive mutexes i
ba4d0 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c f they are avail
ba4e0 61 62 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 able... */.. i
ba4f0 66 28 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 f( pthread_mutex
ba500 5f 74 72 79 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74 _trylock(&p->mut
ba510 65 78 29 3d 3d 30 20 29 7b 0d 0a 23 69 66 20 53 ex)==0 ){..#if S
ba520 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 QLITE_MUTEX_NREF
ba530 0d 0a 20 20 20 20 70 2d 3e 6f 77 6e 65 72 20 3d .. p->owner =
ba540 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b pthread_self();
ba550 0d 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b .. p->nRef++;
ba560 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 72 63 ..#endif.. rc
ba570 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 = SQLITE_OK;..
ba580 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 20 }else{.. rc
ba590 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a = SQLITE_BUSY;..
ba5a0 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 }..#endif....#
ba5b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
ba5c0 55 47 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 UG.. if( rc==SQ
ba5d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 74 72 LITE_OK && p->tr
ba5e0 61 63 65 20 29 7b 0d 0a 20 20 20 20 70 72 69 6e ace ){.. prin
ba5f0 74 66 28 22 65 6e 74 65 72 20 6d 75 74 65 78 20 tf("enter mutex
ba600 25 70 20 28 25 64 29 20 77 69 74 68 20 6e 52 65 %p (%d) with nRe
ba610 66 3d 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 f=%d\n", p, p->t
ba620 72 61 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0d race, p->nRef);.
ba630 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 . }..#endif..
ba640 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
ba650 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 ./*..** The sqli
ba660 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
ba670 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74 73 20 ) routine exits
ba680 61 20 6d 75 74 65 78 20 74 68 61 74 20 77 61 73 a mutex that was
ba690 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 ..** previously
ba6a0 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 73 entered by the s
ba6b0 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 ame thread. The
ba6c0 20 62 65 68 61 76 69 6f 72 0d 0a 2a 2a 20 69 73 behavior..** is
ba6d0 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68 undefined if th
ba6e0 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63 e mutex is not c
ba6f0 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64 urrently entered
ba700 20 6f 72 0d 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 or..** is not c
ba710 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 urrently allocat
ba720 65 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c ed. SQLite will
ba730 20 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 72 never do either
ba740 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f ...*/..static vo
ba750 69 64 20 70 74 68 72 65 61 64 4d 75 74 65 78 4c id pthreadMutexL
ba760 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 eave(sqlite3_mut
ba770 65 78 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 ex *p){.. asser
ba780 74 28 20 70 74 68 72 65 61 64 4d 75 74 65 78 48 t( pthreadMutexH
ba790 65 6c 64 28 70 29 20 29 3b 0d 0a 23 69 66 20 53 eld(p) );..#if S
ba7a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 QLITE_MUTEX_NREF
ba7b0 0d 0a 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a .. p->nRef--;..
ba7c0 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 if( p->nRef==0
ba7d0 20 29 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 30 3b ) p->owner = 0;
ba7e0 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 61 73 73 65 ..#endif.. asse
ba7f0 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c rt( p->nRef==0 |
ba800 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f | p->id==SQLITE_
ba810 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 MUTEX_RECURSIVE
ba820 29 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c );....#ifdef SQL
ba830 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 ITE_HOMEGROWN_RE
ba840 43 55 52 53 49 56 45 5f 4d 55 54 45 58 0d 0a 20 CURSIVE_MUTEX..
ba850 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 if( p->nRef==0
ba860 29 7b 0d 0a 20 20 20 20 70 74 68 72 65 61 64 5f ){.. pthread_
ba870 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d mutex_unlock(&p-
ba880 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a 23 >mutex);.. }..#
ba890 65 6c 73 65 0d 0a 20 20 70 74 68 72 65 61 64 5f else.. pthread_
ba8a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d mutex_unlock(&p-
ba8b0 3e 6d 75 74 65 78 29 3b 0d 0a 23 65 6e 64 69 66 >mutex);..#endif
ba8c0 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ....#ifdef SQLIT
ba8d0 45 5f 44 45 42 55 47 0d 0a 20 20 69 66 28 20 70 E_DEBUG.. if( p
ba8e0 2d 3e 74 72 61 63 65 20 29 7b 0d 0a 20 20 20 20 ->trace ){..
ba8f0 70 72 69 6e 74 66 28 22 6c 65 61 76 65 20 6d 75 printf("leave mu
ba900 74 65 78 20 25 70 20 28 25 64 29 20 77 69 74 68 tex %p (%d) with
ba910 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c 20 nRef=%d\n", p,
ba920 70 2d 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52 65 p->trace, p->nRe
ba930 66 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 f);.. }..#endif
ba940 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 ..}....SQLITE_PR
ba950 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 6d 75 IVATE sqlite3_mu
ba960 74 65 78 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 tex_methods cons
ba970 74 20 2a 73 71 6c 69 74 65 33 44 65 66 61 75 6c t *sqlite3Defaul
ba980 74 4d 75 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 tMutex(void){..
ba990 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 static const sq
ba9a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 lite3_mutex_meth
ba9b0 6f 64 73 20 73 4d 75 74 65 78 20 3d 20 7b 0d 0a ods sMutex = {..
ba9c0 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 pthreadMutex
ba9d0 49 6e 69 74 2c 0d 0a 20 20 20 20 70 74 68 72 65 Init,.. pthre
ba9e0 61 64 4d 75 74 65 78 45 6e 64 2c 0d 0a 20 20 20 adMutexEnd,..
ba9f0 20 70 74 68 72 65 61 64 4d 75 74 65 78 41 6c 6c pthreadMutexAll
baa00 6f 63 2c 0d 0a 20 20 20 20 70 74 68 72 65 61 64 oc,.. pthread
baa10 4d 75 74 65 78 46 72 65 65 2c 0d 0a 20 20 20 20 MutexFree,..
baa20 70 74 68 72 65 61 64 4d 75 74 65 78 45 6e 74 65 pthreadMutexEnte
baa30 72 2c 0d 0a 20 20 20 20 70 74 68 72 65 61 64 4d r,.. pthreadM
baa40 75 74 65 78 54 72 79 2c 0d 0a 20 20 20 20 70 74 utexTry,.. pt
baa50 68 72 65 61 64 4d 75 74 65 78 4c 65 61 76 65 2c hreadMutexLeave,
baa60 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
baa70 44 45 42 55 47 0d 0a 20 20 20 20 70 74 68 72 65 DEBUG.. pthre
baa80 61 64 4d 75 74 65 78 48 65 6c 64 2c 0d 0a 20 20 adMutexHeld,..
baa90 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 4e 6f pthreadMutexNo
baaa0 74 68 65 6c 64 0d 0a 23 65 6c 73 65 0d 0a 20 20 theld..#else..
baab0 20 20 30 2c 0d 0a 20 20 20 20 30 0d 0a 23 65 6e 0,.. 0..#en
baac0 64 69 66 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20 20 72 dif.. };.... r
baad0 65 74 75 72 6e 20 26 73 4d 75 74 65 78 3b 0d 0a eturn &sMutex;..
baae0 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 }....#endif /* S
baaf0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 QLITE_MUTEX_PTHR
bab00 45 41 44 53 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a EADS */..../****
bab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
bab20 66 20 6d 75 74 65 78 5f 75 6e 69 78 2e 63 20 2a f mutex_unix.c *
bab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
bab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
bab70 6e 20 66 69 6c 65 20 6d 75 74 65 78 5f 77 33 32 n file mutex_w32
bab80 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .c *************
bab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
baba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
babb0 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73 74 20 .** 2007 August
babc0 31 34 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 14..**..** The a
babd0 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 uthor disclaims
babe0 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 copyright to thi
babf0 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 s source code.
bac00 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 In place of..**
bac10 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 a legal notice,
bac20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 here is a blessi
bac30 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d ng:..**..** M
bac40 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
bac50 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a nd not evil...**
bac60 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 May you find
bac70 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 forgiveness for
bac80 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f yourself and fo
bac90 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a rgive others...*
baca0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 * May you sha
bacb0 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 re freely, never
bacc0 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 taking more tha
bacd0 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d n you give...**.
bace0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
bacf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bad00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bad10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bad20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 **********..** T
bad30 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e his file contain
bad40 73 20 74 68 65 20 43 20 66 75 6e 63 74 69 6f 6e s the C function
bad50 73 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 s that implement
bad60 20 6d 75 74 65 78 65 73 20 66 6f 72 20 77 69 6e mutexes for win
bad70 33 32 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 32..*/..../*..**
bad80 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 The code in thi
bad90 73 20 66 69 6c 65 20 69 73 20 6f 6e 6c 79 20 75 s file is only u
bada0 73 65 64 20 69 66 20 77 65 20 61 72 65 20 63 6f sed if we are co
badb0 6d 70 69 6c 69 6e 67 20 6d 75 6c 74 69 74 68 72 mpiling multithr
badc0 65 61 64 65 64 0d 0a 2a 2a 20 6f 6e 20 61 20 77 eaded..** on a w
badd0 69 6e 33 32 20 73 79 73 74 65 6d 2e 0d 0a 2a 2f in32 system...*/
bade0 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
badf0 4d 55 54 45 58 5f 57 33 32 0d 0a 0d 0a 2f 2a 0d MUTEX_W32..../*.
bae00 0a 2a 2a 20 45 61 63 68 20 72 65 63 75 72 73 69 .** Each recursi
bae10 76 65 20 6d 75 74 65 78 20 69 73 20 61 6e 20 69 ve mutex is an i
bae20 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 nstance of the f
bae30 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
bae40 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 re...*/..struct
bae50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 7b 0d sqlite3_mutex {.
bae60 0a 20 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54 . CRITICAL_SECT
bae70 49 4f 4e 20 6d 75 74 65 78 3b 20 20 20 20 2f 2a ION mutex; /*
bae80 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f 6c 6c 69 Mutex controlli
bae90 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0d 0a ng the lock */..
baea0 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 20 20 int id;
baeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
baec0 4d 75 74 65 78 20 74 79 70 65 20 2a 2f 0d 0a 23 Mutex type */..#
baed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
baee0 55 47 0d 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 UG.. volatile i
baef0 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 nt nRef;
baf00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e /* Number of en
baf10 74 65 72 61 6e 63 65 73 20 2a 2f 0d 0a 20 20 76 terances */.. v
baf20 6f 6c 61 74 69 6c 65 20 44 57 4f 52 44 20 6f 77 olatile DWORD ow
baf30 6e 65 72 3b 20 20 20 20 20 20 2f 2a 20 54 68 72 ner; /* Thr
baf40 65 61 64 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 ead holding this
baf50 20 6d 75 74 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 mutex */.. int
baf60 20 74 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 trace;
baf70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
baf80 74 6f 20 74 72 61 63 65 20 63 68 61 6e 67 65 73 to trace changes
baf90 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d */..#endif..};.
bafa0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f .#define SQLITE_
bafb0 57 33 32 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 W32_MUTEX_INITIA
bafc0 4c 49 5a 45 52 20 7b 20 30 20 7d 0d 0a 23 69 66 LIZER { 0 }..#if
bafd0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
bafe0 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 ..#define SQLITE
baff0 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 3_MUTEX_INITIALI
bb000 5a 45 52 20 7b 20 53 51 4c 49 54 45 5f 57 33 32 ZER { SQLITE_W32
bb010 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a _MUTEX_INITIALIZ
bb020 45 52 2c 20 30 2c 20 30 4c 2c 20 28 44 57 4f 52 ER, 0, 0L, (DWOR
bb030 44 29 30 2c 20 30 20 7d 0d 0a 23 65 6c 73 65 0d D)0, 0 }..#else.
bb040 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 33 .#define SQLITE3
bb050 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a _MUTEX_INITIALIZ
bb060 45 52 20 7b 20 53 51 4c 49 54 45 5f 57 33 32 5f ER { SQLITE_W32_
bb070 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 MUTEX_INITIALIZE
bb080 52 2c 20 30 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a R, 0 }..#endif..
bb090 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ../*..** Return
bb0a0 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 true (non-zero)
bb0b0 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e if we are runnin
bb0c0 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 g under WinNT, W
bb0d0 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0d 0a 2a 2a in2K, WinXP,..**
bb0e0 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 or WinCE. Retu
bb0f0 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 rn false (zero)
bb100 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 for Win95, Win98
bb110 2c 20 6f 72 20 57 69 6e 4d 45 2e 0d 0a 2a 2a 0d , or WinME...**.
bb120 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 .** Here is an i
bb130 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 nteresting obser
bb140 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 vation: Win95,
bb150 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 Win98, and WinME
bb160 20 6c 61 63 6b 0d 0a 2a 2a 20 74 68 65 20 4c 6f lack..** the Lo
bb170 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 ckFileEx() API.
bb180 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c But we can stil
bb190 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e l statically lin
bb1a0 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0d 0a k against that..
bb1b0 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 ** API as long a
bb1c0 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 s we don't call
bb1d0 69 74 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 it win running W
bb1e0 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 in95/98/ME. A c
bb1f0 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 74 68 69 73 20 all to..** this
bb200 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 routine is used
bb210 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 to determine if
bb220 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 the host is Win9
bb230 35 2f 39 38 2f 4d 45 20 6f 72 0d 0a 2a 2a 20 57 5/98/ME or..** W
bb240 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 inNT/2K/XP so th
bb250 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 at we will know
bb260 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 whether or not w
bb270 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c e can safely cal
bb280 6c 0d 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 l..** the LockFi
bb290 6c 65 45 78 28 29 20 41 50 49 2e 0d 0a 2a 2a 0d leEx() API...**.
bb2a0 0a 2a 2a 20 6d 75 74 65 78 49 73 4e 54 28 29 20 .** mutexIsNT()
bb2b0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 is only used for
bb2c0 20 74 68 65 20 54 72 79 45 6e 74 65 72 43 72 69 the TryEnterCri
bb2d0 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 29 20 41 ticalSection() A
bb2e0 50 49 20 63 61 6c 6c 2c 0d 0a 2a 2a 20 77 68 69 PI call,..** whi
bb2f0 63 68 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c ch is only avail
bb300 61 62 6c 65 20 69 66 20 79 6f 75 72 20 61 70 70 able if your app
bb310 6c 69 63 61 74 69 6f 6e 20 77 61 73 20 63 6f 6d lication was com
bb320 70 69 6c 65 64 20 77 69 74 68 20 0d 0a 2a 2a 20 piled with ..**
bb330 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 20 64 65 66 _WIN32_WINNT def
bb340 69 6e 65 64 20 74 6f 20 61 20 76 61 6c 75 65 20 ined to a value
bb350 3e 3d 20 30 78 30 34 30 30 2e 20 20 43 75 72 72 >= 0x0400. Curr
bb360 65 6e 74 6c 79 2c 20 74 68 65 20 6f 6e 6c 79 0d ently, the only.
bb370 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 54 72 79 45 .** call to TryE
bb380 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65 63 74 nterCriticalSect
bb390 69 6f 6e 28 29 20 69 73 20 23 69 66 64 65 66 27 ion() is #ifdef'
bb3a0 65 64 20 6f 75 74 2c 20 73 6f 20 23 69 66 64 65 ed out, so #ifde
bb3b0 66 20 0d 0a 2a 2a 20 74 68 69 73 20 6f 75 74 20 f ..** this out
bb3c0 61 73 20 77 65 6c 6c 2e 0d 0a 2a 2f 0d 0a 23 69 as well...*/..#i
bb3d0 66 20 30 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f f 0..#if SQLITE_
bb3e0 4f 53 5f 57 49 4e 43 45 0d 0a 23 20 64 65 66 69 OS_WINCE..# defi
bb3f0 6e 65 20 6d 75 74 65 78 49 73 4e 54 28 29 20 20 ne mutexIsNT()
bb400 28 31 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 73 74 (1)..#else.. st
bb410 61 74 69 63 20 69 6e 74 20 6d 75 74 65 78 49 73 atic int mutexIs
bb420 4e 54 28 76 6f 69 64 29 7b 0d 0a 20 20 20 20 73 NT(void){.. s
bb430 74 61 74 69 63 20 69 6e 74 20 6f 73 54 79 70 65 tatic int osType
bb440 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 6f = 0;.. if( o
bb450 73 54 79 70 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 sType==0 ){..
bb460 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f OSVERSIONINFO
bb470 20 73 49 6e 66 6f 3b 0d 0a 20 20 20 20 20 20 73 sInfo;.. s
bb480 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e Info.dwOSVersion
bb490 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f InfoSize = sizeo
bb4a0 66 28 73 49 6e 66 6f 29 3b 0d 0a 20 20 20 20 20 f(sInfo);..
bb4b0 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28 26 73 GetVersionEx(&s
bb4c0 49 6e 66 6f 29 3b 0d 0a 20 20 20 20 20 20 6f 73 Info);.. os
bb4d0 54 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 Type = sInfo.dwP
bb4e0 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 latformId==VER_P
bb4f0 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 LATFORM_WIN32_NT
bb500 20 3f 20 32 20 3a 20 31 3b 0d 0a 20 20 20 20 7d ? 2 : 1;.. }
bb510 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 54 .. return osT
bb520 79 70 65 3d 3d 32 3b 0d 0a 20 20 7d 0d 0a 23 65 ype==2;.. }..#e
bb530 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
bb540 53 5f 57 49 4e 43 45 20 2a 2f 0d 0a 23 65 6e 64 S_WINCE */..#end
bb550 69 66 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c if....#ifdef SQL
bb560 49 54 45 5f 44 45 42 55 47 0d 0a 2f 2a 0d 0a 2a ITE_DEBUG../*..*
bb570 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 * The sqlite3_mu
bb580 74 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20 73 tex_held() and s
bb590 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 qlite3_mutex_not
bb5a0 68 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20 61 held() routine a
bb5b0 72 65 0d 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 re..** intended
bb5c0 66 6f 72 20 75 73 65 20 6f 6e 6c 79 20 69 6e 73 for use only ins
bb5d0 69 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61 ide assert() sta
bb5e0 74 65 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 tements...*/..st
bb5f0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 75 74 65 atic int winMute
bb600 78 48 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 xHeld(sqlite3_mu
bb610 74 65 78 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 tex *p){.. retu
bb620 72 6e 20 70 2d 3e 6e 52 65 66 21 3d 30 20 26 26 rn p->nRef!=0 &&
bb630 20 70 2d 3e 6f 77 6e 65 72 3d 3d 47 65 74 43 75 p->owner==GetCu
bb640 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 3b rrentThreadId();
bb650 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 ..}..static int
bb660 77 69 6e 4d 75 74 65 78 4e 6f 74 68 65 6c 64 32 winMutexNotheld2
bb670 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a (sqlite3_mutex *
bb680 70 2c 20 44 57 4f 52 44 20 74 69 64 29 7b 0d 0a p, DWORD tid){..
bb690 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 return p->nRef
bb6a0 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 77 6e 65 72 21 ==0 || p->owner!
bb6b0 3d 74 69 64 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 =tid;..}..static
bb6c0 20 69 6e 74 20 77 69 6e 4d 75 74 65 78 4e 6f 74 int winMutexNot
bb6d0 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 held(sqlite3_mut
bb6e0 65 78 20 2a 70 29 7b 0d 0a 20 20 44 57 4f 52 44 ex *p){.. DWORD
bb6f0 20 74 69 64 20 3d 20 47 65 74 43 75 72 72 65 6e tid = GetCurren
bb700 74 54 68 72 65 61 64 49 64 28 29 3b 20 0d 0a 20 tThreadId(); ..
bb710 20 72 65 74 75 72 6e 20 77 69 6e 4d 75 74 65 78 return winMutex
bb720 4e 6f 74 68 65 6c 64 32 28 70 2c 20 74 69 64 29 Notheld2(p, tid)
bb730 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ;..}..#endif....
bb740 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c ../*..** Initial
bb750 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 ize and deinitia
bb760 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 lize the mutex s
bb770 75 62 73 79 73 74 65 6d 2e 0d 0a 2a 2f 0d 0a 73 ubsystem...*/..s
bb780 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 tatic sqlite3_mu
bb790 74 65 78 20 77 69 6e 4d 75 74 65 78 5f 73 74 61 tex winMutex_sta
bb7a0 74 69 63 4d 75 74 65 78 65 73 5b 36 5d 20 3d 20 ticMutexes[6] =
bb7b0 7b 0d 0a 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 {.. SQLITE3_MUT
bb7c0 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0d EX_INITIALIZER,.
bb7d0 0a 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 . SQLITE3_MUTEX
bb7e0 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0d 0a 20 _INITIALIZER,..
bb7f0 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 SQLITE3_MUTEX_I
bb800 4e 49 54 49 41 4c 49 5a 45 52 2c 0d 0a 20 20 53 NITIALIZER,.. S
bb810 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 QLITE3_MUTEX_INI
bb820 54 49 41 4c 49 5a 45 52 2c 0d 0a 20 20 53 51 4c TIALIZER,.. SQL
bb830 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 ITE3_MUTEX_INITI
bb840 41 4c 49 5a 45 52 2c 0d 0a 20 20 53 51 4c 49 54 ALIZER,.. SQLIT
bb850 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c E3_MUTEX_INITIAL
bb860 49 5a 45 52 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63 IZER..};..static
bb870 20 69 6e 74 20 77 69 6e 4d 75 74 65 78 5f 69 73 int winMutex_is
bb880 49 6e 69 74 20 3d 20 30 3b 0d 0a 2f 2a 20 41 73 Init = 0;../* As
bb890 20 77 69 6e 4d 75 74 65 78 49 6e 69 74 28 29 20 winMutexInit()
bb8a0 61 6e 64 20 77 69 6e 4d 75 74 65 78 45 6e 64 28 and winMutexEnd(
bb8b0 29 20 61 72 65 20 63 61 6c 6c 65 64 20 61 73 20 ) are called as
bb8c0 70 61 72 74 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 part..** of the
bb8d0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 sqlite3_initiali
bb8e0 7a 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 ze and sqlite3_s
bb8f0 68 75 74 64 6f 77 6e 28 29 0d 0a 2a 2a 20 70 72 hutdown()..** pr
bb900 6f 63 65 73 73 69 6e 67 2c 20 74 68 65 20 22 69 ocessing, the "i
bb910 6e 74 65 72 6c 6f 63 6b 65 64 22 20 6d 61 67 69 nterlocked" magi
bb920 63 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f c is probably no
bb930 74 0d 0a 2a 2a 20 73 74 72 69 63 74 6c 79 20 6e t..** strictly n
bb940 65 63 65 73 73 61 72 79 2e 0d 0a 2a 2f 0d 0a 73 ecessary...*/..s
bb950 74 61 74 69 63 20 6c 6f 6e 67 20 77 69 6e 4d 75 tatic long winMu
bb960 74 65 78 5f 6c 6f 63 6b 20 3d 20 30 3b 0d 0a 0d tex_lock = 0;...
bb970 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d .static int winM
bb980 75 74 65 78 49 6e 69 74 28 76 6f 69 64 29 7b 20 utexInit(void){
bb990 0d 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 .. /* The first
bb9a0 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 6f to increment to
bb9b0 20 31 20 64 6f 65 73 20 61 63 74 75 61 6c 20 69 1 does actual i
bb9c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f nitialization */
bb9d0 0d 0a 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 .. if( Interloc
bb9e0 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e kedCompareExchan
bb9f0 67 65 28 26 77 69 6e 4d 75 74 65 78 5f 6c 6f 63 ge(&winMutex_loc
bba00 6b 2c 20 31 2c 20 30 29 3d 3d 30 20 29 7b 0d 0a k, 1, 0)==0 ){..
bba10 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 int i;..
bba20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 for(i=0; i<Array
bba30 53 69 7a 65 28 77 69 6e 4d 75 74 65 78 5f 73 74 Size(winMutex_st
bba40 61 74 69 63 4d 75 74 65 78 65 73 29 3b 20 69 2b aticMutexes); i+
bba50 2b 29 7b 0d 0a 20 20 20 20 20 20 49 6e 69 74 69 +){.. Initi
bba60 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 alizeCriticalSec
bba70 74 69 6f 6e 28 26 77 69 6e 4d 75 74 65 78 5f 73 tion(&winMutex_s
bba80 74 61 74 69 63 4d 75 74 65 78 65 73 5b 69 5d 2e taticMutexes[i].
bba90 6d 75 74 65 78 29 3b 0d 0a 20 20 20 20 7d 0d 0a mutex);.. }..
bbaa0 20 20 20 20 77 69 6e 4d 75 74 65 78 5f 69 73 49 winMutex_isI
bbab0 6e 69 74 20 3d 20 31 3b 0d 0a 20 20 7d 65 6c 73 nit = 1;.. }els
bbac0 65 7b 0d 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 6f e{.. /* Someo
bbad0 6e 65 20 65 6c 73 65 20 69 73 20 69 6e 20 74 68 ne else is in th
bbae0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 69 6e 69 e process of ini
bbaf0 74 69 6e 67 20 74 68 65 20 73 74 61 74 69 63 20 ting the static
bbb00 6d 75 74 65 78 65 73 20 2a 2f 0d 0a 20 20 20 20 mutexes */..
bbb10 77 68 69 6c 65 28 20 21 77 69 6e 4d 75 74 65 78 while( !winMutex
bbb20 5f 69 73 49 6e 69 74 20 29 7b 0d 0a 20 20 20 20 _isInit ){..
bbb30 20 20 53 6c 65 65 70 28 31 29 3b 0d 0a 20 20 20 Sleep(1);..
bbb40 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 }.. }.. retur
bbb50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0d 0a 7d n SQLITE_OK; ..}
bbb60 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 ....static int w
bbb70 69 6e 4d 75 74 65 78 45 6e 64 28 76 6f 69 64 29 inMutexEnd(void)
bbb80 7b 20 0d 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 { .. /* The fir
bbb90 73 74 20 74 6f 20 64 65 63 72 65 6d 65 6e 74 20 st to decrement
bbba0 74 6f 20 30 20 64 6f 65 73 20 61 63 74 75 61 6c to 0 does actual
bbbb0 20 73 68 75 74 64 6f 77 6e 20 0d 0a 20 20 2a 2a shutdown .. **
bbbc0 20 28 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 (which should b
bbbd0 65 20 74 68 65 20 6c 61 73 74 20 74 6f 20 73 68 e the last to sh
bbbe0 75 74 64 6f 77 6e 2e 29 20 2a 2f 0d 0a 20 20 69 utdown.) */.. i
bbbf0 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f f( InterlockedCo
bbc00 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 77 mpareExchange(&w
bbc10 69 6e 4d 75 74 65 78 5f 6c 6f 63 6b 2c 20 30 2c inMutex_lock, 0,
bbc20 20 31 29 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 69 1)==1 ){.. i
bbc30 66 28 20 77 69 6e 4d 75 74 65 78 5f 69 73 49 6e f( winMutex_isIn
bbc40 69 74 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 it==1 ){..
bbc50 69 6e 74 20 69 3b 0d 0a 20 20 20 20 20 20 66 6f int i;.. fo
bbc60 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 r(i=0; i<ArraySi
bbc70 7a 65 28 77 69 6e 4d 75 74 65 78 5f 73 74 61 74 ze(winMutex_stat
bbc80 69 63 4d 75 74 65 78 65 73 29 3b 20 69 2b 2b 29 icMutexes); i++)
bbc90 7b 0d 0a 20 20 20 20 20 20 20 20 44 65 6c 65 74 {.. Delet
bbca0 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e eCriticalSection
bbcb0 28 26 77 69 6e 4d 75 74 65 78 5f 73 74 61 74 69 (&winMutex_stati
bbcc0 63 4d 75 74 65 78 65 73 5b 69 5d 2e 6d 75 74 65 cMutexes[i].mute
bbcd0 78 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 x);.. }..
bbce0 20 20 20 20 77 69 6e 4d 75 74 65 78 5f 69 73 49 winMutex_isI
bbcf0 6e 69 74 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d nit = 0;.. }.
bbd00 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 . }.. return S
bbd10 51 4c 49 54 45 5f 4f 4b 3b 20 0d 0a 7d 0d 0a 0d QLITE_OK; ..}...
bbd20 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 71 6c 69 ./*..** The sqli
bbd30 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 te3_mutex_alloc(
bbd40 29 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 ) routine alloca
bbd50 74 65 73 20 61 20 6e 65 77 0d 0a 2a 2a 20 6d 75 tes a new..** mu
bbd60 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 73 20 tex and returns
bbd70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e a pointer to it.
bbd80 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 If it returns
bbd90 4e 55 4c 4c 0d 0a 2a 2a 20 74 68 61 74 20 6d 65 NULL..** that me
bbda0 61 6e 73 20 74 68 61 74 20 61 20 6d 75 74 65 78 ans that a mutex
bbdb0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c could not be al
bbdc0 6c 6f 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65 located. SQLite
bbdd0 0d 0a 2a 2a 20 77 69 6c 6c 20 75 6e 77 69 6e 64 ..** will unwind
bbde0 20 69 74 73 20 73 74 61 63 6b 20 61 6e 64 20 72 its stack and r
bbdf0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 20 eturn an error.
bbe00 20 54 68 65 20 61 72 67 75 6d 65 6e 74 0d 0a 2a The argument..*
bbe10 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75 74 * to sqlite3_mut
bbe20 65 78 5f 61 6c 6c 6f 63 28 29 20 69 73 20 6f 6e ex_alloc() is on
bbe30 65 20 6f 66 20 74 68 65 73 65 20 69 6e 74 65 67 e of these integ
bbe40 65 72 20 63 6f 6e 73 74 61 6e 74 73 3a 0d 0a 2a er constants:..*
bbe50 2a 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c *..** <ul>..** <
bbe60 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 li> SQLITE_MUTE
bbe70 58 5f 46 41 53 54 0d 0a 2a 2a 20 3c 6c 69 3e 20 X_FAST..** <li>
bbe80 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 SQLITE_MUTEX_RE
bbe90 43 55 52 53 49 56 45 0d 0a 2a 2a 20 3c 6c 69 3e CURSIVE..** <li>
bbea0 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 SQLITE_MUTEX_S
bbeb0 54 41 54 49 43 5f 4d 41 53 54 45 52 0d 0a 2a 2a TATIC_MASTER..**
bbec0 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 <li> SQLITE_MU
bbed0 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 0d 0a TEX_STATIC_MEM..
bbee0 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f ** <li> SQLITE_
bbef0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d MUTEX_STATIC_MEM
bbf00 32 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 2..** <li> SQLI
bbf10 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
bbf20 50 52 4e 47 0d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 PRNG..** <li> S
bbf30 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 QLITE_MUTEX_STAT
bbf40 49 43 5f 4c 52 55 0d 0a 2a 2a 20 3c 6c 69 3e 20 IC_LRU..** <li>
bbf50 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 SQLITE_MUTEX_ST
bbf60 41 54 49 43 5f 50 4d 45 4d 0d 0a 2a 2a 20 3c 2f ATIC_PMEM..** </
bbf70 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ul>..**..** The
bbf80 66 69 72 73 74 20 74 77 6f 20 63 6f 6e 73 74 61 first two consta
bbf90 6e 74 73 20 63 61 75 73 65 20 73 71 6c 69 74 65 nts cause sqlite
bbfa0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 3_mutex_alloc()
bbfb0 74 6f 20 63 72 65 61 74 65 0d 0a 2a 2a 20 61 20 to create..** a
bbfc0 6e 65 77 20 6d 75 74 65 78 2e 20 20 54 68 65 20 new mutex. The
bbfd0 6e 65 77 20 6d 75 74 65 78 20 69 73 20 72 65 63 new mutex is rec
bbfe0 75 72 73 69 76 65 20 77 68 65 6e 20 53 51 4c 49 ursive when SQLI
bbff0 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 TE_MUTEX_RECURSI
bc000 56 45 0d 0a 2a 2a 20 69 73 20 75 73 65 64 20 62 VE..** is used b
bc010 75 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 ut not necessari
bc020 6c 79 20 73 6f 20 77 68 65 6e 20 53 51 4c 49 54 ly so when SQLIT
bc030 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 69 73 20 E_MUTEX_FAST is
bc040 75 73 65 64 2e 0d 0a 2a 2a 20 54 68 65 20 6d 75 used...** The mu
bc050 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 tex implementati
bc060 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 on does not need
bc070 20 74 6f 20 6d 61 6b 65 20 61 20 64 69 73 74 69 to make a disti
bc080 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 62 65 74 77 65 nction..** betwe
bc090 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f en SQLITE_MUTEX_
bc0a0 52 45 43 55 52 53 49 56 45 20 61 6e 64 20 53 51 RECURSIVE and SQ
bc0b0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 LITE_MUTEX_FAST
bc0c0 69 66 20 69 74 20 64 6f 65 73 0d 0a 2a 2a 20 6e if it does..** n
bc0d0 6f 74 20 77 61 6e 74 20 74 6f 2e 20 20 42 75 74 ot want to. But
bc0e0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6f 6e 6c SQLite will onl
bc0f0 79 20 72 65 71 75 65 73 74 20 61 20 72 65 63 75 y request a recu
bc100 72 73 69 76 65 20 6d 75 74 65 78 20 69 6e 0d 0a rsive mutex in..
bc110 2a 2a 20 63 61 73 65 73 20 77 68 65 72 65 20 69 ** cases where i
bc120 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 6f t really needs o
bc130 6e 65 2e 20 20 49 66 20 61 20 66 61 73 74 65 72 ne. If a faster
bc140 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76 65 20 6d non-recursive m
bc150 75 74 65 78 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 utex..** impleme
bc160 6e 74 61 74 69 6f 6e 20 69 73 20 61 76 61 69 6c ntation is avail
bc170 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 able on the host
bc180 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65 20 6d platform, the m
bc190 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 0d 0a utex subsystem..
bc1a0 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 ** might return
bc1b0 73 75 63 68 20 61 20 6d 75 74 65 78 20 69 6e 20 such a mutex in
bc1c0 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51 4c 49 response to SQLI
bc1d0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e 0d 0a TE_MUTEX_FAST...
bc1e0 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72 **..** The other
bc1f0 20 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74 allowed paramet
bc200 65 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d ers to sqlite3_m
bc210 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63 utex_alloc() eac
bc220 68 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 61 20 70 h return..** a p
bc230 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 ointer to a stat
bc240 69 63 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d ic preexisting m
bc250 75 74 65 78 2e 20 20 53 69 78 20 73 74 61 74 69 utex. Six stati
bc260 63 20 6d 75 74 65 78 65 73 20 61 72 65 0d 0a 2a c mutexes are..*
bc270 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 63 75 * used by the cu
bc280 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 rrent version of
bc290 20 53 51 4c 69 74 65 2e 20 20 46 75 74 75 72 65 SQLite. Future
bc2a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c versions of SQL
bc2b0 69 74 65 0d 0a 2a 2a 20 6d 61 79 20 61 64 64 20 ite..** may add
bc2c0 61 64 64 69 74 69 6f 6e 61 6c 20 73 74 61 74 69 additional stati
bc2d0 63 20 6d 75 74 65 78 65 73 2e 20 20 53 74 61 74 c mutexes. Stat
bc2e0 69 63 20 6d 75 74 65 78 65 73 20 61 72 65 20 66 ic mutexes are f
bc2f0 6f 72 20 69 6e 74 65 72 6e 61 6c 0d 0a 2a 2a 20 or internal..**
bc300 75 73 65 20 62 79 20 53 51 4c 69 74 65 20 6f 6e use by SQLite on
bc310 6c 79 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e ly. Application
bc320 73 20 74 68 61 74 20 75 73 65 20 53 51 4c 69 74 s that use SQLit
bc330 65 20 6d 75 74 65 78 65 73 20 73 68 6f 75 6c 64 e mutexes should
bc340 0d 0a 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 ..** use only th
bc350 65 20 64 79 6e 61 6d 69 63 20 6d 75 74 65 78 65 e dynamic mutexe
bc360 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 51 s returned by SQ
bc370 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 LITE_MUTEX_FAST
bc380 6f 72 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 55 or..** SQLITE_MU
bc390 54 45 58 5f 52 45 43 55 52 53 49 56 45 2e 0d 0a TEX_RECURSIVE...
bc3a0 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 **..** Note that
bc3b0 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 if one of the d
bc3c0 79 6e 61 6d 69 63 20 6d 75 74 65 78 20 70 61 72 ynamic mutex par
bc3d0 61 6d 65 74 65 72 73 20 28 53 51 4c 49 54 45 5f ameters (SQLITE_
bc3e0 4d 55 54 45 58 5f 46 41 53 54 0d 0a 2a 2a 20 6f MUTEX_FAST..** o
bc3f0 72 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 r SQLITE_MUTEX_R
bc400 45 43 55 52 53 49 56 45 29 20 69 73 20 75 73 65 ECURSIVE) is use
bc410 64 20 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 6d d then sqlite3_m
bc420 75 74 65 78 5f 61 6c 6c 6f 63 28 29 0d 0a 2a 2a utex_alloc()..**
bc430 20 72 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 returns a diffe
bc440 72 65 6e 74 20 6d 75 74 65 78 20 6f 6e 20 65 76 rent mutex on ev
bc450 65 72 79 20 63 61 6c 6c 2e 20 20 42 75 74 20 66 ery call. But f
bc460 6f 72 20 74 68 65 20 73 74 61 74 69 63 20 0d 0a or the static ..
bc470 2a 2a 20 6d 75 74 65 78 20 74 79 70 65 73 2c 20 ** mutex types,
bc480 74 68 65 20 73 61 6d 65 20 6d 75 74 65 78 20 69 the same mutex i
bc490 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 65 76 s returned on ev
bc4a0 65 72 79 20 63 61 6c 6c 20 74 68 61 74 20 68 61 ery call that ha
bc4b0 73 0d 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 74 s..** the same t
bc4c0 79 70 65 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2f 0d ype number...*/.
bc4d0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f .static sqlite3_
bc4e0 6d 75 74 65 78 20 2a 77 69 6e 4d 75 74 65 78 41 mutex *winMutexA
bc4f0 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70 65 29 7b lloc(int iType){
bc500 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
bc510 78 20 2a 70 3b 0d 0a 0d 0a 20 20 73 77 69 74 63 x *p;.... switc
bc520 68 28 20 69 54 79 70 65 20 29 7b 0d 0a 20 20 20 h( iType ){..
bc530 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 case SQLITE_MUT
bc540 45 58 5f 46 41 53 54 3a 0d 0a 20 20 20 20 63 61 EX_FAST:.. ca
bc550 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f se SQLITE_MUTEX_
bc560 52 45 43 55 52 53 49 56 45 3a 20 7b 0d 0a 20 20 RECURSIVE: {..
bc570 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d p = sqlite3M
bc580 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f allocZero( sizeo
bc590 66 28 2a 70 29 20 29 3b 0d 0a 20 20 20 20 20 20 f(*p) );..
bc5a0 69 66 28 20 70 20 29 7b 20 20 0d 0a 23 69 66 64 if( p ){ ..#ifd
bc5b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
bc5c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 64 20 3d . p->id =
bc5d0 20 69 54 79 70 65 3b 0d 0a 23 65 6e 64 69 66 0d iType;..#endif.
bc5e0 0a 20 20 20 20 20 20 20 20 49 6e 69 74 69 61 6c . Initial
bc5f0 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 izeCriticalSecti
bc600 6f 6e 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0d 0a on(&p->mutex);..
bc610 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 }.. b
bc620 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 reak;.. }..
bc630 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 default: {..
bc640 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d assert( winM
bc650 75 74 65 78 5f 69 73 49 6e 69 74 3d 3d 31 20 29 utex_isInit==1 )
bc660 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ;.. assert(
bc670 20 69 54 79 70 65 2d 32 20 3e 3d 20 30 20 29 3b iType-2 >= 0 );
bc680 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
bc690 69 54 79 70 65 2d 32 20 3c 20 41 72 72 61 79 53 iType-2 < ArrayS
bc6a0 69 7a 65 28 77 69 6e 4d 75 74 65 78 5f 73 74 61 ize(winMutex_sta
bc6b0 74 69 63 4d 75 74 65 78 65 73 29 20 29 3b 0d 0a ticMutexes) );..
bc6c0 20 20 20 20 20 20 70 20 3d 20 26 77 69 6e 4d 75 p = &winMu
bc6d0 74 65 78 5f 73 74 61 74 69 63 4d 75 74 65 78 65 tex_staticMutexe
bc6e0 73 5b 69 54 79 70 65 2d 32 5d 3b 0d 0a 23 69 66 s[iType-2];..#if
bc6f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
bc700 0d 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 .. p->id =
bc710 69 54 79 70 65 3b 0d 0a 23 65 6e 64 69 66 0d 0a iType;..#endif..
bc720 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
bc730 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
bc740 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a rn p;..}....../*
bc750 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
bc760 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 e deallocates a
bc770 70 72 65 76 69 6f 75 73 6c 79 0d 0a 2a 2a 20 61 previously..** a
bc780 6c 6c 6f 63 61 74 65 64 20 6d 75 74 65 78 2e 20 llocated mutex.
bc790 20 53 51 4c 69 74 65 20 69 73 20 63 61 72 65 66 SQLite is caref
bc7a0 75 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 ul to deallocate
bc7b0 20 65 76 65 72 79 0d 0a 2a 2a 20 6d 75 74 65 78 every..** mutex
bc7c0 20 74 68 61 74 20 69 74 20 61 6c 6c 6f 63 61 74 that it allocat
bc7d0 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 es...*/..static
bc7e0 76 6f 69 64 20 77 69 6e 4d 75 74 65 78 46 72 65 void winMutexFre
bc7f0 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 e(sqlite3_mutex
bc800 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 *p){.. assert(
bc810 70 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 p );.. assert(
bc820 70 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 2d p->nRef==0 && p-
bc830 3e 6f 77 6e 65 72 3d 3d 30 20 29 3b 0d 0a 20 20 >owner==0 );..
bc840 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 assert( p->id==S
bc850 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 QLITE_MUTEX_FAST
bc860 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 || p->id==SQLIT
bc870 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 E_MUTEX_RECURSIV
bc880 45 20 29 3b 0d 0a 20 20 44 65 6c 65 74 65 43 72 E );.. DeleteCr
bc890 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 iticalSection(&p
bc8a0 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 73 71 6c ->mutex);.. sql
bc8b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 7d ite3_free(p);..}
bc8c0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 73 ..../*..** The s
bc8d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 qlite3_mutex_ent
bc8e0 65 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 er() and sqlite3
bc8f0 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 72 6f 75 _mutex_try() rou
bc900 74 69 6e 65 73 20 61 74 74 65 6d 70 74 0d 0a 2a tines attempt..*
bc910 2a 20 74 6f 20 65 6e 74 65 72 20 61 20 6d 75 74 * to enter a mut
bc920 65 78 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 ex. If another
bc930 74 68 72 65 61 64 20 69 73 20 61 6c 72 65 61 64 thread is alread
bc940 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d 75 74 y within the mut
bc950 65 78 2c 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f ex,..** sqlite3_
bc960 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20 77 69 mutex_enter() wi
bc970 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73 71 6c ll block and sql
bc980 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 ite3_mutex_try()
bc990 20 77 69 6c 6c 20 72 65 74 75 72 6e 0d 0a 2a 2a will return..**
bc9a0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 SQLITE_BUSY. T
bc9b0 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 he sqlite3_mutex
bc9c0 5f 74 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 _try() interface
bc9d0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f returns SQLITE_
bc9e0 4f 4b 0d 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63 OK..** upon succ
bc9f0 65 73 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d essful entry. M
bca00 75 74 65 78 65 73 20 63 72 65 61 74 65 64 20 75 utexes created u
bca10 73 69 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45 sing SQLITE_MUTE
bca20 58 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 0d X_RECURSIVE can.
bca30 0a 2a 2a 20 62 65 20 65 6e 74 65 72 65 64 20 6d .** be entered m
bca40 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 62 79 ultiple times by
bca50 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 the same thread
bca60 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 . In such cases
bca70 20 74 68 65 2c 0d 0a 2a 2a 20 6d 75 74 65 78 20 the,..** mutex
bca80 6d 75 73 74 20 62 65 20 65 78 69 74 65 64 20 61 must be exited a
bca90 6e 20 65 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f n equal number o
bcaa0 66 20 74 69 6d 65 73 20 62 65 66 6f 72 65 20 61 f times before a
bcab0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 0d 0a 2a nother thread..*
bcac0 2a 20 63 61 6e 20 65 6e 74 65 72 2e 20 20 49 66 * can enter. If
bcad0 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 the same thread
bcae0 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65 72 20 tries to enter
bcaf0 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f any other kind o
bcb00 66 20 6d 75 74 65 78 0d 0a 2a 2a 20 6d 6f 72 65 f mutex..** more
bcb10 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65 20 than once, the
bcb20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65 behavior is unde
bcb30 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 fined...*/..stat
bcb40 69 63 20 76 6f 69 64 20 77 69 6e 4d 75 74 65 78 ic void winMutex
bcb50 45 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 Enter(sqlite3_mu
bcb60 74 65 78 20 2a 70 29 7b 0d 0a 23 69 66 64 65 66 tex *p){..#ifdef
bcb70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 SQLITE_DEBUG..
bcb80 20 44 57 4f 52 44 20 74 69 64 20 3d 20 47 65 74 DWORD tid = Get
bcb90 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 CurrentThreadId(
bcba0 29 3b 20 0d 0a 20 20 61 73 73 65 72 74 28 20 70 ); .. assert( p
bcbb0 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 ->id==SQLITE_MUT
bcbc0 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c 20 EX_RECURSIVE ||
bcbd0 77 69 6e 4d 75 74 65 78 4e 6f 74 68 65 6c 64 32 winMutexNotheld2
bcbe0 28 70 2c 20 74 69 64 29 20 29 3b 0d 0a 23 65 6e (p, tid) );..#en
bcbf0 64 69 66 0d 0a 20 20 45 6e 74 65 72 43 72 69 74 dif.. EnterCrit
bcc00 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d 3e icalSection(&p->
bcc10 6d 75 74 65 78 29 3b 0d 0a 23 69 66 64 65 66 20 mutex);..#ifdef
bcc20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 SQLITE_DEBUG..
bcc30 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e assert( p->nRef>
bcc40 30 20 7c 7c 20 70 2d 3e 6f 77 6e 65 72 3d 3d 30 0 || p->owner==0
bcc50 20 29 3b 0d 0a 20 20 70 2d 3e 6f 77 6e 65 72 20 );.. p->owner
bcc60 3d 20 74 69 64 3b 20 0d 0a 20 20 70 2d 3e 6e 52 = tid; .. p->nR
bcc70 65 66 2b 2b 3b 0d 0a 20 20 69 66 28 20 70 2d 3e ef++;.. if( p->
bcc80 74 72 61 63 65 20 29 7b 0d 0a 20 20 20 20 70 72 trace ){.. pr
bcc90 69 6e 74 66 28 22 65 6e 74 65 72 20 6d 75 74 65 intf("enter mute
bcca0 78 20 25 70 20 28 25 64 29 20 77 69 74 68 20 6e x %p (%d) with n
bccb0 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c 20 70 2d Ref=%d\n", p, p-
bccc0 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52 65 66 29 >trace, p->nRef)
bccd0 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a ;.. }..#endif..
bcce0 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 }..static int wi
bccf0 6e 4d 75 74 65 78 54 72 79 28 73 71 6c 69 74 65 nMutexTry(sqlite
bcd00 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a 23 69 3_mutex *p){..#i
bcd10 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 fndef NDEBUG..
bcd20 44 57 4f 52 44 20 74 69 64 20 3d 20 47 65 74 43 DWORD tid = GetC
bcd30 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 urrentThreadId()
bcd40 3b 20 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e ; ..#endif.. in
bcd50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 t rc = SQLITE_BU
bcd60 53 59 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 SY;.. assert( p
bcd70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 ->id==SQLITE_MUT
bcd80 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c 20 EX_RECURSIVE ||
bcd90 77 69 6e 4d 75 74 65 78 4e 6f 74 68 65 6c 64 32 winMutexNotheld2
bcda0 28 70 2c 20 74 69 64 29 20 29 3b 0d 0a 20 20 2f (p, tid) );.. /
bcdb0 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 *.. ** The sqli
bcdc0 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 te3_mutex_try()
bcdd0 72 6f 75 74 69 6e 65 20 69 73 20 76 65 72 79 20 routine is very
bcde0 72 61 72 65 6c 79 20 75 73 65 64 2c 20 61 6e 64 rarely used, and
bcdf0 20 77 68 65 6e 20 69 74 0d 0a 20 20 2a 2a 20 69 when it.. ** i
bce00 73 20 75 73 65 64 20 69 74 20 69 73 20 6d 65 72 s used it is mer
bce10 65 6c 79 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 ely an optimizat
bce20 69 6f 6e 2e 20 20 53 6f 20 69 74 20 69 73 20 4f ion. So it is O
bce30 4b 20 66 6f 72 20 69 74 20 74 6f 20 61 6c 77 61 K for it to alwa
bce40 79 73 0d 0a 20 20 2a 2a 20 66 61 69 6c 2e 20 20 ys.. ** fail.
bce50 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 65 .. **.. ** The
bce60 20 54 72 79 45 6e 74 65 72 43 72 69 74 69 63 61 TryEnterCritica
bce70 6c 53 65 63 74 69 6f 6e 28 29 20 69 6e 74 65 72 lSection() inter
bce80 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 face is only ava
bce90 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 4e 54 2e ilable on WinNT.
bcea0 0d 0a 20 20 2a 2a 20 41 6e 64 20 73 6f 6d 65 20 .. ** And some
bceb0 77 69 6e 64 6f 77 73 20 63 6f 6d 70 69 6c 65 72 windows compiler
bcec0 73 20 63 6f 6d 70 6c 61 69 6e 20 69 66 20 79 6f s complain if yo
bced0 75 20 74 72 79 20 74 6f 20 75 73 65 20 69 74 20 u try to use it
bcee0 77 69 74 68 6f 75 74 0d 0a 20 20 2a 2a 20 66 69 without.. ** fi
bcef0 72 73 74 20 64 6f 69 6e 67 20 73 6f 6d 65 20 23 rst doing some #
bcf00 64 65 66 69 6e 65 73 20 74 68 61 74 20 70 72 65 defines that pre
bcf10 76 65 6e 74 20 53 51 4c 69 74 65 20 66 72 6f 6d vent SQLite from
bcf20 20 62 75 69 6c 64 69 6e 67 20 6f 6e 20 57 69 6e building on Win
bcf30 39 38 2e 0d 0a 20 20 2a 2a 20 46 6f 72 20 74 68 98... ** For th
bcf40 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 77 69 at reason, we wi
bcf50 6c 6c 20 6f 6d 69 74 20 74 68 69 73 20 6f 70 74 ll omit this opt
bcf60 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 6e 6f imization for no
bcf70 77 2e 20 20 53 65 65 0d 0a 20 20 2a 2a 20 74 69 w. See.. ** ti
bcf80 63 6b 65 74 20 23 32 36 38 35 2e 0d 0a 20 20 2a cket #2685... *
bcf90 2f 0d 0a 23 69 66 20 30 0d 0a 20 20 69 66 28 20 /..#if 0.. if(
bcfa0 6d 75 74 65 78 49 73 4e 54 28 29 20 26 26 20 54 mutexIsNT() && T
bcfb0 72 79 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53 ryEnterCriticalS
bcfc0 65 63 74 69 6f 6e 28 26 70 2d 3e 6d 75 74 65 78 ection(&p->mutex
bcfd0 29 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 6f 77 6e ) ){.. p->own
bcfe0 65 72 20 3d 20 74 69 64 3b 0d 0a 20 20 20 20 70 er = tid;.. p
bcff0 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 20 20 20 20 72 ->nRef++;.. r
bd000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
bd010 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 55 4e }..#else.. UN
bd020 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 USED_PARAMETER(p
bd030 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 );..#endif..#ifd
bd040 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
bd050 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
bd060 45 5f 4f 4b 20 26 26 20 70 2d 3e 74 72 61 63 65 E_OK && p->trace
bd070 20 29 7b 0d 0a 20 20 20 20 70 72 69 6e 74 66 28 ){.. printf(
bd080 22 74 72 79 20 6d 75 74 65 78 20 25 70 20 28 25 "try mutex %p (%
bd090 64 29 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c d) with nRef=%d\
bd0a0 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c n", p, p->trace,
bd0b0 20 70 2d 3e 6e 52 65 66 29 3b 0d 0a 20 20 7d 0d p->nRef);.. }.
bd0c0 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75 72 .#endif.. retur
bd0d0 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
bd0e0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d ** The sqlite3_m
bd0f0 75 74 65 78 5f 6c 65 61 76 65 28 29 20 72 6f 75 utex_leave() rou
bd100 74 69 6e 65 20 65 78 69 74 73 20 61 20 6d 75 74 tine exits a mut
bd110 65 78 20 74 68 61 74 20 77 61 73 0d 0a 2a 2a 20 ex that was..**
bd120 70 72 65 76 69 6f 75 73 6c 79 20 65 6e 74 65 72 previously enter
bd130 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 ed by the same t
bd140 68 72 65 61 64 2e 20 20 54 68 65 20 62 65 68 61 hread. The beha
bd150 76 69 6f 72 0d 0a 2a 2a 20 69 73 20 75 6e 64 65 vior..** is unde
bd160 66 69 6e 65 64 20 69 66 20 74 68 65 20 6d 75 74 fined if the mut
bd170 65 78 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e ex is not curren
bd180 74 6c 79 20 65 6e 74 65 72 65 64 20 6f 72 0d 0a tly entered or..
bd190 2a 2a 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e ** is not curren
bd1a0 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 tly allocated.
bd1b0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 SQLite will neve
bd1c0 72 20 64 6f 20 65 69 74 68 65 72 2e 0d 0a 2a 2f r do either...*/
bd1d0 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 ..static void wi
bd1e0 6e 4d 75 74 65 78 4c 65 61 76 65 28 73 71 6c 69 nMutexLeave(sqli
bd1f0 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0d 0a te3_mutex *p){..
bd200 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a #ifndef NDEBUG..
bd210 20 20 44 57 4f 52 44 20 74 69 64 20 3d 20 47 65 DWORD tid = Ge
bd220 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 tCurrentThreadId
bd230 28 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 ();.. assert( p
bd240 2d 3e 6e 52 65 66 3e 30 20 29 3b 0d 0a 20 20 61 ->nRef>0 );.. a
bd250 73 73 65 72 74 28 20 70 2d 3e 6f 77 6e 65 72 3d ssert( p->owner=
bd260 3d 74 69 64 20 29 3b 0d 0a 20 20 70 2d 3e 6e 52 =tid );.. p->nR
bd270 65 66 2d 2d 3b 0d 0a 20 20 69 66 28 20 70 2d 3e ef--;.. if( p->
bd280 6e 52 65 66 3d 3d 30 20 29 20 70 2d 3e 6f 77 6e nRef==0 ) p->own
bd290 65 72 20 3d 20 30 3b 0d 0a 20 20 61 73 73 65 72 er = 0;.. asser
bd2a0 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c t( p->nRef==0 ||
bd2b0 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d p->id==SQLITE_M
bd2c0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 29 UTEX_RECURSIVE )
bd2d0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 4c 65 61 ;..#endif.. Lea
bd2e0 76 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f veCriticalSectio
bd2f0 6e 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0d 0a 23 n(&p->mutex);..#
bd300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
bd310 55 47 0d 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 UG.. if( p->tra
bd320 63 65 20 29 7b 0d 0a 20 20 20 20 70 72 69 6e 74 ce ){.. print
bd330 66 28 22 6c 65 61 76 65 20 6d 75 74 65 78 20 25 f("leave mutex %
bd340 70 20 28 25 64 29 20 77 69 74 68 20 6e 52 65 66 p (%d) with nRef
bd350 3d 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 =%d\n", p, p->tr
bd360 61 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0d 0a ace, p->nRef);..
bd370 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a }..#endif..}..
bd380 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
bd390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d sqlite3_mutex_m
bd3a0 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 73 71 ethods const *sq
bd3b0 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 74 65 lite3DefaultMute
bd3c0 78 28 76 6f 69 64 29 7b 0d 0a 20 20 73 74 61 74 x(void){.. stat
bd3d0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 ic const sqlite3
bd3e0 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 73 _mutex_methods s
bd3f0 4d 75 74 65 78 20 3d 20 7b 0d 0a 20 20 20 20 77 Mutex = {.. w
bd400 69 6e 4d 75 74 65 78 49 6e 69 74 2c 0d 0a 20 20 inMutexInit,..
bd410 20 20 77 69 6e 4d 75 74 65 78 45 6e 64 2c 0d 0a winMutexEnd,..
bd420 20 20 20 20 77 69 6e 4d 75 74 65 78 41 6c 6c 6f winMutexAllo
bd430 63 2c 0d 0a 20 20 20 20 77 69 6e 4d 75 74 65 78 c,.. winMutex
bd440 46 72 65 65 2c 0d 0a 20 20 20 20 77 69 6e 4d 75 Free,.. winMu
bd450 74 65 78 45 6e 74 65 72 2c 0d 0a 20 20 20 20 77 texEnter,.. w
bd460 69 6e 4d 75 74 65 78 54 72 79 2c 0d 0a 20 20 20 inMutexTry,..
bd470 20 77 69 6e 4d 75 74 65 78 4c 65 61 76 65 2c 0d winMutexLeave,.
bd480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
bd490 45 42 55 47 0d 0a 20 20 20 20 77 69 6e 4d 75 74 EBUG.. winMut
bd4a0 65 78 48 65 6c 64 2c 0d 0a 20 20 20 20 77 69 6e exHeld,.. win
bd4b0 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0d 0a 23 65 MutexNotheld..#e
bd4c0 6c 73 65 0d 0a 20 20 20 20 30 2c 0d 0a 20 20 20 lse.. 0,..
bd4d0 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 3b 0..#endif.. };
bd4e0 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 26 73 4d .... return &sM
bd4f0 75 74 65 78 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 utex;..}..#endif
bd500 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 /* SQLITE_MUTEX
bd510 5f 57 33 32 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a _W32 */..../****
bd520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
bd530 66 20 6d 75 74 65 78 5f 77 33 32 2e 63 20 2a 2a f mutex_w32.c **
bd540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
bd570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
bd580 6e 20 66 69 6c 65 20 6d 61 6c 6c 6f 63 2e 63 20 n file malloc.c
bd590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
bd5c0 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 6d 62 .** 2001 Septemb
bd5d0 65 72 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 er 15..**..** Th
bd5e0 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
bd5f0 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
bd600 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
bd610 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
bd620 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
bd630 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
bd640 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
bd650 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
bd660 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
bd670 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
bd680 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
bd690 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
bd6a0 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
bd6b0 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
bd6c0 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
bd6d0 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
bd6e0 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
bd6f0 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
bd700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
bd730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a *************..*
bd740 2a 0d 0a 2a 2a 20 4d 65 6d 6f 72 79 20 61 6c 6c *..** Memory all
bd750 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e ocation function
bd760 73 20 75 73 65 64 20 74 68 72 6f 75 67 68 6f 75 s used throughou
bd770 74 20 73 71 6c 69 74 65 2e 0d 0a 2a 2f 0d 0a 2f t sqlite...*/../
bd780 2a 20 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 * #include <stda
bd790 72 67 2e 68 3e 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a rg.h> */..../*..
bd7a0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 ** Attempt to re
bd7b0 6c 65 61 73 65 20 75 70 20 74 6f 20 6e 20 62 79 lease up to n by
bd7c0 74 65 73 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 6e tes of non-essen
bd7d0 74 69 61 6c 20 6d 65 6d 6f 72 79 20 63 75 72 72 tial memory curr
bd7e0 65 6e 74 6c 79 0d 0a 2a 2a 20 68 65 6c 64 20 62 ently..** held b
bd7f0 79 20 53 51 4c 69 74 65 2e 20 41 6e 20 65 78 61 y SQLite. An exa
bd800 6d 70 6c 65 20 6f 66 20 6e 6f 6e 2d 65 73 73 65 mple of non-esse
bd810 6e 74 69 61 6c 20 6d 65 6d 6f 72 79 20 69 73 20 ntial memory is
bd820 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 0d 0a memory used to..
bd830 2a 2a 20 63 61 63 68 65 20 64 61 74 61 62 61 73 ** cache databas
bd840 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 e pages that are
bd850 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69 not currently i
bd860 6e 20 75 73 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 n use...*/..SQLI
bd870 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
bd880 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 e3_release_memor
bd890 79 28 69 6e 74 20 6e 29 7b 0d 0a 23 69 66 64 65 y(int n){..#ifde
bd8a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
bd8b0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e MEMORY_MANAGEMEN
bd8c0 54 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 T.. return sqli
bd8d0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 te3PcacheRelease
bd8e0 4d 65 6d 6f 72 79 28 6e 29 3b 0d 0a 23 65 6c 73 Memory(n);..#els
bd8f0 65 0d 0a 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e e.. /* IMPLEMEN
bd900 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 33 TATION-OF: R-343
bd910 39 31 2d 32 34 39 32 31 20 54 68 65 20 73 71 6c 91-24921 The sql
bd920 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d ite3_release_mem
bd930 6f 72 79 28 29 20 72 6f 75 74 69 6e 65 0d 0a 20 ory() routine..
bd940 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 72 ** is a no-op r
bd950 65 74 75 72 6e 69 6e 67 20 7a 65 72 6f 20 69 66 eturning zero if
bd960 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 63 SQLite is not c
bd970 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 ompiled with..
bd980 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ** SQLITE_ENABLE
bd990 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 _MEMORY_MANAGEME
bd9a0 4e 54 2e 20 2a 2f 0d 0a 20 20 55 4e 55 53 45 44 NT. */.. UNUSED
bd9b0 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0d 0a _PARAMETER(n);..
bd9c0 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 23 65 6e return 0;..#en
bd9d0 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a dif..}..../*..**
bd9e0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 An instance of
bd9f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 the following ob
bda00 6a 65 63 74 20 72 65 63 6f 72 64 73 20 74 68 65 ject records the
bda10 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 0d 0a 2a 2a location of..**
bda20 20 65 61 63 68 20 75 6e 75 73 65 64 20 73 63 72 each unused scr
bda30 61 74 63 68 20 62 75 66 66 65 72 2e 0d 0a 2a 2f atch buffer...*/
bda40 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
bda50 20 53 63 72 61 74 63 68 46 72 65 65 73 6c 6f 74 ScratchFreeslot
bda60 20 7b 0d 0a 20 20 73 74 72 75 63 74 20 53 63 72 {.. struct Scr
bda70 61 74 63 68 46 72 65 65 73 6c 6f 74 20 2a 70 4e atchFreeslot *pN
bda80 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 75 ext; /* Next u
bda90 6e 75 73 65 64 20 73 63 72 61 74 63 68 20 62 75 nused scratch bu
bdaa0 66 66 65 72 20 2a 2f 0d 0a 7d 20 53 63 72 61 74 ffer */..} Scrat
bdab0 63 68 46 72 65 65 73 6c 6f 74 3b 0d 0a 0d 0a 2f chFreeslot;..../
bdac0 2a 0d 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f *..** State info
bdad0 72 6d 61 74 69 6f 6e 20 6c 6f 63 61 6c 20 74 6f rmation local to
bdae0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f the memory allo
bdaf0 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d cation subsystem
bdb00 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 53 51 ...*/..static SQ
bdb10 4c 49 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 LITE_WSD struct
bdb20 4d 65 6d 30 47 6c 6f 62 61 6c 20 7b 0d 0a 20 20 Mem0Global {..
bdb30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d sqlite3_mutex *m
bdb40 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a utex; /*
bdb50 20 4d 75 74 65 78 20 74 6f 20 73 65 72 69 61 6c Mutex to serial
bdb60 69 7a 65 20 61 63 63 65 73 73 20 2a 2f 0d 0a 0d ize access */...
bdb70 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 . /*.. ** The
bdb80 61 6c 61 72 6d 20 63 61 6c 6c 62 61 63 6b 20 61 alarm callback a
bdb90 6e 64 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73 nd its arguments
bdba0 2e 20 20 54 68 65 20 6d 65 6d 30 2e 6d 75 74 65 . The mem0.mute
bdbb0 78 20 6c 6f 63 6b 20 77 69 6c 6c 0d 0a 20 20 2a x lock will.. *
bdbc0 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 * be held while
bdbd0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 the callback is
bdbe0 72 75 6e 6e 69 6e 67 2e 20 20 52 65 63 75 72 73 running. Recurs
bdbf0 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0d 0a ive calls into..
bdc00 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 ** the memory
bdc10 73 75 62 73 79 73 74 65 6d 20 61 72 65 20 61 6c subsystem are al
bdc20 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f 20 6e 65 lowed, but no ne
bdc30 77 20 63 61 6c 6c 62 61 63 6b 73 20 77 69 6c 6c w callbacks will
bdc40 20 62 65 0d 0a 20 20 2a 2a 20 69 73 73 75 65 64 be.. ** issued
bdc50 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 ... */.. sqlit
bdc60 65 33 5f 69 6e 74 36 34 20 61 6c 61 72 6d 54 68 e3_int64 alarmTh
bdc70 72 65 73 68 6f 6c 64 3b 0d 0a 20 20 76 6f 69 64 reshold;.. void
bdc80 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b (*alarmCallback
bdc90 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 )(void*, sqlite3
bdca0 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0d 0a 20 20 _int64,int);..
bdcb0 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67 3b 0d void *alarmArg;.
bdcc0 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 50 6f ... /*.. ** Po
bdcd0 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 65 6e inters to the en
bdce0 64 20 6f 66 20 73 71 6c 69 74 65 33 47 6c 6f 62 d of sqlite3Glob
bdcf0 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 alConfig.pScratc
bdd00 68 20 6d 65 6d 6f 72 79 0d 0a 20 20 2a 2a 20 28 h memory.. ** (
bdd10 73 6f 20 74 68 61 74 20 61 20 72 61 6e 67 65 20 so that a range
bdd20 74 65 73 74 20 63 61 6e 20 62 65 20 75 73 65 64 test can be used
bdd30 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 to determine if
bdd40 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d 0a an allocation..
bdd50 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 ** being freed
bdd60 20 63 61 6d 65 20 66 72 6f 6d 20 70 53 63 72 61 came from pScra
bdd70 74 63 68 29 20 61 6e 64 20 61 20 70 6f 69 6e 74 tch) and a point
bdd80 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f er to the list o
bdd90 66 0d 0a 20 20 2a 2a 20 75 6e 75 73 65 64 20 73 f.. ** unused s
bdda0 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f cratch allocatio
bddb0 6e 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 76 6f 69 ns... */.. voi
bddc0 64 20 2a 70 53 63 72 61 74 63 68 45 6e 64 3b 0d d *pScratchEnd;.
bddd0 0a 20 20 53 63 72 61 74 63 68 46 72 65 65 73 6c . ScratchFreesl
bdde0 6f 74 20 2a 70 53 63 72 61 74 63 68 46 72 65 65 ot *pScratchFree
bddf0 3b 0d 0a 20 20 75 33 32 20 6e 53 63 72 61 74 63 ;.. u32 nScratc
bde00 68 46 72 65 65 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a hFree;.... /*..
bde10 20 20 2a 2a 20 54 72 75 65 20 69 66 20 68 65 61 ** True if hea
bde20 70 20 69 73 20 6e 65 61 72 6c 79 20 22 66 75 6c p is nearly "ful
bde30 6c 22 20 77 68 65 72 65 20 22 66 75 6c 6c 22 20 l" where "full"
bde40 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 is defined by th
bde50 65 0d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f e.. ** sqlite3_
bde60 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 soft_heap_limit(
bde70 29 20 73 65 74 74 69 6e 67 2e 0d 0a 20 20 2a 2f ) setting... */
bde80 0d 0a 20 20 69 6e 74 20 6e 65 61 72 6c 79 46 75 .. int nearlyFu
bde90 6c 6c 3b 0d 0a 7d 20 6d 65 6d 30 20 3d 20 7b 20 ll;..} mem0 = {
bdea0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0, 0, 0, 0, 0, 0
bdeb0 2c 20 30 2c 20 30 20 7d 3b 0d 0a 0d 0a 23 64 65 , 0, 0 };....#de
bdec0 66 69 6e 65 20 6d 65 6d 30 20 47 4c 4f 42 41 4c fine mem0 GLOBAL
bded0 28 73 74 72 75 63 74 20 4d 65 6d 30 47 6c 6f 62 (struct Mem0Glob
bdee0 61 6c 2c 20 6d 65 6d 30 29 0d 0a 0d 0a 2f 2a 0d al, mem0)..../*.
bdef0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
bdf00 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 6d runs when the m
bdf10 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 emory allocator
bdf20 73 65 65 73 20 74 68 61 74 20 74 68 65 0d 0a 2a sees that the..*
bdf30 2a 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79 20 61 * total memory a
bdf40 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 61 62 6f llocation is abo
bdf50 75 74 20 74 6f 20 65 78 63 65 65 64 20 74 68 65 ut to exceed the
bdf60 20 73 6f 66 74 20 68 65 61 70 0d 0a 2a 2a 20 6c soft heap..** l
bdf70 69 6d 69 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 imit...*/..stati
bdf80 63 20 76 6f 69 64 20 73 6f 66 74 48 65 61 70 4c c void softHeapL
bdf90 69 6d 69 74 45 6e 66 6f 72 63 65 72 28 0d 0a 20 imitEnforcer(..
bdfa0 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 void *NotUsed,
bdfb0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 .. sqlite3_int6
bdfc0 34 20 4e 6f 74 55 73 65 64 32 2c 0d 0a 20 20 69 4 NotUsed2,.. i
bdfd0 6e 74 20 61 6c 6c 6f 63 53 69 7a 65 0d 0a 29 7b nt allocSize..){
bdfe0 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
bdff0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e ETER2(NotUsed, N
be000 6f 74 55 73 65 64 32 29 3b 0d 0a 20 20 73 71 6c otUsed2);.. sql
be010 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d ite3_release_mem
be020 6f 72 79 28 61 6c 6c 6f 63 53 69 7a 65 29 3b 0d ory(allocSize);.
be030 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 .}..../*..** Cha
be040 6e 67 65 20 74 68 65 20 61 6c 61 72 6d 20 63 61 nge the alarm ca
be050 6c 6c 62 61 63 6b 0d 0a 2a 2f 0d 0a 73 74 61 74 llback..*/..stat
be060 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 ic int sqlite3Me
be070 6d 6f 72 79 41 6c 61 72 6d 28 0d 0a 20 20 76 6f moryAlarm(.. vo
be080 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 id(*xCallback)(v
be090 6f 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 oid *pArg, sqlit
be0a0 65 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e e3_int64 used,in
be0b0 74 20 4e 29 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 t N),.. void *p
be0c0 41 72 67 2c 0d 0a 20 20 73 71 6c 69 74 65 33 5f Arg,.. sqlite3_
be0d0 69 6e 74 36 34 20 69 54 68 72 65 73 68 6f 6c 64 int64 iThreshold
be0e0 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 6e 55 73 65 ..){.. int nUse
be0f0 64 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 d;.. sqlite3_mu
be100 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d tex_enter(mem0.m
be110 75 74 65 78 29 3b 0d 0a 20 20 6d 65 6d 30 2e 61 utex);.. mem0.a
be120 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 78 larmCallback = x
be130 43 61 6c 6c 62 61 63 6b 3b 0d 0a 20 20 6d 65 6d Callback;.. mem
be140 30 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41 72 0.alarmArg = pAr
be150 67 3b 0d 0a 20 20 6d 65 6d 30 2e 61 6c 61 72 6d g;.. mem0.alarm
be160 54 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72 Threshold = iThr
be170 65 73 68 6f 6c 64 3b 0d 0a 20 20 6e 55 73 65 64 eshold;.. nUsed
be180 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 = sqlite3Status
be190 56 61 6c 75 65 28 53 51 4c 49 54 45 5f 53 54 41 Value(SQLITE_STA
be1a0 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 29 TUS_MEMORY_USED)
be1b0 3b 0d 0a 20 20 6d 65 6d 30 2e 6e 65 61 72 6c 79 ;.. mem0.nearly
be1c0 46 75 6c 6c 20 3d 20 28 69 54 68 72 65 73 68 6f Full = (iThresho
be1d0 6c 64 3e 30 20 26 26 20 69 54 68 72 65 73 68 6f ld>0 && iThresho
be1e0 6c 64 3c 3d 6e 55 73 65 64 29 3b 0d 0a 20 20 73 ld<=nUsed);.. s
be1f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
be200 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0d ve(mem0.mutex);.
be210 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
be220 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 _OK;..}....#ifnd
be230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 ef SQLITE_OMIT_D
be240 45 50 52 45 43 41 54 45 44 0d 0a 2f 2a 0d 0a 2a EPRECATED../*..*
be250 2a 20 44 65 70 72 65 63 61 74 65 64 20 65 78 74 * Deprecated ext
be260 65 72 6e 61 6c 20 69 6e 74 65 72 66 61 63 65 2e ernal interface.
be270 20 20 49 6e 74 65 72 6e 61 6c 2f 63 6f 72 65 20 Internal/core
be280 53 51 4c 69 74 65 20 63 6f 64 65 0d 0a 2a 2a 20 SQLite code..**
be290 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 should call sqli
be2a0 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 2e 0d te3MemoryAlarm..
be2b0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
be2c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f int sqlite3_memo
be2d0 72 79 5f 61 6c 61 72 6d 28 0d 0a 20 20 76 6f 69 ry_alarm(.. voi
be2e0 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f d(*xCallback)(vo
be2f0 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 id *pArg, sqlite
be300 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e 74 3_int64 used,int
be310 20 4e 29 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 41 N),.. void *pA
be320 72 67 2c 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 rg,.. sqlite3_i
be330 6e 74 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0d nt64 iThreshold.
be340 0a 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 .){.. return sq
be350 6c 69 74 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d lite3MemoryAlarm
be360 28 78 43 61 6c 6c 62 61 63 6b 2c 20 70 41 72 67 (xCallback, pArg
be370 2c 20 69 54 68 72 65 73 68 6f 6c 64 29 3b 0d 0a , iThreshold);..
be380 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d }..#endif..../*.
be390 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 66 74 .** Set the soft
be3a0 20 68 65 61 70 2d 73 69 7a 65 20 6c 69 6d 69 74 heap-size limit
be3b0 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72 79 for the library
be3c0 2e 20 50 61 73 73 69 6e 67 20 61 20 7a 65 72 6f . Passing a zero
be3d0 20 6f 72 20 0d 0a 2a 2a 20 6e 65 67 61 74 69 76 or ..** negativ
be3e0 65 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 e value indicate
be3f0 73 20 6e 6f 20 6c 69 6d 69 74 2e 0d 0a 2a 2f 0d s no limit...*/.
be400 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 6c 69 .SQLITE_API sqli
be410 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 te3_int64 sqlite
be420 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 3_soft_heap_limi
be430 74 36 34 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 t64(sqlite3_int6
be440 34 20 6e 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 4 n){.. sqlite3
be450 5f 69 6e 74 36 34 20 70 72 69 6f 72 4c 69 6d 69 _int64 priorLimi
be460 74 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e t;.. sqlite3_in
be470 74 36 34 20 65 78 63 65 73 73 3b 0d 0a 23 69 66 t64 excess;..#if
be480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
be490 5f 41 55 54 4f 49 4e 49 54 0d 0a 20 20 69 6e 74 _AUTOINIT.. int
be4a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e rc = sqlite3_in
be4b0 69 74 69 61 6c 69 7a 65 28 29 3b 0d 0a 20 20 69 itialize();.. i
be4c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 2d f( rc ) return -
be4d0 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 73 71 1;..#endif.. sq
be4e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 lite3_mutex_ente
be4f0 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a r(mem0.mutex);..
be500 20 20 70 72 69 6f 72 4c 69 6d 69 74 20 3d 20 6d priorLimit = m
be510 65 6d 30 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f em0.alarmThresho
be520 6c 64 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d ld;.. sqlite3_m
be530 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e utex_leave(mem0.
be540 6d 75 74 65 78 29 3b 0d 0a 20 20 69 66 28 20 6e mutex);.. if( n
be550 3c 30 20 29 20 72 65 74 75 72 6e 20 70 72 69 6f <0 ) return prio
be560 72 4c 69 6d 69 74 3b 0d 0a 20 20 69 66 28 20 6e rLimit;.. if( n
be570 3e 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 >0 ){.. sqlit
be580 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 73 6f e3MemoryAlarm(so
be590 66 74 48 65 61 70 4c 69 6d 69 74 45 6e 66 6f 72 ftHeapLimitEnfor
be5a0 63 65 72 2c 20 30 2c 20 6e 29 3b 0d 0a 20 20 7d cer, 0, n);.. }
be5b0 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69 74 else{.. sqlit
be5c0 65 33 4d 65 6d 6f 72 79 41 6c 61 72 6d 28 30 2c e3MemoryAlarm(0,
be5d0 20 30 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0, 0);.. }..
be5e0 65 78 63 65 73 73 20 3d 20 73 71 6c 69 74 65 33 excess = sqlite3
be5f0 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 2d _memory_used() -
be600 20 6e 3b 0d 0a 20 20 69 66 28 20 65 78 63 65 73 n;.. if( exces
be610 73 3e 30 20 29 20 73 71 6c 69 74 65 33 5f 72 65 s>0 ) sqlite3_re
be620 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 28 69 6e lease_memory((in
be630 74 29 28 65 78 63 65 73 73 20 26 20 30 78 37 66 t)(excess & 0x7f
be640 66 66 66 66 66 66 29 29 3b 0d 0a 20 20 72 65 74 ffffff));.. ret
be650 75 72 6e 20 70 72 69 6f 72 4c 69 6d 69 74 3b 0d urn priorLimit;.
be660 0a 7d 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 .}..SQLITE_API v
be670 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 oid sqlite3_soft
be680 5f 68 65 61 70 5f 6c 69 6d 69 74 28 69 6e 74 20 _heap_limit(int
be690 6e 29 7b 0d 0a 20 20 69 66 28 20 6e 3c 30 20 29 n){.. if( n<0 )
be6a0 20 6e 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74 n = 0;.. sqlit
be6b0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d e3_soft_heap_lim
be6c0 69 74 36 34 28 6e 29 3b 0d 0a 7d 0d 0a 0d 0a 2f it64(n);..}..../
be6d0 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 *..** Initialize
be6e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f the memory allo
be6f0 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d cation subsystem
be700 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
be710 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
be720 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 76 6f 69 64 3MallocInit(void
be730 29 7b 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 ){.. if( sqlite
be740 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 3GlobalConfig.m.
be750 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0d 0a 20 xMalloc==0 ){..
be760 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 sqlite3MemSet
be770 44 65 66 61 75 6c 74 28 29 3b 0d 0a 20 20 7d 0d Default();.. }.
be780 0a 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d 30 2c . memset(&mem0,
be790 20 30 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 30 29 0, sizeof(mem0)
be7a0 29 3b 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 );.. if( sqlite
be7b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 3GlobalConfig.bC
be7c0 6f 72 65 4d 75 74 65 78 20 29 7b 0d 0a 20 20 20 oreMutex ){..
be7d0 20 6d 65 6d 30 2e 6d 75 74 65 78 20 3d 20 73 71 mem0.mutex = sq
be7e0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 lite3MutexAlloc(
be7f0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
be800 54 49 43 5f 4d 45 4d 29 3b 0d 0a 20 20 7d 0d 0a TIC_MEM);.. }..
be810 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f if( sqlite3Glo
be820 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 balConfig.pScrat
be830 63 68 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f ch && sqlite3Glo
be840 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 balConfig.szScra
be850 74 63 68 3e 3d 31 30 30 0d 0a 20 20 20 20 20 20 tch>=100..
be860 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c && sqlite3Global
be870 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 3e Config.nScratch>
be880 30 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 2c 0 ){.. int i,
be890 20 6e 2c 20 73 7a 3b 0d 0a 20 20 20 20 53 63 72 n, sz;.. Scr
be8a0 61 74 63 68 46 72 65 65 73 6c 6f 74 20 2a 70 53 atchFreeslot *pS
be8b0 6c 6f 74 3b 0d 0a 20 20 20 20 73 7a 20 3d 20 52 lot;.. sz = R
be8c0 4f 55 4e 44 44 4f 57 4e 38 28 73 71 6c 69 74 65 OUNDDOWN8(sqlite
be8d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 3GlobalConfig.sz
be8e0 53 63 72 61 74 63 68 29 3b 0d 0a 20 20 20 20 73 Scratch);.. s
be8f0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
be900 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 73 ig.szScratch = s
be910 7a 3b 0d 0a 20 20 20 20 70 53 6c 6f 74 20 3d 20 z;.. pSlot =
be920 28 53 63 72 61 74 63 68 46 72 65 65 73 6c 6f 74 (ScratchFreeslot
be930 2a 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 *)sqlite3GlobalC
be940 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 3b 0d onfig.pScratch;.
be950 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 . n = sqlite3
be960 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 GlobalConfig.nSc
be970 72 61 74 63 68 3b 0d 0a 20 20 20 20 6d 65 6d 30 ratch;.. mem0
be980 2e 70 53 63 72 61 74 63 68 46 72 65 65 20 3d 20 .pScratchFree =
be990 70 53 6c 6f 74 3b 0d 0a 20 20 20 20 6d 65 6d 30 pSlot;.. mem0
be9a0 2e 6e 53 63 72 61 74 63 68 46 72 65 65 20 3d 20 .nScratchFree =
be9b0 6e 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b n;.. for(i=0;
be9c0 20 69 3c 6e 2d 31 3b 20 69 2b 2b 29 7b 0d 0a 20 i<n-1; i++){..
be9d0 20 20 20 20 20 70 53 6c 6f 74 2d 3e 70 4e 65 78 pSlot->pNex
be9e0 74 20 3d 20 28 53 63 72 61 74 63 68 46 72 65 65 t = (ScratchFree
be9f0 73 6c 6f 74 2a 29 28 73 7a 2b 28 63 68 61 72 2a slot*)(sz+(char*
bea00 29 70 53 6c 6f 74 29 3b 0d 0a 20 20 20 20 20 20 )pSlot);..
bea10 70 53 6c 6f 74 20 3d 20 70 53 6c 6f 74 2d 3e 70 pSlot = pSlot->p
bea20 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 Next;.. }..
bea30 20 20 70 53 6c 6f 74 2d 3e 70 4e 65 78 74 20 3d pSlot->pNext =
bea40 20 30 3b 0d 0a 20 20 20 20 6d 65 6d 30 2e 70 53 0;.. mem0.pS
bea50 63 72 61 74 63 68 45 6e 64 20 3d 20 28 76 6f 69 cratchEnd = (voi
bea60 64 2a 29 26 70 53 6c 6f 74 5b 31 5d 3b 0d 0a 20 d*)&pSlot[1];..
bea70 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6d 65 6d }else{.. mem
bea80 30 2e 70 53 63 72 61 74 63 68 45 6e 64 20 3d 20 0.pScratchEnd =
bea90 30 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 0;.. sqlite3G
beaa0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 lobalConfig.pScr
beab0 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 73 atch = 0;.. s
beac0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
bead0 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 30 ig.szScratch = 0
beae0 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c ;.. sqlite3Gl
beaf0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 obalConfig.nScra
beb00 74 63 68 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 tch = 0;.. }..
beb10 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 if( sqlite3Glob
beb20 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 3d 3d alConfig.pPage==
beb30 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 0 || sqlite3Glob
beb40 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 3c alConfig.szPage<
beb50 35 31 32 0d 0a 20 20 20 20 20 20 7c 7c 20 73 71 512.. || sq
beb60 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
beb70 67 2e 6e 50 61 67 65 3c 31 20 29 7b 0d 0a 20 20 g.nPage<1 ){..
beb80 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 sqlite3GlobalC
beb90 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 30 3b onfig.pPage = 0;
beba0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f .. sqlite3Glo
bebb0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 balConfig.szPage
bebc0 20 3d 20 30 3b 0d 0a 20 20 20 20 73 71 6c 69 74 = 0;.. sqlit
bebd0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e e3GlobalConfig.n
bebe0 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a Page = 0;.. }..
bebf0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
bec00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 GlobalConfig.m.x
bec10 49 6e 69 74 28 73 71 6c 69 74 65 33 47 6c 6f 62 Init(sqlite3Glob
bec20 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44 alConfig.m.pAppD
bec30 61 74 61 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a ata);..}..../*..
bec40 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 ** Return true i
bec50 66 20 74 68 65 20 68 65 61 70 20 69 73 20 63 75 f the heap is cu
bec60 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 6d 65 rrently under me
bec70 6d 6f 72 79 20 70 72 65 73 73 75 72 65 20 2d 20 mory pressure -
bec80 69 6e 20 6f 74 68 65 72 0d 0a 2a 2a 20 77 6f 72 in other..** wor
bec90 64 73 20 69 66 20 74 68 65 20 61 6d 6f 75 6e 74 ds if the amount
beca0 20 6f 66 20 68 65 61 70 20 75 73 65 64 20 69 73 of heap used is
becb0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 6c 69 close to the li
becc0 6d 69 74 20 73 65 74 20 62 79 0d 0a 2a 2a 20 73 mit set by..** s
becd0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 qlite3_soft_heap
bece0 5f 6c 69 6d 69 74 28 29 2e 0d 0a 2a 2f 0d 0a 53 _limit()...*/..S
becf0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
bed00 74 20 73 71 6c 69 74 65 33 48 65 61 70 4e 65 61 t sqlite3HeapNea
bed10 72 6c 79 46 75 6c 6c 28 76 6f 69 64 29 7b 0d 0a rlyFull(void){..
bed20 20 20 72 65 74 75 72 6e 20 6d 65 6d 30 2e 6e 65 return mem0.ne
bed30 61 72 6c 79 46 75 6c 6c 3b 0d 0a 7d 0d 0a 0d 0a arlyFull;..}....
bed40 2f 2a 0d 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c /*..** Deinitial
bed50 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 ize the memory a
bed60 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 llocation subsys
bed70 74 65 6d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 tem...*/..SQLITE
bed80 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
bed90 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 76 lite3MallocEnd(v
beda0 6f 69 64 29 7b 0d 0a 20 20 69 66 28 20 73 71 6c oid){.. if( sql
bedb0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
bedc0 2e 6d 2e 78 53 68 75 74 64 6f 77 6e 20 29 7b 0d .m.xShutdown ){.
bedd0 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 . sqlite3Glob
bede0 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 alConfig.m.xShut
bedf0 64 6f 77 6e 28 73 71 6c 69 74 65 33 47 6c 6f 62 down(sqlite3Glob
bee00 61 6c 43 6f 6e 66 69 67 2e 6d 2e 70 41 70 70 44 alConfig.m.pAppD
bee10 61 74 61 29 3b 0d 0a 20 20 7d 0d 0a 20 20 6d 65 ata);.. }.. me
bee20 6d 73 65 74 28 26 6d 65 6d 30 2c 20 30 2c 20 73 mset(&mem0, 0, s
bee30 69 7a 65 6f 66 28 6d 65 6d 30 29 29 3b 0d 0a 7d izeof(mem0));..}
bee40 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 ..../*..** Retur
bee50 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 n the amount of
bee60 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 memory currently
bee70 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 0d 0a 2a checked out...*
bee80 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 /..SQLITE_API sq
bee90 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 lite3_int64 sqli
beea0 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 te3_memory_used(
beeb0 76 6f 69 64 29 7b 0d 0a 20 20 69 6e 74 20 6e 2c void){.. int n,
beec0 20 6d 78 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f mx;.. sqlite3_
beed0 69 6e 74 36 34 20 72 65 73 3b 0d 0a 20 20 73 71 int64 res;.. sq
beee0 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c lite3_status(SQL
beef0 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 ITE_STATUS_MEMOR
bef00 59 5f 55 53 45 44 2c 20 26 6e 2c 20 26 6d 78 2c Y_USED, &n, &mx,
bef10 20 30 29 3b 0d 0a 20 20 72 65 73 20 3d 20 28 73 0);.. res = (s
bef20 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 3b 20 qlite3_int64)n;
bef30 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 /* Work around
bef40 62 75 67 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 bug in Borland C
bef50 2e 20 54 69 63 6b 65 74 20 23 33 32 31 36 20 2a . Ticket #3216 *
bef60 2f 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b /.. return res;
bef70 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
bef80 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d turn the maximum
bef90 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 amount of memor
befa0 79 20 74 68 61 74 20 68 61 73 20 65 76 65 72 20 y that has ever
befb0 62 65 65 6e 0d 0a 2a 2a 20 63 68 65 63 6b 65 64 been..** checked
befc0 20 6f 75 74 20 73 69 6e 63 65 20 65 69 74 68 65 out since eithe
befd0 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 r the beginning
befe0 6f 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 0d of this process.
beff0 0a 2a 2a 20 6f 72 20 73 69 6e 63 65 20 74 68 65 .** or since the
bf000 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 72 65 73 most recent res
bf010 65 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f et...*/..SQLITE_
bf020 41 50 49 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 API sqlite3_int6
bf030 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 4 sqlite3_memory
bf040 5f 68 69 67 68 77 61 74 65 72 28 69 6e 74 20 72 _highwater(int r
bf050 65 73 65 74 46 6c 61 67 29 7b 0d 0a 20 20 69 6e esetFlag){.. in
bf060 74 20 6e 2c 20 6d 78 3b 0d 0a 20 20 73 71 6c 69 t n, mx;.. sqli
bf070 74 65 33 5f 69 6e 74 36 34 20 72 65 73 3b 0d 0a te3_int64 res;..
bf080 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 sqlite3_status
bf090 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d (SQLITE_STATUS_M
bf0a0 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 6e 2c 20 EMORY_USED, &n,
bf0b0 26 6d 78 2c 20 72 65 73 65 74 46 6c 61 67 29 3b &mx, resetFlag);
bf0c0 0d 0a 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74 .. res = (sqlit
bf0d0 65 33 5f 69 6e 74 36 34 29 6d 78 3b 20 20 2f 2a e3_int64)mx; /*
bf0e0 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 Work around bug
bf0f0 20 69 6e 20 42 6f 72 6c 61 6e 64 20 43 2e 20 54 in Borland C. T
bf100 69 63 6b 65 74 20 23 33 32 31 36 20 2a 2f 0d 0a icket #3216 */..
bf110 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0d 0a 7d return res;..}
bf120 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 69 67 67 ..../*..** Trigg
bf130 65 72 20 74 68 65 20 61 6c 61 72 6d 20 0d 0a 2a er the alarm ..*
bf140 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 /..static void s
bf150 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 qlite3MallocAlar
bf160 6d 28 69 6e 74 20 6e 42 79 74 65 29 7b 0d 0a 20 m(int nByte){..
bf170 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 void (*xCallbac
bf180 6b 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 k)(void*,sqlite3
bf190 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0d 0a 20 20 _int64,int);..
bf1a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 6f sqlite3_int64 no
bf1b0 77 55 73 65 64 3b 0d 0a 20 20 76 6f 69 64 20 2a wUsed;.. void *
bf1c0 70 41 72 67 3b 0d 0a 20 20 69 66 28 20 6d 65 6d pArg;.. if( mem
bf1d0 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d 0.alarmCallback=
bf1e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 =0 ) return;..
bf1f0 78 43 61 6c 6c 62 61 63 6b 20 3d 20 6d 65 6d 30 xCallback = mem0
bf200 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3b 0d .alarmCallback;.
bf210 0a 20 20 6e 6f 77 55 73 65 64 20 3d 20 73 71 6c . nowUsed = sql
bf220 69 74 65 33 53 74 61 74 75 73 56 61 6c 75 65 28 ite3StatusValue(
bf230 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 SQLITE_STATUS_ME
bf240 4d 4f 52 59 5f 55 53 45 44 29 3b 0d 0a 20 20 70 MORY_USED);.. p
bf250 41 72 67 20 3d 20 6d 65 6d 30 2e 61 6c 61 72 6d Arg = mem0.alarm
bf260 41 72 67 3b 0d 0a 20 20 6d 65 6d 30 2e 61 6c 61 Arg;.. mem0.ala
bf270 72 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0d rmCallback = 0;.
bf280 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
bf290 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 _leave(mem0.mute
bf2a0 78 29 3b 0d 0a 20 20 78 43 61 6c 6c 62 61 63 6b x);.. xCallback
bf2b0 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64 2c 20 (pArg, nowUsed,
bf2c0 6e 42 79 74 65 29 3b 0d 0a 20 20 73 71 6c 69 74 nByte);.. sqlit
bf2d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d e3_mutex_enter(m
bf2e0 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 6d em0.mutex);.. m
bf2f0 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 em0.alarmCallbac
bf300 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0d 0a k = xCallback;..
bf310 20 20 6d 65 6d 30 2e 61 6c 61 72 6d 41 72 67 20 mem0.alarmArg
bf320 3d 20 70 41 72 67 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a = pArg;..}..../*
bf330 0d 0a 2a 2a 20 44 6f 20 61 20 6d 65 6d 6f 72 79 ..** Do a memory
bf340 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 69 74 68 allocation with
bf350 20 73 74 61 74 69 73 74 69 63 73 20 61 6e 64 20 statistics and
bf360 61 6c 61 72 6d 73 2e 20 20 41 73 73 75 6d 65 20 alarms. Assume
bf370 74 68 65 0d 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 the..** lock is
bf380 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0d 0a 2a already held...*
bf390 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 /..static int ma
bf3a0 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 69 6e llocWithAlarm(in
bf3b0 74 20 6e 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b t n, void **pp){
bf3c0 0d 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0d 0a .. int nFull;..
bf3d0 20 20 76 6f 69 64 20 2a 70 3b 0d 0a 20 20 61 73 void *p;.. as
bf3e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
bf3f0 74 65 78 5f 68 65 6c 64 28 6d 65 6d 30 2e 6d 75 tex_held(mem0.mu
bf400 74 65 78 29 20 29 3b 0d 0a 20 20 6e 46 75 6c 6c tex) );.. nFull
bf410 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c = sqlite3Global
bf420 43 6f 6e 66 69 67 2e 6d 2e 78 52 6f 75 6e 64 75 Config.m.xRoundu
bf430 70 28 6e 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 p(n);.. sqlite3
bf440 53 74 61 74 75 73 53 65 74 28 53 51 4c 49 54 45 StatusSet(SQLITE
bf450 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 _STATUS_MALLOC_S
bf460 49 5a 45 2c 20 6e 29 3b 0d 0a 20 20 69 66 28 20 IZE, n);.. if(
bf470 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 mem0.alarmCallba
bf480 63 6b 21 3d 30 20 29 7b 0d 0a 20 20 20 20 69 6e ck!=0 ){.. in
bf490 74 20 6e 55 73 65 64 20 3d 20 73 71 6c 69 74 65 t nUsed = sqlite
bf4a0 33 53 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 3StatusValue(SQL
bf4b0 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 ITE_STATUS_MEMOR
bf4c0 59 5f 55 53 45 44 29 3b 0d 0a 20 20 20 20 69 66 Y_USED);.. if
bf4d0 28 20 6e 55 73 65 64 20 3e 3d 20 6d 65 6d 30 2e ( nUsed >= mem0.
bf4e0 61 6c 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 2d alarmThreshold -
bf4f0 20 6e 46 75 6c 6c 20 29 7b 0d 0a 20 20 20 20 20 nFull ){..
bf500 20 6d 65 6d 30 2e 6e 65 61 72 6c 79 46 75 6c 6c mem0.nearlyFull
bf510 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 73 71 6c = 1;.. sql
bf520 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 ite3MallocAlarm(
bf530 6e 46 75 6c 6c 29 3b 0d 0a 20 20 20 20 7d 65 6c nFull);.. }el
bf540 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 30 2e se{.. mem0.
bf550 6e 65 61 72 6c 79 46 75 6c 6c 20 3d 20 30 3b 0d nearlyFull = 0;.
bf560 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 70 . }.. }.. p
bf570 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c = sqlite3Global
bf580 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 Config.m.xMalloc
bf590 28 6e 46 75 6c 6c 29 3b 0d 0a 23 69 66 64 65 66 (nFull);..#ifdef
bf5a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d SQLITE_ENABLE_M
bf5b0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 EMORY_MANAGEMENT
bf5c0 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 .. if( p==0 &&
bf5d0 6d 65 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 mem0.alarmCallba
bf5e0 63 6b 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 ck ){.. sqlit
bf5f0 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 46 e3MallocAlarm(nF
bf600 75 6c 6c 29 3b 0d 0a 20 20 20 20 70 20 3d 20 73 ull);.. p = s
bf610 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
bf620 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 46 75 ig.m.xMalloc(nFu
bf630 6c 6c 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 ll);.. }..#endi
bf640 66 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 f.. if( p ){..
bf650 20 20 20 6e 46 75 6c 6c 20 3d 20 73 71 6c 69 74 nFull = sqlit
bf660 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 3b e3MallocSize(p);
bf670 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 .. sqlite3Sta
bf680 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 tusAdd(SQLITE_ST
bf690 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 ATUS_MEMORY_USED
bf6a0 2c 20 6e 46 75 6c 6c 29 3b 0d 0a 20 20 20 20 73 , nFull);.. s
bf6b0 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 qlite3StatusAdd(
bf6c0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 SQLITE_STATUS_MA
bf6d0 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 31 29 3b 0d LLOC_COUNT, 1);.
bf6e0 0a 20 20 7d 0d 0a 20 20 2a 70 70 20 3d 20 70 3b . }.. *pp = p;
bf6f0 0d 0a 20 20 72 65 74 75 72 6e 20 6e 46 75 6c 6c .. return nFull
bf700 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 ;..}..../*..** A
bf710 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 20 llocate memory.
bf720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
bf730 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 5f 6d 61 like sqlite3_ma
bf740 6c 6c 6f 63 28 29 20 65 78 63 65 70 74 20 74 68 lloc() except th
bf750 61 74 20 69 74 0d 0a 2a 2a 20 61 73 73 75 6d 65 at it..** assume
bf760 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 75 62 s the memory sub
bf770 73 79 73 74 65 6d 20 68 61 73 20 61 6c 72 65 61 system has alrea
bf780 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 dy been initiali
bf790 7a 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 zed...*/..SQLITE
bf7a0 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 _PRIVATE void *s
bf7b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 69 6e 74 qlite3Malloc(int
bf7c0 20 6e 29 7b 0d 0a 20 20 76 6f 69 64 20 2a 70 3b n){.. void *p;
bf7d0 0d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 20 20 20 .. if( n<=0
bf7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d /* IM
bf7f0 50 3a 20 52 2d 36 35 33 31 32 2d 30 34 39 31 37 P: R-65312-04917
bf800 20 2a 2f 20 0d 0a 20 20 20 7c 7c 20 6e 3e 3d 30 */ .. || n>=0
bf810 78 37 66 66 66 66 66 30 30 0d 0a 20 20 29 7b 0d x7fffff00.. ){.
bf820 0a 20 20 20 20 2f 2a 20 41 20 6d 65 6d 6f 72 79 . /* A memory
bf830 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 allocation of a
bf840 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
bf850 20 77 68 69 63 68 20 69 73 20 6e 65 61 72 20 74 which is near t
bf860 68 65 20 6d 61 78 69 6d 75 6d 0d 0a 20 20 20 20 he maximum..
bf870 2a 2a 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 ** signed intege
bf880 72 20 76 61 6c 75 65 20 6d 69 67 68 74 20 63 61 r value might ca
bf890 75 73 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6f use an integer o
bf8a0 76 65 72 66 6c 6f 77 20 69 6e 73 69 64 65 20 6f verflow inside o
bf8b0 66 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 78 4d f the.. ** xM
bf8c0 61 6c 6c 6f 63 28 29 2e 20 20 48 65 6e 63 65 20 alloc(). Hence
bf8d0 77 65 20 6c 69 6d 69 74 20 74 68 65 20 6d 61 78 we limit the max
bf8e0 69 6d 75 6d 20 73 69 7a 65 20 74 6f 20 30 78 37 imum size to 0x7
bf8f0 66 66 66 66 66 30 30 2c 20 67 69 76 69 6e 67 0d fffff00, giving.
bf900 0a 20 20 20 20 2a 2a 20 32 35 35 20 62 79 74 65 . ** 255 byte
bf910 73 20 6f 66 20 6f 76 65 72 68 65 61 64 2e 20 20 s of overhead.
bf920 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20 77 69 SQLite itself wi
bf930 6c 6c 20 6e 65 76 65 72 20 75 73 65 20 61 6e 79 ll never use any
bf940 74 68 69 6e 67 20 6e 65 61 72 0d 0a 20 20 20 20 thing near..
bf950 2a 2a 20 74 68 69 73 20 61 6d 6f 75 6e 74 2e 20 ** this amount.
bf960 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f The only way to
bf970 20 72 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74 reach the limit
bf980 20 69 73 20 77 69 74 68 20 73 71 6c 69 74 65 33 is with sqlite3
bf990 5f 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0d 0a 20 20 _malloc() */..
bf9a0 20 20 70 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 p = 0;.. }els
bf9b0 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f e if( sqlite3Glo
bf9c0 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 balConfig.bMemst
bf9d0 61 74 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 at ){.. sqlit
bf9e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d e3_mutex_enter(m
bf9f0 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 em0.mutex);..
bfa00 20 6d 61 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d mallocWithAlarm
bfa10 28 6e 2c 20 26 70 29 3b 0d 0a 20 20 20 20 73 71 (n, &p);.. sq
bfa20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 lite3_mutex_leav
bfa30 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a e(mem0.mutex);..
bfa40 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 20 }else{.. p
bfa50 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 = sqlite3GlobalC
bfa60 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 onfig.m.xMalloc(
bfa70 6e 29 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 n);.. }.. asse
bfa80 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 rt( EIGHT_BYTE_A
bfa90 4c 49 47 4e 4d 45 4e 54 28 70 29 20 29 3b 20 20 LIGNMENT(p) );
bfaa0 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 36 37 35 2d /* IMP: R-04675-
bfab0 34 34 38 35 30 20 2a 2f 0d 0a 20 20 72 65 74 75 44850 */.. retu
bfac0 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a rn p;..}..../*..
bfad0 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 ** This version
bfae0 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c of the memory al
bfaf0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 6f 72 20 location is for
bfb00 75 73 65 20 62 79 20 74 68 65 20 61 70 70 6c 69 use by the appli
bfb10 63 61 74 69 6f 6e 2e 0d 0a 2a 2a 20 46 69 72 73 cation...** Firs
bfb20 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 t make sure the
bfb30 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74 65 6d memory subsystem
bfb40 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c is initialized,
bfb50 20 74 68 65 6e 20 64 6f 20 74 68 65 0d 0a 2a 2a then do the..**
bfb60 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2f allocation...*/
bfb70 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 ..SQLITE_API voi
bfb80 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f d *sqlite3_mallo
bfb90 63 28 69 6e 74 20 6e 29 7b 0d 0a 23 69 66 6e 64 c(int n){..#ifnd
bfba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 ef SQLITE_OMIT_A
bfbb0 55 54 4f 49 4e 49 54 0d 0a 20 20 69 66 28 20 73 UTOINIT.. if( s
bfbc0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a qlite3_initializ
bfbd0 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0d e() ) return 0;.
bfbe0 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75 72 .#endif.. retur
bfbf0 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 n sqlite3Malloc(
bfc00 6e 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a n);..}..../*..**
bfc10 20 45 61 63 68 20 74 68 72 65 61 64 20 6d 61 79 Each thread may
bfc20 20 6f 6e 6c 79 20 68 61 76 65 20 61 20 73 69 6e only have a sin
bfc30 67 6c 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 gle outstanding
bfc40 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 72 6f 6d 0d allocation from.
bfc50 0a 2a 2a 20 78 53 63 72 61 74 63 68 4d 61 6c 6c .** xScratchMall
bfc60 6f 63 28 29 2e 20 20 57 65 20 76 65 72 69 66 79 oc(). We verify
bfc70 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 this constraint
bfc80 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 2d 74 in the single-t
bfc90 68 72 65 61 64 65 64 0d 0a 2a 2a 20 63 61 73 65 hreaded..** case
bfca0 20 62 79 20 73 65 74 74 69 6e 67 20 73 63 72 61 by setting scra
bfcb0 74 63 68 41 6c 6c 6f 63 4f 75 74 20 74 6f 20 31 tchAllocOut to 1
bfcc0 20 77 68 65 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 when an allocat
bfcd0 69 6f 6e 0d 0a 2a 2a 20 69 73 20 6f 75 74 73 74 ion..** is outst
bfce0 61 6e 64 69 6e 67 20 63 6c 65 61 72 69 6e 67 20 anding clearing
bfcf0 69 74 20 77 68 65 6e 20 74 68 65 20 61 6c 6c 6f it when the allo
bfd00 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65 64 2e cation is freed.
bfd10 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 ..*/..#if SQLITE
bfd20 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26 _THREADSAFE==0 &
bfd30 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 & !defined(NDEBU
bfd40 47 29 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 G)..static int s
bfd50 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 20 3d cratchAllocOut =
bfd60 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0;..#endif.....
bfd70 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 ./*..** Allocate
bfd80 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 memory that is
bfd90 74 6f 20 62 65 20 75 73 65 64 20 61 6e 64 20 72 to be used and r
bfda0 65 6c 65 61 73 65 64 20 72 69 67 68 74 20 61 77 eleased right aw
bfdb0 61 79 2e 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ay...** This rou
bfdc0 74 69 6e 65 20 69 73 20 73 69 6d 69 6c 61 72 20 tine is similar
bfdd0 74 6f 20 61 6c 6c 6f 63 61 28 29 20 69 6e 20 74 to alloca() in t
bfde0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 69 6e hat it is not in
bfdf0 74 65 6e 64 65 64 0d 0a 2a 2a 20 66 6f 72 20 73 tended..** for s
bfe00 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 ituations where
bfe10 74 68 65 20 6d 65 6d 6f 72 79 20 6d 69 67 68 74 the memory might
bfe20 20 62 65 20 68 65 6c 64 20 6c 6f 6e 67 2d 74 65 be held long-te
bfe30 72 6d 2e 20 20 54 68 69 73 0d 0a 2a 2a 20 72 6f rm. This..** ro
bfe40 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 utine is intende
bfe50 64 20 74 6f 20 67 65 74 20 6d 65 6d 6f 72 79 20 d to get memory
bfe60 74 6f 20 6f 6c 64 20 6c 61 72 67 65 20 74 72 61 to old large tra
bfe70 6e 73 69 65 6e 74 20 64 61 74 61 0d 0a 2a 2a 20 nsient data..**
bfe80 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 structures that
bfe90 77 6f 75 6c 64 20 6e 6f 74 20 6e 6f 72 6d 61 6c would not normal
bfea0 6c 79 20 66 69 74 20 6f 6e 20 74 68 65 20 73 74 ly fit on the st
bfeb0 61 63 6b 20 6f 66 20 61 6e 0d 0a 2a 2a 20 65 6d ack of an..** em
bfec0 62 65 64 64 65 64 20 70 72 6f 63 65 73 73 6f 72 bedded processor
bfed0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
bfee0 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 IVATE void *sqli
bfef0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 te3ScratchMalloc
bff00 28 69 6e 74 20 6e 29 7b 0d 0a 20 20 76 6f 69 64 (int n){.. void
bff10 20 2a 70 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 *p;.. assert(
bff20 6e 3e 30 20 29 3b 0d 0a 0d 0a 20 20 73 71 6c 69 n>0 );.... sqli
bff30 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 te3_mutex_enter(
bff40 6d 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 mem0.mutex);..
bff50 69 66 28 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 if( mem0.nScratc
bff60 68 46 72 65 65 20 26 26 20 73 71 6c 69 74 65 33 hFree && sqlite3
bff70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 GlobalConfig.szS
bff80 63 72 61 74 63 68 3e 3d 6e 20 29 7b 0d 0a 20 20 cratch>=n ){..
bff90 20 20 70 20 3d 20 6d 65 6d 30 2e 70 53 63 72 61 p = mem0.pScra
bffa0 74 63 68 46 72 65 65 3b 0d 0a 20 20 20 20 6d 65 tchFree;.. me
bffb0 6d 30 2e 70 53 63 72 61 74 63 68 46 72 65 65 20 m0.pScratchFree
bffc0 3d 20 6d 65 6d 30 2e 70 53 63 72 61 74 63 68 46 = mem0.pScratchF
bffd0 72 65 65 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 ree->pNext;..
bffe0 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 46 72 mem0.nScratchFr
bfff0 65 65 2d 2d 3b 0d 0a 20 20 20 20 73 71 6c 69 74 ee--;.. sqlit
c0000 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 e3StatusAdd(SQLI
c0010 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 TE_STATUS_SCRATC
c0020 48 5f 55 53 45 44 2c 20 31 29 3b 0d 0a 20 20 20 H_USED, 1);..
c0030 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 sqlite3StatusSe
c0040 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f t(SQLITE_STATUS_
c0050 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 6e 29 SCRATCH_SIZE, n)
c0060 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d ;.. sqlite3_m
c0070 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e utex_leave(mem0.
c0080 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 65 6c 73 65 mutex);.. }else
c0090 7b 0d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 {.. if( sqlit
c00a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 e3GlobalConfig.b
c00b0 4d 65 6d 73 74 61 74 20 29 7b 0d 0a 20 20 20 20 Memstat ){..
c00c0 20 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 sqlite3StatusS
c00d0 65 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 et(SQLITE_STATUS
c00e0 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 6e _SCRATCH_SIZE, n
c00f0 29 3b 0d 0a 20 20 20 20 20 20 6e 20 3d 20 6d 61 );.. n = ma
c0100 6c 6c 6f 63 57 69 74 68 41 6c 61 72 6d 28 6e 2c llocWithAlarm(n,
c0110 20 26 70 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 &p);.. if(
c0120 20 70 20 29 20 73 71 6c 69 74 65 33 53 74 61 74 p ) sqlite3Stat
c0130 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 usAdd(SQLITE_STA
c0140 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 TUS_SCRATCH_OVER
c0150 46 4c 4f 57 2c 20 6e 29 3b 0d 0a 20 20 20 20 20 FLOW, n);..
c0160 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
c0170 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 eave(mem0.mutex)
c0180 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
c0190 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 sqlite3_mut
c01a0 65 78 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 ex_leave(mem0.mu
c01b0 74 65 78 29 3b 0d 0a 20 20 20 20 20 20 70 20 3d tex);.. p =
c01c0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
c01d0 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 28 6e nfig.m.xMalloc(n
c01e0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 );.. }.. s
c01f0 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 qlite3MemdebugSe
c0200 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 tType(p, MEMTYPE
c0210 5f 53 43 52 41 54 43 48 29 3b 0d 0a 20 20 7d 0d _SCRATCH);.. }.
c0220 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
c0230 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 e3_mutex_notheld
c0240 28 6d 65 6d 30 2e 6d 75 74 65 78 29 20 29 3b 0d (mem0.mutex) );.
c0250 0a 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f .....#if SQLITE_
c0260 54 48 52 45 41 44 53 41 46 45 3d 3d 30 20 26 26 THREADSAFE==0 &&
c0270 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 !defined(NDEBUG
c0280 29 0d 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 ).. /* Verify t
c0290 68 61 74 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e hat no more than
c02a0 20 74 77 6f 20 73 63 72 61 74 63 68 20 61 6c 6c two scratch all
c02b0 6f 63 61 74 69 6f 6e 73 20 70 65 72 20 74 68 72 ocations per thr
c02c0 65 61 64 0d 0a 20 20 2a 2a 20 61 72 65 20 6f 75 ead.. ** are ou
c02d0 74 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65 tstanding at one
c02e0 20 74 69 6d 65 2e 20 20 28 54 68 69 73 20 69 73 time. (This is
c02f0 20 6f 6e 6c 79 20 63 68 65 63 6b 65 64 20 69 6e only checked in
c0300 20 74 68 65 0d 0a 20 20 2a 2a 20 73 69 6e 67 6c the.. ** singl
c0310 65 2d 74 68 72 65 61 64 65 64 20 63 61 73 65 20 e-threaded case
c0320 73 69 6e 63 65 20 63 68 65 63 6b 69 6e 67 20 69 since checking i
c0330 6e 20 74 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 n the multi-thre
c0340 61 64 65 64 20 63 61 73 65 0d 0a 20 20 2a 2a 20 aded case.. **
c0350 77 6f 75 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f would be much mo
c0360 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 re complicated.)
c0370 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 73 */.. assert( s
c0380 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3c 3d cratchAllocOut<=
c0390 31 20 29 3b 0d 0a 20 20 69 66 28 20 70 20 29 20 1 );.. if( p )
c03a0 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 2b scratchAllocOut+
c03b0 2b 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 +;..#endif....
c03c0 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 53 51 return p;..}..SQ
c03d0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
c03e0 64 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 d sqlite3Scratch
c03f0 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0d 0a Free(void *p){..
c0400 20 20 69 66 28 20 70 20 29 7b 0d 0a 0d 0a 23 69 if( p ){....#i
c0410 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 f SQLITE_THREADS
c0420 41 46 45 3d 3d 30 20 26 26 20 21 64 65 66 69 6e AFE==0 && !defin
c0430 65 64 28 4e 44 45 42 55 47 29 0d 0a 20 20 20 20 ed(NDEBUG)..
c0440 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e /* Verify that n
c0450 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 77 6f 20 o more than two
c0460 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 scratch allocati
c0470 6f 6e 20 70 65 72 20 74 68 72 65 61 64 0d 0a 20 on per thread..
c0480 20 20 20 2a 2a 20 69 73 20 6f 75 74 73 74 61 6e ** is outstan
c0490 64 69 6e 67 20 61 74 20 6f 6e 65 20 74 69 6d 65 ding at one time
c04a0 2e 20 20 28 54 68 69 73 20 69 73 20 6f 6e 6c 79 . (This is only
c04b0 20 63 68 65 63 6b 65 64 20 69 6e 20 74 68 65 0d checked in the.
c04c0 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 74 . ** single-t
c04d0 68 72 65 61 64 65 64 20 63 61 73 65 20 73 69 6e hreaded case sin
c04e0 63 65 20 63 68 65 63 6b 69 6e 67 20 69 6e 20 74 ce checking in t
c04f0 68 65 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 he multi-threade
c0500 64 20 63 61 73 65 0d 0a 20 20 20 20 2a 2a 20 77 d case.. ** w
c0510 6f 75 6c 64 20 62 65 20 6d 75 63 68 20 6d 6f 72 ould be much mor
c0520 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 29 20 e complicated.)
c0530 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 */.. assert(
c0540 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 3e scratchAllocOut>
c0550 3d 31 20 26 26 20 73 63 72 61 74 63 68 41 6c 6c =1 && scratchAll
c0560 6f 63 4f 75 74 3c 3d 32 20 29 3b 0d 0a 20 20 20 ocOut<=2 );..
c0570 20 73 63 72 61 74 63 68 41 6c 6c 6f 63 4f 75 74 scratchAllocOut
c0580 2d 2d 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 --;..#endif....
c0590 20 20 20 69 66 28 20 70 3e 3d 73 71 6c 69 74 65 if( p>=sqlite
c05a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 3GlobalConfig.pS
c05b0 63 72 61 74 63 68 20 26 26 20 70 3c 6d 65 6d 30 cratch && p<mem0
c05c0 2e 70 53 63 72 61 74 63 68 45 6e 64 20 29 7b 0d .pScratchEnd ){.
c05d0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 . /* Releas
c05e0 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 e memory from th
c05f0 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f e SQLITE_CONFIG_
c0600 53 43 52 41 54 43 48 20 61 6c 6c 6f 63 61 74 69 SCRATCH allocati
c0610 6f 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 53 63 72 on */.. Scr
c0620 61 74 63 68 46 72 65 65 73 6c 6f 74 20 2a 70 53 atchFreeslot *pS
c0630 6c 6f 74 3b 0d 0a 20 20 20 20 20 20 70 53 6c 6f lot;.. pSlo
c0640 74 20 3d 20 28 53 63 72 61 74 63 68 46 72 65 65 t = (ScratchFree
c0650 73 6c 6f 74 2a 29 70 3b 0d 0a 20 20 20 20 20 20 slot*)p;..
c0660 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e sqlite3_mutex_en
c0670 74 65 72 28 6d 65 6d 30 2e 6d 75 74 65 78 29 3b ter(mem0.mutex);
c0680 0d 0a 20 20 20 20 20 20 70 53 6c 6f 74 2d 3e 70 .. pSlot->p
c0690 4e 65 78 74 20 3d 20 6d 65 6d 30 2e 70 53 63 72 Next = mem0.pScr
c06a0 61 74 63 68 46 72 65 65 3b 0d 0a 20 20 20 20 20 atchFree;..
c06b0 20 6d 65 6d 30 2e 70 53 63 72 61 74 63 68 46 72 mem0.pScratchFr
c06c0 65 65 20 3d 20 70 53 6c 6f 74 3b 0d 0a 20 20 20 ee = pSlot;..
c06d0 20 20 20 6d 65 6d 30 2e 6e 53 63 72 61 74 63 68 mem0.nScratch
c06e0 46 72 65 65 2b 2b 3b 0d 0a 20 20 20 20 20 20 61 Free++;.. a
c06f0 73 73 65 72 74 28 20 6d 65 6d 30 2e 6e 53 63 72 ssert( mem0.nScr
c0700 61 74 63 68 46 72 65 65 20 3c 3d 20 28 75 33 32 atchFree <= (u32
c0710 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f )sqlite3GlobalCo
c0720 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 29 3b nfig.nScratch );
c0730 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 .. sqlite3S
c0740 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f tatusAdd(SQLITE_
c0750 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 STATUS_SCRATCH_U
c0760 53 45 44 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 20 SED, -1);..
c0770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
c0780 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 eave(mem0.mutex)
c0790 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
c07a0 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 /* Release
c07b0 6d 65 6d 6f 72 79 20 62 61 63 6b 20 74 6f 20 74 memory back to t
c07c0 68 65 20 68 65 61 70 20 2a 2f 0d 0a 20 20 20 20 he heap */..
c07d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
c07e0 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 3MemdebugHasType
c07f0 28 70 2c 20 4d 45 4d 54 59 50 45 5f 53 43 52 41 (p, MEMTYPE_SCRA
c0800 54 43 48 29 20 29 3b 0d 0a 20 20 20 20 20 20 61 TCH) );.. a
c0810 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 ssert( sqlite3Me
c0820 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c 20 mdebugNoType(p,
c0830 7e 4d 45 4d 54 59 50 45 5f 53 43 52 41 54 43 48 ~MEMTYPE_SCRATCH
c0840 29 20 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 ) );.. sqli
c0850 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 te3MemdebugSetTy
c0860 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 48 45 pe(p, MEMTYPE_HE
c0870 41 50 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 AP);.. if(
c0880 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
c0890 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0d fig.bMemstat ){.
c08a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 69 . int iSi
c08b0 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c ze = sqlite3Mall
c08c0 6f 63 53 69 7a 65 28 70 29 3b 0d 0a 20 20 20 20 ocSize(p);..
c08d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 sqlite3_mute
c08e0 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d 75 74 x_enter(mem0.mut
c08f0 65 78 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 ex);.. sq
c0900 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 53 lite3StatusAdd(S
c0910 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 QLITE_STATUS_SCR
c0920 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d ATCH_OVERFLOW, -
c0930 69 53 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20 20 iSize);..
c0940 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 sqlite3StatusAd
c0950 64 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f d(SQLITE_STATUS_
c0960 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 2d 69 53 MEMORY_USED, -iS
c0970 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 ize);.. s
c0980 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 28 qlite3StatusAdd(
c0990 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 SQLITE_STATUS_MA
c09a0 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 2d 31 29 3b LLOC_COUNT, -1);
c09b0 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 .. sqlite
c09c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 3GlobalConfig.m.
c09d0 78 46 72 65 65 28 70 29 3b 0d 0a 20 20 20 20 20 xFree(p);..
c09e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 sqlite3_mutex
c09f0 5f 6c 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 _leave(mem0.mute
c0a00 78 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 x);.. }else
c0a10 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 {.. sqlit
c0a20 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d e3GlobalConfig.m
c0a30 2e 78 46 72 65 65 28 70 29 3b 0d 0a 20 20 20 20 .xFree(p);..
c0a40 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d }.. }.. }.
c0a50 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 52 55 .}..../*..** TRU
c0a60 45 20 69 66 20 70 20 69 73 20 61 20 6c 6f 6f 6b E if p is a look
c0a70 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c aside memory all
c0a80 6f 63 61 74 69 6f 6e 20 66 72 6f 6d 20 64 62 0d ocation from db.
c0a90 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
c0aa0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 ITE_OMIT_LOOKASI
c0ab0 44 45 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 DE..static int i
c0ac0 73 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 sLookaside(sqlit
c0ad0 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 e3 *db, void *p)
c0ae0 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 20 26 26 {.. return p &&
c0af0 20 70 3e 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 p>=db->lookasid
c0b00 65 2e 70 53 74 61 72 74 20 26 26 20 70 3c 64 62 e.pStart && p<db
c0b10 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 ->lookaside.pEnd
c0b20 3b 0d 0a 7d 0d 0a 23 65 6c 73 65 0d 0a 23 64 65 ;..}..#else..#de
c0b30 66 69 6e 65 20 69 73 4c 6f 6f 6b 61 73 69 64 65 fine isLookaside
c0b40 28 41 2c 42 29 20 30 0d 0a 23 65 6e 64 69 66 0d (A,B) 0..#endif.
c0b50 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e .../*..** Return
c0b60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6d the size of a m
c0b70 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
c0b80 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 previously obta
c0b90 69 6e 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 73 71 ined from..** sq
c0ba0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 6f 72 lite3Malloc() or
c0bb0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
c0bc0 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 )...*/..SQLITE_P
c0bd0 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
c0be0 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76 6f 69 e3MallocSize(voi
c0bf0 64 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 d *p){.. assert
c0c00 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 ( sqlite3Memdebu
c0c10 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d 54 gHasType(p, MEMT
c0c20 59 50 45 5f 48 45 41 50 29 20 29 3b 0d 0a 20 20 YPE_HEAP) );..
c0c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d assert( sqlite3M
c0c40 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c emdebugNoType(p,
c0c50 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0d MEMTYPE_DB) );.
c0c60 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
c0c70 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 3GlobalConfig.m.
c0c80 78 53 69 7a 65 28 70 29 3b 0d 0a 7d 0d 0a 53 51 xSize(p);..}..SQ
c0c90 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
c0ca0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
c0cb0 53 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 Size(sqlite3 *db
c0cc0 2c 20 76 6f 69 64 20 2a 70 29 7b 0d 0a 20 20 61 , void *p){.. a
c0cd0 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 ssert( db==0 ||
c0ce0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
c0cf0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b ld(db->mutex) );
c0d00 0d 0a 20 20 69 66 28 20 64 62 20 26 26 20 69 73 .. if( db && is
c0d10 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 29 Lookaside(db, p)
c0d20 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
c0d30 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a db->lookaside.sz
c0d40 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
c0d50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
c0d60 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 MemdebugHasType(
c0d70 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 p, MEMTYPE_DB) )
c0d80 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 ;.. assert( s
c0d90 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 qlite3MemdebugHa
c0da0 73 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 sType(p, MEMTYPE
c0db0 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d 54 59 _LOOKASIDE|MEMTY
c0dc0 50 45 5f 48 45 41 50 29 20 29 3b 0d 0a 20 20 20 PE_HEAP) );..
c0dd0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c assert( db!=0 |
c0de0 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 | sqlite3Memdebu
c0df0 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 gNoType(p, MEMTY
c0e00 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 29 20 29 3b PE_LOOKASIDE) );
c0e10 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c .. return sql
c0e20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
c0e30 2e 6d 2e 78 53 69 7a 65 28 70 29 3b 0d 0a 20 20 .m.xSize(p);..
c0e40 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 }..}..../*..** F
c0e50 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 ree memory previ
c0e60 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 66 ously obtained f
c0e70 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f rom sqlite3Mallo
c0e80 63 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 c()...*/..SQLITE
c0e90 5f 41 50 49 20 76 6f 69 64 20 73 71 6c 69 74 65 _API void sqlite
c0ea0 33 5f 66 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 3_free(void *p){
c0eb0 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 .. if( p==0 ) r
c0ec0 65 74 75 72 6e 3b 20 20 2f 2a 20 49 4d 50 3a 20 eturn; /* IMP:
c0ed0 52 2d 34 39 30 35 33 2d 35 34 35 35 34 20 2a 2f R-49053-54554 */
c0ee0 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
c0ef0 74 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 te3MemdebugNoTyp
c0f00 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 29 e(p, MEMTYPE_DB)
c0f10 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
c0f20 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 qlite3MemdebugHa
c0f30 73 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 sType(p, MEMTYPE
c0f40 5f 48 45 41 50 29 20 29 3b 0d 0a 20 20 69 66 28 _HEAP) );.. if(
c0f50 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
c0f60 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b nfig.bMemstat ){
c0f70 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 .. sqlite3_mu
c0f80 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 30 2e 6d tex_enter(mem0.m
c0f90 75 74 65 78 29 3b 0d 0a 20 20 20 20 73 71 6c 69 utex);.. sqli
c0fa0 74 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c te3StatusAdd(SQL
c0fb0 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 ITE_STATUS_MEMOR
c0fc0 59 5f 55 53 45 44 2c 20 2d 73 71 6c 69 74 65 33 Y_USED, -sqlite3
c0fd0 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 29 3b 0d MallocSize(p));.
c0fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 . sqlite3Stat
c0ff0 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 41 usAdd(SQLITE_STA
c1000 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 TUS_MALLOC_COUNT
c1010 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 73 71 6c 69 , -1);.. sqli
c1020 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
c1030 6d 2e 78 46 72 65 65 28 70 29 3b 0d 0a 20 20 20 m.xFree(p);..
c1040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
c1050 65 61 76 65 28 6d 65 6d 30 2e 6d 75 74 65 78 29 eave(mem0.mutex)
c1060 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
c1070 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
c1080 6e 66 69 67 2e 6d 2e 78 46 72 65 65 28 70 29 3b nfig.m.xFree(p);
c1090 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
c10a0 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 74 ** Free memory t
c10b0 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 73 73 hat might be ass
c10c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70 ociated with a p
c10d0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 articular databa
c10e0 73 65 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f se..** connectio
c10f0 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 n...*/..SQLITE_P
c1100 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
c1110 74 65 33 44 62 46 72 65 65 28 73 71 6c 69 74 65 te3DbFree(sqlite
c1120 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 29 7b 3 *db, void *p){
c1130 0d 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d .. assert( db==
c1140 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 0 || sqlite3_mut
c1150 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 ex_held(db->mute
c1160 78 29 20 29 3b 0d 0a 20 20 69 66 28 20 64 62 20 x) );.. if( db
c1170 29 7b 0d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e ){.. if( db->
c1180 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0d pnBytesFreed ){.
c1190 0a 20 20 20 20 20 20 2a 64 62 2d 3e 70 6e 42 79 . *db->pnBy
c11a0 74 65 73 46 72 65 65 64 20 2b 3d 20 73 71 6c 69 tesFreed += sqli
c11b0 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 te3DbMallocSize(
c11c0 64 62 2c 20 70 29 3b 0d 0a 20 20 20 20 20 20 72 db, p);.. r
c11d0 65 74 75 72 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 eturn;.. }..
c11e0 20 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 if( isLookasi
c11f0 64 65 28 64 62 2c 20 70 29 20 29 7b 0d 0a 20 20 de(db, p) ){..
c1200 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f LookasideSlo
c1210 74 20 2a 70 42 75 66 20 3d 20 28 4c 6f 6f 6b 61 t *pBuf = (Looka
c1220 73 69 64 65 53 6c 6f 74 2a 29 70 3b 0d 0a 20 20 sideSlot*)p;..
c1230 20 20 20 20 70 42 75 66 2d 3e 70 4e 65 78 74 20 pBuf->pNext
c1240 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e = db->lookaside.
c1250 70 46 72 65 65 3b 0d 0a 20 20 20 20 20 20 64 62 pFree;.. db
c1260 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 ->lookaside.pFre
c1270 65 20 3d 20 70 42 75 66 3b 0d 0a 20 20 20 20 20 e = pBuf;..
c1280 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e db->lookaside.n
c1290 4f 75 74 2d 2d 3b 0d 0a 20 20 20 20 20 20 72 65 Out--;.. re
c12a0 74 75 72 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 turn;.. }..
c12b0 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c }.. assert( sql
c12c0 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 ite3MemdebugHasT
c12d0 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 ype(p, MEMTYPE_D
c12e0 42 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 B) );.. assert(
c12f0 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 sqlite3Memdebug
c1300 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 HasType(p, MEMTY
c1310 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d PE_LOOKASIDE|MEM
c1320 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0d 0a 20 TYPE_HEAP) );..
c1330 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c assert( db!=0 |
c1340 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 | sqlite3Memdebu
c1350 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 gNoType(p, MEMTY
c1360 50 45 5f 4c 4f 4f 4b 41 53 49 44 45 29 20 29 3b PE_LOOKASIDE) );
c1370 0d 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 .. sqlite3Memde
c1380 62 75 67 53 65 74 54 79 70 65 28 70 2c 20 4d 45 bugSetType(p, ME
c1390 4d 54 59 50 45 5f 48 45 41 50 29 3b 0d 0a 20 20 MTYPE_HEAP);..
c13a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b sqlite3_free(p);
c13b0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 ..}..../*..** Ch
c13c0 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 ange the size of
c13d0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d an existing mem
c13e0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d 0a ory allocation..
c13f0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
c1400 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 TE void *sqlite3
c1410 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f Realloc(void *pO
c1420 6c 64 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b ld, int nBytes){
c1430 0d 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 4e .. int nOld, nN
c1440 65 77 2c 20 6e 44 69 66 66 3b 0d 0a 20 20 76 6f ew, nDiff;.. vo
c1450 69 64 20 2a 70 4e 65 77 3b 0d 0a 20 20 69 66 28 id *pNew;.. if(
c1460 20 70 4f 6c 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 pOld==0 ){..
c1470 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d return sqlite3M
c1480 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 20 2f alloc(nBytes); /
c1490 2a 20 49 4d 50 3a 20 52 2d 32 38 33 35 34 2d 32 * IMP: R-28354-2
c14a0 35 37 36 39 20 2a 2f 0d 0a 20 20 7d 0d 0a 20 20 5769 */.. }..
c14b0 69 66 28 20 6e 42 79 74 65 73 3c 3d 30 20 29 7b if( nBytes<=0 ){
c14c0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 .. sqlite3_fr
c14d0 65 65 28 70 4f 6c 64 29 3b 20 2f 2a 20 49 4d 50 ee(pOld); /* IMP
c14e0 3a 20 52 2d 33 31 35 39 33 2d 31 30 35 37 34 20 : R-31593-10574
c14f0 2a 2f 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 */.. return 0
c1500 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6e 42 ;.. }.. if( nB
c1510 79 74 65 73 3e 3d 30 78 37 66 66 66 66 66 30 30 ytes>=0x7fffff00
c1520 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 ){.. /* The
c1530 30 78 37 66 66 66 66 30 30 20 6c 69 6d 69 74 20 0x7ffff00 limit
c1540 74 65 72 6d 20 69 73 20 65 78 70 6c 61 69 6e 65 term is explaine
c1550 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e d in comments on
c1560 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 sqlite3Malloc()
c1570 20 2a 2f 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 */.. return
c1580 30 3b 0d 0a 20 20 7d 0d 0a 20 20 6e 4f 6c 64 20 0;.. }.. nOld
c1590 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 = sqlite3MallocS
c15a0 69 7a 65 28 70 4f 6c 64 29 3b 0d 0a 20 20 2f 2a ize(pOld);.. /*
c15b0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d IMPLEMENTATION-
c15c0 4f 46 3a 20 52 2d 34 36 31 39 39 2d 33 30 32 34 OF: R-46199-3024
c15d0 39 20 53 51 4c 69 74 65 20 67 75 61 72 61 6e 74 9 SQLite guarant
c15e0 65 65 73 20 74 68 61 74 20 74 68 65 20 73 65 63 ees that the sec
c15f0 6f 6e 64 0d 0a 20 20 2a 2a 20 61 72 67 75 6d 65 ond.. ** argume
c1600 6e 74 20 74 6f 20 78 52 65 61 6c 6c 6f 63 20 69 nt to xRealloc i
c1610 73 20 61 6c 77 61 79 73 20 61 20 76 61 6c 75 65 s always a value
c1620 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 returned by a p
c1630 72 69 6f 72 20 63 61 6c 6c 20 74 6f 0d 0a 20 20 rior call to..
c1640 2a 2a 20 78 52 6f 75 6e 64 75 70 2e 20 2a 2f 0d ** xRoundup. */.
c1650 0a 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 . nNew = sqlite
c1660 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 3GlobalConfig.m.
c1670 78 52 6f 75 6e 64 75 70 28 6e 42 79 74 65 73 29 xRoundup(nBytes)
c1680 3b 0d 0a 20 20 69 66 28 20 6e 4f 6c 64 3d 3d 6e ;.. if( nOld==n
c1690 4e 65 77 20 29 7b 0d 0a 20 20 20 20 70 4e 65 77 New ){.. pNew
c16a0 20 3d 20 70 4f 6c 64 3b 0d 0a 20 20 7d 65 6c 73 = pOld;.. }els
c16b0 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f e if( sqlite3Glo
c16c0 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 balConfig.bMemst
c16d0 61 74 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 at ){.. sqlit
c16e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d e3_mutex_enter(m
c16f0 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 em0.mutex);..
c1700 20 73 71 6c 69 74 65 33 53 74 61 74 75 73 53 65 sqlite3StatusSe
c1710 74 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f t(SQLITE_STATUS_
c1720 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 6e 42 79 MALLOC_SIZE, nBy
c1730 74 65 73 29 3b 0d 0a 20 20 20 20 6e 44 69 66 66 tes);.. nDiff
c1740 20 3d 20 6e 4e 65 77 20 2d 20 6e 4f 6c 64 3b 0d = nNew - nOld;.
c1750 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
c1760 53 74 61 74 75 73 56 61 6c 75 65 28 53 51 4c 49 StatusValue(SQLI
c1770 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 TE_STATUS_MEMORY
c1780 5f 55 53 45 44 29 20 3e 3d 20 0d 0a 20 20 20 20 _USED) >= ..
c1790 20 20 20 20 20 20 6d 65 6d 30 2e 61 6c 61 72 6d mem0.alarm
c17a0 54 68 72 65 73 68 6f 6c 64 2d 6e 44 69 66 66 20 Threshold-nDiff
c17b0 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){.. sqlite
c17c0 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 44 69 3MallocAlarm(nDi
c17d0 66 66 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 ff);.. }..
c17e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
c17f0 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 MemdebugHasType(
c1800 70 4f 6c 64 2c 20 4d 45 4d 54 59 50 45 5f 48 45 pOld, MEMTYPE_HE
c1810 41 50 29 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 AP) );.. asse
c1820 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 rt( sqlite3Memde
c1830 62 75 67 4e 6f 54 79 70 65 28 70 4f 6c 64 2c 20 bugNoType(pOld,
c1840 7e 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 ~MEMTYPE_HEAP) )
c1850 3b 0d 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 ;.. pNew = sq
c1860 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
c1870 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 4f 6c g.m.xRealloc(pOl
c1880 64 2c 20 6e 4e 65 77 29 3b 0d 0a 20 20 20 20 69 d, nNew);.. i
c1890 66 28 20 70 4e 65 77 3d 3d 30 20 26 26 20 6d 65 f( pNew==0 && me
c18a0 6d 30 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b m0.alarmCallback
c18b0 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 ){.. sqlit
c18c0 65 33 4d 61 6c 6c 6f 63 41 6c 61 72 6d 28 6e 42 e3MallocAlarm(nB
c18d0 79 74 65 73 29 3b 0d 0a 20 20 20 20 20 20 70 4e ytes);.. pN
c18e0 65 77 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 ew = sqlite3Glob
c18f0 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c alConfig.m.xReal
c1900 6c 6f 63 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b loc(pOld, nNew);
c1910 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
c1920 20 70 4e 65 77 20 29 7b 0d 0a 20 20 20 20 20 20 pNew ){..
c1930 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 nNew = sqlite3Ma
c1940 6c 6c 6f 63 53 69 7a 65 28 70 4e 65 77 29 3b 0d llocSize(pNew);.
c1950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 . sqlite3St
c1960 61 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 atusAdd(SQLITE_S
c1970 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 TATUS_MEMORY_USE
c1980 44 2c 20 6e 4e 65 77 2d 6e 4f 6c 64 29 3b 0d 0a D, nNew-nOld);..
c1990 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 }.. sqlit
c19a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d e3_mutex_leave(m
c19b0 65 6d 30 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d em0.mutex);.. }
c19c0 65 6c 73 65 7b 0d 0a 20 20 20 20 70 4e 65 77 20 else{.. pNew
c19d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 = sqlite3GlobalC
c19e0 6f 6e 66 69 67 2e 6d 2e 78 52 65 61 6c 6c 6f 63 onfig.m.xRealloc
c19f0 28 70 4f 6c 64 2c 20 6e 4e 65 77 29 3b 0d 0a 20 (pOld, nNew);..
c1a00 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 45 49 }.. assert( EI
c1a10 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 GHT_BYTE_ALIGNME
c1a20 4e 54 28 70 4e 65 77 29 20 29 3b 20 2f 2a 20 49 NT(pNew) ); /* I
c1a30 4d 50 3a 20 52 2d 30 34 36 37 35 2d 34 34 38 35 MP: R-04675-4485
c1a40 30 20 2a 2f 0d 0a 20 20 72 65 74 75 72 6e 20 70 0 */.. return p
c1a50 4e 65 77 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a New;..}..../*..*
c1a60 2a 20 54 68 65 20 70 75 62 6c 69 63 20 69 6e 74 * The public int
c1a70 65 72 66 61 63 65 20 74 6f 20 73 71 6c 69 74 65 erface to sqlite
c1a80 33 52 65 61 6c 6c 6f 63 2e 20 20 4d 61 6b 65 20 3Realloc. Make
c1a90 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6d 65 sure that the me
c1aa0 6d 6f 72 79 0d 0a 2a 2a 20 73 75 62 73 79 73 74 mory..** subsyst
c1ab0 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 em is initialize
c1ac0 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b d prior to invok
c1ad0 69 6e 67 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f ing sqliteReallo
c1ae0 63 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 c...*/..SQLITE_A
c1af0 50 49 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 PI void *sqlite3
c1b00 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 _realloc(void *p
c1b10 4f 6c 64 2c 20 69 6e 74 20 6e 29 7b 0d 0a 23 69 Old, int n){..#i
c1b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
c1b30 54 5f 41 55 54 4f 49 4e 49 54 0d 0a 20 20 69 66 T_AUTOINIT.. if
c1b40 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 ( sqlite3_initia
c1b50 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 lize() ) return
c1b60 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 0;..#endif.. re
c1b70 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 61 6c turn sqlite3Real
c1b80 6c 6f 63 28 70 4f 6c 64 2c 20 6e 29 3b 0d 0a 7d loc(pOld, n);..}
c1b90 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c ....../*..** All
c1ba0 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d ocate and zero m
c1bb0 65 6d 6f 72 79 2e 0d 0a 2a 2f 20 0d 0a 53 51 4c emory...*/ ..SQL
c1bc0 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
c1bd0 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a *sqlite3MallocZ
c1be0 65 72 6f 28 69 6e 74 20 6e 29 7b 0d 0a 20 20 76 ero(int n){.. v
c1bf0 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 oid *p = sqlite3
c1c00 4d 61 6c 6c 6f 63 28 6e 29 3b 0d 0a 20 20 69 66 Malloc(n);.. if
c1c10 28 20 70 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 73 ( p ){.. mems
c1c20 65 74 28 70 2c 20 30 2c 20 6e 29 3b 0d 0a 20 20 et(p, 0, n);..
c1c30 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a }.. return p;..
c1c40 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f }..../*..** Allo
c1c50 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 6d 65 cate and zero me
c1c60 6d 6f 72 79 2e 20 20 49 66 20 74 68 65 20 61 6c mory. If the al
c1c70 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 location fails,
c1c80 6d 61 6b 65 0d 0a 2a 2a 20 74 68 65 20 6d 61 6c make..** the mal
c1c90 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 69 locFailed flag i
c1ca0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e n the connection
c1cb0 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d 0a 53 pointer...*/..S
c1cc0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
c1cd0 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d 61 6c id *sqlite3DbMal
c1ce0 6c 6f 63 5a 65 72 6f 28 73 71 6c 69 74 65 33 20 locZero(sqlite3
c1cf0 2a 64 62 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 *db, int n){..
c1d00 76 6f 69 64 20 2a 70 20 3d 20 73 71 6c 69 74 65 void *p = sqlite
c1d10 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 3DbMallocRaw(db,
c1d20 20 6e 29 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b n);.. if( p ){
c1d30 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 .. memset(p,
c1d40 30 2c 20 6e 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 0, n);.. }.. r
c1d50 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f eturn p;..}..../
c1d60 2a 0d 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 *..** Allocate a
c1d70 6e 64 20 7a 65 72 6f 20 6d 65 6d 6f 72 79 2e 20 nd zero memory.
c1d80 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 If the allocati
c1d90 6f 6e 20 66 61 69 6c 73 2c 20 6d 61 6b 65 0d 0a on fails, make..
c1da0 2a 2a 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 ** the mallocFai
c1db0 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 led flag in the
c1dc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 connection point
c1dd0 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 64 er...**..** If d
c1de0 62 21 3d 30 20 61 6e 64 20 64 62 2d 3e 6d 61 6c b!=0 and db->mal
c1df0 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 74 72 75 locFailed is tru
c1e00 65 20 28 69 6e 64 69 63 61 74 69 6e 67 20 61 20 e (indicating a
c1e10 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 0d 0a 2a 2a prior malloc..**
c1e20 20 66 61 69 6c 75 72 65 20 6f 6e 20 74 68 65 20 failure on the
c1e30 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f same database co
c1e40 6e 6e 65 63 74 69 6f 6e 29 20 74 68 65 6e 20 61 nnection) then a
c1e50 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0d lways return 0..
c1e60 0a 2a 2a 20 48 65 6e 63 65 20 66 6f 72 20 61 20 .** Hence for a
c1e70 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 particular datab
c1e80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 ase connection,
c1e90 6f 6e 63 65 20 6d 61 6c 6c 6f 63 20 73 74 61 72 once malloc star
c1ea0 74 73 0d 0a 2a 2a 20 66 61 69 6c 69 6e 67 2c 20 ts..** failing,
c1eb0 69 74 20 66 61 69 6c 73 20 63 6f 6e 73 69 73 74 it fails consist
c1ec0 65 6e 74 6c 79 20 75 6e 74 69 6c 20 6d 61 6c 6c ently until mall
c1ed0 6f 63 46 61 69 6c 65 64 20 69 73 20 72 65 73 65 ocFailed is rese
c1ee0 74 2e 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 t...** This is a
c1ef0 6e 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 73 75 n important assu
c1f00 6d 70 74 69 6f 6e 2e 20 20 54 68 65 72 65 20 61 mption. There a
c1f10 72 65 20 6d 61 6e 79 20 70 6c 61 63 65 73 20 69 re many places i
c1f20 6e 20 74 68 65 0d 0a 2a 2a 20 63 6f 64 65 20 74 n the..** code t
c1f30 68 61 74 20 64 6f 20 74 68 69 6e 67 73 20 6c 69 hat do things li
c1f40 6b 65 20 74 68 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a ke this:..**..**
c1f50 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 20 int *a
c1f60 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 = (int*)sqlite3D
c1f70 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 31 bMallocRaw(db, 1
c1f80 30 30 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 00);..**
c1f90 20 69 6e 74 20 2a 62 20 3d 20 28 69 6e 74 2a 29 int *b = (int*)
c1fa0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 sqlite3DbMallocR
c1fb0 61 77 28 64 62 2c 20 32 30 30 29 3b 0d 0a 2a 2a aw(db, 200);..**
c1fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 62 20 29 if( b )
c1fd0 20 61 5b 31 30 5d 20 3d 20 39 3b 0d 0a 2a 2a 0d a[10] = 9;..**.
c1fe0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 .** In other wor
c1ff0 64 73 2c 20 69 66 20 61 20 73 75 62 73 65 71 75 ds, if a subsequ
c2000 65 6e 74 20 6d 61 6c 6c 6f 63 20 28 65 78 3a 20 ent malloc (ex:
c2010 22 62 22 29 20 77 6f 72 6b 65 64 2c 20 69 74 20 "b") worked, it
c2020 69 73 20 61 73 73 75 6d 65 64 0d 0a 2a 2a 20 74 is assumed..** t
c2030 68 61 74 20 61 6c 6c 20 70 72 69 6f 72 20 6d 61 hat all prior ma
c2040 6c 6c 6f 63 73 20 28 65 78 3a 20 22 61 22 29 20 llocs (ex: "a")
c2050 77 6f 72 6b 65 64 20 74 6f 6f 2e 0d 0a 2a 2f 0d worked too...*/.
c2060 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
c2070 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 62 4d void *sqlite3DbM
c2080 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 allocRaw(sqlite3
c2090 20 2a 64 62 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 *db, int n){..
c20a0 20 76 6f 69 64 20 2a 70 3b 0d 0a 20 20 61 73 73 void *p;.. ass
c20b0 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 ert( db==0 || sq
c20c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
c20d0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a (db->mutex) );..
c20e0 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 assert( db==0
c20f0 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 || db->pnBytesFr
c2100 65 65 64 3d 3d 30 20 29 3b 0d 0a 23 69 66 6e 64 eed==0 );..#ifnd
c2110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c ef SQLITE_OMIT_L
c2120 4f 4f 4b 41 53 49 44 45 0d 0a 20 20 69 66 28 20 OOKASIDE.. if(
c2130 64 62 20 29 7b 0d 0a 20 20 20 20 4c 6f 6f 6b 61 db ){.. Looka
c2140 73 69 64 65 53 6c 6f 74 20 2a 70 42 75 66 3b 0d sideSlot *pBuf;.
c2150 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c . if( db->mal
c2160 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0d 0a 20 20 locFailed ){..
c2170 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 return 0;..
c2180 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 64 62 }.. if( db
c2190 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 ->lookaside.bEna
c21a0 62 6c 65 64 20 29 7b 0d 0a 20 20 20 20 20 20 69 bled ){.. i
c21b0 66 28 20 6e 3e 64 62 2d 3e 6c 6f 6f 6b 61 73 69 f( n>db->lookasi
c21c0 64 65 2e 73 7a 20 29 7b 0d 0a 20 20 20 20 20 20 de.sz ){..
c21d0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e db->lookaside.
c21e0 61 6e 53 74 61 74 5b 31 5d 2b 2b 3b 0d 0a 20 20 anStat[1]++;..
c21f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 }else if( (p
c2200 42 75 66 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 Buf = db->lookas
c2210 69 64 65 2e 70 46 72 65 65 29 3d 3d 30 20 29 7b ide.pFree)==0 ){
c2220 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f .. db->lo
c2230 6f 6b 61 73 69 64 65 2e 61 6e 53 74 61 74 5b 32 okaside.anStat[2
c2240 5d 2b 2b 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 ]++;.. }els
c2250 65 7b 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e e{.. db->
c2260 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 lookaside.pFree
c2270 3d 20 70 42 75 66 2d 3e 70 4e 65 78 74 3b 0d 0a = pBuf->pNext;..
c2280 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b db->look
c2290 61 73 69 64 65 2e 6e 4f 75 74 2b 2b 3b 0d 0a 20 aside.nOut++;..
c22a0 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 db->looka
c22b0 73 69 64 65 2e 61 6e 53 74 61 74 5b 30 5d 2b 2b side.anStat[0]++
c22c0 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 ;.. if( d
c22d0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 b->lookaside.nOu
c22e0 74 3e 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e t>db->lookaside.
c22f0 6d 78 4f 75 74 20 29 7b 0d 0a 20 20 20 20 20 20 mxOut ){..
c2300 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 db->lookasid
c2310 65 2e 6d 78 4f 75 74 20 3d 20 64 62 2d 3e 6c 6f e.mxOut = db->lo
c2320 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3b 0d 0a 20 okaside.nOut;..
c2330 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
c2340 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 return (void*)
c2350 70 42 75 66 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a pBuf;.. }..
c2360 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6c 73 }.. }..#els
c2370 65 0d 0a 20 20 69 66 28 20 64 62 20 26 26 20 64 e.. if( db && d
c2380 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
c2390 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){.. return 0
c23a0 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a ;.. }..#endif..
c23b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c p = sqlite3Mal
c23c0 6c 6f 63 28 6e 29 3b 0d 0a 20 20 69 66 28 20 21 loc(n);.. if( !
c23d0 70 20 26 26 20 64 62 20 29 7b 0d 0a 20 20 20 20 p && db ){..
c23e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
c23f0 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 = 1;.. }.. sq
c2400 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 lite3MemdebugSet
c2410 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f Type(p, MEMTYPE_
c2420 44 42 20 7c 0d 0a 20 20 20 20 20 20 20 20 20 28 DB |.. (
c2430 28 64 62 20 26 26 20 64 62 2d 3e 6c 6f 6f 6b 61 (db && db->looka
c2440 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 29 20 3f side.bEnabled) ?
c2450 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 49 MEMTYPE_LOOKASI
c2460 44 45 20 3a 20 4d 45 4d 54 59 50 45 5f 48 45 41 DE : MEMTYPE_HEA
c2470 50 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 P));.. return p
c2480 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
c2490 65 73 69 7a 65 20 74 68 65 20 62 6c 6f 63 6b 20 esize the block
c24a0 6f 66 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 of memory pointe
c24b0 64 20 74 6f 20 62 79 20 70 20 74 6f 20 6e 20 62 d to by p to n b
c24c0 79 74 65 73 2e 20 49 66 20 74 68 65 0d 0a 2a 2a ytes. If the..**
c24d0 20 72 65 73 69 7a 65 20 66 61 69 6c 73 2c 20 73 resize fails, s
c24e0 65 74 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 et the mallocFai
c24f0 6c 65 64 20 66 6c 61 67 20 69 6e 20 74 68 65 20 led flag in the
c2500 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 connection objec
c2510 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 t...*/..SQLITE_P
c2520 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c RIVATE void *sql
c2530 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 73 71 ite3DbRealloc(sq
c2540 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 lite3 *db, void
c2550 2a 70 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 76 *p, int n){.. v
c2560 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0d 0a oid *pNew = 0;..
c2570 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 assert( db!=0
c2580 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 );.. assert( sq
c2590 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
c25a0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a (db->mutex) );..
c25b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 if( db->malloc
c25c0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0d 0a 20 20 Failed==0 ){..
c25d0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 if( p==0 ){..
c25e0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 return sqli
c25f0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 te3DbMallocRaw(d
c2600 62 2c 20 6e 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 b, n);.. }..
c2610 20 20 20 69 66 28 20 69 73 4c 6f 6f 6b 61 73 69 if( isLookasi
c2620 64 65 28 64 62 2c 20 70 29 20 29 7b 0d 0a 20 20 de(db, p) ){..
c2630 20 20 20 20 69 66 28 20 6e 3c 3d 64 62 2d 3e 6c if( n<=db->l
c2640 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 29 7b 0d 0a ookaside.sz ){..
c2650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 return p
c2660 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
c2670 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 pNew = sqlite3
c2680 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 DbMallocRaw(db,
c2690 6e 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 n);.. if( p
c26a0 4e 65 77 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 New ){..
c26b0 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 memcpy(pNew, p,
c26c0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a db->lookaside.sz
c26d0 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 );.. sqli
c26e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 te3DbFree(db, p)
c26f0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
c2700 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 73 }else{.. as
c2710 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 65 6d sert( sqlite3Mem
c2720 64 65 62 75 67 48 61 73 54 79 70 65 28 70 2c 20 debugHasType(p,
c2730 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0d 0a MEMTYPE_DB) );..
c2740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 assert( sq
c2750 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 lite3MemdebugHas
c2760 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f Type(p, MEMTYPE_
c2770 4c 4f 4f 4b 41 53 49 44 45 7c 4d 45 4d 54 59 50 LOOKASIDE|MEMTYP
c2780 45 5f 48 45 41 50 29 20 29 3b 0d 0a 20 20 20 20 E_HEAP) );..
c2790 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 sqlite3Memdebu
c27a0 67 53 65 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 gSetType(p, MEMT
c27b0 59 50 45 5f 48 45 41 50 29 3b 0d 0a 20 20 20 20 YPE_HEAP);..
c27c0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 pNew = sqlite3
c27d0 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0d _realloc(p, n);.
c27e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 . if( !pNew
c27f0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c ){.. sql
c2800 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54 ite3MemdebugSetT
c2810 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 ype(p, MEMTYPE_D
c2820 42 7c 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 3b B|MEMTYPE_HEAP);
c2830 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 .. db->ma
c2840 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0d llocFailed = 1;.
c2850 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
c2860 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 sqlite3MemdebugS
c2870 65 74 54 79 70 65 28 70 4e 65 77 2c 20 4d 45 4d etType(pNew, MEM
c2880 54 59 50 45 5f 44 42 20 7c 20 0d 0a 20 20 20 20 TYPE_DB | ..
c2890 20 20 20 20 20 20 20 20 28 64 62 2d 3e 6c 6f 6f (db->loo
c28a0 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 kaside.bEnabled
c28b0 3f 20 4d 45 4d 54 59 50 45 5f 4c 4f 4f 4b 41 53 ? MEMTYPE_LOOKAS
c28c0 49 44 45 20 3a 20 4d 45 4d 54 59 50 45 5f 48 45 IDE : MEMTYPE_HE
c28d0 41 50 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 AP));.. }..
c28e0 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 }.. return pNew
c28f0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 ;..}..../*..** A
c2900 74 74 65 6d 70 74 20 74 6f 20 72 65 61 6c 6c 6f ttempt to reallo
c2910 63 61 74 65 20 70 2e 20 20 49 66 20 74 68 65 20 cate p. If the
c2920 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 reallocation fai
c2930 6c 73 2c 20 74 68 65 6e 20 66 72 65 65 20 70 0d ls, then free p.
c2940 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 68 65 20 .** and set the
c2950 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 mallocFailed fla
c2960 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 g in the databas
c2970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 2a e connection...*
c2980 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
c2990 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 44 E void *sqlite3D
c29a0 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 73 bReallocOrFree(s
c29b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 qlite3 *db, void
c29c0 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 *p, int n){..
c29d0 76 6f 69 64 20 2a 70 4e 65 77 3b 0d 0a 20 20 70 void *pNew;.. p
c29e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 New = sqlite3DbR
c29f0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 2c 20 6e 29 ealloc(db, p, n)
c2a00 3b 0d 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 ;.. if( !pNew )
c2a10 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 {.. sqlite3Db
c2a20 46 72 65 65 28 64 62 2c 20 70 29 3b 0d 0a 20 20 Free(db, p);..
c2a30 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 }.. return pNew
c2a40 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d ;..}..../*..** M
c2a50 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 ake a copy of a
c2a60 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 string in memory
c2a70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
c2a80 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 54 qliteMalloc(). T
c2a90 68 65 73 65 20 0d 0a 2a 2a 20 66 75 6e 63 74 69 hese ..** functi
c2aa0 6f 6e 73 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 ons call sqlite3
c2ab0 4d 61 6c 6c 6f 63 52 61 77 28 29 20 64 69 72 65 MallocRaw() dire
c2ac0 63 74 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 ctly instead of
c2ad0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 sqliteMalloc().
c2ae0 54 68 69 73 0d 0a 2a 2a 20 69 73 20 62 65 63 61 This..** is beca
c2af0 75 73 65 20 77 68 65 6e 20 6d 65 6d 6f 72 79 20 use when memory
c2b00 64 65 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 debugging is tur
c2b10 6e 65 64 20 6f 6e 2c 20 74 68 65 73 65 20 74 77 ned on, these tw
c2b20 6f 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 o functions are
c2b30 0d 0a 2a 2a 20 63 61 6c 6c 65 64 20 76 69 61 20 ..** called via
c2b40 6d 61 63 72 6f 73 20 74 68 61 74 20 72 65 63 6f macros that reco
c2b50 72 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 rd the current f
c2b60 69 6c 65 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d ile and line num
c2b70 62 65 72 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 54 ber in the..** T
c2b80 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74 hreadData struct
c2b90 75 72 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ure...*/..SQLITE
c2ba0 5f 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 73 _PRIVATE char *s
c2bb0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 73 qlite3DbStrDup(s
c2bc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 qlite3 *db, cons
c2bd0 74 20 63 68 61 72 20 2a 7a 29 7b 0d 0a 20 20 63 t char *z){.. c
c2be0 68 61 72 20 2a 7a 4e 65 77 3b 0d 0a 20 20 73 69 har *zNew;.. si
c2bf0 7a 65 5f 74 20 6e 3b 0d 0a 20 20 69 66 28 20 7a ze_t n;.. if( z
c2c00 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 ==0 ){.. retu
c2c10 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 6e 20 rn 0;.. }.. n
c2c20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
c2c30 30 28 7a 29 20 2b 20 31 3b 0d 0a 20 20 61 73 73 0(z) + 1;.. ass
c2c40 65 72 74 28 20 28 6e 26 30 78 37 66 66 66 66 66 ert( (n&0x7fffff
c2c50 66 66 29 3d 3d 6e 20 29 3b 0d 0a 20 20 7a 4e 65 ff)==n );.. zNe
c2c60 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c w = sqlite3DbMal
c2c70 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29 locRaw(db, (int)
c2c80 6e 29 3b 0d 0a 20 20 69 66 28 20 7a 4e 65 77 20 n);.. if( zNew
c2c90 29 7b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a ){.. memcpy(z
c2ca0 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0d 0a 20 20 7d New, z, n);.. }
c2cb0 0d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b .. return zNew;
c2cc0 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 ..}..SQLITE_PRIV
c2cd0 41 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 ATE char *sqlite
c2ce0 33 44 62 53 74 72 4e 44 75 70 28 73 71 6c 69 74 3DbStrNDup(sqlit
c2cf0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 e3 *db, const ch
c2d00 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0d 0a ar *z, int n){..
c2d10 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0d 0a 20 char *zNew;..
c2d20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0d 0a 20 20 if( z==0 ){..
c2d30 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d return 0;.. }
c2d40 0d 0a 20 20 61 73 73 65 72 74 28 20 28 6e 26 30 .. assert( (n&0
c2d50 78 37 66 66 66 66 66 66 66 29 3d 3d 6e 20 29 3b x7fffffff)==n );
c2d60 0d 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 .. zNew = sqlit
c2d70 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 e3DbMallocRaw(db
c2d80 2c 20 6e 2b 31 29 3b 0d 0a 20 20 69 66 28 20 7a , n+1);.. if( z
c2d90 4e 65 77 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 63 New ){.. memc
c2da0 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0d py(zNew, z, n);.
c2db0 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 . zNew[n] = 0
c2dc0 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
c2dd0 20 7a 4e 65 77 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d zNew;..}..../*.
c2de0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 73 74 72 .** Create a str
c2df0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 7a 46 72 ing from the zFr
c2e00 6f 6d 61 74 20 61 72 67 75 6d 65 6e 74 20 61 6e omat argument an
c2e10 64 20 74 68 65 20 76 61 5f 6c 69 73 74 20 74 68 d the va_list th
c2e20 61 74 20 66 6f 6c 6c 6f 77 73 2e 0d 0a 2a 2a 20 at follows...**
c2e30 53 74 6f 72 65 20 74 68 65 20 73 74 72 69 6e 67 Store the string
c2e40 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 in memory obtai
c2e50 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d ned from sqliteM
c2e60 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 alloc() and make
c2e70 20 2a 70 7a 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74 *pz..** point t
c2e80 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0d 0a o that string...
c2e90 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
c2ea0 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 TE void sqlite3S
c2eb0 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a etString(char **
c2ec0 70 7a 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c pz, sqlite3 *db,
c2ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
c2ee0 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 rmat, ...){.. v
c2ef0 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20 63 68 a_list ap;.. ch
c2f00 61 72 20 2a 7a 3b 0d 0a 0d 0a 20 20 76 61 5f 73 ar *z;.... va_s
c2f10 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
c2f20 29 3b 0d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 );.. z = sqlite
c2f30 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 3VMPrintf(db, zF
c2f40 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 ormat, ap);.. v
c2f50 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 20 20 73 71 a_end(ap);.. sq
c2f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
c2f70 2a 70 7a 29 3b 0d 0a 20 20 2a 70 7a 20 3d 20 7a *pz);.. *pz = z
c2f80 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ;..}....../*..**
c2f90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d This function m
c2fa0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 ust be called be
c2fb0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 61 6e 79 fore exiting any
c2fc0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 API function (i
c2fd0 2e 65 2e 20 0d 0a 2a 2a 20 72 65 74 75 72 6e 69 .e. ..** returni
c2fe0 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 ng control to th
c2ff0 65 20 75 73 65 72 29 20 74 68 61 74 20 68 61 73 e user) that has
c3000 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65 33 5f called sqlite3_
c3010 6d 61 6c 6c 6f 63 20 6f 72 0d 0a 2a 2a 20 73 71 malloc or..** sq
c3020 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 2e 0d 0a lite3_realloc...
c3030 2a 2a 0d 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 **..** The retur
c3040 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 72 ned value is nor
c3050 6d 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 mally a copy of
c3060 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
c3070 65 6e 74 20 74 6f 20 74 68 69 73 0d 0a 2a 2a 20 ent to this..**
c3080 66 75 6e 63 74 69 6f 6e 2e 20 48 6f 77 65 76 65 function. Howeve
c3090 72 2c 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 r, if a malloc()
c30a0 20 66 61 69 6c 75 72 65 20 68 61 73 20 6f 63 63 failure has occ
c30b0 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 urred since the
c30c0 70 72 65 76 69 6f 75 73 0d 0a 2a 2a 20 69 6e 76 previous..** inv
c30d0 6f 63 61 74 69 6f 6e 20 53 51 4c 49 54 45 5f 4e ocation SQLITE_N
c30e0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 OMEM is returned
c30f0 20 69 6e 73 74 65 61 64 2e 20 0d 0a 2a 2a 0d 0a instead. ..**..
c3100 2a 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 ** If the first
c3110 61 72 67 75 6d 65 6e 74 2c 20 64 62 2c 20 69 73 argument, db, is
c3120 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 61 20 not NULL and a
c3130 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 68 malloc() error h
c3140 61 73 20 6f 63 63 75 72 72 65 64 2c 0d 0a 2a 2a as occurred,..**
c3150 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65 63 then the connec
c3160 74 69 6f 6e 20 65 72 72 6f 72 2d 63 6f 64 65 20 tion error-code
c3170 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 (the value retur
c3180 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65 ned by sqlite3_e
c3190 72 72 63 6f 64 65 28 29 29 0d 0a 2a 2a 20 69 73 rrcode())..** is
c31a0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e set to SQLITE_N
c31b0 4f 4d 45 4d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 OMEM...*/..SQLIT
c31c0 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
c31d0 6c 69 74 65 33 41 70 69 45 78 69 74 28 73 71 6c lite3ApiExit(sql
c31e0 69 74 65 33 2a 20 64 62 2c 20 69 6e 74 20 72 63 ite3* db, int rc
c31f0 29 7b 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 ){.. /* If the
c3200 64 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 db handle is not
c3210 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6d NULL, then we m
c3220 75 73 74 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e ust hold the con
c3230 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 0d 0a nection handle..
c3240 20 20 2a 2a 20 6d 75 74 65 78 20 68 65 72 65 2e ** mutex here.
c3250 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 72 Otherwise the r
c3260 65 61 64 20 28 61 6e 64 20 70 6f 73 73 69 62 6c ead (and possibl
c3270 65 20 77 72 69 74 65 29 20 6f 66 20 64 62 2d 3e e write) of db->
c3280 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0d 0a 20 mallocFailed ..
c3290 20 2a 2a 20 69 73 20 75 6e 73 61 66 65 2c 20 61 ** is unsafe, a
c32a0 73 20 69 73 20 74 68 65 20 63 61 6c 6c 20 74 6f s is the call to
c32b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 29 2e sqlite3Error().
c32c0 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 .. */.. assert
c32d0 28 20 21 64 62 20 7c 7c 20 73 71 6c 69 74 65 33 ( !db || sqlite3
c32e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e _mutex_held(db->
c32f0 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 69 66 28 mutex) );.. if(
c3300 20 64 62 20 26 26 20 28 64 62 2d 3e 6d 61 6c 6c db && (db->mall
c3310 6f 63 46 61 69 6c 65 64 20 7c 7c 20 72 63 3d 3d ocFailed || rc==
c3320 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
c3330 45 4d 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 EM) ){.. sqli
c3340 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c te3Error(db, SQL
c3350 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29 3b 0d 0a ITE_NOMEM, 0);..
c3360 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 db->mallocFa
c3370 69 6c 65 64 20 3d 20 30 3b 0d 0a 20 20 20 20 72 iled = 0;.. r
c3380 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
c3390 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
c33a0 20 72 63 20 26 20 28 64 62 20 3f 20 64 62 2d 3e rc & (db ? db->
c33b0 65 72 72 4d 61 73 6b 20 3a 20 30 78 66 66 29 3b errMask : 0xff);
c33c0 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ..}..../********
c33d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6d 61 ****** End of ma
c33e0 6c 6c 6f 63 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a lloc.c *********
c33f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3410 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a *****/../*******
c3420 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 ******* Begin fi
c3430 6c 65 20 70 72 69 6e 74 66 2e 63 20 2a 2a 2a 2a le printf.c ****
c3440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3460 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 ******/../*..**
c3470 54 68 65 20 22 70 72 69 6e 74 66 22 20 63 6f 64 The "printf" cod
c3480 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 e that follows d
c3490 61 74 65 73 20 66 72 6f 6d 20 74 68 65 20 31 39 ates from the 19
c34a0 38 30 27 73 2e 20 20 49 74 20 69 73 20 69 6e 0d 80's. It is in.
c34b0 0a 2a 2a 20 74 68 65 20 70 75 62 6c 69 63 20 64 .** the public d
c34c0 6f 6d 61 69 6e 2e 20 20 54 68 65 20 6f 72 69 67 omain. The orig
c34d0 69 6e 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 61 72 inal comments ar
c34e0 65 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20 e included here
c34f0 66 6f 72 0d 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 for..** complete
c3500 6e 65 73 73 2e 20 20 54 68 65 79 20 61 72 65 20 ness. They are
c3510 76 65 72 79 20 6f 75 74 2d 6f 66 2d 64 61 74 65 very out-of-date
c3520 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 75 73 but might be us
c3530 65 66 75 6c 20 61 73 0d 0a 2a 2a 20 61 6e 20 68 eful as..** an h
c3540 69 73 74 6f 72 69 63 61 6c 20 72 65 66 65 72 65 istorical refere
c3550 6e 63 65 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 nce. Most of th
c3560 65 20 22 65 6e 68 61 6e 63 65 6d 65 6e 74 73 22 e "enhancements"
c3570 20 68 61 76 65 20 62 65 65 6e 20 62 61 63 6b 65 have been backe
c3580 64 0d 0a 2a 2a 20 6f 75 74 20 73 6f 20 74 68 61 d..** out so tha
c3590 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c t the functional
c35a0 69 74 79 20 69 73 20 6e 6f 77 20 74 68 65 20 73 ity is now the s
c35b0 61 6d 65 20 61 73 20 73 74 61 6e 64 61 72 64 20 ame as standard
c35c0 70 72 69 6e 74 66 28 29 2e 0d 0a 2a 2a 0d 0a 2a printf()...**..*
c35d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c35e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c35f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
c3610 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a *********..**..*
c3620 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
c3630 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 61 20 ains code for a
c3640 73 65 74 20 6f 66 20 22 70 72 69 6e 74 66 22 2d set of "printf"-
c3650 6c 69 6b 65 20 72 6f 75 74 69 6e 65 73 2e 20 20 like routines.
c3660 54 68 65 73 65 0d 0a 2a 2a 20 72 6f 75 74 69 6e These..** routin
c3670 65 73 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 es format string
c3680 73 20 6d 75 63 68 20 6c 69 6b 65 20 74 68 65 20 s much like the
c3690 70 72 69 6e 74 66 28 29 20 66 72 6f 6d 20 74 68 printf() from th
c36a0 65 20 73 74 61 6e 64 61 72 64 20 43 0d 0a 2a 2a e standard C..**
c36b0 20 6c 69 62 72 61 72 79 2c 20 74 68 6f 75 67 68 library, though
c36c0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 the implementat
c36d0 69 6f 6e 20 68 65 72 65 20 68 61 73 20 65 6e 68 ion here has enh
c36e0 61 6e 63 65 6d 65 6e 74 73 20 74 6f 20 73 75 70 ancements to sup
c36f0 70 6f 72 74 0d 0a 2a 2a 20 53 51 4c 6c 69 74 65 port..** SQLlite
c3700 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ...*/..../*..**
c3710 43 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 73 Conversion types
c3720 20 66 61 6c 6c 20 69 6e 74 6f 20 76 61 72 69 6f fall into vario
c3730 75 73 20 63 61 74 65 67 6f 72 69 65 73 20 61 73 us categories as
c3740 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 0d defined by the.
c3750 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 6e .** following en
c3760 75 6d 65 72 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a umeration...*/..
c3770 23 64 65 66 69 6e 65 20 65 74 52 41 44 49 58 20 #define etRADIX
c3780 20 20 20 20 20 20 31 20 2f 2a 20 49 6e 74 65 67 1 /* Integ
c3790 65 72 20 74 79 70 65 73 2e 20 20 25 64 2c 20 25 er types. %d, %
c37a0 78 2c 20 25 6f 2c 20 61 6e 64 20 73 6f 20 66 6f x, %o, and so fo
c37b0 72 74 68 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 rth */..#define
c37c0 65 74 46 4c 4f 41 54 20 20 20 20 20 20 20 32 20 etFLOAT 2
c37d0 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e /* Floating poin
c37e0 74 2e 20 20 25 66 20 2a 2f 0d 0a 23 64 65 66 69 t. %f */..#defi
c37f0 6e 65 20 65 74 45 58 50 20 20 20 20 20 20 20 20 ne etEXP
c3800 20 33 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 69 6f 3 /* Exponentio
c3810 6e 61 6c 20 6e 6f 74 61 74 69 6f 6e 2e 20 25 65 nal notation. %e
c3820 20 61 6e 64 20 25 45 20 2a 2f 0d 0a 23 64 65 66 and %E */..#def
c3830 69 6e 65 20 65 74 47 45 4e 45 52 49 43 20 20 20 ine etGENERIC
c3840 20 20 34 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 4 /* Floating
c3850 6f 72 20 65 78 70 6f 6e 65 6e 74 69 61 6c 2c 20 or exponential,
c3860 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 65 78 70 depending on exp
c3870 6f 6e 65 6e 74 2e 20 25 67 20 2a 2f 0d 0a 23 64 onent. %g */..#d
c3880 65 66 69 6e 65 20 65 74 53 49 5a 45 20 20 20 20 efine etSIZE
c3890 20 20 20 20 35 20 2f 2a 20 52 65 74 75 72 6e 20 5 /* Return
c38a0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 number of charac
c38b0 74 65 72 73 20 70 72 6f 63 65 73 73 65 64 20 73 ters processed s
c38c0 6f 20 66 61 72 2e 20 25 6e 20 2a 2f 0d 0a 23 64 o far. %n */..#d
c38d0 65 66 69 6e 65 20 65 74 53 54 52 49 4e 47 20 20 efine etSTRING
c38e0 20 20 20 20 36 20 2f 2a 20 53 74 72 69 6e 67 73 6 /* Strings
c38f0 2e 20 25 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 . %s */..#define
c3900 20 65 74 44 59 4e 53 54 52 49 4e 47 20 20 20 37 etDYNSTRING 7
c3910 20 2f 2a 20 44 79 6e 61 6d 69 63 61 6c 6c 79 20 /* Dynamically
c3920 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 allocated string
c3930 73 2e 20 25 7a 20 2a 2f 0d 0a 23 64 65 66 69 6e s. %z */..#defin
c3940 65 20 65 74 50 45 52 43 45 4e 54 20 20 20 20 20 e etPERCENT
c3950 38 20 2f 2a 20 50 65 72 63 65 6e 74 20 73 79 6d 8 /* Percent sym
c3960 62 6f 6c 2e 20 25 25 20 2a 2f 0d 0a 23 64 65 66 bol. %% */..#def
c3970 69 6e 65 20 65 74 43 48 41 52 58 20 20 20 20 20 ine etCHARX
c3980 20 20 39 20 2f 2a 20 43 68 61 72 61 63 74 65 72 9 /* Character
c3990 73 2e 20 25 63 20 2a 2f 0d 0a 2f 2a 20 54 68 65 s. %c */../* The
c39a0 20 72 65 73 74 20 61 72 65 20 65 78 74 65 6e 73 rest are extens
c39b0 69 6f 6e 73 2c 20 6e 6f 74 20 6e 6f 72 6d 61 6c ions, not normal
c39c0 6c 79 20 66 6f 75 6e 64 20 69 6e 20 70 72 69 6e ly found in prin
c39d0 74 66 28 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 tf() */..#define
c39e0 20 65 74 53 51 4c 45 53 43 41 50 45 20 20 31 30 etSQLESCAPE 10
c39f0 20 2f 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 /* Strings with
c3a00 20 27 5c 27 27 20 64 6f 75 62 6c 65 64 2e 20 20 '\'' doubled.
c3a10 25 71 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 65 %q */..#define e
c3a20 74 53 51 4c 45 53 43 41 50 45 32 20 31 31 20 2f tSQLESCAPE2 11 /
c3a30 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 20 27 * Strings with '
c3a40 5c 27 27 20 64 6f 75 62 6c 65 64 20 61 6e 64 20 \'' doubled and
c3a50 65 6e 63 6c 6f 73 65 64 20 69 6e 20 27 27 2c 0d enclosed in '',.
c3a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
c3a70 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 20 NULL
c3a80 70 6f 69 6e 74 65 72 73 20 72 65 70 6c 61 63 65 pointers replace
c3a90 64 20 62 79 20 53 51 4c 20 4e 55 4c 4c 2e 20 20 d by SQL NULL.
c3aa0 25 51 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 65 %Q */..#define e
c3ab0 74 54 4f 4b 45 4e 20 20 20 20 20 20 31 32 20 2f tTOKEN 12 /
c3ac0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 * a pointer to a
c3ad0 20 54 6f 6b 65 6e 20 73 74 72 75 63 74 75 72 65 Token structure
c3ae0 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 65 74 53 */..#define etS
c3af0 52 43 4c 49 53 54 20 20 20 20 31 33 20 2f 2a 20 RCLIST 13 /*
c3b00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 53 a pointer to a S
c3b10 72 63 4c 69 73 74 20 2a 2f 0d 0a 23 64 65 66 69 rcList */..#defi
c3b20 6e 65 20 65 74 50 4f 49 4e 54 45 52 20 20 20 20 ne etPOINTER
c3b30 31 34 20 2f 2a 20 54 68 65 20 25 70 20 63 6f 6e 14 /* The %p con
c3b40 76 65 72 73 69 6f 6e 20 2a 2f 0d 0a 23 64 65 66 version */..#def
c3b50 69 6e 65 20 65 74 53 51 4c 45 53 43 41 50 45 33 ine etSQLESCAPE3
c3b60 20 31 35 20 2f 2a 20 25 77 20 2d 3e 20 53 74 72 15 /* %w -> Str
c3b70 69 6e 67 73 20 77 69 74 68 20 27 5c 22 27 20 64 ings with '\"' d
c3b80 6f 75 62 6c 65 64 20 2a 2f 0d 0a 23 64 65 66 69 oubled */..#defi
c3b90 6e 65 20 65 74 4f 52 44 49 4e 41 4c 20 20 20 20 ne etORDINAL
c3ba0 31 36 20 2f 2a 20 25 72 20 2d 3e 20 31 73 74 2c 16 /* %r -> 1st,
c3bb0 20 32 6e 64 2c 20 33 72 64 2c 20 34 74 68 2c 20 2nd, 3rd, 4th,
c3bc0 65 74 63 2e 20 20 45 6e 67 6c 69 73 68 20 6f 6e etc. English on
c3bd0 6c 79 20 2a 2f 0d 0a 0d 0a 23 64 65 66 69 6e 65 ly */....#define
c3be0 20 65 74 49 4e 56 41 4c 49 44 20 20 20 20 20 30 etINVALID 0
c3bf0 20 2f 2a 20 41 6e 79 20 75 6e 72 65 63 6f 67 6e /* Any unrecogn
c3c00 69 7a 65 64 20 63 6f 6e 76 65 72 73 69 6f 6e 20 ized conversion
c3c10 74 79 70 65 20 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 0d type */....../*.
c3c20 0a 2a 2a 20 41 6e 20 22 65 74 42 79 74 65 22 20 .** An "etByte"
c3c30 69 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 is an 8-bit unsi
c3c40 67 6e 65 64 20 76 61 6c 75 65 2e 0d 0a 2a 2f 0d gned value...*/.
c3c50 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 .typedef unsigne
c3c60 64 20 63 68 61 72 20 65 74 42 79 74 65 3b 0d 0a d char etByte;..
c3c70 0d 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 62 75 ../*..** Each bu
c3c80 69 6c 74 69 6e 20 63 6f 6e 76 65 72 73 69 6f 6e iltin conversion
c3c90 20 63 68 61 72 61 63 74 65 72 20 28 65 78 3a 20 character (ex:
c3ca0 74 68 65 20 27 64 27 20 69 6e 20 22 25 64 22 29 the 'd' in "%d")
c3cb0 20 69 73 20 64 65 73 63 72 69 62 65 64 0d 0a 2a is described..*
c3cc0 2a 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 * by an instance
c3cd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
c3ce0 67 20 73 74 72 75 63 74 75 72 65 0d 0a 2a 2f 0d g structure..*/.
c3cf0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
c3d00 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f 2a 20 49 et_info { /* I
c3d10 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 nformation about
c3d20 20 65 61 63 68 20 66 6f 72 6d 61 74 20 66 69 65 each format fie
c3d30 6c 64 20 2a 2f 0d 0a 20 20 63 68 61 72 20 66 6d ld */.. char fm
c3d40 74 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 ttype;
c3d50 20 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 /* The format
c3d60 66 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 74 65 field code lette
c3d70 72 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 62 r */.. etByte b
c3d80 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ase;
c3d90 20 2f 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 /* The base for
c3da0 20 72 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f radix conversio
c3db0 6e 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 66 n */.. etByte f
c3dc0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 lags;
c3dd0 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 /* One or more
c3de0 6f 66 20 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e of FLAG_ constan
c3df0 74 73 20 62 65 6c 6f 77 20 2a 2f 0d 0a 20 20 65 ts below */.. e
c3e00 74 42 79 74 65 20 74 79 70 65 3b 20 20 20 20 20 tByte type;
c3e10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 /* Conve
c3e20 72 73 69 6f 6e 20 70 61 72 61 64 69 67 6d 20 2a rsion paradigm *
c3e30 2f 0d 0a 20 20 65 74 42 79 74 65 20 63 68 61 72 /.. etByte char
c3e40 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a set; /*
c3e50 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 44 69 Offset into aDi
c3e60 67 69 74 73 5b 5d 20 6f 66 20 74 68 65 20 64 69 gits[] of the di
c3e70 67 69 74 73 20 73 74 72 69 6e 67 20 2a 2f 0d 0a gits string */..
c3e80 20 20 65 74 42 79 74 65 20 70 72 65 66 69 78 3b etByte prefix;
c3e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 /* Of
c3ea0 66 73 65 74 20 69 6e 74 6f 20 61 50 72 65 66 69 fset into aPrefi
c3eb0 78 5b 5d 20 6f 66 20 74 68 65 20 70 72 65 66 69 x[] of the prefi
c3ec0 78 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 7d 20 65 x string */..} e
c3ed0 74 5f 69 6e 66 6f 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a t_info;..../*..*
c3ee0 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 * Allowed values
c3ef0 20 66 6f 72 20 65 74 5f 69 6e 66 6f 2e 66 6c 61 for et_info.fla
c3f00 67 73 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 gs..*/..#define
c3f10 46 4c 41 47 5f 53 49 47 4e 45 44 20 20 31 20 20 FLAG_SIGNED 1
c3f20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 /* True if th
c3f30 65 20 76 61 6c 75 65 20 74 6f 20 63 6f 6e 76 65 e value to conve
c3f40 72 74 20 69 73 20 73 69 67 6e 65 64 20 2a 2f 0d rt is signed */.
c3f50 0a 23 64 65 66 69 6e 65 20 46 4c 41 47 5f 49 4e .#define FLAG_IN
c3f60 54 45 52 4e 20 20 32 20 20 20 20 20 2f 2a 20 54 TERN 2 /* T
c3f70 72 75 65 20 69 66 20 66 6f 72 20 69 6e 74 65 72 rue if for inter
c3f80 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0d nal use only */.
c3f90 0a 23 64 65 66 69 6e 65 20 46 4c 41 47 5f 53 54 .#define FLAG_ST
c3fa0 52 49 4e 47 20 20 34 20 20 20 20 20 2f 2a 20 41 RING 4 /* A
c3fb0 6c 6c 6f 77 20 69 6e 66 69 6e 69 74 79 20 70 72 llow infinity pr
c3fc0 65 63 69 73 69 6f 6e 20 2a 2f 0d 0a 0d 0a 0d 0a ecision */......
c3fd0 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f /*..** The follo
c3fe0 77 69 6e 67 20 74 61 62 6c 65 20 69 73 20 73 65 wing table is se
c3ff0 61 72 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 2c arched linearly,
c4000 20 73 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 74 so it is good t
c4010 6f 20 70 75 74 20 74 68 65 0d 0a 2a 2a 20 6d 6f o put the..** mo
c4020 73 74 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 st frequently us
c4030 65 64 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 ed conversion ty
c4040 70 65 73 20 66 69 72 73 74 2e 0d 0a 2a 2f 0d 0a pes first...*/..
c4050 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
c4060 72 20 61 44 69 67 69 74 73 5b 5d 20 3d 20 22 30 r aDigits[] = "0
c4070 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 30 123456789ABCDEF0
c4080 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 123456789abcdef"
c4090 3b 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 ;..static const
c40a0 63 68 61 72 20 61 50 72 65 66 69 78 5b 5d 20 3d char aPrefix[] =
c40b0 20 22 2d 78 30 5c 30 30 30 58 30 22 3b 0d 0a 73 "-x0\000X0";..s
c40c0 74 61 74 69 63 20 63 6f 6e 73 74 20 65 74 5f 69 tatic const et_i
c40d0 6e 66 6f 20 66 6d 74 69 6e 66 6f 5b 5d 20 3d 20 nfo fmtinfo[] =
c40e0 7b 0d 0a 20 20 7b 20 20 27 64 27 2c 20 31 30 2c {.. { 'd', 10,
c40f0 20 31 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20 1, etRADIX,
c4100 20 20 30 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 0, 0 },.. {
c4110 20 27 73 27 2c 20 20 30 2c 20 34 2c 20 65 74 53 's', 0, 4, etS
c4120 54 52 49 4e 47 2c 20 20 20 20 20 30 2c 20 20 30 TRING, 0, 0
c4130 20 7d 2c 0d 0a 20 20 7b 20 20 27 67 27 2c 20 20 },.. { 'g',
c4140 30 2c 20 31 2c 20 65 74 47 45 4e 45 52 49 43 2c 0, 1, etGENERIC,
c4150 20 20 20 20 33 30 2c 20 30 20 7d 2c 0d 0a 20 20 30, 0 },..
c4160 7b 20 20 27 7a 27 2c 20 20 30 2c 20 34 2c 20 65 { 'z', 0, 4, e
c4170 74 44 59 4e 53 54 52 49 4e 47 2c 20 20 30 2c 20 tDYNSTRING, 0,
c4180 20 30 20 7d 2c 0d 0a 20 20 7b 20 20 27 71 27 2c 0 },.. { 'q',
c4190 20 20 30 2c 20 34 2c 20 65 74 53 51 4c 45 53 43 0, 4, etSQLESC
c41a0 41 50 45 2c 20 20 30 2c 20 20 30 20 7d 2c 0d 0a APE, 0, 0 },..
c41b0 20 20 7b 20 20 27 51 27 2c 20 20 30 2c 20 34 2c { 'Q', 0, 4,
c41c0 20 65 74 53 51 4c 45 53 43 41 50 45 32 2c 20 30 etSQLESCAPE2, 0
c41d0 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 20 27 77 , 0 },.. { 'w
c41e0 27 2c 20 20 30 2c 20 34 2c 20 65 74 53 51 4c 45 ', 0, 4, etSQLE
c41f0 53 43 41 50 45 33 2c 20 30 2c 20 20 30 20 7d 2c SCAPE3, 0, 0 },
c4200 0d 0a 20 20 7b 20 20 27 63 27 2c 20 20 30 2c 20 .. { 'c', 0,
c4210 30 2c 20 65 74 43 48 41 52 58 2c 20 20 20 20 20 0, etCHARX,
c4220 20 30 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 20 0, 0 },.. {
c4230 27 6f 27 2c 20 20 38 2c 20 30 2c 20 65 74 52 41 'o', 8, 0, etRA
c4240 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 32 20 DIX, 0, 2
c4250 7d 2c 0d 0a 20 20 7b 20 20 27 75 27 2c 20 31 30 },.. { 'u', 10
c4260 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 , 0, etRADIX,
c4270 20 20 20 30 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 0, 0 },.. {
c4280 20 20 27 78 27 2c 20 31 36 2c 20 30 2c 20 65 74 'x', 16, 0, et
c4290 52 41 44 49 58 2c 20 20 20 20 20 20 31 36 2c 20 RADIX, 16,
c42a0 31 20 7d 2c 0d 0a 20 20 7b 20 20 27 58 27 2c 20 1 },.. { 'X',
c42b0 31 36 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 16, 0, etRADIX,
c42c0 20 20 20 20 20 30 2c 20 20 34 20 7d 2c 0d 0a 23 0, 4 },..#
c42d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
c42e0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e IT_FLOATING_POIN
c42f0 54 0d 0a 20 20 7b 20 20 27 66 27 2c 20 20 30 2c T.. { 'f', 0,
c4300 20 31 2c 20 65 74 46 4c 4f 41 54 2c 20 20 20 20 1, etFLOAT,
c4310 20 20 30 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 0, 0 },.. {
c4320 20 27 65 27 2c 20 20 30 2c 20 31 2c 20 65 74 45 'e', 0, 1, etE
c4330 58 50 2c 20 20 20 20 20 20 20 20 33 30 2c 20 30 XP, 30, 0
c4340 20 7d 2c 0d 0a 20 20 7b 20 20 27 45 27 2c 20 20 },.. { 'E',
c4350 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20 20 20 0, 1, etEXP,
c4360 20 20 20 20 31 34 2c 20 30 20 7d 2c 0d 0a 20 20 14, 0 },..
c4370 7b 20 20 27 47 27 2c 20 20 30 2c 20 31 2c 20 65 { 'G', 0, 1, e
c4380 74 47 45 4e 45 52 49 43 2c 20 20 20 20 31 34 2c tGENERIC, 14,
c4390 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 20 0 },..#endif..
c43a0 20 7b 20 20 27 69 27 2c 20 31 30 2c 20 31 2c 20 { 'i', 10, 1,
c43b0 65 74 52 41 44 49 58 2c 20 20 20 20 20 20 30 2c etRADIX, 0,
c43c0 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 20 27 6e 27 0 },.. { 'n'
c43d0 2c 20 20 30 2c 20 30 2c 20 65 74 53 49 5a 45 2c , 0, 0, etSIZE,
c43e0 20 20 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0d 0, 0 },.
c43f0 0a 20 20 7b 20 20 27 25 27 2c 20 20 30 2c 20 30 . { '%', 0, 0
c4400 2c 20 65 74 50 45 52 43 45 4e 54 2c 20 20 20 20 , etPERCENT,
c4410 30 2c 20 20 30 20 7d 2c 0d 0a 20 20 7b 20 20 27 0, 0 },.. { '
c4420 70 27 2c 20 31 36 2c 20 30 2c 20 65 74 50 4f 49 p', 16, 0, etPOI
c4430 4e 54 45 52 2c 20 20 20 20 30 2c 20 20 31 20 7d NTER, 0, 1 }
c4440 2c 0d 0a 0d 0a 2f 2a 20 41 6c 6c 20 74 68 65 20 ,..../* All the
c4450 72 65 73 74 20 68 61 76 65 20 74 68 65 20 46 4c rest have the FL
c4460 41 47 5f 49 4e 54 45 52 4e 20 62 69 74 20 73 65 AG_INTERN bit se
c4470 74 20 61 6e 64 20 61 72 65 20 74 68 75 73 20 66 t and are thus f
c4480 6f 72 20 69 6e 74 65 72 6e 61 6c 0d 0a 2a 2a 20 or internal..**
c4490 75 73 65 20 6f 6e 6c 79 20 2a 2f 0d 0a 20 20 7b use only */.. {
c44a0 20 20 27 54 27 2c 20 20 30 2c 20 32 2c 20 65 74 'T', 0, 2, et
c44b0 54 4f 4b 45 4e 2c 20 20 20 20 20 20 30 2c 20 20 TOKEN, 0,
c44c0 30 20 7d 2c 0d 0a 20 20 7b 20 20 27 53 27 2c 20 0 },.. { 'S',
c44d0 20 30 2c 20 32 2c 20 65 74 53 52 43 4c 49 53 54 0, 2, etSRCLIST
c44e0 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0d 0a 20 , 0, 0 },..
c44f0 20 7b 20 20 27 72 27 2c 20 31 30 2c 20 33 2c 20 { 'r', 10, 3,
c4500 65 74 4f 52 44 49 4e 41 4c 2c 20 20 20 20 30 2c etORDINAL, 0,
c4510 20 20 30 20 7d 2c 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0 },..};..../*
c4520 0d 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f ..** If SQLITE_O
c4530 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 MIT_FLOATING_POI
c4540 4e 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 NT is defined, t
c4550 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 hen none of the
c4560 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0d 0a floating point..
c4570 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 ** conversions w
c4580 69 6c 6c 20 77 6f 72 6b 2e 0d 0a 2a 2f 0d 0a 23 ill work...*/..#
c4590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
c45a0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e IT_FLOATING_POIN
c45b0 54 0d 0a 2f 2a 0d 0a 2a 2a 20 22 2a 76 61 6c 22 T../*..** "*val"
c45c0 20 69 73 20 61 20 64 6f 75 62 6c 65 20 73 75 63 is a double suc
c45d0 68 20 74 68 61 74 20 30 2e 31 20 3c 3d 20 2a 76 h that 0.1 <= *v
c45e0 61 6c 20 3c 20 31 30 2e 30 0d 0a 2a 2a 20 52 65 al < 10.0..** Re
c45f0 74 75 72 6e 20 74 68 65 20 61 73 63 69 69 20 63 turn the ascii c
c4600 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 61 64 ode for the lead
c4610 69 6e 67 20 64 69 67 69 74 20 6f 66 20 2a 76 61 ing digit of *va
c4620 6c 2c 20 74 68 65 6e 0d 0a 2a 2a 20 6d 75 6c 74 l, then..** mult
c4630 69 70 6c 79 20 22 2a 76 61 6c 22 20 62 79 20 31 iply "*val" by 1
c4640 30 2e 30 20 74 6f 20 72 65 6e 6f 72 6d 61 6c 69 0.0 to renormali
c4650 7a 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 61 6d ze...**..** Exam
c4660 70 6c 65 3a 0d 0a 2a 2a 20 20 20 20 20 69 6e 70 ple:..** inp
c4670 75 74 3a 20 20 20 20 20 2a 76 61 6c 20 3d 20 33 ut: *val = 3
c4680 2e 31 34 31 35 39 0d 0a 2a 2a 20 20 20 20 20 6f .14159..** o
c4690 75 74 70 75 74 3a 20 20 20 20 2a 76 61 6c 20 3d utput: *val =
c46a0 20 31 2e 34 31 35 39 20 20 20 20 66 75 6e 63 74 1.4159 funct
c46b0 69 6f 6e 20 72 65 74 75 72 6e 20 3d 20 27 33 27 ion return = '3'
c46c0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 6f 75 ..**..** The cou
c46d0 6e 74 65 72 20 2a 63 6e 74 20 69 73 20 69 6e 63 nter *cnt is inc
c46e0 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20 74 69 remented each ti
c46f0 6d 65 2e 20 20 41 66 74 65 72 20 63 6f 75 6e 74 me. After count
c4700 65 72 20 65 78 63 65 65 64 73 0d 0a 2a 2a 20 31 er exceeds..** 1
c4710 36 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 6 (the number of
c4720 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67 significant dig
c4730 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69 74 20 its in a 64-bit
c4740 66 6c 6f 61 74 29 20 27 30 27 20 69 73 0d 0a 2a float) '0' is..*
c4750 2a 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 * always returne
c4760 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 d...*/..static c
c4770 68 61 72 20 65 74 5f 67 65 74 64 69 67 69 74 28 har et_getdigit(
c4780 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 LONGDOUBLE_TYPE
c4790 2a 76 61 6c 2c 20 69 6e 74 20 2a 63 6e 74 29 7b *val, int *cnt){
c47a0 0d 0a 20 20 69 6e 74 20 64 69 67 69 74 3b 0d 0a .. int digit;..
c47b0 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 LONGDOUBLE_TYP
c47c0 45 20 64 3b 0d 0a 20 20 69 66 28 20 28 2a 63 6e E d;.. if( (*cn
c47d0 74 29 2b 2b 20 3e 3d 20 31 36 20 29 20 72 65 74 t)++ >= 16 ) ret
c47e0 75 72 6e 20 27 30 27 3b 0d 0a 20 20 64 69 67 69 urn '0';.. digi
c47f0 74 20 3d 20 28 69 6e 74 29 2a 76 61 6c 3b 0d 0a t = (int)*val;..
c4800 20 20 64 20 3d 20 64 69 67 69 74 3b 0d 0a 20 20 d = digit;..
c4810 64 69 67 69 74 20 2b 3d 20 27 30 27 3b 0d 0a 20 digit += '0';..
c4820 20 2a 76 61 6c 20 3d 20 28 2a 76 61 6c 20 2d 20 *val = (*val -
c4830 64 29 2a 31 30 2e 30 3b 0d 0a 20 20 72 65 74 75 d)*10.0;.. retu
c4840 72 6e 20 28 63 68 61 72 29 64 69 67 69 74 3b 0d rn (char)digit;.
c4850 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 .}..#endif /* SQ
c4860 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 LITE_OMIT_FLOATI
c4870 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0d 0a 0d 0a 2f NG_POINT */..../
c4880 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 4e 20 73 *..** Append N s
c4890 70 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20 pace characters
c48a0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 to the given str
c48b0 69 6e 67 20 62 75 66 66 65 72 2e 0d 0a 2a 2f 0d ing buffer...*/.
c48c0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
c48d0 76 6f 69 64 20 73 71 6c 69 74 65 33 41 70 70 65 void sqlite3Appe
c48e0 6e 64 53 70 61 63 65 28 53 74 72 41 63 63 75 6d ndSpace(StrAccum
c48f0 20 2a 70 41 63 63 75 6d 2c 20 69 6e 74 20 4e 29 *pAccum, int N)
c4900 7b 0d 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 {.. static cons
c4910 74 20 63 68 61 72 20 7a 53 70 61 63 65 73 5b 5d t char zSpaces[]
c4920 20 3d 20 22 20 20 20 20 20 20 20 20 20 20 20 20 = "
c4930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c4940 20 22 3b 0d 0a 20 20 77 68 69 6c 65 28 20 4e 3e ";.. while( N>
c4950 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 70 =(int)sizeof(zSp
c4960 61 63 65 73 29 2d 31 20 29 7b 0d 0a 20 20 20 20 aces)-1 ){..
c4970 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 sqlite3StrAccumA
c4980 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53 ppend(pAccum, zS
c4990 70 61 63 65 73 2c 20 73 69 7a 65 6f 66 28 7a 53 paces, sizeof(zS
c49a0 70 61 63 65 73 29 2d 31 29 3b 0d 0a 20 20 20 20 paces)-1);..
c49b0 4e 20 2d 3d 20 73 69 7a 65 6f 66 28 7a 53 70 61 N -= sizeof(zSpa
c49c0 63 65 73 29 2d 31 3b 0d 0a 20 20 7d 0d 0a 20 20 ces)-1;.. }..
c49d0 69 66 28 20 4e 3e 30 20 29 7b 0d 0a 20 20 20 20 if( N>0 ){..
c49e0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 sqlite3StrAccumA
c49f0 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53 ppend(pAccum, zS
c4a00 70 61 63 65 73 2c 20 4e 29 3b 0d 0a 20 20 7d 0d paces, N);.. }.
c4a10 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 6e 20 .}..../*..** On
c4a20 6d 61 63 68 69 6e 65 73 20 77 69 74 68 20 61 20 machines with a
c4a30 73 6d 61 6c 6c 20 73 74 61 63 6b 20 73 69 7a 65 small stack size
c4a40 2c 20 79 6f 75 20 63 61 6e 20 72 65 64 65 66 69 , you can redefi
c4a50 6e 65 20 74 68 65 0d 0a 2a 2a 20 53 51 4c 49 54 ne the..** SQLIT
c4a60 45 5f 50 52 49 4e 54 5f 42 55 46 5f 53 49 5a 45 E_PRINT_BUF_SIZE
c4a70 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 to be something
c4a80 20 73 6d 61 6c 6c 65 72 2c 20 69 66 20 64 65 73 smaller, if des
c4a90 69 72 65 64 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 ired...*/..#ifnd
c4aa0 65 66 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f ef SQLITE_PRINT_
c4ab0 42 55 46 5f 53 49 5a 45 0d 0a 23 20 64 65 66 69 BUF_SIZE..# defi
c4ac0 6e 65 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f ne SQLITE_PRINT_
c4ad0 42 55 46 5f 53 49 5a 45 20 37 30 0d 0a 23 65 6e BUF_SIZE 70..#en
c4ae0 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 65 74 42 dif..#define etB
c4af0 55 46 53 49 5a 45 20 53 51 4c 49 54 45 5f 50 52 UFSIZE SQLITE_PR
c4b00 49 4e 54 5f 42 55 46 5f 53 49 5a 45 20 20 2f 2a INT_BUF_SIZE /*
c4b10 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 Size of the out
c4b20 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0d 0a 0d put buffer */...
c4b30 0a 2f 2a 0d 0a 2a 2a 20 52 65 6e 64 65 72 20 61 ./*..** Render a
c4b40 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20 62 79 string given by
c4b50 20 22 66 6d 74 22 20 69 6e 74 6f 20 74 68 65 20 "fmt" into the
c4b60 53 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e StrAccum object.
c4b70 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
c4b80 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
c4b90 33 56 58 50 72 69 6e 74 66 28 0d 0a 20 20 53 74 3VXPrintf(.. St
c4ba0 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20 rAccum *pAccum,
c4bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c4bc0 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 72 /* Accumulate r
c4bd0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0d 0a esults here */..
c4be0 20 20 69 6e 74 20 75 73 65 45 78 74 65 6e 64 65 int useExtende
c4bf0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
c4c00 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 65 78 /* Allow ex
c4c10 74 65 6e 64 65 64 20 25 2d 63 6f 6e 76 65 72 73 tended %-convers
c4c20 69 6f 6e 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 ions */.. const
c4c30 20 63 68 61 72 20 2a 66 6d 74 2c 20 20 20 20 20 char *fmt,
c4c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
c4c50 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a Format string *
c4c60 2f 0d 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 20 /.. va_list ap
c4c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c4c80 20 20 20 20 20 20 20 20 2f 2a 20 61 72 67 75 6d /* argum
c4c90 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 ents */..){.. i
c4ca0 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 nt c;
c4cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 /* Nex
c4cc0 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 t character in t
c4cd0 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 he format string
c4ce0 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 62 75 66 */.. char *buf
c4cf0 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 pt;
c4d00 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
c4d10 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 62 the conversion b
c4d20 75 66 66 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 uffer */.. int
c4d30 70 72 65 63 69 73 69 6f 6e 3b 20 20 20 20 20 20 precision;
c4d40 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 69 73 /* Precis
c4d50 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 72 65 ion of the curre
c4d60 6e 74 20 66 69 65 6c 64 20 2a 2f 0d 0a 20 20 69 nt field */.. i
c4d70 6e 74 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 nt length;
c4d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e /* Len
c4d90 67 74 68 20 6f 66 20 74 68 65 20 66 69 65 6c 64 gth of the field
c4da0 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 64 78 3b 20 */.. int idx;
c4db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c4dc0 20 20 2f 2a 20 41 20 67 65 6e 65 72 61 6c 20 70 /* A general p
c4dd0 75 72 70 6f 73 65 20 6c 6f 6f 70 20 63 6f 75 6e urpose loop coun
c4de0 74 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 77 69 ter */.. int wi
c4df0 64 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 dth;
c4e00 20 20 20 20 20 2f 2a 20 57 69 64 74 68 20 6f 66 /* Width of
c4e10 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 65 the current fie
c4e20 6c 64 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 ld */.. etByte
c4e30 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 flag_leftjustify
c4e40 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 ; /* True if "
c4e50 2d 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 -" flag is prese
c4e60 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 nt */.. etByte
c4e70 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 3b 20 20 flag_plussign;
c4e80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 /* True if "
c4e90 2b 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 +" flag is prese
c4ea0 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 nt */.. etByte
c4eb0 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 3b 20 flag_blanksign;
c4ec0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 /* True if "
c4ed0 20 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 " flag is prese
c4ee0 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 nt */.. etByte
c4ef0 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f flag_alternatefo
c4f00 72 6d 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 22 rm; /* True if "
c4f10 23 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 #" flag is prese
c4f20 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 nt */.. etByte
c4f30 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 20 20 flag_altform2;
c4f40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 /* True if "
c4f50 21 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 !" flag is prese
c4f60 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 20 nt */.. etByte
c4f70 66 6c 61 67 5f 7a 65 72 6f 70 61 64 3b 20 20 20 flag_zeropad;
c4f80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 /* True if f
c4f90 69 65 6c 64 20 77 69 64 74 68 20 63 6f 6e 73 74 ield width const
c4fa0 61 6e 74 20 73 74 61 72 74 73 20 77 69 74 68 20 ant starts with
c4fb0 7a 65 72 6f 20 2a 2f 0d 0a 20 20 65 74 42 79 74 zero */.. etByt
c4fc0 65 20 66 6c 61 67 5f 6c 6f 6e 67 3b 20 20 20 20 e flag_long;
c4fd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
c4fe0 20 22 6c 22 20 66 6c 61 67 20 69 73 20 70 72 65 "l" flag is pre
c4ff0 73 65 6e 74 20 2a 2f 0d 0a 20 20 65 74 42 79 74 sent */.. etByt
c5000 65 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 3b e flag_longlong;
c5010 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
c5020 20 74 68 65 20 22 6c 6c 22 20 66 6c 61 67 20 69 the "ll" flag i
c5030 73 20 70 72 65 73 65 6e 74 20 2a 2f 0d 0a 20 20 s present */..
c5040 65 74 42 79 74 65 20 64 6f 6e 65 3b 20 20 20 20 etByte done;
c5050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
c5060 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 66 op termination f
c5070 6c 61 67 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 lag */.. etByte
c5080 20 78 74 79 70 65 20 3d 20 30 3b 20 20 20 20 20 xtype = 0;
c5090 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 /* Conversi
c50a0 6f 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f 0d 0a on paradigm */..
c50b0 20 20 63 68 61 72 20 70 72 65 66 69 78 3b 20 20 char prefix;
c50c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
c50d0 50 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 Prefix character
c50e0 2e 20 20 22 2b 22 20 6f 72 20 22 2d 22 20 6f 72 . "+" or "-" or
c50f0 20 22 20 22 20 6f 72 20 27 5c 30 27 2e 20 2a 2f " " or '\0'. */
c5100 0d 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 .. sqlite_uint6
c5110 34 20 6c 6f 6e 67 76 61 6c 75 65 3b 20 20 20 2f 4 longvalue; /
c5120 2a 20 56 61 6c 75 65 20 66 6f 72 20 69 6e 74 65 * Value for inte
c5130 67 65 72 20 74 79 70 65 73 20 2a 2f 0d 0a 20 20 ger types */..
c5140 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 LONGDOUBLE_TYPE
c5150 72 65 61 6c 76 61 6c 75 65 3b 20 2f 2a 20 56 61 realvalue; /* Va
c5160 6c 75 65 20 66 6f 72 20 72 65 61 6c 20 74 79 70 lue for real typ
c5170 65 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 65 es */.. const e
c5180 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f 70 3b 20 20 t_info *infop;
c5190 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
c51a0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 o the appropriat
c51b0 65 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 e info structure
c51c0 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4f 75 */.. char *zOu
c51d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
c51e0 20 20 2f 2a 20 52 65 6e 64 65 72 69 6e 67 20 62 /* Rendering b
c51f0 75 66 66 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 uffer */.. int
c5200 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 nOut;
c5210 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
c5220 66 20 74 68 65 20 72 65 6e 64 65 72 69 6e 67 20 f the rendering
c5230 62 75 66 66 65 72 20 2a 2f 0d 0a 20 20 63 68 61 buffer */.. cha
c5240 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20 20 20 r *zExtra;
c5250 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f /* Mallo
c5260 63 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 ced memory used
c5270 62 79 20 73 6f 6d 65 20 63 6f 6e 76 65 72 73 69 by some conversi
c5280 6f 6e 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 on */..#ifndef S
c5290 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 QLITE_OMIT_FLOAT
c52a0 49 4e 47 5f 50 4f 49 4e 54 0d 0a 20 20 69 6e 74 ING_POINT.. int
c52b0 20 20 65 78 70 2c 20 65 32 3b 20 20 20 20 20 20 exp, e2;
c52c0 20 20 20 20 20 20 20 20 2f 2a 20 65 78 70 6f 6e /* expon
c52d0 65 6e 74 20 6f 66 20 72 65 61 6c 20 6e 75 6d 62 ent of real numb
c52e0 65 72 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 73 ers */.. int ns
c52f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d;
c5300 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
c5310 66 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 f significant di
c5320 67 69 74 73 20 72 65 74 75 72 6e 65 64 20 2a 2f gits returned */
c5330 0d 0a 20 20 64 6f 75 62 6c 65 20 72 6f 75 6e 64 .. double round
c5340 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f er; /
c5350 2a 20 55 73 65 64 20 66 6f 72 20 72 6f 75 6e 64 * Used for round
c5360 69 6e 67 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 ing floating poi
c5370 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0d 0a 20 20 nt values */..
c5380 65 74 42 79 74 65 20 66 6c 61 67 5f 64 70 3b 20 etByte flag_dp;
c5390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
c53a0 75 65 20 69 66 20 64 65 63 69 6d 61 6c 20 70 6f ue if decimal po
c53b0 69 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 73 68 int should be sh
c53c0 6f 77 6e 20 2a 2f 0d 0a 20 20 65 74 42 79 74 65 own */.. etByte
c53d0 20 66 6c 61 67 5f 72 74 7a 3b 20 20 20 20 20 20 flag_rtz;
c53e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
c53f0 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73 20 73 trailing zeros s
c5400 68 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 hould be removed
c5410 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 63 */..#endif.. c
c5420 68 61 72 20 62 75 66 5b 65 74 42 55 46 53 49 5a har buf[etBUFSIZ
c5430 45 5d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e E]; /* Con
c5440 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a version buffer *
c5450 2f 0d 0a 0d 0a 20 20 62 75 66 70 74 20 3d 20 30 /.... bufpt = 0
c5460 3b 0d 0a 20 20 66 6f 72 28 3b 20 28 63 3d 28 2a ;.. for(; (c=(*
c5470 66 6d 74 29 29 21 3d 30 3b 20 2b 2b 66 6d 74 29 fmt))!=0; ++fmt)
c5480 7b 0d 0a 20 20 20 20 69 66 28 20 63 21 3d 27 25 {.. if( c!='%
c5490 27 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 ' ){.. int
c54a0 61 6d 74 3b 0d 0a 20 20 20 20 20 20 62 75 66 70 amt;.. bufp
c54b0 74 20 3d 20 28 63 68 61 72 20 2a 29 66 6d 74 3b t = (char *)fmt;
c54c0 0d 0a 20 20 20 20 20 20 61 6d 74 20 3d 20 31 3b .. amt = 1;
c54d0 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 .. while( (
c54e0 63 3d 28 2a 2b 2b 66 6d 74 29 29 21 3d 27 25 27 c=(*++fmt))!='%'
c54f0 20 26 26 20 63 21 3d 30 20 29 20 61 6d 74 2b 2b && c!=0 ) amt++
c5500 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ;.. sqlite3
c5510 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 StrAccumAppend(p
c5520 41 63 63 75 6d 2c 20 62 75 66 70 74 2c 20 61 6d Accum, bufpt, am
c5530 74 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 63 t);.. if( c
c5540 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 ==0 ) break;..
c5550 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 28 63 3d }.. if( (c=
c5560 28 2a 2b 2b 66 6d 74 29 29 3d 3d 30 20 29 7b 0d (*++fmt))==0 ){.
c5570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 . sqlite3St
c5580 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 rAccumAppend(pAc
c5590 63 75 6d 2c 20 22 25 22 2c 20 31 29 3b 0d 0a 20 cum, "%", 1);..
c55a0 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 break;..
c55b0 20 7d 0d 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 }.. /* Find
c55c0 6f 75 74 20 77 68 61 74 20 66 6c 61 67 73 20 61 out what flags a
c55d0 72 65 20 70 72 65 73 65 6e 74 20 2a 2f 0d 0a 20 re present */..
c55e0 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 flag_leftjust
c55f0 69 66 79 20 3d 20 66 6c 61 67 5f 70 6c 75 73 73 ify = flag_pluss
c5600 69 67 6e 20 3d 20 66 6c 61 67 5f 62 6c 61 6e 6b ign = flag_blank
c5610 73 69 67 6e 20 3d 20 0d 0a 20 20 20 20 20 66 6c sign = .. fl
c5620 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d ag_alternateform
c5630 20 3d 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 = flag_altform2
c5640 20 3d 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 = flag_zeropad
c5650 3d 20 30 3b 0d 0a 20 20 20 20 64 6f 6e 65 20 3d = 0;.. done =
c5660 20 30 3b 0d 0a 20 20 20 20 64 6f 7b 0d 0a 20 20 0;.. do{..
c5670 20 20 20 20 73 77 69 74 63 68 28 20 63 20 29 7b switch( c ){
c5680 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 .. case '
c5690 2d 27 3a 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a -': flag_leftj
c56a0 75 73 74 69 66 79 20 3d 20 31 3b 20 20 20 20 20 ustify = 1;
c56b0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 break;..
c56c0 63 61 73 65 20 27 2b 27 3a 20 20 20 66 6c 61 67 case '+': flag
c56d0 5f 70 6c 75 73 73 69 67 6e 20 3d 20 31 3b 20 20 _plussign = 1;
c56e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
c56f0 20 20 20 20 20 20 63 61 73 65 20 27 20 27 3a 20 case ' ':
c5700 20 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e flag_blanksign
c5710 20 3d 20 31 3b 20 20 20 20 20 20 20 62 72 65 61 = 1; brea
c5720 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 k;.. case
c5730 20 27 23 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 '#': flag_alt
c5740 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 ernateform = 1;
c5750 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 break;..
c5760 20 20 63 61 73 65 20 27 21 27 3a 20 20 20 66 6c case '!': fl
c5770 61 67 5f 61 6c 74 66 6f 72 6d 32 20 3d 20 31 3b ag_altform2 = 1;
c5780 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a break;..
c5790 20 20 20 20 20 20 20 20 63 61 73 65 20 27 30 27 case '0'
c57a0 3a 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 : flag_zeropad
c57b0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 62 72 = 1; br
c57c0 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 64 65 eak;.. de
c57d0 66 61 75 6c 74 3a 20 20 20 20 64 6f 6e 65 20 3d fault: done =
c57e0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 1;
c57f0 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 break;..
c5800 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28 }.. }while(
c5810 20 21 64 6f 6e 65 20 26 26 20 28 63 3d 28 2a 2b !done && (c=(*+
c5820 2b 66 6d 74 29 29 21 3d 30 20 29 3b 0d 0a 20 20 +fmt))!=0 );..
c5830 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69 65 /* Get the fie
c5840 6c 64 20 77 69 64 74 68 20 2a 2f 0d 0a 20 20 20 ld width */..
c5850 20 77 69 64 74 68 20 3d 20 30 3b 0d 0a 20 20 20 width = 0;..
c5860 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0d 0a if( c=='*' ){..
c5870 20 20 20 20 20 20 77 69 64 74 68 20 3d 20 76 61 width = va
c5880 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0d 0a 20 _arg(ap,int);..
c5890 20 20 20 20 20 69 66 28 20 77 69 64 74 68 3c 30 if( width<0
c58a0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 6c 61 ){.. fla
c58b0 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 g_leftjustify =
c58c0 31 3b 0d 0a 20 20 20 20 20 20 20 20 77 69 64 74 1;.. widt
c58d0 68 20 3d 20 2d 77 69 64 74 68 3b 0d 0a 20 20 20 h = -width;..
c58e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 20 3d 20 }.. c =
c58f0 2a 2b 2b 66 6d 74 3b 0d 0a 20 20 20 20 7d 65 6c *++fmt;.. }el
c5900 73 65 7b 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 se{.. while
c5910 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 ( c>='0' && c<='
c5920 39 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 77 9' ){.. w
c5930 69 64 74 68 20 3d 20 77 69 64 74 68 2a 31 30 20 idth = width*10
c5940 2b 20 63 20 2d 20 27 30 27 3b 0d 0a 20 20 20 20 + c - '0';..
c5950 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0d c = *++fmt;.
c5960 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
c5970 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 . /* Get the
c5980 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0d 0a 20 20 precision */..
c5990 20 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0d if( c=='.' ){.
c59a0 0a 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e . precision
c59b0 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 63 20 3d = 0;.. c =
c59c0 20 2a 2b 2b 66 6d 74 3b 0d 0a 20 20 20 20 20 20 *++fmt;..
c59d0 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0d 0a 20 if( c=='*' ){..
c59e0 20 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e precision
c59f0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 = va_arg(ap,int
c5a00 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 );.. if(
c5a10 70 72 65 63 69 73 69 6f 6e 3c 30 20 29 20 70 72 precision<0 ) pr
c5a20 65 63 69 73 69 6f 6e 20 3d 20 2d 70 72 65 63 69 ecision = -preci
c5a30 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 63 sion;.. c
c5a40 20 3d 20 2a 2b 2b 66 6d 74 3b 0d 0a 20 20 20 20 = *++fmt;..
c5a50 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
c5a60 20 20 77 68 69 6c 65 28 20 63 3e 3d 27 30 27 20 while( c>='0'
c5a70 26 26 20 63 3c 3d 27 39 27 20 29 7b 0d 0a 20 20 && c<='9' ){..
c5a80 20 20 20 20 20 20 20 20 70 72 65 63 69 73 69 6f precisio
c5a90 6e 20 3d 20 70 72 65 63 69 73 69 6f 6e 2a 31 30 n = precision*10
c5aa0 20 2b 20 63 20 2d 20 27 30 27 3b 0d 0a 20 20 20 + c - '0';..
c5ab0 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d c = *++fm
c5ac0 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 t;.. }..
c5ad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 }.. }els
c5ae0 65 7b 0d 0a 20 20 20 20 20 20 70 72 65 63 69 73 e{.. precis
c5af0 69 6f 6e 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 7d ion = -1;.. }
c5b00 0d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 .. /* Get the
c5b10 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 conversion type
c5b20 20 6d 6f 64 69 66 69 65 72 20 2a 2f 0d 0a 20 20 modifier */..
c5b30 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 29 7b 0d if( c=='l' ){.
c5b40 0a 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 . flag_long
c5b50 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 63 20 3d = 1;.. c =
c5b60 20 2a 2b 2b 66 6d 74 3b 0d 0a 20 20 20 20 20 20 *++fmt;..
c5b70 69 66 28 20 63 3d 3d 27 6c 27 20 29 7b 0d 0a 20 if( c=='l' ){..
c5b80 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 flag_long
c5b90 6c 6f 6e 67 20 3d 20 31 3b 0d 0a 20 20 20 20 20 long = 1;..
c5ba0 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0d 0a c = *++fmt;..
c5bb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
c5bc0 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c flag_longl
c5bd0 6f 6e 67 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 ong = 0;..
c5be0 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 }.. }else{..
c5bf0 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d flag_long =
c5c00 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d flag_longlong =
c5c10 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0;.. }..
c5c20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 66 /* Fetch the inf
c5c30 6f 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 o entry for the
c5c40 66 69 65 6c 64 20 2a 2f 0d 0a 20 20 20 20 69 6e field */.. in
c5c50 66 6f 70 20 3d 20 26 66 6d 74 69 6e 66 6f 5b 30 fop = &fmtinfo[0
c5c60 5d 3b 0d 0a 20 20 20 20 78 74 79 70 65 20 3d 20 ];.. xtype =
c5c70 65 74 49 4e 56 41 4c 49 44 3b 0d 0a 20 20 20 20 etINVALID;..
c5c80 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 41 for(idx=0; idx<A
c5c90 72 72 61 79 53 69 7a 65 28 66 6d 74 69 6e 66 6f rraySize(fmtinfo
c5ca0 29 3b 20 69 64 78 2b 2b 29 7b 0d 0a 20 20 20 20 ); idx++){..
c5cb0 20 20 69 66 28 20 63 3d 3d 66 6d 74 69 6e 66 6f if( c==fmtinfo
c5cc0 5b 69 64 78 5d 2e 66 6d 74 74 79 70 65 20 29 7b [idx].fmttype ){
c5cd0 0d 0a 20 20 20 20 20 20 20 20 69 6e 66 6f 70 20 .. infop
c5ce0 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64 78 5d 3b = &fmtinfo[idx];
c5cf0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 73 .. if( us
c5d00 65 45 78 74 65 6e 64 65 64 20 7c 7c 20 28 69 6e eExtended || (in
c5d10 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46 4c 41 fop->flags & FLA
c5d20 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20 29 7b 0d G_INTERN)==0 ){.
c5d30 0a 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 . xtype
c5d40 20 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3b 0d = infop->type;.
c5d50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d . }else{.
c5d60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
c5d70 6e 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 n;.. }..
c5d80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 break;..
c5d90 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
c5da0 20 20 20 7a 45 78 74 72 61 20 3d 20 30 3b 0d 0a zExtra = 0;..
c5db0 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 2a 2a .. /*.. **
c5dc0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 At this point,
c5dd0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 69 6e variables are in
c5de0 69 74 69 61 6c 69 7a 65 64 20 61 73 20 66 6f 6c itialized as fol
c5df0 6c 6f 77 73 3a 0d 0a 20 20 20 20 2a 2a 0d 0a 20 lows:.. **..
c5e00 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 61 6c 74 ** flag_alt
c5e10 65 72 6e 61 74 65 66 6f 72 6d 20 20 20 20 20 20 ernateform
c5e20 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 23 TRUE if a '#
c5e30 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 ' is present...
c5e40 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 61 6c 74 ** flag_alt
c5e50 66 6f 72 6d 32 20 20 20 20 20 20 20 20 20 20 20 form2
c5e60 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 21 TRUE if a '!
c5e70 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 ' is present...
c5e80 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 70 6c 75 ** flag_plu
c5e90 73 73 69 67 6e 20 20 20 20 20 20 20 20 20 20 20 ssign
c5ea0 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 2b TRUE if a '+
c5eb0 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 ' is present...
c5ec0 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 65 66 ** flag_lef
c5ed0 74 6a 75 73 74 69 66 79 20 20 20 20 20 20 20 20 tjustify
c5ee0 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 2d TRUE if a '-
c5ef0 27 20 69 73 20 70 72 65 73 65 6e 74 20 6f 72 20 ' is present or
c5f00 69 66 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 20 if the.. **
c5f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c5f20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65 fie
c5f30 6c 64 20 77 69 64 74 68 20 77 61 73 20 6e 65 67 ld width was neg
c5f40 61 74 69 76 65 2e 0d 0a 20 20 20 20 2a 2a 20 20 ative... **
c5f50 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 20 20 flag_zeropad
c5f60 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 TRU
c5f70 45 20 69 66 20 74 68 65 20 77 69 64 74 68 20 62 E if the width b
c5f80 65 67 61 6e 20 77 69 74 68 20 30 2e 0d 0a 20 20 egan with 0...
c5f90 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 ** flag_long
c5fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c5fb0 20 20 20 54 52 55 45 20 69 66 20 74 68 65 20 6c TRUE if the l
c5fc0 65 74 74 65 72 20 27 6c 27 20 28 65 6c 6c 29 20 etter 'l' (ell)
c5fd0 70 72 65 66 69 78 65 64 0d 0a 20 20 20 20 2a 2a prefixed.. **
c5fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c5ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
c6000 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 he conversion ch
c6010 61 72 61 63 74 65 72 2e 0d 0a 20 20 20 20 2a 2a aracter... **
c6020 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 flag_longlong
c6030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 T
c6040 52 55 45 20 69 66 20 74 68 65 20 6c 65 74 74 65 RUE if the lette
c6050 72 20 27 6c 6c 27 20 28 65 6c 6c 20 65 6c 6c 29 r 'll' (ell ell)
c6060 20 70 72 65 66 69 78 65 64 0d 0a 20 20 20 20 2a prefixed.. *
c6070 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
c6080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6090 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 the conversion c
c60a0 68 61 72 61 63 74 65 72 2e 0d 0a 20 20 20 20 2a haracter... *
c60b0 2a 20 20 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 * flag_blanksi
c60c0 67 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 gn
c60d0 54 52 55 45 20 69 66 20 61 20 27 20 27 20 69 73 TRUE if a ' ' is
c60e0 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 2a present... *
c60f0 2a 20 20 20 77 69 64 74 68 20 20 20 20 20 20 20 * width
c6100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6110 54 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 The specified fi
c6120 65 6c 64 20 77 69 64 74 68 2e 20 20 54 68 69 73 eld width. This
c6130 20 69 73 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 is.. **
c6140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6150 20 20 20 20 20 20 20 20 20 20 61 6c 77 61 79 73 always
c6160 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20 non-negative.
c6170 5a 65 72 6f 20 69 73 20 74 68 65 20 64 65 66 61 Zero is the defa
c6180 75 6c 74 2e 0d 0a 20 20 20 20 2a 2a 20 20 20 70 ult... ** p
c6190 72 65 63 69 73 69 6f 6e 20 20 20 20 20 20 20 20 recision
c61a0 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 73 The s
c61b0 70 65 63 69 66 69 65 64 20 70 72 65 63 69 73 69 pecified precisi
c61c0 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 on. The default
c61d0 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 .. **
c61e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c61f0 20 20 20 20 20 20 20 69 73 20 2d 31 2e 0d 0a 20 is -1...
c6200 20 20 20 2a 2a 20 20 20 78 74 79 70 65 20 20 20 ** xtype
c6210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6220 20 20 20 20 54 68 65 20 63 6c 61 73 73 20 6f 66 The class of
c6230 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2e the conversion.
c6240 0d 0a 20 20 20 20 2a 2a 20 20 20 69 6e 66 6f 70 .. ** infop
c6250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6260 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 Pointer t
c6270 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 o the appropriat
c6280 65 20 69 6e 66 6f 20 73 74 72 75 63 74 2e 0d 0a e info struct...
c6290 20 20 20 20 2a 2f 0d 0a 20 20 20 20 73 77 69 74 */.. swit
c62a0 63 68 28 20 78 74 79 70 65 20 29 7b 0d 0a 20 20 ch( xtype ){..
c62b0 20 20 20 20 63 61 73 65 20 65 74 50 4f 49 4e 54 case etPOINT
c62c0 45 52 3a 0d 0a 20 20 20 20 20 20 20 20 66 6c 61 ER:.. fla
c62d0 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 73 69 7a g_longlong = siz
c62e0 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 69 7a 65 eof(char*)==size
c62f0 6f 66 28 69 36 34 29 3b 0d 0a 20 20 20 20 20 20 of(i64);..
c6300 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 73 69 flag_long = si
c6310 7a 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 69 7a zeof(char*)==siz
c6320 65 6f 66 28 6c 6f 6e 67 20 69 6e 74 29 3b 0d 0a eof(long int);..
c6330 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 /* Fall
c6340 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 through into the
c6350 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0d 0a 20 next case */..
c6360 20 20 20 20 20 63 61 73 65 20 65 74 4f 52 44 49 case etORDI
c6370 4e 41 4c 3a 0d 0a 20 20 20 20 20 20 63 61 73 65 NAL:.. case
c6380 20 65 74 52 41 44 49 58 3a 0d 0a 20 20 20 20 20 etRADIX:..
c6390 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e 66 6c if( infop->fl
c63a0 61 67 73 20 26 20 46 4c 41 47 5f 53 49 47 4e 45 ags & FLAG_SIGNE
c63b0 44 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 D ){..
c63c0 69 36 34 20 76 3b 0d 0a 20 20 20 20 20 20 20 20 i64 v;..
c63d0 20 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 6c if( flag_longl
c63e0 6f 6e 67 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ong ){..
c63f0 20 20 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61 v = va_arg(a
c6400 70 2c 69 36 34 29 3b 0d 0a 20 20 20 20 20 20 20 p,i64);..
c6410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 }else if( fla
c6420 67 5f 6c 6f 6e 67 20 29 7b 0d 0a 20 20 20 20 20 g_long ){..
c6430 20 20 20 20 20 20 20 76 20 3d 20 76 61 5f 61 72 v = va_ar
c6440 67 28 61 70 2c 6c 6f 6e 67 20 69 6e 74 29 3b 0d g(ap,long int);.
c6450 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 . }else
c6460 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 {.. v
c6470 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 = va_arg(ap,int
c6480 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d );.. }.
c6490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 . if( v
c64a0 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 <0 ){..
c64b0 20 20 20 69 66 28 20 76 3d 3d 53 4d 41 4c 4c 45 if( v==SMALLE
c64c0 53 54 5f 49 4e 54 36 34 20 29 7b 0d 0a 20 20 20 ST_INT64 ){..
c64d0 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 longv
c64e0 61 6c 75 65 20 3d 20 28 28 75 36 34 29 31 29 3c alue = ((u64)1)<
c64f0 3c 36 33 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 <63;..
c6500 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
c6510 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 longvalu
c6520 65 20 3d 20 2d 76 3b 0d 0a 20 20 20 20 20 20 20 e = -v;..
c6530 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
c6540 20 20 20 20 70 72 65 66 69 78 20 3d 20 27 2d 27 prefix = '-'
c6550 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c ;.. }el
c6560 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 se{..
c6570 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 3b 0d longvalue = v;.
c6580 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
c6590 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20 29 flag_plussign )
c65a0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d prefix =
c65b0 20 27 2b 27 3b 0d 0a 20 20 20 20 20 20 20 20 20 '+';..
c65c0 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 else if( flag
c65d0 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 20 20 70 72 _blanksign ) pr
c65e0 65 66 69 78 20 3d 20 27 20 27 3b 0d 0a 20 20 20 efix = ' ';..
c65f0 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 else
c6600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6610 20 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0d prefix = 0;.
c6620 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 . }..
c6630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
c6640 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 if( flag
c6650 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 7b 0d 0a 20 20 _longlong ){..
c6660 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 longva
c6670 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c lue = va_arg(ap,
c6680 75 36 34 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 u64);..
c6690 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f }else if( flag_
c66a0 6c 6f 6e 67 20 29 7b 0d 0a 20 20 20 20 20 20 20 long ){..
c66b0 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d longvalue =
c66c0 20 76 61 5f 61 72 67 28 61 70 2c 75 6e 73 69 67 va_arg(ap,unsig
c66d0 6e 65 64 20 6c 6f 6e 67 20 69 6e 74 29 3b 0d 0a ned long int);..
c66e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
c66f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f .. lo
c6700 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 ngvalue = va_arg
c6710 28 61 70 2c 75 6e 73 69 67 6e 65 64 20 69 6e 74 (ap,unsigned int
c6720 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d );.. }.
c6730 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 . prefi
c6740 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 x = 0;..
c6750 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c }.. if( l
c6760 6f 6e 67 76 61 6c 75 65 3d 3d 30 20 29 20 66 6c ongvalue==0 ) fl
c6770 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d ag_alternateform
c6780 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 69 = 0;.. i
c6790 66 28 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 f( flag_zeropad
c67a0 26 26 20 70 72 65 63 69 73 69 6f 6e 3c 77 69 64 && precision<wid
c67b0 74 68 2d 28 70 72 65 66 69 78 21 3d 30 29 20 29 th-(prefix!=0) )
c67c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 {.. pre
c67d0 63 69 73 69 6f 6e 20 3d 20 77 69 64 74 68 2d 28 cision = width-(
c67e0 70 72 65 66 69 78 21 3d 30 29 3b 0d 0a 20 20 20 prefix!=0);..
c67f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
c6800 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 65 74 if( precision<et
c6810 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0d 0a 20 BUFSIZE-10 ){..
c6820 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 nOut =
c6830 65 74 42 55 46 53 49 5a 45 3b 0d 0a 20 20 20 20 etBUFSIZE;..
c6840 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 62 75 66 zOut = buf
c6850 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 ;.. }else
c6860 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 {.. nOu
c6870 74 20 3d 20 70 72 65 63 69 73 69 6f 6e 20 2b 20 t = precision +
c6880 31 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7a 10;.. z
c6890 4f 75 74 20 3d 20 7a 45 78 74 72 61 20 3d 20 73 Out = zExtra = s
c68a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 4f qlite3Malloc( nO
c68b0 75 74 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 ut );..
c68c0 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0d if( zOut==0 ){.
c68d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 63 . pAc
c68e0 63 75 6d 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 cum->mallocFaile
c68f0 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 d = 1;..
c6900 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 return;..
c6910 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
c6920 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 62 75 66 }.. buf
c6930 70 74 20 3d 20 26 7a 4f 75 74 5b 6e 4f 75 74 2d pt = &zOut[nOut-
c6940 31 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 1];.. if(
c6950 20 78 74 79 70 65 3d 3d 65 74 4f 52 44 49 4e 41 xtype==etORDINA
c6960 4c 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 L ){..
c6970 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
c6980 72 20 7a 4f 72 64 5b 5d 20 3d 20 22 74 68 73 74 r zOrd[] = "thst
c6990 6e 64 72 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 ndrd";..
c69a0 20 20 69 6e 74 20 78 20 3d 20 28 69 6e 74 29 28 int x = (int)(
c69b0 6c 6f 6e 67 76 61 6c 75 65 20 25 20 31 30 29 3b longvalue % 10);
c69c0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 .. if(
c69d0 78 3e 3d 34 20 7c 7c 20 28 6c 6f 6e 67 76 61 6c x>=4 || (longval
c69e0 75 65 2f 31 30 29 25 31 30 3d 3d 31 20 29 7b 0d ue/10)%10==1 ){.
c69f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d . x =
c6a00 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0;.. }
c6a10 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 2d 2d .. *(--
c6a20 62 75 66 70 74 29 20 3d 20 7a 4f 72 64 5b 78 2a bufpt) = zOrd[x*
c6a30 32 2b 31 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 2+1];..
c6a40 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 7a 4f *(--bufpt) = zO
c6a50 72 64 5b 78 2a 32 5d 3b 0d 0a 20 20 20 20 20 20 rd[x*2];..
c6a60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a }.. {..
c6a70 20 20 20 20 20 20 20 20 20 20 72 65 67 69 73 74 regist
c6a80 65 72 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 er const char *c
c6a90 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 set; /* Use
c6aa0 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 73 registers for s
c6ab0 70 65 65 64 20 2a 2f 0d 0a 20 20 20 20 20 20 20 peed */..
c6ac0 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 register int
c6ad0 62 61 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 base;..
c6ae0 20 63 73 65 74 20 3d 20 26 61 44 69 67 69 74 73 cset = &aDigits
c6af0 5b 69 6e 66 6f 70 2d 3e 63 68 61 72 73 65 74 5d [infop->charset]
c6b00 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 61 73 ;.. bas
c6b10 65 20 3d 20 69 6e 66 6f 70 2d 3e 62 61 73 65 3b e = infop->base;
c6b20 0d 0a 20 20 20 20 20 20 20 20 20 20 64 6f 7b 20 .. do{
c6b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e /* Con
c6b60 76 65 72 74 20 74 6f 20 61 73 63 69 69 20 2a 2f vert to ascii */
c6b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 .. *(
c6b80 2d 2d 62 75 66 70 74 29 20 3d 20 63 73 65 74 5b --bufpt) = cset[
c6b90 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73 65 5d 3b longvalue%base];
c6ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f .. lo
c6bb0 6e 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76 61 ngvalue = longva
c6bc0 6c 75 65 2f 62 61 73 65 3b 0d 0a 20 20 20 20 20 lue/base;..
c6bd0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e }while( lon
c6be0 67 76 61 6c 75 65 3e 30 20 29 3b 0d 0a 20 20 20 gvalue>0 );..
c6bf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
c6c00 6c 65 6e 67 74 68 20 3d 20 28 69 6e 74 29 28 26 length = (int)(&
c6c10 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 2d 62 75 66 zOut[nOut-1]-buf
c6c20 70 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f pt);.. fo
c6c30 72 28 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2d r(idx=precision-
c6c40 6c 65 6e 67 74 68 3b 20 69 64 78 3e 30 3b 20 69 length; idx>0; i
c6c50 64 78 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 20 20 dx--){..
c6c60 20 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 27 *(--bufpt) = '
c6c70 30 27 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0';
c6c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c6c90 2f 2a 20 5a 65 72 6f 20 70 61 64 20 2a 2f 0d 0a /* Zero pad */..
c6ca0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
c6cb0 20 20 20 69 66 28 20 70 72 65 66 69 78 20 29 20 if( prefix )
c6cc0 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 70 72 65 *(--bufpt) = pre
c6cd0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 fix;
c6ce0 20 20 20 2f 2a 20 41 64 64 20 73 69 67 6e 20 2a /* Add sign *
c6cf0 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 /.. if( f
c6d00 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 lag_alternatefor
c6d10 6d 20 26 26 20 69 6e 66 6f 70 2d 3e 70 72 65 66 m && infop->pref
c6d20 69 78 20 29 7b 20 20 20 20 20 20 2f 2a 20 41 64 ix ){ /* Ad
c6d30 64 20 22 30 22 20 6f 72 20 22 30 78 22 20 2a 2f d "0" or "0x" */
c6d40 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 .. cons
c6d50 74 20 63 68 61 72 20 2a 70 72 65 3b 0d 0a 20 20 t char *pre;..
c6d60 20 20 20 20 20 20 20 20 63 68 61 72 20 78 3b 0d char x;.
c6d70 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 20 3d . pre =
c6d80 20 26 61 50 72 65 66 69 78 5b 69 6e 66 6f 70 2d &aPrefix[infop-
c6d90 3e 70 72 65 66 69 78 5d 3b 0d 0a 20 20 20 20 20 >prefix];..
c6da0 20 20 20 20 20 66 6f 72 28 3b 20 28 78 3d 28 2a for(; (x=(*
c6db0 70 72 65 29 29 21 3d 30 3b 20 70 72 65 2b 2b 29 pre))!=0; pre++)
c6dc0 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 78 3b *(--bufpt) = x;
c6dd0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
c6de0 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69 length = (i
c6df0 6e 74 29 28 26 7a 4f 75 74 5b 6e 4f 75 74 2d 31 nt)(&zOut[nOut-1
c6e00 5d 2d 62 75 66 70 74 29 3b 0d 0a 20 20 20 20 20 ]-bufpt);..
c6e10 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 break;..
c6e20 20 63 61 73 65 20 65 74 46 4c 4f 41 54 3a 0d 0a case etFLOAT:..
c6e30 20 20 20 20 20 20 63 61 73 65 20 65 74 45 58 50 case etEXP
c6e40 3a 0d 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 :.. case et
c6e50 47 45 4e 45 52 49 43 3a 0d 0a 20 20 20 20 20 20 GENERIC:..
c6e60 20 20 72 65 61 6c 76 61 6c 75 65 20 3d 20 76 61 realvalue = va
c6e70 5f 61 72 67 28 61 70 2c 64 6f 75 62 6c 65 29 3b _arg(ap,double);
c6e80 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
c6e90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f OMIT_FLOATING_PO
c6ea0 49 4e 54 0d 0a 20 20 20 20 20 20 20 20 6c 65 6e INT.. len
c6eb0 67 74 68 20 3d 20 30 3b 0d 0a 23 65 6c 73 65 0d gth = 0;..#else.
c6ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 . if( pre
c6ed0 63 69 73 69 6f 6e 3c 30 20 29 20 70 72 65 63 69 cision<0 ) preci
c6ee0 73 69 6f 6e 20 3d 20 36 3b 20 20 20 20 20 20 20 sion = 6;
c6ef0 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 /* Set default
c6f00 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0d 0a 20 precision */..
c6f10 20 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 if( realv
c6f20 61 6c 75 65 3c 30 2e 30 20 29 7b 0d 0a 20 20 20 alue<0.0 ){..
c6f30 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65 realvalue
c6f40 20 3d 20 2d 72 65 61 6c 76 61 6c 75 65 3b 0d 0a = -realvalue;..
c6f50 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 prefix
c6f60 20 3d 20 27 2d 27 3b 0d 0a 20 20 20 20 20 20 20 = '-';..
c6f70 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
c6f80 20 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73 if( flag_plus
c6f90 73 69 67 6e 20 29 20 20 20 20 20 20 20 20 20 20 sign )
c6fa0 70 72 65 66 69 78 20 3d 20 27 2b 27 3b 0d 0a 20 prefix = '+';..
c6fb0 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 else if
c6fc0 28 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e ( flag_blanksign
c6fd0 20 29 20 20 20 20 70 72 65 66 69 78 20 3d 20 27 ) prefix = '
c6fe0 20 27 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 ';.. e
c6ff0 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 lse
c7000 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 pref
c7010 69 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 ix = 0;..
c7020 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }.. if(
c7030 78 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49 43 xtype==etGENERIC
c7040 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 && precision>0
c7050 29 20 70 72 65 63 69 73 69 6f 6e 2d 2d 3b 0d 0a ) precision--;..
c7060 23 69 66 20 30 0d 0a 20 20 20 20 20 20 20 20 2f #if 0.. /
c7070 2a 20 52 6f 75 6e 64 69 6e 67 20 77 6f 72 6b 73 * Rounding works
c7080 20 6c 69 6b 65 20 42 53 44 20 77 68 65 6e 20 74 like BSD when t
c7090 68 65 20 63 6f 6e 73 74 61 6e 74 20 30 2e 34 39 he constant 0.49
c70a0 39 39 20 69 73 20 75 73 65 64 2e 20 20 57 69 65 99 is used. Wie
c70b0 72 64 21 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 rd! */..
c70c0 66 6f 72 28 69 64 78 3d 70 72 65 63 69 73 69 6f for(idx=precisio
c70d0 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e 34 39 39 n, rounder=0.499
c70e0 39 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 2c 9; idx>0; idx--,
c70f0 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 3b 0d rounder*=0.1);.
c7100 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 .#else..
c7110 2f 2a 20 49 74 20 6d 61 6b 65 73 20 6d 6f 72 65 /* It makes more
c7120 20 73 65 6e 73 65 20 74 6f 20 75 73 65 20 30 2e sense to use 0.
c7130 35 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 66 6f 5 */.. fo
c7140 72 28 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2c r(idx=precision,
c7150 20 72 6f 75 6e 64 65 72 3d 30 2e 35 3b 20 69 64 rounder=0.5; id
c7160 78 3e 30 3b 20 69 64 78 2d 2d 2c 20 72 6f 75 6e x>0; idx--, roun
c7170 64 65 72 2a 3d 30 2e 31 29 7b 7d 0d 0a 23 65 6e der*=0.1){}..#en
c7180 64 69 66 0d 0a 20 20 20 20 20 20 20 20 69 66 28 dif.. if(
c7190 20 78 74 79 70 65 3d 3d 65 74 46 4c 4f 41 54 20 xtype==etFLOAT
c71a0 29 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d 20 72 ) realvalue += r
c71b0 6f 75 6e 64 65 72 3b 0d 0a 20 20 20 20 20 20 20 ounder;..
c71c0 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20 72 65 /* Normalize re
c71d0 61 6c 76 61 6c 75 65 20 74 6f 20 77 69 74 68 69 alvalue to withi
c71e0 6e 20 31 30 2e 30 20 3e 20 72 65 61 6c 76 61 6c n 10.0 > realval
c71f0 75 65 20 3e 3d 20 31 2e 30 20 2a 2f 0d 0a 20 20 ue >= 1.0 */..
c7200 20 20 20 20 20 20 65 78 70 20 3d 20 30 3b 0d 0a exp = 0;..
c7210 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 if( sqli
c7220 74 65 33 49 73 4e 61 4e 28 28 64 6f 75 62 6c 65 te3IsNaN((double
c7230 29 72 65 61 6c 76 61 6c 75 65 29 20 29 7b 0d 0a )realvalue) ){..
c7240 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20 bufpt
c7250 3d 20 22 4e 61 4e 22 3b 0d 0a 20 20 20 20 20 20 = "NaN";..
c7260 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 33 3b 0d length = 3;.
c7270 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b . break
c7280 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
c7290 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 61 if( realva
c72a0 6c 75 65 3e 30 2e 30 20 29 7b 0d 0a 20 20 20 20 lue>0.0 ){..
c72b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 while( rea
c72c0 6c 76 61 6c 75 65 3e 3d 31 65 33 32 20 26 26 20 lvalue>=1e32 &&
c72d0 65 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c exp<=350 ){ real
c72e0 76 61 6c 75 65 20 2a 3d 20 31 65 2d 33 32 3b 20 value *= 1e-32;
c72f0 65 78 70 2b 3d 33 32 3b 20 7d 0d 0a 20 20 20 20 exp+=32; }..
c7300 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 while( rea
c7310 6c 76 61 6c 75 65 3e 3d 31 65 38 20 26 26 20 65 lvalue>=1e8 && e
c7320 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76 xp<=350 ){ realv
c7330 61 6c 75 65 20 2a 3d 20 31 65 2d 38 3b 20 65 78 alue *= 1e-8; ex
c7340 70 2b 3d 38 3b 20 7d 0d 0a 20 20 20 20 20 20 20 p+=8; }..
c7350 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61 while( realva
c7360 6c 75 65 3e 3d 31 30 2e 30 20 26 26 20 65 78 70 lue>=10.0 && exp
c7370 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76 61 6c <=350 ){ realval
c7380 75 65 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b ue *= 0.1; exp++
c7390 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 77 ; }.. w
c73a0 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3c hile( realvalue<
c73b0 31 65 2d 38 20 29 7b 20 72 65 61 6c 76 61 6c 75 1e-8 ){ realvalu
c73c0 65 20 2a 3d 20 31 65 38 3b 20 65 78 70 2d 3d 38 e *= 1e8; exp-=8
c73d0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 77 ; }.. w
c73e0 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3c hile( realvalue<
c73f0 31 2e 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 1.0 ){ realvalue
c7400 20 2a 3d 20 31 30 2e 30 3b 20 65 78 70 2d 2d 3b *= 10.0; exp--;
c7410 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 }.. if
c7420 28 20 65 78 70 3e 33 35 30 20 29 7b 0d 0a 20 20 ( exp>350 ){..
c7430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 if( pr
c7440 65 66 69 78 3d 3d 27 2d 27 20 29 7b 0d 0a 20 20 efix=='-' ){..
c7450 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70 bufp
c7460 74 20 3d 20 22 2d 49 6e 66 22 3b 0d 0a 20 20 20 t = "-Inf";..
c7470 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 }else i
c7480 66 28 20 70 72 65 66 69 78 3d 3d 27 2b 27 20 29 f( prefix=='+' )
c7490 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {..
c74a0 20 62 75 66 70 74 20 3d 20 22 2b 49 6e 66 22 3b bufpt = "+Inf";
c74b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 .. }e
c74c0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
c74d0 20 20 20 20 62 75 66 70 74 20 3d 20 22 49 6e 66 bufpt = "Inf
c74e0 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ";..
c74f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c }.. l
c7500 65 6e 67 74 68 20 3d 20 73 71 6c 69 74 65 33 53 ength = sqlite3S
c7510 74 72 6c 65 6e 33 30 28 62 75 66 70 74 29 3b 0d trlen30(bufpt);.
c7520 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 . bre
c7530 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d ak;.. }
c7540 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
c7550 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 bufpt = buf
c7560 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 0d 0a 20 ;.. /*..
c7570 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 ** If the
c7580 20 66 69 65 6c 64 20 74 79 70 65 20 69 73 20 65 field type is e
c7590 74 47 45 4e 45 52 49 43 2c 20 74 68 65 6e 20 63 tGENERIC, then c
c75a0 6f 6e 76 65 72 74 20 74 6f 20 65 69 74 68 65 72 onvert to either
c75b0 20 65 74 45 58 50 0d 0a 20 20 20 20 20 20 20 20 etEXP..
c75c0 2a 2a 20 6f 72 20 65 74 46 4c 4f 41 54 2c 20 61 ** or etFLOAT, a
c75d0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0d 0a s appropriate...
c75e0 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 */..
c75f0 20 20 20 20 69 66 28 20 78 74 79 70 65 21 3d 65 if( xtype!=e
c7600 74 46 4c 4f 41 54 20 29 7b 0d 0a 20 20 20 20 20 tFLOAT ){..
c7610 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65 20 2b realvalue +
c7620 3d 20 72 6f 75 6e 64 65 72 3b 0d 0a 20 20 20 20 = rounder;..
c7630 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 61 if( realva
c7640 6c 75 65 3e 3d 31 30 2e 30 20 29 7b 20 72 65 61 lue>=10.0 ){ rea
c7650 6c 76 61 6c 75 65 20 2a 3d 20 30 2e 31 3b 20 65 lvalue *= 0.1; e
c7660 78 70 2b 2b 3b 20 7d 0d 0a 20 20 20 20 20 20 20 xp++; }..
c7670 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }.. if(
c7680 78 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49 43 xtype==etGENERIC
c7690 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 ){.. f
c76a0 6c 61 67 5f 72 74 7a 20 3d 20 21 66 6c 61 67 5f lag_rtz = !flag_
c76b0 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 3b 0d 0a alternateform;..
c76c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 if( ex
c76d0 70 3c 2d 34 20 7c 7c 20 65 78 70 3e 70 72 65 63 p<-4 || exp>prec
c76e0 69 73 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 20 20 ision ){..
c76f0 20 20 20 20 20 20 78 74 79 70 65 20 3d 20 65 74 xtype = et
c7700 45 58 50 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 EXP;..
c7710 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
c7720 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 precision =
c7730 70 72 65 63 69 73 69 6f 6e 20 2d 20 65 78 70 3b precision - exp;
c7740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 74 .. xt
c7750 79 70 65 20 3d 20 65 74 46 4c 4f 41 54 3b 0d 0a ype = etFLOAT;..
c7760 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 }..
c7770 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
c7780 20 20 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20 flag_rtz
c7790 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d = 0;.. }.
c77a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 74 79 . if( xty
c77b0 70 65 3d 3d 65 74 45 58 50 20 29 7b 0d 0a 20 20 pe==etEXP ){..
c77c0 20 20 20 20 20 20 20 20 65 32 20 3d 20 30 3b 0d e2 = 0;.
c77d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d . }else{.
c77e0 0a 20 20 20 20 20 20 20 20 20 20 65 32 20 3d 20 . e2 =
c77f0 65 78 70 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d exp;.. }.
c7800 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 32 2b . if( e2+
c7810 70 72 65 63 69 73 69 6f 6e 2b 77 69 64 74 68 20 precision+width
c7820 3e 20 65 74 42 55 46 53 49 5a 45 20 2d 20 31 35 > etBUFSIZE - 15
c7830 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 ){.. b
c7840 75 66 70 74 20 3d 20 7a 45 78 74 72 61 20 3d 20 ufpt = zExtra =
c7850 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 65 sqlite3Malloc( e
c7860 32 2b 70 72 65 63 69 73 69 6f 6e 2b 77 69 64 74 2+precision+widt
c7870 68 2b 31 35 20 29 3b 0d 0a 20 20 20 20 20 20 20 h+15 );..
c7880 20 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20 if( bufpt==0
c7890 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){..
c78a0 70 41 63 63 75 6d 2d 3e 6d 61 6c 6c 6f 63 46 61 pAccum->mallocFa
c78b0 69 6c 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 iled = 1;..
c78c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a return;..
c78d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 }..
c78e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
c78f0 7a 4f 75 74 20 3d 20 62 75 66 70 74 3b 0d 0a 20 zOut = bufpt;..
c7900 20 20 20 20 20 20 20 6e 73 64 20 3d 20 30 3b 0d nsd = 0;.
c7910 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 64 70 . flag_dp
c7920 20 3d 20 28 70 72 65 63 69 73 69 6f 6e 3e 30 20 = (precision>0
c7930 3f 31 3a 30 29 20 7c 20 66 6c 61 67 5f 61 6c 74 ?1:0) | flag_alt
c7940 65 72 6e 61 74 65 66 6f 72 6d 20 7c 20 66 6c 61 ernateform | fla
c7950 67 5f 61 6c 74 66 6f 72 6d 32 3b 0d 0a 20 20 20 g_altform2;..
c7960 20 20 20 20 20 2f 2a 20 54 68 65 20 73 69 67 6e /* The sign
c7970 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 in front of the
c7980 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 20 20 number */..
c7990 20 20 20 20 69 66 28 20 70 72 65 66 69 78 20 29 if( prefix )
c79a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 {.. *(b
c79b0 75 66 70 74 2b 2b 29 20 3d 20 70 72 65 66 69 78 ufpt++) = prefix
c79c0 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
c79d0 20 20 20 20 20 20 2f 2a 20 44 69 67 69 74 73 20 /* Digits
c79e0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 64 65 63 prior to the dec
c79f0 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0d 0a 20 imal point */..
c7a00 20 20 20 20 20 20 20 69 66 28 20 65 32 3c 30 20 if( e2<0
c7a10 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 ){.. *(
c7a20 62 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0d bufpt++) = '0';.
c7a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d . }else{.
c7a40 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 3b . for(;
c7a50 20 65 32 3e 3d 30 3b 20 65 32 2d 2d 29 7b 0d 0a e2>=0; e2--){..
c7a60 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 *(bu
c7a70 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 fpt++) = et_getd
c7a80 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c igit(&realvalue,
c7a90 26 6e 73 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 &nsd);..
c7aa0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a }.. }..
c7ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 /* The d
c7ac0 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0d ecimal point */.
c7ad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 . if( fla
c7ae0 67 5f 64 70 20 29 7b 0d 0a 20 20 20 20 20 20 20 g_dp ){..
c7af0 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 *(bufpt++) =
c7b00 27 2e 27 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d '.';.. }.
c7b10 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 30 22 20 . /* "0"
c7b20 64 69 67 69 74 73 20 61 66 74 65 72 20 74 68 65 digits after the
c7b30 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 62 decimal point b
c7b40 75 74 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 ut before the fi
c7b50 72 73 74 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 rst.. **
c7b60 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 significant digi
c7b70 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 t of the number
c7b80 2a 2f 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 */.. for(
c7b90 65 32 2b 2b 3b 20 65 32 3c 30 3b 20 70 72 65 63 e2++; e2<0; prec
c7ba0 69 73 69 6f 6e 2d 2d 2c 20 65 32 2b 2b 29 7b 0d ision--, e2++){.
c7bb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 . asser
c7bc0 74 28 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 29 t( precision>0 )
c7bd0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 ;.. *(b
c7be0 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0d 0a ufpt++) = '0';..
c7bf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
c7c00 20 20 20 2f 2a 20 53 69 67 6e 69 66 69 63 61 6e /* Significan
c7c10 74 20 64 69 67 69 74 73 20 61 66 74 65 72 20 74 t digits after t
c7c20 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 he decimal point
c7c30 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 77 68 69 */.. whi
c7c40 6c 65 28 20 28 70 72 65 63 69 73 69 6f 6e 2d 2d le( (precision--
c7c50 29 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 )>0 ){..
c7c60 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65 *(bufpt++) = e
c7c70 74 5f 67 65 74 64 69 67 69 74 28 26 72 65 61 6c t_getdigit(&real
c7c80 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0d 0a 20 20 value,&nsd);..
c7c90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
c7ca0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c /* Remove trail
c7cb0 69 6e 67 20 7a 65 72 6f 73 20 61 6e 64 20 74 68 ing zeros and th
c7cc0 65 20 22 2e 22 20 69 66 20 6e 6f 20 64 69 67 69 e "." if no digi
c7cd0 74 73 20 66 6f 6c 6c 6f 77 20 74 68 65 20 22 2e ts follow the ".
c7ce0 22 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 " */.. if
c7cf0 28 20 66 6c 61 67 5f 72 74 7a 20 26 26 20 66 6c ( flag_rtz && fl
c7d00 61 67 5f 64 70 20 29 7b 0d 0a 20 20 20 20 20 20 ag_dp ){..
c7d10 20 20 20 20 77 68 69 6c 65 28 20 62 75 66 70 74 while( bufpt
c7d20 5b 2d 31 5d 3d 3d 27 30 27 20 29 20 2a 28 2d 2d [-1]=='0' ) *(--
c7d30 62 75 66 70 74 29 20 3d 20 30 3b 0d 0a 20 20 20 bufpt) = 0;..
c7d40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 assert( b
c7d50 75 66 70 74 3e 7a 4f 75 74 20 29 3b 0d 0a 20 20 ufpt>zOut );..
c7d60 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70 if( bufp
c7d70 74 5b 2d 31 5d 3d 3d 27 2e 27 20 29 7b 0d 0a 20 t[-1]=='.' ){..
c7d80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 if( f
c7d90 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 20 29 7b 0d lag_altform2 ){.
c7da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a . *
c7db0 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b (bufpt++) = '0';
c7dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 .. }e
c7dd0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
c7de0 20 20 20 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d *(--bufpt) =
c7df0 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 0;..
c7e00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d }.. }.
c7e10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
c7e20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 /* Add the "
c7e30 65 4e 4e 4e 22 20 73 75 66 66 69 78 20 2a 2f 0d eNNN" suffix */.
c7e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 74 79 . if( xty
c7e50 70 65 3d 3d 65 74 45 58 50 20 29 7b 0d 0a 20 20 pe==etEXP ){..
c7e60 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b *(bufpt+
c7e70 2b 29 20 3d 20 61 44 69 67 69 74 73 5b 69 6e 66 +) = aDigits[inf
c7e80 6f 70 2d 3e 63 68 61 72 73 65 74 5d 3b 0d 0a 20 op->charset];..
c7e90 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 if( exp
c7ea0 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 <0 ){..
c7eb0 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 *(bufpt++) =
c7ec0 27 2d 27 3b 20 65 78 70 20 3d 20 2d 65 78 70 3b '-'; exp = -exp;
c7ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 .. }els
c7ee0 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 e{..
c7ef0 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2b 27 *(bufpt++) = '+'
c7f00 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a ;.. }..
c7f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 if( ex
c7f20 70 3e 3d 31 30 30 20 29 7b 0d 0a 20 20 20 20 20 p>=100 ){..
c7f30 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b *(bufpt++
c7f40 29 20 3d 20 28 63 68 61 72 29 28 28 65 78 70 2f ) = (char)((exp/
c7f50 31 30 30 29 2b 27 30 27 29 3b 20 20 20 20 20 20 100)+'0');
c7f60 20 20 2f 2a 20 31 30 30 27 73 20 64 69 67 69 74 /* 100's digit
c7f70 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 */..
c7f80 20 65 78 70 20 25 3d 20 31 30 30 3b 0d 0a 20 20 exp %= 100;..
c7f90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
c7fa0 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 *(bufpt++)
c7fb0 3d 20 28 63 68 61 72 29 28 65 78 70 2f 31 30 2b = (char)(exp/10+
c7fc0 27 30 27 29 3b 20 20 20 20 20 20 20 20 20 20 20 '0');
c7fd0 20 20 2f 2a 20 31 30 27 73 20 64 69 67 69 74 20 /* 10's digit
c7fe0 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 */.. *(
c7ff0 62 75 66 70 74 2b 2b 29 20 3d 20 28 63 68 61 72 bufpt++) = (char
c8000 29 28 65 78 70 25 31 30 2b 27 30 27 29 3b 20 20 )(exp%10+'0');
c8010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 27 /* 1'
c8020 73 20 64 69 67 69 74 20 2a 2f 0d 0a 20 20 20 20 s digit */..
c8030 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 2a }.. *
c8040 62 75 66 70 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 bufpt = 0;....
c8050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e /* The con
c8060 76 65 72 74 65 64 20 6e 75 6d 62 65 72 20 69 73 verted number is
c8070 20 69 6e 20 62 75 66 5b 5d 20 61 6e 64 20 7a 65 in buf[] and ze
c8080 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 2e 20 4f ro terminated. O
c8090 75 74 70 75 74 20 69 74 2e 0d 0a 20 20 20 20 20 utput it...
c80a0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 ** Note that
c80b0 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e the number is in
c80c0 20 74 68 65 20 75 73 75 61 6c 20 6f 72 64 65 72 the usual order
c80d0 2c 20 6e 6f 74 20 72 65 76 65 72 73 65 64 20 61 , not reversed a
c80e0 73 20 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 s with..
c80f0 2a 2a 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 ** integer conve
c8100 72 73 69 6f 6e 73 2e 20 2a 2f 0d 0a 20 20 20 20 rsions. */..
c8110 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69 6e length = (in
c8120 74 29 28 62 75 66 70 74 2d 7a 4f 75 74 29 3b 0d t)(bufpt-zOut);.
c8130 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d . bufpt =
c8140 20 7a 4f 75 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 zOut;....
c8150 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 /* Special cas
c8160 65 3a 20 20 41 64 64 20 6c 65 61 64 69 6e 67 20 e: Add leading
c8170 7a 65 72 6f 73 20 69 66 20 74 68 65 20 66 6c 61 zeros if the fla
c8180 67 5f 7a 65 72 6f 70 61 64 20 66 6c 61 67 20 69 g_zeropad flag i
c8190 73 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 s.. ** se
c81a0 74 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 t and we are not
c81b0 20 6c 65 66 74 20 6a 75 73 74 69 66 69 65 64 20 left justified
c81c0 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 */.. if(
c81d0 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 26 26 20 flag_zeropad &&
c81e0 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 !flag_leftjustif
c81f0 79 20 26 26 20 6c 65 6e 67 74 68 20 3c 20 77 69 y && length < wi
c8200 64 74 68 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 dth){..
c8210 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 20 20 20 int i;..
c8220 20 20 20 69 6e 74 20 6e 50 61 64 20 3d 20 77 69 int nPad = wi
c8230 64 74 68 20 2d 20 6c 65 6e 67 74 68 3b 0d 0a 20 dth - length;..
c8240 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 77 for(i=w
c8250 69 64 74 68 3b 20 69 3e 3d 6e 50 61 64 3b 20 69 idth; i>=nPad; i
c8260 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 --){..
c8270 20 20 62 75 66 70 74 5b 69 5d 20 3d 20 62 75 66 bufpt[i] = buf
c8280 70 74 5b 69 2d 6e 50 61 64 5d 3b 0d 0a 20 20 20 pt[i-nPad];..
c8290 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
c82a0 20 20 20 20 69 20 3d 20 70 72 65 66 69 78 21 3d i = prefix!=
c82b0 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68 0;.. wh
c82c0 69 6c 65 28 20 6e 50 61 64 2d 2d 20 29 20 62 75 ile( nPad-- ) bu
c82d0 66 70 74 5b 69 2b 2b 5d 20 3d 20 27 30 27 3b 0d fpt[i++] = '0';.
c82e0 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74 . lengt
c82f0 68 20 3d 20 77 69 64 74 68 3b 0d 0a 20 20 20 20 h = width;..
c8300 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a }..#endif /*
c8310 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
c8320 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 _OMIT_FLOATING_P
c8330 4f 49 4e 54 29 20 2a 2f 0d 0a 20 20 20 20 20 20 OINT) */..
c8340 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 break;..
c8350 63 61 73 65 20 65 74 53 49 5a 45 3a 0d 0a 20 20 case etSIZE:..
c8360 20 20 20 20 20 20 2a 28 76 61 5f 61 72 67 28 61 *(va_arg(a
c8370 70 2c 69 6e 74 2a 29 29 20 3d 20 70 41 63 63 75 p,int*)) = pAccu
c8380 6d 2d 3e 6e 43 68 61 72 3b 0d 0a 20 20 20 20 20 m->nChar;..
c8390 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 length = widt
c83a0 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 h = 0;..
c83b0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 break;.. ca
c83c0 73 65 20 65 74 50 45 52 43 45 4e 54 3a 0d 0a 20 se etPERCENT:..
c83d0 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 buf[0] =
c83e0 27 25 27 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 '%';.. bu
c83f0 66 70 74 20 3d 20 62 75 66 3b 0d 0a 20 20 20 20 fpt = buf;..
c8400 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0d length = 1;.
c8410 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d . break;.
c8420 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 43 48 . case etCH
c8430 41 52 58 3a 0d 0a 20 20 20 20 20 20 20 20 63 20 ARX:.. c
c8440 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 = va_arg(ap,int)
c8450 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30 ;.. buf[0
c8460 5d 20 3d 20 28 63 68 61 72 29 63 3b 0d 0a 20 20 ] = (char)c;..
c8470 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 if( precis
c8480 69 6f 6e 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 20 ion>=0 ){..
c8490 20 20 20 20 20 66 6f 72 28 69 64 78 3d 31 3b 20 for(idx=1;
c84a0 69 64 78 3c 70 72 65 63 69 73 69 6f 6e 3b 20 69 idx<precision; i
c84b0 64 78 2b 2b 29 20 62 75 66 5b 69 64 78 5d 20 3d dx++) buf[idx] =
c84c0 20 28 63 68 61 72 29 63 3b 0d 0a 20 20 20 20 20 (char)c;..
c84d0 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 70 72 length = pr
c84e0 65 63 69 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 ecision;..
c84f0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
c8500 20 20 20 20 6c 65 6e 67 74 68 20 3d 31 3b 0d 0a length =1;..
c8510 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
c8520 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0d bufpt = buf;.
c8530 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d . break;.
c8540 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 54 . case etST
c8550 52 49 4e 47 3a 0d 0a 20 20 20 20 20 20 63 61 73 RING:.. cas
c8560 65 20 65 74 44 59 4e 53 54 52 49 4e 47 3a 0d 0a e etDYNSTRING:..
c8570 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 bufpt =
c8580 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 va_arg(ap,char*)
c8590 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 ;.. if( b
c85a0 75 66 70 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 ufpt==0 ){..
c85b0 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 22 22 bufpt = ""
c85c0 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 ;.. }else
c85d0 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 44 59 if( xtype==etDY
c85e0 4e 53 54 52 49 4e 47 20 29 7b 0d 0a 20 20 20 20 NSTRING ){..
c85f0 20 20 20 20 20 20 7a 45 78 74 72 61 20 3d 20 62 zExtra = b
c8600 75 66 70 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d ufpt;.. }
c8610 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 .. if( pr
c8620 65 63 69 73 69 6f 6e 3e 3d 30 20 29 7b 0d 0a 20 ecision>=0 ){..
c8630 20 20 20 20 20 20 20 20 20 66 6f 72 28 6c 65 6e for(len
c8640 67 74 68 3d 30 3b 20 6c 65 6e 67 74 68 3c 70 72 gth=0; length<pr
c8650 65 63 69 73 69 6f 6e 20 26 26 20 62 75 66 70 74 ecision && bufpt
c8660 5b 6c 65 6e 67 74 68 5d 3b 20 6c 65 6e 67 74 68 [length]; length
c8670 2b 2b 29 7b 7d 0d 0a 20 20 20 20 20 20 20 20 7d ++){}.. }
c8680 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 else{..
c8690 20 6c 65 6e 67 74 68 20 3d 20 73 71 6c 69 74 65 length = sqlite
c86a0 33 53 74 72 6c 65 6e 33 30 28 62 75 66 70 74 29 3Strlen30(bufpt)
c86b0 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
c86c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
c86d0 20 20 20 20 63 61 73 65 20 65 74 53 51 4c 45 53 case etSQLES
c86e0 43 41 50 45 3a 0d 0a 20 20 20 20 20 20 63 61 73 CAPE:.. cas
c86f0 65 20 65 74 53 51 4c 45 53 43 41 50 45 32 3a 0d e etSQLESCAPE2:.
c8700 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 51 . case etSQ
c8710 4c 45 53 43 41 50 45 33 3a 20 7b 0d 0a 20 20 20 LESCAPE3: {..
c8720 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b int i, j, k
c8730 2c 20 6e 2c 20 69 73 6e 75 6c 6c 3b 0d 0a 20 20 , n, isnull;..
c8740 20 20 20 20 20 20 69 6e 74 20 6e 65 65 64 51 75 int needQu
c8750 6f 74 65 3b 0d 0a 20 20 20 20 20 20 20 20 63 68 ote;.. ch
c8760 61 72 20 63 68 3b 0d 0a 20 20 20 20 20 20 20 20 ar ch;..
c8770 63 68 61 72 20 71 20 3d 20 28 28 78 74 79 70 65 char q = ((xtype
c8780 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 33 29 3f ==etSQLESCAPE3)?
c8790 27 22 27 3a 27 5c 27 27 29 3b 20 20 20 2f 2a 20 '"':'\''); /*
c87a0 51 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 Quote character
c87b0 2a 2f 0d 0a 20 20 20 20 20 20 20 20 63 68 61 72 */.. char
c87c0 20 2a 65 73 63 61 72 67 20 3d 20 76 61 5f 61 72 *escarg = va_ar
c87d0 67 28 61 70 2c 63 68 61 72 2a 29 3b 0d 0a 20 20 g(ap,char*);..
c87e0 20 20 20 20 20 20 69 73 6e 75 6c 6c 20 3d 20 65 isnull = e
c87f0 73 63 61 72 67 3d 3d 30 3b 0d 0a 20 20 20 20 20 scarg==0;..
c8800 20 20 20 69 66 28 20 69 73 6e 75 6c 6c 20 29 20 if( isnull )
c8810 65 73 63 61 72 67 20 3d 20 28 78 74 79 70 65 3d escarg = (xtype=
c8820 3d 65 74 53 51 4c 45 53 43 41 50 45 32 20 3f 20 =etSQLESCAPE2 ?
c8830 22 4e 55 4c 4c 22 20 3a 20 22 28 4e 55 4c 4c 29 "NULL" : "(NULL)
c8840 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 6b 20 3d ");.. k =
c8850 20 70 72 65 63 69 73 69 6f 6e 3b 0d 0a 20 20 20 precision;..
c8860 20 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 for(i=n=0;
c8870 6b 21 3d 30 20 26 26 20 28 63 68 3d 65 73 63 61 k!=0 && (ch=esca
c8880 72 67 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 rg[i])!=0; i++,
c8890 6b 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 k--){..
c88a0 20 69 66 28 20 63 68 3d 3d 71 20 29 20 20 6e 2b if( ch==q ) n+
c88b0 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 +;.. }..
c88c0 20 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65 needQuote
c88d0 20 3d 20 21 69 73 6e 75 6c 6c 20 26 26 20 78 74 = !isnull && xt
c88e0 79 70 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 ype==etSQLESCAPE
c88f0 32 3b 0d 0a 20 20 20 20 20 20 20 20 6e 20 2b 3d 2;.. n +=
c8900 20 69 20 2b 20 31 20 2b 20 6e 65 65 64 51 75 6f i + 1 + needQuo
c8910 74 65 2a 32 3b 0d 0a 20 20 20 20 20 20 20 20 69 te*2;.. i
c8920 66 28 20 6e 3e 65 74 42 55 46 53 49 5a 45 20 29 f( n>etBUFSIZE )
c8930 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 {.. buf
c8940 70 74 20 3d 20 7a 45 78 74 72 61 20 3d 20 73 71 pt = zExtra = sq
c8950 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 lite3Malloc( n )
c8960 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ;.. if(
c8970 20 62 75 66 70 74 3d 3d 30 20 29 7b 0d 0a 20 20 bufpt==0 ){..
c8980 20 20 20 20 20 20 20 20 20 20 70 41 63 63 75 6d pAccum
c8990 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
c89a0 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 1;..
c89b0 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 return;..
c89c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d }.. }
c89d0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 else{..
c89e0 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0d 0a 20 bufpt = buf;..
c89f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
c8a00 20 20 6a 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 j = 0;..
c8a10 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 if( needQuote
c8a20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 71 ) bufpt[j++] = q
c8a30 3b 0d 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 69 ;.. k = i
c8a40 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 ;.. for(i
c8a50 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0d 0a =0; i<k; i++){..
c8a60 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b bufpt[
c8a70 6a 2b 2b 5d 20 3d 20 63 68 20 3d 20 65 73 63 61 j++] = ch = esca
c8a80 72 67 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 20 20 rg[i];..
c8a90 20 20 69 66 28 20 63 68 3d 3d 71 20 29 20 62 75 if( ch==q ) bu
c8aa0 66 70 74 5b 6a 2b 2b 5d 20 3d 20 63 68 3b 0d 0a fpt[j++] = ch;..
c8ab0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
c8ac0 20 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 if( needQuote
c8ad0 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 ) bufpt[j++] =
c8ae0 71 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 66 70 q;.. bufp
c8af0 74 5b 6a 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 20 t[j] = 0;..
c8b00 20 20 20 6c 65 6e 67 74 68 20 3d 20 6a 3b 0d 0a length = j;..
c8b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 /* The p
c8b20 72 65 63 69 73 69 6f 6e 20 69 6e 20 25 71 20 61 recision in %q a
c8b30 6e 64 20 25 51 20 6d 65 61 6e 73 20 68 6f 77 20 nd %Q means how
c8b40 6d 61 6e 79 20 69 6e 70 75 74 20 63 68 61 72 61 many input chara
c8b50 63 74 65 72 73 20 74 6f 0d 0a 20 20 20 20 20 20 cters to..
c8b60 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 2c 20 6e 6f ** consume, no
c8b70 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
c8b80 74 68 65 20 6f 75 74 70 75 74 2e 2e 2e 0d 0a 20 the output.....
c8b90 20 20 20 20 20 20 20 2a 2a 20 69 66 28 20 70 72 ** if( pr
c8ba0 65 63 69 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 ecision>=0 && pr
c8bb0 65 63 69 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 ecision<length )
c8bc0 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73 length = precis
c8bd0 69 6f 6e 3b 20 2a 2f 0d 0a 20 20 20 20 20 20 20 ion; */..
c8be0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d break;.. }
c8bf0 0d 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 54 .. case etT
c8c00 4f 4b 45 4e 3a 20 7b 0d 0a 20 20 20 20 20 20 20 OKEN: {..
c8c10 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d Token *pToken =
c8c20 20 76 61 5f 61 72 67 28 61 70 2c 20 54 6f 6b 65 va_arg(ap, Toke
c8c30 6e 2a 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 n*);.. if
c8c40 28 20 70 54 6f 6b 65 6e 20 29 7b 0d 0a 20 20 20 ( pToken ){..
c8c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 sqlite3St
c8c60 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 rAccumAppend(pAc
c8c70 63 75 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 cum, (const char
c8c80 2a 29 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f *)pToken->z, pTo
c8c90 6b 65 6e 2d 3e 6e 29 3b 0d 0a 20 20 20 20 20 20 ken->n);..
c8ca0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 6c 65 6e }.. len
c8cb0 67 74 68 20 3d 20 77 69 64 74 68 20 3d 20 30 3b gth = width = 0;
c8cc0 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b .. break;
c8cd0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
c8ce0 20 63 61 73 65 20 65 74 53 52 43 4c 49 53 54 3a case etSRCLIST:
c8cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 72 63 4c {.. SrcL
c8d00 69 73 74 20 2a 70 53 72 63 20 3d 20 76 61 5f 61 ist *pSrc = va_a
c8d10 72 67 28 61 70 2c 20 53 72 63 4c 69 73 74 2a 29 rg(ap, SrcList*)
c8d20 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b ;.. int k
c8d30 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e = va_arg(ap, in
c8d40 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 t);.. str
c8d50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d uct SrcList_item
c8d60 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d *pItem = &pSrc-
c8d70 3e 61 5b 6b 5d 3b 0d 0a 20 20 20 20 20 20 20 20 >a[k];..
c8d80 61 73 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 assert( k>=0 &&
c8d90 6b 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0d k<pSrc->nSrc );.
c8da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 . if( pIt
c8db0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 29 7b em->zDatabase ){
c8dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 .. sqli
c8dd0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e te3StrAccumAppen
c8de0 64 28 70 41 63 63 75 6d 2c 20 70 49 74 65 6d 2d d(pAccum, pItem-
c8df0 3e 7a 44 61 74 61 62 61 73 65 2c 20 2d 31 29 3b >zDatabase, -1);
c8e00 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 .. sqli
c8e10 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e te3StrAccumAppen
c8e20 64 28 70 41 63 63 75 6d 2c 20 22 2e 22 2c 20 31 d(pAccum, ".", 1
c8e30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
c8e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 sqlite3St
c8e50 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 rAccumAppend(pAc
c8e60 63 75 6d 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d cum, pItem->zNam
c8e70 65 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 20 20 20 e, -1);..
c8e80 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 20 length = width
c8e90 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 = 0;.. br
c8ea0 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 eak;.. }..
c8eb0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d default: {.
c8ec0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
c8ed0 20 78 74 79 70 65 3d 3d 65 74 49 4e 56 41 4c 49 xtype==etINVALI
c8ee0 44 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 D );.. re
c8ef0 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a turn;.. }..
c8f00 20 20 20 20 7d 2f 2a 20 45 6e 64 20 73 77 69 74 }/* End swit
c8f10 63 68 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d ch over the form
c8f20 61 74 20 74 79 70 65 20 2a 2f 0d 0a 20 20 20 20 at type */..
c8f30 2f 2a 0d 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 /*.. ** The t
c8f40 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 ext of the conve
c8f50 72 73 69 6f 6e 20 69 73 20 70 6f 69 6e 74 65 64 rsion is pointed
c8f60 20 74 6f 20 62 79 20 22 62 75 66 70 74 22 20 61 to by "bufpt" a
c8f70 6e 64 20 69 73 0d 0a 20 20 20 20 2a 2a 20 22 6c nd is.. ** "l
c8f80 65 6e 67 74 68 22 20 63 68 61 72 61 63 74 65 72 ength" character
c8f90 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20 66 69 65 s long. The fie
c8fa0 6c 64 20 77 69 64 74 68 20 69 73 20 22 77 69 64 ld width is "wid
c8fb0 74 68 22 2e 20 20 44 6f 0d 0a 20 20 20 20 2a 2a th". Do.. **
c8fc0 20 74 68 65 20 6f 75 74 70 75 74 2e 0d 0a 20 20 the output...
c8fd0 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 21 66 */.. if( !f
c8fe0 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 lag_leftjustify
c8ff0 29 7b 0d 0a 20 20 20 20 20 20 72 65 67 69 73 74 ){.. regist
c9000 65 72 20 69 6e 74 20 6e 73 70 61 63 65 3b 0d 0a er int nspace;..
c9010 20 20 20 20 20 20 6e 73 70 61 63 65 20 3d 20 77 nspace = w
c9020 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0d 0a 20 20 idth-length;..
c9030 20 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 if( nspace>0
c9040 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c ){.. sql
c9050 69 74 65 33 41 70 70 65 6e 64 53 70 61 63 65 28 ite3AppendSpace(
c9060 70 41 63 63 75 6d 2c 20 6e 73 70 61 63 65 29 3b pAccum, nspace);
c9070 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
c9080 0d 0a 20 20 20 20 69 66 28 20 6c 65 6e 67 74 68 .. if( length
c9090 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c >0 ){.. sql
c90a0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 ite3StrAccumAppe
c90b0 6e 64 28 70 41 63 63 75 6d 2c 20 62 75 66 70 74 nd(pAccum, bufpt
c90c0 2c 20 6c 65 6e 67 74 68 29 3b 0d 0a 20 20 20 20 , length);..
c90d0 7d 0d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 5f }.. if( flag_
c90e0 6c 65 66 74 6a 75 73 74 69 66 79 20 29 7b 0d 0a leftjustify ){..
c90f0 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 69 register i
c9100 6e 74 20 6e 73 70 61 63 65 3b 0d 0a 20 20 20 20 nt nspace;..
c9110 20 20 6e 73 70 61 63 65 20 3d 20 77 69 64 74 68 nspace = width
c9120 2d 6c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 -length;..
c9130 69 66 28 20 6e 73 70 61 63 65 3e 30 20 29 7b 0d if( nspace>0 ){.
c9140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
c9150 41 70 70 65 6e 64 53 70 61 63 65 28 70 41 63 63 AppendSpace(pAcc
c9160 75 6d 2c 20 6e 73 70 61 63 65 29 3b 0d 0a 20 20 um, nspace);..
c9170 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 }.. }..
c9180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
c9190 45 78 74 72 61 29 3b 0d 0a 20 20 7d 2f 2a 20 45 Extra);.. }/* E
c91a0 6e 64 20 66 6f 72 20 6c 6f 6f 70 20 6f 76 65 72 nd for loop over
c91b0 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 the format stri
c91c0 6e 67 20 2a 2f 0d 0a 7d 20 2f 2a 20 45 6e 64 20 ng */..} /* End
c91d0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a of function */..
c91e0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 ../*..** Append
c91f0 4e 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20 N bytes of text
c9200 66 72 6f 6d 20 7a 20 74 6f 20 74 68 65 20 53 74 from z to the St
c9210 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0d 0a rAccum object...
c9220 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
c9230 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 TE void sqlite3S
c9240 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 53 74 trAccumAppend(St
c9250 72 41 63 63 75 6d 20 2a 70 2c 20 63 6f 6e 73 74 rAccum *p, const
c9260 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 char *z, int N)
c9270 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d {.. assert( z!=
c9280 30 20 7c 7c 20 4e 3d 3d 30 20 29 3b 0d 0a 20 20 0 || N==0 );..
c9290 69 66 28 20 70 2d 3e 74 6f 6f 42 69 67 20 7c 20 if( p->tooBig |
c92a0 70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 p->mallocFailed
c92b0 29 7b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 ){.. testcase
c92c0 28 70 2d 3e 74 6f 6f 42 69 67 29 3b 0d 0a 20 20 (p->tooBig);..
c92d0 20 20 74 65 73 74 63 61 73 65 28 70 2d 3e 6d 61 testcase(p->ma
c92e0 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0d 0a 20 20 llocFailed);..
c92f0 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a return;.. }..
c9300 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 54 65 assert( p->zTe
c9310 78 74 21 3d 30 20 7c 7c 20 70 2d 3e 6e 43 68 61 xt!=0 || p->nCha
c9320 72 3d 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 4e r==0 );.. if( N
c9330 3c 30 20 29 7b 0d 0a 20 20 20 20 4e 20 3d 20 73 <0 ){.. N = s
c9340 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
c9350 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 4e );.. }.. if( N
c9360 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 7a 3d 3d ==0 || NEVER(z==
c9370 30 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 0) ){.. retur
c9380 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 n;.. }.. if( p
c9390 2d 3e 6e 43 68 61 72 2b 4e 20 3e 3d 20 70 2d 3e ->nChar+N >= p->
c93a0 6e 41 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 63 nAlloc ){.. c
c93b0 68 61 72 20 2a 7a 4e 65 77 3b 0d 0a 20 20 20 20 har *zNew;..
c93c0 69 66 28 20 21 70 2d 3e 75 73 65 4d 61 6c 6c 6f if( !p->useMallo
c93d0 63 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e 74 c ){.. p->t
c93e0 6f 6f 42 69 67 20 3d 20 31 3b 0d 0a 20 20 20 20 ooBig = 1;..
c93f0 20 20 4e 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 N = p->nAlloc
c9400 2d 20 70 2d 3e 6e 43 68 61 72 20 2d 20 31 3b 0d - p->nChar - 1;.
c9410 0a 20 20 20 20 20 20 69 66 28 20 4e 3c 3d 30 20 . if( N<=0
c9420 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 ){.. retu
c9430 72 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 rn;.. }..
c9440 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
c9450 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 28 70 2d char *zOld = (p-
c9460 3e 7a 54 65 78 74 3d 3d 70 2d 3e 7a 42 61 73 65 >zText==p->zBase
c9470 20 3f 20 30 20 3a 20 70 2d 3e 7a 54 65 78 74 29 ? 0 : p->zText)
c9480 3b 0d 0a 20 20 20 20 20 20 69 36 34 20 73 7a 4e ;.. i64 szN
c9490 65 77 20 3d 20 70 2d 3e 6e 43 68 61 72 3b 0d 0a ew = p->nChar;..
c94a0 20 20 20 20 20 20 73 7a 4e 65 77 20 2b 3d 20 4e szNew += N
c94b0 20 2b 20 31 3b 0d 0a 20 20 20 20 20 20 69 66 28 + 1;.. if(
c94c0 20 73 7a 4e 65 77 20 3e 20 70 2d 3e 6d 78 41 6c szNew > p->mxAl
c94d0 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 loc ){..
c94e0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 sqlite3StrAccumR
c94f0 65 73 65 74 28 70 29 3b 0d 0a 20 20 20 20 20 20 eset(p);..
c9500 20 20 70 2d 3e 74 6f 6f 42 69 67 20 3d 20 31 3b p->tooBig = 1;
c9510 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e .. return
c9520 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
c9530 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 6c 6c . p->nAll
c9540 6f 63 20 3d 20 28 69 6e 74 29 73 7a 4e 65 77 3b oc = (int)szNew;
c9550 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
c9560 20 69 66 28 20 70 2d 3e 75 73 65 4d 61 6c 6c 6f if( p->useMallo
c9570 63 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 20 c==1 ){..
c9580 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 zNew = sqlite3D
c9590 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 bRealloc(p->db,
c95a0 7a 4f 6c 64 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 zOld, p->nAlloc)
c95b0 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
c95c0 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 . zNew =
c95d0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 sqlite3_realloc(
c95e0 7a 4f 6c 64 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 zOld, p->nAlloc)
c95f0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
c9600 20 20 69 66 28 20 7a 4e 65 77 20 29 7b 0d 0a 20 if( zNew ){..
c9610 20 20 20 20 20 20 20 69 66 28 20 7a 4f 6c 64 3d if( zOld=
c9620 3d 30 20 26 26 20 70 2d 3e 6e 43 68 61 72 3e 30 =0 && p->nChar>0
c9630 20 29 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 ) memcpy(zNew,
c9640 70 2d 3e 7a 54 65 78 74 2c 20 70 2d 3e 6e 43 68 p->zText, p->nCh
c9650 61 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d ar);.. p-
c9660 3e 7a 54 65 78 74 20 3d 20 7a 4e 65 77 3b 0d 0a >zText = zNew;..
c9670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
c9680 20 20 20 20 20 20 70 2d 3e 6d 61 6c 6c 6f 63 46 p->mallocF
c9690 61 69 6c 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 ailed = 1;..
c96a0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 sqlite3StrAc
c96b0 63 75 6d 52 65 73 65 74 28 70 29 3b 0d 0a 20 20 cumReset(p);..
c96c0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 return;..
c96d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
c96e0 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d }.. assert( p-
c96f0 3e 7a 54 65 78 74 20 29 3b 0d 0a 20 20 6d 65 6d >zText );.. mem
c9700 63 70 79 28 26 70 2d 3e 7a 54 65 78 74 5b 70 2d cpy(&p->zText[p-
c9710 3e 6e 43 68 61 72 5d 2c 20 7a 2c 20 4e 29 3b 0d >nChar], z, N);.
c9720 0a 20 20 70 2d 3e 6e 43 68 61 72 20 2b 3d 20 4e . p->nChar += N
c9730 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 ;..}..../*..** F
c9740 69 6e 69 73 68 20 6f 66 66 20 61 20 73 74 72 69 inish off a stri
c9750 6e 67 20 62 79 20 6d 61 6b 69 6e 67 20 73 75 72 ng by making sur
c9760 65 20 69 74 20 69 73 20 7a 65 72 6f 2d 74 65 72 e it is zero-ter
c9770 6d 69 6e 61 74 65 64 2e 0d 0a 2a 2a 20 52 65 74 minated...** Ret
c9780 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f urn a pointer to
c9790 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 73 the resulting s
c97a0 74 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 tring. Return a
c97b0 20 4e 55 4c 4c 0d 0a 2a 2a 20 70 6f 69 6e 74 65 NULL..** pointe
c97c0 72 20 69 66 20 61 6e 79 20 6b 69 6e 64 20 6f 66 r if any kind of
c97d0 20 65 72 72 6f 72 20 77 61 73 20 65 6e 63 6f 75 error was encou
c97e0 6e 74 65 72 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c ntered...*/..SQL
c97f0 49 54 45 5f 50 52 49 56 41 54 45 20 63 68 61 72 ITE_PRIVATE char
c9800 20 2a 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 *sqlite3StrAccu
c9810 6d 46 69 6e 69 73 68 28 53 74 72 41 63 63 75 6d mFinish(StrAccum
c9820 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 70 2d 3e *p){.. if( p->
c9830 7a 54 65 78 74 20 29 7b 0d 0a 20 20 20 20 70 2d zText ){.. p-
c9840 3e 7a 54 65 78 74 5b 70 2d 3e 6e 43 68 61 72 5d >zText[p->nChar]
c9850 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 70 = 0;.. if( p
c9860 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 26 26 20 70 ->useMalloc && p
c9870 2d 3e 7a 54 65 78 74 3d 3d 70 2d 3e 7a 42 61 73 ->zText==p->zBas
c9880 65 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 e ){.. if(
c9890 70 2d 3e 75 73 65 4d 61 6c 6c 6f 63 3d 3d 31 20 p->useMalloc==1
c98a0 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a ){.. p->z
c98b0 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 44 62 Text = sqlite3Db
c98c0 4d 61 6c 6c 6f 63 52 61 77 28 70 2d 3e 64 62 2c MallocRaw(p->db,
c98d0 20 70 2d 3e 6e 43 68 61 72 2b 31 20 29 3b 0d 0a p->nChar+1 );..
c98e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
c98f0 20 20 20 20 20 20 70 2d 3e 7a 54 65 78 74 20 3d p->zText =
c9900 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
c9910 70 2d 3e 6e 43 68 61 72 2b 31 29 3b 0d 0a 20 20 p->nChar+1);..
c9920 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 }.. if(
c9930 20 70 2d 3e 7a 54 65 78 74 20 29 7b 0d 0a 20 20 p->zText ){..
c9940 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e memcpy(p->
c9950 7a 54 65 78 74 2c 20 70 2d 3e 7a 42 61 73 65 2c zText, p->zBase,
c9960 20 70 2d 3e 6e 43 68 61 72 2b 31 29 3b 0d 0a 20 p->nChar+1);..
c9970 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
c9980 20 20 20 20 20 70 2d 3e 6d 61 6c 6c 6f 63 46 61 p->mallocFa
c9990 69 6c 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 iled = 1;..
c99a0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a }.. }.. }..
c99b0 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 54 65 78 return p->zTex
c99c0 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 t;..}..../*..**
c99d0 52 65 73 65 74 20 61 6e 20 53 74 72 41 63 63 75 Reset an StrAccu
c99e0 6d 20 73 74 72 69 6e 67 2e 20 20 52 65 63 6c 61 m string. Recla
c99f0 69 6d 20 61 6c 6c 20 6d 61 6c 6c 6f 63 65 64 20 im all malloced
c9a00 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c memory...*/..SQL
c9a10 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
c9a20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d sqlite3StrAccum
c9a30 52 65 73 65 74 28 53 74 72 41 63 63 75 6d 20 2a Reset(StrAccum *
c9a40 70 29 7b 0d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 p){.. if( p->zT
c9a50 65 78 74 21 3d 70 2d 3e 7a 42 61 73 65 20 29 7b ext!=p->zBase ){
c9a60 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 65 .. if( p->use
c9a70 4d 61 6c 6c 6f 63 3d 3d 31 20 29 7b 0d 0a 20 20 Malloc==1 ){..
c9a80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
c9a90 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 54 65 78 e(p->db, p->zTex
c9aa0 74 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d t);.. }else{.
c9ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 . sqlite3_f
c9ac0 72 65 65 28 70 2d 3e 7a 54 65 78 74 29 3b 0d 0a ree(p->zText);..
c9ad0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 70 2d }.. }.. p-
c9ae0 3e 7a 54 65 78 74 20 3d 20 30 3b 0d 0a 7d 0d 0a >zText = 0;..}..
c9af0 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c ../*..** Initial
c9b00 69 7a 65 20 61 20 73 74 72 69 6e 67 20 61 63 63 ize a string acc
c9b10 75 6d 75 6c 61 74 6f 72 0d 0a 2a 2f 0d 0a 53 51 umulator..*/..SQ
c9b20 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
c9b30 64 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 d sqlite3StrAccu
c9b40 6d 49 6e 69 74 28 53 74 72 41 63 63 75 6d 20 2a mInit(StrAccum *
c9b50 70 2c 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 p, char *zBase,
c9b60 69 6e 74 20 6e 2c 20 69 6e 74 20 6d 78 29 7b 0d int n, int mx){.
c9b70 0a 20 20 70 2d 3e 7a 54 65 78 74 20 3d 20 70 2d . p->zText = p-
c9b80 3e 7a 42 61 73 65 20 3d 20 7a 42 61 73 65 3b 0d >zBase = zBase;.
c9b90 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0d 0a 20 . p->db = 0;..
c9ba0 20 70 2d 3e 6e 43 68 61 72 20 3d 20 30 3b 0d 0a p->nChar = 0;..
c9bb0 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b p->nAlloc = n;
c9bc0 0d 0a 20 20 70 2d 3e 6d 78 41 6c 6c 6f 63 20 3d .. p->mxAlloc =
c9bd0 20 6d 78 3b 0d 0a 20 20 70 2d 3e 75 73 65 4d 61 mx;.. p->useMa
c9be0 6c 6c 6f 63 20 3d 20 31 3b 0d 0a 20 20 70 2d 3e lloc = 1;.. p->
c9bf0 74 6f 6f 42 69 67 20 3d 20 30 3b 0d 0a 20 20 70 tooBig = 0;.. p
c9c00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
c9c10 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 0;..}..../*..**
c9c20 20 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f Print into memo
c9c30 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d ry obtained from
c9c40 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e sqliteMalloc().
c9c50 20 20 55 73 65 20 74 68 65 20 69 6e 74 65 72 6e Use the intern
c9c60 61 6c 0d 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 al..** %-convers
c9c70 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0d ion extensions..
c9c80 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
c9c90 41 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 ATE char *sqlite
c9ca0 33 56 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65 3VMPrintf(sqlite
c9cb0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 3 *db, const cha
c9cc0 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c r *zFormat, va_l
c9cd0 69 73 74 20 61 70 29 7b 0d 0a 20 20 63 68 61 72 ist ap){.. char
c9ce0 20 2a 7a 3b 0d 0a 20 20 63 68 61 72 20 7a 42 61 *z;.. char zBa
c9cf0 73 65 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f se[SQLITE_PRINT_
c9d00 42 55 46 5f 53 49 5a 45 5d 3b 0d 0a 20 20 53 74 BUF_SIZE];.. St
c9d10 72 41 63 63 75 6d 20 61 63 63 3b 0d 0a 20 20 61 rAccum acc;.. a
c9d20 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0d ssert( db!=0 );.
c9d30 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 . sqlite3StrAcc
c9d40 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 7a 42 61 umInit(&acc, zBa
c9d50 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61 73 65 se, sizeof(zBase
c9d60 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ),..
c9d70 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c db->aL
c9d80 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 imit[SQLITE_LIMI
c9d90 54 5f 4c 45 4e 47 54 48 5d 29 3b 0d 0a 20 20 61 T_LENGTH]);.. a
c9da0 63 63 2e 64 62 20 3d 20 64 62 3b 0d 0a 20 20 73 cc.db = db;.. s
c9db0 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28 26 qlite3VXPrintf(&
c9dc0 61 63 63 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c acc, 1, zFormat,
c9dd0 20 61 70 29 3b 0d 0a 20 20 7a 20 3d 20 73 71 6c ap);.. z = sql
c9de0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 ite3StrAccumFini
c9df0 73 68 28 26 61 63 63 29 3b 0d 0a 20 20 69 66 28 sh(&acc);.. if(
c9e00 20 61 63 63 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 acc.mallocFaile
c9e10 64 20 29 7b 0d 0a 20 20 20 20 64 62 2d 3e 6d 61 d ){.. db->ma
c9e20 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0d llocFailed = 1;.
c9e30 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 7a . }.. return z
c9e40 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 ;..}..../*..** P
c9e50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 rint into memory
c9e60 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
c9e70 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 qliteMalloc().
c9e80 55 73 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c Use the internal
c9e90 0d 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f ..** %-conversio
c9ea0 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0d 0a 2a n extensions...*
c9eb0 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
c9ec0 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4d E char *sqlite3M
c9ed0 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 20 2a Printf(sqlite3 *
c9ee0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a db, const char *
c9ef0 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a zFormat, ...){..
c9f00 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 va_list ap;..
c9f10 20 63 68 61 72 20 2a 7a 3b 0d 0a 20 20 76 61 5f char *z;.. va_
c9f20 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
c9f30 74 29 3b 0d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 t);.. z = sqlit
c9f40 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a e3VMPrintf(db, z
c9f50 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 Format, ap);..
c9f60 76 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 20 20 72 va_end(ap);.. r
c9f70 65 74 75 72 6e 20 7a 3b 0d 0a 7d 0d 0a 0d 0a 2f eturn z;..}..../
c9f80 2a 0d 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 *..** Like sqlit
c9f90 65 33 4d 50 72 69 6e 74 66 28 29 2c 20 62 75 74 e3MPrintf(), but
c9fa0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44 62 46 call sqlite3DbF
c9fb0 72 65 65 28 29 20 6f 6e 20 7a 53 74 72 20 61 66 ree() on zStr af
c9fc0 74 65 72 20 66 6f 72 6d 61 74 74 69 6e 67 0d 0a ter formatting..
c9fd0 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e ** the string an
c9fe0 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 6e d before returnn
c9ff0 69 6e 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 ing. This routi
ca000 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 ne is intended t
ca010 6f 20 62 65 20 75 73 65 64 0d 0a 2a 2a 20 74 6f o be used..** to
ca020 20 6d 6f 64 69 66 79 20 61 6e 20 65 78 69 73 74 modify an exist
ca030 69 6e 67 20 73 74 72 69 6e 67 2e 20 20 46 6f 72 ing string. For
ca040 20 65 78 61 6d 70 6c 65 3a 0d 0a 2a 2a 0d 0a 2a example:..**..*
ca050 2a 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 * x = sqli
ca060 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 78 te3MPrintf(db, x
ca070 2c 20 22 70 72 65 66 69 78 20 25 73 20 73 75 66 , "prefix %s suf
ca080 66 69 78 22 2c 20 78 29 3b 0d 0a 2a 2a 0d 0a 2a fix", x);..**..*
ca090 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
ca0a0 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4d E char *sqlite3M
ca0b0 41 70 70 65 6e 64 66 28 73 71 6c 69 74 65 33 20 Appendf(sqlite3
ca0c0 2a 64 62 2c 20 63 68 61 72 20 2a 7a 53 74 72 2c *db, char *zStr,
ca0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
ca0e0 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 rmat, ...){.. v
ca0f0 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20 63 68 a_list ap;.. ch
ca100 61 72 20 2a 7a 3b 0d 0a 20 20 76 61 5f 73 74 61 ar *z;.. va_sta
ca110 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
ca120 0d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 .. z = sqlite3V
ca130 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 MPrintf(db, zFor
ca140 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 61 5f mat, ap);.. va_
ca150 65 6e 64 28 61 70 29 3b 0d 0a 20 20 73 71 6c 69 end(ap);.. sqli
ca160 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 te3DbFree(db, zS
ca170 74 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 7a tr);.. return z
ca180 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 ;..}..../*..** P
ca190 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 rint into memory
ca1a0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
ca1b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e qlite3_malloc().
ca1c0 20 20 4f 6d 69 74 20 74 68 65 20 69 6e 74 65 72 Omit the inter
ca1d0 6e 61 6c 0d 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 nal..** %-conver
ca1e0 73 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e sion extensions.
ca1f0 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 ..*/..SQLITE_API
ca200 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 char *sqlite3_v
ca210 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 mprintf(const ch
ca220 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f ar *zFormat, va_
ca230 6c 69 73 74 20 61 70 29 7b 0d 0a 20 20 63 68 61 list ap){.. cha
ca240 72 20 2a 7a 3b 0d 0a 20 20 63 68 61 72 20 7a 42 r *z;.. char zB
ca250 61 73 65 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54 ase[SQLITE_PRINT
ca260 5f 42 55 46 5f 53 49 5a 45 5d 3b 0d 0a 20 20 53 _BUF_SIZE];.. S
ca270 74 72 41 63 63 75 6d 20 61 63 63 3b 0d 0a 23 69 trAccum acc;..#i
ca280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
ca290 54 5f 41 55 54 4f 49 4e 49 54 0d 0a 20 20 69 66 T_AUTOINIT.. if
ca2a0 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 ( sqlite3_initia
ca2b0 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 lize() ) return
ca2c0 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 73 71 0;..#endif.. sq
ca2d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 lite3StrAccumIni
ca2e0 74 28 26 61 63 63 2c 20 7a 42 61 73 65 2c 20 73 t(&acc, zBase, s
ca2f0 69 7a 65 6f 66 28 7a 42 61 73 65 29 2c 20 53 51 izeof(zBase), SQ
ca300 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 LITE_MAX_LENGTH)
ca310 3b 0d 0a 20 20 61 63 63 2e 75 73 65 4d 61 6c 6c ;.. acc.useMall
ca320 6f 63 20 3d 20 32 3b 0d 0a 20 20 73 71 6c 69 74 oc = 2;.. sqlit
ca330 65 33 56 58 50 72 69 6e 74 66 28 26 61 63 63 2c e3VXPrintf(&acc,
ca340 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 0, zFormat, ap)
ca350 3b 0d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 ;.. z = sqlite3
ca360 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 StrAccumFinish(&
ca370 61 63 63 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 acc);.. return
ca380 7a 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 z;..}..../*..**
ca390 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 Print into memor
ca3a0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 y obtained from
ca3b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 sqlite3_malloc()
ca3c0 28 29 2e 20 20 4f 6d 69 74 20 74 68 65 20 69 6e (). Omit the in
ca3d0 74 65 72 6e 61 6c 0d 0a 2a 2a 20 25 2d 63 6f 6e ternal..** %-con
ca3e0 76 65 72 73 69 6f 6e 20 65 78 74 65 6e 73 69 6f version extensio
ca3f0 6e 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ns...*/..SQLITE_
ca400 41 50 49 20 63 68 61 72 20 2a 73 71 6c 69 74 65 API char *sqlite
ca410 33 5f 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 3_mprintf(const
ca420 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e char *zFormat, .
ca430 2e 2e 29 7b 0d 0a 20 20 76 61 5f 6c 69 73 74 20 ..){.. va_list
ca440 61 70 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 3b 0d ap;.. char *z;.
ca450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
ca460 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0d 0a 20 OMIT_AUTOINIT..
ca470 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 if( sqlite3_ini
ca480 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 tialize() ) retu
ca490 72 6e 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 rn 0;..#endif..
ca4a0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 va_start(ap, zF
ca4b0 6f 72 6d 61 74 29 3b 0d 0a 20 20 7a 20 3d 20 73 ormat);.. z = s
ca4c0 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 qlite3_vmprintf(
ca4d0 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 zFormat, ap);..
ca4e0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 20 20 va_end(ap);..
ca4f0 72 65 74 75 72 6e 20 7a 3b 0d 0a 7d 0d 0a 0d 0a return z;..}....
ca500 2f 2a 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 /*..** sqlite3_s
ca510 6e 70 72 69 6e 74 66 28 29 20 77 6f 72 6b 73 20 nprintf() works
ca520 6c 69 6b 65 20 73 6e 70 72 69 6e 74 66 28 29 20 like snprintf()
ca530 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 69 except that it i
ca540 67 6e 6f 72 65 73 20 74 68 65 0d 0a 2a 2a 20 63 gnores the..** c
ca550 75 72 72 65 6e 74 20 6c 6f 63 61 6c 65 20 73 65 urrent locale se
ca560 74 74 69 6e 67 73 2e 20 20 54 68 69 73 20 69 73 ttings. This is
ca570 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 53 important for S
ca580 51 4c 69 74 65 20 62 65 63 61 75 73 65 20 77 65 QLite because we
ca590 0d 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 61 62 6c ..** are not abl
ca5a0 65 20 74 6f 20 75 73 65 20 61 20 22 2c 22 20 61 e to use a "," a
ca5b0 73 20 74 68 65 20 64 65 63 69 6d 61 6c 20 70 6f s the decimal po
ca5c0 69 6e 74 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 int in place of
ca5d0 22 2e 22 20 61 73 0d 0a 2a 2a 20 73 70 65 63 69 "." as..** speci
ca5e0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6c 6f 63 fied by some loc
ca5f0 61 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6f ales...**..** Oo
ca600 70 73 3a 20 20 54 68 65 20 66 69 72 73 74 20 74 ps: The first t
ca610 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 wo arguments of
ca620 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
ca630 28 29 20 61 72 65 20 62 61 63 6b 77 61 72 64 73 () are backwards
ca640 0d 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6e ..** from the sn
ca650 70 72 69 6e 74 66 28 29 20 73 74 61 6e 64 61 72 printf() standar
ca660 64 2e 20 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c d. Unfortunatel
ca670 79 2c 20 69 74 20 69 73 20 74 6f 6f 20 6c 61 74 y, it is too lat
ca680 65 20 74 6f 20 63 68 61 6e 67 65 0d 0a 2a 2a 20 e to change..**
ca690 74 68 69 73 20 77 69 74 68 6f 75 74 20 62 72 65 this without bre
ca6a0 61 6b 69 6e 67 20 63 6f 6d 70 61 74 69 62 69 6c aking compatibil
ca6b0 69 74 79 2c 20 73 6f 20 77 65 20 6a 75 73 74 20 ity, so we just
ca6c0 68 61 76 65 20 74 6f 20 6c 69 76 65 20 77 69 74 have to live wit
ca6d0 68 20 74 68 65 0d 0a 2a 2a 20 6d 69 73 74 61 6b h the..** mistak
ca6e0 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 73 71 6c 69 74 e...**..** sqlit
ca6f0 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 29 20 69 e3_vsnprintf() i
ca700 73 20 74 68 65 20 76 61 72 61 72 67 73 20 76 65 s the varargs ve
ca710 72 73 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 rsion...*/..SQLI
ca720 54 45 5f 41 50 49 20 63 68 61 72 20 2a 73 71 6c TE_API char *sql
ca730 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 69 ite3_vsnprintf(i
ca740 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 42 75 66 nt n, char *zBuf
ca750 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
ca760 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 ormat, va_list a
ca770 70 29 7b 0d 0a 20 20 53 74 72 41 63 63 75 6d 20 p){.. StrAccum
ca780 61 63 63 3b 0d 0a 20 20 69 66 28 20 6e 3c 3d 30 acc;.. if( n<=0
ca790 20 29 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0d ) return zBuf;.
ca7a0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 . sqlite3StrAcc
ca7b0 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 7a 42 75 umInit(&acc, zBu
ca7c0 66 2c 20 6e 2c 20 30 29 3b 0d 0a 20 20 61 63 63 f, n, 0);.. acc
ca7d0 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d .useMalloc = 0;.
ca7e0 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e . sqlite3VXPrin
ca7f0 74 66 28 26 61 63 63 2c 20 30 2c 20 7a 46 6f 72 tf(&acc, 0, zFor
ca800 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 72 65 74 mat, ap);.. ret
ca810 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 urn sqlite3StrAc
ca820 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b cumFinish(&acc);
ca830 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 ..}..SQLITE_API
ca840 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6e char *sqlite3_sn
ca850 70 72 69 6e 74 66 28 69 6e 74 20 6e 2c 20 63 68 printf(int n, ch
ca860 61 72 20 2a 7a 42 75 66 2c 20 63 6f 6e 73 74 20 ar *zBuf, const
ca870 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e char *zFormat, .
ca880 2e 2e 29 7b 0d 0a 20 20 63 68 61 72 20 2a 7a 3b ..){.. char *z;
ca890 0d 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d .. va_list ap;.
ca8a0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a . va_start(ap,z
ca8b0 46 6f 72 6d 61 74 29 3b 0d 0a 20 20 7a 20 3d 20 Format);.. z =
ca8c0 73 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 sqlite3_vsnprint
ca8d0 66 28 6e 2c 20 7a 42 75 66 2c 20 7a 46 6f 72 6d f(n, zBuf, zForm
ca8e0 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 61 5f 65 at, ap);.. va_e
ca8f0 6e 64 28 61 70 29 3b 0d 0a 20 20 72 65 74 75 72 nd(ap);.. retur
ca900 6e 20 7a 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a n z;..}..../*..*
ca910 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 72 6f * This is the ro
ca920 75 74 69 6e 65 20 74 68 61 74 20 61 63 74 75 61 utine that actua
ca930 6c 6c 79 20 66 6f 72 6d 61 74 73 20 74 68 65 20 lly formats the
ca940 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65 sqlite3_log() me
ca950 73 73 61 67 65 2e 0d 0a 2a 2a 20 57 65 20 68 6f ssage...** We ho
ca960 75 73 65 20 69 74 20 69 6e 20 61 20 73 65 70 61 use it in a sepa
ca970 72 61 74 65 20 72 6f 75 74 69 6e 65 20 66 72 6f rate routine fro
ca980 6d 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 m sqlite3_log()
ca990 74 6f 20 61 76 6f 69 64 20 75 73 69 6e 67 0d 0a to avoid using..
ca9a0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 20 6f ** stack space o
ca9b0 6e 20 73 6d 61 6c 6c 2d 73 74 61 63 6b 20 73 79 n small-stack sy
ca9c0 73 74 65 6d 73 20 77 68 65 6e 20 6c 6f 67 67 69 stems when loggi
ca9d0 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0d ng is disabled..
ca9e0 0a 2a 2a 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f .**..** sqlite3_
ca9f0 6c 6f 67 28 29 20 6d 75 73 74 20 72 65 6e 64 65 log() must rende
caa00 72 20 69 6e 74 6f 20 61 20 73 74 61 74 69 63 20 r into a static
caa10 62 75 66 66 65 72 2e 20 20 49 74 20 63 61 6e 6e buffer. It cann
caa20 6f 74 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0d 0a ot dynamically..
caa30 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f ** allocate memo
caa40 72 79 20 62 65 63 61 75 73 65 20 69 74 20 6d 69 ry because it mi
caa50 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 ght be called wh
caa60 69 6c 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 ile the memory a
caa70 6c 6c 6f 63 61 74 6f 72 0d 0a 2a 2a 20 6d 75 74 llocator..** mut
caa80 65 78 20 69 73 20 68 65 6c 64 2e 0d 0a 2a 2f 0d ex is held...*/.
caa90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e .static void ren
caaa0 64 65 72 4c 6f 67 4d 73 67 28 69 6e 74 20 69 45 derLogMsg(int iE
caab0 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 rrCode, const ch
caac0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f ar *zFormat, va_
caad0 6c 69 73 74 20 61 70 29 7b 0d 0a 20 20 53 74 72 list ap){.. Str
caae0 41 63 63 75 6d 20 61 63 63 3b 20 20 20 20 20 20 Accum acc;
caaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cab00 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 63 /* String ac
cab10 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0d 0a 20 20 cumulator */..
cab20 63 68 61 72 20 7a 4d 73 67 5b 53 51 4c 49 54 45 char zMsg[SQLITE
cab30 5f 50 52 49 4e 54 5f 42 55 46 5f 53 49 5a 45 2a _PRINT_BUF_SIZE*
cab40 33 5d 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 3]; /* Comple
cab50 74 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 20 2a te log message *
cab60 2f 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 53 74 /.... sqlite3St
cab70 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c rAccumInit(&acc,
cab80 20 7a 4d 73 67 2c 20 73 69 7a 65 6f 66 28 7a 4d zMsg, sizeof(zM
cab90 73 67 29 2c 20 30 29 3b 0d 0a 20 20 61 63 63 2e sg), 0);.. acc.
caba0 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d 0a useMalloc = 0;..
cabb0 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74 sqlite3VXPrint
cabc0 66 28 26 61 63 63 2c 20 30 2c 20 7a 46 6f 72 6d f(&acc, 0, zForm
cabd0 61 74 2c 20 61 70 29 3b 0d 0a 20 20 73 71 6c 69 at, ap);.. sqli
cabe0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
cabf0 78 4c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 xLog(sqlite3Glob
cac00 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 alConfig.pLogArg
cac10 2c 20 69 45 72 72 43 6f 64 65 2c 0d 0a 20 20 20 , iErrCode,..
cac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cac30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 sqlite3S
cac40 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 trAccumFinish(&a
cac50 63 63 29 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a cc));..}..../*..
cac60 2a 2a 20 46 6f 72 6d 61 74 20 61 6e 64 20 77 72 ** Format and wr
cac70 69 74 65 20 61 20 6d 65 73 73 61 67 65 20 74 6f ite a message to
cac80 20 74 68 65 20 6c 6f 67 20 69 66 20 6c 6f 67 67 the log if logg
cac90 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 2e 0d ing is enabled..
caca0 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
cacb0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6c 6f 67 void sqlite3_log
cacc0 28 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 (int iErrCode, c
cacd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
cace0 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 61 5f at, ...){.. va_
cacf0 6c 69 73 74 20 61 70 3b 20 20 20 20 20 20 20 20 list ap;
cad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cad10 20 20 20 20 20 2f 2a 20 56 61 72 61 72 67 20 6c /* Vararg l
cad20 69 73 74 20 2a 2f 0d 0a 20 20 69 66 28 20 73 71 ist */.. if( sq
cad30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
cad40 67 2e 78 4c 6f 67 20 29 7b 0d 0a 20 20 20 20 76 g.xLog ){.. v
cad50 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
cad60 6d 61 74 29 3b 0d 0a 20 20 20 20 72 65 6e 64 65 mat);.. rende
cad70 72 4c 6f 67 4d 73 67 28 69 45 72 72 43 6f 64 65 rLogMsg(iErrCode
cad80 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0d , zFormat, ap);.
cad90 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b . va_end(ap);
cada0 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 23 69 66 20 .. }..}....#if
cadb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 defined(SQLITE_D
cadc0 45 42 55 47 29 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 EBUG)../*..** A
cadd0 76 65 72 73 69 6f 6e 20 6f 66 20 70 72 69 6e 74 version of print
cade0 66 28 29 20 74 68 61 74 20 75 6e 64 65 72 73 74 f() that underst
cadf0 61 6e 64 73 20 25 6c 6c 64 2e 20 20 55 73 65 64 ands %lld. Used
cae00 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0d for debugging..
cae10 0a 2a 2a 20 54 68 65 20 70 72 69 6e 74 66 28 29 .** The printf()
cae20 20 62 75 69 6c 74 20 69 6e 74 6f 20 73 6f 6d 65 built into some
cae30 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e versions of win
cae40 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 75 6e dows does not un
cae50 64 65 72 73 74 61 6e 64 20 25 6c 6c 64 0d 0a 2a derstand %lld..*
cae60 2a 20 61 6e 64 20 73 65 67 66 61 75 6c 74 73 20 * and segfaults
cae70 69 66 20 79 6f 75 20 67 69 76 65 20 69 74 20 61 if you give it a
cae80 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 2e 0d long long int..
cae90 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
caea0 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
caeb0 44 65 62 75 67 50 72 69 6e 74 66 28 63 6f 6e 73 DebugPrintf(cons
caec0 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
caed0 20 2e 2e 2e 29 7b 0d 0a 20 20 76 61 5f 6c 69 73 ...){.. va_lis
caee0 74 20 61 70 3b 0d 0a 20 20 53 74 72 41 63 63 75 t ap;.. StrAccu
caef0 6d 20 61 63 63 3b 0d 0a 20 20 63 68 61 72 20 7a m acc;.. char z
caf00 42 75 66 5b 35 30 30 5d 3b 0d 0a 20 20 73 71 6c Buf[500];.. sql
caf10 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 ite3StrAccumInit
caf20 28 26 61 63 63 2c 20 7a 42 75 66 2c 20 73 69 7a (&acc, zBuf, siz
caf30 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0d 0a eof(zBuf), 0);..
caf40 20 20 61 63 63 2e 75 73 65 4d 61 6c 6c 6f 63 20 acc.useMalloc
caf50 3d 20 30 3b 0d 0a 20 20 76 61 5f 73 74 61 72 74 = 0;.. va_start
caf60 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b 0d 0a 20 (ap,zFormat);..
caf70 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 sqlite3VXPrintf
caf80 28 26 61 63 63 2c 20 30 2c 20 7a 46 6f 72 6d 61 (&acc, 0, zForma
caf90 74 2c 20 61 70 29 3b 0d 0a 20 20 76 61 5f 65 6e t, ap);.. va_en
cafa0 64 28 61 70 29 3b 0d 0a 20 20 73 71 6c 69 74 65 d(ap);.. sqlite
cafb0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 3StrAccumFinish(
cafc0 26 61 63 63 29 3b 0d 0a 20 20 66 70 72 69 6e 74 &acc);.. fprint
cafd0 66 28 73 74 64 6f 75 74 2c 22 25 73 22 2c 20 7a f(stdout,"%s", z
cafe0 42 75 66 29 3b 0d 0a 20 20 66 66 6c 75 73 68 28 Buf);.. fflush(
caff0 73 74 64 6f 75 74 29 3b 0d 0a 7d 0d 0a 23 65 6e stdout);..}..#en
cb000 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 dif....#ifndef S
cb010 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
cb020 0d 0a 2f 2a 0d 0a 2a 2a 20 76 61 72 69 61 62 6c ../*..** variabl
cb030 65 2d 61 72 67 75 6d 65 6e 74 20 77 72 61 70 70 e-argument wrapp
cb040 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 er around sqlite
cb050 33 56 58 50 72 69 6e 74 66 28 29 2e 0d 0a 2a 2f 3VXPrintf()...*/
cb060 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
cb070 20 76 6f 69 64 20 73 71 6c 69 74 65 33 58 50 72 void sqlite3XPr
cb080 69 6e 74 66 28 53 74 72 41 63 63 75 6d 20 2a 70 intf(StrAccum *p
cb090 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
cb0a0 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 ormat, ...){..
cb0b0 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20 76 va_list ap;.. v
cb0c0 61 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d a_start(ap,zForm
cb0d0 61 74 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 56 at);.. sqlite3V
cb0e0 58 50 72 69 6e 74 66 28 70 2c 20 31 2c 20 7a 46 XPrintf(p, 1, zF
cb0f0 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 ormat, ap);.. v
cb100 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 7d 0d 0a 23 a_end(ap);..}..#
cb110 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a endif..../******
cb120 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 ******** End of
cb130 70 72 69 6e 74 66 2e 63 20 2a 2a 2a 2a 2a 2a 2a printf.c *******
cb140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb160 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
cb170 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 ********* Begin
cb180 66 69 6c 65 20 72 61 6e 64 6f 6d 2e 63 20 2a 2a file random.c **
cb190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb1b0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a ********/../*..*
cb1c0 2a 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72 * 2001 September
cb1d0 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 15..**..** The
cb1e0 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 author disclaims
cb1f0 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 copyright to th
cb200 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 is source code.
cb210 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a In place of..**
cb220 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
cb230 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
cb240 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ing:..**..**
cb250 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 May you do good
cb260 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a and not evil...*
cb270 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e * May you fin
cb280 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f d forgiveness fo
cb290 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 r yourself and f
cb2a0 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a orgive others...
cb2b0 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 ** May you sh
cb2c0 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 are freely, neve
cb2d0 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 r taking more th
cb2e0 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a an you give...**
cb2f0 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
cb300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cb330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 ***********..**
cb340 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 This file contai
cb350 6e 73 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 ns code to imple
cb360 6d 65 6e 74 20 61 20 70 73 65 75 64 6f 2d 72 61 ment a pseudo-ra
cb370 6e 64 6f 6d 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20 ndom number..**
cb380 67 65 6e 65 72 61 74 6f 72 20 28 50 52 4e 47 29 generator (PRNG)
cb390 20 66 6f 72 20 53 51 4c 69 74 65 2e 0d 0a 2a 2a for SQLite...**
cb3a0 0d 0a 2a 2a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 ..** Random numb
cb3b0 65 72 73 20 61 72 65 20 75 73 65 64 20 62 79 20 ers are used by
cb3c0 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 some of the data
cb3d0 62 61 73 65 20 62 61 63 6b 65 6e 64 73 20 69 6e base backends in
cb3e0 20 6f 72 64 65 72 0d 0a 2a 2a 20 74 6f 20 67 65 order..** to ge
cb3f0 6e 65 72 61 74 65 20 72 61 6e 64 6f 6d 20 69 6e nerate random in
cb400 74 65 67 65 72 20 6b 65 79 73 20 66 6f 72 20 74 teger keys for t
cb410 61 62 6c 65 73 20 6f 72 20 72 61 6e 64 6f 6d 20 ables or random
cb420 66 69 6c 65 6e 61 6d 65 73 2e 0d 0a 2a 2f 0d 0a filenames...*/..
cb430 0d 0a 0d 0a 2f 2a 20 41 6c 6c 20 74 68 72 65 61 ..../* All threa
cb440 64 73 20 73 68 61 72 65 20 61 20 73 69 6e 67 6c ds share a singl
cb450 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 e random number
cb460 67 65 6e 65 72 61 74 6f 72 2e 0d 0a 2a 2a 20 54 generator...** T
cb470 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 his structure is
cb480 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 the current sta
cb490 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 te of the genera
cb4a0 74 6f 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 tor...*/..static
cb4b0 20 53 51 4c 49 54 45 5f 57 53 44 20 73 74 72 75 SQLITE_WSD stru
cb4c0 63 74 20 73 71 6c 69 74 65 33 50 72 6e 67 54 79 ct sqlite3PrngTy
cb4d0 70 65 20 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 pe {.. unsigned
cb4e0 20 63 68 61 72 20 69 73 49 6e 69 74 3b 20 20 20 char isInit;
cb4f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
cb500 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f f initialized */
cb510 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 .. unsigned cha
cb520 72 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 r i, j;
cb530 20 20 20 2f 2a 20 53 74 61 74 65 20 76 61 72 69 /* State vari
cb540 61 62 6c 65 73 20 2a 2f 0d 0a 20 20 75 6e 73 69 ables */.. unsi
cb550 67 6e 65 64 20 63 68 61 72 20 73 5b 32 35 36 5d gned char s[256]
cb560 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 ; /* St
cb570 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 2a 2f ate variables */
cb580 0d 0a 7d 20 73 71 6c 69 74 65 33 50 72 6e 67 3b ..} sqlite3Prng;
cb590 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 65 74 20 61 ..../*..** Get a
cb5a0 20 73 69 6e 67 6c 65 20 38 2d 62 69 74 20 72 61 single 8-bit ra
cb5b0 6e 64 6f 6d 20 76 61 6c 75 65 20 66 72 6f 6d 20 ndom value from
cb5c0 74 68 65 20 52 43 34 20 50 52 4e 47 2e 20 20 54 the RC4 PRNG. T
cb5d0 68 65 20 4d 75 74 65 78 0d 0a 2a 2a 20 6d 75 73 he Mutex..** mus
cb5e0 74 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 t be held while
cb5f0 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 72 executing this r
cb600 6f 75 74 69 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 outine...**..**
cb610 57 68 79 20 6e 6f 74 20 6a 75 73 74 20 75 73 65 Why not just use
cb620 20 61 20 6c 69 62 72 61 72 79 20 72 61 6e 64 6f a library rando
cb630 6d 20 67 65 6e 65 72 61 74 6f 72 20 6c 69 6b 65 m generator like
cb640 20 6c 72 61 6e 64 34 38 28 29 20 66 6f 72 20 74 lrand48() for t
cb650 68 69 73 3f 0d 0a 2a 2a 20 42 65 63 61 75 73 65 his?..** Because
cb660 20 74 68 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 the OP_NewRowid
cb670 20 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20 56 opcode in the V
cb680 44 42 45 20 64 65 70 65 6e 64 73 20 6f 6e 20 68 DBE depends on h
cb690 61 76 69 6e 67 20 61 20 76 65 72 79 0d 0a 2a 2a aving a very..**
cb6a0 20 67 6f 6f 64 20 73 6f 75 72 63 65 20 6f 66 20 good source of
cb6b0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 73 2e 20 random numbers.
cb6c0 20 54 68 65 20 6c 72 61 6e 64 34 38 28 29 20 6c The lrand48() l
cb6d0 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 ibrary function
cb6e0 6d 61 79 0d 0a 2a 2a 20 77 65 6c 6c 20 62 65 20 may..** well be
cb6f0 67 6f 6f 64 20 65 6e 6f 75 67 68 2e 20 20 42 75 good enough. Bu
cb700 74 20 6d 61 79 62 65 20 6e 6f 74 2e 20 20 4f 72 t maybe not. Or
cb710 20 6d 61 79 62 65 20 6c 72 61 6e 64 34 38 28 29 maybe lrand48()
cb720 20 68 61 73 20 73 6f 6d 65 0d 0a 2a 2a 20 73 75 has some..** su
cb730 62 74 6c 65 20 70 72 6f 62 6c 65 6d 73 20 6f 6e btle problems on
cb740 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 some systems th
cb750 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 70 at could cause p
cb760 72 6f 62 6c 65 6d 73 2e 20 20 49 74 20 69 73 20 roblems. It is
cb770 68 61 72 64 0d 0a 2a 2a 20 74 6f 20 6b 6e 6f 77 hard..** to know
cb780 2e 20 20 54 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 . To minimize t
cb790 68 65 20 72 69 73 6b 20 6f 66 20 70 72 6f 62 6c he risk of probl
cb7a0 65 6d 73 20 64 75 65 20 74 6f 20 62 61 64 20 6c ems due to bad l
cb7b0 72 61 6e 64 34 38 28 29 0d 0a 2a 2a 20 69 6d 70 rand48()..** imp
cb7c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 53 51 lementations, SQ
cb7d0 4c 69 74 65 20 75 73 65 73 20 74 68 69 73 20 72 Lite uses this r
cb7e0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e andom number gen
cb7f0 65 72 61 74 6f 72 20 62 61 73 65 64 0d 0a 2a 2a erator based..**
cb800 20 6f 6e 20 52 43 34 2c 20 77 68 69 63 68 20 77 on RC4, which w
cb810 65 20 6b 6e 6f 77 20 77 6f 72 6b 73 20 76 65 72 e know works ver
cb820 79 20 77 65 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 y well...**..**
cb830 28 4c 61 74 65 72 29 3a 20 20 41 63 74 75 61 6c (Later): Actual
cb840 6c 79 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 20 ly, OP_NewRowid
cb850 64 6f 65 73 20 6e 6f 74 20 64 65 70 65 6e 64 20 does not depend
cb860 6f 6e 20 61 20 67 6f 6f 64 20 73 6f 75 72 63 65 on a good source
cb870 20 6f 66 0d 0a 2a 2a 20 72 61 6e 64 6f 6d 6e 65 of..** randomne
cb880 73 73 20 61 6e 79 20 6d 6f 72 65 2e 20 20 42 75 ss any more. Bu
cb890 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 t we will leave
cb8a0 74 68 69 73 20 63 6f 64 65 20 69 6e 20 61 6c 6c this code in all
cb8b0 20 74 68 65 20 73 61 6d 65 2e 0d 0a 2a 2f 0d 0a the same...*/..
cb8c0 73 74 61 74 69 63 20 75 38 20 72 61 6e 64 6f 6d static u8 random
cb8d0 42 79 74 65 28 76 6f 69 64 29 7b 0d 0a 20 20 75 Byte(void){.. u
cb8e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 3b 0d nsigned char t;.
cb8f0 0a 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 22 77 ..... /* The "w
cb900 73 64 50 72 6e 67 22 20 6d 61 63 72 6f 20 77 69 sdPrng" macro wi
cb910 6c 6c 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 ll resolve to th
cb920 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 e pseudo-random
cb930 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
cb940 0d 0a 20 20 2a 2a 20 73 74 61 74 65 20 76 65 63 .. ** state vec
cb950 74 6f 72 2e 20 20 49 66 20 77 72 69 74 61 62 6c tor. If writabl
cb960 65 20 73 74 61 74 69 63 20 64 61 74 61 20 69 73 e static data is
cb970 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 unsupported on
cb980 74 68 65 20 74 61 72 67 65 74 2c 0d 0a 20 20 2a the target,.. *
cb990 2a 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 63 * we have to loc
cb9a0 61 74 65 20 74 68 65 20 73 74 61 74 65 20 76 65 ate the state ve
cb9b0 63 74 6f 72 20 61 74 20 72 75 6e 2d 74 69 6d 65 ctor at run-time
cb9c0 2e 20 20 49 6e 20 74 68 65 20 6d 6f 72 65 20 63 . In the more c
cb9d0 6f 6d 6d 6f 6e 0d 0a 20 20 2a 2a 20 63 61 73 65 ommon.. ** case
cb9e0 20 77 68 65 72 65 20 77 72 69 74 61 62 6c 65 20 where writable
cb9f0 73 74 61 74 69 63 20 64 61 74 61 20 69 73 20 73 static data is s
cba00 75 70 70 6f 72 74 65 64 2c 20 77 73 64 50 72 6e upported, wsdPrn
cba10 67 20 63 61 6e 20 72 65 66 65 72 20 64 69 72 65 g can refer dire
cba20 63 74 6c 79 0d 0a 20 20 2a 2a 20 74 6f 20 74 68 ctly.. ** to th
cba30 65 20 22 73 71 6c 69 74 65 33 50 72 6e 67 22 20 e "sqlite3Prng"
cba40 73 74 61 74 65 20 76 65 63 74 6f 72 20 64 65 63 state vector dec
cba50 6c 61 72 65 64 20 61 62 6f 76 65 2e 0d 0a 20 20 lared above...
cba60 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
cba70 45 5f 4f 4d 49 54 5f 57 53 44 0d 0a 20 20 73 74 E_OMIT_WSD.. st
cba80 72 75 63 74 20 73 71 6c 69 74 65 33 50 72 6e 67 ruct sqlite3Prng
cba90 54 79 70 65 20 2a 70 20 3d 20 26 47 4c 4f 42 41 Type *p = &GLOBA
cbaa0 4c 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 L(struct sqlite3
cbab0 50 72 6e 67 54 79 70 65 2c 20 73 71 6c 69 74 65 PrngType, sqlite
cbac0 33 50 72 6e 67 29 3b 0d 0a 23 20 64 65 66 69 6e 3Prng);..# defin
cbad0 65 20 77 73 64 50 72 6e 67 20 70 5b 30 5d 0d 0a e wsdPrng p[0]..
cbae0 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 #else..# define
cbaf0 77 73 64 50 72 6e 67 20 73 71 6c 69 74 65 33 50 wsdPrng sqlite3P
cbb00 72 6e 67 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d rng..#endif.....
cbb10 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 . /* Initialize
cbb20 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 the state of th
cbb30 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 e random number
cbb40 67 65 6e 65 72 61 74 6f 72 20 6f 6e 63 65 2c 0d generator once,.
cbb50 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 . ** the first
cbb60 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e time this routin
cbb70 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 e is called. Th
cbb80 65 20 73 65 65 64 20 76 61 6c 75 65 20 64 6f 65 e seed value doe
cbb90 73 0d 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 s.. ** not need
cbba0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 6f to contain a lo
cbbb0 74 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 t of randomness
cbbc0 73 69 6e 63 65 20 77 65 20 61 72 65 20 6e 6f 74 since we are not
cbbd0 0d 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f .. ** trying to
cbbe0 20 64 6f 20 73 65 63 75 72 65 20 65 6e 63 72 79 do secure encry
cbbf0 70 74 69 6f 6e 20 6f 72 20 61 6e 79 74 68 69 6e ption or anythin
cbc00 67 20 6c 69 6b 65 20 74 68 61 74 2e 2e 2e 0d 0a g like that.....
cbc10 20 20 2a 2a 0d 0a 20 20 2a 2a 20 4e 6f 74 68 69 **.. ** Nothi
cbc20 6e 67 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 ng in this file
cbc30 6f 72 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 or anywhere else
cbc40 20 69 6e 20 53 51 4c 69 74 65 20 64 6f 65 73 20 in SQLite does
cbc50 61 6e 79 20 6b 69 6e 64 20 6f 66 0d 0a 20 20 2a any kind of.. *
cbc60 2a 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 20 54 * encryption. T
cbc70 68 65 20 52 43 34 20 61 6c 67 6f 72 69 74 68 6d he RC4 algorithm
cbc80 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 is being used a
cbc90 73 20 61 20 50 52 4e 47 20 28 70 73 65 75 64 6f s a PRNG (pseudo
cbca0 2d 72 61 6e 64 6f 6d 0d 0a 20 20 2a 2a 20 6e 75 -random.. ** nu
cbcb0 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 29 20 mber generator)
cbcc0 6e 6f 74 20 61 73 20 61 6e 20 65 6e 63 72 79 70 not as an encryp
cbcd0 74 69 6f 6e 20 64 65 76 69 63 65 2e 0d 0a 20 20 tion device...
cbce0 2a 2f 0d 0a 20 20 69 66 28 20 21 77 73 64 50 72 */.. if( !wsdPr
cbcf0 6e 67 2e 69 73 49 6e 69 74 20 29 7b 0d 0a 20 20 ng.isInit ){..
cbd00 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 63 68 int i;.. ch
cbd10 61 72 20 6b 5b 32 35 36 5d 3b 0d 0a 20 20 20 20 ar k[256];..
cbd20 77 73 64 50 72 6e 67 2e 6a 20 3d 20 30 3b 0d 0a wsdPrng.j = 0;..
cbd30 20 20 20 20 77 73 64 50 72 6e 67 2e 69 20 3d 20 wsdPrng.i =
cbd40 30 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 0;.. sqlite3O
cbd50 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 sRandomness(sqli
cbd60 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c te3_vfs_find(0),
cbd70 20 32 35 36 2c 20 6b 29 3b 0d 0a 20 20 20 20 66 256, k);.. f
cbd80 6f 72 28 69 3d 30 3b 20 69 3c 32 35 36 3b 20 69 or(i=0; i<256; i
cbd90 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 77 73 64 50 ++){.. wsdP
cbda0 72 6e 67 2e 73 5b 69 5d 20 3d 20 28 75 38 29 69 rng.s[i] = (u8)i
cbdb0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 6f ;.. }.. fo
cbdc0 72 28 69 3d 30 3b 20 69 3c 32 35 36 3b 20 69 2b r(i=0; i<256; i+
cbdd0 2b 29 7b 0d 0a 20 20 20 20 20 20 77 73 64 50 72 +){.. wsdPr
cbde0 6e 67 2e 6a 20 2b 3d 20 77 73 64 50 72 6e 67 2e ng.j += wsdPrng.
cbdf0 73 5b 69 5d 20 2b 20 6b 5b 69 5d 3b 0d 0a 20 20 s[i] + k[i];..
cbe00 20 20 20 20 74 20 3d 20 77 73 64 50 72 6e 67 2e t = wsdPrng.
cbe10 73 5b 77 73 64 50 72 6e 67 2e 6a 5d 3b 0d 0a 20 s[wsdPrng.j];..
cbe20 20 20 20 20 20 77 73 64 50 72 6e 67 2e 73 5b 77 wsdPrng.s[w
cbe30 73 64 50 72 6e 67 2e 6a 5d 20 3d 20 77 73 64 50 sdPrng.j] = wsdP
cbe40 72 6e 67 2e 73 5b 69 5d 3b 0d 0a 20 20 20 20 20 rng.s[i];..
cbe50 20 77 73 64 50 72 6e 67 2e 73 5b 69 5d 20 3d 20 wsdPrng.s[i] =
cbe60 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 77 t;.. }.. w
cbe70 73 64 50 72 6e 67 2e 69 73 49 6e 69 74 20 3d 20 sdPrng.isInit =
cbe80 31 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 1;.. }.... /*
cbe90 47 65 6e 65 72 61 74 65 20 61 6e 64 20 72 65 74 Generate and ret
cbea0 75 72 6e 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f urn single rando
cbeb0 6d 20 62 79 74 65 0d 0a 20 20 2a 2f 0d 0a 20 20 m byte.. */..
cbec0 77 73 64 50 72 6e 67 2e 69 2b 2b 3b 0d 0a 20 20 wsdPrng.i++;..
cbed0 74 20 3d 20 77 73 64 50 72 6e 67 2e 73 5b 77 73 t = wsdPrng.s[ws
cbee0 64 50 72 6e 67 2e 69 5d 3b 0d 0a 20 20 77 73 64 dPrng.i];.. wsd
cbef0 50 72 6e 67 2e 6a 20 2b 3d 20 74 3b 0d 0a 20 20 Prng.j += t;..
cbf00 77 73 64 50 72 6e 67 2e 73 5b 77 73 64 50 72 6e wsdPrng.s[wsdPrn
cbf10 67 2e 69 5d 20 3d 20 77 73 64 50 72 6e 67 2e 73 g.i] = wsdPrng.s
cbf20 5b 77 73 64 50 72 6e 67 2e 6a 5d 3b 0d 0a 20 20 [wsdPrng.j];..
cbf30 77 73 64 50 72 6e 67 2e 73 5b 77 73 64 50 72 6e wsdPrng.s[wsdPrn
cbf40 67 2e 6a 5d 20 3d 20 74 3b 0d 0a 20 20 74 20 2b g.j] = t;.. t +
cbf50 3d 20 77 73 64 50 72 6e 67 2e 73 5b 77 73 64 50 = wsdPrng.s[wsdP
cbf60 72 6e 67 2e 69 5d 3b 0d 0a 20 20 72 65 74 75 72 rng.i];.. retur
cbf70 6e 20 77 73 64 50 72 6e 67 2e 73 5b 74 5d 3b 0d n wsdPrng.s[t];.
cbf80 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 .}..../*..** Ret
cbf90 75 72 6e 20 4e 20 72 61 6e 64 6f 6d 20 62 79 74 urn N random byt
cbfa0 65 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f es...*/..SQLITE_
cbfb0 41 50 49 20 76 6f 69 64 20 73 71 6c 69 74 65 33 API void sqlite3
cbfc0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 69 6e 74 20 _randomness(int
cbfd0 4e 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0d N, void *pBuf){.
cbfe0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 . unsigned char
cbff0 20 2a 7a 42 75 66 20 3d 20 70 42 75 66 3b 0d 0a *zBuf = pBuf;..
cc000 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 #if SQLITE_THREA
cc010 44 53 41 46 45 0d 0a 20 20 73 71 6c 69 74 65 33 DSAFE.. sqlite3
cc020 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 _mutex *mutex =
cc030 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f sqlite3MutexAllo
cc040 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 c(SQLITE_MUTEX_S
cc050 54 41 54 49 43 5f 50 52 4e 47 29 3b 0d 0a 23 65 TATIC_PRNG);..#e
cc060 6e 64 69 66 0d 0a 20 20 73 71 6c 69 74 65 33 5f ndif.. sqlite3_
cc070 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 mutex_enter(mute
cc080 78 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 4e 2d x);.. while( N-
cc090 2d 20 29 7b 0d 0a 20 20 20 20 2a 28 7a 42 75 66 - ){.. *(zBuf
cc0a0 2b 2b 29 20 3d 20 72 61 6e 64 6f 6d 42 79 74 65 ++) = randomByte
cc0b0 28 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 ();.. }.. sqli
cc0c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
cc0d0 6d 75 74 65 78 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69 mutex);..}....#i
cc0e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
cc0f0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0d 0a T_BUILTIN_TEST..
cc100 2f 2a 0d 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 /*..** For testi
cc110 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 ng purposes, we
cc120 73 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 20 74 sometimes want t
cc130 6f 20 70 72 65 73 65 72 76 65 20 74 68 65 20 73 o preserve the s
cc140 74 61 74 65 20 6f 66 0d 0a 2a 2a 20 50 52 4e 47 tate of..** PRNG
cc150 20 61 6e 64 20 72 65 73 74 6f 72 65 20 74 68 65 and restore the
cc160 20 50 52 4e 47 20 74 6f 20 69 74 73 20 73 61 76 PRNG to its sav
cc170 65 64 20 73 74 61 74 65 20 61 74 20 61 20 6c 61 ed state at a la
cc180 74 65 72 20 74 69 6d 65 2c 20 6f 72 0d 0a 2a 2a ter time, or..**
cc190 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 50 52 to reset the PR
cc1a0 4e 47 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 NG to its initia
cc1b0 6c 20 73 74 61 74 65 2e 20 20 54 68 65 73 65 20 l state. These
cc1c0 72 6f 75 74 69 6e 65 73 20 61 63 63 6f 6d 70 6c routines accompl
cc1d0 69 73 68 0d 0a 2a 2a 20 74 68 6f 73 65 20 74 61 ish..** those ta
cc1e0 73 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 sks...**..** The
cc1f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f sqlite3_test_co
cc200 6e 74 72 6f 6c 28 29 20 69 6e 74 65 72 66 61 63 ntrol() interfac
cc210 65 20 63 61 6c 6c 73 20 74 68 65 73 65 20 72 6f e calls these ro
cc220 75 74 69 6e 65 73 20 74 6f 0d 0a 2a 2a 20 63 6f utines to..** co
cc230 6e 74 72 6f 6c 20 74 68 65 20 50 52 4e 47 2e 0d ntrol the PRNG..
cc240 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 53 51 4c 49 .*/..static SQLI
cc250 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 73 71 TE_WSD struct sq
cc260 6c 69 74 65 33 50 72 6e 67 54 79 70 65 20 73 71 lite3PrngType sq
cc270 6c 69 74 65 33 53 61 76 65 64 50 72 6e 67 3b 0d lite3SavedPrng;.
cc280 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
cc290 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 6e 67 void sqlite3Prng
cc2a0 53 61 76 65 53 74 61 74 65 28 76 6f 69 64 29 7b SaveState(void){
cc2b0 0d 0a 20 20 6d 65 6d 63 70 79 28 0d 0a 20 20 20 .. memcpy(..
cc2c0 20 26 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 &GLOBAL(struct
cc2d0 73 71 6c 69 74 65 33 50 72 6e 67 54 79 70 65 2c sqlite3PrngType,
cc2e0 20 73 71 6c 69 74 65 33 53 61 76 65 64 50 72 6e sqlite3SavedPrn
cc2f0 67 29 2c 0d 0a 20 20 20 20 26 47 4c 4f 42 41 4c g),.. &GLOBAL
cc300 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 50 (struct sqlite3P
cc310 72 6e 67 54 79 70 65 2c 20 73 71 6c 69 74 65 33 rngType, sqlite3
cc320 50 72 6e 67 29 2c 0d 0a 20 20 20 20 73 69 7a 65 Prng),.. size
cc330 6f 66 28 73 71 6c 69 74 65 33 50 72 6e 67 29 0d of(sqlite3Prng).
cc340 0a 20 20 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 . );..}..SQLITE
cc350 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
cc360 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 lite3PrngRestore
cc370 53 74 61 74 65 28 76 6f 69 64 29 7b 0d 0a 20 20 State(void){..
cc380 6d 65 6d 63 70 79 28 0d 0a 20 20 20 20 26 47 4c memcpy(.. &GL
cc390 4f 42 41 4c 28 73 74 72 75 63 74 20 73 71 6c 69 OBAL(struct sqli
cc3a0 74 65 33 50 72 6e 67 54 79 70 65 2c 20 73 71 6c te3PrngType, sql
cc3b0 69 74 65 33 50 72 6e 67 29 2c 0d 0a 20 20 20 20 ite3Prng),..
cc3c0 26 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 73 &GLOBAL(struct s
cc3d0 71 6c 69 74 65 33 50 72 6e 67 54 79 70 65 2c 20 qlite3PrngType,
cc3e0 73 71 6c 69 74 65 33 53 61 76 65 64 50 72 6e 67 sqlite3SavedPrng
cc3f0 29 2c 0d 0a 20 20 20 20 73 69 7a 65 6f 66 28 73 ),.. sizeof(s
cc400 71 6c 69 74 65 33 50 72 6e 67 29 0d 0a 20 20 29 qlite3Prng).. )
cc410 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ;..}..SQLITE_PRI
cc420 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
cc430 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 3PrngResetState(
cc440 76 6f 69 64 29 7b 0d 0a 20 20 47 4c 4f 42 41 4c void){.. GLOBAL
cc450 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 50 (struct sqlite3P
cc460 72 6e 67 54 79 70 65 2c 20 73 71 6c 69 74 65 33 rngType, sqlite3
cc470 50 72 6e 67 29 2e 69 73 49 6e 69 74 20 3d 20 30 Prng).isInit = 0
cc480 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 ;..}..#endif /*
cc490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c SQLITE_OMIT_BUIL
cc4a0 54 49 4e 5f 54 45 53 54 20 2a 2f 0d 0a 0d 0a 2f TIN_TEST */..../
cc4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 ************** E
cc4c0 6e 64 20 6f 66 20 72 61 6e 64 6f 6d 2e 63 20 2a nd of random.c *
cc4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
cc500 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
cc510 42 65 67 69 6e 20 66 69 6c 65 20 75 74 66 2e 63 Begin file utf.c
cc520 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
cc530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
cc550 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 34 20 41 70 72 ./*..** 2004 Apr
cc560 69 6c 20 31 33 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 il 13..**..** Th
cc570 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
cc580 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
cc590 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
cc5a0 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
cc5b0 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
cc5c0 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
cc5d0 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
cc5e0 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
cc5f0 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
cc600 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
cc610 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
cc620 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
cc630 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
cc640 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
cc650 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
cc660 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
cc670 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
cc680 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
cc690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a *************..*
cc6d0 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
cc6e0 61 69 6e 73 20 72 6f 75 74 69 6e 65 73 20 75 73 ains routines us
cc6f0 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 ed to translate
cc700 62 65 74 77 65 65 6e 20 55 54 46 2d 38 2c 20 0d between UTF-8, .
cc710 0a 2a 2a 20 55 54 46 2d 31 36 2c 20 55 54 46 2d .** UTF-16, UTF-
cc720 31 36 42 45 2c 20 61 6e 64 20 55 54 46 2d 31 36 16BE, and UTF-16
cc730 4c 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 LE...**..** Note
cc740 73 20 6f 6e 20 55 54 46 2d 38 3a 0d 0a 2a 2a 0d s on UTF-8:..**.
cc750 0a 2a 2a 20 20 20 42 79 74 65 2d 30 20 20 20 20 .** Byte-0
cc760 42 79 74 65 2d 31 20 20 20 20 42 79 74 65 2d 32 Byte-1 Byte-2
cc770 20 20 20 20 42 79 74 65 2d 33 20 20 20 20 56 61 Byte-3 Va
cc780 6c 75 65 0d 0a 2a 2a 20 20 30 78 78 78 78 78 78 lue..** 0xxxxxx
cc790 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 x
cc7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cc7b0 20 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 00000000 00000
cc7c0 30 30 30 20 30 78 78 78 78 78 78 78 0d 0a 2a 2a 000 0xxxxxxx..**
cc7d0 20 20 31 31 30 79 79 79 79 79 20 20 31 30 78 78 110yyyyy 10xx
cc7e0 78 78 78 78 20 20 20 20 20 20 20 20 20 20 20 20 xxxx
cc7f0 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30 00000
cc800 30 30 30 20 30 30 30 30 30 79 79 79 20 79 79 78 000 00000yyy yyx
cc810 78 78 78 78 78 0d 0a 2a 2a 20 20 31 31 31 30 7a xxxxx..** 1110z
cc820 7a 7a 7a 20 20 31 30 79 79 79 79 79 79 20 20 31 zzz 10yyyyyy 1
cc830 30 78 78 78 78 78 78 20 20 20 20 20 20 20 20 20 0xxxxxx
cc840 20 20 20 20 30 30 30 30 30 30 30 30 20 7a 7a 7a 00000000 zzz
cc850 7a 79 79 79 79 20 79 79 78 78 78 78 78 78 0d 0a zyyyy yyxxxxxx..
cc860 2a 2a 20 20 31 31 31 31 30 75 75 75 20 20 31 30 ** 11110uuu 10
cc870 75 75 7a 7a 7a 7a 20 20 31 30 79 79 79 79 79 79 uuzzzz 10yyyyyy
cc880 20 20 31 30 78 78 78 78 78 78 20 20 20 30 30 30 10xxxxxx 000
cc890 75 75 75 75 75 20 7a 7a 7a 7a 79 79 79 79 20 79 uuuuu zzzzyyyy y
cc8a0 79 78 78 78 78 78 78 0d 0a 2a 2a 0d 0a 2a 2a 0d yxxxxxx..**..**.
cc8b0 0a 2a 2a 20 4e 6f 74 65 73 20 6f 6e 20 55 54 46 .** Notes on UTF
cc8c0 2d 31 36 3a 20 20 28 77 69 74 68 20 77 77 77 77 -16: (with wwww
cc8d0 2b 31 3d 3d 75 75 75 75 75 29 0d 0a 2a 2a 0d 0a +1==uuuuu)..**..
cc8e0 2a 2a 20 20 20 20 20 20 57 6f 72 64 2d 30 20 20 ** Word-0
cc8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 6f 72 Wor
cc900 64 2d 31 20 20 20 20 20 20 20 20 20 20 56 61 6c d-1 Val
cc910 75 65 0d 0a 2a 2a 20 20 31 31 30 31 31 30 77 77 ue..** 110110ww
cc920 20 77 77 7a 7a 7a 7a 79 79 20 20 20 31 31 30 31 wwzzzzyy 1101
cc930 31 31 79 79 20 79 79 78 78 78 78 78 78 20 20 20 11yy yyxxxxxx
cc940 20 30 30 30 75 75 75 75 75 20 7a 7a 7a 7a 79 79 000uuuuu zzzzyy
cc950 79 79 20 79 79 78 78 78 78 78 78 0d 0a 2a 2a 20 yy yyxxxxxx..**
cc960 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78 zzzzyyyy yyxxxx
cc970 78 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 xx
cc980 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30 30 000000
cc990 30 30 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78 00 zzzzyyyy yyxx
cc9a0 78 78 78 78 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a xxxx..**..**..**
cc9b0 20 42 4f 4d 20 6f 72 20 42 79 74 65 20 4f 72 64 BOM or Byte Ord
cc9c0 65 72 20 4d 61 72 6b 3a 0d 0a 2a 2a 20 20 20 20 er Mark:..**
cc9d0 20 30 78 66 66 20 30 78 66 65 20 20 20 6c 69 74 0xff 0xfe lit
cc9e0 74 6c 65 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31 tle-endian utf-1
cc9f0 36 20 66 6f 6c 6c 6f 77 73 0d 0a 2a 2a 20 20 20 6 follows..**
cca00 20 20 30 78 66 65 20 30 78 66 66 20 20 20 62 69 0xfe 0xff bi
cca10 67 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31 36 20 g-endian utf-16
cca20 66 6f 6c 6c 6f 77 73 0d 0a 2a 2a 0d 0a 2a 2f 0d follows..**..*/.
cca30 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 3c 61 73 ./* #include <as
cca40 73 65 72 74 2e 68 3e 20 2a 2f 0d 0a 0d 0a 23 69 sert.h> */....#i
cca50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 fndef SQLITE_AMA
cca60 4c 47 41 4d 41 54 49 4f 4e 0d 0a 2f 2a 0d 0a 2a LGAMATION../*..*
cca70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
cca80 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 69 constant value i
cca90 73 20 75 73 65 64 20 62 79 20 74 68 65 20 53 51 s used by the SQ
ccaa0 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 20 61 LITE_BIGENDIAN a
ccab0 6e 64 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 nd..** SQLITE_LI
ccac0 54 54 4c 45 45 4e 44 49 41 4e 20 6d 61 63 72 6f TTLEENDIAN macro
ccad0 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 s...*/..SQLITE_P
ccae0 52 49 56 41 54 45 20 63 6f 6e 73 74 20 69 6e 74 RIVATE const int
ccaf0 20 73 71 6c 69 74 65 33 6f 6e 65 20 3d 20 31 3b sqlite3one = 1;
ccb00 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 ..#endif /* SQLI
ccb10 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 20 TE_AMALGAMATION
ccb20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 */..../*..** Thi
ccb30 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 s lookup table i
ccb40 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64 s used to help d
ccb50 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74 20 ecode the first
ccb60 62 79 74 65 20 6f 66 0d 0a 2a 2a 20 61 20 6d 75 byte of..** a mu
ccb70 6c 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68 lti-byte UTF8 ch
ccb80 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 aracter...*/..st
ccb90 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 atic const unsig
ccba0 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 ned char sqlite3
ccbb0 55 74 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b Utf8Trans1[] = {
ccbc0 0d 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 .. 0x00, 0x01,
ccbd0 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 0x02, 0x03, 0x04
ccbe0 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 , 0x05, 0x06, 0x
ccbf0 30 37 2c 0d 0a 20 20 30 78 30 38 2c 20 30 78 30 07,.. 0x08, 0x0
ccc00 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30 9, 0x0a, 0x0b, 0
ccc10 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c x0c, 0x0d, 0x0e,
ccc20 20 30 78 30 66 2c 0d 0a 20 20 30 78 31 30 2c 20 0x0f,.. 0x10,
ccc30 30 78 31 31 2c 20 30 78 31 32 2c 20 30 78 31 33 0x11, 0x12, 0x13
ccc40 2c 20 30 78 31 34 2c 20 30 78 31 35 2c 20 30 78 , 0x14, 0x15, 0x
ccc50 31 36 2c 20 30 78 31 37 2c 0d 0a 20 20 30 78 31 16, 0x17,.. 0x1
ccc60 38 2c 20 30 78 31 39 2c 20 30 78 31 61 2c 20 30 8, 0x19, 0x1a, 0
ccc70 78 31 62 2c 20 30 78 31 63 2c 20 30 78 31 64 2c x1b, 0x1c, 0x1d,
ccc80 20 30 78 31 65 2c 20 30 78 31 66 2c 0d 0a 20 20 0x1e, 0x1f,..
ccc90 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 0x00, 0x01, 0x02
ccca0 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 , 0x03, 0x04, 0x
cccb0 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0d 05, 0x06, 0x07,.
cccc0 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 . 0x08, 0x09, 0
cccd0 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c x0a, 0x0b, 0x0c,
ccce0 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 0x0d, 0x0e, 0x0
cccf0 66 2c 0d 0a 20 20 30 78 30 30 2c 20 30 78 30 31 f,.. 0x00, 0x01
ccd00 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 , 0x02, 0x03, 0x
ccd10 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 04, 0x05, 0x06,
ccd20 30 78 30 37 2c 0d 0a 20 20 30 78 30 30 2c 20 30 0x07,.. 0x00, 0
ccd30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c x01, 0x02, 0x03,
ccd40 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 0x00, 0x01, 0x0
ccd50 30 2c 20 30 78 30 30 2c 0d 0a 7d 3b 0d 0a 0d 0a 0, 0x00,..};....
ccd60 0d 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f ..#define WRITE_
ccd70 55 54 46 38 28 7a 4f 75 74 2c 20 63 29 20 7b 20 UTF8(zOut, c) {
ccd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccd90 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 69 66 \.. if
ccda0 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b 20 20 ( c<0x00080 ){
ccdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccdd0 20 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b \.. *zOut+
ccde0 2b 20 3d 20 28 75 38 29 28 63 26 30 78 46 46 29 + = (u8)(c&0xFF)
ccdf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
cce00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
cce10 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 }
cce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cce40 20 20 20 20 20 20 20 5c 0d 0a 20 20 65 6c 73 65 \.. else
cce50 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20 29 if( c<0x00800 )
cce60 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
cce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cce80 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 \.. *zOut++
cce90 3d 20 30 78 43 30 20 2b 20 28 75 38 29 28 28 63 = 0xC0 + (u8)((c
ccea0 3e 3e 36 29 26 30 78 31 46 29 3b 20 20 20 20 20 >>6)&0x1F);
cceb0 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
ccec0 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 *zOut++ = 0x80
cced0 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33 46 + (u8)(c & 0x3F
ccee0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 );
ccef0 20 20 20 20 20 5c 0d 0a 20 20 7d 20 20 20 20 20 \.. }
ccf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
ccf30 0d 0a 20 20 65 6c 73 65 20 69 66 28 20 63 3c 30 .. else if( c<0
ccf40 78 31 30 30 30 30 20 29 7b 20 20 20 20 20 20 20 x10000 ){
ccf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ccf60 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 \..
ccf70 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b *zOut++ = 0xE0 +
ccf80 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78 (u8)((c>>12)&0x
ccf90 30 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 0F);
ccfa0 20 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b \.. *zOut+
ccfb0 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 + = 0x80 + (u8)(
ccfc0 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20 (c>>6) & 0x3F);
ccfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
ccfe0 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 *zOut++ = 0x
ccff0 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 80 + (u8)(c & 0x
cd000 33 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 3F);
cd010 20 20 20 20 20 20 20 5c 0d 0a 20 20 7d 65 6c 73 \.. }els
cd020 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e{
cd030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd050 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 \.. *zOut++
cd060 3d 20 30 78 46 30 20 2b 20 28 75 38 29 28 28 63 = 0xF0 + (u8)((c
cd070 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b 20 20 >>18) & 0x07);
cd080 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
cd090 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 *zOut++ = 0x80
cd0a0 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 20 + (u8)((c>>12)
cd0b0 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 & 0x3F);
cd0c0 20 20 20 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 \.. *zOu
cd0d0 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 t++ = 0x80 + (u8
cd0e0 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 )((c>>6) & 0x3F)
cd0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c ; \
cd100 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 .. *zOut++ =
cd110 30 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 0x80 + (u8)(c &
cd120 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20 0x3F);
cd130 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 7d 20 \.. }
cd140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd170 20 20 20 5c 0d 0a 7d 0d 0a 0d 0a 23 64 65 66 69 \..}....#defi
cd180 6e 65 20 57 52 49 54 45 5f 55 54 46 31 36 4c 45 ne WRITE_UTF16LE
cd190 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20 20 20 (zOut, c) {
cd1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
cd1c0 0d 0a 20 20 69 66 28 20 63 3c 3d 30 78 46 46 46 .. if( c<=0xFFF
cd1d0 46 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 F ){
cd1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd200 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f \.. *zO
cd210 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78 ut++ = (u8)(c&0x
cd220 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 00FF);
cd230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd240 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
cd250 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 *zOut++ = (u
cd260 38 29 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 8)((c>>8)&0x00FF
cd270 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 );
cd280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd290 20 20 20 20 5c 0d 0a 20 20 7d 65 6c 73 65 7b 20 \.. }else{
cd2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd2d0 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
cd2e0 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 *zOut++ = (u8)
cd2f0 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 33 46 (((c>>10)&0x003F
cd300 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30 ) + (((c-0x10000
cd310 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29 3b )>>10)&0x00C0));
cd320 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b \.. *zOut++
cd330 20 3d 20 28 75 38 29 28 30 78 30 30 44 38 20 2b = (u8)(0x00D8 +
cd340 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e (((c-0x10000)>>
cd350 31 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20 18)&0x03));
cd360 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 \..
cd370 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 *zOut++ = (u8)(c
cd380 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 &0x00FF);
cd390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd3b0 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d \.. *zOut++ =
cd3c0 20 28 75 38 29 28 30 78 30 30 44 43 20 2b 20 28 (u8)(0x00DC + (
cd3d0 28 63 3e 3e 38 29 26 30 78 30 33 29 29 3b 20 20 (c>>8)&0x03));
cd3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd3f0 20 20 20 20 20 20 20 5c 0d 0a 20 20 7d 20 20 20 \.. }
cd400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d \.
cd440 0a 7d 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 57 52 .}....#define WR
cd450 49 54 45 5f 55 54 46 31 36 42 45 28 7a 4f 75 74 ITE_UTF16BE(zOut
cd460 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 , c) {
cd470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd480 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 69 \.. i
cd490 66 28 20 63 3c 3d 30 78 46 46 46 46 20 29 7b 20 f( c<=0xFFFF ){
cd4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd4d0 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 \.. *zOut++
cd4e0 3d 20 28 75 38 29 28 28 63 3e 3e 38 29 26 30 78 = (u8)((c>>8)&0x
cd4f0 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 00FF);
cd500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd510 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 2a \.. *
cd520 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 zOut++ = (u8)(c&
cd530 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 0x00FF);
cd540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
cd560 0d 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 .. }else{
cd570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd5a0 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f \.. *zO
cd5b0 75 74 2b 2b 20 3d 20 28 75 38 29 28 30 78 30 30 ut++ = (u8)(0x00
cd5c0 44 38 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 D8 + (((c-0x1000
cd5d0 30 29 3e 3e 31 38 29 26 30 78 30 33 29 29 3b 20 0)>>18)&0x03));
cd5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
cd5f0 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 *zOut++ = (u
cd600 38 29 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 8)(((c>>10)&0x00
cd610 33 46 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 3F) + (((c-0x100
cd620 30 30 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 00)>>10)&0x00C0)
cd630 29 3b 20 20 5c 0d 0a 20 20 20 20 2a 7a 4f 75 74 ); \.. *zOut
cd640 2b 2b 20 3d 20 28 75 38 29 28 30 78 30 30 44 43 ++ = (u8)(0x00DC
cd650 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30 33 29 + ((c>>8)&0x03)
cd660 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 );
cd670 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
cd680 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 *zOut++ = (u8)
cd690 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 (c&0x00FF);
cd6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd6c0 20 20 5c 0d 0a 20 20 7d 20 20 20 20 20 20 20 20 \.. }
cd6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd700 20 20 20 20 20 20 20 20 20 5c 0d 0a 7d 0d 0a 0d \..}...
cd710 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54 .#define READ_UT
cd720 46 31 36 4c 45 28 7a 49 6e 2c 20 54 45 52 4d 2c F16LE(zIn, TERM,
cd730 20 63 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 c){
cd740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd750 20 20 20 20 20 20 20 5c 0d 0a 20 20 63 20 3d 20 \.. c =
cd760 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20 20 (*zIn++);
cd770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd7a0 5c 0d 0a 20 20 63 20 2b 3d 20 28 28 2a 7a 49 6e \.. c += ((*zIn
cd7b0 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 ++)<<8);
cd7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd7e0 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 69 66 \.. if
cd7f0 28 20 63 3e 3d 30 78 44 38 30 30 20 26 26 20 63 ( c>=0xD800 && c
cd800 3c 30 78 45 30 30 30 20 26 26 20 54 45 52 4d 20 <0xE000 && TERM
cd810 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ){
cd820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd830 20 20 5c 0d 0a 20 20 20 20 69 6e 74 20 63 32 20 \.. int c2
cd840 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 = (*zIn++);
cd850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd870 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
cd880 20 20 63 32 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b c2 += ((*zIn++
cd890 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20 20 )<<8);
cd8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd8c0 20 20 20 20 5c 0d 0a 20 20 20 20 63 20 3d 20 28 \.. c = (
cd8d0 63 32 26 30 78 30 33 46 46 29 20 2b 20 28 28 63 c2&0x03FF) + ((c
cd8e0 26 30 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 &0x003F)<<10) +
cd8f0 28 28 28 63 26 30 78 30 33 43 30 29 2b 30 78 30 (((c&0x03C0)+0x0
cd900 30 34 30 29 3c 3c 31 30 29 3b 20 20 20 5c 0d 0a 040)<<10); \..
cd910 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 }
cd920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd950 20 20 20 20 20 20 5c 0d 0a 7d 0d 0a 0d 0a 23 64 \..}....#d
cd960 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46 31 36 efine READ_UTF16
cd970 42 45 28 7a 49 6e 2c 20 54 45 52 4d 2c 20 63 29 BE(zIn, TERM, c)
cd980 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
cd990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd9a0 20 20 20 20 5c 0d 0a 20 20 63 20 3d 20 28 28 2a \.. c = ((*
cd9b0 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 zIn++)<<8);
cd9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
cd9f0 20 20 63 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b c += (*zIn++);
cda00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cda10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cda20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cda30 20 20 20 20 20 20 5c 0d 0a 20 20 69 66 28 20 63 \.. if( c
cda40 3e 3d 30 78 44 38 30 30 20 26 26 20 63 3c 30 78 >=0xD800 && c<0x
cda50 45 30 30 30 20 26 26 20 54 45 52 4d 20 29 7b 20 E000 && TERM ){
cda60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cda70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
cda80 0d 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 28 .. int c2 = (
cda90 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 (*zIn++)<<8);
cdaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdac0 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 63 \.. c
cdad0 32 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 2 += (*zIn++);
cdae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb10 20 5c 0d 0a 20 20 20 20 63 20 3d 20 28 63 32 26 \.. c = (c2&
cdb20 30 78 30 33 46 46 29 20 2b 20 28 28 63 26 30 78 0x03FF) + ((c&0x
cdb30 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 28 28 28 003F)<<10) + (((
cdb40 63 26 30 78 30 33 43 30 29 2b 30 78 30 30 34 30 c&0x03C0)+0x0040
cdb50 29 3c 3c 31 30 29 3b 20 20 20 5c 0d 0a 20 20 7d )<<10); \.. }
cdb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdba0 20 20 20 5c 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a \..}..../*..*
cdbb0 2a 20 54 72 61 6e 73 6c 61 74 65 20 61 20 73 69 * Translate a si
cdbc0 6e 67 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 ngle UTF-8 chara
cdbd0 63 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 cter. Return th
cdbe0 65 20 75 6e 69 63 6f 64 65 20 76 61 6c 75 65 2e e unicode value.
cdbf0 0d 0a 2a 2a 0d 0a 2a 2a 20 44 75 72 69 6e 67 20 ..**..** During
cdc00 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 61 73 73 translation, ass
cdc10 75 6d 65 20 74 68 61 74 20 74 68 65 20 62 79 74 ume that the byt
cdc20 65 20 74 68 61 74 20 7a 54 65 72 6d 20 70 6f 69 e that zTerm poi
cdc30 6e 74 73 0d 0a 2a 2a 20 69 73 20 61 20 30 78 30 nts..** is a 0x0
cdc40 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 72 69 74 65 0...**..** Write
cdc50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
cdc60 65 20 6e 65 78 74 20 75 6e 72 65 61 64 20 62 79 e next unread by
cdc70 74 65 20 62 61 63 6b 20 69 6e 74 6f 20 2a 70 7a te back into *pz
cdc80 4e 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f Next...**..** No
cdc90 74 65 73 20 4f 6e 20 49 6e 76 61 6c 69 64 20 55 tes On Invalid U
cdca0 54 46 2d 38 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 2a TF-8:..**..** *
cdcb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e This routine n
cdcc0 65 76 65 72 20 61 6c 6c 6f 77 73 20 61 20 37 2d ever allows a 7-
cdcd0 62 69 74 20 63 68 61 72 61 63 74 65 72 20 28 30 bit character (0
cdce0 78 30 30 20 74 68 72 6f 75 67 68 20 30 78 37 66 x00 through 0x7f
cdcf0 29 20 74 6f 0d 0a 2a 2a 20 20 20 20 20 62 65 20 ) to..** be
cdd00 65 6e 63 6f 64 65 64 20 61 73 20 61 20 6d 75 6c encoded as a mul
cdd10 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 ti-byte characte
cdd20 72 2e 20 20 41 6e 79 20 6d 75 6c 74 69 2d 62 79 r. Any multi-by
cdd30 74 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 te character tha
cdd40 74 0d 0a 2a 2a 20 20 20 20 20 61 74 74 65 6d 70 t..** attemp
cdd50 74 73 20 74 6f 20 65 6e 63 6f 64 65 20 61 20 76 ts to encode a v
cdd60 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 78 30 alue between 0x0
cdd70 30 20 61 6e 64 20 30 78 37 66 20 69 73 20 72 65 0 and 0x7f is re
cdd80 6e 64 65 72 65 64 20 61 73 20 30 78 66 66 66 64 ndered as 0xfffd
cdd90 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 2a 20 20 54 68 ...**..** * Th
cdda0 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 76 65 72 is routine never
cddb0 20 61 6c 6c 6f 77 73 20 61 20 55 54 46 31 36 20 allows a UTF16
cddc0 73 75 72 72 6f 67 61 74 65 20 76 61 6c 75 65 20 surrogate value
cddd0 74 6f 20 62 65 20 65 6e 63 6f 64 65 64 2e 0d 0a to be encoded...
cdde0 2a 2a 20 20 20 20 20 49 66 20 61 20 6d 75 6c 74 ** If a mult
cddf0 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 i-byte character
cde00 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 6e 63 attempts to enc
cde10 6f 64 65 20 61 20 76 61 6c 75 65 20 62 65 74 77 ode a value betw
cde20 65 65 6e 0d 0a 2a 2a 20 20 20 20 20 30 78 64 38 een..** 0xd8
cde30 30 30 20 61 6e 64 20 30 78 65 30 30 30 20 74 68 00 and 0xe000 th
cde40 65 6e 20 69 74 20 69 73 20 72 65 6e 64 65 72 65 en it is rendere
cde50 64 20 61 73 20 30 78 66 66 66 64 2e 0d 0a 2a 2a d as 0xfffd...**
cde60 0d 0a 2a 2a 20 20 2a 20 20 42 79 74 65 73 20 69 ..** * Bytes i
cde70 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 30 n the range of 0
cde80 78 38 30 20 74 68 72 6f 75 67 68 20 30 78 62 66 x80 through 0xbf
cde90 20 77 68 69 63 68 20 6f 63 63 75 72 20 61 73 20 which occur as
cdea0 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 20 20 the first..**
cdeb0 20 20 62 79 74 65 20 6f 66 20 61 20 63 68 61 72 byte of a char
cdec0 61 63 74 65 72 20 61 72 65 20 69 6e 74 65 72 70 acter are interp
cded0 72 65 74 65 64 20 61 73 20 73 69 6e 67 6c 65 2d reted as single-
cdee0 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73 0d byte characters.
cdef0 0a 2a 2a 20 20 20 20 20 61 6e 64 20 72 65 6e 64 .** and rend
cdf00 65 72 65 64 20 61 73 20 74 68 65 6d 73 65 6c 76 ered as themselv
cdf10 65 73 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 es even though t
cdf20 68 65 79 20 61 72 65 20 74 65 63 68 6e 69 63 61 hey are technica
cdf30 6c 6c 79 0d 0a 2a 2a 20 20 20 20 20 69 6e 76 61 lly..** inva
cdf40 6c 69 64 20 63 68 61 72 61 63 74 65 72 73 2e 0d lid characters..
cdf50 0a 2a 2a 0d 0a 2a 2a 20 20 2a 20 20 54 68 69 73 .**..** * This
cdf60 20 72 6f 75 74 69 6e 65 20 61 63 63 65 70 74 73 routine accepts
cdf70 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6e 75 6d an infinite num
cdf80 62 65 72 20 6f 66 20 64 69 66 66 65 72 65 6e 74 ber of different
cdf90 20 55 54 46 38 20 65 6e 63 6f 64 69 6e 67 73 0d UTF8 encodings.
cdfa0 0a 2a 2a 20 20 20 20 20 66 6f 72 20 75 6e 69 63 .** for unic
cdfb0 6f 64 65 20 76 61 6c 75 65 73 20 30 78 38 30 20 ode values 0x80
cdfc0 61 6e 64 20 67 72 65 61 74 65 72 2e 20 20 49 74 and greater. It
cdfd0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f do not change o
cdfe0 76 65 72 2d 6c 65 6e 67 74 68 0d 0a 2a 2a 20 20 ver-length..**
cdff0 20 20 20 65 6e 63 6f 64 69 6e 67 73 20 74 6f 20 encodings to
ce000 30 78 66 66 66 64 20 61 73 20 73 6f 6d 65 20 73 0xfffd as some s
ce010 79 73 74 65 6d 73 20 72 65 63 6f 6d 6d 65 6e 64 ystems recommend
ce020 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 52 ...*/..#define R
ce030 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a 54 EAD_UTF8(zIn, zT
ce040 65 72 6d 2c 20 63 29 20 20 20 20 20 20 20 20 20 erm, c)
ce050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce060 20 20 5c 0d 0a 20 20 63 20 3d 20 2a 28 7a 49 6e \.. c = *(zIn
ce070 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 ++);
ce080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce0a0 5c 0d 0a 20 20 69 66 28 20 63 3e 3d 30 78 63 30 \.. if( c>=0xc0
ce0b0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 ){
ce0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d \.
ce0e0 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 . c = sqlite3
ce0f0 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 Utf8Trans1[c-0xc
ce100 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0];
ce110 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 \..
ce120 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a while( zIn!=z
ce130 54 65 72 6d 20 26 26 20 28 2a 7a 49 6e 20 26 20 Term && (*zIn &
ce140 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 20 0xc0)==0x80 ){
ce150 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 \..
ce160 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 c = (c<<6) +
ce170 28 30 78 33 66 20 26 20 2a 28 7a 49 6e 2b 2b 29 (0x3f & *(zIn++)
ce180 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 );
ce190 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 7d \.. }
ce1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce1d0 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 69 66 28 \.. if(
ce1e0 20 63 3c 30 78 38 30 20 20 20 20 20 20 20 20 20 c<0x80
ce1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce210 20 20 20 20 5c 0d 0a 20 20 20 20 20 20 20 20 7c \.. |
ce220 7c 20 28 63 26 30 78 46 46 46 46 46 38 30 30 29 | (c&0xFFFFF800)
ce230 3d 3d 30 78 44 38 30 30 20 20 20 20 20 20 20 20 ==0xD800
ce240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce250 20 20 5c 0d 0a 20 20 20 20 20 20 20 20 7c 7c 20 \.. ||
ce260 28 63 26 30 78 46 46 46 46 46 46 46 45 29 3d 3d (c&0xFFFFFFFE)==
ce270 30 78 46 46 46 45 20 29 7b 20 20 63 20 3d 20 30 0xFFFE ){ c = 0
ce280 78 46 46 46 44 3b 20 7d 20 20 20 20 20 20 20 20 xFFFD; }
ce290 5c 0d 0a 20 20 7d 0d 0a 53 51 4c 49 54 45 5f 50 \.. }..SQLITE_P
ce2a0 52 49 56 41 54 45 20 75 33 32 20 73 71 6c 69 74 RIVATE u32 sqlit
ce2b0 65 33 55 74 66 38 52 65 61 64 28 0d 0a 20 20 63 e3Utf8Read(.. c
ce2c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
ce2d0 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 2f ar *zIn, /
ce2e0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 * First byte of
ce2f0 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 UTF-8 character
ce300 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 */.. const unsi
ce310 67 6e 65 64 20 63 68 61 72 20 2a 2a 70 7a 4e 65 gned char **pzNe
ce320 78 74 20 20 20 20 2f 2a 20 57 72 69 74 65 20 66 xt /* Write f
ce330 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 55 irst byte past U
ce340 54 46 2d 38 20 63 68 61 72 20 68 65 72 65 20 2a TF-8 char here *
ce350 2f 0d 0a 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 /..){.. unsigne
ce360 64 20 69 6e 74 20 63 3b 0d 0a 0d 0a 20 20 2f 2a d int c;.... /*
ce370 20 53 61 6d 65 20 61 73 20 52 45 41 44 5f 55 54 Same as READ_UT
ce380 46 38 28 29 20 61 62 6f 76 65 20 62 75 74 20 77 F8() above but w
ce390 69 74 68 6f 75 74 20 74 68 65 20 7a 54 65 72 6d ithout the zTerm
ce3a0 20 70 61 72 61 6d 65 74 65 72 2e 0d 0a 20 20 2a parameter... *
ce3b0 2a 20 46 6f 72 20 74 68 69 73 20 72 6f 75 74 69 * For this routi
ce3c0 6e 65 2c 20 77 65 20 61 73 73 75 6d 65 20 74 68 ne, we assume th
ce3d0 65 20 55 54 46 38 20 73 74 72 69 6e 67 20 69 73 e UTF8 string is
ce3e0 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 always zero-ter
ce3f0 6d 69 6e 61 74 65 64 2e 0d 0a 20 20 2a 2f 0d 0a minated... */..
ce400 20 20 63 20 3d 20 2a 28 7a 49 6e 2b 2b 29 3b 0d c = *(zIn++);.
ce410 0a 20 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 . if( c>=0xc0 )
ce420 7b 0d 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 {.. c = sqlit
ce430 65 33 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 e3Utf8Trans1[c-0
ce440 78 63 30 5d 3b 0d 0a 20 20 20 20 77 68 69 6c 65 xc0];.. while
ce450 28 20 28 2a 7a 49 6e 20 26 20 30 78 63 30 29 3d ( (*zIn & 0xc0)=
ce460 3d 30 78 38 30 20 29 7b 0d 0a 20 20 20 20 20 20 =0x80 ){..
ce470 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 28 30 78 c = (c<<6) + (0x
ce480 33 66 20 26 20 2a 28 7a 49 6e 2b 2b 29 29 3b 0d 3f & *(zIn++));.
ce490 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
ce4a0 63 3c 30 78 38 30 0d 0a 20 20 20 20 20 20 20 20 c<0x80..
ce4b0 7c 7c 20 28 63 26 30 78 46 46 46 46 46 38 30 30 || (c&0xFFFFF800
ce4c0 29 3d 3d 30 78 44 38 30 30 0d 0a 20 20 20 20 20 )==0xD800..
ce4d0 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46 || (c&0xFFFFF
ce4e0 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 7b 20 FFE)==0xFFFE ){
ce4f0 20 63 20 3d 20 30 78 46 46 46 44 3b 20 7d 0d 0a c = 0xFFFD; }..
ce500 20 20 7d 0d 0a 20 20 2a 70 7a 4e 65 78 74 20 3d }.. *pzNext =
ce510 20 7a 49 6e 3b 0d 0a 20 20 72 65 74 75 72 6e 20 zIn;.. return
ce520 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 2f c;..}........../
ce530 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 54 52 41 *..** If the TRA
ce540 4e 53 4c 41 54 45 5f 54 52 41 43 45 20 6d 61 63 NSLATE_TRACE mac
ce550 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 ro is defined, t
ce560 68 65 20 76 61 6c 75 65 20 6f 66 20 65 61 63 68 he value of each
ce570 20 4d 65 6d 20 69 73 0d 0a 2a 2a 20 70 72 69 6e Mem is..** prin
ce580 74 65 64 20 6f 6e 20 73 74 64 65 72 72 20 6f 6e ted on stderr on
ce590 20 74 68 65 20 77 61 79 20 69 6e 74 6f 20 61 6e the way into an
ce5a0 64 20 6f 75 74 20 6f 66 20 73 71 6c 69 74 65 33 d out of sqlite3
ce5b0 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74 65 VdbeMemTranslate
ce5c0 28 29 2e 0d 0a 2a 2f 20 0d 0a 2f 2a 20 23 64 65 ()...*/ ../* #de
ce5d0 66 69 6e 65 20 54 52 41 4e 53 4c 41 54 45 5f 54 fine TRANSLATE_T
ce5e0 52 41 43 45 20 31 20 2a 2f 0d 0a 0d 0a 23 69 66 RACE 1 */....#if
ce5f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
ce600 5f 55 54 46 31 36 0d 0a 2f 2a 0d 0a 2a 2a 20 54 _UTF16../*..** T
ce610 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e his routine tran
ce620 73 66 6f 72 6d 73 20 74 68 65 20 69 6e 74 65 72 sforms the inter
ce630 6e 61 6c 20 74 65 78 74 20 65 6e 63 6f 64 69 6e nal text encodin
ce640 67 20 75 73 65 64 20 62 79 20 70 4d 65 6d 20 74 g used by pMem t
ce650 6f 0d 0a 2a 2a 20 64 65 73 69 72 65 64 45 6e 63 o..** desiredEnc
ce660 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 . It is an error
ce670 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 if the string i
ce680 73 20 61 6c 72 65 61 64 79 20 6f 66 20 74 68 65 s already of the
ce690 20 64 65 73 69 72 65 64 0d 0a 2a 2a 20 65 6e 63 desired..** enc
ce6a0 6f 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a 70 4d oding, or if *pM
ce6b0 65 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 em does not cont
ce6c0 61 69 6e 20 61 20 73 74 72 69 6e 67 20 76 61 6c ain a string val
ce6d0 75 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ue...*/..SQLITE_
ce6e0 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
ce6f0 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c te3VdbeMemTransl
ce700 61 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 ate(Mem *pMem, u
ce710 38 20 64 65 73 69 72 65 64 45 6e 63 29 7b 0d 0a 8 desiredEnc){..
ce720 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 int len;
ce730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
ce740 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 Maximum length
ce750 6f 66 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 of output string
ce760 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 in bytes */..
ce770 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a unsigned char *z
ce780 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 Out;
ce790 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 /* Output
ce7a0 62 75 66 66 65 72 20 2a 2f 0d 0a 20 20 75 6e 73 buffer */.. uns
ce7b0 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b igned char *zIn;
ce7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce7d0 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 /* Input iter
ce7e0 61 74 6f 72 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 ator */.. unsig
ce7f0 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b ned char *zTerm;
ce800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce810 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 /* End of input
ce820 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 */.. unsigned
ce830 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 char *z;
ce840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
ce850 4f 75 74 70 75 74 20 69 74 65 72 61 74 6f 72 20 Output iterator
ce860 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 */.. unsigned i
ce870 6e 74 20 63 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 nt c;.... asser
ce880 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c t( pMem->db==0 |
ce890 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f | sqlite3_mutex_
ce8a0 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d held(pMem->db->m
ce8b0 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 utex) );.. asse
ce8c0 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 rt( pMem->flags&
ce8d0 4d 45 4d 5f 53 74 72 20 29 3b 0d 0a 20 20 61 73 MEM_Str );.. as
ce8e0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 sert( pMem->enc!
ce8f0 3d 64 65 73 69 72 65 64 45 6e 63 20 29 3b 0d 0a =desiredEnc );..
ce900 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
ce910 65 6e 63 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 enc!=0 );.. ass
ce920 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 ert( pMem->n>=0
ce930 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 );....#if define
ce940 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43 d(TRANSLATE_TRAC
ce950 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 E) && defined(SQ
ce960 4c 49 54 45 5f 44 45 42 55 47 29 0d 0a 20 20 7b LITE_DEBUG).. {
ce970 0d 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b .. char zBuf[
ce980 31 30 30 5d 3b 0d 0a 20 20 20 20 73 71 6c 69 74 100];.. sqlit
ce990 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 e3VdbeMemPrettyP
ce9a0 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 rint(pMem, zBuf)
ce9b0 3b 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 ;.. fprintf(s
ce9c0 74 64 65 72 72 2c 20 22 49 4e 50 55 54 3a 20 20 tderr, "INPUT:
ce9d0 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0d 0a 20 %s\n", zBuf);..
ce9e0 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 }..#endif....
ce9f0 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73 6c /* If the transl
cea00 61 74 69 6f 6e 20 69 73 20 62 65 74 77 65 65 6e ation is between
cea10 20 55 54 46 2d 31 36 20 6c 69 74 74 6c 65 20 61 UTF-16 little a
cea20 6e 64 20 62 69 67 20 65 6e 64 69 61 6e 2c 20 74 nd big endian, t
cea30 68 65 6e 20 0d 0a 20 20 2a 2a 20 61 6c 6c 20 74 hen .. ** all t
cea40 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 hat is required
cea50 69 73 20 74 6f 20 73 77 61 70 20 74 68 65 20 62 is to swap the b
cea60 79 74 65 20 6f 72 64 65 72 2e 20 54 68 69 73 20 yte order. This
cea70 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64 0d case is handled.
cea80 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 6c . ** differentl
cea90 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 y from the other
ceaa0 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 s... */.. if(
ceab0 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 pMem->enc!=SQLIT
ceac0 45 5f 55 54 46 38 20 26 26 20 64 65 73 69 72 65 E_UTF8 && desire
cead0 64 45 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 dEnc!=SQLITE_UTF
ceae0 38 20 29 7b 0d 0a 20 20 20 20 75 38 20 74 65 6d 8 ){.. u8 tem
ceaf0 70 3b 0d 0a 20 20 20 20 69 6e 74 20 72 63 3b 0d p;.. int rc;.
ceb00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
ceb10 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 3VdbeMemMakeWrit
ceb20 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0d 0a 20 20 eable(pMem);..
ceb30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
ceb40 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 _OK ){.. as
ceb50 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 sert( rc==SQLITE
ceb60 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 20 20 20 _NOMEM );..
ceb70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e return SQLITE_N
ceb80 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 OMEM;.. }..
ceb90 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 zIn = (u8*)pMe
ceba0 6d 2d 3e 7a 3b 0d 0a 20 20 20 20 7a 54 65 72 6d m->z;.. zTerm
cebb0 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 26 = &zIn[pMem->n&
cebc0 7e 31 5d 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 ~1];.. while(
cebd0 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0d 0a 20 zIn<zTerm ){..
cebe0 20 20 20 20 20 74 65 6d 70 20 3d 20 2a 7a 49 6e temp = *zIn
cebf0 3b 0d 0a 20 20 20 20 20 20 2a 7a 49 6e 20 3d 20 ;.. *zIn =
cec00 2a 28 7a 49 6e 2b 31 29 3b 0d 0a 20 20 20 20 20 *(zIn+1);..
cec10 20 7a 49 6e 2b 2b 3b 0d 0a 20 20 20 20 20 20 2a zIn++;.. *
cec20 7a 49 6e 2b 2b 20 3d 20 74 65 6d 70 3b 0d 0a 20 zIn++ = temp;..
cec30 20 20 20 7d 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e }.. pMem->
cec40 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45 6e 63 enc = desiredEnc
cec50 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e ;.. goto tran
cec60 73 6c 61 74 65 5f 6f 75 74 3b 0d 0a 20 20 7d 0d slate_out;.. }.
cec70 0a 0d 0a 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20 ... /* Set len
cec80 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e to the maximum n
cec90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 umber of bytes r
ceca0 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 6f equired in the o
cecb0 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f utput buffer. */
cecc0 0d 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 45 .. if( desiredE
cecd0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 nc==SQLITE_UTF8
cece0 29 7b 0d 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 ){.. /* When
cecf0 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 converting from
ced00 55 54 46 2d 31 36 2c 20 74 68 65 20 6d 61 78 69 UTF-16, the maxi
ced10 6d 75 6d 20 67 72 6f 77 74 68 20 72 65 73 75 6c mum growth resul
ced20 74 73 20 66 72 6f 6d 0d 0a 20 20 20 20 2a 2a 20 ts from.. **
ced30 74 72 61 6e 73 6c 61 74 69 6e 67 20 61 20 32 2d translating a 2-
ced40 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 74 byte character t
ced50 6f 20 61 20 34 2d 62 79 74 65 20 55 54 46 2d 38 o a 4-byte UTF-8
ced60 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 20 20 20 character...
ced70 20 2a 2a 20 41 20 73 69 6e 67 6c 65 20 62 79 74 ** A single byt
ced80 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f e is required fo
ced90 72 20 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 r the output str
ceda0 69 6e 67 0d 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d ing.. ** nul-
cedb0 74 65 72 6d 69 6e 61 74 6f 72 2e 0d 0a 20 20 20 terminator...
cedc0 20 2a 2f 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e */.. pMem->n
cedd0 20 26 3d 20 7e 31 3b 0d 0a 20 20 20 20 6c 65 6e &= ~1;.. len
cede0 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20 2b = pMem->n * 2 +
cedf0 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 1;.. }else{..
cee00 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65 /* When conve
cee10 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 rting from UTF-8
cee20 20 74 6f 20 55 54 46 2d 31 36 20 74 68 65 20 6d to UTF-16 the m
cee30 61 78 69 6d 75 6d 20 67 72 6f 77 74 68 20 69 73 aximum growth is
cee40 20 63 61 75 73 65 64 0d 0a 20 20 20 20 2a 2a 20 caused.. **
cee50 77 68 65 6e 20 61 20 31 2d 62 79 74 65 20 55 54 when a 1-byte UT
cee60 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 73 F-8 character is
cee70 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f translated into
cee80 20 61 20 32 2d 62 79 74 65 20 55 54 46 2d 31 36 a 2-byte UTF-16
cee90 0d 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 .. ** charact
ceea0 65 72 2e 20 54 77 6f 20 62 79 74 65 73 20 61 72 er. Two bytes ar
ceeb0 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 e required in th
ceec0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 e output buffer
ceed0 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 for the.. **
ceee0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0d nul-terminator..
ceef0 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 6c 65 6e . */.. len
cef00 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20 2b = pMem->n * 2 +
cef10 20 32 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 2;.. }.... /*
cef20 20 53 65 74 20 7a 49 6e 20 74 6f 20 70 6f 69 6e Set zIn to poin
cef30 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f t at the start o
cef40 66 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 f the input buff
cef50 65 72 20 61 6e 64 20 7a 54 65 72 6d 20 74 6f 20 er and zTerm to
cef60 70 6f 69 6e 74 20 31 0d 0a 20 20 2a 2a 20 62 79 point 1.. ** by
cef70 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 2e te past the end.
cef80 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 56 61 72 .. **.. ** Var
cef90 69 61 62 6c 65 20 7a 4f 75 74 20 69 73 20 73 65 iable zOut is se
cefa0 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 t to point at th
cefb0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c e output buffer,
cefc0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 0d space obtained.
cefd0 0a 20 20 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 . ** from sqlit
cefe0 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 20 20 e3_malloc()...
ceff0 2a 2f 0d 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a */.. zIn = (u8*
cf000 29 70 4d 65 6d 2d 3e 7a 3b 0d 0a 20 20 7a 54 65 )pMem->z;.. zTe
cf010 72 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e rm = &zIn[pMem->
cf020 6e 5d 3b 0d 0a 20 20 7a 4f 75 74 20 3d 20 73 71 n];.. zOut = sq
cf030 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 lite3DbMallocRaw
cf040 28 70 4d 65 6d 2d 3e 64 62 2c 20 6c 65 6e 29 3b (pMem->db, len);
cf050 0d 0a 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b .. if( !zOut ){
cf060 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
cf070 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d ITE_NOMEM;.. }.
cf080 0a 20 20 7a 20 3d 20 7a 4f 75 74 3b 0d 0a 0d 0a . z = zOut;....
cf090 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d if( pMem->enc=
cf0a0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0d =SQLITE_UTF8 ){.
cf0b0 0a 20 20 20 20 69 66 28 20 64 65 73 69 72 65 64 . if( desired
cf0c0 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 Enc==SQLITE_UTF1
cf0d0 36 4c 45 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 6LE ){.. /*
cf0e0 20 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31 36 UTF-8 -> UTF-16
cf0f0 20 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2a Little-endian *
cf100 2f 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 /.. while(
cf110 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0d 0a 20 20 zIn<zTerm ){..
cf120 20 20 20 20 20 20 2f 2a 20 63 20 3d 20 73 71 6c /* c = sql
cf130 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 49 6e ite3Utf8Read(zIn
cf140 2c 20 7a 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 , zTerm, (const
cf150 75 38 2a 2a 29 26 7a 49 6e 29 3b 20 2a 2f 0d 0a u8**)&zIn); */..
cf160 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 READ_UTF
cf170 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 63 29 8(zIn, zTerm, c)
cf180 3b 0d 0a 20 20 20 20 20 20 20 20 57 52 49 54 45 ;.. WRITE
cf190 5f 55 54 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0d _UTF16LE(z, c);.
cf1a0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 . }.. }e
cf1b0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 lse{.. asse
cf1c0 72 74 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d rt( desiredEnc==
cf1d0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 SQLITE_UTF16BE )
cf1e0 3b 0d 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d ;.. /* UTF-
cf1f0 38 20 2d 3e 20 55 54 46 2d 31 36 20 42 69 67 2d 8 -> UTF-16 Big-
cf200 65 6e 64 69 61 6e 20 2a 2f 0d 0a 20 20 20 20 20 endian */..
cf210 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 while( zIn<zTer
cf220 6d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a m ){.. /*
cf230 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 c = sqlite3Utf8
cf240 52 65 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c Read(zIn, zTerm,
cf250 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a 49 (const u8**)&zI
cf260 6e 29 3b 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 n); */..
cf270 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a READ_UTF8(zIn, z
cf280 54 65 72 6d 2c 20 63 29 3b 0d 0a 20 20 20 20 20 Term, c);..
cf290 20 20 20 57 52 49 54 45 5f 55 54 46 31 36 42 45 WRITE_UTF16BE
cf2a0 28 7a 2c 20 63 29 3b 0d 0a 20 20 20 20 20 20 7d (z, c);.. }
cf2b0 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 4d 65 .. }.. pMe
cf2c0 6d 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 20 2d m->n = (int)(z -
cf2d0 20 7a 4f 75 74 29 3b 0d 0a 20 20 20 20 2a 7a 2b zOut);.. *z+
cf2e0 2b 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b + = 0;.. }else{
cf2f0 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 65 .. assert( de
cf300 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 siredEnc==SQLITE
cf310 5f 55 54 46 38 20 29 3b 0d 0a 20 20 20 20 69 66 _UTF8 );.. if
cf320 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c ( pMem->enc==SQL
cf330 49 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0d 0a ITE_UTF16LE ){..
cf340 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 /* UTF-16
cf350 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e Little-endian ->
cf360 20 55 54 46 2d 38 20 2a 2f 0d 0a 20 20 20 20 20 UTF-8 */..
cf370 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 while( zIn<zTer
cf380 6d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 52 45 m ){.. RE
cf390 41 44 5f 55 54 46 31 36 4c 45 28 7a 49 6e 2c 20 AD_UTF16LE(zIn,
cf3a0 7a 49 6e 3c 7a 54 65 72 6d 2c 20 63 29 3b 20 0d zIn<zTerm, c); .
cf3b0 0a 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 . WRITE_U
cf3c0 54 46 38 28 7a 2c 20 63 29 3b 0d 0a 20 20 20 20 TF8(z, c);..
cf3d0 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d }.. }else{.
cf3e0 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 . /* UTF-16
cf3f0 20 42 69 67 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 Big-endian -> U
cf400 54 46 2d 38 20 2a 2f 0d 0a 20 20 20 20 20 20 77 TF-8 */.. w
cf410 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 hile( zIn<zTerm
cf420 29 7b 0d 0a 20 20 20 20 20 20 20 20 52 45 41 44 ){.. READ
cf430 5f 55 54 46 31 36 42 45 28 7a 49 6e 2c 20 7a 49 _UTF16BE(zIn, zI
cf440 6e 3c 7a 54 65 72 6d 2c 20 63 29 3b 20 0d 0a 20 n<zTerm, c); ..
cf450 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 WRITE_UTF
cf460 38 28 7a 2c 20 63 29 3b 0d 0a 20 20 20 20 20 20 8(z, c);..
cf470 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 4d }.. }.. pM
cf480 65 6d 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 20 em->n = (int)(z
cf490 2d 20 7a 4f 75 74 29 3b 0d 0a 20 20 7d 0d 0a 20 - zOut);.. }..
cf4a0 20 2a 7a 20 3d 20 30 3b 0d 0a 20 20 61 73 73 65 *z = 0;.. asse
cf4b0 72 74 28 20 28 70 4d 65 6d 2d 3e 6e 2b 28 64 65 rt( (pMem->n+(de
cf4c0 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 siredEnc==SQLITE
cf4d0 5f 55 54 46 38 3f 31 3a 32 29 29 3c 3d 6c 65 6e _UTF8?1:2))<=len
cf4e0 20 29 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 );.... sqlite3
cf4f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 VdbeMemRelease(p
cf500 4d 65 6d 29 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 66 Mem);.. pMem->f
cf510 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 lags &= ~(MEM_St
cf520 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d atic|MEM_Dyn|MEM
cf530 5f 45 70 68 65 6d 29 3b 0d 0a 20 20 70 4d 65 6d _Ephem);.. pMem
cf540 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45 ->enc = desiredE
cf550 6e 63 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 nc;.. pMem->fla
cf560 67 73 20 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c gs |= (MEM_Term|
cf570 4d 45 4d 5f 44 79 6e 29 3b 0d 0a 20 20 70 4d 65 MEM_Dyn);.. pMe
cf580 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 7a 4f m->z = (char*)zO
cf590 75 74 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 7a 4d 61 ut;.. pMem->zMa
cf5a0 6c 6c 6f 63 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0d lloc = pMem->z;.
cf5b0 0a 0d 0a 74 72 61 6e 73 6c 61 74 65 5f 6f 75 74 ...translate_out
cf5c0 3a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 :..#if defined(T
cf5d0 52 41 4e 53 4c 41 54 45 5f 54 52 41 43 45 29 20 RANSLATE_TRACE)
cf5e0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
cf5f0 45 5f 44 45 42 55 47 29 0d 0a 20 20 7b 0d 0a 20 E_DEBUG).. {..
cf600 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 char zBuf[100
cf610 5d 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 ];.. sqlite3V
cf620 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e dbeMemPrettyPrin
cf630 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0d 0a t(pMem, zBuf);..
cf640 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 fprintf(stde
cf650 72 72 2c 20 22 4f 55 54 50 55 54 3a 20 25 73 5c rr, "OUTPUT: %s\
cf660 6e 22 2c 20 7a 42 75 66 29 3b 0d 0a 20 20 7d 0d n", zBuf);.. }.
cf670 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75 72 .#endif.. retur
cf680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
cf690 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 .../*..** This r
cf6a0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 66 6f outine checks fo
cf6b0 72 20 61 20 62 79 74 65 2d 6f 72 64 65 72 20 6d r a byte-order m
cf6c0 61 72 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e ark at the begin
cf6d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 0d 0a 2a 2a ning of the ..**
cf6e0 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 73 UTF-16 string s
cf6f0 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 2e 20 tored in *pMem.
cf700 49 66 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e If one is presen
cf710 74 2c 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 t, it is removed
cf720 20 61 6e 64 0d 0a 2a 2a 20 74 68 65 20 65 6e 63 and..** the enc
cf730 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d oding of the Mem
cf740 20 61 64 6a 75 73 74 65 64 2e 20 54 68 69 73 20 adjusted. This
cf750 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 routine does not
cf760 20 64 6f 20 61 6e 79 0d 0a 2a 2a 20 62 79 74 65 do any..** byte
cf770 2d 73 77 61 70 70 69 6e 67 2c 20 69 74 20 6a 75 -swapping, it ju
cf780 73 74 20 73 65 74 73 20 4d 65 6d 2e 65 6e 63 20 st sets Mem.enc
cf790 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0d 0a appropriately...
cf7a0 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 6c 6c 6f 63 **..** The alloc
cf7b0 61 74 69 6f 6e 20 28 73 74 61 74 69 63 2c 20 64 ation (static, d
cf7c0 79 6e 61 6d 69 63 20 65 74 63 2e 29 20 61 6e 64 ynamic etc.) and
cf7d0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 encoding of the
cf7e0 20 4d 65 6d 20 6d 61 79 20 62 65 0d 0a 2a 2a 20 Mem may be..**
cf7f0 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 changed by this
cf800 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 function...*/..S
cf810 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
cf820 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d t sqlite3VdbeMem
cf830 48 61 6e 64 6c 65 42 6f 6d 28 4d 65 6d 20 2a 70 HandleBom(Mem *p
cf840 4d 65 6d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 Mem){.. int rc
cf850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
cf860 75 38 20 62 6f 6d 20 3d 20 30 3b 0d 0a 0d 0a 20 u8 bom = 0;....
cf870 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e assert( pMem->n
cf880 3e 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 70 4d >=0 );.. if( pM
cf890 65 6d 2d 3e 6e 3e 31 20 29 7b 0d 0a 20 20 20 20 em->n>1 ){..
cf8a0 75 38 20 62 31 20 3d 20 2a 28 75 38 20 2a 29 70 u8 b1 = *(u8 *)p
cf8b0 4d 65 6d 2d 3e 7a 3b 0d 0a 20 20 20 20 75 38 20 Mem->z;.. u8
cf8c0 62 32 20 3d 20 2a 28 28 28 75 38 20 2a 29 70 4d b2 = *(((u8 *)pM
cf8d0 65 6d 2d 3e 7a 29 20 2b 20 31 29 3b 0d 0a 20 20 em->z) + 1);..
cf8e0 20 20 69 66 28 20 62 31 3d 3d 30 78 46 45 20 26 if( b1==0xFE &
cf8f0 26 20 62 32 3d 3d 30 78 46 46 20 29 7b 0d 0a 20 & b2==0xFF ){..
cf900 20 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49 54 bom = SQLIT
cf910 45 5f 55 54 46 31 36 42 45 3b 0d 0a 20 20 20 20 E_UTF16BE;..
cf920 7d 0d 0a 20 20 20 20 69 66 28 20 62 31 3d 3d 30 }.. if( b1==0
cf930 78 46 46 20 26 26 20 62 32 3d 3d 30 78 46 45 20 xFF && b2==0xFE
cf940 29 7b 0d 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20 ){.. bom =
cf950 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0d SQLITE_UTF16LE;.
cf960 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d . }.. }.. .
cf970 0a 20 20 69 66 28 20 62 6f 6d 20 29 7b 0d 0a 20 . if( bom ){..
cf980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
cf990 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 dbeMemMakeWritea
cf9a0 62 6c 65 28 70 4d 65 6d 29 3b 0d 0a 20 20 20 20 ble(pMem);..
cf9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
cf9c0 4b 20 29 7b 0d 0a 20 20 20 20 20 20 70 4d 65 6d K ){.. pMem
cf9d0 2d 3e 6e 20 2d 3d 20 32 3b 0d 0a 20 20 20 20 20 ->n -= 2;..
cf9e0 20 6d 65 6d 6d 6f 76 65 28 70 4d 65 6d 2d 3e 7a memmove(pMem->z
cf9f0 2c 20 26 70 4d 65 6d 2d 3e 7a 5b 32 5d 2c 20 70 , &pMem->z[2], p
cfa00 4d 65 6d 2d 3e 6e 29 3b 0d 0a 20 20 20 20 20 20 Mem->n);..
cfa10 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d pMem->z[pMem->n]
cfa20 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 20 20 = '\0';..
cfa30 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b pMem->z[pMem->n+
cfa40 31 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 1] = '\0';..
cfa50 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d pMem->flags |=
cfa60 20 4d 45 4d 5f 54 65 72 6d 3b 0d 0a 20 20 20 20 MEM_Term;..
cfa70 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 62 6f pMem->enc = bo
cfa80 6d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a m;.. }.. }..
cfa90 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
cfaa0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
cfab0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0d E_OMIT_UTF16 */.
cfac0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 70 5a 20 69 73 20 .../*..** pZ is
cfad0 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 a UTF-8 encoded
cfae0 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 2e 20 unicode string.
cfaf0 49 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 If nByte is less
cfb00 20 74 68 61 6e 20 7a 65 72 6f 2c 0d 0a 2a 2a 20 than zero,..**
cfb10 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 return the numbe
cfb20 72 20 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 r of unicode cha
cfb30 72 61 63 74 65 72 73 20 69 6e 20 70 5a 20 75 70 racters in pZ up
cfb40 20 74 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 to (but not inc
cfb50 6c 75 64 69 6e 67 29 0d 0a 2a 2a 20 74 68 65 20 luding)..** the
cfb60 66 69 72 73 74 20 30 78 30 30 20 62 79 74 65 2e first 0x00 byte.
cfb70 20 49 66 20 6e 42 79 74 65 20 69 73 20 6e 6f 74 If nByte is not
cfb80 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c less than zero,
cfb90 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 2a 2a 20 return the..**
cfba0 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 number of unicod
cfbb0 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 e characters in
cfbc0 74 68 65 20 66 69 72 73 74 20 6e 42 79 74 65 20 the first nByte
cfbd0 6f 66 20 70 5a 20 28 6f 72 20 75 70 20 74 6f 20 of pZ (or up to
cfbe0 0d 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30 ..** the first 0
cfbf0 78 30 30 2c 20 77 68 69 63 68 65 76 65 72 20 63 x00, whichever c
cfc00 6f 6d 65 73 20 66 69 72 73 74 29 2e 0d 0a 2a 2f omes first)...*/
cfc10 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
cfc20 20 69 6e 74 20 73 71 6c 69 74 65 33 55 74 66 38 int sqlite3Utf8
cfc30 43 68 61 72 4c 65 6e 28 63 6f 6e 73 74 20 63 68 CharLen(const ch
cfc40 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 42 79 ar *zIn, int nBy
cfc50 74 65 29 7b 0d 0a 20 20 69 6e 74 20 72 20 3d 20 te){.. int r =
cfc60 30 3b 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 0;.. const u8 *
cfc70 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a z = (const u8*)z
cfc80 49 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 In;.. const u8
cfc90 2a 7a 54 65 72 6d 3b 0d 0a 20 20 69 66 28 20 6e *zTerm;.. if( n
cfca0 42 79 74 65 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 Byte>=0 ){..
cfcb0 7a 54 65 72 6d 20 3d 20 26 7a 5b 6e 42 79 74 65 zTerm = &z[nByte
cfcc0 5d 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 ];.. }else{..
cfcd0 20 20 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 zTerm = (const
cfce0 20 75 38 2a 29 28 2d 31 29 3b 0d 0a 20 20 7d 0d u8*)(-1);.. }.
cfcf0 0a 20 20 61 73 73 65 72 74 28 20 7a 3c 3d 7a 54 . assert( z<=zT
cfd00 65 72 6d 20 29 3b 0d 0a 20 20 77 68 69 6c 65 28 erm );.. while(
cfd10 20 2a 7a 21 3d 30 20 26 26 20 7a 3c 7a 54 65 72 *z!=0 && z<zTer
cfd20 6d 20 29 7b 0d 0a 20 20 20 20 53 51 4c 49 54 45 m ){.. SQLITE
cfd30 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0d 0a _SKIP_UTF8(z);..
cfd40 20 20 20 20 72 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 r++;.. }..
cfd50 20 72 65 74 75 72 6e 20 72 3b 0d 0a 7d 0d 0a 0d return r;..}...
cfd60 0a 2f 2a 20 54 68 69 73 20 74 65 73 74 20 66 75 ./* This test fu
cfd70 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 75 nction is not cu
cfd80 72 72 65 6e 74 6c 79 20 75 73 65 64 20 62 79 20 rrently used by
cfd90 74 68 65 20 61 75 74 6f 6d 61 74 65 64 20 74 65 the automated te
cfda0 73 74 2d 73 75 69 74 65 2e 20 0d 0a 2a 2a 20 48 st-suite. ..** H
cfdb0 65 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 ence it is only
cfdc0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 64 65 62 available in deb
cfdd0 75 67 20 62 75 69 6c 64 73 2e 0d 0a 2a 2f 0d 0a ug builds...*/..
cfde0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
cfdf0 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 TE_TEST) && defi
cfe00 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
cfe10 29 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 61 6e 73 6c )../*..** Transl
cfe20 61 74 65 20 55 54 46 2d 38 20 74 6f 20 55 54 46 ate UTF-8 to UTF
cfe30 2d 38 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 -8...**..** This
cfe40 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 has the effect
cfe50 6f 66 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 of making sure t
cfe60 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20 69 hat the string i
cfe70 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0d 0a 2a s well-formed..*
cfe80 2a 20 55 54 46 2d 38 2e 20 20 4d 69 73 63 6f 64 * UTF-8. Miscod
cfe90 65 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 ed characters ar
cfea0 65 20 72 65 6d 6f 76 65 64 2e 0d 0a 2a 2a 0d 0a e removed...**..
cfeb0 2a 2a 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 ** The translati
cfec0 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c on is done in-pl
cfed0 61 63 65 20 61 6e 64 20 61 62 6f 72 74 65 64 20 ace and aborted
cfee0 69 66 20 74 68 65 20 6f 75 74 70 75 74 0d 0a 2a if the output..*
cfef0 2a 20 6f 76 65 72 72 75 6e 73 20 74 68 65 20 69 * overruns the i
cff00 6e 70 75 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 nput...*/..SQLIT
cff10 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
cff20 6c 69 74 65 33 55 74 66 38 54 6f 38 28 75 6e 73 lite3Utf8To8(uns
cff30 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 29 igned char *zIn)
cff40 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 {.. unsigned ch
cff50 61 72 20 2a 7a 4f 75 74 20 3d 20 7a 49 6e 3b 0d ar *zOut = zIn;.
cff60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 . unsigned char
cff70 20 2a 7a 53 74 61 72 74 20 3d 20 7a 49 6e 3b 0d *zStart = zIn;.
cff80 0a 20 20 75 33 32 20 63 3b 0d 0a 0d 0a 20 20 77 . u32 c;.... w
cff90 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 26 26 20 hile( zIn[0] &&
cffa0 7a 4f 75 74 3c 3d 7a 49 6e 20 29 7b 0d 0a 20 20 zOut<=zIn ){..
cffb0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 c = sqlite3Utf
cffc0 38 52 65 61 64 28 7a 49 6e 2c 20 28 63 6f 6e 73 8Read(zIn, (cons
cffd0 74 20 75 38 2a 2a 29 26 7a 49 6e 29 3b 0d 0a 20 t u8**)&zIn);..
cffe0 20 20 20 69 66 28 20 63 21 3d 30 78 66 66 66 64 if( c!=0xfffd
cfff0 20 29 7b 0d 0a 20 20 20 20 20 20 57 52 49 54 45 ){.. WRITE
d0000 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63 29 3b 0d _UTF8(zOut, c);.
d0010 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 2a . }.. }.. *
d0020 7a 4f 75 74 20 3d 20 30 3b 0d 0a 20 20 72 65 74 zOut = 0;.. ret
d0030 75 72 6e 20 28 69 6e 74 29 28 7a 4f 75 74 20 2d urn (int)(zOut -
d0040 20 7a 53 74 61 72 74 29 3b 0d 0a 7d 0d 0a 23 65 zStart);..}..#e
d0050 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 ndif....#ifndef
d0060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 SQLITE_OMIT_UTF1
d0070 36 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 6../*..** Conver
d0080 74 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e t a UTF-16 strin
d0090 67 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65 20 g in the native
d00a0 65 6e 63 6f 64 69 6e 67 20 69 6e 74 6f 20 61 20 encoding into a
d00b0 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 0d 0a 2a UTF-8 string...*
d00c0 2a 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 * Memory to hold
d00d0 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e the UTF-8 strin
d00e0 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 g is obtained fr
d00f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f om sqlite3_mallo
d0100 63 20 61 6e 64 20 6d 75 73 74 0d 0a 2a 2a 20 62 c and must..** b
d0110 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 e freed by the c
d0120 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e alling function.
d0130 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 55 4c 4c 20 69 73 ..**..** NULL is
d0140 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 returned if the
d0150 72 65 20 69 73 20 61 6e 20 61 6c 6c 6f 63 61 74 re is an allocat
d0160 69 6f 6e 20 65 72 72 6f 72 2e 0d 0a 2a 2f 0d 0a ion error...*/..
d0170 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 SQLITE_PRIVATE c
d0180 68 61 72 20 2a 73 71 6c 69 74 65 33 55 74 66 31 har *sqlite3Utf1
d0190 36 74 6f 38 28 73 71 6c 69 74 65 33 20 2a 64 62 6to8(sqlite3 *db
d01a0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 2c , const void *z,
d01b0 20 69 6e 74 20 6e 42 79 74 65 2c 20 75 38 20 65 int nByte, u8 e
d01c0 6e 63 29 7b 0d 0a 20 20 4d 65 6d 20 6d 3b 0d 0a nc){.. Mem m;..
d01d0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 memset(&m, 0,
d01e0 73 69 7a 65 6f 66 28 6d 29 29 3b 0d 0a 20 20 6d sizeof(m));.. m
d01f0 2e 64 62 20 3d 20 64 62 3b 0d 0a 20 20 73 71 6c .db = db;.. sql
d0200 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 ite3VdbeMemSetSt
d0210 72 28 26 6d 2c 20 7a 2c 20 6e 42 79 74 65 2c 20 r(&m, z, nByte,
d0220 65 6e 63 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 enc, SQLITE_STAT
d0230 49 43 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 56 IC);.. sqlite3V
d0240 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e dbeChangeEncodin
d0250 67 28 26 6d 2c 20 53 51 4c 49 54 45 5f 55 54 46 g(&m, SQLITE_UTF
d0260 38 29 3b 0d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 8);.. if( db->m
d0270 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0d 0a allocFailed ){..
d0280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
d0290 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0d 0a emRelease(&m);..
d02a0 20 20 20 20 6d 2e 7a 20 3d 20 30 3b 0d 0a 20 20 m.z = 0;..
d02b0 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 28 6d 2e }.. assert( (m.
d02c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 54 65 72 6d flags & MEM_Term
d02d0 29 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c )!=0 || db->mall
d02e0 6f 63 46 61 69 6c 65 64 20 29 3b 0d 0a 20 20 61 ocFailed );.. a
d02f0 73 73 65 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 ssert( (m.flags
d0300 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 7c 7c & MEM_Str)!=0 ||
d0310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
d0320 64 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 d );.. assert(
d0330 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 (m.flags & MEM_D
d0340 79 6e 29 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 yn)!=0 || db->ma
d0350 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0d 0a 20 llocFailed );..
d0360 20 61 73 73 65 72 74 28 20 6d 2e 7a 20 7c 7c 20 assert( m.z ||
d0370 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
d0380 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 6d 2e );.. return m.
d0390 7a 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 z;..}..../*..**
d03a0 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 Convert a UTF-8
d03b0 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 55 54 string to the UT
d03c0 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 73 70 F-16 encoding sp
d03d0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d ecified by param
d03e0 65 74 65 72 0d 0a 2a 2a 20 65 6e 63 2e 20 41 20 eter..** enc. A
d03f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e pointer to the n
d0400 65 77 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 ew string is ret
d0410 75 72 6e 65 64 2c 20 61 6e 64 20 74 68 65 20 76 urned, and the v
d0420 61 6c 75 65 20 6f 66 20 2a 70 6e 4f 75 74 0d 0a alue of *pnOut..
d0430 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 ** is set to the
d0440 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 72 length of the r
d0450 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 eturned string i
d0460 6e 20 62 79 74 65 73 2e 20 54 68 65 20 63 61 6c n bytes. The cal
d0470 6c 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 61 72 72 l should..** arr
d0480 61 6e 67 65 20 74 6f 20 63 61 6c 6c 20 73 71 6c ange to call sql
d0490 69 74 65 33 44 62 46 72 65 65 28 29 20 6f 6e 20 ite3DbFree() on
d04a0 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 the returned poi
d04b0 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 0d nter when it is.
d04c0 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 .** no longer re
d04d0 71 75 69 72 65 64 2e 0d 0a 2a 2a 20 0d 0a 2a 2a quired...** ..**
d04e0 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 If a malloc fai
d04f0 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 4e 55 4c lure occurs, NUL
d0500 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e L is returned an
d0510 64 20 74 68 65 20 64 62 2e 6d 61 6c 6c 6f 63 46 d the db.mallocF
d0520 61 69 6c 65 64 0d 0a 2a 2a 20 66 6c 61 67 20 73 ailed..** flag s
d0530 65 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 et...*/..#ifdef
d0540 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 SQLITE_ENABLE_ST
d0550 41 54 33 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 AT3..SQLITE_PRIV
d0560 41 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 65 ATE char *sqlite
d0570 33 55 74 66 38 74 6f 31 36 28 73 71 6c 69 74 65 3Utf8to16(sqlite
d0580 33 20 2a 64 62 2c 20 75 38 20 65 6e 63 2c 20 63 3 *db, u8 enc, c
d0590 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 har *z, int n, i
d05a0 6e 74 20 2a 70 6e 4f 75 74 29 7b 0d 0a 20 20 4d nt *pnOut){.. M
d05b0 65 6d 20 6d 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 em m;.. memset(
d05c0 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 &m, 0, sizeof(m)
d05d0 29 3b 0d 0a 20 20 6d 2e 64 62 20 3d 20 64 62 3b );.. m.db = db;
d05e0 0d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d .. sqlite3VdbeM
d05f0 65 6d 53 65 74 53 74 72 28 26 6d 2c 20 7a 2c 20 emSetStr(&m, z,
d0600 6e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 n, SQLITE_UTF8,
d0610 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0d SQLITE_STATIC);.
d0620 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 . if( sqlite3Vd
d0630 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74 65 28 26 beMemTranslate(&
d0640 6d 2c 20 65 6e 63 29 20 29 7b 0d 0a 20 20 20 20 m, enc) ){..
d0650 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c assert( db->mall
d0660 6f 63 46 61 69 6c 65 64 20 29 3b 0d 0a 20 20 20 ocFailed );..
d0670 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d return 0;.. }.
d0680 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 7a 3d 3d . assert( m.z==
d0690 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0d 0a 20 20 m.zMalloc );..
d06a0 2a 70 6e 4f 75 74 20 3d 20 6d 2e 6e 3b 0d 0a 20 *pnOut = m.n;..
d06b0 20 72 65 74 75 72 6e 20 6d 2e 7a 3b 0d 0a 7d 0d return m.z;..}.
d06c0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
d06d0 2a 20 7a 49 6e 20 69 73 20 61 20 55 54 46 2d 31 * zIn is a UTF-1
d06e0 36 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64 6 encoded unicod
d06f0 65 20 73 74 72 69 6e 67 20 61 74 20 6c 65 61 73 e string at leas
d0700 74 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 t nChar characte
d0710 72 73 20 6c 6f 6e 67 2e 0d 0a 2a 2a 20 52 65 74 rs long...** Ret
d0720 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
d0730 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 66 f bytes in the f
d0740 69 72 73 74 20 6e 43 68 61 72 20 75 6e 69 63 6f irst nChar unico
d0750 64 65 20 63 68 61 72 61 63 74 65 72 73 0d 0a 2a de characters..*
d0760 2a 20 69 6e 20 70 5a 2e 20 20 6e 43 68 61 72 20 * in pZ. nChar
d0770 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 must be non-nega
d0780 74 69 76 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 tive...*/..SQLIT
d0790 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
d07a0 6c 69 74 65 33 55 74 66 31 36 42 79 74 65 4c 65 lite3Utf16ByteLe
d07b0 6e 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 49 n(const void *zI
d07c0 6e 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0d 0a n, int nChar){..
d07d0 20 20 69 6e 74 20 63 3b 0d 0a 20 20 75 6e 73 69 int c;.. unsi
d07e0 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 gned char const
d07f0 2a 7a 20 3d 20 7a 49 6e 3b 0d 0a 20 20 69 6e 74 *z = zIn;.. int
d0800 20 6e 20 3d 20 30 3b 0d 0a 20 20 0d 0a 20 20 69 n = 0;.. .. i
d0810 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e f( SQLITE_UTF16N
d0820 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 ATIVE==SQLITE_UT
d0830 46 31 36 42 45 20 29 7b 0d 0a 20 20 20 20 77 68 F16BE ){.. wh
d0840 69 6c 65 28 20 6e 3c 6e 43 68 61 72 20 29 7b 0d ile( n<nChar ){.
d0850 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 . READ_UTF1
d0860 36 42 45 28 7a 2c 20 31 2c 20 63 29 3b 0d 0a 20 6BE(z, 1, c);..
d0870 20 20 20 20 20 6e 2b 2b 3b 0d 0a 20 20 20 20 7d n++;.. }
d0880 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
d0890 77 68 69 6c 65 28 20 6e 3c 6e 43 68 61 72 20 29 while( n<nChar )
d08a0 7b 0d 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54 {.. READ_UT
d08b0 46 31 36 4c 45 28 7a 2c 20 31 2c 20 63 29 3b 0d F16LE(z, 1, c);.
d08c0 0a 20 20 20 20 20 20 6e 2b 2b 3b 0d 0a 20 20 20 . n++;..
d08d0 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 }.. }.. retur
d08e0 6e 20 28 69 6e 74 29 28 7a 2d 28 75 6e 73 69 67 n (int)(z-(unsig
d08f0 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a ned char const *
d0900 29 7a 49 6e 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 )zIn);..}....#if
d0910 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
d0920 54 45 53 54 29 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 TEST)../*..** Th
d0930 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
d0940 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 54 43 lled from the TC
d0950 4c 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 L test function
d0960 22 74 72 61 6e 73 6c 61 74 65 5f 73 65 6c 66 74 "translate_selft
d0970 65 73 74 22 2e 0d 0a 2a 2a 20 49 74 20 63 68 65 est"...** It che
d0980 63 6b 73 20 74 68 61 74 20 74 68 65 20 70 72 69 cks that the pri
d0990 6d 69 74 69 76 65 73 20 66 6f 72 20 73 65 72 69 mitives for seri
d09a0 61 6c 69 7a 69 6e 67 20 61 6e 64 20 64 65 73 65 alizing and dese
d09b0 72 69 61 6c 69 7a 69 6e 67 0d 0a 2a 2a 20 63 68 rializing..** ch
d09c0 61 72 61 63 74 65 72 73 20 69 6e 20 65 61 63 68 aracters in each
d09d0 20 65 6e 63 6f 64 69 6e 67 20 61 72 65 20 69 6e encoding are in
d09e0 76 65 72 73 65 73 20 6f 66 20 65 61 63 68 20 6f verses of each o
d09f0 74 68 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 ther...*/..SQLIT
d0a00 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
d0a10 71 6c 69 74 65 33 55 74 66 53 65 6c 66 54 65 73 qlite3UtfSelfTes
d0a20 74 28 76 6f 69 64 29 7b 0d 0a 20 20 75 6e 73 69 t(void){.. unsi
d0a30 67 6e 65 64 20 69 6e 74 20 69 2c 20 74 3b 0d 0a gned int i, t;..
d0a40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
d0a50 7a 42 75 66 5b 32 30 5d 3b 0d 0a 20 20 75 6e 73 zBuf[20];.. uns
d0a60 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0d 0a igned char *z;..
d0a70 20 20 69 6e 74 20 6e 3b 0d 0a 20 20 75 6e 73 69 int n;.. unsi
d0a80 67 6e 65 64 20 69 6e 74 20 63 3b 0d 0a 0d 0a 20 gned int c;....
d0a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30 30 for(i=0; i<0x00
d0aa0 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0d 0a 20 110000; i++){..
d0ab0 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0d 0a 20 20 z = zBuf;..
d0ac0 20 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c 20 WRITE_UTF8(z,
d0ad0 69 29 3b 0d 0a 20 20 20 20 6e 20 3d 20 28 69 6e i);.. n = (in
d0ae0 74 29 28 7a 2d 7a 42 75 66 29 3b 0d 0a 20 20 20 t)(z-zBuf);..
d0af0 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 assert( n>0 &&
d0b00 6e 3c 3d 34 20 29 3b 0d 0a 20 20 20 20 7a 5b 30 n<=4 );.. z[0
d0b10 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 7a 20 3d 20 ] = 0;.. z =
d0b20 7a 42 75 66 3b 0d 0a 20 20 20 20 63 20 3d 20 73 zBuf;.. c = s
d0b30 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a qlite3Utf8Read(z
d0b40 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a , (const u8**)&z
d0b50 29 3b 0d 0a 20 20 20 20 74 20 3d 20 69 3b 0d 0a );.. t = i;..
d0b60 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 if( i>=0xD80
d0b70 30 20 26 26 20 69 3c 3d 30 78 44 46 46 46 20 29 0 && i<=0xDFFF )
d0b80 20 74 20 3d 20 30 78 46 46 46 44 3b 0d 0a 20 20 t = 0xFFFD;..
d0b90 20 20 69 66 28 20 28 69 26 30 78 46 46 46 46 46 if( (i&0xFFFFF
d0ba0 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 20 74 FFE)==0xFFFE ) t
d0bb0 20 3d 20 30 78 46 46 46 44 3b 0d 0a 20 20 20 20 = 0xFFFD;..
d0bc0 61 73 73 65 72 74 28 20 63 3d 3d 74 20 29 3b 0d assert( c==t );.
d0bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d . assert( (z-
d0be0 7a 42 75 66 29 3d 3d 6e 20 29 3b 0d 0a 20 20 7d zBuf)==n );.. }
d0bf0 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 .. for(i=0; i<0
d0c00 78 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b x00110000; i++){
d0c10 0d 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44 .. if( i>=0xD
d0c20 38 30 30 20 26 26 20 69 3c 30 78 45 30 30 30 20 800 && i<0xE000
d0c30 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 ) continue;..
d0c40 20 7a 20 3d 20 7a 42 75 66 3b 0d 0a 20 20 20 20 z = zBuf;..
d0c50 57 52 49 54 45 5f 55 54 46 31 36 4c 45 28 7a 2c WRITE_UTF16LE(z,
d0c60 20 69 29 3b 0d 0a 20 20 20 20 6e 20 3d 20 28 69 i);.. n = (i
d0c70 6e 74 29 28 7a 2d 7a 42 75 66 29 3b 0d 0a 20 20 nt)(z-zBuf);..
d0c80 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 assert( n>0 &&
d0c90 20 6e 3c 3d 34 20 29 3b 0d 0a 20 20 20 20 7a 5b n<=4 );.. z[
d0ca0 30 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 7a 20 3d 0] = 0;.. z =
d0cb0 20 7a 42 75 66 3b 0d 0a 20 20 20 20 52 45 41 44 zBuf;.. READ
d0cc0 5f 55 54 46 31 36 4c 45 28 7a 2c 20 31 2c 20 63 _UTF16LE(z, 1, c
d0cd0 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
d0ce0 63 3d 3d 69 20 29 3b 0d 0a 20 20 20 20 61 73 73 c==i );.. ass
d0cf0 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e ert( (z-zBuf)==n
d0d00 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 66 6f 72 28 );.. }.. for(
d0d10 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30 i=0; i<0x0011000
d0d20 30 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 0; i++){.. if
d0d30 28 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 ( i>=0xD800 && i
d0d40 3c 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69 6e <0xE000 ) contin
d0d50 75 65 3b 0d 0a 20 20 20 20 7a 20 3d 20 7a 42 75 ue;.. z = zBu
d0d60 66 3b 0d 0a 20 20 20 20 57 52 49 54 45 5f 55 54 f;.. WRITE_UT
d0d70 46 31 36 42 45 28 7a 2c 20 69 29 3b 0d 0a 20 20 F16BE(z, i);..
d0d80 20 20 6e 20 3d 20 28 69 6e 74 29 28 7a 2d 7a 42 n = (int)(z-zB
d0d90 75 66 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 uf);.. assert
d0da0 28 20 6e 3e 30 20 26 26 20 6e 3c 3d 34 20 29 3b ( n>0 && n<=4 );
d0db0 0d 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0d .. z[0] = 0;.
d0dc0 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0d 0a . z = zBuf;..
d0dd0 20 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 READ_UTF16BE
d0de0 28 7a 2c 20 31 2c 20 63 29 3b 0d 0a 20 20 20 20 (z, 1, c);..
d0df0 61 73 73 65 72 74 28 20 63 3d 3d 69 20 29 3b 0d assert( c==i );.
d0e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d . assert( (z-
d0e10 7a 42 75 66 29 3d 3d 6e 20 29 3b 0d 0a 20 20 7d zBuf)==n );.. }
d0e20 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 ..}..#endif /* S
d0e30 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0d 0a 23 QLITE_TEST */..#
d0e40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
d0e50 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0d 0a 0d OMIT_UTF16 */...
d0e60 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
d0e70 20 45 6e 64 20 6f 66 20 75 74 66 2e 63 20 2a 2a End of utf.c **
d0e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d0e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d0ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
d0eb0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
d0ec0 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 75 74 69 * Begin file uti
d0ed0 6c 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a l.c ************
d0ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d0ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d0f00 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 31 20 53 /../*..** 2001 S
d0f10 65 70 74 65 6d 62 65 72 20 31 35 0d 0a 2a 2a 0d eptember 15..**.
d0f20 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 .** The author d
d0f30 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 isclaims copyrig
d0f40 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 ht to this sourc
d0f50 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 e code. In plac
d0f60 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c e of..** a legal
d0f70 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 notice, here is
d0f80 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a a blessing:..**
d0f90 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
d0fa0 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 do good and not
d0fb0 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 evil...** May
d0fc0 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 you find forgiv
d0fd0 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 eness for yourse
d0fe0 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f lf and forgive o
d0ff0 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 thers...** Ma
d1000 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 y you share free
d1010 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 ly, never taking
d1020 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 more than you g
d1030 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a ive...**..******
d1040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d1050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d1060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d1070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d1080 2a 2a 2a 0d 0a 2a 2a 20 55 74 69 6c 69 74 79 20 ***..** Utility
d1090 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 functions used t
d10a0 68 72 6f 75 67 68 6f 75 74 20 73 71 6c 69 74 65 hroughout sqlite
d10b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 ...**..** This f
d10c0 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e ile contains fun
d10d0 63 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 6f 63 ctions for alloc
d10e0 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 63 6f ating memory, co
d10f0 6d 70 61 72 69 6e 67 0d 0a 2a 2a 20 73 74 72 69 mparing..** stri
d1100 6e 67 73 2c 20 61 6e 64 20 73 74 75 66 66 20 6c ngs, and stuff l
d1110 69 6b 65 20 74 68 61 74 2e 0d 0a 2a 2a 0d 0a 2a ike that...**..*
d1120 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 3c /../* #include <
d1130 73 74 64 61 72 67 2e 68 3e 20 2a 2f 0d 0a 23 69 stdarg.h> */..#i
d1140 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 fdef SQLITE_HAVE
d1150 5f 49 53 4e 41 4e 0d 0a 23 20 69 6e 63 6c 75 64 _ISNAN..# includ
d1160 65 20 3c 6d 61 74 68 2e 68 3e 0d 0a 23 65 6e 64 e <math.h>..#end
d1170 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 6f 75 if..../*..** Rou
d1180 74 69 6e 65 20 6e 65 65 64 65 64 20 74 6f 20 73 tine needed to s
d1190 75 70 70 6f 72 74 20 74 68 65 20 74 65 73 74 63 upport the testc
d11a0 61 73 65 28 29 20 6d 61 63 72 6f 2e 0d 0a 2a 2f ase() macro...*/
d11b0 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
d11c0 43 4f 56 45 52 41 47 45 5f 54 45 53 54 0d 0a 53 COVERAGE_TEST..S
d11d0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
d11e0 69 64 20 73 71 6c 69 74 65 33 43 6f 76 65 72 61 id sqlite3Covera
d11f0 67 65 28 69 6e 74 20 78 29 7b 0d 0a 20 20 73 74 ge(int x){.. st
d1200 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 64 75 atic unsigned du
d1210 6d 6d 79 20 3d 20 30 3b 0d 0a 20 20 64 75 6d 6d mmy = 0;.. dumm
d1220 79 20 2b 3d 20 28 75 6e 73 69 67 6e 65 64 29 78 y += (unsigned)x
d1230 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ;..}..#endif....
d1240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
d1250 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 MIT_FLOATING_POI
d1260 4e 54 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 NT../*..** Retur
d1270 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 6c n true if the fl
d1280 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c oating point val
d1290 75 65 20 69 73 20 4e 6f 74 20 61 20 4e 75 6d 62 ue is Not a Numb
d12a0 65 72 20 28 4e 61 4e 29 2e 0d 0a 2a 2a 0d 0a 2a er (NaN)...**..*
d12b0 2a 20 55 73 65 20 74 68 65 20 6d 61 74 68 20 6c * Use the math l
d12c0 69 62 72 61 72 79 20 69 73 6e 61 6e 28 29 20 66 ibrary isnan() f
d12d0 75 6e 63 74 69 6f 6e 20 69 66 20 63 6f 6d 70 69 unction if compi
d12e0 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f led with SQLITE_
d12f0 48 41 56 45 5f 49 53 4e 41 4e 2e 0d 0a 2a 2a 20 HAVE_ISNAN...**
d1300 4f 74 68 65 72 77 69 73 65 2c 20 77 65 20 68 61 Otherwise, we ha
d1310 76 65 20 6f 75 72 20 6f 77 6e 20 69 6d 70 6c 65 ve our own imple
d1320 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 77 mentation that w
d1330 6f 72 6b 73 20 6f 6e 20 6d 6f 73 74 20 73 79 73 orks on most sys
d1340 74 65 6d 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 tems...*/..SQLIT
d1350 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
d1360 6c 69 74 65 33 49 73 4e 61 4e 28 64 6f 75 62 6c lite3IsNaN(doubl
d1370 65 20 78 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b e x){.. int rc;
d1380 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 /* The value
d1390 72 65 74 75 72 6e 20 2a 2f 0d 0a 23 69 66 20 21 return */..#if !
d13a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 defined(SQLITE_H
d13b0 41 56 45 5f 49 53 4e 41 4e 29 0d 0a 20 20 2f 2a AVE_ISNAN).. /*
d13c0 0d 0a 20 20 2a 2a 20 53 79 73 74 65 6d 73 20 74 .. ** Systems t
d13d0 68 61 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 hat support the
d13e0 69 73 6e 61 6e 28 29 20 6c 69 62 72 61 72 79 20 isnan() library
d13f0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 function should
d1400 70 72 6f 62 61 62 6c 79 0d 0a 20 20 2a 2a 20 6d probably.. ** m
d1410 61 6b 65 20 75 73 65 20 6f 66 20 69 74 20 62 79 ake use of it by
d1420 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 compiling with
d1430 2d 44 53 51 4c 49 54 45 5f 48 41 56 45 5f 49 53 -DSQLITE_HAVE_IS
d1440 4e 41 4e 2e 20 20 42 75 74 20 77 65 20 68 61 76 NAN. But we hav
d1450 65 0d 0a 20 20 2a 2a 20 66 6f 75 6e 64 20 74 68 e.. ** found th
d1460 61 74 20 6d 61 6e 79 20 73 79 73 74 65 6d 73 20 at many systems
d1470 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 77 6f do not have a wo
d1480 72 6b 69 6e 67 20 69 73 6e 61 6e 28 29 20 66 75 rking isnan() fu
d1490 6e 63 74 69 6f 6e 20 73 6f 0d 0a 20 20 2a 2a 20 nction so.. **
d14a0 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 this implementat
d14b0 69 6f 6e 20 69 73 20 70 72 6f 76 69 64 65 64 20 ion is provided
d14c0 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 as an alternativ
d14d0 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 e... **.. ** T
d14e0 68 69 73 20 4e 61 4e 20 74 65 73 74 20 73 6f 6d his NaN test som
d14f0 65 74 69 6d 65 73 20 66 61 69 6c 73 20 69 66 20 etimes fails if
d1500 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 47 43 43 20 compiled on GCC
d1510 77 69 74 68 20 2d 66 66 61 73 74 2d 6d 61 74 68 with -ffast-math
d1520 2e 0d 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f ... ** On the o
d1530 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 75 ther hand, the u
d1540 73 65 20 6f 66 20 2d 66 66 61 73 74 2d 6d 61 74 se of -ffast-mat
d1550 68 20 63 6f 6d 65 73 20 77 69 74 68 20 74 68 65 h comes with the
d1560 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 20 20 2a 2a following.. **
d1570 20 77 61 72 6e 69 6e 67 3a 0d 0a 20 20 2a 2a 0d warning:.. **.
d1580 0a 20 20 2a 2a 20 20 20 20 20 20 54 68 69 73 20 . ** This
d1590 6f 70 74 69 6f 6e 20 5b 2d 66 66 61 73 74 2d 6d option [-ffast-m
d15a0 61 74 68 5d 20 73 68 6f 75 6c 64 20 6e 65 76 65 ath] should neve
d15b0 72 20 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 62 r be turned on b
d15c0 79 20 61 6e 79 0d 0a 20 20 2a 2a 20 20 20 20 20 y any.. **
d15d0 20 2d 4f 20 6f 70 74 69 6f 6e 20 73 69 6e 63 65 -O option since
d15e0 20 69 74 20 63 61 6e 20 72 65 73 75 6c 74 20 69 it can result i
d15f0 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 75 74 70 n incorrect outp
d1600 75 74 20 66 6f 72 20 70 72 6f 67 72 61 6d 73 0d ut for programs.
d1610 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 69 63 68 . ** which
d1620 20 64 65 70 65 6e 64 20 6f 6e 20 61 6e 20 65 78 depend on an ex
d1630 61 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 act implementati
d1640 6f 6e 20 6f 66 20 49 45 45 45 20 6f 72 20 49 53 on of IEEE or IS
d1650 4f 20 0d 0a 20 20 2a 2a 20 20 20 20 20 20 72 75 O .. ** ru
d1660 6c 65 73 2f 73 70 65 63 69 66 69 63 61 74 69 6f les/specificatio
d1670 6e 73 20 66 6f 72 20 6d 61 74 68 20 66 75 6e 63 ns for math func
d1680 74 69 6f 6e 73 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 tions... **..
d1690 2a 2a 20 55 6e 64 65 72 20 4d 53 56 43 2c 20 74 ** Under MSVC, t
d16a0 68 69 73 20 4e 61 4e 20 74 65 73 74 20 6d 61 79 his NaN test may
d16b0 20 66 61 69 6c 20 69 66 20 63 6f 6d 70 69 6c 65 fail if compile
d16c0 64 20 77 69 74 68 20 61 20 66 6c 6f 61 74 69 6e d with a floatin
d16d0 67 2d 0d 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 70 g-.. ** point p
d16e0 72 65 63 69 73 69 6f 6e 20 6d 6f 64 65 20 6f 74 recision mode ot
d16f0 68 65 72 20 74 68 61 6e 20 2f 66 70 3a 70 72 65 her than /fp:pre
d1700 63 69 73 65 2e 20 20 46 72 6f 6d 20 74 68 65 20 cise. From the
d1710 4d 53 44 4e 20 0d 0a 20 20 2a 2a 20 64 6f 63 75 MSDN .. ** docu
d1720 6d 65 6e 74 61 74 69 6f 6e 3a 0d 0a 20 20 2a 2a mentation:.. **
d1730 0d 0a 20 20 2a 2a 20 20 20 20 20 20 54 68 65 20 .. ** The
d1740 63 6f 6d 70 69 6c 65 72 20 5b 77 69 74 68 20 2f compiler [with /
d1750 66 70 3a 70 72 65 63 69 73 65 5d 20 77 69 6c 6c fp:precise] will
d1760 20 70 72 6f 70 65 72 6c 79 20 68 61 6e 64 6c 65 properly handle
d1770 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 0d 0a 20 comparisons ..
d1780 20 2a 2a 20 20 20 20 20 20 69 6e 76 6f 6c 76 69 ** involvi
d1790 6e 67 20 4e 61 4e 2e 20 46 6f 72 20 65 78 61 6d ng NaN. For exam
d17a0 70 6c 65 2c 20 78 20 21 3d 20 78 20 65 76 61 6c ple, x != x eval
d17b0 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 uates to true if
d17c0 20 78 20 69 73 20 4e 61 4e 20 0d 0a 20 20 2a 2a x is NaN .. **
d17d0 20 20 20 20 20 20 2e 2e 2e 0d 0a 20 20 2a 2f 0d ..... */.
d17e0 0a 23 69 66 64 65 66 20 5f 5f 46 41 53 54 5f 4d .#ifdef __FAST_M
d17f0 41 54 48 5f 5f 0d 0a 23 20 65 72 72 6f 72 20 53 ATH__..# error S
d1800 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 77 QLite will not w
d1810 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 77 69 ork correctly wi
d1820 74 68 20 74 68 65 20 2d 66 66 61 73 74 2d 6d 61 th the -ffast-ma
d1830 74 68 20 6f 70 74 69 6f 6e 20 6f 66 20 47 43 43 th option of GCC
d1840 2e 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 76 6f 6c ...#endif.. vol
d1850 61 74 69 6c 65 20 64 6f 75 62 6c 65 20 79 20 3d atile double y =
d1860 20 78 3b 0d 0a 20 20 76 6f 6c 61 74 69 6c 65 20 x;.. volatile
d1870 64 6f 75 62 6c 65 20 7a 20 3d 20 79 3b 0d 0a 20 double z = y;..
d1880 20 72 63 20 3d 20 28 79 21 3d 7a 29 3b 0d 0a 23 rc = (y!=z);..#
d1890 65 6c 73 65 20 20 2f 2a 20 69 66 20 64 65 66 69 else /* if defi
d18a0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f ned(SQLITE_HAVE_
d18b0 49 53 4e 41 4e 29 20 2a 2f 0d 0a 20 20 72 63 20 ISNAN) */.. rc
d18c0 3d 20 69 73 6e 61 6e 28 78 29 3b 0d 0a 23 65 6e = isnan(x);..#en
d18d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 dif /* SQLITE_HA
d18e0 56 45 5f 49 53 4e 41 4e 20 2a 2f 0d 0a 20 20 74 VE_ISNAN */.. t
d18f0 65 73 74 63 61 73 65 28 20 72 63 20 29 3b 0d 0a estcase( rc );..
d1900 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
d1910 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
d1920 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f E_OMIT_FLOATING_
d1930 50 4f 49 4e 54 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a POINT */..../*..
d1940 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 ** Compute a str
d1950 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20 ing length that
d1960 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 is limited to wh
d1970 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 at can be stored
d1980 20 69 6e 0d 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 in..** lower 30
d1990 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 bits of a 32-bi
d19a0 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 t signed integer
d19b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 76 61 ...**..** The va
d19c0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c lue returned wil
d19d0 6c 20 6e 65 76 65 72 20 62 65 20 6e 65 67 61 74 l never be negat
d19e0 69 76 65 2e 20 20 4e 6f 72 20 77 69 6c 6c 20 69 ive. Nor will i
d19f0 74 20 65 76 65 72 20 62 65 20 67 72 65 61 74 65 t ever be greate
d1a00 72 0d 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 r..** than the a
d1a10 63 74 75 61 6c 20 6c 65 6e 67 74 68 20 6f 66 20 ctual length of
d1a20 74 68 65 20 73 74 72 69 6e 67 2e 20 20 46 6f 72 the string. For
d1a30 20 76 65 72 79 20 6c 6f 6e 67 20 73 74 72 69 6e very long strin
d1a40 67 73 20 28 67 72 65 61 74 65 72 0d 0a 2a 2a 20 gs (greater..**
d1a50 74 68 61 6e 20 31 47 69 42 29 20 74 68 65 20 76 than 1GiB) the v
d1a60 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 6d 69 alue returned mi
d1a70 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e ght be less than
d1a80 20 74 68 65 20 74 72 75 65 20 73 74 72 69 6e 67 the true string
d1a90 20 6c 65 6e 67 74 68 2e 0d 0a 2a 2f 0d 0a 53 51 length...*/..SQ
d1aa0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
d1ab0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
d1ac0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b (const char *z){
d1ad0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
d1ae0 7a 32 20 3d 20 7a 3b 0d 0a 20 20 69 66 28 20 7a z2 = z;.. if( z
d1af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0d ==0 ) return 0;.
d1b00 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b . while( *z2 ){
d1b10 20 7a 32 2b 2b 3b 20 7d 0d 0a 20 20 72 65 74 75 z2++; }.. retu
d1b20 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 rn 0x3fffffff &
d1b30 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0d 0a (int)(z2 - z);..
d1b40 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 }..../*..** Set
d1b50 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 the most recent
d1b60 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 error code and e
d1b70 72 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 rror string for
d1b80 74 68 65 20 73 71 6c 69 74 65 0d 0a 2a 2a 20 68 the sqlite..** h
d1b90 61 6e 64 6c 65 20 22 64 62 22 2e 20 54 68 65 20 andle "db". The
d1ba0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 65 error code is se
d1bb0 74 20 74 6f 20 22 65 72 72 5f 63 6f 64 65 22 2e t to "err_code".
d1bc0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 69 74 20 69 ..**..** If it i
d1bd0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 72 69 s not NULL, stri
d1be0 6e 67 20 7a 46 6f 72 6d 61 74 20 73 70 65 63 69 ng zFormat speci
d1bf0 66 69 65 73 20 74 68 65 20 66 6f 72 6d 61 74 20 fies the format
d1c00 6f 66 20 74 68 65 0d 0a 2a 2a 20 65 72 72 6f 72 of the..** error
d1c10 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 73 string in the s
d1c20 74 79 6c 65 20 6f 66 20 74 68 65 20 70 72 69 6e tyle of the prin
d1c30 74 66 20 66 75 6e 63 74 69 6f 6e 73 3a 20 54 68 tf functions: Th
d1c40 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 e following..**
d1c50 66 6f 72 6d 61 74 20 63 68 61 72 61 63 74 65 72 format character
d1c60 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0d 0a s are allowed:..
d1c70 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 **..** %s
d1c80 20 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 Insert a str
d1c90 69 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 25 7a 20 ing..** %z
d1ca0 20 20 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 A string th
d1cb0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 at should be fre
d1cc0 65 64 20 61 66 74 65 72 20 75 73 65 0d 0a 2a 2a ed after use..**
d1cd0 20 20 20 20 20 20 25 64 20 20 20 20 20 20 49 6e %d In
d1ce0 73 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72 0d sert an integer.
d1cf0 0a 2a 2a 20 20 20 20 20 20 25 54 20 20 20 20 20 .** %T
d1d00 20 49 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e 0d Insert a token.
d1d10 0a 2a 2a 20 20 20 20 20 20 25 53 20 20 20 20 20 .** %S
d1d20 20 49 6e 73 65 72 74 20 74 68 65 20 66 69 72 73 Insert the firs
d1d30 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53 t element of a S
d1d40 72 63 4c 69 73 74 0d 0a 2a 2a 0d 0a 2a 2a 20 7a rcList..**..** z
d1d50 46 6f 72 6d 61 74 20 61 6e 64 20 61 6e 79 20 73 Format and any s
d1d60 74 72 69 6e 67 20 74 6f 6b 65 6e 73 20 74 68 61 tring tokens tha
d1d70 74 20 66 6f 6c 6c 6f 77 20 69 74 20 61 72 65 20 t follow it are
d1d80 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0d 0a 2a assumed to be..*
d1d90 2a 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 * encoded in UTF
d1da0 2d 38 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 6f 20 63 -8...**..** To c
d1db0 6c 65 61 72 20 74 68 65 20 6d 6f 73 74 20 72 65 lear the most re
d1dc0 63 65 6e 74 20 65 72 72 6f 72 20 66 6f 72 20 73 cent error for s
d1dd0 71 6c 69 74 65 20 68 61 6e 64 6c 65 20 22 64 62 qlite handle "db
d1de0 22 2c 20 73 71 6c 69 74 65 33 45 72 72 6f 72 0d ", sqlite3Error.
d1df0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 61 .** should be ca
d1e00 6c 6c 65 64 20 77 69 74 68 20 65 72 72 5f 63 6f lled with err_co
d1e10 64 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 de set to SQLITE
d1e20 5f 4f 4b 20 61 6e 64 20 7a 46 6f 72 6d 61 74 20 _OK and zFormat
d1e30 73 65 74 0d 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e set..** to NULL.
d1e40 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
d1e50 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
d1e60 33 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 3Error(sqlite3 *
d1e70 64 62 2c 20 69 6e 74 20 65 72 72 5f 63 6f 64 65 db, int err_code
d1e80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
d1e90 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 ormat, ...){..
d1ea0 69 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e 70 if( db && (db->p
d1eb0 45 72 72 20 7c 7c 20 28 64 62 2d 3e 70 45 72 72 Err || (db->pErr
d1ec0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e = sqlite3ValueN
d1ed0 65 77 28 64 62 29 29 21 3d 30 29 20 29 7b 0d 0a ew(db))!=0) ){..
d1ee0 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 db->errCode
d1ef0 3d 20 65 72 72 5f 63 6f 64 65 3b 0d 0a 20 20 20 = err_code;..
d1f00 20 69 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0d if( zFormat ){.
d1f10 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0d . char *z;.
d1f20 0a 20 20 20 20 20 20 76 61 5f 6c 69 73 74 20 61 . va_list a
d1f30 70 3b 0d 0a 20 20 20 20 20 20 76 61 5f 73 74 61 p;.. va_sta
d1f40 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
d1f50 0d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 .. z = sqli
d1f60 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 te3VMPrintf(db,
d1f70 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 zFormat, ap);..
d1f80 20 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b va_end(ap);
d1f90 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 .. sqlite3V
d1fa0 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 alueSetStr(db->p
d1fb0 45 72 72 2c 20 2d 31 2c 20 7a 2c 20 53 51 4c 49 Err, -1, z, SQLI
d1fc0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f TE_UTF8, SQLITE_
d1fd0 44 59 4e 41 4d 49 43 29 3b 0d 0a 20 20 20 20 7d DYNAMIC);.. }
d1fe0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 73 71 6c else{.. sql
d1ff0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 ite3ValueSetStr(
d2000 64 62 2d 3e 70 45 72 72 2c 20 30 2c 20 30 2c 20 db->pErr, 0, 0,
d2010 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c SQLITE_UTF8, SQL
d2020 49 54 45 5f 53 54 41 54 49 43 29 3b 0d 0a 20 20 ITE_STATIC);..
d2030 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f }.. }..}..../
d2040 2a 0d 0a 2a 2a 20 41 64 64 20 61 6e 20 65 72 72 *..** Add an err
d2050 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 or message to pP
d2060 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e arse->zErrMsg an
d2070 64 20 69 6e 63 72 65 6d 65 6e 74 20 70 50 61 72 d increment pPar
d2080 73 65 2d 3e 6e 45 72 72 2e 0d 0a 2a 2a 20 54 68 se->nErr...** Th
d2090 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d e following form
d20a0 61 74 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 atting character
d20b0 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a 0d 0a s are allowed:..
d20c0 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 25 73 20 20 **..** %s
d20d0 20 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72 Insert a str
d20e0 69 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 25 7a 20 ing..** %z
d20f0 20 20 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 A string th
d2100 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 at should be fre
d2110 65 64 20 61 66 74 65 72 20 75 73 65 0d 0a 2a 2a ed after use..**
d2120 20 20 20 20 20 20 25 64 20 20 20 20 20 20 49 6e %d In
d2130 73 65 72 74 20 61 6e 20 69 6e 74 65 67 65 72 0d sert an integer.
d2140 0a 2a 2a 20 20 20 20 20 20 25 54 20 20 20 20 20 .** %T
d2150 20 49 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e 0d Insert a token.
d2160 0a 2a 2a 20 20 20 20 20 20 25 53 20 20 20 20 20 .** %S
d2170 20 49 6e 73 65 72 74 20 74 68 65 20 66 69 72 73 Insert the firs
d2180 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53 t element of a S
d2190 72 63 4c 69 73 74 0d 0a 2a 2a 0d 0a 2a 2a 20 54 rcList..**..** T
d21a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f his function sho
d21b0 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 72 uld be used to r
d21c0 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 20 eport any error
d21d0 74 68 61 74 20 6f 63 63 75 72 73 20 77 68 69 6c that occurs whil
d21e0 73 74 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 st..** compiling
d21f0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e an SQL statemen
d2200 74 20 28 69 2e 65 2e 20 77 69 74 68 69 6e 20 73 t (i.e. within s
d2210 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 qlite3_prepare()
d2220 29 2e 20 54 68 65 0d 0a 2a 2a 20 6c 61 73 74 20 ). The..** last
d2230 74 68 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 thing the sqlite
d2240 33 5f 70 72 65 70 61 72 65 28 29 20 66 75 6e 63 3_prepare() func
d2250 74 69 6f 6e 20 64 6f 65 73 20 69 73 20 63 6f 70 tion does is cop
d2260 79 20 74 68 65 20 65 72 72 6f 72 0d 0a 2a 2a 20 y the error..**
d2270 73 74 6f 72 65 64 20 62 79 20 74 68 69 73 20 66 stored by this f
d2280 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 unction into the
d2290 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 database handle
d22a0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 45 72 using sqlite3Er
d22b0 72 6f 72 28 29 2e 0d 0a 2a 2a 20 46 75 6e 63 74 ror()...** Funct
d22c0 69 6f 6e 20 73 71 6c 69 74 65 33 45 72 72 6f 72 ion sqlite3Error
d22d0 28 29 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 () should be use
d22e0 64 20 64 75 72 69 6e 67 20 73 74 61 74 65 6d 65 d during stateme
d22f0 6e 74 20 65 78 65 63 75 74 69 6f 6e 0d 0a 2a 2a nt execution..**
d2300 20 28 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 (sqlite3_step()
d2310 20 65 74 63 2e 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c etc.)...*/..SQL
d2320 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
d2330 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
d2340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 (Parse *pParse,
d2350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 const char *zFor
d2360 6d 61 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 63 68 mat, ...){.. ch
d2370 61 72 20 2a 7a 4d 73 67 3b 0d 0a 20 20 76 61 5f ar *zMsg;.. va_
d2380 6c 69 73 74 20 61 70 3b 0d 0a 20 20 73 71 6c 69 list ap;.. sqli
d2390 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 te3 *db = pParse
d23a0 2d 3e 64 62 3b 0d 0a 20 20 76 61 5f 73 74 61 72 ->db;.. va_star
d23b0 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0d t(ap, zFormat);.
d23c0 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 . zMsg = sqlite
d23d0 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 3VMPrintf(db, zF
d23e0 6f 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 ormat, ap);.. v
d23f0 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 20 20 69 66 a_end(ap);.. if
d2400 28 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 ( db->suppressEr
d2410 72 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 r ){.. sqlite
d2420 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 73 67 3DbFree(db, zMsg
d2430 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 );.. }else{..
d2440 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b pParse->nErr++
d2450 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 ;.. sqlite3Db
d2460 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d Free(db, pParse-
d2470 3e 7a 45 72 72 4d 73 67 29 3b 0d 0a 20 20 20 20 >zErrMsg);..
d2480 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 pParse->zErrMsg
d2490 3d 20 7a 4d 73 67 3b 0d 0a 20 20 20 20 70 50 61 = zMsg;.. pPa
d24a0 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 rse->rc = SQLITE
d24b0 5f 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a 7d 0d _ERROR;.. }..}.
d24c0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 .../*..** Conver
d24d0 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 t an SQL-style q
d24e0 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 uoted string int
d24f0 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e o a normal strin
d2500 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0d 0a 2a g by removing..*
d2510 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 * the quote char
d2520 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e acters. The con
d2530 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 version is done
d2540 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 in-place. If th
d2550 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 e..** input does
d2560 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 not begin with
d2570 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 a quote characte
d2580 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 r, then this rou
d2590 74 69 6e 65 0d 0a 2a 2a 20 69 73 20 61 20 6e 6f tine..** is a no
d25a0 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 -op...**..** The
d25b0 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 6d 75 input string mu
d25c0 73 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 st be zero-termi
d25d0 6e 61 74 65 64 2e 20 20 41 20 6e 65 77 20 7a 65 nated. A new ze
d25e0 72 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 0d 0a 2a ro-terminator..*
d25f0 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 * is added to th
d2600 65 20 64 65 71 75 6f 74 65 64 20 73 74 72 69 6e e dequoted strin
d2610 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 72 g...**..** The r
d2620 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 2d eturn value is -
d2630 31 20 69 66 20 6e 6f 20 64 65 71 75 6f 74 69 6e 1 if no dequotin
d2640 67 20 6f 63 63 75 72 73 20 6f 72 20 74 68 65 20 g occurs or the
d2650 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0d 0a 2a length of the..*
d2660 2a 20 64 65 71 75 6f 74 65 64 20 73 74 72 69 6e * dequoted strin
d2670 67 2c 20 65 78 63 6c 75 73 69 76 65 20 6f 66 20 g, exclusive of
d2680 74 68 65 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 the zero termina
d2690 74 6f 72 2c 20 69 66 20 64 65 71 75 6f 74 69 6e tor, if dequotin
d26a0 67 20 64 6f 65 73 0d 0a 2a 2a 20 6f 63 63 75 72 g does..** occur
d26b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 32 30 30 32 2d 46 ...**..** 2002-F
d26c0 65 62 2d 31 34 3a 20 54 68 69 73 20 72 6f 75 74 eb-14: This rout
d26d0 69 6e 65 20 69 73 20 65 78 74 65 6e 64 65 64 20 ine is extended
d26e0 74 6f 20 72 65 6d 6f 76 65 20 4d 53 2d 41 63 63 to remove MS-Acc
d26f0 65 73 73 20 73 74 79 6c 65 0d 0a 2a 2a 20 62 72 ess style..** br
d2700 61 63 6b 65 74 73 20 66 72 6f 6d 20 61 72 6f 75 ackets from arou
d2710 6e 64 20 69 64 65 6e 74 69 66 65 72 73 2e 20 20 nd identifers.
d2720 46 6f 72 20 65 78 61 6d 70 6c 65 3a 20 20 22 5b For example: "[
d2730 61 2d 62 2d 63 5d 22 20 62 65 63 6f 6d 65 73 0d a-b-c]" becomes.
d2740 0a 2a 2a 20 22 61 2d 62 2d 63 22 2e 0d 0a 2a 2f .** "a-b-c"...*/
d2750 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
d2760 20 69 6e 74 20 73 71 6c 69 74 65 33 44 65 71 75 int sqlite3Dequ
d2770 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0d 0a 20 ote(char *z){..
d2780 20 63 68 61 72 20 71 75 6f 74 65 3b 0d 0a 20 20 char quote;..
d2790 69 6e 74 20 69 2c 20 6a 3b 0d 0a 20 20 69 66 28 int i, j;.. if(
d27a0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d z==0 ) return -
d27b0 31 3b 0d 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b 1;.. quote = z[
d27c0 30 5d 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 71 0];.. switch( q
d27d0 75 6f 74 65 20 29 7b 0d 0a 20 20 20 20 63 61 73 uote ){.. cas
d27e0 65 20 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0d e '\'': break;.
d27f0 0a 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 20 . case '"':
d2800 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 break;.. cas
d2810 65 20 27 60 27 3a 20 20 20 62 72 65 61 6b 3b 20 e '`': break;
d2820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
d2830 2a 20 46 6f 72 20 4d 79 53 51 4c 20 63 6f 6d 70 * For MySQL comp
d2840 61 74 69 62 69 6c 69 74 79 20 2a 2f 0d 0a 20 20 atibility */..
d2850 20 20 63 61 73 65 20 27 5b 27 3a 20 20 20 71 75 case '[': qu
d2860 6f 74 65 20 3d 20 27 5d 27 3b 20 20 62 72 65 61 ote = ']'; brea
d2870 6b 3b 20 20 2f 2a 20 46 6f 72 20 4d 53 20 53 71 k; /* For MS Sq
d2880 6c 53 65 72 76 65 72 20 63 6f 6d 70 61 74 69 62 lServer compatib
d2890 69 6c 69 74 79 20 2a 2f 0d 0a 20 20 20 20 64 65 ility */.. de
d28a0 66 61 75 6c 74 3a 20 20 20 20 72 65 74 75 72 6e fault: return
d28b0 20 2d 31 3b 0d 0a 20 20 7d 0d 0a 20 20 66 6f 72 -1;.. }.. for
d28c0 28 69 3d 31 2c 20 6a 3d 30 3b 20 41 4c 57 41 59 (i=1, j=0; ALWAY
d28d0 53 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0d 0a S(z[i]); i++){..
d28e0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 if( z[i]==qu
d28f0 6f 74 65 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 ote ){.. if
d2900 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65 20 ( z[i+1]==quote
d2910 29 7b 0d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b ){.. z[j+
d2920 2b 5d 20 3d 20 71 75 6f 74 65 3b 0d 0a 20 20 20 +] = quote;..
d2930 20 20 20 20 20 69 2b 2b 3b 0d 0a 20 20 20 20 20 i++;..
d2940 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
d2950 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d break;.. }
d2960 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
d2970 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 z[j++] = z[i
d2980 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a ];.. }.. }..
d2990 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0d 0a 20 20 72 z[j] = 0;.. r
d29a0 65 74 75 72 6e 20 6a 3b 0d 0a 7d 0d 0a 0d 0a 2f eturn j;..}..../
d29b0 2a 20 43 6f 6e 76 65 6e 69 65 6e 74 20 73 68 6f * Convenient sho
d29c0 72 74 2d 68 61 6e 64 20 2a 2f 0d 0a 23 64 65 66 rt-hand */..#def
d29d0 69 6e 65 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 ine UpperToLower
d29e0 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c sqlite3UpperToL
d29f0 6f 77 65 72 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 ower..../*..** S
d2a00 6f 6d 65 20 73 79 73 74 65 6d 73 20 68 61 76 65 ome systems have
d2a10 20 73 74 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 stricmp(). Oth
d2a20 65 72 73 20 68 61 76 65 20 73 74 72 63 61 73 65 ers have strcase
d2a30 63 6d 70 28 29 2e 20 20 42 65 63 61 75 73 65 0d cmp(). Because.
d2a40 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 .** there is no
d2a50 63 6f 6e 73 69 73 74 65 6e 63 79 2c 20 77 65 20 consistency, we
d2a60 77 69 6c 6c 20 64 65 66 69 6e 65 20 6f 75 72 20 will define our
d2a70 6f 77 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 4d 50 own...**..** IMP
d2a80 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 LEMENTATION-OF:
d2a90 52 2d 32 30 35 32 32 2d 32 34 36 33 39 20 54 68 R-20522-24639 Th
d2aa0 65 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 e sqlite3_strnic
d2ab0 6d 70 28 29 20 41 50 49 20 61 6c 6c 6f 77 73 0d mp() API allows.
d2ac0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 .** applications
d2ad0 20 61 6e 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 and extensions
d2ae0 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 to compare the c
d2af0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 77 6f 20 62 ontents of two b
d2b00 75 66 66 65 72 73 0d 0a 2a 2a 20 63 6f 6e 74 61 uffers..** conta
d2b10 69 6e 69 6e 67 20 55 54 46 2d 38 20 73 74 72 69 ining UTF-8 stri
d2b20 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e ngs in a case-in
d2b30 64 65 70 65 6e 64 65 6e 74 20 66 61 73 68 69 6f dependent fashio
d2b40 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d n, using the sam
d2b50 65 0d 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e e..** definition
d2b60 20 6f 66 20 63 61 73 65 20 69 6e 64 65 70 65 6e of case indepen
d2b70 64 65 6e 63 65 20 74 68 61 74 20 53 51 4c 69 74 dence that SQLit
d2b80 65 20 75 73 65 73 20 69 6e 74 65 72 6e 61 6c 6c e uses internall
d2b90 79 20 77 68 65 6e 0d 0a 2a 2a 20 63 6f 6d 70 61 y when..** compa
d2ba0 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 72 73 ring identifiers
d2bb0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
d2bc0 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
d2bd0 33 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 3StrICmp(const c
d2be0 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 har *zLeft, cons
d2bf0 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b t char *zRight){
d2c00 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 .. unsigned cha
d2c10 72 20 2a 61 2c 20 2a 62 3b 0d 0a 20 20 72 65 67 r *a, *b;.. reg
d2c20 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 73 ister unsigned s
d2c30 68 6f 72 74 20 73 61 20 3d 20 30 2c 20 73 62 20 hort sa = 0, sb
d2c40 3d 20 30 3b 0d 0a 20 20 61 20 3d 20 28 75 6e 73 = 0;.. a = (uns
d2c50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 igned char *)zLe
d2c60 66 74 3b 0d 0a 20 20 62 20 3d 20 28 75 6e 73 69 ft;.. b = (unsi
d2c70 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67 gned char *)zRig
d2c80 68 74 3b 0d 0a 20 20 66 6f 72 28 3b 3b 29 0d 0a ht;.. for(;;)..
d2c90 20 20 7b 0d 0a 09 20 20 73 61 20 3d 20 73 71 6c {... sa = sql
d2ca0 69 74 65 33 55 74 66 38 52 65 61 64 28 61 2c 20 ite3Utf8Read(a,
d2cb0 26 61 29 3b 0d 0a 09 20 20 73 62 20 3d 20 73 71 &a);... sb = sq
d2cc0 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 62 2c lite3Utf8Read(b,
d2cd0 20 26 62 29 3b 0d 0a 09 20 20 69 66 28 21 73 61 &b);... if(!sa
d2ce0 29 0d 0a 09 09 20 20 62 72 65 61 6b 3b 0d 0a 09 ).... break;...
d2cf0 20 20 69 66 28 6f 61 73 55 70 70 65 72 32 4c 6f if(oasUpper2Lo
d2d00 77 65 72 5b 73 61 5d 20 21 3d 20 6f 61 73 55 70 wer[sa] != oasUp
d2d10 70 65 72 32 4c 6f 77 65 72 5b 73 62 5d 29 0d 0a per2Lower[sb])..
d2d20 09 09 20 20 62 72 65 61 6b 3b 0d 0a 20 20 7d 0d .. break;.. }.
d2d30 0a 20 20 72 65 74 75 72 6e 20 6f 61 73 55 70 70 . return oasUpp
d2d40 65 72 32 4c 6f 77 65 72 5b 73 61 5d 20 2d 20 6f er2Lower[sa] - o
d2d50 61 73 55 70 70 65 72 32 4c 6f 77 65 72 5b 73 62 asUpper2Lower[sb
d2d60 5d 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 41 50 ];..}..SQLITE_AP
d2d70 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 I int sqlite3_st
d2d80 72 6e 69 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 rnicmp(const cha
d2d90 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 r *zLeft, const
d2da0 63 68 61 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e char *zRight, in
d2db0 74 20 4e 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 t N){.. unsigne
d2dc0 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0d 0a d char *a, *b;..
d2dd0 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 unsigned short
d2de0 20 73 61 20 3d 20 30 2c 20 73 62 20 3d 20 30 3b sa = 0, sb = 0;
d2df0 0d 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 .. a = (unsigne
d2e00 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0d d char *)zLeft;.
d2e10 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 . b = (unsigned
d2e20 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0d char *)zRight;.
d2e30 0a 20 20 77 68 69 6c 65 28 4e 2d 2d 20 3e 20 30 . while(N-- > 0
d2e40 29 0d 0a 20 20 7b 0d 0a 09 20 20 73 61 20 3d 20 ).. {... sa =
d2e50 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 sqlite3Utf8Read(
d2e60 61 2c 20 26 61 29 3b 0d 0a 09 20 20 73 62 20 3d a, &a);... sb =
d2e70 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 sqlite3Utf8Read
d2e80 28 62 2c 20 26 62 29 3b 0d 0a 09 20 20 69 66 28 (b, &b);... if(
d2e90 21 73 61 29 0d 0a 09 09 20 20 62 72 65 61 6b 3b !sa).... break;
d2ea0 0d 0a 09 20 20 69 66 28 6f 61 73 55 70 70 65 72 ... if(oasUpper
d2eb0 32 4c 6f 77 65 72 5b 73 61 5d 20 21 3d 20 6f 61 2Lower[sa] != oa
d2ec0 73 55 70 70 65 72 32 4c 6f 77 65 72 5b 73 62 5d sUpper2Lower[sb]
d2ed0 29 0d 0a 09 09 20 20 62 72 65 61 6b 3b 0d 0a 20 ).... break;..
d2ee0 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 4e 3c 30 }.. return N<0
d2ef0 20 3f 20 30 20 3a 20 6f 61 73 55 70 70 65 72 32 ? 0 : oasUpper2
d2f00 4c 6f 77 65 72 5b 73 61 5d 20 2d 20 6f 61 73 55 Lower[sa] - oasU
d2f10 70 70 65 72 32 4c 6f 77 65 72 5b 73 62 5d 3b 0d pper2Lower[sb];.
d2f20 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 .}..../*..** The
d2f30 20 73 74 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 string z[] is a
d2f40 6e 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 n text represent
d2f50 61 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 ation of a real
d2f60 6e 75 6d 62 65 72 2e 0d 0a 2a 2a 20 43 6f 6e 76 number...** Conv
d2f70 65 72 74 20 74 68 69 73 20 73 74 72 69 6e 67 20 ert this string
d2f80 74 6f 20 61 20 64 6f 75 62 6c 65 20 61 6e 64 20 to a double and
d2f90 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 2a 70 write it into *p
d2fa0 52 65 73 75 6c 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 Result...**..**
d2fb0 54 68 65 20 73 74 72 69 6e 67 20 7a 5b 5d 20 69 The string z[] i
d2fc0 73 20 6c 65 6e 67 74 68 20 62 79 74 65 73 20 69 s length bytes i
d2fd0 6e 20 6c 65 6e 67 74 68 20 28 62 79 74 65 73 2c n length (bytes,
d2fe0 20 6e 6f 74 20 63 68 61 72 61 63 74 65 72 73 29 not characters)
d2ff0 20 61 6e 64 0d 0a 2a 2a 20 75 73 65 73 20 74 68 and..** uses th
d3000 65 20 65 6e 63 6f 64 69 6e 67 20 65 6e 63 2e 20 e encoding enc.
d3010 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e The string is n
d3020 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 7a ot necessarily z
d3030 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0d ero-terminated..
d3040 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 54 .**..** Return T
d3050 52 55 45 20 69 66 20 74 68 65 20 72 65 73 75 6c RUE if the resul
d3060 74 20 69 73 20 61 20 76 61 6c 69 64 20 72 65 61 t is a valid rea
d3070 6c 20 6e 75 6d 62 65 72 20 28 6f 72 20 69 6e 74 l number (or int
d3080 65 67 65 72 29 20 61 6e 64 20 46 41 4c 53 45 0d eger) and FALSE.
d3090 0a 2a 2a 20 69 66 20 74 68 65 20 73 74 72 69 6e .** if the strin
d30a0 67 20 69 73 20 65 6d 70 74 79 20 6f 72 20 63 6f g is empty or co
d30b0 6e 74 61 69 6e 73 20 65 78 74 72 61 6e 65 6f 75 ntains extraneou
d30c0 73 20 74 65 78 74 2e 20 20 56 61 6c 69 64 20 6e s text. Valid n
d30d0 75 6d 62 65 72 73 0d 0a 2a 2a 20 61 72 65 20 69 umbers..** are i
d30e0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 66 n one of these f
d30f0 6f 72 6d 61 74 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 ormats:..**..**
d3100 20 20 20 5b 2b 2d 5d 64 69 67 69 74 73 5b 45 5b [+-]digits[E[
d3110 2b 2d 5d 64 69 67 69 74 73 5d 0d 0a 2a 2a 20 20 +-]digits]..**
d3120 20 20 5b 2b 2d 5d 64 69 67 69 74 73 2e 5b 64 69 [+-]digits.[di
d3130 67 69 74 73 5d 5b 45 5b 2b 2d 5d 64 69 67 69 74 gits][E[+-]digit
d3140 73 5d 0d 0a 2a 2a 20 20 20 20 5b 2b 2d 5d 2e 64 s]..** [+-].d
d3150 69 67 69 74 73 5b 45 5b 2b 2d 5d 64 69 67 69 74 igits[E[+-]digit
d3160 73 5d 0d 0a 2a 2a 0d 0a 2a 2a 20 4c 65 61 64 69 s]..**..** Leadi
d3170 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 ng and trailing
d3180 77 68 69 74 65 73 70 61 63 65 20 69 73 20 69 67 whitespace is ig
d3190 6e 6f 72 65 64 20 66 6f 72 20 74 68 65 20 70 75 nored for the pu
d31a0 72 70 6f 73 65 20 6f 66 20 64 65 74 65 72 6d 69 rpose of determi
d31b0 6e 69 6e 67 0d 0a 2a 2a 20 76 61 6c 69 64 69 74 ning..** validit
d31c0 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 6f y...**..** If so
d31d0 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 me prefix of the
d31e0 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73 input string is
d31f0 20 61 20 76 61 6c 69 64 20 6e 75 6d 62 65 72 2c a valid number,
d3200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0d 0a 2a this routine..*
d3210 2a 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 * returns FALSE
d3220 62 75 74 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e but it still con
d3230 76 65 72 74 73 20 74 68 65 20 70 72 65 66 69 78 verts the prefix
d3240 20 61 6e 64 20 77 72 69 74 65 73 20 74 68 65 20 and writes the
d3250 72 65 73 75 6c 74 0d 0a 2a 2a 20 69 6e 74 6f 20 result..** into
d3260 2a 70 52 65 73 75 6c 74 2e 0d 0a 2a 2f 0d 0a 53 *pResult...*/..S
d3270 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
d3280 74 20 73 71 6c 69 74 65 33 41 74 6f 46 28 63 6f t sqlite3AtoF(co
d3290 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 64 6f 75 nst char *z, dou
d32a0 62 6c 65 20 2a 70 52 65 73 75 6c 74 2c 20 69 6e ble *pResult, in
d32b0 74 20 6c 65 6e 67 74 68 2c 20 75 38 20 65 6e 63 t length, u8 enc
d32c0 29 7b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 ){..#ifndef SQLI
d32d0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 TE_OMIT_FLOATING
d32e0 5f 50 4f 49 4e 54 0d 0a 20 20 69 6e 74 20 69 6e _POINT.. int in
d32f0 63 72 20 3d 20 28 65 6e 63 3d 3d 53 51 4c 49 54 cr = (enc==SQLIT
d3300 45 5f 55 54 46 38 3f 31 3a 32 29 3b 0d 0a 20 20 E_UTF8?1:2);..
d3310 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 const char *zEnd
d3320 20 3d 20 7a 20 2b 20 6c 65 6e 67 74 68 3b 0d 0a = z + length;..
d3330 20 20 2f 2a 20 73 69 67 6e 20 2a 20 73 69 67 6e /* sign * sign
d3340 69 66 69 63 61 6e 64 20 2a 20 28 31 30 20 5e 20 ificand * (10 ^
d3350 28 65 73 69 67 6e 20 2a 20 65 78 70 6f 6e 65 6e (esign * exponen
d3360 74 29 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 69 t)) */.. int si
d3370 67 6e 20 3d 20 31 3b 20 20 20 20 2f 2a 20 73 69 gn = 1; /* si
d3380 67 6e 20 6f 66 20 73 69 67 6e 69 66 69 63 61 6e gn of significan
d3390 64 20 2a 2f 0d 0a 20 20 69 36 34 20 73 20 3d 20 d */.. i64 s =
d33a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 67 6e 0; /* sign
d33b0 69 66 69 63 61 6e 64 20 2a 2f 0d 0a 20 20 69 6e ificand */.. in
d33c0 74 20 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f t d = 0; /
d33d0 2a 20 61 64 6a 75 73 74 20 65 78 70 6f 6e 65 6e * adjust exponen
d33e0 74 20 66 6f 72 20 73 68 69 66 74 69 6e 67 20 64 t for shifting d
d33f0 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0d ecimal point */.
d3400 0a 20 20 69 6e 74 20 65 73 69 67 6e 20 3d 20 31 . int esign = 1
d3410 3b 20 20 20 2f 2a 20 73 69 67 6e 20 6f 66 20 65 ; /* sign of e
d3420 78 70 6f 6e 65 6e 74 20 2a 2f 0d 0a 20 20 69 6e xponent */.. in
d3430 74 20 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f t e = 0; /
d3440 2a 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0d 0a 20 * exponent */..
d3450 20 69 6e 74 20 65 56 61 6c 69 64 20 3d 20 31 3b int eValid = 1;
d3460 20 20 2f 2a 20 54 72 75 65 20 65 78 70 6f 6e 65 /* True expone
d3470 6e 74 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 nt is either not
d3480 20 75 73 65 64 20 6f 72 20 69 73 20 77 65 6c 6c used or is well
d3490 2d 66 6f 72 6d 65 64 20 2a 2f 0d 0a 20 20 64 6f -formed */.. do
d34a0 75 62 6c 65 20 72 65 73 75 6c 74 3b 0d 0a 20 20 uble result;..
d34b0 69 6e 74 20 6e 44 69 67 69 74 73 20 3d 20 30 3b int nDigits = 0;
d34c0 0d 0a 0d 0a 20 20 2a 70 52 65 73 75 6c 74 20 3d .... *pResult =
d34d0 20 30 2e 30 3b 20 20 20 2f 2a 20 44 65 66 61 75 0.0; /* Defau
d34e0 6c 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c lt return value,
d34f0 20 69 6e 20 63 61 73 65 20 6f 66 20 61 6e 20 65 in case of an e
d3500 72 72 6f 72 20 2a 2f 0d 0a 0d 0a 20 20 69 66 28 rror */.... if(
d3510 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 enc==SQLITE_UTF
d3520 31 36 42 45 20 29 20 7a 2b 2b 3b 0d 0a 0d 0a 20 16BE ) z++;....
d3530 20 2f 2a 20 73 6b 69 70 20 6c 65 61 64 69 6e 67 /* skip leading
d3540 20 73 70 61 63 65 73 20 2a 2f 0d 0a 20 20 77 68 spaces */.. wh
d3550 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20 73 ile( z<zEnd && s
d3560 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a qlite3Isspace(*z
d3570 29 20 29 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 20 ) ) z+=incr;..
d3580 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20 72 65 if( z>=zEnd ) re
d3590 74 75 72 6e 20 30 3b 0d 0a 0d 0a 20 20 2f 2a 20 turn 0;.... /*
d35a0 67 65 74 20 73 69 67 6e 20 6f 66 20 73 69 67 6e get sign of sign
d35b0 69 66 69 63 61 6e 64 20 2a 2f 0d 0a 20 20 69 66 ificand */.. if
d35c0 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0d 0a 20 20 ( *z=='-' ){..
d35d0 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0d 0a 20 20 sign = -1;..
d35e0 20 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 20 7d 65 z+=incr;.. }e
d35f0 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 lse if( *z=='+'
d3600 29 7b 0d 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b ){.. z+=incr;
d3610 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 73 6b .. }.... /* sk
d3620 69 70 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 65 ip leading zeroe
d3630 73 20 2a 2f 0d 0a 20 20 77 68 69 6c 65 28 20 7a s */.. while( z
d3640 3c 7a 45 6e 64 20 26 26 20 7a 5b 30 5d 3d 3d 27 <zEnd && z[0]=='
d3650 30 27 20 29 20 7a 2b 3d 69 6e 63 72 2c 20 6e 44 0' ) z+=incr, nD
d3660 69 67 69 74 73 2b 2b 3b 0d 0a 0d 0a 20 20 2f 2a igits++;.... /*
d3670 20 63 6f 70 79 20 6d 61 78 20 73 69 67 6e 69 66 copy max signif
d3680 69 63 61 6e 74 20 64 69 67 69 74 73 20 74 6f 20 icant digits to
d3690 73 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0d 0a significand */..
d36a0 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 while( z<zEnd
d36b0 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 && sqlite3Isdigi
d36c0 74 28 2a 7a 29 20 26 26 20 73 3c 28 28 4c 41 52 t(*z) && s<((LAR
d36d0 47 45 53 54 5f 49 4e 54 36 34 2d 39 29 2f 31 30 GEST_INT64-9)/10
d36e0 29 20 29 7b 0d 0a 20 20 20 20 73 20 3d 20 73 2a ) ){.. s = s*
d36f0 31 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 10 + (*z - '0');
d3700 0d 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 2c 20 6e .. z+=incr, n
d3710 44 69 67 69 74 73 2b 2b 3b 0d 0a 20 20 7d 0d 0a Digits++;.. }..
d3720 0d 0a 20 20 2f 2a 20 73 6b 69 70 20 6e 6f 6e 2d .. /* skip non-
d3730 73 69 67 6e 69 66 69 63 61 6e 74 20 73 69 67 6e significant sign
d3740 69 66 69 63 61 6e 64 20 64 69 67 69 74 73 0d 0a ificand digits..
d3750 20 20 2a 2a 20 28 69 6e 63 72 65 61 73 65 20 65 ** (increase e
d3760 78 70 6f 6e 65 6e 74 20 62 79 20 64 20 74 6f 20 xponent by d to
d3770 73 68 69 66 74 20 64 65 63 69 6d 61 6c 20 6c 65 shift decimal le
d3780 66 74 29 20 2a 2f 0d 0a 20 20 77 68 69 6c 65 28 ft) */.. while(
d3790 20 7a 3c 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 z<zEnd && sqlit
d37a0 65 33 49 73 64 69 67 69 74 28 2a 7a 29 20 29 20 e3Isdigit(*z) )
d37b0 7a 2b 3d 69 6e 63 72 2c 20 6e 44 69 67 69 74 73 z+=incr, nDigits
d37c0 2b 2b 2c 20 64 2b 2b 3b 0d 0a 20 20 69 66 28 20 ++, d++;.. if(
d37d0 7a 3e 3d 7a 45 6e 64 20 29 20 67 6f 74 6f 20 64 z>=zEnd ) goto d
d37e0 6f 5f 61 74 6f 66 5f 63 61 6c 63 3b 0d 0a 0d 0a o_atof_calc;....
d37f0 20 20 2f 2a 20 69 66 20 64 65 63 69 6d 61 6c 20 /* if decimal
d3800 70 6f 69 6e 74 20 69 73 20 70 72 65 73 65 6e 74 point is present
d3810 20 2a 2f 0d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 */.. if( *z=='
d3820 2e 27 20 29 7b 0d 0a 20 20 20 20 7a 2b 3d 69 6e .' ){.. z+=in
d3830 63 72 3b 0d 0a 20 20 20 20 2f 2a 20 63 6f 70 79 cr;.. /* copy
d3840 20 64 69 67 69 74 73 20 66 72 6f 6d 20 61 66 74 digits from aft
d3850 65 72 20 64 65 63 69 6d 61 6c 20 74 6f 20 73 69 er decimal to si
d3860 67 6e 69 66 69 63 61 6e 64 0d 0a 20 20 20 20 2a gnificand.. *
d3870 2a 20 28 64 65 63 72 65 61 73 65 20 65 78 70 6f * (decrease expo
d3880 6e 65 6e 74 20 62 79 20 64 20 74 6f 20 73 68 69 nent by d to shi
d3890 66 74 20 64 65 63 69 6d 61 6c 20 72 69 67 68 74 ft decimal right
d38a0 29 20 2a 2f 0d 0a 20 20 20 20 77 68 69 6c 65 28 ) */.. while(
d38b0 20 7a 3c 7a 45 6e 64 20 26 26 20 73 71 6c 69 74 z<zEnd && sqlit
d38c0 65 33 49 73 64 69 67 69 74 28 2a 7a 29 20 26 26 e3Isdigit(*z) &&
d38d0 20 73 3c 28 28 4c 41 52 47 45 53 54 5f 49 4e 54 s<((LARGEST_INT
d38e0 36 34 2d 39 29 2f 31 30 29 20 29 7b 0d 0a 20 20 64-9)/10) ){..
d38f0 20 20 20 20 73 20 3d 20 73 2a 31 30 20 2b 20 28 s = s*10 + (
d3900 2a 7a 20 2d 20 27 30 27 29 3b 0d 0a 20 20 20 20 *z - '0');..
d3910 20 20 7a 2b 3d 69 6e 63 72 2c 20 6e 44 69 67 69 z+=incr, nDigi
d3920 74 73 2b 2b 2c 20 64 2d 2d 3b 0d 0a 20 20 20 20 ts++, d--;..
d3930 7d 0d 0a 20 20 20 20 2f 2a 20 73 6b 69 70 20 6e }.. /* skip n
d3940 6f 6e 2d 73 69 67 6e 69 66 69 63 61 6e 74 20 64 on-significant d
d3950 69 67 69 74 73 20 2a 2f 0d 0a 20 20 20 20 77 68 igits */.. wh
d3960 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20 73 ile( z<zEnd && s
d3970 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a qlite3Isdigit(*z
d3980 29 20 29 20 7a 2b 3d 69 6e 63 72 2c 20 6e 44 69 ) ) z+=incr, nDi
d3990 67 69 74 73 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 gits++;.. }..
d39a0 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 29 20 67 6f if( z>=zEnd ) go
d39b0 74 6f 20 64 6f 5f 61 74 6f 66 5f 63 61 6c 63 3b to do_atof_calc;
d39c0 0d 0a 0d 0a 20 20 2f 2a 20 69 66 20 65 78 70 6f .... /* if expo
d39d0 6e 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 nent is present
d39e0 2a 2f 0d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 */.. if( *z=='e
d39f0 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0d ' || *z=='E' ){.
d3a00 0a 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 . z+=incr;..
d3a10 20 20 20 65 56 61 6c 69 64 20 3d 20 30 3b 0d 0a eValid = 0;..
d3a20 20 20 20 20 69 66 28 20 7a 3e 3d 7a 45 6e 64 20 if( z>=zEnd
d3a30 29 20 67 6f 74 6f 20 64 6f 5f 61 74 6f 66 5f 63 ) goto do_atof_c
d3a40 61 6c 63 3b 0d 0a 20 20 20 20 2f 2a 20 67 65 74 alc;.. /* get
d3a50 20 73 69 67 6e 20 6f 66 20 65 78 70 6f 6e 65 6e sign of exponen
d3a60 74 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 2a 7a t */.. if( *z
d3a70 3d 3d 27 2d 27 20 29 7b 0d 0a 20 20 20 20 20 20 =='-' ){..
d3a80 65 73 69 67 6e 20 3d 20 2d 31 3b 0d 0a 20 20 20 esign = -1;..
d3a90 20 20 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 20 20 z+=incr;..
d3aa0 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 }else if( *z=='
d3ab0 2b 27 20 29 7b 0d 0a 20 20 20 20 20 20 7a 2b 3d +' ){.. z+=
d3ac0 69 6e 63 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 incr;.. }..
d3ad0 20 20 2f 2a 20 63 6f 70 79 20 64 69 67 69 74 73 /* copy digits
d3ae0 20 74 6f 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0d to exponent */.
d3af0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 . while( z<zE
d3b00 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 nd && sqlite3Isd
d3b10 69 67 69 74 28 2a 7a 29 20 29 7b 0d 0a 20 20 20 igit(*z) ){..
d3b20 20 20 20 65 20 3d 20 65 3c 31 30 30 30 30 20 3f e = e<10000 ?
d3b30 20 28 65 2a 31 30 20 2b 20 28 2a 7a 20 2d 20 27 (e*10 + (*z - '
d3b40 30 27 29 29 20 3a 20 31 30 30 30 30 3b 0d 0a 20 0')) : 10000;..
d3b50 20 20 20 20 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 z+=incr;..
d3b60 20 20 20 20 20 65 56 61 6c 69 64 20 3d 20 31 3b eValid = 1;
d3b70 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
d3b80 20 20 2f 2a 20 73 6b 69 70 20 74 72 61 69 6c 69 /* skip traili
d3b90 6e 67 20 73 70 61 63 65 73 20 2a 2f 0d 0a 20 20 ng spaces */..
d3ba0 69 66 28 20 6e 44 69 67 69 74 73 20 26 26 20 65 if( nDigits && e
d3bb0 56 61 6c 69 64 20 29 7b 0d 0a 20 20 20 20 77 68 Valid ){.. wh
d3bc0 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 26 26 20 73 ile( z<zEnd && s
d3bd0 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a qlite3Isspace(*z
d3be0 29 20 29 20 7a 2b 3d 69 6e 63 72 3b 0d 0a 20 20 ) ) z+=incr;..
d3bf0 7d 0d 0a 0d 0a 64 6f 5f 61 74 6f 66 5f 63 61 6c }....do_atof_cal
d3c00 63 3a 0d 0a 20 20 2f 2a 20 61 64 6a 75 73 74 20 c:.. /* adjust
d3c10 65 78 70 6f 6e 65 6e 74 20 62 79 20 64 2c 20 61 exponent by d, a
d3c20 6e 64 20 75 70 64 61 74 65 20 73 69 67 6e 20 2a nd update sign *
d3c30 2f 0d 0a 20 20 65 20 3d 20 28 65 2a 65 73 69 67 /.. e = (e*esig
d3c40 6e 29 20 2b 20 64 3b 0d 0a 20 20 69 66 28 20 65 n) + d;.. if( e
d3c50 3c 30 20 29 20 7b 0d 0a 20 20 20 20 65 73 69 67 <0 ) {.. esig
d3c60 6e 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 65 20 2a n = -1;.. e *
d3c70 3d 20 2d 31 3b 0d 0a 20 20 7d 20 65 6c 73 65 20 = -1;.. } else
d3c80 7b 0d 0a 20 20 20 20 65 73 69 67 6e 20 3d 20 31 {.. esign = 1
d3c90 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 69 ;.. }.... /* i
d3ca0 66 20 30 20 73 69 67 6e 69 66 69 63 61 6e 64 20 f 0 significand
d3cb0 2a 2f 0d 0a 20 20 69 66 28 20 21 73 20 29 20 7b */.. if( !s ) {
d3cc0 0d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 .. /* In the
d3cd0 49 45 45 45 20 37 35 34 20 73 74 61 6e 64 61 72 IEEE 754 standar
d3ce0 64 2c 20 7a 65 72 6f 20 69 73 20 73 69 67 6e 65 d, zero is signe
d3cf0 64 2e 0d 0a 20 20 20 20 2a 2a 20 41 64 64 20 74 d... ** Add t
d3d00 68 65 20 73 69 67 6e 20 69 66 20 77 65 27 76 65 he sign if we've
d3d10 20 73 65 65 6e 20 61 74 20 6c 65 61 73 74 20 6f seen at least o
d3d20 6e 65 20 64 69 67 69 74 20 2a 2f 0d 0a 20 20 20 ne digit */..
d3d30 20 72 65 73 75 6c 74 20 3d 20 28 73 69 67 6e 3c result = (sign<
d3d40 30 20 26 26 20 6e 44 69 67 69 74 73 29 20 3f 20 0 && nDigits) ?
d3d50 2d 28 64 6f 75 62 6c 65 29 30 20 3a 20 28 64 6f -(double)0 : (do
d3d60 75 62 6c 65 29 30 3b 0d 0a 20 20 7d 20 65 6c 73 uble)0;.. } els
d3d70 65 20 7b 0d 0a 20 20 20 20 2f 2a 20 61 74 74 65 e {.. /* atte
d3d80 6d 70 74 20 74 6f 20 72 65 64 75 63 65 20 65 78 mpt to reduce ex
d3d90 70 6f 6e 65 6e 74 20 2a 2f 0d 0a 20 20 20 20 69 ponent */.. i
d3da0 66 28 20 65 73 69 67 6e 3e 30 20 29 7b 0d 0a 20 f( esign>0 ){..
d3db0 20 20 20 20 20 77 68 69 6c 65 28 20 73 3c 28 4c while( s<(L
d3dc0 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30 29 ARGEST_INT64/10)
d3dd0 20 26 26 20 65 3e 30 20 29 20 65 2d 2d 2c 73 2a && e>0 ) e--,s*
d3de0 3d 31 30 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b =10;.. }else{
d3df0 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 21 .. while( !
d3e00 28 73 25 31 30 29 20 26 26 20 65 3e 30 20 29 20 (s%10) && e>0 )
d3e10 65 2d 2d 2c 73 2f 3d 31 30 3b 0d 0a 20 20 20 20 e--,s/=10;..
d3e20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 61 64 6a 75 }.... /* adju
d3e30 73 74 20 74 68 65 20 73 69 67 6e 20 6f 66 20 73 st the sign of s
d3e40 69 67 6e 69 66 69 63 61 6e 64 20 2a 2f 0d 0a 20 ignificand */..
d3e50 20 20 20 73 20 3d 20 73 69 67 6e 3c 30 20 3f 20 s = sign<0 ?
d3e60 2d 73 20 3a 20 73 3b 0d 0a 0d 0a 20 20 20 20 2f -s : s;.... /
d3e70 2a 20 69 66 20 65 78 70 6f 6e 65 6e 74 2c 20 73 * if exponent, s
d3e80 63 61 6c 65 20 73 69 67 6e 69 66 69 63 61 6e 64 cale significand
d3e90 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 0d as appropriate.
d3ea0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 . ** and stor
d3eb0 65 20 69 6e 20 72 65 73 75 6c 74 2e 20 2a 2f 0d e in result. */.
d3ec0 0a 20 20 20 20 69 66 28 20 65 20 29 7b 0d 0a 20 . if( e ){..
d3ed0 20 20 20 20 20 64 6f 75 62 6c 65 20 73 63 61 6c double scal
d3ee0 65 20 3d 20 31 2e 30 3b 0d 0a 20 20 20 20 20 20 e = 1.0;..
d3ef0 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 68 61 /* attempt to ha
d3f00 6e 64 6c 65 20 65 78 74 72 65 6d 65 6c 79 20 73 ndle extremely s
d3f10 6d 61 6c 6c 2f 6c 61 72 67 65 20 6e 75 6d 62 65 mall/large numbe
d3f20 72 73 20 62 65 74 74 65 72 20 2a 2f 0d 0a 20 20 rs better */..
d3f30 20 20 20 20 69 66 28 20 65 3e 33 30 37 20 26 26 if( e>307 &&
d3f40 20 65 3c 33 34 32 20 29 7b 0d 0a 20 20 20 20 20 e<342 ){..
d3f50 20 20 20 77 68 69 6c 65 28 20 65 25 33 30 38 20 while( e%308
d3f60 29 20 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 ) { scale *= 1.0
d3f70 65 2b 31 3b 20 65 20 2d 3d 20 31 3b 20 7d 0d 0a e+1; e -= 1; }..
d3f80 20 20 20 20 20 20 20 20 69 66 28 20 65 73 69 67 if( esig
d3f90 6e 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 n<0 ){..
d3fa0 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2f 20 73 result = s / s
d3fb0 63 61 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 cale;..
d3fc0 20 72 65 73 75 6c 74 20 2f 3d 20 31 2e 30 65 2b result /= 1.0e+
d3fd0 33 30 38 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 308;.. }e
d3fe0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
d3ff0 72 65 73 75 6c 74 20 3d 20 73 20 2a 20 73 63 61 result = s * sca
d4000 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 le;.. r
d4010 65 73 75 6c 74 20 2a 3d 20 31 2e 30 65 2b 33 30 esult *= 1.0e+30
d4020 38 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 8;.. }..
d4030 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 }else if( e
d4040 3e 3d 33 34 32 20 29 7b 0d 0a 20 20 20 20 20 20 >=342 ){..
d4050 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b if( esign<0 ){
d4060 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75 .. resu
d4070 6c 74 20 3d 20 30 2e 30 2a 73 3b 0d 0a 20 20 20 lt = 0.0*s;..
d4080 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
d4090 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 result =
d40a0 31 65 33 30 38 2a 31 65 33 30 38 2a 73 3b 20 20 1e308*1e308*s;
d40b0 2f 2a 20 49 6e 66 69 6e 69 74 79 20 2a 2f 0d 0a /* Infinity */..
d40c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
d40d0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
d40e0 20 2f 2a 20 31 2e 30 65 2b 32 32 20 69 73 20 74 /* 1.0e+22 is t
d40f0 68 65 20 6c 61 72 67 65 73 74 20 70 6f 77 65 72 he largest power
d4100 20 6f 66 20 31 30 20 74 68 61 6e 20 63 61 6e 20 of 10 than can
d4110 62 65 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 be .. **
d4120 72 65 70 72 65 73 65 6e 74 65 64 20 65 78 61 63 represented exac
d4130 74 6c 79 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 tly. */..
d4140 20 77 68 69 6c 65 28 20 65 25 32 32 20 29 20 7b while( e%22 ) {
d4150 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 scale *= 1.0e+1
d4160 3b 20 65 20 2d 3d 20 31 3b 20 7d 0d 0a 20 20 20 ; e -= 1; }..
d4170 20 20 20 20 20 77 68 69 6c 65 28 20 65 3e 30 20 while( e>0
d4180 29 20 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 ) { scale *= 1.0
d4190 65 2b 32 32 3b 20 65 20 2d 3d 20 32 32 3b 20 7d e+22; e -= 22; }
d41a0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 73 .. if( es
d41b0 69 67 6e 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 ign<0 ){..
d41c0 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2f result = s /
d41d0 20 73 63 61 6c 65 3b 0d 0a 20 20 20 20 20 20 20 scale;..
d41e0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
d41f0 20 20 20 72 65 73 75 6c 74 20 3d 20 73 20 2a 20 result = s *
d4200 73 63 61 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 scale;..
d4210 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
d4220 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 } else {..
d4230 72 65 73 75 6c 74 20 3d 20 28 64 6f 75 62 6c 65 result = (double
d4240 29 73 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d )s;.. }.. }.
d4250 0a 0d 0a 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 ... /* store th
d4260 65 20 72 65 73 75 6c 74 20 2a 2f 0d 0a 20 20 2a e result */.. *
d4270 70 52 65 73 75 6c 74 20 3d 20 72 65 73 75 6c 74 pResult = result
d4280 3b 0d 0a 0d 0a 20 20 2f 2a 20 72 65 74 75 72 6e ;.... /* return
d4290 20 74 72 75 65 20 69 66 20 6e 75 6d 62 65 72 20 true if number
d42a0 61 6e 64 20 6e 6f 20 65 78 74 72 61 20 6e 6f 6e and no extra non
d42b0 2d 77 68 69 74 65 73 70 61 63 65 20 63 68 72 61 -whitespace chra
d42c0 63 74 65 72 73 20 61 66 74 65 72 20 2a 2f 0d 0a cters after */..
d42d0 20 20 72 65 74 75 72 6e 20 7a 3e 3d 7a 45 6e 64 return z>=zEnd
d42e0 20 26 26 20 6e 44 69 67 69 74 73 3e 30 20 26 26 && nDigits>0 &&
d42f0 20 65 56 61 6c 69 64 3b 0d 0a 23 65 6c 73 65 0d eValid;..#else.
d4300 0a 20 20 72 65 74 75 72 6e 20 21 73 71 6c 69 74 . return !sqlit
d4310 65 33 41 74 6f 69 36 34 28 7a 2c 20 70 52 65 73 e3Atoi64(z, pRes
d4320 75 6c 74 2c 20 6c 65 6e 67 74 68 2c 20 65 6e 63 ult, length, enc
d4330 29 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 );..#endif /* SQ
d4340 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 LITE_OMIT_FLOATI
d4350 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0d 0a 7d 0d 0a NG_POINT */..}..
d4360 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 61 72 65 ../*..** Compare
d4370 20 74 68 65 20 31 39 2d 63 68 61 72 61 63 74 65 the 19-characte
d4380 72 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 61 67 r string zNum ag
d4390 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 72 ainst the text r
d43a0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0d 0a 2a epresentation..*
d43b0 2a 20 76 61 6c 75 65 20 32 5e 36 33 3a 20 20 39 * value 2^63: 9
d43c0 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 2233720368547758
d43d0 30 38 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 08. Return nega
d43e0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 tive, zero, or p
d43f0 6f 73 69 74 69 76 65 0d 0a 2a 2a 20 69 66 20 7a ositive..** if z
d4400 4e 75 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e Num is less than
d4410 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 , equal to, or g
d4420 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 reater than the
d4430 73 74 72 69 6e 67 2e 0d 0a 2a 2a 20 4e 6f 74 65 string...** Note
d4440 20 74 68 61 74 20 7a 4e 75 6d 20 6d 75 73 74 20 that zNum must
d4450 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 contain exactly
d4460 31 39 20 63 68 61 72 61 63 74 65 72 73 2e 0d 0a 19 characters...
d4470 2a 2a 0d 0a 2a 2a 20 55 6e 6c 69 6b 65 20 6d 65 **..** Unlike me
d4480 6d 63 6d 70 28 29 20 74 68 69 73 20 72 6f 75 74 mcmp() this rout
d4490 69 6e 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 ine is guarantee
d44a0 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 d to return the
d44b0 64 69 66 66 65 72 65 6e 63 65 0d 0a 2a 2a 20 69 difference..** i
d44c0 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 n the values of
d44d0 74 68 65 20 6c 61 73 74 20 64 69 67 69 74 20 69 the last digit i
d44e0 66 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 f the only diffe
d44f0 72 65 6e 63 65 20 69 73 20 69 6e 20 74 68 65 0d rence is in the.
d4500 0a 2a 2a 20 6c 61 73 74 20 64 69 67 69 74 2e 20 .** last digit.
d4510 20 53 6f 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 So, for example
d4520 2c 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 63 ,..**..** c
d4530 6f 6d 70 61 72 65 32 70 6f 77 36 33 28 22 39 32 ompare2pow63("92
d4540 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 2337203685477580
d4550 30 22 2c 20 31 29 0d 0a 2a 2a 0d 0a 2a 2a 20 77 0", 1)..**..** w
d4560 69 6c 6c 20 72 65 74 75 72 6e 20 2d 38 2e 0d 0a ill return -8...
d4570 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 63 */..static int c
d4580 6f 6d 70 61 72 65 32 70 6f 77 36 33 28 63 6f 6e ompare2pow63(con
d4590 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 st char *zNum, i
d45a0 6e 74 20 69 6e 63 72 29 7b 0d 0a 20 20 69 6e 74 nt incr){.. int
d45b0 20 63 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 69 c = 0;.. int i
d45c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ;..
d45d0 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33 34 35 /* 012345
d45e0 36 37 38 39 30 31 32 33 34 35 36 37 20 2a 2f 0d 678901234567 */.
d45f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 . const char *p
d4600 6f 77 36 33 20 3d 20 22 39 32 32 33 33 37 32 30 ow63 = "92233720
d4610 33 36 38 35 34 37 37 35 38 30 22 3b 0d 0a 20 20 3685477580";..
d4620 66 6f 72 28 69 3d 30 3b 20 63 3d 3d 30 20 26 26 for(i=0; c==0 &&
d4630 20 69 3c 31 38 3b 20 69 2b 2b 29 7b 0d 0a 20 20 i<18; i++){..
d4640 20 20 63 20 3d 20 28 7a 4e 75 6d 5b 69 2a 69 6e c = (zNum[i*in
d4650 63 72 5d 2d 70 6f 77 36 33 5b 69 5d 29 2a 31 30 cr]-pow63[i])*10
d4660 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 63 3d ;.. }.. if( c=
d4670 3d 30 20 29 7b 0d 0a 20 20 20 20 63 20 3d 20 7a =0 ){.. c = z
d4680 4e 75 6d 5b 31 38 2a 69 6e 63 72 5d 20 2d 20 27 Num[18*incr] - '
d4690 38 27 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 8';.. testcas
d46a0 65 28 20 63 3d 3d 28 2d 31 29 20 29 3b 0d 0a 20 e( c==(-1) );..
d46b0 20 20 20 74 65 73 74 63 61 73 65 28 20 63 3d 3d testcase( c==
d46c0 30 20 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 0 );.. testca
d46d0 73 65 28 20 63 3d 3d 28 2b 31 29 20 29 3b 0d 0a se( c==(+1) );..
d46e0 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 63 3b }.. return c;
d46f0 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ..}....../*..**
d4700 43 6f 6e 76 65 72 74 20 7a 4e 75 6d 20 74 6f 20 Convert zNum to
d4710 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 a 64-bit signed
d4720 69 6e 74 65 67 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a integer...**..**
d4730 20 49 66 20 74 68 65 20 7a 4e 75 6d 20 76 61 6c If the zNum val
d4740 75 65 20 69 73 20 72 65 70 72 65 73 65 6e 74 61 ue is representa
d4750 62 6c 65 20 61 73 20 61 20 36 34 2d 62 69 74 20 ble as a 64-bit
d4760 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 twos-complement
d4770 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 ..** integer, th
d4780 65 6e 20 77 72 69 74 65 20 74 68 61 74 20 76 61 en write that va
d4790 6c 75 65 20 69 6e 74 6f 20 2a 70 4e 75 6d 20 61 lue into *pNum a
d47a0 6e 64 20 72 65 74 75 72 6e 20 30 2e 0d 0a 2a 2a nd return 0...**
d47b0 0d 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 69 73 20 ..** If zNum is
d47c0 65 78 61 63 74 6c 79 20 39 32 32 33 33 37 32 30 exactly 92233720
d47d0 33 36 38 35 34 36 36 35 38 30 38 2c 20 72 65 74 36854665808, ret
d47e0 75 72 6e 20 32 2e 20 20 54 68 69 73 20 73 70 65 urn 2. This spe
d47f0 63 69 61 6c 0d 0a 2a 2a 20 63 61 73 65 20 69 73 cial..** case is
d4800 20 62 72 6f 6b 65 6e 20 6f 75 74 20 62 65 63 61 broken out beca
d4810 75 73 65 20 77 68 69 6c 65 20 39 32 32 33 33 37 use while 922337
d4820 32 30 33 36 38 35 34 36 36 35 38 30 38 20 63 61 2036854665808 ca
d4830 6e 6e 6f 74 20 62 65 20 61 20 0d 0a 2a 2a 20 73 nnot be a ..** s
d4840 69 67 6e 65 64 20 36 34 2d 62 69 74 20 69 6e 74 igned 64-bit int
d4850 65 67 65 72 2c 20 69 74 73 20 6e 65 67 61 74 69 eger, its negati
d4860 76 65 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 ve -922337203685
d4870 34 36 36 35 38 30 38 20 63 61 6e 20 62 65 2e 0d 4665808 can be..
d4880 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 .**..** If zNum
d4890 69 73 20 74 6f 6f 20 62 69 67 20 66 6f 72 20 61 is too big for a
d48a0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 64-bit integer
d48b0 61 6e 64 20 69 73 20 6e 6f 74 0d 0a 2a 2a 20 39 and is not..** 9
d48c0 32 32 33 33 37 32 30 33 36 38 35 34 36 36 35 38 2233720368546658
d48d0 30 38 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 08 then return 1
d48e0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 6c 65 6e 67 74 68 ...**..** length
d48f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f is the number o
d4900 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 73 f bytes in the s
d4910 74 72 69 6e 67 20 28 62 79 74 65 73 2c 20 6e 6f tring (bytes, no
d4920 74 20 63 68 61 72 61 63 74 65 72 73 29 2e 0d 0a t characters)...
d4930 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 ** The string is
d4940 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 not necessarily
d4950 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 zero-terminated
d4960 2e 20 20 54 68 65 20 65 6e 63 6f 64 69 6e 67 20 . The encoding
d4970 69 73 0d 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 is..** given by
d4980 65 6e 63 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 enc...*/..SQLITE
d4990 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
d49a0 69 74 65 33 41 74 6f 69 36 34 28 63 6f 6e 73 74 ite3Atoi64(const
d49b0 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 char *zNum, i64
d49c0 20 2a 70 4e 75 6d 2c 20 69 6e 74 20 6c 65 6e 67 *pNum, int leng
d49d0 74 68 2c 20 75 38 20 65 6e 63 29 7b 0d 0a 20 20 th, u8 enc){..
d49e0 69 6e 74 20 69 6e 63 72 20 3d 20 28 65 6e 63 3d int incr = (enc=
d49f0 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 =SQLITE_UTF8?1:2
d4a00 29 3b 0d 0a 20 20 75 36 34 20 75 20 3d 20 30 3b );.. u64 u = 0;
d4a10 0d 0a 20 20 69 6e 74 20 6e 65 67 20 3d 20 30 3b .. int neg = 0;
d4a20 20 2f 2a 20 61 73 73 75 6d 65 20 70 6f 73 69 74 /* assume posit
d4a30 69 76 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b ive */.. int i;
d4a40 0d 0a 20 20 69 6e 74 20 63 20 3d 20 30 3b 0d 0a .. int c = 0;..
d4a50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 const char *zS
d4a60 74 61 72 74 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 tart;.. const c
d4a70 68 61 72 20 2a 7a 45 6e 64 20 3d 20 7a 4e 75 6d har *zEnd = zNum
d4a80 20 2b 20 6c 65 6e 67 74 68 3b 0d 0a 20 20 69 66 + length;.. if
d4a90 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 ( enc==SQLITE_UT
d4aa0 46 31 36 42 45 20 29 20 7a 4e 75 6d 2b 2b 3b 0d F16BE ) zNum++;.
d4ab0 0a 20 20 77 68 69 6c 65 28 20 7a 4e 75 6d 3c 7a . while( zNum<z
d4ac0 45 6e 64 20 26 26 20 73 71 6c 69 74 65 33 49 73 End && sqlite3Is
d4ad0 73 70 61 63 65 28 2a 7a 4e 75 6d 29 20 29 20 7a space(*zNum) ) z
d4ae0 4e 75 6d 2b 3d 69 6e 63 72 3b 0d 0a 20 20 69 66 Num+=incr;.. if
d4af0 28 20 7a 4e 75 6d 3c 7a 45 6e 64 20 29 7b 0d 0a ( zNum<zEnd ){..
d4b00 20 20 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 if( *zNum=='
d4b10 2d 27 20 29 7b 0d 0a 20 20 20 20 20 20 6e 65 67 -' ){.. neg
d4b20 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7a 4e 75 = 1;.. zNu
d4b30 6d 2b 3d 69 6e 63 72 3b 0d 0a 20 20 20 20 7d 65 m+=incr;.. }e
d4b40 6c 73 65 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 lse if( *zNum=='
d4b50 2b 27 20 29 7b 0d 0a 20 20 20 20 20 20 7a 4e 75 +' ){.. zNu
d4b60 6d 2b 3d 69 6e 63 72 3b 0d 0a 20 20 20 20 7d 0d m+=incr;.. }.
d4b70 0a 20 20 7d 0d 0a 20 20 7a 53 74 61 72 74 20 3d . }.. zStart =
d4b80 20 7a 4e 75 6d 3b 0d 0a 20 20 77 68 69 6c 65 28 zNum;.. while(
d4b90 20 7a 4e 75 6d 3c 7a 45 6e 64 20 26 26 20 7a 4e zNum<zEnd && zN
d4ba0 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 7b 20 7a 4e um[0]=='0' ){ zN
d4bb0 75 6d 2b 3d 69 6e 63 72 3b 20 7d 20 2f 2a 20 53 um+=incr; } /* S
d4bc0 6b 69 70 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f kip leading zero
d4bd0 73 2e 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 s. */.. for(i=0
d4be0 3b 20 26 7a 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 20 ; &zNum[i]<zEnd
d4bf0 26 26 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d && (c=zNum[i])>=
d4c00 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 '0' && c<='9'; i
d4c10 2b 3d 69 6e 63 72 29 7b 0d 0a 20 20 20 20 75 20 +=incr){.. u
d4c20 3d 20 75 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 = u*10 + c - '0'
d4c30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 75 3e ;.. }.. if( u>
d4c40 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 29 7b LARGEST_INT64 ){
d4c50 0d 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 53 4d .. *pNum = SM
d4c60 41 4c 4c 45 53 54 5f 49 4e 54 36 34 3b 0d 0a 20 ALLEST_INT64;..
d4c70 20 7d 65 6c 73 65 20 69 66 28 20 6e 65 67 20 29 }else if( neg )
d4c80 7b 0d 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 2d {.. *pNum = -
d4c90 28 69 36 34 29 75 3b 0d 0a 20 20 7d 65 6c 73 65 (i64)u;.. }else
d4ca0 7b 0d 0a 20 20 20 20 2a 70 4e 75 6d 20 3d 20 28 {.. *pNum = (
d4cb0 69 36 34 29 75 3b 0d 0a 20 20 7d 0d 0a 20 20 74 i64)u;.. }.. t
d4cc0 65 73 74 63 61 73 65 28 20 69 3d 3d 31 38 20 29 estcase( i==18 )
d4cd0 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 ;.. testcase( i
d4ce0 3d 3d 31 39 20 29 3b 0d 0a 20 20 74 65 73 74 63 ==19 );.. testc
d4cf0 61 73 65 28 20 69 3d 3d 32 30 20 29 3b 0d 0a 20 ase( i==20 );..
d4d00 20 69 66 28 20 28 63 21 3d 30 20 26 26 20 26 7a if( (c!=0 && &z
d4d10 4e 75 6d 5b 69 5d 3c 7a 45 6e 64 29 20 7c 7c 20 Num[i]<zEnd) ||
d4d20 28 69 3d 3d 30 20 26 26 20 7a 53 74 61 72 74 3d (i==0 && zStart=
d4d30 3d 7a 4e 75 6d 29 20 7c 7c 20 69 3e 31 39 2a 69 =zNum) || i>19*i
d4d40 6e 63 72 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 7a ncr ){.. /* z
d4d50 4e 75 6d 20 69 73 20 65 6d 70 74 79 20 6f 72 20 Num is empty or
d4d60 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 6e 75 6d contains non-num
d4d70 65 72 69 63 20 74 65 78 74 20 6f 72 20 69 73 20 eric text or is
d4d80 6c 6f 6e 67 65 72 0d 0a 20 20 20 20 2a 2a 20 74 longer.. ** t
d4d90 68 61 6e 20 31 39 20 64 69 67 69 74 73 20 28 74 han 19 digits (t
d4da0 68 75 73 20 67 75 61 72 61 6e 74 65 65 69 6e 67 hus guaranteeing
d4db0 20 74 68 61 74 20 69 74 20 69 73 20 74 6f 6f 20 that it is too
d4dc0 6c 61 72 67 65 29 20 2a 2f 0d 0a 20 20 20 20 72 large) */.. r
d4dd0 65 74 75 72 6e 20 31 3b 0d 0a 20 20 7d 65 6c 73 eturn 1;.. }els
d4de0 65 20 69 66 28 20 69 3c 31 39 2a 69 6e 63 72 20 e if( i<19*incr
d4df0 29 7b 0d 0a 20 20 20 20 2f 2a 20 4c 65 73 73 20 ){.. /* Less
d4e00 74 68 61 6e 20 31 39 20 64 69 67 69 74 73 2c 20 than 19 digits,
d4e10 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 so we know that
d4e20 69 74 20 66 69 74 73 20 69 6e 20 36 34 20 62 69 it fits in 64 bi
d4e30 74 73 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 ts */.. asser
d4e40 74 28 20 75 3c 3d 4c 41 52 47 45 53 54 5f 49 4e t( u<=LARGEST_IN
d4e50 54 36 34 20 29 3b 0d 0a 20 20 20 20 72 65 74 75 T64 );.. retu
d4e60 72 6e 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d rn 0;.. }else{.
d4e70 0a 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20 . /* zNum is
d4e80 61 20 31 39 2d 64 69 67 69 74 20 6e 75 6d 62 65 a 19-digit numbe
d4e90 72 73 2e 20 20 43 6f 6d 70 61 72 65 20 69 74 20 rs. Compare it
d4ea0 61 67 61 69 6e 73 74 20 39 32 32 33 33 37 32 30 against 92233720
d4eb0 33 36 38 35 34 37 37 35 38 30 38 2e 20 2a 2f 0d 36854775808. */.
d4ec0 0a 20 20 20 20 63 20 3d 20 63 6f 6d 70 61 72 65 . c = compare
d4ed0 32 70 6f 77 36 33 28 7a 4e 75 6d 2c 20 69 6e 63 2pow63(zNum, inc
d4ee0 72 29 3b 0d 0a 20 20 20 20 69 66 28 20 63 3c 30 r);.. if( c<0
d4ef0 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 7a 4e ){.. /* zN
d4f00 75 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 um is less than
d4f10 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 9223372036854775
d4f20 38 30 38 20 73 6f 20 69 74 20 66 69 74 73 20 2a 808 so it fits *
d4f30 2f 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 /.. assert(
d4f40 20 75 3c 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 u<=LARGEST_INT6
d4f50 34 20 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 4 );.. retu
d4f60 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 rn 0;.. }else
d4f70 20 69 66 28 20 63 3e 30 20 29 7b 0d 0a 20 20 20 if( c>0 ){..
d4f80 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 20 67 72 /* zNum is gr
d4f90 65 61 74 65 72 20 74 68 61 6e 20 39 32 32 33 33 eater than 92233
d4fa0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 73 72036854775808 s
d4fb0 6f 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 2a o it overflows *
d4fc0 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 /.. return
d4fd0 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 1;.. }else{..
d4fe0 20 20 20 20 20 20 2f 2a 20 7a 4e 75 6d 20 69 73 /* zNum is
d4ff0 20 65 78 61 63 74 6c 79 20 39 32 32 33 33 37 32 exactly 9223372
d5000 30 33 36 38 35 34 37 37 35 38 30 38 2e 20 20 46 036854775808. F
d5010 69 74 73 20 69 66 20 6e 65 67 61 74 69 76 65 2e its if negative.
d5020 20 20 54 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 The.. **
d5030 73 70 65 63 69 61 6c 20 63 61 73 65 20 32 20 6f special case 2 o
d5040 76 65 72 66 6c 6f 77 20 69 66 20 70 6f 73 69 74 verflow if posit
d5050 69 76 65 20 2a 2f 0d 0a 20 20 20 20 20 20 61 73 ive */.. as
d5060 73 65 72 74 28 20 75 2d 31 3d 3d 4c 41 52 47 45 sert( u-1==LARGE
d5070 53 54 5f 49 4e 54 36 34 20 29 3b 0d 0a 20 20 20 ST_INT64 );..
d5080 20 20 20 61 73 73 65 72 74 28 20 28 2a 70 4e 75 assert( (*pNu
d5090 6d 29 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 m)==SMALLEST_INT
d50a0 36 34 20 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 64 );.. ret
d50b0 75 72 6e 20 6e 65 67 20 3f 20 30 20 3a 20 32 3b urn neg ? 0 : 2;
d50c0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d .. }.. }..}.
d50d0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 7a 4e 75 .../*..** If zNu
d50e0 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20 m represents an
d50f0 69 6e 74 65 67 65 72 20 74 68 61 74 20 77 69 6c integer that wil
d5100 6c 20 66 69 74 20 69 6e 20 33 32 2d 62 69 74 73 l fit in 32-bits
d5110 2c 20 74 68 65 6e 20 73 65 74 0d 0a 2a 2a 20 2a , then set..** *
d5120 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74 20 69 pValue to that i
d5130 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75 72 nteger and retur
d5140 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69 n true. Otherwi
d5150 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e se return false.
d5160 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6e 79 20 6e 6f 6e ..**..** Any non
d5170 2d 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 -numeric charact
d5180 65 72 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 69 ers that followi
d5190 6e 67 20 7a 4e 75 6d 20 61 72 65 20 69 67 6e 6f ng zNum are igno
d51a0 72 65 64 2e 0d 0a 2a 2a 20 54 68 69 73 20 69 73 red...** This is
d51b0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 different from
d51c0 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 29 20 sqlite3Atoi64()
d51d0 77 68 69 63 68 20 72 65 71 75 69 72 65 73 20 74 which requires t
d51e0 68 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 6e 75 6d he..** input num
d51f0 62 65 72 20 74 6f 20 62 65 20 7a 65 72 6f 2d 74 ber to be zero-t
d5200 65 72 6d 69 6e 61 74 65 64 2e 0d 0a 2a 2f 0d 0a erminated...*/..
d5210 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
d5220 6e 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 nt sqlite3GetInt
d5230 33 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32(const char *z
d5240 4e 75 6d 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 Num, int *pValue
d5250 29 7b 0d 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 ){.. sqlite_int
d5260 36 34 20 76 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 64 v = 0;.. int
d5270 20 69 2c 20 63 3b 0d 0a 20 20 69 6e 74 20 6e 65 i, c;.. int ne
d5280 67 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 7a 4e g = 0;.. if( zN
d5290 75 6d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0d 0a 20 um[0]=='-' ){..
d52a0 20 20 20 6e 65 67 20 3d 20 31 3b 0d 0a 20 20 20 neg = 1;..
d52b0 20 7a 4e 75 6d 2b 2b 3b 0d 0a 20 20 7d 65 6c 73 zNum++;.. }els
d52c0 65 20 69 66 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 e if( zNum[0]=='
d52d0 2b 27 20 29 7b 0d 0a 20 20 20 20 7a 4e 75 6d 2b +' ){.. zNum+
d52e0 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 77 68 69 6c 65 +;.. }.. while
d52f0 28 20 7a 4e 75 6d 5b 30 5d 3d 3d 27 30 27 20 29 ( zNum[0]=='0' )
d5300 20 7a 4e 75 6d 2b 2b 3b 0d 0a 20 20 66 6f 72 28 zNum++;.. for(
d5310 69 3d 30 3b 20 69 3c 31 31 20 26 26 20 28 63 20 i=0; i<11 && (c
d5320 3d 20 7a 4e 75 6d 5b 69 5d 20 2d 20 27 30 27 29 = zNum[i] - '0')
d5330 3e 3d 30 20 26 26 20 63 3c 3d 39 3b 20 69 2b 2b >=0 && c<=9; i++
d5340 29 7b 0d 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 ){.. v = v*10
d5350 20 2b 20 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 + c;.. }....
d5360 2f 2a 20 54 68 65 20 6c 6f 6e 67 65 73 74 20 64 /* The longest d
d5370 65 63 69 6d 61 6c 20 72 65 70 72 65 73 65 6e 74 ecimal represent
d5380 61 74 69 6f 6e 20 6f 66 20 61 20 33 32 20 62 69 ation of a 32 bi
d5390 74 20 69 6e 74 65 67 65 72 20 69 73 20 31 30 20 t integer is 10
d53a0 64 69 67 69 74 73 3a 0d 0a 20 20 2a 2a 0d 0a 20 digits:.. **..
d53b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 **
d53c0 31 32 33 34 35 36 37 38 39 30 0d 0a 20 20 2a 2a 1234567890.. **
d53d0 20 20 20 20 20 32 5e 33 31 20 2d 3e 20 32 31 34 2^31 -> 214
d53e0 37 34 38 33 36 34 38 0d 0a 20 20 2a 2f 0d 0a 20 7483648.. */..
d53f0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 30 testcase( i==10
d5400 20 29 3b 0d 0a 20 20 69 66 28 20 69 3e 31 30 20 );.. if( i>10
d5410 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){.. return 0
d5420 3b 0d 0a 20 20 7d 0d 0a 20 20 74 65 73 74 63 61 ;.. }.. testca
d5430 73 65 28 20 76 2d 6e 65 67 3d 3d 32 31 34 37 34 se( v-neg==21474
d5440 38 33 36 34 37 20 29 3b 0d 0a 20 20 69 66 28 20 83647 );.. if(
d5450 76 2d 6e 65 67 3e 32 31 34 37 34 38 33 36 34 37 v-neg>2147483647
d5460 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
d5470 30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6e 0;.. }.. if( n
d5480 65 67 20 29 7b 0d 0a 20 20 20 20 76 20 3d 20 2d eg ){.. v = -
d5490 76 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 56 61 6c v;.. }.. *pVal
d54a0 75 65 20 3d 20 28 69 6e 74 29 76 3b 0d 0a 20 20 ue = (int)v;..
d54b0 72 65 74 75 72 6e 20 31 3b 0d 0a 7d 0d 0a 0d 0a return 1;..}....
d54c0 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 /*..** Return a
d54d0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 32-bit integer v
d54e0 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 alue extracted f
d54f0 72 6f 6d 20 61 20 73 74 72 69 6e 67 2e 20 20 49 rom a string. I
d5500 66 20 74 68 65 0d 0a 2a 2a 20 73 74 72 69 6e 67 f the..** string
d5510 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 is not an integ
d5520 65 72 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 er, just return
d5530 30 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 0...*/..SQLITE_P
d5540 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
d5550 65 33 41 74 6f 69 28 63 6f 6e 73 74 20 63 68 61 e3Atoi(const cha
d5560 72 20 2a 7a 29 7b 0d 0a 20 20 69 6e 74 20 78 20 r *z){.. int x
d5570 3d 20 30 3b 0d 0a 20 20 69 66 28 20 7a 20 29 20 = 0;.. if( z )
d5580 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 sqlite3GetInt32(
d5590 7a 2c 20 26 78 29 3b 0d 0a 20 20 72 65 74 75 72 z, &x);.. retur
d55a0 6e 20 78 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a n x;..}..../*..*
d55b0 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 2d 6c * The variable-l
d55c0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 65 6e ength integer en
d55d0 63 6f 64 69 6e 67 20 69 73 20 61 73 20 66 6f 6c coding is as fol
d55e0 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 4b 45 lows:..**..** KE
d55f0 59 3a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 Y:..** A
d5600 20 3d 20 30 78 78 78 78 78 78 78 20 20 20 20 37 = 0xxxxxxx 7
d5610 20 62 69 74 73 20 6f 66 20 64 61 74 61 20 61 6e bits of data an
d5620 64 20 6f 6e 65 20 66 6c 61 67 20 62 69 74 0d 0a d one flag bit..
d5630 2a 2a 20 20 20 20 20 20 20 20 20 42 20 3d 20 31 ** B = 1
d5640 78 78 78 78 78 78 78 20 20 20 20 37 20 62 69 74 xxxxxxx 7 bit
d5650 73 20 6f 66 20 64 61 74 61 20 61 6e 64 20 6f 6e s of data and on
d5660 65 20 66 6c 61 67 20 62 69 74 0d 0a 2a 2a 20 20 e flag bit..**
d5670 20 20 20 20 20 20 20 43 20 3d 20 78 78 78 78 78 C = xxxxx
d5680 78 78 78 20 20 20 20 38 20 62 69 74 73 20 6f 66 xxx 8 bits of
d5690 20 64 61 74 61 0d 0a 2a 2a 0d 0a 2a 2a 20 20 37 data..**..** 7
d56a0 20 62 69 74 73 20 2d 20 41 0d 0a 2a 2a 20 31 34 bits - A..** 14
d56b0 20 62 69 74 73 20 2d 20 42 41 0d 0a 2a 2a 20 32 bits - BA..** 2
d56c0 31 20 62 69 74 73 20 2d 20 42 42 41 0d 0a 2a 2a 1 bits - BBA..**
d56d0 20 32 38 20 62 69 74 73 20 2d 20 42 42 42 41 0d 28 bits - BBBA.
d56e0 0a 2a 2a 20 33 35 20 62 69 74 73 20 2d 20 42 42 .** 35 bits - BB
d56f0 42 42 41 0d 0a 2a 2a 20 34 32 20 62 69 74 73 20 BBA..** 42 bits
d5700 2d 20 42 42 42 42 42 41 0d 0a 2a 2a 20 34 39 20 - BBBBBA..** 49
d5710 62 69 74 73 20 2d 20 42 42 42 42 42 42 41 0d 0a bits - BBBBBBA..
d5720 2a 2a 20 35 36 20 62 69 74 73 20 2d 20 42 42 42 ** 56 bits - BBB
d5730 42 42 42 42 41 0d 0a 2a 2a 20 36 34 20 62 69 74 BBBBA..** 64 bit
d5740 73 20 2d 20 42 42 42 42 42 42 42 42 43 0d 0a 2a s - BBBBBBBBC..*
d5750 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 /..../*..** Writ
d5760 65 20 61 20 36 34 2d 62 69 74 20 76 61 72 69 61 e a 64-bit varia
d5770 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 ble-length integ
d5780 65 72 20 74 6f 20 6d 65 6d 6f 72 79 20 73 74 61 er to memory sta
d5790 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0d 0a rting at p[0]...
d57a0 2a 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 ** The length of
d57b0 20 64 61 74 61 20 77 72 69 74 65 20 77 69 6c 6c data write will
d57c0 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e be between 1 an
d57d0 64 20 39 20 62 79 74 65 73 2e 20 20 54 68 65 20 d 9 bytes. The
d57e0 6e 75 6d 62 65 72 0d 0a 2a 2a 20 6f 66 20 62 79 number..** of by
d57f0 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 tes written is r
d5800 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a eturned...**..**
d5810 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 A variable-leng
d5820 74 68 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 69 th integer consi
d5830 73 74 73 20 6f 66 20 74 68 65 20 6c 6f 77 65 72 sts of the lower
d5840 20 37 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 7 bits of each
d5850 62 79 74 65 0d 0a 2a 2a 20 66 6f 72 20 61 6c 6c byte..** for all
d5860 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76 65 bytes that have
d5870 20 74 68 65 20 38 74 68 20 62 69 74 20 73 65 74 the 8th bit set
d5880 20 61 6e 64 20 6f 6e 65 20 62 79 74 65 20 77 69 and one byte wi
d5890 74 68 20 74 68 65 20 38 74 68 0d 0a 2a 2a 20 62 th the 8th..** b
d58a0 69 74 20 63 6c 65 61 72 2e 20 20 45 78 63 65 70 it clear. Excep
d58b0 74 2c 20 69 66 20 77 65 20 67 65 74 20 74 6f 20 t, if we get to
d58c0 74 68 65 20 39 74 68 20 62 79 74 65 2c 20 69 74 the 9th byte, it
d58d0 20 73 74 6f 72 65 73 20 74 68 65 20 66 75 6c 6c stores the full
d58e0 0d 0a 2a 2a 20 38 20 62 69 74 73 20 61 6e 64 20 ..** 8 bits and
d58f0 69 73 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 is the last byte
d5900 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
d5910 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
d5920 33 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67 3PutVarint(unsig
d5930 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 ned char *p, u64
d5940 20 76 29 7b 0d 0a 20 20 69 6e 74 20 69 2c 20 6a v){.. int i, j
d5950 2c 20 6e 3b 0d 0a 20 20 75 38 20 62 75 66 5b 31 , n;.. u8 buf[1
d5960 30 5d 3b 0d 0a 20 20 69 66 28 20 76 20 26 20 28 0];.. if( v & (
d5970 28 28 75 36 34 29 30 78 66 66 30 30 30 30 30 30 ((u64)0xff000000
d5980 29 3c 3c 33 32 29 20 29 7b 0d 0a 20 20 20 20 70 )<<32) ){.. p
d5990 5b 38 5d 20 3d 20 28 75 38 29 76 3b 0d 0a 20 20 [8] = (u8)v;..
d59a0 20 20 76 20 3e 3e 3d 20 38 3b 0d 0a 20 20 20 20 v >>= 8;..
d59b0 66 6f 72 28 69 3d 37 3b 20 69 3e 3d 30 3b 20 69 for(i=7; i>=0; i
d59c0 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 70 5b 69 5d --){.. p[i]
d59d0 20 3d 20 28 75 38 29 28 28 76 20 26 20 30 78 37 = (u8)((v & 0x7
d59e0 66 29 20 7c 20 30 78 38 30 29 3b 0d 0a 20 20 20 f) | 0x80);..
d59f0 20 20 20 76 20 3e 3e 3d 20 37 3b 0d 0a 20 20 20 v >>= 7;..
d5a00 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 39 }.. return 9
d5a10 3b 0d 0a 20 20 7d 20 20 20 20 0d 0a 20 20 6e 20 ;.. } .. n
d5a20 3d 20 30 3b 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20 = 0;.. do{..
d5a30 20 62 75 66 5b 6e 2b 2b 5d 20 3d 20 28 75 38 29 buf[n++] = (u8)
d5a40 28 28 76 20 26 20 30 78 37 66 29 20 7c 20 30 78 ((v & 0x7f) | 0x
d5a50 38 30 29 3b 0d 0a 20 20 20 20 76 20 3e 3e 3d 20 80);.. v >>=
d5a60 37 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 76 21 7;.. }while( v!
d5a70 3d 30 20 29 3b 0d 0a 20 20 62 75 66 5b 30 5d 20 =0 );.. buf[0]
d5a80 26 3d 20 30 78 37 66 3b 0d 0a 20 20 61 73 73 65 &= 0x7f;.. asse
d5a90 72 74 28 20 6e 3c 3d 39 20 29 3b 0d 0a 20 20 66 rt( n<=9 );.. f
d5aa0 6f 72 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b 20 6a or(i=0, j=n-1; j
d5ab0 3e 3d 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29 7b 0d >=0; j--, i++){.
d5ac0 0a 20 20 20 20 70 5b 69 5d 20 3d 20 62 75 66 5b . p[i] = buf[
d5ad0 6a 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 j];.. }.. retu
d5ae0 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a rn n;..}..../*..
d5af0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
d5b00 69 73 20 61 20 66 61 73 74 65 72 20 76 65 72 73 is a faster vers
d5b10 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 50 75 ion of sqlite3Pu
d5b20 74 56 61 72 69 6e 74 28 29 20 74 68 61 74 20 6f tVarint() that o
d5b30 6e 6c 79 0d 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f nly..** works fo
d5b40 72 20 33 32 2d 62 69 74 20 70 6f 73 69 74 69 76 r 32-bit positiv
d5b50 65 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 77 e integers and w
d5b60 68 69 63 68 20 69 73 20 6f 70 74 69 6d 69 7a 65 hich is optimize
d5b70 64 20 66 6f 72 0d 0a 2a 2a 20 74 68 65 20 63 6f d for..** the co
d5b80 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 73 6d 61 mmon case of sma
d5b90 6c 6c 20 69 6e 74 65 67 65 72 73 2e 20 20 41 20 ll integers. A
d5ba0 4d 41 43 52 4f 20 76 65 72 73 69 6f 6e 2c 20 70 MACRO version, p
d5bb0 75 74 56 61 72 69 6e 74 33 32 2c 0d 0a 2a 2a 20 utVarint32,..**
d5bc0 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 69 63 is provided whic
d5bd0 68 20 69 6e 6c 69 6e 65 73 20 74 68 65 20 73 69 h inlines the si
d5be0 6e 67 6c 65 2d 62 79 74 65 20 63 61 73 65 2e 20 ngle-byte case.
d5bf0 20 41 6c 6c 20 63 6f 64 65 20 73 68 6f 75 6c 64 All code should
d5c00 20 75 73 65 0d 0a 2a 2a 20 74 68 65 20 4d 41 43 use..** the MAC
d5c10 52 4f 20 76 65 72 73 69 6f 6e 20 61 73 20 74 68 RO version as th
d5c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 is function assu
d5c30 6d 65 73 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 mes the single-b
d5c40 79 74 65 20 63 61 73 65 20 68 61 73 0d 0a 2a 2a yte case has..**
d5c50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 68 61 already been ha
d5c60 6e 64 6c 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 ndled...*/..SQLI
d5c70 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
d5c80 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 33 qlite3PutVarint3
d5c90 32 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2(unsigned char
d5ca0 2a 70 2c 20 75 33 32 20 76 29 7b 0d 0a 23 69 66 *p, u32 v){..#if
d5cb0 6e 64 65 66 20 70 75 74 56 61 72 69 6e 74 33 32 ndef putVarint32
d5cc0 0d 0a 20 20 69 66 28 20 28 76 20 26 20 7e 30 78 .. if( (v & ~0x
d5cd0 37 66 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 70 7f)==0 ){.. p
d5ce0 5b 30 5d 20 3d 20 76 3b 0d 0a 20 20 20 20 72 65 [0] = v;.. re
d5cf0 74 75 72 6e 20 31 3b 0d 0a 20 20 7d 0d 0a 23 65 turn 1;.. }..#e
d5d00 6e 64 69 66 0d 0a 20 20 69 66 28 20 28 76 20 26 ndif.. if( (v &
d5d10 20 7e 30 78 33 66 66 66 29 3d 3d 30 20 29 7b 0d ~0x3fff)==0 ){.
d5d20 0a 20 20 20 20 70 5b 30 5d 20 3d 20 28 75 38 29 . p[0] = (u8)
d5d30 28 28 76 3e 3e 37 29 20 7c 20 30 78 38 30 29 3b ((v>>7) | 0x80);
d5d40 0d 0a 20 20 20 20 70 5b 31 5d 20 3d 20 28 75 38 .. p[1] = (u8
d5d50 29 28 76 20 26 20 30 78 37 66 29 3b 0d 0a 20 20 )(v & 0x7f);..
d5d60 20 20 72 65 74 75 72 6e 20 32 3b 0d 0a 20 20 7d return 2;.. }
d5d70 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 .. return sqlit
d5d80 65 33 50 75 74 56 61 72 69 6e 74 28 70 2c 20 76 e3PutVarint(p, v
d5d90 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 );..}..../*..**
d5da0 42 69 74 6d 61 73 6b 73 20 75 73 65 64 20 62 79 Bitmasks used by
d5db0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e sqlite3GetVarin
d5dc0 74 28 29 2e 20 20 54 68 65 73 65 20 70 72 65 63 t(). These prec
d5dd0 6f 6d 70 75 74 65 64 20 63 6f 6e 73 74 61 6e 74 omputed constant
d5de0 73 0d 0a 2a 2a 20 61 72 65 20 64 65 66 69 6e 65 s..** are define
d5df0 64 20 68 65 72 65 20 72 61 74 68 65 72 20 74 68 d here rather th
d5e00 61 6e 20 73 69 6d 70 6c 79 20 70 75 74 74 69 6e an simply puttin
d5e10 67 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 65 g the constant e
d5e20 78 70 72 65 73 73 69 6f 6e 73 0d 0a 2a 2a 20 69 xpressions..** i
d5e30 6e 6c 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 nline in order t
d5e40 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 o work around bu
d5e50 67 73 20 69 6e 20 74 68 65 20 52 56 54 20 63 6f gs in the RVT co
d5e60 6d 70 69 6c 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 mpiler...**..**
d5e70 53 4c 4f 54 5f 32 5f 30 20 20 20 20 20 41 20 6d SLOT_2_0 A m
d5e80 61 73 6b 20 66 6f 72 20 20 28 30 78 37 66 3c 3c ask for (0x7f<<
d5e90 31 34 29 20 7c 20 30 78 37 66 0d 0a 2a 2a 0d 0a 14) | 0x7f..**..
d5ea0 2a 2a 20 53 4c 4f 54 5f 34 5f 32 5f 30 20 20 20 ** SLOT_4_2_0
d5eb0 41 20 6d 61 73 6b 20 66 6f 72 20 20 28 30 78 37 A mask for (0x7
d5ec0 66 3c 3c 32 38 29 20 7c 20 53 4c 4f 54 5f 32 5f f<<28) | SLOT_2_
d5ed0 30 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 0..*/..#define S
d5ee0 4c 4f 54 5f 32 5f 30 20 20 20 20 20 30 78 30 30 LOT_2_0 0x00
d5ef0 31 66 63 30 37 66 0d 0a 23 64 65 66 69 6e 65 20 1fc07f..#define
d5f00 53 4c 4f 54 5f 34 5f 32 5f 30 20 20 20 30 78 66 SLOT_4_2_0 0xf
d5f10 30 31 66 63 30 37 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 01fc07f....../*.
d5f20 0a 2a 2a 20 52 65 61 64 20 61 20 36 34 2d 62 69 .** Read a 64-bi
d5f30 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 t variable-lengt
d5f40 68 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d h integer from m
d5f50 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 emory starting a
d5f60 74 20 70 5b 30 5d 2e 0d 0a 2a 2a 20 52 65 74 75 t p[0]...** Retu
d5f70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 rn the number of
d5f80 20 62 79 74 65 73 20 72 65 61 64 2e 20 20 54 68 bytes read. Th
d5f90 65 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 e value is store
d5fa0 64 20 69 6e 20 2a 76 2e 0d 0a 2a 2f 0d 0a 53 51 d in *v...*/..SQ
d5fb0 4c 49 54 45 5f 50 52 49 56 41 54 45 20 75 38 20 LITE_PRIVATE u8
d5fc0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 sqlite3GetVarint
d5fd0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
d5fe0 63 68 61 72 20 2a 70 2c 20 75 36 34 20 2a 76 29 char *p, u64 *v)
d5ff0 7b 0d 0a 20 20 75 33 32 20 61 2c 62 2c 73 3b 0d {.. u32 a,b,s;.
d6000 0a 0d 0a 20 20 61 20 3d 20 2a 70 3b 0d 0a 20 20 ... a = *p;..
d6010 2f 2a 20 61 3a 20 70 30 20 28 75 6e 6d 61 73 6b /* a: p0 (unmask
d6020 65 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 21 28 ed) */.. if (!(
d6030 61 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 a&0x80)).. {..
d6040 20 20 20 2a 76 20 3d 20 61 3b 0d 0a 20 20 20 20 *v = a;..
d6050 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 7d 0d 0a return 1;.. }..
d6060 0d 0a 20 20 70 2b 2b 3b 0d 0a 20 20 62 20 3d 20 .. p++;.. b =
d6070 2a 70 3b 0d 0a 20 20 2f 2a 20 62 3a 20 70 31 20 *p;.. /* b: p1
d6080 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0d 0a 20 (unmasked) */..
d6090 20 69 66 20 28 21 28 62 26 30 78 38 30 29 29 0d if (!(b&0x80)).
d60a0 0a 20 20 7b 0d 0a 20 20 20 20 61 20 26 3d 20 30 . {.. a &= 0
d60b0 78 37 66 3b 0d 0a 20 20 20 20 61 20 3d 20 61 3c x7f;.. a = a<
d60c0 3c 37 3b 0d 0a 20 20 20 20 61 20 7c 3d 20 62 3b <7;.. a |= b;
d60d0 0d 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0d 0a 20 .. *v = a;..
d60e0 20 20 20 72 65 74 75 72 6e 20 32 3b 0d 0a 20 20 return 2;..
d60f0 7d 0d 0a 0d 0a 20 20 2f 2a 20 56 65 72 69 66 79 }.... /* Verify
d6100 20 74 68 61 74 20 63 6f 6e 73 74 61 6e 74 73 20 that constants
d6110 61 72 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 are precomputed
d6120 63 6f 72 72 65 63 74 6c 79 20 2a 2f 0d 0a 20 20 correctly */..
d6130 61 73 73 65 72 74 28 20 53 4c 4f 54 5f 32 5f 30 assert( SLOT_2_0
d6140 20 3d 3d 20 28 28 30 78 37 66 3c 3c 31 34 29 20 == ((0x7f<<14)
d6150 7c 20 28 30 78 37 66 29 29 20 29 3b 0d 0a 20 20 | (0x7f)) );..
d6160 61 73 73 65 72 74 28 20 53 4c 4f 54 5f 34 5f 32 assert( SLOT_4_2
d6170 5f 30 20 3d 3d 20 28 28 30 78 66 55 3c 3c 32 38 _0 == ((0xfU<<28
d6180 29 20 7c 20 28 30 78 37 66 3c 3c 31 34 29 20 7c ) | (0x7f<<14) |
d6190 20 28 30 78 37 66 29 29 20 29 3b 0d 0a 0d 0a 20 (0x7f)) );....
d61a0 20 70 2b 2b 3b 0d 0a 20 20 61 20 3d 20 61 3c 3c p++;.. a = a<<
d61b0 31 34 3b 0d 0a 20 20 61 20 7c 3d 20 2a 70 3b 0d 14;.. a |= *p;.
d61c0 0a 20 20 2f 2a 20 61 3a 20 70 30 3c 3c 31 34 20 . /* a: p0<<14
d61d0 7c 20 70 32 20 28 75 6e 6d 61 73 6b 65 64 29 20 | p2 (unmasked)
d61e0 2a 2f 0d 0a 20 20 69 66 20 28 21 28 61 26 30 78 */.. if (!(a&0x
d61f0 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 61 80)).. {.. a
d6200 20 26 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0d 0a 20 &= SLOT_2_0;..
d6210 20 20 20 62 20 26 3d 20 30 78 37 66 3b 0d 0a 20 b &= 0x7f;..
d6220 20 20 20 62 20 3d 20 62 3c 3c 37 3b 0d 0a 20 20 b = b<<7;..
d6230 20 20 61 20 7c 3d 20 62 3b 0d 0a 20 20 20 20 2a a |= b;.. *
d6240 76 20 3d 20 61 3b 0d 0a 20 20 20 20 72 65 74 75 v = a;.. retu
d6250 72 6e 20 33 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 rn 3;.. }....
d6260 2f 2a 20 43 53 45 31 20 66 72 6f 6d 20 62 65 6c /* CSE1 from bel
d6270 6f 77 20 2a 2f 0d 0a 20 20 61 20 26 3d 20 53 4c ow */.. a &= SL
d6280 4f 54 5f 32 5f 30 3b 0d 0a 20 20 70 2b 2b 3b 0d OT_2_0;.. p++;.
d6290 0a 20 20 62 20 3d 20 62 3c 3c 31 34 3b 0d 0a 20 . b = b<<14;..
d62a0 20 62 20 7c 3d 20 2a 70 3b 0d 0a 20 20 2f 2a 20 b |= *p;.. /*
d62b0 62 3a 20 70 31 3c 3c 31 34 20 7c 20 70 33 20 28 b: p1<<14 | p3 (
d62c0 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0d 0a 20 20 unmasked) */..
d62d0 69 66 20 28 21 28 62 26 30 78 38 30 29 29 0d 0a if (!(b&0x80))..
d62e0 20 20 7b 0d 0a 20 20 20 20 62 20 26 3d 20 53 4c {.. b &= SL
d62f0 4f 54 5f 32 5f 30 3b 0d 0a 20 20 20 20 2f 2a 20 OT_2_0;.. /*
d6300 6d 6f 76 65 64 20 43 53 45 31 20 75 70 20 2a 2f moved CSE1 up */
d6310 0d 0a 20 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 .. /* a &= (0
d6320 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b x7f<<14)|(0x7f);
d6330 20 2a 2f 0d 0a 20 20 20 20 61 20 3d 20 61 3c 3c */.. a = a<<
d6340 37 3b 0d 0a 20 20 20 20 61 20 7c 3d 20 62 3b 0d 7;.. a |= b;.
d6350 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0d 0a 20 20 . *v = a;..
d6360 20 20 72 65 74 75 72 6e 20 34 3b 0d 0a 20 20 7d return 4;.. }
d6370 0d 0a 0d 0a 20 20 2f 2a 20 61 3a 20 70 30 3c 3c .... /* a: p0<<
d6380 31 34 20 7c 20 70 32 20 28 6d 61 73 6b 65 64 29 14 | p2 (masked)
d6390 20 2a 2f 0d 0a 20 20 2f 2a 20 62 3a 20 70 31 3c */.. /* b: p1<
d63a0 3c 31 34 20 7c 20 70 33 20 28 75 6e 6d 61 73 6b <14 | p3 (unmask
d63b0 65 64 29 20 2a 2f 0d 0a 20 20 2f 2a 20 31 3a 73 ed) */.. /* 1:s
d63c0 61 76 65 20 6f 66 66 20 70 30 3c 3c 32 31 20 7c ave off p0<<21 |
d63d0 20 70 31 3c 3c 31 34 20 7c 20 70 32 3c 3c 37 20 p1<<14 | p2<<7
d63e0 7c 20 70 33 20 28 6d 61 73 6b 65 64 29 20 2a 2f | p3 (masked) */
d63f0 0d 0a 20 20 2f 2a 20 6d 6f 76 65 64 20 43 53 45 .. /* moved CSE
d6400 31 20 75 70 20 2a 2f 0d 0a 20 20 2f 2a 20 61 20 1 up */.. /* a
d6410 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 &= (0x7f<<14)|(0
d6420 78 37 66 29 3b 20 2a 2f 0d 0a 20 20 62 20 26 3d x7f); */.. b &=
d6430 20 53 4c 4f 54 5f 32 5f 30 3b 0d 0a 20 20 73 20 SLOT_2_0;.. s
d6440 3d 20 61 3b 0d 0a 20 20 2f 2a 20 73 3a 20 70 30 = a;.. /* s: p0
d6450 3c 3c 31 34 20 7c 20 70 32 20 28 6d 61 73 6b 65 <<14 | p2 (maske
d6460 64 29 20 2a 2f 0d 0a 0d 0a 20 20 70 2b 2b 3b 0d d) */.... p++;.
d6470 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b 0d 0a 20 . a = a<<14;..
d6480 20 61 20 7c 3d 20 2a 70 3b 0d 0a 20 20 2f 2a 20 a |= *p;.. /*
d6490 61 3a 20 70 30 3c 3c 32 38 20 7c 20 70 32 3c 3c a: p0<<28 | p2<<
d64a0 31 34 20 7c 20 70 34 20 28 75 6e 6d 61 73 6b 65 14 | p4 (unmaske
d64b0 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 21 28 61 d) */.. if (!(a
d64c0 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 20 &0x80)).. {..
d64d0 20 20 2f 2a 20 77 65 20 63 61 6e 20 73 6b 69 70 /* we can skip
d64e0 20 74 68 65 73 65 20 63 61 75 73 65 20 74 68 65 these cause the
d64f0 79 20 77 65 72 65 20 28 65 66 66 65 63 74 69 76 y were (effectiv
d6500 65 6c 79 29 20 64 6f 6e 65 20 61 62 6f 76 65 20 ely) done above
d6510 69 6e 20 63 61 6c 63 27 69 6e 67 20 73 20 2a 2f in calc'ing s */
d6520 0d 0a 20 20 20 20 2f 2a 20 61 20 26 3d 20 28 30 .. /* a &= (0
d6530 78 37 66 3c 3c 32 38 29 7c 28 30 78 37 66 3c 3c x7f<<28)|(0x7f<<
d6540 31 34 29 7c 28 30 78 37 66 29 3b 20 2a 2f 0d 0a 14)|(0x7f); */..
d6550 20 20 20 20 2f 2a 20 62 20 26 3d 20 28 30 78 37 /* b &= (0x7
d6560 66 3c 3c 31 34 29 7c 28 30 78 37 66 29 3b 20 2a f<<14)|(0x7f); *
d6570 2f 0d 0a 20 20 20 20 62 20 3d 20 62 3c 3c 37 3b /.. b = b<<7;
d6580 0d 0a 20 20 20 20 61 20 7c 3d 20 62 3b 0d 0a 20 .. a |= b;..
d6590 20 20 20 73 20 3d 20 73 3e 3e 31 38 3b 0d 0a 20 s = s>>18;..
d65a0 20 20 20 2a 76 20 3d 20 28 28 75 36 34 29 73 29 *v = ((u64)s)
d65b0 3c 3c 33 32 20 7c 20 61 3b 0d 0a 20 20 20 20 72 <<32 | a;.. r
d65c0 65 74 75 72 6e 20 35 3b 0d 0a 20 20 7d 0d 0a 0d eturn 5;.. }...
d65d0 0a 20 20 2f 2a 20 32 3a 73 61 76 65 20 6f 66 66 . /* 2:save off
d65e0 20 70 30 3c 3c 32 31 20 7c 20 70 31 3c 3c 31 34 p0<<21 | p1<<14
d65f0 20 7c 20 70 32 3c 3c 37 20 7c 20 70 33 20 28 6d | p2<<7 | p3 (m
d6600 61 73 6b 65 64 29 20 2a 2f 0d 0a 20 20 73 20 3d asked) */.. s =
d6610 20 73 3c 3c 37 3b 0d 0a 20 20 73 20 7c 3d 20 62 s<<7;.. s |= b
d6620 3b 0d 0a 20 20 2f 2a 20 73 3a 20 70 30 3c 3c 32 ;.. /* s: p0<<2
d6630 31 20 7c 20 70 31 3c 3c 31 34 20 7c 20 70 32 3c 1 | p1<<14 | p2<
d6640 3c 37 20 7c 20 70 33 20 28 6d 61 73 6b 65 64 29 <7 | p3 (masked)
d6650 20 2a 2f 0d 0a 0d 0a 20 20 70 2b 2b 3b 0d 0a 20 */.... p++;..
d6660 20 62 20 3d 20 62 3c 3c 31 34 3b 0d 0a 20 20 62 b = b<<14;.. b
d6670 20 7c 3d 20 2a 70 3b 0d 0a 20 20 2f 2a 20 62 3a |= *p;.. /* b:
d6680 20 70 31 3c 3c 32 38 20 7c 20 70 33 3c 3c 31 34 p1<<28 | p3<<14
d6690 20 7c 20 70 35 20 28 75 6e 6d 61 73 6b 65 64 29 | p5 (unmasked)
d66a0 20 2a 2f 0d 0a 20 20 69 66 20 28 21 28 62 26 30 */.. if (!(b&0
d66b0 78 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 x80)).. {..
d66c0 2f 2a 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 /* we can skip t
d66d0 68 69 73 20 63 61 75 73 65 20 69 74 20 77 61 73 his cause it was
d66e0 20 28 65 66 66 65 63 74 69 76 65 6c 79 29 20 64 (effectively) d
d66f0 6f 6e 65 20 61 62 6f 76 65 20 69 6e 20 63 61 6c one above in cal
d6700 63 27 69 6e 67 20 73 20 2a 2f 0d 0a 20 20 20 20 c'ing s */..
d6710 2f 2a 20 62 20 26 3d 20 28 30 78 37 66 3c 3c 32 /* b &= (0x7f<<2
d6720 38 29 7c 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 8)|(0x7f<<14)|(0
d6730 78 37 66 29 3b 20 2a 2f 0d 0a 20 20 20 20 61 20 x7f); */.. a
d6740 26 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0d 0a 20 20 &= SLOT_2_0;..
d6750 20 20 61 20 3d 20 61 3c 3c 37 3b 0d 0a 20 20 20 a = a<<7;..
d6760 20 61 20 7c 3d 20 62 3b 0d 0a 20 20 20 20 73 20 a |= b;.. s
d6770 3d 20 73 3e 3e 31 38 3b 0d 0a 20 20 20 20 2a 76 = s>>18;.. *v
d6780 20 3d 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 = ((u64)s)<<32
d6790 7c 20 61 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e | a;.. return
d67a0 20 36 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 2b 6;.. }.... p+
d67b0 2b 3b 0d 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b +;.. a = a<<14;
d67c0 0d 0a 20 20 61 20 7c 3d 20 2a 70 3b 0d 0a 20 20 .. a |= *p;..
d67d0 2f 2a 20 61 3a 20 70 32 3c 3c 32 38 20 7c 20 70 /* a: p2<<28 | p
d67e0 34 3c 3c 31 34 20 7c 20 70 36 20 28 75 6e 6d 61 4<<14 | p6 (unma
d67f0 73 6b 65 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 sked) */.. if (
d6800 21 28 61 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d !(a&0x80)).. {.
d6810 0a 20 20 20 20 61 20 26 3d 20 53 4c 4f 54 5f 34 . a &= SLOT_4
d6820 5f 32 5f 30 3b 0d 0a 20 20 20 20 62 20 26 3d 20 _2_0;.. b &=
d6830 53 4c 4f 54 5f 32 5f 30 3b 0d 0a 20 20 20 20 62 SLOT_2_0;.. b
d6840 20 3d 20 62 3c 3c 37 3b 0d 0a 20 20 20 20 61 20 = b<<7;.. a
d6850 7c 3d 20 62 3b 0d 0a 20 20 20 20 73 20 3d 20 73 |= b;.. s = s
d6860 3e 3e 31 31 3b 0d 0a 20 20 20 20 2a 76 20 3d 20 >>11;.. *v =
d6870 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c 20 61 ((u64)s)<<32 | a
d6880 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b ;.. return 7;
d6890 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 53 .. }.... /* CS
d68a0 45 32 20 66 72 6f 6d 20 62 65 6c 6f 77 20 2a 2f E2 from below */
d68b0 0d 0a 20 20 61 20 26 3d 20 53 4c 4f 54 5f 32 5f .. a &= SLOT_2_
d68c0 30 3b 0d 0a 20 20 70 2b 2b 3b 0d 0a 20 20 62 20 0;.. p++;.. b
d68d0 3d 20 62 3c 3c 31 34 3b 0d 0a 20 20 62 20 7c 3d = b<<14;.. b |=
d68e0 20 2a 70 3b 0d 0a 20 20 2f 2a 20 62 3a 20 70 33 *p;.. /* b: p3
d68f0 3c 3c 32 38 20 7c 20 70 35 3c 3c 31 34 20 7c 20 <<28 | p5<<14 |
d6900 70 37 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f p7 (unmasked) */
d6910 0d 0a 20 20 69 66 20 28 21 28 62 26 30 78 38 30 .. if (!(b&0x80
d6920 29 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 62 20 26 )).. {.. b &
d6930 3d 20 53 4c 4f 54 5f 34 5f 32 5f 30 3b 0d 0a 20 = SLOT_4_2_0;..
d6940 20 20 20 2f 2a 20 6d 6f 76 65 64 20 43 53 45 32 /* moved CSE2
d6950 20 75 70 20 2a 2f 0d 0a 20 20 20 20 2f 2a 20 61 up */.. /* a
d6960 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 &= (0x7f<<14)|(
d6970 30 78 37 66 29 3b 20 2a 2f 0d 0a 20 20 20 20 61 0x7f); */.. a
d6980 20 3d 20 61 3c 3c 37 3b 0d 0a 20 20 20 20 61 20 = a<<7;.. a
d6990 7c 3d 20 62 3b 0d 0a 20 20 20 20 73 20 3d 20 73 |= b;.. s = s
d69a0 3e 3e 34 3b 0d 0a 20 20 20 20 2a 76 20 3d 20 28 >>4;.. *v = (
d69b0 28 75 36 34 29 73 29 3c 3c 33 32 20 7c 20 61 3b (u64)s)<<32 | a;
d69c0 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0d .. return 8;.
d69d0 0a 20 20 7d 0d 0a 0d 0a 20 20 70 2b 2b 3b 0d 0a . }.... p++;..
d69e0 20 20 61 20 3d 20 61 3c 3c 31 35 3b 0d 0a 20 20 a = a<<15;..
d69f0 61 20 7c 3d 20 2a 70 3b 0d 0a 20 20 2f 2a 20 61 a |= *p;.. /* a
d6a00 3a 20 70 34 3c 3c 32 39 20 7c 20 70 36 3c 3c 31 : p4<<29 | p6<<1
d6a10 35 20 7c 20 70 38 20 28 75 6e 6d 61 73 6b 65 64 5 | p8 (unmasked
d6a20 29 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 6d 6f 76 ) */.... /* mov
d6a30 65 64 20 43 53 45 32 20 75 70 20 2a 2f 0d 0a 20 ed CSE2 up */..
d6a40 20 2f 2a 20 61 20 26 3d 20 28 30 78 37 66 3c 3c /* a &= (0x7f<<
d6a50 32 39 29 7c 28 30 78 37 66 3c 3c 31 35 29 7c 28 29)|(0x7f<<15)|(
d6a60 30 78 66 66 29 3b 20 2a 2f 0d 0a 20 20 62 20 26 0xff); */.. b &
d6a70 3d 20 53 4c 4f 54 5f 32 5f 30 3b 0d 0a 20 20 62 = SLOT_2_0;.. b
d6a80 20 3d 20 62 3c 3c 38 3b 0d 0a 20 20 61 20 7c 3d = b<<8;.. a |=
d6a90 20 62 3b 0d 0a 0d 0a 20 20 73 20 3d 20 73 3c 3c b;.... s = s<<
d6aa0 34 3b 0d 0a 20 20 62 20 3d 20 70 5b 2d 34 5d 3b 4;.. b = p[-4];
d6ab0 0d 0a 20 20 62 20 26 3d 20 30 78 37 66 3b 0d 0a .. b &= 0x7f;..
d6ac0 20 20 62 20 3d 20 62 3e 3e 33 3b 0d 0a 20 20 73 b = b>>3;.. s
d6ad0 20 7c 3d 20 62 3b 0d 0a 0d 0a 20 20 2a 76 20 3d |= b;.... *v =
d6ae0 20 28 28 75 36 34 29 73 29 3c 3c 33 32 20 7c 20 ((u64)s)<<32 |
d6af0 61 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 39 a;.... return 9
d6b00 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
d6b10 65 61 64 20 61 20 33 32 2d 62 69 74 20 76 61 72 ead a 32-bit var
d6b20 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 iable-length int
d6b30 65 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 eger from memory
d6b40 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 starting at p[0
d6b50 5d 2e 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ]...** Return th
d6b60 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 e number of byte
d6b70 73 20 72 65 61 64 2e 20 20 54 68 65 20 76 61 6c s read. The val
d6b80 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 ue is stored in
d6b90 2a 76 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 *v...**..** If t
d6ba0 68 65 20 76 61 72 69 6e 74 20 73 74 6f 72 65 64 he varint stored
d6bb0 20 69 6e 20 70 5b 30 5d 20 69 73 20 6c 61 72 67 in p[0] is larg
d6bc0 65 72 20 74 68 61 6e 20 63 61 6e 20 66 69 74 20 er than can fit
d6bd0 69 6e 20 61 20 33 32 2d 62 69 74 20 75 6e 73 69 in a 32-bit unsi
d6be0 67 6e 65 64 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 gned..** integer
d6bf0 2c 20 74 68 65 6e 20 73 65 74 20 2a 76 20 74 6f , then set *v to
d6c00 20 30 78 66 66 66 66 66 66 66 66 2e 0d 0a 2a 2a 0xffffffff...**
d6c10 0d 0a 2a 2a 20 41 20 4d 41 43 52 4f 20 76 65 72 ..** A MACRO ver
d6c20 73 69 6f 6e 2c 20 67 65 74 56 61 72 69 6e 74 33 sion, getVarint3
d6c30 32 2c 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 2, is provided w
d6c40 68 69 63 68 20 69 6e 6c 69 6e 65 73 20 74 68 65 hich inlines the
d6c50 20 0d 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 ..** single-byt
d6c60 65 20 63 61 73 65 2e 20 20 41 6c 6c 20 63 6f 64 e case. All cod
d6c70 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 e should use the
d6c80 20 4d 41 43 52 4f 20 76 65 72 73 69 6f 6e 20 61 MACRO version a
d6c90 73 20 0d 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 s ..** this func
d6ca0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 tion assumes the
d6cb0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 61 73 single-byte cas
d6cc0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 e has already be
d6cd0 65 6e 20 68 61 6e 64 6c 65 64 2e 0d 0a 2a 2f 0d en handled...*/.
d6ce0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
d6cf0 75 38 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 u8 sqlite3GetVar
d6d00 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 int32(const unsi
d6d10 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 gned char *p, u3
d6d20 32 20 2a 76 29 7b 0d 0a 20 20 75 33 32 20 61 2c 2 *v){.. u32 a,
d6d30 62 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 31 b;.... /* The 1
d6d40 2d 62 79 74 65 20 63 61 73 65 2e 20 20 4f 76 65 -byte case. Ove
d6d50 72 77 68 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 rwhelmingly the
d6d60 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 2e 20 20 48 61 most common. Ha
d6d70 6e 64 6c 65 64 20 69 6e 6c 69 6e 65 0d 0a 20 20 ndled inline..
d6d80 2a 2a 20 62 79 20 74 68 65 20 67 65 74 56 61 72 ** by the getVar
d6d90 69 6e 33 32 28 29 20 6d 61 63 72 6f 20 2a 2f 0d in32() macro */.
d6da0 0a 20 20 61 20 3d 20 2a 70 3b 0d 0a 20 20 2f 2a . a = *p;.. /*
d6db0 20 61 3a 20 70 30 20 28 75 6e 6d 61 73 6b 65 64 a: p0 (unmasked
d6dc0 29 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 67 65 ) */..#ifndef ge
d6dd0 74 56 61 72 69 6e 74 33 32 0d 0a 20 20 69 66 20 tVarint32.. if
d6de0 28 21 28 61 26 30 78 38 30 29 29 0d 0a 20 20 7b (!(a&0x80)).. {
d6df0 0d 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 .. /* Values
d6e00 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 between 0 and 12
d6e10 37 20 2a 2f 0d 0a 20 20 20 20 2a 76 20 3d 20 61 7 */.. *v = a
d6e20 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b ;.. return 1;
d6e30 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d .. }..#endif...
d6e40 0a 20 20 2f 2a 20 54 68 65 20 32 2d 62 79 74 65 . /* The 2-byte
d6e50 20 63 61 73 65 20 2a 2f 0d 0a 20 20 70 2b 2b 3b case */.. p++;
d6e60 0d 0a 20 20 62 20 3d 20 2a 70 3b 0d 0a 20 20 2f .. b = *p;.. /
d6e70 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61 73 6b 65 * b: p1 (unmaske
d6e80 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 21 28 62 d) */.. if (!(b
d6e90 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 20 &0x80)).. {..
d6ea0 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 /* Values betw
d6eb0 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38 een 128 and 1638
d6ec0 33 20 2a 2f 0d 0a 20 20 20 20 61 20 26 3d 20 30 3 */.. a &= 0
d6ed0 78 37 66 3b 0d 0a 20 20 20 20 61 20 3d 20 61 3c x7f;.. a = a<
d6ee0 3c 37 3b 0d 0a 20 20 20 20 2a 76 20 3d 20 61 20 <7;.. *v = a
d6ef0 7c 20 62 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e | b;.. return
d6f00 20 32 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 2;.. }.... /*
d6f10 20 54 68 65 20 33 2d 62 79 74 65 20 63 61 73 65 The 3-byte case
d6f20 20 2a 2f 0d 0a 20 20 70 2b 2b 3b 0d 0a 20 20 61 */.. p++;.. a
d6f30 20 3d 20 61 3c 3c 31 34 3b 0d 0a 20 20 61 20 7c = a<<14;.. a |
d6f40 3d 20 2a 70 3b 0d 0a 20 20 2f 2a 20 61 3a 20 70 = *p;.. /* a: p
d6f50 30 3c 3c 31 34 20 7c 20 70 32 20 28 75 6e 6d 61 0<<14 | p2 (unma
d6f60 73 6b 65 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 sked) */.. if (
d6f70 21 28 61 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d !(a&0x80)).. {.
d6f80 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 . /* Values b
d6f90 65 74 77 65 65 6e 20 31 36 33 38 34 20 61 6e 64 etween 16384 and
d6fa0 20 32 30 39 37 31 35 31 20 2a 2f 0d 0a 20 20 20 2097151 */..
d6fb0 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 a &= (0x7f<<14)
d6fc0 7c 28 30 78 37 66 29 3b 0d 0a 20 20 20 20 62 20 |(0x7f);.. b
d6fd0 26 3d 20 30 78 37 66 3b 0d 0a 20 20 20 20 62 20 &= 0x7f;.. b
d6fe0 3d 20 62 3c 3c 37 3b 0d 0a 20 20 20 20 2a 76 20 = b<<7;.. *v
d6ff0 3d 20 61 20 7c 20 62 3b 0d 0a 20 20 20 20 72 65 = a | b;.. re
d7000 74 75 72 6e 20 33 3b 0d 0a 20 20 7d 0d 0a 0d 0a turn 3;.. }....
d7010 20 20 2f 2a 20 41 20 33 32 2d 62 69 74 20 76 61 /* A 32-bit va
d7020 72 69 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 rint is used to
d7030 73 74 6f 72 65 20 73 69 7a 65 20 69 6e 66 6f 72 store size infor
d7040 6d 61 74 69 6f 6e 20 69 6e 20 62 74 72 65 65 73 mation in btrees
d7050 2e 0d 0a 20 20 2a 2a 20 4f 62 6a 65 63 74 73 20 ... ** Objects
d7060 61 72 65 20 72 61 72 65 6c 79 20 6c 61 72 67 65 are rarely large
d7070 72 20 74 68 61 6e 20 32 4d 69 42 20 6c 69 6d 69 r than 2MiB limi
d7080 74 20 6f 66 20 61 20 33 2d 62 79 74 65 20 76 61 t of a 3-byte va
d7090 72 69 6e 74 2e 0d 0a 20 20 2a 2a 20 41 20 33 2d rint... ** A 3-
d70a0 62 79 74 65 20 76 61 72 69 6e 74 20 69 73 20 73 byte varint is s
d70b0 75 66 66 69 63 69 65 6e 74 2c 20 66 6f 72 20 65 ufficient, for e
d70c0 78 61 6d 70 6c 65 2c 20 74 6f 20 72 65 63 6f 72 xample, to recor
d70d0 64 20 74 68 65 20 73 69 7a 65 0d 0a 20 20 2a 2a d the size.. **
d70e0 20 6f 66 20 61 20 31 30 34 38 35 36 39 2d 62 79 of a 1048569-by
d70f0 74 65 20 42 4c 4f 42 20 6f 72 20 73 74 72 69 6e te BLOB or strin
d7100 67 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 57 g... **.. ** W
d7110 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c 6c 20 74 68 e only unroll th
d7120 65 20 66 69 72 73 74 20 31 2d 2c 20 32 2d 2c 20 e first 1-, 2-,
d7130 61 6e 64 20 33 2d 20 62 79 74 65 20 63 61 73 65 and 3- byte case
d7140 73 2e 20 20 54 68 65 20 76 65 72 79 0d 0a 20 20 s. The very..
d7150 2a 2a 20 72 61 72 65 20 6c 61 72 67 65 72 20 63 ** rare larger c
d7160 61 73 65 73 20 63 61 6e 20 62 65 20 68 61 6e 64 ases can be hand
d7170 6c 65 64 20 62 79 20 74 68 65 20 73 6c 6f 77 65 led by the slowe
d7180 72 20 36 34 2d 62 69 74 20 76 61 72 69 6e 74 0d r 64-bit varint.
d7190 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 2e 0d 0a . ** routine...
d71a0 20 20 2a 2f 0d 0a 23 69 66 20 31 0d 0a 20 20 7b */..#if 1.. {
d71b0 0d 0a 20 20 20 20 75 36 34 20 76 36 34 3b 0d 0a .. u64 v64;..
d71c0 20 20 20 20 75 38 20 6e 3b 0d 0a 0d 0a 20 20 20 u8 n;....
d71d0 20 70 20 2d 3d 20 32 3b 0d 0a 20 20 20 20 6e 20 p -= 2;.. n
d71e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 = sqlite3GetVari
d71f0 6e 74 28 70 2c 20 26 76 36 34 29 3b 0d 0a 20 20 nt(p, &v64);..
d7200 20 20 61 73 73 65 72 74 28 20 6e 3e 33 20 26 26 assert( n>3 &&
d7210 20 6e 3c 3d 39 20 29 3b 0d 0a 20 20 20 20 69 66 n<=9 );.. if
d7220 28 20 28 76 36 34 20 26 20 53 51 4c 49 54 45 5f ( (v64 & SQLITE_
d7230 4d 41 58 5f 55 33 32 29 21 3d 76 36 34 20 29 7b MAX_U32)!=v64 ){
d7240 0d 0a 20 20 20 20 20 20 2a 76 20 3d 20 30 78 66 .. *v = 0xf
d7250 66 66 66 66 66 66 66 3b 0d 0a 20 20 20 20 7d 65 fffffff;.. }e
d7260 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a 76 20 3d lse{.. *v =
d7270 20 28 75 33 32 29 76 36 34 3b 0d 0a 20 20 20 20 (u32)v64;..
d7280 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 3b }.. return n;
d7290 0d 0a 20 20 7d 0d 0a 0d 0a 23 65 6c 73 65 0d 0a .. }....#else..
d72a0 20 20 2f 2a 20 46 6f 72 20 66 6f 6c 6c 6f 77 69 /* For followi
d72b0 6e 67 20 63 6f 64 65 20 28 6b 65 70 74 20 66 6f ng code (kept fo
d72c0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 63 r historical rec
d72d0 6f 72 64 20 6f 6e 6c 79 29 20 73 68 6f 77 73 20 ord only) shows
d72e0 61 6e 0d 0a 20 20 2a 2a 20 75 6e 72 6f 6c 6c 69 an.. ** unrolli
d72f0 6e 67 20 66 6f 72 20 74 68 65 20 33 2d 20 61 6e ng for the 3- an
d7300 64 20 34 2d 62 79 74 65 20 76 61 72 69 6e 74 20 d 4-byte varint
d7310 63 61 73 65 73 2e 20 20 54 68 69 73 20 63 6f 64 cases. This cod
d7320 65 20 69 73 0d 0a 20 20 2a 2a 20 73 6c 69 67 68 e is.. ** sligh
d7330 74 6c 79 20 66 61 73 74 65 72 2c 20 62 75 74 20 tly faster, but
d7340 69 74 20 69 73 20 61 6c 73 6f 20 6c 61 72 67 65 it is also large
d7350 72 20 61 6e 64 20 6d 75 63 68 20 68 61 72 64 65 r and much harde
d7360 72 20 74 6f 20 74 65 73 74 2e 0d 0a 20 20 2a 2f r to test... */
d7370 0d 0a 20 20 70 2b 2b 3b 0d 0a 20 20 62 20 3d 20 .. p++;.. b =
d7380 62 3c 3c 31 34 3b 0d 0a 20 20 62 20 7c 3d 20 2a b<<14;.. b |= *
d7390 70 3b 0d 0a 20 20 2f 2a 20 62 3a 20 70 31 3c 3c p;.. /* b: p1<<
d73a0 31 34 20 7c 20 70 33 20 28 75 6e 6d 61 73 6b 65 14 | p3 (unmaske
d73b0 64 29 20 2a 2f 0d 0a 20 20 69 66 20 28 21 28 62 d) */.. if (!(b
d73c0 26 30 78 38 30 29 29 0d 0a 20 20 7b 0d 0a 20 20 &0x80)).. {..
d73d0 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 /* Values betw
d73e0 65 65 6e 20 32 30 39 37 31 35 32 20 61 6e 64 20 een 2097152 and
d73f0 32 36 38 34 33 35 34 35 35 20 2a 2f 0d 0a 20 20 268435455 */..
d7400 20 20 62 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 b &= (0x7f<<14
d7410 29 7c 28 30 78 37 66 29 3b 0d 0a 20 20 20 20 61 )|(0x7f);.. a
d7420 20 26 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 &= (0x7f<<14)|(
d7430 30 78 37 66 29 3b 0d 0a 20 20 20 20 61 20 3d 20 0x7f);.. a =
d7440 61 3c 3c 37 3b 0d 0a 20 20 20 20 2a 76 20 3d 20 a<<7;.. *v =
d7450 61 20 7c 20 62 3b 0d 0a 20 20 20 20 72 65 74 75 a | b;.. retu
d7460 72 6e 20 34 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 rn 4;.. }....
d7470 70 2b 2b 3b 0d 0a 20 20 61 20 3d 20 61 3c 3c 31 p++;.. a = a<<1
d7480 34 3b 0d 0a 20 20 61 20 7c 3d 20 2a 70 3b 0d 0a 4;.. a |= *p;..
d7490 20 20 2f 2a 20 61 3a 20 70 30 3c 3c 32 38 20 7c /* a: p0<<28 |
d74a0 20 70 32 3c 3c 31 34 20 7c 20 70 34 20 28 75 6e p2<<14 | p4 (un
d74b0 6d 61 73 6b 65 64 29 20 2a 2f 0d 0a 20 20 69 66 masked) */.. if
d74c0 20 28 21 28 61 26 30 78 38 30 29 29 0d 0a 20 20 (!(a&0x80))..
d74d0 7b 0d 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 {.. /* Values
d74e0 20 20 62 65 74 77 65 65 6e 20 32 36 38 34 33 35 between 268435
d74f0 34 35 36 20 61 6e 64 20 33 34 33 35 39 37 33 38 456 and 34359738
d7500 33 36 37 20 2a 2f 0d 0a 20 20 20 20 61 20 26 3d 367 */.. a &=
d7510 20 53 4c 4f 54 5f 34 5f 32 5f 30 3b 0d 0a 20 20 SLOT_4_2_0;..
d7520 20 20 62 20 26 3d 20 53 4c 4f 54 5f 34 5f 32 5f b &= SLOT_4_2_
d7530 30 3b 0d 0a 20 20 20 20 62 20 3d 20 62 3c 3c 37 0;.. b = b<<7
d7540 3b 0d 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 ;.. *v = a |
d7550 62 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 35 b;.. return 5
d7560 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 57 ;.. }.... /* W
d7570 65 20 63 61 6e 20 6f 6e 6c 79 20 72 65 61 63 68 e can only reach
d7580 20 74 68 69 73 20 70 6f 69 6e 74 20 77 68 65 6e this point when
d7590 20 72 65 61 64 69 6e 67 20 61 20 63 6f 72 72 75 reading a corru
d75a0 70 74 20 64 61 74 61 62 61 73 65 0d 0a 20 20 2a pt database.. *
d75b0 2a 20 66 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 * file. In that
d75c0 20 63 61 73 65 20 77 65 20 61 72 65 20 6e 6f 74 case we are not
d75d0 20 69 6e 20 61 6e 79 20 68 75 72 72 79 2e 20 20 in any hurry.
d75e0 55 73 65 20 74 68 65 20 28 72 65 6c 61 74 69 76 Use the (relativ
d75f0 65 6c 79 0d 0a 20 20 2a 2a 20 73 6c 6f 77 29 20 ely.. ** slow)
d7600 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 general-purpose
d7610 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 sqlite3GetVarint
d7620 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 () routine to ex
d7630 74 72 61 63 74 20 74 68 65 0d 0a 20 20 2a 2a 20 tract the.. **
d7640 76 61 6c 75 65 2e 20 2a 2f 0d 0a 20 20 7b 0d 0a value. */.. {..
d7650 20 20 20 20 75 36 34 20 76 36 34 3b 0d 0a 20 20 u64 v64;..
d7660 20 20 75 38 20 6e 3b 0d 0a 0d 0a 20 20 20 20 70 u8 n;.... p
d7670 20 2d 3d 20 34 3b 0d 0a 20 20 20 20 6e 20 3d 20 -= 4;.. n =
d7680 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 sqlite3GetVarint
d7690 28 70 2c 20 26 76 36 34 29 3b 0d 0a 20 20 20 20 (p, &v64);..
d76a0 61 73 73 65 72 74 28 20 6e 3e 35 20 26 26 20 6e assert( n>5 && n
d76b0 3c 3d 39 20 29 3b 0d 0a 20 20 20 20 2a 76 20 3d <=9 );.. *v =
d76c0 20 28 75 33 32 29 76 36 34 3b 0d 0a 20 20 20 20 (u32)v64;..
d76d0 72 65 74 75 72 6e 20 6e 3b 0d 0a 20 20 7d 0d 0a return n;.. }..
d76e0 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d #endif..}..../*.
d76f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
d7700 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 umber of bytes t
d7710 68 61 74 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 hat will be need
d7720 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 ed to store the
d7730 67 69 76 65 6e 0d 0a 2a 2a 20 36 34 2d 62 69 74 given..** 64-bit
d7740 20 69 6e 74 65 67 65 72 2e 0d 0a 2a 2f 0d 0a 53 integer...*/..S
d7750 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
d7760 74 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c t sqlite3VarintL
d7770 65 6e 28 75 36 34 20 76 29 7b 0d 0a 20 20 69 6e en(u64 v){.. in
d7780 74 20 69 20 3d 20 30 3b 0d 0a 20 20 64 6f 7b 0d t i = 0;.. do{.
d7790 0a 20 20 20 20 69 2b 2b 3b 0d 0a 20 20 20 20 76 . i++;.. v
d77a0 20 3e 3e 3d 20 37 3b 0d 0a 20 20 7d 77 68 69 6c >>= 7;.. }whil
d77b0 65 28 20 76 21 3d 30 20 26 26 20 41 4c 57 41 59 e( v!=0 && ALWAY
d77c0 53 28 69 3c 39 29 20 29 3b 0d 0a 20 20 72 65 74 S(i<9) );.. ret
d77d0 75 72 6e 20 69 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f urn i;..}....../
d77e0 2a 0d 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77 72 *..** Read or wr
d77f0 69 74 65 20 61 20 66 6f 75 72 2d 62 79 74 65 20 ite a four-byte
d7800 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 big-endian integ
d7810 65 72 20 76 61 6c 75 65 2e 0d 0a 2a 2f 0d 0a 53 er value...*/..S
d7820 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 75 33 QLITE_PRIVATE u3
d7830 32 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 2 sqlite3Get4byt
d7840 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 29 7b 0d e(const u8 *p){.
d7850 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c . return (p[0]<
d7860 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c 31 36 <24) | (p[1]<<16
d7870 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20 7c 20 ) | (p[2]<<8) |
d7880 70 5b 33 5d 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 p[3];..}..SQLITE
d7890 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
d78a0 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 75 6e lite3Put4byte(un
d78b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 signed char *p,
d78c0 75 33 32 20 76 29 7b 0d 0a 20 20 70 5b 30 5d 20 u32 v){.. p[0]
d78d0 3d 20 28 75 38 29 28 76 3e 3e 32 34 29 3b 0d 0a = (u8)(v>>24);..
d78e0 20 20 70 5b 31 5d 20 3d 20 28 75 38 29 28 76 3e p[1] = (u8)(v>
d78f0 3e 31 36 29 3b 0d 0a 20 20 70 5b 32 5d 20 3d 20 >16);.. p[2] =
d7900 28 75 38 29 28 76 3e 3e 38 29 3b 0d 0a 20 20 70 (u8)(v>>8);.. p
d7910 5b 33 5d 20 3d 20 28 75 38 29 76 3b 0d 0a 7d 0d [3] = (u8)v;..}.
d7920 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 ......./*..** Tr
d7930 61 6e 73 6c 61 74 65 20 61 20 73 69 6e 67 6c 65 anslate a single
d7940 20 62 79 74 65 20 6f 66 20 48 65 78 20 69 6e 74 byte of Hex int
d7950 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0d 0a 2a o an integer...*
d7960 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f * This routine o
d7970 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 68 20 72 nly works if h r
d7980 65 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 eally is a valid
d7990 20 68 65 78 61 64 65 63 69 6d 61 6c 0d 0a 2a 2a hexadecimal..**
d79a0 20 63 68 61 72 61 63 74 65 72 3a 20 20 30 2e 2e character: 0..
d79b0 39 61 2e 2e 66 41 2e 2e 46 0d 0a 2a 2f 0d 0a 53 9a..fA..F..*/..S
d79c0 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 75 38 QLITE_PRIVATE u8
d79d0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 sqlite3HexToInt
d79e0 28 69 6e 74 20 68 29 7b 0d 0a 20 20 61 73 73 65 (int h){.. asse
d79f0 72 74 28 20 28 68 3e 3d 27 30 27 20 26 26 20 68 rt( (h>='0' && h
d7a00 3c 3d 27 39 27 29 20 7c 7c 20 20 28 68 3e 3d 27 <='9') || (h>='
d7a10 61 27 20 26 26 20 68 3c 3d 27 66 27 29 20 7c 7c a' && h<='f') ||
d7a20 20 20 28 68 3e 3d 27 41 27 20 26 26 20 68 3c 3d (h>='A' && h<=
d7a30 27 46 27 29 20 29 3b 0d 0a 23 69 66 64 65 66 20 'F') );..#ifdef
d7a40 53 51 4c 49 54 45 5f 41 53 43 49 49 0d 0a 20 20 SQLITE_ASCII..
d7a50 68 20 2b 3d 20 39 2a 28 31 26 28 68 3e 3e 36 29 h += 9*(1&(h>>6)
d7a60 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 );..#endif..#ifd
d7a70 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 ef SQLITE_EBCDIC
d7a80 0d 0a 20 20 68 20 2b 3d 20 39 2a 28 31 26 7e 28 .. h += 9*(1&~(
d7a90 68 3e 3e 34 29 29 3b 0d 0a 23 65 6e 64 69 66 0d h>>4));..#endif.
d7aa0 0a 20 20 72 65 74 75 72 6e 20 28 75 38 29 28 68 . return (u8)(h
d7ab0 20 26 20 30 78 66 29 3b 0d 0a 7d 0d 0a 0d 0a 23 & 0xf);..}....#
d7ac0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 if !defined(SQLI
d7ad0 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 TE_OMIT_BLOB_LIT
d7ae0 45 52 41 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 ERAL) || defined
d7af0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 (SQLITE_HAS_CODE
d7b00 43 29 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 C)../*..** Conve
d7b10 72 74 20 61 20 42 4c 4f 42 20 6c 69 74 65 72 61 rt a BLOB litera
d7b20 6c 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 l of the form "x
d7b30 27 68 68 68 68 68 68 27 22 20 69 6e 74 6f 20 69 'hhhhhh'" into i
d7b40 74 73 20 62 69 6e 61 72 79 0d 0a 2a 2a 20 76 61 ts binary..** va
d7b50 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 lue. Return a p
d7b60 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 62 69 ointer to its bi
d7b70 6e 61 72 79 20 76 61 6c 75 65 2e 20 20 53 70 61 nary value. Spa
d7b80 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0d 0a ce to hold the..
d7b90 2a 2a 20 62 69 6e 61 72 79 20 76 61 6c 75 65 20 ** binary value
d7ba0 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 has been obtaine
d7bb0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e d from malloc an
d7bc0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 d must be freed
d7bd0 62 79 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 69 by..** the calli
d7be0 6e 67 20 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2f 0d ng routine...*/.
d7bf0 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
d7c00 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 48 65 78 void *sqlite3Hex
d7c10 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 20 2a ToBlob(sqlite3 *
d7c20 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a db, const char *
d7c30 7a 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 63 68 z, int n){.. ch
d7c40 61 72 20 2a 7a 42 6c 6f 62 3b 0d 0a 20 20 69 6e ar *zBlob;.. in
d7c50 74 20 69 3b 0d 0a 0d 0a 20 20 7a 42 6c 6f 62 20 t i;.... zBlob
d7c60 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 = (char *)sqlite
d7c70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 3DbMallocRaw(db,
d7c80 20 6e 2f 32 20 2b 20 31 29 3b 0d 0a 20 20 6e 2d n/2 + 1);.. n-
d7c90 2d 3b 0d 0a 20 20 69 66 28 20 7a 42 6c 6f 62 20 -;.. if( zBlob
d7ca0 29 7b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b ){.. for(i=0;
d7cb0 20 69 3c 6e 3b 20 69 2b 3d 32 29 7b 0d 0a 20 20 i<n; i+=2){..
d7cc0 20 20 20 20 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d zBlob[i/2] =
d7cd0 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e (sqlite3HexToIn
d7ce0 74 28 7a 5b 69 5d 29 3c 3c 34 29 20 7c 20 73 71 t(z[i])<<4) | sq
d7cf0 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 5b lite3HexToInt(z[
d7d00 69 2b 31 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 i+1]);.. }..
d7d10 20 20 20 7a 42 6c 6f 62 5b 69 2f 32 5d 20 3d 20 zBlob[i/2] =
d7d20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 0;.. }.. retur
d7d30 6e 20 7a 42 6c 6f 62 3b 0d 0a 7d 0d 0a 23 65 6e n zBlob;..}..#en
d7d40 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f dif /* !SQLITE_O
d7d50 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c MIT_BLOB_LITERAL
d7d60 20 7c 7c 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 || SQLITE_HAS_C
d7d70 4f 44 45 43 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a ODEC */..../*..*
d7d80 2a 20 4c 6f 67 20 61 6e 20 65 72 72 6f 72 20 74 * Log an error t
d7d90 68 61 74 20 69 73 20 61 6e 20 41 50 49 20 63 61 hat is an API ca
d7da0 6c 6c 20 6f 6e 20 61 20 63 6f 6e 6e 65 63 74 69 ll on a connecti
d7db0 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 on pointer that
d7dc0 73 68 6f 75 6c 64 0d 0a 2a 2a 20 6e 6f 74 20 68 should..** not h
d7dd0 61 76 65 20 62 65 65 6e 20 75 73 65 64 2e 20 20 ave been used.
d7de0 54 68 65 20 22 74 79 70 65 22 20 6f 66 20 63 6f The "type" of co
d7df0 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 nnection pointer
d7e00 20 69 73 20 67 69 76 65 6e 20 61 73 20 74 68 65 is given as the
d7e10 0d 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 ..** argument.
d7e20 54 68 65 20 7a 54 79 70 65 20 69 73 20 61 20 77 The zType is a w
d7e30 6f 72 64 20 6c 69 6b 65 20 22 4e 55 4c 4c 22 20 ord like "NULL"
d7e40 6f 72 20 22 63 6c 6f 73 65 64 22 20 6f 72 20 22 or "closed" or "
d7e50 69 6e 76 61 6c 69 64 22 2e 0d 0a 2a 2f 0d 0a 73 invalid"...*/..s
d7e60 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 42 61 tatic void logBa
d7e70 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 63 6f 6e 73 dConnection(cons
d7e80 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0d t char *zType){.
d7e90 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 . sqlite3_log(S
d7ea0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0d 0a QLITE_MISUSE, ..
d7eb0 20 20 20 20 20 22 41 50 49 20 63 61 6c 6c 20 77 "API call w
d7ec0 69 74 68 20 25 73 20 64 61 74 61 62 61 73 65 20 ith %s database
d7ed0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 connection point
d7ee0 65 72 22 2c 0d 0a 20 20 20 20 20 7a 54 79 70 65 er",.. zType
d7ef0 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d .. );..}..../*.
d7f00 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b .** Check to mak
d7f10 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 e sure we have a
d7f20 20 76 61 6c 69 64 20 64 62 20 70 6f 69 6e 74 65 valid db pointe
d7f30 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69 73 r. This test is
d7f40 20 6e 6f 74 0d 0a 2a 2a 20 66 6f 6f 6c 70 72 6f not..** foolpro
d7f50 6f 66 20 62 75 74 20 69 74 20 64 6f 65 73 20 70 of but it does p
d7f60 72 6f 76 69 64 65 20 73 6f 6d 65 20 6d 65 61 73 rovide some meas
d7f70 75 72 65 20 6f 66 20 70 72 6f 74 65 63 74 69 6f ure of protectio
d7f80 6e 20 61 67 61 69 6e 73 74 0d 0a 2a 2a 20 6d 69 n against..** mi
d7f90 73 75 73 65 20 6f 66 20 74 68 65 20 69 6e 74 65 suse of the inte
d7fa0 72 66 61 63 65 20 73 75 63 68 20 61 73 20 70 61 rface such as pa
d7fb0 73 73 69 6e 67 20 69 6e 20 64 62 20 70 6f 69 6e ssing in db poin
d7fc0 74 65 72 73 20 74 68 61 74 20 61 72 65 0d 0a 2a ters that are..*
d7fd0 2a 20 4e 55 4c 4c 20 6f 72 20 77 68 69 63 68 20 * NULL or which
d7fe0 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f have been previo
d7ff0 75 73 6c 79 20 63 6c 6f 73 65 64 2e 20 20 49 66 usly closed. If
d8000 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 this routine re
d8010 74 75 72 6e 73 0d 0a 2a 2a 20 31 20 69 74 20 6d turns..** 1 it m
d8020 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 62 eans that the db
d8030 20 70 6f 69 6e 74 65 72 20 69 73 20 76 61 6c 69 pointer is vali
d8040 64 20 61 6e 64 20 30 20 69 66 20 69 74 20 73 68 d and 0 if it sh
d8050 6f 75 6c 64 20 6e 6f 74 20 62 65 0d 0a 2a 2a 20 ould not be..**
d8060 64 65 72 65 66 65 72 65 6e 63 65 64 20 66 6f 72 dereferenced for
d8070 20 61 6e 79 20 72 65 61 73 6f 6e 2e 20 20 54 68 any reason. Th
d8080 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 e calling functi
d8090 6f 6e 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 on should invoke
d80a0 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 ..** SQLITE_MISU
d80b0 53 45 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d SE immediately..
d80c0 0a 2a 2a 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 53 .**..** sqlite3S
d80d0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 29 20 72 afetyCheckOk() r
d80e0 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 equires that the
d80f0 20 64 62 20 70 6f 69 6e 74 65 72 20 62 65 20 76 db pointer be v
d8100 61 6c 69 64 20 66 6f 72 0d 0a 2a 2a 20 75 73 65 alid for..** use
d8110 2e 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 . sqlite3Safety
d8120 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 29 20 CheckSickOrOk()
d8130 61 6c 6c 6f 77 73 20 61 20 64 62 20 70 6f 69 6e allows a db poin
d8140 74 65 72 20 74 68 61 74 20 66 61 69 6c 65 64 20 ter that failed
d8150 74 6f 0d 0a 2a 2a 20 6f 70 65 6e 20 70 72 6f 70 to..** open prop
d8160 65 72 6c 79 20 61 6e 64 20 69 73 20 6e 6f 74 20 erly and is not
d8170 66 69 74 20 66 6f 72 20 67 65 6e 65 72 61 6c 20 fit for general
d8180 75 73 65 20 62 75 74 20 77 68 69 63 68 20 63 61 use but which ca
d8190 6e 20 62 65 0d 0a 2a 2a 20 75 73 65 64 20 61 73 n be..** used as
d81a0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 an argument to
d81b0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 sqlite3_errmsg()
d81c0 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 or sqlite3_clos
d81d0 65 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 e()...*/..SQLITE
d81e0 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
d81f0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f ite3SafetyCheckO
d8200 6b 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0d k(sqlite3 *db){.
d8210 0a 20 20 75 33 32 20 6d 61 67 69 63 3b 0d 0a 20 . u32 magic;..
d8220 20 69 66 28 20 64 62 3d 3d 30 20 29 7b 0d 0a 20 if( db==0 ){..
d8230 20 20 20 6c 6f 67 42 61 64 43 6f 6e 6e 65 63 74 logBadConnect
d8240 69 6f 6e 28 22 4e 55 4c 4c 22 29 3b 0d 0a 20 20 ion("NULL");..
d8250 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d return 0;.. }
d8260 0d 0a 20 20 6d 61 67 69 63 20 3d 20 64 62 2d 3e .. magic = db->
d8270 6d 61 67 69 63 3b 0d 0a 20 20 69 66 28 20 6d 61 magic;.. if( ma
d8280 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 gic!=SQLITE_MAGI
d8290 43 5f 4f 50 45 4e 20 29 7b 0d 0a 20 20 20 20 69 C_OPEN ){.. i
d82a0 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 f( sqlite3Safety
d82b0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 CheckSickOrOk(db
d82c0 29 20 29 7b 0d 0a 20 20 20 20 20 20 74 65 73 74 ) ){.. test
d82d0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f case( sqlite3Glo
d82e0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d balConfig.xLog!=
d82f0 30 20 29 3b 0d 0a 20 20 20 20 20 20 6c 6f 67 42 0 );.. logB
d8300 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 22 75 6e adConnection("un
d8310 6f 70 65 6e 65 64 22 29 3b 0d 0a 20 20 20 20 7d opened");.. }
d8320 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d .. return 0;.
d8330 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 . }else{.. r
d8340 65 74 75 72 6e 20 31 3b 0d 0a 20 20 7d 0d 0a 7d eturn 1;.. }..}
d8350 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
d8360 20 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 int sqlite3Safe
d8370 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 tyCheckSickOrOk(
d8380 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0d 0a 20 sqlite3 *db){..
d8390 20 75 33 32 20 6d 61 67 69 63 3b 0d 0a 20 20 6d u32 magic;.. m
d83a0 61 67 69 63 20 3d 20 64 62 2d 3e 6d 61 67 69 63 agic = db->magic
d83b0 3b 0d 0a 20 20 69 66 28 20 6d 61 67 69 63 21 3d ;.. if( magic!=
d83c0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 SQLITE_MAGIC_SIC
d83d0 4b 20 26 26 0d 0a 20 20 20 20 20 20 6d 61 67 69 K &&.. magi
d83e0 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f c!=SQLITE_MAGIC_
d83f0 4f 50 45 4e 20 26 26 0d 0a 20 20 20 20 20 20 6d OPEN &&.. m
d8400 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 agic!=SQLITE_MAG
d8410 49 43 5f 42 55 53 59 20 29 7b 0d 0a 20 20 20 20 IC_BUSY ){..
d8420 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 testcase( sqlite
d8430 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 3GlobalConfig.xL
d8440 6f 67 21 3d 30 20 29 3b 0d 0a 20 20 20 20 6c 6f og!=0 );.. lo
d8450 67 42 61 64 43 6f 6e 6e 65 63 74 69 6f 6e 28 22 gBadConnection("
d8460 69 6e 76 61 6c 69 64 22 29 3b 0d 0a 20 20 20 20 invalid");..
d8470 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 65 6c return 0;.. }el
d8480 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 se{.. return
d8490 31 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 1;.. }..}..../*
d84a0 0d 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 ..** Attempt to
d84b0 61 64 64 2c 20 73 75 62 73 74 72 61 63 74 2c 20 add, substract,
d84c0 6f 72 20 6d 75 6c 74 69 70 6c 79 20 74 68 65 20 or multiply the
d84d0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 76 61 64-bit signed va
d84e0 6c 75 65 20 69 42 20 61 67 61 69 6e 73 74 0d 0a lue iB against..
d84f0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 36 34 2d ** the other 64-
d8500 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 bit signed integ
d8510 65 72 20 61 74 20 2a 70 41 20 61 6e 64 20 73 74 er at *pA and st
d8520 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 ore the result i
d8530 6e 20 2a 70 41 2e 0d 0a 2a 2a 20 52 65 74 75 72 n *pA...** Retur
d8540 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 n 0 on success.
d8550 20 4f 72 20 69 66 20 74 68 65 20 6f 70 65 72 61 Or if the opera
d8560 74 69 6f 6e 20 77 6f 75 6c 64 20 68 61 76 65 20 tion would have
d8570 72 65 73 75 6c 74 65 64 20 69 6e 20 61 6e 0d 0a resulted in an..
d8580 2a 2a 20 6f 76 65 72 66 6c 6f 77 2c 20 6c 65 61 ** overflow, lea
d8590 76 65 20 2a 70 41 20 75 6e 63 68 61 6e 67 65 64 ve *pA unchanged
d85a0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0d 0a and return 1...
d85b0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
d85c0 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 41 64 TE int sqlite3Ad
d85d0 64 49 6e 74 36 34 28 69 36 34 20 2a 70 41 2c 20 dInt64(i64 *pA,
d85e0 69 36 34 20 69 42 29 7b 0d 0a 20 20 69 36 34 20 i64 iB){.. i64
d85f0 69 41 20 3d 20 2a 70 41 3b 0d 0a 20 20 74 65 73 iA = *pA;.. tes
d8600 74 63 61 73 65 28 20 69 41 3d 3d 30 20 29 3b 20 tcase( iA==0 );
d8610 74 65 73 74 63 61 73 65 28 20 69 41 3d 3d 31 20 testcase( iA==1
d8620 29 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 );.. testcase(
d8630 69 42 3d 3d 2d 31 20 29 3b 20 74 65 73 74 63 61 iB==-1 ); testca
d8640 73 65 28 20 69 42 3d 3d 30 20 29 3b 0d 0a 20 20 se( iB==0 );..
d8650 69 66 28 20 69 42 3e 3d 30 20 29 7b 0d 0a 20 20 if( iB>=0 ){..
d8660 20 20 74 65 73 74 63 61 73 65 28 20 69 41 3e 30 testcase( iA>0
d8670 20 26 26 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 && LARGEST_INT6
d8680 34 20 2d 20 69 41 20 3d 3d 20 69 42 20 29 3b 0d 4 - iA == iB );.
d8690 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 . testcase( i
d86a0 41 3e 30 20 26 26 20 4c 41 52 47 45 53 54 5f 49 A>0 && LARGEST_I
d86b0 4e 54 36 34 20 2d 20 69 41 20 3d 3d 20 69 42 20 NT64 - iA == iB
d86c0 2d 20 31 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 - 1 );.. if(
d86d0 69 41 3e 30 20 26 26 20 4c 41 52 47 45 53 54 5f iA>0 && LARGEST_
d86e0 49 4e 54 36 34 20 2d 20 69 41 20 3c 20 69 42 20 INT64 - iA < iB
d86f0 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 ) return 1;..
d8700 20 2a 70 41 20 2b 3d 20 69 42 3b 0d 0a 20 20 7d *pA += iB;.. }
d8710 65 6c 73 65 7b 0d 0a 20 20 20 20 74 65 73 74 63 else{.. testc
d8720 61 73 65 28 20 69 41 3c 30 20 26 26 20 2d 28 69 ase( iA<0 && -(i
d8730 41 20 2b 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 A + LARGEST_INT6
d8740 34 29 20 3d 3d 20 69 42 20 2b 20 31 20 29 3b 0d 4) == iB + 1 );.
d8750 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 . testcase( i
d8760 41 3c 30 20 26 26 20 2d 28 69 41 20 2b 20 4c 41 A<0 && -(iA + LA
d8770 52 47 45 53 54 5f 49 4e 54 36 34 29 20 3d 3d 20 RGEST_INT64) ==
d8780 69 42 20 2b 20 32 20 29 3b 0d 0a 20 20 20 20 69 iB + 2 );.. i
d8790 66 28 20 69 41 3c 30 20 26 26 20 2d 28 69 41 20 f( iA<0 && -(iA
d87a0 2b 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29 + LARGEST_INT64)
d87b0 20 3e 20 69 42 20 2b 20 31 20 29 20 72 65 74 75 > iB + 1 ) retu
d87c0 72 6e 20 31 3b 0d 0a 20 20 20 20 2a 70 41 20 2b rn 1;.. *pA +
d87d0 3d 20 69 42 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 = iB;.. }.. re
d87e0 74 75 72 6e 20 30 3b 20 0d 0a 7d 0d 0a 53 51 4c turn 0; ..}..SQL
d87f0 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
d8800 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 sqlite3SubInt64(
d8810 69 36 34 20 2a 70 41 2c 20 69 36 34 20 69 42 29 i64 *pA, i64 iB)
d8820 7b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 {.. testcase( i
d8830 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 B==SMALLEST_INT6
d8840 34 2b 31 20 29 3b 0d 0a 20 20 69 66 28 20 69 42 4+1 );.. if( iB
d8850 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 ==SMALLEST_INT64
d8860 20 29 7b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 ){.. testcas
d8870 65 28 20 28 2a 70 41 29 3d 3d 28 2d 31 29 20 29 e( (*pA)==(-1) )
d8880 3b 20 74 65 73 74 63 61 73 65 28 20 28 2a 70 41 ; testcase( (*pA
d8890 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 69 66 28 )==0 );.. if(
d88a0 20 28 2a 70 41 29 3e 3d 30 20 29 20 72 65 74 75 (*pA)>=0 ) retu
d88b0 72 6e 20 31 3b 0d 0a 20 20 20 20 2a 70 41 20 2d rn 1;.. *pA -
d88c0 3d 20 69 42 3b 0d 0a 20 20 20 20 72 65 74 75 72 = iB;.. retur
d88d0 6e 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a n 0;.. }else{..
d88e0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 return sqlit
d88f0 65 33 41 64 64 49 6e 74 36 34 28 70 41 2c 20 2d e3AddInt64(pA, -
d8900 69 42 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 64 iB);.. }..}..#d
d8910 65 66 69 6e 65 20 54 57 4f 50 4f 57 45 52 33 32 efine TWOPOWER32
d8920 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 0d (((i64)1)<<32).
d8930 0a 23 64 65 66 69 6e 65 20 54 57 4f 50 4f 57 45 .#define TWOPOWE
d8940 52 33 31 20 28 28 28 69 36 34 29 31 29 3c 3c 33 R31 (((i64)1)<<3
d8950 31 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 1)..SQLITE_PRIVA
d8960 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 75 TE int sqlite3Mu
d8970 6c 49 6e 74 36 34 28 69 36 34 20 2a 70 41 2c 20 lInt64(i64 *pA,
d8980 69 36 34 20 69 42 29 7b 0d 0a 20 20 69 36 34 20 i64 iB){.. i64
d8990 69 41 20 3d 20 2a 70 41 3b 0d 0a 20 20 69 36 34 iA = *pA;.. i64
d89a0 20 69 41 31 2c 20 69 41 30 2c 20 69 42 31 2c 20 iA1, iA0, iB1,
d89b0 69 42 30 2c 20 72 3b 0d 0a 0d 0a 20 20 69 41 31 iB0, r;.... iA1
d89c0 20 3d 20 69 41 2f 54 57 4f 50 4f 57 45 52 33 32 = iA/TWOPOWER32
d89d0 3b 0d 0a 20 20 69 41 30 20 3d 20 69 41 20 25 20 ;.. iA0 = iA %
d89e0 54 57 4f 50 4f 57 45 52 33 32 3b 0d 0a 20 20 69 TWOPOWER32;.. i
d89f0 42 31 20 3d 20 69 42 2f 54 57 4f 50 4f 57 45 52 B1 = iB/TWOPOWER
d8a00 33 32 3b 0d 0a 20 20 69 42 30 20 3d 20 69 42 20 32;.. iB0 = iB
d8a10 25 20 54 57 4f 50 4f 57 45 52 33 32 3b 0d 0a 20 % TWOPOWER32;..
d8a20 20 69 66 28 20 69 41 31 2a 69 42 31 20 21 3d 20 if( iA1*iB1 !=
d8a30 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 0 ) return 1;..
d8a40 20 61 73 73 65 72 74 28 20 69 41 31 2a 69 42 30 assert( iA1*iB0
d8a50 3d 3d 30 20 7c 7c 20 69 41 30 2a 69 42 31 3d 3d ==0 || iA0*iB1==
d8a60 30 20 29 3b 0d 0a 20 20 72 20 3d 20 69 41 31 2a 0 );.. r = iA1*
d8a70 69 42 30 20 2b 20 69 41 30 2a 69 42 31 3b 0d 0a iB0 + iA0*iB1;..
d8a80 20 20 74 65 73 74 63 61 73 65 28 20 72 3d 3d 28 testcase( r==(
d8a90 2d 54 57 4f 50 4f 57 45 52 33 31 29 2d 31 20 29 -TWOPOWER31)-1 )
d8aa0 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 ;.. testcase( r
d8ab0 3d 3d 28 2d 54 57 4f 50 4f 57 45 52 33 31 29 20 ==(-TWOPOWER31)
d8ac0 29 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 );.. testcase(
d8ad0 72 3d 3d 54 57 4f 50 4f 57 45 52 33 31 20 29 3b r==TWOPOWER31 );
d8ae0 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 3d .. testcase( r=
d8af0 3d 54 57 4f 50 4f 57 45 52 33 31 2d 31 20 29 3b =TWOPOWER31-1 );
d8b00 0d 0a 20 20 69 66 28 20 72 3c 28 2d 54 57 4f 50 .. if( r<(-TWOP
d8b10 4f 57 45 52 33 31 29 20 7c 7c 20 72 3e 3d 54 57 OWER31) || r>=TW
d8b20 4f 50 4f 57 45 52 33 31 20 29 20 72 65 74 75 72 OPOWER31 ) retur
d8b30 6e 20 31 3b 0d 0a 20 20 72 20 2a 3d 20 54 57 4f n 1;.. r *= TWO
d8b40 50 4f 57 45 52 33 32 3b 0d 0a 20 20 69 66 28 20 POWER32;.. if(
d8b50 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 sqlite3AddInt64(
d8b60 26 72 2c 20 69 41 30 2a 69 42 30 29 20 29 20 72 &r, iA0*iB0) ) r
d8b70 65 74 75 72 6e 20 31 3b 0d 0a 20 20 2a 70 41 20 eturn 1;.. *pA
d8b80 3d 20 72 3b 0d 0a 20 20 72 65 74 75 72 6e 20 30 = r;.. return 0
d8b90 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
d8ba0 6f 6d 70 75 74 65 20 74 68 65 20 61 62 73 6f 6c ompute the absol
d8bb0 75 74 65 20 76 61 6c 75 65 20 6f 66 20 61 20 33 ute value of a 3
d8bc0 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 2-bit signed int
d8bd0 65 67 65 72 2c 20 6f 66 20 70 6f 73 73 69 62 6c eger, of possibl
d8be0 65 2e 20 20 4f 72 20 0d 0a 2a 2a 20 69 66 20 74 e. Or ..** if t
d8bf0 68 65 20 69 6e 74 65 67 65 72 20 68 61 73 20 61 he integer has a
d8c00 20 76 61 6c 75 65 20 6f 66 20 2d 32 31 34 37 34 value of -21474
d8c10 38 33 36 34 38 2c 20 72 65 74 75 72 6e 20 2b 32 83648, return +2
d8c20 31 34 37 34 38 33 36 34 37 0d 0a 2a 2f 0d 0a 53 147483647..*/..S
d8c30 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
d8c40 74 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 t sqlite3AbsInt3
d8c50 32 28 69 6e 74 20 78 29 7b 0d 0a 20 20 69 66 28 2(int x){.. if(
d8c60 20 78 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 78 x>=0 ) return x
d8c70 3b 0d 0a 20 20 69 66 28 20 78 3d 3d 28 69 6e 74 ;.. if( x==(int
d8c80 29 30 78 38 30 30 30 30 30 30 30 20 29 20 72 65 )0x80000000 ) re
d8c90 74 75 72 6e 20 30 78 37 66 66 66 66 66 66 66 3b turn 0x7fffffff;
d8ca0 0d 0a 20 20 72 65 74 75 72 6e 20 2d 78 3b 0d 0a .. return -x;..
d8cb0 7d 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 }....#ifdef SQLI
d8cc0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 TE_ENABLE_8_3_NA
d8cd0 4d 45 53 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 53 MES../*..** If S
d8ce0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 QLITE_ENABLE_8_3
d8cf0 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61 74 _NAMES is set at
d8d00 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e compile-time an
d8d10 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 d if the databas
d8d20 65 0d 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 e..** filename i
d8d30 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 n zBaseFilename
d8d40 69 73 20 61 20 55 52 49 20 77 69 74 68 20 74 68 is a URI with th
d8d50 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20 e "8_3_names=1"
d8d60 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0d 0a 2a parameter and..*
d8d70 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e * if filename in
d8d80 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66 69 z[] has a suffi
d8d90 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e x (a.k.a. "exten
d8da0 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20 6c sion") that is l
d8db0 6f 6e 67 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 74 onger than..** t
d8dc0 68 72 65 65 20 63 68 61 72 61 63 74 65 72 73 2c hree characters,
d8dd0 20 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68 then shorten th
d8de0 65 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 e suffix on z[]
d8df0 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74 to be the last t
d8e00 68 72 65 65 0d 0a 2a 2a 20 63 68 61 72 61 63 74 hree..** charact
d8e10 65 72 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69 ers of the origi
d8e20 6e 61 6c 20 73 75 66 66 69 78 2e 0d 0a 2a 2a 0d nal suffix...**.
d8e30 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e .** If SQLITE_EN
d8e40 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 ABLE_8_3_NAMES i
d8e50 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63 6f s set to 2 at co
d8e60 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e mpile-time, then
d8e70 20 61 6c 77 61 79 73 0d 0a 2a 2a 20 64 6f 20 74 always..** do t
d8e80 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65 he suffix shorte
d8e90 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 ning regardless
d8ea0 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 of URI parameter
d8eb0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 61 6d 70 6c ...**..** Exampl
d8ec0 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 es:..**..**
d8ed0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 test.db-journal
d8ee0 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c => test.nal
d8ef0 0d 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 ..** test.db
d8f00 2d 77 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 -wal =>
d8f10 20 74 65 73 74 2e 77 61 6c 0d 0a 2a 2a 20 20 20 test.wal..**
d8f20 20 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 test.db-shm
d8f30 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 => test.s
d8f40 68 6d 0d 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e hm..** test.
d8f50 64 62 2d 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e db-mj7f3319fa =>
d8f60 20 20 20 74 65 73 74 2e 39 66 61 0d 0a 2a 2f 0d test.9fa..*/.
d8f70 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
d8f80 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6c 65 void sqlite3File
d8f90 53 75 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68 Suffix3(const ch
d8fa0 61 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d ar *zBaseFilenam
d8fb0 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0d 0a 23 69 e, char *z){..#i
d8fc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
d8fd0 38 5f 33 5f 4e 41 4d 45 53 3c 32 0d 0a 20 20 69 8_3_NAMES<2.. i
d8fe0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 f( sqlite3_uri_b
d8ff0 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 46 69 6c 65 oolean(zBaseFile
d9000 6e 61 6d 65 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 name, "8_3_names
d9010 22 2c 20 30 29 20 29 0d 0a 23 65 6e 64 69 66 0d ", 0) )..#endif.
d9020 0a 20 20 7b 0d 0a 20 20 20 20 69 6e 74 20 69 2c . {.. int i,
d9030 20 73 7a 3b 0d 0a 20 20 20 20 73 7a 20 3d 20 73 sz;.. sz = s
d9040 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
d9050 29 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a );.. for(i=sz
d9060 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21 -1; i>0 && z[i]!
d9070 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e ='/' && z[i]!='.
d9080 27 3b 20 69 2d 2d 29 7b 7d 0d 0a 20 20 20 20 69 '; i--){}.. i
d9090 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 f( z[i]=='.' &&
d90a0 41 4c 57 41 59 53 28 73 7a 3e 69 2b 34 29 20 29 ALWAYS(sz>i+4) )
d90b0 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d memmove(&z[i+1]
d90c0 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0d , &z[sz-3], 4);.
d90d0 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d . }..}..#endif.
d90e0 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
d90f0 2a 2a 20 45 6e 64 20 6f 66 20 75 74 69 6c 2e 63 ** End of util.c
d9100 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
d9110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d9120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d9130 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */../***********
d9140 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 68 *** Begin file h
d9150 61 73 68 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ash.c **********
d9160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d9170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d9180 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 31 **/../*..** 2001
d9190 20 53 65 70 74 65 6d 62 65 72 20 32 32 0d 0a 2a September 22..*
d91a0 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 *..** The author
d91b0 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 disclaims copyr
d91c0 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 ight to this sou
d91d0 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c rce code. In pl
d91e0 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 ace of..** a leg
d91f0 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
d9200 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a is a blessing:..
d9210 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f **..** May yo
d9220 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f u do good and no
d9230 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d t evil...** M
d9240 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 ay you find forg
d9250 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 iveness for your
d9260 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 self and forgive
d9270 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 others...**
d9280 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 May you share fr
d9290 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 eely, never taki
d92a0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 ng more than you
d92b0 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a give...**..****
d92c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d92d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d92e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d92f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d9300 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 *****..** This i
d9310 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 s the implementa
d9320 74 69 6f 6e 20 6f 66 20 67 65 6e 65 72 69 63 20 tion of generic
d9330 68 61 73 68 2d 74 61 62 6c 65 73 0d 0a 2a 2a 20 hash-tables..**
d9340 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65 2e 0d used in SQLite..
d9350 0a 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 .*/../* #include
d9360 20 3c 61 73 73 65 72 74 2e 68 3e 20 2a 2f 0d 0a <assert.h> */..
d9370 0d 0a 2f 2a 20 54 75 72 6e 20 62 75 6c 6b 20 6d ../* Turn bulk m
d9380 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 68 61 73 emory into a has
d9390 68 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 62 h table object b
d93a0 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 y initializing t
d93b0 68 65 0d 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 he..** fields of
d93c0 20 74 68 65 20 48 61 73 68 20 73 74 72 75 63 74 the Hash struct
d93d0 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 22 70 4e ure...**..** "pN
d93e0 65 77 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 ew" is a pointer
d93f0 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 to the hash tab
d9400 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 le that is to be
d9410 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0d 0a 2a initialized...*
d9420 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
d9430 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 E void sqlite3Ha
d9440 73 68 49 6e 69 74 28 48 61 73 68 20 2a 70 4e 65 shInit(Hash *pNe
d9450 77 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 w){.. assert( p
d9460 4e 65 77 21 3d 30 20 29 3b 0d 0a 20 20 70 4e 65 New!=0 );.. pNe
d9470 77 2d 3e 66 69 72 73 74 20 3d 20 30 3b 0d 0a 20 w->first = 0;..
d9480 20 70 4e 65 77 2d 3e 63 6f 75 6e 74 20 3d 20 30 pNew->count = 0
d9490 3b 0d 0a 20 20 70 4e 65 77 2d 3e 68 74 73 69 7a ;.. pNew->htsiz
d94a0 65 20 3d 20 30 3b 0d 0a 20 20 70 4e 65 77 2d 3e e = 0;.. pNew->
d94b0 68 74 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ht = 0;..}..../*
d94c0 20 52 65 6d 6f 76 65 20 61 6c 6c 20 65 6e 74 72 Remove all entr
d94d0 69 65 73 20 66 72 6f 6d 20 61 20 68 61 73 68 20 ies from a hash
d94e0 74 61 62 6c 65 2e 20 20 52 65 63 6c 61 69 6d 20 table. Reclaim
d94f0 61 6c 6c 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a 20 all memory...**
d9500 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e Call this routin
d9510 65 20 74 6f 20 64 65 6c 65 74 65 20 61 20 68 61 e to delete a ha
d9520 73 68 20 74 61 62 6c 65 20 6f 72 20 74 6f 20 72 sh table or to r
d9530 65 73 65 74 20 61 20 68 61 73 68 20 74 61 62 6c eset a hash tabl
d9540 65 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6d 70 e..** to the emp
d9550 74 79 20 73 74 61 74 65 2e 0d 0a 2a 2f 0d 0a 53 ty state...*/..S
d9560 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
d9570 69 64 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c id sqlite3HashCl
d9580 65 61 72 28 48 61 73 68 20 2a 70 48 29 7b 0d 0a ear(Hash *pH){..
d9590 20 20 48 61 73 68 45 6c 65 6d 20 2a 65 6c 65 6d HashElem *elem
d95a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 ; /* For
d95b0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c looping over al
d95c0 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 l elements of th
d95d0 65 20 74 61 62 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 e table */....
d95e0 61 73 73 65 72 74 28 20 70 48 21 3d 30 20 29 3b assert( pH!=0 );
d95f0 0d 0a 20 20 65 6c 65 6d 20 3d 20 70 48 2d 3e 66 .. elem = pH->f
d9600 69 72 73 74 3b 0d 0a 20 20 70 48 2d 3e 66 69 72 irst;.. pH->fir
d9610 73 74 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74 st = 0;.. sqlit
d9620 65 33 5f 66 72 65 65 28 70 48 2d 3e 68 74 29 3b e3_free(pH->ht);
d9630 0d 0a 20 20 70 48 2d 3e 68 74 20 3d 20 30 3b 0d .. pH->ht = 0;.
d9640 0a 20 20 70 48 2d 3e 68 74 73 69 7a 65 20 3d 20 . pH->htsize =
d9650 30 3b 0d 0a 20 20 77 68 69 6c 65 28 20 65 6c 65 0;.. while( ele
d9660 6d 20 29 7b 0d 0a 20 20 20 20 48 61 73 68 45 6c m ){.. HashEl
d9670 65 6d 20 2a 6e 65 78 74 5f 65 6c 65 6d 20 3d 20 em *next_elem =
d9680 65 6c 65 6d 2d 3e 6e 65 78 74 3b 0d 0a 20 20 20 elem->next;..
d9690 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 65 6c sqlite3_free(el
d96a0 65 6d 29 3b 0d 0a 20 20 20 20 65 6c 65 6d 20 3d em);.. elem =
d96b0 20 6e 65 78 74 5f 65 6c 65 6d 3b 0d 0a 20 20 7d next_elem;.. }
d96c0 0d 0a 20 20 70 48 2d 3e 63 6f 75 6e 74 20 3d 20 .. pH->count =
d96d0 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0;..}..../*..**
d96e0 54 68 65 20 68 61 73 68 69 6e 67 20 66 75 6e 63 The hashing func
d96f0 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 tion...*/..stati
d9700 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 c unsigned int s
d9710 74 72 48 61 73 68 28 63 6f 6e 73 74 20 63 68 61 trHash(const cha
d9720 72 20 2a 7a 2c 20 69 6e 74 20 6e 4b 65 79 29 7b r *z, int nKey){
d9730 0d 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0d 0a .. int h = 0;..
d9740 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d assert( nKey>=
d9750 30 20 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 6e 0 );.. while( n
d9760 4b 65 79 20 3e 20 30 20 20 29 7b 0d 0a 09 20 20 Key > 0 ){...
d9770 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0d 0a const char *p;..
d9780 09 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 .unsigned short
d9790 73 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 s = sqlite3Utf8R
d97a0 65 61 64 28 7a 2c 20 26 70 29 3b 0d 0a 20 20 20 ead(z, &p);..
d97b0 20 6e 4b 65 79 2d 3d 70 2d 7a 3b 0d 0a 09 7a 20 nKey-=p-z;...z
d97c0 3d 20 70 3b 0d 0a 09 68 20 3d 20 28 68 3c 3c 33 = p;...h = (h<<3
d97d0 29 20 5e 20 68 20 5e 20 6f 61 73 55 70 70 65 72 ) ^ h ^ oasUpper
d97e0 32 4c 6f 77 65 72 5b 73 5d 3b 0d 0a 09 20 20 2f 2Lower[s];... /
d97f0 2f 68 20 3d 20 28 68 3c 3c 33 29 20 5e 20 68 20 /h = (h<<3) ^ h
d9800 5e 20 2a 7a 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 ^ *z++;.. }..
d9810 72 65 74 75 72 6e 20 68 20 26 20 30 78 37 66 66 return h & 0x7ff
d9820 66 66 66 66 66 3b 0d 0a 7d 0d 0a 2f 2a 0d 0a 73 fffff;..}../*..s
d9830 74 61 74 69 63 20 69 6e 74 20 73 74 72 48 61 73 tatic int strHas
d9840 68 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b h(const void *pK
d9850 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 7b 0d 0a ey, int nKey){..
d9860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 const char *z
d9870 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 = (const char *)
d9880 70 4b 65 79 3b 0d 0a 20 20 69 6e 74 20 68 20 3d pKey;.. int h =
d9890 20 30 3b 0d 0a 20 20 69 66 28 20 6e 4b 65 79 3c 0;.. if( nKey<
d98a0 3d 30 20 29 20 6e 4b 65 79 20 3d 20 73 74 72 6c =0 ) nKey = strl
d98b0 65 6e 28 7a 29 3b 0d 0a 20 20 77 68 69 6c 65 28 en(z);.. while(
d98c0 20 6e 4b 65 79 20 3e 20 30 20 20 29 7b 0d 0a 20 nKey > 0 ){..
d98d0 20 20 20 68 20 3d 20 28 68 3c 3c 33 29 20 5e 20 h = (h<<3) ^
d98e0 68 20 5e 20 73 71 6c 69 74 65 33 55 70 70 65 72 h ^ sqlite3Upper
d98f0 54 6f 4c 6f 77 65 72 5b 28 75 6e 73 69 67 6e 65 ToLower[(unsigne
d9900 64 20 63 68 61 72 29 2a 7a 2b 2b 5d 3b 0d 0a 20 d char)*z++];..
d9910 20 20 20 6e 4b 65 79 2d 2d 3b 0d 0a 20 20 7d 0d nKey--;.. }.
d9920 0a 20 20 72 65 74 75 72 6e 20 68 20 26 20 30 78 . return h & 0x
d9930 37 66 66 66 66 66 66 66 3b 0d 0a 7d 0d 0a 2a 2f 7fffffff;..}..*/
d9940 0d 0a 0d 0a 0d 0a 2f 2a 20 4c 69 6e 6b 20 70 4e ....../* Link pN
d9950 65 77 20 65 6c 65 6d 65 6e 74 20 69 6e 74 6f 20 ew element into
d9960 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 70 the hash table p
d9970 48 2e 20 20 49 66 20 70 45 6e 74 72 79 21 3d 30 H. If pEntry!=0
d9980 20 74 68 65 6e 20 61 6c 73 6f 0d 0a 2a 2a 20 69 then also..** i
d9990 6e 73 65 72 74 20 70 4e 65 77 20 69 6e 74 6f 20 nsert pNew into
d99a0 74 68 65 20 70 45 6e 74 72 79 20 68 61 73 68 20 the pEntry hash
d99b0 62 75 63 6b 65 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 bucket...*/..sta
d99c0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 45 tic void insertE
d99d0 6c 65 6d 65 6e 74 28 0d 0a 20 20 48 61 73 68 20 lement(.. Hash
d99e0 2a 70 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 *pH,
d99f0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 /* The complet
d9a00 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0d e hash table */.
d9a10 0a 20 20 73 74 72 75 63 74 20 5f 68 74 20 2a 70 . struct _ht *p
d9a20 45 6e 74 72 79 2c 20 20 20 20 2f 2a 20 54 68 65 Entry, /* The
d9a30 20 65 6e 74 72 79 20 69 6e 74 6f 20 77 68 69 63 entry into whic
d9a40 68 20 70 4e 65 77 20 69 73 20 69 6e 73 65 72 74 h pNew is insert
d9a50 65 64 20 2a 2f 0d 0a 20 20 48 61 73 68 45 6c 65 ed */.. HashEle
d9a60 6d 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 m *pNew
d9a70 2f 2a 20 54 68 65 20 65 6c 65 6d 65 6e 74 20 74 /* The element t
d9a80 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f o be inserted */
d9a90 0d 0a 29 7b 0d 0a 20 20 48 61 73 68 45 6c 65 6d ..){.. HashElem
d9aa0 20 2a 70 48 65 61 64 3b 20 20 20 20 20 20 20 2f *pHead; /
d9ab0 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 * First element
d9ac0 61 6c 72 65 61 64 79 20 69 6e 20 70 45 6e 74 72 already in pEntr
d9ad0 79 20 2a 2f 0d 0a 20 20 69 66 28 20 70 45 6e 74 y */.. if( pEnt
d9ae0 72 79 20 29 7b 0d 0a 20 20 20 20 70 48 65 61 64 ry ){.. pHead
d9af0 20 3d 20 70 45 6e 74 72 79 2d 3e 63 6f 75 6e 74 = pEntry->count
d9b00 20 3f 20 70 45 6e 74 72 79 2d 3e 63 68 61 69 6e ? pEntry->chain
d9b10 20 3a 20 30 3b 0d 0a 20 20 20 20 70 45 6e 74 72 : 0;.. pEntr
d9b20 79 2d 3e 63 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20 y->count++;..
d9b30 20 70 45 6e 74 72 79 2d 3e 63 68 61 69 6e 20 3d pEntry->chain =
d9b40 20 70 4e 65 77 3b 0d 0a 20 20 7d 65 6c 73 65 7b pNew;.. }else{
d9b50 0d 0a 20 20 20 20 70 48 65 61 64 20 3d 20 30 3b .. pHead = 0;
d9b60 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 48 65 .. }.. if( pHe
d9b70 61 64 20 29 7b 0d 0a 20 20 20 20 70 4e 65 77 2d ad ){.. pNew-
d9b80 3e 6e 65 78 74 20 3d 20 70 48 65 61 64 3b 0d 0a >next = pHead;..
d9b90 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 76 20 3d pNew->prev =
d9ba0 20 70 48 65 61 64 2d 3e 70 72 65 76 3b 0d 0a 20 pHead->prev;..
d9bb0 20 20 20 69 66 28 20 70 48 65 61 64 2d 3e 70 72 if( pHead->pr
d9bc0 65 76 20 29 7b 20 70 48 65 61 64 2d 3e 70 72 65 ev ){ pHead->pre
d9bd0 76 2d 3e 6e 65 78 74 20 3d 20 70 4e 65 77 3b 20 v->next = pNew;
d9be0 7d 0d 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 }.. else
d9bf0 20 20 20 20 20 20 20 20 7b 20 70 48 2d 3e 66 69 { pH->fi
d9c00 72 73 74 20 3d 20 70 4e 65 77 3b 20 7d 0d 0a 20 rst = pNew; }..
d9c10 20 20 20 70 48 65 61 64 2d 3e 70 72 65 76 20 3d pHead->prev =
d9c20 20 70 4e 65 77 3b 0d 0a 20 20 7d 65 6c 73 65 7b pNew;.. }else{
d9c30 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 65 78 74 .. pNew->next
d9c40 20 3d 20 70 48 2d 3e 66 69 72 73 74 3b 0d 0a 20 = pH->first;..
d9c50 20 20 20 69 66 28 20 70 48 2d 3e 66 69 72 73 74 if( pH->first
d9c60 20 29 7b 20 70 48 2d 3e 66 69 72 73 74 2d 3e 70 ){ pH->first->p
d9c70 72 65 76 20 3d 20 70 4e 65 77 3b 20 7d 0d 0a 20 rev = pNew; }..
d9c80 20 20 20 70 4e 65 77 2d 3e 70 72 65 76 20 3d 20 pNew->prev =
d9c90 30 3b 0d 0a 20 20 20 20 70 48 2d 3e 66 69 72 73 0;.. pH->firs
d9ca0 74 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 7d 0d 0a t = pNew;.. }..
d9cb0 7d 0d 0a 0d 0a 0d 0a 2f 2a 20 52 65 73 69 7a 65 }....../* Resize
d9cc0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 the hash table
d9cd0 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 74 61 so that it canta
d9ce0 69 6e 73 20 22 6e 65 77 5f 73 69 7a 65 22 20 62 ins "new_size" b
d9cf0 75 63 6b 65 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 uckets...**..**
d9d00 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6d The hash table m
d9d10 69 67 68 74 20 66 61 69 6c 20 74 6f 20 72 65 73 ight fail to res
d9d20 69 7a 65 20 69 66 20 73 71 6c 69 74 65 33 5f 6d ize if sqlite3_m
d9d30 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 6f 72 alloc() fails or
d9d40 0d 0a 2a 2a 20 69 66 20 74 68 65 20 6e 65 77 20 ..** if the new
d9d50 73 69 7a 65 20 69 73 20 74 68 65 20 73 61 6d 65 size is the same
d9d60 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 73 69 as the prior si
d9d70 7a 65 2e 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 54 ze...** Return T
d9d80 52 55 45 20 69 66 20 74 68 65 20 72 65 73 69 7a RUE if the resiz
d9d90 65 20 6f 63 63 75 72 73 20 61 6e 64 20 66 61 6c e occurs and fal
d9da0 73 65 20 69 66 20 6e 6f 74 2e 0d 0a 2a 2f 0d 0a se if not...*/..
d9db0 73 74 61 74 69 63 20 69 6e 74 20 72 65 68 61 73 static int rehas
d9dc0 68 28 48 61 73 68 20 2a 70 48 2c 20 75 6e 73 69 h(Hash *pH, unsi
d9dd0 67 6e 65 64 20 69 6e 74 20 6e 65 77 5f 73 69 7a gned int new_siz
d9de0 65 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 5f 68 e){.. struct _h
d9df0 74 20 2a 6e 65 77 5f 68 74 3b 20 20 20 20 20 20 t *new_ht;
d9e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 /* The new
d9e10 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0d 0a hash table */..
d9e20 20 20 48 61 73 68 45 6c 65 6d 20 2a 65 6c 65 6d HashElem *elem
d9e30 2c 20 2a 6e 65 78 74 5f 65 6c 65 6d 3b 20 20 20 , *next_elem;
d9e40 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 /* For looping
d9e50 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 65 6c over existing el
d9e60 65 6d 65 6e 74 73 20 2a 2f 0d 0a 0d 0a 23 69 66 ements */....#if
d9e70 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 SQLITE_MALLOC_S
d9e80 4f 46 54 5f 4c 49 4d 49 54 3e 30 0d 0a 20 20 69 OFT_LIMIT>0.. i
d9e90 66 28 20 6e 65 77 5f 73 69 7a 65 2a 73 69 7a 65 f( new_size*size
d9ea0 6f 66 28 73 74 72 75 63 74 20 5f 68 74 29 3e 53 of(struct _ht)>S
d9eb0 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 QLITE_MALLOC_SOF
d9ec0 54 5f 4c 49 4d 49 54 20 29 7b 0d 0a 20 20 20 20 T_LIMIT ){..
d9ed0 6e 65 77 5f 73 69 7a 65 20 3d 20 53 51 4c 49 54 new_size = SQLIT
d9ee0 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 E_MALLOC_SOFT_LI
d9ef0 4d 49 54 2f 73 69 7a 65 6f 66 28 73 74 72 75 63 MIT/sizeof(struc
d9f00 74 20 5f 68 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 t _ht);.. }..
d9f10 69 66 28 20 6e 65 77 5f 73 69 7a 65 3d 3d 70 48 if( new_size==pH
d9f20 2d 3e 68 74 73 69 7a 65 20 29 20 72 65 74 75 72 ->htsize ) retur
d9f30 6e 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a n 0;..#endif....
d9f40 20 20 2f 2a 20 54 68 65 20 69 6e 61 62 69 6c 69 /* The inabili
d9f50 74 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 73 20 ty to allocates
d9f60 73 70 61 63 65 20 66 6f 72 20 61 20 6c 61 72 67 space for a larg
d9f70 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 er hash table is
d9f80 0d 0a 20 20 2a 2a 20 61 20 70 65 72 66 6f 72 6d .. ** a perform
d9f90 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 74 20 ance hit but it
d9fa0 69 73 20 6e 6f 74 20 61 20 66 61 74 61 6c 20 65 is not a fatal e
d9fb0 72 72 6f 72 2e 20 20 53 6f 20 6d 61 72 6b 20 74 rror. So mark t
d9fc0 68 65 0d 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 he.. ** allocat
d9fd0 69 6f 6e 20 61 73 20 61 20 62 65 6e 69 67 6e 2e ion as a benign.
d9fe0 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 .. */.. sqlite
d9ff0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 3BeginBenignMall
da000 6f 63 28 29 3b 0d 0a 20 20 6e 65 77 5f 68 74 20 oc();.. new_ht
da010 3d 20 28 73 74 72 75 63 74 20 5f 68 74 20 2a 29 = (struct _ht *)
da020 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e sqlite3Malloc( n
da030 65 77 5f 73 69 7a 65 2a 73 69 7a 65 6f 66 28 73 ew_size*sizeof(s
da040 74 72 75 63 74 20 5f 68 74 29 20 29 3b 0d 0a 20 truct _ht) );..
da050 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 sqlite3EndBenig
da060 6e 4d 61 6c 6c 6f 63 28 29 3b 0d 0a 0d 0a 20 20 nMalloc();....
da070 69 66 28 20 6e 65 77 5f 68 74 3d 3d 30 20 29 20 if( new_ht==0 )
da080 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 73 71 6c return 0;.. sql
da090 69 74 65 33 5f 66 72 65 65 28 70 48 2d 3e 68 74 ite3_free(pH->ht
da0a0 29 3b 0d 0a 20 20 70 48 2d 3e 68 74 20 3d 20 6e );.. pH->ht = n
da0b0 65 77 5f 68 74 3b 0d 0a 20 20 70 48 2d 3e 68 74 ew_ht;.. pH->ht
da0c0 73 69 7a 65 20 3d 20 6e 65 77 5f 73 69 7a 65 20 size = new_size
da0d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 = sqlite3MallocS
da0e0 69 7a 65 28 6e 65 77 5f 68 74 29 2f 73 69 7a 65 ize(new_ht)/size
da0f0 6f 66 28 73 74 72 75 63 74 20 5f 68 74 29 3b 0d of(struct _ht);.
da100 0a 20 20 6d 65 6d 73 65 74 28 6e 65 77 5f 68 74 . memset(new_ht
da110 2c 20 30 2c 20 6e 65 77 5f 73 69 7a 65 2a 73 69 , 0, new_size*si
da120 7a 65 6f 66 28 73 74 72 75 63 74 20 5f 68 74 29 zeof(struct _ht)
da130 29 3b 0d 0a 20 20 66 6f 72 28 65 6c 65 6d 3d 70 );.. for(elem=p
da140 48 2d 3e 66 69 72 73 74 2c 20 70 48 2d 3e 66 69 H->first, pH->fi
da150 72 73 74 3d 30 3b 20 65 6c 65 6d 3b 20 65 6c 65 rst=0; elem; ele
da160 6d 20 3d 20 6e 65 78 74 5f 65 6c 65 6d 29 7b 0d m = next_elem){.
da170 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
da180 74 20 68 20 3d 20 73 74 72 48 61 73 68 28 65 6c t h = strHash(el
da190 65 6d 2d 3e 70 4b 65 79 2c 20 65 6c 65 6d 2d 3e em->pKey, elem->
da1a0 6e 4b 65 79 29 20 25 20 6e 65 77 5f 73 69 7a 65 nKey) % new_size
da1b0 3b 0d 0a 20 20 20 20 6e 65 78 74 5f 65 6c 65 6d ;.. next_elem
da1c0 20 3d 20 65 6c 65 6d 2d 3e 6e 65 78 74 3b 0d 0a = elem->next;..
da1d0 20 20 20 20 69 6e 73 65 72 74 45 6c 65 6d 65 6e insertElemen
da1e0 74 28 70 48 2c 20 26 6e 65 77 5f 68 74 5b 68 5d t(pH, &new_ht[h]
da1f0 2c 20 65 6c 65 6d 29 3b 0d 0a 20 20 7d 0d 0a 20 , elem);.. }..
da200 20 72 65 74 75 72 6e 20 31 3b 0d 0a 7d 0d 0a 0d return 1;..}...
da210 0a 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f ./* This functio
da220 6e 20 28 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 n (for internal
da230 75 73 65 20 6f 6e 6c 79 29 20 6c 6f 63 61 74 65 use only) locate
da240 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 69 6e 20 s an element in
da250 61 6e 0d 0a 2a 2a 20 68 61 73 68 20 74 61 62 6c an..** hash tabl
da260 65 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 e that matches t
da270 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 54 he given key. T
da280 68 65 20 68 61 73 68 20 66 6f 72 20 74 68 69 73 he hash for this
da290 20 6b 65 79 20 68 61 73 0d 0a 2a 2a 20 61 6c 72 key has..** alr
da2a0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 eady been comput
da2b0 65 64 20 61 6e 64 20 69 73 20 70 61 73 73 65 64 ed and is passed
da2c0 20 61 73 20 74 68 65 20 34 74 68 20 70 61 72 61 as the 4th para
da2d0 6d 65 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 meter...*/..stat
da2e0 69 63 20 48 61 73 68 45 6c 65 6d 20 2a 66 69 6e ic HashElem *fin
da2f0 64 45 6c 65 6d 65 6e 74 47 69 76 65 6e 48 61 73 dElementGivenHas
da300 68 28 0d 0a 20 20 63 6f 6e 73 74 20 48 61 73 68 h(.. const Hash
da310 20 2a 70 48 2c 20 20 20 20 20 2f 2a 20 54 68 65 *pH, /* The
da320 20 70 48 20 74 6f 20 62 65 20 73 65 61 72 63 68 pH to be search
da330 65 64 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 ed */.. const c
da340 68 61 72 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 har *pKey, /*
da350 54 68 65 20 6b 65 79 20 77 65 20 61 72 65 20 73 The key we are s
da360 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0d earching for */.
da370 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 . int nKey,
da380 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
da390 69 6e 20 6b 65 79 20 28 6e 6f 74 20 63 6f 75 6e in key (not coun
da3a0 74 69 6e 67 20 7a 65 72 6f 20 74 65 72 6d 69 6e ting zero termin
da3b0 61 74 6f 72 29 20 2a 2f 0d 0a 20 20 75 6e 73 69 ator) */.. unsi
da3c0 67 6e 65 64 20 69 6e 74 20 68 20 20 20 20 20 20 gned int h
da3d0 2f 2a 20 54 68 65 20 68 61 73 68 20 66 6f 72 20 /* The hash for
da3e0 74 68 69 73 20 6b 65 79 2e 20 2a 2f 0d 0a 29 7b this key. */..){
da3f0 0d 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 65 6c .. HashElem *el
da400 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 em;
da410 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6c 6f /* Used to lo
da420 6f 70 20 74 68 72 75 20 74 68 65 20 65 6c 65 6d op thru the elem
da430 65 6e 74 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 ent list */.. i
da440 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 nt count;
da450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
da460 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 Number of eleme
da470 6e 74 73 20 6c 65 66 74 20 74 6f 20 74 65 73 74 nts left to test
da480 20 2a 2f 0d 0a 0d 0a 20 20 69 66 28 20 70 48 2d */.... if( pH-
da490 3e 68 74 20 29 7b 0d 0a 20 20 20 20 73 74 72 75 >ht ){.. stru
da4a0 63 74 20 5f 68 74 20 2a 70 45 6e 74 72 79 20 3d ct _ht *pEntry =
da4b0 20 26 70 48 2d 3e 68 74 5b 68 5d 3b 0d 0a 20 20 &pH->ht[h];..
da4c0 20 20 65 6c 65 6d 20 3d 20 70 45 6e 74 72 79 2d elem = pEntry-
da4d0 3e 63 68 61 69 6e 3b 0d 0a 20 20 20 20 63 6f 75 >chain;.. cou
da4e0 6e 74 20 3d 20 70 45 6e 74 72 79 2d 3e 63 6f 75 nt = pEntry->cou
da4f0 6e 74 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 nt;.. }else{..
da500 20 20 20 65 6c 65 6d 20 3d 20 70 48 2d 3e 66 69 elem = pH->fi
da510 72 73 74 3b 0d 0a 20 20 20 20 63 6f 75 6e 74 20 rst;.. count
da520 3d 20 70 48 2d 3e 63 6f 75 6e 74 3b 0d 0a 20 20 = pH->count;..
da530 7d 0d 0a 20 20 77 68 69 6c 65 28 20 63 6f 75 6e }.. while( coun
da540 74 2d 2d 20 26 26 20 41 4c 57 41 59 53 28 65 6c t-- && ALWAYS(el
da550 65 6d 29 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 em) ){.. if(
da560 65 6c 65 6d 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 elem->nKey==nKey
da570 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 && sqlite3StrNI
da580 43 6d 70 28 65 6c 65 6d 2d 3e 70 4b 65 79 2c 70 Cmp(elem->pKey,p
da590 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 20 Key,nKey)==0 ){
da5a0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 .. return e
da5b0 6c 65 6d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 lem;.. }..
da5c0 20 65 6c 65 6d 20 3d 20 65 6c 65 6d 2d 3e 6e 65 elem = elem->ne
da5d0 78 74 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 xt;.. }.. retu
da5e0 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 52 rn 0;..}..../* R
da5f0 65 6d 6f 76 65 20 61 20 73 69 6e 67 6c 65 20 65 emove a single e
da600 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 68 61 ntry from the ha
da610 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 61 sh table given a
da620 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 pointer to that
da630 0d 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 61 6e 64 ..** element and
da640 20 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20 65 a hash on the e
da650 6c 65 6d 65 6e 74 27 73 20 6b 65 79 2e 0d 0a 2a lement's key...*
da660 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 /..static void r
da670 65 6d 6f 76 65 45 6c 65 6d 65 6e 74 47 69 76 65 emoveElementGive
da680 6e 48 61 73 68 28 0d 0a 20 20 48 61 73 68 20 2a nHash(.. Hash *
da690 70 48 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 pH, /* T
da6a0 68 65 20 70 48 20 63 6f 6e 74 61 69 6e 69 6e 67 he pH containing
da6b0 20 22 65 6c 65 6d 22 20 2a 2f 0d 0a 20 20 48 61 "elem" */.. Ha
da6c0 73 68 45 6c 65 6d 2a 20 65 6c 65 6d 2c 20 20 20 shElem* elem,
da6d0 2f 2a 20 54 68 65 20 65 6c 65 6d 65 6e 74 20 74 /* The element t
da6e0 6f 20 62 65 20 72 65 6d 6f 76 65 64 20 66 72 6f o be removed fro
da6f0 6d 20 74 68 65 20 70 48 20 2a 2f 0d 0a 20 20 75 m the pH */.. u
da700 6e 73 69 67 6e 65 64 20 69 6e 74 20 68 20 20 20 nsigned int h
da710 20 2f 2a 20 48 61 73 68 20 76 61 6c 75 65 20 66 /* Hash value f
da720 6f 72 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 2a or the element *
da730 2f 0d 0a 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 /..){.. struct
da740 5f 68 74 20 2a 70 45 6e 74 72 79 3b 0d 0a 20 20 _ht *pEntry;..
da750 69 66 28 20 65 6c 65 6d 2d 3e 70 72 65 76 20 29 if( elem->prev )
da760 7b 0d 0a 20 20 20 20 65 6c 65 6d 2d 3e 70 72 65 {.. elem->pre
da770 76 2d 3e 6e 65 78 74 20 3d 20 65 6c 65 6d 2d 3e v->next = elem->
da780 6e 65 78 74 3b 20 0d 0a 20 20 7d 65 6c 73 65 7b next; .. }else{
da790 0d 0a 20 20 20 20 70 48 2d 3e 66 69 72 73 74 20 .. pH->first
da7a0 3d 20 65 6c 65 6d 2d 3e 6e 65 78 74 3b 0d 0a 20 = elem->next;..
da7b0 20 7d 0d 0a 20 20 69 66 28 20 65 6c 65 6d 2d 3e }.. if( elem->
da7c0 6e 65 78 74 20 29 7b 0d 0a 20 20 20 20 65 6c 65 next ){.. ele
da7d0 6d 2d 3e 6e 65 78 74 2d 3e 70 72 65 76 20 3d 20 m->next->prev =
da7e0 65 6c 65 6d 2d 3e 70 72 65 76 3b 0d 0a 20 20 7d elem->prev;.. }
da7f0 0d 0a 20 20 69 66 28 20 70 48 2d 3e 68 74 20 29 .. if( pH->ht )
da800 7b 0d 0a 20 20 20 20 70 45 6e 74 72 79 20 3d 20 {.. pEntry =
da810 26 70 48 2d 3e 68 74 5b 68 5d 3b 0d 0a 20 20 20 &pH->ht[h];..
da820 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 63 68 61 if( pEntry->cha
da830 69 6e 3d 3d 65 6c 65 6d 20 29 7b 0d 0a 20 20 20 in==elem ){..
da840 20 20 20 70 45 6e 74 72 79 2d 3e 63 68 61 69 6e pEntry->chain
da850 20 3d 20 65 6c 65 6d 2d 3e 6e 65 78 74 3b 0d 0a = elem->next;..
da860 20 20 20 20 7d 0d 0a 20 20 20 20 70 45 6e 74 72 }.. pEntr
da870 79 2d 3e 63 6f 75 6e 74 2d 2d 3b 0d 0a 20 20 20 y->count--;..
da880 20 61 73 73 65 72 74 28 20 70 45 6e 74 72 79 2d assert( pEntry-
da890 3e 63 6f 75 6e 74 3e 3d 30 20 29 3b 0d 0a 20 20 >count>=0 );..
da8a0 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 }.. sqlite3_fre
da8b0 65 28 20 65 6c 65 6d 20 29 3b 0d 0a 20 20 70 48 e( elem );.. pH
da8c0 2d 3e 63 6f 75 6e 74 2d 2d 3b 0d 0a 20 20 69 66 ->count--;.. if
da8d0 28 20 70 48 2d 3e 63 6f 75 6e 74 3c 3d 30 20 29 ( pH->count<=0 )
da8e0 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 {.. assert( p
da8f0 48 2d 3e 66 69 72 73 74 3d 3d 30 20 29 3b 0d 0a H->first==0 );..
da900 20 20 20 20 61 73 73 65 72 74 28 20 70 48 2d 3e assert( pH->
da910 63 6f 75 6e 74 3d 3d 30 20 29 3b 0d 0a 20 20 20 count==0 );..
da920 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 sqlite3HashClea
da930 72 28 70 48 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a r(pH);.. }..}..
da940 0d 0a 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 ../* Attempt to
da950 6c 6f 63 61 74 65 20 61 6e 20 65 6c 65 6d 65 6e locate an elemen
da960 74 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 t of the hash ta
da970 62 6c 65 20 70 48 20 77 69 74 68 20 61 20 6b 65 ble pH with a ke
da980 79 0d 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 y..** that match
da990 65 73 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 52 es pKey,nKey. R
da9a0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 66 eturn the data f
da9b0 6f 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 or this element
da9c0 69 66 20 69 74 20 69 73 0d 0a 2a 2a 20 66 6f 75 if it is..** fou
da9d0 6e 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 nd, or NULL if t
da9e0 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 here is no match
da9f0 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
daa00 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 IVATE void *sqli
daa10 74 65 33 48 61 73 68 46 69 6e 64 28 63 6f 6e 73 te3HashFind(cons
daa20 74 20 48 61 73 68 20 2a 70 48 2c 20 63 6f 6e 73 t Hash *pH, cons
daa30 74 20 63 68 61 72 20 2a 70 4b 65 79 2c 20 69 6e t char *pKey, in
daa40 74 20 6e 4b 65 79 29 7b 0d 0a 20 20 48 61 73 68 t nKey){.. Hash
daa50 45 6c 65 6d 20 2a 65 6c 65 6d 3b 20 20 20 20 2f Elem *elem; /
daa60 2a 20 54 68 65 20 65 6c 65 6d 65 6e 74 20 74 68 * The element th
daa70 61 74 20 6d 61 74 63 68 65 73 20 6b 65 79 20 2a at matches key *
daa80 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e /.. unsigned in
daa90 74 20 68 3b 20 20 20 20 2f 2a 20 41 20 68 61 73 t h; /* A has
daaa0 68 20 6f 6e 20 6b 65 79 20 2a 2f 0d 0a 0d 0a 20 h on key */....
daab0 20 61 73 73 65 72 74 28 20 70 48 21 3d 30 20 29 assert( pH!=0 )
daac0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 ;.. assert( pKe
daad0 79 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 y!=0 );.. asser
daae0 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0d 0a 20 t( nKey>=0 );..
daaf0 20 69 66 28 20 70 48 2d 3e 68 74 20 29 7b 0d 0a if( pH->ht ){..
dab00 20 20 20 20 68 20 3d 20 73 74 72 48 61 73 68 28 h = strHash(
dab10 70 4b 65 79 2c 20 6e 4b 65 79 29 20 25 20 70 48 pKey, nKey) % pH
dab20 2d 3e 68 74 73 69 7a 65 3b 0d 0a 20 20 7d 65 6c ->htsize;.. }el
dab30 73 65 7b 0d 0a 20 20 20 20 68 20 3d 20 30 3b 0d se{.. h = 0;.
dab40 0a 20 20 7d 0d 0a 20 20 65 6c 65 6d 20 3d 20 66 . }.. elem = f
dab50 69 6e 64 45 6c 65 6d 65 6e 74 47 69 76 65 6e 48 indElementGivenH
dab60 61 73 68 28 70 48 2c 20 70 4b 65 79 2c 20 6e 4b ash(pH, pKey, nK
dab70 65 79 2c 20 68 29 3b 0d 0a 20 20 72 65 74 75 72 ey, h);.. retur
dab80 6e 20 65 6c 65 6d 20 3f 20 65 6c 65 6d 2d 3e 64 n elem ? elem->d
dab90 61 74 61 20 3a 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f ata : 0;..}..../
daba0 2a 20 49 6e 73 65 72 74 20 61 6e 20 65 6c 65 6d * Insert an elem
dabb0 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 68 61 73 ent into the has
dabc0 68 20 74 61 62 6c 65 20 70 48 2e 20 20 54 68 65 h table pH. The
dabd0 20 6b 65 79 20 69 73 20 70 4b 65 79 2c 6e 4b 65 key is pKey,nKe
dabe0 79 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 y..** and the da
dabf0 74 61 20 69 73 20 22 64 61 74 61 22 2e 0d 0a 2a ta is "data"...*
dac00 2a 0d 0a 2a 2a 20 49 66 20 6e 6f 20 65 6c 65 6d *..** If no elem
dac10 65 6e 74 20 65 78 69 73 74 73 20 77 69 74 68 20 ent exists with
dac20 61 20 6d 61 74 63 68 69 6e 67 20 6b 65 79 2c 20 a matching key,
dac30 74 68 65 6e 20 61 20 6e 65 77 0d 0a 2a 2a 20 65 then a new..** e
dac40 6c 65 6d 65 6e 74 20 69 73 20 63 72 65 61 74 65 lement is create
dac50 64 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 d and NULL is re
dac60 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 turned...**..**
dac70 49 66 20 61 6e 6f 74 68 65 72 20 65 6c 65 6d 65 If another eleme
dac80 6e 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 nt already exist
dac90 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 s with the same
daca0 6b 65 79 2c 20 74 68 65 6e 20 74 68 65 0d 0a 2a key, then the..*
dacb0 2a 20 6e 65 77 20 64 61 74 61 20 72 65 70 6c 61 * new data repla
dacc0 63 65 73 20 74 68 65 20 6f 6c 64 20 64 61 74 61 ces the old data
dacd0 20 61 6e 64 20 74 68 65 20 6f 6c 64 20 64 61 74 and the old dat
dace0 61 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a a is returned...
dacf0 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 6e 6f ** The key is no
dad00 74 20 63 6f 70 69 65 64 20 69 6e 20 74 68 69 73 t copied in this
dad10 20 69 6e 73 74 61 6e 63 65 2e 20 20 49 66 20 61 instance. If a
dad20 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 74 malloc fails, t
dad30 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 6e 65 77 20 hen..** the new
dad40 64 61 74 61 20 69 73 20 72 65 74 75 72 6e 65 64 data is returned
dad50 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 and the hash ta
dad60 62 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 ble is unchanged
dad70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
dad80 20 22 64 61 74 61 22 20 70 61 72 61 6d 65 74 65 "data" paramete
dad90 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 r to this functi
dada0 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e on is NULL, then
dadb0 20 74 68 65 0d 0a 2a 2a 20 65 6c 65 6d 65 6e 74 the..** element
dadc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 corresponding t
dadd0 6f 20 22 6b 65 79 22 20 69 73 20 72 65 6d 6f 76 o "key" is remov
dade0 65 64 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 ed from the hash
dadf0 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c table...*/..SQL
dae00 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
dae10 20 2a 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 *sqlite3HashIns
dae20 65 72 74 28 48 61 73 68 20 2a 70 48 2c 20 63 6f ert(Hash *pH, co
dae30 6e 73 74 20 63 68 61 72 20 2a 70 4b 65 79 2c 20 nst char *pKey,
dae40 69 6e 74 20 6e 4b 65 79 2c 20 76 6f 69 64 20 2a int nKey, void *
dae50 64 61 74 61 29 7b 0d 0a 20 20 75 6e 73 69 67 6e data){.. unsign
dae60 65 64 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 ed int h;
dae70 2f 2a 20 74 68 65 20 68 61 73 68 20 6f 66 20 74 /* the hash of t
dae80 68 65 20 6b 65 79 20 6d 6f 64 75 6c 6f 20 68 61 he key modulo ha
dae90 73 68 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f sh table size */
daea0 0d 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 65 6c .. HashElem *el
daeb0 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 em; /* Use
daec0 64 20 74 6f 20 6c 6f 6f 70 20 74 68 72 75 20 74 d to loop thru t
daed0 68 65 20 65 6c 65 6d 65 6e 74 20 6c 69 73 74 20 he element list
daee0 2a 2f 0d 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a */.. HashElem *
daef0 6e 65 77 5f 65 6c 65 6d 3b 20 20 20 2f 2a 20 4e new_elem; /* N
daf00 65 77 20 65 6c 65 6d 65 6e 74 20 61 64 64 65 64 ew element added
daf10 20 74 6f 20 74 68 65 20 70 48 20 2a 2f 0d 0a 0d to the pH */...
daf20 0a 20 20 61 73 73 65 72 74 28 20 70 48 21 3d 30 . assert( pH!=0
daf30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
daf40 4b 65 79 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 Key!=0 );.. ass
daf50 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0d ert( nKey>=0 );.
daf60 0a 20 20 69 66 28 20 70 48 2d 3e 68 74 73 69 7a . if( pH->htsiz
daf70 65 20 29 7b 0d 0a 20 20 20 20 68 20 3d 20 73 74 e ){.. h = st
daf80 72 48 61 73 68 28 70 4b 65 79 2c 20 6e 4b 65 79 rHash(pKey, nKey
daf90 29 20 25 20 70 48 2d 3e 68 74 73 69 7a 65 3b 0d ) % pH->htsize;.
dafa0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 68 . }else{.. h
dafb0 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 65 6c = 0;.. }.. el
dafc0 65 6d 20 3d 20 66 69 6e 64 45 6c 65 6d 65 6e 74 em = findElement
dafd0 47 69 76 65 6e 48 61 73 68 28 70 48 2c 70 4b 65 GivenHash(pH,pKe
dafe0 79 2c 6e 4b 65 79 2c 68 29 3b 0d 0a 20 20 69 66 y,nKey,h);.. if
daff0 28 20 65 6c 65 6d 20 29 7b 0d 0a 20 20 20 20 76 ( elem ){.. v
db000 6f 69 64 20 2a 6f 6c 64 5f 64 61 74 61 20 3d 20 oid *old_data =
db010 65 6c 65 6d 2d 3e 64 61 74 61 3b 0d 0a 20 20 20 elem->data;..
db020 20 69 66 28 20 64 61 74 61 3d 3d 30 20 29 7b 0d if( data==0 ){.
db030 0a 20 20 20 20 20 20 72 65 6d 6f 76 65 45 6c 65 . removeEle
db040 6d 65 6e 74 47 69 76 65 6e 48 61 73 68 28 70 48 mentGivenHash(pH
db050 2c 65 6c 65 6d 2c 68 29 3b 0d 0a 20 20 20 20 7d ,elem,h);.. }
db060 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 65 6c 65 else{.. ele
db070 6d 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0d m->data = data;.
db080 0a 20 20 20 20 20 20 65 6c 65 6d 2d 3e 70 4b 65 . elem->pKe
db090 79 20 3d 20 70 4b 65 79 3b 0d 0a 20 20 20 20 20 y = pKey;..
db0a0 20 61 73 73 65 72 74 28 6e 4b 65 79 3d 3d 65 6c assert(nKey==el
db0b0 65 6d 2d 3e 6e 4b 65 79 29 3b 0d 0a 20 20 20 20 em->nKey);..
db0c0 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6c }.. return ol
db0d0 64 5f 64 61 74 61 3b 0d 0a 20 20 7d 0d 0a 20 20 d_data;.. }..
db0e0 69 66 28 20 64 61 74 61 3d 3d 30 20 29 20 72 65 if( data==0 ) re
db0f0 74 75 72 6e 20 30 3b 0d 0a 20 20 6e 65 77 5f 65 turn 0;.. new_e
db100 6c 65 6d 20 3d 20 28 48 61 73 68 45 6c 65 6d 2a lem = (HashElem*
db110 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 )sqlite3Malloc(
db120 73 69 7a 65 6f 66 28 48 61 73 68 45 6c 65 6d 29 sizeof(HashElem)
db130 20 29 3b 0d 0a 20 20 69 66 28 20 6e 65 77 5f 65 );.. if( new_e
db140 6c 65 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 lem==0 ) return
db150 64 61 74 61 3b 0d 0a 20 20 6e 65 77 5f 65 6c 65 data;.. new_ele
db160 6d 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0d m->pKey = pKey;.
db170 0a 20 20 6e 65 77 5f 65 6c 65 6d 2d 3e 6e 4b 65 . new_elem->nKe
db180 79 20 3d 20 6e 4b 65 79 3b 0d 0a 20 20 6e 65 77 y = nKey;.. new
db190 5f 65 6c 65 6d 2d 3e 64 61 74 61 20 3d 20 64 61 _elem->data = da
db1a0 74 61 3b 0d 0a 20 20 70 48 2d 3e 63 6f 75 6e 74 ta;.. pH->count
db1b0 2b 2b 3b 0d 0a 20 20 69 66 28 20 70 48 2d 3e 63 ++;.. if( pH->c
db1c0 6f 75 6e 74 3e 3d 31 30 20 26 26 20 70 48 2d 3e ount>=10 && pH->
db1d0 63 6f 75 6e 74 20 3e 20 32 2a 70 48 2d 3e 68 74 count > 2*pH->ht
db1e0 73 69 7a 65 20 29 7b 0d 0a 20 20 20 20 69 66 28 size ){.. if(
db1f0 20 72 65 68 61 73 68 28 70 48 2c 20 70 48 2d 3e rehash(pH, pH->
db200 63 6f 75 6e 74 2a 32 29 20 29 7b 0d 0a 20 20 20 count*2) ){..
db210 20 20 20 61 73 73 65 72 74 28 20 70 48 2d 3e 68 assert( pH->h
db220 74 73 69 7a 65 3e 30 20 29 3b 0d 0a 20 20 20 20 tsize>0 );..
db230 20 20 68 20 3d 20 73 74 72 48 61 73 68 28 70 4b h = strHash(pK
db240 65 79 2c 20 6e 4b 65 79 29 20 25 20 70 48 2d 3e ey, nKey) % pH->
db250 68 74 73 69 7a 65 3b 0d 0a 20 20 20 20 7d 0d 0a htsize;.. }..
db260 20 20 7d 0d 0a 20 20 69 66 28 20 70 48 2d 3e 68 }.. if( pH->h
db270 74 20 29 7b 0d 0a 20 20 20 20 69 6e 73 65 72 74 t ){.. insert
db280 45 6c 65 6d 65 6e 74 28 70 48 2c 20 26 70 48 2d Element(pH, &pH-
db290 3e 68 74 5b 68 5d 2c 20 6e 65 77 5f 65 6c 65 6d >ht[h], new_elem
db2a0 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 );.. }else{..
db2b0 20 20 69 6e 73 65 72 74 45 6c 65 6d 65 6e 74 28 insertElement(
db2c0 70 48 2c 20 30 2c 20 6e 65 77 5f 65 6c 65 6d 29 pH, 0, new_elem)
db2d0 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
db2e0 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 0;..}..../*****
db2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 ********* End of
db300 20 68 61 73 68 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a hash.c ********
db310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
db320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
db330 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
db340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
db350 20 66 69 6c 65 20 6f 70 63 6f 64 65 73 2e 63 20 file opcodes.c
db360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
db370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
db380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 20 41 *********/../* A
db390 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e utomatically gen
db3a0 65 72 61 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20 erated. Do not
db3b0 65 64 69 74 20 2a 2f 0d 0a 2f 2a 20 53 65 65 20 edit */../* See
db3c0 74 68 65 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 the mkopcodec.aw
db3d0 6b 20 73 63 72 69 70 74 20 66 6f 72 20 64 65 74 k script for det
db3e0 61 69 6c 73 2e 20 2a 2f 0d 0a 23 69 66 20 21 64 ails. */..#if !d
db3f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
db400 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 IT_EXPLAIN) || !
db410 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 defined(NDEBUG)
db420 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f || defined(VDBE_
db430 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 PROFILE) || defi
db440 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
db450 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 )..SQLITE_PRIVAT
db460 45 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 E const char *sq
db470 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 lite3OpcodeName(
db480 69 6e 74 20 69 29 7b 0d 0a 20 73 74 61 74 69 63 int i){.. static
db490 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e const char *con
db4a0 73 74 20 61 7a 4e 61 6d 65 5b 5d 20 3d 20 7b 20 st azName[] = {
db4b0 22 3f 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 20 "?",.. /*
db4c0 31 20 2a 2f 20 22 47 6f 74 6f 22 2c 0d 0a 20 20 1 */ "Goto",..
db4d0 20 20 20 2f 2a 20 20 20 32 20 2a 2f 20 22 47 6f /* 2 */ "Go
db4e0 73 75 62 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 sub",.. /*
db4f0 20 33 20 2a 2f 20 22 52 65 74 75 72 6e 22 2c 0d 3 */ "Return",.
db500 0a 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 20 . /* 4 */
db510 22 59 69 65 6c 64 22 2c 0d 0a 20 20 20 20 20 2f "Yield",.. /
db520 2a 20 20 20 35 20 2a 2f 20 22 48 61 6c 74 49 66 * 5 */ "HaltIf
db530 4e 75 6c 6c 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 Null",.. /*
db540 20 20 36 20 2a 2f 20 22 48 61 6c 74 22 2c 0d 0a 6 */ "Halt",..
db550 20 20 20 20 20 2f 2a 20 20 20 37 20 2a 2f 20 22 /* 7 */ "
db560 49 6e 74 65 67 65 72 22 2c 0d 0a 20 20 20 20 20 Integer",..
db570 2f 2a 20 20 20 38 20 2a 2f 20 22 49 6e 74 36 34 /* 8 */ "Int64
db580 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 20 39 20 ",.. /* 9
db590 2a 2f 20 22 53 74 72 69 6e 67 22 2c 0d 0a 20 20 */ "String",..
db5a0 20 20 20 2f 2a 20 20 31 30 20 2a 2f 20 22 4e 75 /* 10 */ "Nu
db5b0 6c 6c 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 31 ll",.. /* 1
db5c0 31 20 2a 2f 20 22 42 6c 6f 62 22 2c 0d 0a 20 20 1 */ "Blob",..
db5d0 20 20 20 2f 2a 20 20 31 32 20 2a 2f 20 22 56 61 /* 12 */ "Va
db5e0 72 69 61 62 6c 65 22 2c 0d 0a 20 20 20 20 20 2f riable",.. /
db5f0 2a 20 20 31 33 20 2a 2f 20 22 4d 6f 76 65 22 2c * 13 */ "Move",
db600 0d 0a 20 20 20 20 20 2f 2a 20 20 31 34 20 2a 2f .. /* 14 */
db610 20 22 43 6f 70 79 22 2c 0d 0a 20 20 20 20 20 2f "Copy",.. /
db620 2a 20 20 31 35 20 2a 2f 20 22 53 43 6f 70 79 22 * 15 */ "SCopy"
db630 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 31 36 20 2a ,.. /* 16 *
db640 2f 20 22 52 65 73 75 6c 74 52 6f 77 22 2c 0d 0a / "ResultRow",..
db650 20 20 20 20 20 2f 2a 20 20 31 37 20 2a 2f 20 22 /* 17 */ "
db660 43 6f 6c 6c 53 65 71 22 2c 0d 0a 20 20 20 20 20 CollSeq",..
db670 2f 2a 20 20 31 38 20 2a 2f 20 22 46 75 6e 63 74 /* 18 */ "Funct
db680 69 6f 6e 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 ion",.. /*
db690 31 39 20 2a 2f 20 22 4e 6f 74 22 2c 0d 0a 20 20 19 */ "Not",..
db6a0 20 20 20 2f 2a 20 20 32 30 20 2a 2f 20 22 41 64 /* 20 */ "Ad
db6b0 64 49 6d 6d 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 dImm",.. /*
db6c0 20 32 31 20 2a 2f 20 22 4d 75 73 74 42 65 49 6e 21 */ "MustBeIn
db6d0 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 32 32 t",.. /* 22
db6e0 20 2a 2f 20 22 52 65 61 6c 41 66 66 69 6e 69 74 */ "RealAffinit
db6f0 79 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 32 33 y",.. /* 23
db700 20 2a 2f 20 22 50 65 72 6d 75 74 61 74 69 6f 6e */ "Permutation
db710 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 32 34 20 ",.. /* 24
db720 2a 2f 20 22 43 6f 6d 70 61 72 65 22 2c 0d 0a 20 */ "Compare",..
db730 20 20 20 20 2f 2a 20 20 32 35 20 2a 2f 20 22 4a /* 25 */ "J
db740 75 6d 70 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 ump",.. /*
db750 32 36 20 2a 2f 20 22 4f 6e 63 65 22 2c 0d 0a 20 26 */ "Once",..
db760 20 20 20 20 2f 2a 20 20 32 37 20 2a 2f 20 22 49 /* 27 */ "I
db770 66 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 32 38 f",.. /* 28
db780 20 2a 2f 20 22 49 66 4e 6f 74 22 2c 0d 0a 20 20 */ "IfNot",..
db790 20 20 20 2f 2a 20 20 32 39 20 2a 2f 20 22 43 6f /* 29 */ "Co
db7a0 6c 75 6d 6e 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 lumn",.. /*
db7b0 20 33 30 20 2a 2f 20 22 41 66 66 69 6e 69 74 79 30 */ "Affinity
db7c0 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 33 31 20 ",.. /* 31
db7d0 2a 2f 20 22 4d 61 6b 65 52 65 63 6f 72 64 22 2c */ "MakeRecord",
db7e0 0d 0a 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f .. /* 32 */
db7f0 20 22 43 6f 75 6e 74 22 2c 0d 0a 20 20 20 20 20 "Count",..
db800 2f 2a 20 20 33 33 20 2a 2f 20 22 53 61 76 65 70 /* 33 */ "Savep
db810 6f 69 6e 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 oint",.. /*
db820 20 33 34 20 2a 2f 20 22 41 75 74 6f 43 6f 6d 6d 34 */ "AutoComm
db830 69 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 33 it",.. /* 3
db840 35 20 2a 2f 20 22 54 72 61 6e 73 61 63 74 69 6f 5 */ "Transactio
db850 6e 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 33 36 n",.. /* 36
db860 20 2a 2f 20 22 52 65 61 64 43 6f 6f 6b 69 65 22 */ "ReadCookie"
db870 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 33 37 20 2a ,.. /* 37 *
db880 2f 20 22 53 65 74 43 6f 6f 6b 69 65 22 2c 0d 0a / "SetCookie",..
db890 20 20 20 20 20 2f 2a 20 20 33 38 20 2a 2f 20 22 /* 38 */ "
db8a0 56 65 72 69 66 79 43 6f 6f 6b 69 65 22 2c 0d 0a VerifyCookie",..
db8b0 20 20 20 20 20 2f 2a 20 20 33 39 20 2a 2f 20 22 /* 39 */ "
db8c0 4f 70 65 6e 52 65 61 64 22 2c 0d 0a 20 20 20 20 OpenRead",..
db8d0 20 2f 2a 20 20 34 30 20 2a 2f 20 22 4f 70 65 6e /* 40 */ "Open
db8e0 57 72 69 74 65 22 2c 0d 0a 20 20 20 20 20 2f 2a Write",.. /*
db8f0 20 20 34 31 20 2a 2f 20 22 4f 70 65 6e 41 75 74 41 */ "OpenAut
db900 6f 69 6e 64 65 78 22 2c 0d 0a 20 20 20 20 20 2f oindex",.. /
db910 2a 20 20 34 32 20 2a 2f 20 22 4f 70 65 6e 45 70 * 42 */ "OpenEp
db920 68 65 6d 65 72 61 6c 22 2c 0d 0a 20 20 20 20 20 hemeral",..
db930 2f 2a 20 20 34 33 20 2a 2f 20 22 53 6f 72 74 65 /* 43 */ "Sorte
db940 72 4f 70 65 6e 22 2c 0d 0a 20 20 20 20 20 2f 2a rOpen",.. /*
db950 20 20 34 34 20 2a 2f 20 22 4f 70 65 6e 50 73 65 44 */ "OpenPse
db960 75 64 6f 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 udo",.. /*
db970 34 35 20 2a 2f 20 22 43 6c 6f 73 65 22 2c 0d 0a 45 */ "Close",..
db980 20 20 20 20 20 2f 2a 20 20 34 36 20 2a 2f 20 22 /* 46 */ "
db990 53 65 65 6b 4c 74 22 2c 0d 0a 20 20 20 20 20 2f SeekLt",.. /
db9a0 2a 20 20 34 37 20 2a 2f 20 22 53 65 65 6b 4c 65 * 47 */ "SeekLe
db9b0 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 34 38 20 ",.. /* 48
db9c0 2a 2f 20 22 53 65 65 6b 47 65 22 2c 0d 0a 20 20 */ "SeekGe",..
db9d0 20 20 20 2f 2a 20 20 34 39 20 2a 2f 20 22 53 65 /* 49 */ "Se
db9e0 65 6b 47 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 ekGt",.. /*
db9f0 20 35 30 20 2a 2f 20 22 53 65 65 6b 22 2c 0d 0a 50 */ "Seek",..
dba00 20 20 20 20 20 2f 2a 20 20 35 31 20 2a 2f 20 22 /* 51 */ "
dba10 4e 6f 74 46 6f 75 6e 64 22 2c 0d 0a 20 20 20 20 NotFound",..
dba20 20 2f 2a 20 20 35 32 20 2a 2f 20 22 46 6f 75 6e /* 52 */ "Foun
dba30 64 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 35 33 d",.. /* 53
dba40 20 2a 2f 20 22 49 73 55 6e 69 71 75 65 22 2c 0d */ "IsUnique",.
dba50 0a 20 20 20 20 20 2f 2a 20 20 35 34 20 2a 2f 20 . /* 54 */
dba60 22 4e 6f 74 45 78 69 73 74 73 22 2c 0d 0a 20 20 "NotExists",..
dba70 20 20 20 2f 2a 20 20 35 35 20 2a 2f 20 22 53 65 /* 55 */ "Se
dba80 71 75 65 6e 63 65 22 2c 0d 0a 20 20 20 20 20 2f quence",.. /
dba90 2a 20 20 35 36 20 2a 2f 20 22 4e 65 77 52 6f 77 * 56 */ "NewRow
dbaa0 69 64 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 35 id",.. /* 5
dbab0 37 20 2a 2f 20 22 49 6e 73 65 72 74 22 2c 0d 0a 7 */ "Insert",..
dbac0 20 20 20 20 20 2f 2a 20 20 35 38 20 2a 2f 20 22 /* 58 */ "
dbad0 49 6e 73 65 72 74 49 6e 74 22 2c 0d 0a 20 20 20 InsertInt",..
dbae0 20 20 2f 2a 20 20 35 39 20 2a 2f 20 22 44 65 6c /* 59 */ "Del
dbaf0 65 74 65 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 ete",.. /*
dbb00 36 30 20 2a 2f 20 22 52 65 73 65 74 43 6f 75 6e 60 */ "ResetCoun
dbb10 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 36 31 t",.. /* 61
dbb20 20 2a 2f 20 22 53 6f 72 74 65 72 43 6f 6d 70 61 */ "SorterCompa
dbb30 72 65 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 36 re",.. /* 6
dbb40 32 20 2a 2f 20 22 53 6f 72 74 65 72 44 61 74 61 2 */ "SorterData
dbb50 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 36 33 20 ",.. /* 63
dbb60 2a 2f 20 22 52 6f 77 4b 65 79 22 2c 0d 0a 20 20 */ "RowKey",..
dbb70 20 20 20 2f 2a 20 20 36 34 20 2a 2f 20 22 52 6f /* 64 */ "Ro
dbb80 77 44 61 74 61 22 2c 0d 0a 20 20 20 20 20 2f 2a wData",.. /*
dbb90 20 20 36 35 20 2a 2f 20 22 52 6f 77 69 64 22 2c 65 */ "Rowid",
dbba0 0d 0a 20 20 20 20 20 2f 2a 20 20 36 36 20 2a 2f .. /* 66 */
dbbb0 20 22 4e 75 6c 6c 52 6f 77 22 2c 0d 0a 20 20 20 "NullRow",..
dbbc0 20 20 2f 2a 20 20 36 37 20 2a 2f 20 22 4c 61 73 /* 67 */ "Las
dbbd0 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 36 38 t",.. /* 68
dbbe0 20 2a 2f 20 22 4f 72 22 2c 0d 0a 20 20 20 20 20 */ "Or",..
dbbf0 2f 2a 20 20 36 39 20 2a 2f 20 22 41 6e 64 22 2c /* 69 */ "And",
dbc00 0d 0a 20 20 20 20 20 2f 2a 20 20 37 30 20 2a 2f .. /* 70 */
dbc10 20 22 53 6f 72 74 65 72 53 6f 72 74 22 2c 0d 0a "SorterSort",..
dbc20 20 20 20 20 20 2f 2a 20 20 37 31 20 2a 2f 20 22 /* 71 */ "
dbc30 53 6f 72 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 Sort",.. /*
dbc40 20 37 32 20 2a 2f 20 22 52 65 77 69 6e 64 22 2c 72 */ "Rewind",
dbc50 0d 0a 20 20 20 20 20 2f 2a 20 20 37 33 20 2a 2f .. /* 73 */
dbc60 20 22 49 73 4e 75 6c 6c 22 2c 0d 0a 20 20 20 20 "IsNull",..
dbc70 20 2f 2a 20 20 37 34 20 2a 2f 20 22 4e 6f 74 4e /* 74 */ "NotN
dbc80 75 6c 6c 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 ull",.. /*
dbc90 37 35 20 2a 2f 20 22 4e 65 22 2c 0d 0a 20 20 20 75 */ "Ne",..
dbca0 20 20 2f 2a 20 20 37 36 20 2a 2f 20 22 45 71 22 /* 76 */ "Eq"
dbcb0 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 37 37 20 2a ,.. /* 77 *
dbcc0 2f 20 22 47 74 22 2c 0d 0a 20 20 20 20 20 2f 2a / "Gt",.. /*
dbcd0 20 20 37 38 20 2a 2f 20 22 4c 65 22 2c 0d 0a 20 78 */ "Le",..
dbce0 20 20 20 20 2f 2a 20 20 37 39 20 2a 2f 20 22 4c /* 79 */ "L
dbcf0 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 38 30 t",.. /* 80
dbd00 20 2a 2f 20 22 47 65 22 2c 0d 0a 20 20 20 20 20 */ "Ge",..
dbd10 2f 2a 20 20 38 31 20 2a 2f 20 22 53 6f 72 74 65 /* 81 */ "Sorte
dbd20 72 4e 65 78 74 22 2c 0d 0a 20 20 20 20 20 2f 2a rNext",.. /*
dbd30 20 20 38 32 20 2a 2f 20 22 42 69 74 41 6e 64 22 82 */ "BitAnd"
dbd40 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 38 33 20 2a ,.. /* 83 *
dbd50 2f 20 22 42 69 74 4f 72 22 2c 0d 0a 20 20 20 20 / "BitOr",..
dbd60 20 2f 2a 20 20 38 34 20 2a 2f 20 22 53 68 69 66 /* 84 */ "Shif
dbd70 74 4c 65 66 74 22 2c 0d 0a 20 20 20 20 20 2f 2a tLeft",.. /*
dbd80 20 20 38 35 20 2a 2f 20 22 53 68 69 66 74 52 69 85 */ "ShiftRi
dbd90 67 68 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 ght",.. /*
dbda0 38 36 20 2a 2f 20 22 41 64 64 22 2c 0d 0a 20 20 86 */ "Add",..
dbdb0 20 20 20 2f 2a 20 20 38 37 20 2a 2f 20 22 53 75 /* 87 */ "Su
dbdc0 62 74 72 61 63 74 22 2c 0d 0a 20 20 20 20 20 2f btract",.. /
dbdd0 2a 20 20 38 38 20 2a 2f 20 22 4d 75 6c 74 69 70 * 88 */ "Multip
dbde0 6c 79 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 38 ly",.. /* 8
dbdf0 39 20 2a 2f 20 22 44 69 76 69 64 65 22 2c 0d 0a 9 */ "Divide",..
dbe00 20 20 20 20 20 2f 2a 20 20 39 30 20 2a 2f 20 22 /* 90 */ "
dbe10 52 65 6d 61 69 6e 64 65 72 22 2c 0d 0a 20 20 20 Remainder",..
dbe20 20 20 2f 2a 20 20 39 31 20 2a 2f 20 22 43 6f 6e /* 91 */ "Con
dbe30 63 61 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 cat",.. /*
dbe40 39 32 20 2a 2f 20 22 50 72 65 76 22 2c 0d 0a 20 92 */ "Prev",..
dbe50 20 20 20 20 2f 2a 20 20 39 33 20 2a 2f 20 22 42 /* 93 */ "B
dbe60 69 74 4e 6f 74 22 2c 0d 0a 20 20 20 20 20 2f 2a itNot",.. /*
dbe70 20 20 39 34 20 2a 2f 20 22 53 74 72 69 6e 67 38 94 */ "String8
dbe80 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 39 35 20 ",.. /* 95
dbe90 2a 2f 20 22 4e 65 78 74 22 2c 0d 0a 20 20 20 20 */ "Next",..
dbea0 20 2f 2a 20 20 39 36 20 2a 2f 20 22 53 6f 72 74 /* 96 */ "Sort
dbeb0 65 72 49 6e 73 65 72 74 22 2c 0d 0a 20 20 20 20 erInsert",..
dbec0 20 2f 2a 20 20 39 37 20 2a 2f 20 22 49 64 78 49 /* 97 */ "IdxI
dbed0 6e 73 65 72 74 22 2c 0d 0a 20 20 20 20 20 2f 2a nsert",.. /*
dbee0 20 20 39 38 20 2a 2f 20 22 49 64 78 44 65 6c 65 98 */ "IdxDele
dbef0 74 65 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 20 39 te",.. /* 9
dbf00 39 20 2a 2f 20 22 49 64 78 52 6f 77 69 64 22 2c 9 */ "IdxRowid",
dbf10 0d 0a 20 20 20 20 20 2f 2a 20 31 30 30 20 2a 2f .. /* 100 */
dbf20 20 22 49 64 78 4c 54 22 2c 0d 0a 20 20 20 20 20 "IdxLT",..
dbf30 2f 2a 20 31 30 31 20 2a 2f 20 22 49 64 78 47 45 /* 101 */ "IdxGE
dbf40 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 30 32 20 ",.. /* 102
dbf50 2a 2f 20 22 44 65 73 74 72 6f 79 22 2c 0d 0a 20 */ "Destroy",..
dbf60 20 20 20 20 2f 2a 20 31 30 33 20 2a 2f 20 22 43 /* 103 */ "C
dbf70 6c 65 61 72 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 lear",.. /*
dbf80 31 30 34 20 2a 2f 20 22 43 72 65 61 74 65 49 6e 104 */ "CreateIn
dbf90 64 65 78 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 dex",.. /* 1
dbfa0 30 35 20 2a 2f 20 22 43 72 65 61 74 65 54 61 62 05 */ "CreateTab
dbfb0 6c 65 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 30 le",.. /* 10
dbfc0 36 20 2a 2f 20 22 50 61 72 73 65 53 63 68 65 6d 6 */ "ParseSchem
dbfd0 61 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 30 37 a",.. /* 107
dbfe0 20 2a 2f 20 22 4c 6f 61 64 41 6e 61 6c 79 73 69 */ "LoadAnalysi
dbff0 73 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 30 38 s",.. /* 108
dc000 20 2a 2f 20 22 44 72 6f 70 54 61 62 6c 65 22 2c */ "DropTable",
dc010 0d 0a 20 20 20 20 20 2f 2a 20 31 30 39 20 2a 2f .. /* 109 */
dc020 20 22 44 72 6f 70 49 6e 64 65 78 22 2c 0d 0a 20 "DropIndex",..
dc030 20 20 20 20 2f 2a 20 31 31 30 20 2a 2f 20 22 44 /* 110 */ "D
dc040 72 6f 70 54 72 69 67 67 65 72 22 2c 0d 0a 20 20 ropTrigger",..
dc050 20 20 20 2f 2a 20 31 31 31 20 2a 2f 20 22 49 6e /* 111 */ "In
dc060 74 65 67 72 69 74 79 43 6b 22 2c 0d 0a 20 20 20 tegrityCk",..
dc070 20 20 2f 2a 20 31 31 32 20 2a 2f 20 22 52 6f 77 /* 112 */ "Row
dc080 53 65 74 41 64 64 22 2c 0d 0a 20 20 20 20 20 2f SetAdd",.. /
dc090 2a 20 31 31 33 20 2a 2f 20 22 52 6f 77 53 65 74 * 113 */ "RowSet
dc0a0 52 65 61 64 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 Read",.. /*
dc0b0 31 31 34 20 2a 2f 20 22 52 6f 77 53 65 74 54 65 114 */ "RowSetTe
dc0c0 73 74 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 31 st",.. /* 11
dc0d0 35 20 2a 2f 20 22 50 72 6f 67 72 61 6d 22 2c 0d 5 */ "Program",.
dc0e0 0a 20 20 20 20 20 2f 2a 20 31 31 36 20 2a 2f 20 . /* 116 */
dc0f0 22 50 61 72 61 6d 22 2c 0d 0a 20 20 20 20 20 2f "Param",.. /
dc100 2a 20 31 31 37 20 2a 2f 20 22 46 6b 43 6f 75 6e * 117 */ "FkCoun
dc110 74 65 72 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 ter",.. /* 1
dc120 31 38 20 2a 2f 20 22 46 6b 49 66 5a 65 72 6f 22 18 */ "FkIfZero"
dc130 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 31 39 20 2a ,.. /* 119 *
dc140 2f 20 22 4d 65 6d 4d 61 78 22 2c 0d 0a 20 20 20 / "MemMax",..
dc150 20 20 2f 2a 20 31 32 30 20 2a 2f 20 22 49 66 50 /* 120 */ "IfP
dc160 6f 73 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 32 os",.. /* 12
dc170 31 20 2a 2f 20 22 49 66 4e 65 67 22 2c 0d 0a 20 1 */ "IfNeg",..
dc180 20 20 20 20 2f 2a 20 31 32 32 20 2a 2f 20 22 49 /* 122 */ "I
dc190 66 5a 65 72 6f 22 2c 0d 0a 20 20 20 20 20 2f 2a fZero",.. /*
dc1a0 20 31 32 33 20 2a 2f 20 22 41 67 67 53 74 65 70 123 */ "AggStep
dc1b0 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 32 34 20 ",.. /* 124
dc1c0 2a 2f 20 22 41 67 67 46 69 6e 61 6c 22 2c 0d 0a */ "AggFinal",..
dc1d0 20 20 20 20 20 2f 2a 20 31 32 35 20 2a 2f 20 22 /* 125 */ "
dc1e0 43 68 65 63 6b 70 6f 69 6e 74 22 2c 0d 0a 20 20 Checkpoint",..
dc1f0 20 20 20 2f 2a 20 31 32 36 20 2a 2f 20 22 4a 6f /* 126 */ "Jo
dc200 75 72 6e 61 6c 4d 6f 64 65 22 2c 0d 0a 20 20 20 urnalMode",..
dc210 20 20 2f 2a 20 31 32 37 20 2a 2f 20 22 56 61 63 /* 127 */ "Vac
dc220 75 75 6d 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 uum",.. /* 1
dc230 32 38 20 2a 2f 20 22 49 6e 63 72 56 61 63 75 75 28 */ "IncrVacuu
dc240 6d 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 32 39 m",.. /* 129
dc250 20 2a 2f 20 22 45 78 70 69 72 65 22 2c 0d 0a 20 */ "Expire",..
dc260 20 20 20 20 2f 2a 20 31 33 30 20 2a 2f 20 22 52 /* 130 */ "R
dc270 65 61 6c 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 eal",.. /* 1
dc280 33 31 20 2a 2f 20 22 54 61 62 6c 65 4c 6f 63 6b 31 */ "TableLock
dc290 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 33 32 20 ",.. /* 132
dc2a0 2a 2f 20 22 56 42 65 67 69 6e 22 2c 0d 0a 20 20 */ "VBegin",..
dc2b0 20 20 20 2f 2a 20 31 33 33 20 2a 2f 20 22 56 43 /* 133 */ "VC
dc2c0 72 65 61 74 65 22 2c 0d 0a 20 20 20 20 20 2f 2a reate",.. /*
dc2d0 20 31 33 34 20 2a 2f 20 22 56 44 65 73 74 72 6f 134 */ "VDestro
dc2e0 79 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 33 35 y",.. /* 135
dc2f0 20 2a 2f 20 22 56 4f 70 65 6e 22 2c 0d 0a 20 20 */ "VOpen",..
dc300 20 20 20 2f 2a 20 31 33 36 20 2a 2f 20 22 56 46 /* 136 */ "VF
dc310 69 6c 74 65 72 22 2c 0d 0a 20 20 20 20 20 2f 2a ilter",.. /*
dc320 20 31 33 37 20 2a 2f 20 22 56 43 6f 6c 75 6d 6e 137 */ "VColumn
dc330 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 33 38 20 ",.. /* 138
dc340 2a 2f 20 22 56 4e 65 78 74 22 2c 0d 0a 20 20 20 */ "VNext",..
dc350 20 20 2f 2a 20 31 33 39 20 2a 2f 20 22 56 52 65 /* 139 */ "VRe
dc360 6e 61 6d 65 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 name",.. /*
dc370 31 34 30 20 2a 2f 20 22 56 55 70 64 61 74 65 22 140 */ "VUpdate"
dc380 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 34 31 20 2a ,.. /* 141 *
dc390 2f 20 22 54 6f 54 65 78 74 22 2c 0d 0a 20 20 20 / "ToText",..
dc3a0 20 20 2f 2a 20 31 34 32 20 2a 2f 20 22 54 6f 42 /* 142 */ "ToB
dc3b0 6c 6f 62 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 lob",.. /* 1
dc3c0 34 33 20 2a 2f 20 22 54 6f 4e 75 6d 65 72 69 63 43 */ "ToNumeric
dc3d0 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 34 34 20 ",.. /* 144
dc3e0 2a 2f 20 22 54 6f 49 6e 74 22 2c 0d 0a 20 20 20 */ "ToInt",..
dc3f0 20 20 2f 2a 20 31 34 35 20 2a 2f 20 22 54 6f 52 /* 145 */ "ToR
dc400 65 61 6c 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 eal",.. /* 1
dc410 34 36 20 2a 2f 20 22 50 61 67 65 63 6f 75 6e 74 46 */ "Pagecount
dc420 22 2c 0d 0a 20 20 20 20 20 2f 2a 20 31 34 37 20 ",.. /* 147
dc430 2a 2f 20 22 4d 61 78 50 67 63 6e 74 22 2c 0d 0a */ "MaxPgcnt",..
dc440 20 20 20 20 20 2f 2a 20 31 34 38 20 2a 2f 20 22 /* 148 */ "
dc450 54 72 61 63 65 22 2c 0d 0a 20 20 20 20 20 2f 2a Trace",.. /*
dc460 20 31 34 39 20 2a 2f 20 22 4e 6f 6f 70 22 2c 0d 149 */ "Noop",.
dc470 0a 20 20 20 20 20 2f 2a 20 31 35 30 20 2a 2f 20 . /* 150 */
dc480 22 45 78 70 6c 61 69 6e 22 2c 0d 0a 20 20 7d 3b "Explain",.. };
dc490 0d 0a 20 20 72 65 74 75 72 6e 20 61 7a 4e 61 6d .. return azNam
dc4a0 65 5b 69 5d 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 e[i];..}..#endif
dc4b0 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
dc4c0 2a 2a 2a 20 45 6e 64 20 6f 66 20 6f 70 63 6f 64 *** End of opcod
dc4d0 65 73 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a es.c ***********
dc4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc500 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
dc510 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
dc520 6f 73 5f 6f 73 32 2e 63 20 2a 2a 2a 2a 2a 2a 2a os_os2.c *******
dc530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc550 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
dc560 36 20 46 65 62 20 31 34 0d 0a 2a 2a 0d 0a 2a 2a 6 Feb 14..**..**
dc570 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 The author disc
dc580 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 laims copyright
dc590 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 to this source c
dc5a0 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f ode. In place o
dc5b0 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f f..** a legal no
dc5c0 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 tice, here is a
dc5d0 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a blessing:..**..*
dc5e0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 * May you do
dc5f0 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 good and not evi
dc600 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f l...** May yo
dc610 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 u find forgivene
dc620 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 ss for yourself
dc630 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 and forgive othe
dc640 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 rs...** May y
dc650 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c ou share freely,
dc660 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f never taking mo
dc670 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 re than you give
dc680 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...**..*********
dc690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dc6d0 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
dc6e0 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 is file contains
dc6f0 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 code that is sp
dc700 65 63 69 66 69 63 20 74 6f 20 4f 53 2f 32 2e 0d ecific to OS/2..
dc710 0a 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 20 53 51 4c .*/......#if SQL
dc720 49 54 45 5f 4f 53 5f 4f 53 32 0d 0a 0d 0a 2f 2a ITE_OS_OS2..../*
dc730 0d 0a 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f 75 ..** A Note Abou
dc740 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 74 t Memory Allocat
dc750 69 6f 6e 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ion:..**..** Thi
dc760 73 20 64 72 69 76 65 72 20 75 73 65 73 20 6d 61 s driver uses ma
dc770 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 20 64 69 lloc()/free() di
dc780 72 65 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 rectly rather th
dc790 61 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 an going through
dc7a0 0d 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 2d ..** the SQLite-
dc7b0 77 72 61 70 70 65 72 73 20 73 71 6c 69 74 65 33 wrappers sqlite3
dc7c0 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65 _malloc()/sqlite
dc7d0 33 5f 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65 3_free(). Those
dc7e0 20 77 72 61 70 70 65 72 73 0d 0a 2a 2a 20 61 72 wrappers..** ar
dc7f0 65 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 75 e designed for u
dc800 73 65 20 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 se on embedded s
dc810 79 73 74 65 6d 73 20 77 68 65 72 65 20 6d 65 6d ystems where mem
dc820 6f 72 79 20 69 73 20 73 63 61 72 63 65 20 61 6e ory is scarce an
dc830 64 0d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 d..** malloc fai
dc840 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66 72 65 lures happen fre
dc850 71 75 65 6e 74 6c 79 2e 20 20 4f 53 2f 32 20 64 quently. OS/2 d
dc860 6f 65 73 20 6e 6f 74 20 74 79 70 69 63 61 6c 6c oes not typicall
dc870 79 20 72 75 6e 20 6f 6e 0d 0a 2a 2a 20 65 6d 62 y run on..** emb
dc880 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c 20 61 edded systems, a
dc890 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65 73 20 nd when it does
dc8a0 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 20 6e the developers n
dc8b0 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62 69 67 ormally have big
dc8c0 67 65 72 0d 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 ger..** problems
dc8d0 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 to worry about
dc8e0 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75 74 than running out
dc8f0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f 20 of memory. So
dc900 74 68 65 72 65 20 69 73 20 6e 6f 74 0d 0a 2a 2a there is not..**
dc910 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65 a compelling ne
dc920 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72 ed to use the wr
dc930 61 70 70 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 appers...**..**
dc940 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 67 But there is a g
dc950 6f 6f 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f ood reason to no
dc960 74 20 75 73 65 20 74 68 65 20 77 72 61 70 70 65 t use the wrappe
dc970 72 73 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 rs. If we use t
dc980 68 65 0d 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 he..** wrappers
dc990 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 then we will get
dc9a0 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f simulated mallo
dc9b0 63 28 29 20 66 61 69 6c 75 72 65 73 20 77 69 74 c() failures wit
dc9c0 68 69 6e 20 74 68 69 73 0d 0a 2a 2a 20 64 72 69 hin this..** dri
dc9d0 76 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 63 ver. And that c
dc9e0 61 75 73 65 73 20 61 6c 6c 20 6b 69 6e 64 73 20 auses all kinds
dc9f0 6f 66 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 of problems for
dca00 6f 75 72 20 74 65 73 74 73 2e 20 20 57 65 0d 0a our tests. We..
dca10 2a 2a 20 63 6f 75 6c 64 20 65 6e 68 61 6e 63 65 ** could enhance
dca20 20 53 51 4c 69 74 65 20 74 6f 20 64 65 61 6c 20 SQLite to deal
dca30 77 69 74 68 20 73 69 6d 75 6c 61 74 65 64 20 6d with simulated m
dca40 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 77 alloc failures w
dca50 69 74 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 4f 53 ithin..** the OS
dca60 20 64 72 69 76 65 72 2c 20 62 75 74 20 74 68 65 driver, but the
dca70 20 63 6f 64 65 20 74 6f 20 64 65 61 6c 20 77 69 code to deal wi
dca80 74 68 20 74 68 6f 73 65 20 66 61 69 6c 75 72 65 th those failure
dca90 20 77 6f 75 6c 64 20 6e 6f 74 0d 0a 2a 2a 20 62 would not..** b
dcaa0 65 20 65 78 65 72 63 69 73 65 64 20 6f 6e 20 4c e exercised on L
dcab0 69 6e 75 78 20 28 77 68 69 63 68 20 64 6f 65 73 inux (which does
dcac0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6c not need to mal
dcad0 6c 6f 63 28 29 20 69 6e 20 74 68 65 20 64 72 69 loc() in the dri
dcae0 76 65 72 29 0d 0a 2a 2a 20 61 6e 64 20 73 6f 20 ver)..** and so
dcaf0 77 65 20 77 6f 75 6c 64 20 68 61 76 65 20 64 69 we would have di
dcb00 66 66 69 63 75 6c 74 79 20 77 72 69 74 69 6e 67 fficulty writing
dcb10 20 63 6f 76 65 72 61 67 65 20 74 65 73 74 73 20 coverage tests
dcb20 66 6f 72 20 74 68 61 74 0d 0a 2a 2a 20 63 6f 64 for that..** cod
dcb30 65 2e 20 20 42 65 74 74 65 72 20 74 6f 20 6c 65 e. Better to le
dcb40 61 76 65 20 74 68 65 20 63 6f 64 65 20 6f 75 74 ave the code out
dcb50 2c 20 77 65 20 74 68 69 6e 6b 2e 0d 0a 2a 2a 0d , we think...**.
dcb60 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 .** The point of
dcb70 20 74 68 69 73 20 64 69 73 63 75 73 73 69 6f 6e this discussion
dcb80 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 is as follows:
dcb90 20 57 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 When creating a
dcba0 20 6e 65 77 0d 0a 2a 2a 20 4f 53 20 6c 61 79 65 new..** OS laye
dcbb0 72 20 66 6f 72 20 61 6e 20 65 6d 62 65 64 64 65 r for an embedde
dcbc0 64 20 73 79 73 74 65 6d 2c 20 69 66 20 79 6f 75 d system, if you
dcbd0 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 61 use this file a
dcbe0 73 20 61 6e 20 65 78 61 6d 70 6c 65 2c 0d 0a 2a s an example,..*
dcbf0 2a 20 61 76 6f 69 64 20 74 68 65 20 75 73 65 20 * avoid the use
dcc00 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65 of malloc()/free
dcc10 28 29 2e 20 20 54 68 6f 73 65 20 72 6f 75 74 69 (). Those routi
dcc20 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f 6e 20 4f nes work ok on O
dcc30 53 2f 32 0d 0a 2a 2a 20 64 65 73 6b 74 6f 70 73 S/2..** desktops
dcc40 20 62 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c 6c but not so well
dcc50 20 69 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 in embedded sys
dcc60 74 65 6d 73 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d tems...*/..../*.
dcc70 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20 .** Macros used
dcc80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 to determine whe
dcc90 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75 ther or not to u
dcca0 73 65 20 74 68 72 65 61 64 73 2e 0d 0a 2a 2f 0d se threads...*/.
dccb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
dccc0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 ITE_THREADSAFE)
dccd0 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 && SQLITE_THREAD
dcce0 53 41 46 45 0d 0a 23 20 64 65 66 69 6e 65 20 53 SAFE..# define S
dccf0 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52 45 41 44 QLITE_OS2_THREAD
dcd00 53 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f S 1..#endif..../
dcd10 2a 0d 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f *..** Include co
dcd20 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f de that is commo
dcd30 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 n to all os_*.c
dcd40 66 69 6c 65 73 0d 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a files..*/../****
dcd50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 ********** Inclu
dcd60 64 65 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 69 de os_common.h i
dcd70 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 n the middle of
dcd80 6f 73 5f 6f 73 32 2e 63 20 2a 2a 2a 2a 2a 2a 2a os_os2.c *******
dcd90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
dcda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
dcdb0 6e 20 66 69 6c 65 20 6f 73 5f 63 6f 6d 6d 6f 6e n file os_common
dcdc0 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .h *************
dcdd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dcde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
dcdf0 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32 32 0d .** 2004 May 22.
dce00 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 .**..** The auth
dce10 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
dce20 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
dce30 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
dce40 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c place of..** a l
dce50 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 egal notice, her
dce60 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a e is a blessing:
dce70 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 ..**..** May
dce80 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 you do good and
dce90 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 not evil...**
dcea0 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f May you find fo
dceb0 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f rgiveness for yo
dcec0 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 urself and forgi
dced0 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 ve others...**
dcee0 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
dcef0 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
dcf00 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
dcf10 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ou give...**..**
dcf20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dcf30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dcf40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dcf50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dcf60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
dcf70 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 ..** This file c
dcf80 6f 6e 74 61 69 6e 73 20 6d 61 63 72 6f 73 20 61 ontains macros a
dcf90 6e 64 20 61 20 6c 69 74 74 6c 65 20 62 69 74 20 nd a little bit
dcfa0 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 of code that is
dcfb0 63 6f 6d 6d 6f 6e 20 74 6f 0d 0a 2a 2a 20 61 6c common to..** al
dcfc0 6c 20 6f 66 20 74 68 65 20 70 6c 61 74 66 6f 72 l of the platfor
dcfd0 6d 2d 73 70 65 63 69 66 69 63 20 66 69 6c 65 73 m-specific files
dcfe0 20 28 6f 73 5f 2a 2e 63 29 20 61 6e 64 20 69 73 (os_*.c) and is
dcff0 20 23 69 6e 63 6c 75 64 65 64 20 69 6e 74 6f 20 #included into
dd000 74 68 6f 73 65 0d 0a 2a 2a 20 66 69 6c 65 73 2e those..** files.
dd010 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 ..**..** This fi
dd020 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 23 69 6e le should be #in
dd030 63 6c 75 64 65 64 20 62 79 20 74 68 65 20 6f 73 cluded by the os
dd040 5f 2a 2e 63 20 66 69 6c 65 73 20 6f 6e 6c 79 2e _*.c files only.
dd050 20 20 49 74 20 69 73 20 6e 6f 74 20 61 0d 0a 2a It is not a..*
dd060 2a 20 67 65 6e 65 72 61 6c 20 70 75 72 70 6f 73 * general purpos
dd070 65 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0d 0a e header file...
dd080 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 4f 53 5f */..#ifndef _OS_
dd090 43 4f 4d 4d 4f 4e 5f 48 5f 0d 0a 23 64 65 66 69 COMMON_H_..#defi
dd0a0 6e 65 20 5f 4f 53 5f 43 4f 4d 4d 4f 4e 5f 48 5f ne _OS_COMMON_H_
dd0b0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 74 20 6c 65 ..../*..** At le
dd0c0 61 73 74 20 74 77 6f 20 62 75 67 73 20 68 61 76 ast two bugs hav
dd0d0 65 20 73 6c 69 70 70 65 64 20 69 6e 20 62 65 63 e slipped in bec
dd0e0 61 75 73 65 20 77 65 20 63 68 61 6e 67 65 64 20 ause we changed
dd0f0 74 68 65 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 the MEMORY_DEBUG
dd100 0d 0a 2a 2a 20 6d 61 63 72 6f 20 74 6f 20 53 51 ..** macro to SQ
dd110 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64 20 73 LITE_DEBUG and s
dd120 6f 6d 65 20 6f 6c 64 65 72 20 6d 61 6b 65 66 69 ome older makefi
dd130 6c 65 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 les have not yet
dd140 20 6d 61 64 65 20 74 68 65 0d 0a 2a 2a 20 73 77 made the..** sw
dd150 69 74 63 68 2e 20 20 54 68 65 20 66 6f 6c 6c 6f itch. The follo
dd160 77 69 6e 67 20 63 6f 64 65 20 73 68 6f 75 6c 64 wing code should
dd170 20 63 61 74 63 68 20 74 68 69 73 20 70 72 6f 62 catch this prob
dd180 6c 65 6d 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 lem at compile-t
dd190 69 6d 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 ime...*/..#ifdef
dd1a0 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0d 0a 23 MEMORY_DEBUG..#
dd1b0 20 65 72 72 6f 72 20 22 54 68 65 20 4d 45 4d 4f error "The MEMO
dd1c0 52 59 5f 44 45 42 55 47 20 6d 61 63 72 6f 20 69 RY_DEBUG macro i
dd1d0 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 55 73 65 s obsolete. Use
dd1e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 6e SQLITE_DEBUG in
dd1f0 73 74 65 61 64 2e 22 0d 0a 23 65 6e 64 69 66 0d stead."..#endif.
dd200 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 ...#if defined(S
dd210 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 QLITE_TEST) && d
dd220 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 efined(SQLITE_DE
dd230 42 55 47 29 0d 0a 23 20 69 66 6e 64 65 66 20 53 BUG)..# ifndef S
dd240 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 QLITE_DEBUG_OS_T
dd250 52 41 43 45 0d 0a 23 20 20 20 64 65 66 69 6e 65 RACE..# define
dd260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 SQLITE_DEBUG_OS
dd270 5f 54 52 41 43 45 20 30 0d 0a 23 20 65 6e 64 69 _TRACE 0..# endi
dd280 66 0d 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 f.. int sqlite3
dd290 4f 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45 OSTrace = SQLITE
dd2a0 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b _DEBUG_OS_TRACE;
dd2b0 0d 0a 23 20 64 65 66 69 6e 65 20 4f 53 54 52 41 ..# define OSTRA
dd2c0 43 45 28 58 29 20 20 20 20 20 20 20 20 20 20 69 CE(X) i
dd2d0 66 28 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 f( sqlite3OSTrac
dd2e0 65 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 e ) sqlite3Debug
dd2f0 50 72 69 6e 74 66 20 58 0d 0a 23 65 6c 73 65 0d Printf X..#else.
dd300 0a 23 20 64 65 66 69 6e 65 20 4f 53 54 52 41 43 .# define OSTRAC
dd310 45 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a E(X)..#endif....
dd320 2f 2a 0d 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f /*..** Macros fo
dd330 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 72 r performance tr
dd340 61 63 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 acing. Normally
dd350 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20 4f 6e turned off. On
dd360 6c 79 20 77 6f 72 6b 73 0d 0a 2a 2a 20 6f 6e 20 ly works..** on
dd370 69 34 38 36 20 68 61 72 64 77 61 72 65 2e 0d 0a i486 hardware...
dd380 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
dd390 45 5f 50 45 52 46 4f 52 4d 41 4e 43 45 5f 54 52 E_PERFORMANCE_TR
dd3a0 41 43 45 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 68 ACE..../* ..** h
dd3b0 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 wtime.h contains
dd3c0 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 inline assemble
dd3d0 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 r code for imple
dd3e0 6d 65 6e 74 69 6e 67 20 0d 0a 2a 2a 20 68 69 67 menting ..** hig
dd3f0 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 h-performance ti
dd400 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0d 0a ming routines...
dd410 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */../***********
dd420 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 68 77 74 69 *** Include hwti
dd430 6d 65 2e 68 20 69 6e 20 74 68 65 20 6d 69 64 64 me.h in the midd
dd440 6c 65 20 6f 66 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e le of os_common.
dd450 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
dd460 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
dd470 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
dd480 68 77 74 69 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a hwtime.h *******
dd490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd4b0 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
dd4c0 38 20 4d 61 79 20 32 37 0d 0a 2a 2a 0d 0a 2a 2a 8 May 27..**..**
dd4d0 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 The author disc
dd4e0 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 laims copyright
dd4f0 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 to this source c
dd500 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f ode. In place o
dd510 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f f..** a legal no
dd520 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 tice, here is a
dd530 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a blessing:..**..*
dd540 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 * May you do
dd550 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 good and not evi
dd560 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f l...** May yo
dd570 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 u find forgivene
dd580 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 ss for yourself
dd590 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 and forgive othe
dd5a0 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 rs...** May y
dd5b0 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c ou share freely,
dd5c0 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f never taking mo
dd5d0 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 re than you give
dd5e0 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...**..*********
dd5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dd630 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
dd640 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 is file contains
dd650 20 69 6e 6c 69 6e 65 20 61 73 6d 20 63 6f 64 65 inline asm code
dd660 20 66 6f 72 20 72 65 74 72 69 65 76 69 6e 67 20 for retrieving
dd670 22 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 "high-performanc
dd680 65 22 0d 0a 2a 2a 20 63 6f 75 6e 74 65 72 73 20 e"..** counters
dd690 66 6f 72 20 78 38 36 20 63 6c 61 73 73 20 43 50 for x86 class CP
dd6a0 55 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 Us...*/..#ifndef
dd6b0 20 5f 48 57 54 49 4d 45 5f 48 5f 0d 0a 23 64 65 _HWTIME_H_..#de
dd6c0 66 69 6e 65 20 5f 48 57 54 49 4d 45 5f 48 5f 0d fine _HWTIME_H_.
dd6d0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f .../*..** The fo
dd6e0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 llowing routine
dd6f0 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 only works on pe
dd700 6e 74 69 75 6d 2d 63 6c 61 73 73 20 28 6f 72 20 ntium-class (or
dd710 6e 65 77 65 72 29 20 70 72 6f 63 65 73 73 6f 72 newer) processor
dd720 73 2e 0d 0a 2a 2a 20 49 74 20 75 73 65 73 20 74 s...** It uses t
dd730 68 65 20 52 44 54 53 43 20 6f 70 63 6f 64 65 20 he RDTSC opcode
dd740 74 6f 20 72 65 61 64 20 74 68 65 20 63 79 63 6c to read the cycl
dd750 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 20 6f 75 e count value ou
dd760 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 70 72 6f t of the..** pro
dd770 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74 75 72 cessor and retur
dd780 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e 20 20 ns that value.
dd790 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 This can be used
dd7a0 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0d 0a 2a for high-res..*
dd7b0 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0d 0a 2a 2f * profiling...*/
dd7c0 0d 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f ..#if (defined(_
dd7d0 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 _GNUC__) || defi
dd7e0 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 29 20 26 ned(_MSC_VER)) &
dd7f0 26 20 5c 0d 0a 20 20 20 20 20 20 28 64 65 66 69 & \.. (defi
dd800 6e 65 64 28 69 33 38 36 29 20 7c 7c 20 64 65 66 ned(i386) || def
dd810 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20 7c ined(__i386__) |
dd820 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 | defined(_M_IX8
dd830 36 29 29 0d 0a 0d 0a 20 20 23 69 66 20 64 65 66 6)).... #if def
dd840 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0d 0a ined(__GNUC__)..
dd850 0d 0a 20 20 5f 5f 69 6e 6c 69 6e 65 5f 5f 20 73 .. __inline__ s
dd860 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 73 71 6c qlite_uint64 sql
dd870 69 74 65 33 48 77 74 69 6d 65 28 76 6f 69 64 29 ite3Hwtime(void)
dd880 7b 0d 0a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 {.. unsigned
dd890 20 69 6e 74 20 6c 6f 2c 20 68 69 3b 0d 0a 20 20 int lo, hi;..
dd8a0 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c __asm__ __vol
dd8b0 61 74 69 6c 65 5f 5f 20 28 22 72 64 74 73 63 22 atile__ ("rdtsc"
dd8c0 20 3a 20 22 3d 61 22 20 28 6c 6f 29 2c 20 22 3d : "=a" (lo), "=
dd8d0 64 22 20 28 68 69 29 29 3b 0d 0a 20 20 20 20 20 d" (hi));..
dd8e0 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 5f 75 return (sqlite_u
dd8f0 69 6e 74 36 34 29 68 69 20 3c 3c 20 33 32 20 7c int64)hi << 32 |
dd900 20 6c 6f 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 lo;.. }.... #
dd910 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 elif defined(_MS
dd920 43 5f 56 45 52 29 0d 0a 0d 0a 20 20 5f 5f 64 65 C_VER).... __de
dd930 63 6c 73 70 65 63 28 6e 61 6b 65 64 29 20 5f 5f clspec(naked) __
dd940 69 6e 6c 69 6e 65 20 73 71 6c 69 74 65 5f 75 69 inline sqlite_ui
dd950 6e 74 36 34 20 5f 5f 63 64 65 63 6c 20 73 71 6c nt64 __cdecl sql
dd960 69 74 65 33 48 77 74 69 6d 65 28 76 6f 69 64 29 ite3Hwtime(void)
dd970 7b 0d 0a 20 20 20 20 20 5f 5f 61 73 6d 20 7b 0d {.. __asm {.
dd980 0a 20 20 20 20 20 20 20 20 72 64 74 73 63 0d 0a . rdtsc..
dd990 20 20 20 20 20 20 20 20 72 65 74 20 20 20 20 20 ret
dd9a0 20 20 3b 20 72 65 74 75 72 6e 20 76 61 6c 75 65 ; return value
dd9b0 20 61 74 20 45 44 58 3a 45 41 58 0d 0a 20 20 20 at EDX:EAX..
dd9c0 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 65 }.. }.... #e
dd9d0 6e 64 69 66 0d 0a 0d 0a 23 65 6c 69 66 20 28 64 ndif....#elif (d
dd9e0 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
dd9f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 && defined(__x8
dda00 36 5f 36 34 5f 5f 29 29 0d 0a 0d 0a 20 20 5f 5f 6_64__)).... __
dda10 69 6e 6c 69 6e 65 5f 5f 20 73 71 6c 69 74 65 5f inline__ sqlite_
dda20 75 69 6e 74 36 34 20 73 71 6c 69 74 65 33 48 77 uint64 sqlite3Hw
dda30 74 69 6d 65 28 76 6f 69 64 29 7b 0d 0a 20 20 20 time(void){..
dda40 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
dda50 20 76 61 6c 3b 0d 0a 20 20 20 20 20 20 5f 5f 61 val;.. __a
dda60 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f sm__ __volatile_
dda70 5f 20 28 22 72 64 74 73 63 22 20 3a 20 22 3d 41 _ ("rdtsc" : "=A
dda80 22 20 28 76 61 6c 29 29 3b 0d 0a 20 20 20 20 20 " (val));..
dda90 20 72 65 74 75 72 6e 20 76 61 6c 3b 0d 0a 20 20 return val;..
ddaa0 7d 0d 0a 20 0d 0a 23 65 6c 69 66 20 28 64 65 66 }.. ..#elif (def
ddab0 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26 ined(__GNUC__) &
ddac0 26 20 64 65 66 69 6e 65 64 28 5f 5f 70 70 63 5f & defined(__ppc_
ddad0 5f 29 29 0d 0a 0d 0a 20 20 5f 5f 69 6e 6c 69 6e _)).... __inlin
ddae0 65 5f 5f 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 e__ sqlite_uint6
ddaf0 34 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 4 sqlite3Hwtime(
ddb00 76 6f 69 64 29 7b 0d 0a 20 20 20 20 20 20 75 6e void){.. un
ddb10 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 signed long long
ddb20 20 72 65 74 76 61 6c 3b 0d 0a 20 20 20 20 20 20 retval;..
ddb30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6a 75 unsigned long ju
ddb40 6e 6b 3b 0d 0a 20 20 20 20 20 20 5f 5f 61 73 6d nk;.. __asm
ddb50 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 __ __volatile__
ddb60 28 22 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 20 ("\n\..
ddb70 20 31 3a 20 20 20 20 20 20 6d 66 74 62 75 20 20 1: mftbu
ddb80 20 25 31 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 %1\n\..
ddb90 20 20 20 20 20 20 20 20 20 20 6d 66 74 62 20 20 mftb
ddba0 20 20 25 4c 30 5c 6e 5c 0d 0a 20 20 20 20 20 20 %L0\n\..
ddbb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 66 74 62 mftb
ddbc0 75 20 20 20 25 30 5c 6e 5c 0d 0a 20 20 20 20 20 u %0\n\..
ddbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 70 cmp
ddbe0 77 20 20 20 20 25 30 2c 25 31 5c 6e 5c 0d 0a 20 w %0,%1\n\..
ddbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ddc00 20 62 6e 65 20 20 20 20 20 31 62 22 0d 0a 20 20 bne 1b"..
ddc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ddc20 3a 20 22 3d 72 22 20 28 72 65 74 76 61 6c 29 2c : "=r" (retval),
ddc30 20 22 3d 72 22 20 28 6a 75 6e 6b 29 29 3b 0d 0a "=r" (junk));..
ddc40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 return ret
ddc50 76 61 6c 3b 0d 0a 20 20 7d 0d 0a 0d 0a 23 65 6c val;.. }....#el
ddc60 73 65 0d 0a 0d 0a 20 20 23 65 72 72 6f 72 20 4e se.... #error N
ddc70 65 65 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 eed implementati
ddc80 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 48 77 74 on of sqlite3Hwt
ddc90 69 6d 65 28 29 20 66 6f 72 20 79 6f 75 72 20 70 ime() for your p
ddca0 6c 61 74 66 6f 72 6d 2e 0d 0a 0d 0a 20 20 2f 2a latform..... /*
ddcb0 0d 0a 20 20 2a 2a 20 54 6f 20 63 6f 6d 70 69 6c .. ** To compil
ddcc0 65 20 77 69 74 68 6f 75 74 20 69 6d 70 6c 65 6d e without implem
ddcd0 65 6e 74 69 6e 67 20 73 71 6c 69 74 65 33 48 77 enting sqlite3Hw
ddce0 74 69 6d 65 28 29 20 66 6f 72 20 79 6f 75 72 20 time() for your
ddcf0 70 6c 61 74 66 6f 72 6d 2c 0d 0a 20 20 2a 2a 20 platform,.. **
ddd00 79 6f 75 20 63 61 6e 20 72 65 6d 6f 76 65 20 74 you can remove t
ddd10 68 65 20 61 62 6f 76 65 20 23 65 72 72 6f 72 20 he above #error
ddd20 61 6e 64 20 75 73 65 20 74 68 65 20 66 6f 6c 6c and use the foll
ddd30 6f 77 69 6e 67 0d 0a 20 20 2a 2a 20 73 74 75 62 owing.. ** stub
ddd40 20 66 75 6e 63 74 69 6f 6e 2e 20 20 59 6f 75 20 function. You
ddd50 77 69 6c 6c 20 6c 6f 73 65 20 74 69 6d 69 6e 67 will lose timing
ddd60 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6d 61 6e support for man
ddd70 79 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 y.. ** of the d
ddd80 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65 73 ebugging and tes
ddd90 74 69 6e 67 20 75 74 69 6c 69 74 69 65 73 2c 20 ting utilities,
ddda0 62 75 74 20 69 74 20 73 68 6f 75 6c 64 20 61 74 but it should at
dddb0 0d 0a 20 20 2a 2a 20 6c 65 61 73 74 20 63 6f 6d .. ** least com
dddc0 70 69 6c 65 20 61 6e 64 20 72 75 6e 2e 0d 0a 20 pile and run...
dddd0 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 */..SQLITE_PRIV
ddde0 41 54 45 20 20 20 73 71 6c 69 74 65 5f 75 69 6e ATE sqlite_uin
dddf0 74 36 34 20 73 71 6c 69 74 65 33 48 77 74 69 6d t64 sqlite3Hwtim
dde00 65 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 e(void){ return
dde10 28 28 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 ((sqlite_uint64)
dde20 30 29 3b 20 7d 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0); }....#endif.
dde30 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 ...#endif /* !de
dde40 66 69 6e 65 64 28 5f 48 57 54 49 4d 45 5f 48 5f fined(_HWTIME_H_
dde50 29 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a ) */..../*******
dde60 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 68 ******* End of h
dde70 77 74 69 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a wtime.h ********
dde80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dde90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ddea0 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
ddeb0 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 ******** Continu
ddec0 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 ing where we lef
dded0 74 20 6f 66 66 20 69 6e 20 6f 73 5f 63 6f 6d 6d t off in os_comm
ddee0 6f 6e 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a on.h ***********
ddef0 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 73 74 61 74 *******/....stat
ddf00 69 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 ic sqlite_uint64
ddf10 20 67 5f 73 74 61 72 74 3b 0d 0a 73 74 61 74 69 g_start;..stati
ddf20 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 c sqlite_uint64
ddf30 67 5f 65 6c 61 70 73 65 64 3b 0d 0a 23 64 65 66 g_elapsed;..#def
ddf40 69 6e 65 20 54 49 4d 45 52 5f 53 54 41 52 54 20 ine TIMER_START
ddf50 20 20 20 20 20 20 67 5f 73 74 61 72 74 3d 73 71 g_start=sq
ddf60 6c 69 74 65 33 48 77 74 69 6d 65 28 29 0d 0a 23 lite3Hwtime()..#
ddf70 64 65 66 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 define TIMER_END
ddf80 20 20 20 20 20 20 20 20 20 67 5f 65 6c 61 70 73 g_elaps
ddf90 65 64 3d 73 71 6c 69 74 65 33 48 77 74 69 6d 65 ed=sqlite3Hwtime
ddfa0 28 29 2d 67 5f 73 74 61 72 74 0d 0a 23 64 65 66 ()-g_start..#def
ddfb0 69 6e 65 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 ine TIMER_ELAPSE
ddfc0 44 20 20 20 20 20 67 5f 65 6c 61 70 73 65 64 0d D g_elapsed.
ddfd0 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 .#else..#define
ddfe0 54 49 4d 45 52 5f 53 54 41 52 54 0d 0a 23 64 65 TIMER_START..#de
ddff0 66 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 0d 0a fine TIMER_END..
de000 23 64 65 66 69 6e 65 20 54 49 4d 45 52 5f 45 4c #define TIMER_EL
de010 41 50 53 45 44 20 20 20 20 20 28 28 73 71 6c 69 APSED ((sqli
de020 74 65 5f 75 69 6e 74 36 34 29 30 29 0d 0a 23 65 te_uint64)0)..#e
de030 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ndif..../*..** I
de040 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 f we compile wit
de050 68 20 74 68 65 20 53 51 4c 49 54 45 5f 54 45 53 h the SQLITE_TES
de060 54 20 6d 61 63 72 6f 20 73 65 74 2c 20 74 68 65 T macro set, the
de070 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 n the following
de080 62 6c 6f 63 6b 0d 0a 2a 2a 20 6f 66 20 63 6f 64 block..** of cod
de090 65 20 77 69 6c 6c 20 67 69 76 65 20 75 73 20 74 e will give us t
de0a0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 73 69 he ability to si
de0b0 6d 75 6c 61 74 65 20 61 20 64 69 73 6b 20 49 2f mulate a disk I/
de0c0 4f 20 65 72 72 6f 72 2e 20 20 54 68 69 73 0d 0a O error. This..
de0d0 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 ** is used for t
de0e0 65 73 74 69 6e 67 20 74 68 65 20 49 2f 4f 20 72 esting the I/O r
de0f0 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0d 0a ecovery logic...
de100 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
de110 45 5f 54 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 E_TEST..SQLITE_A
de120 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 PI int sqlite3_i
de130 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b o_error_hit = 0;
de140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
de150 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 49 otal number of I
de160 2f 4f 20 45 72 72 6f 72 73 20 2a 2f 0d 0a 53 51 /O Errors */..SQ
de170 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
de180 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 ite3_io_error_ha
de190 72 64 68 69 74 20 3d 20 30 3b 20 20 20 20 20 20 rdhit = 0;
de1a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e /* Number of n
de1b0 6f 6e 2d 62 65 6e 69 67 6e 20 65 72 72 6f 72 73 on-benign errors
de1c0 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 */..SQLITE_API
de1d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 int sqlite3_io_e
de1e0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 rror_pending = 0
de1f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e ; /* Coun
de200 74 20 64 6f 77 6e 20 74 6f 20 66 69 72 73 74 20 t down to first
de210 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0d 0a 53 51 I/O error */..SQ
de220 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
de230 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 ite3_io_error_pe
de240 72 73 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 rsist = 0;
de250 20 20 2f 2a 20 54 72 75 65 20 69 66 20 49 2f 4f /* True if I/O
de260 20 65 72 72 6f 72 73 20 70 65 72 73 69 73 74 20 errors persist
de270 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
de280 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 nt sqlite3_io_er
de290 72 6f 72 5f 62 65 6e 69 67 6e 20 3d 20 30 3b 20 ror_benign = 0;
de2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
de2b0 69 66 20 65 72 72 6f 72 73 20 61 72 65 20 62 65 if errors are be
de2c0 6e 69 67 6e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f nign */..SQLITE_
de2d0 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
de2e0 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 diskfull_pending
de2f0 20 3d 20 30 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 = 0;..SQLITE_AP
de300 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 I int sqlite3_di
de310 73 6b 66 75 6c 6c 20 3d 20 30 3b 0d 0a 23 64 65 skfull = 0;..#de
de320 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 fine SimulateIOE
de330 72 72 6f 72 42 65 6e 69 67 6e 28 58 29 20 73 71 rrorBenign(X) sq
de340 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 62 lite3_io_error_b
de350 65 6e 69 67 6e 3d 28 58 29 0d 0a 23 64 65 66 69 enign=(X)..#defi
de360 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 ne SimulateIOErr
de370 6f 72 28 43 4f 44 45 29 20 20 5c 0d 0a 20 20 69 or(CODE) \.. i
de380 66 28 20 28 73 71 6c 69 74 65 33 5f 69 6f 5f 65 f( (sqlite3_io_e
de390 72 72 6f 72 5f 70 65 72 73 69 73 74 20 26 26 20 rror_persist &&
de3a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 sqlite3_io_error
de3b0 5f 68 69 74 29 20 5c 0d 0a 20 20 20 20 20 20 20 _hit) \..
de3c0 7c 7c 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 || sqlite3_io_er
de3d0 72 6f 72 5f 70 65 6e 64 69 6e 67 2d 2d 20 3d 3d ror_pending-- ==
de3e0 20 31 20 29 20 20 5c 0d 0a 20 20 20 20 20 20 20 1 ) \..
de3f0 20 20 20 20 20 20 20 7b 20 6c 6f 63 61 6c 5f 69 { local_i
de400 6f 65 72 72 28 29 3b 20 43 4f 44 45 3b 20 7d 0d oerr(); CODE; }.
de410 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 63 .static void loc
de420 61 6c 5f 69 6f 65 72 72 28 29 7b 0d 0a 20 20 49 al_ioerr(){.. I
de430 4f 54 52 41 43 45 28 28 22 49 4f 45 52 52 5c 6e OTRACE(("IOERR\n
de440 22 29 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f "));.. sqlite3_
de450 69 6f 5f 65 72 72 6f 72 5f 68 69 74 2b 2b 3b 0d io_error_hit++;.
de460 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f . if( !sqlite3_
de470 69 6f 5f 65 72 72 6f 72 5f 62 65 6e 69 67 6e 20 io_error_benign
de480 29 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 ) sqlite3_io_err
de490 6f 72 5f 68 61 72 64 68 69 74 2b 2b 3b 0d 0a 7d or_hardhit++;..}
de4a0 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 ..#define Simula
de4b0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 teDiskfullError(
de4c0 43 4f 44 45 29 20 5c 0d 0a 20 20 20 69 66 28 20 CODE) \.. if(
de4d0 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c sqlite3_diskfull
de4e0 5f 70 65 6e 64 69 6e 67 20 29 7b 20 5c 0d 0a 20 _pending ){ \..
de4f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f if( sqlite3_
de500 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 diskfull_pending
de510 20 3d 3d 20 31 20 29 7b 20 5c 0d 0a 20 20 20 20 == 1 ){ \..
de520 20 20 20 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29 local_ioerr()
de530 3b 20 5c 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 ; \.. sqli
de540 74 65 33 5f 64 69 73 6b 66 75 6c 6c 20 3d 20 31 te3_diskfull = 1
de550 3b 20 5c 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 ; \.. sqli
de560 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 te3_io_error_hit
de570 20 3d 20 31 3b 20 5c 0d 0a 20 20 20 20 20 20 20 = 1; \..
de580 43 4f 44 45 3b 20 5c 0d 0a 20 20 20 20 20 7d 65 CODE; \.. }e
de590 6c 73 65 7b 20 5c 0d 0a 20 20 20 20 20 20 20 73 lse{ \.. s
de5a0 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c 5f qlite3_diskfull_
de5b0 70 65 6e 64 69 6e 67 2d 2d 3b 20 5c 0d 0a 20 20 pending--; \..
de5c0 20 20 20 7d 20 5c 0d 0a 20 20 20 7d 0d 0a 23 65 } \.. }..#e
de5d0 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d lse..#define Sim
de5e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
de5f0 67 6e 28 58 29 0d 0a 23 64 65 66 69 6e 65 20 53 gn(X)..#define S
de600 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 41 imulateIOError(A
de610 29 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 6c )..#define Simul
de620 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 ateDiskfullError
de630 28 41 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f (A)..#endif..../
de640 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 *..** When testi
de650 6e 67 2c 20 6b 65 65 70 20 61 20 63 6f 75 6e 74 ng, keep a count
de660 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f of the number o
de670 66 20 6f 70 65 6e 20 66 69 6c 65 73 2e 0d 0a 2a f open files...*
de680 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
de690 5f 54 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 _TEST..SQLITE_AP
de6a0 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 I int sqlite3_op
de6b0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 3d 20 en_file_count =
de6c0 30 3b 0d 0a 23 64 65 66 69 6e 65 20 4f 70 65 6e 0;..#define Open
de6d0 43 6f 75 6e 74 65 72 28 58 29 20 20 73 71 6c 69 Counter(X) sqli
de6e0 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f te3_open_file_co
de6f0 75 6e 74 2b 3d 28 58 29 0d 0a 23 65 6c 73 65 0d unt+=(X)..#else.
de700 0a 23 64 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 .#define OpenCou
de710 6e 74 65 72 28 58 29 0d 0a 23 65 6e 64 69 66 0d nter(X)..#endif.
de720 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 ...#endif /* !de
de730 66 69 6e 65 64 28 5f 4f 53 5f 43 4f 4d 4d 4f 4e fined(_OS_COMMON
de740 5f 48 5f 29 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a _H_) */..../****
de750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
de760 66 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 2a 2a f os_common.h **
de770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
de780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
de790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
de7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 *********** Cont
de7b0 69 6e 75 69 6e 67 20 77 68 65 72 65 20 77 65 20 inuing where we
de7c0 6c 65 66 74 20 6f 66 66 20 69 6e 20 6f 73 5f 6f left off in os_o
de7d0 73 32 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a s2.c ***********
de7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f **********/..../
de7f0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 * Forward refere
de800 6e 63 65 73 20 2a 2f 0d 0a 74 79 70 65 64 65 66 nces */..typedef
de810 20 73 74 72 75 63 74 20 6f 73 32 46 69 6c 65 20 struct os2File
de820 6f 73 32 46 69 6c 65 3b 20 20 20 20 20 20 20 20 os2File;
de830 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 73 74 72 /* The file str
de840 75 63 74 75 72 65 20 2a 2f 0d 0a 74 79 70 65 64 ucture */..typed
de850 65 66 20 73 74 72 75 63 74 20 6f 73 32 53 68 6d ef struct os2Shm
de860 4e 6f 64 65 20 6f 73 32 53 68 6d 4e 6f 64 65 3b Node os2ShmNode;
de870 20 20 20 2f 2a 20 41 20 73 68 61 72 65 64 20 64 /* A shared d
de880 65 73 63 72 69 74 69 76 65 20 6d 65 6d 6f 72 79 escritive memory
de890 20 6e 6f 64 65 20 2a 2f 0d 0a 74 79 70 65 64 65 node */..typede
de8a0 66 20 73 74 72 75 63 74 20 6f 73 32 53 68 6d 4c f struct os2ShmL
de8b0 69 6e 6b 20 6f 73 32 53 68 6d 4c 69 6e 6b 3b 20 ink os2ShmLink;
de8c0 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f /* A connectio
de8d0 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f n to shared-memo
de8e0 72 79 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ry */..../*..**
de8f0 54 68 65 20 6f 73 32 46 69 6c 65 20 73 74 72 75 The os2File stru
de900 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 cture is subclas
de910 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c s of sqlite3_fil
de920 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 e specific for t
de930 68 65 20 4f 53 2f 32 0d 0a 2a 2a 20 70 72 6f 74 he OS/2..** prot
de940 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0d 0a ability layer...
de950 2a 2f 0d 0a 73 74 72 75 63 74 20 6f 73 32 46 69 */..struct os2Fi
de960 6c 65 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 73 71 le {.. const sq
de970 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
de980 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 *pMethod; /* A
de990 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 lways the first
de9a0 65 6e 74 72 79 20 2a 2f 0d 0a 20 20 48 46 49 4c entry */.. HFIL
de9b0 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 E h;
de9c0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 /* Handle
de9d0 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 for accessing th
de9e0 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 e file */.. int
de9f0 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 flags;
dea00 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 /* Flags
dea10 70 72 6f 76 69 64 65 64 20 74 6f 20 6f 73 32 4f provided to os2O
dea20 70 65 6e 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 pen() */.. int
dea30 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 locktype;
dea40 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 /* Type of
dea50 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 lock currently
dea60 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c held on this fil
dea70 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 43 68 e */.. int szCh
dea80 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 unk;
dea90 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 /* Chunk size
deaa0 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 configured by FC
deab0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a NTL_CHUNK_SIZE *
deac0 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c /.. char *zFull
dead0 50 61 74 68 43 70 3b 20 20 20 20 20 20 20 20 2f PathCp; /
deae0 2a 20 46 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 * Full path name
deaf0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f of this file */
deb00 0d 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a .. os2ShmLink *
deb10 70 53 68 6d 4c 69 6e 6b 3b 20 20 20 20 20 2f 2a pShmLink; /*
deb20 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 Instance of sha
deb30 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 red memory on th
deb40 69 73 20 66 69 6c 65 20 2a 2f 0d 0a 7d 3b 0d 0a is file */..};..
deb50 0d 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 5f 54 ..#define LOCK_T
deb60 49 4d 45 4f 55 54 20 31 30 4c 20 2f 2a 20 74 68 IMEOUT 10L /* th
deb70 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e e default lockin
deb80 67 20 74 69 6d 65 6f 75 74 20 2a 2f 0d 0a 0d 0a g timeout */....
deb90 2f 2a 0d 0a 2a 2a 20 4d 69 73 73 69 6e 67 20 66 /*..** Missing f
deba0 72 6f 6d 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e rom some version
debb0 73 20 6f 66 20 74 68 65 20 4f 53 2f 32 20 74 6f s of the OS/2 to
debc0 6f 6c 6b 69 74 20 2d 0d 0a 2a 2a 20 75 73 65 64 olkit -..** used
debd0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 72 6f to allocate fro
debe0 6d 20 68 69 67 68 20 6d 65 6d 6f 72 79 20 69 66 m high memory if
debf0 20 70 6f 73 73 69 62 6c 65 0d 0a 2a 2f 0d 0a 23 possible..*/..#
dec00 69 66 6e 64 65 66 20 4f 42 4a 5f 41 4e 59 0d 0a ifndef OBJ_ANY..
dec10 23 20 64 65 66 69 6e 65 20 4f 42 4a 5f 41 4e 59 # define OBJ_ANY
dec20 20 30 78 30 30 30 30 30 34 30 30 0d 0a 23 65 6e 0x00000400..#en
dec30 64 69 66 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a dif..../********
dec40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dec50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dec60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dec70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
dec80 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6e 65 *****..** The ne
dec90 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 xt group of rout
deca0 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 ines implement t
decb0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 he I/O methods s
decc0 70 65 63 69 66 69 65 64 0d 0a 2a 2a 20 62 79 20 pecified..** by
decd0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d the sqlite3_io_m
dece0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0d 0a ethods object...
decf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ded00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ded10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ded20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ded30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
ded40 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 20 .../*..** Close
ded50 61 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 a file...*/..sta
ded60 74 69 63 20 69 6e 74 20 6f 73 32 43 6c 6f 73 65 tic int os2Close
ded70 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a ( sqlite3_file *
ded80 69 64 20 29 7b 0d 0a 20 20 41 50 49 52 45 54 20 id ){.. APIRET
ded90 72 63 3b 0d 0a 20 20 6f 73 32 46 69 6c 65 20 2a rc;.. os2File *
deda0 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 pFile = (os2File
dedb0 2a 29 69 64 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 *)id;.... asser
dedc0 74 28 20 69 64 21 3d 30 20 29 3b 0d 0a 20 20 4f t( id!=0 );.. O
dedd0 53 54 52 41 43 45 28 28 20 22 43 4c 4f 53 45 20 STRACE(( "CLOSE
dede0 25 64 20 28 25 73 29 5c 6e 22 2c 20 70 46 69 6c %d (%s)\n", pFil
dedf0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 7a 46 75 e->h, pFile->zFu
dee00 6c 6c 50 61 74 68 43 70 20 29 29 3b 0d 0a 0d 0a llPathCp ));....
dee10 20 20 72 63 20 3d 20 44 6f 73 43 6c 6f 73 65 28 rc = DosClose(
dee20 20 70 46 69 6c 65 2d 3e 68 20 29 3b 0d 0a 0d 0a pFile->h );....
dee30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 66 6c 61 if( pFile->fla
dee40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e gs & SQLITE_OPEN
dee50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 _DELETEONCLOSE )
dee60 0d 0a 20 20 20 20 44 6f 73 46 6f 72 63 65 44 65 .. DosForceDe
dee70 6c 65 74 65 28 20 28 50 53 5a 29 70 46 69 6c 65 lete( (PSZ)pFile
dee80 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 29 3b ->zFullPathCp );
dee90 0d 0a 0d 0a 20 20 66 72 65 65 28 20 70 46 69 6c .... free( pFil
deea0 65 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 29 e->zFullPathCp )
deeb0 3b 0d 0a 20 20 70 46 69 6c 65 2d 3e 7a 46 75 6c ;.. pFile->zFul
deec0 6c 50 61 74 68 43 70 20 3d 20 4e 55 4c 4c 3b 0d lPathCp = NULL;.
deed0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 . pFile->lockty
deee0 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0d 0a 20 pe = NO_LOCK;..
deef0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 28 48 46 49 pFile->h = (HFI
def00 4c 45 29 2d 31 3b 0d 0a 20 20 70 46 69 6c 65 2d LE)-1;.. pFile-
def10 3e 66 6c 61 67 73 20 3d 20 30 3b 0d 0a 0d 0a 20 >flags = 0;....
def20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 20 2d 31 OpenCounter( -1
def30 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 );.. return rc
def40 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 == NO_ERROR ? S
def50 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 QLITE_OK : SQLIT
def60 45 5f 49 4f 45 52 52 3b 0d 0a 7d 0d 0a 0d 0a 2f E_IOERR;..}..../
def70 2a 0d 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 *..** Read data
def80 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f from a file into
def90 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 a buffer. Retu
defa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 rn SQLITE_OK if
defb0 61 6c 6c 0d 0a 2a 2a 20 62 79 74 65 73 20 77 65 all..** bytes we
defc0 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 re read successf
defd0 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f ully and SQLITE_
defe0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e IOERR if anythin
deff0 67 20 67 6f 65 73 0d 0a 2a 2a 20 77 72 6f 6e 67 g goes..** wrong
df000 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
df010 74 20 6f 73 32 52 65 61 64 28 0d 0a 20 20 73 71 t os2Read(.. sq
df020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 lite3_file *id,
df030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
df040 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 File to read fr
df050 6f 6d 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 om */.. void *p
df060 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 Buf,
df070 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
df080 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 e content into t
df090 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0d 0a 20 his buffer */..
df0a0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 int amt,
df0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
df0c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
df0d0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0d 0a tes to read */..
df0e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
df0f0 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 offset
df100 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 /* Begin readi
df110 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 ng at this offse
df120 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 55 4c 4f 4e t */..){.. ULON
df130 47 20 66 69 6c 65 4c 6f 63 61 74 69 6f 6e 20 3d G fileLocation =
df140 20 30 4c 3b 0d 0a 20 20 55 4c 4f 4e 47 20 67 6f 0L;.. ULONG go
df150 74 3b 0d 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 t;.. os2File *p
df160 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a File = (os2File*
df170 29 69 64 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 )id;.. assert(
df180 69 64 21 3d 30 20 29 3b 0d 0a 20 20 53 69 6d 75 id!=0 );.. Simu
df190 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 lateIOError( ret
df1a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
df1b0 5f 52 45 41 44 20 29 3b 0d 0a 20 20 4f 53 54 52 _READ );.. OSTR
df1c0 41 43 45 28 28 20 22 52 45 41 44 20 25 64 20 6c ACE(( "READ %d l
df1d0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 ock=%d\n", pFile
df1e0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b ->h, pFile->lock
df1f0 74 79 70 65 20 29 29 3b 0d 0a 20 20 69 66 28 20 type ));.. if(
df200 44 6f 73 53 65 74 46 69 6c 65 50 74 72 28 70 46 DosSetFilePtr(pF
df210 69 6c 65 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 ile->h, offset,
df220 46 49 4c 45 5f 42 45 47 49 4e 2c 20 26 66 69 6c FILE_BEGIN, &fil
df230 65 4c 6f 63 61 74 69 6f 6e 29 20 21 3d 20 4e 4f eLocation) != NO
df240 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 72 _ERROR ){.. r
df250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
df260 52 52 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 RR;.. }.. if(
df270 44 6f 73 52 65 61 64 28 20 70 46 69 6c 65 2d 3e DosRead( pFile->
df280 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 h, pBuf, amt, &g
df290 6f 74 20 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 ot ) != NO_ERROR
df2a0 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
df2b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 SQLITE_IOERR_REA
df2c0 44 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 67 D;.. }.. if( g
df2d0 6f 74 20 3d 3d 20 28 55 4c 4f 4e 47 29 61 6d 74 ot == (ULONG)amt
df2e0 20 29 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ).. return S
df2f0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 65 6c 73 QLITE_OK;.. els
df300 65 20 7b 0d 0a 20 20 20 20 2f 2a 20 55 6e 72 65 e {.. /* Unre
df310 61 64 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74 ad portions of t
df320 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 he input buffer
df330 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c must be zero-fil
df340 6c 65 64 20 2a 2f 0d 0a 20 20 20 20 6d 65 6d 73 led */.. mems
df350 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 et(&((char*)pBuf
df360 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 )[got], 0, amt-g
df370 6f 74 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e ot);.. return
df380 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 SQLITE_IOERR_SH
df390 4f 52 54 5f 52 45 41 44 3b 0d 0a 20 20 7d 0d 0a ORT_READ;.. }..
df3a0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 }..../*..** Writ
df3b0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 e data from a bu
df3c0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 ffer into a file
df3d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 . Return SQLITE
df3e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0d 0a _OK on success..
df3f0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 ** or some other
df400 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 error code on f
df410 61 69 6c 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 ailure...*/..sta
df420 74 69 63 20 69 6e 74 20 6f 73 32 57 72 69 74 65 tic int os2Write
df430 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c (.. sqlite3_fil
df440 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 e *id,
df450 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 /* File to
df460 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0d 0a 20 write into */..
df470 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 const void *pBu
df480 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 f,
df490 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f /* The bytes to
df4a0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0d 0a be written */..
df4b0 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 int amt,
df4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
df4d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
df4e0 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f ytes to write */
df4f0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 .. sqlite3_int6
df500 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 4 offset
df510 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
df520 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 to the file to b
df530 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 egin writing at
df540 2a 2f 0d 0a 29 7b 0d 0a 20 20 55 4c 4f 4e 47 20 */..){.. ULONG
df550 66 69 6c 65 4c 6f 63 61 74 69 6f 6e 20 3d 20 30 fileLocation = 0
df560 4c 3b 0d 0a 20 20 41 50 49 52 45 54 20 72 63 20 L;.. APIRET rc
df570 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0d 0a 20 20 55 = NO_ERROR;.. U
df580 4c 4f 4e 47 20 77 72 6f 74 65 3b 0d 0a 20 20 6f LONG wrote;.. o
df590 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 s2File *pFile =
df5a0 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 (os2File*)id;..
df5b0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 assert( id!=0 )
df5c0 3b 0d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 ;.. SimulateIOE
df5d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c rror( return SQL
df5e0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 20 ITE_IOERR_WRITE
df5f0 29 3b 0d 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 );.. SimulateDi
df600 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 skfullError( ret
df610 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 urn SQLITE_FULL
df620 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 20 );.. OSTRACE((
df630 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 "WRITE %d lock=%
df640 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 d\n", pFile->h,
df650 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 pFile->locktype
df660 29 29 3b 0d 0a 20 20 69 66 28 20 44 6f 73 53 65 ));.. if( DosSe
df670 74 46 69 6c 65 50 74 72 28 70 46 69 6c 65 2d 3e tFilePtr(pFile->
df680 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c 45 5f h, offset, FILE_
df690 42 45 47 49 4e 2c 20 26 66 69 6c 65 4c 6f 63 61 BEGIN, &fileLoca
df6a0 74 69 6f 6e 29 20 21 3d 20 4e 4f 5f 45 52 52 4f tion) != NO_ERRO
df6b0 52 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e R ){.. return
df6c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0d 0a SQLITE_IOERR;..
df6d0 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 61 }.. assert( a
df6e0 6d 74 3e 30 20 29 3b 0d 0a 20 20 77 68 69 6c 65 mt>0 );.. while
df6f0 28 20 61 6d 74 20 3e 20 30 20 26 26 0d 0a 20 20 ( amt > 0 &&..
df700 20 20 20 20 20 20 20 28 20 72 63 20 3d 20 44 6f ( rc = Do
df710 73 57 72 69 74 65 28 20 70 46 69 6c 65 2d 3e 68 sWrite( pFile->h
df720 2c 20 28 50 56 4f 49 44 29 70 42 75 66 2c 20 61 , (PVOID)pBuf, a
df730 6d 74 2c 20 26 77 72 6f 74 65 20 29 20 29 20 3d mt, &wrote ) ) =
df740 3d 20 4e 4f 5f 45 52 52 4f 52 20 26 26 0d 0a 20 = NO_ERROR &&..
df750 20 20 20 20 20 20 20 20 77 72 6f 74 65 20 3e 20 wrote >
df760 30 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 61 6d 74 0.. ){.. amt
df770 20 2d 3d 20 77 72 6f 74 65 3b 0d 0a 20 20 20 20 -= wrote;..
df780 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 pBuf = &((char*)
df790 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0d 0a 20 pBuf)[wrote];..
df7a0 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 28 }.... return (
df7b0 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 rc != NO_ERROR
df7c0 7c 7c 20 61 6d 74 20 3e 20 28 69 6e 74 29 77 72 || amt > (int)wr
df7d0 6f 74 65 20 29 20 3f 20 53 51 4c 49 54 45 5f 46 ote ) ? SQLITE_F
df7e0 55 4c 4c 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b ULL : SQLITE_OK;
df7f0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 ..}..../*..** Tr
df800 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 uncate an open f
df810 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 ile to a specifi
df820 65 64 20 73 69 7a 65 0d 0a 2a 2f 0d 0a 73 74 61 ed size..*/..sta
df830 74 69 63 20 69 6e 74 20 6f 73 32 54 72 75 6e 63 tic int os2Trunc
df840 61 74 65 28 20 73 71 6c 69 74 65 33 5f 66 69 6c ate( sqlite3_fil
df850 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 e *id, i64 nByte
df860 20 29 7b 0d 0a 20 20 41 50 49 52 45 54 20 72 63 ){.. APIRET rc
df870 3b 0d 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 ;.. os2File *pF
df880 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 ile = (os2File*)
df890 69 64 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 id;.. assert( i
df8a0 64 21 3d 30 20 29 3b 0d 0a 20 20 4f 53 54 52 41 d!=0 );.. OSTRA
df8b0 43 45 28 28 20 22 54 52 55 4e 43 41 54 45 20 25 CE(( "TRUNCATE %
df8c0 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 d %lld\n", pFile
df8d0 2d 3e 68 2c 20 6e 42 79 74 65 20 29 29 3b 0d 0a ->h, nByte ));..
df8e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
df8f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 r( return SQLITE
df900 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 _IOERR_TRUNCATE
df910 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 );.... /* If th
df920 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 e user has confi
df930 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 gured a chunk-si
df940 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 ze for this file
df950 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0d 0a , truncate the..
df960 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 ** file so tha
df970 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 t it consists of
df980 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 an integer numb
df990 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e er of chunks (i.
df9a0 65 2e 20 74 68 65 0d 0a 20 20 2a 2a 20 61 63 74 e. the.. ** act
df9b0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 ual file size af
df9c0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f ter the operatio
df9d0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 n may be larger
df9e0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 than the request
df9f0 65 64 0d 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0d ed.. ** size)..
dfa00 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 69 . */.. if( pFi
dfa10 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0d 0a le->szChunk ){..
dfa20 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 nByte = ((nB
dfa30 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 yte + pFile->szC
dfa40 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d hunk - 1)/pFile-
dfa50 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c >szChunk) * pFil
dfa60 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0d 0a 20 20 7d e->szChunk;.. }
dfa70 0d 0a 20 20 0d 0a 20 20 72 63 20 3d 20 44 6f 73 .. .. rc = Dos
dfa80 53 65 74 46 69 6c 65 53 69 7a 65 28 20 70 46 69 SetFileSize( pFi
dfa90 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 20 29 3b 0d le->h, nByte );.
dfaa0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 . return rc ==
dfab0 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 NO_ERROR ? SQLIT
dfac0 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f E_OK : SQLITE_IO
dfad0 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0d 0a 7d ERR_TRUNCATE;..}
dfae0 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ....#ifdef SQLIT
dfaf0 45 5f 54 45 53 54 0d 0a 2f 2a 0d 0a 2a 2a 20 43 E_TEST../*..** C
dfb00 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 ount the number
dfb10 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 of fullsyncs and
dfb20 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 normal syncs.
dfb30 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 This is used to
dfb40 74 65 73 74 0d 0a 2a 2a 20 74 68 61 74 20 73 79 test..** that sy
dfb50 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 ncs and fullsync
dfb60 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 s are occuring a
dfb70 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 t the right time
dfb80 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 s...*/..SQLITE_A
dfb90 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 PI int sqlite3_s
dfba0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a ync_count = 0;..
dfbb0 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
dfbc0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f qlite3_fullsync_
dfbd0 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a 23 65 6e 64 count = 0;..#end
dfbe0 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b if..../*..** Mak
dfbf0 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 e sure all write
dfc00 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 s to a particula
dfc10 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 r file are commi
dfc20 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0d 0a 2a tted to disk...*
dfc30 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 /..static int os
dfc40 32 53 79 6e 63 28 20 73 71 6c 69 74 65 33 5f 66 2Sync( sqlite3_f
dfc50 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 ile *id, int fla
dfc60 67 73 20 29 7b 0d 0a 20 20 6f 73 32 46 69 6c 65 gs ){.. os2File
dfc70 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 *pFile = (os2Fi
dfc80 6c 65 2a 29 69 64 3b 0d 0a 20 20 4f 53 54 52 41 le*)id;.. OSTRA
dfc90 43 45 28 28 20 22 53 59 4e 43 20 25 64 20 6c 6f CE(( "SYNC %d lo
dfca0 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d ck=%d\n", pFile-
dfcb0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 >h, pFile->lockt
dfcc0 79 70 65 20 29 29 3b 0d 0a 23 69 66 64 65 66 20 ype ));..#ifdef
dfcd0 53 51 4c 49 54 45 5f 54 45 53 54 0d 0a 20 20 69 SQLITE_TEST.. i
dfce0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 f( flags & SQLIT
dfcf0 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 7b 0d 0a 20 E_SYNC_FULL){..
dfd00 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 sqlite3_fulls
dfd10 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 ync_count++;..
dfd20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e }.. sqlite3_syn
dfd30 63 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a 23 65 6e 64 c_count++;..#end
dfd40 69 66 0d 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 if.. /* If we c
dfd50 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 ompiled with the
dfd60 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 SQLITE_NO_SYNC
dfd70 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 flag, then synci
dfd80 6e 67 20 69 73 20 61 0d 0a 20 20 2a 2a 20 6e 6f ng is a.. ** no
dfd90 2d 6f 70 0d 0a 20 20 2a 2f 0d 0a 23 69 66 64 65 -op.. */..#ifde
dfda0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 f SQLITE_NO_SYNC
dfdb0 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
dfdc0 45 54 45 52 28 70 46 69 6c 65 29 3b 0d 0a 20 20 ETER(pFile);..
dfdd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
dfde0 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 72 65 74 75 ;..#else.. retu
dfdf0 72 6e 20 44 6f 73 52 65 73 65 74 42 75 66 66 65 rn DosResetBuffe
dfe00 72 28 20 70 46 69 6c 65 2d 3e 68 20 29 20 3d 3d r( pFile->h ) ==
dfe10 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 NO_ERROR ? SQLI
dfe20 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 TE_OK : SQLITE_I
dfe30 4f 45 52 52 3b 0d 0a 23 65 6e 64 69 66 0d 0a 7d OERR;..#endif..}
dfe40 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 74 65 72 ..../*..** Deter
dfe50 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 mine the current
dfe60 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 size of a file
dfe70 69 6e 20 62 79 74 65 73 0d 0a 2a 2f 0d 0a 73 74 in bytes..*/..st
dfe80 61 74 69 63 20 69 6e 74 20 6f 73 32 46 69 6c 65 atic int os2File
dfe90 53 69 7a 65 28 20 73 71 6c 69 74 65 33 5f 66 69 Size( sqlite3_fi
dfea0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f le *id, sqlite3_
dfeb0 69 6e 74 36 34 20 2a 70 53 69 7a 65 20 29 7b 0d int64 *pSize ){.
dfec0 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d 20 4e . APIRET rc = N
dfed0 4f 5f 45 52 52 4f 52 3b 0d 0a 20 20 46 49 4c 45 O_ERROR;.. FILE
dfee0 53 54 41 54 55 53 33 20 66 73 74 73 33 46 69 6c STATUS3 fsts3Fil
dfef0 65 49 6e 66 6f 3b 0d 0a 20 20 6d 65 6d 73 65 74 eInfo;.. memset
dff00 28 26 66 73 74 73 33 46 69 6c 65 49 6e 66 6f 2c (&fsts3FileInfo,
dff10 20 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73 33 0, sizeof(fsts3
dff20 46 69 6c 65 49 6e 66 6f 29 29 3b 0d 0a 20 20 61 FileInfo));.. a
dff30 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0d ssert( id!=0 );.
dff40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
dff50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 or( return SQLIT
dff60 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 20 29 3b E_IOERR_FSTAT );
dff70 0d 0a 20 20 72 63 20 3d 20 44 6f 73 51 75 65 72 .. rc = DosQuer
dff80 79 46 69 6c 65 49 6e 66 6f 28 20 28 28 6f 73 32 yFileInfo( ((os2
dff90 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 46 49 File*)id)->h, FI
dffa0 4c 5f 53 54 41 4e 44 41 52 44 2c 20 26 66 73 74 L_STANDARD, &fst
dffb0 73 33 46 69 6c 65 49 6e 66 6f 2c 20 73 69 7a 65 s3FileInfo, size
dffc0 6f 66 28 46 49 4c 45 53 54 41 54 55 53 33 29 20 of(FILESTATUS3)
dffd0 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 3d 3d 20 );.. if( rc ==
dffe0 4e 4f 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 20 NO_ERROR ){..
dfff0 20 2a 70 53 69 7a 65 20 3d 20 66 73 74 73 33 46 *pSize = fsts3F
e0000 69 6c 65 49 6e 66 6f 2e 63 62 46 69 6c 65 3b 0d ileInfo.cbFile;.
e0010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
e0020 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 65 6c 73 65 7b TE_OK;.. }else{
e0030 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
e0040 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b ITE_IOERR_FSTAT;
e0050 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
e0060 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 ** Acquire a rea
e0070 64 65 72 20 6c 6f 63 6b 2e 0d 0a 2a 2f 0d 0a 73 der lock...*/..s
e0080 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 tatic int getRea
e0090 64 4c 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a dLock( os2File *
e00a0 70 46 69 6c 65 20 29 7b 0d 0a 20 20 46 49 4c 45 pFile ){.. FILE
e00b0 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0d LOCK LockArea,.
e00c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c . Unl
e00d0 6f 63 6b 41 72 65 61 3b 0d 0a 20 20 41 50 49 52 ockArea;.. APIR
e00e0 45 54 20 72 65 73 3b 0d 0a 20 20 6d 65 6d 73 65 ET res;.. memse
e00f0 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 t(&LockArea, 0,
e0100 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65 61 29 sizeof(LockArea)
e0110 29 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 26 55 6e );.. memset(&Un
e0120 6c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a lockArea, 0, siz
e0130 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29 29 eof(UnlockArea))
e0140 3b 0d 0a 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f ;.. LockArea.lO
e0150 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 ffset = SHARED_F
e0160 49 52 53 54 3b 0d 0a 20 20 4c 6f 63 6b 41 72 65 IRST;.. LockAre
e0170 61 2e 6c 52 61 6e 67 65 20 3d 20 53 48 41 52 45 a.lRange = SHARE
e0180 44 5f 53 49 5a 45 3b 0d 0a 20 20 55 6e 6c 6f 63 D_SIZE;.. Unloc
e0190 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 kArea.lOffset =
e01a0 30 4c 3b 0d 0a 20 20 55 6e 6c 6f 63 6b 41 72 65 0L;.. UnlockAre
e01b0 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0d 0a a.lRange = 0L;..
e01c0 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69 res = DosSetFi
e01d0 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e leLocks( pFile->
e01e0 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 h, &UnlockArea,
e01f0 26 4c 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f &LockArea, LOCK_
e0200 54 49 4d 45 4f 55 54 2c 20 31 4c 20 29 3b 0d 0a TIMEOUT, 1L );..
e0210 20 20 4f 53 54 52 41 43 45 28 28 20 22 47 45 54 OSTRACE(( "GET
e0220 52 45 41 44 4c 4f 43 4b 20 25 64 20 72 65 73 3d READLOCK %d res=
e0230 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c %d\n", pFile->h,
e0240 20 72 65 73 20 29 29 3b 0d 0a 20 20 72 65 74 75 res ));.. retu
e0250 72 6e 20 72 65 73 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a rn res;..}..../*
e0260 0d 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 ..** Undo a read
e0270 6c 6f 63 6b 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 lock..*/..static
e0280 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c int unlockReadL
e0290 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a 69 64 ock( os2File *id
e02a0 20 29 7b 0d 0a 20 20 46 49 4c 45 4c 4f 43 4b 20 ){.. FILELOCK
e02b0 20 4c 6f 63 6b 41 72 65 61 2c 0d 0a 20 20 20 20 LockArea,..
e02c0 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 UnlockAr
e02d0 65 61 3b 0d 0a 20 20 41 50 49 52 45 54 20 72 65 ea;.. APIRET re
e02e0 73 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 26 4c 6f s;.. memset(&Lo
e02f0 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f ckArea, 0, sizeo
e0300 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0d 0a 20 f(LockArea));..
e0310 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41 memset(&UnlockA
e0320 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 rea, 0, sizeof(U
e0330 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0d 0a 20 20 nlockArea));..
e0340 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 LockArea.lOffset
e0350 20 3d 20 30 4c 3b 0d 0a 20 20 4c 6f 63 6b 41 72 = 0L;.. LockAr
e0360 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0d ea.lRange = 0L;.
e0370 0a 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f . UnlockArea.lO
e0380 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 ffset = SHARED_F
e0390 49 52 53 54 3b 0d 0a 20 20 55 6e 6c 6f 63 6b 41 IRST;.. UnlockA
e03a0 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 53 48 41 rea.lRange = SHA
e03b0 52 45 44 5f 53 49 5a 45 3b 0d 0a 20 20 72 65 73 RED_SIZE;.. res
e03c0 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 = DosSetFileLoc
e03d0 6b 73 28 20 69 64 2d 3e 68 2c 20 26 55 6e 6c 6f ks( id->h, &Unlo
e03e0 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 ckArea, &LockAre
e03f0 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c a, LOCK_TIMEOUT,
e0400 20 31 4c 20 29 3b 0d 0a 20 20 4f 53 54 52 41 43 1L );.. OSTRAC
e0410 45 28 28 20 22 55 4e 4c 4f 43 4b 2d 52 45 41 44 E(( "UNLOCK-READ
e0420 4c 4f 43 4b 20 66 69 6c 65 20 68 61 6e 64 6c 65 LOCK file handle
e0430 3d 25 64 20 72 65 73 3d 25 64 3f 5c 6e 22 2c 20 =%d res=%d?\n",
e0440 69 64 2d 3e 68 2c 20 72 65 73 20 29 29 3b 0d 0a id->h, res ));..
e0450 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0d 0a 7d return res;..}
e0460 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 63 6b 20 ..../*..** Lock
e0470 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 the file with th
e0480 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 e lock specified
e0490 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f by parameter lo
e04a0 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0d 0a 2a 2a cktype - one..**
e04b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
e04c0 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 28 g:..**..** (
e04d0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0d 0a 1) SHARED_LOCK..
e04e0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 ** (2) RESER
e04f0 56 45 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 VED_LOCK..**
e0500 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 (3) PENDING_LOC
e0510 4b 0d 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 K..** (4) EX
e0520 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0d 0a 2a 2a CLUSIVE_LOCK..**
e0530 0d 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 ..** Sometimes w
e0540 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f hen requesting o
e0550 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 ne lock state, a
e0560 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 dditional lock s
e0570 74 61 74 65 73 0d 0a 2a 2a 20 61 72 65 20 69 6e tates..** are in
e0580 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 serted in betwee
e0590 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 n. The locking
e05a0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e might fail on on
e05b0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0d 0a e of the later..
e05c0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c ** transitions l
e05d0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 eaving the lock
e05e0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 state different
e05f0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 from what it sta
e0600 72 74 65 64 20 62 75 74 0d 0a 2a 2a 20 73 74 69 rted but..** sti
e0610 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 ll short of its
e0620 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f goal. The follo
e0630 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 wing chart shows
e0640 20 74 68 65 20 61 6c 6c 6f 77 65 64 0d 0a 2a 2a the allowed..**
e0650 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 transitions and
e0660 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e the inserted in
e0670 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 termediate state
e0680 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 55 4e s:..**..** UN
e0690 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 LOCKED -> SHARED
e06a0 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d ..** SHARED -
e06b0 3e 20 52 45 53 45 52 56 45 44 0d 0a 2a 2a 20 20 > RESERVED..**
e06c0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e SHARED -> (PEN
e06d0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 DING) -> EXCLUSI
e06e0 56 45 0d 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 VE..** RESERV
e06f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 ED -> (PENDING)
e0700 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a -> EXCLUSIVE..**
e0710 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 PENDING -> E
e0720 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 0d 0a 2a 2a XCLUSIVE..**..**
e0730 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 This routine wi
e0740 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 ll only increase
e0750 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 6f 73 a lock. The os
e0760 32 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 2Unlock() routin
e0770 65 0d 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c e..** erases all
e0780 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 locks at once a
e0790 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d nd returns us im
e07a0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 mediately to loc
e07b0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0d 0a 2a king level 0...*
e07c0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 * It is not poss
e07d0 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 ible to lower th
e07e0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 e locking level
e07f0 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 one step at a ti
e0800 6d 65 2e 20 20 59 6f 75 0d 0a 2a 2a 20 6d 75 73 me. You..** mus
e0810 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f t go straight to
e0820 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 locking level 0
e0830 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
e0840 74 20 6f 73 32 4c 6f 63 6b 28 20 73 71 6c 69 74 t os2Lock( sqlit
e0850 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 e3_file *id, int
e0860 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0d 0a 20 20 locktype ){..
e0870 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
e0880 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 OK; /* Ret
e0890 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 urn code from su
e08a0 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0d 0a 20 20 broutines */..
e08b0 41 50 49 52 45 54 20 72 65 73 20 3d 20 4e 4f 5f APIRET res = NO_
e08c0 45 52 52 4f 52 3b 20 20 20 20 2f 2a 20 52 65 73 ERROR; /* Res
e08d0 75 6c 74 20 6f 66 20 61 6e 20 4f 53 2f 32 20 6c ult of an OS/2 l
e08e0 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0d 0a 20 20 69 ock call */.. i
e08f0 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 nt newLocktype;
e0900 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 /* Set pFi
e0910 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 le->locktype to
e0920 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 this value befor
e0930 65 20 65 78 69 74 69 6e 67 20 2a 2f 0d 0a 20 20 e exiting */..
e0940 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f int gotPendingLo
e0950 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 ck = 0;/* True i
e0960 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 f we acquired a
e0970 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 PENDING lock thi
e0980 73 20 74 69 6d 65 20 2a 2f 0d 0a 20 20 46 49 4c s time */.. FIL
e0990 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c ELOCK LockArea,
e09a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 6e .. Un
e09b0 6c 6f 63 6b 41 72 65 61 3b 0d 0a 20 20 6f 73 32 lockArea;.. os2
e09c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f File *pFile = (o
e09d0 73 32 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 6d s2File*)id;.. m
e09e0 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c emset(&LockArea,
e09f0 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 0, sizeof(LockA
e0a00 72 65 61 29 29 3b 0d 0a 20 20 6d 65 6d 73 65 74 rea));.. memset
e0a10 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c (&UnlockArea, 0,
e0a20 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 sizeof(UnlockAr
e0a30 65 61 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ea));.. assert(
e0a40 20 70 46 69 6c 65 21 3d 30 20 29 3b 0d 0a 20 20 pFile!=0 );..
e0a50 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 OSTRACE(( "LOCK
e0a60 25 64 20 25 64 20 77 61 73 20 25 64 5c 6e 22 2c %d %d was %d\n",
e0a70 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 pFile->h, lockt
e0a80 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b ype, pFile->lock
e0a90 74 79 70 65 20 29 29 3b 0d 0a 0d 0a 20 20 2f 2a type ));.... /*
e0aa0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 If there is alr
e0ab0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 eady a lock of t
e0ac0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 his type or more
e0ad0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 restrictive on
e0ae0 74 68 65 0d 0a 20 20 2a 2a 20 6f 73 32 46 69 6c the.. ** os2Fil
e0af0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 e, do nothing. D
e0b00 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 on't use the end
e0b10 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 _lock: exit path
e0b20 2c 20 61 73 0d 0a 20 20 2a 2a 20 73 71 6c 69 74 , as.. ** sqlit
e0b30 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 e3_mutex_enter()
e0b40 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c hasn't been cal
e0b50 6c 65 64 20 79 65 74 2e 0d 0a 20 20 2a 2f 0d 0a led yet... */..
e0b60 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 if( pFile->loc
e0b70 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 ktype>=locktype
e0b80 29 7b 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 ){.. OSTRACE(
e0b90 28 20 22 4c 4f 43 4b 20 25 64 20 25 64 20 6f 6b ( "LOCK %d %d ok
e0ba0 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c (already held)\
e0bb0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f n", pFile->h, lo
e0bc0 63 6b 74 79 70 65 20 29 29 3b 0d 0a 20 20 20 20 cktype ));..
e0bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
e0be0 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4d ;.. }.... /* M
e0bf0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 ake sure the loc
e0c00 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 king sequence is
e0c10 20 63 6f 72 72 65 63 74 0d 0a 20 20 2a 2f 0d 0a correct.. */..
e0c20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d assert( pFile-
e0c30 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f >locktype!=NO_LO
e0c40 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d CK || locktype==
e0c50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a SHARED_LOCK );..
e0c60 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 assert( lockty
e0c70 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b pe!=PENDING_LOCK
e0c80 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6c );.. assert( l
e0c90 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 ocktype!=RESERVE
e0ca0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d D_LOCK || pFile-
e0cb0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 >locktype==SHARE
e0cc0 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 20 2f D_LOCK );.... /
e0cd0 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 * Lock the PENDI
e0ce0 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 NG_LOCK byte if
e0cf0 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 we need to acqui
e0d00 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 re a PENDING loc
e0d10 6b 20 6f 72 0d 0a 20 20 2a 2a 20 61 20 53 48 41 k or.. ** a SHA
e0d20 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 RED lock. If we
e0d30 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 are acquiring a
e0d40 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 SHARED lock, th
e0d50 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 e acquisition of
e0d60 0d 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 .. ** the PENDI
e0d70 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 NG_LOCK byte is
e0d80 74 65 6d 70 6f 72 61 72 79 2e 0d 0a 20 20 2a 2f temporary... */
e0d90 0d 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 .. newLocktype
e0da0 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 = pFile->locktyp
e0db0 65 3b 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d e;.. if( pFile-
e0dc0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f >locktype==NO_LO
e0dd0 43 4b 0d 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f CK.. || (lo
e0de0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 cktype==EXCLUSIV
e0df0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d E_LOCK && pFile-
e0e00 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 >locktype==RESER
e0e10 56 45 44 5f 4c 4f 43 4b 29 0d 0a 20 20 29 7b 0d VED_LOCK).. ){.
e0e20 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f . LockArea.lO
e0e30 66 66 73 65 74 20 3d 20 50 45 4e 44 49 4e 47 5f ffset = PENDING_
e0e40 42 59 54 45 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 BYTE;.. LockA
e0e50 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b rea.lRange = 1L;
e0e60 0d 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 .. UnlockArea
e0e70 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0d 0a .lOffset = 0L;..
e0e80 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c UnlockArea.l
e0e90 52 61 6e 67 65 20 3d 20 30 4c 3b 0d 0a 0d 0a 20 Range = 0L;....
e0ea0 20 20 20 2f 2a 20 77 61 69 74 20 6c 6f 6e 67 65 /* wait longe
e0eb0 72 20 74 68 61 6e 20 4c 4f 43 4b 5f 54 49 4d 45 r than LOCK_TIME
e0ec0 4f 55 54 20 68 65 72 65 20 6e 6f 74 20 74 6f 20 OUT here not to
e0ed0 68 61 76 65 20 74 6f 20 74 72 79 20 6d 75 6c 74 have to try mult
e0ee0 69 70 6c 65 20 74 69 6d 65 73 20 2a 2f 0d 0a 20 iple times */..
e0ef0 20 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 res = DosSetF
e0f00 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d ileLocks( pFile-
e0f10 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c >h, &UnlockArea,
e0f20 20 26 4c 6f 63 6b 41 72 65 61 2c 20 31 30 30 4c &LockArea, 100L
e0f30 2c 20 30 4c 20 29 3b 0d 0a 20 20 20 20 69 66 28 , 0L );.. if(
e0f40 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 res == NO_ERROR
e0f50 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 50 65 ){.. gotPe
e0f60 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 31 3b 0d 0a ndingLock = 1;..
e0f70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 OSTRACE((
e0f80 22 4c 4f 43 4b 20 25 64 20 70 65 6e 64 69 6e 67 "LOCK %d pending
e0f90 20 6c 6f 63 6b 20 62 6f 6f 6c 65 61 6e 20 73 65 lock boolean se
e0fa0 74 2e 20 20 72 65 73 3d 25 64 5c 6e 22 2c 20 70 t. res=%d\n", p
e0fb0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20 29 29 3b File->h, res ));
e0fc0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
e0fd0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 /* Acquire a s
e0fe0 68 61 72 65 64 20 6c 6f 63 6b 0d 0a 20 20 2a 2f hared lock.. */
e0ff0 0d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 .. if( locktype
e1000 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 ==SHARED_LOCK &&
e1010 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 res == NO_ERROR
e1020 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 ){.. assert(
e1030 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 pFile->locktype
e1040 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 ==NO_LOCK );..
e1050 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c res = getReadL
e1060 6f 63 6b 28 70 46 69 6c 65 29 3b 0d 0a 20 20 20 ock(pFile);..
e1070 20 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 if( res == NO_E
e1080 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 20 20 6e RROR ){.. n
e1090 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 ewLocktype = SHA
e10a0 52 45 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 7d RED_LOCK;.. }
e10b0 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 .. OSTRACE((
e10c0 22 4c 4f 43 4b 20 25 64 20 61 63 71 75 69 72 65 "LOCK %d acquire
e10d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 72 65 shared lock. re
e10e0 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e s=%d\n", pFile->
e10f0 68 2c 20 72 65 73 20 29 29 3b 0d 0a 20 20 7d 0d h, res ));.. }.
e1100 0a 0d 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 ... /* Acquire
e1110 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0d a RESERVED lock.
e1120 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 6c 6f 63 . */.. if( loc
e1130 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f ktype==RESERVED_
e1140 4c 4f 43 4b 20 26 26 20 72 65 73 20 3d 3d 20 4e LOCK && res == N
e1150 4f 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 O_ERROR ){..
e1160 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c assert( pFile->l
e1170 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f ocktype==SHARED_
e1180 4c 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 4c 6f 63 LOCK );.. Loc
e1190 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 kArea.lOffset =
e11a0 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0d 0a RESERVED_BYTE;..
e11b0 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 LockArea.lRa
e11c0 6e 67 65 20 3d 20 31 4c 3b 0d 0a 20 20 20 20 55 nge = 1L;.. U
e11d0 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 nlockArea.lOffse
e11e0 74 20 3d 20 30 4c 3b 0d 0a 20 20 20 20 55 6e 6c t = 0L;.. Unl
e11f0 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d ockArea.lRange =
e1200 20 30 4c 3b 0d 0a 20 20 20 20 72 65 73 20 3d 20 0L;.. res =
e1210 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 DosSetFileLocks(
e1220 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f pFile->h, &Unlo
e1230 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 ckArea, &LockAre
e1240 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c a, LOCK_TIMEOUT,
e1250 20 30 4c 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 0L );.. if(
e1260 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 res == NO_ERROR
e1270 29 7b 0d 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 ){.. newLoc
e1280 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 ktype = RESERVED
e1290 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 _LOCK;.. }..
e12a0 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f OSTRACE(( "LO
e12b0 43 4b 20 25 64 20 61 63 71 75 69 72 65 20 72 65 CK %d acquire re
e12c0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 72 65 73 served lock. res
e12d0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 =%d\n", pFile->h
e12e0 2c 20 72 65 73 20 29 29 3b 0d 0a 20 20 7d 0d 0a , res ));.. }..
e12f0 0d 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 .. /* Acquire a
e1300 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0d 0a 20 PENDING lock..
e1310 20 2a 2f 0d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 */.. if( lockt
e1320 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c ype==EXCLUSIVE_L
e1330 4f 43 4b 20 26 26 20 72 65 73 20 3d 3d 20 4e 4f OCK && res == NO
e1340 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 6e _ERROR ){.. n
e1350 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e ewLocktype = PEN
e1360 44 49 4e 47 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 DING_LOCK;..
e1370 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d gotPendingLock =
e1380 20 30 3b 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 0;.. OSTRACE
e1390 28 28 20 22 4c 4f 43 4b 20 25 64 20 61 63 71 75 (( "LOCK %d acqu
e13a0 69 72 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b ire pending lock
e13b0 2e 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 62 . pending lock b
e13c0 6f 6f 6c 65 61 6e 20 75 6e 73 65 74 2e 5c 6e 22 oolean unset.\n"
e13d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
e13e0 20 20 70 46 69 6c 65 2d 3e 68 20 29 29 3b 0d 0a pFile->h ));..
e13f0 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 41 63 71 75 }.... /* Acqu
e1400 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 ire an EXCLUSIVE
e1410 20 6c 6f 63 6b 0d 0a 20 20 2a 2f 0d 0a 20 20 69 lock.. */.. i
e1420 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 f( locktype==EXC
e1430 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 LUSIVE_LOCK && r
e1440 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 es == NO_ERROR )
e1450 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 {.. assert( p
e1460 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d File->locktype>=
e1470 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a SHARED_LOCK );..
e1480 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b res = unlock
e1490 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b ReadLock(pFile);
e14a0 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 .. OSTRACE((
e14b0 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 "unreadlock = %d
e14c0 5c 6e 22 2c 20 72 65 73 20 29 29 3b 0d 0a 20 20 \n", res ));..
e14d0 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 LockArea.lOffs
e14e0 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 et = SHARED_FIRS
e14f0 54 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 T;.. LockArea
e1500 2e 6c 52 61 6e 67 65 20 3d 20 53 48 41 52 45 44 .lRange = SHARED
e1510 5f 53 49 5a 45 3b 0d 0a 20 20 20 20 55 6e 6c 6f _SIZE;.. Unlo
e1520 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d ckArea.lOffset =
e1530 20 30 4c 3b 0d 0a 20 20 20 20 55 6e 6c 6f 63 6b 0L;.. Unlock
e1540 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c Area.lRange = 0L
e1550 3b 0d 0a 20 20 20 20 72 65 73 20 3d 20 44 6f 73 ;.. res = Dos
e1560 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46 SetFileLocks( pF
e1570 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 ile->h, &UnlockA
e1580 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20 rea, &LockArea,
e1590 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 30 4c LOCK_TIMEOUT, 0L
e15a0 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 65 73 );.. if( res
e15b0 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0d == NO_ERROR ){.
e15c0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 . newLockty
e15d0 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c pe = EXCLUSIVE_L
e15e0 4f 43 4b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b OCK;.. }else{
e15f0 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 .. OSTRACE(
e1600 28 20 22 4f 53 2f 32 20 65 72 72 6f 72 2d 63 6f ( "OS/2 error-co
e1610 64 65 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 20 de = %d\n", res
e1620 29 29 3b 0d 0a 20 20 20 20 20 20 67 65 74 52 65 ));.. getRe
e1630 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0d 0a adLock(pFile);..
e1640 20 20 20 20 7d 0d 0a 20 20 20 20 4f 53 54 52 41 }.. OSTRA
e1650 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 61 63 CE(( "LOCK %d ac
e1660 71 75 69 72 65 20 65 78 63 6c 75 73 69 76 65 20 quire exclusive
e1670 6c 6f 63 6b 2e 20 20 72 65 73 3d 25 64 5c 6e 22 lock. res=%d\n"
e1680 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20 , pFile->h, res
e1690 29 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a ));.. }.... /*
e16a0 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 If we are holdi
e16b0 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 ng a PENDING loc
e16c0 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 k that ought to
e16d0 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 be released, the
e16e0 6e 0d 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 n.. ** release
e16f0 69 74 20 6e 6f 77 2e 0d 0a 20 20 2a 2f 0d 0a 20 it now... */..
e1700 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c if( gotPendingL
e1710 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d ock && locktype=
e1720 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0d =SHARED_LOCK ){.
e1730 0a 20 20 20 20 69 6e 74 20 72 3b 0d 0a 20 20 20 . int r;..
e1740 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 LockArea.lOffse
e1750 74 20 3d 20 30 4c 3b 0d 0a 20 20 20 20 4c 6f 63 t = 0L;.. Loc
e1760 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 kArea.lRange = 0
e1770 4c 3b 0d 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 L;.. UnlockAr
e1780 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e ea.lOffset = PEN
e1790 44 49 4e 47 5f 42 59 54 45 3b 0d 0a 20 20 20 20 DING_BYTE;..
e17a0 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 UnlockArea.lRang
e17b0 65 20 3d 20 31 4c 3b 0d 0a 20 20 20 20 72 20 3d e = 1L;.. r =
e17c0 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 DosSetFileLocks
e17d0 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c ( pFile->h, &Unl
e17e0 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 ockArea, &LockAr
e17f0 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 ea, LOCK_TIMEOUT
e1800 2c 20 30 4c 20 29 3b 0d 0a 20 20 20 20 4f 53 54 , 0L );.. OST
e1810 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 RACE(( "LOCK %d
e1820 75 6e 6c 6f 63 6b 69 6e 67 20 70 65 6e 64 69 6e unlocking pendin
e1830 67 2f 69 73 20 73 68 61 72 65 64 2e 20 72 3d 25 g/is shared. r=%
e1840 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 d\n", pFile->h,
e1850 72 20 29 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 r ));.. }....
e1860 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 /* Update the st
e1870 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 ate of the lock
e1880 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 has held in the
e1890 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 file descriptor
e18a0 74 68 65 6e 0d 0a 20 20 2a 2a 20 72 65 74 75 72 then.. ** retur
e18b0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 n the appropriat
e18c0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0d 0a e result code...
e18d0 20 20 2a 2f 0d 0a 20 20 69 66 28 20 72 65 73 20 */.. if( res
e18e0 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0d 0a == NO_ERROR ){..
e18f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
e1900 4f 4b 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 OK;.. }else{..
e1910 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f OSTRACE(( "LO
e1920 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 CK FAILED %d try
e1930 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 ing for %d but g
e1940 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d ot %d\n", pFile-
e1950 3e 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 >h,..
e1960 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 locktype, new
e1970 4c 6f 63 6b 74 79 70 65 20 29 29 3b 0d 0a 20 20 Locktype ));..
e1980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 rc = SQLITE_BU
e1990 53 59 3b 0d 0a 20 20 7d 0d 0a 20 20 70 46 69 6c SY;.. }.. pFil
e19a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 e->locktype = ne
e19b0 77 4c 6f 63 6b 74 79 70 65 3b 0d 0a 20 20 4f 53 wLocktype;.. OS
e19c0 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 TRACE(( "LOCK %d
e19d0 20 6e 6f 77 20 25 64 5c 6e 22 2c 20 70 46 69 6c now %d\n", pFil
e19e0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 e->h, pFile->loc
e19f0 6b 74 79 70 65 20 29 29 3b 0d 0a 20 20 72 65 74 ktype ));.. ret
e1a00 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
e1a10 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
e1a20 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 e checks if ther
e1a30 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 e is a RESERVED
e1a40 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 lock held on the
e1a50 20 73 70 65 63 69 66 69 65 64 0d 0a 2a 2a 20 66 specified..** f
e1a60 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 ile by this or a
e1a70 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 ny other process
e1a80 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b . If such a lock
e1a90 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e is held, return
e1aa0 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f ..** non-zero, o
e1ab0 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0d 0a therwise zero...
e1ac0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f */..static int o
e1ad0 73 32 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c s2CheckReservedL
e1ae0 6f 63 6b 28 20 73 71 6c 69 74 65 33 5f 66 69 6c ock( sqlite3_fil
e1af0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 4f 75 74 e *id, int *pOut
e1b00 20 29 7b 0d 0a 20 20 69 6e 74 20 72 20 3d 20 30 ){.. int r = 0
e1b10 3b 0d 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 ;.. os2File *pF
e1b20 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 ile = (os2File*)
e1b30 69 64 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 id;.. assert( p
e1b40 46 69 6c 65 21 3d 30 20 29 3b 0d 0a 20 20 69 66 File!=0 );.. if
e1b50 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 ( pFile->locktyp
e1b60 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b e>=RESERVED_LOCK
e1b70 20 29 7b 0d 0a 20 20 20 20 72 20 3d 20 31 3b 0d ){.. r = 1;.
e1b80 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 . OSTRACE(( "
e1b90 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 TEST WR-LOCK %d
e1ba0 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 %d (local)\n", p
e1bb0 46 69 6c 65 2d 3e 68 2c 20 72 20 29 29 3b 0d 0a File->h, r ));..
e1bc0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 46 49 }else{.. FI
e1bd0 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 LELOCK LockArea
e1be0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
e1bf0 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0d 0a 20 20 UnlockArea;..
e1c00 20 20 41 50 49 52 45 54 20 72 63 20 3d 20 4e 4f APIRET rc = NO
e1c10 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 6d 65 6d _ERROR;.. mem
e1c20 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30 set(&LockArea, 0
e1c30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65 , sizeof(LockAre
e1c40 61 29 29 3b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 a));.. memset
e1c50 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c (&UnlockArea, 0,
e1c60 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 sizeof(UnlockAr
e1c70 65 61 29 29 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 ea));.. LockA
e1c80 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 rea.lOffset = RE
e1c90 53 45 52 56 45 44 5f 42 59 54 45 3b 0d 0a 20 20 SERVED_BYTE;..
e1ca0 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 LockArea.lRang
e1cb0 65 20 3d 20 31 4c 3b 0d 0a 20 20 20 20 55 6e 6c e = 1L;.. Unl
e1cc0 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 ockArea.lOffset
e1cd0 3d 20 30 4c 3b 0d 0a 20 20 20 20 55 6e 6c 6f 63 = 0L;.. Unloc
e1ce0 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 kArea.lRange = 0
e1cf0 4c 3b 0d 0a 20 20 20 20 72 63 20 3d 20 44 6f 73 L;.. rc = Dos
e1d00 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46 SetFileLocks( pF
e1d10 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 ile->h, &UnlockA
e1d20 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20 rea, &LockArea,
e1d30 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 30 4c LOCK_TIMEOUT, 0L
e1d40 20 29 3b 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 );.. OSTRACE
e1d50 28 28 20 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b (( "TEST WR-LOCK
e1d60 20 25 64 20 6c 6f 63 6b 20 72 65 73 65 72 76 65 %d lock reserve
e1d70 64 20 62 79 74 65 20 72 63 3d 25 64 5c 6e 22 2c d byte rc=%d\n",
e1d80 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 29 29 pFile->h, rc ))
e1d90 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 3d 3d ;.. if( rc ==
e1da0 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 NO_ERROR ){..
e1db0 20 20 20 20 41 50 49 52 45 54 20 72 63 75 20 3d APIRET rcu =
e1dc0 20 4e 4f 5f 45 52 52 4f 52 3b 20 2f 2a 20 72 65 NO_ERROR; /* re
e1dd0 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 75 6e turn code for un
e1de0 6c 6f 63 6b 69 6e 67 20 2a 2f 0d 0a 20 20 20 20 locking */..
e1df0 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 LockArea.lOffs
e1e00 65 74 20 3d 20 30 4c 3b 0d 0a 20 20 20 20 20 20 et = 0L;..
e1e10 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 LockArea.lRange
e1e20 3d 20 30 4c 3b 0d 0a 20 20 20 20 20 20 55 6e 6c = 0L;.. Unl
e1e30 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 ockArea.lOffset
e1e40 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b = RESERVED_BYTE;
e1e50 0d 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 .. UnlockAr
e1e60 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0d ea.lRange = 1L;.
e1e70 0a 20 20 20 20 20 20 72 63 75 20 3d 20 44 6f 73 . rcu = Dos
e1e80 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46 SetFileLocks( pF
e1e90 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 ile->h, &UnlockA
e1ea0 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20 rea, &LockArea,
e1eb0 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 30 4c LOCK_TIMEOUT, 0L
e1ec0 20 29 3b 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 );.. OSTRA
e1ed0 43 45 28 28 20 22 54 45 53 54 20 57 52 2d 4c 4f CE(( "TEST WR-LO
e1ee0 43 4b 20 25 64 20 75 6e 6c 6f 63 6b 20 72 65 73 CK %d unlock res
e1ef0 65 72 76 65 64 20 62 79 74 65 20 72 3d 25 64 5c erved byte r=%d\
e1f00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 n", pFile->h, rc
e1f10 75 20 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 u ));.. }..
e1f20 20 20 72 20 3d 20 21 28 72 63 20 3d 3d 20 4e 4f r = !(rc == NO
e1f30 5f 45 52 52 4f 52 29 3b 0d 0a 20 20 20 20 4f 53 _ERROR);.. OS
e1f40 54 52 41 43 45 28 28 20 22 54 45 53 54 20 57 52 TRACE(( "TEST WR
e1f50 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d -LOCK %d %d (rem
e1f60 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e ote)\n", pFile->
e1f70 68 2c 20 72 20 29 29 3b 0d 0a 20 20 7d 0d 0a 20 h, r ));.. }..
e1f80 20 2a 70 4f 75 74 20 3d 20 72 3b 0d 0a 20 20 72 *pOut = r;.. r
e1f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
e1fa0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f ..}..../*..** Lo
e1fb0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 wer the locking
e1fc0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 level on file de
e1fd0 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c scriptor id to l
e1fe0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 ocktype. lockty
e1ff0 70 65 0d 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 pe..** must be e
e2000 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 ither NO_LOCK or
e2010 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0d 0a 2a SHARED_LOCK...*
e2020 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 *..** If the loc
e2030 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 king level of th
e2040 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f e file descripto
e2050 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 r is already at
e2060 6f 72 20 62 65 6c 6f 77 0d 0a 2a 2a 20 74 68 65 or below..** the
e2070 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 requested locki
e2080 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 ng level, this r
e2090 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f outine is a no-o
e20a0 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 74 20 69 73 p...**..** It is
e20b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f not possible fo
e20c0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 r this routine t
e20d0 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 o fail if the se
e20e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0d 0a 2a cond argument..*
e20f0 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 * is NO_LOCK. I
e2100 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 f the second arg
e2110 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f ument is SHARED_
e2120 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 LOCK then this r
e2130 6f 75 74 69 6e 65 0d 0a 2a 2a 20 6d 69 67 68 74 outine..** might
e2140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
e2150 4f 45 52 52 3b 0d 0a 2a 2f 0d 0a 73 74 61 74 69 OERR;..*/..stati
e2160 63 20 69 6e 74 20 6f 73 32 55 6e 6c 6f 63 6b 28 c int os2Unlock(
e2170 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 sqlite3_file *i
e2180 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20 d, int locktype
e2190 29 7b 0d 0a 20 20 69 6e 74 20 74 79 70 65 3b 0d ){.. int type;.
e21a0 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c . os2File *pFil
e21b0 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 e = (os2File*)id
e21c0 3b 0d 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d ;.. APIRET rc =
e21d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 41 SQLITE_OK;.. A
e21e0 50 49 52 45 54 20 72 65 73 20 3d 20 4e 4f 5f 45 PIRET res = NO_E
e21f0 52 52 4f 52 3b 0d 0a 20 20 46 49 4c 45 4c 4f 43 RROR;.. FILELOC
e2200 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0d 0a 20 20 K LockArea,..
e2210 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b Unlock
e2220 41 72 65 61 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 Area;.. memset(
e2230 26 4c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 &LockArea, 0, si
e2240 7a 65 6f 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b zeof(LockArea));
e2250 0d 0a 20 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f .. memset(&Unlo
e2260 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f ckArea, 0, sizeo
e2270 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0d f(UnlockArea));.
e2280 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 . assert( pFile
e2290 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 !=0 );.. assert
e22a0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 ( locktype<=SHAR
e22b0 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 4f 53 ED_LOCK );.. OS
e22c0 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 TRACE(( "UNLOCK
e22d0 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 5c %d to %d was %d\
e22e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f n", pFile->h, lo
e22f0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c cktype, pFile->l
e2300 6f 63 6b 74 79 70 65 20 29 29 3b 0d 0a 20 20 74 ocktype ));.. t
e2310 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 ype = pFile->loc
e2320 6b 74 79 70 65 3b 0d 0a 20 20 69 66 28 20 74 79 ktype;.. if( ty
e2330 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f pe>=EXCLUSIVE_LO
e2340 43 4b 20 29 7b 0d 0a 20 20 20 20 4c 6f 63 6b 41 CK ){.. LockA
e2350 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c rea.lOffset = 0L
e2360 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e ;.. LockArea.
e2370 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0d 0a 20 20 lRange = 0L;..
e2380 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 UnlockArea.lOf
e2390 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 fset = SHARED_FI
e23a0 52 53 54 3b 0d 0a 20 20 20 20 55 6e 6c 6f 63 6b RST;.. Unlock
e23b0 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 53 48 Area.lRange = SH
e23c0 41 52 45 44 5f 53 49 5a 45 3b 0d 0a 20 20 20 20 ARED_SIZE;..
e23d0 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 res = DosSetFile
e23e0 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c Locks( pFile->h,
e23f0 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c &UnlockArea, &L
e2400 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 ockArea, LOCK_TI
e2410 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0d 0a 20 20 MEOUT, 0L );..
e2420 20 20 4f 53 54 52 41 43 45 28 28 20 22 55 4e 4c OSTRACE(( "UNL
e2430 4f 43 4b 20 25 64 20 65 78 63 6c 75 73 69 76 65 OCK %d exclusive
e2440 20 6c 6f 63 6b 20 72 65 73 3d 25 64 5c 6e 22 2c lock res=%d\n",
e2450 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20 29 pFile->h, res )
e2460 29 3b 0d 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b );.. if( lock
e2470 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 type==SHARED_LOC
e2480 4b 20 26 26 20 67 65 74 52 65 61 64 4c 6f 63 6b K && getReadLock
e2490 28 70 46 69 6c 65 29 20 21 3d 20 4e 4f 5f 45 52 (pFile) != NO_ER
e24a0 52 4f 52 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a ROR ){.. /*
e24b0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 This should nev
e24c0 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 er happen. We s
e24d0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 hould always be
e24e0 61 62 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 2a able to.. *
e24f0 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 * reacquire the
e2500 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 read lock */..
e2510 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 55 OSTRACE(( "U
e2520 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 67 NLOCK %d to %d g
e2530 65 74 52 65 61 64 4c 6f 63 6b 28 29 20 66 61 69 etReadLock() fai
e2540 6c 65 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 led\n", pFile->h
e2550 2c 20 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0d 0a , locktype ));..
e2560 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
e2570 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0d E_IOERR_UNLOCK;.
e2580 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 . }.. }.. i
e2590 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 f( type>=RESERVE
e25a0 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 4c D_LOCK ){.. L
e25b0 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 ockArea.lOffset
e25c0 3d 20 30 4c 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 = 0L;.. LockA
e25d0 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b rea.lRange = 0L;
e25e0 0d 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 .. UnlockArea
e25f0 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53 45 52 .lOffset = RESER
e2600 56 45 44 5f 42 59 54 45 3b 0d 0a 20 20 20 20 55 VED_BYTE;.. U
e2610 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 nlockArea.lRange
e2620 20 3d 20 31 4c 3b 0d 0a 20 20 20 20 72 65 73 20 = 1L;.. res
e2630 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b = DosSetFileLock
e2640 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e s( pFile->h, &Un
e2650 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 lockArea, &LockA
e2660 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 rea, LOCK_TIMEOU
e2670 54 2c 20 30 4c 20 29 3b 0d 0a 20 20 20 20 4f 53 T, 0L );.. OS
e2680 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 TRACE(( "UNLOCK
e2690 25 64 20 72 65 73 65 72 76 65 64 20 72 65 73 3d %d reserved res=
e26a0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c %d\n", pFile->h,
e26b0 20 72 65 73 20 29 29 3b 0d 0a 20 20 7d 0d 0a 20 res ));.. }..
e26c0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e if( locktype==N
e26d0 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d O_LOCK && type>=
e26e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a SHARED_LOCK ){..
e26f0 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b res = unlock
e2700 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b ReadLock(pFile);
e2710 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 .. OSTRACE((
e2720 22 55 4e 4c 4f 43 4b 20 25 64 20 69 73 20 25 64 "UNLOCK %d is %d
e2730 20 77 61 6e 74 20 25 64 20 72 65 73 3d 25 64 5c want %d res=%d\
e2740 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 n",..
e2750 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 74 79 70 pFile->h, typ
e2760 65 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 72 65 73 e, locktype, res
e2770 20 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 ));.. }.. if(
e2780 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c type>=PENDING_L
e2790 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 4c 6f 63 6b OCK ){.. Lock
e27a0 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 Area.lOffset = 0
e27b0 4c 3b 0d 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 L;.. LockArea
e27c0 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0d 0a 20 .lRange = 0L;..
e27d0 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f UnlockArea.lO
e27e0 66 66 73 65 74 20 3d 20 50 45 4e 44 49 4e 47 5f ffset = PENDING_
e27f0 42 59 54 45 3b 0d 0a 20 20 20 20 55 6e 6c 6f 63 BYTE;.. Unloc
e2800 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 kArea.lRange = 1
e2810 4c 3b 0d 0a 20 20 20 20 72 65 73 20 3d 20 44 6f L;.. res = Do
e2820 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 sSetFileLocks( p
e2830 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b File->h, &Unlock
e2840 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c Area, &LockArea,
e2850 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 30 LOCK_TIMEOUT, 0
e2860 4c 20 29 3b 0d 0a 20 20 20 20 4f 53 54 52 41 43 L );.. OSTRAC
e2870 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 70 E(( "UNLOCK %d p
e2880 65 6e 64 69 6e 67 20 72 65 73 3d 25 64 5c 6e 22 ending res=%d\n"
e2890 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20 , pFile->h, res
e28a0 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 46 69 6c ));.. }.. pFil
e28b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f e->locktype = lo
e28c0 63 6b 74 79 70 65 3b 0d 0a 20 20 4f 53 54 52 41 cktype;.. OSTRA
e28d0 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 CE(( "UNLOCK %d
e28e0 6e 6f 77 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 now %d\n", pFile
e28f0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b ->h, pFile->lock
e2900 74 79 70 65 20 29 29 3b 0d 0a 20 20 72 65 74 75 type ));.. retu
e2910 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
e2920 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 .** Control and
e2930 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 query of the ope
e2940 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0d 0a n file handle...
e2950 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f */..static int o
e2960 73 32 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 s2FileControl(sq
e2970 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 lite3_file *id,
e2980 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 int op, void *pA
e2990 72 67 29 7b 0d 0a 20 20 73 77 69 74 63 68 28 20 rg){.. switch(
e29a0 6f 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 op ){.. case
e29b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 SQLITE_FCNTL_LOC
e29c0 4b 53 54 41 54 45 3a 20 7b 0d 0a 20 20 20 20 20 KSTATE: {..
e29d0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 *(int*)pArg = (
e29e0 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 6c (os2File*)id)->l
e29f0 6f 63 6b 74 79 70 65 3b 0d 0a 20 20 20 20 20 20 ocktype;..
e2a00 4f 53 54 52 41 43 45 28 28 20 22 46 43 4e 54 4c OSTRACE(( "FCNTL
e2a10 5f 4c 4f 43 4b 53 54 41 54 45 20 25 64 20 6c 6f _LOCKSTATE %d lo
e2a20 63 6b 3d 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 ck=%d\n",..
e2a30 20 20 20 20 20 20 20 20 20 20 20 28 28 6f 73 32 ((os2
e2a40 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28 File*)id)->h, ((
e2a50 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f os2File*)id)->lo
e2a60 63 6b 74 79 70 65 20 29 29 3b 0d 0a 20 20 20 20 cktype ));..
e2a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
e2a80 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 OK;.. }..
e2a90 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 case SQLITE_FCNT
e2aa0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0d L_CHUNK_SIZE: {.
e2ab0 0a 20 20 20 20 20 20 28 28 6f 73 32 46 69 6c 65 . ((os2File
e2ac0 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d *)id)->szChunk =
e2ad0 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0d 0a 20 *(int*)pArg;..
e2ae0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
e2af0 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 TE_OK;.. }..
e2b00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 case SQLITE_F
e2b10 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 CNTL_SIZE_HINT:
e2b20 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {.. sqlite3
e2b30 5f 69 6e 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 _int64 sz = *(sq
e2b40 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 lite3_int64*)pAr
e2b50 67 3b 0d 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 g;.. Simula
e2b60 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 teIOErrorBenign(
e2b70 31 29 3b 0d 0a 20 20 20 20 20 20 6f 73 32 54 72 1);.. os2Tr
e2b80 75 6e 63 61 74 65 28 69 64 2c 20 73 7a 29 3b 0d uncate(id, sz);.
e2b90 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 . SimulateI
e2ba0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b OErrorBenign(0);
e2bb0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
e2bc0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d QLITE_OK;.. }
e2bd0 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 .. case SQLIT
e2be0 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 E_FCNTL_SYNC_OMI
e2bf0 54 54 45 44 3a 20 7b 0d 0a 20 20 20 20 20 20 72 TTED: {.. r
e2c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
e2c10 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 .. }.. }..
e2c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
e2c30 54 46 4f 55 4e 44 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a TFOUND;..}..../*
e2c40 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
e2c50 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 sector size in b
e2c60 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 ytes of the unde
e2c70 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 rlying block dev
e2c80 69 63 65 20 66 6f 72 0d 0a 2a 2a 20 74 68 65 20 ice for..** the
e2c90 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 specified file.
e2ca0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 This is almost a
e2cb0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c lways 512 bytes,
e2cc0 20 62 75 74 20 6d 61 79 20 62 65 0d 0a 2a 2a 20 but may be..**
e2cd0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 larger for some
e2ce0 64 65 76 69 63 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a devices...**..**
e2cf0 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 SQLite code ass
e2d00 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 umes this functi
e2d10 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 on cannot fail.
e2d20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 It also assumes
e2d30 74 68 61 74 0d 0a 2a 2a 20 69 66 20 74 77 6f 20 that..** if two
e2d40 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 files are create
e2d50 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 d in the same fi
e2d60 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 le-system direct
e2d70 6f 72 79 20 28 69 2e 65 2e 0d 0a 2a 2a 20 61 20 ory (i.e...** a
e2d80 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 database and its
e2d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 journal file) t
e2da0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 hat the sector s
e2db0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0d ize will be the.
e2dc0 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 .** same for bot
e2dd0 68 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 h...*/..static i
e2de0 6e 74 20 6f 73 32 53 65 63 74 6f 72 53 69 7a 65 nt os2SectorSize
e2df0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
e2e00 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 d){.. UNUSED_PA
e2e10 52 41 4d 45 54 45 52 28 69 64 29 3b 0d 0a 20 20 RAMETER(id);..
e2e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 return SQLITE_DE
e2e30 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a FAULT_SECTOR_SIZ
e2e40 45 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 E;..}..../*..**
e2e50 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 Return a vector
e2e60 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 of device charac
e2e70 74 65 72 69 73 74 69 63 73 2e 0d 0a 2a 2f 0d 0a teristics...*/..
e2e80 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 44 65 static int os2De
e2e90 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 viceCharacterist
e2ea0 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ics(sqlite3_file
e2eb0 20 2a 69 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 *id){.. UNUSED
e2ec0 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0d _PARAMETER(id);.
e2ed0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
e2ee0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 _IOCAP_UNDELETAB
e2ef0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0d 0a 7d LE_WHEN_OPEN;..}
e2f00 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 ....../*..** Cha
e2f10 72 61 63 74 65 72 20 73 65 74 20 63 6f 6e 76 65 racter set conve
e2f20 72 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 75 73 rsion objects us
e2f30 65 64 20 62 79 20 63 6f 6e 76 65 72 73 69 6f 6e ed by conversion
e2f40 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a 2f 0d 0a routines...*/..
e2f50 73 74 61 74 69 63 20 55 63 6f 6e 76 4f 62 6a 65 static UconvObje
e2f60 63 74 20 75 63 55 74 66 38 20 3d 20 4e 55 4c 4c ct ucUtf8 = NULL
e2f70 3b 20 2f 2a 20 63 6f 6e 76 65 72 74 20 62 65 74 ; /* convert bet
e2f80 77 65 65 6e 20 55 54 46 2d 38 20 61 6e 64 20 55 ween UTF-8 and U
e2f90 43 53 2d 32 20 2a 2f 0d 0a 73 74 61 74 69 63 20 CS-2 */..static
e2fa0 55 63 6f 6e 76 4f 62 6a 65 63 74 20 75 63 6c 43 UconvObject uclC
e2fb0 70 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 63 6f p = NULL; /* co
e2fc0 6e 76 65 72 74 20 62 65 74 77 65 65 6e 20 6c 6f nvert between lo
e2fd0 63 61 6c 20 63 6f 64 65 70 61 67 65 20 61 6e 64 cal codepage and
e2fe0 20 55 43 53 2d 32 20 2a 2f 0d 0a 0d 0a 2f 2a 0d UCS-2 */..../*.
e2ff0 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 .** Helper funct
e3000 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a ion to initializ
e3010 65 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e e the conversion
e3020 20 6f 62 6a 65 63 74 73 20 66 72 6f 6d 20 61 6e objects from an
e3030 64 20 74 6f 20 55 54 46 2d 38 2e 0d 0a 2a 2f 0d d to UTF-8...*/.
e3040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 .static void ini
e3050 74 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 20 76 tUconvObjects( v
e3060 6f 69 64 20 29 7b 0d 0a 20 20 69 66 28 20 55 6e oid ){.. if( Un
e3070 69 43 72 65 61 74 65 55 63 6f 6e 76 4f 62 6a 65 iCreateUconvObje
e3080 63 74 28 20 55 54 46 5f 38 2c 20 26 75 63 55 74 ct( UTF_8, &ucUt
e3090 66 38 20 29 20 21 3d 20 55 4c 53 5f 53 55 43 43 f8 ) != ULS_SUCC
e30a0 45 53 53 20 29 0d 0a 20 20 20 20 75 63 55 74 66 ESS ).. ucUtf
e30b0 38 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 69 66 20 8 = NULL;.. if
e30c0 28 20 55 6e 69 43 72 65 61 74 65 55 63 6f 6e 76 ( UniCreateUconv
e30d0 4f 62 6a 65 63 74 28 20 28 55 6e 69 43 68 61 72 Object( (UniChar
e30e0 20 2a 29 4c 22 40 70 61 74 68 3d 79 65 73 22 2c *)L"@path=yes",
e30f0 20 26 75 63 6c 43 70 20 29 20 21 3d 20 55 4c 53 &uclCp ) != ULS
e3100 5f 53 55 43 43 45 53 53 20 29 0d 0a 20 20 20 20 _SUCCESS )..
e3110 75 63 6c 43 70 20 3d 20 4e 55 4c 4c 3b 0d 0a 7d uclCp = NULL;..}
e3120 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 48 65 6c 70 65 ..../*..** Helpe
e3130 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 72 r function to fr
e3140 65 65 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f ee the conversio
e3150 6e 20 6f 62 6a 65 63 74 73 20 66 72 6f 6d 20 61 n objects from a
e3160 6e 64 20 74 6f 20 55 54 46 2d 38 2e 0d 0a 2a 2f nd to UTF-8...*/
e3170 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 ..static void fr
e3180 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 20 eeUconvObjects(
e3190 76 6f 69 64 20 29 7b 0d 0a 20 20 69 66 20 28 20 void ){.. if (
e31a0 75 63 55 74 66 38 20 29 0d 0a 20 20 20 20 55 6e ucUtf8 ).. Un
e31b0 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74 iFreeUconvObject
e31c0 28 20 75 63 55 74 66 38 20 29 3b 0d 0a 20 20 69 ( ucUtf8 );.. i
e31d0 66 20 28 20 75 63 6c 43 70 20 29 0d 0a 20 20 20 f ( uclCp )..
e31e0 20 55 6e 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a UniFreeUconvObj
e31f0 65 63 74 28 20 75 63 6c 43 70 20 29 3b 0d 0a 20 ect( uclCp );..
e3200 20 75 63 55 74 66 38 20 3d 20 4e 55 4c 4c 3b 0d ucUtf8 = NULL;.
e3210 0a 20 20 75 63 6c 43 70 20 3d 20 4e 55 4c 4c 3b . uclCp = NULL;
e3220 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 48 65 ..}..../*..** He
e3230 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f lper function to
e3240 20 63 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 66 convert UTF-8 f
e3250 69 6c 65 6e 61 6d 65 73 20 74 6f 20 6c 6f 63 61 ilenames to loca
e3260 6c 20 4f 53 2f 32 20 63 6f 64 65 70 61 67 65 2e l OS/2 codepage.
e3270 0d 0a 2a 2a 20 54 68 65 20 74 77 6f 2d 73 74 65 ..** The two-ste
e3280 70 20 70 72 6f 63 65 73 73 3a 20 66 69 72 73 74 p process: first
e3290 20 63 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 63 convert the inc
e32a0 6f 6d 69 6e 67 20 55 54 46 2d 38 20 73 74 72 69 oming UTF-8 stri
e32b0 6e 67 0d 0a 2a 2a 20 69 6e 74 6f 20 55 43 53 2d ng..** into UCS-
e32c0 32 20 61 6e 64 20 74 68 65 6e 20 66 72 6f 6d 20 2 and then from
e32d0 55 43 53 2d 32 20 74 6f 20 74 68 65 20 63 75 72 UCS-2 to the cur
e32e0 72 65 6e 74 20 63 6f 64 65 70 61 67 65 2e 0d 0a rent codepage...
e32f0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 ** The returned
e3300 63 68 61 72 20 70 6f 69 6e 74 65 72 20 68 61 73 char pointer has
e3310 20 74 6f 20 62 65 20 66 72 65 65 64 2e 0d 0a 2a to be freed...*
e3320 2f 0d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a /..static char *
e3330 63 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68 54 convertUtf8PathT
e3340 6f 43 70 28 20 63 6f 6e 73 74 20 63 68 61 72 20 oCp( const char
e3350 2a 69 6e 20 29 7b 0d 0a 20 20 55 6e 69 43 68 61 *in ){.. UniCha
e3360 72 20 74 65 6d 70 50 61 74 68 5b 43 43 48 4d 41 r tempPath[CCHMA
e3370 58 50 41 54 48 5d 3b 0d 0a 20 20 63 68 61 72 20 XPATH];.. char
e3380 2a 6f 75 74 20 3d 20 28 63 68 61 72 20 2a 29 63 *out = (char *)c
e3390 61 6c 6c 6f 63 28 20 43 43 48 4d 41 58 50 41 54 alloc( CCHMAXPAT
e33a0 48 2c 20 31 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 H, 1 );.... if(
e33b0 20 21 6f 75 74 20 29 0d 0a 20 20 20 20 72 65 74 !out ).. ret
e33c0 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 0d 0a 20 20 69 urn NULL;.... i
e33d0 66 28 20 21 75 63 55 74 66 38 20 7c 7c 20 21 75 f( !ucUtf8 || !u
e33e0 63 6c 43 70 20 29 0d 0a 20 20 20 20 69 6e 69 74 clCp ).. init
e33f0 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 29 3b 0d UconvObjects();.
e3400 0a 0d 0a 20 20 2f 2a 20 64 65 74 65 72 6d 69 6e ... /* determin
e3410 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 e string for the
e3420 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6f 66 20 55 conversion of U
e3430 54 46 2d 38 20 77 68 69 63 68 20 69 73 20 43 50 TF-8 which is CP
e3440 31 32 30 38 20 2a 2f 0d 0a 20 20 69 66 28 20 55 1208 */.. if( U
e3450 6e 69 53 74 72 54 6f 55 63 73 28 20 75 63 55 74 niStrToUcs( ucUt
e3460 66 38 2c 20 74 65 6d 70 50 61 74 68 2c 20 28 63 f8, tempPath, (c
e3470 68 61 72 20 2a 29 69 6e 2c 20 43 43 48 4d 41 58 har *)in, CCHMAX
e3480 50 41 54 48 20 29 20 21 3d 20 55 4c 53 5f 53 55 PATH ) != ULS_SU
e3490 43 43 45 53 53 20 29 0d 0a 20 20 20 20 72 65 74 CCESS ).. ret
e34a0 75 72 6e 20 6f 75 74 3b 20 2f 2a 20 69 66 20 63 urn out; /* if c
e34b0 6f 6e 76 65 72 73 69 6f 6e 20 66 61 69 6c 73 2c onversion fails,
e34c0 20 72 65 74 75 72 6e 20 74 68 65 20 65 6d 70 74 return the empt
e34d0 79 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 0d 0a 20 y string */....
e34e0 20 2f 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 /* conversion f
e34f0 6f 72 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 or current codep
e3500 61 67 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 age which can be
e3510 20 75 73 65 64 20 66 6f 72 20 70 61 74 68 73 20 used for paths
e3520 2a 2f 0d 0a 20 20 55 6e 69 53 74 72 46 72 6f 6d */.. UniStrFrom
e3530 55 63 73 28 20 75 63 6c 43 70 2c 20 6f 75 74 2c Ucs( uclCp, out,
e3540 20 74 65 6d 70 50 61 74 68 2c 20 43 43 48 4d 41 tempPath, CCHMA
e3550 58 50 41 54 48 20 29 3b 0d 0a 0d 0a 20 20 72 65 XPATH );.... re
e3560 74 75 72 6e 20 6f 75 74 3b 0d 0a 7d 0d 0a 0d 0a turn out;..}....
e3570 2f 2a 0d 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 /*..** Helper fu
e3580 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 nction to conver
e3590 74 20 66 69 6c 65 6e 61 6d 65 73 20 66 72 6f 6d t filenames from
e35a0 20 6c 6f 63 61 6c 20 63 6f 64 65 70 61 67 65 20 local codepage
e35b0 74 6f 20 55 54 46 2d 38 2e 0d 0a 2a 2a 20 54 68 to UTF-8...** Th
e35c0 65 20 74 77 6f 2d 73 74 65 70 20 70 72 6f 63 65 e two-step proce
e35d0 73 73 3a 20 66 69 72 73 74 20 63 6f 6e 76 65 72 ss: first conver
e35e0 74 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 63 t the incoming c
e35f0 6f 64 65 70 61 67 65 2d 73 70 65 63 69 66 69 63 odepage-specific
e3600 0d 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 74 6f ..** string into
e3610 20 55 43 53 2d 32 20 61 6e 64 20 74 68 65 6e 20 UCS-2 and then
e3620 66 72 6f 6d 20 55 43 53 2d 32 20 74 6f 20 74 68 from UCS-2 to th
e3630 65 20 63 6f 64 65 70 61 67 65 20 6f 66 20 55 54 e codepage of UT
e3640 46 2d 38 2e 0d 0a 2a 2a 20 54 68 65 20 72 65 74 F-8...** The ret
e3650 75 72 6e 65 64 20 63 68 61 72 20 70 6f 69 6e 74 urned char point
e3660 65 72 20 68 61 73 20 74 6f 20 62 65 20 66 72 65 er has to be fre
e3670 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 ed...**..** This
e3680 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 6e function is non
e3690 2d 73 74 61 74 69 63 20 74 6f 20 62 65 20 61 62 -static to be ab
e36a0 6c 65 20 74 6f 20 75 73 65 20 74 68 69 73 20 69 le to use this i
e36b0 6e 20 73 68 65 6c 6c 2e 63 20 61 6e 64 0d 0a 2a n shell.c and..*
e36c0 2a 20 73 69 6d 69 6c 61 72 20 61 70 70 6c 69 63 * similar applic
e36d0 61 74 69 6f 6e 73 20 74 68 61 74 20 74 61 6b 65 ations that take
e36e0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 command line ar
e36f0 67 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 63 68 guments...*/..ch
e3700 61 72 20 2a 63 6f 6e 76 65 72 74 43 70 50 61 74 ar *convertCpPat
e3710 68 54 6f 55 74 66 38 28 20 63 6f 6e 73 74 20 63 hToUtf8( const c
e3720 68 61 72 20 2a 69 6e 20 29 7b 0d 0a 20 20 55 6e har *in ){.. Un
e3730 69 43 68 61 72 20 74 65 6d 70 50 61 74 68 5b 43 iChar tempPath[C
e3740 43 48 4d 41 58 50 41 54 48 5d 3b 0d 0a 20 20 63 CHMAXPATH];.. c
e3750 68 61 72 20 2a 6f 75 74 20 3d 20 28 63 68 61 72 har *out = (char
e3760 20 2a 29 63 61 6c 6c 6f 63 28 20 43 43 48 4d 41 *)calloc( CCHMA
e3770 58 50 41 54 48 2c 20 31 20 29 3b 0d 0a 0d 0a 20 XPATH, 1 );....
e3780 20 69 66 28 20 21 6f 75 74 20 29 0d 0a 20 20 20 if( !out )..
e3790 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 0d return NULL;...
e37a0 0a 20 20 69 66 28 20 21 75 63 55 74 66 38 20 7c . if( !ucUtf8 |
e37b0 7c 20 21 75 63 6c 43 70 20 29 0d 0a 20 20 20 20 | !uclCp )..
e37c0 69 6e 69 74 55 63 6f 6e 76 4f 62 6a 65 63 74 73 initUconvObjects
e37d0 28 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 63 6f 6e 76 ();.... /* conv
e37e0 65 72 73 69 6f 6e 20 66 6f 72 20 63 75 72 72 65 ersion for curre
e37f0 6e 74 20 63 6f 64 65 70 61 67 65 20 77 68 69 63 nt codepage whic
e3800 68 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f h can be used fo
e3810 72 20 70 61 74 68 73 20 2a 2f 0d 0a 20 20 69 66 r paths */.. if
e3820 28 20 55 6e 69 53 74 72 54 6f 55 63 73 28 20 75 ( UniStrToUcs( u
e3830 63 6c 43 70 2c 20 74 65 6d 70 50 61 74 68 2c 20 clCp, tempPath,
e3840 28 63 68 61 72 20 2a 29 69 6e 2c 20 43 43 48 4d (char *)in, CCHM
e3850 41 58 50 41 54 48 20 29 20 21 3d 20 55 4c 53 5f AXPATH ) != ULS_
e3860 53 55 43 43 45 53 53 20 29 0d 0a 20 20 20 20 72 SUCCESS ).. r
e3870 65 74 75 72 6e 20 6f 75 74 3b 20 2f 2a 20 69 66 eturn out; /* if
e3880 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 61 69 6c conversion fail
e3890 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 6d s, return the em
e38a0 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 0d pty string */...
e38b0 0a 20 20 2f 2a 20 64 65 74 65 72 6d 69 6e 65 20 . /* determine
e38c0 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 63 string for the c
e38d0 6f 6e 76 65 72 73 69 6f 6e 20 6f 66 20 55 54 46 onversion of UTF
e38e0 2d 38 20 77 68 69 63 68 20 69 73 20 43 50 31 32 -8 which is CP12
e38f0 30 38 20 2a 2f 0d 0a 20 20 55 6e 69 53 74 72 46 08 */.. UniStrF
e3900 72 6f 6d 55 63 73 28 20 75 63 55 74 66 38 2c 20 romUcs( ucUtf8,
e3910 6f 75 74 2c 20 74 65 6d 70 50 61 74 68 2c 20 43 out, tempPath, C
e3920 43 48 4d 41 58 50 41 54 48 20 29 3b 0d 0a 0d 0a CHMAXPATH );....
e3930 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0d 0a 7d return out;..}
e3940 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 ......#ifndef SQ
e3950 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 0d LITE_OMIT_WAL...
e3960 0a 2f 2a 0d 0a 2a 2a 20 55 73 65 20 6d 61 69 6e ./*..** Use main
e3970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 database file f
e3980 6f 72 20 69 6e 74 65 72 70 72 6f 63 65 73 73 20 or interprocess
e3990 6c 6f 63 6b 69 6e 67 2e 20 49 66 20 75 6e 2d 64 locking. If un-d
e39a0 65 66 69 6e 65 64 0d 0a 2a 2a 20 61 20 73 65 70 efined..** a sep
e39b0 61 72 61 74 65 20 66 69 6c 65 20 69 73 20 63 72 arate file is cr
e39c0 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 70 eated for this p
e39d0 75 72 70 6f 73 65 2e 20 54 68 65 20 66 69 6c 65 urpose. The file
e39e0 20 77 69 6c 6c 20 62 65 0d 0a 2a 2a 20 75 73 65 will be..** use
e39f0 64 20 6f 6e 6c 79 20 74 6f 20 73 65 74 20 66 69 d only to set fi
e3a00 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 72 65 20 le locks. There
e3a10 77 69 6c 6c 20 62 65 20 6e 6f 20 64 61 74 61 20 will be no data
e3a20 77 72 69 74 74 65 6e 20 74 6f 20 69 74 2e 0d 0a written to it...
e3a30 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
e3a40 54 45 5f 4f 53 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f TE_OS2_NO_WAL_LO
e3a50 43 4b 5f 46 49 4c 45 20 20 20 20 20 0d 0a 0d 0a CK_FILE ....
e3a60 23 69 66 20 30 0d 0a 73 74 61 74 69 63 20 76 6f #if 0..static vo
e3a70 69 64 20 5f 45 52 52 5f 54 52 41 43 45 28 20 63 id _ERR_TRACE( c
e3a80 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 2c 20 onst char *fmt,
e3a90 2e 2e 2e 20 29 20 7b 0d 0a 20 20 76 61 5f 6c 69 ... ) {.. va_li
e3aa0 73 74 20 20 61 70 3b 0d 0a 20 20 76 61 5f 73 74 st ap;.. va_st
e3ab0 61 72 74 28 61 70 2c 20 66 6d 74 29 3b 0d 0a 20 art(ap, fmt);..
e3ac0 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 vfprintf(stderr
e3ad0 2c 20 66 6d 74 2c 20 61 70 29 3b 0d 0a 20 20 66 , fmt, ap);.. f
e3ae0 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0d 0a flush(stderr);..
e3af0 7d 0d 0a 23 64 65 66 69 6e 65 20 45 52 52 5f 54 }..#define ERR_T
e3b00 52 41 43 45 28 72 63 2c 20 6d 73 67 29 20 20 20 RACE(rc, msg)
e3b10 20 20 20 20 20 5c 0d 0a 20 20 20 20 20 20 20 20 \..
e3b20 69 66 28 20 28 72 63 29 20 21 3d 20 53 51 4c 49 if( (rc) != SQLI
e3b30 54 45 5f 4f 4b 20 29 20 5f 45 52 52 5f 54 52 41 TE_OK ) _ERR_TRA
e3b40 43 45 20 6d 73 67 3b 0d 0a 23 65 6c 73 65 0d 0a CE msg;..#else..
e3b50 23 64 65 66 69 6e 65 20 45 52 52 5f 54 52 41 43 #define ERR_TRAC
e3b60 45 28 72 63 2c 20 6d 73 67 29 0d 0a 23 65 6e 64 E(rc, msg)..#end
e3b70 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 48 65 6c if..../*..** Hel
e3b80 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f per functions to
e3b90 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 obtain and reli
e3ba0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 nquish the globa
e3bb0 6c 20 6d 75 74 65 78 2e 20 54 68 65 0d 0a 2a 2a l mutex. The..**
e3bc0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 global mutex is
e3bd0 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 used to protect
e3be0 20 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 2e os2ShmNodeList.
e3bf0 0d 0a 2a 2a 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f ..**..** Functio
e3c00 6e 20 6f 73 32 53 68 6d 4d 75 74 65 78 48 65 6c n os2ShmMutexHel
e3c10 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 d() is used to a
e3c20 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 ssert() that the
e3c30 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0d 0a global mutex ..
e3c40 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 ** is held when
e3c50 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 required. This f
e3c60 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 unction is only
e3c70 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 used as part of
e3c80 61 73 73 65 72 74 28 29 20 0d 0a 2a 2a 20 73 74 assert() ..** st
e3c90 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0d 0a atements. e.g...
e3ca0 2a 2a 0d 0a 2a 2a 20 20 20 6f 73 32 53 68 6d 45 **..** os2ShmE
e3cb0 6e 74 65 72 4d 75 74 65 78 28 29 0d 0a 2a 2a 20 nterMutex()..**
e3cc0 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 32 53 assert( os2S
e3cd0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b hmMutexHeld() );
e3ce0 0d 0a 2a 2a 20 20 20 6f 73 32 53 68 6d 4c 65 61 ..** os2ShmLea
e3cf0 76 65 4d 75 74 65 78 28 29 0d 0a 2a 2f 0d 0a 73 veMutex()..*/..s
e3d00 74 61 74 69 63 20 76 6f 69 64 20 6f 73 32 53 68 tatic void os2Sh
e3d10 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 mEnterMutex(void
e3d20 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 ){.. sqlite3_mu
e3d30 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 tex_enter(sqlite
e3d40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
e3d50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
e3d60 4d 41 53 54 45 52 29 29 3b 0d 0a 7d 0d 0a 73 74 MASTER));..}..st
e3d70 61 74 69 63 20 76 6f 69 64 20 6f 73 32 53 68 6d atic void os2Shm
e3d80 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 LeaveMutex(void)
e3d90 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 {.. sqlite3_mut
e3da0 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 ex_leave(sqlite3
e3db0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 MutexAlloc(SQLIT
e3dc0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d E_MUTEX_STATIC_M
e3dd0 41 53 54 45 52 29 29 3b 0d 0a 7d 0d 0a 23 69 66 ASTER));..}..#if
e3de0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
e3df0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 ..static int os2
e3e00 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 ShmMutexHeld(voi
e3e10 64 29 20 7b 0d 0a 20 20 72 65 74 75 72 6e 20 73 d) {.. return s
e3e20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
e3e30 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c d(sqlite3MutexAl
e3e40 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
e3e50 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 _STATIC_MASTER))
e3e60 3b 0d 0a 7d 0d 0a 69 6e 74 20 47 65 74 43 75 72 ;..}..int GetCur
e3e70 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 76 6f rentProcessId(vo
e3e80 69 64 29 20 7b 0d 0a 20 20 50 50 49 42 20 70 69 id) {.. PPIB pi
e3e90 62 3b 0d 0a 20 20 44 6f 73 47 65 74 49 6e 66 6f b;.. DosGetInfo
e3ea0 42 6c 6f 63 6b 73 28 4e 55 4c 4c 2c 20 26 70 69 Blocks(NULL, &pi
e3eb0 62 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 69 b);.. return (i
e3ec0 6e 74 29 70 69 62 2d 3e 70 69 62 5f 75 6c 70 69 nt)pib->pib_ulpi
e3ed0 64 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d d;..}..#endif...
e3ee0 0a 2f 2a 0d 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 ./*..** Object u
e3ef0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 sed to represent
e3f00 20 61 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 a the shared me
e3f10 6d 6f 72 79 20 61 72 65 61 20 66 6f 72 20 61 20 mory area for a
e3f20 73 69 6e 67 6c 65 20 6c 6f 67 20 66 69 6c 65 2e single log file.
e3f30 0d 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 ..** When multip
e3f40 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 le threads all r
e3f50 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d eference the sam
e3f60 65 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 e log-summary, e
e3f70 61 63 68 20 74 68 72 65 61 64 20 68 61 73 0d 0a ach thread has..
e3f80 2a 2a 20 69 74 73 20 6f 77 6e 20 6f 73 32 46 69 ** its own os2Fi
e3f90 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 le object, but t
e3fa0 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f hey all point to
e3fb0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e a single instan
e3fc0 63 65 20 6f 66 20 74 68 69 73 20 0d 0a 2a 2a 20 ce of this ..**
e3fd0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 object. In othe
e3fe0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 6c 6f r words, each lo
e3ff0 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 g-summary is ope
e4000 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 ned only once pe
e4010 72 20 70 72 6f 63 65 73 73 2e 0d 0a 2a 2a 0d 0a r process...**..
e4020 2a 2a 20 6f 73 32 53 68 6d 4d 75 74 65 78 48 65 ** os2ShmMutexHe
e4030 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 ld() must be tru
e4040 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 e when creating
e4050 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0d 0a 2a or destroying..*
e4060 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 * this object or
e4070 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f while reading o
e4080 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f r writing the fo
e4090 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0d llowing fields:.
e40a0 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 6e 52 65 .**..** nRe
e40b0 66 0d 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 f..** pNext
e40c0 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f ..**..** The fo
e40d0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 llowing fields a
e40e0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 re read-only aft
e40f0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 er the object is
e4100 20 63 72 65 61 74 65 64 3a 0d 0a 2a 2a 20 0d 0a created:..** ..
e4110 2a 2a 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e ** szRegion
e4120 0d 0a 2a 2a 20 20 20 20 20 20 68 4c 6f 63 6b 46 ..** hLockF
e4130 69 6c 65 0d 0a 2a 2a 20 20 20 20 20 20 73 68 6d ile..** shm
e4140 42 61 73 65 4e 61 6d 65 0d 0a 2a 2a 0d 0a 2a 2a BaseName..**..**
e4150 20 45 69 74 68 65 72 20 6f 73 32 53 68 6d 4e 6f Either os2ShmNo
e4160 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 de.mutex must be
e4170 20 68 65 6c 64 20 6f 72 20 6f 73 32 53 68 6d 4e held or os2ShmN
e4180 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0d ode.nRef==0 and.
e4190 0a 2a 2a 20 6f 73 32 53 68 6d 4d 75 74 65 78 48 .** os2ShmMutexH
e41a0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 eld() is true wh
e41b0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 en reading or wr
e41c0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 iting any other
e41d0 66 69 65 6c 64 0d 0a 2a 2a 20 69 6e 20 74 68 69 field..** in thi
e41e0 73 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a s structure...**
e41f0 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 6f 73 32 ..*/..struct os2
e4200 53 68 6d 4e 6f 64 65 20 7b 0d 0a 20 20 73 71 6c ShmNode {.. sql
e4210 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 ite3_mutex *mute
e4220 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 x; /* Mutex
e4230 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 to access this
e4240 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 6f 73 32 object */.. os2
e4250 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 ShmNode *pNext;
e4260 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 /* Next
e4270 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f in list of all o
e4280 73 32 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 s2ShmNode object
e4290 73 20 2a 2f 0d 0a 0d 0a 20 20 69 6e 74 20 73 7a s */.... int sz
e42a0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 Region;
e42b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
e42c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 shared-memory re
e42d0 67 69 6f 6e 73 20 2a 2f 0d 0a 0d 0a 20 20 69 6e gions */.... in
e42e0 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 t nRegion;
e42f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
e4300 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 of array apRegi
e4310 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 2a on */.. void **
e4320 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 apRegion;
e4330 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 /* Array of
e4340 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 68 61 72 pointers to shar
e4350 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e ed-memory region
e4360 73 20 2a 2f 0d 0a 0d 0a 20 20 69 6e 74 20 6e 52 s */.... int nR
e4370 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ef;
e4380 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
e4390 66 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 6f 62 6a f os2ShmLink obj
e43a0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f ects pointing to
e43b0 20 74 68 69 73 20 2a 2f 0d 0a 20 20 6f 73 32 53 this */.. os2S
e43c0 68 6d 4c 69 6e 6b 20 2a 70 46 69 72 73 74 3b 20 hmLink *pFirst;
e43d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 /* First
e43e0 6f 73 32 53 68 6d 4c 69 6e 6b 20 6f 62 6a 65 63 os2ShmLink objec
e43f0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 t pointing to th
e4400 69 73 20 2a 2f 0d 0a 0d 0a 20 20 48 46 49 4c 45 is */.... HFILE
e4410 20 68 4c 6f 63 6b 46 69 6c 65 3b 20 20 20 20 20 hLockFile;
e4420 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 75 73 /* File us
e4430 65 64 20 66 6f 72 20 69 6e 74 65 72 2d 70 72 6f ed for inter-pro
e4440 63 65 73 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 6b cess memory lock
e4450 69 6e 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 73 ing */.. char s
e4460 68 6d 42 61 73 65 4e 61 6d 65 5b 31 5d 3b 20 20 hmBaseName[1];
e4470 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
e4480 74 68 65 20 6d 65 6d 6f 72 79 20 6f 62 6a 65 63 the memory objec
e4490 74 20 21 21 21 20 6d 75 73 74 20 6c 61 73 74 20 t !!! must last
e44a0 21 21 21 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a !!! */..};......
e44b0 2f 2a 0d 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 /*..** Structure
e44c0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 used internally
e44d0 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 by this VFS to
e44e0 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 record the state
e44f0 20 6f 66 20 61 6e 0d 0a 2a 2a 20 6f 70 65 6e 20 of an..** open
e4500 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f shared memory co
e4510 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a nnection...**..*
e4520 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
e4530 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 fields are initi
e4540 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 alized when this
e4550 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 object is creat
e4560 65 64 20 61 6e 64 0d 0a 2a 2a 20 61 72 65 20 72 ed and..** are r
e4570 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 ead-only thereaf
e4580 74 65 72 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ter:..**..**
e4590 6f 73 32 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0d os2Shm.pShmNode.
e45a0 0a 2a 2a 20 20 20 20 6f 73 32 53 68 6d 2e 69 64 .** os2Shm.id
e45b0 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 6f 74 68 ..**..** All oth
e45c0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 er fields are re
e45d0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 6f ad/write. The o
e45e0 73 32 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e s2Shm.pShmNode->
e45f0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 mutex must be he
e4600 6c 64 0d 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 ld..** while acc
e4610 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f essing any read/
e4620 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0d 0a 2a write fields...*
e4630 2f 0d 0a 73 74 72 75 63 74 20 6f 73 32 53 68 6d /..struct os2Shm
e4640 4c 69 6e 6b 20 7b 0d 0a 20 20 6f 73 32 53 68 6d Link {.. os2Shm
e4650 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 Node *pShmNode;
e4660 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 /* The unde
e4670 72 6c 79 69 6e 67 20 6f 73 32 53 68 6d 4e 6f 64 rlying os2ShmNod
e4680 65 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 6f e object */.. o
e4690 73 32 53 68 6d 4c 69 6e 6b 20 2a 70 4e 65 78 74 s2ShmLink *pNext
e46a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 ; /* Nex
e46b0 74 20 6f 73 32 53 68 6d 20 77 69 74 68 20 74 68 t os2Shm with th
e46c0 65 20 73 61 6d 65 20 6f 73 32 53 68 6d 4e 6f 64 e same os2ShmNod
e46d0 65 20 2a 2f 0d 0a 20 20 75 33 32 20 73 68 61 72 e */.. u32 shar
e46e0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 edMask;
e46f0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 /* Mask of sh
e4700 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 ared locks held
e4710 2a 2f 0d 0a 20 20 75 33 32 20 65 78 63 6c 4d 61 */.. u32 exclMa
e4720 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 sk;
e4730 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c /* Mask of excl
e4740 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 usive locks held
e4750 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 */..#ifdef SQLI
e4760 54 45 5f 44 45 42 55 47 0d 0a 20 20 75 38 20 69 TE_DEBUG.. u8 i
e4770 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d;
e4780 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 /* Id of
e4790 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 this connection
e47a0 77 69 74 68 20 69 74 73 20 6f 73 32 53 68 6d 4e with its os2ShmN
e47b0 6f 64 65 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a ode */..#endif..
e47c0 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 };....../*..** A
e47d0 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 global list of
e47e0 61 6c 6c 20 6f 73 32 53 68 6d 4e 6f 64 65 20 6f all os2ShmNode o
e47f0 62 6a 65 63 74 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 bjects...**..**
e4800 54 68 65 20 6f 73 32 53 68 6d 4d 75 74 65 78 48 The os2ShmMutexH
e4810 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 eld() must be tr
e4820 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 ue while reading
e4830 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 or writing this
e4840 20 6c 69 73 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 list...*/..stat
e4850 69 63 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 6f ic os2ShmNode *o
e4860 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 s2ShmNodeList =
e4870 4e 55 4c 4c 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 NULL;..../*..**
e4880 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 Constants used f
e4890 6f 72 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2f 0d 0a or locking..*/..
e48a0 23 69 66 64 65 66 20 20 53 51 4c 49 54 45 5f 4f #ifdef SQLITE_O
e48b0 53 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 4b 5f 46 S2_NO_WAL_LOCK_F
e48c0 49 4c 45 0d 0a 23 64 65 66 69 6e 65 20 4f 53 32 ILE..#define OS2
e48d0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 50 45 4e _SHM_BASE (PEN
e48e0 44 49 4e 47 5f 42 59 54 45 20 2b 20 30 78 31 30 DING_BYTE + 0x10
e48f0 30 30 30 29 20 20 20 20 20 20 20 20 20 2f 2a 20 000) /*
e4900 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 first lock byte
e4910 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 */..#else..#defi
e4920 6e 65 20 4f 53 32 5f 53 48 4d 5f 42 41 53 45 20 ne OS2_SHM_BASE
e4930 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 ((22+SQLITE_SH
e4940 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 M_NLOCK)*4)
e4950 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b /* first lock
e4960 20 62 79 74 65 20 2a 2f 0d 0a 23 65 6e 64 69 66 byte */..#endif
e4970 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 4f 53 32 5f ....#define OS2_
e4980 53 48 4d 5f 44 4d 53 20 20 20 20 28 4f 53 32 5f SHM_DMS (OS2_
e4990 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f SHM_BASE+SQLITE_
e49a0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 SHM_NLOCK) /* d
e49b0 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f eadman switch */
e49c0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70 6c 79 ..../*..** Apply
e49d0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 advisory locks
e49e0 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 for all n bytes
e49f0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 beginning at ofs
e4a00 74 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 t...*/..#define
e4a10 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 20 20 20 _SHM_UNLCK 1
e4a20 2f 2a 20 6e 6f 20 6c 6f 63 6b 20 2a 2f 0d 0a 23 /* no lock */..#
e4a30 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 define _SHM_RDLC
e4a40 4b 20 20 32 20 20 20 2f 2a 20 73 68 61 72 65 64 K 2 /* shared
e4a50 20 6c 6f 63 6b 2c 20 6e 6f 20 77 61 69 74 20 2a lock, no wait *
e4a60 2f 0d 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f /..#define _SHM_
e4a70 57 52 4c 43 4b 20 20 33 20 20 20 2f 2a 20 65 78 WRLCK 3 /* ex
e4a80 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 6e 6f 20 lusive lock, no
e4a90 77 61 69 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 wait */..#define
e4aa0 20 5f 53 48 4d 5f 57 52 4c 43 4b 5f 57 41 49 54 _SHM_WRLCK_WAIT
e4ab0 20 34 20 2f 2a 20 65 78 63 6c 75 73 69 76 65 20 4 /* exclusive
e4ac0 6c 6f 63 6b 2c 20 77 61 69 74 20 2a 2f 0d 0a 73 lock, wait */..s
e4ad0 74 61 74 69 63 20 69 6e 74 20 6f 73 32 53 68 6d tatic int os2Shm
e4ae0 53 79 73 74 65 6d 4c 6f 63 6b 28 0d 0a 20 20 6f SystemLock(.. o
e4af0 73 32 53 68 6d 4e 6f 64 65 20 2a 70 4e 6f 64 65 s2ShmNode *pNode
e4b00 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f , /* Apply lo
e4b10 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e cks to this open
e4b20 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 shared-memory s
e4b30 65 67 6d 65 6e 74 20 2a 2f 0d 0a 20 20 69 6e 74 egment */.. int
e4b40 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 lockType,
e4b50 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b /* _SHM_UNLCK
e4b60 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 5f 53 , _SHM_RDLCK, _S
e4b70 48 4d 5f 57 52 4c 43 4b 20 6f 72 20 5f 53 48 4d HM_WRLCK or _SHM
e4b80 5f 57 52 4c 43 4b 5f 57 41 49 54 20 2a 2f 0d 0a _WRLCK_WAIT */..
e4b90 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 int ofst,
e4ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 /* Offse
e4bb0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 t to first byte
e4bc0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c to be locked/unl
e4bd0 6f 63 6b 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 ocked */.. int
e4be0 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 nByte
e4bf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
e4c00 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 ytes to lock or
e4c10 75 6e 6c 6f 63 6b 20 2a 2f 0d 0a 29 7b 0d 0a 20 unlock */..){..
e4c20 20 41 50 49 52 45 54 20 72 63 3b 0d 0a 20 20 46 APIRET rc;.. F
e4c30 49 4c 45 4c 4f 43 4b 20 61 72 65 61 3b 0d 0a 20 ILELOCK area;..
e4c40 20 55 4c 4f 4e 47 20 6d 6f 64 65 2c 20 74 69 6d ULONG mode, tim
e4c50 65 6f 75 74 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 63 eout;.... /* Ac
e4c60 63 65 73 73 20 74 6f 20 74 68 65 20 6f 73 32 53 cess to the os2S
e4c70 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 hmNode object is
e4c80 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 serialized by t
e4c90 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0d 0a 20 20 he caller */..
e4ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
e4cb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 4e 6f 64 65 mutex_held(pNode
e4cc0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 4e 6f 64 ->mutex) || pNod
e4cd0 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0d 0a 0d e->nRef==0 );...
e4ce0 0a 20 20 6d 6f 64 65 20 3d 20 31 3b 20 20 20 20 . mode = 1;
e4cf0 20 2f 2a 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 /* shared lock
e4d00 2a 2f 0d 0a 20 20 74 69 6d 65 6f 75 74 20 3d 20 */.. timeout =
e4d10 30 3b 20 20 2f 2a 20 6e 6f 20 77 61 69 74 20 2a 0; /* no wait *
e4d20 2f 0d 0a 20 20 61 72 65 61 2e 6c 4f 66 66 73 65 /.. area.lOffse
e4d30 74 20 3d 20 6f 66 73 74 3b 0d 0a 20 20 61 72 65 t = ofst;.. are
e4d40 61 2e 6c 52 61 6e 67 65 20 3d 20 6e 42 79 74 65 a.lRange = nByte
e4d50 3b 0d 0a 0d 0a 20 20 73 77 69 74 63 68 28 20 6c ;.... switch( l
e4d60 6f 63 6b 54 79 70 65 20 29 20 7b 0d 0a 20 20 20 ockType ) {..
e4d70 20 63 61 73 65 20 5f 53 48 4d 5f 57 52 4c 43 4b case _SHM_WRLCK
e4d80 5f 57 41 49 54 3a 0d 0a 20 20 20 20 20 20 74 69 _WAIT:.. ti
e4d90 6d 65 6f 75 74 20 3d 20 28 55 4c 4f 4e 47 29 2d meout = (ULONG)-
e4da0 31 3b 20 20 20 20 20 20 2f 2a 20 77 61 69 74 20 1; /* wait
e4db0 66 6f 72 65 76 65 72 20 2a 2f 0d 0a 20 20 20 20 forever */..
e4dc0 63 61 73 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 3a case _SHM_WRLCK:
e4dd0 0d 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 30 .. mode = 0
e4de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
e4df0 20 20 2f 2a 20 65 78 63 6c 75 73 69 76 65 20 6c /* exclusive l
e4e00 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65 ock */.. case
e4e10 20 5f 53 48 4d 5f 52 44 4c 43 4b 3a 0d 0a 20 20 _SHM_RDLCK:..
e4e20 20 20 20 20 72 63 20 3d 20 44 6f 73 53 65 74 46 rc = DosSetF
e4e30 69 6c 65 4c 6f 63 6b 73 28 70 4e 6f 64 65 2d 3e ileLocks(pNode->
e4e40 68 4c 6f 63 6b 46 69 6c 65 2c 20 0d 0a 20 20 20 hLockFile, ..
e4e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e4e60 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 26 61 NULL, &a
e4e70 72 65 61 2c 20 74 69 6d 65 6f 75 74 2c 20 6d 6f rea, timeout, mo
e4e80 64 65 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 de);.. brea
e4e90 6b 3b 0d 0a 20 20 20 20 2f 2a 20 63 61 73 65 20 k;.. /* case
e4ea0 5f 53 48 4d 5f 55 4e 4c 43 4b 3a 20 2a 2f 0d 0a _SHM_UNLCK: */..
e4eb0 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 default:..
e4ec0 20 20 20 20 72 63 20 3d 20 44 6f 73 53 65 74 46 rc = DosSetF
e4ed0 69 6c 65 4c 6f 63 6b 73 28 70 4e 6f 64 65 2d 3e ileLocks(pNode->
e4ee0 68 4c 6f 63 6b 46 69 6c 65 2c 20 0d 0a 20 20 20 hLockFile, ..
e4ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e4f00 20 20 20 20 20 20 20 20 26 61 72 65 61 2c 20 4e &area, N
e4f10 55 4c 4c 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20 ULL, 0, 0);..
e4f20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 7d 0d 0a break;.. }..
e4f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e4f40 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20 4f 53 .. OS
e4f50 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b TRACE(("SHM-LOCK
e4f60 20 25 64 20 25 73 20 25 73 20 30 78 25 30 38 6c %d %s %s 0x%08l
e4f70 78 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 20 20 x\n", ..
e4f80 20 20 20 70 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 pNode->hLockF
e4f90 69 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 ile,..
e4fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f rc==SQLITE_OK ?
e4fb0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 "ok" : "failed"
e4fc0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f ,.. lo
e4fd0 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c ckType==_SHM_UNL
e4fe0 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 22 20 3a 20 CK ? "Unlock" :
e4ff0 22 4c 6f 63 6b 22 2c 0d 0a 20 20 20 20 20 20 20 "Lock",..
e5000 20 20 20 20 72 63 29 29 3b 0d 0a 0d 0a 20 20 45 rc));.... E
e5010 52 52 5f 54 52 41 43 45 28 72 63 2c 20 28 22 6f RR_TRACE(rc, ("o
e5020 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 3a s2ShmSystemLock:
e5030 20 25 64 20 25 73 5c 6e 22 2c 20 72 63 2c 20 70 %d %s\n", rc, p
e5040 4e 6f 64 65 2d 3e 73 68 6d 42 61 73 65 4e 61 6d Node->shmBaseNam
e5050 65 29 29 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 e)).... return
e5060 28 20 72 63 20 3d 3d 20 30 20 29 20 3f 20 20 53 ( rc == 0 ) ? S
e5070 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 QLITE_OK : SQLIT
e5080 45 5f 42 55 53 59 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a E_BUSY;..}..../*
e5090 0d 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 6f 73 32 ..** Find an os2
e50a0 53 68 6d 4e 6f 64 65 20 69 6e 20 67 6c 6f 62 61 ShmNode in globa
e50b0 6c 20 6c 69 73 74 20 6f 72 20 61 6c 6c 6f 63 61 l list or alloca
e50c0 74 65 20 61 20 6e 65 77 20 6f 6e 65 2c 20 69 66 te a new one, if
e50d0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0d 0a 2a 2a 0d not found...**.
e50e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 .** This is not
e50f0 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d a VFS shared-mem
e5100 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 ory method; it i
e5110 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 s a utility func
e5120 74 69 6f 6e 20 63 61 6c 6c 65 64 0d 0a 2a 2a 20 tion called..**
e5130 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 by VFS shared-me
e5140 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0d 0a 2a mory methods...*
e5150 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 /..static int os
e5160 32 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 2OpenSharedMemor
e5170 79 28 20 6f 73 32 46 69 6c 65 20 2a 66 64 2c 20 y( os2File *fd,
e5180 69 6e 74 20 73 7a 52 65 67 69 6f 6e 20 29 20 7b int szRegion ) {
e5190 0d 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a .. os2ShmLink *
e51a0 70 4c 69 6e 6b 3b 0d 0a 20 20 6f 73 32 53 68 6d pLink;.. os2Shm
e51b0 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0d 0a 20 20 Node *pNode;..
e51c0 69 6e 74 20 63 62 53 68 6d 4e 61 6d 65 2c 20 72 int cbShmName, r
e51d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
e51e0 20 20 63 68 61 72 20 73 68 6d 4e 61 6d 65 5b 43 char shmName[C
e51f0 43 48 4d 41 58 50 41 54 48 20 2b 20 33 30 5d 3b CHMAXPATH + 30];
e5200 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
e5210 5f 4f 53 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 4b _OS2_NO_WAL_LOCK
e5220 5f 46 49 4c 45 0d 0a 20 20 55 4c 4f 4e 47 20 61 _FILE.. ULONG a
e5230 63 74 69 6f 6e 3b 0d 0a 23 65 6e 64 69 66 0d 0a ction;..#endif..
e5240 20 20 0d 0a 20 20 2f 2a 20 57 65 20 6e 65 65 64 .. /* We need
e5250 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c some additional
e5260 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e space at the en
e5270 64 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65 20 d to append the
e5280 72 65 67 69 6f 6e 20 6e 75 6d 62 65 72 20 2a 2f region number */
e5290 0d 0a 20 20 63 62 53 68 6d 4e 61 6d 65 20 3d 20 .. cbShmName =
e52a0 73 70 72 69 6e 74 66 28 73 68 6d 4e 61 6d 65 2c sprintf(shmName,
e52b0 20 22 5c 5c 53 48 41 52 45 4d 45 4d 5c 5c 25 73 "\\SHAREMEM\\%s
e52c0 22 2c 20 66 64 2d 3e 7a 46 75 6c 6c 50 61 74 68 ", fd->zFullPath
e52d0 43 70 20 29 3b 0d 0a 20 20 69 66 28 20 63 62 53 Cp );.. if( cbS
e52e0 68 6d 4e 61 6d 65 20 3e 3d 20 43 43 48 4d 41 58 hmName >= CCHMAX
e52f0 50 41 54 48 2d 38 20 29 0d 0a 20 20 20 20 72 65 PATH-8 ).. re
e5300 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
e5310 52 5f 53 48 4d 4f 50 45 4e 3b 20 0d 0a 0d 0a 20 R_SHMOPEN; ....
e5320 20 2f 2a 20 52 65 70 6c 61 63 65 20 63 6f 6c 6f /* Replace colo
e5330 6e 20 69 6e 20 66 69 6c 65 20 6e 61 6d 65 20 74 n in file name t
e5340 6f 20 66 6f 72 6d 20 61 20 76 61 6c 69 64 20 73 o form a valid s
e5350 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6e 61 6d hared memory nam
e5360 65 20 2a 2f 0d 0a 20 20 73 68 6d 4e 61 6d 65 5b e */.. shmName[
e5370 31 30 2b 31 5d 20 3d 20 27 21 27 3b 0d 0a 0d 0a 10+1] = '!';....
e5380 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6c 69 /* Allocate li
e5390 6e 6b 20 6f 62 6a 65 63 74 20 28 77 65 20 66 72 nk object (we fr
e53a0 65 65 20 69 74 20 6c 61 74 65 72 20 69 6e 20 63 ee it later in c
e53b0 61 73 65 20 6f 66 20 66 61 69 6c 75 72 65 29 20 ase of failure)
e53c0 2a 2f 0d 0a 20 20 70 4c 69 6e 6b 20 3d 20 73 71 */.. pLink = sq
e53d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 lite3_malloc( si
e53e0 7a 65 6f 66 28 2a 70 4c 69 6e 6b 29 20 29 3b 0d zeof(*pLink) );.
e53f0 0a 20 20 69 66 28 20 21 70 4c 69 6e 6b 20 29 0d . if( !pLink ).
e5400 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
e5410 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 0d 0a 20 20 2f TE_NOMEM;.... /
e5420 2a 20 41 63 63 65 73 73 20 6e 6f 64 65 20 6c 69 * Access node li
e5430 73 74 20 2a 2f 0d 0a 20 20 6f 73 32 53 68 6d 45 st */.. os2ShmE
e5440 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 0d 0a nterMutex();....
e5450 20 20 2f 2a 20 46 69 6e 64 20 6e 6f 64 65 20 62 /* Find node b
e5460 79 20 69 74 27 73 20 73 68 61 72 65 64 20 6d 65 y it's shared me
e5470 6d 6f 72 79 20 62 61 73 65 20 6e 61 6d 65 20 2a mory base name *
e5480 2f 0d 0a 20 20 66 6f 72 28 20 70 4e 6f 64 65 20 /.. for( pNode
e5490 3d 20 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 = os2ShmNodeList
e54a0 3b 20 0d 0a 20 20 20 20 20 20 20 70 4e 6f 64 65 ; .. pNode
e54b0 20 26 26 20 73 74 72 69 63 6d 70 28 73 68 6d 4e && stricmp(shmN
e54c0 61 6d 65 2c 20 70 4e 6f 64 65 2d 3e 73 68 6d 42 ame, pNode->shmB
e54d0 61 73 65 4e 61 6d 65 29 20 21 3d 20 30 3b 20 0d aseName) != 0; .
e54e0 0a 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 . pNode =
e54f0 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 20 20 pNode->pNext )
e5500 20 3b 0d 0a 0d 0a 20 20 2f 2a 20 4e 6f 74 20 66 ;.... /* Not f
e5510 6f 75 6e 64 3a 20 61 6c 6c 6f 63 61 74 65 20 61 ound: allocate a
e5520 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0d 0a 20 20 new node */..
e5530 69 66 28 20 21 70 4e 6f 64 65 20 29 20 7b 0d 0a if( !pNode ) {..
e5540 20 20 20 20 70 4e 6f 64 65 20 3d 20 73 71 6c 69 pNode = sqli
e5550 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 te3_malloc( size
e5560 6f 66 28 2a 70 4e 6f 64 65 29 20 2b 20 63 62 53 of(*pNode) + cbS
e5570 68 6d 4e 61 6d 65 20 29 3b 0d 0a 20 20 20 20 69 hmName );.. i
e5580 66 28 20 70 4e 6f 64 65 20 29 20 7b 0d 0a 20 20 f( pNode ) {..
e5590 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 6f 64 65 memset(pNode
e55a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 6f , 0, sizeof(*pNo
e55b0 64 65 29 20 29 3b 0d 0a 20 20 20 20 20 20 70 4e de) );.. pN
e55c0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 ode->szRegion =
e55d0 73 7a 52 65 67 69 6f 6e 3b 0d 0a 20 20 20 20 20 szRegion;..
e55e0 20 70 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69 6c pNode->hLockFil
e55f0 65 20 3d 20 28 48 46 49 4c 45 29 2d 31 3b 20 20 e = (HFILE)-1;
e5600 20 20 20 20 0d 0a 20 20 20 20 20 20 73 74 72 63 .. strc
e5610 70 79 28 70 4e 6f 64 65 2d 3e 73 68 6d 42 61 73 py(pNode->shmBas
e5620 65 4e 61 6d 65 2c 20 73 68 6d 4e 61 6d 65 29 3b eName, shmName);
e5630 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ....#ifdef SQLIT
e5640 45 5f 4f 53 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 E_OS2_NO_WAL_LOC
e5650 4b 5f 46 49 4c 45 0d 0a 20 20 20 20 20 20 69 66 K_FILE.. if
e5660 28 20 44 6f 73 44 75 70 48 61 6e 64 6c 65 28 66 ( DosDupHandle(f
e5670 64 2d 3e 68 2c 20 26 70 4e 6f 64 65 2d 3e 68 4c d->h, &pNode->hL
e5680 6f 63 6b 46 69 6c 65 29 20 21 3d 20 30 20 29 20 ockFile) != 0 )
e5690 7b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 {..#else..
e56a0 73 70 72 69 6e 74 66 28 73 68 6d 4e 61 6d 65 2c sprintf(shmName,
e56b0 20 22 25 73 2d 6c 63 6b 22 2c 20 66 64 2d 3e 7a "%s-lck", fd->z
e56c0 46 75 6c 6c 50 61 74 68 43 70 29 3b 0d 0a 20 20 FullPathCp);..
e56d0 20 20 20 20 69 66 28 20 44 6f 73 4f 70 65 6e 28 if( DosOpen(
e56e0 28 50 53 5a 29 73 68 6d 4e 61 6d 65 2c 20 26 70 (PSZ)shmName, &p
e56f0 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69 6c 65 2c Node->hLockFile,
e5700 20 26 61 63 74 69 6f 6e 2c 20 30 2c 20 46 49 4c &action, 0, FIL
e5710 45 5f 4e 4f 52 4d 41 4c 2c 20 0d 0a 20 20 20 20 E_NORMAL, ..
e5720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 OP
e5730 45 4e 5f 41 43 54 49 4f 4e 5f 4f 50 45 4e 5f 49 EN_ACTION_OPEN_I
e5740 46 5f 45 58 49 53 54 53 20 7c 20 4f 50 45 4e 5f F_EXISTS | OPEN_
e5750 41 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 46 ACTION_CREATE_IF
e5760 5f 4e 45 57 2c 0d 0a 20 20 20 20 20 20 20 20 20 _NEW,..
e5770 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 43 OPEN_AC
e5780 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 7c CESS_READWRITE |
e5790 20 4f 50 45 4e 5f 53 48 41 52 45 5f 44 45 4e 59 OPEN_SHARE_DENY
e57a0 4e 4f 4e 45 20 7c 20 0d 0a 20 20 20 20 20 20 20 NONE | ..
e57b0 20 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f OPEN_
e57c0 46 4c 41 47 53 5f 4e 4f 49 4e 48 45 52 49 54 20 FLAGS_NOINHERIT
e57d0 7c 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 46 41 49 | OPEN_FLAGS_FAI
e57e0 4c 5f 4f 4e 5f 45 52 52 4f 52 2c 0d 0a 20 20 20 L_ON_ERROR,..
e57f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e N
e5800 55 4c 4c 29 20 21 3d 20 30 20 29 20 7b 0d 0a 23 ULL) != 0 ) {..#
e5810 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20 73 endif.. s
e5820 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 qlite3_free(pNod
e5830 65 29 3b 20 20 0d 0a 20 20 20 20 20 20 20 20 72 e); .. r
e5840 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 c = SQLITE_IOERR
e5850 3b 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 ;.. } else
e5860 7b 0d 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 {.. pNode
e5870 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 ->mutex = sqlite
e5880 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 3_mutex_alloc(SQ
e5890 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 LITE_MUTEX_FAST)
e58a0 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 ;.. if( !
e58b0 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 29 20 7b pNode->mutex ) {
e58c0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 .. sqli
e58d0 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b te3_free(pNode);
e58e0 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 .. rc
e58f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
e5900 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
e5910 20 20 20 7d 20 20 20 0d 0a 20 20 20 20 7d 20 65 } .. } e
e5920 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 72 63 20 lse {.. rc
e5930 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d = SQLITE_NOMEM;.
e5940 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 . }.. ..
e5950 20 20 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 if( rc == SQLI
e5960 54 45 5f 4f 4b 20 29 20 7b 0d 0a 20 20 20 20 20 TE_OK ) {..
e5970 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 pNode->pNext =
e5980 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0d os2ShmNodeList;.
e5990 0a 20 20 20 20 20 20 6f 73 32 53 68 6d 4e 6f 64 . os2ShmNod
e59a0 65 4c 69 73 74 20 3d 20 70 4e 6f 64 65 3b 0d 0a eList = pNode;..
e59b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 } else {..
e59c0 20 20 20 20 70 4e 6f 64 65 20 3d 20 4e 55 4c 4c pNode = NULL
e59d0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 20 65 6c ;.. }.. } el
e59e0 73 65 20 69 66 28 20 70 4e 6f 64 65 2d 3e 73 7a se if( pNode->sz
e59f0 52 65 67 69 6f 6e 20 21 3d 20 73 7a 52 65 67 69 Region != szRegi
e5a00 6f 6e 20 29 20 7b 0d 0a 20 20 20 20 72 63 20 3d on ) {.. rc =
e5a10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 SQLITE_IOERR_SH
e5a20 4d 53 49 5a 45 3b 0d 0a 20 20 20 20 70 4e 6f 64 MSIZE;.. pNod
e5a30 65 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 7d 0d 0a e = NULL;.. }..
e5a40 0d 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 29 20 .. if( pNode )
e5a50 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d {.. sqlite3_m
e5a60 75 74 65 78 5f 65 6e 74 65 72 28 70 4e 6f 64 65 utex_enter(pNode
e5a70 2d 3e 6d 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 20 ->mutex);....
e5a80 20 6d 65 6d 73 65 74 28 70 4c 69 6e 6b 2c 20 30 memset(pLink, 0
e5a90 2c 20 73 69 7a 65 6f 66 28 2a 70 4c 69 6e 6b 29 , sizeof(*pLink)
e5aa0 29 3b 0d 0a 0d 0a 20 20 20 20 70 4c 69 6e 6b 2d );.... pLink-
e5ab0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 6f 64 >pShmNode = pNod
e5ac0 65 3b 0d 0a 20 20 20 20 70 4c 69 6e 6b 2d 3e 70 e;.. pLink->p
e5ad0 4e 65 78 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 46 Next = pNode->pF
e5ae0 69 72 73 74 3b 0d 0a 20 20 20 20 70 4e 6f 64 65 irst;.. pNode
e5af0 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b ->pFirst = pLink
e5b00 3b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 ;.. pNode->nR
e5b10 65 66 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 66 64 2d ef++;.... fd-
e5b20 3e 70 53 68 6d 4c 69 6e 6b 20 3d 20 70 4c 69 6e >pShmLink = pLin
e5b30 6b 3b 0d 0a 0d 0a 20 20 20 20 73 71 6c 69 74 65 k;.... sqlite
e5b40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4e 3_mutex_leave(pN
e5b50 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 ode->mutex);..
e5b60 20 20 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a .. } else {..
e5b70 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6f 63 63 /* Error occ
e5b80 75 72 65 64 2e 20 46 72 65 65 20 6f 75 72 20 6c ured. Free our l
e5b90 69 6e 6b 20 6f 62 6a 65 63 74 2e 20 2a 2f 0d 0a ink object. */..
e5ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
e5bb0 28 70 4c 69 6e 6b 29 3b 20 20 0d 0a 20 20 7d 0d (pLink); .. }.
e5bc0 0a 0d 0a 20 20 6f 73 32 53 68 6d 4c 65 61 76 65 ... os2ShmLeave
e5bd0 4d 75 74 65 78 28 29 3b 0d 0a 0d 0a 20 20 45 52 Mutex();.... ER
e5be0 52 5f 54 52 41 43 45 28 72 63 2c 20 28 22 6f 73 R_TRACE(rc, ("os
e5bf0 32 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 2OpenSharedMemor
e5c00 79 3a 20 25 64 20 20 25 73 5c 6e 22 2c 20 72 63 y: %d %s\n", rc
e5c10 2c 20 66 64 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 , fd->zFullPathC
e5c20 70 29 29 20 20 0d 0a 20 20 0d 0a 20 20 72 65 74 p)) .. .. ret
e5c30 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
e5c40 0d 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 6f ..** Purge the o
e5c50 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 s2ShmNodeList li
e5c60 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 st of all entrie
e5c70 73 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 2e 0d s with nRef==0..
e5c80 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 .**..** This is
e5c90 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 not a VFS shared
e5ca0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 -memory method;
e5cb0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 it is a utility
e5cc0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0d function called.
e5cd0 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 .** by VFS share
e5ce0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 d-memory methods
e5cf0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f ...*/..static vo
e5d00 69 64 20 6f 73 32 50 75 72 67 65 53 68 6d 4e 6f id os2PurgeShmNo
e5d10 64 65 73 28 20 69 6e 74 20 64 65 6c 65 74 65 46 des( int deleteF
e5d20 6c 61 67 20 29 20 7b 0d 0a 20 20 6f 73 32 53 68 lag ) {.. os2Sh
e5d30 6d 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0d 0a 20 mNode *pNode;..
e5d40 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 os2ShmNode **pp
e5d50 4e 6f 64 65 3b 0d 0a 0d 0a 20 20 6f 73 32 53 68 Node;.... os2Sh
e5d60 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a mEnterMutex();..
e5d70 20 20 0d 0a 20 20 70 70 4e 6f 64 65 20 3d 20 26 .. ppNode = &
e5d80 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0d os2ShmNodeList;.
e5d90 0a 0d 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 4e ... while( *ppN
e5da0 6f 64 65 20 29 20 7b 0d 0a 20 20 20 20 70 4e 6f ode ) {.. pNo
e5db0 64 65 20 3d 20 2a 70 70 4e 6f 64 65 3b 0d 0a 0d de = *ppNode;...
e5dc0 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e . if( pNode->
e5dd0 6e 52 65 66 20 3d 3d 20 30 20 29 20 7b 0d 0a 20 nRef == 0 ) {..
e5de0 20 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20 70 *ppNode = p
e5df0 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b 20 20 20 0d Node->pNext; .
e5e00 0a 20 20 20 20 20 0d 0a 20 20 20 20 20 20 69 66 . .. if
e5e10 28 20 70 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f ( pNode->apRegio
e5e20 6e 20 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f n ) {.. /
e5e30 2a 20 50 72 65 76 65 6e 74 20 6f 74 68 65 72 20 * Prevent other
e5e40 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 20 72 processes from r
e5e50 65 73 69 7a 69 6e 67 20 74 68 65 20 73 68 61 72 esizing the shar
e5e60 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 ed memory */..
e5e70 20 20 20 20 20 20 6f 73 32 53 68 6d 53 79 73 74 os2ShmSyst
e5e80 65 6d 4c 6f 63 6b 28 70 4e 6f 64 65 2c 20 5f 53 emLock(pNode, _S
e5e90 48 4d 5f 57 52 4c 43 4b 5f 57 41 49 54 2c 20 4f HM_WRLCK_WAIT, O
e5ea0 53 32 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0d S2_SHM_DMS, 1);.
e5eb0 0a 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 ... while
e5ec0 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e ( pNode->nRegion
e5ed0 2d 2d 20 29 20 7b 0d 0a 23 69 66 64 65 66 20 53 -- ) {..#ifdef S
e5ee0 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 20 QLITE_DEBUG..
e5ef0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 int rc =
e5f00 0d 0a 23 65 6e 64 69 66 20 20 20 20 20 20 20 20 ..#endif
e5f10 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 44 6f .. Do
e5f20 73 46 72 65 65 4d 65 6d 28 70 4e 6f 64 65 2d 3e sFreeMem(pNode->
e5f30 61 70 52 65 67 69 6f 6e 5b 70 4e 6f 64 65 2d 3e apRegion[pNode->
e5f40 6e 52 65 67 69 6f 6e 5d 29 3b 0d 0a 0d 0a 20 20 nRegion]);....
e5f50 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 OSTRACE(
e5f60 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d ("SHM-PURGE pid-
e5f70 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d %d unmap region=
e5f80 25 64 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 %d %s\n",..
e5f90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e (in
e5fa0 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 t)GetCurrentProc
e5fb0 65 73 73 49 64 28 29 2c 20 70 4e 6f 64 65 2d 3e essId(), pNode->
e5fc0 6e 52 65 67 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 nRegion,..
e5fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d rc =
e5fe0 3d 20 30 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 = 0 ? "ok" : "fa
e5ff0 69 6c 65 64 22 29 29 3b 0d 0a 20 20 20 20 20 20 iled"));..
e6000 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f }.... /
e6010 2a 20 41 6c 6c 6f 77 20 6f 74 68 65 72 20 70 72 * Allow other pr
e6020 6f 63 65 73 73 65 73 20 74 6f 20 72 65 73 69 7a ocesses to resiz
e6030 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d e the shared mem
e6040 6f 72 79 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 ory */..
e6050 6f 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b os2ShmSystemLock
e6060 28 70 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c (pNode, _SHM_UNL
e6070 43 4b 2c 20 4f 53 32 5f 53 48 4d 5f 44 4d 53 2c CK, OS2_SHM_DMS,
e6080 20 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 1);....
e6090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f sqlite3_free(pNo
e60a0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0d 0a de->apRegion);..
e60b0 20 20 20 20 20 20 7d 20 20 0d 0a 0d 0a 20 20 20 } ....
e60c0 20 20 20 44 6f 73 43 6c 6f 73 65 28 70 4e 6f 64 DosClose(pNod
e60d0 65 2d 3e 68 4c 6f 63 6b 46 69 6c 65 29 3b 0d 0a e->hLockFile);..
e60e0 20 20 20 20 20 20 0d 0a 23 69 66 6e 64 65 66 20 ..#ifndef
e60f0 53 51 4c 49 54 45 5f 4f 53 32 5f 4e 4f 5f 57 41 SQLITE_OS2_NO_WA
e6100 4c 5f 4c 4f 43 4b 5f 46 49 4c 45 0d 0a 20 20 20 L_LOCK_FILE..
e6110 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 if( deleteFla
e6120 67 20 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 g ) {..
e6130 63 68 61 72 20 66 69 6c 65 4e 61 6d 65 5b 43 43 char fileName[CC
e6140 48 4d 41 58 50 41 54 48 5d 3b 0d 0a 20 20 20 20 HMAXPATH];..
e6150 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 22 5c 5c /* Skip "\\
e6160 53 48 41 52 45 4d 45 4d 5c 5c 22 20 2a 2f 0d 0a SHAREMEM\\" */..
e6170 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 sprintf
e6180 28 66 69 6c 65 4e 61 6d 65 2c 20 22 25 73 2d 6c (fileName, "%s-l
e6190 63 6b 22 2c 20 70 4e 6f 64 65 2d 3e 73 68 6d 42 ck", pNode->shmB
e61a0 61 73 65 4e 61 6d 65 20 2b 20 31 30 29 3b 0d 0a aseName + 10);..
e61b0 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 74 /* rest
e61c0 6f 72 65 20 63 6f 6c 6f 6e 20 2a 2f 0d 0a 20 20 ore colon */..
e61d0 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 5b fileName[
e61e0 31 5d 20 3d 20 27 3a 27 3b 0d 0a 20 20 20 20 20 1] = ':';..
e61f0 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 44 .. D
e6200 6f 73 46 6f 72 63 65 44 65 6c 65 74 65 28 66 69 osForceDelete(fi
e6210 6c 65 4e 61 6d 65 29 3b 20 0d 0a 20 20 20 20 20 leName); ..
e6220 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 }..#endif....
e6230 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 sqlite3_mute
e6240 78 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6d 75 x_free(pNode->mu
e6250 74 65 78 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 tex);.... s
e6260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 qlite3_free(pNod
e6270 65 29 3b 0d 0a 20 20 20 20 20 20 0d 0a 20 20 20 e);.. ..
e6280 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 } else {..
e6290 20 70 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 ppNode = &pNode
e62a0 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d ->pNext;.. }.
e62b0 0a 20 20 7d 20 0d 0a 0d 0a 20 20 6f 73 32 53 68 . } .... os2Sh
e62c0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a mLeaveMutex();..
e62d0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 }..../*..** This
e62e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c function is cal
e62f0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 led to obtain a
e6300 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f pointer to regio
e6310 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 n iRegion of the
e6320 0d 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f ..** shared-memo
e6330 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ry associated wi
e6340 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 th the database
e6350 66 69 6c 65 20 69 64 2e 20 53 68 61 72 65 64 2d file id. Shared-
e6360 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0d 0a memory regions..
e6370 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 ** are numbered
e6380 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 starting from ze
e6390 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d ro. Each shared-
e63a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 memory region is
e63b0 20 73 7a 52 65 67 69 6f 6e 0d 0a 2a 2a 20 62 79 szRegion..** by
e63c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0d 0a 2a 2a tes in size...**
e63d0 0d 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 ..** If an error
e63e0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f occurs, an erro
e63f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e r code is return
e6400 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 ed and *pp is se
e6410 74 20 74 6f 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a t to NULL...**..
e6420 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 ** Otherwise, if
e6430 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 the bExtend par
e6440 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 ameter is 0 and
e6450 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 the requested sh
e6460 61 72 65 64 2d 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 ared-memory..**
e6470 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 region has not b
e6480 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 een allocated (b
e6490 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e y any client, in
e64a0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e cluding one runn
e64b0 69 6e 67 20 69 6e 20 61 0d 0a 2a 2a 20 73 65 70 ing in a..** sep
e64c0 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 arate process),
e64d0 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 then *pp is set
e64e0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 to NULL and SQLI
e64f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 TE_OK returned.
e6500 49 66 0d 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 If..** bExtend i
e6510 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 s non-zero and t
e6520 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 he requested sha
e6530 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f red-memory regio
e6540 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0d 0a 2a n has not yet..*
e6550 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 * been allocated
e6560 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 , it is allocate
e6570 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 d by this functi
e6580 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 on...**..** If t
e6590 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 he shared-memory
e65a0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 region has alre
e65b0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 ady been allocat
e65c0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 ed or is allocat
e65d0 65 64 20 62 79 0d 0a 2a 2a 20 74 68 69 73 20 63 ed by..** this c
e65e0 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 all as described
e65f0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 above, then it
e6600 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 is mapped into t
e6610 68 69 73 20 70 72 6f 63 65 73 73 65 73 0d 0a 2a his processes..*
e6620 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 * address space
e6630 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c (if it is not al
e6640 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 ready), *pp is s
e6650 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 et to point to t
e6660 68 65 20 6d 61 70 70 65 64 0d 0a 2a 2a 20 6d 65 he mapped..** me
e6670 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f mory and SQLITE_
e6680 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f OK returned...*/
e6690 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 ..static int os2
e66a0 53 68 6d 4d 61 70 28 0d 0a 20 20 73 71 6c 69 74 ShmMap(.. sqlit
e66b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 e3_file *id,
e66c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 /* Ha
e66d0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 ndle open on dat
e66e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 abase file */..
e66f0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 int iRegion,
e6700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e6710 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 /* Region to re
e6720 74 72 69 65 76 65 20 2a 2f 0d 0a 20 20 69 6e 74 trieve */.. int
e6730 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 szRegion,
e6740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
e6750 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 Size of regions
e6760 2a 2f 0d 0a 20 20 69 6e 74 20 62 45 78 74 65 6e */.. int bExten
e6770 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
e6780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f /* True to
e6790 20 65 78 74 65 6e 64 20 62 6c 6f 63 6b 20 69 66 extend block if
e67a0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0d 0a 20 necessary */..
e67b0 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a void volatile *
e67c0 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 *pp
e67d0 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 /* OUT: Mapped
e67e0 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 29 7b 0d 0a 20 memory */..){..
e67f0 20 50 56 4f 49 44 20 70 76 54 65 6d 70 3b 0d 0a PVOID pvTemp;..
e6800 20 20 76 6f 69 64 20 2a 2a 61 70 52 65 67 69 6f void **apRegio
e6810 6e 3b 0d 0a 20 20 6f 73 32 53 68 6d 4e 6f 64 65 n;.. os2ShmNode
e6820 20 2a 70 4e 6f 64 65 3b 0d 0a 20 20 69 6e 74 20 *pNode;.. int
e6830 6e 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f n, rc = SQLITE_O
e6840 4b 3b 0d 0a 20 20 63 68 61 72 20 73 68 6d 4e 61 K;.. char shmNa
e6850 6d 65 5b 43 43 48 4d 41 58 50 41 54 48 5d 3b 0d me[CCHMAXPATH];.
e6860 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c . os2File *pFil
e6870 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 e = (os2File*)id
e6880 3b 0d 0a 20 20 0d 0a 20 20 2a 70 70 20 3d 20 4e ;.. .. *pp = N
e6890 55 4c 4c 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 70 ULL;.... if( !p
e68a0 46 69 6c 65 2d 3e 70 53 68 6d 4c 69 6e 6b 20 29 File->pShmLink )
e68b0 0d 0a 20 20 20 20 72 63 20 3d 20 6f 73 32 4f 70 .. rc = os2Op
e68c0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 20 enSharedMemory(
e68d0 70 46 69 6c 65 2c 20 73 7a 52 65 67 69 6f 6e 20 pFile, szRegion
e68e0 29 3b 0d 0a 20 20 0d 0a 20 20 69 66 28 20 72 63 );.. .. if( rc
e68f0 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 == SQLITE_OK )
e6900 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 {.. pNode = p
e6910 46 69 6c 65 2d 3e 70 53 68 6d 4c 69 6e 6b 2d 3e File->pShmLink->
e6920 70 53 68 6d 4e 6f 64 65 20 3b 0d 0a 20 20 20 20 pShmNode ;..
e6930 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 .. sqlite3_mu
e6940 74 65 78 5f 65 6e 74 65 72 28 70 4e 6f 64 65 2d tex_enter(pNode-
e6950 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 20 0d 0a >mutex);.. ..
e6960 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 assert( szRe
e6970 67 69 6f 6e 3d 3d 70 4e 6f 64 65 2d 3e 73 7a 52 gion==pNode->szR
e6980 65 67 69 6f 6e 20 29 3b 0d 0a 0d 0a 20 20 20 20 egion );....
e6990 2f 2a 20 55 6e 6d 61 70 70 65 64 20 72 65 67 69 /* Unmapped regi
e69a0 6f 6e 20 3f 20 2a 2f 0d 0a 20 20 20 20 69 66 28 on ? */.. if(
e69b0 20 69 52 65 67 69 6f 6e 20 3e 3d 20 70 4e 6f 64 iRegion >= pNod
e69c0 65 2d 3e 6e 52 65 67 69 6f 6e 20 29 20 7b 0d 0a e->nRegion ) {..
e69d0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 /* Prevent
e69e0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 other processes
e69f0 20 66 72 6f 6d 20 72 65 73 69 7a 69 6e 67 20 74 from resizing t
e6a00 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 he shared memory
e6a10 20 2a 2f 0d 0a 20 20 20 20 20 20 6f 73 32 53 68 */.. os2Sh
e6a20 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 4e 6f 64 mSystemLock(pNod
e6a30 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 5f 57 41 e, _SHM_WRLCK_WA
e6a40 49 54 2c 20 4f 53 32 5f 53 48 4d 5f 44 4d 53 2c IT, OS2_SHM_DMS,
e6a50 20 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 61 70 1);.... ap
e6a60 52 65 67 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 Region = sqlite3
e6a70 5f 72 65 61 6c 6c 6f 63 28 0d 0a 20 20 20 20 20 _realloc(..
e6a80 20 20 20 70 4e 6f 64 65 2d 3e 61 70 52 65 67 69 pNode->apRegi
e6a90 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 20 2b 20 31 on, (iRegion + 1
e6aa0 29 20 2a 20 73 69 7a 65 6f 66 28 61 70 52 65 67 ) * sizeof(apReg
e6ab0 69 6f 6e 5b 30 5d 29 29 3b 0d 0a 0d 0a 20 20 20 ion[0]));....
e6ac0 20 20 20 69 66 28 20 61 70 52 65 67 69 6f 6e 20 if( apRegion
e6ad0 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 70 4e 6f ) {.. pNo
e6ae0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 de->apRegion = a
e6af0 70 52 65 67 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 pRegion;....
e6b00 20 20 20 20 77 68 69 6c 65 28 20 70 4e 6f 64 65 while( pNode
e6b10 2d 3e 6e 52 65 67 69 6f 6e 20 3c 3d 20 69 52 65 ->nRegion <= iRe
e6b20 67 69 6f 6e 20 29 20 7b 0d 0a 20 20 20 20 20 20 gion ) {..
e6b30 20 20 20 20 73 70 72 69 6e 74 66 28 73 68 6d 4e sprintf(shmN
e6b40 61 6d 65 2c 20 22 25 73 2d 25 75 22 2c 20 0d 0a ame, "%s-%u", ..
e6b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e6b60 20 20 70 4e 6f 64 65 2d 3e 73 68 6d 42 61 73 65 pNode->shmBase
e6b70 4e 61 6d 65 2c 20 70 4e 6f 64 65 2d 3e 6e 52 65 Name, pNode->nRe
e6b80 67 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 gion);....
e6b90 20 20 20 20 69 66 28 20 44 6f 73 47 65 74 4e 61 if( DosGetNa
e6ba0 6d 65 64 53 68 61 72 65 64 4d 65 6d 28 26 70 76 medSharedMem(&pv
e6bb0 54 65 6d 70 2c 20 28 50 53 5a 29 73 68 6d 4e 61 Temp, (PSZ)shmNa
e6bc0 6d 65 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 me, ..
e6bd0 20 20 20 20 20 20 50 41 47 5f 52 45 41 44 20 7c PAG_READ |
e6be0 20 50 41 47 5f 57 52 49 54 45 29 20 21 3d 20 4e PAG_WRITE) != N
e6bf0 4f 5f 45 52 52 4f 52 20 29 20 7b 0d 0a 20 20 20 O_ERROR ) {..
e6c00 20 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 if( !bE
e6c10 78 74 65 6e 64 20 29 0d 0a 20 20 20 20 20 20 20 xtend )..
e6c20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d break;...
e6c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
e6c40 20 44 6f 73 41 6c 6c 6f 63 53 68 61 72 65 64 4d DosAllocSharedM
e6c50 65 6d 28 26 70 76 54 65 6d 70 2c 20 28 50 53 5a em(&pvTemp, (PSZ
e6c60 29 73 68 6d 4e 61 6d 65 2c 20 73 7a 52 65 67 69 )shmName, szRegi
e6c70 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 on,..
e6c80 20 20 20 20 20 20 20 50 41 47 5f 52 45 41 44 20 PAG_READ
e6c90 7c 20 50 41 47 5f 57 52 49 54 45 20 7c 20 50 41 | PAG_WRITE | PA
e6ca0 47 5f 43 4f 4d 4d 49 54 20 7c 20 4f 42 4a 5f 41 G_COMMIT | OBJ_A
e6cb0 4e 59 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 NY) != NO_ERROR
e6cc0 26 26 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 && ..
e6cd0 20 20 20 20 20 44 6f 73 41 6c 6c 6f 63 53 68 61 DosAllocSha
e6ce0 72 65 64 4d 65 6d 28 26 70 76 54 65 6d 70 2c 20 redMem(&pvTemp,
e6cf0 28 50 53 5a 29 73 68 6d 4e 61 6d 65 2c 20 73 7a (PSZ)shmName, sz
e6d00 52 65 67 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 Region,..
e6d10 20 20 20 20 20 20 20 20 20 20 20 50 41 47 5f 52 PAG_R
e6d20 45 41 44 20 7c 20 50 41 47 5f 57 52 49 54 45 20 EAD | PAG_WRITE
e6d30 7c 20 50 41 47 5f 43 4f 4d 4d 49 54 29 20 21 3d | PAG_COMMIT) !=
e6d40 20 4e 4f 5f 45 52 52 4f 52 20 29 20 7b 20 0d 0a NO_ERROR ) { ..
e6d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 rc
e6d60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
e6d70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
e6d80 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 break;..
e6d90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 }..
e6da0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 }....
e6db0 61 70 52 65 67 69 6f 6e 5b 70 4e 6f 64 65 2d 3e apRegion[pNode->
e6dc0 6e 52 65 67 69 6f 6e 2b 2b 5d 20 3d 20 70 76 54 nRegion++] = pvT
e6dd0 65 6d 70 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d emp;.. }.
e6de0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 ... /* ze
e6df0 72 6f 20 6f 75 74 20 72 65 6d 61 69 6e 69 6e 67 ro out remaining
e6e00 20 65 6e 74 72 69 65 73 20 2a 2f 20 0d 0a 20 20 entries */ ..
e6e10 20 20 20 20 20 20 66 6f 72 28 20 6e 20 3d 20 70 for( n = p
e6e20 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3b 20 6e Node->nRegion; n
e6e30 20 3c 3d 20 69 52 65 67 69 6f 6e 3b 20 6e 2b 2b <= iRegion; n++
e6e40 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 70 4e ).. pN
e6e50 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 6e 5d ode->apRegion[n]
e6e60 20 3d 20 4e 55 4c 4c 3b 0d 0a 0d 0a 20 20 20 20 = NULL;....
e6e70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 /* Return th
e6e80 69 73 20 72 65 67 69 6f 6e 20 28 6d 61 79 62 65 is region (maybe
e6e90 20 7a 65 72 6f 29 20 2a 2f 0d 0a 20 20 20 20 20 zero) */..
e6ea0 20 20 20 2a 70 70 20 3d 20 70 4e 6f 64 65 2d 3e *pp = pNode->
e6eb0 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e apRegion[iRegion
e6ec0 5d 3b 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 ];.. } else
e6ed0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d {.. rc =
e6ee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a SQLITE_NOMEM;..
e6ef0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 }....
e6f00 20 2f 2a 20 41 6c 6c 6f 77 20 6f 74 68 65 72 20 /* Allow other
e6f10 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65 73 processes to res
e6f20 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d ize the shared m
e6f30 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 20 20 20 20 emory */..
e6f40 6f 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b os2ShmSystemLock
e6f50 28 70 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c (pNode, _SHM_UNL
e6f60 43 4b 2c 20 4f 53 32 5f 53 48 4d 5f 44 4d 53 2c CK, OS2_SHM_DMS,
e6f70 20 31 29 3b 0d 0a 20 20 20 20 20 20 0d 0a 20 20 1);.. ..
e6f80 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 } else {..
e6f90 20 20 2f 2a 20 52 65 67 69 6f 6e 20 68 61 73 20 /* Region has
e6fa0 62 65 65 6e 20 6d 61 70 70 65 64 20 70 72 65 76 been mapped prev
e6fb0 69 6f 75 73 6c 79 20 2a 2f 0d 0a 20 20 20 20 20 iously */..
e6fc0 20 2a 70 70 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 *pp = pNode->ap
e6fd0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b Region[iRegion];
e6fe0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 .. }.... s
e6ff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
e7000 76 65 28 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 ve(pNode->mutex)
e7010 3b 0d 0a 20 20 7d 20 0d 0a 0d 0a 20 20 45 52 52 ;.. } .... ERR
e7020 5f 54 52 41 43 45 28 72 63 2c 20 28 22 6f 73 32 _TRACE(rc, ("os2
e7030 53 68 6d 4d 61 70 3a 20 25 73 20 69 52 67 6e 20 ShmMap: %s iRgn
e7040 3d 20 25 64 2c 20 73 7a 52 67 6e 20 3d 20 25 64 = %d, szRgn = %d
e7050 2c 20 62 45 78 74 20 3d 20 25 64 20 3a 20 25 64 , bExt = %d : %d
e7060 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 \n", ..
e7070 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a pFile->z
e7080 46 75 6c 6c 50 61 74 68 43 70 2c 20 69 52 65 67 FullPathCp, iReg
e7090 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 62 ion, szRegion, b
e70a0 45 78 74 65 6e 64 2c 20 72 63 29 29 0d 0a 20 20 Extend, rc))..
e70b0 20 20 20 20 20 20 20 20 0d 0a 20 20 72 65 74 75 .. retu
e70c0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
e70d0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e .** Close a conn
e70e0 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 ection to shared
e70f0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 -memory. Delete
e7100 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0d the underlying.
e7110 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 .** storage if d
e7120 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 eleteFlag is tru
e7130 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 e...**..** If th
e7140 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 ere is no shared
e7150 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 memory associat
e7160 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e ed with the conn
e7170 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 ection then this
e7180 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 ..** routine is
e7190 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 a harmless no-op
e71a0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
e71b0 74 20 6f 73 32 53 68 6d 55 6e 6d 61 70 28 0d 0a t os2ShmUnmap(..
e71c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
e71d0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 id,
e71e0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 /* The underly
e71f0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c ing database fil
e7200 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 64 65 6c 65 e */.. int dele
e7210 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 teFlag
e7220 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 /* Delet
e7230 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 e shared-memory
e7240 69 66 20 74 72 75 65 20 2a 2f 0d 0a 29 7b 0d 0a if true */..){..
e7250 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 os2File *pFile
e7260 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b = (os2File*)id;
e7270 0d 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a .. os2ShmLink *
e7280 70 4c 69 6e 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 pLink = pFile->p
e7290 53 68 6d 4c 69 6e 6b 3b 0d 0a 20 20 0d 0a 20 20 ShmLink;.. ..
e72a0 69 66 28 20 70 4c 69 6e 6b 20 29 20 7b 0d 0a 20 if( pLink ) {..
e72b0 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 2d 31 int nRef = -1
e72c0 3b 0d 0a 20 20 20 20 6f 73 32 53 68 6d 4c 69 6e ;.. os2ShmLin
e72d0 6b 20 2a 2a 70 70 4c 69 6e 6b 3b 0d 0a 20 20 20 k **ppLink;..
e72e0 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 70 4e 6f os2ShmNode *pNo
e72f0 64 65 20 3d 20 70 4c 69 6e 6b 2d 3e 70 53 68 6d de = pLink->pShm
e7300 4e 6f 64 65 3b 0d 0a 0d 0a 20 20 20 20 73 71 6c Node;.... sql
e7310 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 ite3_mutex_enter
e7320 28 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d (pNode->mutex);.
e7330 0a 20 20 20 20 0d 0a 20 20 20 20 66 6f 72 28 20 . .. for(
e7340 70 70 4c 69 6e 6b 20 3d 20 26 70 4e 6f 64 65 2d ppLink = &pNode-
e7350 3e 70 46 69 72 73 74 3b 0d 0a 20 20 20 20 20 20 >pFirst;..
e7360 20 20 20 2a 70 70 4c 69 6e 6b 20 26 26 20 2a 70 *ppLink && *p
e7370 70 4c 69 6e 6b 20 21 3d 20 70 4c 69 6e 6b 3b 0d pLink != pLink;.
e7380 0a 20 20 20 20 20 20 20 20 20 70 70 4c 69 6e 6b . ppLink
e7390 20 3d 20 26 28 2a 70 70 4c 69 6e 6b 29 2d 3e 70 = &(*ppLink)->p
e73a0 4e 65 78 74 20 29 20 20 20 3b 0d 0a 20 20 20 20 Next ) ;..
e73b0 20 20 20 20 20 0d 0a 20 20 20 20 61 73 73 65 72 .. asser
e73c0 74 28 2a 70 70 4c 69 6e 6b 29 3b 0d 0a 0d 0a 20 t(*ppLink);....
e73d0 20 20 20 69 66 28 20 2a 70 70 4c 69 6e 6b 20 29 if( *ppLink )
e73e0 20 7b 0d 0a 20 20 20 20 20 20 2a 70 70 4c 69 6e {.. *ppLin
e73f0 6b 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 k = pLink->pNext
e7400 3b 0d 0a 20 20 20 20 20 20 6e 52 65 66 20 3d 20 ;.. nRef =
e7410 2d 2d 70 4e 6f 64 65 2d 3e 6e 52 65 66 3b 0d 0a --pNode->nRef;..
e7420 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 } else {..
e7430 20 20 20 20 45 52 52 5f 54 52 41 43 45 28 31 2c ERR_TRACE(1,
e7440 20 28 22 6f 73 32 53 68 6d 55 6e 6d 61 70 3a 20 ("os2ShmUnmap:
e7450 6c 69 6e 6b 20 6e 6f 74 20 66 6f 75 6e 64 20 21 link not found !
e7460 20 25 73 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 %s\n", ..
e7470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e pN
e7480 6f 64 65 2d 3e 73 68 6d 42 61 73 65 4e 61 6d 65 ode->shmBaseName
e7490 29 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d )).. }.. .
e74a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d . pFile->pShm
e74b0 4c 69 6e 6b 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 Link = NULL;..
e74c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
e74d0 4c 69 6e 6b 29 3b 0d 0a 0d 0a 20 20 20 20 73 71 Link);.... sq
e74e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 lite3_mutex_leav
e74f0 65 28 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b e(pNode->mutex);
e7500 0d 0a 20 20 20 20 0d 0a 20 20 20 20 69 66 28 20 .. .. if(
e7510 6e 52 65 66 20 3d 3d 20 30 20 29 0d 0a 20 20 20 nRef == 0 )..
e7520 20 20 20 6f 73 32 50 75 72 67 65 53 68 6d 4e 6f os2PurgeShmNo
e7530 64 65 73 28 20 64 65 6c 65 74 65 46 6c 61 67 20 des( deleteFlag
e7540 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 );.. }.... ret
e7550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
e7560 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e }..../*..** Chan
e7570 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 ge the lock stat
e7580 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d e for a shared-m
e7590 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0d 0a emory segment...
e75a0 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 **..** Note that
e75b0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 the relationshi
e75c0 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 p between SHAREd
e75d0 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c and EXCLUSIVE l
e75e0 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 ocks is a little
e75f0 0d 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 ..** different h
e7600 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 ere than in posi
e7610 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 x. In xShmLock(
e7620 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 ), one can go fr
e7630 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0d 0a 2a 2a 20 om unlocked..**
e7640 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 to shared and ba
e7650 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 ck or from unloc
e7660 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 ked to exclusive
e7670 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 and back. But
e7680 6f 6e 65 20 6d 61 79 0d 0a 2a 2a 20 6e 6f 74 20 one may..** not
e7690 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 go from shared t
e76a0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 o exclusive or f
e76b0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f rom exclusive to
e76c0 20 73 68 61 72 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 shared...*/..st
e76d0 61 74 69 63 20 69 6e 74 20 6f 73 32 53 68 6d 4c atic int os2ShmL
e76e0 6f 63 6b 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f ock(.. sqlite3_
e76f0 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 file *id,
e7700 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 /* Database f
e7710 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 ile holding the
e7720 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f shared memory */
e7730 0d 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 .. int ofst,
e7740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
e7750 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 * First lock to
e7760 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 acquire or relea
e7770 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 2c 20 se */.. int n,
e7780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e7790 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
e77a0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 locks to acquir
e77b0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0d e or release */.
e77c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 . int flags
e77d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
e77e0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 What to do with
e77f0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0d 0a 29 7b the lock */..){
e7800 0d 0a 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 .. u32 mask;
e7810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e7820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 /* Mas
e7830 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 k of locks to ta
e7840 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f ke or release */
e7850 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c .. int rc = SQL
e7860 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 ITE_OK;
e7870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 /* Res
e7880 75 6c 74 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 6f ult code */.. o
e7890 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 s2File *pFile =
e78a0 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 (os2File*)id;..
e78b0 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a 70 20 3d os2ShmLink *p =
e78c0 20 70 46 69 6c 65 2d 3e 70 53 68 6d 4c 69 6e 6b pFile->pShmLink
e78d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 ; /* The sh
e78e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e ared memory bein
e78f0 67 20 6c 6f 63 6b 65 64 20 2a 2f 0d 0a 20 20 6f g locked */.. o
e7900 73 32 53 68 6d 4c 69 6e 6b 20 2a 70 58 3b 20 20 s2ShmLink *pX;
e7910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e7920 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 /* For loop
e7930 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 ing over all sib
e7940 6c 69 6e 67 73 20 2a 2f 0d 0a 20 20 6f 73 32 53 lings */.. os2S
e7950 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 hmNode *pShmNode
e7960 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 = p->pShmNode;
e7970 20 20 2f 2a 20 4f 75 72 20 6e 6f 64 65 20 2a 2f /* Our node */
e7980 0d 0a 20 20 0d 0a 20 20 61 73 73 65 72 74 28 20 .. .. assert(
e7990 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b ofst>=0 && ofst+
e79a0 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c n<=SQLITE_SHM_NL
e79b0 4f 43 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 OCK );.. assert
e79c0 28 20 6e 3e 3d 31 20 29 3b 0d 0a 20 20 61 73 73 ( n>=1 );.. ass
e79d0 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c ert( flags==(SQL
e79e0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 ITE_SHM_LOCK | S
e79f0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 QLITE_SHM_SHARED
e7a00 29 0d 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 ).. || fla
e7a10 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f gs==(SQLITE_SHM_
e7a20 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 LOCK | SQLITE_SH
e7a30 4d 5f 45 58 43 4c 55 53 49 56 45 29 0d 0a 20 20 M_EXCLUSIVE)..
e7a40 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 || flags==(
e7a50 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 SQLITE_SHM_UNLOC
e7a60 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 K | SQLITE_SHM_S
e7a70 48 41 52 45 44 29 0d 0a 20 20 20 20 20 20 20 7c HARED).. |
e7a80 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 | flags==(SQLITE
e7a90 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 _SHM_UNLOCK | SQ
e7aa0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 LITE_SHM_EXCLUSI
e7ab0 56 45 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 VE) );.. assert
e7ac0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 ( n==1 || (flags
e7ad0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 & SQLITE_SHM_EX
e7ae0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0d 0a CLUSIVE)!=0 );..
e7af0 0d 0a 20 20 6d 61 73 6b 20 3d 20 28 75 33 32 29 .. mask = (u32)
e7b00 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 ((1U<<(ofst+n))
e7b10 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0d 0a - (1U<<ofst));..
e7b20 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c assert( n>1 ||
e7b30 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 mask==(1<<ofst)
e7b40 20 29 3b 0d 0a 0d 0a 0d 0a 20 20 73 71 6c 69 74 );...... sqlit
e7b50 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 e3_mutex_enter(p
e7b60 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
e7b70 0d 0a 0d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 .... if( flags
e7b80 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c & SQLITE_SHM_UNL
e7b90 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 OCK ){.. u32
e7ba0 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 allMask = 0; /*
e7bb0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 Mask of locks he
e7bc0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a ld by siblings *
e7bd0 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 65 65 20 /.... /* See
e7be0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 if any siblings
e7bf0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c hold this same l
e7c00 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 ock */.. for(
e7c10 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 pX=pShmNode->pFi
e7c20 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e rst; pX; pX=pX->
e7c30 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 69 pNext){.. i
e7c40 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 f( pX==p ) conti
e7c50 6e 75 65 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 nue;.. asse
e7c60 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 rt( (pX->exclMas
e7c70 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b k & (p->exclMask
e7c80 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 |p->sharedMask))
e7c90 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 61 6c ==0 );.. al
e7ca0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 lMask |= pX->sha
e7cb0 72 65 64 4d 61 73 6b 3b 0d 0a 20 20 20 20 7d 0d redMask;.. }.
e7cc0 0a 0d 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b ... /* Unlock
e7cd0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 the system-leve
e7ce0 6c 20 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 20 20 l locks */..
e7cf0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d if( (mask & allM
e7d00 61 73 6b 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 ask)==0 ){..
e7d10 20 20 72 63 20 3d 20 6f 73 32 53 68 6d 53 79 73 rc = os2ShmSys
e7d20 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 temLock(pShmNode
e7d30 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 , _SHM_UNLCK, of
e7d40 73 74 2b 4f 53 32 5f 53 48 4d 5f 42 41 53 45 2c st+OS2_SHM_BASE,
e7d50 20 6e 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b n);.. }else{
e7d60 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c .. rc = SQL
e7d70 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a ITE_OK;.. }..
e7d80 0d 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 .. /* Undo th
e7d90 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f e local locks */
e7da0 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
e7db0 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
e7dc0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d p->exclMask &=
e7dd0 20 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 20 20 70 ~mask;.. p
e7de0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 ->sharedMask &=
e7df0 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 7d 20 0d 0a ~mask;.. } ..
e7e00 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 }else if( flag
e7e10 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 s & SQLITE_SHM_S
e7e20 48 41 52 45 44 20 29 7b 0d 0a 20 20 20 20 75 33 HARED ){.. u3
e7e30 32 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 2 allShared = 0;
e7e40 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f /* Union of lo
e7e50 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e cks held by conn
e7e60 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 ections other th
e7e70 61 6e 20 22 70 22 20 2a 2f 0d 0a 0d 0a 20 20 20 an "p" */....
e7e80 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 /* Find out whi
e7e90 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 ch shared locks
e7ea0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 are already held
e7eb0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e by sibling conn
e7ec0 65 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2a 2a ections... **
e7ed0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 If any sibling
e7ee0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e already holds an
e7ef0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c exclusive lock,
e7f00 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 go ahead and re
e7f10 74 75 72 6e 0d 0a 20 20 20 20 2a 2a 20 53 51 4c turn.. ** SQL
e7f20 49 54 45 5f 42 55 53 59 2e 0d 0a 20 20 20 20 2a ITE_BUSY... *
e7f30 2f 0d 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 /.. for(pX=pS
e7f40 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 hmNode->pFirst;
e7f50 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 pX; pX=pX->pNext
e7f60 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28 70 ){.. if( (p
e7f70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 X->exclMask & ma
e7f80 73 6b 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 20 sk)!=0 ){..
e7f90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
e7fa0 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 USY;.. br
e7fb0 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 eak;.. }..
e7fc0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c allShared |
e7fd0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b = pX->sharedMask
e7fe0 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
e7ff0 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f /* Get shared lo
e8000 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 cks at the syste
e8010 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 m level, if nece
e8020 73 73 61 72 79 20 2a 2f 0d 0a 20 20 20 20 69 66 ssary */.. if
e8030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
e8040 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28 61 ){.. if( (a
e8050 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 llShared & mask)
e8060 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ==0 ){..
e8070 72 63 20 3d 20 6f 73 32 53 68 6d 53 79 73 74 65 rc = os2ShmSyste
e8080 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 mLock(pShmNode,
e8090 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 _SHM_RDLCK, ofst
e80a0 2b 4f 53 32 5f 53 48 4d 5f 42 41 53 45 2c 20 6e +OS2_SHM_BASE, n
e80b0 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b );.. }else{
e80c0 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 .. rc = S
e80d0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 QLITE_OK;..
e80e0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 }.. }....
e80f0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 /* Get the loca
e8100 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a l shared locks *
e8110 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 /.. if( rc==S
e8120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
e8130 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b p->sharedMask
e8140 20 7c 3d 20 6d 61 73 6b 3b 0d 0a 20 20 20 20 7d |= mask;.. }
e8150 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
e8160 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 /* Make sure no
e8170 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 sibling connecti
e8180 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 ons hold locks t
e8190 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 hat will block t
e81a0 68 69 73 0d 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b his.. ** lock
e81b0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 . If any do, re
e81c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 turn SQLITE_BUSY
e81d0 20 72 69 67 68 74 20 61 77 61 79 2e 0d 0a 20 20 right away...
e81e0 20 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 70 58 */.. for(pX
e81f0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 =pShmNode->pFirs
e8200 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e t; pX; pX=pX->pN
e8210 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 ext){.. if(
e8220 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 (pX->exclMask &
e8230 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 mask)!=0 || (pX
e8240 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d ->sharedMask & m
e8250 61 73 6b 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 ask)!=0 ){..
e8260 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
e8270 42 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 62 BUSY;.. b
e8280 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a reak;.. }..
e8290 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 2f }.. .. /
e82a0 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 * Get the exclus
e82b0 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 ive locks at the
e82c0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 system level.
e82d0 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 Then if successf
e82e0 75 6c 0d 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 ul.. ** also
e82f0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 mark the local c
e8300 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 onnection as bei
e8310 6e 67 20 6c 6f 63 6b 65 64 2e 0d 0a 20 20 20 20 ng locked...
e8320 2a 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d */.. if( rc==
e8330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
e8340 20 20 20 20 72 63 20 3d 20 6f 73 32 53 68 6d 53 rc = os2ShmS
e8350 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f ystemLock(pShmNo
e8360 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 de, _SHM_WRLCK,
e8370 6f 66 73 74 2b 4f 53 32 5f 53 48 4d 5f 42 41 53 ofst+OS2_SHM_BAS
e8380 45 2c 20 6e 29 3b 0d 0a 20 20 20 20 20 20 69 66 E, n);.. if
e8390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
e83a0 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 ){.. asse
e83b0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 rt( (p->sharedMa
e83c0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b sk & mask)==0 );
e83d0 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 .. p->exc
e83e0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0d 0a lMask |= mask;..
e83f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
e8400 20 20 7d 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 }.... sqlite3
e8410 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 _mutex_leave(pSh
e8420 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a mNode->mutex);..
e8430 20 20 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 .. OSTRACE(("
e8440 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 SHM-LOCK shmid-%
e8450 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 d, pid-%d got %0
e8460 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0d 0a 3x,%03x %s\n",..
e8470 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 p->id
e8480 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e , (int)GetCurren
e8490 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d tProcessId(), p-
e84a0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e >sharedMask, p->
e84b0 65 78 63 6c 4d 61 73 6b 2c 0d 0a 20 20 20 20 20 exclMask,..
e84c0 20 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c rc ? "fail
e84d0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0d 0a 0d ed" : "ok"));...
e84e0 0a 20 20 45 52 52 5f 54 52 41 43 45 28 72 63 2c . ERR_TRACE(rc,
e84f0 20 28 22 6f 73 32 53 68 6d 4c 6f 63 6b 3a 20 6f ("os2ShmLock: o
e8500 66 73 74 20 3d 20 25 64 2c 20 6e 20 3d 20 25 64 fst = %d, n = %d
e8510 2c 20 66 6c 61 67 73 20 3d 20 30 78 25 78 20 2d , flags = 0x%x -
e8520 3e 20 25 64 20 5c 6e 22 2c 20 0d 0a 20 20 20 20 > %d \n", ..
e8530 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 73 ofs
e8540 74 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 72 63 29 t, n, flags, rc)
e8550 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 )..
e8560 20 20 20 20 20 0d 0a 20 20 72 65 74 75 72 6e 20 .. return
e8570 72 63 3b 20 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc; ..}..../*..*
e8580 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 * Implement a me
e8590 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 mory barrier or
e85a0 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 memory fence on
e85b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0d 0a shared memory...
e85c0 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 **..** All loads
e85d0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 and stores begu
e85e0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 n before the bar
e85f0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 rier must comple
e8600 74 65 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 61 6e te before..** an
e8610 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 y load or store
e8620 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 begun after the
e8630 62 61 72 72 69 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 barrier...*/..st
e8640 61 74 69 63 20 76 6f 69 64 20 6f 73 32 53 68 6d atic void os2Shm
e8650 42 61 72 72 69 65 72 28 0d 0a 20 20 73 71 6c 69 Barrier(.. sqli
e8660 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 20 20 20 te3_file *id
e8670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
e8680 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c atabase file hol
e8690 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 ding the shared
e86a0 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 29 7b 0d 0a 20 memory */..){..
e86b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
e86c0 52 28 69 64 29 3b 0d 0a 20 20 6f 73 32 53 68 6d R(id);.. os2Shm
e86d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 EnterMutex();..
e86e0 20 6f 73 32 53 68 6d 4c 65 61 76 65 4d 75 74 65 os2ShmLeaveMute
e86f0 78 28 29 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6c 73 65 x();..}....#else
e8700 0d 0a 23 20 64 65 66 69 6e 65 20 6f 73 32 53 68 ..# define os2Sh
e8710 6d 4d 61 70 20 20 20 20 20 30 0d 0a 23 20 64 65 mMap 0..# de
e8720 66 69 6e 65 20 6f 73 32 53 68 6d 4c 6f 63 6b 20 fine os2ShmLock
e8730 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 6f 0..# define o
e8740 73 32 53 68 6d 42 61 72 72 69 65 72 20 30 0d 0a s2ShmBarrier 0..
e8750 23 20 64 65 66 69 6e 65 20 6f 73 32 53 68 6d 55 # define os2ShmU
e8760 6e 6d 61 70 20 20 20 30 0d 0a 23 65 6e 64 69 66 nmap 0..#endif
e8770 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 /* #ifndef SQLI
e8780 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0d 0a TE_OMIT_WAL */..
e8790 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..../*..** This
e87a0 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 vector defines a
e87b0 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 ll the methods t
e87c0 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 hat can operate
e87d0 6f 6e 20 61 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 on an..** sqlite
e87e0 33 5f 66 69 6c 65 20 66 6f 72 20 6f 73 32 2e 0d 3_file for os2..
e87f0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 .*/..static cons
e8800 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 t sqlite3_io_met
e8810 68 6f 64 73 20 6f 73 32 49 6f 4d 65 74 68 6f 64 hods os2IoMethod
e8820 20 3d 20 7b 0d 0a 20 20 32 2c 20 20 20 20 20 20 = {.. 2,
e8830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e8840 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 /* iVers
e8850 69 6f 6e 20 2a 2f 0d 0a 20 20 6f 73 32 43 6c 6f ion */.. os2Clo
e8860 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 se,
e8870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c /* xCl
e8880 6f 73 65 20 2a 2f 0d 0a 20 20 6f 73 32 52 65 61 ose */.. os2Rea
e8890 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
e88a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 /* xRe
e88b0 61 64 20 2a 2f 0d 0a 20 20 6f 73 32 57 72 69 74 ad */.. os2Writ
e88c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
e88d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 /* xWri
e88e0 74 65 20 2a 2f 0d 0a 20 20 6f 73 32 54 72 75 6e te */.. os2Trun
e88f0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 cate,
e8900 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 /* xTru
e8910 6e 63 61 74 65 20 2a 2f 0d 0a 20 20 6f 73 32 53 ncate */.. os2S
e8920 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 ync,
e8930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
e8940 53 79 6e 63 20 2a 2f 0d 0a 20 20 6f 73 32 46 69 Sync */.. os2Fi
e8950 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 leSize,
e8960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 /* xF
e8970 69 6c 65 53 69 7a 65 20 2a 2f 0d 0a 20 20 6f 73 ileSize */.. os
e8980 32 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2Lock,
e8990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
e89a0 20 78 4c 6f 63 6b 20 2a 2f 0d 0a 20 20 6f 73 32 xLock */.. os2
e89b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 Unlock,
e89c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
e89d0 78 55 6e 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 6f 73 xUnlock */.. os
e89e0 32 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 2CheckReservedLo
e89f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a ck, /*
e8a00 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c xCheckReservedL
e8a10 6f 63 6b 20 2a 2f 0d 0a 20 20 6f 73 32 46 69 6c ock */.. os2Fil
e8a20 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 eControl,
e8a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 /* xFi
e8a40 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0d 0a 20 20 leControl */..
e8a50 6f 73 32 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 os2SectorSize,
e8a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e8a70 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a /* xSectorSize *
e8a80 2f 0d 0a 20 20 6f 73 32 44 65 76 69 63 65 43 68 /.. os2DeviceCh
e8a90 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 aracteristics,
e8aa0 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 /* xDeviceC
e8ab0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a haracteristics *
e8ac0 2f 0d 0a 20 20 6f 73 32 53 68 6d 4d 61 70 2c 20 /.. os2ShmMap,
e8ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e8ae0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 /* xShmMap
e8af0 2a 2f 0d 0a 20 20 6f 73 32 53 68 6d 4c 6f 63 6b */.. os2ShmLock
e8b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
e8b10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 /* xShmLoc
e8b20 6b 20 2a 2f 0d 0a 20 20 6f 73 32 53 68 6d 42 61 k */.. os2ShmBa
e8b30 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 rrier,
e8b40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 /* xShmB
e8b50 61 72 72 69 65 72 20 2a 2f 0d 0a 20 20 6f 73 32 arrier */.. os2
e8b60 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 ShmUnmap
e8b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
e8b80 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0d 0a 7d 3b xShmUnmap */..};
e8b90 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ....../*********
e8ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8be0 2a 2a 0d 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 **..** Here ends
e8bf0 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 the I/O methods
e8c00 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 73 that form the s
e8c10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 qlite3_io_method
e8c20 73 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a s object...**..*
e8c30 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b * The next block
e8c40 20 6f 66 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 of code impleme
e8c50 6e 74 73 20 74 68 65 20 56 46 53 20 6d 65 74 68 nts the VFS meth
e8c60 6f 64 73 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ods...**********
e8c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e8cb0 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 **/..../*..** Cr
e8cc0 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 eate a temporary
e8cd0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 file name in zB
e8ce0 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 uf. zBuf must b
e8cf0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0d e big enough to.
e8d00 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 .** hold at pVfs
e8d10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 ->mxPathname cha
e8d20 72 61 63 74 65 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 racters...*/..st
e8d30 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 atic int getTemp
e8d40 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 name(int nBuf, c
e8d50 68 61 72 20 2a 7a 42 75 66 20 29 7b 0d 0a 20 20 har *zBuf ){..
e8d60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
e8d70 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0d 0a 20 20 r zChars[] =..
e8d80 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d "abcdefghijklm
e8d90 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0d 0a nopqrstuvwxyz"..
e8da0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b "ABCDEFGHIJK
e8db0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 LMNOPQRSTUVWXYZ"
e8dc0 0d 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 .. "012345678
e8dd0 39 22 3b 0d 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 9";.. int i, j;
e8de0 0d 0a 20 20 50 53 5a 20 7a 54 65 6d 70 50 61 74 .. PSZ zTempPat
e8df0 68 43 70 3b 20 20 20 20 20 20 0d 0a 20 20 63 68 hCp; .. ch
e8e00 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 43 43 48 ar zTempPath[CCH
e8e10 4d 41 58 50 41 54 48 5d 3b 0d 0a 20 20 55 4c 4f MAXPATH];.. ULO
e8e20 4e 47 20 75 6c 44 72 69 76 65 4e 75 6d 2c 20 75 NG ulDriveNum, u
e8e30 6c 44 72 69 76 65 4d 61 70 3b 0d 0a 20 20 0d 0a lDriveMap;.. ..
e8e40 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f /* It's odd to
e8e50 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d simulate an io-
e8e60 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 error here, but
e8e70 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a really this is j
e8e80 75 73 74 0d 0a 20 20 2a 2a 20 75 73 69 6e 67 20 ust.. ** using
e8e90 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 the io-error inf
e8ea0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 rastructure to t
e8eb0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 est that SQLite
e8ec0 68 61 6e 64 6c 65 73 20 74 68 69 73 0d 0a 20 20 handles this..
e8ed0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c ** function fail
e8ee0 69 6e 67 2e 20 0d 0a 20 20 2a 2f 0d 0a 20 20 53 ing. .. */.. S
e8ef0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
e8f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
e8f10 45 52 52 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 ERR );.... if(
e8f20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 sqlite3_temp_dir
e8f30 65 63 74 6f 72 79 20 29 20 7b 0d 0a 20 20 20 20 ectory ) {..
e8f40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
e8f50 28 43 43 48 4d 41 58 50 41 54 48 2d 33 30 2c 20 (CCHMAXPATH-30,
e8f60 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c zTempPath, "%s",
e8f70 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 sqlite3_temp_di
e8f80 72 65 63 74 6f 72 79 29 3b 0d 0a 20 20 7d 20 65 rectory);.. } e
e8f90 6c 73 65 20 69 66 28 20 44 6f 73 53 63 61 6e 45 lse if( DosScanE
e8fa0 6e 76 28 20 28 50 53 5a 29 22 54 45 4d 50 22 2c nv( (PSZ)"TEMP",
e8fb0 20 20 20 26 7a 54 65 6d 70 50 61 74 68 43 70 20 &zTempPathCp
e8fc0 29 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 7c 7c ) == NO_ERROR ||
e8fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 44 .. D
e8fe0 6f 73 53 63 61 6e 45 6e 76 28 20 28 50 53 5a 29 osScanEnv( (PSZ)
e8ff0 22 54 4d 50 22 2c 20 20 20 20 26 7a 54 65 6d 70 "TMP", &zTemp
e9000 50 61 74 68 43 70 20 29 20 3d 3d 20 4e 4f 5f 45 PathCp ) == NO_E
e9010 52 52 4f 52 20 7c 7c 0d 0a 20 20 20 20 20 20 20 RROR ||..
e9020 20 20 20 20 20 20 44 6f 73 53 63 61 6e 45 6e 76 DosScanEnv
e9030 28 20 28 50 53 5a 29 22 54 4d 50 44 49 52 22 2c ( (PSZ)"TMPDIR",
e9040 20 26 7a 54 65 6d 70 50 61 74 68 43 70 20 29 20 &zTempPathCp )
e9050 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 20 7b 0d == NO_ERROR ) {.
e9060 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 . char *zTemp
e9070 50 61 74 68 55 54 46 20 3d 20 63 6f 6e 76 65 72 PathUTF = conver
e9080 74 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 28 tCpPathToUtf8( (
e9090 63 68 61 72 20 2a 29 7a 54 65 6d 70 50 61 74 68 char *)zTempPath
e90a0 43 70 20 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 Cp );.. sqlit
e90b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 43 43 48 4d e3_snprintf(CCHM
e90c0 41 58 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 AXPATH-30, zTemp
e90d0 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 54 65 6d Path, "%s", zTem
e90e0 70 50 61 74 68 55 54 46 29 3b 0d 0a 20 20 20 20 pPathUTF);..
e90f0 66 72 65 65 28 20 7a 54 65 6d 70 50 61 74 68 55 free( zTempPathU
e9100 54 46 20 29 3b 0d 0a 20 20 7d 20 65 6c 73 65 20 TF );.. } else
e9110 69 66 28 20 44 6f 73 51 75 65 72 79 43 75 72 72 if( DosQueryCurr
e9120 65 6e 74 44 69 73 6b 28 20 26 75 6c 44 72 69 76 entDisk( &ulDriv
e9130 65 4e 75 6d 2c 20 26 75 6c 44 72 69 76 65 4d 61 eNum, &ulDriveMa
e9140 70 20 29 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 p ) == NO_ERROR
e9150 29 20 7b 0d 0a 20 20 20 20 7a 54 65 6d 70 50 61 ) {.. zTempPa
e9160 74 68 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 27 th[0] = (char)('
e9170 41 27 20 2b 20 75 6c 44 72 69 76 65 4e 75 6d 20 A' + ulDriveNum
e9180 2d 20 31 29 3b 0d 0a 20 20 20 20 7a 54 65 6d 70 - 1);.. zTemp
e9190 50 61 74 68 5b 31 5d 20 3d 20 27 3a 27 3b 20 0d Path[1] = ':'; .
e91a0 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 32 . zTempPath[2
e91b0 5d 20 3d 20 27 5c 30 27 3b 20 0d 0a 20 20 7d 20 ] = '\0'; .. }
e91c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 7a 54 65 6d else {.. zTem
e91d0 70 50 61 74 68 5b 30 5d 20 3d 20 27 5c 30 27 3b pPath[0] = '\0';
e91e0 20 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a .. }.. .. /*
e91f0 20 53 74 72 69 70 20 6f 66 66 20 61 20 74 72 61 Strip off a tra
e9200 69 6c 69 6e 67 20 73 6c 61 73 68 65 73 20 6f 72 iling slashes or
e9210 20 62 61 63 6b 73 6c 61 73 68 65 73 2c 20 6f 74 backslashes, ot
e9220 68 65 72 77 69 73 65 20 77 65 20 77 6f 75 6c 64 herwise we would
e9230 20 67 65 74 20 2a 0d 0a 20 20 20 2a 20 6d 75 6c get *.. * mul
e9240 74 69 70 6c 65 20 28 62 61 63 6b 29 73 6c 61 73 tiple (back)slas
e9250 68 65 73 20 77 68 69 63 68 20 63 61 75 73 65 73 hes which causes
e9260 20 44 6f 73 4f 70 65 6e 28 29 20 74 6f 20 66 61 DosOpen() to fa
e9270 69 6c 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 il.
e9280 20 2a 0d 0a 20 20 20 2a 20 54 72 61 69 6c 69 6e *.. * Trailin
e9290 67 20 73 70 61 63 65 73 20 61 72 65 20 6e 6f 74 g spaces are not
e92a0 20 61 6c 6c 6f 77 65 64 2c 20 65 69 74 68 65 72 allowed, either
e92b0 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
e92c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0d */.
e92d0 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 . j = sqlite3St
e92e0 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 rlen30(zTempPath
e92f0 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 6a 20 3e );.. while( j >
e9300 20 30 20 26 26 20 28 20 7a 54 65 6d 70 50 61 74 0 && ( zTempPat
e9310 68 5b 6a 2d 31 5d 20 3d 3d 20 27 5c 5c 27 20 7c h[j-1] == '\\' |
e9320 7c 20 7a 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d | zTempPath[j-1]
e9330 20 3d 3d 20 27 2f 27 20 7c 7c 20 0d 0a 20 20 20 == '/' || ..
e9340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e9350 20 7a 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d 20 zTempPath[j-1]
e9360 3d 3d 20 27 20 27 20 29 20 29 7b 0d 0a 20 20 20 == ' ' ) ){..
e9370 20 6a 2d 2d 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 54 j--;.. }.. zT
e9380 65 6d 70 50 61 74 68 5b 6a 5d 20 3d 20 27 5c 30 empPath[j] = '\0
e9390 27 3b 0d 0a 20 20 0d 0a 20 20 2f 2a 20 57 65 20 ';.. .. /* We
e93a0 75 73 65 20 32 30 20 62 79 74 65 73 20 74 6f 20 use 20 bytes to
e93b0 72 61 6e 64 6f 6d 69 7a 65 20 74 68 65 20 6e 61 randomize the na
e93c0 6d 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 me */.. sqlite3
e93d0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 32 _snprintf(nBuf-2
e93e0 32 2c 20 7a 42 75 66 2c 0d 0a 20 20 20 20 20 20 2, zBuf,..
e93f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 "%s
e9400 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 \\"SQLITE_TEMP_F
e9410 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d ILE_PREFIX, zTem
e9420 70 50 61 74 68 29 3b 0d 0a 20 20 6a 20 3d 20 73 pPath);.. j = s
e9430 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
e9440 42 75 66 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 Buf);.. sqlite3
e9450 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 20 32 30 2c _randomness( 20,
e9460 20 26 7a 42 75 66 5b 6a 5d 20 29 3b 0d 0a 20 20 &zBuf[j] );..
e9470 66 6f 72 28 20 69 20 3d 20 30 3b 20 69 20 3c 20 for( i = 0; i <
e9480 32 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 20 29 7b 0d 20; i++, j++ ){.
e9490 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 7a . zBuf[j] = z
e94a0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 Chars[ ((unsigne
e94b0 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 d char)zBuf[j])%
e94c0 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d (sizeof(zChars)-
e94d0 31 29 20 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 42 1) ];.. }.. zB
e94e0 75 66 5b 6a 5d 20 3d 20 30 3b 0d 0a 0d 0a 20 20 uf[j] = 0;....
e94f0 4f 53 54 52 41 43 45 28 28 20 22 54 45 4d 50 20 OSTRACE(( "TEMP
e9500 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c FILENAME: %s\n",
e9510 20 7a 42 75 66 20 29 29 3b 0d 0a 20 20 72 65 74 zBuf ));.. ret
e9520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
e9530 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 75 }....../*..** Tu
e9540 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 rn a relative pa
e9550 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 thname into a fu
e9560 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 ll pathname. Wr
e9570 69 74 65 20 74 68 65 20 66 75 6c 6c 0d 0a 2a 2a ite the full..**
e9580 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a pathname into z
e9590 46 75 6c 6c 5b 5d 2e 20 20 7a 46 75 6c 6c 5b 5d Full[]. zFull[]
e95a0 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 will be at leas
e95b0 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 t pVfs->mxPathna
e95c0 6d 65 0d 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 me..** bytes in
e95d0 73 69 7a 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 size...*/..stati
e95e0 63 20 69 6e 74 20 6f 73 32 46 75 6c 6c 50 61 74 c int os2FullPat
e95f0 68 6e 61 6d 65 28 0d 0a 20 20 73 71 6c 69 74 65 hname(.. sqlite
e9600 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 3_vfs *pVfs,
e9610 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
e9620 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a to vfs object *
e9630 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 /.. const char
e9640 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 *zRelative,
e9650 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c /* Possibly rel
e9660 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 ative input path
e9670 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 46 75 6c 6c */.. int nFull
e9680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
e9690 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 /* Size of ou
e96a0 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 tput buffer in b
e96b0 79 74 65 73 20 2a 2f 0d 0a 20 20 63 68 61 72 20 ytes */.. char
e96c0 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 *zFull
e96d0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 /* Output
e96e0 20 62 75 66 66 65 72 20 2a 2f 0d 0a 29 7b 0d 0a buffer */..){..
e96f0 20 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 char *zRelativ
e9700 65 43 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 eCp = convertUtf
e9710 38 50 61 74 68 54 6f 43 70 28 20 7a 52 65 6c 61 8PathToCp( zRela
e9720 74 69 76 65 20 29 3b 0d 0a 20 20 63 68 61 72 20 tive );.. char
e9730 7a 46 75 6c 6c 43 70 5b 43 43 48 4d 41 58 50 41 zFullCp[CCHMAXPA
e9740 54 48 5d 20 3d 20 22 5c 30 22 3b 0d 0a 20 20 63 TH] = "\0";.. c
e9750 68 61 72 20 2a 7a 46 75 6c 6c 55 54 46 3b 0d 0a har *zFullUTF;..
e9760 20 20 41 50 49 52 45 54 20 72 63 20 3d 20 44 6f APIRET rc = Do
e9770 73 51 75 65 72 79 50 61 74 68 49 6e 66 6f 28 20 sQueryPathInfo(
e9780 28 50 53 5a 29 7a 52 65 6c 61 74 69 76 65 43 70 (PSZ)zRelativeCp
e9790 2c 20 46 49 4c 5f 51 55 45 52 59 46 55 4c 4c 4e , FIL_QUERYFULLN
e97a0 41 4d 45 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 AME, ..
e97b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e97c0 20 20 20 20 20 20 20 7a 46 75 6c 6c 43 70 2c 20 zFullCp,
e97d0 43 43 48 4d 41 58 50 41 54 48 20 29 3b 0d 0a 20 CCHMAXPATH );..
e97e0 20 66 72 65 65 28 20 7a 52 65 6c 61 74 69 76 65 free( zRelative
e97f0 43 70 20 29 3b 0d 0a 20 20 7a 46 75 6c 6c 55 54 Cp );.. zFullUT
e9800 46 20 3d 20 63 6f 6e 76 65 72 74 43 70 50 61 74 F = convertCpPat
e9810 68 54 6f 55 74 66 38 28 20 7a 46 75 6c 6c 43 70 hToUtf8( zFullCp
e9820 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 );.. sqlite3_s
e9830 6e 70 72 69 6e 74 66 28 20 6e 46 75 6c 6c 2c 20 nprintf( nFull,
e9840 7a 46 75 6c 6c 2c 20 7a 46 75 6c 6c 55 54 46 20 zFull, zFullUTF
e9850 29 3b 0d 0a 20 20 66 72 65 65 28 20 7a 46 75 6c );.. free( zFul
e9860 6c 55 54 46 20 29 3b 0d 0a 20 20 72 65 74 75 72 lUTF );.. retur
e9870 6e 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 n rc == NO_ERROR
e9880 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 ? SQLITE_OK : S
e9890 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0d 0a 7d 0d QLITE_IOERR;..}.
e98a0 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 70 65 6e ...../*..** Open
e98b0 20 61 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 a file...*/..st
e98c0 61 74 69 63 20 69 6e 74 20 6f 73 32 4f 70 65 6e atic int os2Open
e98d0 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 (.. sqlite3_vfs
e98e0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 *pVfs,
e98f0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a /* Not used *
e9900 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 /.. const char
e9910 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 *zName,
e9920 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
e9930 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a e file (UTF-8) *
e9940 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c /.. sqlite3_fil
e9950 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 e *id,
e9960 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
e9970 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 SQLite file hand
e9980 6c 65 20 68 65 72 65 20 2a 2f 0d 0a 20 20 69 6e le here */.. in
e9990 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 t flags,
e99a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
e99b0 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a pen mode flags *
e99c0 2f 0d 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c /.. int *pOutFl
e99d0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 ags
e99e0 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 /* Status ret
e99f0 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0d 0a 29 7b urn flags */..){
e9a00 0d 0a 20 20 48 46 49 4c 45 20 68 3b 0d 0a 20 20 .. HFILE h;..
e9a10 55 4c 4f 4e 47 20 75 6c 4f 70 65 6e 46 6c 61 67 ULONG ulOpenFlag
e9a20 73 20 3d 20 30 3b 0d 0a 20 20 55 4c 4f 4e 47 20 s = 0;.. ULONG
e9a30 75 6c 4f 70 65 6e 4d 6f 64 65 20 3d 20 30 3b 0d ulOpenMode = 0;.
e9a40 0a 20 20 55 4c 4f 4e 47 20 75 6c 41 63 74 69 6f . ULONG ulActio
e9a50 6e 20 3d 20 30 3b 0d 0a 20 20 55 4c 4f 4e 47 20 n = 0;.. ULONG
e9a60 72 63 3b 0d 0a 20 20 6f 73 32 46 69 6c 65 20 2a rc;.. os2File *
e9a70 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 pFile = (os2File
e9a80 2a 29 69 64 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 *)id;.. const c
e9a90 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d har *zUtf8Name =
e9aa0 20 7a 4e 61 6d 65 3b 0d 0a 20 20 63 68 61 72 20 zName;.. char
e9ab0 2a 7a 4e 61 6d 65 43 70 3b 0d 0a 20 20 63 68 61 *zNameCp;.. cha
e9ac0 72 20 20 7a 54 6d 70 6e 61 6d 65 5b 43 43 48 4d r zTmpname[CCHM
e9ad0 41 58 50 41 54 48 5d 3b 0d 0a 0d 0a 20 20 69 6e AXPATH];.... in
e9ae0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d t isExclusive =
e9af0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 (flags & SQLITE
e9b00 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 _OPEN_EXCLUSIVE)
e9b10 3b 0d 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 ;.. int isCreat
e9b20 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 e = (flags &
e9b30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 SQLITE_OPEN_CRE
e9b40 41 54 45 29 3b 0d 0a 20 20 69 6e 74 20 69 73 52 ATE);.. int isR
e9b50 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 eadWrite = (fla
e9b60 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e gs & SQLITE_OPEN
e9b70 5f 52 45 41 44 57 52 49 54 45 29 3b 0d 0a 23 69 _READWRITE);..#i
e9b80 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 fndef NDEBUG..
e9b90 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 int isDelete
e9ba0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 = (flags & SQLI
e9bb0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e TE_OPEN_DELETEON
e9bc0 43 4c 4f 53 45 29 3b 0d 0a 20 20 69 6e 74 20 69 CLOSE);.. int i
e9bd0 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 sReadonly = (f
e9be0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 lags & SQLITE_OP
e9bf0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0d 0a 20 EN_READONLY);..
e9c00 20 69 6e 74 20 65 54 79 70 65 20 20 20 20 20 20 int eType
e9c10 20 20 3d 20 28 66 6c 61 67 73 20 26 20 30 78 46 = (flags & 0xF
e9c20 46 46 46 46 46 30 30 29 3b 0d 0a 20 20 69 6e 74 FFFFF00);.. int
e9c30 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d isOpenJournal =
e9c40 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0d (isCreate && (.
e9c50 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d . eType==
e9c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 SQLITE_OPEN_MAST
e9c70 45 52 5f 4a 4f 55 52 4e 41 4c 20 0d 0a 20 20 20 ER_JOURNAL ..
e9c80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 || eType==SQLI
e9c90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 TE_OPEN_MAIN_JOU
e9ca0 52 4e 41 4c 20 0d 0a 20 20 20 20 20 7c 7c 20 65 RNAL .. || e
e9cb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
e9cc0 4e 5f 57 41 4c 0d 0a 20 20 29 29 3b 0d 0a 23 65 N_WAL.. ));..#e
e9cd0 6e 64 69 66 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 ndif.... UNUSED
e9ce0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 _PARAMETER(pVfs)
e9cf0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 ;.. assert( id!
e9d00 3d 30 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 =0 );.... /* Ch
e9d10 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e eck the followin
e9d20 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 g statements are
e9d30 20 74 72 75 65 3a 20 0d 0a 20 20 2a 2a 0d 0a 20 true: .. **..
e9d40 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c ** (a) Exactl
e9d50 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 y one of the REA
e9d60 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f DWRITE and READO
e9d70 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 NLY flags must b
e9d80 65 20 73 65 74 2c 20 61 6e 64 20 0d 0a 20 20 2a e set, and .. *
e9d90 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 * (b) if CREAT
e9da0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 E is set, then R
e9db0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c EADWRITE must al
e9dc0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0d 0a so be set, and..
e9dd0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 ** (c) if EX
e9de0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 CLUSIVE is set,
e9df0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 then CREATE must
e9e00 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0d 0a 20 also be set...
e9e10 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c ** (d) if DEL
e9e20 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 ETEONCLOSE is se
e9e30 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d t, then CREATE m
e9e40 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e ust also be set.
e9e50 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 .. */.. assert
e9e60 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 ((isReadonly==0
e9e70 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d || isReadWrite==
e9e80 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 0) && (isReadWri
e9e90 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 te || isReadonly
e9ea0 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 69 73 ));.. assert(is
e9eb0 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 Create==0 || isR
e9ec0 65 61 64 57 72 69 74 65 29 3b 0d 0a 20 20 61 73 eadWrite);.. as
e9ed0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 sert(isExclusive
e9ee0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 ==0 || isCreate)
e9ef0 3b 0d 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 ;.. assert(isDe
e9f00 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 lete==0 || isCre
e9f10 61 74 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 ate);.... /* Th
e9f20 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 e main DB, main
e9f30 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c journal, WAL fil
e9f40 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 e and master jou
e9f50 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0d rnal are never .
e9f60 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 . ** automatica
e9f70 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 lly deleted. Nor
e9f80 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 are they ever t
e9f90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 emporary files.
e9fa0 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 28 */.. assert( (
e9fb0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 !isDelete && zNa
e9fc0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 me) || eType!=SQ
e9fd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 LITE_OPEN_MAIN_D
e9fe0 42 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 B );.. assert(
e9ff0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e (!isDelete && zN
ea000 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 ame) || eType!=S
ea010 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
ea020 4a 4f 55 52 4e 41 4c 20 29 3b 0d 0a 20 20 61 73 JOURNAL );.. as
ea030 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 sert( (!isDelete
ea040 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 && zName) || eT
ea050 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype!=SQLITE_OPEN
ea060 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 _MASTER_JOURNAL
ea070 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 21 );.. assert( (!
ea080 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d isDelete && zNam
ea090 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c e) || eType!=SQL
ea0a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0d ITE_OPEN_WAL );.
ea0b0 0a 0d 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 ... /* Assert t
ea0c0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 hat the upper la
ea0d0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 yer has set one
ea0e0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 of the "file-typ
ea0f0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0d 0a 20 20 e" flags. */..
ea100 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 assert( eType==S
ea110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
ea120 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 DB || eType
ea130 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 ==SQLITE_OPEN_TE
ea140 4d 50 5f 44 42 20 0d 0a 20 20 20 20 20 20 20 7c MP_DB .. |
ea150 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
ea160 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 OPEN_MAIN_JOURNA
ea170 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 L || eType==SQLI
ea180 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 TE_OPEN_TEMP_JOU
ea190 52 4e 41 4c 20 0d 0a 20 20 20 20 20 20 20 7c 7c RNAL .. ||
ea1a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f eType==SQLITE_O
ea1b0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 PEN_SUBJOURNAL
ea1c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
ea1d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f E_OPEN_MASTER_JO
ea1e0 55 52 4e 41 4c 20 0d 0a 20 20 20 20 20 20 20 7c URNAL .. |
ea1f0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
ea200 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 OPEN_TRANSIENT_D
ea210 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 B || eType==SQLI
ea220 54 45 5f 4f 50 45 4e 5f 57 41 4c 0d 0a 20 20 29 TE_OPEN_WAL.. )
ea230 3b 0d 0a 0d 0a 20 20 6d 65 6d 73 65 74 28 20 70 ;.... memset( p
ea240 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 File, 0, sizeof(
ea250 2a 70 46 69 6c 65 29 20 29 3b 0d 0a 20 20 70 46 *pFile) );.. pF
ea260 69 6c 65 2d 3e 68 20 3d 20 28 48 46 49 4c 45 29 ile->h = (HFILE)
ea270 2d 31 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 -1;.... /* If t
ea280 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 he second argume
ea290 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 nt to this funct
ea2a0 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e ion is NULL, gen
ea2b0 65 72 61 74 65 20 61 20 0d 0a 20 20 2a 2a 20 74 erate a .. ** t
ea2c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 emporary file na
ea2d0 6d 65 20 74 6f 20 75 73 65 20 0d 0a 20 20 2a 2f me to use .. */
ea2e0 0d 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 .. if( !zUtf8Na
ea2f0 6d 65 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 me ){.. asser
ea300 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 t(isDelete && !i
ea310 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0d 0a sOpenJournal);..
ea320 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 rc = getTemp
ea330 6e 61 6d 65 28 43 43 48 4d 41 58 50 41 54 48 2c name(CCHMAXPATH,
ea340 20 7a 54 6d 70 6e 61 6d 65 29 3b 0d 0a 20 20 20 zTmpname);..
ea350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
ea360 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 OK ){.. ret
ea370 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a urn rc;.. }..
ea380 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 zUtf8Name =
ea390 7a 54 6d 70 6e 61 6d 65 3b 0d 0a 20 20 7d 0d 0a zTmpname;.. }..
ea3a0 0d 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 .. if( isReadWr
ea3b0 69 74 65 20 29 7b 0d 0a 20 20 20 20 75 6c 4f 70 ite ){.. ulOp
ea3c0 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45 4e 5f 41 enMode |= OPEN_A
ea3d0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3b CCESS_READWRITE;
ea3e0 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
ea3f0 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 ulOpenMode |= OP
ea400 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e EN_ACCESS_READON
ea410 4c 59 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a LY;.. }.... /*
ea420 20 4f 70 65 6e 20 69 6e 20 72 61 6e 64 6f 6d 20 Open in random
ea430 61 63 63 65 73 73 20 6d 6f 64 65 20 66 6f 72 20 access mode for
ea440 70 6f 73 73 69 62 6c 79 20 62 65 74 74 65 72 20 possibly better
ea450 73 70 65 65 64 2e 20 20 41 6c 6c 6f 77 20 66 75 speed. Allow fu
ea460 6c 6c 0d 0a 20 20 2a 2a 20 73 68 61 72 69 6e 67 ll.. ** sharing
ea470 20 62 65 63 61 75 73 65 20 66 69 6c 65 20 6c 6f because file lo
ea480 63 6b 73 20 77 69 6c 6c 20 70 72 6f 76 69 64 65 cks will provide
ea490 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 exclusive acces
ea4a0 73 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0d 0a s when needed...
ea4b0 20 20 2a 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 ** The handle
ea4c0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e should not be in
ea4d0 68 65 72 69 74 65 64 20 62 79 20 63 68 69 6c 64 herited by child
ea4e0 20 70 72 6f 63 65 73 73 65 73 20 61 6e 64 20 77 processes and w
ea4f0 65 20 64 6f 6e 27 74 20 0d 0a 20 20 2a 2a 20 77 e don't .. ** w
ea500 61 6e 74 20 70 6f 70 75 70 73 20 66 72 6f 6d 20 ant popups from
ea510 74 68 65 20 63 72 69 74 69 63 61 6c 20 65 72 72 the critical err
ea520 6f 72 20 68 61 6e 64 6c 65 72 2e 0d 0a 20 20 2a or handler... *
ea530 2f 0d 0a 20 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 /.. ulOpenMode
ea540 7c 3d 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 52 41 |= OPEN_FLAGS_RA
ea550 4e 44 4f 4d 20 7c 20 4f 50 45 4e 5f 53 48 41 52 NDOM | OPEN_SHAR
ea560 45 5f 44 45 4e 59 4e 4f 4e 45 20 7c 20 0d 0a 20 E_DENYNONE | ..
ea570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f O
ea580 50 45 4e 5f 46 4c 41 47 53 5f 4e 4f 49 4e 48 45 PEN_FLAGS_NOINHE
ea590 52 49 54 20 7c 20 4f 50 45 4e 5f 46 4c 41 47 53 RIT | OPEN_FLAGS
ea5a0 5f 46 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52 3b 0d _FAIL_ON_ERROR;.
ea5b0 0a 0d 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ... /* SQLITE_O
ea5c0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 PEN_EXCLUSIVE is
ea5d0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 used to make su
ea5e0 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 re that a new fi
ea5f0 6c 65 20 69 73 20 0d 0a 20 20 2a 2a 20 63 72 65 le is .. ** cre
ea600 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 ated. SQLite doe
ea610 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 sn't use it to i
ea620 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 ndicate "exclusi
ea630 76 65 20 61 63 63 65 73 73 22 20 0d 0a 20 20 2a ve access" .. *
ea640 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c * as it is usual
ea650 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0d 0a ly understood...
ea660 20 20 2a 2f 0d 0a 20 20 69 66 28 20 69 73 45 78 */.. if( isEx
ea670 63 6c 75 73 69 76 65 20 29 7b 0d 0a 20 20 20 20 clusive ){..
ea680 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 /* Creates a new
ea690 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 file, only if i
ea6a0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 t does not alrea
ea6b0 64 79 20 65 78 69 73 74 2e 20 2a 2f 0d 0a 20 20 dy exist. */..
ea6c0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 /* If the file
ea6d0 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c exists, it fail
ea6e0 73 2e 20 2a 2f 0d 0a 20 20 20 20 75 6c 4f 70 65 s. */.. ulOpe
ea6f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41 nFlags |= OPEN_A
ea700 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 46 5f CTION_CREATE_IF_
ea710 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54 49 4f NEW | OPEN_ACTIO
ea720 4e 5f 46 41 49 4c 5f 49 46 5f 45 58 49 53 54 53 N_FAIL_IF_EXISTS
ea730 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 ;.. }else if( i
ea740 73 43 72 65 61 74 65 20 29 7b 0d 0a 20 20 20 20 sCreate ){..
ea750 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 /* Open existing
ea760 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 file, or create
ea770 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 if it doesn't e
ea780 78 69 73 74 20 2a 2f 0d 0a 20 20 20 20 75 6c 4f xist */.. ulO
ea790 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e penFlags |= OPEN
ea7a0 5f 41 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 _ACTION_CREATE_I
ea7b0 46 5f 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54 F_NEW | OPEN_ACT
ea7c0 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53 ION_OPEN_IF_EXIS
ea7d0 54 53 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 TS;.. }else{..
ea7e0 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 /* Opens a fi
ea7f0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 le, only if it e
ea800 78 69 73 74 73 2e 20 2a 2f 0d 0a 20 20 20 20 75 xists. */.. u
ea810 6c 4f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 50 lOpenFlags |= OP
ea820 45 4e 5f 41 43 54 49 4f 4e 5f 46 41 49 4c 5f 49 EN_ACTION_FAIL_I
ea830 46 5f 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54 F_NEW | OPEN_ACT
ea840 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53 ION_OPEN_IF_EXIS
ea850 54 53 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 7a 4e TS;.. }.... zN
ea860 61 6d 65 43 70 20 3d 20 63 6f 6e 76 65 72 74 55 ameCp = convertU
ea870 74 66 38 50 61 74 68 54 6f 43 70 28 20 7a 55 74 tf8PathToCp( zUt
ea880 66 38 4e 61 6d 65 20 29 3b 0d 0a 20 20 72 63 20 f8Name );.. rc
ea890 3d 20 44 6f 73 4f 70 65 6e 28 20 28 50 53 5a 29 = DosOpen( (PSZ)
ea8a0 7a 4e 61 6d 65 43 70 2c 0d 0a 20 20 20 20 20 20 zNameCp,..
ea8b0 20 20 20 20 20 20 20 20 20 20 26 68 2c 0d 0a 20 &h,..
ea8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
ea8d0 75 6c 41 63 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 ulAction,..
ea8e0 20 20 20 20 20 20 20 20 20 20 20 30 4c 2c 0d 0a 0L,..
ea8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ea900 46 49 4c 45 5f 4e 4f 52 4d 41 4c 2c 0d 0a 20 20 FILE_NORMAL,..
ea910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6c ul
ea920 4f 70 65 6e 46 6c 61 67 73 2c 0d 0a 20 20 20 20 OpenFlags,..
ea930 20 20 20 20 20 20 20 20 20 20 20 20 75 6c 4f 70 ulOp
ea940 65 6e 4d 6f 64 65 2c 0d 0a 20 20 20 20 20 20 20 enMode,..
ea950 20 20 20 20 20 20 20 20 20 28 50 45 41 4f 50 32 (PEAOP2
ea960 29 4e 55 4c 4c 20 29 3b 0d 0a 20 20 66 72 65 65 )NULL );.. free
ea970 28 20 7a 4e 61 6d 65 43 70 20 29 3b 0d 0a 0d 0a ( zNameCp );....
ea980 20 20 69 66 28 20 72 63 20 21 3d 20 4e 4f 5f 45 if( rc != NO_E
ea990 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 4f 53 54 RROR ){.. OST
ea9a0 52 41 43 45 28 28 20 22 4f 50 45 4e 20 49 6e 76 RACE(( "OPEN Inv
ea9b0 61 6c 69 64 20 68 61 6e 64 6c 65 20 72 63 3d 25 alid handle rc=%
ea9c0 64 3a 20 7a 4e 61 6d 65 3d 25 73 2c 20 75 6c 41 d: zName=%s, ulA
ea9d0 63 74 69 6f 6e 3d 25 23 6c 78 2c 20 75 6c 46 6c ction=%#lx, ulFl
ea9e0 61 67 73 3d 25 23 6c 78 2c 20 75 6c 4d 6f 64 65 ags=%#lx, ulMode
ea9f0 3d 25 23 6c 78 5c 6e 22 2c 0d 0a 20 20 20 20 20 =%#lx\n",..
eaa00 20 20 20 20 20 20 20 20 20 72 63 2c 20 7a 55 74 rc, zUt
eaa10 66 38 4e 61 6d 65 2c 20 75 6c 41 63 74 69 6f 6e f8Name, ulAction
eaa20 2c 20 75 6c 4f 70 65 6e 46 6c 61 67 73 2c 20 75 , ulOpenFlags, u
eaa30 6c 4f 70 65 6e 4d 6f 64 65 20 29 29 3b 0d 0a 0d lOpenMode ));...
eaa40 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 . if( isReadW
eaa50 72 69 74 65 20 29 7b 0d 0a 20 20 20 20 20 20 72 rite ){.. r
eaa60 65 74 75 72 6e 20 6f 73 32 4f 70 65 6e 28 20 70 eturn os2Open( p
eaa70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0d Vfs, zName, id,.
eaa80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
eaa90 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 ((flags|S
eaaa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f QLITE_OPEN_READO
eaab0 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50 NLY)&~(SQLITE_OP
eaac0 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 EN_CREATE|SQLITE
eaad0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 _OPEN_READWRITE)
eaae0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ),..
eaaf0 20 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c pOutFl
eab00 61 67 73 20 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 ags );.. }els
eab10 65 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e e{.. return
eab20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e SQLITE_CANTOPEN
eab30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d ;.. }.. }...
eab40 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 . if( pOutFlags
eab50 20 29 7b 0d 0a 20 20 20 20 2a 70 4f 75 74 46 6c ){.. *pOutFl
eab60 61 67 73 20 3d 20 69 73 52 65 61 64 57 72 69 74 ags = isReadWrit
eab70 65 20 3f 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f e ? SQLITE_OPEN_
eab80 52 45 41 44 57 52 49 54 45 20 3a 20 53 51 4c 49 READWRITE : SQLI
eab90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 TE_OPEN_READONLY
eaba0 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 6f 73 32 46 ;.. }.... os2F
eabb0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 20 70 56 66 ullPathname( pVf
eabc0 73 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 69 s, zUtf8Name, si
eabd0 7a 65 6f 66 28 20 7a 54 6d 70 6e 61 6d 65 20 29 zeof( zTmpname )
eabe0 2c 20 7a 54 6d 70 6e 61 6d 65 20 29 3b 0d 0a 20 , zTmpname );..
eabf0 20 70 46 69 6c 65 2d 3e 7a 46 75 6c 6c 50 61 74 pFile->zFullPat
eac00 68 43 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 hCp = convertUtf
eac10 38 50 61 74 68 54 6f 43 70 28 20 7a 54 6d 70 6e 8PathToCp( zTmpn
eac20 61 6d 65 20 29 3b 0d 0a 20 20 70 46 69 6c 65 2d ame );.. pFile-
eac30 3e 70 4d 65 74 68 6f 64 20 3d 20 26 6f 73 32 49 >pMethod = &os2I
eac40 6f 4d 65 74 68 6f 64 3b 0d 0a 20 20 70 46 69 6c oMethod;.. pFil
eac50 65 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 e->flags = flags
eac60 3b 0d 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 ;.. pFile->h =
eac70 68 3b 0d 0a 0d 0a 20 20 4f 70 65 6e 43 6f 75 6e h;.... OpenCoun
eac80 74 65 72 28 2b 31 29 3b 0d 0a 20 20 4f 53 54 52 ter(+1);.. OSTR
eac90 41 43 45 28 28 20 22 4f 50 45 4e 20 25 64 20 70 ACE(( "OPEN %d p
eaca0 4f 75 74 46 6c 61 67 73 3d 25 64 5c 6e 22 2c 20 OutFlags=%d\n",
eacb0 70 46 69 6c 65 2d 3e 68 2c 20 70 4f 75 74 46 6c pFile->h, pOutFl
eacc0 61 67 73 20 29 29 3b 0d 0a 20 20 72 65 74 75 72 ags ));.. retur
eacd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
eace0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 74 65 .../*..** Delete
eacf0 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e the named file.
ead00 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
ead10 20 6f 73 32 44 65 6c 65 74 65 28 0d 0a 20 20 73 os2Delete(.. s
ead20 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
ead30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
ead40 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 /* Not use
ead50 64 20 6f 6e 20 6f 73 32 20 2a 2f 0d 0a 20 20 63 d on os2 */.. c
ead60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
ead70 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 name,
ead80 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 /* Name of
ead90 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 file to delete
eada0 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 */.. int syncDi
eadb0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r
eadc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
eadd0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 6f 73 32 20 Not used on os2
eade0 2a 2f 0d 0a 29 7b 0d 0a 20 20 41 50 49 52 45 54 */..){.. APIRET
eadf0 20 72 63 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 46 rc;.. char *zF
eae00 69 6c 65 6e 61 6d 65 43 70 3b 0d 0a 20 20 53 69 ilenameCp;.. Si
eae10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 mulateIOError( r
eae20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
eae30 52 52 5f 44 45 4c 45 54 45 20 29 3b 0d 0a 20 20 RR_DELETE );..
eae40 7a 46 69 6c 65 6e 61 6d 65 43 70 20 3d 20 63 6f zFilenameCp = co
eae50 6e 76 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 nvertUtf8PathToC
eae60 70 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0d p( zFilename );.
eae70 0a 20 20 72 63 20 3d 20 44 6f 73 44 65 6c 65 74 . rc = DosDelet
eae80 65 28 20 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d e( (PSZ)zFilenam
eae90 65 43 70 20 29 3b 0d 0a 20 20 66 72 65 65 28 20 eCp );.. free(
eaea0 7a 46 69 6c 65 6e 61 6d 65 43 70 20 29 3b 0d 0a zFilenameCp );..
eaeb0 20 20 4f 53 54 52 41 43 45 28 28 20 22 44 45 4c OSTRACE(( "DEL
eaec0 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a ETE \"%s\"\n", z
eaed0 46 69 6c 65 6e 61 6d 65 20 29 29 3b 0d 0a 20 20 Filename ));..
eaee0 72 65 74 75 72 6e 20 28 72 63 20 3d 3d 20 4e 4f return (rc == NO
eaef0 5f 45 52 52 4f 52 20 7c 7c 0d 0a 20 20 20 20 20 _ERROR ||..
eaf00 20 20 20 20 20 72 63 20 3d 3d 20 45 52 52 4f 52 rc == ERROR
eaf10 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 _FILE_NOT_FOUND
eaf20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 ||.. rc
eaf30 20 3d 3d 20 45 52 52 4f 52 5f 50 41 54 48 5f 4e == ERROR_PATH_N
eaf40 4f 54 5f 46 4f 55 4e 44 20 29 20 3f 20 53 51 4c OT_FOUND ) ? SQL
eaf50 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f ITE_OK : SQLITE_
eaf60 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0d 0a 7d IOERR_DELETE;..}
eaf70 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 65 63 6b ..../*..** Check
eaf80 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 the existance a
eaf90 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 nd status of a f
eafa0 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ile...*/..static
eafb0 20 69 6e 74 20 6f 73 32 41 63 63 65 73 73 28 0d int os2Access(.
eafc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
eafd0 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 pVfs, /*
eafe0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 6f 73 32 20 Not used on os2
eaff0 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */.. const char
eb000 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 *zFilename,
eb010 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 /* Name of file
eb020 74 6f 20 63 68 65 63 6b 20 2a 2f 0d 0a 20 20 69 to check */.. i
eb030 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 nt flags,
eb040 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 /* Type
eb050 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 of test to make
eb060 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f on this file */
eb070 0d 0a 20 20 69 6e 74 20 2a 70 4f 75 74 20 20 20 .. int *pOut
eb080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
eb090 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 Write results h
eb0a0 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 41 50 ere */..){.. AP
eb0b0 49 52 45 54 20 72 63 3b 0d 0a 20 20 46 49 4c 45 IRET rc;.. FILE
eb0c0 53 54 41 54 55 53 33 20 66 73 74 73 33 43 6f 6e STATUS3 fsts3Con
eb0d0 66 69 67 49 6e 66 6f 3b 0d 0a 20 20 63 68 61 72 figInfo;.. char
eb0e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 70 3b 0d 0a *zFilenameCp;..
eb0f0 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
eb100 45 54 45 52 28 70 56 66 73 29 3b 0d 0a 20 20 53 ETER(pVfs);.. S
eb110 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
eb120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
eb130 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0d 0a ERR_ACCESS; );..
eb140 20 20 0d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 43 .. zFilenameC
eb150 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50 p = convertUtf8P
eb160 61 74 68 54 6f 43 70 28 20 7a 46 69 6c 65 6e 61 athToCp( zFilena
eb170 6d 65 20 29 3b 0d 0a 20 20 72 63 20 3d 20 44 6f me );.. rc = Do
eb180 73 51 75 65 72 79 50 61 74 68 49 6e 66 6f 28 20 sQueryPathInfo(
eb190 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 43 70 (PSZ)zFilenameCp
eb1a0 2c 20 46 49 4c 5f 53 54 41 4e 44 41 52 44 2c 0d , FIL_STANDARD,.
eb1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
eb1c0 20 20 20 20 20 20 20 20 20 20 26 66 73 74 73 33 &fsts3
eb1d0 43 6f 6e 66 69 67 49 6e 66 6f 2c 20 73 69 7a 65 ConfigInfo, size
eb1e0 6f 66 28 46 49 4c 45 53 54 41 54 55 53 33 29 20 of(FILESTATUS3)
eb1f0 29 3b 0d 0a 20 20 66 72 65 65 28 20 7a 46 69 6c );.. free( zFil
eb200 65 6e 61 6d 65 43 70 20 29 3b 0d 0a 20 20 4f 53 enameCp );.. OS
eb210 54 52 41 43 45 28 28 20 22 41 43 43 45 53 53 20 TRACE(( "ACCESS
eb220 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2e fsts3ConfigInfo.
eb230 61 74 74 72 46 69 6c 65 3d 25 64 20 66 6c 61 67 attrFile=%d flag
eb240 73 3d 25 64 20 72 63 3d 25 64 5c 6e 22 2c 0d 0a s=%d rc=%d\n",..
eb250 20 20 20 20 20 20 20 20 20 20 20 20 66 73 74 73 fsts
eb260 33 43 6f 6e 66 69 67 49 6e 66 6f 2e 61 74 74 72 3ConfigInfo.attr
eb270 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 72 63 20 File, flags, rc
eb280 29 29 3b 0d 0a 0d 0a 20 20 73 77 69 74 63 68 28 ));.... switch(
eb290 20 66 6c 61 67 73 20 29 7b 0d 0a 20 20 20 20 63 flags ){.. c
eb2a0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 ase SQLITE_ACCES
eb2b0 53 5f 45 58 49 53 54 53 3a 0d 0a 20 20 20 20 20 S_EXISTS:..
eb2c0 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 /* For an SQLIT
eb2d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 E_ACCESS_EXISTS
eb2e0 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a query, treat a z
eb2f0 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0d ero-length file.
eb300 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 . ** as if
eb310 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 it does not exis
eb320 74 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 t... */..
eb330 20 20 20 20 69 66 28 20 66 73 74 73 33 43 6f 6e if( fsts3Con
eb340 66 69 67 49 6e 66 6f 2e 63 62 46 69 6c 65 20 3d figInfo.cbFile =
eb350 3d 20 30 20 29 20 0d 0a 20 20 20 20 20 20 20 20 = 0 ) ..
eb360 72 63 20 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f rc = ERROR_FILE_
eb370 4e 4f 54 5f 46 4f 55 4e 44 3b 0d 0a 20 20 20 20 NOT_FOUND;..
eb380 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 break;.. ca
eb390 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 se SQLITE_ACCESS
eb3a0 5f 52 45 41 44 3a 0d 0a 20 20 20 20 20 20 62 72 _READ:.. br
eb3b0 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 53 eak;.. case S
eb3c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 QLITE_ACCESS_REA
eb3d0 44 57 52 49 54 45 3a 0d 0a 20 20 20 20 20 20 69 DWRITE:.. i
eb3e0 66 28 20 66 73 74 73 33 43 6f 6e 66 69 67 49 6e f( fsts3ConfigIn
eb3f0 66 6f 2e 61 74 74 72 46 69 6c 65 20 26 20 46 49 fo.attrFile & FI
eb400 4c 45 5f 52 45 41 44 4f 4e 4c 59 20 29 0d 0a 20 LE_READONLY )..
eb410 20 20 20 20 20 20 20 72 63 20 3d 20 45 52 52 4f rc = ERRO
eb420 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 3b R_ACCESS_DENIED;
eb430 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a .. break;..
eb440 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 default:..
eb450 20 20 20 20 72 63 20 3d 20 45 52 52 4f 52 5f 46 rc = ERROR_F
eb460 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 3b 0d 0a ILE_NOT_FOUND;..
eb470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 22 assert( !"
eb480 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 Invalid flags ar
eb490 67 75 6d 65 6e 74 22 20 29 3b 0d 0a 20 20 7d 0d gument" );.. }.
eb4a0 0a 0d 0a 20 20 2a 70 4f 75 74 20 3d 20 28 72 63 ... *pOut = (rc
eb4b0 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29 3b 0d 0a == NO_ERROR);..
eb4c0 20 20 4f 53 54 52 41 43 45 28 28 20 22 41 43 43 OSTRACE(( "ACC
eb4d0 45 53 53 20 25 73 20 66 6c 61 67 73 20 25 64 3a ESS %s flags %d:
eb4e0 20 72 63 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 rc=%d\n", zFile
eb4f0 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 2a 70 4f name, flags, *pO
eb500 75 74 20 29 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 ut ));.... retu
eb510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
eb520 0d 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 ......#ifndef SQ
eb530 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 LITE_OMIT_LOAD_E
eb540 58 54 45 4e 53 49 4f 4e 0d 0a 2f 2a 0d 0a 2a 2a XTENSION../*..**
eb550 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 Interfaces for
eb560 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 opening a shared
eb570 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e library, findin
eb580 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0d 0a g entry points..
eb590 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 ** within the sh
eb5a0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e ared library, an
eb5b0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 d closing the sh
eb5c0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0d 0a 2a ared library...*
eb5d0 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 /../*..** Interf
eb5e0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 aces for opening
eb5f0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 a shared librar
eb600 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 y, finding entry
eb610 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 77 69 74 68 points..** with
eb620 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 in the shared li
eb630 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 brary, and closi
eb640 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 ng the shared li
eb650 62 72 61 72 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 brary...*/..stat
eb660 69 63 20 76 6f 69 64 20 2a 6f 73 32 44 6c 4f 70 ic void *os2DlOp
eb670 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a en(sqlite3_vfs *
eb680 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 pVfs, const char
eb690 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0d 0a 20 *zFilename){..
eb6a0 20 48 4d 4f 44 55 4c 45 20 68 6d 6f 64 3b 0d 0a HMODULE hmod;..
eb6b0 20 20 41 50 49 52 45 54 20 72 63 3b 0d 0a 20 20 APIRET rc;..
eb6c0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 char *zFilenameC
eb6d0 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50 p = convertUtf8P
eb6e0 61 74 68 54 6f 43 70 28 7a 46 69 6c 65 6e 61 6d athToCp(zFilenam
eb6f0 65 29 3b 0d 0a 20 20 72 63 20 3d 20 44 6f 73 4c e);.. rc = DosL
eb700 6f 61 64 4d 6f 64 75 6c 65 28 4e 55 4c 4c 2c 20 oadModule(NULL,
eb710 30 2c 20 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 0, (PSZ)zFilenam
eb720 65 43 70 2c 20 26 68 6d 6f 64 29 3b 0d 0a 20 20 eCp, &hmod);..
eb730 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 43 70 free(zFilenameCp
eb740 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 20 );.. return rc
eb750 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 30 20 != NO_ERROR ? 0
eb760 3a 20 28 76 6f 69 64 2a 29 68 6d 6f 64 3b 0d 0a : (void*)hmod;..
eb770 7d 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 6e 6f 2d 6f }../*..** A no-o
eb780 70 20 73 69 6e 63 65 20 74 68 65 20 65 72 72 6f p since the erro
eb790 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e r code is return
eb7a0 65 64 20 6f 6e 20 74 68 65 20 44 6f 73 4c 6f 61 ed on the DosLoa
eb7b0 64 4d 6f 64 75 6c 65 20 63 61 6c 6c 2e 0d 0a 2a dModule call...*
eb7c0 2a 20 6f 73 32 44 6c 6f 70 65 6e 20 72 65 74 75 * os2Dlopen retu
eb7d0 72 6e 73 20 7a 65 72 6f 20 69 66 20 44 6f 73 4c rns zero if DosL
eb7e0 6f 61 64 4d 6f 64 75 6c 65 20 69 73 20 6e 6f 74 oadModule is not
eb7f0 20 73 75 63 63 65 73 73 66 75 6c 2e 0d 0a 2a 2f successful...*/
eb800 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 73 ..static void os
eb810 32 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 2DlError(sqlite3
eb820 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 _vfs *pVfs, int
eb830 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 nBuf, char *zBuf
eb840 4f 75 74 29 7b 0d 0a 2f 2a 20 6e 6f 2d 6f 70 20 Out){../* no-op
eb850 2a 2f 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 76 6f */..}..static vo
eb860 69 64 20 28 2a 6f 73 32 44 6c 53 79 6d 28 73 71 id (*os2DlSym(sq
eb870 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
eb880 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 void *pHandle,
eb890 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d const char *zSym
eb8a0 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0d 0a 20 20 bol))(void){..
eb8b0 50 46 4e 20 70 66 6e 3b 0d 0a 20 20 41 50 49 52 PFN pfn;.. APIR
eb8c0 45 54 20 72 63 3b 0d 0a 20 20 72 63 20 3d 20 44 ET rc;.. rc = D
eb8d0 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64 72 28 osQueryProcAddr(
eb8e0 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65 (HMODULE)pHandle
eb8f0 2c 20 30 4c 2c 20 28 50 53 5a 29 7a 53 79 6d 62 , 0L, (PSZ)zSymb
eb900 6f 6c 2c 20 26 70 66 6e 29 3b 0d 0a 20 20 69 66 ol, &pfn);.. if
eb910 28 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 ( rc != NO_ERROR
eb920 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 69 66 20 74 ){.. /* if t
eb930 68 65 20 73 79 6d 62 6f 6c 20 69 74 73 65 6c 66 he symbol itself
eb940 20 77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 was not found,
eb950 73 65 61 72 63 68 20 61 67 61 69 6e 20 66 6f 72 search again for
eb960 20 74 68 65 20 73 61 6d 65 0d 0a 20 20 20 20 20 the same..
eb970 2a 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 6e * symbol with an
eb980 20 65 78 74 72 61 20 75 6e 64 65 72 73 63 6f 72 extra underscor
eb990 65 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 e, that might be
eb9a0 20 6e 65 65 64 65 64 20 64 65 70 65 6e 64 69 6e needed dependin
eb9b0 67 0d 0a 20 20 20 20 20 2a 20 6f 6e 20 74 68 65 g.. * on the
eb9c0 20 63 61 6c 6c 69 6e 67 20 63 6f 6e 76 65 6e 74 calling convent
eb9d0 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 63 68 61 72 ion */.. char
eb9e0 20 5f 7a 53 79 6d 62 6f 6c 5b 32 35 36 5d 20 3d _zSymbol[256] =
eb9f0 20 22 5f 22 3b 0d 0a 20 20 20 20 73 74 72 6e 63 "_";.. strnc
eba00 61 74 28 5f 7a 53 79 6d 62 6f 6c 2c 20 7a 53 79 at(_zSymbol, zSy
eba10 6d 62 6f 6c 2c 20 32 35 34 29 3b 0d 0a 20 20 20 mbol, 254);..
eba20 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 50 72 rc = DosQueryPr
eba30 6f 63 41 64 64 72 28 28 48 4d 4f 44 55 4c 45 29 ocAddr((HMODULE)
eba40 70 48 61 6e 64 6c 65 2c 20 30 4c 2c 20 28 50 53 pHandle, 0L, (PS
eba50 5a 29 5f 7a 53 79 6d 62 6f 6c 2c 20 26 70 66 6e Z)_zSymbol, &pfn
eba60 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 );.. }.. retur
eba70 6e 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 n rc != NO_ERROR
eba80 20 3f 20 30 20 3a 20 28 76 6f 69 64 28 2a 29 28 ? 0 : (void(*)(
eba90 76 6f 69 64 29 29 70 66 6e 3b 0d 0a 7d 0d 0a 73 void))pfn;..}..s
ebaa0 74 61 74 69 63 20 76 6f 69 64 20 6f 73 32 44 6c tatic void os2Dl
ebab0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 Close(sqlite3_vf
ebac0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 s *pVfs, void *p
ebad0 48 61 6e 64 6c 65 29 7b 0d 0a 20 20 44 6f 73 46 Handle){.. DosF
ebae0 72 65 65 4d 6f 64 75 6c 65 28 28 48 4d 4f 44 55 reeModule((HMODU
ebaf0 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0d 0a 7d 0d LE)pHandle);..}.
ebb00 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c .#else /* if SQL
ebb10 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 ITE_OMIT_LOAD_EX
ebb20 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e TENSION is defin
ebb30 65 64 3a 20 2a 2f 0d 0a 20 20 23 64 65 66 69 6e ed: */.. #defin
ebb40 65 20 6f 73 32 44 6c 4f 70 65 6e 20 30 0d 0a 20 e os2DlOpen 0..
ebb50 20 23 64 65 66 69 6e 65 20 6f 73 32 44 6c 45 72 #define os2DlEr
ebb60 72 6f 72 20 30 0d 0a 20 20 23 64 65 66 69 6e 65 ror 0.. #define
ebb70 20 6f 73 32 44 6c 53 79 6d 20 30 0d 0a 20 20 23 os2DlSym 0.. #
ebb80 64 65 66 69 6e 65 20 6f 73 32 44 6c 43 6c 6f 73 define os2DlClos
ebb90 65 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d e 0..#endif.....
ebba0 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 75 70 ./*..** Write up
ebbb0 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f to nBuf bytes o
ebbc0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 f randomness int
ebbd0 6f 20 7a 42 75 66 2e 0d 0a 2a 2f 0d 0a 73 74 61 o zBuf...*/..sta
ebbe0 74 69 63 20 69 6e 74 20 6f 73 32 52 61 6e 64 6f tic int os2Rando
ebbf0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 mness(sqlite3_vf
ebc00 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 s *pVfs, int nBu
ebc10 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 20 29 7b f, char *zBuf ){
ebc20 0d 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0d 0a .. int n = 0;..
ebc30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
ebc40 54 45 5f 54 45 53 54 29 0d 0a 20 20 6e 20 3d 20 TE_TEST).. n =
ebc50 6e 42 75 66 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 nBuf;.. memset(
ebc60 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0d zBuf, 0, nBuf);.
ebc70 0a 23 65 6c 73 65 0d 0a 20 20 69 6e 74 20 69 3b .#else.. int i;
ebc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ebc90 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20 50 .. P
ebca0 50 49 42 20 70 70 69 62 3b 0d 0a 20 20 50 54 49 PIB ppib;.. PTI
ebcb0 42 20 70 74 69 62 3b 0d 0a 20 20 44 41 54 45 54 B ptib;.. DATET
ebcc0 49 4d 45 20 64 74 3b 20 0d 0a 20 20 73 74 61 74 IME dt; .. stat
ebcd0 69 63 20 75 6e 73 69 67 6e 65 64 20 63 20 3d 20 ic unsigned c =
ebce0 30 3b 0d 0a 20 20 2f 2a 20 4f 72 64 65 72 65 64 0;.. /* Ordered
ebcf0 20 62 79 20 76 61 72 69 61 74 69 6f 6e 20 70 72 by variation pr
ebd00 6f 62 61 62 69 6c 69 74 79 20 2a 2f 0d 0a 20 20 obability */..
ebd10 73 74 61 74 69 63 20 55 4c 4f 4e 47 20 73 76 49 static ULONG svI
ebd20 64 78 5b 36 5d 20 3d 20 7b 20 51 53 56 5f 4d 53 dx[6] = { QSV_MS
ebd30 5f 43 4f 55 4e 54 2c 20 51 53 56 5f 54 49 4d 45 _COUNT, QSV_TIME
ebd40 5f 4c 4f 57 2c 0d 0a 20 20 20 20 20 20 20 20 20 _LOW,..
ebd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ebd60 20 20 20 51 53 56 5f 4d 41 58 50 52 4d 45 4d 2c QSV_MAXPRMEM,
ebd70 20 51 53 56 5f 4d 41 58 53 48 4d 45 4d 2c 0d 0a QSV_MAXSHMEM,..
ebd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ebd90 20 20 20 20 20 20 20 20 20 20 20 20 51 53 56 5f QSV_
ebda0 54 4f 54 41 56 41 49 4c 4d 45 4d 2c 20 51 53 56 TOTAVAILMEM, QSV
ebdb0 5f 54 4f 54 52 45 53 4d 45 4d 20 7d 3b 0d 0a 0d _TOTRESMEM };...
ebdc0 0a 20 20 2f 2a 20 38 20 62 79 74 65 73 3b 20 74 . /* 8 bytes; t
ebdd0 69 6d 65 7a 6f 6e 65 20 61 6e 64 20 77 65 65 6b imezone and week
ebde0 64 61 79 20 64 6f 6e 27 74 20 69 6e 63 72 65 61 day don't increa
ebdf0 73 65 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 se the randomnes
ebe00 73 20 6d 75 63 68 20 2a 2f 0d 0a 20 20 69 66 28 s much */.. if(
ebe10 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 74 29 (int)sizeof(dt)
ebe20 2d 33 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20 29 -3 <= nBuf - n )
ebe30 7b 0d 0a 20 20 20 20 63 20 2b 3d 20 30 78 30 31 {.. c += 0x01
ebe40 30 30 3b 0d 0a 20 20 20 20 44 6f 73 47 65 74 44 00;.. DosGetD
ebe50 61 74 65 54 69 6d 65 28 26 64 74 29 3b 0d 0a 20 ateTime(&dt);..
ebe60 20 20 20 64 74 2e 79 65 61 72 20 3d 20 28 55 53 dt.year = (US
ebe70 48 4f 52 54 29 28 28 64 74 2e 79 65 61 72 20 2d HORT)((dt.year -
ebe80 20 31 39 30 30 29 20 7c 20 63 29 3b 0d 0a 20 20 1900) | c);..
ebe90 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e memcpy(&zBuf[n
ebea0 5d 2c 20 26 64 74 2c 20 73 69 7a 65 6f 66 28 64 ], &dt, sizeof(d
ebeb0 74 29 2d 33 29 3b 0d 0a 20 20 20 20 6e 20 2b 3d t)-3);.. n +=
ebec0 20 73 69 7a 65 6f 66 28 64 74 29 2d 33 3b 0d 0a sizeof(dt)-3;..
ebed0 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 34 20 62 79 }.... /* 4 by
ebee0 74 65 73 3b 20 50 49 44 73 20 61 6e 64 20 54 49 tes; PIDs and TI
ebef0 44 73 20 61 72 65 20 31 36 20 62 69 74 20 69 6e Ds are 16 bit in
ebf00 74 65 72 6e 61 6c 6c 79 2c 20 73 6f 20 63 6f 6d ternally, so com
ebf10 62 69 6e 65 20 74 68 65 6d 20 2a 2f 0d 0a 20 20 bine them */..
ebf20 69 66 28 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 if( (int)sizeof(
ebf30 55 4c 4f 4e 47 29 20 3c 3d 20 6e 42 75 66 20 2d ULONG) <= nBuf -
ebf40 20 6e 20 29 7b 0d 0a 20 20 20 20 44 6f 73 47 65 n ){.. DosGe
ebf50 74 49 6e 66 6f 42 6c 6f 63 6b 73 28 26 70 74 69 tInfoBlocks(&pti
ebf60 62 2c 20 26 70 70 69 62 29 3b 0d 0a 20 20 20 20 b, &ppib);..
ebf70 2a 28 50 55 4c 4f 4e 47 29 26 7a 42 75 66 5b 6e *(PULONG)&zBuf[n
ebf80 5d 20 3d 20 4d 41 4b 45 4c 4f 4e 47 28 70 70 69 ] = MAKELONG(ppi
ebf90 62 2d 3e 70 69 62 5f 75 6c 70 69 64 2c 0d 0a 20 b->pib_ulpid,..
ebfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ebfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ebfc0 70 74 69 62 2d 3e 74 69 62 5f 70 74 69 62 32 2d ptib->tib_ptib2-
ebfd0 3e 74 69 62 32 5f 75 6c 74 69 64 29 3b 0d 0a 20 >tib2_ultid);..
ebfe0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 55 n += sizeof(U
ebff0 4c 4f 4e 47 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 LONG);.. }....
ec000 20 2f 2a 20 55 70 20 74 6f 20 36 20 2a 20 34 20 /* Up to 6 * 4
ec010 62 79 74 65 73 3b 20 76 61 72 69 61 62 6c 65 73 bytes; variables
ec020 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 73 depend on the s
ec030 79 73 74 65 6d 20 73 74 61 74 65 20 2a 2f 0d 0a ystem state */..
ec040 20 20 66 6f 72 28 20 69 20 3d 20 30 3b 20 69 20 for( i = 0; i
ec050 3c 20 36 20 26 26 20 28 69 6e 74 29 73 69 7a 65 < 6 && (int)size
ec060 6f 66 28 55 4c 4f 4e 47 29 20 3c 3d 20 6e 42 75 of(ULONG) <= nBu
ec070 66 20 2d 20 6e 3b 20 69 2b 2b 20 29 7b 0d 0a 20 f - n; i++ ){..
ec080 20 20 20 44 6f 73 51 75 65 72 79 53 79 73 49 6e DosQuerySysIn
ec090 66 6f 28 73 76 49 64 78 5b 69 5d 2c 20 73 76 49 fo(svIdx[i], svI
ec0a0 64 78 5b 69 5d 2c 20 0d 0a 20 20 20 20 20 20 20 dx[i], ..
ec0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 55 (PU
ec0c0 4c 4f 4e 47 29 26 7a 42 75 66 5b 6e 5d 2c 20 73 LONG)&zBuf[n], s
ec0d0 69 7a 65 6f 66 28 55 4c 4f 4e 47 29 29 3b 0d 0a izeof(ULONG));..
ec0e0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 n += sizeof(
ec0f0 55 4c 4f 4e 47 29 3b 0d 0a 20 20 7d 20 0d 0a 23 ULONG);.. } ..#
ec100 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74 75 72 endif.... retur
ec110 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a n n;..}..../*..*
ec120 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 * Sleep for a li
ec130 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 ttle while. Ret
ec140 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f urn the amount o
ec150 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0d 0a 2a f time slept...*
ec160 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 * The argument i
ec170 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
ec180 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 microseconds we
ec190 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0d 0a want to sleep...
ec1a0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 ** The return va
ec1b0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 lue is the numbe
ec1c0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 r of microsecond
ec1d0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 s of sleep actua
ec1e0 6c 6c 79 0d 0a 2a 2a 20 72 65 71 75 65 73 74 65 lly..** requeste
ec1f0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 d from the under
ec200 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 lying operating
ec210 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 system, a number
ec220 20 77 68 69 63 68 0d 0a 2a 2a 20 6d 69 67 68 74 which..** might
ec230 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e be greater than
ec240 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 or equal to the
ec250 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e argument, but n
ec260 6f 74 20 6c 65 73 73 0d 0a 2a 2a 20 74 68 61 6e ot less..** than
ec270 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0d 0a the argument...
ec280 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6f */..static int o
ec290 73 32 53 6c 65 65 70 28 20 73 71 6c 69 74 65 33 s2Sleep( sqlite3
ec2a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 _vfs *pVfs, int
ec2b0 6d 69 63 72 6f 73 65 63 20 29 7b 0d 0a 20 20 44 microsec ){.. D
ec2c0 6f 73 53 6c 65 65 70 28 20 28 6d 69 63 72 6f 73 osSleep( (micros
ec2d0 65 63 2f 31 30 30 30 29 20 29 3b 0d 0a 20 20 72 ec/1000) );.. r
ec2e0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 3b 0d eturn microsec;.
ec2f0 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 .}..../*..** The
ec300 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 following varia
ec310 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 ble, if set to a
ec320 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c non-zero value,
ec330 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 becomes the res
ec340 75 6c 74 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 64 ult..** returned
ec350 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 from sqlite3OsC
ec360 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 urrentTime(). T
ec370 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 his is used for
ec380 74 65 73 74 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 69 testing...*/..#i
ec390 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
ec3a0 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
ec3b0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 sqlite3_current
ec3c0 5f 74 69 6d 65 20 3d 20 30 3b 0d 0a 23 65 6e 64 _time = 0;..#end
ec3d0 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e if..../*..** Fin
ec3e0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 d the current ti
ec3f0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c me (in Universal
ec400 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d Coordinated Tim
ec410 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 e). Write into
ec420 2a 70 69 4e 6f 77 0d 0a 2a 2a 20 74 68 65 20 63 *piNow..** the c
ec430 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 urrent time and
ec440 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e date as a Julian
ec450 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 Day number time
ec460 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 s 86_400_000. I
ec470 6e 0d 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 n..** other word
ec480 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 s, write into *p
ec490 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 iNow the number
ec4a0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 of milliseconds
ec4b0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e since the Julian
ec4c0 0d 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f ..** epoch of no
ec4d0 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 on in Greenwich
ec4e0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 on November 24,
ec4f0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 4714 B.C accordi
ec500 6e 67 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 70 72 ng to the..** pr
ec510 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 oleptic Gregoria
ec520 6e 20 63 61 6c 65 6e 64 61 72 2e 0d 0a 2a 2a 0d n calendar...**.
ec530 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 .** On success,
ec540 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 return 0. Retur
ec550 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 n 1 if the time
ec560 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 and date cannot
ec570 62 65 20 66 6f 75 6e 64 2e 0d 0a 2a 2f 0d 0a 73 be found...*/..s
ec580 74 61 74 69 63 20 69 6e 74 20 6f 73 32 43 75 72 tatic int os2Cur
ec590 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 rentTimeInt64(sq
ec5a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
ec5b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a sqlite3_int64 *
ec5c0 70 69 4e 6f 77 29 7b 0d 0a 23 69 66 64 65 66 20 piNow){..#ifdef
ec5d0 53 51 4c 49 54 45 5f 54 45 53 54 0d 0a 20 20 73 SQLITE_TEST.. s
ec5e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 tatic const sqli
ec5f0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 te3_int64 unixEp
ec600 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 och = 24405875*(
ec610 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 sqlite3_int64)86
ec620 34 30 30 30 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 40000;..#endif..
ec630 20 20 69 6e 74 20 79 65 61 72 2c 20 6d 6f 6e 74 int year, mont
ec640 68 2c 20 64 61 74 65 70 61 72 74 2c 20 74 69 6d h, datepart, tim
ec650 65 70 61 72 74 3b 0d 0a 20 0d 0a 20 20 44 41 54 epart;.. .. DAT
ec660 45 54 49 4d 45 20 64 74 3b 0d 0a 20 20 44 6f 73 ETIME dt;.. Dos
ec670 47 65 74 44 61 74 65 54 69 6d 65 28 20 26 64 74 GetDateTime( &dt
ec680 20 29 3b 0d 0a 0d 0a 20 20 79 65 61 72 20 3d 20 );.... year =
ec690 64 74 2e 79 65 61 72 3b 0d 0a 20 20 6d 6f 6e 74 dt.year;.. mont
ec6a0 68 20 3d 20 64 74 2e 6d 6f 6e 74 68 3b 0d 0a 0d h = dt.month;...
ec6b0 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 69 6f . /* Calculatio
ec6c0 6e 73 20 66 72 6f 6d 20 68 74 74 70 3a 2f 2f 77 ns from http://w
ec6d0 77 77 2e 61 73 74 72 6f 2e 6b 65 65 6c 65 2e 61 ww.astro.keele.a
ec6e0 63 2e 75 6b 2f 7e 72 6e 6f 2f 41 73 74 72 6f 6e c.uk/~rno/Astron
ec6f0 6f 6d 79 2f 68 6a 64 2e 68 74 6d 6c 0d 0a 20 20 omy/hjd.html..
ec700 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 61 73 ** http://www.as
ec710 74 72 6f 2e 6b 65 65 6c 65 2e 61 63 2e 75 6b 2f tro.keele.ac.uk/
ec720 7e 72 6e 6f 2f 41 73 74 72 6f 6e 6f 6d 79 2f 68 ~rno/Astronomy/h
ec730 6a 64 2d 30 2e 31 2e 63 0d 0a 20 20 2a 2a 20 43 jd-0.1.c.. ** C
ec740 61 6c 63 75 6c 61 74 65 20 74 68 65 20 4a 75 6c alculate the Jul
ec750 69 61 6e 20 64 61 79 73 0d 0a 20 20 2a 2f 0d 0a ian days.. */..
ec760 20 20 64 61 74 65 70 61 72 74 20 3d 20 28 69 6e datepart = (in
ec770 74 29 64 74 2e 64 61 79 20 2d 20 33 32 30 37 36 t)dt.day - 32076
ec780 20 2b 0d 0a 20 20 20 20 31 34 36 31 2a 28 79 65 +.. 1461*(ye
ec790 61 72 20 2b 20 34 38 30 30 20 2b 20 28 6d 6f 6e ar + 4800 + (mon
ec7a0 74 68 20 2d 20 31 34 29 2f 31 32 29 2f 34 20 2b th - 14)/12)/4 +
ec7b0 0d 0a 20 20 20 20 33 36 37 2a 28 6d 6f 6e 74 68 .. 367*(month
ec7c0 20 2d 20 32 20 2d 20 28 6d 6f 6e 74 68 20 2d 20 - 2 - (month -
ec7d0 31 34 29 2f 31 32 2a 31 32 29 2f 31 32 20 2d 0d 14)/12*12)/12 -.
ec7e0 0a 20 20 20 20 33 2a 28 28 79 65 61 72 20 2b 20 . 3*((year +
ec7f0 34 39 30 30 20 2b 20 28 6d 6f 6e 74 68 20 2d 20 4900 + (month -
ec800 31 34 29 2f 31 32 29 2f 31 30 30 29 2f 34 3b 0d 14)/12)/100)/4;.
ec810 0a 0d 0a 20 20 2f 2a 20 54 69 6d 65 20 69 6e 20 ... /* Time in
ec820 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 68 6f milliseconds, ho
ec830 75 72 73 20 74 6f 20 6e 6f 6f 6e 20 61 64 64 65 urs to noon adde
ec840 64 20 2a 2f 0d 0a 20 20 74 69 6d 65 70 61 72 74 d */.. timepart
ec850 20 3d 20 31 32 2a 33 36 30 30 2a 31 30 30 30 20 = 12*3600*1000
ec860 2b 20 64 74 2e 68 75 6e 64 72 65 64 74 68 73 2a + dt.hundredths*
ec870 31 30 20 2b 20 64 74 2e 73 65 63 6f 6e 64 73 2a 10 + dt.seconds*
ec880 31 30 30 30 20 2b 0d 0a 20 20 20 20 28 28 69 6e 1000 +.. ((in
ec890 74 29 64 74 2e 6d 69 6e 75 74 65 73 20 2b 20 64 t)dt.minutes + d
ec8a0 74 2e 74 69 6d 65 7a 6f 6e 65 29 2a 36 30 2a 31 t.timezone)*60*1
ec8b0 30 30 30 20 2b 20 64 74 2e 68 6f 75 72 73 2a 33 000 + dt.hours*3
ec8c0 36 30 30 2a 31 30 30 30 3b 0d 0a 0d 0a 20 20 2a 600*1000;.... *
ec8d0 70 69 4e 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 piNow = (sqlite3
ec8e0 5f 69 6e 74 36 34 29 64 61 74 65 70 61 72 74 2a _int64)datepart*
ec8f0 38 36 34 30 30 2a 31 30 30 30 20 2b 20 74 69 6d 86400*1000 + tim
ec900 65 70 61 72 74 3b 0d 0a 20 20 20 0d 0a 23 69 66 epart;.. ..#if
ec910 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0d def SQLITE_TEST.
ec920 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 . if( sqlite3_c
ec930 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0d 0a urrent_time ){..
ec940 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 *piNow = 100
ec950 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 0*(sqlite3_int64
ec960 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 )sqlite3_current
ec970 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 _time + unixEpoc
ec980 68 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d h;.. }..#endif.
ec990 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ... UNUSED_PARA
ec9a0 4d 45 54 45 52 28 70 56 66 73 29 3b 0d 0a 20 20 METER(pVfs);..
ec9b0 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a return 0;..}....
ec9c0 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 /*..** Find the
ec9d0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e current time (in
ec9e0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 Universal Coord
ec9f0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 inated Time). W
eca00 72 69 74 65 20 74 68 65 0d 0a 2a 2a 20 63 75 72 rite the..** cur
eca10 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 rent time and da
eca20 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 te as a Julian D
eca30 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a ay number into *
eca40 70 72 4e 6f 77 20 61 6e 64 0d 0a 2a 2a 20 72 65 prNow and..** re
eca50 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 turn 0. Return
eca60 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 1 if the time an
eca70 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 d date cannot be
eca80 20 66 6f 75 6e 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 found...*/..sta
eca90 74 69 63 20 69 6e 74 20 6f 73 32 43 75 72 72 65 tic int os2Curre
ecaa0 6e 74 54 69 6d 65 28 20 73 71 6c 69 74 65 33 5f ntTime( sqlite3_
ecab0 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c vfs *pVfs, doubl
ecac0 65 20 2a 70 72 4e 6f 77 20 29 7b 0d 0a 20 20 69 e *prNow ){.. i
ecad0 6e 74 20 72 63 3b 0d 0a 20 20 73 71 6c 69 74 65 nt rc;.. sqlite
ecae0 33 5f 69 6e 74 36 34 20 69 3b 0d 0a 20 20 72 63 3_int64 i;.. rc
ecaf0 20 3d 20 6f 73 32 43 75 72 72 65 6e 74 54 69 6d = os2CurrentTim
ecb00 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 eInt64(pVfs, &i)
ecb10 3b 0d 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0d ;.. if( !rc ){.
ecb20 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f . *prNow = i/
ecb30 38 36 34 30 30 30 30 30 2e 30 3b 0d 0a 20 20 7d 86400000.0;.. }
ecb40 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
ecb50 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 }..../*..** The
ecb60 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 idea is that thi
ecb70 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 s function works
ecb80 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 like a combinat
ecb90 69 6f 6e 20 6f 66 0d 0a 2a 2a 20 47 65 74 4c 61 ion of..** GetLa
ecba0 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f stError() and Fo
ecbb0 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e rmatMessage() on
ecbc0 20 77 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 windows (or err
ecbd0 6e 6f 20 61 6e 64 0d 0a 2a 2a 20 73 74 72 65 72 no and..** strer
ecbe0 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29 ror_r() on unix)
ecbf0 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 . After an error
ecc00 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 is returned by
ecc10 61 6e 20 4f 53 0d 0a 2a 2a 20 66 75 6e 63 74 69 an OS..** functi
ecc20 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 on, SQLite calls
ecc30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
ecc40 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e ith zBuf pointin
ecc50 67 20 74 6f 0d 0a 2a 2a 20 61 20 62 75 66 66 65 g to..** a buffe
ecc60 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e r of nBuf bytes.
ecc70 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 The OS layer sh
ecc80 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 ould populate th
ecc90 65 0d 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 e..** buffer wit
ecca0 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 h a nul-terminat
eccb0 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 ed UTF-8 encoded
eccc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a error message..
eccd0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ** describing th
ecce0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 e last IO error
eccf0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 to have occurred
ecd00 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c within the call
ecd10 69 6e 67 0d 0a 2a 2a 20 74 68 72 65 61 64 2e 0d ing..** thread..
ecd20 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 65 .**..** If the e
ecd30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
ecd40 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 too large for th
ecd50 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 e supplied buffe
ecd60 72 2c 0d 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 r,..** it should
ecd70 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 be truncated. T
ecd80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
ecd90 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 of xGetLastError
ecda0 0d 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 ..** is zero if
ecdb0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 the error messag
ecdc0 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 e fits in the bu
ecdd0 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 ffer, or non-zer
ecde0 6f 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 o..** otherwise
ecdf0 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 (if the message
ece00 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 was truncated).
ece10 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 If non-zero is r
ece20 65 74 75 72 6e 65 64 2c 0d 0a 2a 2a 20 74 68 65 eturned,..** the
ece30 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 n it is not nece
ece40 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 ssary to include
ece50 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 the nul-termina
ece60 74 6f 72 20 63 68 61 72 61 63 74 65 72 0d 0a 2a tor character..*
ece70 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 * in the output
ece80 62 75 66 66 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 buffer...**..**
ece90 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e Not supplying an
ecea0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 error message w
eceb0 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 ill have no adve
ecec0 72 73 65 20 65 66 66 65 63 74 0d 0a 2a 2a 20 6f rse effect..** o
eced0 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 n SQLite. It is
ecee0 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 fine to have an
ecef0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 implementation t
ecf00 68 61 74 20 6e 65 76 65 72 0d 0a 2a 2a 20 72 65 hat never..** re
ecf10 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d turns an error m
ecf20 65 73 73 61 67 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 essage:..**..**
ecf30 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 int xGetLastEr
ecf40 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 ror(sqlite3_vfs
ecf50 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c *pVfs, int nBuf,
ecf60 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0d 0a 2a char *zBuf){..*
ecf70 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 * assert(zBu
ecf80 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0d 0a 2a 2a f[0]=='\0');..**
ecf90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a return 0;..
ecfa0 2a 2a 20 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 48 ** }..**..** H
ecfb0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 owever if an err
ecfc0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 or message is su
ecfd0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 pplied, it will
ecfe0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0d be incorporated.
ecff0 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e .** by sqlite in
ed000 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 to the error mes
ed010 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 sage available t
ed020 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 o the user using
ed030 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 ..** sqlite3_err
ed040 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 msg(), possibly
ed050 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 making IO errors
ed060 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 easier to debug
ed070 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
ed080 74 20 6f 73 32 47 65 74 4c 61 73 74 45 72 72 6f t os2GetLastErro
ed090 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 r(sqlite3_vfs *p
ed0a0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 Vfs, int nBuf, c
ed0b0 68 61 72 20 2a 7a 42 75 66 29 7b 0d 0a 20 20 61 har *zBuf){.. a
ed0c0 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 ssert(zBuf[0]=='
ed0d0 5c 30 27 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 \0');.. return
ed0e0 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0;..}..../*..**
ed0f0 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 Initialize and d
ed100 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 einitialize the
ed110 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d operating system
ed120 20 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2f 0d interface...*/.
ed130 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
ed140 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 sqlite3_os_init(
ed150 76 6f 69 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 void){.. static
ed160 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 73 32 sqlite3_vfs os2
ed170 56 66 73 20 3d 20 7b 0d 0a 20 20 20 20 33 2c 20 Vfs = {.. 3,
ed180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ed190 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0d 0a /* iVersion */..
ed1a0 20 20 20 20 73 69 7a 65 6f 66 28 6f 73 32 46 69 sizeof(os2Fi
ed1b0 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 le), /* szOsFi
ed1c0 6c 65 20 2a 2f 0d 0a 20 20 20 20 43 43 48 4d 41 le */.. CCHMA
ed1d0 58 50 41 54 48 2c 20 20 20 20 20 20 20 20 2f 2a XPATH, /*
ed1e0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0d 0a mxPathname */..
ed1f0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
ed200 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 /* pNext
ed210 2a 2f 0d 0a 20 20 20 20 22 6f 73 32 22 2c 20 20 */.. "os2",
ed220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e /* zN
ed230 61 6d 65 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 20 ame */.. 0,
ed240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
ed250 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0d 0a 0d * pAppData */...
ed260 0a 20 20 20 20 6f 73 32 4f 70 65 6e 2c 20 20 20 . os2Open,
ed270 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e /* xOpen
ed280 20 2a 2f 0d 0a 20 20 20 20 6f 73 32 44 65 6c 65 */.. os2Dele
ed290 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 te, /* x
ed2a0 44 65 6c 65 74 65 20 2a 2f 0d 0a 20 20 20 20 6f Delete */.. o
ed2b0 73 32 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 s2Access,
ed2c0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0d /* xAccess */.
ed2d0 0a 20 20 20 20 6f 73 32 46 75 6c 6c 50 61 74 68 . os2FullPath
ed2e0 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75 6c 6c name, /* xFull
ed2f0 50 61 74 68 6e 61 6d 65 20 2a 2f 0d 0a 20 20 20 Pathname */..
ed300 20 6f 73 32 44 6c 4f 70 65 6e 2c 20 20 20 20 20 os2DlOpen,
ed310 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a /* xDlOpen *
ed320 2f 0d 0a 20 20 20 20 6f 73 32 44 6c 45 72 72 6f /.. os2DlErro
ed330 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c r, /* xDl
ed340 45 72 72 6f 72 20 2a 2f 0d 0a 20 20 20 20 6f 73 Error */.. os
ed350 32 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 2DlSym,
ed360 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0d 0a 20 /* xDlSym */..
ed370 20 20 20 6f 73 32 44 6c 43 6c 6f 73 65 2c 20 20 os2DlClose,
ed380 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 /* xDlClos
ed390 65 20 2a 2f 0d 0a 20 20 20 20 6f 73 32 52 61 6e e */.. os2Ran
ed3a0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 domness, /*
ed3b0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0d 0a xRandomness */..
ed3c0 20 20 20 20 6f 73 32 53 6c 65 65 70 2c 20 20 20 os2Sleep,
ed3d0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 /* xSleep
ed3e0 20 2a 2f 0d 0a 20 20 20 20 6f 73 32 43 75 72 72 */.. os2Curr
ed3f0 65 6e 74 54 69 6d 65 2c 20 20 20 20 2f 2a 20 78 entTime, /* x
ed400 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0d 0a CurrentTime */..
ed410 20 20 20 20 6f 73 32 47 65 74 4c 61 73 74 45 72 os2GetLastEr
ed420 72 6f 72 2c 20 20 20 2f 2a 20 78 47 65 74 4c 61 ror, /* xGetLa
ed430 73 74 45 72 72 6f 72 20 2a 2f 0d 0a 20 20 20 20 stError */..
ed440 6f 73 32 43 75 72 72 65 6e 74 54 69 6d 65 49 6e os2CurrentTimeIn
ed450 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 t64, /* xCurrent
ed460 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0d 0a 20 20 TimeInt64 */..
ed470 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
ed480 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 /* xSetSyst
ed490 65 6d 43 61 6c 6c 20 2a 2f 0d 0a 20 20 20 20 30 emCall */.. 0
ed4a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
ed4b0 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 /* xGetSystemC
ed4c0 61 6c 6c 20 2a 2f 0d 0a 20 20 20 20 30 20 20 20 all */.. 0
ed4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
ed4e0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c * xNextSystemCal
ed4f0 6c 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 20 20 73 71 l */.. };.. sq
ed500 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 lite3_vfs_regist
ed510 65 72 28 26 6f 73 32 56 66 73 2c 20 31 29 3b 0d er(&os2Vfs, 1);.
ed520 0a 20 20 69 6e 69 74 55 63 6f 6e 76 4f 62 6a 65 . initUconvObje
ed530 63 74 73 28 29 3b 0d 0a 2f 2a 20 20 73 71 6c 69 cts();../* sqli
ed540 74 65 33 4f 53 54 72 61 63 65 20 3d 20 31 3b 20 te3OSTrace = 1;
ed550 2a 2f 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c */.. return SQL
ed560 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 53 51 4c 49 ITE_OK;..}..SQLI
ed570 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
ed580 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b e3_os_end(void){
ed590 0d 0a 20 20 66 72 65 65 55 63 6f 6e 76 4f 62 6a .. freeUconvObj
ed5a0 65 63 74 73 28 29 3b 0d 0a 20 20 72 65 74 75 72 ects();.. retur
ed5b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
ed5c0 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c ...#endif /* SQL
ed5d0 49 54 45 5f 4f 53 5f 4f 53 32 20 2a 2f 0d 0a 0d ITE_OS_OS2 */...
ed5e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
ed5f0 20 45 6e 64 20 6f 66 20 6f 73 5f 6f 73 32 2e 63 End of os_os2.c
ed600 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
ed610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
ed630 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
ed640 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 6f 73 5f * Begin file os_
ed650 75 6e 69 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a unix.c *********
ed660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed680 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 34 20 4d /../*..** 2004 M
ed690 61 79 20 32 32 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 ay 22..**..** Th
ed6a0 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
ed6b0 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
ed6c0 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
ed6d0 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
ed6e0 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
ed6f0 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
ed700 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
ed710 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
ed720 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
ed730 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
ed740 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
ed750 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
ed760 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
ed770 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
ed780 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
ed790 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
ed7a0 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
ed7b0 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
ed7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ed800 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 **..**..** This
ed810 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 file contains th
ed820 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 e VFS implementa
ed830 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c 69 tion for unix-li
ed840 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 ke operating sys
ed850 74 65 6d 73 0d 0a 2a 2a 20 69 6e 63 6c 75 64 65 tems..** include
ed860 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20 Linux, MacOSX,
ed870 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72 *BSD, QNX, VxWor
ed880 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61 ks, AIX, HPUX, a
ed890 6e 64 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 0d 0a nd others...**..
ed8a0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 63 74 ** There are act
ed8b0 75 61 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 ually several di
ed8c0 66 66 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c fferent VFS impl
ed8d0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 ementations in t
ed8e0 68 69 73 20 66 69 6c 65 2e 0d 0a 2a 2a 20 54 68 his file...** Th
ed8f0 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 61 72 e differences ar
ed900 65 20 69 6e 20 74 68 65 20 77 61 79 20 74 68 61 e in the way tha
ed910 74 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 t file locking i
ed920 73 20 64 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 s done. The def
ed930 61 75 6c 74 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 ault..** impleme
ed940 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 50 6f 73 ntation uses Pos
ed950 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b ix Advisory Lock
ed960 73 2e 20 20 41 6c 74 65 72 6e 61 74 69 76 65 20 s. Alternative
ed970 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0d implementations.
ed980 0a 2a 2a 20 75 73 65 20 66 6c 6f 63 6b 28 29 2c .** use flock(),
ed990 20 64 6f 74 2d 66 69 6c 65 73 2c 20 76 61 72 69 dot-files, vari
ed9a0 6f 75 73 20 70 72 6f 70 72 69 65 74 61 72 79 20 ous proprietary
ed9b0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 61 73 2c locking schemas,
ed9c0 20 6f 72 20 73 69 6d 70 6c 79 0d 0a 2a 2a 20 73 or simply..** s
ed9d0 6b 69 70 20 6c 6f 63 6b 69 6e 67 20 61 6c 6c 20 kip locking all
ed9e0 74 6f 67 65 74 68 65 72 2e 0d 0a 2a 2a 0d 0a 2a together...**..*
ed9f0 2a 20 54 68 69 73 20 73 6f 75 72 63 65 20 66 69 * This source fi
eda00 6c 65 20 69 73 20 6f 72 67 61 6e 69 7a 65 64 20 le is organized
eda10 69 6e 74 6f 20 64 69 76 69 73 69 6f 6e 73 20 77 into divisions w
eda20 68 65 72 65 20 74 68 65 20 6c 6f 67 69 63 20 66 here the logic f
eda30 6f 72 20 76 61 72 69 6f 75 73 0d 0a 2a 2a 20 73 or various..** s
eda40 75 62 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 ubfunctions is c
eda50 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 ontained within
eda60 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
eda70 64 69 76 69 73 69 6f 6e 2e 20 20 50 4c 45 41 53 division. PLEAS
eda80 45 0d 0a 2a 2a 20 4b 45 45 50 20 54 48 45 20 53 E..** KEEP THE S
eda90 54 52 55 43 54 55 52 45 20 4f 46 20 54 48 49 53 TRUCTURE OF THIS
edaa0 20 46 49 4c 45 20 49 4e 54 41 43 54 2e 20 20 4e FILE INTACT. N
edab0 65 77 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 ew code should b
edac0 65 20 70 6c 61 63 65 64 0d 0a 2a 2a 20 69 6e 20 e placed..** in
edad0 74 68 65 20 63 6f 72 72 65 63 74 20 64 69 76 69 the correct divi
edae0 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 sion and should
edaf0 62 65 20 63 6c 65 61 72 6c 79 20 6c 61 62 65 6c be clearly label
edb00 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ed...**..** The
edb10 6c 61 79 6f 75 74 20 6f 66 20 64 69 76 69 73 69 layout of divisi
edb20 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 ons is as follow
edb30 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 s:..**..** *
edb40 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 General-purpose
edb50 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e 64 declarations and
edb60 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f utility functio
edb70 6e 73 2e 0d 0a 2a 2a 20 20 20 2a 20 20 55 6e 69 ns...** * Uni
edb80 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69 que file ID logi
edb90 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b c used by VxWork
edba0 73 2e 0d 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 s...** * Vari
edbb0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d ous locking prim
edbc0 69 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 itive implementa
edbd0 74 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 tions (all excep
edbe0 74 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 t proxy locking)
edbf0 3a 0d 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 :..** + for
edc00 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 Posix Advisory
edc10 4c 6f 63 6b 73 0d 0a 2a 2a 20 20 20 20 20 20 2b Locks..** +
edc20 20 66 6f 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 for no-op locks
edc30 0d 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 ..** + for
edc40 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 73 0d 0a dot-file locks..
edc50 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 66 6c ** + for fl
edc60 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 0d 0a 2a ock() locking..*
edc70 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 6e 61 6d * + for nam
edc80 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 ed semaphore loc
edc90 6b 73 20 28 56 78 57 6f 72 6b 73 20 6f 6e 6c 79 ks (VxWorks only
edca0 29 0d 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 )..** + for
edcb0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 20 AFP filesystem
edcc0 6c 6f 63 6b 73 20 28 4d 61 63 4f 53 58 20 6f 6e locks (MacOSX on
edcd0 6c 79 29 0d 0a 2a 2a 20 20 20 2a 20 20 73 71 6c ly)..** * sql
edce0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 ite3_file method
edcf0 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 s not associated
edd00 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0d 0a with locking...
edd10 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69 74 69 ** * Definiti
edd20 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 ons of sqlite3_i
edd30 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 o_methods object
edd40 73 20 66 6f 72 20 61 6c 6c 20 6c 6f 63 6b 69 6e s for all lockin
edd50 67 0d 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f g..** metho
edd60 64 73 20 70 6c 75 73 20 22 66 69 6e 64 65 72 22 ds plus "finder"
edd70 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 65 functions for e
edd80 61 63 68 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 ach locking meth
edd90 6f 64 2e 0d 0a 2a 2a 20 20 20 2a 20 20 73 71 6c od...** * sql
edda0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 20 ite3_vfs method
eddb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e implementations.
eddc0 0d 0a 2a 2a 20 20 20 2a 20 20 4c 6f 63 6b 69 6e ..** * Lockin
eddd0 67 20 70 72 69 6d 69 74 69 76 65 73 20 66 6f 72 g primitives for
edde0 20 74 68 65 20 70 72 6f 78 79 20 75 62 65 72 2d the proxy uber-
eddf0 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 2e 20 locking-method.
ede00 28 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0d 0a 2a (MacOSX only)..*
ede10 2a 20 20 20 2a 20 20 44 65 66 69 6e 69 74 69 6f * * Definitio
ede20 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 ns of sqlite3_vf
ede30 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c s objects for al
ede40 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 l locking method
ede50 73 0d 0a 2a 2a 20 20 20 20 20 20 70 6c 75 73 20 s..** plus
ede60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 implementations
ede70 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e of sqlite3_os_in
ede80 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 it() and sqlite3
ede90 5f 6f 73 5f 65 6e 64 28 29 2e 0d 0a 2a 2f 0d 0a _os_end()...*/..
edea0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e #if SQLITE_OS_UN
edeb0 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 IX
edec0 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 /* This file is
eded0 75 73 65 64 20 6f 6e 20 75 6e 69 78 20 6f 6e 6c used on unix onl
edee0 79 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 y */..../*..** T
edef0 68 65 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 here are various
edf00 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c methods for fil
edf10 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 e locking used f
edf20 6f 72 20 63 6f 6e 63 75 72 72 65 6e 63 79 0d 0a or concurrency..
edf30 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0d 0a 2a 2a 0d ** control:..**.
edf40 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20 6c .** 1. POSIX l
edf50 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66 61 ocking (the defa
edf60 75 6c 74 29 2c 0d 0a 2a 2a 20 20 20 32 2e 20 4e ult),..** 2. N
edf70 6f 20 6c 6f 63 6b 69 6e 67 2c 0d 0a 2a 2a 20 20 o locking,..**
edf80 20 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 3. Dot-file loc
edf90 6b 69 6e 67 2c 0d 0a 2a 2a 20 20 20 34 2e 20 66 king,..** 4. f
edfa0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0d lock() locking,.
edfb0 0a 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 .** 5. AFP loc
edfc0 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c king (OSX only),
edfd0 0d 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64 20 ..** 6. Named
edfe0 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 73 POSIX semaphores
edff0 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c (VXWorks only),
ee000 0d 0a 2a 2a 20 20 20 37 2e 20 70 72 6f 78 79 20 ..** 7. proxy
ee010 6c 6f 63 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e locking. (OSX on
ee020 6c 79 29 0d 0a 2a 2a 0d 0a 2a 2a 20 53 74 79 6c ly)..**..** Styl
ee030 65 73 20 34 2c 20 35 2c 20 61 6e 64 20 37 20 61 es 4, 5, and 7 a
ee040 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c re only availabl
ee050 65 20 6f 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 e of SQLITE_ENAB
ee060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 LE_LOCKING_STYLE
ee070 0d 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 20 ..** is defined
ee080 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54 to 1. The SQLIT
ee090 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 E_ENABLE_LOCKING
ee0a0 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e 61 62 _STYLE also enab
ee0b0 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0d 0a 2a les automatic..*
ee0c0 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20 74 * selection of t
ee0d0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c he appropriate l
ee0e0 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73 ocking style bas
ee0f0 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 ed on the filesy
ee100 73 74 65 6d 0d 0a 2a 2a 20 77 68 65 72 65 20 74 stem..** where t
ee110 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c he database is l
ee120 6f 63 61 74 65 64 2e 20 20 0d 0a 2a 2f 0d 0a 23 ocated. ..*/..#
ee130 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 if !defined(SQLI
ee140 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e TE_ENABLE_LOCKIN
ee150 47 5f 53 54 59 4c 45 29 0d 0a 23 20 20 69 66 20 G_STYLE)..# if
ee160 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f defined(__APPLE_
ee170 5f 29 0d 0a 23 20 20 20 20 64 65 66 69 6e 65 20 _)..# define
ee180 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f SQLITE_ENABLE_LO
ee190 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0d 0a 23 CKING_STYLE 1..#
ee1a0 20 20 65 6c 73 65 0d 0a 23 20 20 20 20 64 65 66 else..# def
ee1b0 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c ine SQLITE_ENABL
ee1c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 E_LOCKING_STYLE
ee1d0 30 0d 0a 23 20 20 65 6e 64 69 66 0d 0a 23 65 6e 0..# endif..#en
ee1e0 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 dif..../*..** De
ee1f0 66 69 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f fine the OS_VXWO
ee200 52 4b 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f RKS pre-processo
ee210 72 20 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20 r macro to 1 if
ee220 62 75 69 6c 64 69 6e 67 20 6f 6e 20 0d 0a 2a 2a building on ..**
ee230 20 76 78 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f vxworks, or 0 o
ee240 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2f 0d 0a 23 therwise...*/..#
ee250 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f 52 4b ifndef OS_VXWORK
ee260 53 0d 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 S..# if defined
ee270 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 (__RTP__) || def
ee280 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c ined(_WRS_KERNEL
ee290 29 0d 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f )..# define O
ee2a0 53 5f 56 58 57 4f 52 4b 53 20 31 0d 0a 23 20 20 S_VXWORKS 1..#
ee2b0 65 6c 73 65 0d 0a 23 20 20 20 20 64 65 66 69 6e else..# defin
ee2c0 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0d 0a e OS_VXWORKS 0..
ee2d0 23 20 20 65 6e 64 69 66 0d 0a 23 65 6e 64 69 66 # endif..#endif
ee2e0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 ..../*..** These
ee2f0 20 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 #defines should
ee300 20 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c enable >2GB fil
ee310 65 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 e support on Pos
ee320 69 78 20 69 66 20 74 68 65 0d 0a 2a 2a 20 75 6e ix if the..** un
ee330 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 derlying operati
ee340 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 ng system suppor
ee350 74 73 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f ts it. If the O
ee360 53 20 6c 61 63 6b 73 0d 0a 2a 2a 20 6c 61 72 67 S lacks..** larg
ee370 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 e file support,
ee380 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65 20 these should be
ee390 6e 6f 2d 6f 70 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 no-ops...**..**
ee3a0 4c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f Large file suppo
ee3b0 72 74 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c rt can be disabl
ee3c0 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53 ed using the -DS
ee3d0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 QLITE_DISABLE_LF
ee3e0 53 20 73 77 69 74 63 68 0d 0a 2a 2a 20 6f 6e 20 S switch..** on
ee3f0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d the compiler com
ee400 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 mand line. This
ee410 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 69 66 is necessary if
ee420 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 you are compili
ee430 6e 67 0d 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65 ng..** on a rece
ee440 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 nt machine (ex:
ee450 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74 20 RedHat 7.2) but
ee460 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63 6f you want your co
ee470 64 65 20 74 6f 20 77 6f 72 6b 0d 0a 2a 2a 20 6f de to work..** o
ee480 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69 n an older machi
ee490 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36 ne (ex: RedHat 6
ee4a0 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d .0). If you com
ee4b0 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37 pile on RedHat 7
ee4c0 2e 32 0d 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 .2..** without t
ee4d0 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 his option, LFS
ee4e0 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 is enable. But
ee4f0 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 LFS does not exi
ee500 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c st in the kernel
ee510 0d 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 ..** in RedHat 6
ee520 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 .0, so the code
ee530 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e won't work. Hen
ee540 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 ce, for maximum
ee550 62 69 6e 61 72 79 0d 0a 2a 2a 20 70 6f 72 74 61 binary..** porta
ee560 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c bility you shoul
ee570 64 20 6f 6d 69 74 20 4c 46 53 2e 0d 0a 2a 2a 0d d omit LFS...**.
ee580 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73 .** The previous
ee590 20 70 61 72 61 67 72 61 70 68 20 77 61 73 20 77 paragraph was w
ee5a0 72 69 74 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 ritten in 2005.
ee5b0 20 28 54 68 69 73 20 70 61 72 61 67 72 61 70 68 (This paragraph
ee5c0 20 69 73 20 77 72 69 74 74 65 6e 0d 0a 2a 2a 20 is written..**
ee5d0 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e 29 20 on 2008-11-28.)
ee5e0 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c 6c 20 These days, all
ee5f0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 73 75 Linux kernels su
ee600 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69 6c 65 pport large file
ee610 73 2c 20 73 6f 0d 0a 2a 2a 20 79 6f 75 20 73 68 s, so..** you sh
ee620 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c 65 ould probably le
ee630 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64 2e ave LFS enabled.
ee640 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65 64 But some embed
ee650 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d 69 ded platforms mi
ee660 67 68 74 0d 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53 ght..** lack LFS
ee670 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 in which case t
ee680 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c he SQLITE_DISABL
ee690 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68 E_LFS macro migh
ee6a0 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75 t still be usefu
ee6b0 6c 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 l...*/..#ifndef
ee6c0 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c SQLITE_DISABLE_L
ee6d0 46 53 0d 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 FS..# define _LA
ee6e0 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20 20 31 RGE_FILE 1
ee6f0 0d 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c 45 ..# ifndef _FILE
ee700 5f 4f 46 46 53 45 54 5f 42 49 54 53 0d 0a 23 20 _OFFSET_BITS..#
ee710 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f define _FILE_O
ee720 46 46 53 45 54 5f 42 49 54 53 20 36 34 0d 0a 23 FFSET_BITS 64..#
ee730 20 65 6e 64 69 66 0d 0a 23 20 64 65 66 69 6e 65 endif..# define
ee740 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 _LARGEFILE_SOUR
ee750 43 45 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a CE 1..#endif....
ee760 2f 2a 0d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 /*..** standard
ee770 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0d 0a include files...
ee780 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 */..#include <sy
ee790 73 2f 74 79 70 65 73 2e 68 3e 0d 0a 23 69 6e 63 s/types.h>..#inc
ee7a0 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 lude <sys/stat.h
ee7b0 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e >..#include <fcn
ee7c0 74 6c 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 tl.h>..#include
ee7d0 3c 75 6e 69 73 74 64 2e 68 3e 0d 0a 2f 2a 20 23 <unistd.h>../* #
ee7e0 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e include <time.h>
ee7f0 20 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 */..#include <s
ee800 79 73 2f 74 69 6d 65 2e 68 3e 0d 0a 23 69 6e 63 ys/time.h>..#inc
ee810 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0d 0a lude <errno.h>..
ee820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
ee830 4d 49 54 5f 57 41 4c 0d 0a 23 69 6e 63 6c 75 64 MIT_WAL..#includ
ee840 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0d 0a e <sys/mman.h>..
ee850 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 23 69 66 20 #endif......#if
ee860 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f SQLITE_ENABLE_LO
ee870 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 23 20 69 CKING_STYLE..# i
ee880 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 nclude <sys/ioct
ee890 6c 2e 68 3e 0d 0a 23 20 69 66 20 4f 53 5f 56 58 l.h>..# if OS_VX
ee8a0 57 4f 52 4b 53 0d 0a 23 20 20 69 6e 63 6c 75 64 WORKS..# includ
ee8b0 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0d e <semaphore.h>.
ee8c0 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d .# include <lim
ee8d0 69 74 73 2e 68 3e 0d 0a 23 20 65 6c 73 65 0d 0a its.h>..# else..
ee8e0 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f # include <sys/
ee8f0 66 69 6c 65 2e 68 3e 0d 0a 23 20 20 69 6e 63 6c file.h>..# incl
ee900 75 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 ude <sys/param.h
ee910 3e 0d 0a 23 20 65 6e 64 69 66 0d 0a 23 65 6e 64 >..# endif..#end
ee920 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 if /* SQLITE_ENA
ee930 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c BLE_LOCKING_STYL
ee940 45 20 2a 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69 E */....#if defi
ee950 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c ned(__APPLE__) |
ee960 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 | (SQLITE_ENABLE
ee970 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 _LOCKING_STYLE &
ee980 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0d 0a & !OS_VXWORKS)..
ee990 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d # include <sys/m
ee9a0 6f 75 6e 74 2e 68 3e 0d 0a 23 65 6e 64 69 66 0d ount.h>..#endif.
ee9b0 0a 0d 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 ...#ifdef HAVE_U
ee9c0 54 49 4d 45 0d 0a 23 20 69 6e 63 6c 75 64 65 20 TIME..# include
ee9d0 3c 75 74 69 6d 65 2e 68 3e 0d 0a 23 65 6e 64 69 <utime.h>..#endi
ee9e0 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f f..../*..** Allo
ee9f0 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e wed values of un
eea00 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0d 0a ixFile.fsFlags..
eea10 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 */..#define SQLI
eea20 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 TE_FSFLAGS_IS_MS
eea30 44 4f 53 20 20 20 20 20 30 78 31 0d 0a 0d 0a 2f DOS 0x1..../
eea40 2a 0d 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 *..** If we are
eea50 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 to be thread-saf
eea60 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 e, include the p
eea70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61 threads header a
eea80 6e 64 20 64 65 66 69 6e 65 0d 0a 2a 2a 20 74 68 nd define..** th
eea90 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 e SQLITE_UNIX_TH
eeaa0 52 45 41 44 53 20 6d 61 63 72 6f 2e 0d 0a 2a 2f READS macro...*/
eeab0 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 ..#if SQLITE_THR
eeac0 45 41 44 53 41 46 45 0d 0a 2f 2a 20 23 20 69 6e EADSAFE../* # in
eead0 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 clude <pthread.h
eeae0 3e 20 2a 2f 0d 0a 23 20 64 65 66 69 6e 65 20 53 > */..# define S
eeaf0 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 QLITE_UNIX_THREA
eeb00 44 53 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a DS 1..#endif....
eeb10 2f 2a 0d 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 /*..** Default p
eeb20 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 ermissions when
eeb30 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 creating a new f
eeb40 69 6c 65 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 ile..*/..#ifndef
eeb50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f SQLITE_DEFAULT_
eeb60 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 FILE_PERMISSIONS
eeb70 0d 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 ..# define SQLIT
eeb80 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 E_DEFAULT_FILE_P
eeb90 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0d ERMISSIONS 0644.
eeba0 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 20 .#endif..../*..
eebb0 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 ** Default permi
eebc0 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 ssions when crea
eebd0 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 ting auto proxy
eebe0 64 69 72 0d 0a 20 2a 2f 0d 0a 23 69 66 6e 64 65 dir.. */..#ifnde
eebf0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 f SQLITE_DEFAULT
eec00 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 _PROXYDIR_PERMIS
eec10 53 49 4f 4e 53 0d 0a 23 20 64 65 66 69 6e 65 20 SIONS..# define
eec20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 SQLITE_DEFAULT_P
eec30 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 ROXYDIR_PERMISSI
eec40 4f 4e 53 20 30 37 35 35 0d 0a 23 65 6e 64 69 66 ONS 0755..#endif
eec50 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 78 69 6d ..../*..** Maxim
eec60 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 um supported pat
eec70 68 2d 6c 65 6e 67 74 68 2e 0d 0a 2a 2f 0d 0a 23 h-length...*/..#
eec80 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e define MAX_PATHN
eec90 41 4d 45 20 35 31 32 0d 0a 0d 0a 2f 2a 0d 0a 2a AME 512..../*..*
eeca0 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c * Only set the l
eecb0 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 astErrno if the
eecc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 error code is a
eecd0 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e real error and n
eece0 6f 74 20 0d 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c ot ..** a normal
eecf0 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e expected return
eed00 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f code of SQLITE_
eed10 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f BUSY or SQLITE_O
eed20 4b 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 49 K..*/..#define I
eed30 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 S_LOCK_ERROR(x)
eed40 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f ((x != SQLITE_O
eed50 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 K) && (x != SQLI
eed60 54 45 5f 42 55 53 59 29 29 0d 0a 0d 0a 2f 2a 20 TE_BUSY))..../*
eed70 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 Forward referenc
eed80 65 73 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 es */..typedef s
eed90 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e truct unixShm un
eeda0 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 ixShm;
eedb0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 /* Connecti
eedc0 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 on shared memory
eedd0 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 */..typedef str
eede0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 uct unixShmNode
eedf0 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 unixShmNode;
eee00 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d /* Shared mem
eee10 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0d ory instance */.
eee20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
eee30 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e unixInodeInfo un
eee40 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f ixInodeInfo; /
eee50 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0d 0a * An i-node */..
eee60 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 typedef struct U
eee70 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 nixUnusedFd Unix
eee80 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a UnusedFd; /*
eee90 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 An unused file
eeea0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0d 0a 0d descriptor */...
eeeb0 0a 2f 2a 0d 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 ./*..** Sometime
eeec0 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 s, after a file
eeed0 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 handle is closed
eeee0 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 by SQLite, the
eeef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0d file descriptor.
eef00 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c .** cannot be cl
eef10 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 osed immediately
eef20 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 . In these cases
eef30 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 , instances of t
eef40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a he following..**
eef50 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75 structure are u
eef60 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 sed to store the
eef70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
eef80 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66 while waiting f
eef90 6f 72 20 61 6e 0d 0a 2a 2a 20 6f 70 70 6f 72 74 or an..** opport
eefa0 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 unity to either
eefb0 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 close or reuse i
eefc0 74 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 55 t...*/..struct U
eefd0 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0d 0a 20 nixUnusedFd {..
eefe0 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 int fd;
eeff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
ef000 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f le descriptor to
ef010 20 63 6c 6f 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 close */.. int
ef020 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 flags;
ef030 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 /* Flags
ef040 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 this file descri
ef050 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 ptor was opened
ef060 77 69 74 68 20 2a 2f 0d 0a 20 20 55 6e 69 78 55 with */.. UnixU
ef070 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 nusedFd *pNext;
ef080 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 /* Next unu
ef090 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 sed file descrip
ef0a0 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 tor on same file
ef0b0 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a */..};..../*..*
ef0c0 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 * The unixFile s
ef0d0 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 tructure is subc
ef0e0 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f lass of sqlite3_
ef0f0 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f file specific to
ef100 20 74 68 65 20 75 6e 69 78 0d 0a 2a 2a 20 56 46 the unix..** VF
ef110 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e S implementation
ef120 73 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 s...*/..typedef
ef130 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 struct unixFile
ef140 75 6e 69 78 46 69 6c 65 3b 0d 0a 73 74 72 75 63 unixFile;..struc
ef150 74 20 75 6e 69 78 46 69 6c 65 20 7b 0d 0a 20 20 t unixFile {..
ef160 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f sqlite3_io_metho
ef170 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f ds const *pMetho
ef180 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 d; /* Always th
ef190 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f e first entry */
ef1a0 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .. sqlite3_vfs
ef1b0 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 *pVfs;
ef1c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 /* The V
ef1d0 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20 FS that created
ef1e0 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f this unixFile */
ef1f0 0d 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 .. unixInodeInf
ef200 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 o *pInode;
ef210 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 /* Info
ef220 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 about locks on t
ef230 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0d 0a 20 20 his inode */..
ef240 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 int h;
ef250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ef260 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 /* The file
ef270 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0d 0a 20 descriptor */..
ef280 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 unsigned char e
ef290 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 FileLock;
ef2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 /* The type
ef2b0 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e of lock held on
ef2c0 20 74 68 69 73 20 66 64 20 2a 2f 0d 0a 20 20 75 this fd */.. u
ef2d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 74 72 nsigned char ctr
ef2e0 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 lFlags;
ef2f0 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c /* Behavioral
ef300 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 bits. UNIXFILE
ef310 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 69 _* flags */.. i
ef320 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 nt lastErrno;
ef330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ef340 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 /* The unix e
ef350 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 rrno from last I
ef360 2f 4f 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 76 /O error */.. v
ef370 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 oid *lockingCont
ef380 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 ext;
ef390 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 /* Locking st
ef3a0 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 yle specific sta
ef3b0 74 65 20 2a 2f 0d 0a 20 20 55 6e 69 78 55 6e 75 te */.. UnixUnu
ef3c0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 sedFd *pUnused;
ef3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
ef3e0 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e Pre-allocated Un
ef3f0 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0d 0a 20 ixUnusedFd */..
ef400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
ef410 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 th;
ef420 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
ef430 74 68 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 75 the file */.. u
ef440 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 nixShm *pShm;
ef450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ef460 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d /* Shared mem
ef470 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f ory segment info
ef480 72 6d 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e rmation */.. in
ef490 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 t szChunk;
ef4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ef4b0 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 /* Configured
ef4c0 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 by FCNTL_CHUNK_S
ef4d0 49 5a 45 20 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 IZE */..#if SQLI
ef4e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e TE_ENABLE_LOCKIN
ef4f0 47 5f 53 54 59 4c 45 0d 0a 20 20 69 6e 74 20 6f G_STYLE.. int o
ef500 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 penFlags;
ef510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
ef520 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 * The flags spec
ef530 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 ified at open()
ef540 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 */..#endif..#if
ef550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f SQLITE_ENABLE_LO
ef560 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 CKING_STYLE || d
ef570 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f efined(__APPLE__
ef580 29 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 ).. unsigned fs
ef590 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 Flags;
ef5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 /* cach
ef5b0 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 ed details from
ef5c0 73 74 61 74 66 73 28 29 20 2a 2f 0d 0a 23 65 6e statfs() */..#en
ef5d0 64 69 66 0d 0a 23 69 66 20 4f 53 5f 56 58 57 4f dif..#if OS_VXWO
ef5e0 52 4b 53 0d 0a 20 20 73 74 72 75 63 74 20 76 78 RKS.. struct vx
ef5f0 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 worksFileId *pId
ef600 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e ; /* Un
ef610 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0d ique file ID */.
ef620 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
ef630 20 4e 44 45 42 55 47 0d 0a 20 20 2f 2a 20 54 68 NDEBUG.. /* Th
ef640 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 e next group of
ef650 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 variables are us
ef660 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 ed to track whet
ef670 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d 0a her or not the..
ef680 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
ef690 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 counter in byte
ef6a0 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 s 24-27 of datab
ef6b0 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 ase files are up
ef6c0 64 61 74 65 64 0d 0a 20 20 2a 2a 20 77 68 65 6e dated.. ** when
ef6d0 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66 ever any part of
ef6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68 the database ch
ef6f0 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72 anges. An asser
ef700 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0d tion fault will.
ef710 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 . ** occur if a
ef720 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 file is updated
ef730 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 without also up
ef740 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 dating the trans
ef750 61 63 74 69 6f 6e 0d 0a 20 20 2a 2a 20 63 6f 75 action.. ** cou
ef760 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 nter. This test
ef770 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 is made to avoi
ef780 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 d new problems s
ef790 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0d 0a 20 imilar to the..
ef7a0 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 ** one describe
ef7b0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 d by ticket #358
ef7c0 34 2e 20 0d 0a 20 20 2a 2f 0d 0a 20 20 75 6e 73 4. .. */.. uns
ef7d0 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 igned char trans
ef7e0 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 CntrChng; /* T
ef7f0 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 rue if the trans
ef800 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 action counter c
ef810 68 61 6e 67 65 64 20 2a 2f 0d 0a 20 20 75 6e 73 hanged */.. uns
ef820 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 igned char dbUpd
ef830 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 ate; /* T
ef840 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 rue if any part
ef850 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 of database file
ef860 20 63 68 61 6e 67 65 64 20 2a 2f 0d 0a 20 20 75 changed */.. u
ef870 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e nsigned char inN
ef880 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a ormalWrite; /*
ef890 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f True if in a no
ef8a0 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 rmal write opera
ef8b0 74 69 6f 6e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d tion */..#endif.
ef8c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
ef8d0 45 53 54 0d 0a 20 20 2f 2a 20 49 6e 20 74 65 73 EST.. /* In tes
ef8e0 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 t mode, increase
ef8f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 the size of thi
ef900 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 s structure a bi
ef910 74 20 73 6f 20 74 68 61 74 20 0d 0a 20 20 2a 2a t so that .. **
ef920 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 it is larger th
ef930 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72 an the struct Cr
ef940 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 ashFile defined
ef950 69 6e 20 74 65 73 74 36 2e 63 2e 0d 0a 20 20 2a in test6.c... *
ef960 2f 0d 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 /.. char aPaddi
ef970 6e 67 5b 33 32 5d 3b 0d 0a 23 65 6e 64 69 66 0d ng[32];..#endif.
ef980 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c .};..../*..** Al
ef990 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 lowed values for
ef9a0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 the unixFile.ct
ef9b0 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a rlFlags bitmask:
ef9c0 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 55 4e ..*/..#define UN
ef9d0 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 IXFILE_EXCL
ef9e0 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43 0x01 /* C
ef9f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 onnections from
efa00 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 one process only
efa10 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 55 4e 49 */..#define UNI
efa20 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 XFILE_RDONLY
efa30 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 0x02 /* Co
efa40 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 nnection is read
efa50 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 6e only */..#defin
efa60 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 e UNIXFILE_PERSI
efa70 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 ST_WAL 0x04
efa80 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 /* Persistent WA
efa90 4c 20 6d 6f 64 65 20 2a 2f 0d 0a 23 69 66 6e 64 L mode */..#ifnd
efaa0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c ef SQLITE_DISABL
efab0 45 5f 44 49 52 53 59 4e 43 0d 0a 23 20 64 65 66 E_DIRSYNC..# def
efac0 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 ine UNIXFILE_DIR
efad0 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 SYNC 0x08
efae0 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 /* Directory sy
efaf0 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0d 0a 23 65 nc needed */..#e
efb00 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 55 4e lse..# define UN
efb10 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 IXFILE_DIRSYNC
efb20 20 20 30 78 30 30 0d 0a 23 65 6e 64 69 66 0d 0a 0x00..#endif..
efb30 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 #define UNIXFILE
efb40 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 _PSOW 0x1
efb50 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 0 /* SQLITE_
efb60 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f IOCAP_POWERSAFE_
efb70 4f 56 45 52 57 52 49 54 45 20 2a 2f 0d 0a 23 64 OVERWRITE */..#d
efb80 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 efine UNIXFILE_D
efb90 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20 ELETE 0x20
efba0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e /* Delete on
efbb0 20 63 6c 6f 73 65 20 2a 2f 0d 0a 23 64 65 66 69 close */..#defi
efbc0 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 ne UNIXFILE_URI
efbd0 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 0x40
efbe0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 /* Filename mig
efbf0 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 ht have query pa
efc00 72 61 6d 65 74 65 72 73 20 2a 2f 0d 0a 23 64 65 rameters */..#de
efc10 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f fine UNIXFILE_NO
efc20 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 LOCK 0x80
efc30 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 /* Do no file
efc40 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0d 0a 0d 0a 2f locking */..../
efc50 2a 0d 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f *..** Include co
efc60 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f de that is commo
efc70 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 n to all os_*.c
efc80 66 69 6c 65 73 0d 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a files..*/../****
efc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 ********** Inclu
efca0 64 65 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 69 de os_common.h i
efcb0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 n the middle of
efcc0 6f 73 5f 75 6e 69 78 2e 63 20 2a 2a 2a 2a 2a 2a os_unix.c ******
efcd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
efce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 *********** Begi
efcf0 6e 20 66 69 6c 65 20 6f 73 5f 63 6f 6d 6d 6f 6e n file os_common
efd00 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .h *************
efd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
efd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d **********/../*.
efd30 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32 32 0d .** 2004 May 22.
efd40 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 .**..** The auth
efd50 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
efd60 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
efd70 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
efd80 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c place of..** a l
efd90 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 egal notice, her
efda0 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a e is a blessing:
efdb0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 ..**..** May
efdc0 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 you do good and
efdd0 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 not evil...**
efde0 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f May you find fo
efdf0 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f rgiveness for yo
efe00 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 urself and forgi
efe10 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 ve others...**
efe20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
efe30 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
efe40 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
efe50 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ou give...**..**
efe60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
efe70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
efe80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
efe90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
efea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
efeb0 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 ..** This file c
efec0 6f 6e 74 61 69 6e 73 20 6d 61 63 72 6f 73 20 61 ontains macros a
efed0 6e 64 20 61 20 6c 69 74 74 6c 65 20 62 69 74 20 nd a little bit
efee0 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 of code that is
efef0 63 6f 6d 6d 6f 6e 20 74 6f 0d 0a 2a 2a 20 61 6c common to..** al
eff00 6c 20 6f 66 20 74 68 65 20 70 6c 61 74 66 6f 72 l of the platfor
eff10 6d 2d 73 70 65 63 69 66 69 63 20 66 69 6c 65 73 m-specific files
eff20 20 28 6f 73 5f 2a 2e 63 29 20 61 6e 64 20 69 73 (os_*.c) and is
eff30 20 23 69 6e 63 6c 75 64 65 64 20 69 6e 74 6f 20 #included into
eff40 74 68 6f 73 65 0d 0a 2a 2a 20 66 69 6c 65 73 2e those..** files.
eff50 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 ..**..** This fi
eff60 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 23 69 6e le should be #in
eff70 63 6c 75 64 65 64 20 62 79 20 74 68 65 20 6f 73 cluded by the os
eff80 5f 2a 2e 63 20 66 69 6c 65 73 20 6f 6e 6c 79 2e _*.c files only.
eff90 20 20 49 74 20 69 73 20 6e 6f 74 20 61 0d 0a 2a It is not a..*
effa0 2a 20 67 65 6e 65 72 61 6c 20 70 75 72 70 6f 73 * general purpos
effb0 65 20 68 65 61 64 65 72 20 66 69 6c 65 2e 0d 0a e header file...
effc0 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 4f 53 5f */..#ifndef _OS_
effd0 43 4f 4d 4d 4f 4e 5f 48 5f 0d 0a 23 64 65 66 69 COMMON_H_..#defi
effe0 6e 65 20 5f 4f 53 5f 43 4f 4d 4d 4f 4e 5f 48 5f ne _OS_COMMON_H_
efff0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 74 20 6c 65 ..../*..** At le
f0000 61 73 74 20 74 77 6f 20 62 75 67 73 20 68 61 76 ast two bugs hav
f0010 65 20 73 6c 69 70 70 65 64 20 69 6e 20 62 65 63 e slipped in bec
f0020 61 75 73 65 20 77 65 20 63 68 61 6e 67 65 64 20 ause we changed
f0030 74 68 65 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 the MEMORY_DEBUG
f0040 0d 0a 2a 2a 20 6d 61 63 72 6f 20 74 6f 20 53 51 ..** macro to SQ
f0050 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64 20 73 LITE_DEBUG and s
f0060 6f 6d 65 20 6f 6c 64 65 72 20 6d 61 6b 65 66 69 ome older makefi
f0070 6c 65 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 les have not yet
f0080 20 6d 61 64 65 20 74 68 65 0d 0a 2a 2a 20 73 77 made the..** sw
f0090 69 74 63 68 2e 20 20 54 68 65 20 66 6f 6c 6c 6f itch. The follo
f00a0 77 69 6e 67 20 63 6f 64 65 20 73 68 6f 75 6c 64 wing code should
f00b0 20 63 61 74 63 68 20 74 68 69 73 20 70 72 6f 62 catch this prob
f00c0 6c 65 6d 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 lem at compile-t
f00d0 69 6d 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 ime...*/..#ifdef
f00e0 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0d 0a 23 MEMORY_DEBUG..#
f00f0 20 65 72 72 6f 72 20 22 54 68 65 20 4d 45 4d 4f error "The MEMO
f0100 52 59 5f 44 45 42 55 47 20 6d 61 63 72 6f 20 69 RY_DEBUG macro i
f0110 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 55 73 65 s obsolete. Use
f0120 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 6e SQLITE_DEBUG in
f0130 73 74 65 61 64 2e 22 0d 0a 23 65 6e 64 69 66 0d stead."..#endif.
f0140 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 ...#if defined(S
f0150 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 QLITE_TEST) && d
f0160 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 efined(SQLITE_DE
f0170 42 55 47 29 0d 0a 23 20 69 66 6e 64 65 66 20 53 BUG)..# ifndef S
f0180 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 QLITE_DEBUG_OS_T
f0190 52 41 43 45 0d 0a 23 20 20 20 64 65 66 69 6e 65 RACE..# define
f01a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 SQLITE_DEBUG_OS
f01b0 5f 54 52 41 43 45 20 30 0d 0a 23 20 65 6e 64 69 _TRACE 0..# endi
f01c0 66 0d 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 f.. int sqlite3
f01d0 4f 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45 OSTrace = SQLITE
f01e0 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b _DEBUG_OS_TRACE;
f01f0 0d 0a 23 20 64 65 66 69 6e 65 20 4f 53 54 52 41 ..# define OSTRA
f0200 43 45 28 58 29 20 20 20 20 20 20 20 20 20 20 69 CE(X) i
f0210 66 28 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 f( sqlite3OSTrac
f0220 65 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 e ) sqlite3Debug
f0230 50 72 69 6e 74 66 20 58 0d 0a 23 65 6c 73 65 0d Printf X..#else.
f0240 0a 23 20 64 65 66 69 6e 65 20 4f 53 54 52 41 43 .# define OSTRAC
f0250 45 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a E(X)..#endif....
f0260 2f 2a 0d 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f /*..** Macros fo
f0270 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 72 r performance tr
f0280 61 63 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 acing. Normally
f0290 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20 4f 6e turned off. On
f02a0 6c 79 20 77 6f 72 6b 73 0d 0a 2a 2a 20 6f 6e 20 ly works..** on
f02b0 69 34 38 36 20 68 61 72 64 77 61 72 65 2e 0d 0a i486 hardware...
f02c0 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
f02d0 45 5f 50 45 52 46 4f 52 4d 41 4e 43 45 5f 54 52 E_PERFORMANCE_TR
f02e0 41 43 45 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 68 ACE..../* ..** h
f02f0 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 wtime.h contains
f0300 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 inline assemble
f0310 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 r code for imple
f0320 6d 65 6e 74 69 6e 67 20 0d 0a 2a 2a 20 68 69 67 menting ..** hig
f0330 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 h-performance ti
f0340 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0d 0a ming routines...
f0350 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */../***********
f0360 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 68 77 74 69 *** Include hwti
f0370 6d 65 2e 68 20 69 6e 20 74 68 65 20 6d 69 64 64 me.h in the midd
f0380 6c 65 20 6f 66 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e le of os_common.
f0390 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
f03a0 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **/../**********
f03b0 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 **** Begin file
f03c0 68 77 74 69 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a hwtime.h *******
f03d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f03e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f03f0 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 ***/../*..** 200
f0400 38 20 4d 61 79 20 32 37 0d 0a 2a 2a 0d 0a 2a 2a 8 May 27..**..**
f0410 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 The author disc
f0420 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 laims copyright
f0430 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 to this source c
f0440 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f ode. In place o
f0450 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f f..** a legal no
f0460 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 tice, here is a
f0470 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a blessing:..**..*
f0480 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 * May you do
f0490 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 good and not evi
f04a0 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f l...** May yo
f04b0 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 u find forgivene
f04c0 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 ss for yourself
f04d0 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 and forgive othe
f04e0 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 rs...** May y
f04f0 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c ou share freely,
f0500 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f never taking mo
f0510 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 re than you give
f0520 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...**..*********
f0530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0570 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
f0580 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 is file contains
f0590 20 69 6e 6c 69 6e 65 20 61 73 6d 20 63 6f 64 65 inline asm code
f05a0 20 66 6f 72 20 72 65 74 72 69 65 76 69 6e 67 20 for retrieving
f05b0 22 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 "high-performanc
f05c0 65 22 0d 0a 2a 2a 20 63 6f 75 6e 74 65 72 73 20 e"..** counters
f05d0 66 6f 72 20 78 38 36 20 63 6c 61 73 73 20 43 50 for x86 class CP
f05e0 55 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 Us...*/..#ifndef
f05f0 20 5f 48 57 54 49 4d 45 5f 48 5f 0d 0a 23 64 65 _HWTIME_H_..#de
f0600 66 69 6e 65 20 5f 48 57 54 49 4d 45 5f 48 5f 0d fine _HWTIME_H_.
f0610 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f .../*..** The fo
f0620 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 llowing routine
f0630 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 only works on pe
f0640 6e 74 69 75 6d 2d 63 6c 61 73 73 20 28 6f 72 20 ntium-class (or
f0650 6e 65 77 65 72 29 20 70 72 6f 63 65 73 73 6f 72 newer) processor
f0660 73 2e 0d 0a 2a 2a 20 49 74 20 75 73 65 73 20 74 s...** It uses t
f0670 68 65 20 52 44 54 53 43 20 6f 70 63 6f 64 65 20 he RDTSC opcode
f0680 74 6f 20 72 65 61 64 20 74 68 65 20 63 79 63 6c to read the cycl
f0690 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 20 6f 75 e count value ou
f06a0 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 70 72 6f t of the..** pro
f06b0 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74 75 72 cessor and retur
f06c0 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e 20 20 ns that value.
f06d0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 This can be used
f06e0 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0d 0a 2a for high-res..*
f06f0 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0d 0a 2a 2f * profiling...*/
f0700 0d 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f ..#if (defined(_
f0710 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 _GNUC__) || defi
f0720 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 29 20 26 ned(_MSC_VER)) &
f0730 26 20 5c 0d 0a 20 20 20 20 20 20 28 64 65 66 69 & \.. (defi
f0740 6e 65 64 28 69 33 38 36 29 20 7c 7c 20 64 65 66 ned(i386) || def
f0750 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20 7c ined(__i386__) |
f0760 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 | defined(_M_IX8
f0770 36 29 29 0d 0a 0d 0a 20 20 23 69 66 20 64 65 66 6)).... #if def
f0780 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0d 0a ined(__GNUC__)..
f0790 0d 0a 20 20 5f 5f 69 6e 6c 69 6e 65 5f 5f 20 73 .. __inline__ s
f07a0 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 73 71 6c qlite_uint64 sql
f07b0 69 74 65 33 48 77 74 69 6d 65 28 76 6f 69 64 29 ite3Hwtime(void)
f07c0 7b 0d 0a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 {.. unsigned
f07d0 20 69 6e 74 20 6c 6f 2c 20 68 69 3b 0d 0a 20 20 int lo, hi;..
f07e0 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c __asm__ __vol
f07f0 61 74 69 6c 65 5f 5f 20 28 22 72 64 74 73 63 22 atile__ ("rdtsc"
f0800 20 3a 20 22 3d 61 22 20 28 6c 6f 29 2c 20 22 3d : "=a" (lo), "=
f0810 64 22 20 28 68 69 29 29 3b 0d 0a 20 20 20 20 20 d" (hi));..
f0820 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 5f 75 return (sqlite_u
f0830 69 6e 74 36 34 29 68 69 20 3c 3c 20 33 32 20 7c int64)hi << 32 |
f0840 20 6c 6f 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 lo;.. }.... #
f0850 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 elif defined(_MS
f0860 43 5f 56 45 52 29 0d 0a 0d 0a 20 20 5f 5f 64 65 C_VER).... __de
f0870 63 6c 73 70 65 63 28 6e 61 6b 65 64 29 20 5f 5f clspec(naked) __
f0880 69 6e 6c 69 6e 65 20 73 71 6c 69 74 65 5f 75 69 inline sqlite_ui
f0890 6e 74 36 34 20 5f 5f 63 64 65 63 6c 20 73 71 6c nt64 __cdecl sql
f08a0 69 74 65 33 48 77 74 69 6d 65 28 76 6f 69 64 29 ite3Hwtime(void)
f08b0 7b 0d 0a 20 20 20 20 20 5f 5f 61 73 6d 20 7b 0d {.. __asm {.
f08c0 0a 20 20 20 20 20 20 20 20 72 64 74 73 63 0d 0a . rdtsc..
f08d0 20 20 20 20 20 20 20 20 72 65 74 20 20 20 20 20 ret
f08e0 20 20 3b 20 72 65 74 75 72 6e 20 76 61 6c 75 65 ; return value
f08f0 20 61 74 20 45 44 58 3a 45 41 58 0d 0a 20 20 20 at EDX:EAX..
f0900 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 65 }.. }.... #e
f0910 6e 64 69 66 0d 0a 0d 0a 23 65 6c 69 66 20 28 64 ndif....#elif (d
f0920 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
f0930 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 && defined(__x8
f0940 36 5f 36 34 5f 5f 29 29 0d 0a 0d 0a 20 20 5f 5f 6_64__)).... __
f0950 69 6e 6c 69 6e 65 5f 5f 20 73 71 6c 69 74 65 5f inline__ sqlite_
f0960 75 69 6e 74 36 34 20 73 71 6c 69 74 65 33 48 77 uint64 sqlite3Hw
f0970 74 69 6d 65 28 76 6f 69 64 29 7b 0d 0a 20 20 20 time(void){..
f0980 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
f0990 20 76 61 6c 3b 0d 0a 20 20 20 20 20 20 5f 5f 61 val;.. __a
f09a0 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f sm__ __volatile_
f09b0 5f 20 28 22 72 64 74 73 63 22 20 3a 20 22 3d 41 _ ("rdtsc" : "=A
f09c0 22 20 28 76 61 6c 29 29 3b 0d 0a 20 20 20 20 20 " (val));..
f09d0 20 72 65 74 75 72 6e 20 76 61 6c 3b 0d 0a 20 20 return val;..
f09e0 7d 0d 0a 20 0d 0a 23 65 6c 69 66 20 28 64 65 66 }.. ..#elif (def
f09f0 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26 ined(__GNUC__) &
f0a00 26 20 64 65 66 69 6e 65 64 28 5f 5f 70 70 63 5f & defined(__ppc_
f0a10 5f 29 29 0d 0a 0d 0a 20 20 5f 5f 69 6e 6c 69 6e _)).... __inlin
f0a20 65 5f 5f 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 e__ sqlite_uint6
f0a30 34 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 4 sqlite3Hwtime(
f0a40 76 6f 69 64 29 7b 0d 0a 20 20 20 20 20 20 75 6e void){.. un
f0a50 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 signed long long
f0a60 20 72 65 74 76 61 6c 3b 0d 0a 20 20 20 20 20 20 retval;..
f0a70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6a 75 unsigned long ju
f0a80 6e 6b 3b 0d 0a 20 20 20 20 20 20 5f 5f 61 73 6d nk;.. __asm
f0a90 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 __ __volatile__
f0aa0 28 22 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 20 ("\n\..
f0ab0 20 31 3a 20 20 20 20 20 20 6d 66 74 62 75 20 20 1: mftbu
f0ac0 20 25 31 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 %1\n\..
f0ad0 20 20 20 20 20 20 20 20 20 20 6d 66 74 62 20 20 mftb
f0ae0 20 20 25 4c 30 5c 6e 5c 0d 0a 20 20 20 20 20 20 %L0\n\..
f0af0 20 20 20 20 20 20 20 20 20 20 20 20 6d 66 74 62 mftb
f0b00 75 20 20 20 25 30 5c 6e 5c 0d 0a 20 20 20 20 20 u %0\n\..
f0b10 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 70 cmp
f0b20 77 20 20 20 20 25 30 2c 25 31 5c 6e 5c 0d 0a 20 w %0,%1\n\..
f0b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f0b40 20 62 6e 65 20 20 20 20 20 31 62 22 0d 0a 20 20 bne 1b"..
f0b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f0b60 3a 20 22 3d 72 22 20 28 72 65 74 76 61 6c 29 2c : "=r" (retval),
f0b70 20 22 3d 72 22 20 28 6a 75 6e 6b 29 29 3b 0d 0a "=r" (junk));..
f0b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 return ret
f0b90 76 61 6c 3b 0d 0a 20 20 7d 0d 0a 0d 0a 23 65 6c val;.. }....#el
f0ba0 73 65 0d 0a 0d 0a 20 20 23 65 72 72 6f 72 20 4e se.... #error N
f0bb0 65 65 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 eed implementati
f0bc0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 48 77 74 on of sqlite3Hwt
f0bd0 69 6d 65 28 29 20 66 6f 72 20 79 6f 75 72 20 70 ime() for your p
f0be0 6c 61 74 66 6f 72 6d 2e 0d 0a 0d 0a 20 20 2f 2a latform..... /*
f0bf0 0d 0a 20 20 2a 2a 20 54 6f 20 63 6f 6d 70 69 6c .. ** To compil
f0c00 65 20 77 69 74 68 6f 75 74 20 69 6d 70 6c 65 6d e without implem
f0c10 65 6e 74 69 6e 67 20 73 71 6c 69 74 65 33 48 77 enting sqlite3Hw
f0c20 74 69 6d 65 28 29 20 66 6f 72 20 79 6f 75 72 20 time() for your
f0c30 70 6c 61 74 66 6f 72 6d 2c 0d 0a 20 20 2a 2a 20 platform,.. **
f0c40 79 6f 75 20 63 61 6e 20 72 65 6d 6f 76 65 20 74 you can remove t
f0c50 68 65 20 61 62 6f 76 65 20 23 65 72 72 6f 72 20 he above #error
f0c60 61 6e 64 20 75 73 65 20 74 68 65 20 66 6f 6c 6c and use the foll
f0c70 6f 77 69 6e 67 0d 0a 20 20 2a 2a 20 73 74 75 62 owing.. ** stub
f0c80 20 66 75 6e 63 74 69 6f 6e 2e 20 20 59 6f 75 20 function. You
f0c90 77 69 6c 6c 20 6c 6f 73 65 20 74 69 6d 69 6e 67 will lose timing
f0ca0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6d 61 6e support for man
f0cb0 79 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 y.. ** of the d
f0cc0 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65 73 ebugging and tes
f0cd0 74 69 6e 67 20 75 74 69 6c 69 74 69 65 73 2c 20 ting utilities,
f0ce0 62 75 74 20 69 74 20 73 68 6f 75 6c 64 20 61 74 but it should at
f0cf0 0d 0a 20 20 2a 2a 20 6c 65 61 73 74 20 63 6f 6d .. ** least com
f0d00 70 69 6c 65 20 61 6e 64 20 72 75 6e 2e 0d 0a 20 pile and run...
f0d10 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 */..SQLITE_PRIV
f0d20 41 54 45 20 20 20 73 71 6c 69 74 65 5f 75 69 6e ATE sqlite_uin
f0d30 74 36 34 20 73 71 6c 69 74 65 33 48 77 74 69 6d t64 sqlite3Hwtim
f0d40 65 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 e(void){ return
f0d50 28 28 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 ((sqlite_uint64)
f0d60 30 29 3b 20 7d 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0); }....#endif.
f0d70 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 ...#endif /* !de
f0d80 66 69 6e 65 64 28 5f 48 57 54 49 4d 45 5f 48 5f fined(_HWTIME_H_
f0d90 29 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a ) */..../*******
f0da0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 68 ******* End of h
f0db0 77 74 69 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a wtime.h ********
f0dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f0de0 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
f0df0 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 ******** Continu
f0e00 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 ing where we lef
f0e10 74 20 6f 66 66 20 69 6e 20 6f 73 5f 63 6f 6d 6d t off in os_comm
f0e20 6f 6e 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a on.h ***********
f0e30 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 73 74 61 74 *******/....stat
f0e40 69 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 ic sqlite_uint64
f0e50 20 67 5f 73 74 61 72 74 3b 0d 0a 73 74 61 74 69 g_start;..stati
f0e60 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 c sqlite_uint64
f0e70 67 5f 65 6c 61 70 73 65 64 3b 0d 0a 23 64 65 66 g_elapsed;..#def
f0e80 69 6e 65 20 54 49 4d 45 52 5f 53 54 41 52 54 20 ine TIMER_START
f0e90 20 20 20 20 20 20 67 5f 73 74 61 72 74 3d 73 71 g_start=sq
f0ea0 6c 69 74 65 33 48 77 74 69 6d 65 28 29 0d 0a 23 lite3Hwtime()..#
f0eb0 64 65 66 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 define TIMER_END
f0ec0 20 20 20 20 20 20 20 20 20 67 5f 65 6c 61 70 73 g_elaps
f0ed0 65 64 3d 73 71 6c 69 74 65 33 48 77 74 69 6d 65 ed=sqlite3Hwtime
f0ee0 28 29 2d 67 5f 73 74 61 72 74 0d 0a 23 64 65 66 ()-g_start..#def
f0ef0 69 6e 65 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 ine TIMER_ELAPSE
f0f00 44 20 20 20 20 20 67 5f 65 6c 61 70 73 65 64 0d D g_elapsed.
f0f10 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 .#else..#define
f0f20 54 49 4d 45 52 5f 53 54 41 52 54 0d 0a 23 64 65 TIMER_START..#de
f0f30 66 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 0d 0a fine TIMER_END..
f0f40 23 64 65 66 69 6e 65 20 54 49 4d 45 52 5f 45 4c #define TIMER_EL
f0f50 41 50 53 45 44 20 20 20 20 20 28 28 73 71 6c 69 APSED ((sqli
f0f60 74 65 5f 75 69 6e 74 36 34 29 30 29 0d 0a 23 65 te_uint64)0)..#e
f0f70 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ndif..../*..** I
f0f80 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 f we compile wit
f0f90 68 20 74 68 65 20 53 51 4c 49 54 45 5f 54 45 53 h the SQLITE_TES
f0fa0 54 20 6d 61 63 72 6f 20 73 65 74 2c 20 74 68 65 T macro set, the
f0fb0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 n the following
f0fc0 62 6c 6f 63 6b 0d 0a 2a 2a 20 6f 66 20 63 6f 64 block..** of cod
f0fd0 65 20 77 69 6c 6c 20 67 69 76 65 20 75 73 20 74 e will give us t
f0fe0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 73 69 he ability to si
f0ff0 6d 75 6c 61 74 65 20 61 20 64 69 73 6b 20 49 2f mulate a disk I/
f1000 4f 20 65 72 72 6f 72 2e 20 20 54 68 69 73 0d 0a O error. This..
f1010 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 ** is used for t
f1020 65 73 74 69 6e 67 20 74 68 65 20 49 2f 4f 20 72 esting the I/O r
f1030 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0d 0a ecovery logic...
f1040 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
f1050 45 5f 54 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 E_TEST..SQLITE_A
f1060 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 PI int sqlite3_i
f1070 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b o_error_hit = 0;
f1080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
f1090 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 49 otal number of I
f10a0 2f 4f 20 45 72 72 6f 72 73 20 2a 2f 0d 0a 53 51 /O Errors */..SQ
f10b0 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
f10c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 ite3_io_error_ha
f10d0 72 64 68 69 74 20 3d 20 30 3b 20 20 20 20 20 20 rdhit = 0;
f10e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e /* Number of n
f10f0 6f 6e 2d 62 65 6e 69 67 6e 20 65 72 72 6f 72 73 on-benign errors
f1100 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 */..SQLITE_API
f1110 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 int sqlite3_io_e
f1120 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 rror_pending = 0
f1130 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e ; /* Coun
f1140 74 20 64 6f 77 6e 20 74 6f 20 66 69 72 73 74 20 t down to first
f1150 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0d 0a 53 51 I/O error */..SQ
f1160 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
f1170 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 ite3_io_error_pe
f1180 72 73 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 rsist = 0;
f1190 20 20 2f 2a 20 54 72 75 65 20 69 66 20 49 2f 4f /* True if I/O
f11a0 20 65 72 72 6f 72 73 20 70 65 72 73 69 73 74 20 errors persist
f11b0 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 */..SQLITE_API i
f11c0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 nt sqlite3_io_er
f11d0 72 6f 72 5f 62 65 6e 69 67 6e 20 3d 20 30 3b 20 ror_benign = 0;
f11e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
f11f0 69 66 20 65 72 72 6f 72 73 20 61 72 65 20 62 65 if errors are be
f1200 6e 69 67 6e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f nign */..SQLITE_
f1210 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
f1220 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 diskfull_pending
f1230 20 3d 20 30 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 = 0;..SQLITE_AP
f1240 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 I int sqlite3_di
f1250 73 6b 66 75 6c 6c 20 3d 20 30 3b 0d 0a 23 64 65 skfull = 0;..#de
f1260 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 fine SimulateIOE
f1270 72 72 6f 72 42 65 6e 69 67 6e 28 58 29 20 73 71 rrorBenign(X) sq
f1280 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 62 lite3_io_error_b
f1290 65 6e 69 67 6e 3d 28 58 29 0d 0a 23 64 65 66 69 enign=(X)..#defi
f12a0 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 ne SimulateIOErr
f12b0 6f 72 28 43 4f 44 45 29 20 20 5c 0d 0a 20 20 69 or(CODE) \.. i
f12c0 66 28 20 28 73 71 6c 69 74 65 33 5f 69 6f 5f 65 f( (sqlite3_io_e
f12d0 72 72 6f 72 5f 70 65 72 73 69 73 74 20 26 26 20 rror_persist &&
f12e0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 sqlite3_io_error
f12f0 5f 68 69 74 29 20 5c 0d 0a 20 20 20 20 20 20 20 _hit) \..
f1300 7c 7c 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 || sqlite3_io_er
f1310 72 6f 72 5f 70 65 6e 64 69 6e 67 2d 2d 20 3d 3d ror_pending-- ==
f1320 20 31 20 29 20 20 5c 0d 0a 20 20 20 20 20 20 20 1 ) \..
f1330 20 20 20 20 20 20 20 7b 20 6c 6f 63 61 6c 5f 69 { local_i
f1340 6f 65 72 72 28 29 3b 20 43 4f 44 45 3b 20 7d 0d oerr(); CODE; }.
f1350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 63 .static void loc
f1360 61 6c 5f 69 6f 65 72 72 28 29 7b 0d 0a 20 20 49 al_ioerr(){.. I
f1370 4f 54 52 41 43 45 28 28 22 49 4f 45 52 52 5c 6e OTRACE(("IOERR\n
f1380 22 29 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f "));.. sqlite3_
f1390 69 6f 5f 65 72 72 6f 72 5f 68 69 74 2b 2b 3b 0d io_error_hit++;.
f13a0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f . if( !sqlite3_
f13b0 69 6f 5f 65 72 72 6f 72 5f 62 65 6e 69 67 6e 20 io_error_benign
f13c0 29 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 ) sqlite3_io_err
f13d0 6f 72 5f 68 61 72 64 68 69 74 2b 2b 3b 0d 0a 7d or_hardhit++;..}
f13e0 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 ..#define Simula
f13f0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 teDiskfullError(
f1400 43 4f 44 45 29 20 5c 0d 0a 20 20 20 69 66 28 20 CODE) \.. if(
f1410 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c sqlite3_diskfull
f1420 5f 70 65 6e 64 69 6e 67 20 29 7b 20 5c 0d 0a 20 _pending ){ \..
f1430 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f if( sqlite3_
f1440 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 diskfull_pending
f1450 20 3d 3d 20 31 20 29 7b 20 5c 0d 0a 20 20 20 20 == 1 ){ \..
f1460 20 20 20 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29 local_ioerr()
f1470 3b 20 5c 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 ; \.. sqli
f1480 74 65 33 5f 64 69 73 6b 66 75 6c 6c 20 3d 20 31 te3_diskfull = 1
f1490 3b 20 5c 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 ; \.. sqli
f14a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 te3_io_error_hit
f14b0 20 3d 20 31 3b 20 5c 0d 0a 20 20 20 20 20 20 20 = 1; \..
f14c0 43 4f 44 45 3b 20 5c 0d 0a 20 20 20 20 20 7d 65 CODE; \.. }e
f14d0 6c 73 65 7b 20 5c 0d 0a 20 20 20 20 20 20 20 73 lse{ \.. s
f14e0 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c 5f qlite3_diskfull_
f14f0 70 65 6e 64 69 6e 67 2d 2d 3b 20 5c 0d 0a 20 20 pending--; \..
f1500 20 20 20 7d 20 5c 0d 0a 20 20 20 7d 0d 0a 23 65 } \.. }..#e
f1510 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d lse..#define Sim
f1520 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
f1530 67 6e 28 58 29 0d 0a 23 64 65 66 69 6e 65 20 53 gn(X)..#define S
f1540 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 41 imulateIOError(A
f1550 29 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 6c )..#define Simul
f1560 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 ateDiskfullError
f1570 28 41 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f (A)..#endif..../
f1580 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 *..** When testi
f1590 6e 67 2c 20 6b 65 65 70 20 61 20 63 6f 75 6e 74 ng, keep a count
f15a0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f of the number o
f15b0 66 20 6f 70 65 6e 20 66 69 6c 65 73 2e 0d 0a 2a f open files...*
f15c0 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
f15d0 5f 54 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 _TEST..SQLITE_AP
f15e0 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 I int sqlite3_op
f15f0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 3d 20 en_file_count =
f1600 30 3b 0d 0a 23 64 65 66 69 6e 65 20 4f 70 65 6e 0;..#define Open
f1610 43 6f 75 6e 74 65 72 28 58 29 20 20 73 71 6c 69 Counter(X) sqli
f1620 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f te3_open_file_co
f1630 75 6e 74 2b 3d 28 58 29 0d 0a 23 65 6c 73 65 0d unt+=(X)..#else.
f1640 0a 23 64 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 .#define OpenCou
f1650 6e 74 65 72 28 58 29 0d 0a 23 65 6e 64 69 66 0d nter(X)..#endif.
f1660 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 ...#endif /* !de
f1670 66 69 6e 65 64 28 5f 4f 53 5f 43 4f 4d 4d 4f 4e fined(_OS_COMMON
f1680 5f 48 5f 29 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a _H_) */..../****
f1690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f ********** End o
f16a0 66 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 2a 2a f os_common.h **
f16b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f16c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f16d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a *********/../***
f16e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 *********** Cont
f16f0 69 6e 75 69 6e 67 20 77 68 65 72 65 20 77 65 20 inuing where we
f1700 6c 65 66 74 20 6f 66 66 20 69 6e 20 6f 73 5f 75 left off in os_u
f1710 6e 69 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nix.c **********
f1720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f **********/..../
f1730 2a 0d 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 *..** Define var
f1740 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 ious macros that
f1750 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f are missing fro
f1760 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0d m some systems..
f1770 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 4f 5f 4c .*/..#ifndef O_L
f1780 41 52 47 45 46 49 4c 45 0d 0a 23 20 64 65 66 69 ARGEFILE..# defi
f1790 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 ne O_LARGEFILE 0
f17a0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 ..#endif..#ifdef
f17b0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f SQLITE_DISABLE_
f17c0 4c 46 53 0d 0a 23 20 75 6e 64 65 66 20 4f 5f 4c LFS..# undef O_L
f17d0 41 52 47 45 46 49 4c 45 0d 0a 23 20 64 65 66 69 ARGEFILE..# defi
f17e0 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 ne O_LARGEFILE 0
f17f0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 ..#endif..#ifnde
f1800 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0d 0a 23 20 f O_NOFOLLOW..#
f1810 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f define O_NOFOLLO
f1820 57 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 W 0..#endif..#if
f1830 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0d 0a 23 ndef O_BINARY..#
f1840 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 define O_BINARY
f1850 20 30 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0..#endif..../*
f1860 0d 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 ..** The threadi
f1870 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 d macro resolves
f1880 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 to the thread-i
f1890 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 d or to 0. Used
f18a0 20 66 6f 72 0d 0a 2a 2a 20 74 65 73 74 69 6e 67 for..** testing
f18b0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f and debugging o
f18c0 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 nly...*/..#if SQ
f18d0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0d LITE_THREADSAFE.
f18e0 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 .#define threadi
f18f0 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 d pthread_self()
f1900 0d 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 6e 65 ..#else..#define
f1910 20 74 68 72 65 61 64 69 64 20 30 0d 0a 23 65 6e threadid 0..#en
f1920 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 69 dif..../*..** Di
f1930 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 fferent Unix sys
f1940 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 tems declare ope
f1950 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 n() in different
f1960 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 ways. Same use
f1970 0d 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 ..** open(const
f1980 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 char*,int,mode_t
f1990 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f ). Others use o
f19a0 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c pen(const char*,
f19b0 69 6e 74 2c 2e 2e 2e 29 2e 0d 0a 2a 2a 20 54 68 int,...)...** Th
f19c0 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 e difference is
f19d0 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 important when u
f19e0 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 sing a pointer t
f19f0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0d o the function..
f1a00 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 61 66 65 .**..** The safe
f1a10 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 st way to deal w
f1a20 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 ith the problem
f1a30 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 is to always use
f1a40 20 74 68 69 73 20 77 72 61 70 70 65 72 0d 0a 2a this wrapper..*
f1a50 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 * which always h
f1a60 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c as the same well
f1a70 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 -defined interfa
f1a80 63 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ce...*/..static
f1a90 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f int posixOpen(co
f1aa0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c nst char *zFile,
f1ab0 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 int flags, int
f1ac0 6d 6f 64 65 29 7b 0d 0a 20 20 72 65 74 75 72 6e mode){.. return
f1ad0 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 open(zFile, fla
f1ae0 67 73 2c 20 6d 6f 64 65 29 3b 0d 0a 7d 0d 0a 0d gs, mode);..}...
f1af0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 ./* Forward refe
f1b00 72 65 6e 63 65 20 2a 2f 0d 0a 73 74 61 74 69 63 rence */..static
f1b10 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f int openDirecto
f1b20 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 ry(const char*,
f1b30 69 6e 74 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a int*);..../*..**
f1b40 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c Many system cal
f1b50 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 ls are accessed
f1b60 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d through pointer-
f1b70 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 to-functions so
f1b80 74 68 61 74 0d 0a 2a 2a 20 74 68 65 79 20 6d 61 that..** they ma
f1b90 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 y be overridden
f1ba0 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 at runtime to fa
f1bb0 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 cilitate fault i
f1bc0 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0d njection during.
f1bd0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 .** testing and
f1be0 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 sandboxing. The
f1bf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 following array
f1c00 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 holds the names
f1c10 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0d 0a 2a and pointers..*
f1c20 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 * to all overrid
f1c30 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c eable system cal
f1c40 6c 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ls...*/..static
f1c50 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 struct unix_sysc
f1c60 61 6c 6c 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 all {.. const c
f1c70 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 har *zName;
f1c80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f /* Name o
f1c90 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c f the sytem call
f1ca0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 */.. sqlite3_s
f1cb0 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 yscall_ptr pCurr
f1cc0 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 ent; /* Current
f1cd0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 value of the sys
f1ce0 74 65 6d 20 63 61 6c 6c 20 2a 2f 0d 0a 20 20 73 tem call */.. s
f1cf0 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 qlite3_syscall_p
f1d00 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 tr pDefault; /*
f1d10 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f Default value */
f1d20 0d 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d ..} aSyscall[] =
f1d30 20 7b 0d 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 {.. { "open",
f1d40 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 (sqlite3
f1d50 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 _syscall_ptr)pos
f1d60 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0d 0a ixOpen, 0 },..
f1d70 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 #define osOpen
f1d80 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e ((int(*)(con
f1d90 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 st char*,int,int
f1da0 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 ))aSyscall[0].pC
f1db0 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 urrent).... { "
f1dc0 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 close", (
f1dd0 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f sqlite3_syscall_
f1de0 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 ptr)close,
f1df0 30 20 20 7d 2c 0d 0a 23 64 65 66 69 6e 65 20 6f 0 },..#define o
f1e00 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 sClose ((int
f1e10 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c (*)(int))aSyscal
f1e20 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a l[1].pCurrent)..
f1e30 0d 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 .. { "access",
f1e40 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 (sqlite3_s
f1e50 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 yscall_ptr)acces
f1e60 73 2c 20 20 20 20 20 30 20 20 7d 2c 0d 0a 23 64 s, 0 },..#d
f1e70 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 efine osAccess
f1e80 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 ((int(*)(const
f1e90 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 char*,int))aSys
f1ea0 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 call[2].pCurrent
f1eb0 29 0d 0a 0d 0a 20 20 7b 20 22 67 65 74 63 77 64 ).... { "getcwd
f1ec0 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ", (sqlite
f1ed0 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 3_syscall_ptr)ge
f1ee0 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0d tcwd, 0 },.
f1ef0 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 .#define osGetcw
f1f00 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 d ((char*(*)(
f1f10 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 char*,size_t))aS
f1f20 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 yscall[3].pCurre
f1f30 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 73 74 61 74 nt).... { "stat
f1f40 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 ", (sqli
f1f50 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 te3_syscall_ptr)
f1f60 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d stat, 0 }
f1f70 2c 0d 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 ,..#define osSta
f1f80 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 t ((int(*)(
f1f90 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 const char*,stru
f1fa0 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 ct stat*))aSysca
f1fb0 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0d ll[4].pCurrent).
f1fc0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 44 4a .../*..** The DJ
f1fd0 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 GPP compiler env
f1fe0 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d ironment looks m
f1ff0 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c ostly like Unix,
f2000 20 62 75 74 20 69 74 0d 0a 2a 2a 20 6c 61 63 6b but it..** lack
f2010 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 s the fcntl() sy
f2020 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 stem call. So r
f2030 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 edefine fcntl()
f2040 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0d to be something.
f2050 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 .** that always
f2060 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 succeeds. This
f2070 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 means that locki
f2080 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 ng does not occu
f2090 72 20 75 6e 64 65 72 0d 0a 2a 2a 20 44 4a 47 50 r under..** DJGP
f20a0 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f P. But it is DO
f20b0 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 S - what did you
f20c0 20 65 78 70 65 63 74 3f 0d 0a 2a 2f 0d 0a 23 69 expect?..*/..#i
f20d0 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0d 0a fdef __DJGPP__..
f20e0 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 { "fstat",
f20f0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
f2100 20 20 20 20 20 20 20 30 20 20 7d 2c 0d 0a 23 64 0 },..#d
f2110 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c efine osFstat(a,
f2120 62 2c 63 29 20 20 20 20 30 0d 0a 23 65 6c 73 65 b,c) 0..#else
f2130 20 20 20 20 20 0d 0a 20 20 7b 20 22 66 73 74 61 .. { "fsta
f2140 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 t", (sqli
f2150 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 te3_syscall_ptr)
f2160 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d fstat, 0 }
f2170 2c 0d 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 ,..#define osFst
f2180 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 at ((int(*)(
f2190 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a int,struct stat*
f21a0 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 ))aSyscall[5].pC
f21b0 75 72 72 65 6e 74 29 0d 0a 23 65 6e 64 69 66 0d urrent)..#endif.
f21c0 0a 0d 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 ... { "ftruncat
f21d0 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f e", (sqlite3_
f21e0 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 syscall_ptr)ftru
f21f0 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0d 0a 23 ncate, 0 },..#
f2200 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 define osFtrunca
f2210 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c te ((int(*)(int,
f2220 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b off_t))aSyscall[
f2230 36 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 6].pCurrent)....
f2240 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 { "fcntl",
f2250 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 (sqlite3_sys
f2260 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 call_ptr)fcntl,
f2270 20 20 20 20 20 30 20 20 7d 2c 0d 0a 23 64 65 66 0 },..#def
f2280 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 ine osFcntl
f2290 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 ((int(*)(int,int
f22a0 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 ,...))aSyscall[7
f22b0 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 ].pCurrent)....
f22c0 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 { "read",
f22d0 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 (sqlite3_sysc
f22e0 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 all_ptr)read,
f22f0 20 20 20 20 30 20 20 7d 2c 0d 0a 23 64 65 66 69 0 },..#defi
f2300 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 ne osRead (
f2310 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c (ssize_t(*)(int,
f2320 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 void*,size_t))aS
f2330 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 yscall[8].pCurre
f2340 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e nt)....#if defin
f2350 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c ed(USE_PREAD) ||
f2360 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
f2370 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 OCKING_STYLE..
f2380 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 { "pread",
f2390 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 (sqlite3_sysca
f23a0 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 ll_ptr)pread,
f23b0 20 20 20 30 20 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0 },..#else.
f23c0 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 . { "pread",
f23d0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 (sqlite3_sy
f23e0 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 scall_ptr)0,
f23f0 20 20 20 20 20 20 30 20 20 7d 2c 0d 0a 23 65 6e 0 },..#en
f2400 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 6f 73 50 dif..#define osP
f2410 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 read ((ssize
f2420 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c _t(*)(int,void*,
f2430 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 size_t,off_t))aS
f2440 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 yscall[9].pCurre
f2450 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e nt)....#if defin
f2460 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0d ed(USE_PREAD64).
f2470 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 . { "pread64",
f2480 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 (sqlite3_sy
f2490 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 scall_ptr)pread6
f24a0 34 2c 20 20 20 20 30 20 20 7d 2c 0d 0a 23 65 6c 4, 0 },..#el
f24b0 73 65 0d 0a 20 20 7b 20 22 70 72 65 61 64 36 34 se.. { "pread64
f24c0 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 ", (sqlite3
f24d0 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 _syscall_ptr)0,
f24e0 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0d 0a 0 },..
f24f0 23 65 6e 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 #endif..#define
f2500 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 osPread64 ((ss
f2510 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 ize_t(*)(int,voi
f2520 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 d*,size_t,off_t)
f2530 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 )aSyscall[10].pC
f2540 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 urrent).... { "
f2550 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 write", (
f2560 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f sqlite3_syscall_
f2570 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 ptr)write,
f2580 30 20 20 7d 2c 0d 0a 23 64 65 66 69 6e 65 20 6f 0 },..#define o
f2590 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 sWrite ((ssi
f25a0 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 ze_t(*)(int,cons
f25b0 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 t void*,size_t))
f25c0 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 aSyscall[11].pCu
f25d0 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 rrent)....#if de
f25e0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 fined(USE_PREAD)
f25f0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c || SQLITE_ENABL
f2600 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d E_LOCKING_STYLE.
f2610 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 . { "pwrite",
f2620 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 (sqlite3_sy
f2630 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 scall_ptr)pwrite
f2640 2c 20 20 20 20 20 30 20 20 7d 2c 0d 0a 23 65 6c , 0 },..#el
f2650 73 65 0d 0a 20 20 7b 20 22 70 77 72 69 74 65 22 se.. { "pwrite"
f2660 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 , (sqlite3
f2670 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 _syscall_ptr)0,
f2680 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0d 0a 0 },..
f2690 23 65 6e 64 69 66 0d 0a 23 64 65 66 69 6e 65 20 #endif..#define
f26a0 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 osPwrite ((ss
f26b0 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e ize_t(*)(int,con
f26c0 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c st void*,size_t,
f26d0 6f 66 66 5f 74 29 29 5c 0d 0a 20 20 20 20 20 20 off_t))\..
f26e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 aS
f26f0 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 yscall[12].pCurr
f2700 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 ent)....#if defi
f2710 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 ned(USE_PREAD64)
f2720 0d 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 .. { "pwrite64"
f2730 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 , (sqlite3_s
f2740 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 yscall_ptr)pwrit
f2750 65 36 34 2c 20 20 20 30 20 20 7d 2c 0d 0a 23 65 e64, 0 },..#e
f2760 6c 73 65 0d 0a 20 20 7b 20 22 70 77 72 69 74 65 lse.. { "pwrite
f2770 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 64", (sqlite
f2780 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 3_syscall_ptr)0,
f2790 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0d 0 },.
f27a0 0a 23 65 6e 64 69 66 0d 0a 23 64 65 66 69 6e 65 .#endif..#define
f27b0 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 osPwrite64 ((s
f27c0 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f size_t(*)(int,co
f27d0 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 nst void*,size_t
f27e0 2c 6f 66 66 5f 74 29 29 5c 0d 0a 20 20 20 20 20 ,off_t))\..
f27f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
f2800 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 Syscall[13].pCur
f2810 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 53 51 4c rent)....#if SQL
f2820 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 ITE_ENABLE_LOCKI
f2830 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 7b 20 22 66 NG_STYLE.. { "f
f2840 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 chmod", (s
f2850 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 qlite3_syscall_p
f2860 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 tr)fchmod, 0
f2870 20 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b },..#else.. {
f2880 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 "fchmod",
f2890 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c (sqlite3_syscal
f28a0 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 l_ptr)0,
f28b0 20 20 30 20 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0 },..#endif.
f28c0 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f .#define osFchmo
f28d0 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e d ((int(*)(in
f28e0 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 t,mode_t))aSysca
f28f0 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 ll[14].pCurrent)
f2900 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ....#if defined(
f2910 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f HAVE_POSIX_FALLO
f2920 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f CATE) && HAVE_PO
f2930 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0d 0a 20 SIX_FALLOCATE..
f2940 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 { "fallocate",
f2950 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 (sqlite3_sysc
f2960 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 all_ptr)posix_fa
f2970 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0d 0a llocate, 0 },..
f2980 23 65 6c 73 65 0d 0a 20 20 7b 20 22 66 61 6c 6c #else.. { "fall
f2990 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 ocate", (sqli
f29a0 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 te3_syscall_ptr)
f29b0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
f29c0 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0 },..#endif..
f29d0 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 #define osFalloc
f29e0 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 ate ((int(*)(int
f29f0 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 ,off_t,off_t))aS
f2a00 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 yscall[15].pCurr
f2a10 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 75 6e 6c ent).... { "unl
f2a20 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c ink", (sql
f2a30 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 ite3_syscall_ptr
f2a40 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 )unlink,
f2a50 20 20 20 30 20 7d 2c 0d 0a 23 64 65 66 69 6e 65 0 },..#define
f2a60 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 osUnlink ((i
f2a70 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 nt(*)(const char
f2a80 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e *))aSyscall[16].
f2a90 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b pCurrent).... {
f2aa0 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 "openDirectory"
f2ab0 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 , (sqlite3_sy
f2ac0 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 scall_ptr)openDi
f2ad0 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 rectory, 0
f2ae0 7d 2c 0d 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 },..#define osOp
f2af0 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e enDirectory ((in
f2b00 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a t(*)(const char*
f2b10 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b ,int*))aSyscall[
f2b20 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 17].pCurrent)...
f2b30 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 . { "mkdir",
f2b40 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 (sqlite3_sy
f2b50 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c scall_ptr)mkdir,
f2b60 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0 },.
f2b70 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 .#define osMkdir
f2b80 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f ((int(*)(co
f2b90 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 nst char*,mode_t
f2ba0 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 ))aSyscall[18].p
f2bb0 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 Current).... {
f2bc0 22 72 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 "rmdir",
f2bd0 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c (sqlite3_syscall
f2be0 5f 70 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 _ptr)rmdir,
f2bf0 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 64 65 66 0 },..#def
f2c00 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20 20 20 ine osRmdir
f2c10 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 ((int(*)(const c
f2c20 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 har*))aSyscall[1
f2c30 39 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 9].pCurrent)....
f2c40 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 }; /* End of the
f2c50 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 overrideable sy
f2c60 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0d 0a 0d stem calls */...
f2c70 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 ./*..** This is
f2c80 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 the xSetSystemCa
f2c90 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 ll() method of s
f2ca0 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 qlite3_vfs for a
f2cb0 6c 6c 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 22 75 ll of the..** "u
f2cc0 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 nix" VFSes. Ret
f2cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 urn SQLITE_OK op
f2ce0 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 on successfully
f2cf0 75 70 64 61 74 69 6e 67 20 74 68 65 0d 0a 2a 2a updating the..**
f2d00 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 system call poi
f2d10 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f nter, or SQLITE_
f2d20 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 NOTFOUND if ther
f2d30 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 e is no configur
f2d40 61 62 6c 65 0d 0a 2a 2a 20 73 79 73 74 65 6d 20 able..** system
f2d50 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 call named zName
f2d60 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
f2d70 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 t unixSetSystemC
f2d80 61 6c 6c 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f all(.. sqlite3_
f2d90 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 vfs *pNotUsed,
f2da0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 /* The VFS
f2db0 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 pointer. Not u
f2dc0 73 65 64 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 sed */.. const
f2dd0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 char *zName,
f2de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 /* Name
f2df0 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 of system call t
f2e00 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0d 0a 20 o override */..
f2e10 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c sqlite3_syscall
f2e20 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f _ptr pNewFunc /
f2e30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 * Pointer to new
f2e40 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c system call val
f2e50 75 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 6e 73 ue */..){.. uns
f2e60 69 67 6e 65 64 20 69 6e 74 20 69 3b 0d 0a 20 20 igned int i;..
f2e70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
f2e80 4e 4f 54 46 4f 55 4e 44 3b 0d 0a 0d 0a 20 20 55 NOTFOUND;.... U
f2e90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
f2ea0 70 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 69 66 pNotUsed);.. if
f2eb0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 ( zName==0 ){..
f2ec0 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d /* If no zNam
f2ed0 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 e is given, rest
f2ee0 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 ore all system c
f2ef0 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 alls to their de
f2f00 66 61 75 6c 74 0d 0a 20 20 20 20 2a 2a 20 73 65 fault.. ** se
f2f10 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 ttings and retur
f2f20 6e 20 4e 55 4c 4c 0d 0a 20 20 20 20 2a 2f 0d 0a n NULL.. */..
f2f30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
f2f40 4f 4b 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 OK;.. for(i=0
f2f50 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 ; i<sizeof(aSysc
f2f60 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 all)/sizeof(aSys
f2f70 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0d call[0]); i++){.
f2f80 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 . if( aSysc
f2f90 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 all[i].pDefault
f2fa0 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 53 79 73 ){.. aSys
f2fb0 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 call[i].pCurrent
f2fc0 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 = aSyscall[i].p
f2fd0 44 65 66 61 75 6c 74 3b 0d 0a 20 20 20 20 20 20 Default;..
f2fe0 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 }.. }.. }els
f2ff0 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e e{.. /* If zN
f3000 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 ame is specified
f3010 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c , operate on onl
f3020 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d y the one system
f3030 20 63 61 6c 6c 0d 0a 20 20 20 20 2a 2a 20 73 70 call.. ** sp
f3040 65 63 69 66 69 65 64 2e 0d 0a 20 20 20 20 2a 2f ecified... */
f3050 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 .. for(i=0; i
f3060 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c <sizeof(aSyscall
f3070 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c )/sizeof(aSyscal
f3080 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 l[0]); i++){..
f3090 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
f30a0 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 Name, aSyscall[i
f30b0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0d 0a ].zName)==0 ){..
f30c0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 if( aSys
f30d0 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 call[i].pDefault
f30e0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ==0 ){..
f30f0 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 aSyscall[i].pD
f3100 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c efault = aSyscal
f3110 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0d 0a l[i].pCurrent;..
f3120 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
f3130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
f3140 4b 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 K;.. if(
f3150 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e pNewFunc==0 ) pN
f3160 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c ewFunc = aSyscal
f3170 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0d 0a l[i].pDefault;..
f3180 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c aSyscall
f3190 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 [i].pCurrent = p
f31a0 4e 65 77 46 75 6e 63 3b 0d 0a 20 20 20 20 20 20 NewFunc;..
f31b0 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 break;..
f31c0 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 }.. }.. }..
f31d0 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
f31e0 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ../*..** Return
f31f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 the value of a s
f3200 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 ystem call. Ret
f3210 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d urn NULL if zNam
f3220 65 20 69 73 20 6e 6f 74 20 61 0d 0a 2a 2a 20 72 e is not a..** r
f3230 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d ecognized system
f3240 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c call name. NUL
f3250 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e L is also return
f3260 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d ed if the system
f3270 20 63 61 6c 6c 0d 0a 2a 2a 20 69 73 20 63 75 72 call..** is cur
f3280 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 rently undefined
f3290 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 71 ...*/..static sq
f32a0 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 lite3_syscall_pt
f32b0 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 r unixGetSystemC
f32c0 61 6c 6c 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f all(.. sqlite3_
f32d0 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0d 0a vfs *pNotUsed,..
f32e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
f32f0 61 6d 65 0d 0a 29 7b 0d 0a 20 20 75 6e 73 69 67 ame..){.. unsig
f3300 6e 65 64 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 ned int i;....
f3310 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
f3320 28 70 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 66 (pNotUsed);.. f
f3330 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 or(i=0; i<sizeof
f3340 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f (aSyscall)/sizeo
f3350 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 f(aSyscall[0]);
f3360 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 73 i++){.. if( s
f3370 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 trcmp(zName, aSy
f3380 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d scall[i].zName)=
f3390 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 =0 ) return aSys
f33a0 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 call[i].pCurrent
f33b0 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
f33c0 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 0;..}..../*..**
f33d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 Return the name
f33e0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 of the first sy
f33f0 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 stem call after
f3400 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 zName. If zName
f3410 3d 3d 4e 55 4c 4c 0d 0a 2a 2a 20 74 68 65 6e 20 ==NULL..** then
f3420 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 return the name
f3430 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 of the first sys
f3440 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 tem call. Retur
f3450 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0d n NULL if zName.
f3460 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 .** is the last
f3470 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 system call or i
f3480 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 f zName is not t
f3490 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c he name of a val
f34a0 69 64 0d 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 id..** system ca
f34b0 6c 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ll...*/..static
f34c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 const char *unix
f34d0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 NextSystemCall(s
f34e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 qlite3_vfs *p, c
f34f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
f3500 29 7b 0d 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 ){.. int i = -1
f3510 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 ;.... UNUSED_PA
f3520 52 41 4d 45 54 45 52 28 70 29 3b 0d 0a 20 20 69 RAMETER(p);.. i
f3530 66 28 20 7a 4e 61 6d 65 20 29 7b 0d 0a 20 20 20 f( zName ){..
f3540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 for(i=0; i<Arra
f3550 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d ySize(aSyscall)-
f3560 31 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 1; i++){..
f3570 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 if( strcmp(zName
f3580 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e , aSyscall[i].zN
f3590 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b ame)==0 ) break;
f35a0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 .. }.. }..
f35b0 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 for(i++; i<Array
f35c0 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 Size(aSyscall);
f35d0 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 61 i++){.. if( a
f35e0 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 Syscall[i].pCurr
f35f0 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 ent!=0 ) return
f3600 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d aSyscall[i].zNam
f3610 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 e;.. }.. retur
f3620 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a n 0;..}..../*..*
f3630 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63 * Retry open() c
f3640 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 alls that fail d
f3650 75 65 20 74 6f 20 45 49 4e 54 52 0d 0a 2a 2f 0d ue to EINTR..*/.
f3660 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 .static int robu
f3670 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 st_open(const ch
f3680 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e ar *z, int f, in
f3690 74 20 6d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b t m){.. int rc;
f36a0 0d 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f .. do{ rc = osO
f36b0 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 pen(z,f,m); }whi
f36c0 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e le( rc<0 && errn
f36d0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0d 0a 20 20 72 o==EINTR );.. r
f36e0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
f36f0 2f 2a 0d 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 /*..** Helper fu
f3700 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 nctions to obtai
f3710 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 n and relinquish
f3720 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 the global mute
f3730 78 2e 20 54 68 65 0d 0a 2a 2a 20 67 6c 6f 62 61 x. The..** globa
f3740 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 l mutex is used
f3750 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 to protect the u
f3760 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 nixInodeInfo and
f3770 0d 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 ..** vxworksFile
f3780 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 Id objects used
f3790 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c by this file, al
f37a0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 l of which may b
f37b0 65 20 0d 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 e ..** shared by
f37c0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 multiple thread
f37d0 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 75 6e 63 74 s...**..** Funct
f37e0 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c ion unixMutexHel
f37f0 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 d() is used to a
f3800 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 ssert() that the
f3810 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0d 0a global mutex ..
f3820 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 ** is held when
f3830 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 required. This f
f3840 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 unction is only
f3850 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 used as part of
f3860 61 73 73 65 72 74 28 29 20 0d 0a 2a 2a 20 73 74 assert() ..** st
f3870 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0d 0a atements. e.g...
f3880 2a 2a 0d 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 **..** unixEnt
f3890 65 72 4d 75 74 65 78 28 29 0d 0a 2a 2a 20 20 20 erMutex()..**
f38a0 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 assert( unixMu
f38b0 74 65 78 48 65 6c 64 28 29 20 29 3b 0d 0a 2a 2a texHeld() );..**
f38c0 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 unixEnterLeav
f38d0 65 28 29 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 e()..*/..static
f38e0 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 void unixEnterMu
f38f0 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 20 73 71 tex(void){.. sq
f3900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 lite3_mutex_ente
f3910 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c r(sqlite3MutexAl
f3920 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
f3930 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 _STATIC_MASTER))
f3940 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 76 6f 69 ;..}..static voi
f3950 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 d unixLeaveMutex
f3960 28 76 6f 69 64 29 7b 0d 0a 20 20 73 71 6c 69 74 (void){.. sqlit
f3970 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 e3_mutex_leave(s
f3980 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 qlite3MutexAlloc
f3990 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 (SQLITE_MUTEX_ST
f39a0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0d 0a ATIC_MASTER));..
f39b0 7d 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
f39c0 5f 44 45 42 55 47 0d 0a 73 74 61 74 69 63 20 69 _DEBUG..static i
f39d0 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 nt unixMutexHeld
f39e0 28 76 6f 69 64 29 20 7b 0d 0a 20 20 72 65 74 75 (void) {.. retu
f39f0 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 rn sqlite3_mutex
f3a00 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 _held(sqlite3Mut
f3a10 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d exAlloc(SQLITE_M
f3a20 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 UTEX_STATIC_MAST
f3a30 45 52 29 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 ER));..}..#endif
f3a40 0d 0a 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 ......#if define
f3a50 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 d(SQLITE_TEST) &
f3a60 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
f3a70 5f 44 45 42 55 47 29 0d 0a 2f 2a 0d 0a 2a 2a 20 _DEBUG)../*..**
f3a80 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 Helper function
f3a90 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 for printing out
f3aa0 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 trace informati
f3ab0 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e on from debuggin
f3ac0 67 0d 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 g..** binaries.
f3ad0 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 This returns the
f3ae0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 string represet
f3af0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 ation of the sup
f3b00 70 6c 69 65 64 0d 0a 2a 2a 20 69 6e 74 65 67 65 plied..** intege
f3b10 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0d 0a 2a 2f r lock-type...*/
f3b20 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
f3b30 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 har *azFileLock(
f3b40 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0d int eFileLock){.
f3b50 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 . switch( eFile
f3b60 4c 6f 63 6b 20 29 7b 0d 0a 20 20 20 20 63 61 73 Lock ){.. cas
f3b70 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 e NO_LOCK: retur
f3b80 6e 20 22 4e 4f 4e 45 22 3b 0d 0a 20 20 20 20 63 n "NONE";.. c
f3b90 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a ase SHARED_LOCK:
f3ba0 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 return "SHARED"
f3bb0 3b 0d 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 ;.. case RESE
f3bc0 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 RVED_LOCK: retur
f3bd0 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0d 0a 20 n "RESERVED";..
f3be0 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f case PENDING_
f3bf0 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 LOCK: return "PE
f3c00 4e 44 49 4e 47 22 3b 0d 0a 20 20 20 20 63 61 73 NDING";.. cas
f3c10 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b e EXCLUSIVE_LOCK
f3c20 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 : return "EXCLUS
f3c30 49 56 45 22 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 IVE";.. }.. re
f3c40 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0d 0a 7d turn "ERROR";..}
f3c50 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 64 ..#endif....#ifd
f3c60 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 ef SQLITE_LOCK_T
f3c70 52 41 43 45 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 69 RACE../*..** Pri
f3c80 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 nt out informati
f3c90 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 on about all loc
f3ca0 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e king operations.
f3cb0 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f ..**..** This ro
f3cc0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f utine is used fo
f3cd0 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e r troubleshootin
f3ce0 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 g locks on multi
f3cf0 74 68 72 65 61 64 65 64 0d 0a 2a 2a 20 70 6c 61 threaded..** pla
f3d00 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 tforms. Enable
f3d10 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 by compiling wit
f3d20 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c h the -DSQLITE_L
f3d30 4f 43 4b 5f 54 52 41 43 45 0d 0a 2a 2a 20 63 6f OCK_TRACE..** co
f3d40 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f mmand-line optio
f3d50 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 n on the compile
f3d60 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 r. This code is
f3d70 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 2a 2a 20 74 75 normally..** tu
f3d80 72 6e 65 64 20 6f 66 66 2e 0d 0a 2a 2f 0d 0a 73 rned off...*/..s
f3d90 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 tatic int lockTr
f3da0 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 ace(int fd, int
f3db0 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b op, struct flock
f3dc0 20 2a 70 29 7b 0d 0a 20 20 63 68 61 72 20 2a 7a *p){.. char *z
f3dd0 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0d OpName, *zType;.
f3de0 0a 20 20 69 6e 74 20 73 3b 0d 0a 20 20 69 6e 74 . int s;.. int
f3df0 20 73 61 76 65 64 45 72 72 6e 6f 3b 0d 0a 20 20 savedErrno;..
f3e00 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 if( op==F_GETLK
f3e10 29 7b 0d 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 ){.. zOpName
f3e20 3d 20 22 47 45 54 4c 4b 22 3b 0d 0a 20 20 7d 65 = "GETLK";.. }e
f3e30 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 lse if( op==F_SE
f3e40 54 4c 4b 20 29 7b 0d 0a 20 20 20 20 7a 4f 70 4e TLK ){.. zOpN
f3e50 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0d 0a ame = "SETLK";..
f3e60 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 20 }else{.. s
f3e70 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 = osFcntl(fd, op
f3e80 2c 20 70 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 , p);.. sqlit
f3e90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 e3DebugPrintf("f
f3ea0 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 cntl unknown %d
f3eb0 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 %d %d\n", fd, op
f3ec0 2c 20 73 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 , s);.. retur
f3ed0 6e 20 73 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 n s;.. }.. if(
f3ee0 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 p->l_type==F_RD
f3ef0 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 7a 54 79 70 LCK ){.. zTyp
f3f00 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0d 0a 20 20 e = "RDLCK";..
f3f10 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 }else if( p->l_t
f3f20 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0d ype==F_WRLCK ){.
f3f30 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 . zType = "WR
f3f40 4c 43 4b 22 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 LCK";.. }else i
f3f50 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f f( p->l_type==F_
f3f60 55 4e 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 7a 54 UNLCK ){.. zT
f3f70 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0d 0a ype = "UNLCK";..
f3f80 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 61 73 }else{.. as
f3f90 73 65 72 74 28 20 30 20 29 3b 0d 0a 20 20 7d 0d sert( 0 );.. }.
f3fa0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f . assert( p->l_
f3fb0 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 whence==SEEK_SET
f3fc0 20 29 3b 0d 0a 20 20 73 20 3d 20 6f 73 46 63 6e );.. s = osFcn
f3fd0 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0d 0a tl(fd, op, p);..
f3fe0 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 savedErrno = e
f3ff0 72 72 6e 6f 3b 0d 0a 20 20 73 71 6c 69 74 65 33 rrno;.. sqlite3
f4000 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e DebugPrintf("fcn
f4010 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 tl %d %d %s %s %
f4020 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0d 0a d %d %d %d\n",..
f4030 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 threadid, f
f4040 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 d, zOpName, zTyp
f4050 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 e, (int)p->l_sta
f4060 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 rt, (int)p->l_le
f4070 6e 2c 0d 0a 20 20 20 20 20 28 69 6e 74 29 70 2d n,.. (int)p-
f4080 3e 6c 5f 70 69 64 2c 20 73 29 3b 0d 0a 20 20 69 >l_pid, s);.. i
f4090 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 f( s==(-1) && op
f40a0 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d ==F_SETLK && (p-
f40b0 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b >l_type==F_RDLCK
f40c0 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 || p->l_type==F
f40d0 5f 57 52 4c 43 4b 29 20 29 7b 0d 0a 20 20 20 20 _WRLCK) ){..
f40e0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b struct flock l2;
f40f0 0d 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0d 0a .. l2 = *p;..
f4100 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 osFcntl(fd,
f4110 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0d 0a F_GETLK, &l2);..
f4120 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 if( l2.l_typ
f4130 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0d 0a 20 e==F_RDLCK ){..
f4140 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 zType = "RD
f4150 4c 43 4b 22 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 LCK";.. }else
f4160 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d if( l2.l_type==
f4170 46 5f 57 52 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 F_WRLCK ){..
f4180 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b zType = "WRLCK
f4190 22 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 ";.. }else if
f41a0 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 ( l2.l_type==F_U
f41b0 4e 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 20 20 7a NLCK ){.. z
f41c0 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0d Type = "UNLCK";.
f41d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
f41e0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0d assert( 0 );.
f41f0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 . }.. sqli
f4200 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 te3DebugPrintf("
f4210 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 fcntl-failure-re
f4220 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 ason: %s %d %d %
f4230 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 7a 54 d\n",.. zT
f4240 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 ype, (int)l2.l_s
f4250 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f tart, (int)l2.l_
f4260 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 len, (int)l2.l_p
f4270 69 64 29 3b 0d 0a 20 20 7d 0d 0a 20 20 65 72 72 id);.. }.. err
f4280 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b no = savedErrno;
f4290 0d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0d 0a 7d .. return s;..}
f42a0 0d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c ..#undef osFcntl
f42b0 0d 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 ..#define osFcnt
f42c0 6c 20 6c 6f 63 6b 54 72 61 63 65 0d 0a 23 65 6e l lockTrace..#en
f42d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f dif /* SQLITE_LO
f42e0 43 4b 5f 54 52 41 43 45 20 2a 2f 0d 0a 0d 0a 2f CK_TRACE */..../
f42f0 2a 0d 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 *..** Retry ftru
f4300 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 ncate() calls th
f4310 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 at fail due to E
f4320 49 4e 54 52 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 INTR..*/..static
f4330 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 int robust_ftru
f4340 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c ncate(int h, sql
f4350 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0d ite3_int64 sz){.
f4360 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 64 6f . int rc;.. do
f4370 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 { rc = osFtrunca
f4380 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 te(h,sz); }while
f4390 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d ( rc<0 && errno=
f43a0 3d 45 49 4e 54 52 20 29 3b 0d 0a 20 20 72 65 74 =EINTR );.. ret
f43b0 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
f43c0 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
f43d0 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 e translates a s
f43e0 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 tandard POSIX er
f43f0 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f rno code into so
f4400 6d 65 74 68 69 6e 67 0d 0a 2a 2a 20 75 73 65 66 mething..** usef
f4410 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 ul to the client
f4420 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 s of the sqlite3
f4430 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 functions. Spe
f4440 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 cifically, it is
f4450 0d 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f ..** intended to
f4460 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 translate a var
f4470 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 iety of "try aga
f4480 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 in" errors into
f4490 53 51 4c 49 54 45 5f 42 55 53 59 0d 0a 2a 2a 20 SQLITE_BUSY..**
f44a0 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 and a variety of
f44b0 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 "please close t
f44c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 he file descript
f44d0 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 or NOW" errors i
f44e0 6e 74 6f 20 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f nto ..** SQLITE_
f44f0 49 4f 45 52 52 0d 0a 2a 2a 20 0d 0a 2a 2a 20 45 IOERR..** ..** E
f4500 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 rrors during ini
f4510 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c tialization of l
f4520 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 ocks, or file sy
f4530 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 stem support for
f4540 20 6c 6f 63 6b 73 2c 0d 0a 2a 2a 20 73 68 6f 75 locks,..** shou
f4550 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b ld handle ENOLCK
f4560 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f , ENOTSUP, EOPNO
f4570 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 TSUPP separately
f4580 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
f4590 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f t sqliteErrorFro
f45a0 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 mPosixError(int
f45b0 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 posixError, int
f45c0 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0d 0a sqliteIOErr) {..
f45d0 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 switch (posixE
f45e0 72 72 6f 72 29 20 7b 0d 0a 23 69 66 20 30 0d 0a rror) {..#if 0..
f45f0 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e /* At one poin
f4600 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 t this code was
f4610 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 not commented ou
f4620 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 t. In theory, th
f4630 69 73 20 62 72 61 6e 63 68 0d 0a 20 20 2a 2a 20 is branch.. **
f4640 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 should never be
f4650 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e hit, as this fun
f4660 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c ction should onl
f4670 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 y be called afte
f4680 72 0d 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e r.. ** a lockin
f4690 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 g-related functi
f46a0 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 on (i.e. fcntl()
f46b0 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e ) has returned n
f46c0 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0d 0a 20 20 on-zero with..
f46d0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ** the value of
f46e0 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 errno as the fir
f46f0 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e st argument. Sin
f4700 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c ce a system call
f4710 20 68 61 73 20 66 61 69 6c 65 64 2c 0d 0a 20 20 has failed,..
f4720 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 ** errno should
f4730 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0d 0a 20 20 be non-zero...
f4740 2a 2a 0d 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 **.. ** Despite
f4750 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 this, if errno
f4760 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 really is zero,
f4770 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 we still don't w
f4780 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0d 0a 20 ant to return..
f4790 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 ** SQLITE_OK. T
f47a0 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 he system call f
f47b0 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 ailed, and *some
f47c0 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73 * SQLite error s
f47d0 68 6f 75 6c 64 20 62 65 0d 0a 20 20 2a 2a 20 70 hould be.. ** p
f47e0 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 ropagated back t
f47f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f o the caller. Co
f4800 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 mmenting this br
f4810 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 anch out means e
f4820 72 72 6e 6f 3d 3d 30 0d 0a 20 20 2a 2a 20 77 69 rrno==0.. ** wi
f4830 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 ll be handled by
f4840 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 the "default:"
f4850 63 61 73 65 20 62 65 6c 6f 77 2e 0d 0a 20 20 2a case below... *
f4860 2f 0d 0a 20 20 63 61 73 65 20 30 3a 20 0d 0a 20 /.. case 0: ..
f4870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
f4880 5f 4f 4b 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a _OK;..#endif....
f4890 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0d 0a case EAGAIN:..
f48a0 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 case ETIMEDOUT
f48b0 3a 0d 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a :.. case EBUSY:
f48c0 0d 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0d .. case EINTR:.
f48d0 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 . case ENOLCK:
f48e0 20 0d 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d .. /* random
f48f0 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 NFS retry error
f4900 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 , unless during
f4910 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 file system supp
f4920 6f 72 74 20 0d 0a 20 20 20 20 20 2a 20 69 6e 74 ort .. * int
f4930 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 rospection, in w
f4940 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 hich it actually
f4950 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 means what it s
f4960 61 79 73 20 2a 2f 0d 0a 20 20 20 20 72 65 74 75 ays */.. retu
f4970 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d rn SQLITE_BUSY;.
f4980 0a 20 20 20 20 0d 0a 20 20 63 61 73 65 20 45 41 . .. case EA
f4990 43 43 45 53 3a 20 0d 0a 20 20 20 20 2f 2a 20 45 CCES: .. /* E
f49a0 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 ACCES is like EA
f49b0 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b GAIN during lock
f49c0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 ing operations,
f49d0 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 but not any othe
f49e0 72 20 74 69 6d 65 2a 2f 0d 0a 20 20 20 20 69 66 r time*/.. if
f49f0 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d ( (sqliteIOErr =
f4a00 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c = SQLITE_IOERR_L
f4a10 4f 43 4b 29 20 7c 7c 20 0d 0a 09 28 73 71 6c 69 OCK) || ...(sqli
f4a20 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 teIOErr == SQLIT
f4a30 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 E_IOERR_UNLOCK)
f4a40 7c 7c 20 0d 0a 09 28 73 71 6c 69 74 65 49 4f 45 || ...(sqliteIOE
f4a50 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 rr == SQLITE_IOE
f4a60 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0d 0a 09 RR_RDLOCK) ||...
f4a70 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 (sqliteIOErr ==
f4a80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 SQLITE_IOERR_CHE
f4a90 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 CKRESERVEDLOCK)
f4aa0 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
f4ab0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
f4ac0 20 20 20 7d 0d 0a 20 20 20 20 2f 2a 20 65 6c 73 }.. /* els
f4ad0 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a e fall through *
f4ae0 2f 0d 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a /.. case EPERM:
f4af0 20 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 .. return SQ
f4b00 4c 49 54 45 5f 50 45 52 4d 3b 0d 0a 20 20 20 20 LITE_PERM;..
f4b10 0d 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 .. /* EDEADLK i
f4b20 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 s only possible
f4b30 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e if a call to fcn
f4b40 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 tl(F_SETLKW) is
f4b50 6d 61 64 65 2e 20 41 6e 64 0d 0a 20 20 2a 2a 20 made. And.. **
f4b60 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 this module neve
f4b70 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 r makes such a c
f4b80 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 all. And the cod
f4b90 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 e in SQLite itse
f4ba0 6c 66 20 0d 0a 20 20 2a 2a 20 61 73 73 65 72 74 lf .. ** assert
f4bb0 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f s that SQLITE_IO
f4bc0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e ERR_BLOCKED is n
f4bd0 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 ever returned. F
f4be0 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 or these reasons
f4bf0 0d 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 .. ** this case
f4c00 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 is also comment
f4c10 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73 ed out. If the s
f4c20 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65 ystem does set e
f4c30 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c rrno to EDEADLK,
f4c40 0d 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 .. ** the defau
f4c50 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f lt SQLITE_IOERR_
f4c60 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 XXX code will be
f4c70 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0d 0a 23 returned. */..#
f4c80 69 66 20 30 0d 0a 20 20 63 61 73 65 20 45 44 45 if 0.. case EDE
f4c90 41 44 4c 4b 3a 0d 0a 20 20 20 20 72 65 74 75 72 ADLK:.. retur
f4ca0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 n SQLITE_IOERR_B
f4cb0 4c 4f 43 4b 45 44 3b 0d 0a 23 65 6e 64 69 66 0d LOCKED;..#endif.
f4cc0 0a 20 20 20 20 0d 0a 23 69 66 20 45 4f 50 4e 4f . ..#if EOPNO
f4cd0 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0d 0a TSUPP!=ENOTSUP..
f4ce0 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 case EOPNOTSUP
f4cf0 50 3a 20 0d 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 P: .. /* some
f4d00 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 thing went terri
f4d10 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 bly awry, unless
f4d20 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 during file sys
f4d30 74 65 6d 20 73 75 70 70 6f 72 74 20 0d 0a 20 20 tem support ..
f4d40 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 * introspecti
f4d50 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 on, in which it
f4d60 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 actually means w
f4d70 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0d 0a hat it says */..
f4d80 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 45 #endif..#ifdef E
f4d90 4e 4f 54 53 55 50 0d 0a 20 20 63 61 73 65 20 45 NOTSUP.. case E
f4da0 4e 4f 54 53 55 50 3a 20 0d 0a 20 20 20 20 2f 2a NOTSUP: .. /*
f4db0 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c invalid fd, unl
f4dc0 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 ess during file
f4dd0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 system support i
f4de0 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e ntrospection, in
f4df0 20 77 68 69 63 68 20 0d 0a 20 20 20 20 20 2a 20 which .. *
f4e00 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e it actually mean
f4e10 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a s what it says *
f4e20 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 63 61 73 /..#endif.. cas
f4e30 65 20 45 49 4f 3a 0d 0a 20 20 63 61 73 65 20 45 e EIO:.. case E
f4e40 42 41 44 46 3a 0d 0a 20 20 63 61 73 65 20 45 49 BADF:.. case EI
f4e50 4e 56 41 4c 3a 0d 0a 20 20 63 61 73 65 20 45 4e NVAL:.. case EN
f4e60 4f 54 43 4f 4e 4e 3a 0d 0a 20 20 63 61 73 65 20 OTCONN:.. case
f4e70 45 4e 4f 44 45 56 3a 0d 0a 20 20 63 61 73 65 20 ENODEV:.. case
f4e80 45 4e 58 49 4f 3a 0d 0a 20 20 63 61 73 65 20 45 ENXIO:.. case E
f4e90 4e 4f 45 4e 54 3a 0d 0a 23 69 66 64 65 66 20 45 NOENT:..#ifdef E
f4ea0 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 STALE
f4eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 /* EST
f4ec0 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e ALE is not defin
f4ed0 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 ed on Interix sy
f4ee0 73 74 65 6d 73 20 2a 2f 0d 0a 20 20 63 61 73 65 stems */.. case
f4ef0 20 45 53 54 41 4c 45 3a 0d 0a 23 65 6e 64 69 66 ESTALE:..#endif
f4f00 0d 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a .. case ENOSYS:
f4f10 0d 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 .. /* these s
f4f20 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 hould force the
f4f30 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 client to close
f4f40 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 the file and rec
f4f50 6f 6e 6e 65 63 74 20 2a 2f 0d 0a 20 20 20 20 0d onnect */.. .
f4f60 0a 20 20 64 65 66 61 75 6c 74 3a 20 0d 0a 20 20 . default: ..
f4f70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 return sqliteI
f4f80 4f 45 72 72 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d OErr;.. }..}...
f4f90 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...../**********
f4fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f4fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f4fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f4fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f4fe0 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****..**********
f4ff0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 ******** Begin U
f5000 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 nique File ID Ut
f5010 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 ility Used By Vx
f5020 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a Works **********
f5030 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6e *****..**..** On
f5040 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f most versions o
f5050 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 f unix, we can g
f5060 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 et a unique ID f
f5070 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e or a file by con
f5080 63 61 74 65 6e 61 74 69 6e 67 0d 0a 2a 2a 20 74 catenating..** t
f5090 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 he device number
f50a0 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e and the inode n
f50b0 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 umber. But this
f50c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f does not work o
f50d0 6e 20 56 78 57 6f 72 6b 73 2e 0d 0a 2a 2a 20 4f n VxWorks...** O
f50e0 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 n VxWorks, a uni
f50f0 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 que file id must
f5100 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 be based on the
f5110 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e canonical filen
f5120 61 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 70 ame...**..** A p
f5130 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 ointer to an ins
f5140 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c tance of the fol
f5150 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 lowing structure
f5160 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 can be used as
f5170 61 0d 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c a..** unique fil
f5180 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e e ID in VxWorks.
f5190 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 Each instance
f51a0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 of this structur
f51b0 65 20 63 6f 6e 74 61 69 6e 73 0d 0a 2a 2a 20 61 e contains..** a
f51c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e copy of the can
f51d0 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e onical filename.
f51e0 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 There is also
f51f0 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e a reference coun
f5200 74 2e 20 20 0d 0a 2a 2a 20 54 68 65 20 73 74 72 t. ..** The str
f5210 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 ucture is reclai
f5220 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d med when the num
f5230 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 ber of pointers
f5240 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0d 0a to it drops to..
f5250 2a 2a 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a ** zero...**..**
f5260 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 There are never
f5270 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 very many files
f5280 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d open at one tim
f5290 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 e and lookups ar
f52a0 65 20 6e 6f 74 0d 0a 2a 2a 20 61 20 70 65 72 66 e not..** a perf
f52b0 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c ormance-critical
f52c0 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 path, so it is
f52d0 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 sufficient to pu
f52e0 74 20 74 68 65 73 65 0d 0a 2a 2a 20 73 74 72 75 t these..** stru
f52f0 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b ctures on a link
f5300 65 64 20 6c 69 73 74 2e 0d 0a 2a 2f 0d 0a 73 74 ed list...*/..st
f5310 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 ruct vxworksFile
f5320 49 64 20 7b 0d 0a 20 20 73 74 72 75 63 74 20 76 Id {.. struct v
f5330 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e xworksFileId *pN
f5340 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e ext; /* Next in
f5350 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 a list of them
f5360 61 6c 6c 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 52 all */.. int nR
f5370 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ef;
f5380 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
f5390 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 r of references
f53a0 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0d 0a to this one */..
f53b0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 int nName;
f53c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f53d0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 /* Length of the
f53e0 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b zCanonicalName[
f53f0 5d 20 73 74 72 69 6e 67 20 2a 2f 0d 0a 20 20 63 ] string */.. c
f5400 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e har *zCanonicalN
f5410 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 ame; /*
f5420 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 Canonical filena
f5430 6d 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23 69 66 me */..};....#if
f5440 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 2f 2a 20 OS_VXWORKS../*
f5450 0d 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 ..** All unique
f5460 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 filenames are he
f5470 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c ld on a linked l
f5480 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68 ist headed by th
f5490 69 73 0d 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a is..** variable:
f54a0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 74 72 ..*/..static str
f54b0 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 uct vxworksFileI
f54c0 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 d *vxworksFileLi
f54d0 73 74 20 3d 20 30 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a st = 0;..../*..*
f54e0 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c * Simplify a fil
f54f0 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 ename into its c
f5500 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0d 0a 2a anonical form..*
f5510 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 * by making the
f5520 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 following change
f5530 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 2a 20 72 65 s:..**..** * re
f5540 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c moving any trail
f5550 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 ing and duplicat
f5560 65 20 2f 0d 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 e /..** * conve
f5570 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 rt /./ into just
f5580 20 2f 0d 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 /..** * conver
f5590 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 t /A/../ where A
f55a0 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e is any simple n
f55b0 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0d ame into just /.
f55c0 0a 2a 2a 0d 0a 2a 2a 20 43 68 61 6e 67 65 73 20 .**..** Changes
f55d0 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 are made in-plac
f55e0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e e. Return the n
f55f0 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0d ew name length..
f5600 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f 72 69 67 .**..** The orig
f5610 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 inal filename is
f5620 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 in z[0..n-1].
f5630 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 Return the numbe
f5640 72 20 6f 66 0d 0a 2a 2a 20 63 68 61 72 61 63 74 r of..** charact
f5650 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c ers in the simpl
f5660 69 66 69 65 64 20 6e 61 6d 65 2e 0d 0a 2a 2f 0d ified name...*/.
f5670 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f .static int vxwo
f5680 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 rksSimplifyName(
f5690 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b char *z, int n){
f56a0 0d 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0d 0a 20 .. int i, j;..
f56b0 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a while( n>1 && z
f56c0 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d [n-1]=='/' ){ n-
f56d0 2d 3b 20 7d 0d 0a 20 20 66 6f 72 28 69 3d 6a 3d -; }.. for(i=j=
f56e0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0d 0a 20 0; i<n; i++){..
f56f0 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 if( z[i]=='/'
f5700 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 7a ){.. if( z
f5710 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e [i+1]=='/' ) con
f5720 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 69 66 tinue;.. if
f5730 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 ( z[i+1]=='.' &&
f5740 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d i+2<n && z[i+2]
f5750 3d 3d 27 2f 27 20 29 7b 0d 0a 20 20 20 20 20 20 =='/' ){..
f5760 20 20 69 20 2b 3d 20 31 3b 0d 0a 20 20 20 20 20 i += 1;..
f5770 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 continue;..
f5780 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 }.. if(
f5790 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 z[i+1]=='.' &&
f57a0 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d i+3<n && z[i+2]=
f57b0 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d ='.' && z[i+3]==
f57c0 27 2f 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 '/' ){..
f57d0 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b while( j>0 && z[
f57e0 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d j-1]!='/' ){ j--
f57f0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 ; }.. if(
f5800 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0d 0a j>0 ){ j--; }..
f5810 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0d i += 2;.
f5820 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 . continu
f5830 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 e;.. }..
f5840 20 7d 0d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d }.. z[j++] =
f5850 20 7a 5b 69 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 7a z[i];.. }.. z
f5860 5b 6a 5d 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 [j] = 0;.. retu
f5870 72 6e 20 6a 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a rn j;..}..../*..
f5880 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 ** Find a unique
f5890 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 file ID for the
f58a0 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 given absolute
f58b0 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 pathname. Retur
f58c0 6e 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 n..** a pointer
f58d0 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 to the vxworksFi
f58e0 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 leId object. Th
f58f0 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 is pointer is th
f5900 65 20 75 6e 69 71 75 65 0d 0a 2a 2a 20 66 69 6c e unique..** fil
f5910 65 20 49 44 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 e ID...**..** Th
f5920 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 e nRef field of
f5930 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 the vxworksFileI
f5940 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 d object is incr
f5950 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0d 0a emented before..
f5960 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 ** the object is
f5970 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 returned. A ne
f5980 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 w vxworksFileId
f5990 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 object is create
f59a0 64 0d 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 d..** and added
f59b0 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 to the global li
f59c0 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e st if necessary.
f59d0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 6d 65 ..**..** If a me
f59e0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
f59f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 error occurs, re
f5a00 74 75 72 6e 20 4e 55 4c 4c 2e 0d 0a 2a 2f 0d 0a turn NULL...*/..
f5a10 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 static struct vx
f5a20 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 worksFileId *vxw
f5a30 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 orksFindFileId(c
f5a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f onst char *zAbso
f5a50 6c 75 74 65 4e 61 6d 65 29 7b 0d 0a 20 20 73 74 luteName){.. st
f5a60 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 ruct vxworksFile
f5a70 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 Id *pNew;
f5a80 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 /* search key
f5a90 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 and new file ID
f5aa0 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 76 78 77 */.. struct vxw
f5ab0 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e orksFileId *pCan
f5ac0 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 didate; /* For
f5ad0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 looping over ex
f5ae0 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 isting file IDs
f5af0 2a 2f 0d 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 */.. int n;
f5b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f5b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e /* Len
f5b20 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 gth of zAbsolute
f5b30 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0d 0a Name string */..
f5b40 0d 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 .. assert( zAbs
f5b50 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f oluteName[0]=='/
f5b60 27 20 29 3b 0d 0a 20 20 6e 20 3d 20 28 69 6e 74 ' );.. n = (int
f5b70 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 )strlen(zAbsolut
f5b80 65 4e 61 6d 65 29 3b 0d 0a 20 20 70 4e 65 77 20 eName);.. pNew
f5b90 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 = sqlite3_malloc
f5ba0 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 ( sizeof(*pNew)
f5bb0 2b 20 28 6e 2b 31 29 20 29 3b 0d 0a 20 20 69 66 + (n+1) );.. if
f5bc0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 ( pNew==0 ) retu
f5bd0 72 6e 20 30 3b 0d 0a 20 20 70 4e 65 77 2d 3e 7a rn 0;.. pNew->z
f5be0 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 CanonicalName =
f5bf0 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b (char*)&pNew[1];
f5c00 0d 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d .. memcpy(pNew-
f5c10 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c >zCanonicalName,
f5c20 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 zAbsoluteName,
f5c30 6e 2b 31 29 3b 0d 0a 20 20 6e 20 3d 20 76 78 77 n+1);.. n = vxw
f5c40 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 orksSimplifyName
f5c50 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 (pNew->zCanonica
f5c60 6c 4e 61 6d 65 2c 20 6e 29 3b 0d 0a 0d 0a 20 20 lName, n);....
f5c70 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e /* Search for an
f5c80 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 existing entry
f5c90 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 that matching th
f5ca0 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 e canonical name
f5cb0 2e 0d 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 ... ** If found
f5cc0 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 , increment the
f5cd0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
f5ce0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 and return a poi
f5cf0 6e 74 65 72 20 74 6f 0d 0a 20 20 2a 2a 20 74 68 nter to.. ** th
f5d00 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 e existing file
f5d10 49 44 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 75 6e 69 ID... */.. uni
f5d20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a xEnterMutex();..
f5d30 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 for(pCandidate
f5d40 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 =vxworksFileList
f5d50 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 ; pCandidate; pC
f5d60 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 andidate=pCandid
f5d70 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 ate->pNext){..
f5d80 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 if( pCandidate
f5d90 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0d 0a 20 20 20 ->nName==n ..
f5da0 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e && memcmp(pCan
f5db0 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 didate->zCanonic
f5dc0 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 alName, pNew->zC
f5dd0 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 anonicalName, n)
f5de0 3d 3d 30 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 20 ==0.. ){..
f5df0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
f5e00 28 70 4e 65 77 29 3b 0d 0a 20 20 20 20 20 20 20 (pNew);..
f5e10 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 pCandidate->nRef
f5e20 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 75 6e 69 78 ++;.. unix
f5e30 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 20 LeaveMutex();..
f5e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 return pCa
f5e50 6e 64 69 64 61 74 65 3b 0d 0a 20 20 20 20 7d 0d ndidate;.. }.
f5e60 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4e 6f 20 . }.... /* No
f5e70 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e match was found.
f5e80 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 We will make a
f5e90 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0d new file ID */.
f5ea0 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 . pNew->nRef =
f5eb0 31 3b 0d 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 1;.. pNew->nNam
f5ec0 65 20 3d 20 6e 3b 0d 0a 20 20 70 4e 65 77 2d 3e e = n;.. pNew->
f5ed0 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 pNext = vxworksF
f5ee0 69 6c 65 4c 69 73 74 3b 0d 0a 20 20 76 78 77 6f ileList;.. vxwo
f5ef0 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e rksFileList = pN
f5f00 65 77 3b 0d 0a 20 20 75 6e 69 78 4c 65 61 76 65 ew;.. unixLeave
f5f10 4d 75 74 65 78 28 29 3b 0d 0a 20 20 72 65 74 75 Mutex();.. retu
f5f20 72 6e 20 70 4e 65 77 3b 0d 0a 7d 0d 0a 0d 0a 2f rn pNew;..}..../
f5f30 2a 0d 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 *..** Decrement
f5f40 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f the reference co
f5f50 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 unt on a vxworks
f5f60 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 FileId object.
f5f70 46 72 65 65 0d 0a 2a 2a 20 74 68 65 20 6f 62 6a Free..** the obj
f5f80 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 ect when the ref
f5f90 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 erence count rea
f5fa0 63 68 65 73 20 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a ches zero...*/..
f5fb0 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f static void vxwo
f5fc0 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 rksReleaseFileId
f5fd0 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 (struct vxworksF
f5fe0 69 6c 65 49 64 20 2a 70 49 64 29 7b 0d 0a 20 20 ileId *pId){..
f5ff0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 unixEnterMutex()
f6000 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 ;.. assert( pId
f6010 2d 3e 6e 52 65 66 3e 30 20 29 3b 0d 0a 20 20 70 ->nRef>0 );.. p
f6020 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a 20 20 69 Id->nRef--;.. i
f6030 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 f( pId->nRef==0
f6040 29 7b 0d 0a 20 20 20 20 73 74 72 75 63 74 20 76 ){.. struct v
f6050 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 xworksFileId **p
f6060 70 3b 0d 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 p;.. for(pp=&
f6070 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b vxworksFileList;
f6080 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 *pp && *pp!=pId
f6090 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e ; pp = &((*pp)->
f60a0 70 4e 65 78 74 29 29 7b 7d 0d 0a 20 20 20 20 61 pNext)){}.. a
f60b0 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 ssert( *pp==pId
f60c0 29 3b 0d 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 );.. *pp = pI
f60d0 64 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 73 d->pNext;.. s
f60e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 qlite3_free(pId)
f60f0 3b 0d 0a 20 20 7d 0d 0a 20 20 75 6e 69 78 4c 65 ;.. }.. unixLe
f6100 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 7d 0d 0a aveMutex();..}..
f6110 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 #endif /* OS_VXW
f6120 4f 52 4b 53 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ORKS */../******
f6130 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 ********* End of
f6140 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 Unique File ID
f6150 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 Utility Used By
f6160 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a VxWorks ********
f6170 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a ********..******
f6180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f6190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f61a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f61b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f61c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f ********/....../
f61d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f61e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f61f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f6200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f6210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a **************..
f6220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
f6230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 *********** Posi
f6240 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 x Advisory Locki
f6250 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ng *************
f6260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
f6270 0a 2a 2a 0d 0a 2a 2a 20 50 4f 53 49 58 20 61 64 .**..** POSIX ad
f6280 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 visory locks are
f6290 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 broken by desig
f62a0 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 n. ANSI STD 100
f62b0 33 2e 31 20 28 31 39 39 36 29 0d 0a 2a 2a 20 73 3.1 (1996)..** s
f62c0 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c ection 6.5.2.2 l
f62d0 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 ines 483 through
f62e0 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 490 specify tha
f62f0 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 t when a process
f6300 0d 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 ..** sets or cle
f6310 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 ars a lock, that
f6320 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 operation overr
f6330 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c ides any prior l
f6340 6f 63 6b 73 20 73 65 74 0d 0a 2a 2a 20 62 79 20 ocks set..** by
f6350 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 the same process
f6360 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 . It does not e
f6370 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f xplicitly say so
f6380 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 , but this impli
f6390 65 73 0d 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f es..** that it o
f63a0 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 verrides locks s
f63b0 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 et by the same p
f63c0 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 rocess using a d
f63d0 69 66 66 65 72 65 6e 74 0d 0a 2a 2a 20 66 69 6c ifferent..** fil
f63e0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 e descriptor. C
f63f0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 onsider this tes
f6400 74 20 63 61 73 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 t case:..**..**
f6410 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 int fd1 =
f6420 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 open("./file1",
f6430 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 O_RDWR|O_CREAT,
f6440 30 36 34 34 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 0644);..**
f6450 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 int fd2 = open(
f6460 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 "./file2", O_RDW
f6470 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 R|O_CREAT, 0644)
f6480 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 53 75 70 70 6f 73 ;..**..** Suppos
f6490 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f e ./file1 and ./
f64a0 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 file2 are really
f64b0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 the same file (
f64c0 62 65 63 61 75 73 65 0d 0a 2a 2a 20 6f 6e 65 20 because..** one
f64d0 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d is a hard or sym
f64e0 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 bolic link to th
f64f0 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 e other) then if
f6500 20 79 6f 75 20 73 65 74 0d 0a 2a 2a 20 61 6e 20 you set..** an
f6510 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f exclusive lock o
f6520 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 n fd1, then try
f6530 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 to get an exclus
f6540 69 76 65 20 6c 6f 63 6b 0d 0a 2a 2a 20 6f 6e 20 ive lock..** on
f6550 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 fd2, it works.
f6560 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 I would have exp
f6570 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 ected the second
f6580 20 6c 6f 63 6b 20 74 6f 0d 0a 2a 2a 20 66 61 69 lock to..** fai
f6590 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 l since there wa
f65a0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b s already a lock
f65b0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 on the file due
f65c0 20 74 6f 20 66 64 31 2e 0d 0a 2a 2a 20 42 75 74 to fd1...** But
f65d0 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 not so. Since
f65e0 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 both locks came
f65f0 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 from the same pr
f6600 6f 63 65 73 73 2c 20 74 68 65 0d 0a 2a 2a 20 73 ocess, the..** s
f6610 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 econd overrides
f6620 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 the first, even
f6630 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 though they were
f6640 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0d 0a 2a on different..*
f6650 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f * file descripto
f6660 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 rs opened on dif
f6670 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 ferent file name
f6680 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 s...**..** This
f6690 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 means that we ca
f66a0 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c nnot use POSIX l
f66b0 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e ocks to synchron
f66c0 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0d ize file access.
f66d0 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 .** among compet
f66e0 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 ing threads of t
f66f0 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e he same process.
f6700 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 POSIX locks wi
f6710 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0d 0a 2a 2a ll work fine..**
f6720 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 to synchronize
f6730 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 access for threa
f6740 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 ds in separate p
f6750 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f rocesses, but no
f6760 74 0d 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 t..** threads wi
f6770 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 thin the same pr
f6780 6f 63 65 73 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ocess...**..** T
f6790 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 o work around th
f67a0 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 e problem, SQLit
f67b0 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 e has to manage
f67c0 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 file locks inter
f67d0 6e 61 6c 6c 79 0d 0a 2a 2a 20 6f 6e 20 69 74 73 nally..** on its
f67e0 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 own. Whenever
f67f0 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 a new database i
f6800 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 s opened, we hav
f6810 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0d 0a 2a e to find the..*
f6820 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 * specific inode
f6830 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
f6840 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 file (the inode
f6850 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 is determined b
f6860 79 20 74 68 65 0d 0a 2a 2a 20 73 74 5f 64 65 76 y the..** st_dev
f6870 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c and st_ino fiel
f6880 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 ds of the stat s
f6890 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 tructure that fs
f68a0 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0d tat() fills in).
f68b0 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f .** and check fo
f68c0 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 r locks already
f68d0 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 existing on that
f68e0 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f inode. When lo
f68f0 63 6b 73 20 61 72 65 0d 0a 2a 2a 20 63 72 65 61 cks are..** crea
f6900 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 ted or removed,
f6910 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 we have to look
f6920 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 at our own inter
f6930 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 nal record of th
f6940 65 0d 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 e..** locks to s
f6950 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 ee if another th
f6960 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 read has previou
f6970 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f sly set a lock o
f6980 6e 20 74 68 61 74 20 73 61 6d 65 0d 0a 2a 2a 20 n that same..**
f6990 69 6e 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 28 inode...**..** (
f69a0 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f Aside: The use o
f69b0 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 f inode numbers
f69c0 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f as unique IDs do
f69d0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 es not work on V
f69e0 78 57 6f 72 6b 73 2e 0d 0a 2a 2a 20 46 6f 72 20 xWorks...** For
f69f0 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 VxWorks, we have
f6a00 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 to use the alte
f6a10 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 rnative unique I
f6a20 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f D system based o
f6a30 6e 0d 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 n..** canonical
f6a40 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 filename and imp
f6a50 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 lemented in the
f6a60 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f previous divisio
f6a70 6e 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 n.)..**..** The
f6a80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 sqlite3_file str
f6a90 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 ucture for POSIX
f6aa0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 is no longer ju
f6ab0 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 st an integer fi
f6ac0 6c 65 0d 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f le..** descripto
f6ad0 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 r. It is now a
f6ae0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 structure that h
f6af0 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 olds the integer
f6b00 20 66 69 6c 65 0d 0a 2a 2a 20 64 65 73 63 72 69 file..** descri
f6b10 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 ptor and a point
f6b20 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 er to a structur
f6b30 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 e that describes
f6b40 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0d 0a 2a the internal..*
f6b50 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 * locks on the c
f6b60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f orresponding ino
f6b70 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e de. There is on
f6b80 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 e locking struct
f6b90 75 72 65 0d 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 ure..** per inod
f6ba0 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d e, so if the sam
f6bb0 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 e inode is opene
f6bc0 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e d twice, both un
f6bd0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 ixFile structure
f6be0 73 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 s..** point to t
f6bf0 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 he same locking
f6c00 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 structure. The
f6c10 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 locking structur
f6c20 65 20 6b 65 65 70 73 0d 0a 2a 2a 20 61 20 72 65 e keeps..** a re
f6c30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 ference count (s
f6c40 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 o we will know w
f6c50 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 hen to delete it
f6c60 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0d 0a 2a ) and a "cnt"..*
f6c70 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c * field that tel
f6c80 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e ls us its intern
f6c90 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 al lock status.
f6ca0 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 cnt==0 means th
f6cb0 65 0d 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e e..** file is un
f6cc0 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 locked. cnt==-1
f6cd0 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 means the file
f6ce0 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 has an exclusive
f6cf0 20 6c 6f 63 6b 2e 0d 0a 2a 2a 20 63 6e 74 3e 30 lock...** cnt>0
f6d00 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 means there are
f6d10 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b cnt shared lock
f6d20 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0d 0a s on the file...
f6d30 2a 2a 0d 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d **..** Any attem
f6d40 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e pt to lock or un
f6d50 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 lock a file firs
f6d60 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 t checks the loc
f6d70 6b 69 6e 67 0d 0a 2a 2a 20 73 74 72 75 63 74 75 king..** structu
f6d80 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 re. The fcntl()
f6d90 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 system call is
f6da0 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 only invoked to
f6db0 73 65 74 20 61 20 0d 0a 2a 2a 20 50 4f 53 49 58 set a ..** POSIX
f6dc0 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 lock if the int
f6dd0 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 ernal lock struc
f6de0 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 ture transitions
f6df0 20 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 61 20 6c between..** a l
f6e00 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c ocked and an unl
f6e10 6f 63 6b 65 64 20 73 74 61 74 65 2e 0d 0a 2a 2a ocked state...**
f6e20 0d 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 ..** But wait:
f6e30 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f there are yet mo
f6e40 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 re problems with
f6e50 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 POSIX advisory
f6e60 6c 6f 63 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 locks...**..** I
f6e70 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 f you close a fi
f6e80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 le descriptor th
f6e90 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 at points to a f
f6ea0 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 ile that has loc
f6eb0 6b 73 2c 0d 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b ks,..** all lock
f6ec0 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 s on that file t
f6ed0 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 hat are owned by
f6ee0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f the current pro
f6ef0 63 65 73 73 20 61 72 65 0d 0a 2a 2a 20 72 65 6c cess are..** rel
f6f00 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 eased. To work
f6f10 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 around this prob
f6f20 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e lem, each unixIn
f6f30 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0d 0a odeInfo object..
f6f40 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 ** maintains a c
f6f50 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 ount of the numb
f6f60 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f er of pending lo
f6f70 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 cks on tha inode
f6f80 2e 0d 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 ...** When an at
f6f90 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f tempt is made to
f6fa0 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 close an unixFi
f6fb0 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 le, if there are
f6fc0 0d 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 ..** other unixF
f6fd0 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 ile open on the
f6fe0 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 same inode that
f6ff0 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b are holding lock
f7000 73 2c 20 74 68 65 20 63 61 6c 6c 0d 0a 2a 2a 20 s, the call..**
f7010 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 to close() the f
f7020 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 ile descriptor i
f7030 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c s deferred until
f7040 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b all of the lock
f7050 73 20 63 6c 65 61 72 2e 0d 0a 2a 2a 20 54 68 65 s clear...** The
f7060 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 unixInodeInfo s
f7070 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 tructure keeps a
f7080 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 list of file de
f7090 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e scriptors that n
f70a0 65 65 64 20 74 6f 0d 0a 2a 2a 20 62 65 20 63 6c eed to..** be cl
f70b0 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 osed and that li
f70c0 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e st is walked (an
f70d0 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 d cleared) when
f70e0 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0d 0a 2a the last lock..*
f70f0 2a 20 63 6c 65 61 72 73 2e 0d 0a 2a 2a 0d 0a 2a * clears...**..*
f7100 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 * Yet another pr
f7110 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 oblem: LinuxThr
f7120 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 eads do not play
f7130 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 well with posix
f7140 20 6c 6f 63 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 locks...**..**
f7150 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 Many older versi
f7160 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 ons of linux use
f7170 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 the LinuxThread
f7180 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 s library which
f7190 69 73 0d 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 is..** not posix
f71a0 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 compliant. Und
f71b0 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c er LinuxThreads,
f71c0 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 a lock created
f71d0 62 79 20 74 68 72 65 61 64 0d 0a 2a 2a 20 41 20 by thread..** A
f71e0 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 cannot be modifi
f71f0 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e ed or overridden
f7200 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 by a different
f7210 74 68 72 65 61 64 20 42 2e 0d 0a 2a 2a 20 4f 6e thread B...** On
f7220 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 ly thread A can
f7230 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e modify the lock.
f7240 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 Locking behavi
f7250 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0d 0a 2a or is correct..*
f7260 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 * if the appliat
f7270 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 ion uses the new
f7280 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 er Native Posix
f7290 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 Thread Library (
f72a0 4e 50 54 4c 29 0d 0a 2a 2a 20 6f 6e 20 6c 69 6e NPTL)..** on lin
f72b0 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 ux - with NPTL a
f72c0 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 lock created by
f72d0 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 thread A can ov
f72e0 65 72 72 69 64 65 20 6c 6f 63 6b 73 0d 0a 2a 2a erride locks..**
f72f0 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 in thread B. B
f7300 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 ut there is no w
f7310 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f ay to know at co
f7320 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 mpile-time which
f7330 0d 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c ..** threading l
f7340 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 ibrary is being
f7350 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 used. So there
f7360 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f is no way to kno
f7370 77 20 61 74 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 w at..** compile
f7380 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 -time whether or
f7390 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 not thread A ca
f73a0 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 n override locks
f73b0 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0d 0a 2a on thread B...*
f73c0 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 * One has to do
f73d0 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b a run-time check
f73e0 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 to discover the
f73f0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 behavior of the
f7400 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f ..** current pro
f7410 63 65 73 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 cess...**..** SQ
f7420 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 Lite used to sup
f7430 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 port LinuxThread
f7440 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 s. But support
f7450 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 for LinuxThreads
f7460 0d 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 ..** was dropped
f7470 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 beginning with
f7480 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 version 3.7.0.
f7490 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c SQLite will stil
f74a0 6c 20 77 6f 72 6b 20 77 69 74 68 0d 0a 2a 2a 20 l work with..**
f74b0 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f LinuxThreads pro
f74c0 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 vided that (1) t
f74d0 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 here is no more
f74e0 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 than one connect
f74f0 69 6f 6e 20 0d 0a 2a 2a 20 70 65 72 20 64 61 74 ion ..** per dat
f7500 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 abase file in th
f7510 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 e same process a
f7520 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20 nd (2) database
f7530 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 2a 2a 20 connections..**
f7540 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f do not move acro
f7550 73 73 20 74 68 72 65 61 64 73 2e 0d 0a 2a 2f 0d ss threads...*/.
f7560 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 .../*..** An ins
f7570 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c tance of the fol
f7580 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 lowing structure
f7590 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b serves as the k
f75a0 65 79 20 75 73 65 64 0d 0a 2a 2a 20 74 6f 20 6c ey used..** to l
f75b0 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c ocate a particul
f75c0 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f ar unixInodeInfo
f75d0 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 object...*/..st
f75e0 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 ruct unixFileId
f75f0 7b 0d 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 {.. dev_t dev;
f7600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f7610 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 /* Device numbe
f7620 72 20 2a 2f 0d 0a 23 69 66 20 4f 53 5f 56 58 57 r */..#if OS_VXW
f7630 4f 52 4b 53 0d 0a 20 20 73 74 72 75 63 74 20 76 ORKS.. struct v
f7640 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 xworksFileId *pI
f7650 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 d; /* Unique fi
f7660 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b le ID for vxwork
f7670 73 2e 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 20 20 s. */..#else..
f7680 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 ino_t ino;
f7690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
f76a0 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a node number */..
f76b0 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a #endif..};..../*
f76c0 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 ..** An instance
f76d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
f76e0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 g structure is a
f76f0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 llocated for eac
f7700 68 20 6f 70 65 6e 0d 0a 2a 2a 20 69 6e 6f 64 65 h open..** inode
f7710 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 . Or, on LinuxT
f7720 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 hreads, there is
f7730 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 one of these st
f7740 72 75 63 74 75 72 65 73 20 66 6f 72 0d 0a 2a 2a ructures for..**
f7750 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e each inode open
f7760 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 ed by each threa
f7770 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 73 69 6e d...**..** A sin
f7780 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 gle inode can ha
f7790 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 ve multiple file
f77a0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f descriptors, so
f77b0 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0d 0a each unixFile..
f77c0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e ** structure con
f77d0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 tains a pointer
f77e0 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f to an instance o
f77f0 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e f this object an
f7800 64 20 74 68 69 73 0d 0a 2a 2a 20 6f 62 6a 65 63 d this..** objec
f7810 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 t keeps a count
f7820 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 of the number of
f7830 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 unixFile pointi
f7840 6e 67 20 74 6f 20 69 74 2e 0d 0a 2a 2f 0d 0a 73 ng to it...*/..s
f7850 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 truct unixInodeI
f7860 6e 66 6f 20 7b 0d 0a 20 20 73 74 72 75 63 74 20 nfo {.. struct
f7870 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 unixFileId fileI
f7880 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 d; /* The
f7890 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0d 0a 20 lookup key */..
f78a0 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 int nShared;
f78b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f78c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 /* Number of SH
f78d0 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 ARED locks held
f78e0 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 */.. unsigned c
f78f0 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 har eFileLock;
f7900 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 /* One of
f7910 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 SHARED_LOCK, RES
f7920 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 ERVED_LOCK etc.
f7930 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 */.. unsigned c
f7940 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b har bProcessLock
f7950 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c ; /* An excl
f7960 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f usive process lo
f7970 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0d 0a 20 ck is held */..
f7980 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 int nRef;
f7990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f79a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f /* Number of po
f79b0 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 inters to this s
f79c0 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a 20 20 75 tructure */.. u
f79d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d nixShmNode *pShm
f79e0 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f Node; /
f79f0 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 * Shared memory
f7a00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
f7a10 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0d 0a 20 this inode */..
f7a20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 int nLock;
f7a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f7a40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 /* Number of ou
f7a50 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c tstanding file l
f7a60 6f 63 6b 73 20 2a 2f 0d 0a 20 20 55 6e 69 78 55 ocks */.. UnixU
f7a70 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 nusedFd *pUnused
f7a80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e ; /* Un
f7a90 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 used file descri
f7aa0 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a ptors to close *
f7ab0 2f 0d 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e /.. unixInodeIn
f7ac0 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 fo *pNext;
f7ad0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 /* List of
f7ae0 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 all unixInodeInf
f7af0 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0d 0a 20 20 o objects */..
f7b00 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 unixInodeInfo *p
f7b10 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 Prev;
f7b20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c /* .... doubl
f7b30 79 20 6c 69 6e 6b 65 64 20 2a 2f 0d 0a 23 69 66 y linked */..#if
f7b40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
f7b50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 OCKING_STYLE..
f7b60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f unsigned long lo
f7b70 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 ng sharedByte;
f7b80 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c /* for AFP simul
f7b90 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b ated shared lock
f7ba0 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 */..#endif..#if
f7bb0 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 73 OS_VXWORKS.. s
f7bc0 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 em_t *pSem;
f7bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
f7be0 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 * Named POSIX se
f7bf0 6d 61 70 68 6f 72 65 20 2a 2f 0d 0a 20 20 63 68 maphore */.. ch
f7c00 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f ar aSemName[MAX_
f7c10 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a PATHNAME+2]; /*
f7c20 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 Name of that se
f7c30 6d 61 70 68 6f 72 65 20 2a 2f 0d 0a 23 65 6e 64 maphore */..#end
f7c40 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a if..};..../*..**
f7c50 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 A lists of all
f7c60 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 unixInodeInfo ob
f7c70 6a 65 63 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 jects...*/..stat
f7c80 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f ic unixInodeInfo
f7c90 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b *inodeList = 0;
f7ca0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ..../*..**..** T
f7cb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 his function - u
f7cc0 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c nixLogError_x(),
f7cd0 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 is only ever ca
f7ce0 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 lled via the mac
f7cf0 72 6f 0d 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 ro..** unixLogEr
f7d00 72 6f 72 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 ror()...**..** I
f7d10 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 t is invoked aft
f7d20 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 er an error occu
f7d30 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 rs in an OS func
f7d40 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 tion and errno h
f7d50 61 73 20 62 65 65 6e 0d 0a 2a 2a 20 73 65 74 2e as been..** set.
f7d60 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 It logs a messa
f7d70 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 ge using sqlite3
f7d80 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e _log() containin
f7d90 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 g the current va
f7da0 6c 75 65 20 6f 66 0d 0a 2a 2a 20 65 72 72 6e 6f lue of..** errno
f7db0 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c and, if possibl
f7dc0 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 e, the human-rea
f7dd0 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 dable equivalent
f7de0 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 from strerror()
f7df0 20 6f 72 0d 0a 2a 2a 20 73 74 72 65 72 72 6f 72 or..** strerror
f7e00 5f 72 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 _r()...**..** Th
f7e10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 e first argument
f7e20 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d passed to the m
f7e30 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 acro should be t
f7e40 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 he error code th
f7e50 61 74 0d 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 at..** will be r
f7e60 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 eturned to SQLit
f7e70 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 e (e.g. SQLITE_I
f7e80 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c OERR_DELETE, SQL
f7e90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0d ITE_CANTOPEN). .
f7ea0 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 .** The two subs
f7eb0 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 equent arguments
f7ec0 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e should be the n
f7ed0 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 ame of the OS fu
f7ee0 6e 63 74 69 6f 6e 20 74 68 61 74 0d 0a 2a 2a 20 nction that..**
f7ef0 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e failed (e.g. "un
f7f00 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 link", "open") a
f7f10 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 nd the the assoc
f7f20 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 iated file-syste
f7f30 6d 20 70 61 74 68 2c 0d 0a 2a 2a 20 69 66 20 61 m path,..** if a
f7f40 6e 79 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 ny...*/..#define
f7f50 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c unixLogError(a,
f7f60 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 b,c) unixLog
f7f70 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c ErrorAtLine(a,b,
f7f80 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0d 0a 73 74 61 c,__LINE__)..sta
f7f90 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 tic int unixLogE
f7fa0 72 72 6f 72 41 74 4c 69 6e 65 28 0d 0a 20 20 69 rrorAtLine(.. i
f7fb0 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 nt errcode,
f7fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
f7fd0 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 * SQLite error c
f7fe0 6f 64 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 ode */.. const
f7ff0 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 char *zFunc,
f8000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
f8010 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e e of OS function
f8020 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0d that failed */.
f8030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
f8040 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 Path,
f8050 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 /* File path
f8060 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
f8070 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 error */.. int
f8080 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 iLine
f8090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
f80a0 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 ource line numbe
f80b0 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 r where error oc
f80c0 63 75 72 72 65 64 20 2a 2f 0d 0a 29 7b 0d 0a 20 curred */..){..
f80d0 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 char *zErr;
f80e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f80f0 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d /* Message from
f8100 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 strerror() or e
f8110 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0d 0a 20 20 quivalent */..
f8120 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 int iErrno = err
f8130 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 no;
f8140 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c /* Saved syscall
f8150 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f error number */
f8160 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 .... /* If this
f8170 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 is not a thread
f8180 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 safe build (SQLI
f8190 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 TE_THREADSAFE==0
f81a0 29 2c 20 74 68 65 6e 20 75 73 65 0d 0a 20 20 2a ), then use.. *
f81b0 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 * the strerror()
f81c0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 function to obt
f81d0 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 ain the human-re
f81e0 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 adable error mes
f81f0 73 61 67 65 0d 0a 20 20 2a 2a 20 65 71 75 69 76 sage.. ** equiv
f8200 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 alent to errno.
f8210 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 Otherwise, use s
f8220 74 72 65 72 72 6f 72 5f 72 28 29 2e 0d 0a 20 20 trerror_r()...
f8230 2a 2f 20 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f */ ..#if SQLITE_
f8240 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 THREADSAFE && de
f8250 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 fined(HAVE_STRER
f8260 52 4f 52 5f 52 29 0d 0a 20 20 63 68 61 72 20 61 ROR_R).. char a
f8270 45 72 72 5b 38 30 5d 3b 0d 0a 20 20 6d 65 6d 73 Err[80];.. mems
f8280 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 et(aErr, 0, size
f8290 6f 66 28 61 45 72 72 29 29 3b 0d 0a 20 20 7a 45 of(aErr));.. zE
f82a0 72 72 20 3d 20 61 45 72 72 3b 0d 0a 0d 0a 20 20 rr = aErr;....
f82b0 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 /* If STRERROR_R
f82c0 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 _CHAR_P (set by
f82d0 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 autoconf scripts
f82e0 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 ) or __USE_GNU i
f82f0 73 20 64 65 66 69 6e 65 64 2c 0d 0a 20 20 2a 2a s defined,.. **
f8300 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 assume that the
f8310 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 system provides
f8320 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 the the GNU ver
f8330 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 sion of strerror
f8340 5f 72 28 29 20 74 68 61 74 20 0d 0a 20 20 2a 2a _r() that .. **
f8350 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 returns a point
f8360 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 er to a buffer c
f8370 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 ontaining the er
f8380 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 ror message. Tha
f8390 74 20 70 6f 69 6e 74 65 72 20 0d 0a 20 20 2a 2a t pointer .. **
f83a0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 may point to aE
f83b0 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 rr[], or it may
f83c0 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 point to some st
f83d0 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d atic storage som
f83e0 65 77 68 65 72 65 2e 20 0d 0a 20 20 2a 2a 20 4f ewhere. .. ** O
f83f0 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 therwise, assume
f8400 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d that the system
f8410 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f provides the PO
f8420 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0d SIX version of .
f8430 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 . ** strerror_r
f8440 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 (), which always
f8450 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 writes an error
f8460 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 message into aE
f8470 72 72 5b 5d 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a rr[]... **.. *
f8480 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e * If the code in
f8490 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 correctly assume
f84a0 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 s that it is the
f84b0 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 POSIX version t
f84c0 68 61 74 20 69 73 0d 0a 20 20 2a 2a 20 61 76 61 hat is.. ** ava
f84d0 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f ilable, the erro
f84e0 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f r message will o
f84f0 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 ften be an empty
f8500 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0d 0a string. Not a..
f8510 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 ** huge proble
f8520 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 m. Incorrectly c
f8530 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 oncluding that t
f8540 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 he GNU version i
f8550 73 20 61 76 61 69 6c 61 62 6c 65 20 0d 0a 20 20 s available ..
f8560 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f ** could lead to
f8570 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 a segfault thou
f8580 67 68 2e 0d 0a 20 20 2a 2f 0d 0a 23 69 66 20 64 gh... */..#if d
f8590 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f efined(STRERROR_
f85a0 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 R_CHAR_P) || def
f85b0 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0d ined(__USE_GNU).
f85c0 0a 20 20 7a 45 72 72 20 3d 20 0d 0a 23 20 65 6e . zErr = ..# en
f85d0 64 69 66 0d 0a 20 20 73 74 72 65 72 72 6f 72 5f dif.. strerror_
f85e0 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 r(iErrno, aErr,
f85f0 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b sizeof(aErr)-1);
f8600 0d 0a 0d 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 ....#elif SQLITE
f8610 5f 54 48 52 45 41 44 53 41 46 45 0d 0a 20 20 2f _THREADSAFE.. /
f8620 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65 * This is a thre
f8630 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 adsafe build, bu
f8640 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 t strerror_r() i
f8650 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e s not available.
f8660 20 2a 2f 0d 0a 20 20 7a 45 72 72 20 3d 20 22 22 */.. zErr = ""
f8670 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 2f 2a 20 4e ;..#else.. /* N
f8680 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 on-threadsafe bu
f8690 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f ild, use strerro
f86a0 72 28 29 2e 20 2a 2f 0d 0a 20 20 7a 45 72 72 20 r(). */.. zErr
f86b0 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e = strerror(iErrn
f86c0 6f 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 o);..#endif....
f86d0 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 assert( errcode
f86e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a !=SQLITE_OK );..
f86f0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 if( zPath==0 )
f8700 20 7a 50 61 74 68 20 3d 20 22 22 3b 0d 0a 20 20 zPath = "";..
f8710 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 sqlite3_log(errc
f8720 6f 64 65 2c 0d 0a 20 20 20 20 20 20 22 6f 73 5f ode,.. "os_
f8730 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 unix.c:%d: (%d)
f8740 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0d 0a 20 %s(%s) - %s",..
f8750 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 iLine, iErr
f8760 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 no, zFunc, zPath
f8770 2c 20 7a 45 72 72 0d 0a 20 20 29 3b 0d 0a 0d 0a , zErr.. );....
f8780 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 return errcode
f8790 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
f87a0 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 lose a file desc
f87b0 72 69 70 74 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 riptor...**..**
f87c0 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 We assume that c
f87d0 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c lose() almost al
f87e0 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 ways works, sinc
f87f0 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 e it is only in
f8800 61 0d 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 a..** very sick
f8810 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f application or o
f8820 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c n a very sick pl
f8830 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d atform that it m
f8840 69 67 68 74 20 66 61 69 6c 2e 0d 0a 2a 2a 20 49 ight fail...** I
f8850 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 f it does fail,
f8860 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 simply leak the
f8870 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c file descriptor,
f8880 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0d but do log the.
f8890 0a 2a 2a 20 65 72 72 6f 72 2e 0d 0a 2a 2a 0d 0a .** error...**..
f88a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 ** Note that it
f88b0 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 is not safe to r
f88c0 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 etry close() aft
f88d0 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 er EINTR since t
f88e0 68 65 0d 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 he..** file desc
f88f0 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 riptor might hav
f8900 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 e already been r
f8910 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 eused by another
f8920 20 74 68 72 65 61 64 2e 0d 0a 2a 2a 20 53 6f 20 thread...** So
f8930 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 we don't even tr
f8940 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f y to recover fro
f8950 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 m an EINTR. Jus
f8960 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0d t log the error.
f8970 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e .** and move on.
f8980 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
f8990 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 d robust_close(u
f89a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 nixFile *pFile,
f89b0 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e int h, int linen
f89c0 6f 29 7b 0d 0a 20 20 69 66 28 20 6f 73 43 6c 6f o){.. if( osClo
f89d0 73 65 28 68 29 20 29 7b 0d 0a 20 20 20 20 75 6e se(h) ){.. un
f89e0 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 ixLogErrorAtLine
f89f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c (SQLITE_IOERR_CL
f8a00 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0d 0a 20 OSE, "close",..
f8a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f8a20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 pFile ? pF
f8a30 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 ile->zPath : 0,
f8a40 6c 69 6e 65 6e 6f 29 3b 0d 0a 20 20 7d 0d 0a 7d lineno);.. }..}
f8a50 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 ..../*..** Close
f8a60 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 all file descri
f8a70 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 ptors accumuated
f8a80 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 in the unixInod
f8a90 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c eInfo->pUnused l
f8aa0 69 73 74 2e 0d 0a 2a 2f 20 0d 0a 73 74 61 74 69 ist...*/ ..stati
f8ab0 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 c void closePend
f8ac0 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 ingFds(unixFile
f8ad0 2a 70 46 69 6c 65 29 7b 0d 0a 20 20 75 6e 69 78 *pFile){.. unix
f8ae0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 InodeInfo *pInod
f8af0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 e = pFile->pInod
f8b00 65 3b 0d 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 e;.. UnixUnused
f8b10 46 64 20 2a 70 3b 0d 0a 20 20 55 6e 69 78 55 6e Fd *p;.. UnixUn
f8b20 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0d 0a usedFd *pNext;..
f8b30 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e for(p=pInode->
f8b40 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e pUnused; p; p=pN
f8b50 65 78 74 29 7b 0d 0a 20 20 20 20 70 4e 65 78 74 ext){.. pNext
f8b60 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 = p->pNext;..
f8b70 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 robust_close(p
f8b80 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c File, p->fd, __L
f8b90 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 73 71 6c INE__);.. sql
f8ba0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20 ite3_free(p);..
f8bb0 20 7d 0d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 }.. pInode->pU
f8bc0 6e 75 73 65 64 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d nused = 0;..}...
f8bd0 0a 2f 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 65 20 ./*..** Release
f8be0 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 a unixInodeInfo
f8bf0 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f structure previo
f8c00 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 usly allocated b
f8c10 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 y findInodeInfo(
f8c20 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6d )...**..** The m
f8c30 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 utex entered usi
f8c40 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 ng the unixEnter
f8c50 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e Mutex() function
f8c60 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0d 0a 2a must be held..*
f8c70 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 * when this func
f8c80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0d tion is called..
f8c90 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
f8ca0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 releaseInodeInf
f8cb0 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c o(unixFile *pFil
f8cc0 65 29 7b 0d 0a 20 20 75 6e 69 78 49 6e 6f 64 65 e){.. unixInode
f8cd0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 Info *pInode = p
f8ce0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0d 0a 20 File->pInode;..
f8cf0 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 assert( unixMut
f8d00 65 78 48 65 6c 64 28 29 20 29 3b 0d 0a 20 20 69 exHeld() );.. i
f8d10 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 f( ALWAYS(pInode
f8d20 29 20 29 7b 0d 0a 20 20 20 20 70 49 6e 6f 64 65 ) ){.. pInode
f8d30 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a 20 20 20 20 69 ->nRef--;.. i
f8d40 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d f( pInode->nRef=
f8d50 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 =0 ){.. ass
f8d60 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 ert( pInode->pSh
f8d70 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0d 0a 20 20 20 mNode==0 );..
f8d80 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 closePendingF
f8d90 64 73 28 70 46 69 6c 65 29 3b 0d 0a 20 20 20 20 ds(pFile);..
f8da0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 if( pInode->pP
f8db0 72 65 76 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 rev ){..
f8dc0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e assert( pInode->
f8dd0 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 pPrev->pNext==pI
f8de0 6e 6f 64 65 20 29 3b 0d 0a 20 20 20 20 20 20 20 node );..
f8df0 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e pInode->pPrev->
f8e00 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e pNext = pInode->
f8e10 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 7d 65 pNext;.. }e
f8e20 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 lse{.. as
f8e30 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d sert( inodeList=
f8e40 3d 70 49 6e 6f 64 65 20 29 3b 0d 0a 20 20 20 20 =pInode );..
f8e50 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 inodeList =
f8e60 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0d 0a pInode->pNext;..
f8e70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 }.. i
f8e80 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 f( pInode->pNext
f8e90 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 ){.. ass
f8ea0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 ert( pInode->pNe
f8eb0 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 xt->pPrev==pInod
f8ec0 65 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 49 e );.. pI
f8ed0 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 node->pNext->pPr
f8ee0 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 ev = pInode->pPr
f8ef0 65 76 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 ev;.. }..
f8f00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
f8f10 28 70 49 6e 6f 64 65 29 3b 0d 0a 20 20 20 20 7d (pInode);.. }
f8f20 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
f8f30 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 ** Given a file
f8f40 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 descriptor, loca
f8f50 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 te the unixInode
f8f60 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 Info object that
f8f70 0d 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 ..** describes t
f8f80 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 hat file descrip
f8f90 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e tor. Create a n
f8fa0 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 ew one if necess
f8fb0 61 72 79 2e 20 20 54 68 65 0d 0a 2a 2a 20 72 65 ary. The..** re
f8fc0 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 turn value might
f8fd0 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 be uninitialize
f8fe0 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 d if an error oc
f8ff0 63 75 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 curs...**..** Th
f9000 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 e mutex entered
f9010 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e using the unixEn
f9020 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 terMutex() funct
f9030 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 ion must be held
f9040 0d 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 ..** when this f
f9050 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
f9060 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 d...**..** Retur
f9070 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 n an appropriate
f9080 20 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a 2a 2f error code...*/
f9090 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e ..static int fin
f90a0 64 49 6e 6f 64 65 49 6e 66 6f 28 0d 0a 20 20 75 dInodeInfo(.. u
f90b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 nixFile *pFile,
f90c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
f90d0 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 Unix file with
f90e0 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 file desc used i
f90f0 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0d 0a 20 20 n the key */..
f9100 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a unixInodeInfo **
f9110 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f ppInode /
f9120 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 * Return the uni
f9130 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 xInodeInfo objec
f9140 74 20 68 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 t here */..){..
f9150 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
f9160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f9170 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 /* System call r
f9180 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 eturn code */..
f9190 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 int fd;
f91a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f91b0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 /* The file desc
f91c0 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 riptor for pFile
f91d0 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 75 6e */.. struct un
f91e0 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b ixFileId fileId;
f91f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 /* Lookup
f9200 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 key for the unix
f9210 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0d 0a 20 20 InodeInfo */..
f9220 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 struct stat stat
f9230 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f buf; /
f9240 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 * Low-level file
f9250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0d information */.
f9260 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f . unixInodeInfo
f9270 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 *pInode = 0;
f9280 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 /* Candidate u
f9290 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a nixInodeInfo obj
f92a0 65 63 74 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 ect */.... asse
f92b0 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c rt( unixMutexHel
f92c0 64 28 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 47 d() );.... /* G
f92d0 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 et low-level inf
f92e0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 ormation about t
f92f0 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 he file that we
f9300 63 61 6e 20 75 73 65 64 20 74 6f 0d 0a 20 20 2a can used to.. *
f9310 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 * create a uniqu
f9320 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 e name for the f
f9330 69 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 66 64 ile... */.. fd
f9340 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0d 0a 20 20 = pFile->h;..
f9350 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c rc = osFstat(fd,
f9360 20 26 73 74 61 74 62 75 66 29 3b 0d 0a 20 20 69 &statbuf);.. i
f9370 66 28 20 72 63 21 3d 30 20 29 7b 0d 0a 20 20 20 f( rc!=0 ){..
f9380 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
f9390 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 23 69 66 64 o = errno;..#ifd
f93a0 65 66 20 45 4f 56 45 52 46 4c 4f 57 0d 0a 20 20 ef EOVERFLOW..
f93b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 if( pFile->las
f93c0 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f tErrno==EOVERFLO
f93d0 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 W ) return SQLIT
f93e0 45 5f 4e 4f 4c 46 53 3b 0d 0a 23 65 6e 64 69 66 E_NOLFS;..#endif
f93f0 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
f9400 49 54 45 5f 49 4f 45 52 52 3b 0d 0a 20 20 7d 0d ITE_IOERR;.. }.
f9410 0a 0d 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c ...#ifdef __APPL
f9420 45 5f 5f 0d 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 E__.. /* On OS
f9430 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 X on an msdos fi
f9440 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e lesystem, the in
f9450 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 ode number is re
f9460 70 6f 72 74 65 64 0d 0a 20 20 2a 2a 20 69 6e 63 ported.. ** inc
f9470 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 orrectly for zer
f9480 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 o-size files. S
f9490 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e ee ticket #3260.
f94a0 20 20 54 6f 20 77 6f 72 6b 0d 0a 20 20 2a 2a 20 To work.. **
f94b0 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 around this prob
f94c0 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 lem (we consider
f94d0 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 it a bug in OS
f94e0 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0d 0a X, not SQLite)..
f94f0 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 ** we always i
f9500 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 ncrease the file
f9510 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 size to 1 by wr
f9520 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 iting a single b
f9530 79 74 65 0d 0a 20 20 2a 2a 20 70 72 69 6f 72 20 yte.. ** prior
f9540 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 to accessing the
f9550 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 inode number.
f9560 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 The one byte wri
f9570 74 74 65 6e 20 69 73 0d 0a 20 20 2a 2a 20 61 6e tten is.. ** an
f9580 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 ASCII 'S' chara
f9590 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 cter which also
f95a0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 happens to be th
f95b0 65 20 66 69 72 73 74 20 62 79 74 65 0d 0a 20 20 e first byte..
f95c0 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 ** in the header
f95d0 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 of every SQLite
f95e0 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 database. In t
f95f0 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 his way, if ther
f9600 65 0d 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 e.. ** is a rac
f9610 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 e condition such
f9620 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 that another th
f9630 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 read has already
f9640 20 70 6f 70 75 6c 61 74 65 64 0d 0a 20 20 2a 2a populated.. **
f9650 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 the first page
f9660 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c of the database,
f9670 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f no damage is do
f9680 6e 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 ne... */.. if(
f9690 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 statbuf.st_size
f96a0 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 ==0 && (pFile->f
f96b0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f sFlags & SQLITE_
f96c0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 FSFLAGS_IS_MSDOS
f96d0 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 64 6f 7b )!=0 ){.. do{
f96e0 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 rc = osWrite(fd
f96f0 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c , "S", 1); }whil
f9700 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f e( rc<0 && errno
f9710 3d 3d 45 49 4e 54 52 20 29 3b 0d 0a 20 20 20 20 ==EINTR );..
f9720 69 66 28 20 72 63 21 3d 31 20 29 7b 0d 0a 20 20 if( rc!=1 ){..
f9730 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
f9740 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 rrno = errno;..
f9750 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
f9760 54 45 5f 49 4f 45 52 52 3b 0d 0a 20 20 20 20 7d TE_IOERR;.. }
f9770 0d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 .. rc = osFst
f9780 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 at(fd, &statbuf)
f9790 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 ;.. if( rc!=0
f97a0 20 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 ){.. pFile
f97b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 ->lastErrno = er
f97c0 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 rno;.. retu
f97d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b rn SQLITE_IOERR;
f97e0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 .. }.. }..#e
f97f0 6e 64 69 66 0d 0a 0d 0a 20 20 6d 65 6d 73 65 74 ndif.... memset
f9800 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a (&fileId, 0, siz
f9810 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0d 0a 20 eof(fileId));..
f9820 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 fileId.dev = st
f9830 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0d 0a 23 atbuf.st_dev;..#
f9840 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 if OS_VXWORKS..
f9850 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 fileId.pId = pF
f9860 69 6c 65 2d 3e 70 49 64 3b 0d 0a 23 65 6c 73 65 ile->pId;..#else
f9870 0d 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d .. fileId.ino =
f9880 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b statbuf.st_ino;
f9890 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 70 49 6e 6f ..#endif.. pIno
f98a0 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0d de = inodeList;.
f98b0 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 . while( pInode
f98c0 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 && memcmp(&file
f98d0 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c Id, &pInode->fil
f98e0 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 eId, sizeof(file
f98f0 49 64 29 29 20 29 7b 0d 0a 20 20 20 20 70 49 6e Id)) ){.. pIn
f9900 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e ode = pInode->pN
f9910 65 78 74 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 ext;.. }.. if(
f9920 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0d 0a 20 pInode==0 ){..
f9930 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 pInode = sqli
f9940 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 te3_malloc( size
f9950 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0d 0a of(*pInode) );..
f9960 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d if( pInode==
f9970 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 0 ){.. retu
f9980 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
f9990 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 6d 65 6d .. }.. mem
f99a0 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 set(pInode, 0, s
f99b0 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b izeof(*pInode));
f99c0 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 .. memcpy(&pI
f99d0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 node->fileId, &f
f99e0 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 ileId, sizeof(fi
f99f0 6c 65 49 64 29 29 3b 0d 0a 20 20 20 20 70 49 6e leId));.. pIn
f9a00 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0d 0a ode->nRef = 1;..
f9a10 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 pInode->pNex
f9a20 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0d 0a t = inodeList;..
f9a30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 pInode->pPre
f9a40 76 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 v = 0;.. if(
f9a50 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 inodeList ) inod
f9a60 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 eList->pPrev = p
f9a70 49 6e 6f 64 65 3b 0d 0a 20 20 20 20 69 6e 6f 64 Inode;.. inod
f9a80 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0d eList = pInode;.
f9a90 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
f9aa0 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a Inode->nRef++;..
f9ab0 20 20 7d 0d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 }.. *ppInode
f9ac0 3d 20 70 49 6e 6f 64 65 3b 0d 0a 20 20 72 65 74 = pInode;.. ret
f9ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
f9ae0 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 }....../*..** Th
f9af0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b is routine check
f9b00 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 s if there is a
f9b10 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 RESERVED lock he
f9b20 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 ld on the specif
f9b30 69 65 64 0d 0a 2a 2a 20 66 69 6c 65 20 62 79 20 ied..** file by
f9b40 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 this or any othe
f9b50 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 r process. If su
f9b60 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c ch a lock is hel
f9b70 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0d d, set *pResOut.
f9b80 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 .** to a non-zer
f9b90 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 o value otherwis
f9ba0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 e *pResOut is se
f9bb0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 t to zero. The
f9bc0 72 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a 2a return value..**
f9bd0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 is set to SQLIT
f9be0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 E_OK unless an I
f9bf0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 /O error occurs
f9c00 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 during lock chec
f9c10 6b 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 king...*/..stati
f9c20 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 c int unixCheckR
f9c30 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 eservedLock(sqli
f9c40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e te3_file *id, in
f9c50 74 20 2a 70 52 65 73 4f 75 74 29 7b 0d 0a 20 20 t *pResOut){..
f9c60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
f9c70 4f 4b 3b 0d 0a 20 20 69 6e 74 20 72 65 73 65 72 OK;.. int reser
f9c80 76 65 64 20 3d 20 30 3b 0d 0a 20 20 75 6e 69 78 ved = 0;.. unix
f9c90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 File *pFile = (u
f9ca0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 0d 0a nixFile*)id;....
f9cb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
f9cc0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 r( return SQLITE
f9cd0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 _IOERR_CHECKRESE
f9ce0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0d 0a 0d 0a RVEDLOCK; );....
f9cf0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
f9d00 29 3b 0d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d );.. unixEnterM
f9d10 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 utex(); /* Becau
f9d20 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 se pFile->pInode
f9d30 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 is shared acros
f9d40 73 20 74 68 72 65 61 64 73 20 2a 2f 0d 0a 0d 0a s threads */....
f9d50 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 /* Check if a
f9d60 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 thread in this p
f9d70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 rocess holds suc
f9d80 68 20 61 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 h a lock */.. i
f9d90 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 f( pFile->pInode
f9da0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 ->eFileLock>SHAR
f9db0 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 ED_LOCK ){..
f9dc0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0d 0a 20 reserved = 1;..
f9dd0 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4f 74 68 65 72 }.... /* Other
f9de0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 wise see if some
f9df0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 other process h
f9e00 6f 6c 64 73 20 69 74 2e 0d 0a 20 20 2a 2f 0d 0a olds it... */..
f9e10 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f #ifndef __DJGPP_
f9e20 5f 0d 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 _.. if( !reserv
f9e30 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 ed && !pFile->pI
f9e40 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f node->bProcessLo
f9e50 63 6b 20 29 7b 0d 0a 20 20 20 20 73 74 72 75 63 ck ){.. struc
f9e60 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0d 0a 20 t flock lock;..
f9e70 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 lock.l_whence
f9e80 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0d 0a 20 20 = SEEK_SET;..
f9e90 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d lock.l_start =
f9ea0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0d RESERVED_BYTE;.
f9eb0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 . lock.l_len
f9ec0 3d 20 31 3b 0d 0a 20 20 20 20 6c 6f 63 6b 2e 6c = 1;.. lock.l
f9ed0 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b _type = F_WRLCK;
f9ee0 0d 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 .. if( osFcnt
f9ef0 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 l(pFile->h, F_GE
f9f00 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0d 0a TLK, &lock) ){..
f9f10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
f9f20 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 E_IOERR_CHECKRES
f9f30 45 52 56 45 44 4c 4f 43 4b 3b 0d 0a 20 20 20 20 ERVEDLOCK;..
f9f40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 pFile->lastErr
f9f50 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 no = errno;..
f9f60 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b } else if( lock
f9f70 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b .l_type!=F_UNLCK
f9f80 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 73 65 72 ){.. reser
f9f90 76 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d ved = 1;.. }.
f9fa0 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 . }..#endif..
f9fb0 0d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 .. unixLeaveMut
f9fc0 65 78 28 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 ex();.. OSTRACE
f9fd0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 (("TEST WR-LOCK
f9fe0 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c %d %d %d (unix)\
f9ff0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 n", pFile->h, rc
fa000 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0d 0a 0d , reserved));...
fa010 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 . *pResOut = re
fa020 73 65 72 76 65 64 3b 0d 0a 20 20 72 65 74 75 72 served;.. retur
fa030 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
fa040 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 ** Attempt to se
fa050 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 t a system-lock
fa060 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c on the file pFil
fa070 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 e. The lock is
fa080 0d 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 ..** described b
fa090 79 20 70 4c 6f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a y pLock...**..**
fa0a0 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 If the pFile wa
fa0b0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 s opened read/wr
fa0c0 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 ite from unix-ex
fa0d0 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c cl, then the onl
fa0e0 79 20 6c 6f 63 6b 0d 0a 2a 2a 20 65 76 65 72 20 y lock..** ever
fa0f0 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 obtained is an e
fa100 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 xclusive lock, a
fa110 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 nd it is obtaine
fa120 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0d 0a d exactly once..
fa130 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d ** the first tim
fa140 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 e any lock is at
fa150 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 tempted. All su
fa160 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 bsequent system
fa170 6c 6f 63 6b 69 6e 67 0d 0a 2a 2a 20 6f 70 65 72 locking..** oper
fa180 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f ations become no
fa190 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f -ops. Locking o
fa1a0 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 perations still
fa1b0 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c happen internall
fa1c0 79 2c 0d 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 y,..** in order
fa1d0 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 to coordinate ac
fa1e0 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 cess between sep
fa1f0 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 arate database c
fa200 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 2a 2a 20 77 onnections..** w
fa210 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 ithin this proce
fa220 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 ss, but all of t
fa230 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 hat is handled i
fa240 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 n memory and the
fa250 0d 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 ..** operating s
fa260 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 ystem does not p
fa270 61 72 74 69 63 69 70 61 74 65 2e 0d 0a 2a 2a 0d articipate...**.
fa280 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
fa290 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f n is a pass-thro
fa2a0 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 ugh to fcntl(F_S
fa2b0 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 ETLK) if pFile i
fa2c0 73 20 75 73 69 6e 67 0d 0a 2a 2a 20 61 6e 79 20 s using..** any
fa2d0 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 VFS other than "
fa2e0 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 unix-excl" or if
fa2f0 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 pFile is opened
fa300 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0d on "unix-excl".
fa310 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d .** and is read-
fa320 6f 6e 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 5a 65 only...**..** Ze
fa330 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 ro is returned i
fa340 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c f the call compl
fa350 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c etes successfull
fa360 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 y, or -1 if a ca
fa370 6c 6c 0d 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 ll..** to fcntl(
fa380 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 ) fails. In this
fa390 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 case, errno is
fa3a0 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c set appropriatel
fa3b0 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0d y (by fcntl())..
fa3c0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
fa3d0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 unixFileLock(uni
fa3e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 xFile *pFile, st
fa3f0 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 ruct flock *pLoc
fa400 6b 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a k){.. int rc;..
fa410 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 unixInodeInfo
fa420 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d *pInode = pFile-
fa430 3e 70 49 6e 6f 64 65 3b 0d 0a 20 20 61 73 73 65 >pInode;.. asse
fa440 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c rt( unixMutexHel
fa450 64 28 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 d() );.. assert
fa460 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0d 0a ( pInode!=0 );..
fa470 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 if( ((pFile->c
fa480 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 trlFlags & UNIXF
fa490 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 ILE_EXCL)!=0 ||
fa4a0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 pInode->bProcess
fa4b0 4c 6f 63 6b 29 0d 0a 20 20 20 26 26 20 28 28 70 Lock).. && ((p
fa4c0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 File->ctrlFlags
fa4d0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c & UNIXFILE_RDONL
fa4e0 59 29 3d 3d 30 29 0d 0a 20 20 29 7b 0d 0a 20 20 Y)==0).. ){..
fa4f0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 if( pInode->bP
fa500 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b rocessLock==0 ){
fa510 0d 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 .. struct f
fa520 6c 6f 63 6b 20 6c 6f 63 6b 3b 0d 0a 20 20 20 20 lock lock;..
fa530 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 assert( pInode
fa540 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a 20 ->nLock==0 );..
fa550 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e lock.l_when
fa560 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0d 0a ce = SEEK_SET;..
fa570 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 lock.l_sta
fa580 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 rt = SHARED_FIRS
fa590 54 3b 0d 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c T;.. lock.l
fa5a0 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 _len = SHARED_SI
fa5b0 5a 45 3b 0d 0a 20 20 20 20 20 20 6c 6f 63 6b 2e ZE;.. lock.
fa5c0 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b l_type = F_WRLCK
fa5d0 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 ;.. rc = os
fa5e0 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 Fcntl(pFile->h,
fa5f0 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b F_SETLK, &lock);
fa600 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 .. if( rc<0
fa610 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 ) return rc;..
fa620 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 pInode->bPr
fa630 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0d 0a ocessLock = 1;..
fa640 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c pInode->nL
fa650 6f 63 6b 2b 2b 3b 0d 0a 20 20 20 20 7d 65 6c 73 ock++;.. }els
fa660 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 30 e{.. rc = 0
fa670 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 ;.. }.. }els
fa680 65 7b 0d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 e{.. rc = osF
fa690 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 cntl(pFile->h, F
fa6a0 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0d _SETLK, pLock);.
fa6b0 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
fa6c0 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
fa6d0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 Lock the file wi
fa6e0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 th the lock spec
fa6f0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 ified by paramet
fa700 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f er eFileLock - o
fa710 6e 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f ne..** of the fo
fa720 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a llowing:..**..**
fa730 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f (1) SHARED_
fa740 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 32 29 LOCK..** (2)
fa750 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0d 0a RESERVED_LOCK..
fa760 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 ** (3) PENDI
fa770 4e 47 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 NG_LOCK..**
fa780 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f (4) EXCLUSIVE_LO
fa790 43 4b 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f 6d 65 74 CK..**..** Somet
fa7a0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 imes when reques
fa7b0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 ting one lock st
fa7c0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 ate, additional
fa7d0 6c 6f 63 6b 20 73 74 61 74 65 73 0d 0a 2a 2a 20 lock states..**
fa7e0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 are inserted in
fa7f0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f between. The lo
fa800 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c cking might fail
fa810 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c on one of the l
fa820 61 74 65 72 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 ater..** transit
fa830 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 ions leaving the
fa840 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 lock state diff
fa850 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 erent from what
fa860 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0d 0a it started but..
fa870 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f ** still short o
fa880 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 f its goal. The
fa890 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 following chart
fa8a0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 shows the allow
fa8b0 65 64 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f ed..** transitio
fa8c0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 ns and the inser
fa8d0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 ted intermediate
fa8e0 20 73 74 61 74 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a states:..**..**
fa8f0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 UNLOCKED ->
fa900 53 48 41 52 45 44 0d 0a 2a 2a 20 20 20 20 53 48 SHARED..** SH
fa910 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 ARED -> RESERVED
fa920 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d ..** SHARED -
fa930 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 > (PENDING) -> E
fa940 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 20 20 20 XCLUSIVE..**
fa950 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e RESERVED -> (PEN
fa960 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 DING) -> EXCLUSI
fa970 56 45 0d 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e VE..** PENDIN
fa980 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a G -> EXCLUSIVE..
fa990 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
fa9a0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e ine will only in
fa9b0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 crease a lock.
fa9c0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f Use the sqlite3O
fa9d0 73 55 6e 6c 6f 63 6b 28 29 0d 0a 2a 2a 20 72 6f sUnlock()..** ro
fa9e0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 utine to lower a
fa9f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0d locking level..
faa00 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
faa10 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 unixLock(sqlite3
faa20 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 _file *id, int e
faa30 46 69 6c 65 4c 6f 63 6b 29 7b 0d 0a 20 20 2f 2a FileLock){.. /*
faa40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 The following d
faa50 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 escribes the imp
faa60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
faa70 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 he various locks
faa80 20 61 6e 64 0d 0a 20 20 2a 2a 20 6c 6f 63 6b 20 and.. ** lock
faa90 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 transitions in t
faaa0 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 erms of the POSI
faab0 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 X advisory share
faac0 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0d d and exclusive.
faad0 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 . ** lock primi
faae0 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 tives (called re
faaf0 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 ad-locks and wri
fab00 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 te-locks below,
fab10 74 6f 20 61 76 6f 69 64 0d 0a 20 20 2a 2a 20 63 to avoid.. ** c
fab20 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 onfusion with SQ
fab30 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 Lite lock names)
fab40 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 . The algorithms
fab50 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 are complicated
fab60 0d 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 .. ** slightly
fab70 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 in order to be c
fab80 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 ompatible with w
fab90 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 indows systems s
faba0 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0d 0a 20 imultaneously..
fabb0 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 ** accessing th
fabc0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 e same database
fabd0 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 file, in case th
fabe0 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 at is ever requi
fabf0 72 65 64 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a red... **.. **
fac00 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 Symbols defined
fac10 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 in os.h indenti
fac20 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 fy the 'pending
fac30 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 byte' and the 'r
fac40 65 73 65 72 76 65 64 0d 0a 20 20 2a 2a 20 62 79 eserved.. ** by
fac50 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 te', each single
fac60 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b bytes at well k
fac70 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e nown offsets, an
fac80 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 d the 'shared by
fac90 74 65 0d 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c te.. ** range',
faca0 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 a range of 510
facb0 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 bytes at a well
facc0 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0d 0a 20 known offset...
facd0 20 2a 2a 0d 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 **.. ** To obt
face0 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 ain a SHARED loc
facf0 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 k, a read-lock i
fad00 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 s obtained on th
fad10 65 20 27 70 65 6e 64 69 6e 67 0d 0a 20 20 2a 2a e 'pending.. **
fad20 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 byte'. If this
fad30 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 is successful,
fad40 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 a random byte fr
fad50 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 om the 'shared b
fad60 79 74 65 0d 0a 20 20 2a 2a 20 72 61 6e 67 65 27 yte.. ** range'
fad70 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 is read-locked
fad80 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 and the lock on
fad90 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 the 'pending byt
fada0 65 27 20 72 65 6c 65 61 73 65 64 2e 0d 0a 20 20 e' released...
fadb0 2a 2a 0d 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 **.. ** A proce
fadc0 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 ss may only obta
fadd0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f in a RESERVED lo
fade0 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 ck after it has
fadf0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0d 0a a SHARED lock...
fae00 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 ** A RESERVED
fae10 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e lock is implemen
fae20 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 ted by grabbing
fae30 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 a write-lock on
fae40 74 68 65 0d 0a 20 20 2a 2a 20 27 72 65 73 65 72 the.. ** 'reser
fae50 76 65 64 20 62 79 74 65 27 2e 20 0d 0a 20 20 2a ved byte'. .. *
fae60 2a 0d 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 *.. ** A proces
fae70 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 s may only obtai
fae80 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b n a PENDING lock
fae90 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 after it has ob
faea0 74 61 69 6e 65 64 20 61 0d 0a 20 20 2a 2a 20 53 tained a.. ** S
faeb0 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 HARED lock. A PE
faec0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d NDING lock is im
faed0 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 plemented by obt
faee0 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c aining a write-l
faef0 6f 63 6b 0d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 ock.. ** on the
faf00 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 'pending byte'.
faf10 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 This ensures th
faf20 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 at no new SHARED
faf30 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0d 0a 20 locks can be..
faf40 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 ** obtained, bu
faf50 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 t existing SHARE
faf60 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f D locks are allo
faf70 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 wed to persist.
faf80 41 20 70 72 6f 63 65 73 73 0d 0a 20 20 2a 2a 20 A process.. **
faf90 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f does not have to
fafa0 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 obtain a RESERV
fafb0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 ED lock on the w
fafc0 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 ay to a PENDING
fafd0 6c 6f 63 6b 2e 0d 0a 20 20 2a 2a 20 54 68 69 73 lock... ** This
fafe0 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 property is use
faff0 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 d by the algorit
fb000 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 hm for rolling b
fb010 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 ack a journal fi
fb020 6c 65 0d 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 le.. ** after a
fb030 20 63 72 61 73 68 2e 0d 0a 20 20 2a 2a 0d 0a 20 crash... **..
fb040 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 ** An EXCLUSIVE
fb050 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 lock, obtained
fb060 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 after a PENDING
fb070 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 lock is held, is
fb080 0d 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 .. ** implement
fb090 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 ed by obtaining
fb0a0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 a write-lock on
fb0b0 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 the entire 'shar
fb0c0 65 64 20 62 79 74 65 0d 0a 20 20 2a 2a 20 72 61 ed byte.. ** ra
fb0d0 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 nge'. Since all
fb0e0 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 other locks requ
fb0f0 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 ire a read-lock
fb100 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 on one of the by
fb110 74 65 73 0d 0a 20 20 2a 2a 20 77 69 74 68 69 6e tes.. ** within
fb120 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 this range, thi
fb130 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e s ensures that n
fb140 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 o other locks ar
fb150 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0d 0a 20 e held on the..
fb160 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0d 0a ** database. ..
fb170 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 72 **.. ** The r
fb180 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 eason a single b
fb190 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 yte cannot be us
fb1a0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 ed instead of th
fb1b0 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0d 0a e 'shared byte..
fb1c0 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 ** range' is t
fb1d0 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e hat some version
fb1e0 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 s of windows do
fb1f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 not support read
fb200 2d 6c 6f 63 6b 73 2e 20 42 79 0d 0a 20 20 2a 2a -locks. By.. **
fb210 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f locking a rando
fb220 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 m byte from a ra
fb230 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 nge, concurrent
fb240 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 SHARED locks may
fb250 20 65 78 69 73 74 0d 0a 20 20 2a 2a 20 65 76 65 exist.. ** eve
fb260 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 n if the locking
fb270 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 primitive used
fb280 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 is always a writ
fb290 65 2d 6c 6f 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 e-lock... */..
fb2a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
fb2b0 5f 4f 4b 3b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 _OK;.. unixFile
fb2c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 *pFile = (unixF
fb2d0 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 75 6e 69 78 ile*)id;.. unix
fb2e0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 InodeInfo *pInod
fb2f0 65 3b 0d 0a 20 20 73 74 72 75 63 74 20 66 6c 6f e;.. struct flo
fb300 63 6b 20 6c 6f 63 6b 3b 0d 0a 20 20 69 6e 74 20 ck lock;.. int
fb310 74 45 72 72 6e 6f 20 3d 20 30 3b 0d 0a 0d 0a 20 tErrno = 0;....
fb320 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 assert( pFile )
fb330 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c ;.. OSTRACE(("L
fb340 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 OCK %d %s was
fb350 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 %s(%s,%d) pid=%
fb360 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 d (unix)\n", pFi
fb370 6c 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 20 61 7a le->h,.. az
fb380 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f FileLock(eFileLo
fb390 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 ck), azFileLock(
fb3a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b pFile->eFileLock
fb3b0 29 2c 0d 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 ),.. azFile
fb3c0 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f Lock(pFile->pIno
fb3d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 de->eFileLock),
fb3e0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e pFile->pInode->n
fb3f0 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 Shared , getpid(
fb400 29 29 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 )));.... /* If
fb410 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 there is already
fb420 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 a lock of this
fb430 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 type or more res
fb440 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0d trictive on the.
fb450 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 . ** unixFile,
fb460 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 do nothing. Don'
fb470 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f t use the end_lo
fb480 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 ck: exit path, a
fb490 73 0d 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 s.. ** unixEnte
fb4a0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 rMutex() hasn't
fb4b0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e been called yet.
fb4c0 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 .. */.. if( pF
fb4d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d ile->eFileLock>=
fb4e0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d 0a 20 20 eFileLock ){..
fb4f0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b OSTRACE(("LOCK
fb500 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c %d %s ok (al
fb510 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 ready held) (uni
fb520 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c x)\n", pFile->h,
fb530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a .. az
fb540 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f FileLock(eFileLo
fb550 63 6b 29 29 29 3b 0d 0a 20 20 20 20 72 65 74 75 ck)));.. retu
fb560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 rn SQLITE_OK;..
fb570 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4d 61 6b 65 20 }.... /* Make
fb580 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 sure the locking
fb590 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 sequence is cor
fb5a0 72 65 63 74 2e 0d 0a 20 20 2a 2a 20 20 28 31 29 rect... ** (1)
fb5b0 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 We never move f
fb5c0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 rom unlocked to
fb5d0 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 anything higher
fb5e0 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b than shared lock
fb5f0 2e 0d 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c ... ** (2) SQL
fb600 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 ite never explic
fb610 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 itly requests a
fb620 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0d 0a 20 20 pendig lock...
fb630 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 ** (3) A shared
fb640 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 lock is always
fb650 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 held when a rese
fb660 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 rve lock is requ
fb670 65 73 74 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 ested... */..
fb680 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 assert( pFile->e
fb690 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 FileLock!=NO_LOC
fb6a0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d K || eFileLock==
fb6b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a SHARED_LOCK );..
fb6c0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c assert( eFileL
fb6d0 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 ock!=PENDING_LOC
fb6e0 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 K );.. assert(
fb6f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 eFileLock!=RESER
fb700 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c VED_LOCK || pFil
fb710 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 e->eFileLock==SH
fb720 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a ARED_LOCK );....
fb730 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 /* This mutex
fb740 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 is needed becaus
fb750 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 e pFile->pInode
fb760 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 is shared across
fb770 20 74 68 72 65 61 64 73 0d 0a 20 20 2a 2f 0d 0a threads.. */..
fb780 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 unixEnterMutex
fb790 28 29 3b 0d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 ();.. pInode =
fb7a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0d 0a pFile->pInode;..
fb7b0 0d 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 .. /* If some t
fb7c0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 hread using this
fb7d0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 PID has a lock
fb7e0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 via a different
fb7f0 75 6e 69 78 46 69 6c 65 2a 0d 0a 20 20 2a 2a 20 unixFile*.. **
fb800 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 handle that prec
fb810 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 ludes the reques
fb820 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e ted lock, return
fb830 20 42 55 53 59 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 BUSY... */..
fb840 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c if( (pFile->eFil
fb850 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 eLock!=pInode->e
fb860 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0d 0a 20 20 FileLock && ..
fb870 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d (pInode-
fb880 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 >eFileLock>=PEND
fb890 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c ING_LOCK || eFil
fb8a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 eLock>SHARED_LOC
fb8b0 4b 29 29 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 K)).. ){.. r
fb8c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b c = SQLITE_BUSY;
fb8d0 0d 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c .. goto end_l
fb8e0 6f 63 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f ock;.. }.... /
fb8f0 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f * If a SHARED lo
fb900 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c ck is requested,
fb910 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 and some thread
fb920 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 using this PID
fb930 61 6c 72 65 61 64 79 0d 0a 20 20 2a 2a 20 68 61 already.. ** ha
fb940 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 s a SHARED or RE
fb950 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 SERVED lock, the
fb960 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 n increment refe
fb970 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 rence counts and
fb980 0d 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 .. ** return SQ
fb990 4c 49 54 45 5f 4f 4b 2e 0d 0a 20 20 2a 2f 0d 0a LITE_OK... */..
fb9a0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d if( eFileLock=
fb9b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 =SHARED_LOCK &&
fb9c0 0d 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d .. (pInode-
fb9d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 >eFileLock==SHAR
fb9e0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 ED_LOCK || pInod
fb9f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 e->eFileLock==RE
fba00 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0d SERVED_LOCK) ){.
fba10 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 . assert( eFi
fba20 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c leLock==SHARED_L
fba30 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 OCK );.. asse
fba40 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 rt( pFile->eFile
fba50 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 Lock==0 );..
fba60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e assert( pInode->
fba70 6e 53 68 61 72 65 64 3e 30 20 29 3b 0d 0a 20 20 nShared>0 );..
fba80 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f pFile->eFileLo
fba90 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b ck = SHARED_LOCK
fbaa0 3b 0d 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e ;.. pInode->n
fbab0 53 68 61 72 65 64 2b 2b 3b 0d 0a 20 20 20 20 70 Shared++;.. p
fbac0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0d Inode->nLock++;.
fbad0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f . goto end_lo
fbae0 63 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 ck;.. }......
fbaf0 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 /* A PENDING loc
fbb00 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f k is needed befo
fbb10 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 re acquiring a S
fbb20 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 HARED lock and b
fbb30 65 66 6f 72 65 0d 0a 20 20 2a 2a 20 61 63 71 75 efore.. ** acqu
fbb40 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 iring an EXCLUSI
fbb50 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 VE lock. For th
fbb60 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 e SHARED lock, t
fbb70 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0d he PENDING will.
fbb80 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 . ** be release
fbb90 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 6c 6f 63 6b d... */.. lock
fbba0 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0d 0a 20 20 .l_len = 1L;..
fbbb0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 lock.l_whence =
fbbc0 53 45 45 4b 5f 53 45 54 3b 0d 0a 20 20 69 66 28 SEEK_SET;.. if(
fbbd0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 eFileLock==SHAR
fbbe0 45 44 5f 4c 4f 43 4b 20 0d 0a 20 20 20 20 20 20 ED_LOCK ..
fbbf0 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 || (eFileLock==E
fbc00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 XCLUSIVE_LOCK &&
fbc10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
fbc20 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0d k<PENDING_LOCK).
fbc30 0a 20 20 29 7b 0d 0a 20 20 20 20 6c 6f 63 6b 2e . ){.. lock.
fbc40 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c l_type = (eFileL
fbc50 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b ock==SHARED_LOCK
fbc60 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b ?F_RDLCK:F_WRLCK
fbc70 29 3b 0d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 );.. lock.l_s
fbc80 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 tart = PENDING_B
fbc90 59 54 45 3b 0d 0a 20 20 20 20 69 66 28 20 75 6e YTE;.. if( un
fbca0 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 ixFileLock(pFile
fbcb0 2c 20 26 6c 6f 63 6b 29 20 29 7b 0d 0a 20 20 20 , &lock) ){..
fbcc0 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e tErrno = errn
fbcd0 6f 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 o;.. rc = s
fbce0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f qliteErrorFromPo
fbcf0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c sixError(tErrno,
fbd00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f SQLITE_IOERR_LO
fbd10 43 4b 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 CK);.. if(
fbd20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc!=SQLITE_BUSY
fbd30 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c ){.. pFil
fbd40 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 e->lastErrno = t
fbd50 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 7d 0d Errno;.. }.
fbd60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f . goto end_
fbd70 6c 6f 63 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 lock;.. }..
fbd80 7d 0d 0a 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 63 }...... /* If c
fbd90 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 ontrol gets to t
fbda0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 his point, then
fbdb0 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 actually go ahea
fbdc0 64 20 61 6e 64 20 6d 61 6b 65 0d 0a 20 20 2a 2a d and make.. **
fbdd0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 operating syste
fbde0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 m calls for the
fbdf0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0d specified lock..
fbe00 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 65 46 69 . */.. if( eFi
fbe10 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c leLock==SHARED_L
fbe20 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 OCK ){.. asse
fbe30 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 rt( pInode->nSha
fbe40 72 65 64 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 61 red==0 );.. a
fbe50 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 ssert( pInode->e
fbe60 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a FileLock==0 );..
fbe70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d assert( rc==
fbe80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 0d 0a SQLITE_OK );....
fbe90 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 /* Now get t
fbea0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0d he read-lock */.
fbeb0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 . lock.l_star
fbec0 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 t = SHARED_FIRST
fbed0 3b 0d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 ;.. lock.l_le
fbee0 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b n = SHARED_SIZE;
fbef0 0d 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 .. if( unixFi
fbf00 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c leLock(pFile, &l
fbf10 6f 63 6b 29 20 29 7b 0d 0a 20 20 20 20 20 20 74 ock) ){.. t
fbf20 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a Errno = errno;..
fbf30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
fbf40 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 eErrorFromPosixE
fbf50 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c rror(tErrno, SQL
fbf60 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b ITE_IOERR_LOCK);
fbf70 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f .. }.... /
fbf80 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f * Drop the tempo
fbf90 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 rary PENDING loc
fbfa0 6b 20 2a 2f 0d 0a 20 20 20 20 6c 6f 63 6b 2e 6c k */.. lock.l
fbfb0 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 _start = PENDING
fbfc0 5f 42 59 54 45 3b 0d 0a 20 20 20 20 6c 6f 63 6b _BYTE;.. lock
fbfd0 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0d 0a 20 20 .l_len = 1L;..
fbfe0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 lock.l_type =
fbff0 46 5f 55 4e 4c 43 4b 3b 0d 0a 20 20 20 20 69 66 F_UNLCK;.. if
fc000 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 ( unixFileLock(p
fc010 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 File, &lock) &&
fc020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
fc030 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 .. /* This
fc040 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 could happen wit
fc050 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e h a network moun
fc060 74 20 2a 2f 0d 0a 20 20 20 20 20 20 74 45 72 72 t */.. tErr
fc070 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 no = errno;..
fc080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
fc090 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0d 0a 20 OERR_UNLOCK; ..
fc0a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 }.... if(
fc0b0 72 63 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 rc ){.. if(
fc0c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 rc!=SQLITE_BUSY
fc0d0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 46 69 ){.. pFi
fc0e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
fc0f0 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 7d tErrno;.. }
fc100 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 .. goto end
fc110 5f 6c 6f 63 6b 3b 0d 0a 20 20 20 20 7d 65 6c 73 _lock;.. }els
fc120 65 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d e{.. pFile-
fc130 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 >eFileLock = SHA
fc140 52 45 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 RED_LOCK;..
fc150 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b pInode->nLock++
fc160 3b 0d 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d ;.. pInode-
fc170 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0d 0a 20 >nShared = 1;..
fc180 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 20 69 66 }.. }else if
fc190 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 ( eFileLock==EXC
fc1a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 LUSIVE_LOCK && p
fc1b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 Inode->nShared>1
fc1c0 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 57 65 20 61 ){.. /* We a
fc1d0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e re trying for an
fc1e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 exclusive lock
fc1f0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 but another thre
fc200 61 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 ad in this..
fc210 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 ** same process
fc220 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 is still holding
fc230 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 a shared lock.
fc240 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c */.. rc = SQL
fc250 49 54 45 5f 42 55 53 59 3b 0d 0a 20 20 7d 65 6c ITE_BUSY;.. }el
fc260 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 se{.. /* The
fc270 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 request was for
fc280 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 a RESERVED or EX
fc290 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 CLUSIVE lock. I
fc2a0 74 20 69 73 0d 0a 20 20 20 20 2a 2a 20 61 73 73 t is.. ** ass
fc2b0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 umed that there
fc2c0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 is a SHARED or g
fc2d0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 reater lock on t
fc2e0 68 65 20 66 69 6c 65 0d 0a 20 20 20 20 2a 2a 20 he file.. **
fc2f0 61 6c 72 65 61 64 79 2e 0d 0a 20 20 20 20 2a 2f already... */
fc300 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 .. assert( 0!
fc310 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 =pFile->eFileLoc
fc320 6b 20 29 3b 0d 0a 20 20 20 20 6c 6f 63 6b 2e 6c k );.. lock.l
fc330 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b _type = F_WRLCK;
fc340 0d 0a 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 .... assert(
fc350 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 eFileLock==RESER
fc360 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c VED_LOCK || eFil
fc370 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 eLock==EXCLUSIVE
fc380 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 69 66 _LOCK );.. if
fc390 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 ( eFileLock==RES
fc3a0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 ERVED_LOCK ){..
fc3b0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 lock.l_star
fc3c0 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 t = RESERVED_BYT
fc3d0 45 3b 0d 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c E;.. lock.l
fc3e0 5f 6c 65 6e 20 3d 20 31 4c 3b 0d 0a 20 20 20 20 _len = 1L;..
fc3f0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6c 6f }else{.. lo
fc400 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 ck.l_start = SHA
fc410 52 45 44 5f 46 49 52 53 54 3b 0d 0a 20 20 20 20 RED_FIRST;..
fc420 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 lock.l_len = S
fc430 48 41 52 45 44 5f 53 49 5a 45 3b 0d 0a 20 20 20 HARED_SIZE;..
fc440 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 75 6e }.... if( un
fc450 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 ixFileLock(pFile
fc460 2c 20 26 6c 6f 63 6b 29 20 29 7b 0d 0a 20 20 20 , &lock) ){..
fc470 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e tErrno = errn
fc480 6f 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 o;.. rc = s
fc490 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f qliteErrorFromPo
fc4a0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c sixError(tErrno,
fc4b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f SQLITE_IOERR_LO
fc4c0 43 4b 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 CK);.. if(
fc4d0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc!=SQLITE_BUSY
fc4e0 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c ){.. pFil
fc4f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 e->lastErrno = t
fc500 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 7d 0d Errno;.. }.
fc510 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d . }.. }.. .
fc520 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 ...#ifndef NDEBU
fc530 47 0d 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 G.. /* Set up t
fc540 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 he transaction-c
fc550 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 ounter change ch
fc560 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 ecking flags whe
fc570 6e 0d 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 n.. ** transiti
fc580 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 oning from a SHA
fc590 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 RED to a RESERVE
fc5a0 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 D lock. The cha
fc5b0 6e 67 65 0d 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 nge.. ** from S
fc5c0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 HARED to RESERVE
fc5d0 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 D marks the begi
fc5e0 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 nning of a norma
fc5f0 6c 0d 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 l.. ** write op
fc600 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 eration (not a h
fc610 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 ot journal rollb
fc620 61 63 6b 29 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 ack)... */.. i
fc630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
fc640 0d 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 .. && pFile->e
fc650 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 FileLock<=SHARED
fc660 5f 4c 4f 43 4b 0d 0a 20 20 20 26 26 20 65 46 69 _LOCK.. && eFi
fc670 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 leLock==RESERVED
fc680 5f 4c 4f 43 4b 0d 0a 20 20 29 7b 0d 0a 20 20 20 _LOCK.. ){..
fc690 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 pFile->transCnt
fc6a0 72 43 68 6e 67 20 3d 20 30 3b 0d 0a 20 20 20 20 rChng = 0;..
fc6b0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 pFile->dbUpdate
fc6c0 3d 20 30 3b 0d 0a 20 20 20 20 70 46 69 6c 65 2d = 0;.. pFile-
fc6d0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d >inNormalWrite =
fc6e0 20 31 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 1;.. }..#endif
fc6f0 0d 0a 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d ...... if( rc==
fc700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
fc710 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f pFile->eFileLo
fc720 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0d ck = eFileLock;.
fc730 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 . pInode->eFi
fc740 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f leLock = eFileLo
fc750 63 6b 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 ck;.. }else if(
fc760 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c eFileLock==EXCL
fc770 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 USIVE_LOCK ){..
fc780 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c pFile->eFileL
fc790 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f ock = PENDING_LO
fc7a0 43 4b 3b 0d 0a 20 20 20 20 70 49 6e 6f 64 65 2d CK;.. pInode-
fc7b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e >eFileLock = PEN
fc7c0 44 49 4e 47 5f 4c 4f 43 4b 3b 0d 0a 20 20 7d 0d DING_LOCK;.. }.
fc7d0 0a 0d 0a 65 6e 64 5f 6c 6f 63 6b 3a 0d 0a 20 20 ...end_lock:..
fc7e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 unixLeaveMutex()
fc7f0 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c ;.. OSTRACE(("L
fc800 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 OCK %d %s %s
fc810 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 (unix)\n", pFile
fc820 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 ->h, azFileLock(
fc830 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0d 0a 20 20 eFileLock), ..
fc840 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f rc==SQLITE_O
fc850 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c K ? "ok" : "fail
fc860 65 64 22 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e ed"));.. return
fc870 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc;..}..../*..*
fc880 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 * Add the file d
fc890 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 escriptor used b
fc8a0 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 y file handle pF
fc8b0 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 ile to the corre
fc8c0 73 70 6f 6e 64 69 6e 67 0d 0a 2a 2a 20 70 55 6e sponding..** pUn
fc8d0 75 73 65 64 20 6c 69 73 74 2e 0d 0a 2a 2f 0d 0a used list...*/..
fc8e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 static void setP
fc8f0 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c endingFd(unixFil
fc900 65 20 2a 70 46 69 6c 65 29 7b 0d 0a 20 20 75 6e e *pFile){.. un
fc910 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e ixInodeInfo *pIn
fc920 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e ode = pFile->pIn
fc930 6f 64 65 3b 0d 0a 20 20 55 6e 69 78 55 6e 75 73 ode;.. UnixUnus
fc940 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d edFd *p = pFile-
fc950 3e 70 55 6e 75 73 65 64 3b 0d 0a 20 20 70 2d 3e >pUnused;.. p->
fc960 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e pNext = pInode->
fc970 70 55 6e 75 73 65 64 3b 0d 0a 20 20 70 49 6e 6f pUnused;.. pIno
fc980 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b de->pUnused = p;
fc990 0d 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d .. pFile->h = -
fc9a0 31 3b 0d 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 1;.. pFile->pUn
fc9b0 75 73 65 64 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a used = 0;..}....
fc9c0 2f 2a 0d 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 /*..** Lower the
fc9d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f locking level o
fc9e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f n file descripto
fc9f0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 r pFile to eFile
fca00 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b Lock. eFileLock
fca10 0d 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 ..** must be eit
fca20 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 her NO_LOCK or S
fca30 48 41 52 45 44 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d HARED_LOCK...**.
fca40 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 .** If the locki
fca50 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 ng level of the
fca60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 file descriptor
fca70 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 is already at or
fca80 20 62 65 6c 6f 77 0d 0a 2a 2a 20 74 68 65 20 72 below..** the r
fca90 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 equested locking
fcaa0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 level, this rou
fcab0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e tine is a no-op.
fcac0 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66 20 68 61 6e ..** ..** If han
fcad0 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 dleNFSUnlock is
fcae0 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f true, then on do
fcaf0 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 wngrading an EXC
fcb00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 LUSIVE_LOCK to S
fcb10 48 41 52 45 44 0d 0a 2a 2a 20 74 68 65 20 62 79 HARED..** the by
fcb20 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 te range is divi
fcb30 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 ded into 2 parts
fcb40 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 and the first p
fcb50 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 art is unlocked
fcb60 74 68 65 6e 0d 0a 2a 2a 20 73 65 74 20 74 6f 20 then..** set to
fcb70 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 a read lock, the
fcb80 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 n the other part
fcb90 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 is simply unloc
fcba0 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 ked. This works
fcbb0 20 0d 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 ..** around a b
fcbc0 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f ug in BSD NFS lo
fcbd0 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f ckd (also seen o
fcbe0 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 n MacOSX 10.3+)
fcbf0 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0d 0a that fails to ..
fcc00 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 ** remove the wr
fcc10 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 ite lock on a re
fcc20 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 gion when a read
fcc30 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0d 0a 2a lock is set...*
fcc40 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f /..static int po
fcc50 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 sixUnlock(sqlite
fcc60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
fcc70 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 eFileLock, int h
fcc80 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b andleNFSUnlock){
fcc90 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 .. unixFile *pF
fcca0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a ile = (unixFile*
fccb0 29 69 64 3b 0d 0a 20 20 75 6e 69 78 49 6e 6f 64 )id;.. unixInod
fccc0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0d 0a eInfo *pInode;..
fccd0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c struct flock l
fcce0 6f 63 6b 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d ock;.. int rc =
fccf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 SQLITE_OK;....
fcd00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 assert( pFile )
fcd10 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 ;.. OSTRACE(("U
fcd20 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 NLOCK %d %d was
fcd30 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 %d(%d,%d) pid=%
fcd40 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 d (unix)\n", pFi
fcd50 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b le->h, eFileLock
fcd60 2c 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e ,.. pFile->
fcd70 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 eFileLock, pFile
fcd80 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c ->pInode->eFileL
fcd90 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f ock, pFile->pIno
fcda0 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0d 0a 20 20 de->nShared,..
fcdb0 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0d getpid()));.
fcdc0 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 ... assert( eFi
fcdd0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c leLock<=SHARED_L
fcde0 4f 43 4b 20 29 3b 0d 0a 20 20 69 66 28 20 70 46 OCK );.. if( pF
fcdf0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d ile->eFileLock<=
fce00 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d 0a 20 20 eFileLock ){..
fce10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
fce20 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 75 6e 69 78 OK;.. }.. unix
fce30 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 EnterMutex();..
fce40 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d pInode = pFile-
fce50 3e 70 49 6e 6f 64 65 3b 0d 0a 20 20 61 73 73 65 >pInode;.. asse
fce60 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 rt( pInode->nSha
fce70 72 65 64 21 3d 30 20 29 3b 0d 0a 20 20 69 66 28 red!=0 );.. if(
fce80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
fce90 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b k>SHARED_LOCK ){
fcea0 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 .. assert( pI
fceb0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d node->eFileLock=
fcec0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 =pFile->eFileLoc
fced0 6b 20 29 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 k );....#ifndef
fcee0 4e 44 45 42 55 47 0d 0a 20 20 20 20 2f 2a 20 57 NDEBUG.. /* W
fcef0 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c hen reducing a l
fcf00 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 ock such that ot
fcf10 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 her processes ca
fcf20 6e 20 73 74 61 72 74 0d 0a 20 20 20 20 2a 2a 20 n start.. **
fcf30 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 reading the data
fcf40 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c base file again,
fcf50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
fcf60 74 68 65 0d 0a 20 20 20 20 2a 2a 20 74 72 61 6e the.. ** tran
fcf70 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 saction counter
fcf80 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 was updated if a
fcf90 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 ny part of the d
fcfa0 61 74 61 62 61 73 65 0d 0a 20 20 20 20 2a 2a 20 atabase.. **
fcfb0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 file changed. I
fcfc0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f f the transactio
fcfd0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 n counter is not
fcfe0 20 75 70 64 61 74 65 64 2c 0d 0a 20 20 20 20 2a updated,.. *
fcff0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 * other connecti
fd000 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 ons to the same
fd010 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 file might not r
fd020 65 61 6c 69 7a 65 20 74 68 61 74 0d 0a 20 20 20 ealize that..
fd030 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 ** the file has
fd040 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e changed and hen
fd050 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f ce might not kno
fd060 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 w to flush their
fd070 0d 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 .. ** cache.
fd080 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 The use of a st
fd090 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 ale cache can le
fd0a0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 ad to database c
fd0b0 6f 72 72 75 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 orruption...
fd0c0 2a 2f 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 */.. pFile->i
fd0d0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 nNormalWrite = 0
fd0e0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 ;..#endif....
fd0f0 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 /* downgrading
fd100 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b to a shared lock
fd110 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 on NFS involves
fd120 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 clearing the wr
fd130 69 74 65 20 6c 6f 63 6b 0d 0a 20 20 20 20 2a 2a ite lock.. **
fd140 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 before establis
fd150 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 hing the readloc
fd160 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 k - to avoid a r
fd170 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 ace condition we
fd180 20 64 6f 77 6e 67 72 61 64 65 0d 0a 20 20 20 20 downgrade..
fd190 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 ** the lock in 2
fd1a0 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 blocks, so that
fd1b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e part of the ran
fd1c0 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 ge will be cover
fd1d0 65 64 20 62 79 20 61 20 0d 0a 20 20 20 20 2a 2a ed by a .. **
fd1e0 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 write lock unti
fd1f0 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f l the rest is co
fd200 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 vered by a read
fd210 6c 6f 63 6b 3a 0d 0a 20 20 20 20 2a 2a 20 20 31 lock:.. ** 1
fd220 3a 20 20 20 5b 57 57 57 57 57 5d 0d 0a 20 20 20 : [WWWWW]..
fd230 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 ** 2: [....W
fd240 5d 0d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 ].. ** 3:
fd250 5b 52 52 52 52 57 5d 0d 0a 20 20 20 20 2a 2a 20 [RRRRW].. **
fd260 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0d 0a 20 4: [RRRR.]..
fd270 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 65 */.. if( e
fd280 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 FileLock==SHARED
fd290 5f 4c 4f 43 4b 20 29 7b 0d 0a 0d 0a 23 69 66 20 _LOCK ){....#if
fd2a0 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 !defined(__APPLE
fd2b0 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 __) || !SQLITE_E
fd2c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 NABLE_LOCKING_ST
fd2d0 59 4c 45 0d 0a 20 20 20 20 20 20 28 76 6f 69 64 YLE.. (void
fd2e0 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b )handleNFSUnlock
fd2f0 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ;.. assert(
fd300 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b handleNFSUnlock
fd310 3d 3d 30 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a ==0 );..#endif..
fd320 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 #if defined(__AP
fd330 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 PLE__) && SQLITE
fd340 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f _ENABLE_LOCKING_
fd350 53 54 59 4c 45 0d 0a 20 20 20 20 20 20 69 66 28 STYLE.. if(
fd360 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b handleNFSUnlock
fd370 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 ){.. int
fd380 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 tErrno;
fd390 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 /* Error
fd3a0 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d code from system
fd3b0 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0d call errors */.
fd3c0 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 . off_t d
fd3d0 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f ivSize = SHARED_
fd3e0 53 49 5a 45 20 2d 20 31 3b 0d 0a 20 20 20 20 20 SIZE - 1;..
fd3f0 20 20 20 0d 0a 20 20 20 20 20 20 20 20 6c 6f 63 .. loc
fd400 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c k.l_type = F_UNL
fd410 43 4b 3b 0d 0a 20 20 20 20 20 20 20 20 6c 6f 63 CK;.. loc
fd420 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 k.l_whence = SEE
fd430 4b 5f 53 45 54 3b 0d 0a 20 20 20 20 20 20 20 20 K_SET;..
fd440 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 lock.l_start = S
fd450 48 41 52 45 44 5f 46 49 52 53 54 3b 0d 0a 20 20 HARED_FIRST;..
fd460 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e lock.l_len
fd470 20 3d 20 64 69 76 53 69 7a 65 3b 0d 0a 20 20 20 = divSize;..
fd480 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c if( unixFil
fd490 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f eLock(pFile, &lo
fd4a0 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0d 0a 20 20 ck)==(-1) ){..
fd4b0 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d tErrno =
fd4c0 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 errno;..
fd4d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
fd4e0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0d 0a 20 20 OERR_UNLOCK;..
fd4f0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c if( IS_L
fd500 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b OCK_ERROR(rc) ){
fd510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 .. pF
fd520 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d ile->lastErrno =
fd530 20 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 tErrno;..
fd540 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 }..
fd550 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b goto end_unlock
fd560 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
fd570 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 lock.l_typ
fd580 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0d 0a 20 20 e = F_RDLCK;..
fd590 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 lock.l_whe
fd5a0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0d nce = SEEK_SET;.
fd5b0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f . lock.l_
fd5c0 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 start = SHARED_F
fd5d0 49 52 53 54 3b 0d 0a 20 20 20 20 20 20 20 20 6c IRST;.. l
fd5e0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 ock.l_len = divS
fd5f0 69 7a 65 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 ize;.. if
fd600 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 ( unixFileLock(p
fd610 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d File, &lock)==(-
fd620 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 1) ){..
fd630 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b tErrno = errno;
fd640 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d .. rc =
fd650 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d sqliteErrorFrom
fd660 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e PosixError(tErrn
fd670 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f o, SQLITE_IOERR_
fd680 52 44 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 20 20 RDLOCK);..
fd690 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f if( IS_LOCK_
fd6a0 45 52 52 4f 52 28 72 63 29 20 29 7b 0d 0a 20 20 ERROR(rc) ){..
fd6b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d pFile-
fd6c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 >lastErrno = tEr
fd6d0 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 rno;..
fd6e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 }.. got
fd6f0 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0d 0a 20 o end_unlock;..
fd700 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
fd710 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 lock.l_type =
fd720 46 5f 55 4e 4c 43 4b 3b 0d 0a 20 20 20 20 20 20 F_UNLCK;..
fd730 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 lock.l_whence
fd740 3d 20 53 45 45 4b 5f 53 45 54 3b 0d 0a 20 20 20 = SEEK_SET;..
fd750 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 lock.l_star
fd760 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 t = SHARED_FIRST
fd770 2b 64 69 76 53 69 7a 65 3b 0d 0a 20 20 20 20 20 +divSize;..
fd780 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 lock.l_len =
fd790 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 SHARED_SIZE-divS
fd7a0 69 7a 65 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 ize;.. if
fd7b0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 ( unixFileLock(p
fd7c0 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d File, &lock)==(-
fd7d0 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 1) ){..
fd7e0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b tErrno = errno;
fd7f0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d .. rc =
fd800 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e SQLITE_IOERR_UN
fd810 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 20 20 20 20 LOCK;..
fd820 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 if( IS_LOCK_ERR
fd830 4f 52 28 72 63 29 20 29 7b 0d 0a 20 20 20 20 20 OR(rc) ){..
fd840 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 pFile->la
fd850 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f stErrno = tErrno
fd860 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a ;.. }..
fd870 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 goto e
fd880 6e 64 5f 75 6e 6c 6f 63 6b 3b 0d 0a 20 20 20 20 nd_unlock;..
fd890 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c }.. }el
fd8a0 73 65 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 se..#endif /* de
fd8b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 fined(__APPLE__)
fd8c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c && SQLITE_ENABL
fd8d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 E_LOCKING_STYLE
fd8e0 2a 2f 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 */.. {..
fd8f0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 lock.l_type
fd900 20 3d 20 46 5f 52 44 4c 43 4b 3b 0d 0a 20 20 20 = F_RDLCK;..
fd910 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e lock.l_when
fd920 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0d 0a ce = SEEK_SET;..
fd930 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 lock.l_s
fd940 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 tart = SHARED_FI
fd950 52 53 54 3b 0d 0a 20 20 20 20 20 20 20 20 6c 6f RST;.. lo
fd960 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 ck.l_len = SHARE
fd970 44 5f 53 49 5a 45 3b 0d 0a 20 20 20 20 20 20 20 D_SIZE;..
fd980 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 if( unixFileLoc
fd990 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 k(pFile, &lock)
fd9a0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a ){.. /*
fd9b0 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 In theory, the
fd9c0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 call to unixFile
fd9d0 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 Lock() cannot fa
fd9e0 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 il because anoth
fd9f0 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a er.. **
fda00 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 process is hold
fda10 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 ing an incompati
fda20 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 ble lock. If it
fda30 64 6f 65 73 2c 20 74 68 69 73 20 0d 0a 20 20 20 does, this ..
fda40 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 ** indica
fda50 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 tes that the oth
fda60 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f er process is no
fda70 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 t following the
fda80 6c 6f 63 6b 69 6e 67 0d 0a 20 20 20 20 20 20 20 locking..
fda90 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 ** protocol.
fdaa0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c If this happens,
fdab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
fdac0 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 OERR_RDLOCK. Ret
fdad0 75 72 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 urning..
fdae0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 ** SQLITE_BUSY
fdaf0 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 would confuse t
fdb00 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 he upper layer (
fdb10 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 in practice it c
fdb20 61 75 73 65 73 20 0d 0a 20 20 20 20 20 20 20 20 auses ..
fdb30 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 ** an assert t
fdb40 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0d 0a 20 20 o fail). */ ..
fdb50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c rc = SQL
fdb60 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b ITE_IOERR_RDLOCK
fdb70 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 ;.. pFi
fdb80 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
fdb90 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 20 errno;..
fdba0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 goto end_unloc
fdbb0 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 k;.. }..
fdbc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
fdbd0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d lock.l_type =
fdbe0 20 46 5f 55 4e 4c 43 4b 3b 0d 0a 20 20 20 20 6c F_UNLCK;.. l
fdbf0 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 ock.l_whence = S
fdc00 45 45 4b 5f 53 45 54 3b 0d 0a 20 20 20 20 6c 6f EEK_SET;.. lo
fdc10 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e ck.l_start = PEN
fdc20 44 49 4e 47 5f 42 59 54 45 3b 0d 0a 20 20 20 20 DING_BYTE;..
fdc30 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b lock.l_len = 2L;
fdc40 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e assert( PENDIN
fdc50 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 G_BYTE+1==RESERV
fdc60 45 44 5f 42 59 54 45 20 29 3b 0d 0a 20 20 20 20 ED_BYTE );..
fdc70 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b if( unixFileLock
fdc80 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d (pFile, &lock)==
fdc90 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 49 6e 6f 0 ){.. pIno
fdca0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 de->eFileLock =
fdcb0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 SHARED_LOCK;..
fdcc0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
fdcd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 rc = SQLITE_IOER
fdce0 52 5f 55 4e 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 R_UNLOCK;..
fdcf0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
fdd00 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 o = errno;..
fdd10 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 goto end_unloc
fdd20 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a k;.. }.. }..
fdd30 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d if( eFileLock=
fdd40 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 =NO_LOCK ){..
fdd50 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 /* Decrement th
fdd60 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f e shared lock co
fdd70 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 unter. Release
fdd80 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 the lock using a
fdd90 6e 0d 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c n.. ** OS cal
fdda0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 l only when all
fddb0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 threads in this
fddc0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 same process hav
fddd0 65 20 72 65 6c 65 61 73 65 64 0d 0a 20 20 20 20 e released..
fdde0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0d 0a 20 20 ** the lock...
fddf0 20 20 2a 2f 0d 0a 20 20 20 20 70 49 6e 6f 64 65 */.. pInode
fde00 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0d 0a 20 20 ->nShared--;..
fde10 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 if( pInode->nS
fde20 68 61 72 65 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 hared==0 ){..
fde30 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d lock.l_type =
fde40 20 46 5f 55 4e 4c 43 4b 3b 0d 0a 20 20 20 20 20 F_UNLCK;..
fde50 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d lock.l_whence =
fde60 20 53 45 45 4b 5f 53 45 54 3b 0d 0a 20 20 20 20 SEEK_SET;..
fde70 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d lock.l_start =
fde80 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c lock.l_len = 0L
fde90 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 ;.. if( uni
fdea0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c xFileLock(pFile,
fdeb0 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0d 0a 20 &lock)==0 ){..
fdec0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 pInode->e
fded0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f FileLock = NO_LO
fdee0 43 4b 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 CK;.. }else
fdef0 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {.. rc =
fdf00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c SQLITE_IOERR_UNL
fdf10 4f 43 4b 3b 0d 0a 09 70 46 69 6c 65 2d 3e 6c 61 OCK;...pFile->la
fdf20 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b stErrno = errno;
fdf30 0d 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 .. pInode
fdf40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f ->eFileLock = NO
fdf50 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 20 20 20 _LOCK;..
fdf60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b pFile->eFileLock
fdf70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 = NO_LOCK;..
fdf80 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 }.. }....
fdf90 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 /* Decrement
fdfa0 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 the count of loc
fdfb0 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 ks against this
fdfc0 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e same file. When
fdfd0 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 63 6f 75 the.. ** cou
fdfe0 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c nt reaches zero,
fdff0 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 close any other
fe000 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
fe010 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0d 0a 20 s whose close..
fe020 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 ** was deferr
fe030 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 ed because of ou
fe040 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e tstanding locks.
fe050 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 70 49 .. */.. pI
fe060 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0d 0a node->nLock--;..
fe070 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f assert( pIno
fe080 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0d de->nLock>=0 );.
fe090 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d . if( pInode-
fe0a0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0d 0a 20 20 >nLock==0 ){..
fe0b0 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 closePending
fe0c0 46 64 73 28 70 46 69 6c 65 29 3b 0d 0a 20 20 20 Fds(pFile);..
fe0d0 20 7d 0d 0a 20 20 7d 0d 0a 09 0d 0a 65 6e 64 5f }.. }.....end_
fe0e0 75 6e 6c 6f 63 6b 3a 0d 0a 20 20 75 6e 69 78 4c unlock:.. unixL
fe0f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 20 20 eaveMutex();..
fe100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
fe110 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 K ) pFile->eFile
fe120 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b Lock = eFileLock
fe130 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
fe140 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 77 .}..../*..** Low
fe150 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c er the locking l
fe160 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 evel on file des
fe170 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f criptor pFile to
fe180 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 eFileLock. eFi
fe190 6c 65 4c 6f 63 6b 0d 0a 2a 2a 20 6d 75 73 74 20 leLock..** must
fe1a0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 be either NO_LOC
fe1b0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b K or SHARED_LOCK
fe1c0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
fe1d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f locking level o
fe1e0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 f the file descr
fe1f0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 iptor is already
fe200 20 61 74 20 6f 72 20 62 65 6c 6f 77 0d 0a 2a 2a at or below..**
fe210 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c the requested l
fe220 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 ocking level, th
fe230 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 is routine is a
fe240 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 no-op...*/..stat
fe250 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 ic int unixUnloc
fe260 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a k(sqlite3_file *
fe270 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 id, int eFileLoc
fe280 6b 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 6f k){.. return po
fe290 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 sixUnlock(id, eF
fe2a0 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0d 0a 7d 0d ileLock, 0);..}.
fe2b0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 .../*..** This f
fe2c0 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 unction performs
fe2d0 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 the parts of th
fe2e0 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f e "close file" o
fe2f0 70 65 72 61 74 69 6f 6e 20 0d 0a 2a 2a 20 63 6f peration ..** co
fe300 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b mmon to all lock
fe310 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 ing schemes. It
fe320 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 closes the direc
fe330 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0d 0a 2a tory and file..*
fe340 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 * handles, if th
fe350 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e ey are valid, an
fe360 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 d sets all field
fe370 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c s of the unixFil
fe380 65 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 e..** structure
fe390 74 6f 20 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 74 to 0...**..** It
fe3a0 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 is *not* necess
fe3b0 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ary to hold the
fe3c0 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 mutex when this
fe3d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
fe3e0 64 2c 0d 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 d,..** even on V
fe3f0 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 xWorks. A mutex
fe400 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 will be acquire
fe410 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 d on VxWorks by
fe420 74 68 65 0d 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 the..** vxworksR
fe430 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 eleaseFileId() r
fe440 6f 75 74 69 6e 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 outine...*/..sta
fe450 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 tic int closeUni
fe460 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 xFile(sqlite3_fi
fe470 6c 65 20 2a 69 64 29 7b 0d 0a 20 20 75 6e 69 78 le *id){.. unix
fe480 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 File *pFile = (u
fe490 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 nixFile*)id;..
fe4a0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 if( pFile->h>=0
fe4b0 29 7b 0d 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 ){.. robust_c
fe4c0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c lose(pFile, pFil
fe4d0 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b e->h, __LINE__);
fe4e0 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d .. pFile->h =
fe4f0 20 2d 31 3b 0d 0a 20 20 7d 0d 0a 23 69 66 20 4f -1;.. }..#if O
fe500 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 69 66 28 S_VXWORKS.. if(
fe510 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0d 0a pFile->pId ){..
fe520 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 if( pFile->c
fe530 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 trlFlags & UNIXF
fe540 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0d 0a 20 ILE_DELETE ){..
fe550 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 osUnlink(pF
fe560 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e ile->pId->zCanon
fe570 69 63 61 6c 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 icalName);..
fe580 7d 0d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 }.. vxworksRe
fe590 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c leaseFileId(pFil
fe5a0 65 2d 3e 70 49 64 29 3b 0d 0a 20 20 20 20 70 46 e->pId);.. pF
fe5b0 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0d 0a 20 ile->pId = 0;..
fe5c0 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 4f 53 }..#endif.. OS
fe5d0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 TRACE(("CLOSE
fe5e0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e %-3d\n", pFile->
fe5f0 68 29 29 3b 0d 0a 20 20 4f 70 65 6e 43 6f 75 6e h));.. OpenCoun
fe600 74 65 72 28 2d 31 29 3b 0d 0a 20 20 73 71 6c 69 ter(-1);.. sqli
fe610 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e te3_free(pFile->
fe620 70 55 6e 75 73 65 64 29 3b 0d 0a 20 20 6d 65 6d pUnused);.. mem
fe630 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 set(pFile, 0, si
fe640 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b zeof(unixFile));
fe650 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
fe660 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
fe670 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e ** Close a file.
fe680 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
fe690 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 unixClose(sqlit
fe6a0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0d 0a 20 e3_file *id){..
fe6b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
fe6c0 5f 4f 4b 3b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 _OK;.. unixFile
fe6d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 *pFile = (unixF
fe6e0 69 6c 65 20 2a 29 69 64 3b 0d 0a 20 20 75 6e 69 ile *)id;.. uni
fe6f0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c xUnlock(id, NO_L
fe700 4f 43 4b 29 3b 0d 0a 20 20 75 6e 69 78 45 6e 74 OCK);.. unixEnt
fe710 65 72 4d 75 74 65 78 28 29 3b 0d 0a 0d 0a 20 20 erMutex();....
fe720 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f /* unixFile.pIno
fe730 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c de is always val
fe740 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 id here. Otherwi
fe750 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 se, a different
fe760 63 6c 6f 73 65 0d 0a 20 20 2a 2a 20 72 6f 75 74 close.. ** rout
fe770 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b ine (e.g. nolock
fe780 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 Close()) would b
fe790 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 e called instead
fe7a0 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 ... */.. asser
fe7b0 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 t( pFile->pInode
fe7c0 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 ->nLock>0 || pFi
fe7d0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f le->pInode->bPro
fe7e0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a cessLock==0 );..
fe7f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 if( ALWAYS(pFi
fe800 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 le->pInode) && p
fe810 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c File->pInode->nL
fe820 6f 63 6b 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 ock ){.. /* I
fe830 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 f there are outs
fe840 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 tanding locks, d
fe850 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 o not actually c
fe860 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 lose the file ju
fe870 73 74 0d 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 st.. ** yet b
fe880 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c ecause that woul
fe890 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f d clear those lo
fe8a0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 cks. Instead, a
fe8b0 64 64 20 74 68 65 20 66 69 6c 65 0d 0a 20 20 20 dd the file..
fe8c0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 ** descriptor t
fe8d0 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 o pInode->pUnuse
fe8e0 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c d list. It will
fe8f0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c be automaticall
fe900 79 20 63 6c 6f 73 65 64 20 0d 0a 20 20 20 20 2a y closed .. *
fe910 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 * when the last
fe920 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e lock is cleared.
fe930 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 73 65 .. */.. se
fe940 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 tPendingFd(pFile
fe950 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 6c 65 61 );.. }.. relea
fe960 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c seInodeInfo(pFil
fe970 65 29 3b 0d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 e);.. rc = clos
fe980 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0d 0a eUnixFile(id);..
fe990 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 unixLeaveMutex
fe9a0 28 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 ();.. return rc
fe9b0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a ;..}..../*******
fe9c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 ******* End of t
fe9d0 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 he posix advisor
fe9e0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 y lock implement
fe9f0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ation **********
fea00 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a *******..*******
fea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea50 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a *******/..../***
fea60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
fea90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
feaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a ***********..***
feab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
feac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f *********** No-o
fead0 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a p Locking ******
feae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
feaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
feb00 0d 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 ..** Of the vari
feb10 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c ous locking impl
feb20 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 ementations avai
feb30 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 lable, this is b
feb40 79 20 66 61 72 20 74 68 65 0d 0a 2a 2a 20 73 69 y far the..** si
feb50 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 mplest: locking
feb60 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f is ignored. No
feb70 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 attempt is made
feb80 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 to lock the dat
feb90 61 62 61 73 65 0d 0a 2a 2a 20 66 69 6c 65 20 66 abase..** file f
feba0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 or reading or wr
febb0 69 74 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 iting...**..** T
febc0 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 his locking mode
febd0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 is appropriate
febe0 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d for use on read-
febf0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0d 0a only databases..
fec00 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 ** (ex: database
fec10 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 s that are burne
fec20 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 d into CD-ROM, f
fec30 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 or example.) It
fec40 20 63 61 6e 0d 0a 2a 2a 20 61 6c 73 6f 20 62 65 can..** also be
fec50 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 used if the app
fec60 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 lication employs
fec70 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d some external m
fec80 65 63 68 61 6e 69 73 6d 20 74 6f 0d 0a 2a 2a 20 echanism to..**
fec90 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e prevent simultan
feca0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 eous access of t
fecb0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 he same database
fecc0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0d by two or more.
fecd0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e .** database con
fece0 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 nections. But t
fecf0 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 here is a seriou
fed00 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 s risk of databa
fed10 73 65 0d 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f se..** corruptio
fed20 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e n if this lockin
fed30 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 g mode is used i
fed40 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 n situations whe
fed50 72 65 20 6d 75 6c 74 69 70 6c 65 0d 0a 2a 2a 20 re multiple..**
fed60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
fed70 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 ions are accessi
fed80 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 ng the same data
fed90 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 base file at the
feda0 20 73 61 6d 65 0d 0a 2a 2a 20 74 69 6d 65 20 61 same..** time a
fedb0 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f nd one or more o
fedc0 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 f those connecti
fedd0 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e ons are writing.
fede0 0d 0a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69 ..*/....static i
fedf0 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 nt nolockCheckRe
fee00 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 servedLock(sqlit
fee10 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 e3_file *NotUsed
fee20 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b , int *pResOut){
fee30 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
fee40 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a ETER(NotUsed);..
fee50 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0d *pResOut = 0;.
fee60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
fee70 5f 4f 4b 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 _OK;..}..static
fee80 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 int nolockLock(s
fee90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 qlite3_file *Not
feea0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 Used, int NotUse
feeb0 64 32 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 d2){.. UNUSED_P
feec0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 ARAMETER2(NotUse
feed0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0d 0a 20 d, NotUsed2);..
feee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
feef0 4b 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 69 6e K;..}..static in
fef00 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 t nolockUnlock(s
fef10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 qlite3_file *Not
fef20 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 Used, int NotUse
fef30 64 32 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 d2){.. UNUSED_P
fef40 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 ARAMETER2(NotUse
fef50 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0d 0a 20 d, NotUsed2);..
fef60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
fef70 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 K;..}..../*..**
fef80 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0d Close the file..
fef90 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
fefa0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 nolockClose(sqli
fefb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0d te3_file *id) {.
fefc0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 . return closeU
fefd0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0d 0a 7d 0d nixFile(id);..}.
fefe0 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
feff0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 ******* End of t
ff000 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d he no-op lock im
ff010 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a plementation ***
ff020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff030 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
ff040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff080 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a **/..../********
ff090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff0d0 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a ******..********
ff0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff0f0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 * Begin dot-file
ff100 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a Locking *******
ff110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ff120 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 *******..**..**
ff130 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b The dotfile lock
ff140 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 ing implementati
ff150 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73 on uses the exis
ff160 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 tance of separat
ff170 65 20 6c 6f 63 6b 0d 0a 2a 2a 20 66 69 6c 65 73 e lock..** files
ff180 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 (really a direc
ff190 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c tory) to control
ff1a0 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 access to the d
ff1b0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 atabase. This w
ff1c0 6f 72 6b 73 0d 0a 2a 2a 20 6f 6e 20 6a 75 73 74 orks..** on just
ff1d0 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c about every fil
ff1e0 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 esystem imaginab
ff1f0 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 le. But there a
ff200 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 re serious downs
ff210 69 64 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 ides:..**..**
ff220 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a (1) There is z
ff230 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e ero concurrency.
ff240 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 A single reade
ff250 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 r blocks all oth
ff260 65 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 er..** c
ff270 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 onnections from
ff280 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 reading or writi
ff290 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e ng the database.
ff2a0 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 28 32 29 20 ..**..** (2)
ff2b0 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 An application
ff2c0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c crash or power l
ff2d0 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 oss can leave st
ff2e0 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0d 0a ale lock files..
ff2f0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 ** sitti
ff300 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e ng around that n
ff310 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 eed to be cleare
ff320 64 20 6d 61 6e 75 61 6c 6c 79 2e 0d 0a 2a 2a 0d d manually...**.
ff330 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 .** Nevertheless
ff340 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 , a dotlock is a
ff350 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f n appropriate lo
ff360 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 cking mode for u
ff370 73 65 20 69 66 20 6e 6f 0d 0a 2a 2a 20 6f 74 68 se if no..** oth
ff380 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 er locking strat
ff390 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 egy is available
ff3a0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 44 6f 74 66 69 6c ...**..** Dotfil
ff3b0 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 e locking works
ff3c0 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 by creating a su
ff3d0 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 bdirectory in th
ff3e0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 e same directory
ff3f0 20 61 73 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 as..** the data
ff400 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 base and with th
ff410 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 e same name but
ff420 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 with a ".lock" e
ff430 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0d xtension added..
ff440 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 .** The existanc
ff450 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 e of a lock dire
ff460 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e ctory implies an
ff470 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e EXCLUSIVE lock.
ff480 20 20 41 6c 6c 20 6f 74 68 65 72 0d 0a 2a 2a 20 All other..**
ff490 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 lock types (SHAR
ff4a0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 ED, RESERVED, PE
ff4b0 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 NDING) are mappe
ff4c0 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 d into EXCLUSIVE
ff4d0 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ...*/..../*..**
ff4e0 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 The file suffix
ff4f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 added to the dat
ff500 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 a base filename
ff510 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 in order to crea
ff520 74 65 20 74 68 65 0d 0a 2a 2a 20 6c 6f 63 6b 20 te the..** lock
ff530 64 69 72 65 63 74 6f 72 79 2e 0d 0a 2a 2f 0d 0a directory...*/..
ff540 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f #define DOTLOCK_
ff550 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0d 0a SUFFIX ".lock"..
ff560 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f ../*..** This ro
ff570 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 utine checks if
ff580 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 there is a RESER
ff590 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e VED lock held on
ff5a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0d 0a the specified..
ff5b0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 ** file by this
ff5c0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f or any other pro
ff5d0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 cess. If such a
ff5e0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 lock is held, se
ff5f0 74 20 2a 70 52 65 73 4f 75 74 0d 0a 2a 2a 20 74 t *pResOut..** t
ff600 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c o a non-zero val
ff610 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 ue otherwise *pR
ff620 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 esOut is set to
ff630 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 zero. The retur
ff640 6e 20 76 61 6c 75 65 0d 0a 2a 2a 20 69 73 20 73 n value..** is s
ff650 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 et to SQLITE_OK
ff660 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 unless an I/O er
ff670 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e ror occurs durin
ff680 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e g lock checking.
ff690 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 64 6f 74 66 ..**..** In dotf
ff6a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 ile locking, eit
ff6b0 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 her a lock exist
ff6c0 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 s or it does not
ff6d0 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0d 0a 2a . So in this..*
ff6e0 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 * variation of C
ff6f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b heckReservedLock
ff700 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 (), *pResOut is
ff710 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 set to true if a
ff720 6e 79 20 6c 6f 63 6b 0d 0a 2a 2a 20 69 73 20 68 ny lock..** is h
ff730 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 eld on the file
ff740 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 and false if the
ff750 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 file is unlocke
ff760 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 d...*/..static i
ff770 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 nt dotlockCheckR
ff780 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 eservedLock(sqli
ff790 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e te3_file *id, in
ff7a0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0d 0a 20 t *pResOut) {..
ff7b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
ff7c0 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 20 72 65 73 65 _OK;.. int rese
ff7d0 72 76 65 64 20 3d 20 30 3b 0d 0a 20 20 75 6e 69 rved = 0;.. uni
ff7e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 xFile *pFile = (
ff7f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 0d unixFile*)id;...
ff800 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
ff810 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 or( return SQLIT
ff820 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 E_IOERR_CHECKRES
ff830 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0d 0a 20 ERVEDLOCK; );..
ff840 20 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 .. assert( pFi
ff850 6c 65 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 le );.... /* Ch
ff860 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 eck if a thread
ff870 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 in this process
ff880 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 holds such a loc
ff890 6b 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 69 6c k */.. if( pFil
ff8a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 e->eFileLock>SHA
ff8b0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 RED_LOCK ){..
ff8c0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 /* Either this
ff8d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f connection or so
ff8e0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 me other connect
ff8f0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 ion in the same
ff900 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 2a 2a 20 process.. **
ff910 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 holds a lock on
ff920 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 the file. No ne
ff930 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 ed to check furt
ff940 68 65 72 2e 20 2a 2f 0d 0a 20 20 20 20 72 65 73 her. */.. res
ff950 65 72 76 65 64 20 3d 20 31 3b 0d 0a 20 20 7d 65 erved = 1;.. }e
ff960 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 54 68 65 lse{.. /* The
ff970 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 lock is held if
ff980 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 and only if the
ff990 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 lockfile exists
ff9a0 20 2a 2f 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63 */.. const c
ff9b0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d har *zLockFile =
ff9c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 (const char*)pF
ff9d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 ile->lockingCont
ff9e0 65 78 74 3b 0d 0a 20 20 20 20 72 65 73 65 72 76 ext;.. reserv
ff9f0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c ed = osAccess(zL
ffa00 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0d ockFile, 0)==0;.
ffa10 0a 20 20 7d 0d 0a 20 20 4f 53 54 52 41 43 45 28 . }.. OSTRACE(
ffa20 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 ("TEST WR-LOCK %
ffa30 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b d %d %d (dotlock
ffa40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 )\n", pFile->h,
ffa50 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0d rc, reserved));.
ffa60 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 . *pResOut = re
ffa70 73 65 72 76 65 64 3b 0d 0a 20 20 72 65 74 75 72 served;.. retur
ffa80 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
ffa90 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 ** Lock the file
ffaa0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 with the lock s
ffab0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 pecified by para
ffac0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 meter eFileLock
ffad0 2d 20 6f 6e 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 - one..** of the
ffae0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a 0d following:..**.
ffaf0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 .** (1) SHAR
ffb00 45 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 ED_LOCK..**
ffb10 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 (2) RESERVED_LOC
ffb20 4b 0d 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 K..** (3) PE
ffb30 4e 44 49 4e 47 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 NDING_LOCK..**
ffb40 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 (4) EXCLUSIVE
ffb50 5f 4c 4f 43 4b 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f _LOCK..**..** So
ffb60 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 metimes when req
ffb70 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b uesting one lock
ffb80 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e state, addition
ffb90 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0d 0a al lock states..
ffba0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 ** are inserted
ffbb0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 in between. The
ffbc0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 locking might f
ffbd0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 ail on one of th
ffbe0 65 20 6c 61 74 65 72 0d 0a 2a 2a 20 74 72 61 6e e later..** tran
ffbf0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 sitions leaving
ffc00 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 the lock state d
ffc10 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 ifferent from wh
ffc20 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 at it started bu
ffc30 74 0d 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 t..** still shor
ffc40 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 t of its goal.
ffc50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 The following ch
ffc60 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c art shows the al
ffc70 6c 6f 77 65 64 0d 0a 2a 2a 20 74 72 61 6e 73 69 lowed..** transi
ffc80 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e tions and the in
ffc90 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 serted intermedi
ffca0 61 74 65 20 73 74 61 74 65 73 3a 0d 0a 2a 2a 0d ate states:..**.
ffcb0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 .** UNLOCKED
ffcc0 2d 3e 20 53 48 41 52 45 44 0d 0a 2a 2a 20 20 20 -> SHARED..**
ffcd0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 SHARED -> RESER
ffce0 56 45 44 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 VED..** SHARE
ffcf0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d D -> (PENDING) -
ffd00 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 > EXCLUSIVE..**
ffd10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 RESERVED -> (
ffd20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c PENDING) -> EXCL
ffd30 55 53 49 56 45 0d 0a 2a 2a 20 20 20 20 50 45 4e USIVE..** PEN
ffd40 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 DING -> EXCLUSIV
ffd50 45 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 E..**..** This r
ffd60 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 outine will only
ffd70 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b increase a lock
ffd80 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 . Use the sqlit
ffd90 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0d 0a 2a 2a e3OsUnlock()..**
ffda0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 routine to lowe
ffdb0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 r a locking leve
ffdc0 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 69 74 68 20 l...**..** With
ffdd0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c dotfile locking,
ffde0 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 we really only
ffdf0 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 support state (4
ffe00 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0d 0a 2a ): EXCLUSIVE...*
ffe10 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 * But we track t
ffe20 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 he other locking
ffe30 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c levels internal
ffe40 6c 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ly...*/..static
ffe50 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 int dotlockLock(
ffe60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
ffe70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 , int eFileLock)
ffe80 20 7b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a {.. unixFile *
ffe90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c pFile = (unixFil
ffea0 65 2a 29 69 64 3b 0d 0a 20 20 63 68 61 72 20 2a e*)id;.. char *
ffeb0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 zLockFile = (cha
ffec0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 r *)pFile->locki
ffed0 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 69 6e ngContext;.. in
ffee0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
ffef0 3b 0d 0a 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 77 ;...... /* If w
fff00 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c e have any lock,
fff10 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 then the lock f
fff20 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 ile already exis
fff30 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 ts. All we have
fff40 0d 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 .. ** to do is
fff50 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 adjust our inter
fff60 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 nal record of th
fff70 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0d 0a 20 e lock level...
fff80 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 */.. if( pFile
fff90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f ->eFileLock > NO
fffa0 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 70 46 _LOCK ){.. pF
fffb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d ile->eFileLock =
fffc0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 eFileLock;..
fffd0 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 /* Always updat
fffe0 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 e the timestamp
ffff0 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 on the old file
10000 2a 2f 0d 0a 23 69 66 64 65 66 20 48 41 56 45 5f */..#ifdef HAVE_
10001 55 54 49 4d 45 0d 0a 20 20 20 20 75 74 69 6d 65 UTIME.. utime
10002 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c (zLockFile, NULL
10003 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 75 );..#else.. u
10004 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c times(zLockFile,
10005 20 4e 55 4c 4c 29 3b 0d 0a 23 65 6e 64 69 66 0d NULL);..#endif.
10006 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
10007 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 0d TE_OK;.. }.. .
10008 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 . /* grab an ex
10009 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0d clusive lock */.
1000a 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 . rc = osMkdir(
1000b 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 zLockFile, 0777)
1000c 3b 0d 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b ;.. if( rc<0 ){
1000d 0d 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 .. /* failed
1000e 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 to open/create t
1000f 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 he lock director
10010 79 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 74 45 y */.. int tE
10011 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 rrno = errno;..
10012 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d if( EEXIST ==
10013 20 74 45 72 72 6e 6f 20 29 7b 0d 0a 20 20 20 20 tErrno ){..
10014 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 rc = SQLITE_BU
10015 53 59 3b 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 SY;.. } else
10016 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 {.. rc = sq
10017 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 liteErrorFromPos
10018 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 ixError(tErrno,
10019 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 SQLITE_IOERR_LOC
1001a 4b 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 49 K);.. if( I
1001b 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 S_LOCK_ERROR(rc)
1001c 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 46 69 ){.. pFi
1001d 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
1001e 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 7d tErrno;.. }
1001f 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 .. }.. ret
10020 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 20 0d 0a 20 urn rc;.. } ..
10021 20 0d 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 .. /* got it,
10022 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 set the type and
10023 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0d 0a 20 return ok */..
10024 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
10025 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a k = eFileLock;..
10026 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
10027 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 77 65 72 20 .../*..** Lower
10028 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 the locking leve
10029 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 l on file descri
1002a 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 ptor pFile to eF
1002b 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c ileLock. eFileL
1002c 6f 63 6b 0d 0a 2a 2a 20 6d 75 73 74 20 62 65 20 ock..** must be
1002d 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f either NO_LOCK o
1002e 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0d 0a r SHARED_LOCK...
1002f 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f **..** If the lo
10030 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 cking level of t
10031 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 he file descript
10032 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 or is already at
10033 20 6f 72 20 62 65 6c 6f 77 0d 0a 2a 2a 20 74 68 or below..** th
10034 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b e requested lock
10035 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 ing level, this
10036 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d routine is a no-
10037 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e op...**..** When
10038 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 the locking lev
10039 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f el reaches NO_LO
1003a 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c CK, delete the l
1003b 6f 63 6b 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 ock file...*/..s
1003c 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 tatic int dotloc
1003d 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f kUnlock(sqlite3_
1003e 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 file *id, int eF
1003f 69 6c 65 4c 6f 63 6b 29 20 7b 0d 0a 20 20 75 6e ileLock) {.. un
10040 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 ixFile *pFile =
10041 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a (unixFile*)id;..
10042 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c char *zLockFil
10043 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c e = (char *)pFil
10044 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 e->lockingContex
10045 74 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 0d t;.. int rc;...
10046 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 . assert( pFile
10047 20 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 );.. OSTRACE((
10048 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 "UNLOCK %d %d w
10049 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f as %d pid=%d (do
1004a 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 tlock)\n", pFile
1004b 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0d ->h, eFileLock,.
1004c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c .. pFile->eFil
1004d 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 eLock, getpid())
1004e 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 65 46 );.. assert( eF
1004f 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f ileLock<=SHARED_
10050 4c 4f 43 4b 20 29 3b 0d 0a 20 20 0d 0a 20 20 2f LOCK );.. .. /
10051 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 * no-op if possi
10052 62 6c 65 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 ble */.. if( pF
10053 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d ile->eFileLock==
10054 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d 0a 20 20 eFileLock ){..
10055 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
10056 4f 4b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a OK;.. }.... /*
10057 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f To downgrade to
10058 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 shared, simply
10059 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 update our inter
1005a 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 nal notion of th
1005b 65 0d 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 e.. ** lock sta
1005c 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 te. No need to
1005d 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 mess with the fi
1005e 6c 65 20 6f 6e 20 64 69 73 6b 2e 0d 0a 20 20 2a le on disk... *
1005f 2f 0d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f /.. if( eFileLo
10060 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 ck==SHARED_LOCK
10061 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 ){.. pFile->e
10062 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 FileLock = SHARE
10063 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 72 65 74 D_LOCK;.. ret
10064 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
10065 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 54 6f }.. .. /* To
10066 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 fully unlock th
10067 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 e database, dele
10068 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 te the lock file
10069 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 65 */.. assert( e
1006a 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 FileLock==NO_LOC
1006b 4b 20 29 3b 0d 0a 20 20 72 63 20 3d 20 6f 73 52 K );.. rc = osR
1006c 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b mdir(zLockFile);
1006d 0d 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 .. if( rc<0 &&
1006e 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 errno==ENOTDIR )
1006f 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a rc = osUnlink(z
10070 4c 6f 63 6b 46 69 6c 65 29 3b 0d 0a 20 20 69 66 LockFile);.. if
10071 28 20 72 63 3c 30 20 29 7b 0d 0a 20 20 20 20 69 ( rc<0 ){.. i
10072 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e nt tErrno = errn
10073 6f 3b 0d 0a 20 20 20 20 72 63 20 3d 20 30 3b 0d o;.. rc = 0;.
10074 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 . if( ENOENT
10075 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0d 0a 20 20 != tErrno ){..
10076 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
10077 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0d 0a 20 IOERR_UNLOCK;..
10078 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 49 53 }.. if( IS
10079 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 _LOCK_ERROR(rc)
1007a 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d ){.. pFile-
1007b 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 >lastErrno = tEr
1007c 72 6e 6f 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 rno;.. }..
1007d 20 72 65 74 75 72 6e 20 72 63 3b 20 0d 0a 20 20 return rc; ..
1007e 7d 0d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c }.. pFile->eFil
1007f 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b eLock = NO_LOCK;
10080 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
10081 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
10082 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e ** Close a file.
10083 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 Make sure the
10084 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 lock has been re
10085 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c leased before cl
10086 6f 73 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 osing...*/..stat
10087 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c ic int dotlockCl
10088 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ose(sqlite3_file
10089 20 2a 69 64 29 20 7b 0d 0a 20 20 69 6e 74 20 72 *id) {.. int r
1008a 63 3b 0d 0a 20 20 69 66 28 20 69 64 20 29 7b 0d c;.. if( id ){.
1008b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 . unixFile *p
1008c 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 File = (unixFile
1008d 2a 29 69 64 3b 0d 0a 20 20 20 20 64 6f 74 6c 6f *)id;.. dotlo
1008e 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f ckUnlock(id, NO_
1008f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 73 71 6c 69 LOCK);.. sqli
10090 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e te3_free(pFile->
10091 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b lockingContext);
10092 0d 0a 20 20 7d 0d 0a 20 20 72 63 20 3d 20 63 6c .. }.. rc = cl
10093 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b oseUnixFile(id);
10094 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
10095 7d 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
10096 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 ****** End of th
10097 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 e dot-file lock
10098 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a implementation *
10099 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1009a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
1009b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1009c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1009d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1009e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1009f 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a **/..../********
100a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a4 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a ******..********
100a5 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a6 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c ** Begin flock L
100a7 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ocking *********
100a8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
100a9 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 *******..**..**
100aa 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 Use the flock()
100ab 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 system call to d
100ac 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0d o file locking..
100ad 0a 2a 2a 0d 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 .**..** flock()
100ae 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 locking is like
100af 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 dot-file locking
100b0 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 in that the var
100b1 69 6f 75 73 0d 0a 2a 2a 20 66 69 6e 65 2d 67 72 ious..** fine-gr
100b2 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 ain locking leve
100b3 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 ls supported by
100b4 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 SQLite are colla
100b5 70 73 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 61 20 psed into..** a
100b6 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 single exclusive
100b7 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 lock. In other
100b8 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 words, SHARED,
100b9 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0d 0a 2a RESERVED, and..*
100ba 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 * PENDING locks
100bb 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 are the same thi
100bc 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 ng as an EXCLUSI
100bd 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 VE lock. SQLite
100be 0d 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 ..** still works
100bf 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 when you do thi
100c0 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e s, but concurren
100c1 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 cy is reduced si
100c2 6e 63 65 0d 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 nce..** only a s
100c3 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 ingle process ca
100c4 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 n be reading the
100c5 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 database at a t
100c6 69 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6d 69 ime...**..** Omi
100c7 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 t this section i
100c8 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
100c9 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 LOCKING_STYLE is
100ca 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 turned off or i
100cb 66 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 f..** compiling
100cc 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0d 0a 2a 2f for VXWORKS...*/
100cd 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 ..#if SQLITE_ENA
100ce 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c BLE_LOCKING_STYL
100cf 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 E && !OS_VXWORKS
100d0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 72 79 ..../*..** Retry
100d1 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 flock() calls t
100d2 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 hat fail with EI
100d3 4e 54 52 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 NTR..*/..#ifdef
100d4 45 49 4e 54 52 0d 0a 73 74 61 74 69 63 20 69 6e EINTR..static in
100d5 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 t robust_flock(i
100d6 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0d nt fd, int op){.
100d7 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 64 6f . int rc;.. do
100d8 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c { rc = flock(fd,
100d9 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c op); }while( rc<
100da 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 0 && errno==EINT
100db 52 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 R );.. return r
100dc 63 3b 0d 0a 7d 0d 0a 23 65 6c 73 65 0d 0a 23 20 c;..}..#else..#
100dd 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c define robust_fl
100de 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 ock(a,b) flock(a
100df 2c 62 29 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 ,b)..#endif..
100e0 20 20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 ..../*..** Thi
100e1 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 s routine checks
100e2 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 if there is a R
100e3 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c ESERVED lock hel
100e4 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 d on the specifi
100e5 65 64 0d 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 ed..** file by t
100e6 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 his or any other
100e7 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 process. If suc
100e8 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 h a lock is held
100e9 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0d 0a , set *pResOut..
100ea 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f ** to a non-zero
100eb 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 value otherwise
100ec 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 *pResOut is set
100ed 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 to zero. The r
100ee 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a 2a 20 eturn value..**
100ef 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 is set to SQLITE
100f0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f _OK unless an I/
100f1 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 O error occurs d
100f2 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b uring lock check
100f3 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ing...*/..static
100f4 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 int flockCheckR
100f5 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 eservedLock(sqli
100f6 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e te3_file *id, in
100f7 74 20 2a 70 52 65 73 4f 75 74 29 7b 0d 0a 20 20 t *pResOut){..
100f8 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
100f9 4f 4b 3b 0d 0a 20 20 69 6e 74 20 72 65 73 65 72 OK;.. int reser
100fa 76 65 64 20 3d 20 30 3b 0d 0a 20 20 75 6e 69 78 ved = 0;.. unix
100fb 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 File *pFile = (u
100fc 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 nixFile*)id;..
100fd 0d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 .. SimulateIOEr
100fe 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 ror( return SQLI
100ff 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 TE_IOERR_CHECKRE
10100 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0d 0a SERVEDLOCK; );..
10101 20 20 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 .. assert( pF
10102 69 6c 65 20 29 3b 0d 0a 20 20 0d 0a 20 20 2f 2a ile );.. .. /*
10103 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 Check if a thre
10104 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 ad in this proce
10105 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 ss holds such a
10106 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 66 28 20 70 lock */.. if( p
10107 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e File->eFileLock>
10108 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a SHARED_LOCK ){..
10109 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 reserved = 1
1010a 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a ;.. }.. .. /*
1010b 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 Otherwise see i
1010c 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f f some other pro
1010d 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a cess holds it. *
1010e 2f 0d 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 /.. if( !reserv
1010f 65 64 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 61 74 ed ){.. /* at
10110 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 tempt to get the
10111 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 69 6e lock */.. in
10112 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 t lrc = robust_f
10113 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c lock(pFile->h, L
10114 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 OCK_EX | LOCK_NB
10115 29 3b 0d 0a 20 20 20 20 69 66 28 20 21 6c 72 63 );.. if( !lrc
10116 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 67 6f ){.. /* go
10117 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f t the lock, unlo
10118 63 6b 20 69 74 20 2a 2f 0d 0a 20 20 20 20 20 20 ck it */..
10119 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f lrc = robust_flo
1011a 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 ck(pFile->h, LOC
1011b 4b 5f 55 4e 29 3b 0d 0a 20 20 20 20 20 20 69 66 K_UN);.. if
1011c 20 28 20 6c 72 63 20 29 20 7b 0d 0a 20 20 20 20 ( lrc ) {..
1011d 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d int tErrno =
1011e 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 errno;..
1011f 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 /* unlock faile
10120 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 d with an error
10121 2a 2f 0d 0a 20 20 20 20 20 20 20 20 6c 72 63 20 */.. lrc
10122 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 = SQLITE_IOERR_U
10123 4e 4c 4f 43 4b 3b 20 0d 0a 20 20 20 20 20 20 20 NLOCK; ..
10124 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 if( IS_LOCK_ERR
10125 4f 52 28 6c 72 63 29 20 29 7b 0d 0a 20 20 20 20 OR(lrc) ){..
10126 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 pFile->las
10127 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b tErrno = tErrno;
10128 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d .. rc =
10129 20 6c 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d lrc;.. }
1012a 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
1012b 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 69 else {.. i
1012c 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e nt tErrno = errn
1012d 6f 3b 0d 0a 20 20 20 20 20 20 72 65 73 65 72 76 o;.. reserv
1012e 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 2f ed = 1;.. /
1012f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d * someone else m
10130 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 ight have it res
10131 65 72 76 65 64 20 2a 2f 0d 0a 20 20 20 20 20 20 erved */..
10132 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f lrc = sqliteErro
10133 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 rFromPosixError(
10134 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 tErrno, SQLITE_I
10135 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0d 0a 20 20 OERR_LOCK); ..
10136 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f if( IS_LOCK_
10137 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0d 0a 20 ERROR(lrc) ){..
10138 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 pFile->la
10139 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f stErrno = tErrno
1013a 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ;.. rc =
1013b 6c 72 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 lrc;.. }..
1013c 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 4f 53 54 }.. }.. OST
1013d 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c RACE(("TEST WR-L
1013e 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c OCK %d %d %d (fl
1013f 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e ock)\n", pFile->
10140 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 h, rc, reserved)
10141 29 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c );....#ifdef SQL
10142 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b ITE_IGNORE_FLOCK
10143 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0d 0a 20 20 _LOCK_ERRORS..
10144 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 if( (rc & SQLITE
10145 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 _IOERR) == SQLIT
10146 45 5f 49 4f 45 52 52 20 29 7b 0d 0a 20 20 20 20 E_IOERR ){..
10147 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d rc = SQLITE_OK;.
10148 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b . reserved=1;
10149 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a .. }..#endif /*
1014a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 SQLITE_IGNORE_F
1014b 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 LOCK_LOCK_ERRORS
1014c 20 2a 2f 0d 0a 20 20 2a 70 52 65 73 4f 75 74 20 */.. *pResOut
1014d 3d 20 72 65 73 65 72 76 65 64 3b 0d 0a 20 20 72 = reserved;.. r
1014e 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1014f 2f 2a 0d 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 /*..** Lock the
10150 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f file with the lo
10151 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 ck specified by
10152 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c parameter eFileL
10153 6f 63 6b 20 2d 20 6f 6e 65 0d 0a 2a 2a 20 6f 66 ock - one..** of
10154 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d the following:.
10155 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 28 31 29 20 .**..** (1)
10156 53 48 41 52 45 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 SHARED_LOCK..**
10157 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 (2) RESERVED
10158 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 33 _LOCK..** (3
10159 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0d 0a ) PENDING_LOCK..
1015a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 ** (4) EXCLU
1015b 53 49 56 45 5f 4c 4f 43 4b 0d 0a 2a 2a 0d 0a 2a SIVE_LOCK..**..*
1015c 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e * Sometimes when
1015d 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 requesting one
1015e 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 lock state, addi
1015f 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 tional lock stat
10160 65 73 0d 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 es..** are inser
10161 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 ted in between.
10162 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 The locking mig
10163 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f ht fail on one o
10164 66 20 74 68 65 20 6c 61 74 65 72 0d 0a 2a 2a 20 f the later..**
10165 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 transitions leav
10166 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 ing the lock sta
10167 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f te different fro
10168 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 m what it starte
10169 64 20 62 75 74 0d 0a 2a 2a 20 73 74 69 6c 6c 20 d but..** still
1016a 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 short of its goa
1016b 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e l. The followin
1016c 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 g chart shows th
1016d 65 20 61 6c 6c 6f 77 65 64 0d 0a 2a 2a 20 74 72 e allowed..** tr
1016e 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 ansitions and th
1016f 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 e inserted inter
10170 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0d mediate states:.
10171 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 .**..** UNLOC
10172 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0d 0a 2a KED -> SHARED..*
10173 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 * SHARED -> R
10174 45 53 45 52 56 45 44 0d 0a 2a 2a 20 20 20 20 53 ESERVED..** S
10175 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e HARED -> (PENDIN
10176 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d G) -> EXCLUSIVE.
10177 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 .** RESERVED
10178 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 -> (PENDING) ->
10179 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 20 20 EXCLUSIVE..**
1017a 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c PENDING -> EXCL
1017b 55 53 49 56 45 0d 0a 2a 2a 0d 0a 2a 2a 20 66 6c USIVE..**..** fl
1017c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c ock() only reall
1017d 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 y support EXCLUS
1017e 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 IVE locks. We t
1017f 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 rack intermediat
10180 65 0d 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 e..** lock state
10181 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 s in the sqlite3
10182 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c _file structure,
10183 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 but all locks S
10184 48 41 52 45 44 20 6f 72 0d 0a 2a 2a 20 61 62 6f HARED or..** abo
10185 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 ve are really EX
10186 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e CLUSIVE locks an
10187 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 d exclude all ot
10188 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 her processes fr
10189 6f 6d 0d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 om..** access th
1018a 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 e file...**..**
1018b 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c This routine wil
1018c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 l only increase
1018d 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 a lock. Use the
1018e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b sqlite3OsUnlock
1018f 28 29 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 ()..** routine t
10190 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e o lower a lockin
10191 67 20 6c 65 76 65 6c 2e 0d 0a 2a 2f 0d 0a 73 74 g level...*/..st
10192 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f atic int flockLo
10193 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ck(sqlite3_file
10194 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f *id, int eFileLo
10195 63 6b 29 20 7b 0d 0a 20 20 69 6e 74 20 72 63 20 ck) {.. int rc
10196 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
10197 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 unixFile *pFile
10198 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b = (unixFile*)id;
10199 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 .... assert( pF
1019a 69 6c 65 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 69 ile );.... /* i
1019b 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 f we already hav
1019c 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 e a lock, it is
1019d 65 78 63 6c 75 73 69 76 65 2e 20 20 0d 0a 20 20 exclusive. ..
1019e 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c ** Just adjust l
1019f 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e evel and punt on
101a0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0d outta here. */.
101a1 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 . if (pFile->eF
101a2 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 ileLock > NO_LOC
101a3 4b 29 20 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d K) {.. pFile-
101a4 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 >eFileLock = eFi
101a5 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 72 65 74 leLock;.. ret
101a6 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
101a7 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 67 72 }.. .. /* gr
101a8 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 ab an exclusive
101a9 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 0d 0a 20 20 69 lock */.. .. i
101aa 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 f (robust_flock(
101ab 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 pFile->h, LOCK_E
101ac 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0d X | LOCK_NB)) {.
101ad 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 . int tErrno
101ae 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 2f 2a = errno;.. /*
101af 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 didn't get, mus
101b0 74 20 62 65 20 62 75 73 79 20 2a 2f 0d 0a 20 20 t be busy */..
101b1 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 rc = sqliteErr
101b2 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 orFromPosixError
101b3 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f (tErrno, SQLITE_
101b4 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 IOERR_LOCK);..
101b5 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 if( IS_LOCK_ER
101b6 52 4f 52 28 72 63 29 20 29 7b 0d 0a 20 20 20 20 ROR(rc) ){..
101b7 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 pFile->lastErr
101b8 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0d 0a 20 20 no = tErrno;..
101b9 20 20 7d 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d }.. } else {.
101ba 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 . /* got it,
101bb 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 set the type and
101bc 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0d 0a 20 return ok */..
101bd 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c pFile->eFileL
101be 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b ock = eFileLock;
101bf 0d 0a 20 20 7d 0d 0a 20 20 4f 53 54 52 41 43 45 .. }.. OSTRACE
101c0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 (("LOCK %d %s
101c1 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 %s (flock)\n",
101c2 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 pFile->h, azFile
101c3 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c Lock(eFileLock),
101c4 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 .. rc
101c5 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f ==SQLITE_OK ? "o
101c6 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b k" : "failed"));
101c7 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
101c8 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 IGNORE_FLOCK_LOC
101c9 4b 5f 45 52 52 4f 52 53 0d 0a 20 20 69 66 28 20 K_ERRORS.. if(
101ca 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 (rc & SQLITE_IOE
101cb 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f RR) == SQLITE_IO
101cc 45 52 52 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d ERR ){.. rc =
101cd 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
101ce 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 }..#endif /* SQ
101cf 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 LITE_IGNORE_FLOC
101d0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f K_LOCK_ERRORS */
101d1 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
101d2 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f }....../*..** Lo
101d3 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 wer the locking
101d4 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 level on file de
101d5 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 scriptor pFile t
101d6 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 o eFileLock. eF
101d7 69 6c 65 4c 6f 63 6b 0d 0a 2a 2a 20 6d 75 73 74 ileLock..** must
101d8 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f be either NO_LO
101d9 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 CK or SHARED_LOC
101da 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 K...**..** If th
101db 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 e locking level
101dc 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 of the file desc
101dd 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 riptor is alread
101de 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0d 0a 2a y at or below..*
101df 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 * the requested
101e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 locking level, t
101e1 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 his routine is a
101e2 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 74 61 no-op...*/..sta
101e3 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c tic int flockUnl
101e4 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ock(sqlite3_file
101e5 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c *id, int eFileL
101e6 6f 63 6b 29 20 7b 0d 0a 20 20 75 6e 69 78 46 69 ock) {.. unixFi
101e7 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 le *pFile = (uni
101e8 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 0d 0a xFile*)id;.. ..
101e9 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
101ea 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 );.. OSTRACE(("
101eb 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 UNLOCK %d %d wa
101ec 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f s %d pid=%d (flo
101ed 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 ck)\n", pFile->h
101ee 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0d 0a 20 20 , eFileLock,..
101ef 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
101f0 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 eFileLock, getpi
101f1 64 28 29 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 d()));.. assert
101f2 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 ( eFileLock<=SHA
101f3 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 0d RED_LOCK );.. .
101f4 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 . /* no-op if p
101f5 6f 73 73 69 62 6c 65 20 2a 2f 0d 0a 20 20 69 66 ossible */.. if
101f6 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f ( pFile->eFileLo
101f7 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b ck==eFileLock ){
101f8 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
101f9 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 ITE_OK;.. }..
101fa 0d 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 .. /* shared ca
101fb 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 n just be set be
101fc 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 cause we always
101fd 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 have an exclusiv
101fe 65 20 2a 2f 0d 0a 20 20 69 66 20 28 65 46 69 6c e */.. if (eFil
101ff 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f eLock==SHARED_LO
10200 43 4b 29 20 7b 0d 0a 20 20 20 20 70 46 69 6c 65 CK) {.. pFile
10201 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 ->eFileLock = eF
10202 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 72 65 ileLock;.. re
10203 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
10204 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 6e . }.. .. /* n
10205 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 o, really, unloc
10206 6b 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 72 6f 62 k. */.. if( rob
10207 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d ust_flock(pFile-
10208 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0d >h, LOCK_UN) ){.
10209 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 .#ifdef SQLITE_I
1020a 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b GNORE_FLOCK_LOCK
1020b 5f 45 52 52 4f 52 53 0d 0a 20 20 20 20 72 65 74 _ERRORS.. ret
1020c 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
1020d 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 #endif /* SQLITE
1020e 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f _IGNORE_FLOCK_LO
1020f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0d 0a 20 20 CK_ERRORS */..
10210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
10211 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0d 0a 20 IOERR_UNLOCK;..
10212 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 46 69 }else{.. pFi
10213 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 le->eFileLock =
10214 4e 4f 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 72 65 NO_LOCK;.. re
10215 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
10216 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
10217 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0d * Close a file..
10218 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
10219 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 flockClose(sqlit
1021a 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0d 0a e3_file *id) {..
1021b 20 20 69 66 28 20 69 64 20 29 7b 0d 0a 20 20 20 if( id ){..
1021c 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c flockUnlock(id,
1021d 20 4e 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 7d 0d NO_LOCK);.. }.
1021e 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 . return closeU
1021f 6e 69 78 46 69 6c 65 28 69 64 29 3b 0d 0a 7d 0d nixFile(id);..}.
10220 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c ...#endif /* SQL
10221 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 ITE_ENABLE_LOCKI
10222 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f NG_STYLE && !OS_
10223 56 58 57 4f 52 4b 20 2a 2f 0d 0a 0d 0a 2f 2a 2a VXWORK */..../**
10224 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10225 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f * End of the flo
10226 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e ck lock implemen
10227 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a tation *********
10228 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
10229 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1022a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1022b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1022c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1022d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d ************/...
1022e 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
1022f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10231 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10232 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10233 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
10234 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
10235 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 Named Semaphore
10236 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a Locking *******
10237 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10238 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 61 6d 65 64 20 *..**..** Named
10239 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e semaphore lockin
1023a 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 g is only suppor
1023b 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0d ted on VxWorks..
1023c 0a 2a 2a 0d 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 .**..** Semaphor
1023d 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b e locking is lik
1023e 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 e dot-lock and f
1023f 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 lock in that it
10240 72 65 61 6c 6c 79 20 6f 6e 6c 79 0d 0a 2a 2a 20 really only..**
10241 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 supports EXCLUSI
10242 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c VE locking. Onl
10243 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 y a single proce
10244 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 ss can read or w
10245 72 69 74 65 0d 0a 2a 2a 20 74 68 65 20 64 61 74 rite..** the dat
10246 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 abase file at a
10247 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 time. This redu
10248 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f ces potential co
10249 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0d 0a ncurrency, but..
1024a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 ** makes the loc
1024b 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e k implementation
1024c 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0d 0a 2a much easier...*
1024d 2f 0d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b /..#if OS_VXWORK
1024e 53 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 S..../*..** This
1024f 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 routine checks
10250 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 if there is a RE
10251 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 SERVED lock held
10252 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 on the specifie
10253 64 0d 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 d..** file by th
10254 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 is or any other
10255 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 process. If such
10256 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c a lock is held,
10257 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0d 0a 2a set *pResOut..*
10258 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 * to a non-zero
10259 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 value otherwise
1025a 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 *pResOut is set
1025b 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 to zero. The re
1025c 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a 2a 20 69 turn value..** i
1025d 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f s set to SQLITE_
1025e 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f OK unless an I/O
1025f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 error occurs du
10260 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 ring lock checki
10261 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ng...*/..static
10262 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 int semCheckRese
10263 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 rvedLock(sqlite3
10264 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a _file *id, int *
10265 70 52 65 73 4f 75 74 29 20 7b 0d 0a 20 20 69 6e pResOut) {.. in
10266 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
10267 3b 0d 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 ;.. int reserve
10268 64 20 3d 20 30 3b 0d 0a 20 20 75 6e 69 78 46 69 d = 0;.. unixFi
10269 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 le *pFile = (uni
1026a 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 0d 0a 20 20 xFile*)id;....
1026b 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
1026c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
1026d 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 OERR_CHECKRESERV
1026e 45 44 4c 4f 43 4b 3b 20 29 3b 0d 0a 20 20 0d 0a EDLOCK; );.. ..
1026f 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
10270 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b );.... /* Check
10271 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 if a thread in
10272 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c this process hol
10273 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a ds such a lock *
10274 2f 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e /.. if( pFile->
10275 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 eFileLock>SHARED
10276 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 72 65 _LOCK ){.. re
10277 73 65 72 76 65 64 20 3d 20 31 3b 0d 0a 20 20 7d served = 1;.. }
10278 0d 0a 20 20 0d 0a 20 20 2f 2a 20 4f 74 68 65 72 .. .. /* Other
10279 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 wise see if some
1027a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 other process h
1027b 6f 6c 64 73 20 69 74 2e 20 2a 2f 0d 0a 20 20 69 olds it. */.. i
1027c 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0d f( !reserved ){.
1027d 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d . sem_t *pSem
1027e 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 = pFile->pInode
1027f 2d 3e 70 53 65 6d 3b 0d 0a 20 20 20 20 73 74 72 ->pSem;.. str
10280 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 uct stat statBuf
10281 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 73 65 6d ;.... if( sem
10282 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d _trywait(pSem)==
10283 2d 31 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 -1 ){.. int
10284 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b tErrno = errno;
10285 0d 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 .. if( EAGA
10286 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0d IN != tErrno ){.
10287 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
10288 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 liteErrorFromPos
10289 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 ixError(tErrno,
1028a 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 SQLITE_IOERR_CHE
1028b 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b CKRESERVEDLOCK);
1028c 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d .. pFile-
1028d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 >lastErrno = tEr
1028e 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 7d 20 65 6c rno;.. } el
1028f 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a se {.. /*
10290 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 someone else ha
10291 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 s the lock when
10292 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 we are in NO_LOC
10293 4b 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 65 K */.. re
10294 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d served = (pFile-
10295 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 >eFileLock < SHA
10296 52 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 RED_LOCK);..
10297 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d }.. }else{.
10298 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 . /* we cou
10299 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 ld have it if we
1029a 20 77 61 6e 74 20 69 74 20 2a 2f 0d 0a 20 20 20 want it */..
1029b 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d sem_post(pSem
1029c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
1029d 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 OSTRACE(("TEST
1029e 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 WR-LOCK %d %d %
1029f 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c d (sem)\n", pFil
102a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 e->h, rc, reserv
102a1 65 64 29 29 3b 0d 0a 0d 0a 20 20 2a 70 52 65 73 ed));.... *pRes
102a2 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0d Out = reserved;.
102a3 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
102a4 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 63 6b 20 ..../*..** Lock
102a5 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 the file with th
102a6 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 e lock specified
102a7 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 by parameter eF
102a8 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0d 0a 2a ileLock - one..*
102a9 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 * of the followi
102aa 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 ng:..**..**
102ab 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0d (1) SHARED_LOCK.
102ac 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 .** (2) RESE
102ad 52 56 45 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 RVED_LOCK..**
102ae 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f (3) PENDING_LO
102af 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 CK..** (4) E
102b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0d 0a 2a XCLUSIVE_LOCK..*
102b1 2a 0d 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 *..** Sometimes
102b2 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 when requesting
102b3 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 one lock state,
102b4 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 additional lock
102b5 73 74 61 74 65 73 0d 0a 2a 2a 20 61 72 65 20 69 states..** are i
102b6 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 nserted in betwe
102b7 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 en. The locking
102b8 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f might fail on o
102b9 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0d ne of the later.
102ba 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 .** transitions
102bb 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b leaving the lock
102bc 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 state different
102bd 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 from what it st
102be 61 72 74 65 64 20 62 75 74 0d 0a 2a 2a 20 73 74 arted but..** st
102bf 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 ill short of its
102c0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c goal. The foll
102c1 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 owing chart show
102c2 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0d 0a 2a s the allowed..*
102c3 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e * transitions an
102c4 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 d the inserted i
102c5 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 ntermediate stat
102c6 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 55 es:..**..** U
102c7 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 NLOCKED -> SHARE
102c8 44 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 D..** SHARED
102c9 2d 3e 20 52 45 53 45 52 56 45 44 0d 0a 2a 2a 20 -> RESERVED..**
102ca 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 SHARED -> (PE
102cb 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 NDING) -> EXCLUS
102cc 49 56 45 0d 0a 2a 2a 20 20 20 20 52 45 53 45 52 IVE..** RESER
102cd 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 VED -> (PENDING)
102ce 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a -> EXCLUSIVE..*
102cf 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 * PENDING ->
102d0 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 0d 0a 2a EXCLUSIVE..**..*
102d1 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b * Semaphore lock
102d2 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 s only really su
102d3 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 pport EXCLUSIVE
102d4 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b locks. We track
102d5 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0d 0a 2a intermediate..*
102d6 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e * lock states in
102d7 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c the sqlite3_fil
102d8 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 e structure, but
102d9 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 all locks SHARE
102da 44 20 6f 72 0d 0a 2a 2a 20 61 62 6f 76 65 20 61 D or..** above a
102db 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 re really EXCLUS
102dc 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 IVE locks and ex
102dd 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 clude all other
102de 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0d 0a processes from..
102df 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 ** access the fi
102e0 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 le...**..** This
102e1 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e routine will on
102e2 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f ly increase a lo
102e3 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c ck. Use the sql
102e4 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0d 0a ite3OsUnlock()..
102e5 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f ** routine to lo
102e6 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 wer a locking le
102e7 76 65 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 vel...*/..static
102e8 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c int semLock(sql
102e9 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
102ea 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0d nt eFileLock) {.
102eb 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 . unixFile *pFi
102ec 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 le = (unixFile*)
102ed 69 64 3b 0d 0a 20 20 69 6e 74 20 66 64 3b 0d 0a id;.. int fd;..
102ee 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 sem_t *pSem =
102ef 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 pFile->pInode->p
102f0 53 65 6d 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d Sem;.. int rc =
102f1 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 SQLITE_OK;....
102f2 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 /* if we alread
102f3 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 y have a lock, i
102f4 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 t is exclusive.
102f5 20 0d 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a .. ** Just adj
102f6 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 ust level and pu
102f7 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 nt on outta here
102f8 2e 20 2a 2f 0d 0a 20 20 69 66 20 28 70 46 69 6c . */.. if (pFil
102f9 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e e->eFileLock > N
102fa 4f 5f 4c 4f 43 4b 29 20 7b 0d 0a 20 20 20 20 70 O_LOCK) {.. p
102fb 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 File->eFileLock
102fc 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 = eFileLock;..
102fd 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
102fe 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f ;.. goto sem_
102ff 65 6e 64 5f 6c 6f 63 6b 3b 0d 0a 20 20 7d 0d 0a end_lock;.. }..
10300 20 20 0d 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 .. /* lock se
10301 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 maphore now but
10302 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c bail out when al
10303 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f ready locked. */
10304 0d 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 .. if( sem_tryw
10305 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b ait(pSem)==-1 ){
10306 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 .. rc = SQLIT
10307 45 5f 42 55 53 59 3b 0d 0a 20 20 20 20 67 6f 74 E_BUSY;.. got
10308 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0d o sem_end_lock;.
10309 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 67 6f 74 . }.... /* got
1030a 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 it, set the typ
1030b 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 e and return ok
1030c 2a 2f 0d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 */.. pFile->eFi
1030d 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f leLock = eFileLo
1030e 63 6b 3b 0d 0a 0d 0a 20 73 65 6d 5f 65 6e 64 5f ck;.... sem_end_
1030f 6c 6f 63 6b 3a 0d 0a 20 20 72 65 74 75 72 6e 20 lock:.. return
10310 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a rc;..}..../*..**
10311 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 Lower the locki
10312 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 ng level on file
10313 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c descriptor pFil
10314 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 e to eFileLock.
10315 20 65 46 69 6c 65 4c 6f 63 6b 0d 0a 2a 2a 20 6d eFileLock..** m
10316 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f ust be either NO
10317 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f _LOCK or SHARED_
10318 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 LOCK...**..** If
10319 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 the locking lev
1031a 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 el of the file d
1031b 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 escriptor is alr
1031c 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 eady at or below
1031d 0d 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 ..** the request
1031e 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c ed locking level
1031f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 , this routine i
10320 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a s a no-op...*/..
10321 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e static int semUn
10322 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c lock(sqlite3_fil
10323 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 e *id, int eFile
10324 4c 6f 63 6b 29 20 7b 0d 0a 20 20 75 6e 69 78 46 Lock) {.. unixF
10325 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e ile *pFile = (un
10326 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 73 ixFile*)id;.. s
10327 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 em_t *pSem = pFi
10328 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d le->pInode->pSem
10329 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 ;.... assert( p
1032a 46 69 6c 65 20 29 3b 0d 0a 20 20 61 73 73 65 72 File );.. asser
1032b 74 28 20 70 53 65 6d 20 29 3b 0d 0a 20 20 4f 53 t( pSem );.. OS
1032c 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 TRACE(("UNLOCK
1032d 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 %d %d was %d pid
1032e 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 =%d (sem)\n", pF
1032f 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 ile->h, eFileLoc
10330 6b 2c 0d 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 k,... pFile->e
10331 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 FileLock, getpid
10332 28 29 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ()));.. assert(
10333 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 eFileLock<=SHAR
10334 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 0d 0a ED_LOCK );.. ..
10335 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f /* no-op if po
10336 73 73 69 62 6c 65 20 2a 2f 0d 0a 20 20 69 66 28 ssible */.. if(
10337 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
10338 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d k==eFileLock ){.
10339 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
1033a 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 0d TE_OK;.. }.. .
1033b 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e . /* shared can
1033c 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 just be set bec
1033d 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 ause we always h
1033e 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 ave an exclusive
1033f 20 2a 2f 0d 0a 20 20 69 66 20 28 65 46 69 6c 65 */.. if (eFile
10340 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 Lock==SHARED_LOC
10341 4b 29 20 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d K) {.. pFile-
10342 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 >eFileLock = eFi
10343 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 72 65 74 leLock;.. ret
10344 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
10345 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 6e 6f }.. .. /* no
10346 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e , really unlock.
10347 20 2a 2f 0d 0a 20 20 69 66 20 28 20 73 65 6d 5f */.. if ( sem_
10348 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 post(pSem)==-1 )
10349 20 7b 0d 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 {.. int rc,
1034a 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d tErrno = errno;.
1034b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1034c 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 ErrorFromPosixEr
1034d 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 ror(tErrno, SQLI
1034e 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 TE_IOERR_UNLOCK)
1034f 3b 0d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f ;.. if( IS_LO
10350 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0d CK_ERROR(rc) ){.
10351 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 . pFile->la
10352 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f stErrno = tErrno
10353 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 ;.. }.. re
10354 74 75 72 6e 20 72 63 3b 20 0d 0a 20 20 7d 0d 0a turn rc; .. }..
10355 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f pFile->eFileLo
10356 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0d 0a 20 ck = NO_LOCK;..
10357 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
10358 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 2a K;..}..../*.. **
10359 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0d 0a Close a file...
1035a 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
1035b 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 semClose(sqlite3
1035c 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0d 0a 20 20 _file *id) {..
1035d 69 66 28 20 69 64 20 29 7b 0d 0a 20 20 20 20 75 if( id ){.. u
1035e 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d nixFile *pFile =
1035f 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d (unixFile*)id;.
10360 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 . semUnlock(i
10361 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 d, NO_LOCK);..
10362 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
10363 29 3b 0d 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 );.. unixEnte
10364 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 20 20 72 rMutex();.. r
10365 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 eleaseInodeInfo(
10366 70 46 69 6c 65 29 3b 0d 0a 20 20 20 20 75 6e 69 pFile);.. uni
10367 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a xLeaveMutex();..
10368 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c closeUnixFil
10369 65 28 69 64 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 e(id);.. }.. r
1036a 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1036b 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a ..}....#endif /*
1036c 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0d 0a OS_VXWORKS */..
1036d 2f 2a 0d 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d /*..** Named sem
1036e 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 aphore locking i
1036f 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 s only available
10370 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0d 0a 2a 2a on VxWorks...**
10371 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
10372 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d * End of the nam
10373 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 ed semaphore loc
10374 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e k implementation
10375 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
10376 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
10377 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10378 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10379 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1037a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1037b 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a */....../*******
1037c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1037d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1037e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1037f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10380 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a *******..*******
10381 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10382 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c **** Begin AFP L
10383 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ocking *********
10384 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10385 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a ********..**..**
10386 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c AFP is the Appl
10387 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f e Filing Protoco
10388 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 l. AFP is a net
10389 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 work filesystem
1038a 66 6f 75 6e 64 0d 0a 2a 2a 20 6f 6e 20 41 70 70 found..** on App
1038b 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d le Macintosh com
1038c 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 puters - both OS
1038d 39 20 61 6e 64 20 4f 53 58 2e 0d 0a 2a 2a 0d 0a 9 and OSX...**..
1038e 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 ** Third-party i
1038f 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f mplementations o
10390 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 f AFP are availa
10391 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 ble. But this c
10392 6f 64 65 20 68 65 72 65 0d 0a 2a 2a 20 6f 6e 6c ode here..** onl
10393 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0d y works on OSX..
10394 0a 2a 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e .*/....#if defin
10395 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 ed(__APPLE__) &&
10396 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
10397 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 2f 2a OCKING_STYLE../*
10398 0d 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b ..** The afpLock
10399 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 ingContext struc
1039a 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c ture contains al
1039b 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 l afp lock speci
1039c 66 69 63 20 73 74 61 74 65 0d 0a 2a 2f 0d 0a 74 fic state..*/..t
1039d 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 ypedef struct af
1039e 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 pLockingContext
1039f 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 afpLockingContex
103a0 74 3b 0d 0a 73 74 72 75 63 74 20 61 66 70 4c 6f t;..struct afpLo
103a1 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0d 0a ckingContext {..
103a2 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0d int reserved;.
103a3 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 . const char *d
103a4 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 bPath;
103a5 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
103a6 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0d 0a e open file */..
103a7 7d 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 42 79 74 };....struct Byt
103a8 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0d 0a 7b eRangeLockPB2..{
103a9 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e .. unsigned lon
103aa 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 g long offset;
103ab 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 /* offset
103ac 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f to first byte to
103ad 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 75 6e 73 69 lock */.. unsi
103ae 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c gned long long l
103af 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a ength; /*
103b0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f nbr of bytes to
103b1 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 75 6e 73 69 lock */.. unsi
103b2 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 gned long long r
103b3 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a etRangeStart; /*
103b4 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 nbr of 1st byte
103b5 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 locked if succe
103b6 73 73 66 75 6c 20 2a 2f 0d 0a 20 20 75 6e 73 69 ssful */.. unsi
103b7 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b gned char unLock
103b8 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a Flag; /*
103b9 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 1 = unlock, 0 =
103ba 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 75 6e 73 69 lock */.. unsi
103bb 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 gned char startE
103bc 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a ndFlag; /*
103bd 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 1=rel to end of
103be 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 fork, 0=rel to
103bf 73 74 61 72 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 start */.. int
103c0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 fd;
103c1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
103c2 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 file desc to as
103c3 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 soc this lock wi
103c4 74 68 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23 64 65 th */..};....#de
103c5 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 fine afpfsByteRa
103c6 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 ngeLock2FSCTL
103c7 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 _IOWR('z',
103c8 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 23, struct ByteR
103c9 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0d 0a 0d 0a angeLockPB2)....
103ca 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 /*..** This is a
103cb 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 utility for set
103cc 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 ting or clearing
103cd 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 a bit-range loc
103ce 6b 20 6f 6e 20 61 6e 0d 0a 2a 2a 20 41 46 50 20 k on an..** AFP
103cf 66 69 6c 65 73 79 73 74 65 6d 2e 0d 0a 2a 2a 20 filesystem...**
103d0 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 ..** Return SQLI
103d1 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 TE_OK on success
103d2 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e , SQLITE_BUSY on
103d3 20 66 61 69 6c 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 failure...*/..s
103d4 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 tatic int afpSet
103d5 4c 6f 63 6b 28 0d 0a 20 20 63 6f 6e 73 74 20 63 Lock(.. const c
103d6 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 har *path,
103d7 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 /* Name
103d8 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 of the file to b
103d9 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f e locked or unlo
103da 63 6b 65 64 20 2a 2f 0d 0a 20 20 75 6e 69 78 46 cked */.. unixF
103db 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 ile *pFile,
103dc 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 /* Ope
103dd 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f n file descripto
103de 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0d 0a 20 20 r on path */..
103df 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f unsigned long lo
103e0 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f ng offset, /
103e1 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 * First byte to
103e2 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0d 0a 20 20 be locked */..
103e3 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f unsigned long lo
103e4 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f ng length, /
103e5 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
103e6 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 s to lock */..
103e7 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 int setLockFlag
103e8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
103e9 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f * True to set lo
103ea 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c ck. False to cl
103eb 65 61 72 20 6c 6f 63 6b 20 2a 2f 0d 0a 29 7b 0d ear lock */..){.
103ec 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 . struct ByteRa
103ed 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0d 0a ngeLockPB2 pb;..
103ee 20 20 69 6e 74 20 65 72 72 3b 0d 0a 20 20 0d 0a int err;.. ..
103ef 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 pb.unLockFlag
103f0 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 = setLockFlag ?
103f1 30 20 3a 20 31 3b 0d 0a 20 20 70 62 2e 73 74 61 0 : 1;.. pb.sta
103f2 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0d 0a rtEndFlag = 0;..
103f3 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 pb.offset = of
103f4 66 73 65 74 3b 0d 0a 20 20 70 62 2e 6c 65 6e 67 fset;.. pb.leng
103f5 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0d 0a 20 th = length; ..
103f6 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e pb.fd = pFile->
103f7 68 3b 0d 0a 20 20 0d 0a 20 20 4f 53 54 52 41 43 h;.. .. OSTRAC
103f8 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b E(("AFPSETLOCK [
103f9 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 %s] for %d%s in
103fa 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c range %llx:%llx\
103fb 6e 22 2c 20 0d 0a 20 20 20 20 28 73 65 74 4c 6f n", .. (setLo
103fc 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 ckFlag?"ON":"OFF
103fd 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 "), pFile->h, (p
103fe 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 b.fd==-1?"[testv
103ff 61 6c 2d 31 5d 22 3a 22 22 29 2c 0d 0a 20 20 20 al-1]":""),..
10400 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 offset, length)
10401 29 3b 0d 0a 20 20 65 72 72 20 3d 20 66 73 63 74 );.. err = fsct
10402 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 l(path, afpfsByt
10403 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c eRangeLock2FSCTL
10404 2c 20 26 70 62 2c 20 30 29 3b 0d 0a 20 20 69 66 , &pb, 0);.. if
10405 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0d 0a ( err==-1 ) {..
10406 20 20 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 int rc;..
10407 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 int tErrno = er
10408 72 6e 6f 3b 0d 0a 20 20 20 20 4f 53 54 52 41 43 rno;.. OSTRAC
10409 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 E(("AFPSETLOCK f
1040a 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 ailed to fsctl()
1040b 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0d '%s' %d %s\n",.
1040c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 . pa
1040d 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 th, tErrno, stre
1040e 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0d rror(tErrno)));.
1040f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 .#ifdef SQLITE_I
10410 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 GNORE_AFP_LOCK_E
10411 52 52 4f 52 53 0d 0a 20 20 20 20 72 63 20 3d 20 RRORS.. rc =
10412 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 23 65 SQLITE_BUSY;..#e
10413 6c 73 65 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 lse.. rc = sq
10414 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 liteErrorFromPos
10415 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0d ixError(tErrno,.
10416 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
10417 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 setLockFlag
10418 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f ? SQLITE_IOERR_
10419 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f LOCK : SQLITE_IO
1041a 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0d 0a 23 65 ERR_UNLOCK);..#e
1041b 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 ndif /* SQLITE_I
1041c 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 GNORE_AFP_LOCK_E
1041d 52 52 4f 52 53 20 2a 2f 0d 0a 20 20 20 20 69 66 RRORS */.. if
1041e 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 ( IS_LOCK_ERROR(
1041f 72 63 29 20 29 7b 0d 0a 20 20 20 20 20 20 70 46 rc) ){.. pF
10420 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d ile->lastErrno =
10421 20 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 7d 0d tErrno;.. }.
10422 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d . return rc;.
10423 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 . } else {..
10424 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
10425 4b 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a K;.. }..}..../*
10426 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
10427 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 e checks if ther
10428 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 e is a RESERVED
10429 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 lock held on the
1042a 20 73 70 65 63 69 66 69 65 64 0d 0a 2a 2a 20 66 specified..** f
1042b 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 ile by this or a
1042c 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 ny other process
1042d 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b . If such a lock
1042e 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 is held, set *p
1042f 52 65 73 4f 75 74 0d 0a 2a 2a 20 74 6f 20 61 20 ResOut..** to a
10430 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f non-zero value o
10431 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 therwise *pResOu
10432 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f t is set to zero
10433 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 . The return va
10434 6c 75 65 0d 0a 2a 2a 20 69 73 20 73 65 74 20 74 lue..** is set t
10435 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 o SQLITE_OK unle
10436 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 ss an I/O error
10437 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f occurs during lo
10438 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0d 0a 2a 2f ck checking...*/
10439 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 ..static int afp
1043a 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
1043b 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a k(sqlite3_file *
1043c 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 id, int *pResOut
1043d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 ){.. int rc = S
1043e 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 QLITE_OK;.. int
1043f 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0d 0a reserved = 0;..
10440 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c unixFile *pFil
10441 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 e = (unixFile*)i
10442 64 3b 0d 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 d;.. afpLocking
10443 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 Context *context
10444 3b 0d 0a 20 20 0d 0a 20 20 53 69 6d 75 6c 61 74 ;.. .. Simulat
10445 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e eIOError( return
10446 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 SQLITE_IOERR_CH
10447 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b ECKRESERVEDLOCK;
10448 20 29 3b 0d 0a 20 20 0d 0a 20 20 61 73 73 65 72 );.. .. asser
10449 74 28 20 70 46 69 6c 65 20 29 3b 0d 0a 20 20 63 t( pFile );.. c
1044a 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 ontext = (afpLoc
1044b 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 kingContext *) p
1044c 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e File->lockingCon
1044d 74 65 78 74 3b 0d 0a 20 20 69 66 28 20 63 6f 6e text;.. if( con
1044e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 text->reserved )
1044f 7b 0d 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 {.. *pResOut
10450 3d 20 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e = 1;.. return
10451 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d SQLITE_OK;.. }
10452 0d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 .. unixEnterMut
10453 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 ex(); /* Because
10454 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 pFile->pInode i
10455 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 s shared across
10456 74 68 72 65 61 64 73 20 2a 2f 0d 0a 20 20 0d 0a threads */.. ..
10457 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 /* Check if a
10458 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 thread in this p
10459 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 rocess holds suc
1045a 68 20 61 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 h a lock */.. i
1045b 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 f( pFile->pInode
1045c 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 ->eFileLock>SHAR
1045d 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 ED_LOCK ){..
1045e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0d 0a 20 reserved = 1;..
1045f 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 4f 74 68 }.. .. /* Oth
10460 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f erwise see if so
10461 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 me other process
10462 20 68 6f 6c 64 73 20 69 74 2e 0d 0a 20 20 20 2a holds it... *
10463 2f 0d 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 /.. if( !reserv
10464 65 64 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 6c 6f ed ){.. /* lo
10465 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 ck the RESERVED
10466 62 79 74 65 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 byte */.. int
10467 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 lrc = afpSetLoc
10468 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 k(context->dbPat
10469 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 h, pFile, RESERV
1046a 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 ED_BYTE, 1,1);
1046b 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 .. if( SQLITE
1046c 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0d 0a 20 20 20 _OK==lrc ){..
1046d 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 /* if we succ
1046e 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 eeded in taking
1046f 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 the reserved loc
10470 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 k, unlock it to
10471 72 65 73 74 6f 72 65 0d 0a 20 20 20 20 20 20 2a restore.. *
10472 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 * the original s
10473 74 61 74 65 20 2a 2f 0d 0a 20 20 20 20 20 20 6c tate */.. l
10474 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 rc = afpSetLock(
10475 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c context->dbPath,
10476 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 pFile, RESERVED
10477 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0d 0a 20 _BYTE, 1, 0);..
10478 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 } else {..
10479 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c /* if we fail
1047a 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f ed to get the lo
1047b 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 ck then someone
1047c 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 else must have i
1047d 74 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 73 65 t */.. rese
1047e 72 76 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 7d rved = 1;.. }
1047f 0d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 .. if( IS_LOC
10480 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0d K_ERROR(lrc) ){.
10481 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0d 0a . rc=lrc;..
10482 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d 0a }.. }.. ..
10483 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 unixLeaveMutex
10484 28 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 ();.. OSTRACE((
10485 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 "TEST WR-LOCK %d
10486 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c %d %d (afp)\n",
10487 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 pFile->h, rc, r
10488 65 73 65 72 76 65 64 29 29 3b 0d 0a 20 20 0d 0a eserved));.. ..
10489 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 *pResOut = res
1048a 65 72 76 65 64 3b 0d 0a 20 20 72 65 74 75 72 6e erved;.. return
1048b 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc;..}..../*..*
1048c 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 * Lock the file
1048d 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 with the lock sp
1048e 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d ecified by param
1048f 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d eter eFileLock -
10490 20 6f 6e 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 one..** of the
10491 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a 0d 0a following:..**..
10492 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 ** (1) SHARE
10493 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 D_LOCK..** (
10494 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2) RESERVED_LOCK
10495 0d 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e ..** (3) PEN
10496 44 49 4e 47 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 DING_LOCK..**
10497 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f (4) EXCLUSIVE_
10498 4c 4f 43 4b 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f 6d LOCK..**..** Som
10499 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 etimes when requ
1049a 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 esting one lock
1049b 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 state, additiona
1049c 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0d 0a 2a l lock states..*
1049d 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 * are inserted i
1049e 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 n between. The
1049f 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 locking might fa
104a0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 il on one of the
104a1 20 6c 61 74 65 72 0d 0a 2a 2a 20 74 72 61 6e 73 later..** trans
104a2 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 itions leaving t
104a3 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 he lock state di
104a4 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 fferent from wha
104a5 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 t it started but
104a6 0d 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 ..** still short
104a7 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 of its goal. T
104a8 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 he following cha
104a9 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c rt shows the all
104aa 6f 77 65 64 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 owed..** transit
104ab 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 ions and the ins
104ac 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 erted intermedia
104ad 74 65 20 73 74 61 74 65 73 3a 0d 0a 2a 2a 0d 0a te states:..**..
104ae 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d ** UNLOCKED -
104af 3e 20 53 48 41 52 45 44 0d 0a 2a 2a 20 20 20 20 > SHARED..**
104b0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 SHARED -> RESERV
104b1 45 44 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 ED..** SHARED
104b2 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e -> (PENDING) ->
104b3 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 20 EXCLUSIVE..**
104b4 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 RESERVED -> (P
104b5 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 ENDING) -> EXCLU
104b6 53 49 56 45 0d 0a 2a 2a 20 20 20 20 50 45 4e 44 SIVE..** PEND
104b7 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 ING -> EXCLUSIVE
104b8 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f ..**..** This ro
104b9 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 utine will only
104ba 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e increase a lock.
104bb 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 Use the sqlite
104bc 33 4f 73 55 6e 6c 6f 63 6b 28 29 0d 0a 2a 2a 20 3OsUnlock()..**
104bd 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 routine to lower
104be 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c a locking level
104bf 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
104c0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 t afpLock(sqlite
104c1 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
104c2 65 46 69 6c 65 4c 6f 63 6b 29 7b 0d 0a 20 20 69 eFileLock){.. i
104c3 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
104c4 4b 3b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a K;.. unixFile *
104c5 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c pFile = (unixFil
104c6 65 2a 29 69 64 3b 0d 0a 20 20 75 6e 69 78 49 6e e*)id;.. unixIn
104c7 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 odeInfo *pInode
104c8 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b = pFile->pInode;
104c9 0d 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f .. afpLockingCo
104ca 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d ntext *context =
104cb 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 (afpLockingCont
104cc 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f ext *) pFile->lo
104cd 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a 20 ckingContext;..
104ce 20 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 .. assert( pFi
104cf 6c 65 20 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 le );.. OSTRACE
104d0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 (("LOCK %d %s
104d1 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 was %s(%s,%d) p
104d2 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 id=%d (afp)\n",
104d3 70 46 69 6c 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 pFile->h,..
104d4 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b azFileLock
104d5 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 (eFileLock), azF
104d6 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 ileLock(pFile->e
104d7 46 69 6c 65 4c 6f 63 6b 29 2c 0d 0a 20 20 20 20 FileLock),..
104d8 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 azFileLoc
104d9 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c k(pInode->eFileL
104da 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 ock), pInode->nS
104db 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 hared , getpid()
104dc 29 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 ));.... /* If t
104dd 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 here is already
104de 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 a lock of this t
104df 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 ype or more rest
104e0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0d 0a rictive on the..
104e1 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 ** unixFile, d
104e2 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 o nothing. Don't
104e3 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 use the afp_end
104e4 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 _lock: exit path
104e5 2c 20 61 73 0d 0a 20 20 2a 2a 20 75 6e 69 78 45 , as.. ** unixE
104e6 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e nterMutex() hasn
104e7 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 't been called y
104e8 65 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 et... */.. if(
104e9 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
104ea 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d k>=eFileLock ){.
104eb 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c . OSTRACE(("L
104ec 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 OCK %d %s ok
104ed 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 (already held) (
104ee 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e afp)\n", pFile->
104ef 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 61 h,.. a
104f0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c zFileLock(eFileL
104f1 6f 63 6b 29 29 29 3b 0d 0a 20 20 20 20 72 65 74 ock)));.. ret
104f2 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
104f3 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4d 61 6b 65 }.... /* Make
104f4 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e sure the lockin
104f5 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f g sequence is co
104f6 72 72 65 63 74 0d 0a 20 20 2a 2a 20 20 28 31 29 rrect.. ** (1)
104f7 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 We never move f
104f8 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 rom unlocked to
104f9 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 anything higher
104fa 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b than shared lock
104fb 2e 0d 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c ... ** (2) SQL
104fc 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 ite never explic
104fd 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 itly requests a
104fe 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0d 0a 20 20 pendig lock...
104ff 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 ** (3) A shared
10500 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 lock is always
10501 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 held when a rese
10502 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 rve lock is requ
10503 65 73 74 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 ested... */..
10504 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 assert( pFile->e
10505 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 FileLock!=NO_LOC
10506 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d K || eFileLock==
10507 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a SHARED_LOCK );..
10508 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c assert( eFileL
10509 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 ock!=PENDING_LOC
1050a 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 K );.. assert(
1050b 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 eFileLock!=RESER
1050c 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c VED_LOCK || pFil
1050d 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 e->eFileLock==SH
1050e 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 ARED_LOCK );..
1050f 0d 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 .. /* This mute
10510 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 x is needed beca
10511 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 use pFile->pInod
10512 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f e is shared acro
10513 73 73 20 74 68 72 65 61 64 73 0d 0a 20 20 2a 2f ss threads.. */
10514 0d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 .. unixEnterMut
10515 65 78 28 29 3b 0d 0a 20 20 70 49 6e 6f 64 65 20 ex();.. pInode
10516 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b = pFile->pInode;
10517 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 .... /* If some
10518 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 thread using th
10519 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 is PID has a loc
1051a 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e k via a differen
1051b 74 20 75 6e 69 78 46 69 6c 65 2a 0d 0a 20 20 2a t unixFile*.. *
1051c 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 * handle that pr
1051d 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 ecludes the requ
1051e 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 ested lock, retu
1051f 72 6e 20 42 55 53 59 2e 0d 0a 20 20 2a 2f 0d 0a rn BUSY... */..
10520 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 if( (pFile->eF
10521 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d ileLock!=pInode-
10522 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0d 0a >eFileLock && ..
10523 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e (pInode->
10524 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 eFileLock>=PENDI
10525 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 NG_LOCK || eFile
10526 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b Lock>SHARED_LOCK
10527 29 29 0d 0a 20 20 20 20 20 29 7b 0d 0a 20 20 20 )).. ){..
10528 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 rc = SQLITE_BUS
10529 59 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 Y;.. goto afp
1052a 5f 65 6e 64 5f 6c 6f 63 6b 3b 0d 0a 20 20 7d 0d _end_lock;.. }.
1052b 0a 20 20 0d 0a 20 20 2f 2a 20 49 66 20 61 20 53 . .. /* If a S
1052c 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 HARED lock is re
1052d 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d quested, and som
1052e 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 e thread using t
1052f 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0d his PID already.
10530 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 . ** has a SHAR
10531 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c ED or RESERVED l
10532 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d ock, then increm
10533 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f ent reference co
10534 75 6e 74 73 20 61 6e 64 0d 0a 20 20 2a 2a 20 72 unts and.. ** r
10535 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
10536 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 65 46 .. */.. if( eF
10537 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f ileLock==SHARED_
10538 4c 4f 43 4b 20 26 26 20 0d 0a 20 20 20 20 20 28 LOCK && .. (
10539 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 pInode->eFileLoc
1053a 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c k==SHARED_LOCK |
1053b 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c | pInode->eFileL
1053c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f ock==RESERVED_LO
1053d 43 4b 29 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 CK) ){.. asse
1053e 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 rt( eFileLock==S
1053f 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 HARED_LOCK );..
10540 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 assert( pFile
10541 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 ->eFileLock==0 )
10542 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
10543 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 Inode->nShared>0
10544 20 29 3b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e );.. pFile->
10545 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 eFileLock = SHAR
10546 45 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 70 49 ED_LOCK;.. pI
10547 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b node->nShared++;
10548 0d 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c .. pInode->nL
10549 6f 63 6b 2b 2b 3b 0d 0a 20 20 20 20 67 6f 74 6f ock++;.. goto
1054a 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0d 0a afp_end_lock;..
1054b 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 2f 2a 20 }.. .. /*
1054c 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 A PENDING lock i
1054d 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 s needed before
1054e 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 acquiring a SHAR
1054f 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f ED lock and befo
10550 72 65 0d 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 re.. ** acquiri
10551 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 ng an EXCLUSIVE
10552 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 lock. For the S
10553 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 HARED lock, the
10554 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0d 0a 20 20 PENDING will..
10555 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0d ** be released..
10556 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 65 46 69 . */.. if( eFi
10557 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c leLock==SHARED_L
10558 4f 43 4b 20 0d 0a 20 20 20 20 20 20 7c 7c 20 28 OCK .. || (
10559 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 eFileLock==EXCLU
1055a 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 SIVE_LOCK && pFi
1055b 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 le->eFileLock<PE
1055c 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0d 0a 20 20 29 NDING_LOCK).. )
1055d 7b 0d 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 {.. int faile
1055e 64 3b 0d 0a 20 20 20 20 66 61 69 6c 65 64 20 3d d;.. failed =
1055f 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 afpSetLock(cont
10560 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 ext->dbPath, pFi
10561 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 le, PENDING_BYTE
10562 2c 20 31 2c 20 31 29 3b 0d 0a 20 20 20 20 69 66 , 1, 1);.. if
10563 20 28 66 61 69 6c 65 64 29 20 7b 0d 0a 20 20 20 (failed) {..
10564 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0d rc = failed;.
10565 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f . goto afp_
10566 65 6e 64 5f 6c 6f 63 6b 3b 0d 0a 20 20 20 20 7d end_lock;.. }
10567 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 .. }.. .. /*
10568 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 If control gets
10569 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 to this point, t
1056a 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 hen actually go
1056b 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0d 0a ahead and make..
1056c 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 ** operating s
1056d 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 ystem calls for
1056e 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f the specified lo
1056f 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 ck... */.. if(
10570 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 eFileLock==SHAR
10571 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 ED_LOCK ){..
10572 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 int lrc1, lrc2,
10573 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0d 0a lrc1Errno = 0;..
10574 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 long lk, mas
10575 6b 3b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 61 73 k;.. .. as
10576 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 sert( pInode->nS
10577 68 61 72 65 64 3d 3d 30 20 29 3b 0d 0a 20 20 20 hared==0 );..
10578 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d assert( pInode-
10579 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b >eFileLock==0 );
1057a 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 .. ..
1057b 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c mask = (sizeof(l
1057c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 ong)==8) ? LARGE
1057d 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 ST_INT64 : 0x7ff
1057e 66 66 66 66 66 3b 0d 0a 20 20 20 20 2f 2a 20 4e fffff;.. /* N
1057f 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d ow get the read-
10580 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b lock SHARED_LOCK
10581 20 2a 2f 0d 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 */.. /* note
10582 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 that the qualit
10583 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e y of the randomn
10584 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 ess doesn't matt
10585 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0d er that much */.
10586 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d . lk = random
10587 28 29 3b 20 0d 0a 20 20 20 20 70 49 6e 6f 64 65 (); .. pInode
10588 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 ->sharedByte = (
10589 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 lk & mask)%(SHAR
1058a 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0d 0a 20 ED_SIZE - 1);..
1058b 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 lrc1 = afpSet
1058c 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 Lock(context->db
1058d 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0d 0a 20 Path, pFile, ..
1058e 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f SHARED_
1058f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 FIRST+pInode->sh
10590 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b aredByte, 1, 1);
10591 0d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 .. if( IS_LOC
10592 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b K_ERROR(lrc1) ){
10593 0d 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e .. lrc1Errn
10594 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 o = pFile->lastE
10595 72 72 6e 6f 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 rrno;.. }..
10596 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 /* Drop the te
10597 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 mporary PENDING
10598 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 6c 72 63 lock */.. lrc
10599 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 2 = afpSetLock(c
1059a 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 ontext->dbPath,
1059b 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 pFile, PENDING_B
1059c 59 54 45 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 20 YTE, 1, 0);..
1059d 20 0d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f .. if( IS_LO
1059e 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 CK_ERROR(lrc1) )
1059f 20 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d {.. pFile-
105a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 >lastErrno = lrc
105a1 31 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 72 1Errno;.. r
105a2 63 20 3d 20 6c 72 63 31 3b 0d 0a 20 20 20 20 20 c = lrc1;..
105a3 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f goto afp_end_lo
105a4 63 6b 3b 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ck;.. } else
105a5 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f if( IS_LOCK_ERRO
105a6 52 28 6c 72 63 32 29 20 29 7b 0d 0a 20 20 20 20 R(lrc2) ){..
105a7 20 20 72 63 20 3d 20 6c 72 63 32 3b 0d 0a 20 20 rc = lrc2;..
105a8 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 goto afp_end
105a9 5f 6c 6f 63 6b 3b 0d 0a 20 20 20 20 7d 20 65 6c _lock;.. } el
105aa 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 se if( lrc1 != S
105ab 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0d 0a 20 20 QLITE_OK ) {..
105ac 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0d 0a rc = lrc1;..
105ad 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 } else {..
105ae 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 pFile->eFile
105af 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f Lock = SHARED_LO
105b0 43 4b 3b 0d 0a 20 20 20 20 20 20 70 49 6e 6f 64 CK;.. pInod
105b1 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0d 0a 20 20 20 e->nLock++;..
105b2 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 pInode->nShar
105b3 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a ed = 1;.. }..
105b4 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c }else if( eFil
105b5 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 eLock==EXCLUSIVE
105b6 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d _LOCK && pInode-
105b7 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0d 0a 20 >nShared>1 ){..
105b8 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 /* We are try
105b9 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 ing for an exclu
105ba 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e sive lock but an
105bb 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 other thread in
105bc 74 68 69 73 0d 0a 20 20 20 20 20 2a 2a 20 73 61 this.. ** sa
105bd 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 me process is st
105be 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 ill holding a sh
105bf 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0d 0a 20 ared lock. */..
105c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
105c1 55 53 59 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a USY;.. }else{..
105c2 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 /* The reque
105c3 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 st was for a RES
105c4 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 ERVED or EXCLUSI
105c5 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0d VE lock. It is.
105c6 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 . ** assumed
105c7 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 that there is a
105c8 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 SHARED or greate
105c9 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 r lock on the fi
105ca 6c 65 0d 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 le.. ** alrea
105cb 64 79 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 dy... */..
105cc 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b int failed = 0;
105cd 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 .. assert( 0!
105ce 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 =pFile->eFileLoc
105cf 6b 20 29 3b 0d 0a 20 20 20 20 69 66 20 28 65 46 k );.. if (eF
105d0 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 ileLock >= RESER
105d1 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c VED_LOCK && pFil
105d2 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 e->eFileLock < R
105d3 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0d ESERVED_LOCK) {.
105d4 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 . /* Acqu
105d5 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c ire a RESERVED l
105d6 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 ock */..
105d7 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c failed = afpSetL
105d8 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 ock(context->dbP
105d9 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 ath, pFile, RESE
105da 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b RVED_BYTE, 1,1);
105db 0d 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 .. if( !fai
105dc 6c 65 64 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 led ){..
105dd 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 context->reserve
105de 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d d = 1;.. }.
105df 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 20 28 . }.. if (
105e0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 !failed && eFile
105e1 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 Lock == EXCLUSIV
105e2 45 5f 4c 4f 43 4b 29 20 7b 0d 0a 20 20 20 20 20 E_LOCK) {..
105e3 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 /* Acquire an E
105e4 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f XCLUSIVE lock */
105e5 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 .. ..
105e6 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 /* Remove the
105e7 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f shared lock befo
105e8 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 re trying the ra
105e9 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 nge. we'll need
105ea 20 74 6f 20 0d 0a 20 20 20 20 20 20 2a 2a 20 72 to .. ** r
105eb 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 eestablish the s
105ec 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 hared lock if we
105ed 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 can't get the
105ee 61 66 70 55 6e 6c 6f 63 6b 0d 0a 20 20 20 20 20 afpUnlock..
105ef 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 21 */.. if( !
105f0 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 (failed = afpSet
105f1 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 Lock(context->db
105f2 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 Path, pFile, SHA
105f3 52 45 44 5f 46 49 52 53 54 20 2b 0d 0a 20 20 20 RED_FIRST +..
105f4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
105f5 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 pInode->sh
105f6 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 aredByte, 1, 0))
105f7 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 ){.. int
105f8 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 failed2 = SQLIT
105f9 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 2f E_OK;.. /
105fa 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 * now attemmpt t
105fb 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 o get the exclus
105fc 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a ive lock range *
105fd 2f 0d 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 /.. faile
105fe 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 d = afpSetLock(c
105ff 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 ontext->dbPath,
10600 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 pFile, SHARED_FI
10601 52 53 54 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 RST, ..
10602 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10603 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a SHARED_SIZ
10604 45 2c 20 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 E, 1);..
10605 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 if( failed && (f
10606 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c ailed2 = afpSetL
10607 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 ock(context->dbP
10608 61 74 68 2c 20 70 46 69 6c 65 2c 20 0d 0a 20 20 ath, pFile, ..
10609 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1060a 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 SHARED_FIRS
1060b 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 T + pInode->shar
1060c 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 edByte, 1, 1)) )
1060d 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 {.. /*
1060e 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 Can't reestablis
1060f 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 h the shared loc
10610 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 k. Sqlite can't
10611 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0d 0a deal, this is..
10612 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 ** a c
10613 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f ritical I/O erro
10614 72 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0d r.. */.
10615 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
10616 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 ((failed & SQLIT
10617 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 E_IOERR) == SQLI
10618 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c TE_IOERR) ? fail
10619 65 64 32 20 3a 20 0d 0a 20 20 20 20 20 20 20 20 ed2 : ..
1061a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f SQLITE_IO
1061b 45 52 52 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 ERR_LOCK;..
1061c 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e goto afp_en
1061d 64 5f 6c 6f 63 6b 3b 0d 0a 20 20 20 20 20 20 20 d_lock;..
1061e 20 7d 20 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 } .. }else
1061f 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {.. rc =
10620 66 61 69 6c 65 64 3b 20 0d 0a 20 20 20 20 20 20 failed; ..
10621 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 }.. }.. if
10622 28 20 66 61 69 6c 65 64 20 29 7b 0d 0a 20 20 20 ( failed ){..
10623 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0d rc = failed;.
10624 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d . }.. }.. .
10625 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
10626 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 46 69 E_OK ){.. pFi
10627 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 le->eFileLock =
10628 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 eFileLock;..
10629 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 pInode->eFileLoc
1062a 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a k = eFileLock;..
1062b 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c }else if( eFil
1062c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 eLock==EXCLUSIVE
1062d 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 70 46 _LOCK ){.. pF
1062e 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d ile->eFileLock =
1062f 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0d 0a PENDING_LOCK;..
10630 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c pInode->eFil
10631 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f eLock = PENDING_
10632 4c 4f 43 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a LOCK;.. }.. ..
10633 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0d 0a 20 afp_end_lock:..
10634 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 unixLeaveMutex(
10635 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 );.. OSTRACE(("
10636 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 LOCK %d %s %s
10637 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 (afp)\n", pFile
10638 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 ->h, azFileLock(
10639 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0d 0a 20 20 eFileLock), ..
1063a 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 rc==SQLIT
1063b 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 E_OK ? "ok" : "f
1063c 61 69 6c 65 64 22 29 29 3b 0d 0a 20 20 72 65 74 ailed"));.. ret
1063d 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1063e 0d 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c ..** Lower the l
1063f 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 ocking level on
10640 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 file descriptor
10641 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f pFile to eFileLo
10642 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0d 0a ck. eFileLock..
10643 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 ** must be eithe
10644 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 r NO_LOCK or SHA
10645 52 45 44 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a RED_LOCK...**..*
10646 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 * If the locking
10647 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 level of the fi
10648 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 le descriptor is
10649 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 already at or b
1064a 65 6c 6f 77 0d 0a 2a 2a 20 74 68 65 20 72 65 71 elow..** the req
1064b 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c uested locking l
1064c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 evel, this routi
1064d 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a ne is a no-op...
1064e 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 */..static int a
1064f 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 fpUnlock(sqlite3
10650 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 _file *id, int e
10651 46 69 6c 65 4c 6f 63 6b 29 20 7b 0d 0a 20 20 69 FileLock) {.. i
10652 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
10653 4b 3b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a K;.. unixFile *
10654 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c pFile = (unixFil
10655 65 2a 29 69 64 3b 0d 0a 20 20 75 6e 69 78 49 6e e*)id;.. unixIn
10656 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b odeInfo *pInode;
10657 0d 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f .. afpLockingCo
10658 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d ntext *context =
10659 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 (afpLockingCont
1065a 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f ext *) pFile->lo
1065b 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a 20 ckingContext;..
1065c 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 int skipShared
1065d 3d 20 30 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c = 0;..#ifdef SQL
1065e 49 54 45 5f 54 45 53 54 0d 0a 20 20 69 6e 74 20 ITE_TEST.. int
1065f 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0d 0a 23 h = pFile->h;..#
10660 65 6e 64 69 66 0d 0a 0d 0a 20 20 61 73 73 65 72 endif.... asser
10661 74 28 20 70 46 69 6c 65 20 29 3b 0d 0a 20 20 4f t( pFile );.. O
10662 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 STRACE(("UNLOCK
10663 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 %d %d was %d(%d
10664 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 ,%d) pid=%d (afp
10665 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 )\n", pFile->h,
10666 65 46 69 6c 65 4c 6f 63 6b 2c 0d 0a 20 20 20 20 eFileLock,..
10667 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 pFile->eF
10668 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e ileLock, pFile->
10669 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 pInode->eFileLoc
1066a 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 k, pFile->pInode
1066b 2d 3e 6e 53 68 61 72 65 64 2c 0d 0a 20 20 20 20 ->nShared,..
1066c 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 getpid())
1066d 29 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 );.... assert(
1066e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 eFileLock<=SHARE
1066f 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 69 66 28 D_LOCK );.. if(
10670 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 pFile->eFileLoc
10671 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0d k<=eFileLock ){.
10672 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
10673 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 75 TE_OK;.. }.. u
10674 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b nixEnterMutex();
10675 0d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 .. pInode = pFi
10676 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0d 0a 20 20 61 le->pInode;.. a
10677 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e ssert( pInode->n
10678 53 68 61 72 65 64 21 3d 30 20 29 3b 0d 0a 20 20 Shared!=0 );..
10679 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 if( pFile->eFile
1067a 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b Lock>SHARED_LOCK
1067b 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 ){.. assert(
1067c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f pInode->eFileLo
1067d 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 ck==pFile->eFile
1067e 4c 6f 63 6b 20 29 3b 0d 0a 20 20 20 20 53 69 6d Lock );.. Sim
1067f 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
10680 67 6e 28 31 29 3b 0d 0a 20 20 20 20 53 69 6d 75 gn(1);.. Simu
10681 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 lateIOError( h=(
10682 2d 31 29 20 29 0d 0a 20 20 20 20 53 69 6d 75 6c -1) ).. Simul
10683 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e ateIOErrorBenign
10684 28 30 29 3b 0d 0a 20 20 20 20 0d 0a 23 69 66 6e (0);.. ..#ifn
10685 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 def NDEBUG..
10686 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 /* When reducing
10687 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 a lock such tha
10688 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 t other processe
10689 73 20 63 61 6e 20 73 74 61 72 74 0d 0a 20 20 20 s can start..
1068a 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 ** reading the
1068b 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 database file ag
1068c 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 ain, make sure t
1068d 68 61 74 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 hat the.. **
1068e 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e transaction coun
1068f 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 ter was updated
10690 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 if any part of t
10691 68 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 he database..
10692 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 ** file changed
10693 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 . If the transa
10694 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 ction counter is
10695 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0d 0a 20 not updated,..
10696 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e ** other conn
10697 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 ections to the s
10698 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e ame file might n
10699 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0d ot realize that.
1069a 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 . ** the file
1069b 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 has changed and
1069c 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 hence might not
1069d 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 know to flush t
1069e 68 65 69 72 0d 0a 20 20 20 20 2a 2a 20 63 61 63 heir.. ** cac
1069f 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 he. The use of
106a0 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 a stale cache ca
106a1 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 n lead to databa
106a2 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0d 0a se corruption...
106a3 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 */.. asse
106a4 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 rt( pFile->inNor
106a5 6d 61 6c 57 72 69 74 65 3d 3d 30 0d 0a 20 20 20 malWrite==0..
106a6 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 || pFile
106a7 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0d 0a 20 ->dbUpdate==0..
106a8 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 || pFi
106a9 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e le->transCntrChn
106aa 67 3d 3d 31 20 29 3b 0d 0a 20 20 20 20 70 46 69 g==1 );.. pFi
106ab 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 le->inNormalWrit
106ac 65 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a e = 0;..#endif..
106ad 20 20 20 20 0d 0a 20 20 20 20 69 66 28 20 70 46 .. if( pF
106ae 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d ile->eFileLock==
106af 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 EXCLUSIVE_LOCK )
106b0 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 {.. rc = af
106b1 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 pSetLock(context
106b2 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c ->dbPath, pFile,
106b3 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 SHARED_FIRST, S
106b4 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0d HARED_SIZE, 0);.
106b5 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 . if( rc==S
106b6 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 QLITE_OK && (eFi
106b7 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c leLock==SHARED_L
106b8 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e OCK || pInode->n
106b9 53 68 61 72 65 64 3e 31 29 20 29 7b 0d 0a 20 20 Shared>1) ){..
106ba 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 /* only re
106bb 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 -establish the s
106bc 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 hared lock if ne
106bd 63 65 73 73 61 72 79 20 2a 2f 0d 0a 20 20 20 20 cessary */..
106be 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f int sharedLo
106bf 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f ckByte = SHARED_
106c0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 FIRST+pInode->sh
106c1 61 72 65 64 42 79 74 65 3b 0d 0a 20 20 20 20 20 aredByte;..
106c2 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f rc = afpSetLo
106c3 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 ck(context->dbPa
106c4 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 th, pFile, share
106c5 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 dLockByte, 1, 1)
106c6 3b 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 ;.. } else
106c7 7b 0d 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 {.. skipS
106c8 68 61 72 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 hared = 1;..
106c9 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
106ca 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
106cb 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c K && pFile->eFil
106cc 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c eLock>=PENDING_L
106cd 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 OCK ){.. rc
106ce 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f = afpSetLock(co
106cf 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 ntext->dbPath, p
106d0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 File, PENDING_BY
106d1 54 45 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 20 20 TE, 1, 0);..
106d2 7d 20 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d } .. if( rc==
106d3 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 SQLITE_OK && pFi
106d4 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 le->eFileLock>=R
106d5 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 ESERVED_LOCK &&
106d6 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 context->reserve
106d7 64 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d d ){.. rc =
106d8 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 afpSetLock(cont
106d9 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 ext->dbPath, pFi
106da 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 le, RESERVED_BYT
106db 45 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 20 20 20 E, 1, 0);..
106dc 20 69 66 28 20 21 72 63 20 29 7b 20 0d 0a 20 20 if( !rc ){ ..
106dd 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 context->r
106de 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0d 0a 20 eserved = 0; ..
106df 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
106e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
106e1 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f E_OK && (eFileLo
106e2 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 ck==SHARED_LOCK
106e3 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 || pInode->nShar
106e4 65 64 3e 31 29 29 7b 0d 0a 20 20 20 20 20 20 70 ed>1)){.. p
106e5 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b Inode->eFileLock
106e6 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0d = SHARED_LOCK;.
106e7 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 . }.. }.. i
106e8 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
106e9 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e && eFileLock==N
106ea 4f 5f 4c 4f 43 4b 20 29 7b 0d 0a 0d 0a 20 20 20 O_LOCK ){....
106eb 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 /* Decrement th
106ec 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f e shared lock co
106ed 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 unter. Release
106ee 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 the lock using a
106ef 6e 0d 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c n.. ** OS cal
106f0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 l only when all
106f1 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 threads in this
106f2 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 same process hav
106f3 65 20 72 65 6c 65 61 73 65 64 0d 0a 20 20 20 20 e released..
106f4 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0d 0a 20 20 ** the lock...
106f5 20 20 2a 2f 0d 0a 20 20 20 20 75 6e 73 69 67 6e */.. unsign
106f6 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 ed long long sha
106f7 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 redLockByte = SH
106f8 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 ARED_FIRST+pInod
106f9 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0d 0a e->sharedByte;..
106fa 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 pInode->nSha
106fb 72 65 64 2d 2d 3b 0d 0a 20 20 20 20 69 66 28 20 red--;.. if(
106fc 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d pInode->nShared=
106fd 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 53 69 6d =0 ){.. Sim
106fe 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
106ff 67 6e 28 31 29 3b 0d 0a 20 20 20 20 20 20 53 69 gn(1);.. Si
10700 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 mulateIOError( h
10701 3d 28 2d 31 29 20 29 0d 0a 20 20 20 20 20 20 53 =(-1) ).. S
10702 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 imulateIOErrorBe
10703 6e 69 67 6e 28 30 29 3b 0d 0a 20 20 20 20 20 20 nign(0);..
10704 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 if( !skipShared
10705 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
10706 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 afpSetLock(cont
10707 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 ext->dbPath, pFi
10708 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 le, sharedLockBy
10709 74 65 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 20 20 te, 1, 0);..
1070a 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 21 }.. if( !
1070b 72 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 rc ){.. p
1070c 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b Inode->eFileLock
1070d 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 = NO_LOCK;..
1070e 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c pFile->eFil
1070f 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b eLock = NO_LOCK;
10710 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
10711 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
10712 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
10713 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d pInode->nLock-
10714 2d 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 -;.. assert
10715 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e ( pInode->nLock>
10716 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 =0 );.. if(
10717 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d pInode->nLock==
10718 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 0 ){.. cl
10719 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 osePendingFds(pF
1071a 69 6c 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a ile);.. }..
1071b 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d 0a }.. }.. ..
1071c 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 unixLeaveMutex
1071d 28 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 ();.. if( rc==S
1071e 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 QLITE_OK ) pFile
1071f 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 ->eFileLock = eF
10720 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 72 65 74 75 ileLock;.. retu
10721 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
10722 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 .** Close a file
10723 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 & cleanup AFP s
10724 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 pecific locking
10725 63 6f 6e 74 65 78 74 20 0d 0a 2a 2f 0d 0a 73 74 context ..*/..st
10726 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 atic int afpClos
10727 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a e(sqlite3_file *
10728 69 64 29 20 7b 0d 0a 20 20 69 6e 74 20 72 63 20 id) {.. int rc
10729 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
1072a 69 66 28 20 69 64 20 29 7b 0d 0a 20 20 20 20 75 if( id ){.. u
1072b 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d nixFile *pFile =
1072c 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d (unixFile*)id;.
1072d 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 . afpUnlock(i
1072e 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 d, NO_LOCK);..
1072f 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 unixEnterMutex
10730 28 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 46 69 ();.. if( pFi
10731 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 le->pInode && pF
10732 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f ile->pInode->nLo
10733 63 6b 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 ck ){.. /*
10734 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 If there are out
10735 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 standing locks,
10736 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 do not actually
10737 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a close the file j
10738 75 73 74 0d 0a 20 20 20 20 20 20 2a 2a 20 79 65 ust.. ** ye
10739 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 t because that w
1073a 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 ould clear those
1073b 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 locks. Instead
1073c 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0d 0a , add the file..
1073d 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 ** descrip
1073e 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 tor to pInode->a
1073f 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c Pending. It wil
10740 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c l be automatical
10741 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0d 0a ly closed when..
10742 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 ** the las
10743 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 t lock is cleare
10744 64 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 d... */..
10745 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 setPendingFd
10746 28 70 46 69 6c 65 29 3b 0d 0a 20 20 20 20 7d 0d (pFile);.. }.
10747 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 . releaseInod
10748 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0d 0a 20 eInfo(pFile);..
10749 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
1074a 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f pFile->lockingCo
1074b 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 72 63 20 ntext);.. rc
1074c 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 = closeUnixFile(
1074d 69 64 29 3b 0d 0a 20 20 20 20 75 6e 69 78 4c 65 id);.. unixLe
1074e 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 20 20 7d aveMutex();.. }
1074f 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
10750 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 }....#endif /* d
10751 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f efined(__APPLE__
10752 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 ) && SQLITE_ENAB
10753 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 LE_LOCKING_STYLE
10754 20 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 */../*..** The
10755 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 code above is th
10756 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 e AFP lock imple
10757 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 mentation. The
10758 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 code is specific
10759 0d 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 ..** to MacOSX a
1075a 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b nd does not work
1075b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 on other unix p
1075c 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c latforms. No al
1075d 74 65 72 6e 61 74 69 76 65 0d 0a 2a 2a 20 69 73 ternative..** is
1075e 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 available. If
1075f 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c you don't compil
10760 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 e for a mac, the
10761 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 n the "unix-afp"
10762 0d 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 ..** VFS is not
10763 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a available...**..
10764 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10765 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 ***** End of the
10766 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d AFP lock implem
10767 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a entation *******
10768 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
10769 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
1076a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1076b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1076c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1076d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
1076e 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
1076f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10771 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10772 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10773 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***..***********
10774 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10775 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 Begin NFS Locki
10776 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ng *************
10777 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10778 2a 2a 2a 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69 ***/....#if defi
10779 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 ned(__APPLE__) &
1077a 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f & SQLITE_ENABLE_
1077b 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 2f LOCKING_STYLE../
1077c 2a 0d 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 *.. ** Lower the
1077d 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f locking level o
1077e 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f n file descripto
1077f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 r pFile to eFile
10780 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b Lock. eFileLock
10781 0d 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 .. ** must be ei
10782 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 ther NO_LOCK or
10783 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0d 0a 20 2a SHARED_LOCK... *
10784 2a 0d 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f *.. ** If the lo
10785 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 cking level of t
10786 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 he file descript
10787 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 or is already at
10788 20 6f 72 20 62 65 6c 6f 77 0d 0a 20 2a 2a 20 74 or below.. ** t
10789 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 he requested loc
1078a 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 king level, this
1078b 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f routine is a no
1078c 2d 6f 70 2e 0d 0a 20 2a 2f 0d 0a 73 74 61 74 69 -op... */..stati
1078d 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 c int nfsUnlock(
1078e 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
1078f 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 , int eFileLock)
10790 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 {.. return posi
10791 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c xUnlock(id, eFil
10792 65 4c 6f 63 6b 2c 20 31 29 3b 0d 0a 7d 0d 0a 0d eLock, 1);..}...
10793 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e .#endif /* defin
10794 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 ed(__APPLE__) &&
10795 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
10796 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0d OCKING_STYLE */.
10797 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 63 6f 64 65 ./*..** The code
10798 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 above is the NF
10799 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 S lock implement
1079a 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 ation. The code
1079b 20 69 73 20 73 70 65 63 69 66 69 63 0d 0a 2a 2a is specific..**
1079c 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 to MacOSX and d
1079d 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 oes not work on
1079e 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 other unix platf
1079f 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e orms. No altern
107a0 61 74 69 76 65 0d 0a 2a 2a 20 69 73 20 61 76 61 ative..** is ava
107a1 69 6c 61 62 6c 65 2e 20 20 0d 0a 2a 2a 0d 0a 2a ilable. ..**..*
107a2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107a3 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 **** End of the
107a4 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 NFS lock impleme
107a5 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a ntation ********
107a6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a **************..
107a7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107a8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107a9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107aa 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107ab 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
107ac 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
107ad 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107ae 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107af 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107b1 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
107b2 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 **** Non-locking
107b3 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 sqlite3_file me
107b4 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a thods **********
107b5 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
107b6 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ***..**..** The
107b7 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f next division co
107b8 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 ntains implement
107b9 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d ations for all m
107ba 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0d 0a ethods of the ..
107bb 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ** sqlite3_file
107bc 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 object other tha
107bd 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 n the locking me
107be 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b thods. The lock
107bf 69 6e 67 0d 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 ing..** methods
107c0 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 were defined in
107c1 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 divisions above
107c2 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 (one locking met
107c3 68 6f 64 20 70 65 72 0d 0a 2a 2a 20 64 69 76 69 hod per..** divi
107c4 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 sion). Those me
107c5 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 thods that are c
107c6 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 ommon to all loc
107c7 6b 69 6e 67 20 6d 6f 64 65 73 0d 0a 2a 2a 20 61 king modes..** a
107c8 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 re gather togeth
107c9 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 er into this div
107ca 69 73 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a ision...*/..../*
107cb 0d 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 ..** Seek to the
107cc 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 offset passed a
107cd 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 s the second arg
107ce 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 ument, then read
107cf 20 63 6e 74 20 0d 0a 2a 2a 20 62 79 74 65 73 20 cnt ..** bytes
107d0 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 into pBuf. Retur
107d1 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
107d2 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 bytes actually r
107d3 65 61 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 42 3a ead...**..** NB:
107d4 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 If you define
107d5 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 USE_PREAD or USE
107d6 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 _PREAD64, then i
107d7 74 20 6d 69 67 68 74 20 61 6c 73 6f 0d 0a 2a 2a t might also..**
107d8 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f be necessary to
107d9 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 define _XOPEN_S
107da 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e OURCE to be 500.
107db 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 This varies fr
107dc 6f 6d 0d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 om..** one syste
107dd 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 m to another. S
107de 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 ince SQLite does
107df 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f not define USE_
107e0 50 52 45 41 44 0d 0a 2a 2a 20 61 6e 79 20 61 6e PREAD..** any an
107e1 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c y form by defaul
107e2 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 t, we will not a
107e3 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 ttempt to define
107e4 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0d _XOPEN_SOURCE..
107e5 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 .** See tickets
107e6 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e #2741 and #2681.
107e7 0d 0a 2a 2a 0d 0a 2a 2a 20 54 6f 20 61 76 6f 69 ..**..** To avoi
107e8 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 d stomping the e
107e9 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 rrno value on a
107ea 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 failed read the
107eb 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0d lastErrno value.
107ec 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 .** is set befor
107ed 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2f e returning...*/
107ee 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 ..static int see
107ef 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c kAndRead(unixFil
107f0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 e *id, sqlite3_i
107f1 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 nt64 offset, voi
107f2 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 d *pBuf, int cnt
107f3 29 7b 0d 0a 20 20 69 6e 74 20 67 6f 74 3b 0d 0a ){.. int got;..
107f4 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b int prior = 0;
107f5 0d 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 ..#if (!defined(
107f6 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 USE_PREAD) && !d
107f7 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 efined(USE_PREAD
107f8 36 34 29 29 0d 0a 20 20 69 36 34 20 6e 65 77 4f 64)).. i64 newO
107f9 66 66 73 65 74 3b 0d 0a 23 65 6e 64 69 66 0d 0a ffset;..#endif..
107fa 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0d 0a TIMER_START;..
107fb 20 20 64 6f 7b 0d 0a 23 69 66 20 64 65 66 69 6e do{..#if defin
107fc 65 64 28 55 53 45 5f 50 52 45 41 44 29 0d 0a 20 ed(USE_PREAD)..
107fd 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 got = osPread
107fe 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e (id->h, pBuf, cn
107ff 74 2c 20 6f 66 66 73 65 74 29 3b 0d 0a 20 20 20 t, offset);..
10800 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
10801 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0d 0a 23 ( got = -1 );..#
10802 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 elif defined(USE
10803 5f 50 52 45 41 44 36 34 29 0d 0a 20 20 20 20 67 _PREAD64).. g
10804 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 ot = osPread64(i
10805 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c d->h, pBuf, cnt,
10806 20 6f 66 66 73 65 74 29 3b 0d 0a 20 20 20 20 53 offset);.. S
10807 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
10808 67 6f 74 20 3d 20 2d 31 20 29 3b 0d 0a 23 65 6c got = -1 );..#el
10809 73 65 0d 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 se.. newOffse
1080a 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c t = lseek(id->h,
1080b 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 offset, SEEK_SE
1080c 54 29 3b 0d 0a 20 20 20 20 53 69 6d 75 6c 61 74 T);.. Simulat
1080d 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 eIOError( newOff
1080e 73 65 74 2d 2d 20 29 3b 0d 0a 20 20 20 20 69 66 set-- );.. if
1080f 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 ( newOffset!=off
10810 73 65 74 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 set ){.. if
10811 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d ( newOffset == -
10812 31 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 28 28 1 ){.. ((
10813 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c unixFile*)id)->l
10814 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f astErrno = errno
10815 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
10816 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 . ((unixF
10817 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 ile*)id)->lastEr
10818 72 6e 6f 20 3d 20 30 3b 09 09 09 0d 0a 20 20 20 rno = 0;.....
10819 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 }.. retu
1081a 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 rn -1;.. }..
1081b 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 got = osRead(
1081c 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 id->h, pBuf, cnt
1081d 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 );..#endif..
1081e 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 if( got==cnt ) b
1081f 72 65 61 6b 3b 0d 0a 20 20 20 20 69 66 28 20 67 reak;.. if( g
10820 6f 74 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 ot<0 ){.. i
10821 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 f( errno==EINTR
10822 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 ){ got = 1; cont
10823 69 6e 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 70 inue; }.. p
10824 72 69 6f 72 20 3d 20 30 3b 0d 0a 20 20 20 20 20 rior = 0;..
10825 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 ((unixFile*)id)
10826 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 ->lastErrno = er
10827 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 rno;.. brea
10828 6b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 k;.. }else if
10829 28 20 67 6f 74 3e 30 20 29 7b 0d 0a 20 20 20 20 ( got>0 ){..
1082a 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0d 0a 20 cnt -= got;..
1082b 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 offset += g
1082c 6f 74 3b 0d 0a 20 20 20 20 20 20 70 72 69 6f 72 ot;.. prior
1082d 20 2b 3d 20 67 6f 74 3b 0d 0a 20 20 20 20 20 20 += got;..
1082e 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 pBuf = (void*)(g
1082f 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 ot + (char*)pBuf
10830 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 77 68 );.. }.. }wh
10831 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0d 0a 20 ile( got>0 );..
10832 20 54 49 4d 45 52 5f 45 4e 44 3b 0d 0a 20 20 4f TIMER_END;.. O
10833 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 STRACE(("READ
10834 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 %-3d %5d %7lld
10835 25 6c 6c 75 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 %llu\n",..
10836 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 id->h, got
10837 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 +prior, offset-p
10838 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 rior, TIMER_ELAP
10839 53 45 44 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e SED));.. return
1083a 20 67 6f 74 2b 70 72 69 6f 72 3b 0d 0a 7d 0d 0a got+prior;..}..
1083b 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 61 64 20 64 61 ../*..** Read da
1083c 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 ta from a file i
1083d 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 nto a buffer. R
1083e 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 eturn SQLITE_OK
1083f 69 66 20 61 6c 6c 0d 0a 2a 2a 20 62 79 74 65 73 if all..** bytes
10840 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 were read succe
10841 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 ssfully and SQLI
10842 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 TE_IOERR if anyt
10843 68 69 6e 67 20 67 6f 65 73 0d 0a 2a 2a 20 77 72 hing goes..** wr
10844 6f 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ong...*/..static
10845 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0d 0a int unixRead(..
10846 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
10847 69 64 2c 20 0d 0a 20 20 76 6f 69 64 20 2a 70 42 id, .. void *pB
10848 75 66 2c 20 0d 0a 20 20 69 6e 74 20 61 6d 74 2c uf, .. int amt,
10849 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 .. sqlite3_int6
1084a 34 20 6f 66 66 73 65 74 0d 0a 29 7b 0d 0a 20 20 4 offset..){..
1084b 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 unixFile *pFile
1084c 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 = (unixFile *)id
1084d 3b 0d 0a 20 20 69 6e 74 20 67 6f 74 3b 0d 0a 20 ;.. int got;..
1084e 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0d 0a assert( id );..
1084f 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 .. /* If this i
10850 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c s a database fil
10851 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c e (not a journal
10852 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c , master-journal
10853 20 6f 72 20 74 65 6d 70 0d 0a 20 20 2a 2a 20 66 or temp.. ** f
10854 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 ile), the bytes
10855 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 in the locking r
10856 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 ange should neve
10857 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 r be read or wri
10858 74 74 65 6e 2e 20 2a 2f 0d 0a 23 69 66 20 30 0d tten. */..#if 0.
10859 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 . assert( pFile
1085a 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0d 0a 20 20 ->pUnused==0..
1085b 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d || offset>=
1085c 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 PENDING_BYTE+512
1085d 0d 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 .. || offs
1085e 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f et+amt<=PENDING_
1085f 42 59 54 45 20 0d 0a 20 20 29 3b 0d 0a 23 65 6e BYTE .. );..#en
10860 64 69 66 0d 0a 0d 0a 20 20 67 6f 74 20 3d 20 73 dif.... got = s
10861 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 eekAndRead(pFile
10862 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 , offset, pBuf,
10863 61 6d 74 29 3b 0d 0a 20 20 69 66 28 20 67 6f 74 amt);.. if( got
10864 3d 3d 61 6d 74 20 29 7b 0d 0a 20 20 20 20 72 65 ==amt ){.. re
10865 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
10866 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 . }else if( got
10867 3c 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 6c 61 <0 ){.. /* la
10868 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 stErrno set by s
10869 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0d 0a 20 eekAndRead */..
1086a 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1086b 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0d 0a 20 20 _IOERR_READ;..
1086c 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 46 69 6c }else{.. pFil
1086d 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 e->lastErrno = 0
1086e 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 ; /* not a syste
1086f 6d 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 20 20 m error */..
10870 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 /* Unread parts
10871 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 of the buffer mu
10872 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 st be zero-fille
10873 64 20 2a 2f 0d 0a 20 20 20 20 6d 65 6d 73 65 74 d */.. memset
10874 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b (&((char*)pBuf)[
10875 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 got], 0, amt-got
10876 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 );.. return S
10877 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 QLITE_IOERR_SHOR
10878 54 5f 52 45 41 44 3b 0d 0a 20 20 7d 0d 0a 7d 0d T_READ;.. }..}.
10879 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 65 6b 20 74 .../*..** Seek t
1087a 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 o the offset in
1087b 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 id->offset then
1087c 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 read cnt bytes i
1087d 6e 74 6f 20 70 42 75 66 2e 0d 0a 2a 2a 20 52 65 nto pBuf...** Re
1087e 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 turn the number
1087f 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c of bytes actuall
10880 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 y read. Update
10881 74 68 65 20 6f 66 66 73 65 74 2e 0d 0a 2a 2a 0d the offset...**.
10882 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f .** To avoid sto
10883 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 mping the errno
10884 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 value on a faile
10885 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 d write the last
10886 45 72 72 6e 6f 20 76 61 6c 75 65 0d 0a 2a 2a 20 Errno value..**
10887 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 is set before re
10888 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 turning...*/..st
10889 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 atic int seekAnd
1088a 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a Write(unixFile *
1088b 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 id, i64 offset,
1088c 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 const void *pBuf
1088d 2c 20 69 6e 74 20 63 6e 74 29 7b 0d 0a 20 20 69 , int cnt){.. i
1088e 6e 74 20 67 6f 74 3b 0d 0a 23 69 66 20 28 21 64 nt got;..#if (!d
1088f 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 efined(USE_PREAD
10890 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 ) && !defined(US
10891 45 5f 50 52 45 41 44 36 34 29 29 0d 0a 20 20 69 E_PREAD64)).. i
10892 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0d 0a 23 64 newOffset;..#
10893 65 6e 64 69 66 0d 0a 20 20 54 49 4d 45 52 5f 53 endif.. TIMER_S
10894 54 41 52 54 3b 0d 0a 23 69 66 20 64 65 66 69 6e TART;..#if defin
10895 65 64 28 55 53 45 5f 50 52 45 41 44 29 0d 0a 20 ed(USE_PREAD)..
10896 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 do{ got = osPwr
10897 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c ite(id->h, pBuf,
10898 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d cnt, offset); }
10899 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 while( got<0 &&
1089a 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0d errno==EINTR );.
1089b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 .#elif defined(U
1089c 53 45 5f 50 52 45 41 44 36 34 29 0d 0a 20 20 64 SE_PREAD64).. d
1089d 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 o{ got = osPwrit
1089e 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c e64(id->h, pBuf,
1089f 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 cnt, offset);}w
108a0 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 hile( got<0 && e
108a1 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0d 0a 23 rrno==EINTR);..#
108a2 65 6c 73 65 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20 else.. do{..
108a3 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 newOffset = lse
108a4 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 ek(id->h, offset
108a5 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0d 0a 20 20 , SEEK_SET);..
108a6 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
108a7 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 r( newOffset-- )
108a8 3b 0d 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 ;.. if( newOf
108a9 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0d fset!=offset ){.
108aa 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 . if( newOf
108ab 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0d 0a 20 fset == -1 ){..
108ac 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c ((unixFil
108ad 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e e*)id)->lastErrn
108ae 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 o = errno;..
108af 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
108b0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 ((unixFile*)id
108b1 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 )->lastErrno = 0
108b2 3b 09 09 09 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 ;..... }..
108b3 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0d return -1;.
108b4 0a 20 20 20 20 7d 0d 0a 20 20 20 20 67 6f 74 20 . }.. got
108b5 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c = osWrite(id->h,
108b6 20 70 42 75 66 2c 20 63 6e 74 29 3b 0d 0a 20 20 pBuf, cnt);..
108b7 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 }while( got<0 &&
108b8 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b errno==EINTR );
108b9 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 54 49 4d 45 ..#endif.. TIME
108ba 52 5f 45 4e 44 3b 0d 0a 20 20 69 66 28 20 67 6f R_END;.. if( go
108bb 74 3c 30 20 29 7b 0d 0a 20 20 20 20 28 28 75 6e t<0 ){.. ((un
108bc 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 ixFile*)id)->las
108bd 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d tErrno = errno;.
108be 0a 20 20 7d 0d 0a 0d 0a 20 20 4f 53 54 52 41 43 . }.... OSTRAC
108bf 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 E(("WRITE %-3d
108c0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c %5d %7lld %llu\
108c1 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 n", id->h, got,
108c2 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c offset, TIMER_EL
108c3 41 50 53 45 44 29 29 3b 0d 0a 20 20 72 65 74 75 APSED));.. retu
108c4 72 6e 20 67 6f 74 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a rn got;..}......
108c5 2f 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 /*..** Write dat
108c6 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 a from a buffer
108c7 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 into a file. Re
108c8 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f turn SQLITE_OK o
108c9 6e 20 73 75 63 63 65 73 73 0d 0a 2a 2a 20 6f 72 n success..** or
108ca 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f some other erro
108cb 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 r code on failur
108cc 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 e...*/..static i
108cd 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0d 0a 20 nt unixWrite(..
108ce 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 sqlite3_file *i
108cf 64 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 d, .. const voi
108d0 64 20 2a 70 42 75 66 2c 20 0d 0a 20 20 69 6e 74 d *pBuf, .. int
108d1 20 61 6d 74 2c 0d 0a 20 20 73 71 6c 69 74 65 33 amt,.. sqlite3
108d2 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0d 0a _int64 offset ..
108d3 29 7b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a ){.. unixFile *
108d4 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c pFile = (unixFil
108d5 65 2a 29 69 64 3b 0d 0a 20 20 69 6e 74 20 77 72 e*)id;.. int wr
108d6 6f 74 65 20 3d 20 30 3b 0d 0a 20 20 61 73 73 65 ote = 0;.. asse
108d7 72 74 28 20 69 64 20 29 3b 0d 0a 20 20 61 73 73 rt( id );.. ass
108d8 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0d 0a 0d ert( amt>0 );...
108d9 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 . /* If this is
108da 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 a database file
108db 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c (not a journal,
108dc 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 master-journal
108dd 6f 72 20 74 65 6d 70 0d 0a 20 20 2a 2a 20 66 69 or temp.. ** fi
108de 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 le), the bytes i
108df 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 n the locking ra
108e0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 nge should never
108e1 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 be read or writ
108e2 74 65 6e 2e 20 2a 2f 0d 0a 23 69 66 20 30 0d 0a ten. */..#if 0..
108e3 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d assert( pFile-
108e4 3e 70 55 6e 75 73 65 64 3d 3d 30 0d 0a 20 20 20 >pUnused==0..
108e5 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 || offset>=P
108e6 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0d ENDING_BYTE+512.
108e7 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 . || offse
108e8 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 t+amt<=PENDING_B
108e9 59 54 45 20 0d 0a 20 20 29 3b 0d 0a 23 65 6e 64 YTE .. );..#end
108ea 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 if....#ifndef ND
108eb 45 42 55 47 0d 0a 20 20 2f 2a 20 49 66 20 77 65 EBUG.. /* If we
108ec 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 are doing a nor
108ed 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 mal write to a d
108ee 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 atabase file (as
108ef 20 6f 70 70 6f 73 65 64 20 74 6f 0d 0a 20 20 2a opposed to.. *
108f0 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f * doing a hot-jo
108f1 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f urnal rollback o
108f2 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d r a write to som
108f3 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 e file other tha
108f4 6e 20 61 0d 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c n a.. ** normal
108f5 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 database file)
108f6 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 then record the
108f7 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 fact that the da
108f8 74 61 62 61 73 65 0d 0a 20 20 2a 2a 20 68 61 73 tabase.. ** has
108f9 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 changed. If th
108fa 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f e transaction co
108fb 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 unter is modifie
108fc 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0d 0a d, record that..
108fd 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0d 0a ** fact too...
108fe 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 69 6c */.. if( pFil
108ff 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 e->inNormalWrite
10900 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e ){.. pFile->
10901 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f dbUpdate = 1; /
10902 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 * The database h
10903 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 as been modified
10904 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 6f 66 66 */.. if( off
10905 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 set<=24 && offse
10906 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0d 0a 20 20 t+amt>=27 ){..
10907 20 20 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 int rc;..
10908 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b char oldCntr[
10909 34 5d 3b 0d 0a 20 20 20 20 20 20 53 69 6d 75 6c 4];.. Simul
1090a 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e ateIOErrorBenign
1090b 28 31 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d (1);.. rc =
1090c 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 seekAndRead(pFi
1090d 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c le, 24, oldCntr,
1090e 20 34 29 3b 0d 0a 20 20 20 20 20 20 53 69 6d 75 4);.. Simu
1090f 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 lateIOErrorBenig
10910 6e 28 30 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 n(0);.. if(
10911 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 rc!=4 || memcmp
10912 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 (oldCntr, &((cha
10913 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 r*)pBuf)[24-offs
10914 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0d 0a 20 et], 4)!=0 ){..
10915 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 pFile->tr
10916 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b ansCntrChng = 1;
10917 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 /* The transac
10918 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 tion counter has
10919 20 63 68 61 6e 67 65 64 20 2a 2f 0d 0a 20 20 20 changed */..
1091a 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d }.. }.. }
1091b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 77 68 ..#endif.... wh
1091c 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 ile( amt>0 && (w
1091d 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 rote = seekAndWr
1091e 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 ite(pFile, offse
1091f 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 t, pBuf, amt))>0
10920 20 29 7b 0d 0a 20 20 20 20 61 6d 74 20 2d 3d 20 ){.. amt -=
10921 77 72 6f 74 65 3b 0d 0a 20 20 20 20 6f 66 66 73 wrote;.. offs
10922 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0d 0a 20 20 et += wrote;..
10923 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 pBuf = &((char
10924 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0d *)pBuf)[wrote];.
10925 0a 20 20 7d 0d 0a 20 20 53 69 6d 75 6c 61 74 65 . }.. Simulate
10926 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d IOError(( wrote=
10927 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0d (-1), amt=1 ));.
10928 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 . SimulateDiskf
10929 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 ullError(( wrote
1092a 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0d 0a 0d =0, amt=1 ));...
1092b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0d . if( amt>0 ){.
1092c 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 . if( wrote<0
1092d 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 && pFile->lastE
1092e 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0d rrno!=ENOSPC ){.
1092f 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 . /* lastEr
10930 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 rno set by seekA
10931 6e 64 57 72 69 74 65 20 2a 2f 0d 0a 20 20 20 20 ndWrite */..
10932 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
10933 49 4f 45 52 52 5f 57 52 49 54 45 3b 0d 0a 20 20 IOERR_WRITE;..
10934 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
10935 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
10936 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 = 0; /* not a s
10937 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0d 0a ystem error */..
10938 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
10939 49 54 45 5f 46 55 4c 4c 3b 0d 0a 20 20 20 20 7d ITE_FULL;.. }
1093a 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 .. }.... retur
1093b 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
1093c 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
1093d 5f 54 45 53 54 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f _TEST../*..** Co
1093e 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f unt the number o
1093f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 f fullsyncs and
10940 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 normal syncs. T
10941 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 his is used to t
10942 65 73 74 0d 0a 2a 2a 20 74 68 61 74 20 73 79 6e est..** that syn
10943 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 cs and fullsyncs
10944 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 are occurring a
10945 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 t the right time
10946 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 s...*/..SQLITE_A
10947 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 PI int sqlite3_s
10948 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a ync_count = 0;..
10949 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
1094a 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f qlite3_fullsync_
1094b 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a 23 65 6e 64 count = 0;..#end
1094c 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 65 20 if..../*..** We
1094d 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 do not trust sys
1094e 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 tems to provide
1094f 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 a working fdatas
10950 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e ync(). Some do.
10951 0d 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e ..** Others do n
10952 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 o. To be safe,
10953 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 we will stick wi
10954 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 th the (slightly
10955 20 73 6c 6f 77 65 72 29 0d 0a 2a 2a 20 66 73 79 slower)..** fsy
10956 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f nc(). If you kno
10957 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 w that your syst
10958 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 em does support
10959 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 fdatasync() corr
1095a 65 63 74 6c 79 2c 0d 0a 2a 2a 20 74 68 65 6e 20 ectly,..** then
1095b 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 simply compile w
1095c 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d ith -Dfdatasync=
1095d 66 64 61 74 61 73 79 6e 63 0d 0a 2a 2f 0d 0a 23 fdatasync..*/..#
1095e 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 if !defined(fdat
1095f 61 73 79 6e 63 29 0d 0a 23 20 64 65 66 69 6e 65 async)..# define
10960 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 fdatasync fsync
10961 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
10962 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 ** Define HAVE_F
10963 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 ULLFSYNC to 0 or
10964 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 1 depending on
10965 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0d 0a whether or not..
10966 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 ** the F_FULLFSY
10967 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 NC macro is defi
10968 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e ned. F_FULLFSYN
10969 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a C is currently..
1096a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c ** only availabl
1096b 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 e on Mac OS X.
1096c 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 But that could c
1096d 68 61 6e 67 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 hange...*/..#ifd
1096e 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0d 0a ef F_FULLFSYNC..
1096f 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 # define HAVE_FU
10970 4c 4c 46 53 59 4e 43 20 31 0d 0a 23 65 6c 73 65 LLFSYNC 1..#else
10971 0d 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f ..# define HAVE_
10972 46 55 4c 4c 46 53 59 4e 43 20 30 0d 0a 23 65 6e FULLFSYNC 0..#en
10973 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 dif....../*..**
10974 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 The fsync() syst
10975 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 em call does not
10976 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 work as adverti
10977 73 65 64 20 6f 6e 20 6d 61 6e 79 0d 0a 2a 2a 20 sed on many..**
10978 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 unix systems. T
10979 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f he following pro
1097a 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 cedure is an att
1097b 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0d 0a 2a 2a empt to make..**
1097c 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e it work better.
1097d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 53 51 4c ..**..** The SQL
1097e 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 ITE_NO_SYNC macr
1097f 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 o disables all f
10980 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 sync()s. This i
10981 73 20 75 73 65 66 75 6c 0d 0a 2a 2a 20 66 6f 72 s useful..** for
10982 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 testing when we
10983 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 want to run thr
10984 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 ough the test su
10985 69 74 65 20 71 75 69 63 6b 6c 79 2e 0d 0a 2a 2a ite quickly...**
10986 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c You are strongl
10987 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 y advised *not*
10988 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 to deploy with S
10989 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0d 0a 2a QLITE_NO_SYNC..*
1098a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 * enabled, howev
1098b 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 er, since with S
1098c 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e QLITE_NO_SYNC en
1098d 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 abled, an OS cra
1098e 73 68 0d 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 sh..** or power
1098f 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b failure will lik
10990 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 ely corrupt the
10991 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a database file...
10992 2a 2a 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 **..** SQLite se
10993 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 ts the dataOnly
10994 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 flag if the size
10995 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 of the file is
10996 75 6e 63 68 61 6e 67 65 64 2e 0d 0a 2a 2a 20 54 unchanged...** T
10997 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 he idea behind d
10998 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 ataOnly is that
10999 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 it should only w
1099a 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f rite the file co
1099b 6e 74 65 6e 74 0d 0a 2a 2a 20 74 6f 20 64 69 73 ntent..** to dis
1099c 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 k, not the inode
1099d 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 . We only set d
1099e 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 ataOnly if the f
1099f 69 6c 65 20 73 69 7a 65 20 69 73 20 0d 0a 2a 2a ile size is ..**
109a0 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 unchanged since
109a1 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 the file size i
109a2 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e s part of the in
109a3 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0d ode. However, .
109a4 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c .** Ted Ts'o tel
109a5 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 ls us that fdata
109a6 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f sync() will also
109a7 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 write the inode
109a8 20 69 66 20 74 68 65 0d 0a 2a 2a 20 66 69 6c 65 if the..** file
109a9 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 size has change
109aa 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 d. The only rea
109ab 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 l difference bet
109ac 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 ween fdatasync()
109ad 0d 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 ..** and fsync()
109ae 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 , Ted tells us,
109af 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e is that fdatasyn
109b0 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 c() will not flu
109b1 73 68 20 74 68 65 0d 0a 2a 2a 20 69 6e 6f 64 65 sh the..** inode
109b2 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 if the mtime or
109b3 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 owner or other
109b4 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 inode attributes
109b5 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0d 0a have changed...
109b6 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 ** We only care
109b7 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 about the file s
109b8 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 ize, not the oth
109b9 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 er file attribut
109ba 65 73 2c 20 73 6f 0d 0a 2a 2a 20 61 73 20 66 61 es, so..** as fa
109bb 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 r as SQLite is c
109bc 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 oncerned, an fda
109bd 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 tasync() is alwa
109be 79 73 20 61 64 65 71 75 61 74 65 2e 0d 0a 2a 2a ys adequate...**
109bf 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 So, we always u
109c0 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 se fdatasync() i
109c1 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c f it is availabl
109c2 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 e, regardless of
109c3 0d 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f ..** the value o
109c4 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 f the dataOnly f
109c5 6c 61 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 lag...*/..static
109c6 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 int full_fsync(
109c7 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c int fd, int full
109c8 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e Sync, int dataOn
109c9 6c 79 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d ly){.. int rc;.
109ca 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c ... /* The foll
109cb 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 owing "ifdef/eli
109cc 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 f/else/" block h
109cd 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 as the same stru
109ce 63 74 75 72 65 20 61 73 0d 0a 20 20 2a 2a 20 74 cture as.. ** t
109cf 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 he one below. It
109d0 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 is replicated h
109d1 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 ere solely to av
109d2 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0d oid cluttering .
109d3 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 . ** up the rea
109d4 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 l code with the
109d5 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
109d6 28 29 20 6d 61 63 72 6f 73 2e 0d 0a 20 20 2a 2f () macros... */
109d7 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
109d8 4e 4f 5f 53 59 4e 43 0d 0a 20 20 55 4e 55 53 45 NO_SYNC.. UNUSE
109d9 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b D_PARAMETER(fd);
109da 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
109db 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0d ETER(fullSync);.
109dc 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
109dd 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0d 0a TER(dataOnly);..
109de 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 #elif HAVE_FULLF
109df 53 59 4e 43 0d 0a 20 20 55 4e 55 53 45 44 5f 50 SYNC.. UNUSED_P
109e0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c ARAMETER(dataOnl
109e1 79 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 55 4e y);..#else.. UN
109e2 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 USED_PARAMETER(f
109e3 75 6c 6c 53 79 6e 63 29 3b 0d 0a 20 20 55 4e 55 ullSync);.. UNU
109e4 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 SED_PARAMETER(da
109e5 74 61 4f 6e 6c 79 29 3b 0d 0a 23 65 6e 64 69 66 taOnly);..#endif
109e6 0d 0a 0d 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 .... /* Record
109e7 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 the number of ti
109e8 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 mes that we do a
109e9 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 normal fsync()
109ea 61 6e 64 20 0d 0a 20 20 2a 2a 20 46 55 4c 4c 53 and .. ** FULLS
109eb 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 YNC. This is us
109ec 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e ed during testin
109ed 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 g to verify that
109ee 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d this procedure.
109ef 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 . ** gets calle
109f0 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 d with the corre
109f1 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 20 ct arguments...
109f2 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 */..#ifdef SQLI
109f3 54 45 5f 54 45 53 54 0d 0a 20 20 69 66 28 20 66 TE_TEST.. if( f
109f4 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 ullSync ) sqlite
109f5 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3_fullsync_count
109f6 2b 2b 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 ++;.. sqlite3_s
109f7 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a 23 65 ync_count++;..#e
109f8 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 ndif.... /* If
109f9 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 we compiled with
109fa 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 the SQLITE_NO_S
109fb 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 YNC flag, then s
109fc 79 6e 63 69 6e 67 20 69 73 20 61 0d 0a 20 20 2a yncing is a.. *
109fd 2a 20 6e 6f 2d 6f 70 0d 0a 20 20 2a 2f 0d 0a 23 * no-op.. */..#
109fe 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f ifdef SQLITE_NO_
109ff 53 59 4e 43 0d 0a 20 20 72 63 20 3d 20 53 51 4c SYNC.. rc = SQL
10a00 49 54 45 5f 4f 4b 3b 0d 0a 23 65 6c 69 66 20 48 ITE_OK;..#elif H
10a01 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0d 0a 20 AVE_FULLFSYNC..
10a02 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b if( fullSync ){
10a03 0d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e .. rc = osFcn
10a04 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 tl(fd, F_FULLFSY
10a05 4e 43 2c 20 30 29 3b 0d 0a 20 20 7d 65 6c 73 65 NC, 0);.. }else
10a06 7b 0d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0d 0a {.. rc = 1;..
10a07 20 20 7d 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
10a08 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 FULLFSYNC faile
10a09 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 d, fall back to
10a0a 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 attempting an fs
10a0b 79 6e 63 28 29 2e 0d 0a 20 20 2a 2a 20 49 74 20 ync()... ** It
10a0c 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 shouldn't be pos
10a0d 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 sible for fullfs
10a0e 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 ync to fail on t
10a0f 68 65 20 6c 6f 63 61 6c 20 0d 0a 20 20 2a 2a 20 he local .. **
10a10 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 file system (on
10a11 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 OSX), so failure
10a12 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 indicates that
10a13 46 55 4c 4c 46 53 59 4e 43 0d 0a 20 20 2a 2a 20 FULLFSYNC.. **
10a14 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 isn't supported
10a15 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 for this file sy
10a16 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 stem. So, attemp
10a17 74 20 61 6e 20 66 73 79 6e 63 20 0d 0a 20 20 2a t an fsync .. *
10a18 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 * and (for now)
10a19 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 ignore the overh
10a1a 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c ead of a superfl
10a1b 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e uous fcntl call.
10a1c 20 20 0d 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 .. ** It'd be
10a1d 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 better to detec
10a1e 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 t fullfsync supp
10a1f 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f ort once and avo
10a20 69 64 20 0d 0a 20 20 2a 2a 20 74 68 65 20 66 63 id .. ** the fc
10a21 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 ntl call every t
10a22 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c ime sync is call
10a23 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 ed... */.. if(
10a24 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 rc ) rc = fsync
10a25 28 66 64 29 3b 0d 0a 0d 0a 23 65 6c 69 66 20 64 (fd);....#elif d
10a26 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f efined(__APPLE__
10a27 29 0d 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e ).. /* fdatasyn
10a28 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 c() on HFS+ does
10a29 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 n't yet flush th
10a2a 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 e file size if i
10a2b 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 t changed correc
10a2c 74 6c 79 0d 0a 20 20 2a 2a 20 73 6f 20 63 75 72 tly.. ** so cur
10a2d 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c rently we defaul
10a2e 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 t to the macro t
10a2f 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 hat redefines fd
10a30 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 atasync to fsync
10a31 0d 0a 20 20 2a 2f 0d 0a 20 20 72 63 20 3d 20 66 .. */.. rc = f
10a32 73 79 6e 63 28 66 64 29 3b 0d 0a 23 65 6c 73 65 sync(fd);..#else
10a33 20 0d 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 .. rc = fdatas
10a34 79 6e 63 28 66 64 29 3b 0d 0a 23 69 66 20 4f 53 ync(fd);..#if OS
10a35 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 69 66 28 20 _VXWORKS.. if(
10a36 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d rc==-1 && errno=
10a37 3d 45 4e 4f 54 53 55 50 20 29 7b 0d 0a 20 20 20 =ENOTSUP ){..
10a38 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b rc = fsync(fd);
10a39 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a .. }..#endif /*
10a3a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0d 0a OS_VXWORKS */..
10a3b 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 #endif /* ifdef
10a3c 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 SQLITE_NO_SYNC e
10a3d 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 lif HAVE_FULLFSY
10a3e 4e 43 20 2a 2f 0d 0a 0d 0a 20 20 69 66 28 20 4f NC */.... if( O
10a3f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 S_VXWORKS && rc!
10a40 3d 20 2d 31 20 29 7b 0d 0a 20 20 20 20 72 63 20 = -1 ){.. rc
10a41 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 = 0;.. }.. ret
10a42 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
10a43 0d 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 ..** Open a file
10a44 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 descriptor to t
10a45 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e he directory con
10a46 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 taining file zFi
10a47 6c 65 6e 61 6d 65 2e 0d 0a 2a 2a 20 49 66 20 73 lename...** If s
10a48 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 uccessful, *pFd
10a49 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 is set to the op
10a4a 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 ened file descri
10a4b 70 74 6f 72 20 61 6e 64 0d 0a 2a 2a 20 53 51 4c ptor and..** SQL
10a4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e ITE_OK is return
10a4d 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 ed. If an error
10a4e 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 occurs, either S
10a4f 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0d 0a 2a 2a 20 QLITE_NOMEM..**
10a50 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 or SQLITE_CANTOP
10a51 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 EN is returned a
10a52 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 nd *pFd is set t
10a53 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0d 0a o an undefined..
10a54 2a 2a 20 76 61 6c 75 65 2e 0d 0a 2a 2a 0d 0a 2a ** value...**..*
10a55 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 * The directory
10a56 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 file descriptor
10a57 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 is used for only
10a58 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0d one thing - to.
10a59 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 .** fsync() a di
10a5a 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 rectory to make
10a5b 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 sure file creati
10a5c 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 on and deletion
10a5d 65 76 65 6e 74 73 0d 0a 2a 2a 20 61 72 65 20 66 events..** are f
10a5e 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 lushed to disk.
10a5f 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 Such fsyncs are
10a60 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e not needed on n
10a61 65 77 65 72 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c ewer..** journal
10a62 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c ing filesystems,
10a63 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 but are require
10a64 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 d on older files
10a65 79 73 74 65 6d 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ystems...**..**
10a66 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e This routine can
10a67 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 be overridden u
10a68 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 sing the xSetSys
10a69 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0d Call interface..
10a6a 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 .** The ability
10a6b 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 to override this
10a6c 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 routine was add
10a6d 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 ed in support of
10a6e 20 74 68 65 0d 0a 2a 2a 20 63 68 72 6f 6d 69 75 the..** chromiu
10a6f 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e m sandbox. Open
10a70 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 ing a directory
10a71 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 is a security ri
10a72 73 6b 20 28 77 65 20 61 72 65 0d 0a 2a 2a 20 74 sk (we are..** t
10a73 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 old) so making i
10a74 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 t overrideable a
10a75 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 llows the chromi
10a76 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0d 0a 2a um sandbox to..*
10a77 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 * replace this r
10a78 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 outine with a ha
10a79 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 rmless no-op. T
10a7a 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 o make this rout
10a7b 69 6e 65 0d 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c ine..** a no-op,
10a7c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 replace it with
10a7d 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 a stub that ret
10a7e 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 urns SQLITE_OK b
10a7f 75 74 20 6c 65 61 76 65 73 0d 0a 2a 2a 20 2a 70 ut leaves..** *p
10a80 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 Fd set to a nega
10a81 74 69 76 65 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2a tive number...**
10a82 0d 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f ..** If SQLITE_O
10a83 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 K is returned, t
10a84 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 he caller is res
10a85 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f ponsible for clo
10a86 73 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 66 69 6c sing..** the fil
10a87 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 e descriptor *pF
10a88 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e d using close().
10a89 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
10a8a 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 openDirectory(c
10a8b 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
10a8c 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b name, int *pFd){
10a8d 0d 0a 20 20 69 6e 74 20 69 69 3b 0d 0a 20 20 69 .. int ii;.. i
10a8e 6e 74 20 66 64 20 3d 20 2d 31 3b 0d 0a 20 20 63 nt fd = -1;.. c
10a8f 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 har zDirname[MAX
10a90 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0d 0a 0d _PATHNAME+1];...
10a91 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 . sqlite3_snpri
10a92 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 ntf(MAX_PATHNAME
10a93 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 , zDirname, "%s"
10a94 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 , zFilename);..
10a95 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 for(ii=(int)str
10a96 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 len(zDirname); i
10a97 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b i>1 && zDirname[
10a98 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b ii]!='/'; ii--);
10a99 0d 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0d .. if( ii>0 ){.
10a9a 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 . zDirname[ii
10a9b 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 66 ] = '\0';.. f
10a9c 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 d = robust_open(
10a9d 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e zDirname, O_RDON
10a9e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b LY|O_BINARY, 0);
10a9f 0d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 .. if( fd>=0
10aa0 29 7b 0d 0a 23 69 66 64 65 66 20 46 44 5f 43 4c ){..#ifdef FD_CL
10aa1 4f 45 58 45 43 0d 0a 20 20 20 20 20 20 6f 73 46 OEXEC.. osF
10aa2 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 cntl(fd, F_SETFD
10aa3 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f , osFcntl(fd, F_
10aa4 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 GETFD, 0) | FD_C
10aa5 4c 4f 45 58 45 43 29 3b 0d 0a 23 65 6e 64 69 66 LOEXEC);..#endif
10aa6 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 .. OSTRACE(
10aa7 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 ("OPENDIR %-3d %
10aa8 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 s\n", fd, zDirna
10aa9 6d 65 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 me));.. }..
10aaa 7d 0d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0d }.. *pFd = fd;.
10aab 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 . return (fd>=0
10aac 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c ?SQLITE_OK:unixL
10aad 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 ogError(SQLITE_C
10aae 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f ANTOPEN_BKPT, "o
10aaf 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 pen", zDirname))
10ab0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d ;..}..../*..** M
10ab1 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 ake sure all wri
10ab2 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 tes to a particu
10ab3 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d lar file are com
10ab4 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0d mitted to disk..
10ab5 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 64 61 74 61 4f .**..** If dataO
10ab6 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 nly==0 then both
10ab7 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 the file itself
10ab8 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 and its metadat
10ab9 61 20 28 66 69 6c 65 0d 0a 2a 2a 20 73 69 7a 65 a (file..** size
10aba 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 , access time, e
10abb 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 tc) are synced.
10abc 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 If dataOnly!=0
10abd 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0d 0a 2a then only the..*
10abe 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 * file data is s
10abf 79 6e 63 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 55 ynced...**..** U
10ac0 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 nder Unix, also
10ac1 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 make sure that t
10ac2 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 he directory ent
10ac3 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0d ry for the file.
10ac4 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 .** has been cre
10ac5 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e ated by fsync-in
10ac6 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 g the directory
10ac7 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 that contains th
10ac8 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 49 66 20 77 e file...** If w
10ac9 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 e do not do this
10aca 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 and we encounte
10acb 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 r a power failur
10acc 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 e, the directory
10acd 0d 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 ..** entry for t
10ace 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 he journal might
10acf 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 not exist after
10ad0 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 we reboot. The
10ad1 20 6e 65 78 74 0d 0a 2a 2a 20 53 51 4c 69 74 65 next..** SQLite
10ad2 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 to access the f
10ad3 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f ile will not kno
10ad4 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e w that the journ
10ad5 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 al exists (becau
10ad6 73 65 0d 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 se..** the direc
10ad7 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 tory entry for t
10ad8 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e he journal was n
10ad9 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e ever created) an
10ada 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f d the transactio
10adb 6e 0d 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 n..** will not r
10adc 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 oll back - possi
10add 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 bly leading to d
10ade 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
10adf 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 on...*/..static
10ae0 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c int unixSync(sql
10ae1 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
10ae2 6e 74 20 66 6c 61 67 73 29 7b 0d 0a 20 20 69 6e nt flags){.. in
10ae3 74 20 72 63 3b 0d 0a 20 20 75 6e 69 78 46 69 6c t rc;.. unixFil
10ae4 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 e *pFile = (unix
10ae5 46 69 6c 65 2a 29 69 64 3b 0d 0a 0d 0a 20 20 69 File*)id;.... i
10ae6 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 nt isDataOnly =
10ae7 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 (flags&SQLITE_SY
10ae8 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0d 0a 20 NC_DATAONLY);..
10ae9 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 int isFullsync
10aea 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d = (flags&0x0F)==
10aeb 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c SQLITE_SYNC_FULL
10aec 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 ;.... /* Check
10aed 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 that one of SQLI
10aee 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f TE_SYNC_NORMAL o
10aef 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 r FULL was passe
10af0 64 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 28 d */.. assert((
10af1 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c flags&0x0F)==SQL
10af2 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0d ITE_SYNC_NORMAL.
10af3 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 . || (flags
10af4 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 &0x0F)==SQLITE_S
10af5 59 4e 43 5f 46 55 4c 4c 0d 0a 20 20 29 3b 0d 0a YNC_FULL.. );..
10af6 0d 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e .. /* Unix cann
10af7 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 ot, but some sys
10af8 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 tems may return
10af9 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d SQLITE_FULL from
10afa 20 68 65 72 65 2e 20 54 68 69 73 0d 0a 20 20 2a here. This.. *
10afb 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 * line is to tes
10afc 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 t that doing so
10afd 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 does not cause a
10afe 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0d 0a 20 20 ny problems...
10aff 2a 2f 0d 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 */.. SimulateDi
10b00 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 skfullError( ret
10b01 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 urn SQLITE_FULL
10b02 29 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 );.... assert(
10b03 70 46 69 6c 65 20 29 3b 0d 0a 20 20 4f 53 54 52 pFile );.. OSTR
10b04 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d ACE(("SYNC %-
10b05 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3d\n", pFile->h)
10b06 29 3b 0d 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f );.. rc = full_
10b07 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 fsync(pFile->h,
10b08 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 isFullsync, isDa
10b09 74 61 4f 6e 6c 79 29 3b 0d 0a 20 20 53 69 6d 75 taOnly);.. Simu
10b0a 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d lateIOError( rc=
10b0b 31 20 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 1 );.. if( rc )
10b0c 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 {.. pFile->la
10b0d 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b stErrno = errno;
10b0e 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 .. return uni
10b0f 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 xLogError(SQLITE
10b10 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 _IOERR_FSYNC, "f
10b11 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c ull_fsync", pFil
10b12 65 2d 3e 7a 50 61 74 68 29 3b 0d 0a 20 20 7d 0d e->zPath);.. }.
10b13 0a 0d 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 ... /* Also fsy
10b14 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 nc the directory
10b15 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
10b16 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 file if the DIRS
10b17 59 4e 43 20 66 6c 61 67 0d 0a 20 20 2a 2a 20 69 YNC flag.. ** i
10b18 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 s set. This is
10b19 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 a one-time occur
10b1a 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 rance. Many sys
10b1b 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 tems (examples:
10b1c 41 49 58 29 0d 0a 20 20 2a 2a 20 61 72 65 20 75 AIX).. ** are u
10b1d 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 nable to fsync a
10b1e 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 directory, so i
10b1f 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 gnore errors on
10b20 74 68 65 20 66 73 79 6e 63 2e 0d 0a 20 20 2a 2f the fsync... */
10b21 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 .. if( pFile->c
10b22 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 trlFlags & UNIXF
10b23 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0d 0a ILE_DIRSYNC ){..
10b24 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0d 0a int dirfd;..
10b25 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 OSTRACE(("DI
10b26 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 RSYNC %s (have_f
10b27 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c ullfsync=%d full
10b28 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 sync=%d)\n", pFi
10b29 6c 65 2d 3e 7a 50 61 74 68 2c 0d 0a 20 20 20 20 le->zPath,..
10b2a 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c HAVE_FUL
10b2b 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 LFSYNC, isFullsy
10b2c 6e 63 29 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 nc));.. rc =
10b2d 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 osOpenDirectory(
10b2e 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 pFile->zPath, &d
10b2f 69 72 66 64 29 3b 0d 0a 20 20 20 20 69 66 28 20 irfd);.. if(
10b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
10b31 20 64 69 72 66 64 3e 3d 30 20 29 7b 0d 0a 20 20 dirfd>=0 ){..
10b32 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 full_fsync(d
10b33 69 72 66 64 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 irfd, 0, 0);..
10b34 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 robust_close
10b35 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f (pFile, dirfd, _
10b36 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 7d _LINE__);.. }
10b37 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c else if( rc==SQL
10b38 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0d ITE_CANTOPEN ){.
10b39 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 . rc = SQLI
10b3a 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 TE_OK;.. }..
10b3b 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c pFile->ctrlFl
10b3c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 ags &= ~UNIXFILE
10b3d 5f 44 49 52 53 59 4e 43 3b 0d 0a 20 20 7d 0d 0a _DIRSYNC;.. }..
10b3e 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
10b3f 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 75 6e 63 61 .../*..** Trunca
10b40 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 te an open file
10b41 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 to a specified s
10b42 69 7a 65 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ize..*/..static
10b43 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 int unixTruncate
10b44 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
10b45 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0d 0a d, i64 nByte){..
10b46 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c unixFile *pFil
10b47 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 e = (unixFile *)
10b48 69 64 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a id;.. int rc;..
10b49 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
10b4a 29 3b 0d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f );.. SimulateIO
10b4b 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 Error( return SQ
10b4c 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 LITE_IOERR_TRUNC
10b4d 41 54 45 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 ATE );.... /* I
10b4e 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 f the user has c
10b4f 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e onfigured a chun
10b50 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 k-size for this
10b51 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 file, truncate t
10b52 68 65 0d 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f he.. ** file so
10b53 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 that it consist
10b54 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 s of an integer
10b55 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 number of chunks
10b56 20 28 69 2e 65 2e 20 74 68 65 0d 0a 20 20 2a 2a (i.e. the.. **
10b57 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a actual file siz
10b58 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 e after the oper
10b59 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 ation may be lar
10b5a 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 ger than the req
10b5b 75 65 73 74 65 64 0d 0a 20 20 2a 2a 20 73 69 7a uested.. ** siz
10b5c 65 29 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 e)... */.. if(
10b5d 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 pFile->szChunk
10b5e 29 7b 0d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 ){.. nByte =
10b5f 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d ((nByte + pFile-
10b60 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 >szChunk - 1)/pF
10b61 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 ile->szChunk) *
10b62 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0d pFile->szChunk;.
10b63 0a 20 20 7d 0d 0a 0d 0a 20 20 72 63 20 3d 20 72 . }.... rc = r
10b64 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 obust_ftruncate(
10b65 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 pFile->h, (off_t
10b66 29 6e 42 79 74 65 29 3b 0d 0a 20 20 69 66 28 20 )nByte);.. if(
10b67 72 63 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 rc ){.. pFile
10b68 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 ->lastErrno = er
10b69 72 6e 6f 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e rno;.. return
10b6a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 unixLogError(SQ
10b6b 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 LITE_IOERR_TRUNC
10b6c 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 ATE, "ftruncate"
10b6d 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b , pFile->zPath);
10b6e 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 23 69 66 6e .. }else{..#ifn
10b6f 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 def NDEBUG..
10b70 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 /* If we are doi
10b71 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 ng a normal writ
10b72 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 e to a database
10b73 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 file (as opposed
10b74 20 74 6f 0d 0a 20 20 20 20 2a 2a 20 64 6f 69 6e to.. ** doin
10b75 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 g a hot-journal
10b76 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 rollback or a wr
10b77 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 ite to some file
10b78 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0d 0a 20 other than a..
10b79 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 ** normal dat
10b7a 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 abase file) and
10b7b 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 we truncate the
10b7c 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e file to zero len
10b7d 67 74 68 2c 0d 0a 20 20 20 20 2a 2a 20 74 68 61 gth,.. ** tha
10b7e 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 t effectively up
10b7f 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 dates the change
10b80 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 counter. This
10b81 6d 69 67 68 74 20 68 61 70 70 65 6e 0d 0a 20 20 might happen..
10b82 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 ** when restor
10b83 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 ing a database u
10b84 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 sing the backup
10b85 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d API from a zero-
10b86 6c 65 6e 67 74 68 0d 0a 20 20 20 20 2a 2a 20 73 length.. ** s
10b87 6f 75 72 63 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a ource... */..
10b88 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 if( pFile->i
10b89 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 nNormalWrite &&
10b8a 6e 42 79 74 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 nByte==0 ){..
10b8b 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 pFile->transC
10b8c 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0d 0a 20 20 ntrChng = 1;..
10b8d 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 }..#endif....
10b8e 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
10b8f 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a _OK;.. }..}....
10b90 2f 2a 0d 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 /*..** Determine
10b91 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a the current siz
10b92 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 e of a file in b
10b93 79 74 65 73 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ytes..*/..static
10b94 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a int unixFileSiz
10b95 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a e(sqlite3_file *
10b96 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b id, i64 *pSize){
10b97 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 73 .. int rc;.. s
10b98 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0d truct stat buf;.
10b99 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b . assert( id );
10b9a 0d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 .. rc = osFstat
10b9b 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 (((unixFile*)id)
10b9c 2d 3e 68 2c 20 26 62 75 66 29 3b 0d 0a 20 20 53 ->h, &buf);.. S
10b9d 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
10b9e 72 63 3d 31 20 29 3b 0d 0a 20 20 69 66 28 20 72 rc=1 );.. if( r
10b9f 63 21 3d 30 20 29 7b 0d 0a 20 20 20 20 28 28 75 c!=0 ){.. ((u
10ba0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 nixFile*)id)->la
10ba1 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b stErrno = errno;
10ba2 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
10ba3 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b ITE_IOERR_FSTAT;
10ba4 0d 0a 20 20 7d 0d 0a 20 20 2a 70 53 69 7a 65 20 .. }.. *pSize
10ba5 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0d 0a = buf.st_size;..
10ba6 0d 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e .. /* When open
10ba7 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 ing a zero-size
10ba8 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 database, the fi
10ba9 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 ndInodeInfo() pr
10baa 6f 63 65 64 75 72 65 0d 0a 20 20 2a 2a 20 77 72 ocedure.. ** wr
10bab 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 ites a single by
10bac 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c te into that fil
10bad 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f e in order to wo
10bae 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0d rk around a bug.
10baf 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d . ** in the OS-
10bb0 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 X msdos filesyst
10bb1 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f em. In order to
10bb2 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 avoid problems
10bb3 77 69 74 68 20 75 70 70 65 72 0d 0a 20 20 2a 2a with upper.. **
10bb4 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 layers, we need
10bb5 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 to report this
10bb6 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 file size as zer
10bb7 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 o even though it
10bb8 20 69 73 0d 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 is.. ** really
10bb9 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 1. Ticket #32
10bba 36 30 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 60... */.. if(
10bbb 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 *pSize==1 ) *pS
10bbc 69 7a 65 20 3d 20 30 3b 0d 0a 0d 0a 0d 0a 20 20 ize = 0;......
10bbd 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
10bbe 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 ;..}....#if SQLI
10bbf 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e TE_ENABLE_LOCKIN
10bc0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e G_STYLE && defin
10bc1 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0d 0a 2f ed(__APPLE__)../
10bc2 2a 0d 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f *..** Handler fo
10bc3 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 r proxy-locking
10bc4 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 file-control ver
10bc5 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c bs. Defined bel
10bc6 6f 77 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 70 72 ow in the..** pr
10bc7 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 oxying locking d
10bc8 69 76 69 73 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 ivision...*/..st
10bc9 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 atic int proxyFi
10bca 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 leControl(sqlite
10bcb 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 3_file*,int,void
10bcc 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f *);..#endif..../
10bcd 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 * ..** This func
10bce 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 tion is called t
10bcf 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c o handle the SQL
10bd0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 ITE_FCNTL_SIZE_H
10bd1 49 4e 54 20 0d 0a 2a 2a 20 66 69 6c 65 2d 63 6f INT ..** file-co
10bd2 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e ntrol operation.
10bd3 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 Enlarge the da
10bd4 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 tabase to nBytes
10bd5 20 69 6e 20 73 69 7a 65 0d 0a 2a 2a 20 28 72 6f in size..** (ro
10bd6 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 unded up to the
10bd7 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 next chunk-size)
10bd8 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 . If the databa
10bd9 73 65 20 69 73 20 61 6c 72 65 61 64 79 0d 0a 2a se is already..*
10bda 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 * nBytes or larg
10bdb 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 er, this routine
10bdc 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f is a no-op...*/
10bdd 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e ..static int fcn
10bde 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 tlSizeHint(unixF
10bdf 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 ile *pFile, i64
10be0 6e 42 79 74 65 29 7b 0d 0a 20 20 69 66 28 20 70 nByte){.. if( p
10be1 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 File->szChunk>0
10be2 29 7b 0d 0a 20 20 20 20 69 36 34 20 6e 53 69 7a ){.. i64 nSiz
10be3 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
10be4 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 /* Require
10be5 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0d 0a d file size */..
10be6 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 struct stat
10be7 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 buf;
10be8 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c /* Used to hol
10be9 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 d return values
10bea 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0d 0a 20 of fstat() */..
10beb 20 20 0d 0a 20 20 20 20 69 66 28 20 6f 73 46 73 .. if( osFs
10bec 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 tat(pFile->h, &b
10bed 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c uf) ) return SQL
10bee 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b ITE_IOERR_FSTAT;
10bef 0d 0a 0d 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 .... nSize =
10bf0 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 ((nByte+pFile->s
10bf1 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c zChunk-1) / pFil
10bf2 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 e->szChunk) * pF
10bf3 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0d 0a 20 ile->szChunk;..
10bf4 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 if( nSize>(i6
10bf5 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 4)buf.st_size ){
10bf6 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ....#if defined(
10bf7 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f HAVE_POSIX_FALLO
10bf8 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f CATE) && HAVE_PO
10bf9 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0d 0a 20 SIX_FALLOCATE..
10bfa 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 /* The code
10bfb 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 below is handli
10bfc 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 ng the return va
10bfd 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 lue of osFalloca
10bfe 74 65 28 29 20 0d 0a 20 20 20 20 20 20 2a 2a 20 te() .. **
10bff 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 correctly. posix
10c00 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 _fallocate() is
10c01 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 defined to "retu
10c02 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 rns zero on succ
10c03 65 73 73 2c 20 0d 0a 20 20 20 20 20 20 2a 2a 20 ess, .. **
10c04 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 or an error numb
10c05 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e er on failure".
10c06 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 See the manpage
10c07 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f for details. */
10c08 0d 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b .. int err;
10c09 0d 0a 20 20 20 20 20 20 64 6f 7b 0d 0a 20 20 20 .. do{..
10c0a 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c err = osFal
10c0b 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c locate(pFile->h,
10c0c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 buf.st_size, nS
10c0d 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 ize-buf.st_size)
10c0e 3b 0d 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 ;.. }while(
10c0f 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0d 0a err==EINTR );..
10c10 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 if( err )
10c11 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
10c12 45 52 52 5f 57 52 49 54 45 3b 0d 0a 23 65 6c 73 ERR_WRITE;..#els
10c13 65 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 e.. /* If t
10c14 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 he OS does not h
10c15 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 ave posix_falloc
10c16 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 ate(), fake it.
10c17 46 69 72 73 74 20 75 73 65 0d 0a 20 20 20 20 20 First use..
10c18 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 ** ftruncate()
10c19 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 to set the file
10c1a 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 size, then write
10c1b 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 a single byte t
10c1c 6f 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 o.. ** the
10c1d 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 last byte in eac
10c1e 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 h block within t
10c1f 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 he extended regi
10c20 6f 6e 2e 20 54 68 69 73 0d 0a 20 20 20 20 20 20 on. This..
10c21 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 ** is the same t
10c22 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 echnique used by
10c23 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d glibc to implem
10c24 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 ent posix_falloc
10c25 61 74 65 28 29 0d 0a 20 20 20 20 20 20 2a 2a 20 ate().. **
10c26 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 on systems that
10c27 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 do not have a re
10c28 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 al fallocate() s
10c29 79 73 74 65 6d 20 63 61 6c 6c 2e 0d 0a 20 20 20 ystem call...
10c2a 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 6e 74 */.. int
10c2b 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 nBlk = buf.st_b
10c2c 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 lksize; /* File
10c2d 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 -system block si
10c2e 7a 65 20 2a 2f 0d 0a 20 20 20 20 20 20 69 36 34 ze */.. i64
10c2f 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 iWrite;
10c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 /* Next
10c31 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 offset to write
10c32 20 74 6f 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 to */....
10c33 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e if( robust_ftrun
10c34 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e cate(pFile->h, n
10c35 53 69 7a 65 29 20 29 7b 0d 0a 20 20 20 20 20 20 Size) ){..
10c36 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 pFile->lastErr
10c37 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 no = errno;..
10c38 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 return unix
10c39 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
10c3a 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 IOERR_TRUNCATE,
10c3b 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 "ftruncate", pFi
10c3c 6c 65 2d 3e 7a 50 61 74 68 29 3b 0d 0a 20 20 20 le->zPath);..
10c3d 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 57 72 69 }.. iWri
10c3e 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 te = ((buf.st_si
10c3f 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 ze + 2*nBlk - 1)
10c40 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0d 0a /nBlk)*nBlk-1;..
10c41 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 while( iWr
10c42 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0d 0a 20 20 ite<nSize ){..
10c43 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 int nWrite
10c44 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 = seekAndWrite(
10c45 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 pFile, iWrite, "
10c46 22 2c 20 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 ", 1);..
10c47 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 if( nWrite!=1 )
10c48 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
10c49 45 52 52 5f 57 52 49 54 45 3b 0d 0a 20 20 20 20 ERR_WRITE;..
10c4a 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 iWrite += nB
10c4b 6c 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 lk;.. }..#e
10c4c 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d ndif.. }.. }
10c4d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c .... return SQL
10c4e 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
10c4f 0d 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 ..** If *pArg is
10c50 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 inititially neg
10c51 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 ative then this
10c52 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 is a query. Set
10c53 20 2a 70 41 72 67 20 74 6f 0d 0a 2a 2a 20 31 20 *pArg to..** 1
10c54 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f or 0 depending o
10c55 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 n whether or not
10c56 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 bit mask of pFi
10c57 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 le->ctrlFlags is
10c58 20 73 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 set...**..** If
10c59 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 *pArg is 0 or 1
10c5a 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 , then clear or
10c5b 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 set the mask bit
10c5c 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 of pFile->ctrlF
10c5d 6c 61 67 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 lags...*/..stati
10c5e 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 c void unixModeB
10c5f 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 it(unixFile *pFi
10c60 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 le, unsigned cha
10c61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 r mask, int *pAr
10c62 67 29 7b 0d 0a 20 20 69 66 28 20 2a 70 41 72 67 g){.. if( *pArg
10c63 3c 30 20 29 7b 0d 0a 20 20 20 20 2a 70 41 72 67 <0 ){.. *pArg
10c64 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 = (pFile->ctrlF
10c65 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b lags & mask)!=0;
10c66 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a .. }else if( (*
10c67 70 41 72 67 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 pArg)==0 ){..
10c68 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 pFile->ctrlFlag
10c69 73 20 26 3d 20 7e 6d 61 73 6b 3b 0d 0a 20 20 7d s &= ~mask;.. }
10c6a 65 6c 73 65 7b 0d 0a 20 20 20 20 70 46 69 6c 65 else{.. pFile
10c6b 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d ->ctrlFlags |= m
10c6c 61 73 6b 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a ask;.. }..}....
10c6d 2f 2a 0d 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 /*..** Informati
10c6e 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f on and control o
10c6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 f an open file h
10c70 61 6e 64 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 andle...*/..stat
10c71 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 ic int unixFileC
10c72 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 ontrol(sqlite3_f
10c73 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c ile *id, int op,
10c74 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0d 0a 20 void *pArg){..
10c75 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 unixFile *pFile
10c76 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 = (unixFile*)id
10c77 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 ;.. switch( op
10c78 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c ){.. case SQL
10c79 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 ITE_FCNTL_LOCKST
10c7a 41 54 45 3a 20 7b 0d 0a 20 20 20 20 20 20 2a 28 ATE: {.. *(
10c7b 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c int*)pArg = pFil
10c7c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0d 0a 20 e->eFileLock;..
10c7d 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
10c7e 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 TE_OK;.. }..
10c7f 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c case SQLITE_L
10c80 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0d 0a 20 20 AST_ERRNO: {..
10c81 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 *(int*)pArg
10c82 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 = pFile->lastErr
10c83 6e 6f 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 no;.. retur
10c84 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 n SQLITE_OK;..
10c85 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 20 53 51 }.. case SQ
10c86 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b LITE_FCNTL_CHUNK
10c87 5f 53 49 5a 45 3a 20 7b 0d 0a 20 20 20 20 20 20 _SIZE: {..
10c88 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d pFile->szChunk =
10c89 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0d 0a *(int *)pArg;..
10c8a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
10c8b 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a ITE_OK;.. }..
10c8c 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f case SQLITE_
10c8d 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a FCNTL_SIZE_HINT:
10c8e 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 72 63 {.. int rc
10c8f 3b 0d 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 ;.. Simulat
10c90 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 eIOErrorBenign(1
10c91 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 66 );.. rc = f
10c92 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 cntlSizeHint(pFi
10c93 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 le, *(i64 *)pArg
10c94 29 3b 0d 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 );.. Simula
10c95 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 teIOErrorBenign(
10c96 30 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 0);.. retur
10c97 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 n rc;.. }..
10c98 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 case SQLITE_FC
10c99 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a NTL_PERSIST_WAL:
10c9a 20 7b 0d 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f {.. unixMo
10c9b 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 deBit(pFile, UNI
10c9c 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 XFILE_PERSIST_WA
10c9d 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0d L, (int*)pArg);.
10c9e 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
10c9f 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d LITE_OK;.. }.
10ca0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 . case SQLITE
10ca1 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 _FCNTL_POWERSAFE
10ca2 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0d 0a 20 _OVERWRITE: {..
10ca3 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 unixModeBit
10ca4 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 (pFile, UNIXFILE
10ca5 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 _PSOW, (int*)pAr
10ca6 67 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 g);.. retur
10ca7 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 n SQLITE_OK;..
10ca8 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 20 53 51 }.. case SQ
10ca9 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 LITE_FCNTL_VFSNA
10caa 4d 45 3a 20 7b 0d 0a 20 20 20 20 20 20 2a 28 63 ME: {.. *(c
10cab 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c har**)pArg = sql
10cac 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 ite3_mprintf("%s
10cad 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e ", pFile->pVfs->
10cae 7a 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 72 zName);.. r
10caf 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
10cb0 0d 0a 20 20 20 20 7d 0d 0a 23 69 66 6e 64 65 66 .. }..#ifndef
10cb1 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 2f 2a 20 NDEBUG.. /*
10cb2 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 The pager calls
10cb3 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 this method to s
10cb4 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 ignal that it ha
10cb5 73 20 64 6f 6e 65 0d 0a 20 20 20 20 2a 2a 20 61 s done.. ** a
10cb6 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 rollback and th
10cb7 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 at the database
10cb8 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 is therefore unc
10cb9 68 61 6e 67 65 64 20 61 6e 64 0d 0a 20 20 20 20 hanged and..
10cba 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 ** it hence it i
10cbb 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 s OK for the tra
10cbc 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 nsaction change
10cbd 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0d 0a 20 counter to be..
10cbe 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e ** unchanged.
10cbf 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 63 61 .. */.. ca
10cc0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f se SQLITE_FCNTL_
10cc1 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0d DB_UNCHANGED: {.
10cc2 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c . ((unixFil
10cc3 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 e*)id)->dbUpdate
10cc4 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 72 65 74 = 0;.. ret
10cc5 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
10cc6 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23 }..#endif..#
10cc7 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 if SQLITE_ENABLE
10cc8 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 _LOCKING_STYLE &
10cc9 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c & defined(__APPL
10cca 45 5f 5f 29 0d 0a 20 20 20 20 63 61 73 65 20 53 E__).. case S
10ccb 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 QLITE_SET_LOCKPR
10ccc 4f 58 59 46 49 4c 45 3a 0d 0a 20 20 20 20 63 61 OXYFILE:.. ca
10ccd 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f se SQLITE_GET_LO
10cce 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0d 0a CKPROXYFILE: {..
10ccf 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f return pro
10cd0 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 xyFileControl(id
10cd1 2c 6f 70 2c 70 41 72 67 29 3b 0d 0a 20 20 20 20 ,op,pArg);..
10cd2 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c }..#endif /* SQL
10cd3 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 ITE_ENABLE_LOCKI
10cd4 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 NG_STYLE && defi
10cd5 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a ned(__APPLE__) *
10cd6 2f 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e /.. }.. return
10cd7 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 SQLITE_NOTFOUND
10cd8 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
10cd9 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 eturn the sector
10cda 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f size in bytes o
10cdb 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 f the underlying
10cdc 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f block device fo
10cdd 72 0d 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 r..** the specif
10cde 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 ied file. This i
10cdf 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 s almost always
10ce0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 512 bytes, but m
10ce1 61 79 20 62 65 0d 0a 2a 2a 20 6c 61 72 67 65 72 ay be..** larger
10ce2 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 for some device
10ce3 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 69 74 s...**..** SQLit
10ce4 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 e code assumes t
10ce5 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e his function can
10ce6 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 not fail. It als
10ce7 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0d 0a o assumes that..
10ce8 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 ** if two files
10ce9 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 are created in t
10cea 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 he same file-sys
10ceb 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 tem directory (i
10cec 2e 65 2e 0d 0a 2a 2a 20 61 20 64 61 74 61 62 61 .e...** a databa
10ced 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e se and its journ
10cee 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 al file) that th
10cef 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 e sector size wi
10cf0 6c 6c 20 62 65 20 74 68 65 0d 0a 2a 2a 20 73 61 ll be the..** sa
10cf1 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 2a 2f me for both...*/
10cf2 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 ..static int uni
10cf3 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 xSectorSize(sqli
10cf4 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 te3_file *pFile)
10cf5 7b 0d 0a 20 20 28 76 6f 69 64 29 70 46 69 6c 65 {.. (void)pFile
10cf6 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 ;.. return SQLI
10cf7 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f TE_DEFAULT_SECTO
10cf8 52 5f 53 49 5a 45 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a R_SIZE;..}..../*
10cf9 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
10cfa 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 device character
10cfb 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 istics for the f
10cfc 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ile...**..** Thi
10cfd 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 s VFS is set up
10cfe 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 to return SQLITE
10cff 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 _IOCAP_POWERSAFE
10d00 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 _OVERWRITE by de
10d01 66 61 75 6c 74 2e 0d 0a 2a 2a 20 48 6f 77 65 76 fault...** Howev
10d02 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 er, that choice
10d03 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c is contraversial
10d04 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c since technical
10d05 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e ly the underlyin
10d06 67 0d 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 g..** file syste
10d07 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 m does not alway
10d08 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 s provide powers
10d09 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 afe overwrites.
10d0a 20 28 49 6e 20 6f 74 68 65 72 0d 0a 2a 2a 20 77 (In other..** w
10d0b 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f ords, after a po
10d0c 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 wer-loss event,
10d0d 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c parts of the fil
10d0e 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 e that were neve
10d0f 72 0d 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 r..** written mi
10d10 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 ght end up being
10d11 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 altered.) Howe
10d12 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 ver, non-PSOW be
10d13 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0d havior is very,.
10d14 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 .** very rare.
10d15 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 And asserting PS
10d16 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 OW makes a large
10d17 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 reduction in th
10d18 65 20 61 6d 6f 75 6e 74 0d 0a 2a 2a 20 6f 66 20 e amount..** of
10d19 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 required I/O for
10d1a 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e journaling, sin
10d1b 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 ce a lot of padd
10d1c 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 ing is eliminate
10d1d 64 2e 0d 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 d...** Hence, w
10d1e 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f hile POWERSAFE_O
10d1f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62 VERWRITE is on b
10d20 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 y default, there
10d21 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 is a file-contr
10d22 6f 6c 0d 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 ol..** available
10d23 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 to turn it off
10d24 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61 and URI query pa
10d25 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c rameter availabl
10d26 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 e to turn it off
10d27 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
10d28 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 t unixDeviceChar
10d29 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 acteristics(sqli
10d2a 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0d 0a te3_file *id){..
10d2b 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 unixFile *p =
10d2c 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a (unixFile*)id;..
10d2d 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 if( p->ctrlFla
10d2e 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 gs & UNIXFILE_PS
10d2f 4f 57 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 OW ){.. retur
10d30 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 n SQLITE_IOCAP_P
10d31 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 OWERSAFE_OVERWRI
10d32 54 45 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 TE;.. }else{..
10d33 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 return 0;..
10d34 7d 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 }..}....#ifndef
10d35 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d SQLITE_OMIT_WAL.
10d36 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 62 6a 65 ...../*..** Obje
10d37 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 ct used to repre
10d38 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d sent an shared m
10d39 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0d emory buffer. .
10d3a 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c .**..** When mul
10d3b 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c tiple threads al
10d3c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 l reference the
10d3d 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 same wal-index,
10d3e 65 61 63 68 20 74 68 72 65 61 64 0d 0a 2a 2a 20 each thread..**
10d3f 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 has its own unix
10d40 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 Shm object, but
10d41 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 they all point t
10d42 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 o a single insta
10d43 6e 63 65 0d 0a 2a 2a 20 6f 66 20 74 68 69 73 20 nce..** of this
10d44 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 unixShmNode obje
10d45 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f ct. In other wo
10d46 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e rds, each wal-in
10d47 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0d 0a 2a dex is opened..*
10d48 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 * only once per
10d49 70 72 6f 63 65 73 73 2e 0d 0a 2a 2a 0d 0a 2a 2a process...**..**
10d4a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 Each unixShmNod
10d4b 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e e object is conn
10d4c 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c ected to a singl
10d4d 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 e unixInodeInfo
10d4e 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 20 57 65 20 63 object...** We c
10d4f 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 ould coalesce th
10d50 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 is object into u
10d51 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 nixInodeInfo, bu
10d52 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 t that would mea
10d53 6e 0d 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e n..** every open
10d54 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 file that does
10d55 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d not use shared m
10d56 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 emory (in other
10d57 77 6f 72 64 73 2c 20 6d 6f 73 74 0d 0a 2a 2a 20 words, most..**
10d58 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c open files) woul
10d59 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 d have to carry
10d5a 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 around this extr
10d5b 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 a information.
10d5c 53 6f 0d 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 So..** the unixI
10d5d 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 nodeInfo object
10d5e 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 contains a point
10d5f 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 er to this unixS
10d60 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0d 0a 2a hmNode object..*
10d61 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 * and the unixSh
10d62 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 mNode object is
10d63 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 created only whe
10d64 6e 20 6e 65 65 64 65 64 2e 0d 0a 2a 2a 0d 0a 2a n needed...**..*
10d65 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 * unixMutexHeld(
10d66 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 ) must be true w
10d67 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 hen creating or
10d68 64 65 73 74 72 6f 79 69 6e 67 0d 0a 2a 2a 20 74 destroying..** t
10d69 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 his object or wh
10d6a 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 ile reading or w
10d6b 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f riting the follo
10d6c 77 69 6e 67 20 66 69 65 6c 64 73 3a 0d 0a 2a 2a wing fields:..**
10d6d 0d 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0d 0a ..** nRef..
10d6e 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f **..** The follo
10d6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 wing fields are
10d70 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 read-only after
10d71 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 the object is cr
10d72 65 61 74 65 64 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 eated:..** ..**
10d73 20 20 20 20 20 66 69 64 0d 0a 2a 2a 20 20 20 20 fid..**
10d74 20 20 7a 46 69 6c 65 6e 61 6d 65 0d 0a 2a 2a 0d zFilename..**.
10d75 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 .** Either unixS
10d76 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 hmNode.mutex mus
10d77 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 t be held or uni
10d78 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 xShmNode.nRef==0
10d79 20 61 6e 64 0d 0a 2a 2a 20 75 6e 69 78 4d 75 74 and..** unixMut
10d7a 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 exHeld() is true
10d7b 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 when reading or
10d7c 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 writing any oth
10d7d 65 72 20 66 69 65 6c 64 0d 0a 2a 2a 20 69 6e 20 er field..** in
10d7e 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0d this structure..
10d7f 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 75 6e 69 78 .*/..struct unix
10d80 53 68 6d 4e 6f 64 65 20 7b 0d 0a 20 20 75 6e 69 ShmNode {.. uni
10d81 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f xInodeInfo *pIno
10d82 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 de; /* unixI
10d83 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 nodeInfo that ow
10d84 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 ns this SHM node
10d85 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d */.. sqlite3_m
10d86 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 utex *mutex;
10d87 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 /* Mutex to ac
10d88 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 cess this object
10d89 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 46 69 */.. char *zFi
10d8a 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 lename;
10d8b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 /* Name of the
10d8c 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f mmapped file */
10d8d 0d 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 .. int h;
10d8e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
10d8f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 * Open file desc
10d90 72 69 70 74 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 riptor */.. int
10d91 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 szRegion;
10d92 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
10d93 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 of shared-memory
10d94 20 72 65 67 69 6f 6e 73 20 2a 2f 0d 0a 20 20 75 regions */.. u
10d95 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 16 nRegion;
10d96 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a /* Siz
10d97 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 e of array apReg
10d98 69 6f 6e 20 2a 2f 0d 0a 20 20 75 38 20 69 73 52 ion */.. u8 isR
10d99 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 eadonly;
10d9a 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
10d9b 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0d 0a 20 20 read-only */..
10d9c 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b char **apRegion;
10d9d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 /* Ar
10d9e 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 ray of mapped sh
10d9f 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 ared-memory regi
10da0 6f 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 52 ons */.. int nR
10da1 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ef;
10da2 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
10da3 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 f unixShm object
10da4 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 s pointing to th
10da5 69 73 20 2a 2f 0d 0a 20 20 75 6e 69 78 53 68 6d is */.. unixShm
10da6 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 *pFirst;
10da7 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 /* All unixS
10da8 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 hm objects point
10da9 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0d 0a ing to this */..
10daa 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
10dab 42 55 47 0d 0a 20 20 75 38 20 65 78 63 6c 4d 61 BUG.. u8 exclMa
10dac 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 sk;
10dad 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 /* Mask of exc
10dae 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c lusive locks hel
10daf 64 20 2a 2f 0d 0a 20 20 75 38 20 73 68 61 72 65 d */.. u8 share
10db0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 dMask;
10db1 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 /* Mask of sh
10db2 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 ared locks held
10db3 2a 2f 0d 0a 20 20 75 38 20 6e 65 78 74 53 68 6d */.. u8 nextShm
10db4 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 Id;
10db5 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 /* Next availab
10db6 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 le unixShm.id va
10db7 6c 75 65 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a lue */..#endif..
10db8 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 74 72 };..../*..** Str
10db9 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 ucture used inte
10dba 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 rnally by this V
10dbb 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 FS to record the
10dbc 20 73 74 61 74 65 20 6f 66 20 61 6e 0d 0a 2a 2a state of an..**
10dbd 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d open shared mem
10dbe 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d ory connection..
10dbf 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c .**..** The foll
10dc0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 owing fields are
10dc1 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 initialized whe
10dc2 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 n this object is
10dc3 20 63 72 65 61 74 65 64 20 61 6e 64 0d 0a 2a 2a created and..**
10dc4 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 are read-only t
10dc5 68 65 72 65 61 66 74 65 72 3a 0d 0a 2a 2a 0d 0a hereafter:..**..
10dc6 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 ** unixShm.pF
10dc7 69 6c 65 0d 0a 2a 2a 20 20 20 20 75 6e 69 78 53 ile..** unixS
10dc8 68 6d 2e 69 64 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c hm.id..**..** Al
10dc9 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 l other fields a
10dca 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 re read/write.
10dcb 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c The unixShm.pFil
10dcc 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 e->mutex must be
10dcd 20 68 65 6c 64 0d 0a 2a 2a 20 77 68 69 6c 65 20 held..** while
10dce 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 accessing any re
10dcf 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e ad/write fields.
10dd0 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 75 6e 69 ..*/..struct uni
10dd1 78 53 68 6d 20 7b 0d 0a 20 20 75 6e 69 78 53 68 xShm {.. unixSh
10dd2 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b mNode *pShmNode;
10dd3 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 /* The unde
10dd4 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f rlying unixShmNo
10dd5 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 de object */..
10dd6 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 unixShm *pNext;
10dd7 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
10dd8 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 xt unixShm with
10dd9 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d the same unixShm
10dda 4e 6f 64 65 20 2a 2f 0d 0a 20 20 75 38 20 68 61 Node */.. u8 ha
10ddb 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 sMutex;
10ddc 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
10ddd 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 holding the uni
10dde 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a xShmNode mutex *
10ddf 2f 0d 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 /.. u8 id;
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10de1 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f /* Id of this co
10de2 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 nnection within
10de3 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 its unixShmNode
10de4 2a 2f 0d 0a 20 20 75 31 36 20 73 68 61 72 65 64 */.. u16 shared
10de5 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 Mask;
10de6 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 /* Mask of shar
10de7 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f ed locks held */
10de8 0d 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b .. u16 exclMask
10de9 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
10dea 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 * Mask of exclus
10deb 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a ive locks held *
10dec 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 /..};..../*..**
10ded 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 Constants used f
10dee 6f 72 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2f 0d 0a or locking..*/..
10def 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d #define UNIX_SHM
10df0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c _BASE ((22+SQL
10df1 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 ITE_SHM_NLOCK)*4
10df2 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 ) /* fir
10df3 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0d st lock byte */.
10df4 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 .#define UNIX_SH
10df5 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 M_DMS (UNIX_S
10df6 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 HM_BASE+SQLITE_S
10df7 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 HM_NLOCK) /* de
10df8 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0d adman switch */.
10df9 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70 6c 79 20 .../*..** Apply
10dfa 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c posix advisory l
10dfb 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 ocks for all byt
10dfc 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 es from ofst thr
10dfd 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0d 0a ough ofst+n-1...
10dfe 2a 2a 0d 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f **..** Locks blo
10dff 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 ck if the mask i
10e00 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 s exactly UNIX_S
10e01 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e HM_C and are non
10e02 2d 62 6c 6f 63 6b 69 6e 67 0d 0a 2a 2a 20 6f 74 -blocking..** ot
10e03 68 65 72 77 69 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 herwise...*/..st
10e04 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d atic int unixShm
10e05 53 79 73 74 65 6d 4c 6f 63 6b 28 0d 0a 20 20 75 SystemLock(.. u
10e06 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d nixShmNode *pShm
10e07 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c Node, /* Apply l
10e08 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 ocks to this ope
10e09 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 n shared-memory
10e0a 73 65 67 6d 65 6e 74 20 2a 2f 0d 0a 20 20 69 6e segment */.. in
10e0b 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 t lockType,
10e0c 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c /* F_UNLCK,
10e0d 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 F_RDLCK, or F_W
10e0e 52 4c 43 4b 20 2a 2f 0d 0a 20 20 69 6e 74 20 6f RLCK */.. int o
10e0f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 fst,
10e10 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 /* First byte
10e11 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 of the locking r
10e12 61 6e 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e ange */.. int n
10e13 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10e14 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
10e15 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0d ytes to lock */.
10e16 0a 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 66 6c .){.. struct fl
10e17 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 ock f; /*
10e18 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f The posix adviso
10e19 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 ry locking struc
10e1a 74 75 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 ture */.. int r
10e1b 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 c = SQLITE_OK;
10e1c 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
10e1d 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0d form fcntl() */.
10e1e 0a 0d 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 ... /* Access t
10e1f 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 o the unixShmNod
10e20 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 e object is seri
10e21 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 alized by the ca
10e22 6c 6c 65 72 20 2a 2f 0d 0a 20 20 61 73 73 65 72 ller */.. asser
10e23 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 t( sqlite3_mutex
10e24 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e _held(pShmNode->
10e25 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f mutex) || pShmNo
10e26 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0d 0a de->nRef==0 );..
10e27 0d 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f .. /* Shared lo
10e28 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d cks never span m
10e29 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 ore than one byt
10e2a 65 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 e */.. assert(
10e2b 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 n==1 || lockType
10e2c 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0d 0a 0d 0a !=F_RDLCK );....
10e2d 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 /* Locks are w
10e2e 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0d 0a ithin range */..
10e2f 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 assert( n>=1 &
10e30 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e & n<SQLITE_SHM_N
10e31 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 LOCK );.... if(
10e32 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 pShmNode->h>=0
10e33 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 ){.. /* Initi
10e34 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e alize the lockin
10e35 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0d g parameters */.
10e36 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 . memset(&f,
10e37 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0d 0a 0, sizeof(f));..
10e38 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c f.l_type = l
10e39 6f 63 6b 54 79 70 65 3b 0d 0a 20 20 20 20 66 2e ockType;.. f.
10e3a 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f l_whence = SEEK_
10e3b 53 45 54 3b 0d 0a 20 20 20 20 66 2e 6c 5f 73 74 SET;.. f.l_st
10e3c 61 72 74 20 3d 20 6f 66 73 74 3b 0d 0a 20 20 20 art = ofst;..
10e3d 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0d 0a 0d f.l_len = n;...
10e3e 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 . rc = osFcnt
10e3f 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 l(pShmNode->h, F
10e40 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0d 0a 20 20 _SETLK, &f);..
10e41 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 rc = (rc!=(-1)
10e42 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 ) ? SQLITE_OK :
10e43 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 20 SQLITE_BUSY;..
10e44 7d 0d 0a 0d 0a 20 20 2f 2a 20 55 70 64 61 74 65 }.... /* Update
10e45 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b the global lock
10e46 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 state and do de
10e47 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0d 0a bug tracing */..
10e48 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
10e49 42 55 47 0d 0a 20 20 7b 20 75 31 36 20 6d 61 73 BUG.. { u16 mas
10e4a 6b 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 k;.. OSTRACE(("
10e4b 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0d 0a 20 SHM-LOCK "));..
10e4c 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 mask = (1<<(ofs
10e4d 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 t+n)) - (1<<ofst
10e4e 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 );.. if( rc==SQ
10e4f 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
10e50 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f if( lockType==F_
10e51 55 4e 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 20 20 UNLCK ){..
10e52 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b OSTRACE(("unlock
10e53 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b %d ok", ofst));
10e54 0d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 .. pShmNode
10e55 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d ->exclMask &= ~m
10e56 61 73 6b 3b 0d 0a 20 20 20 20 20 20 70 53 68 6d ask;.. pShm
10e57 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b Node->sharedMask
10e58 20 26 3d 20 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 &= ~mask;..
10e59 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 }else if( lockTy
10e5a 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0d 0a pe==F_RDLCK ){..
10e5b 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 OSTRACE(("
10e5c 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 read-lock %d ok"
10e5d 2c 20 6f 66 73 74 29 29 3b 0d 0a 20 20 20 20 20 , ofst));..
10e5e 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d pShmNode->exclM
10e5f 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0d 0a 20 ask &= ~mask;..
10e60 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 pShmNode->s
10e61 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 haredMask |= mas
10e62 6b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a k;.. }else{..
10e63 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f assert( lo
10e64 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 ckType==F_WRLCK
10e65 29 3b 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 );.. OSTRAC
10e66 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 E(("write-lock %
10e67 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0d 0a d ok", ofst));..
10e68 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e pShmNode->
10e69 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b exclMask |= mask
10e6a 3b 0d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 ;.. pShmNod
10e6b 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d e->sharedMask &=
10e6c 20 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 7d 0d 0a ~mask;.. }..
10e6d 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 66 }else{.. if
10e6e 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e ( lockType==F_UN
10e6f 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 20 20 4f 53 LCK ){.. OS
10e70 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 TRACE(("unlock %
10e71 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 d failed", ofst)
10e72 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 );.. }else if
10e73 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 ( lockType==F_RD
10e74 4c 43 4b 20 29 7b 0d 0a 20 20 20 20 20 20 4f 53 LCK ){.. OS
10e75 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 TRACE(("read-loc
10e76 6b 20 66 61 69 6c 65 64 22 29 29 3b 0d 0a 20 20 k failed"));..
10e77 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
10e78 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 assert( lockType
10e79 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0d 0a 20 20 ==F_WRLCK );..
10e7a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 OSTRACE(("wr
10e7b 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c ite-lock %d fail
10e7c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0d 0a 20 20 ed", ofst));..
10e7d 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 4f 53 54 52 }.. }.. OSTR
10e7e 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 ACE((" - afterwa
10e7f 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 rds %03x,%03x\n"
10e80 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 ,.. pS
10e81 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 hmNode->sharedMa
10e82 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 sk, pShmNode->ex
10e83 63 6c 4d 61 73 6b 29 29 3b 0d 0a 20 20 7d 0d 0a clMask));.. }..
10e84 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74 75 #endif.... retu
10e85 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0d 0a rn rc; ..
10e86 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 75 }....../*..** Pu
10e87 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e rge the unixShmN
10e88 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 odeList list of
10e89 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 all entries with
10e8a 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 unixShmNode.nRe
10e8b 66 3d 3d 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 f==0...**..** Th
10e8c 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 is is not a VFS
10e8d 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 shared-memory me
10e8e 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 thod; it is a ut
10e8f 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 ility function c
10e90 61 6c 6c 65 64 0d 0a 2a 2a 20 62 79 20 56 46 53 alled..** by VFS
10e91 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d shared-memory m
10e92 65 74 68 6f 64 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 ethods...*/..sta
10e93 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d tic void unixShm
10e94 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a Purge(unixFile *
10e95 70 46 64 29 7b 0d 0a 20 20 75 6e 69 78 53 68 6d pFd){.. unixShm
10e96 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 Node *p = pFd->p
10e97 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b Inode->pShmNode;
10e98 0d 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 .. assert( unix
10e99 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0d 0a MutexHeld() );..
10e9a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 if( p && p->nR
10e9b 65 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 6e ef==0 ){.. in
10e9c 74 20 69 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 t i;.. assert
10e9d 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 ( p->pInode==pFd
10e9e 2d 3e 70 49 6e 6f 64 65 20 29 3b 0d 0a 20 20 20 ->pInode );..
10e9f 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 sqlite3_mutex_f
10ea0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0d 0a ree(p->mutex);..
10ea1 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 for(i=0; i<p
10ea2 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b ->nRegion; i++){
10ea3 0d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 .. if( p->h
10ea4 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 >=0 ){..
10ea5 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 munmap(p->apRegi
10ea6 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 on[i], p->szRegi
10ea7 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 on);.. }els
10ea8 65 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 e{.. sqli
10ea9 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 te3_free(p->apRe
10eaa 67 69 6f 6e 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 gion[i]);..
10eab 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 }.. }.. s
10eac 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 qlite3_free(p->a
10ead 70 52 65 67 69 6f 6e 29 3b 0d 0a 20 20 20 20 69 pRegion);.. i
10eae 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0d 0a 20 f( p->h>=0 ){..
10eaf 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 robust_clos
10eb0 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c e(pFd, p->h, __L
10eb1 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 20 20 70 INE__);.. p
10eb2 2d 3e 68 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 7d ->h = -1;.. }
10eb3 0d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d .. p->pInode-
10eb4 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0d 0a >pShmNode = 0;..
10eb5 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
10eb6 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a (p);.. }..}....
10eb7 2f 2a 0d 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 /*..** Open a sh
10eb8 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 ared-memory area
10eb9 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
10eba 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 open database f
10ebb 69 6c 65 20 70 44 62 46 64 2e 20 20 0d 0a 2a 2a ile pDbFd. ..**
10ebc 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 This particular
10ebd 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
10ebe 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c uses mmapped fil
10ebf 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 es...**..** The
10ec0 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 file used to imp
10ec1 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 lement shared-me
10ec2 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 mory is in the s
10ec3 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 2a ame directory..*
10ec4 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 * as the open da
10ec5 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 tabase file and
10ec6 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d has the same nam
10ec7 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 e as the open da
10ec8 74 61 62 61 73 65 0d 0a 2a 2a 20 66 69 6c 65 20 tabase..** file
10ec9 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 with the "-shm"
10eca 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 suffix added. F
10ecb 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 or example, if t
10ecc 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
10ecd 0d 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 ..** is "/home/u
10ece 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 ser1/config.db"
10ecf 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 then the file th
10ed0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e at is created an
10ed1 64 20 6d 6d 61 70 70 65 64 0d 0a 2a 2a 20 66 6f d mmapped..** fo
10ed2 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 r shared memory
10ed3 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 will be called "
10ed4 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 /home/user1/conf
10ed5 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0d 0a 2a ig.db-shm". ..*
10ed6 2a 0d 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 *..** Another ap
10ed7 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 proach to is to
10ed8 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 use files in /de
10ed9 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d v/shm or /dev/tm
10eda 70 20 6f 72 20 61 6e 0d 0a 2a 2a 20 73 6f 6d 65 p or an..** some
10edb 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 other tmpfs mou
10edc 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c nt. But if a fil
10edd 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 e in a different
10ede 20 64 69 72 65 63 74 6f 72 79 0d 0a 2a 2a 20 66 directory..** f
10edf 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 rom the database
10ee0 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 file is used, t
10ee1 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 hen differing ac
10ee2 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 cess permissions
10ee3 0d 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 ..** or a chroot
10ee4 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 () might cause t
10ee5 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f wo different pro
10ee6 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 cesses on the sa
10ee7 6d 65 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 me..** database
10ee8 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 to end up using
10ee9 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 different files
10eea 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 for shared memor
10eeb 79 20 2d 20 0d 0a 2a 2a 20 6d 65 61 6e 69 6e 67 y - ..** meaning
10eec 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f that their memo
10eed 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 ry would not rea
10eee 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 lly be shared -
10eef 72 65 73 75 6c 74 69 6e 67 0d 0a 2a 2a 20 69 6e resulting..** in
10ef0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 database corrup
10ef1 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c tion. Neverthel
10ef2 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 ess, this tmpfs
10ef3 66 69 6c 65 20 75 73 61 67 65 0d 0a 2a 2a 20 63 file usage..** c
10ef4 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 an be enabled at
10ef5 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 compile-time us
10ef6 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d ing -DSQLITE_SHM
10ef7 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 _DIRECTORY="/dev
10ef8 2f 73 68 6d 22 0d 0a 2a 2a 20 6f 72 20 74 68 65 /shm"..** or the
10ef9 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 equivalent. Th
10efa 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c e use of the SQL
10efb 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 ITE_SHM_DIRECTOR
10efc 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0d 0a Y compile-time..
10efd 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 ** option result
10efe 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 s in an incompat
10eff 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 ible build of SQ
10f00 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 Lite; builds of
10f01 20 53 51 4c 69 74 65 0d 0a 2a 2a 20 74 68 61 74 SQLite..** that
10f02 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 with differing
10f03 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 SQLITE_SHM_DIREC
10f04 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 TORY settings at
10f05 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 tempt to use the
10f06 0d 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 ..** same databa
10f07 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 se file at the s
10f08 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 ame time, databa
10f09 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 se corruption wi
10f0a 6c 6c 20 6c 69 6b 65 6c 79 0d 0a 2a 2a 20 72 65 ll likely..** re
10f0b 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 sult. The SQLITE
10f0c 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 _SHM_DIRECTORY c
10f0d 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 ompile-time opti
10f0e 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 on is considered
10f0f 0d 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 ..** "unsupporte
10f10 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 d" and may go aw
10f11 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 ay in a future S
10f12 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0d 0a QLite release...
10f13 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e **..** When open
10f14 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 ing a new shared
10f15 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 -memory file, if
10f16 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e no other instan
10f17 63 65 73 20 6f 66 20 74 68 61 74 0d 0a 2a 2a 20 ces of that..**
10f18 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 file are current
10f19 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 ly open, in this
10f1a 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f process or in o
10f1b 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 ther processes,
10f1c 74 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 66 69 6c then..** the fil
10f1d 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 e must be trunca
10f1e 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 ted to zero leng
10f1f 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 th or have its h
10f20 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0d 0a eader cleared...
10f21 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 **..** If the or
10f22 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 iginal database
10f23 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 file (pDbFd) is
10f24 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d using the "unix-
10f25 65 78 63 6c 22 20 56 46 53 0d 0a 2a 2a 20 74 68 excl" VFS..** th
10f26 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e at means that an
10f27 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 exclusive lock
10f28 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 is held on the d
10f29 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 atabase file and
10f2a 0d 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 ..** that no oth
10f2b 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 er processes are
10f2c 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 able to read or
10f2d 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 write the datab
10f2e 61 73 65 2e 20 20 49 6e 0d 0a 2a 2a 20 74 68 61 ase. In..** tha
10f2f 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f t case, we do no
10f30 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 t really need sh
10f31 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f ared memory. No
10f32 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0d 0a shared memory..
10f33 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 ** file is creat
10f34 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 ed. The shared
10f35 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 memory will be s
10f36 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 imulated with he
10f37 61 70 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a ap memory...*/..
10f38 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f static int unixO
10f39 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 penSharedMemory(
10f3a 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 unixFile *pDbFd)
10f3b 7b 0d 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 {.. struct unix
10f3c 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 Shm *p = 0;
10f3d 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e /* The conn
10f3e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 ection to be ope
10f3f 6e 65 64 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 ned */.. struct
10f40 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 unixShmNode *pS
10f41 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 hmNode; /* The
10f42 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 underlying mmap
10f43 70 65 64 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 ped file */.. i
10f44 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
10f45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
10f46 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f * Result code */
10f47 0d 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 .. unixInodeInf
10f48 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 o *pInode;
10f49 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 /* The inode
10f4a 20 6f 66 20 66 64 20 2a 2f 0d 0a 20 20 63 68 61 of fd */.. cha
10f4b 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b r *zShmFilename;
10f4c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
10f4d 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 Name of the file
10f4e 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f used for SHM */
10f4f 0d 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 .. int nShmFile
10f50 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 name;
10f51 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 /* Size of t
10f52 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 he SHM filename
10f53 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 0d 0a 20 in bytes */....
10f54 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 /* Allocate spa
10f55 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 ce for the new u
10f56 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a nixShm object. *
10f57 2f 0d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 /.. p = sqlite3
10f58 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 _malloc( sizeof(
10f59 2a 70 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 3d *p) );.. if( p=
10f5a 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 =0 ) return SQLI
10f5b 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 6d 65 6d TE_NOMEM;.. mem
10f5c 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 set(p, 0, sizeof
10f5d 28 2a 70 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 (*p));.. assert
10f5e 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 ( pDbFd->pShm==0
10f5f 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 );.... /* Chec
10f60 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e k to see if a un
10f61 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 ixShmNode object
10f62 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e already exists.
10f63 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 Reuse an existi
10f64 6e 67 0d 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 ng.. ** one if
10f65 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 present. Create
10f66 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 a new one if nec
10f67 65 73 73 61 72 79 2e 0d 0a 20 20 2a 2f 0d 0a 20 essary... */..
10f68 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 unixEnterMutex(
10f69 29 3b 0d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 );.. pInode = p
10f6a 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0d 0a 20 DbFd->pInode;..
10f6b 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f pShmNode = pIno
10f6c 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0d 0a 20 de->pShmNode;..
10f6d 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 if( pShmNode==0
10f6e 20 29 7b 0d 0a 20 20 20 20 73 74 72 75 63 74 20 ){.. struct
10f6f 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 stat sStat;
10f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 /* f
10f71 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 stat() info for
10f72 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f database file */
10f73 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 .... /* Call
10f74 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 fstat() to figur
10f75 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 e out the permis
10f76 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 sions on the dat
10f77 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0d 0a abase file. If..
10f78 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 ** a new *-s
10f79 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 hm file is creat
10f7a 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 ed, an attempt w
10f7b 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 ill be made to c
10f7c 72 65 61 74 65 20 69 74 0d 0a 20 20 20 20 2a 2a reate it.. **
10f7d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 with the same p
10f7e 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 ermissions. The
10f7f 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73 69 6f actual permissio
10f80 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 ns the file is c
10f81 72 65 61 74 65 64 0d 0a 20 20 20 20 2a 2a 20 77 reated.. ** w
10f82 69 74 68 20 61 72 65 20 73 75 62 6a 65 63 74 20 ith are subject
10f83 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 to the current u
10f84 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e 0d 0a 20 mask setting...
10f85 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 6f */.. if( o
10f86 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c sFstat(pDbFd->h,
10f87 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f &sStat) && pIno
10f88 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b de->bProcessLock
10f89 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 ==0 ){.. rc
10f8a 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f = SQLITE_IOERR_
10f8b 46 53 54 41 54 3b 0d 0a 20 20 20 20 20 20 67 6f FSTAT;.. go
10f8c 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b to shm_open_err;
10f8d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 64 65 .. }....#ifde
10f8e 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 f SQLITE_SHM_DIR
10f8f 45 43 54 4f 52 59 0d 0a 20 20 20 20 6e 53 68 6d ECTORY.. nShm
10f90 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f Filename = sizeo
10f91 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 f(SQLITE_SHM_DIR
10f92 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0d 0a 23 ECTORY) + 31;..#
10f93 65 6c 73 65 0d 0a 20 20 20 20 6e 53 68 6d 46 69 else.. nShmFi
10f94 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e lename = 6 + (in
10f95 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e t)strlen(pDbFd->
10f96 7a 50 61 74 68 29 3b 0d 0a 23 65 6e 64 69 66 0d zPath);..#endif.
10f97 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 . pShmNode =
10f98 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 sqlite3_malloc(
10f99 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 sizeof(*pShmNode
10f9a 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 ) + nShmFilename
10f9b 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 53 68 );.. if( pSh
10f9c 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 mNode==0 ){..
10f9d 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e rc = SQLITE_N
10f9e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 67 6f 74 OMEM;.. got
10f9f 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0d o shm_open_err;.
10fa0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 6d 65 6d 73 . }.. mems
10fa1 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 et(pShmNode, 0,
10fa2 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 sizeof(*pShmNode
10fa3 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b )+nShmFilename);
10fa4 0d 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 .. zShmFilena
10fa5 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a me = pShmNode->z
10fa6 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 Filename = (char
10fa7 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0d *)&pShmNode[1];.
10fa8 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 .#ifdef SQLITE_S
10fa9 48 4d 5f 44 49 52 45 43 54 4f 52 59 0d 0a 20 20 HM_DIRECTORY..
10faa 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
10fab 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c tf(nShmFilename,
10fac 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0d zShmFilename, .
10fad 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
10fae 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d SQLITE_SHM
10faf 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c _DIRECTORY "/sql
10fb0 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0d ite-shm-%x-%x",.
10fb1 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
10fb2 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74 (u32)sStat
10fb3 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 .st_ino, (u32)sS
10fb4 74 61 74 2e 73 74 5f 64 65 76 29 3b 0d 0a 23 65 tat.st_dev);..#e
10fb5 6c 73 65 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 lse.. sqlite3
10fb6 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 _snprintf(nShmFi
10fb7 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 lename, zShmFile
10fb8 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 name, "%s-shm",
10fb9 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0d 0a pDbFd->zPath);..
10fba 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 sqlite3FileS
10fbb 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 uffix3(pDbFd->zP
10fbc 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d ath, zShmFilenam
10fbd 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 e);..#endif..
10fbe 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d pShmNode->h = -
10fbf 31 3b 0d 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 1;.. pDbFd->p
10fc0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 Inode->pShmNode
10fc1 3d 20 70 53 68 6d 4e 6f 64 65 3b 0d 0a 20 20 20 = pShmNode;..
10fc2 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 pShmNode->pInod
10fc3 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 e = pDbFd->pInod
10fc4 65 3b 0d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 e;.. pShmNode
10fc5 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 ->mutex = sqlite
10fc6 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 3_mutex_alloc(SQ
10fc7 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 LITE_MUTEX_FAST)
10fc8 3b 0d 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e ;.. if( pShmN
10fc9 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b ode->mutex==0 ){
10fca 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c .. rc = SQL
10fcb 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 ITE_NOMEM;..
10fcc 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f goto shm_open_
10fcd 65 72 72 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 err;.. }....
10fce 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 if( pInode->b
10fcf 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 ProcessLock==0 )
10fd0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 {.. int ope
10fd1 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 nFlags = O_RDWR
10fd2 7c 20 4f 5f 43 52 45 41 54 3b 0d 0a 20 20 20 20 | O_CREAT;..
10fd3 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 if( sqlite3_ur
10fd4 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d i_boolean(pDbFd-
10fd5 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c >zPath, "readonl
10fd6 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0d 0a 20 y_shm", 0) ){..
10fd7 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 openFlags
10fd8 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0d 0a 20 20 = O_RDONLY;..
10fd9 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e pShmNode->
10fda 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0d isReadonly = 1;.
10fdb 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
10fdc 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f pShmNode->h = ro
10fdd 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 bust_open(zShmFi
10fde 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 lename, openFlag
10fdf 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 s, (sStat.st_mod
10fe0 65 26 30 37 37 37 29 29 3b 0d 0a 20 20 20 20 20 e&0777));..
10fe1 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 if( pShmNode->h
10fe2 3c 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 <0 ){.. i
10fe3 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 f( pShmNode->h<0
10fe4 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 ){.. r
10fe5 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 c = unixLogError
10fe6 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e (SQLITE_CANTOPEN
10fe7 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a _BKPT, "open", z
10fe8 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 ShmFilename);..
10fe9 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 goto sh
10fea 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0d 0a 20 20 20 m_open_err;..
10feb 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d }.. }.
10fec 0a 20 20 0d 0a 20 20 20 20 20 20 2f 2a 20 43 68 . .. /* Ch
10fed 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e eck to see if an
10fee 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 other process is
10fef 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 holding the dea
10ff0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0d 0a 20 d-man switch...
10ff1 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 ** If not,
10ff2 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c truncate the fil
10ff3 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 e to zero length
10ff4 2e 20 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 . .. */..
10ff5 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
10ff6 4f 4b 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 75 OK;.. if( u
10ff7 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b nixShmSystemLock
10ff8 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c (pShmNode, F_WRL
10ff9 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 CK, UNIX_SHM_DMS
10ffa 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 , 1)==SQLITE_OK
10ffb 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){.. if(
10ffc 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 robust_ftruncate
10ffd 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 (pShmNode->h, 0)
10ffe 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 ){.. r
10fff 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 c = unixLogError
11000 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 (SQLITE_IOERR_SH
11001 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 MOPEN, "ftruncat
11002 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 e", zShmFilename
11003 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
11004 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 }.. if
11005 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
11006 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
11007 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f unixShmSystemLo
11008 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 ck(pShmNode, F_R
11009 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 DLCK, UNIX_SHM_D
1100a 4d 53 2c 20 31 29 3b 0d 0a 20 20 20 20 20 20 7d MS, 1);.. }
1100b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 .. if( rc )
1100c 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 goto shm_open_e
1100d 72 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d rr;.. }.. }.
1100e 0a 0d 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 ... /* Make the
1100f 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 new connection
11010 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 a child of the u
11011 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0d 0a 20 nixShmNode */..
11012 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 p->pShmNode = p
11013 53 68 6d 4e 6f 64 65 3b 0d 0a 23 69 66 64 65 66 ShmNode;..#ifdef
11014 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 SQLITE_DEBUG..
11015 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 p->id = pShmNod
11016 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0d e->nextShmId++;.
11017 0a 23 65 6e 64 69 66 0d 0a 20 20 70 53 68 6d 4e .#endif.. pShmN
11018 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 20 20 ode->nRef++;..
11019 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b pDbFd->pShm = p;
1101a 0d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 .. unixLeaveMut
1101b 65 78 28 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 ex();.... /* Th
1101c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e e reference coun
1101d 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 t on pShmNode ha
1101e 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 s already been i
1101f 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 ncremented under
11020 0d 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 .. ** the cover
11021 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 of the unixEnte
11022 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 rMutex() mutex a
11023 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 nd the pointer f
11024 72 6f 6d 20 74 68 65 0d 0a 20 20 2a 2a 20 6e 65 rom the.. ** ne
11025 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 w (struct unixSh
11026 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 m) object to the
11027 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 pShmNode has be
11028 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 en set. All that
11029 20 69 73 0d 0a 20 20 2a 2a 20 6c 65 66 74 20 74 is.. ** left t
1102a 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 o do is to link
1102b 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 the new object i
1102c 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c nto the linked l
1102d 69 73 74 20 73 74 61 72 74 69 6e 67 0d 0a 20 20 ist starting..
1102e 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e ** at pShmNode->
1102f 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 pFirst. This mus
11030 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 t be done while
11031 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d holding the pShm
11032 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0d 0a 20 20 Node->mutex ..
11033 2a 2a 20 6d 75 74 65 78 2e 0d 0a 20 20 2a 2f 0d ** mutex... */.
11034 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
11035 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d _enter(pShmNode-
11036 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 70 2d 3e 70 >mutex);.. p->p
11037 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d Next = pShmNode-
11038 3e 70 46 69 72 73 74 3b 0d 0a 20 20 70 53 68 6d >pFirst;.. pShm
11039 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 Node->pFirst = p
1103a 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 ;.. sqlite3_mut
1103b 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 ex_leave(pShmNod
1103c 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 72 65 e->mutex);.. re
1103d 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
1103e 0a 0d 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 ... /* Jump her
1103f 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a e on any error *
11040 2f 0d 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a /..shm_open_err:
11041 0d 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 .. unixShmPurge
11042 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f (pDbFd); /
11043 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 * This call free
11044 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 s pShmNode if re
11045 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20 73 71 6c quired */.. sql
11046 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20 ite3_free(p);..
11047 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 unixLeaveMutex(
11048 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b );.. return rc;
11049 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
1104a 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
1104b 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 alled to obtain
1104c 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 a pointer to reg
1104d 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 ion iRegion of t
1104e 68 65 20 0d 0a 2a 2a 20 73 68 61 72 65 64 2d 6d he ..** shared-m
1104f 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 emory associated
11050 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 with the databa
11051 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 se file fd. Shar
11052 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e ed-memory region
11053 73 20 0d 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 s ..** are numbe
11054 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f red starting fro
11055 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 m zero. Each sha
11056 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f red-memory regio
11057 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0d 0a n is szRegion ..
11058 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 ** bytes in size
11059 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 ...**..** If an
1105a 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e error occurs, an
1105b 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 error code is r
1105c 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 eturned and *pp
1105d 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0d is set to NULL..
1105e 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 .**..** Otherwis
1105f 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e e, if the bExten
11060 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 d parameter is 0
11061 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 and the request
11062 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 ed shared-memory
11063 0d 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 ..** region has
11064 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 not been allocat
11065 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e ed (by any clien
11066 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 t, including one
11067 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0d 0a 2a running in a..*
11068 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 * separate proce
11069 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 ss), then *pp is
1106a 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 set to NULL and
1106b 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 SQLITE_OK retur
1106c 6e 65 64 2e 20 49 66 20 0d 0a 2a 2a 20 62 45 78 ned. If ..** bEx
1106d 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f tend is non-zero
1106e 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 and the request
1106f 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 ed shared-memory
11070 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 region has not
11071 79 65 74 20 0d 0a 2a 2a 20 62 65 65 6e 20 61 6c yet ..** been al
11072 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 located, it is a
11073 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 llocated by this
11074 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a function...**..
11075 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 ** If the shared
11076 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 -memory region h
11077 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
11078 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 allocated or is
11079 61 6c 6c 6f 63 61 74 65 64 20 62 79 0d 0a 2a 2a allocated by..**
1107a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 this call as de
1107b 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 scribed above, t
1107c 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 hen it is mapped
1107d 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 into this proce
1107e 73 73 65 73 20 0d 0a 2a 2a 20 61 64 64 72 65 73 sses ..** addres
1107f 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 s space (if it i
11080 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 s not already),
11081 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f *pp is set to po
11082 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 int to the mappe
11083 64 20 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e d ..** memory an
11084 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 d SQLITE_OK retu
11085 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 rned...*/..stati
11086 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 c int unixShmMap
11087 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c (.. sqlite3_fil
11088 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 e *fd,
11089 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f /* Handle o
1108a 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 pen on database
1108b 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 file */.. int i
1108c 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 Region,
1108d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
1108e 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 gion to retrieve
1108f 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 52 65 67 */.. int szReg
11090 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 ion,
11091 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
11092 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0d 0a 20 20 f regions */..
11093 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 int bExtend,
11094 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11095 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e /* True to exten
11096 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 d file if necess
11097 61 72 79 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 76 ary */.. void v
11098 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 olatile **pp
11099 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 /* OUT
1109a 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 : Mapped memory
1109b 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 6e 69 78 46 69 */..){.. unixFi
1109c 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 le *pDbFd = (uni
1109d 78 46 69 6c 65 2a 29 66 64 3b 0d 0a 20 20 75 6e xFile*)fd;.. un
1109e 69 78 53 68 6d 20 2a 70 3b 0d 0a 20 20 75 6e 69 ixShm *p;.. uni
1109f 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f xShmNode *pShmNo
110a0 64 65 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 de;.. int rc =
110a1 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 SQLITE_OK;....
110a2 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 /* If the shared
110a3 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 -memory file has
110a4 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 not yet been op
110a5 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f ened, open it no
110a6 77 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 44 62 w. */.. if( pDb
110a7 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0d 0a Fd->pShm==0 ){..
110a8 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 rc = unixOpe
110a9 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 nSharedMemory(pD
110aa 62 46 64 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 bFd);.. if( r
110ab 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 c!=SQLITE_OK ) r
110ac 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a eturn rc;.. }..
110ad 0d 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 .. p = pDbFd->p
110ae 53 68 6d 3b 0d 0a 20 20 70 53 68 6d 4e 6f 64 65 Shm;.. pShmNode
110af 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0d = p->pShmNode;.
110b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
110b1 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d _enter(pShmNode-
110b2 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 61 73 73 65 >mutex);.. asse
110b3 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 rt( szRegion==pS
110b4 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e hmNode->szRegion
110b5 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 || pShmNode->nR
110b6 65 67 69 6f 6e 3d 3d 30 20 29 3b 0d 0a 20 20 61 egion==0 );.. a
110b7 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d ssert( pShmNode-
110b8 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e >pInode==pDbFd->
110b9 70 49 6e 6f 64 65 20 29 3b 0d 0a 20 20 61 73 73 pInode );.. ass
110ba 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 ert( pShmNode->h
110bb 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 >=0 || pDbFd->pI
110bc 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f node->bProcessLo
110bd 63 6b 3d 3d 31 20 29 3b 0d 0a 20 20 61 73 73 65 ck==1 );.. asse
110be 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c rt( pShmNode->h<
110bf 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 0 || pDbFd->pIno
110c0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b de->bProcessLock
110c1 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 ==0 );.... if(
110c2 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
110c3 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0d 0a 20 n<=iRegion ){..
110c4 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b char **apNew;
110c5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110c6 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 /* New apR
110c7 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f egion[] array */
110c8 0d 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 .. int nByte
110c9 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a = (iRegion+1)*sz
110ca 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 Region; /* Mini
110cb 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c mum required fil
110cc 65 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 20 20 73 e size */.. s
110cd 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 truct stat sStat
110ce 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
110cf 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 /* Used by fst
110d0 61 74 28 29 20 2a 2f 0d 0a 0d 0a 20 20 20 20 70 at() */.... p
110d1 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f ShmNode->szRegio
110d2 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0d 0a 0d n = szRegion;...
110d3 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 . if( pShmNod
110d4 65 2d 3e 68 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 e->h>=0 ){..
110d5 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 /* The request
110d6 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 ed region is not
110d7 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 mapped into thi
110d8 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 s processes addr
110d9 65 73 73 20 73 70 61 63 65 2e 0d 0a 20 20 20 20 ess space...
110da 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 ** Check to se
110db 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e e if it has been
110dc 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e allocated (i.e.
110dd 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 if the wal-inde
110de 78 20 66 69 6c 65 20 69 73 0d 0a 20 20 20 20 20 x file is..
110df 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 ** large enough
110e0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 to contain the
110e1 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e requested region
110e2 29 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 )... */..
110e3 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 if( osFstat(
110e4 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 pShmNode->h, &sS
110e5 74 61 74 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 tat) ){..
110e6 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 rc = SQLITE_IOE
110e7 52 52 5f 53 48 4d 53 49 5a 45 3b 0d 0a 20 20 20 RR_SHMSIZE;..
110e8 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 goto shmpag
110e9 65 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 7d 0d e_out;.. }.
110ea 0a 20 20 0d 0a 20 20 20 20 20 20 69 66 28 20 73 . .. if( s
110eb 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 Stat.st_size<nBy
110ec 74 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f te ){.. /
110ed 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 * The requested
110ee 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f memory region do
110ef 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 es not exist. If
110f0 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 bExtend is set
110f1 74 6f 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 to.. ** f
110f2 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 alse, exit early
110f3 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 . *pp will be se
110f4 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 t to NULL and SQ
110f5 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 LITE_OK returned
110f6 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 ... **..
110f7 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e ** Altern
110f8 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 atively, if bExt
110f9 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65 end is true, use
110fa 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 ftruncate() to
110fb 61 6c 6c 6f 63 61 74 65 0d 0a 20 20 20 20 20 20 allocate..
110fc 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 ** the request
110fd 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e ed memory region
110fe 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 ... */..
110ff 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 if( !bExt
11100 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 end ) goto shmpa
11101 67 65 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 20 ge_out;..
11102 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 if( robust_ftru
11103 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e ncate(pShmNode->
11104 68 2c 20 6e 42 79 74 65 29 20 29 7b 0d 0a 20 20 h, nByte) ){..
11105 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 rc = uni
11106 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 xLogError(SQLITE
11107 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 _IOERR_SHMSIZE,
11108 22 66 74 72 75 6e 63 61 74 65 22 2c 0d 0a 20 20 "ftruncate",..
11109 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1110a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f pShmNo
1110b 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d de->zFilename);.
1110c 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 . goto
1110d 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0d 0a 20 20 shmpage_out;..
1110e 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d }.. }
1110f 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f .. }.... /
11110 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 * Map the reques
11111 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f ted memory regio
11112 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 n into this proc
11113 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 esses address sp
11114 61 63 65 2e 20 2a 2f 0d 0a 20 20 20 20 61 70 4e ace. */.. apN
11115 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 ew = (char **)sq
11116 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0d 0a lite3_realloc(..
11117 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 pShmNode
11118 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 ->apRegion, (iRe
11119 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 gion+1)*sizeof(c
1111a 68 61 72 20 2a 29 0d 0a 20 20 20 20 29 3b 0d 0a har *).. );..
1111b 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 if( !apNew )
1111c 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 {.. rc = SQ
1111d 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d LITE_IOERR_NOMEM
1111e 3b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 ;.. goto sh
1111f 6d 70 61 67 65 5f 6f 75 74 3b 0d 0a 20 20 20 20 mpage_out;..
11120 7d 0d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d }.. pShmNode-
11121 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 >apRegion = apNe
11122 77 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 70 53 w;.. while(pS
11123 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c hmNode->nRegion<
11124 3d 69 52 65 67 69 6f 6e 29 7b 0d 0a 20 20 20 20 =iRegion){..
11125 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0d 0a 20 void *pMem;..
11126 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 if( pShmNod
11127 65 2d 3e 68 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 e->h>=0 ){..
11128 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 pMem = mmap(
11129 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0d 0a 20 20 0, szRegion,..
1112a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f pShmNo
1112b 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f de->isReadonly ?
1112c 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f PROT_READ : PRO
1112d 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 T_READ|PROT_WRIT
1112e 45 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 E, ..
1112f 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 MAP_SHARED, pSh
11130 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f mNode->h, pShmNo
11131 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 de->nRegion*szRe
11132 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 29 3b gion.. );
11133 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d .. if( pM
11134 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 em==MAP_FAILED )
11135 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 {.. rc
11136 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 = unixLogError(S
11137 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d QLITE_IOERR_SHMM
11138 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d AP, "mmap", pShm
11139 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 Node->zFilename)
1113a 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 ;.. got
1113b 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0d 0a o shmpage_out;..
1113c 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
1113d 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
1113e 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f pMem = sqlite3_
1113f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 malloc(szRegion)
11140 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 ;.. if( p
11141 4d 65 6d 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 Mem==0 ){..
11142 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
11143 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 20 _NOMEM;..
11144 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f goto shmpage_
11145 6f 75 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d out;.. }.
11146 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 . memset(
11147 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f pMem, 0, szRegio
11148 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 n);.. }..
11149 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 pShmNode->ap
1114a 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d Region[pShmNode-
1114b 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d >nRegion] = pMem
1114c 3b 0d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 ;.. pShmNod
1114d 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0d 0a 20 e->nRegion++;..
1114e 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 73 68 6d }.. }....shm
1114f 70 61 67 65 5f 6f 75 74 3a 0d 0a 20 20 69 66 28 page_out:.. if(
11150 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 pShmNode->nRegi
11151 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0d 0a 20 on>iRegion ){..
11152 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 *pp = pShmNod
11153 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 e->apRegion[iReg
11154 69 6f 6e 5d 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d ion];.. }else{.
11155 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0d 0a 20 . *pp = 0;..
11156 20 7d 0d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f }.. if( pShmNo
11157 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 de->isReadonly &
11158 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 & rc==SQLITE_OK
11159 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 ) rc = SQLITE_RE
1115a 41 44 4f 4e 4c 59 3b 0d 0a 20 20 73 71 6c 69 74 ADONLY;.. sqlit
1115b 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 e3_mutex_leave(p
1115c 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
1115d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
1115e 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e }..../*..** Chan
1115f 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 ge the lock stat
11160 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d e for a shared-m
11161 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0d 0a emory segment...
11162 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 **..** Note that
11163 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 the relationshi
11164 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 p between SHAREd
11165 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c and EXCLUSIVE l
11166 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 ocks is a little
11167 0d 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 ..** different h
11168 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 ere than in posi
11169 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 x. In xShmLock(
1116a 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 ), one can go fr
1116b 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0d 0a 2a 2a 20 om unlocked..**
1116c 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 to shared and ba
1116d 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 ck or from unloc
1116e 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 ked to exclusive
1116f 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 and back. But
11170 6f 6e 65 20 6d 61 79 0d 0a 2a 2a 20 6e 6f 74 20 one may..** not
11171 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 go from shared t
11172 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 o exclusive or f
11173 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f rom exclusive to
11174 20 73 68 61 72 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 shared...*/..st
11175 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d atic int unixShm
11176 4c 6f 63 6b 28 0d 0a 20 20 73 71 6c 69 74 65 33 Lock(.. sqlite3
11177 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 _file *fd,
11178 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
11179 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 file holding the
1117a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a shared memory *
1117b 2f 0d 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 /.. int ofst,
1117c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1117d 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f /* First lock to
1117e 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 acquire or rele
1117f 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 2c ase */.. int n,
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11181 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
11182 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 f locks to acqui
11183 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f re or release */
11184 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 .. int flags
11185 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11186 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 * What to do wit
11187 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0d 0a 29 h the lock */..)
11188 7b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 {.. unixFile *p
11189 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 DbFd = (unixFile
1118a 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f *)fd; /* Co
1118b 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 nnection holding
1118c 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a shared memory *
1118d 2f 0d 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 /.. unixShm *p
1118e 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 = pDbFd->pShm;
1118f 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
11190 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 e shared memory
11191 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0d being locked */.
11192 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 . unixShm *pX;
11193 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11194 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 /* For
11195 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c looping over all
11196 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0d 0a 20 20 siblings */..
11197 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 unixShmNode *pSh
11198 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e mNode = p->pShmN
11199 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 ode; /* The und
1119a 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f erlying file iNo
1119b 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 20 de */.. int rc
1119c 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
1119d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1119e 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f * Result code */
1119f 0d 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 .. u16 mask;
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
111a1 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 /* Mas
111a2 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 k of locks to ta
111a3 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f ke or release */
111a4 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 53 .... assert( pS
111a5 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 hmNode==pDbFd->p
111a6 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 Inode->pShmNode
111a7 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 53 );.. assert( pS
111a8 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d hmNode->pInode==
111a9 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b pDbFd->pInode );
111aa 0d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 .. assert( ofst
111ab 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 >=0 && ofst+n<=S
111ac 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 QLITE_SHM_NLOCK
111ad 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e );.. assert( n>
111ae 3d 31 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 =1 );.. assert(
111af 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f flags==(SQLITE_
111b0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 SHM_LOCK | SQLIT
111b1 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0d 0a 20 E_SHM_SHARED)..
111b2 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d || flags==
111b3 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b (SQLITE_SHM_LOCK
111b4 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 | SQLITE_SHM_EX
111b5 43 4c 55 53 49 56 45 29 0d 0a 20 20 20 20 20 20 CLUSIVE)..
111b6 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 || flags==(SQLI
111b7 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 TE_SHM_UNLOCK |
111b8 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 SQLITE_SHM_SHARE
111b9 44 29 0d 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c D).. || fl
111ba 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d ags==(SQLITE_SHM
111bb 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 _UNLOCK | SQLITE
111bc 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 _SHM_EXCLUSIVE)
111bd 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d );.. assert( n=
111be 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 =1 || (flags & S
111bf 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 QLITE_SHM_EXCLUS
111c0 49 56 45 29 21 3d 30 20 29 3b 0d 0a 20 20 61 73 IVE)!=0 );.. as
111c1 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e sert( pShmNode->
111c2 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 h>=0 || pDbFd->p
111c3 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c Inode->bProcessL
111c4 6f 63 6b 3d 3d 31 20 29 3b 0d 0a 20 20 61 73 73 ock==1 );.. ass
111c5 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 ert( pShmNode->h
111c6 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e <0 || pDbFd->pIn
111c7 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 ode->bProcessLoc
111c8 6b 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 6d 61 73 k==0 );.... mas
111c9 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 k = (1<<(ofst+n)
111ca 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0d 0a ) - (1<<ofst);..
111cb 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c assert( n>1 ||
111cc 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 mask==(1<<ofst)
111cd 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d );.. sqlite3_m
111ce 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e utex_enter(pShmN
111cf 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 ode->mutex);..
111d0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 if( flags & SQLI
111d1 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b TE_SHM_UNLOCK ){
111d2 0d 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 .. u16 allMas
111d3 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f k = 0; /* Mask o
111d4 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 f locks held by
111d5 73 69 62 6c 69 6e 67 73 20 2a 2f 0d 0a 0d 0a 20 siblings */....
111d6 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 /* See if any
111d7 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 siblings hold t
111d8 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f his same lock */
111d9 0d 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 .. for(pX=pSh
111da 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 mNode->pFirst; p
111db 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 X; pX=pX->pNext)
111dc 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d {.. if( pX=
111dd 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a =p ) continue;..
111de 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 assert( (p
111df 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 X->exclMask & (p
111e0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 ->exclMask|p->sh
111e1 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b aredMask))==0 );
111e2 0d 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 .. allMask
111e3 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 |= pX->sharedMas
111e4 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 k;.. }....
111e5 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 /* Unlock the s
111e6 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b ystem-level lock
111e7 73 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 28 6d s */.. if( (m
111e8 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d ask & allMask)==
111e9 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 0 ){.. rc =
111ea 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f unixShmSystemLo
111eb 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 ck(pShmNode, F_U
111ec 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f NLCK, ofst+UNIX_
111ed 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0d 0a 20 SHM_BASE, n);..
111ee 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
111ef 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
111f0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f .. }.... /
111f1 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c * Undo the local
111f2 20 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 20 20 69 locks */.. i
111f3 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
111f4 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e 65 78 ){.. p->ex
111f5 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b clMask &= ~mask;
111f6 0d 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 .. p->share
111f7 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0d dMask &= ~mask;.
111f8 0a 20 20 20 20 7d 20 0d 0a 20 20 7d 65 6c 73 65 . } .. }else
111f9 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c if( flags & SQL
111fa 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 ITE_SHM_SHARED )
111fb 7b 0d 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 {.. u16 allSh
111fc 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e ared = 0; /* Un
111fd 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c ion of locks hel
111fe 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 d by connections
111ff 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 other than "p"
11200 2a 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 46 69 6e */.... /* Fin
11201 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 d out which shar
11202 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 ed locks are alr
11203 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 eady held by sib
11204 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 ling connections
11205 2e 0d 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 ... ** If any
11206 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 sibling already
11207 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 holds an exclus
11208 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 ive lock, go ahe
11209 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0d 0a 20 ad and return..
1120a 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 ** SQLITE_BUS
1120b 59 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 Y... */..
1120c 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d for(pX=pShmNode-
1120d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d >pFirst; pX; pX=
1120e 70 58 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 pX->pNext){..
1120f 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c if( (pX->excl
11210 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 Mask & mask)!=0
11211 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
11212 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
11213 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 break;..
11214 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 61 6c }.. al
11215 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 lShared |= pX->s
11216 68 61 72 65 64 4d 61 73 6b 3b 0d 0a 20 20 20 20 haredMask;..
11217 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.... /* Get
11218 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 shared locks at
11219 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c the system level
1121a 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a , if necessary *
1121b 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 /.. if( rc==S
1121c 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1121d 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 if( (allShare
1121e 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0d d & mask)==0 ){.
1121f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e . rc = un
11220 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 ixShmSystemLock(
11221 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 pShmNode, F_RDLC
11222 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d K, ofst+UNIX_SHM
11223 5f 42 41 53 45 2c 20 6e 29 3b 0d 0a 20 20 20 20 _BASE, n);..
11224 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
11225 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
11226 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
11227 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.... /* Get
11228 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 the local shared
11229 20 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 20 20 69 locks */.. i
1122a 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
1122b 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e 73 68 ){.. p->sh
1122c 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b aredMask |= mask
1122d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 ;.. }.. }els
1122e 65 7b 0d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 e{.. /* Make
1122f 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 sure no sibling
11230 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 connections hold
11231 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c locks that will
11232 20 62 6c 6f 63 6b 20 74 68 69 73 0d 0a 20 20 20 block this..
11233 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e ** lock. If an
11234 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c y do, return SQL
11235 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 ITE_BUSY right a
11236 77 61 79 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 way... */..
11237 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 for(pX=pShmNod
11238 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 e->pFirst; pX; p
11239 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 X=pX->pNext){..
1123a 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 if( (pX->ex
1123b 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d clMask & mask)!=
1123c 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 0 || (pX->shared
1123d 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 Mask & mask)!=0
1123e 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
1123f 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
11240 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 break;..
11241 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
11242 20 0d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 .. /* Get th
11243 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b e exclusive lock
11244 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 s at the system
11245 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 level. Then if
11246 73 75 63 63 65 73 73 66 75 6c 0d 0a 20 20 20 20 successful..
11247 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 ** also mark the
11248 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f local connectio
11249 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 n as being locke
1124a 64 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 d... */..
1124b 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1124c 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d K ){.. rc =
1124d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f unixShmSystemLo
1124e 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 ck(pShmNode, F_W
1124f 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f RLCK, ofst+UNIX_
11250 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0d 0a 20 SHM_BASE, n);..
11251 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
11252 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
11253 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 assert( (p->s
11254 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b haredMask & mask
11255 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 20 )==0 );..
11256 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 p->exclMask |=
11257 6d 61 73 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a mask;.. }..
11258 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 73 71 }.. }.. sq
11259 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 lite3_mutex_leav
1125a 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 e(pShmNode->mute
1125b 78 29 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 x);.. OSTRACE((
1125c 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d "SHM-LOCK shmid-
1125d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 %d, pid-%d got %
1125e 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0d 0a 20 20 03x,%03x\n",..
1125f 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 p->id,
11260 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 getpid(), p->sha
11261 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c redMask, p->excl
11262 4d 61 73 6b 29 29 3b 0d 0a 20 20 72 65 74 75 72 Mask));.. retur
11263 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
11264 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d ** Implement a m
11265 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 emory barrier or
11266 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e memory fence on
11267 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 shared memory.
11268 20 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 6c 6f ..**..** All lo
11269 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 ads and stores b
1126a 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 egun before the
1126b 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d barrier must com
1126c 70 6c 65 74 65 20 62 65 66 6f 72 65 0d 0a 2a 2a plete before..**
1126d 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f any load or sto
1126e 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 re begun after t
1126f 68 65 20 62 61 72 72 69 65 72 2e 0d 0a 2a 2f 0d he barrier...*/.
11270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 .static void uni
11271 78 53 68 6d 42 61 72 72 69 65 72 28 0d 0a 20 20 xShmBarrier(..
11272 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 sqlite3_file *fd
11273 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11274 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 /* Database file
11275 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 holding the sha
11276 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 29 red memory */..)
11277 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 {.. UNUSED_PARA
11278 4d 45 54 45 52 28 66 64 29 3b 0d 0a 20 20 75 6e METER(fd);.. un
11279 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d ixEnterMutex();.
1127a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 . unixLeaveMute
1127b 78 28 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a x();..}..../*..*
1127c 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 * Close a connec
1127d 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d tion to shared-m
1127e 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 emory. Delete t
1127f 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0d 0a he underlying ..
11280 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 ** storage if de
11281 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 leteFlag is true
11282 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
11283 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 re is no shared
11284 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 memory associate
11285 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 d with the conne
11286 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0d ction then this.
11287 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 .** routine is a
11288 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e harmless no-op.
11289 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1128a 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0d 0a unixShmUnmap(..
1128b 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
1128c 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 fd,
1128d 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 /* The underly
1128e 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c ing database fil
1128f 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 64 65 6c 65 e */.. int dele
11290 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 teFlag
11291 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 /* Delet
11292 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 e shared-memory
11293 69 66 20 74 72 75 65 20 2a 2f 0d 0a 29 7b 0d 0a if true */..){..
11294 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 unixShm *p;
11295 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11296 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 /* The connect
11297 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 ion to be closed
11298 20 2a 2f 0d 0a 20 20 75 6e 69 78 53 68 6d 4e 6f */.. unixShmNo
11299 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 de *pShmNode;
1129a 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e /* The un
1129b 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d derlying shared-
1129c 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0d 0a memory file */..
1129d 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 unixShm **pp;
1129e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1129f 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 /* For looping
112a0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f over sibling co
112a1 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 nnections */..
112a2 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b unixFile *pDbFd;
112a3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
112a4 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e /* The underlyin
112a5 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 g database file
112a6 2a 2f 0d 0a 0d 0a 20 20 70 44 62 46 64 20 3d 20 */.... pDbFd =
112a7 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0d 0a (unixFile*)fd;..
112a8 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 p = pDbFd->pSh
112a9 6d 3b 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 m;.. if( p==0 )
112aa 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
112ab 4b 3b 0d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d K;.. pShmNode =
112ac 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0d 0a 0d p->pShmNode;...
112ad 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e . assert( pShmN
112ae 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f ode==pDbFd->pIno
112af 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0d de->pShmNode );.
112b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e . assert( pShmN
112b1 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 ode->pInode==pDb
112b2 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0d 0a 0d Fd->pInode );...
112b3 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e . /* Remove con
112b4 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 nection p from t
112b5 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 he set of connec
112b6 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 tions associated
112b7 0d 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d .. ** with pShm
112b8 4e 6f 64 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 Node */.. sqlit
112b9 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 e3_mutex_enter(p
112ba 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
112bb 0d 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d .. for(pp=&pShm
112bc 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a Node->pFirst; (*
112bd 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a pp)!=p; pp = &(*
112be 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0d 0a 20 pp)->pNext){}..
112bf 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b *pp = p->pNext;
112c0 0d 0a 0d 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 .... /* Free th
112c1 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a e connection p *
112c2 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 /.. sqlite3_fre
112c3 65 28 70 29 3b 0d 0a 20 20 70 44 62 46 64 2d 3e e(p);.. pDbFd->
112c4 70 53 68 6d 20 3d 20 30 3b 0d 0a 20 20 73 71 6c pShm = 0;.. sql
112c5 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 ite3_mutex_leave
112c6 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 (pShmNode->mutex
112c7 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 70 53 );.... /* If pS
112c8 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 hmNode->nRef has
112c9 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e reached 0, then
112ca 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 close the under
112cb 6c 79 69 6e 67 0d 0a 20 20 2a 2a 20 73 68 61 72 lying.. ** shar
112cc 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 ed-memory file,
112cd 74 6f 6f 20 2a 2f 0d 0a 20 20 75 6e 69 78 45 6e too */.. unixEn
112ce 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 61 terMutex();.. a
112cf 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d ssert( pShmNode-
112d0 3e 6e 52 65 66 3e 30 20 29 3b 0d 0a 20 20 70 53 >nRef>0 );.. pS
112d1 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0d hmNode->nRef--;.
112d2 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d . if( pShmNode-
112d3 3e 6e 52 65 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 >nRef==0 ){..
112d4 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 if( deleteFlag
112d5 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d && pShmNode->h>=
112d6 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 0 ) osUnlink(pSh
112d7 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 mNode->zFilename
112d8 29 3b 0d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 );.. unixShmP
112d9 75 72 67 65 28 70 44 62 46 64 29 3b 0d 0a 20 20 urge(pDbFd);..
112da 7d 0d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 }.. unixLeaveMu
112db 74 65 78 28 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 tex();.... retu
112dc 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
112dd 0d 0a 0d 0a 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 ......#else..# d
112de 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 efine unixShmMap
112df 20 20 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 0..# define
112e0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 unixShmLock
112e1 30 0d 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 0..# define unix
112e2 53 68 6d 42 61 72 72 69 65 72 20 30 0d 0a 23 20 ShmBarrier 0..#
112e3 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e define unixShmUn
112e4 6d 61 70 20 20 20 30 0d 0a 23 65 6e 64 69 66 20 map 0..#endif
112e5 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /* #ifndef SQLIT
112e6 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0d 0a 0d E_OMIT_WAL */...
112e7 0a 2f 2a 0d 0a 2a 2a 20 48 65 72 65 20 65 6e 64 ./*..** Here end
112e8 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 s the implementa
112e9 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 tion of all sqli
112ea 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 te3_file methods
112eb 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...**..*********
112ec 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
112ed 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d d sqlite3_file M
112ee 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ethods *********
112ef 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
112f0 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a ******..********
112f1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
112f2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
112f3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
112f4 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
112f5 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a ******/..../*..*
112f6 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 * This division
112f7 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 contains definit
112f8 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f ions of sqlite3_
112f9 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 io_methods objec
112fa 74 73 20 74 68 61 74 0d 0a 2a 2a 20 69 6d 70 6c ts that..** impl
112fb 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 ement various fi
112fc 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 le locking strat
112fd 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 egies. It also
112fe 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 contains definit
112ff 69 6f 6e 73 0d 0a 2a 2a 20 6f 66 20 22 66 69 6e ions..** of "fin
11300 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 der" functions.
11301 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 A finder-functi
11302 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f on is used to lo
11303 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 cate the appropr
11304 69 61 74 65 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 iate..** sqlite3
11305 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 _io_methods obje
11306 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 ct for a particu
11307 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c lar database fil
11308 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 e. The pAppData
11309 0d 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 ..** field of th
1130a 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 e sqlite3_vfs VF
1130b 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e S objects are in
1130c 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 itialized to be
1130d 70 6f 69 6e 74 65 72 73 20 74 6f 0d 0a 2a 2a 20 pointers to..**
1130e 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 the correct find
1130f 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 er-function for
11310 74 68 61 74 20 56 46 53 2e 0d 0a 2a 2a 0d 0a 2a that VFS...**..*
11311 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 * Most finder fu
11312 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 nctions return a
11313 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 pointer to a fi
11314 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d xed sqlite3_io_m
11315 65 74 68 6f 64 73 0d 0a 2a 2a 20 6f 62 6a 65 63 ethods..** objec
11316 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 t. The only int
11317 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d eresting finder-
11318 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f function is auto
11319 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 lockIoFinder, wh
1131a 69 63 68 0d 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 ich..** looks at
1131b 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 the filesystem
1131c 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 type and tries t
1131d 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 o guess the best
1131e 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2a 20 73 74 72 locking..** str
1131f 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e ategy from that.
11320 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 66 69 6e ..**..** For fin
11321 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 der-funtion F, t
11322 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 wo objects are c
11323 72 65 61 74 65 64 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 reated:..**..**
11324 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 (1) The real
11325 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 finder-function
11326 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e named "FImpt()".
11327 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 28 32 29 20 ..**..** (2)
11328 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 A constant point
11329 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 er to this funct
1132a 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 ion named just "
1132b 46 22 2e 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 F"...**..**..**
1132c 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 A pointer to the
1132d 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 F pointer is us
1132e 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 ed as the pAppDa
1132f 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 ta value for VFS
11330 0d 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 ..** objects. W
11331 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 e have to do thi
11332 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 s instead of let
11333 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f ting pAppData po
11334 69 6e 74 0d 0a 2a 2a 20 64 69 72 65 63 74 6c 79 int..** directly
11335 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 at the finder-f
11336 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 unction since C9
11337 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 0 rules prevent
11338 61 20 76 6f 69 64 2a 0d 0a 2a 2a 20 66 72 6f 6d a void*..** from
11339 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 be cast into a
1133a 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 function pointer
1133b 2e 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 45 61 ...**..**..** Ea
1133c 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 ch instance of t
1133d 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 his macro genera
1133e 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a tes two objects:
1133f 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 41 20 ..**..** * A
11340 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 constant sqlite3
11341 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 _io_methods obje
11342 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 ct call METHOD t
11343 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0d hat has locking.
11344 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 .** methods
11345 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e CLOSE, LOCK, UN
11346 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e LOCK, CKRESLOCK.
11347 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 41 6e ..**..** * An
11348 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 I/O method find
11349 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c er function call
1134a 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 ed FINDER that r
1134b 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 eturns a pointer
1134c 0d 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 ..** to the
1134d 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 METHOD object i
1134e 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 n the previous b
1134f 75 6c 6c 65 74 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 ullet...*/..#def
11350 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 ine IOMETHODS(FI
11351 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 NDER, METHOD, VE
11352 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f RSION, CLOSE, LO
11353 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f CK, UNLOCK, CKLO
11354 43 4b 29 20 20 20 20 20 20 5c 0d 0a 73 74 61 74 CK) \..stat
11355 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 ic const sqlite3
11356 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 _io_methods METH
11357 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 OD = {
11358 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11359 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 56 \.. V
1135a 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 ERSION,
1135b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 /* iV
1135c 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 ersion */
1135d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1135e 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 43 \.. C
1135f 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 LOSE,
11360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 /* xC
11361 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 lose */
11362 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11363 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11364 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 nixRead,
11365 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 /* xR
11366 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 ead */
11367 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11368 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11369 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 nixWrite,
1136a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 /* xW
1136b 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 rite */
1136c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1136d 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
1136e 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 nixTruncate,
1136f 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 /* xT
11370 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 runcate */
11371 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11372 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11373 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 nixSync,
11374 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
11375 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 ync */
11376 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11377 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11378 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 nixFileSize,
11379 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 /* xF
1137a 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 ileSize */
1137b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1137c 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 4c \.. L
1137d 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 OCK,
1137e 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c /* xL
1137f 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 ock */
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11381 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 55 \.. U
11382 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 NLOCK,
11383 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 /* xU
11384 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 nlock */
11385 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11386 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 43 \.. C
11387 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 KLOCK,
11388 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 /* xC
11389 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b heckReservedLock
1138a 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 */
1138b 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
1138c 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 nixFileControl,
1138d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 /* xF
1138e 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 ileControl */
1138f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11390 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11391 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 nixSectorSize,
11392 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
11393 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 ectorSize */
11394 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11395 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
11396 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 nixDeviceCharact
11397 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 eristics, /* xD
11398 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 eviceCapabilitie
11399 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 s */
1139a 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
1139b 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 nixShmMap,
1139c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
1139d 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 hmMap */
1139e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1139f 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
113a0 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 nixShmLock,
113a1 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
113a2 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 hmLock */
113a3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113a4 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
113a5 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 nixShmBarrier,
113a6 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
113a7 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 hmBarrier */
113a8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113a9 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 75 \.. u
113aa 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 nixShmUnmap
113ab 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
113ac 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 hmUnmap */
113ad 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113ae 20 20 20 20 20 20 20 20 20 5c 0d 0a 7d 3b 20 20 \..};
113af 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113b1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113b2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113b3 20 20 20 20 20 20 20 20 20 5c 0d 0a 73 74 61 74 \..stat
113b4 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 ic const sqlite3
113b5 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e _io_methods *FIN
113b6 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 DER##Impl(const
113b7 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c char *z, unixFil
113b8 65 20 2a 70 29 7b 20 20 20 5c 0d 0a 20 20 55 4e e *p){ \.. UN
113b9 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a USED_PARAMETER(z
113ba 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 ); UNUSED_PARAME
113bb 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 TER(p);
113bc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113bd 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 72 65 \.. re
113be 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 turn &METHOD;
113bf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c2 20 20 20 20 20 20 20 20 20 5c 0d 0a 7d 20 20 20 \..}
113c3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113c7 20 20 20 20 20 20 20 20 20 5c 0d 0a 73 74 61 74 \..stat
113c8 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 ic const sqlite3
113c9 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 _io_methods *(*c
113ca 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e onst FINDER)(con
113cb 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c st char*,unixFil
113cc 65 20 2a 70 29 20 20 20 20 5c 0d 0a 20 20 20 20 e *p) \..
113cd 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0d = FINDER##Impl;.
113ce 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 48 65 72 65 20 61 .../*..** Here a
113cf 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 re all of the sq
113d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
113d1 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 objects for eac
113d2 68 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 6c 6f 63 h of the..** loc
113d3 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e king strategies.
113d4 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 Functions that
113d5 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 return pointers
113d6 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 to these method
113d7 73 0d 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 s..** are also c
113d8 72 65 61 74 65 64 2e 0d 0a 2a 2f 0d 0a 49 4f 4d reated...*/..IOM
113d9 45 54 48 4f 44 53 28 0d 0a 20 20 70 6f 73 69 78 ETHODS(.. posix
113da 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 IoFinder,
113db 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 /* Finder f
113dc 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0d unction name */.
113dd 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 . posixIoMethod
113de 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 s, /*
113df 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f sqlite3_io_metho
113e0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a ds object name *
113e1 2f 0d 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 /.. 2,
113e2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
113e3 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 * shared memory
113e4 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0d 0a 20 is enabled */..
113e5 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 unixClose,
113e6 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 /* xC
113e7 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a lose method */..
113e8 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 unixLock,
113e9 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
113ea 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a Lock method */..
113eb 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 unixUnlock,
113ec 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
113ed 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f Unlock method */
113ee 0d 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 .. unixCheckRes
113ef 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a ervedLock /*
113f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c xCheckReservedL
113f1 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 29 ock method */..)
113f2 0d 0a 49 4f 4d 45 54 48 4f 44 53 28 0d 0a 20 20 ..IOMETHODS(..
113f3 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 nolockIoFinder,
113f4 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e /* Fin
113f5 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d der function nam
113f6 65 20 2a 2f 0d 0a 20 20 6e 6f 6c 6f 63 6b 49 6f e */.. nolockIo
113f7 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 Methods,
113f8 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f /* sqlite3_io_
113f9 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e methods object n
113fa 61 6d 65 20 2a 2f 0d 0a 20 20 31 2c 20 20 20 20 ame */.. 1,
113fb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
113fc 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 /* shared me
113fd 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 mory is disabled
113fe 20 2a 2f 0d 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f */.. nolockClo
113ff 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 se,
11400 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f /* xClose metho
11401 64 20 2a 2f 0d 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f d */.. nolockLo
11402 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ck,
11403 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f /* xLock metho
11404 64 20 2a 2f 0d 0a 20 20 6e 6f 6c 6f 63 6b 55 6e d */.. nolockUn
11405 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 lock,
11406 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 /* xUnlock met
11407 68 6f 64 20 2a 2f 0d 0a 20 20 6e 6f 6c 6f 63 6b hod */.. nolock
11408 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
11409 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 k /* xCheckRes
1140a 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 ervedLock method
1140b 20 2a 2f 0d 0a 29 0d 0a 49 4f 4d 45 54 48 4f 44 */..)..IOMETHOD
1140c 53 28 0d 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 S(.. dotlockIoF
1140d 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 inder,
1140e 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 /* Finder functi
1140f 6f 6e 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 64 6f on name */.. do
11410 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 tlockIoMethods,
11411 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 /* sqlit
11412 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 e3_io_methods ob
11413 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 ject name */..
11414 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1,
11415 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 /* sha
11416 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 red memory is di
11417 73 61 62 6c 65 64 20 2a 2f 0d 0a 20 20 64 6f 74 sabled */.. dot
11418 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 lockClose,
11419 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 /* xClose
1141a 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 64 6f method */.. do
1141b 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 tlockLock,
1141c 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b /* xLock
1141d 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 64 6f method */.. do
1141e 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 tlockUnlock,
1141f 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f /* xUnlo
11420 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 ck method */..
11421 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 dotlockCheckRese
11422 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 rvedLock /* xCh
11423 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 eckReservedLock
11424 6d 65 74 68 6f 64 20 2a 2f 0d 0a 29 0d 0a 0d 0a method */..)....
11425 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c #if SQLITE_ENABL
11426 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 E_LOCKING_STYLE
11427 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a && !OS_VXWORKS..
11428 49 4f 4d 45 54 48 4f 44 53 28 0d 0a 20 20 66 6c IOMETHODS(.. fl
11429 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 ockIoFinder,
1142a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 /* Finde
1142b 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 r function name
1142c 2a 2f 0d 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 */.. flockIoMet
1142d 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 hods,
1142e 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 /* sqlite3_io_me
1142f 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d thods object nam
11430 65 20 2a 2f 0d 0a 20 20 31 2c 20 20 20 20 20 20 e */.. 1,
11431 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11432 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f /* shared memo
11433 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a ry is disabled *
11434 2f 0d 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c /.. flockClose,
11435 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11436 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 * xClose method
11437 2a 2f 0d 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c */.. flockLock,
11438 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11439 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 /* xLock method
1143a 2a 2f 0d 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 */.. flockUnloc
1143b 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 k,
1143c 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f /* xUnlock metho
1143d 64 20 2a 2f 0d 0a 20 20 66 6c 6f 63 6b 43 68 65 d */.. flockChe
1143e 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 ckReservedLock
1143f 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 /* xCheckReser
11440 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a vedLock method *
11441 2f 0d 0a 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a /..)..#endif....
11442 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a #if OS_VXWORKS..
11443 49 4f 4d 45 54 48 4f 44 53 28 0d 0a 20 20 73 65 IOMETHODS(.. se
11444 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 mIoFinder,
11445 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 /* Finde
11446 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 r function name
11447 2a 2f 0d 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f */.. semIoMetho
11448 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ds,
11449 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 /* sqlite3_io_me
1144a 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d thods object nam
1144b 65 20 2a 2f 0d 0a 20 20 31 2c 20 20 20 20 20 20 e */.. 1,
1144c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1144d 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f /* shared memo
1144e 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a ry is disabled *
1144f 2f 0d 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 /.. semClose,
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11451 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 * xClose method
11452 2a 2f 0d 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 */.. semLock,
11453 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11454 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 /* xLock method
11455 2a 2f 0d 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c */.. semUnlock,
11456 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11457 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f /* xUnlock metho
11458 64 20 2a 2f 0d 0a 20 20 73 65 6d 43 68 65 63 6b d */.. semCheck
11459 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 ReservedLock
1145a 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 /* xCheckReser
1145b 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a vedLock method *
1145c 2f 0d 0a 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a /..)..#endif....
1145d 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 #if defined(__AP
1145e 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 PLE__) && SQLITE
1145f 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f _ENABLE_LOCKING_
11460 53 54 59 4c 45 0d 0a 49 4f 4d 45 54 48 4f 44 53 STYLE..IOMETHODS
11461 28 0d 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 (.. afpIoFinder
11462 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
11463 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f * Finder functio
11464 6e 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 61 66 70 n name */.. afp
11465 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 IoMethods,
11466 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 /* sqlite
11467 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 3_io_methods obj
11468 65 63 74 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 31 ect name */.. 1
11469 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1146a 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 /* shar
1146b 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 ed memory is dis
1146c 61 62 6c 65 64 20 2a 2f 0d 0a 20 20 61 66 70 43 abled */.. afpC
1146d 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 lose,
1146e 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 /* xClose
1146f 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 61 66 70 method */.. afp
11470 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 Lock,
11471 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 /* xLock
11472 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 61 66 70 method */.. afp
11473 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 Unlock,
11474 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 /* xUnloc
11475 6b 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 61 k method */.. a
11476 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c fpCheckReservedL
11477 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 ock /* xChe
11478 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d ckReservedLock m
11479 65 74 68 6f 64 20 2a 2f 0d 0a 29 0d 0a 23 65 6e ethod */..)..#en
1147a 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 dif..../*..** Th
1147b 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 e proxy locking
1147c 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 method is a "sup
1147d 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 er-method" in th
1147e 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0d e sense that it.
1147f 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 .** opens second
11480 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 ary file descrip
11481 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e tors for the con
11482 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 ch and lock file
11483 73 20 61 6e 64 0d 0a 2a 2a 20 69 74 20 75 73 65 s and..** it use
11484 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c s proxy, dot-fil
11485 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 e, AFP, and floc
11486 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 k() locking meth
11487 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0d 0a 2a 2a ods on those..**
11488 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 secondary files
11489 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 . For this reas
1148a 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e on, the division
1148b 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 that implements
1148c 0d 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 ..** proxy locki
1148d 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 ng is located mu
1148e 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 ch further down
1148f 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 in the file. Bu
11490 74 20 77 65 20 6e 65 65 64 0d 0a 2a 2a 20 74 6f t we need..** to
11491 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 go ahead and de
11492 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 fine the sqlite3
11493 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 _io_methods and
11494 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0d finder function.
11495 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f .** for proxy lo
11496 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 cking here. So
11497 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 we forward decla
11498 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f re the I/O metho
11499 64 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 ds...*/..#if def
1149a 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 ined(__APPLE__)
1149b 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 && SQLITE_ENABLE
1149c 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a _LOCKING_STYLE..
1149d 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 static int proxy
1149e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 Close(sqlite3_fi
1149f 6c 65 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e le*);..static in
114a0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 t proxyLock(sqli
114a1 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b te3_file*, int);
114a2 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f ..static int pro
114a3 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 xyUnlock(sqlite3
114a4 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0d 0a 73 _file*, int);..s
114a5 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 tatic int proxyC
114a6 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b heckReservedLock
114a7 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 (sqlite3_file*,
114a8 69 6e 74 2a 29 3b 0d 0a 49 4f 4d 45 54 48 4f 44 int*);..IOMETHOD
114a9 53 28 0d 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e S(.. proxyIoFin
114aa 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 der,
114ab 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 /* Finder functi
114ac 6f 6e 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 70 72 on name */.. pr
114ad 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 oxyIoMethods,
114ae 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 /* sqlit
114af 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 e3_io_methods ob
114b0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 ject name */..
114b1 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1,
114b2 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 /* sha
114b3 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 red memory is di
114b4 73 61 62 6c 65 64 20 2a 2f 0d 0a 20 20 70 72 6f sabled */.. pro
114b5 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 xyClose,
114b6 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 /* xClose
114b7 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 70 72 method */.. pr
114b8 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 oxyLock,
114b9 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b /* xLock
114ba 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 70 72 method */.. pr
114bb 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 oxyUnlock,
114bc 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f /* xUnlo
114bd 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 ck method */..
114be 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 proxyCheckReserv
114bf 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 edLock /* xCh
114c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 eckReservedLock
114c1 6d 65 74 68 6f 64 20 2a 2f 0d 0a 29 0d 0a 23 65 method */..)..#e
114c2 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 6e 66 73 20 6c ndif..../* nfs l
114c3 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 ockd on OSX 10.3
114c4 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 + doesn't clear
114c5 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e write locks when
114c6 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 a read lock is
114c7 73 65 74 20 2a 2f 0d 0a 23 69 66 20 64 65 66 69 set */..#if defi
114c8 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 ned(__APPLE__) &
114c9 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f & SQLITE_ENABLE_
114ca 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 49 LOCKING_STYLE..I
114cb 4f 4d 45 54 48 4f 44 53 28 0d 0a 20 20 6e 66 73 OMETHODS(.. nfs
114cc 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 IoFinder,
114cd 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 /* Finde
114ce 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 r function name
114cf 2a 2f 0d 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f */.. nfsIoMetho
114d0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ds,
114d1 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d /* sqlite3_io_m
114d2 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 ethods object na
114d3 6d 65 20 2a 2f 0d 0a 20 20 31 2c 20 20 20 20 20 me */.. 1,
114d4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114d5 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 /* shared me
114d6 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 mory is disabled
114d7 20 2a 2f 0d 0a 20 20 75 6e 69 78 43 6c 6f 73 65 */.. unixClose
114d8 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
114d9 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 /* xClose meth
114da 6f 64 20 2a 2f 0d 0a 20 20 75 6e 69 78 4c 6f 63 od */.. unixLoc
114db 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 k,
114dc 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 /* xLock met
114dd 68 6f 64 20 2a 2f 0d 0a 20 20 6e 66 73 55 6e 6c hod */.. nfsUnl
114de 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 ock,
114df 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 /* xUnlock
114e0 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 20 75 6e 69 method */.. uni
114e1 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f xCheckReservedLo
114e2 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 ck /* xChec
114e3 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 kReservedLock me
114e4 74 68 6f 64 20 2a 2f 0d 0a 29 0d 0a 23 65 6e 64 thod */..)..#end
114e5 69 66 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 if....#if define
114e6 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 d(__APPLE__) &&
114e7 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f SQLITE_ENABLE_LO
114e8 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 2f 2a 20 CKING_STYLE../*
114e9 0d 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 ..** This "finde
114ea 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 r" function atte
114eb 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e mpts to determin
114ec 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 e the best locki
114ed 6e 67 20 73 74 72 61 74 65 67 79 20 0d 0a 2a 2a ng strategy ..**
114ee 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 for the databas
114ef 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 e file "filePath
114f0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 ". It then retu
114f1 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f rns the sqlite3_
114f2 69 6f 5f 6d 65 74 68 6f 64 73 0d 0a 2a 2a 20 6f io_methods..** o
114f3 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 bject that imple
114f4 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 ments that strat
114f5 65 67 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 egy...**..** Thi
114f6 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 s is for MacOSX
114f7 6f 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 only...*/..stati
114f8 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f c const sqlite3_
114f9 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f io_methods *auto
114fa 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c lockIoFinderImpl
114fb 28 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 (.. const char
114fc 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a *filePath, /*
114fd 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 name of the dat
114fe 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 abase file */..
114ff 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 unixFile *pNew
11500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 /* ope
11501 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f n file object fo
11502 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 r the database f
11503 69 6c 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 73 74 ile */..){.. st
11504 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 atic const struc
11505 74 20 4d 61 70 70 69 6e 67 20 7b 0d 0a 20 20 20 t Mapping {..
11506 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 const char *zFi
11507 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 lesystem;
11508 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 /* Filesy
11509 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a stem type name *
1150a 2f 0d 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c /.. const sql
1150b 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 ite3_io_methods
1150c 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 *pMethods; /*
1150d 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b Appropriate lock
1150e 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a 20 ing method */..
1150f 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0d 0a 20 } aMap[] = {..
11510 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 { "hfs", &
11511 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d posixIoMethods }
11512 2c 0d 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 ,.. { "ufs",
11513 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f &posixIoMetho
11514 64 73 20 7d 2c 0d 0a 20 20 20 20 7b 20 22 61 66 ds },.. { "af
11515 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 pfs", &afpIoMet
11516 68 6f 64 73 20 7d 2c 0d 0a 20 20 20 20 7b 20 22 hods },.. { "
11517 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d smbfs", &afpIoM
11518 65 74 68 6f 64 73 20 7d 2c 0d 0a 20 20 20 20 7b ethods },.. {
11519 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f "webdav", &nolo
1151a 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0d 0a ckIoMethods },..
1151b 20 20 20 20 7b 20 30 2c 20 30 20 7d 0d 0a 20 20 { 0, 0 }..
1151c 7d 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 };.. int i;..
1151d 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 struct statfs fs
1151e 49 6e 66 6f 3b 0d 0a 20 20 73 74 72 75 63 74 20 Info;.. struct
1151f 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0d flock lockInfo;.
11520 0a 0d 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 ... if( !filePa
11521 74 68 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 th ){.. /* If
11522 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 filePath==NULL
11523 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 that means we ar
11524 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 e dealing with a
11525 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0d transient file.
11526 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 . ** that doe
11527 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 s not need to be
11528 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0d 0a 20 20 20 locked. */..
11529 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 return &nolockI
1152a 6f 4d 65 74 68 6f 64 73 3b 0d 0a 20 20 7d 0d 0a oMethods;.. }..
1152b 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c if( statfs(fil
1152c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 ePath, &fsInfo)
1152d 21 3d 20 2d 31 20 29 7b 0d 0a 20 20 20 20 69 66 != -1 ){.. if
1152e 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 ( fsInfo.f_flags
1152f 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b & MNT_RDONLY ){
11530 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 .. return &
11531 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b nolockIoMethods;
11532 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 6f 72 .. }.. for
11533 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 (i=0; aMap[i].zF
11534 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b ilesystem; i++){
11535 0d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 .. if( strc
11536 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 mp(fsInfo.f_fsty
11537 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e pename, aMap[i].
11538 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 zFilesystem)==0
11539 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 ){.. retu
1153a 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 rn aMap[i].pMeth
1153b 6f 64 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 ods;.. }..
1153c 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f }.. }.... /
1153d 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 * Default case.
1153e 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 Handles, amongst
1153f 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0d others, "nfs"..
11540 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d . ** Test byte-
11541 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 range lock using
11542 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 fcntl(). If the
11543 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 call succeeds,
11544 0d 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 .. ** assume th
11545 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 at the file-syst
11546 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 em supports POSI
11547 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0d X style locks. .
11548 0a 20 20 2a 2f 0d 0a 20 20 6c 6f 63 6b 49 6e 66 . */.. lockInf
11549 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0d 0a 20 20 o.l_len = 1;..
1154a 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 lockInfo.l_start
1154b 20 3d 20 30 3b 0d 0a 20 20 6c 6f 63 6b 49 6e 66 = 0;.. lockInf
1154c 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 o.l_whence = SEE
1154d 4b 5f 53 45 54 3b 0d 0a 20 20 6c 6f 63 6b 49 6e K_SET;.. lockIn
1154e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 fo.l_type = F_RD
1154f 4c 43 4b 3b 0d 0a 20 20 69 66 28 20 6f 73 46 63 LCK;.. if( osFc
11550 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 ntl(pNew->h, F_G
11551 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 ETLK, &lockInfo)
11552 21 3d 2d 31 20 29 20 7b 0d 0a 20 20 20 20 69 66 !=-1 ) {.. if
11553 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e ( strcmp(fsInfo.
11554 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e f_fstypename, "n
11555 66 73 22 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 fs")==0 ){..
11556 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d return &nfsIoM
11557 65 74 68 6f 64 73 3b 0d 0a 20 20 20 20 7d 20 65 ethods;.. } e
11558 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 lse {.. ret
11559 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 urn &posixIoMeth
1155a 6f 64 73 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d ods;.. }.. }
1155b 65 6c 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 else{.. retur
1155c 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 n &dotlockIoMeth
1155d 6f 64 73 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 73 74 ods;.. }..}..st
1155e 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 atic const sqlit
1155f 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0d 0a e3_io_methods ..
11560 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c *(*const autol
11561 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e ockIoFinder)(con
11562 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c st char*,unixFil
11563 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f e*) = autolockIo
11564 46 69 6e 64 65 72 49 6d 70 6c 3b 0d 0a 0d 0a 23 FinderImpl;....#
11565 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 endif /* defined
11566 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 (__APPLE__) && S
11567 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 QLITE_ENABLE_LOC
11568 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0d 0a 0d KING_STYLE */...
11569 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 .#if OS_VXWORKS
1156a 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 && SQLITE_ENABLE
1156b 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a _LOCKING_STYLE..
1156c 2f 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 22 66 69 /* ..** This "fi
1156d 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 nder" function a
1156e 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 ttempts to deter
1156f 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f mine the best lo
11570 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0d cking strategy .
11571 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 .** for the data
11572 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 base file "fileP
11573 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 ath". It then r
11574 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 eturns the sqlit
11575 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0d 0a 2a e3_io_methods..*
11576 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d * object that im
11577 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 plements that st
11578 72 61 74 65 67 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 rategy...**..**
11579 54 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f This is for VXWo
1157a 72 6b 73 20 6f 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 73 rks only...*/..s
1157b 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 tatic const sqli
1157c 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a te3_io_methods *
1157d 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 autolockIoFinder
1157e 49 6d 70 6c 28 0d 0a 20 20 63 6f 6e 73 74 20 63 Impl(.. const c
1157f 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 har *filePath,
11580 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 /* name of the
11581 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a database file *
11582 2f 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 /.. unixFile *p
11583 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a New /*
11584 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f the open file o
11585 62 6a 65 63 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 bject */..){..
11586 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 struct flock loc
11587 6b 49 6e 66 6f 3b 0d 0a 0d 0a 20 20 69 66 28 20 kInfo;.... if(
11588 21 66 69 6c 65 50 61 74 68 20 29 7b 0d 0a 20 20 !filePath ){..
11589 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 /* If filePath
1158a 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e ==NULL that mean
1158b 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 s we are dealing
1158c 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e with a transien
1158d 74 20 66 69 6c 65 0d 0a 20 20 20 20 2a 2a 20 74 t file.. ** t
1158e 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 hat does not nee
1158f 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 d to be locked.
11590 2a 2f 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 26 */.. return &
11591 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b nolockIoMethods;
11592 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 54 65 .. }.... /* Te
11593 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 st if fcntl() is
11594 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 supported and u
11595 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c se POSIX style l
11596 6f 63 6b 73 2e 0d 0a 20 20 2a 2a 20 4f 74 68 65 ocks... ** Othe
11597 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 rwise fall back
11598 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d to the named sem
11599 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0d 0a aphore method...
1159a 20 20 2a 2f 0d 0a 20 20 6c 6f 63 6b 49 6e 66 6f */.. lockInfo
1159b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0d 0a 20 20 6c .l_len = 1;.. l
1159c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 ockInfo.l_start
1159d 3d 20 30 3b 0d 0a 20 20 6c 6f 63 6b 49 6e 66 6f = 0;.. lockInfo
1159e 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b .l_whence = SEEK
1159f 5f 53 45 54 3b 0d 0a 20 20 6c 6f 63 6b 49 6e 66 _SET;.. lockInf
115a0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c o.l_type = F_RDL
115a1 43 4b 3b 0d 0a 20 20 69 66 28 20 6f 73 46 63 6e CK;.. if( osFcn
115a2 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 tl(pNew->h, F_GE
115a3 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 TLK, &lockInfo)!
115a4 3d 2d 31 20 29 20 7b 0d 0a 20 20 20 20 72 65 74 =-1 ) {.. ret
115a5 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 urn &posixIoMeth
115a6 6f 64 73 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a ods;.. }else{..
115a7 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 return &semI
115a8 6f 4d 65 74 68 6f 64 73 3b 0d 0a 20 20 7d 0d 0a oMethods;.. }..
115a9 7d 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 }..static const
115aa 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f sqlite3_io_metho
115ab 64 73 20 0d 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 ds .. *(*const
115ac 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 autolockIoFinder
115ad 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e )(const char*,un
115ae 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c ixFile*) = autol
115af 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b ockIoFinderImpl;
115b0 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 ....#endif /* OS
115b1 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 _VXWORKS && SQLI
115b2 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e TE_ENABLE_LOCKIN
115b3 47 5f 53 54 59 4c 45 20 2a 2f 0d 0a 0d 0a 2f 2a G_STYLE */..../*
115b4 0d 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 ..** An abstract
115b5 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e type for a poin
115b6 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 ter to a IO meth
115b7 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 od finder functi
115b8 6f 6e 3a 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 on:..*/..typedef
115b9 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 const sqlite3_i
115ba 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e o_methods *(*fin
115bb 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 der_type)(const
115bc 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 char*,unixFile*)
115bd 3b 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ;....../********
115be 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115bf 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115c1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115c2 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****..**********
115c3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115c4 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d ** sqlite3_vfs m
115c5 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ethods *********
115c6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
115c7 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 ***..**..** This
115c8 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 division contai
115c9 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 ns the implement
115ca 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 ation of methods
115cb 20 6f 6e 20 74 68 65 0d 0a 2a 2a 20 73 71 6c 69 on the..** sqli
115cc 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0d te3_vfs object..
115cd 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e .*/..../*..** In
115ce 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e itialize the con
115cf 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 tents of the uni
115d0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 xFile structure
115d1 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 pointed to by pI
115d2 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 d...*/..static i
115d3 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c nt fillInUnixFil
115d4 65 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 e(.. sqlite3_vf
115d5 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a s *pVfs, /*
115d6 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 Pointer to vfs
115d7 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 object */.. int
115d8 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 h,
115d9 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c /* Open fil
115da 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 e descriptor of
115db 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 file being opene
115dc 64 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f d */.. sqlite3_
115dd 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 file *pId,
115de 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 /* Write to the
115df 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 unixFile structu
115e0 72 65 20 68 65 72 65 20 2a 2f 0d 0a 20 20 63 6f re here */.. co
115e1 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
115e2 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 ame, /* Name of
115e3 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 the file being
115e4 6f 70 65 6e 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 opened */.. int
115e5 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 ctrlFlags
115e6 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 /* Zero or
115e7 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 more UNIXFILE_*
115e8 76 61 6c 75 65 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 values */..){..
115e9 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 const sqlite3_i
115ea 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b o_methods *pLock
115eb 69 6e 67 53 74 79 6c 65 3b 0d 0a 20 20 75 6e 69 ingStyle;.. uni
115ec 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 xFile *pNew = (u
115ed 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0d 0a nixFile *)pId;..
115ee 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
115ef 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 E_OK;.... asser
115f0 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d t( pNew->pInode=
115f1 3d 4e 55 4c 4c 20 29 3b 0d 0a 0d 0a 20 20 2f 2a =NULL );.... /*
115f2 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 Usually the pat
115f3 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 h zFilename shou
115f4 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 ld not be a rela
115f5 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 tive pathname. T
115f6 68 65 0d 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 he.. ** excepti
115f7 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 on is when openi
115f8 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f ng the proxy "co
115f9 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69 nch" file in bui
115fa 6c 64 73 20 74 68 61 74 0d 0a 20 20 2a 2a 20 69 lds that.. ** i
115fb 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 nclude the speci
115fc 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 al Apple locking
115fd 20 73 74 79 6c 65 73 2e 0d 0a 20 20 2a 2f 0d 0a styles... */..
115fe 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 #if defined(__AP
115ff 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 PLE__) && SQLITE
11600 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f _ENABLE_LOCKING_
11601 53 54 59 4c 45 0d 0a 20 20 61 73 73 65 72 74 28 STYLE.. assert(
11602 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c zFilename==0 ||
11603 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 zFilename[0]=='
11604 2f 27 20 0d 0a 20 20 20 20 7c 7c 20 70 56 66 73 /' .. || pVfs
11605 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 ->pAppData==(voi
11606 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 d*)&autolockIoFi
11607 6e 64 65 72 20 29 3b 0d 0a 23 65 6c 73 65 0d 0a nder );..#else..
11608 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e assert( zFilen
11609 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e ame==0 || zFilen
1160a 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0d 0a ame[0]=='/' );..
1160b 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a 20 4e #endif.... /* N
1160c 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 o locking occurs
1160d 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 in temporary fi
1160e 6c 65 73 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 les */.. assert
1160f 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c ( zFilename!=0 |
11610 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 | (ctrlFlags & U
11611 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 NIXFILE_NOLOCK)!
11612 3d 30 20 29 3b 0d 0a 0d 0a 20 20 4f 53 54 52 41 =0 );.... OSTRA
11613 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 CE(("OPEN %-3
11614 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c d %s\n", h, zFil
11615 65 6e 61 6d 65 29 29 3b 0d 0a 20 20 70 4e 65 77 ename));.. pNew
11616 2d 3e 68 20 3d 20 68 3b 0d 0a 20 20 70 4e 65 77 ->h = h;.. pNew
11617 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0d 0a ->pVfs = pVfs;..
11618 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 pNew->zPath =
11619 7a 46 69 6c 65 6e 61 6d 65 3b 0d 0a 20 20 70 4e zFilename;.. pN
1161a 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 ew->ctrlFlags =
1161b 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0d 0a (u8)ctrlFlags;..
1161c 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 if( sqlite3_ur
1161d 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c i_boolean(((ctrl
1161e 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 Flags & UNIXFILE
1161f 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d _URI) ? zFilenam
11620 65 20 3a 20 30 29 2c 0d 0a 20 20 20 20 20 20 20 e : 0),..
11621 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11622 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 "psow", SQLI
11623 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 TE_POWERSAFE_OVE
11624 52 57 52 49 54 45 29 20 29 7b 0d 0a 20 20 20 20 RWRITE) ){..
11625 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 pNew->ctrlFlags
11626 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 |= UNIXFILE_PSOW
11627 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6d 65 ;.. }.. if( me
11628 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 mcmp(pVfs->zName
11629 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 ,"unix-excl",10)
1162a 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 70 4e 65 77 ==0 ){.. pNew
1162b 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 ->ctrlFlags |= U
1162c 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0d 0a 20 NIXFILE_EXCL;..
1162d 20 7d 0d 0a 0d 0a 23 69 66 20 4f 53 5f 56 58 57 }....#if OS_VXW
1162e 4f 52 4b 53 0d 0a 20 20 70 4e 65 77 2d 3e 70 49 ORKS.. pNew->pI
1162f 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 d = vxworksFindF
11630 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 ileId(zFilename)
11631 3b 0d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 ;.. if( pNew->p
11632 49 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63 74 Id==0 ){.. ct
11633 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 rlFlags |= UNIXF
11634 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0d 0a 20 20 20 ILE_NOLOCK;..
11635 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d rc = SQLITE_NOM
11636 45 4d 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 EM;.. }..#endif
11637 0d 0a 0d 0a 20 20 69 66 28 20 63 74 72 6c 46 6c .... if( ctrlFl
11638 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e ags & UNIXFILE_N
11639 4f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 70 4c OLOCK ){.. pL
1163a 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e ockingStyle = &n
1163b 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0d olockIoMethods;.
1163c 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
1163d 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 LockingStyle = (
1163e 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 **(finder_type*)
1163f 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 pVfs->pAppData)(
11640 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 zFilename, pNew)
11641 3b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e ;..#if SQLITE_EN
11642 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 ABLE_LOCKING_STY
11643 4c 45 0d 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 LE.. /* Cache
11644 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 zFilename in th
11645 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 e locking contex
11646 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f t (AFP and dotlo
11647 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 ck override) for
11648 0d 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f .. ** proxyLo
11649 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 ck activation is
1164a 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 possible (remot
1164b 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 e proxy is based
1164c 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0d 0a 20 20 on db name)..
1164d 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 ** zFilename r
1164e 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 emains valid unt
1164f 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 il file is close
11650 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f d, to support */
11651 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b .. pNew->lock
11652 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f ingContext = (vo
11653 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0d 0a id*)zFilename;..
11654 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 #endif.. }....
11655 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 if( pLockingSty
11656 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 le == &posixIoMe
11657 74 68 6f 64 73 0d 0a 23 69 66 20 64 65 66 69 6e thods..#if defin
11658 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 ed(__APPLE__) &&
11659 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
1165a 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 OCKING_STYLE..
1165b 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 || pLockingSty
1165c 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 le == &nfsIoMeth
1165d 6f 64 73 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 29 ods..#endif.. )
1165e 7b 0d 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 {.. unixEnter
1165f 4d 75 74 65 78 28 29 3b 0d 0a 20 20 20 20 72 63 Mutex();.. rc
11660 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f = findInodeInfo
11661 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 (pNew, &pNew->pI
11662 6e 6f 64 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 node);.. if(
11663 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
11664 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e .. /* If an
11665 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 error occured i
11666 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 n findInodeInfo(
11667 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c ), close the fil
11668 65 20 64 65 73 63 72 69 70 74 6f 72 0d 0a 20 20 e descriptor..
11669 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 ** immediate
1166a 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 ly, before relea
1166b 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 sing the mutex.
1166c 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 findInodeInfo()
1166d 6d 61 79 20 66 61 69 6c 0d 0a 20 20 20 20 20 20 may fail..
1166e 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 ** in two scenar
1166f 69 6f 73 3a 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a ios:.. **..
11670 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 ** (a) A
11671 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 call to fstat()
11672 20 66 61 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 failed...
11673 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f ** (b) A mallo
11674 63 20 66 61 69 6c 65 64 2e 0d 0a 20 20 20 20 20 c failed...
11675 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 53 63 **.. ** Sc
11676 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f enario (b) may o
11677 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 nly occur if the
11678 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 process is hold
11679 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0d 0a 20 20 ing no other..
1167a 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 ** file desc
1167b 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 riptors open on
1167c 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 the same file. I
1167d 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 f there were oth
1167e 65 72 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 2a er file.. *
1167f 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e * descriptors on
11680 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e this file, then
11681 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 no malloc would
11682 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0d be required by.
11683 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e . ** findIn
11684 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 odeInfo(). If th
11685 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 is is the case,
11686 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 it is quite safe
11687 20 74 6f 20 63 6c 6f 73 65 0d 0a 20 20 20 20 20 to close..
11688 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 ** handle h - a
11689 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 s it is guarante
1168a 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 ed that no posix
1168b 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 locks will be r
1168c 65 6c 65 61 73 65 64 0d 0a 20 20 20 20 20 20 2a eleased.. *
1168d 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a * by doing so...
1168e 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 **..
1168f 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 ** If scenario (
11690 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 a) caused the er
11691 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 ror then things
11692 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e are not so safe.
11693 20 54 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69 The.. ** i
11694 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 mplicit assumpti
11695 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 on here is that
11696 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 if fstat() fails
11697 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0d , things are in.
11698 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 . ** such b
11699 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 ad shape that dr
1169a 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 opping a lock or
1169b 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 two doesn't mat
1169c 74 65 72 20 6d 75 63 68 2e 0d 0a 20 20 20 20 20 ter much...
1169d 20 2a 2f 0d 0a 20 20 20 20 20 20 72 6f 62 75 73 */.. robus
1169e 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c t_close(pNew, h,
1169f 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 __LINE__);..
116a0 20 20 20 68 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 h = -1;..
116a1 7d 0d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 }.. unixLeave
116a2 4d 75 74 65 78 28 29 3b 0d 0a 20 20 7d 0d 0a 0d Mutex();.. }...
116a3 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 .#if SQLITE_ENAB
116a4 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 LE_LOCKING_STYLE
116a5 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 && defined(__AP
116a6 50 4c 45 5f 5f 29 0d 0a 20 20 65 6c 73 65 20 69 PLE__).. else i
116a7 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 f( pLockingStyle
116a8 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 == &afpIoMethod
116a9 73 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 41 46 50 s ){.. /* AFP
116aa 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 locking uses th
116ab 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 e file path so i
116ac 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e t needs to be in
116ad 63 6c 75 64 65 64 20 69 6e 0d 0a 20 20 20 20 2a cluded in.. *
116ae 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 * the afpLocking
116af 43 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 2a 2f Context... */
116b0 0d 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 .. afpLocking
116b1 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0d 0a Context *pCtx;..
116b2 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e pNew->lockin
116b3 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 gContext = pCtx
116b4 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 = sqlite3_malloc
116b5 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 ( sizeof(*pCtx)
116b6 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 74 78 );.. if( pCtx
116b7 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 ==0 ){.. rc
116b8 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
116b9 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
116ba 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 /* NB: zFile
116bb 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 name exists and
116bc 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e remains valid un
116bd 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 til the file is
116be 63 6c 6f 73 65 64 0d 0a 20 20 20 20 20 20 2a 2a closed.. **
116bf 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 according to re
116c0 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 quirement F11141
116c1 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 . So we do not
116c2 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0d 0a need to make a..
116c3 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 ** copy of
116c4 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a the filename. *
116c5 2f 0d 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 /.. pCtx->d
116c6 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d bPath = zFilenam
116c7 65 3b 0d 0a 20 20 20 20 20 20 70 43 74 78 2d 3e e;.. pCtx->
116c8 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0d 0a 20 reserved = 0;..
116c9 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 srandomdev(
116ca 29 3b 0d 0a 20 20 20 20 20 20 75 6e 69 78 45 6e );.. unixEn
116cb 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 20 terMutex();..
116cc 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 rc = findInod
116cd 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 eInfo(pNew, &pNe
116ce 77 2d 3e 70 49 6e 6f 64 65 29 3b 0d 0a 20 20 20 w->pInode);..
116cf 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
116d0 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
116d1 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e sqlite3_free(pN
116d2 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 ew->lockingConte
116d3 78 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 6f xt);.. ro
116d4 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c bust_close(pNew,
116d5 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a h, __LINE__);..
116d6 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0d h = -1;.
116d7 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
116d8 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 unixLeaveMutex()
116d9 3b 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 7d ; .. }
116da 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d .. }..#endif...
116db 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 . else if( pLoc
116dc 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f kingStyle == &do
116dd 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 tlockIoMethods )
116de 7b 0d 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c {.. /* Dotfil
116df 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 e locking uses t
116e0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 he file path so
116e1 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 it needs to be i
116e2 6e 63 6c 75 64 65 64 20 69 6e 0d 0a 20 20 20 20 ncluded in..
116e3 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f ** the dotlockLo
116e4 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0d 0a 20 ckingContext ..
116e5 20 20 20 2a 2f 0d 0a 20 20 20 20 63 68 61 72 20 */.. char
116e6 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0d 0a 20 20 20 *zLockFile;..
116e7 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0d int nFilename;.
116e8 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 . assert( zFi
116e9 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0d 0a 20 20 lename!=0 );..
116ea 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 nFilename = (i
116eb 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e nt)strlen(zFilen
116ec 61 6d 65 29 20 2b 20 36 3b 0d 0a 20 20 20 20 7a ame) + 6;.. z
116ed 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 LockFile = (char
116ee 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f *)sqlite3_mallo
116ef 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 c(nFilename);..
116f0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 if( zLockFile
116f1 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 ==0 ){.. rc
116f2 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
116f3 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
116f4 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
116f5 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 intf(nFilename,
116f6 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 zLockFile, "%s"
116f7 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 DOTLOCK_SUFFIX,
116f8 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 zFilename);..
116f9 20 7d 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f }.. pNew->lo
116fa 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a ckingContext = z
116fb 4c 6f 63 6b 46 69 6c 65 3b 0d 0a 20 20 7d 0d 0a LockFile;.. }..
116fc 0d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 ..#if OS_VXWORKS
116fd 0d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f .. else if( pLo
116fe 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 ckingStyle == &s
116ff 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0d 0a emIoMethods ){..
11700 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d /* Named sem
11701 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 aphore locking u
11702 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 ses the file pat
11703 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f h so it needs to
11704 20 62 65 0d 0a 20 20 20 20 2a 2a 20 69 6e 63 6c be.. ** incl
11705 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c uded in the semL
11706 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0d 0a 20 ockingContext..
11707 20 20 20 2a 2f 0d 0a 20 20 20 20 75 6e 69 78 45 */.. unixE
11708 6e 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 nterMutex();..
11709 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 rc = findInode
1170a 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 Info(pNew, &pNew
1170b 2d 3e 70 49 6e 6f 64 65 29 3b 0d 0a 20 20 20 20 ->pInode);..
1170c 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f if( (rc==SQLITE_
1170d 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 OK) && (pNew->pI
1170e 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c node->pSem==NULL
1170f 29 20 29 7b 0d 0a 20 20 20 20 20 20 63 68 61 72 ) ){.. char
11710 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 *zSemName = pNe
11711 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e w->pInode->aSemN
11712 61 6d 65 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 ame;.. int
11713 6e 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 n;.. sqlite
11714 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 3_snprintf(MAX_P
11715 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d ATHNAME, zSemNam
11716 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0d 0a 20 e, "/%s.sem",..
11717 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11718 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d pNew->pId-
11719 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 >zCanonicalName)
1171a 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d ;.. for( n=
1171b 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 1; zSemName[n];
1171c 6e 2b 2b 20 29 0d 0a 20 20 20 20 20 20 20 20 69 n++ ).. i
1171d 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d f( zSemName[n]==
1171e 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e '/' ) zSemName[n
1171f 5d 20 3d 20 27 5f 27 3b 0d 0a 20 20 20 20 20 20 ] = '_';..
11720 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 pNew->pInode->pS
11721 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 em = sem_open(zS
11722 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c emName, O_CREAT,
11723 20 30 36 36 36 2c 20 31 29 3b 0d 0a 20 20 20 20 0666, 1);..
11724 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f if( pNew->pIno
11725 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f de->pSem == SEM_
11726 46 41 49 4c 45 44 20 29 7b 0d 0a 20 20 20 20 20 FAILED ){..
11727 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e rc = SQLITE_N
11728 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 20 20 70 OMEM;.. p
11729 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 New->pInode->aSe
1172a 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b mName[0] = '\0';
1172b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
1172c 0d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d .. unixLeaveM
1172d 75 74 65 78 28 29 3b 0d 0a 20 20 7d 0d 0a 23 65 utex();.. }..#e
1172e 6e 64 69 66 0d 0a 20 20 0d 0a 20 20 70 4e 65 77 ndif.. .. pNew
1172f 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b ->lastErrno = 0;
11730 0d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 ..#if OS_VXWORKS
11731 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 .. if( rc!=SQLI
11732 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 66 TE_OK ){.. if
11733 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f ( h>=0 ) robust_
11734 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f close(pNew, h, _
11735 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 68 _LINE__);.. h
11736 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 6f 73 55 6e = -1;.. osUn
11737 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b link(zFilename);
11738 0d 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d .. isDelete =
11739 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 0;.. }.. if(
1173a 69 73 44 65 6c 65 74 65 20 29 20 70 4e 65 77 2d isDelete ) pNew-
1173b 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e >ctrlFlags |= UN
1173c 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0d 0a IXFILE_DELETE;..
1173d 23 65 6e 64 69 66 0d 0a 20 20 69 66 28 20 72 63 #endif.. if( rc
1173e 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
1173f 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 if( h>=0 ) r
11740 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 obust_close(pNew
11741 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d , h, __LINE__);.
11742 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
11743 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 New->pMethod = p
11744 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0d 0a 20 LockingStyle;..
11745 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b OpenCounter(+
11746 31 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 1);.. }.. retu
11747 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
11748 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
11749 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f ame of a directo
1174a 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 ry in which to p
1174b 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c ut temporary fil
1174c 65 73 2e 0d 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 es...** If no su
1174d 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 itable temporary
1174e 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 file directory
1174f 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 can be found, re
11750 74 75 72 6e 20 4e 55 4c 4c 2e 0d 0a 2a 2f 0d 0a turn NULL...*/..
11751 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
11752 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 r *unixTempFileD
11753 69 72 28 76 6f 69 64 29 7b 0d 0a 20 20 73 74 61 ir(void){.. sta
11754 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
11755 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0d 0a 20 20 azDirs[] = {..
11756 20 20 20 30 2c 0d 0a 20 20 20 20 20 30 2c 0d 0a 0,.. 0,..
11757 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c "/var/tmp",
11758 0d 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 .. "/usr/tmp
11759 22 2c 0d 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c ",.. "/tmp",
1175a 0d 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 .. 0
1175b 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 /* List terminat
1175c 6f 72 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 20 20 75 or */.. };.. u
1175d 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0d 0a nsigned int i;..
1175e 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 struct stat bu
1175f 66 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 f;.. const char
11760 20 2a 7a 44 69 72 20 3d 20 30 3b 0d 0a 0d 0a 20 *zDir = 0;....
11761 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c azDirs[0] = sql
11762 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 ite3_temp_direct
11763 6f 72 79 3b 0d 0a 20 20 69 66 28 20 21 61 7a 44 ory;.. if( !azD
11764 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b irs[1] ) azDirs[
11765 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 1] = getenv("TMP
11766 44 49 52 22 29 3b 0d 0a 20 20 66 6f 72 28 69 3d DIR");.. for(i=
11767 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 0; i<sizeof(azDi
11768 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 rs)/sizeof(azDir
11769 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 s[0]); zDir=azDi
1176a 72 73 5b 69 2b 2b 5d 29 7b 0d 0a 20 20 20 20 69 rs[i++]){.. i
1176b 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e f( zDir==0 ) con
1176c 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69 66 28 20 tinue;.. if(
1176d 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 osStat(zDir, &bu
1176e 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a f) ) continue;..
1176f 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 if( !S_ISDIR
11770 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 (buf.st_mode) )
11771 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69 continue;.. i
11772 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 f( osAccess(zDir
11773 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 , 07) ) continue
11774 3b 0d 0a 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 ;.. break;..
11775 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 }.. return zDi
11776 72 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 r;..}..../*..**
11777 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 Create a tempora
11778 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 ry file name in
11779 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 zBuf. zBuf must
1177a 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 2a be allocated..*
1177b 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 * by the calling
1177c 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 process and mus
1177d 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 t be big enough
1177e 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 to hold at least
1177f 0d 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 ..** pVfs->mxPat
11780 68 6e 61 6d 65 20 62 79 74 65 73 2e 0d 0a 2a 2f hname bytes...*/
11781 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 ..static int uni
11782 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 xGetTempname(int
11783 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 nBuf, char *zBu
11784 66 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 63 6f f){.. static co
11785 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11786 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0d 0a 20 20 r zChars[] =..
11787 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d "abcdefghijklm
11788 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0d 0a nopqrstuvwxyz"..
11789 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b "ABCDEFGHIJK
1178a 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 LMNOPQRSTUVWXYZ"
1178b 0d 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 .. "012345678
1178c 39 22 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 9";.. unsigned
1178d 69 6e 74 20 69 2c 20 6a 3b 0d 0a 20 20 63 6f 6e int i, j;.. con
1178e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0d 0a st char *zDir;..
1178f 0d 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 .. /* It's odd
11790 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 to simulate an i
11791 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 o-error here, bu
11792 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 t really this is
11793 20 6a 75 73 74 0d 0a 20 20 2a 2a 20 75 73 69 6e just.. ** usin
11794 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 g the io-error i
11795 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f nfrastructure to
11796 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 test that SQLit
11797 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0d 0a e handles this..
11798 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 ** function fa
11799 69 6c 69 6e 67 2e 20 0d 0a 20 20 2a 2f 0d 0a 20 iling. .. */..
1179a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
1179b 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ( return SQLITE_
1179c 49 4f 45 52 52 20 29 3b 0d 0a 0d 0a 20 20 7a 44 IOERR );.... zD
1179d 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c ir = unixTempFil
1179e 65 44 69 72 28 29 3b 0d 0a 20 20 69 66 28 20 7a eDir();.. if( z
1179f 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 Dir==0 ) zDir =
117a0 22 2e 22 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 ".";.... /* Che
117a1 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 ck that the outp
117a2 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 ut buffer is lar
117a3 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 ge enough for th
117a4 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 e temporary file
117a5 20 0d 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 .. ** name. If
117a6 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 it is not, retu
117a7 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e rn SQLITE_ERROR.
117a8 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 28 73 .. */.. if( (s
117a9 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 trlen(zDir) + st
117aa 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 rlen(SQLITE_TEMP
117ab 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 _FILE_PREFIX) +
117ac 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 18) >= (size_t)n
117ad 42 75 66 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 Buf ){.. retu
117ae 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b rn SQLITE_ERROR;
117af 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 64 6f 7b 0d 0a .. }.... do{..
117b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
117b1 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 intf(nBuf-18, zB
117b2 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f uf, "%s/"SQLITE_
117b3 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 TEMP_FILE_PREFIX
117b4 2c 20 7a 44 69 72 29 3b 0d 0a 20 20 20 20 6a 20 , zDir);.. j
117b5 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 = (int)strlen(zB
117b6 75 66 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 uf);.. sqlite
117b7 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 3_randomness(15,
117b8 20 26 7a 42 75 66 5b 6a 5d 29 3b 0d 0a 20 20 20 &zBuf[j]);..
117b9 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 for(i=0; i<15;
117ba 69 2b 2b 2c 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 i++, j++){..
117bb 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 zBuf[j] = (cha
117bc 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 r)zChars[ ((unsi
117bd 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a gned char)zBuf[j
117be 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 ])%(sizeof(zChar
117bf 73 29 2d 31 29 20 5d 3b 0d 0a 20 20 20 20 7d 0d s)-1) ];.. }.
117c0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 . zBuf[j] = 0
117c1 3b 0d 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d ;.. zBuf[j+1]
117c2 20 3d 20 30 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 = 0;.. }while(
117c3 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 osAccess(zBuf,0
117c4 29 3d 3d 30 20 29 3b 0d 0a 20 20 72 65 74 75 72 )==0 );.. retur
117c5 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
117c6 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e ...#if SQLITE_EN
117c7 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 ABLE_LOCKING_STY
117c8 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f LE && defined(__
117c9 41 50 50 4c 45 5f 5f 29 0d 0a 2f 2a 0d 0a 2a 2a APPLE__)../*..**
117ca 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e Routine to tran
117cb 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 sform a unixFile
117cc 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f into a proxy-lo
117cd 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0d cking unixFile..
117ce 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 .** Implementati
117cf 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d on in the proxy-
117d0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 lock division, b
117d1 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f ut used by unixO
117d2 70 65 6e 28 29 0d 0a 2a 2a 20 69 66 20 53 51 4c pen()..** if SQL
117d3 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 ITE_PREFER_PROXY
117d4 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 _LOCKING is defi
117d5 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ned...*/..static
117d6 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 int proxyTransf
117d7 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 ormUnixFile(unix
117d8 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 File*, const cha
117d9 72 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a r*);..#endif....
117da 2f 2a 0d 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f /*..** Search fo
117db 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 r an unused file
117dc 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 descriptor that
117dd 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 was opened on t
117de 68 65 20 64 61 74 61 62 61 73 65 20 0d 0a 2a 2a he database ..**
117df 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 file (not a jou
117e0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a rnal or master-j
117e1 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 ournal file) ide
117e2 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e ntified by pathn
117e3 61 6d 65 0d 0a 2a 2a 20 7a 50 61 74 68 20 77 69 ame..** zPath wi
117e4 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 th SQLITE_OPEN_X
117e5 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e XX flags matchin
117e6 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 g those passed a
117e7 73 20 74 68 65 20 73 65 63 6f 6e 64 0d 0a 2a 2a s the second..**
117e8 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 argument to thi
117e9 73 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d s function...**.
117ea 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 .** Such a file
117eb 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 descriptor may e
117ec 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 xist if a databa
117ed 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 se connection wa
117ee 73 20 63 6c 6f 73 65 64 0d 0a 2a 2a 20 62 75 74 s closed..** but
117ef 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 the associated
117f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 file descriptor
117f1 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f could not be clo
117f2 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 sed because some
117f3 0d 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 ..** other file
117f4 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 descriptor open
117f5 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 on the same file
117f6 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 is holding a fi
117f7 6c 65 2d 6c 6f 63 6b 2e 0d 0a 2a 2a 20 52 65 66 le-lock...** Ref
117f8 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 er to comments i
117f9 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 n the unixClose(
117fa 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 ) function and t
117fb 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 he lengthy comme
117fc 6e 74 0d 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e nt..** describin
117fd 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 g "Posix Advisor
117fe 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 y Locking" at th
117ff 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 e start of this
11800 66 69 6c 65 20 66 6f 72 20 0d 0a 2a 2a 20 66 75 file for ..** fu
11801 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 rther details. A
11802 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 lso, ticket #401
11803 38 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 8...**..** If a
11804 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 suitable file de
11805 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e scriptor is foun
11806 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 d, then it is re
11807 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0d 0a 2a turned. If no..*
11808 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 * such file desc
11809 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 riptor is locate
1180a 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 d, -1 is returne
1180b 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 55 d...*/..static U
1180c 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e nixUnusedFd *fin
1180d 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 dReusableFd(cons
1180e 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 t char *zPath, i
1180f 6e 74 20 66 6c 61 67 73 29 7b 0d 0a 20 20 55 6e nt flags){.. Un
11810 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 ixUnusedFd *pUnu
11811 73 65 64 20 3d 20 30 3b 0d 0a 0d 0a 20 20 2f 2a sed = 0;.... /*
11812 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 Do not search f
11813 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c or an unused fil
11814 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 e descriptor on
11815 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 vxworks. Not bec
11816 61 75 73 65 0d 0a 20 20 2a 2a 20 76 78 77 6f 72 ause.. ** vxwor
11817 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e ks would not ben
11818 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 efit from the ch
11819 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 ange (it might,
1181a 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c we're not sure),
1181b 0d 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 .. ** but becau
1181c 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 se no way to tes
1181d 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c t it is currentl
1181e 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 y available. It
1181f 69 73 20 62 65 74 74 65 72 20 0d 0a 20 20 2a 2a is better .. **
11820 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 not to risk bre
11821 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 aking vxworks su
11822 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 pport for the sa
11823 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 ke of such an ob
11824 73 63 75 72 65 20 0d 0a 20 20 2a 2a 20 66 65 61 scure .. ** fea
11825 74 75 72 65 2e 20 20 2a 2f 0d 0a 23 69 66 20 21 ture. */..#if !
11826 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 73 74 OS_VXWORKS.. st
11827 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b ruct stat sStat;
11828 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11829 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 /* Results of
1182a 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0d stat() call */.
1182b 0a 0d 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 ... /* A stat()
1182c 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 call may fail f
1182d 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f or various reaso
1182e 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 ns. If this happ
1182f 65 6e 73 2c 20 69 74 20 69 73 0d 0a 20 20 2a 2a ens, it is.. **
11830 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 almost certain
11831 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 that an open() c
11832 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 all on the same
11833 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 path will also f
11834 61 69 6c 2e 0d 0a 20 20 2a 2a 20 46 6f 72 20 74 ail... ** For t
11835 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 his reason, if a
11836 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 n error occurs i
11837 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c n the stat() cal
11838 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0d 0a 20 l here, it is..
11839 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 ** ignored and
1183a 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 -1 is returned.
1183b 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 The caller will
1183c 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 try to open a ne
1183d 77 20 66 69 6c 65 0d 0a 20 20 2a 2a 20 64 65 73 w file.. ** des
1183e 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 criptor on the s
1183f 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 ame path, fail,
11840 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 and return an er
11841 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0d 0a ror to SQLite...
11842 20 20 2a 2a 0d 0a 20 20 2a 2a 20 45 76 65 6e 20 **.. ** Even
11843 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 if a subsequent
11844 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 open() call does
11845 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f succeed, the co
11846 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0d 0a 20 nsequences of..
11847 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e ** not searchin
11848 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c g for a resusabl
11849 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f e file descripto
1184a 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 r are not dire.
1184b 20 2a 2f 0d 0a 20 20 69 66 28 20 30 3d 3d 6f 73 */.. if( 0==os
1184c 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 Stat(zPath, &sSt
1184d 61 74 29 20 29 7b 0d 0a 20 20 20 20 75 6e 69 78 at) ){.. unix
1184e 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 InodeInfo *pInod
1184f 65 3b 0d 0a 0d 0a 20 20 20 20 75 6e 69 78 45 6e e;.... unixEn
11850 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 20 terMutex();..
11851 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c pInode = inodeL
11852 69 73 74 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 ist;.. while(
11853 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f pInode && (pIno
11854 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d de->fileId.dev!=
11855 73 53 74 61 74 2e 73 74 5f 64 65 76 0d 0a 20 20 sStat.st_dev..
11856 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11857 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 || pInode->fi
11858 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e leId.ino!=sStat.
11859 73 74 5f 69 6e 6f 29 20 29 7b 0d 0a 20 20 20 20 st_ino) ){..
1185a 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f pInode = pIno
1185b 64 65 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 de->pNext;..
1185c 7d 0d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 }.. if( pInod
1185d 65 20 29 7b 0d 0a 20 20 20 20 20 20 55 6e 69 78 e ){.. Unix
1185e 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0d 0a UnusedFd **pp;..
1185f 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 for(pp=&pI
11860 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a node->pUnused; *
11861 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 pp && (*pp)->fla
11862 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 gs!=flags; pp=&(
11863 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0d (*pp)->pNext));.
11864 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d . pUnused =
11865 20 2a 70 70 3b 0d 0a 20 20 20 20 20 20 69 66 28 *pp;.. if(
11866 20 70 55 6e 75 73 65 64 20 29 7b 0d 0a 20 20 20 pUnused ){..
11867 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 *pp = pUnus
11868 65 64 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 ed->pNext;..
11869 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
1186a 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 unixLeaveMutex()
1186b 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 20 20 ;.. }..#endif
1186c 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f /* if !OS_VXWO
1186d 52 4b 53 20 2a 2f 0d 0a 20 20 72 65 74 75 72 6e RKS */.. return
1186e 20 70 55 6e 75 73 65 64 3b 0d 0a 7d 0d 0a 0d 0a pUnused;..}....
1186f 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 /*..** This func
11870 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 tion is called b
11871 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 y unixOpen() to
11872 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e determine the un
11873 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0d 0a ix permissions..
11874 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 ** to create new
11875 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 files with. If
11876 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c no error occurs,
11877 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 then SQLITE_OK
11878 69 73 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a 20 is returned..**
11879 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 and a value suit
1187a 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 able for passing
1187b 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 as the third ar
1187c 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 gument to open(2
1187d 29 20 69 73 0d 0a 2a 2a 20 77 72 69 74 74 65 6e ) is..** written
1187e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 to *pMode. If a
1187f 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 n IO error occur
11880 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 s, an SQLite err
11881 6f 72 20 63 6f 64 65 20 69 73 20 0d 0a 2a 2a 20 or code is ..**
11882 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 returned and the
11883 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 value of *pMode
11884 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 is not modified
11885 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
11886 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e file being open
11887 65 64 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 ed is a temporar
11888 79 20 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c y file, it is al
11889 77 61 79 73 20 63 72 65 61 74 65 64 20 77 69 74 ways created wit
1188a 68 0d 0a 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 h..** the octal
1188b 70 65 72 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 permissions 0600
1188c 20 28 72 65 61 64 2f 77 72 69 74 61 62 6c 65 20 (read/writable
1188d 62 79 20 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 by owner only).
1188e 49 66 20 74 68 65 20 66 69 6c 65 0d 0a 2a 2a 20 If the file..**
1188f 69 73 20 61 20 64 61 74 61 62 61 73 65 20 6f 72 is a database or
11890 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
11891 66 69 6c 65 2c 20 69 74 20 69 73 20 63 72 65 61 file, it is crea
11892 74 65 64 20 77 69 74 68 20 74 68 65 20 70 65 72 ted with the per
11893 6d 69 73 73 69 6f 6e 73 20 0d 0a 2a 2a 20 6d 61 missions ..** ma
11894 73 6b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c sk SQLITE_DEFAUL
11895 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f T_FILE_PERMISSIO
11896 4e 53 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 69 6e 61 NS...**..** Fina
11897 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c 65 lly, if the file
11898 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 being opened is
11899 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 a WAL or regula
1189a 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 r journal file,
1189b 74 68 65 6e 20 0d 0a 2a 2a 20 74 68 69 73 20 66 then ..** this f
1189c 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 unction queries
1189d 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 the file-system
1189e 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 for the permissi
1189f 6f 6e 73 20 6f 6e 20 74 68 65 20 0d 0a 2a 2a 20 ons on the ..**
118a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 corresponding da
118a1 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 tabase file and
118a2 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 sets *pMode to t
118a3 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 his value. Whene
118a4 76 65 72 20 0d 0a 2a 2a 20 70 6f 73 73 69 62 6c ver ..** possibl
118a5 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e e, WAL and journ
118a6 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 al files are cre
118a7 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 ated using the s
118a8 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 ame permissions
118a9 0d 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f ..** as the asso
118aa 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 ciated database
118ab 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 file...**..** If
118ac 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 the SQLITE_ENAB
118ad 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 LE_8_3_NAMES opt
118ae 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 ion is enabled,
118af 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 6f 72 69 then the..** ori
118b0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 ginal filename i
118b1 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 s unavailable.
118b2 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 But 8_3_NAMES is
118b3 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0d 0a only used for..
118b4 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 ** FAT filesyste
118b5 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f ms and permissio
118b6 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 ns do not matter
118b7 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 there, so just
118b8 75 73 65 0d 0a 2a 2a 20 74 68 65 20 64 65 66 61 use..** the defa
118b9 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e ult permissions.
118ba 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
118bb 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d findCreateFileM
118bc 6f 64 65 28 0d 0a 20 20 63 6f 6e 73 74 20 63 68 ode(.. const ch
118bd 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 ar *zPath,
118be 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 /* Path
118bf 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c of file (possibl
118c0 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 y) being created
118c1 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 */.. int flags
118c2 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
118c3 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 /* Flags
118c4 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72 passed as 4th ar
118c5 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 gument to xOpen(
118c6 29 20 2a 2f 0d 0a 20 20 6d 6f 64 65 5f 74 20 2a ) */.. mode_t *
118c7 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 pMode
118c8 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
118c9 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f Permissions to o
118ca 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f pen file with */
118cb 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d ..){.. int rc =
118cc 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 SQLITE_OK;
118cd 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
118ce 6e 20 43 6f 64 65 20 2a 2f 0d 0a 20 20 2a 70 4d n Code */.. *pM
118cf 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 ode = SQLITE_DEF
118d0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 AULT_FILE_PERMIS
118d1 53 49 4f 4e 53 3b 0d 0a 20 20 69 66 28 20 66 6c SIONS;.. if( fl
118d2 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 ags & (SQLITE_OP
118d3 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 EN_WAL|SQLITE_OP
118d4 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 EN_MAIN_JOURNAL)
118d5 20 29 7b 0d 0a 20 20 20 20 63 68 61 72 20 7a 44 ){.. char zD
118d6 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 b[MAX_PATHNAME+1
118d7 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 ]; /* Databa
118d8 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0d se file path */.
118d9 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 . int nDb;
118da 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
118db 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
118dc 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a valid bytes in z
118dd 44 62 20 2a 2f 0d 0a 20 20 20 20 73 74 72 75 63 Db */.. struc
118de 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 t stat sStat;
118df 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 /* Outp
118e0 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 ut of stat() on
118e1 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f database file */
118e2 0d 0a 0d 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 .... /* zPath
118e3 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 is a path to a
118e4 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 WAL or journal f
118e5 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 ile. The followi
118e6 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 ng block derives
118e7 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 .. ** the pat
118e8 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 h to the associa
118e9 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c ted database fil
118ea 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 e from zPath. Th
118eb 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 is block handles
118ec 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c .. ** the fol
118ed 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f lowing naming co
118ee 6e 76 65 6e 74 69 6f 6e 73 3a 0d 0a 20 20 20 20 nventions:..
118ef 2a 2a 0d 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 **.. ** "<p
118f0 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e ath to db>-journ
118f1 61 6c 22 0d 0a 20 20 20 20 2a 2a 20 20 20 22 3c al".. ** "<
118f2 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 path to db>-wal"
118f3 0d 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 .. ** "<pat
118f4 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c h to db>-journal
118f5 4e 4e 22 0d 0a 20 20 20 20 2a 2a 20 20 20 22 3c NN".. ** "<
118f6 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e path to db>-walN
118f7 4e 22 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 N".. **..
118f8 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 ** where NN is a
118f9 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e decimal number.
118fa 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 The NN naming s
118fb 63 68 65 6d 65 73 20 61 72 65 20 0d 0a 20 20 20 chemes are ..
118fc 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 ** used by the
118fd 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 test_multiplex.c
118fe 20 6d 6f 64 75 6c 65 2e 0d 0a 20 20 20 20 2a 2f module... */
118ff 0d 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 .. nDb = sqli
11900 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 te3Strlen30(zPat
11901 68 29 20 2d 20 31 3b 20 0d 0a 23 69 66 64 65 66 h) - 1; ..#ifdef
11902 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 SQLITE_ENABLE_8
11903 5f 33 5f 4e 41 4d 45 53 0d 0a 20 20 20 20 77 68 _3_NAMES.. wh
11904 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 ile( nDb>0 && sq
11905 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 lite3Isalnum(zPa
11906 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d th[nDb]) ) nDb--
11907 3b 0d 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d ;.. if( nDb==
11908 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 0 || zPath[nDb]!
11909 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 ='-' ) return SQ
1190a 4c 49 54 45 5f 4f 4b 3b 0d 0a 23 65 6c 73 65 0d LITE_OK;..#else.
1190b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 . while( zPat
1190c 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0d 0a h[nDb]!='-' ){..
1190d 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 assert( nD
1190e 62 3e 30 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 b>0 );.. as
1190f 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d sert( zPath[nDb]
11910 21 3d 27 5c 6e 27 20 29 3b 0d 0a 20 20 20 20 20 !='\n' );..
11911 20 6e 44 62 2d 2d 3b 0d 0a 20 20 20 20 7d 0d 0a nDb--;.. }..
11912 23 65 6e 64 69 66 0d 0a 20 20 20 20 6d 65 6d 63 #endif.. memc
11913 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e py(zDb, zPath, n
11914 44 62 29 3b 0d 0a 20 20 20 20 7a 44 62 5b 6e 44 Db);.. zDb[nD
11915 62 5d 20 3d 20 27 5c 30 27 3b 0d 0a 0d 0a 20 20 b] = '\0';....
11916 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 if( 0==osStat(
11917 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0d zDb, &sStat) ){.
11918 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 . *pMode =
11919 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 sStat.st_mode &
1191a 30 37 37 37 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 0777;.. }else
1191b 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 {.. rc = SQ
1191c 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 LITE_IOERR_FSTAT
1191d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 ;.. }.. }els
1191e 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 e if( flags & SQ
1191f 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 LITE_OPEN_DELETE
11920 4f 4e 43 4c 4f 53 45 20 29 7b 0d 0a 20 20 20 20 ONCLOSE ){..
11921 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0d 0a *pMode = 0600;..
11922 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
11923 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f ;..}..../*..** O
11924 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 pen the file zPa
11925 74 68 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 50 72 65 th...** ..** Pre
11926 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c viously, the SQL
11927 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 ite OS layer use
11928 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e d three function
11929 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 s in place of th
1192a 69 73 0d 0a 2a 2a 20 6f 6e 65 3a 0d 0a 2a 2a 0d is..** one:..**.
1192b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f .** sqlite3O
1192c 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 sOpenReadWrite()
1192d 3b 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 ;..** sqlite
1192e 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 3OsOpenReadOnly(
1192f 29 3b 0d 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 );..** sqlit
11930 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 e3OsOpenExclusiv
11931 65 28 29 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 e();..**..** The
11932 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 se calls corresp
11933 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f ond to the follo
11934 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e wing combination
11935 73 20 6f 66 20 66 6c 61 67 73 3a 0d 0a 2a 2a 0d s of flags:..**.
11936 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 .** ReadWrit
11937 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 e() -> (READ
11938 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0d WRITE | CREATE).
11939 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 .** ReadOnly
1193a 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 () -> (READ
1193b 4f 4e 4c 59 29 20 0d 0a 2a 2a 20 20 20 20 20 4f ONLY) ..** O
1193c 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d penExclusive() -
1193d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 > (READWRITE | C
1193e 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 REATE | EXCLUSIV
1193f 45 29 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6f E)..**..** The o
11940 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 ld OpenExclusive
11941 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f () accepted a bo
11942 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d olean argument -
11943 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0d 0a "delFlag". If..
11944 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c ** true, the fil
11945 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 e was configured
11946 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 to be automatic
11947 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 ally deleted whe
11948 6e 20 74 68 65 0d 0a 2a 2a 20 66 69 6c 65 20 68 n the..** file h
11949 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f andle closed. To
1194a 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d achieve the sam
1194b 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 e effect using t
1194c 68 69 73 20 6e 65 77 20 0d 0a 2a 2a 20 69 6e 74 his new ..** int
1194d 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 erface, add the
1194e 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c DELETEONCLOSE fl
1194f 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 ag to those spec
11950 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 ified above for
11951 0d 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 ..** OpenExclusi
11952 76 65 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ve()...*/..stati
11953 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0d c int unixOpen(.
11954 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
11955 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 pVfs,
11956 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 /* The VFS for w
11957 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 hich this is the
11958 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f xOpen method */
11959 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
1195a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 zPath,
1195b 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 /* Pathname of
1195c 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 file to be opene
1195d 64 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f d */.. sqlite3_
1195e 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 file *pFile,
1195f 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 /* The file
11960 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 descriptor to b
11961 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0d 0a e filled in */..
11962 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 int flags,
11963 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11964 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f * Input flags to
11965 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 control the ope
11966 6e 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a ning */.. int *
11967 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 pOutFlags
11968 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 /* Outpu
11969 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 t flags returned
1196a 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 to SQLite core
1196b 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 6e 69 78 46 69 */..){.. unixFi
1196c 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c le *p = (unixFil
1196d 65 20 2a 29 70 46 69 6c 65 3b 0d 0a 20 20 69 6e e *)pFile;.. in
1196e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 t fd = -1;
1196f 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
11970 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 File descriptor
11971 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e returned by open
11972 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6f 70 65 () */.. int ope
11973 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 nFlags = 0;
11974 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 /* Flags
11975 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e to pass to open
11976 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 54 79 () */.. int eTy
11977 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 pe = flags&0xFFF
11978 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 FFF00; /* Type
11979 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 of file to open
1197a 2a 2f 0d 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b */.. int noLock
1197b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1197c 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 /* True to
1197d 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 omit locking pri
1197e 6d 69 74 69 76 65 73 20 2a 2f 0d 0a 20 20 69 6e mitives */.. in
1197f 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
11980 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
11981 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 Function Return
11982 43 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 Code */.. int c
11983 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 trlFlags = 0;
11984 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 /* UNI
11985 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f XFILE_* flags */
11986 0d 0a 0d 0a 20 20 69 6e 74 20 69 73 45 78 63 6c .... int isExcl
11987 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 usive = (flags
11988 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 & SQLITE_OPEN_EX
11989 43 4c 55 53 49 56 45 29 3b 0d 0a 20 20 69 6e 74 CLUSIVE);.. int
1198a 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 isDelete =
1198b 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f (flags & SQLITE_
1198c 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f OPEN_DELETEONCLO
1198d 53 45 29 3b 0d 0a 20 20 69 6e 74 20 69 73 43 72 SE);.. int isCr
1198e 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 eate = (flag
1198f 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f s & SQLITE_OPEN_
11990 43 52 45 41 54 45 29 3b 0d 0a 20 20 69 6e 74 20 CREATE);.. int
11991 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 isReadonly = (
11992 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f flags & SQLITE_O
11993 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0d 0a PEN_READONLY);..
11994 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 int isReadWrit
11995 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 e = (flags & SQ
11996 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 LITE_OPEN_READWR
11997 49 54 45 29 3b 0d 0a 23 69 66 20 53 51 4c 49 54 ITE);..#if SQLIT
11998 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 E_ENABLE_LOCKING
11999 5f 53 54 59 4c 45 0d 0a 20 20 69 6e 74 20 69 73 _STYLE.. int is
1199a 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c AutoProxy = (fl
1199b 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 ags & SQLITE_OPE
1199c 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0d 0a 23 N_AUTOPROXY);..#
1199d 65 6e 64 69 66 0d 0a 23 69 66 20 64 65 66 69 6e endif..#if defin
1199e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c ed(__APPLE__) ||
1199f 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
119a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 OCKING_STYLE..
119a1 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 struct statfs fs
119a2 49 6e 66 6f 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d Info;..#endif...
119a3 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e . /* If creatin
119a4 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 g a master or ma
119a5 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c in-file journal,
119a6 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
119a7 69 6c 6c 20 6f 70 65 6e 0d 0a 20 20 2a 2a 20 61 ill open.. ** a
119a8 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 file-descriptor
119a9 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 on the director
119aa 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 y too. The first
119ab 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 time unixSync()
119ac 0d 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 .. ** is called
119ad 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 the directory f
119ae 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 ile descriptor w
119af 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 ill be fsync()ed
119b0 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0d 0a and close()d...
119b1 20 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 6e 63 */.. int sync
119b2 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 Dir = (isCreate
119b3 26 26 20 28 0d 0a 20 20 20 20 20 20 20 20 65 54 && (.. eT
119b4 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype==SQLITE_OPEN
119b5 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 _MASTER_JOURNAL
119b6 0d 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d .. || eType=
119b7 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 =SQLITE_OPEN_MAI
119b8 4e 5f 4a 4f 55 52 4e 41 4c 20 0d 0a 20 20 20 20 N_JOURNAL ..
119b9 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
119ba 45 5f 4f 50 45 4e 5f 57 41 4c 0d 0a 20 20 29 29 E_OPEN_WAL.. ))
119bb 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 61 72 67 ;.... /* If arg
119bc 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 ument zPath is a
119bd 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 NULL pointer, t
119be 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
119bf 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e required to open
119c0 0d 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 .. ** a tempora
119c1 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 ry file. Use thi
119c2 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 s buffer to stor
119c3 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 e the file name
119c4 69 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 63 68 61 in... */.. cha
119c5 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 r zTmpname[MAX_P
119c6 41 54 48 4e 41 4d 45 2b 32 5d 3b 0d 0a 20 20 63 ATHNAME+2];.. c
119c7 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
119c8 20 3d 20 7a 50 61 74 68 3b 0d 0a 0d 0a 20 20 2f = zPath;.... /
119c9 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c * Check the foll
119ca 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 owing statements
119cb 20 61 72 65 20 74 72 75 65 3a 20 0d 0a 20 20 2a are true: .. *
119cc 2a 0d 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 *.. ** (a) Ex
119cd 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 actly one of the
119ce 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 READWRITE and R
119cf 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 EADONLY flags mu
119d0 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0d st be set, and .
119d1 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 . ** (b) if C
119d2 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 REATE is set, th
119d3 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 en READWRITE mus
119d4 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 t also be set, a
119d5 6e 64 0d 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 nd.. ** (c) i
119d6 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 f EXCLUSIVE is s
119d7 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 et, then CREATE
119d8 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 must also be set
119d9 2e 0d 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 ... ** (d) if
119da 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 DELETEONCLOSE i
119db 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 s set, then CREA
119dc 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 TE must also be
119dd 73 65 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 set... */.. as
119de 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 sert((isReadonly
119df 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 ==0 || isReadWri
119e0 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 te==0) && (isRea
119e1 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 dWrite || isRead
119e2 6f 6e 6c 79 29 29 3b 0d 0a 20 20 61 73 73 65 72 only));.. asser
119e3 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c t(isCreate==0 ||
119e4 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0d 0a isReadWrite);..
119e5 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 assert(isExclu
119e6 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 sive==0 || isCre
119e7 61 74 65 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ate);.. assert(
119e8 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 isDelete==0 || i
119e9 73 43 72 65 61 74 65 29 3b 0d 0a 0d 0a 20 20 2f sCreate);.... /
119ea 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d * The main DB, m
119eb 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c ain journal, WAL
119ec 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 file and master
119ed 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 journal are nev
119ee 65 72 20 0d 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 er .. ** automa
119ef 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e tically deleted.
119f0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 Nor are they ev
119f1 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c er temporary fil
119f2 65 73 2e 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 es. */.. asser
119f3 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 t( (!isDelete &&
119f4 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 zName) || eType
119f5 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 !=SQLITE_OPEN_MA
119f6 49 4e 5f 44 42 20 29 3b 0d 0a 20 20 61 73 73 65 IN_DB );.. asse
119f7 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 rt( (!isDelete &
119f8 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 & zName) || eTyp
119f9 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d e!=SQLITE_OPEN_M
119fa 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0d 0a AIN_JOURNAL );..
119fb 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 assert( (!isDe
119fc 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c lete && zName) |
119fd 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f | eType!=SQLITE_
119fe 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
119ff 4e 41 4c 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 NAL );.. assert
11a00 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 ( (!isDelete &&
11a01 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 zName) || eType!
11a02 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c =SQLITE_OPEN_WAL
11a03 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 73 73 65 );.... /* Asse
11a04 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 rt that the uppe
11a05 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 r layer has set
11a06 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 one of the "file
11a07 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f -type" flags. */
11a08 0d 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 .. assert( eTyp
11a09 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d e==SQLITE_OPEN_M
11a0a 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 AIN_DB || e
11a0b 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
11a0c 4e 5f 54 45 4d 50 5f 44 42 20 0d 0a 20 20 20 20 N_TEMP_DB ..
11a0d 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c || eType==SQL
11a0e 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f ITE_OPEN_MAIN_JO
11a0f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d URNAL || eType==
11a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 SQLITE_OPEN_TEMP
11a11 5f 4a 4f 55 52 4e 41 4c 20 0d 0a 20 20 20 20 20 _JOURNAL ..
11a12 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 || eType==SQLI
11a13 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e TE_OPEN_SUBJOURN
11a14 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 AL || eType==S
11a15 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 QLITE_OPEN_MASTE
11a16 52 5f 4a 4f 55 52 4e 41 4c 20 0d 0a 20 20 20 20 R_JOURNAL ..
11a17 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c || eType==SQL
11a18 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 ITE_OPEN_TRANSIE
11a19 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d NT_DB || eType==
11a1a 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0d SQLITE_OPEN_WAL.
11a1b 0a 20 20 29 3b 0d 0a 0d 0a 20 20 6d 65 6d 73 65 . );.... memse
11a1c 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 t(p, 0, sizeof(u
11a1d 6e 69 78 46 69 6c 65 29 29 3b 0d 0a 0d 0a 20 20 nixFile));....
11a1e 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 if( eType==SQLIT
11a1f 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 E_OPEN_MAIN_DB )
11a20 7b 0d 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 {.. UnixUnuse
11a21 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0d 0a 20 dFd *pUnused;..
11a22 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e pUnused = fin
11a23 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d dReusableFd(zNam
11a24 65 2c 20 66 6c 61 67 73 29 3b 0d 0a 20 20 20 20 e, flags);..
11a25 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0d 0a if( pUnused ){..
11a26 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 fd = pUnus
11a27 65 64 2d 3e 66 64 3b 0d 0a 20 20 20 20 7d 65 6c ed->fd;.. }el
11a28 73 65 7b 0d 0a 20 20 20 20 20 20 70 55 6e 75 73 se{.. pUnus
11a29 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c ed = sqlite3_mal
11a2a 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 loc(sizeof(*pUnu
11a2b 73 65 64 29 29 3b 0d 0a 20 20 20 20 20 20 69 66 sed));.. if
11a2c 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0d 0a 20 ( !pUnused ){..
11a2d 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 return SQ
11a2e 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 LITE_NOMEM;..
11a2f 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 }.. }..
11a30 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 p->pUnused = pU
11a31 6e 75 73 65 64 3b 0d 0a 0d 0a 20 20 20 20 2f 2a nused;.... /*
11a32 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 Database filena
11a33 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a mes are double-z
11a34 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 ero terminated i
11a35 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0d 0a f they are not..
11a36 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 ** URIs with
11a37 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 parameters. He
11a38 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c nce, they can al
11a39 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 ways be passed i
11a3a 6e 74 6f 0d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 nto.. ** sqli
11a3b 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 te3_uri_paramete
11a3c 72 28 29 2e 20 2a 2f 0d 0a 20 20 20 20 61 73 73 r(). */.. ass
11a3d 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 ert( (flags & SQ
11a3e 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c LITE_OPEN_URI) |
11a3f 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a | zName[strlen(z
11a40 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0d 0a Name)+1]==0 );..
11a41 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a .. }else if( !z
11a42 4e 61 6d 65 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 Name ){.. /*
11a43 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c If zName is NULL
11a44 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 , the upper laye
11a45 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 r is requesting
11a46 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0d a temp file. */.
11a47 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 . assert(isDe
11a48 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 lete && !syncDir
11a49 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 );.. rc = uni
11a4a 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 xGetTempname(MAX
11a4b 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d _PATHNAME+2, zTm
11a4c 70 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 69 66 28 pname);.. if(
11a4d 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
11a4e 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 {.. return
11a4f 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 rc;.. }..
11a50 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 zName = zTmpname
11a51 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 47 65 6e 65 ;.... /* Gene
11a52 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 rated temporary
11a53 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c filenames are al
11a54 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f ways double-zero
11a55 20 74 65 72 6d 69 6e 61 74 65 64 0d 0a 20 20 20 terminated..
11a56 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 ** for use by s
11a57 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d qlite3_uri_param
11a58 65 74 65 72 28 29 2e 20 2a 2f 0d 0a 20 20 20 20 eter(). */..
11a59 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 assert( zName[st
11a5a 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d rlen(zName)+1]==
11a5b 30 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 0 );.. }.... /
11a5c 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 * Determine the
11a5d 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 value of the fla
11a5e 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 gs parameter pas
11a5f 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e sed to POSIX fun
11a60 63 74 69 6f 6e 0d 0a 20 20 2a 2a 20 6f 70 65 6e ction.. ** open
11a61 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 (). These must b
11a62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 e calculated eve
11a63 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e n if open() is n
11a64 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0d 0a 20 ot called, as..
11a65 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 ** they may be
11a66 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f stored as part o
11a67 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c f the file handl
11a68 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 e and used by th
11a69 65 20 0d 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 e .. ** 'conch
11a6a 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 file' locking fu
11a6b 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e nctions later on
11a6c 2e 20 20 2a 2f 0d 0a 20 20 69 66 28 20 69 73 52 . */.. if( isR
11a6d 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 eadonly ) openF
11a6e 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 lags |= O_RDONLY
11a6f 3b 0d 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 ;.. if( isReadW
11a70 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 rite ) openFlags
11a71 20 7c 3d 20 4f 5f 52 44 57 52 3b 0d 0a 20 20 69 |= O_RDWR;.. i
11a72 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 f( isCreate )
11a73 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f openFlags |= O_
11a74 43 52 45 41 54 3b 0d 0a 20 20 69 66 28 20 69 73 CREAT;.. if( is
11a75 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e Exclusive ) open
11a76 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c Flags |= (O_EXCL
11a77 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0d 0a 20 |O_NOFOLLOW);..
11a78 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f openFlags |= (O
11a79 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e _LARGEFILE|O_BIN
11a7a 41 52 59 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 66 ARY);.... if( f
11a7b 64 3c 30 20 29 7b 0d 0a 20 20 20 20 6d 6f 64 65 d<0 ){.. mode
11a7c 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 _t openMode;
11a7d 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 /* Per
11a7e 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 missions to crea
11a7f 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0d te file with */.
11a80 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 . rc = findCr
11a81 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 eateFileMode(zNa
11a82 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e me, flags, &open
11a83 4d 6f 64 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 Mode);.. if(
11a84 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
11a85 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
11a86 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0d 0a !p->pUnused );..
11a87 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 assert( eT
11a88 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype==SQLITE_OPEN
11a89 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 _WAL || eType==S
11a8a 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
11a8b 4a 4f 55 52 4e 41 4c 20 29 3b 0d 0a 20 20 20 20 JOURNAL );..
11a8c 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 return rc;..
11a8d 20 20 7d 0d 0a 20 20 20 20 66 64 20 3d 20 72 6f }.. fd = ro
11a8e 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c bust_open(zName,
11a8f 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e openFlags, open
11a90 4d 6f 64 65 29 3b 0d 0a 20 20 20 20 4f 53 54 52 Mode);.. OSTR
11a91 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d ACE(("OPENX %-
11a92 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 3d %s 0%o\n", fd
11a93 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 , zName, openFla
11a94 67 73 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 66 gs));.. if( f
11a95 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 d<0 && errno!=EI
11a96 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 SDIR && isReadWr
11a97 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 ite && !isExclus
11a98 69 76 65 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a ive ){.. /*
11a99 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 Failed to open
11a9a 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 the file for rea
11a9b 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 d/write access.
11a9c 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a Try read-only. *
11a9d 2f 0d 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 /.. flags &
11a9e 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f = ~(SQLITE_OPEN_
11a9f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 READWRITE|SQLITE
11aa0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0d 0a _OPEN_CREATE);..
11aa1 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 openFlags
11aa2 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 &= ~(O_RDWR|O_CR
11aa3 45 41 54 29 3b 0d 0a 20 20 20 20 20 20 66 6c 61 EAT);.. fla
11aa4 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 gs |= SQLITE_OPE
11aa5 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0d 0a 20 20 20 N_READONLY;..
11aa6 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 openFlags |=
11aa7 4f 5f 52 44 4f 4e 4c 59 3b 0d 0a 20 20 20 20 20 O_RDONLY;..
11aa8 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b isReadonly = 1;
11aa9 0d 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 .. fd = rob
11aaa 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 ust_open(zName,
11aab 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d openFlags, openM
11aac 6f 64 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ode);.. }..
11aad 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0d 0a 20 if( fd<0 ){..
11aae 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f rc = unixLo
11aaf 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 gError(SQLITE_CA
11ab0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 NTOPEN_BKPT, "op
11ab1 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0d 0a 20 20 en", zName);..
11ab2 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 goto open_fi
11ab3 6e 69 73 68 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a nished;.. }..
11ab4 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 66 }.. assert( f
11ab5 64 3e 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 70 d>=0 );.. if( p
11ab6 4f 75 74 46 6c 61 67 73 20 29 7b 0d 0a 20 20 20 OutFlags ){..
11ab7 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c *pOutFlags = fl
11ab8 61 67 73 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 ags;.. }.... i
11ab9 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b f( p->pUnused ){
11aba 0d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 .. p->pUnused
11abb 2d 3e 66 64 20 3d 20 66 64 3b 0d 0a 20 20 20 20 ->fd = fd;..
11abc 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 p->pUnused->flag
11abd 73 20 3d 20 66 6c 61 67 73 3b 0d 0a 20 20 7d 0d s = flags;.. }.
11abe 0a 0d 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 ... if( isDelet
11abf 65 20 29 7b 0d 0a 23 69 66 20 4f 53 5f 56 58 57 e ){..#if OS_VXW
11ac0 4f 52 4b 53 0d 0a 20 20 20 20 7a 50 61 74 68 20 ORKS.. zPath
11ac1 3d 20 7a 4e 61 6d 65 3b 0d 0a 23 65 6c 73 65 0d = zName;..#else.
11ac2 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e . osUnlink(zN
11ac3 61 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 ame);..#endif..
11ac4 20 7d 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 }..#if SQLITE_E
11ac5 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 NABLE_LOCKING_ST
11ac6 59 4c 45 0d 0a 20 20 65 6c 73 65 7b 0d 0a 20 20 YLE.. else{..
11ac7 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d p->openFlags =
11ac8 20 6f 70 65 6e 46 6c 61 67 73 3b 0d 0a 20 20 7d openFlags;.. }
11ac9 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 64 ..#endif....#ifd
11aca 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0d 0a 20 ef FD_CLOEXEC..
11acb 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 osFcntl(fd, F_S
11acc 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 ETFD, osFcntl(fd
11acd 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 , F_GETFD, 0) |
11ace 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0d 0a 23 65 FD_CLOEXEC);..#e
11acf 6e 64 69 66 0d 0a 0d 0a 20 20 6e 6f 4c 6f 63 6b ndif.... noLock
11ad0 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 = eType!=SQLITE
11ad1 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0d 0a _OPEN_MAIN_DB;..
11ad2 0d 0a 20 20 0d 0a 23 69 66 20 64 65 66 69 6e 65 .. ..#if define
11ad3 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 d(__APPLE__) ||
11ad4 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f SQLITE_ENABLE_LO
11ad5 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 20 20 69 CKING_STYLE.. i
11ad6 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 f( fstatfs(fd, &
11ad7 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b fsInfo) == -1 ){
11ad8 0d 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 .. ((unixFile
11ad9 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 *)pFile)->lastEr
11ada 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 rno = errno;..
11adb 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 robust_close(p
11adc 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b , fd, __LINE__);
11add 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
11ade 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 ITE_IOERR_ACCESS
11adf 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 20 28 30 20 ;.. }.. if (0
11ae0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f == strncmp("msdo
11ae1 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 s", fsInfo.f_fst
11ae2 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0d 0a ypename, 5)) {..
11ae3 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 ((unixFile*)
11ae4 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 pFile)->fsFlags
11ae5 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 |= SQLITE_FSFLAG
11ae6 53 5f 49 53 5f 4d 53 44 4f 53 3b 0d 0a 20 20 7d S_IS_MSDOS;.. }
11ae7 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a ..#endif.... /*
11ae8 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 Set up appropri
11ae9 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f ate ctrlFlags */
11aea 0d 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 .. if( isDelete
11aeb 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 )
11aec 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 ctrlFlags |= U
11aed 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0d NIXFILE_DELETE;.
11aee 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c . if( isReadonl
11aef 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 y )
11af0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e ctrlFlags |= UN
11af1 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0d 0a IXFILE_RDONLY;..
11af2 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 if( noLock )
11af3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11af4 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 ctrlFlags |= UNI
11af5 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0d 0a 20 XFILE_NOLOCK;..
11af6 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 if( syncDir )
11af7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
11af8 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 trlFlags |= UNIX
11af9 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0d 0a 20 FILE_DIRSYNC;..
11afa 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c if( flags & SQL
11afb 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 ITE_OPEN_URI ) c
11afc 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 trlFlags |= UNIX
11afd 46 49 4c 45 5f 55 52 49 3b 0d 0a 0d 0a 23 69 66 FILE_URI;....#if
11afe 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c SQLITE_ENABLE_L
11aff 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a 23 69 OCKING_STYLE..#i
11b00 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f f SQLITE_PREFER_
11b01 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0d 0a 20 PROXY_LOCKING..
11b02 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 isAutoProxy = 1
11b03 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 66 28 ;..#endif.. if(
11b04 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 isAutoProxy &&
11b05 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 (zPath!=NULL) &&
11b06 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 (!noLock) && pV
11b07 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0d 0a 20 20 fs->xOpen ){..
11b08 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 char *envforce
11b09 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 = getenv("SQLIT
11b0a 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f E_FORCE_PROXY_LO
11b0b 43 4b 49 4e 47 22 29 3b 0d 0a 20 20 20 20 69 6e CKING");.. in
11b0c 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0d t useProxy = 0;.
11b0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 ... /* SQLITE
11b0e 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 _FORCE_PROXY_LOC
11b0f 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f KING==1 means fo
11b10 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 rce always use p
11b11 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0d 0a roxy, 0 means ..
11b12 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 ** never use
11b13 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 proxy, NULL mea
11b14 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 ns use proxy for
11b15 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 non-local files
11b16 20 6f 6e 6c 79 2e 20 20 2a 2f 0d 0a 20 20 20 20 only. */..
11b17 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 if( envforce!=NU
11b18 4c 4c 20 29 7b 0d 0a 20 20 20 20 20 20 75 73 65 LL ){.. use
11b19 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 Proxy = atoi(env
11b1a 66 6f 72 63 65 29 3e 30 3b 0d 0a 20 20 20 20 7d force)>0;.. }
11b1b 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 66 28 else{.. if(
11b1c 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 statfs(zPath, &
11b1d 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b fsInfo) == -1 ){
11b1e 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 .. /* In
11b1f 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 theory, the clos
11b20 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 e(fd) call is su
11b21 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 b-optimal. If th
11b22 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0d 0a 20 e file opened..
11b23 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 ** with f
11b24 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 d is a database
11b25 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 file, and there
11b26 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 are other connec
11b27 74 69 6f 6e 73 20 6f 70 65 6e 0d 0a 20 20 20 20 tions open..
11b28 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 ** on that f
11b29 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 ile that are cur
11b2a 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 rently holding a
11b2b 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e dvisory locks on
11b2c 20 69 74 2c 0d 0a 20 20 20 20 20 20 20 20 2a 2a it,.. **
11b2d 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 then the call t
11b2e 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 o close() will c
11b2f 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b ancel those lock
11b30 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0d s. In practice,.
11b31 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 . ** we'r
11b32 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 e assuming that
11b33 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 statfs() doesn't
11b34 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e fail very often
11b35 2e 20 41 74 20 6c 65 61 73 74 0d 0a 20 20 20 20 . At least..
11b36 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 ** not while
11b37 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 other file desc
11b38 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 riptors opened b
11b39 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 y the same proce
11b3a 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 2a ss on.. *
11b3b 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 * the same file
11b3c 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f are working. */
11b3d 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 .. p->las
11b3e 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d tErrno = errno;.
11b3f 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f . robust_
11b40 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c close(p, fd, __L
11b41 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 20 20 20 INE__);..
11b42 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 rc = SQLITE_IOE
11b43 52 52 5f 41 43 43 45 53 53 3b 0d 0a 20 20 20 20 RR_ACCESS;..
11b44 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 goto open_fi
11b45 6e 69 73 68 65 64 3b 0d 0a 20 20 20 20 20 20 7d nished;.. }
11b46 0d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 .. useProxy
11b47 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c = !(fsInfo.f_fl
11b48 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0d ags&MNT_LOCAL);.
11b49 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
11b4a 75 73 65 50 72 6f 78 79 20 29 7b 0d 0a 20 20 20 useProxy ){..
11b4b 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e rc = fillInUn
11b4c 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c ixFile(pVfs, fd,
11b4d 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 pFile, zPath, c
11b4e 74 72 6c 46 6c 61 67 73 29 3b 0d 0a 20 20 20 20 trlFlags);..
11b4f 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
11b50 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
11b51 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 rc = proxyTransf
11b52 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 ormUnixFile((uni
11b53 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a xFile*)pFile, ":
11b54 61 75 74 6f 3a 22 29 3b 0d 0a 20 20 20 20 20 20 auto:");..
11b55 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
11b56 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
11b57 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f /* Use unixClo
11b58 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 se to clean up t
11b59 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 he resources add
11b5a 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 ed in fillInUnix
11b5b 46 69 6c 65 20 0d 0a 20 20 20 20 20 20 20 20 20 File ..
11b5c 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c ** and clear al
11b5d 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 l the structure'
11b5e 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 s references. S
11b5f 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0d 0a 20 pecifically, ..
11b60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c ** pFil
11b61 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c e->pMethods will
11b62 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 be NULL so sqli
11b63 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 te3OsClose will
11b64 62 65 20 61 20 6e 6f 2d 6f 70 20 0d 0a 20 20 20 be a no-op ..
11b65 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 */..
11b66 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 unixClose(p
11b67 46 69 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 File);..
11b68 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 return rc;..
11b69 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d }.. }
11b6a 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 .. goto ope
11b6b 6e 5f 66 69 6e 69 73 68 65 64 3b 0d 0a 20 20 20 n_finished;..
11b6c 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d }.. }..#endif.
11b6d 0a 20 20 0d 0a 20 20 72 63 20 3d 20 66 69 6c 6c . .. rc = fill
11b6e 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c InUnixFile(pVfs,
11b6f 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 fd, pFile, zPat
11b70 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0d 0a h, ctrlFlags);..
11b71 0d 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a ..open_finished:
11b72 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 .. if( rc!=SQLI
11b73 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73 71 TE_OK ){.. sq
11b74 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 lite3_free(p->pU
11b75 6e 75 73 65 64 29 3b 0d 0a 20 20 7d 0d 0a 20 20 nused);.. }..
11b76 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
11b77 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 74 65 .../*..** Delete
11b78 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 the file at zPa
11b79 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 th. If the dirSy
11b7a 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 nc argument is t
11b7b 72 75 65 2c 20 66 73 79 6e 63 28 29 0d 0a 2a 2a rue, fsync()..**
11b7c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 the directory a
11b7d 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 fter deleting th
11b7e 65 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 e file...*/..sta
11b7f 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 tic int unixDele
11b80 74 65 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 te(.. sqlite3_v
11b81 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 fs *NotUsed,
11b82 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 /* VFS containi
11b83 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 ng this as the x
11b84 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f Delete method */
11b85 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
11b86 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a zPath, /*
11b87 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f Name of file to
11b88 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0d 0a be deleted */..
11b89 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 int dirSync
11b8a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
11b8b 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 f true, fsync()
11b8c 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 directory after
11b8d 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f deleting file */
11b8e 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d ..){.. int rc =
11b8f 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 55 SQLITE_OK;.. U
11b90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
11b91 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 53 69 6d NotUsed);.. Sim
11b92 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 ulateIOError(ret
11b93 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
11b94 5f 44 45 4c 45 54 45 29 3b 0d 0a 20 20 69 66 28 _DELETE);.. if(
11b95 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 osUnlink(zPath)
11b96 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 ==(-1) && errno!
11b97 3d 45 4e 4f 45 4e 54 20 29 7b 0d 0a 20 20 20 20 =ENOENT ){..
11b98 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 return unixLogEr
11b99 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 ror(SQLITE_IOERR
11b9a 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b _DELETE, "unlink
11b9b 22 2c 20 7a 50 61 74 68 29 3b 0d 0a 20 20 7d 0d ", zPath);.. }.
11b9c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
11b9d 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0d DISABLE_DIRSYNC.
11b9e 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 . if( (dirSync
11b9f 26 20 31 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 & 1)!=0 ){..
11ba0 69 6e 74 20 66 64 3b 0d 0a 20 20 20 20 72 63 20 int fd;.. rc
11ba1 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 = osOpenDirector
11ba2 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0d 0a y(zPath, &fd);..
11ba3 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
11ba4 54 45 5f 4f 4b 20 29 7b 0d 0a 23 69 66 20 4f 53 TE_OK ){..#if OS
11ba5 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 20 20 20 20 _VXWORKS..
11ba6 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d if( fsync(fd)==-
11ba7 31 20 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 1 )..#else..
11ba8 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 if( fsync(fd)
11ba9 29 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 )..#endif..
11baa 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d {.. rc =
11bab 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 unixLogError(SQ
11bac 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 LITE_IOERR_DIR_F
11bad 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a SYNC, "fsync", z
11bae 50 61 74 68 29 3b 0d 0a 20 20 20 20 20 20 7d 0d Path);.. }.
11baf 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c . robust_cl
11bb0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e ose(0, fd, __LIN
11bb1 45 5f 5f 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 E__);.. }else
11bb2 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
11bb3 43 41 4e 54 4f 50 45 4e 20 29 7b 0d 0a 20 20 20 CANTOPEN ){..
11bb4 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
11bb5 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a K;.. }.. }..
11bb6 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75 72 6e #endif.. return
11bb7 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc;..}..../*..*
11bb8 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 * Test the exist
11bb9 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 ance of or acces
11bba 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 s permissions of
11bbb 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 file zPath. The
11bbc 0d 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 ..** test perfor
11bbd 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 med depends on t
11bbe 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 he value of flag
11bbf 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 53 s:..**..** S
11bc0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 QLITE_ACCESS_EXI
11bc1 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 STS: Return 1 if
11bc2 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 the file exists
11bc3 0d 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f ..** SQLITE_
11bc4 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 ACCESS_READWRITE
11bc5 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 : Return 1 if th
11bc6 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 e file is read a
11bc7 6e 64 20 77 72 69 74 61 62 6c 65 2e 0d 0a 2a 2a nd writable...**
11bc8 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 SQLITE_ACCE
11bc9 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 SS_READONLY: Ret
11bca 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c urn 1 if the fil
11bcb 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0d 0a e is readable...
11bcc 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 **..** Otherwise
11bcd 20 72 65 74 75 72 6e 20 30 2e 0d 0a 2a 2f 0d 0a return 0...*/..
11bce 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 static int unixA
11bcf 63 63 65 73 73 28 0d 0a 20 20 73 71 6c 69 74 65 ccess(.. sqlite
11bd0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 3_vfs *NotUsed,
11bd1 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e /* The VFS con
11bd2 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 taining this xAc
11bd3 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0d 0a cess method */..
11bd4 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
11bd5 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 ath, /* Pat
11bd6 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f h of the file to
11bd7 20 65 78 61 6d 69 6e 65 20 2a 2f 0d 0a 20 20 69 examine */.. i
11bd8 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 nt flags,
11bd9 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 /* What d
11bda 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 o we want to lea
11bdb 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 rn about the zPa
11bdc 74 68 20 66 69 6c 65 3f 20 2a 2f 0d 0a 20 20 69 th file? */.. i
11bdd 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 nt *pResOut
11bde 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 /* Write
11bdf 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 result boolean h
11be0 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e ere */..){.. in
11be1 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0d 0a 20 20 t amode = 0;..
11be2 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
11be3 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 53 69 (NotUsed);.. Si
11be4 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 mulateIOError( r
11be5 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
11be6 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0d 0a 20 RR_ACCESS; );..
11be7 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 switch( flags )
11be8 7b 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 {.. case SQLI
11be9 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 TE_ACCESS_EXISTS
11bea 3a 0d 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d :.. amode =
11beb 20 46 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 62 72 F_OK;.. br
11bec 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 53 eak;.. case S
11bed 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 QLITE_ACCESS_REA
11bee 44 57 52 49 54 45 3a 0d 0a 20 20 20 20 20 20 61 DWRITE:.. a
11bef 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b mode = W_OK|R_OK
11bf0 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d ;.. break;.
11bf1 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 . case SQLITE
11bf2 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0d 0a 20 _ACCESS_READ:..
11bf3 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f amode = R_O
11bf4 4b 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b K;.. break;
11bf5 0d 0a 0d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a .... default:
11bf6 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 .. assert(!
11bf7 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 "Invalid flags a
11bf8 72 67 75 6d 65 6e 74 22 29 3b 0d 0a 20 20 7d 0d rgument");.. }.
11bf9 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f . *pResOut = (o
11bfa 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 sAccess(zPath, a
11bfb 6d 6f 64 65 29 3d 3d 30 29 3b 0d 0a 20 20 69 66 mode)==0);.. if
11bfc 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f ( flags==SQLITE_
11bfd 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 ACCESS_EXISTS &&
11bfe 20 2a 70 52 65 73 4f 75 74 20 29 7b 0d 0a 20 20 *pResOut ){..
11bff 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 struct stat bu
11c00 66 3b 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f f;.. if( 0==o
11c01 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 sStat(zPath, &bu
11c02 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a f) && buf.st_siz
11c03 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 2a e==0 ){.. *
11c04 70 52 65 73 4f 75 74 20 3d 20 30 3b 0d 0a 20 20 pResOut = 0;..
11c05 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
11c06 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
11c07 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 75 72 ....../*..** Tur
11c08 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 n a relative pat
11c09 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c hname into a ful
11c0a 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 l pathname. The
11c0b 72 65 6c 61 74 69 76 65 20 70 61 74 68 0d 0a 2a relative path..*
11c0c 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 * is stored as a
11c0d 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 nul-terminated
11c0e 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 string in the bu
11c0f 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 ffer pointed to
11c10 62 79 0d 0a 2a 2a 20 7a 50 61 74 68 2e 20 0d 0a by..** zPath. ..
11c11 2a 2a 0d 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e **..** zOut poin
11c12 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f ts to a buffer o
11c13 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 f at least sqlit
11c14 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d e3_vfs.mxPathnam
11c15 65 20 62 79 74 65 73 20 0d 0a 2a 2a 20 28 69 6e e bytes ..** (in
11c16 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f this case, MAX_
11c17 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e PATHNAME bytes).
11c18 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 The full-path i
11c19 73 20 77 72 69 74 74 65 6e 20 74 6f 0d 0a 2a 2a s written to..**
11c1a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 this buffer bef
11c1b 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a ore returning...
11c1c 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 */..static int u
11c1d 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 nixFullPathname(
11c1e 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .. sqlite3_vfs
11c1f 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 *pVfs,
11c20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
11c21 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 vfs object */..
11c22 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
11c23 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f th, /
11c24 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 * Possibly relat
11c25 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a ive input path *
11c26 2f 0d 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 /.. int nOut,
11c27 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11c28 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 /* Size of ou
11c29 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 tput buffer in b
11c2a 79 74 65 73 20 2a 2f 0d 0a 20 20 63 68 61 72 20 ytes */.. char
11c2b 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 *zOut
11c2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 /* Outp
11c2d 75 74 20 62 75 66 66 65 72 20 2a 2f 0d 0a 29 7b ut buffer */..){
11c2e 0d 0a 0d 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 .... /* It's od
11c2f 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e d to simulate an
11c30 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 io-error here,
11c31 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 but really this
11c32 69 73 20 6a 75 73 74 0d 0a 20 20 2a 2a 20 75 73 is just.. ** us
11c33 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 ing the io-error
11c34 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 infrastructure
11c35 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c to test that SQL
11c36 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 ite handles this
11c37 0d 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 .. ** function
11c38 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 failing. This fu
11c39 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 nction could fai
11c3a 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c l if, for exampl
11c3b 65 2c 20 74 68 65 0d 0a 20 20 2a 2a 20 63 75 72 e, the.. ** cur
11c3c 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 rent working dir
11c3d 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 ectory has been
11c3e 75 6e 6c 69 6e 6b 65 64 2e 0d 0a 20 20 2a 2f 0d unlinked... */.
11c3f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
11c40 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 or( return SQLIT
11c41 45 5f 45 52 52 4f 52 20 29 3b 0d 0a 0d 0a 20 20 E_ERROR );....
11c42 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 assert( pVfs->mx
11c43 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 Pathname==MAX_PA
11c44 54 48 4e 41 4d 45 20 29 3b 0d 0a 20 20 55 4e 55 THNAME );.. UNU
11c45 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 SED_PARAMETER(pV
11c46 66 73 29 3b 0d 0a 0d 0a 20 20 7a 4f 75 74 5b 6e fs);.... zOut[n
11c47 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0d 0a Out-1] = '\0';..
11c48 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d if( zPath[0]==
11c49 27 2f 27 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 '/' ){.. sqli
11c4a 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 te3_snprintf(nOu
11c4b 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a t, zOut, "%s", z
11c4c 50 61 74 68 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b Path);.. }else{
11c4d 0d 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0d .. int nCwd;.
11c4e 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 . if( osGetcw
11c4f 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d d(zOut, nOut-1)=
11c50 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 =0 ){.. ret
11c51 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 urn unixLogError
11c52 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e (SQLITE_CANTOPEN
11c53 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c _BKPT, "getcwd",
11c54 20 7a 50 61 74 68 29 3b 0d 0a 20 20 20 20 7d 0d zPath);.. }.
11c55 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 . nCwd = (int
11c56 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0d 0a )strlen(zOut);..
11c57 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
11c58 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 intf(nOut-nCwd,
11c59 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 &zOut[nCwd], "/%
11c5a 73 22 2c 20 7a 50 61 74 68 29 3b 0d 0a 20 20 7d s", zPath);.. }
11c5b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
11c5c 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 23 69 E_OK;..}......#i
11c5d 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
11c5e 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e T_LOAD_EXTENSION
11c5f 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 ../*..** Interfa
11c60 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 ces for opening
11c61 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 a shared library
11c62 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 , finding entry
11c63 70 6f 69 6e 74 73 0d 0a 2a 2a 20 77 69 74 68 69 points..** withi
11c64 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 n the shared lib
11c65 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e rary, and closin
11c66 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 g the shared lib
11c67 72 61 72 79 2e 0d 0a 2a 2f 0d 0a 23 69 6e 63 6c rary...*/..#incl
11c68 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0d 0a 73 ude <dlfcn.h>..s
11c69 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 tatic void *unix
11c6a 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 DlOpen(sqlite3_v
11c6b 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e fs *NotUsed, con
11c6c 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
11c6d 6d 65 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 me){.. UNUSED_P
11c6e 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 ARAMETER(NotUsed
11c6f 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f );.. return dlo
11c70 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 pen(zFilename, R
11c71 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 TLD_NOW | RTLD_G
11c72 4c 4f 42 41 4c 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a LOBAL);..}..../*
11c73 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c ..** SQLite call
11c74 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 s this function
11c75 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 immediately afte
11c76 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 r a call to unix
11c77 44 6c 53 79 6d 28 29 20 6f 72 0d 0a 2a 2a 20 75 DlSym() or..** u
11c78 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c nixDlOpen() fail
11c79 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c s (returns a nul
11c7a 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 l pointer). If a
11c7b 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 more detailed e
11c7c 72 72 6f 72 0d 0a 2a 2a 20 6d 65 73 73 61 67 65 rror..** message
11c7d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 is available, i
11c7e 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 t is written to
11c7f 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 zBufOut. If no e
11c80 72 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 2a 2a rror message..**
11c81 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a is available, z
11c82 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 BufOut is left u
11c83 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 nmodified and SQ
11c84 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61 Lite uses a defa
11c85 75 6c 74 0d 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 ult..** error me
11c86 73 73 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ssage...*/..stat
11c87 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 ic void unixDlEr
11c88 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 ror(sqlite3_vfs
11c89 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 *NotUsed, int nB
11c8a 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 uf, char *zBufOu
11c8b 74 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 t){.. const cha
11c8c 72 20 2a 7a 45 72 72 3b 0d 0a 20 20 55 4e 55 53 r *zErr;.. UNUS
11c8d 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 ED_PARAMETER(Not
11c8e 55 73 65 64 29 3b 0d 0a 20 20 75 6e 69 78 45 6e Used);.. unixEn
11c8f 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 7a terMutex();.. z
11c90 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b Err = dlerror();
11c91 0d 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0d .. if( zErr ){.
11c92 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 . sqlite3_snp
11c93 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 rintf(nBuf, zBuf
11c94 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 Out, "%s", zErr)
11c95 3b 0d 0a 20 20 7d 0d 0a 20 20 75 6e 69 78 4c 65 ;.. }.. unixLe
11c96 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 7d 0d 0a aveMutex();..}..
11c97 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e static void (*un
11c98 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f ixDlSym(sqlite3_
11c99 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f vfs *NotUsed, vo
11c9a 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 id *p, const cha
11c9b 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0d r*zSym))(void){.
11c9c 0a 20 20 2f 2a 20 0d 0a 20 20 2a 2a 20 47 43 43 . /* .. ** GCC
11c9d 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d with -pedantic-
11c9e 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 errors says that
11c9f 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c C90 does not al
11ca0 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 low a void* to b
11ca1 65 0d 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 e.. ** cast int
11ca2 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 o a pointer to a
11ca3 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 function. And
11ca4 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 yet the library
11ca5 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0d dlsym() routine.
11ca6 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 . ** returns a
11ca7 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 void* which is r
11ca8 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 eally a pointer
11ca9 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 to a function.
11caa 53 6f 20 68 6f 77 20 64 6f 20 77 65 0d 0a 20 20 So how do we..
11cab 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 ** use dlsym() w
11cac 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 ith -pedantic-er
11cad 72 6f 72 73 3f 0d 0a 20 20 2a 2a 0d 0a 20 20 2a rors?.. **.. *
11cae 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c * Variable x bel
11caf 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f ow is defined to
11cb0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f be a pointer to
11cb1 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 a function taki
11cb2 6e 67 0d 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 ng.. ** paramet
11cb3 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f ers void* and co
11cb4 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 nst char* and re
11cb5 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 turning a pointe
11cb6 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e r to a function.
11cb7 0d 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 .. ** We initia
11cb8 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e lize x by assign
11cb9 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 ing it a pointer
11cba 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 to the dlsym()
11cbb 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 2a 2a 20 function... **
11cbc 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 (That assignment
11cbd 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 requires a cast
11cbe 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c .) Then we call
11cbf 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 the function th
11cc0 61 74 0d 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 at.. ** x point
11cc1 73 20 74 6f 2e 20 20 0d 0a 20 20 2a 2a 0d 0a 20 s to. .. **..
11cc2 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 ** This work-ar
11cc3 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 ound is unlikely
11cc4 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 to work correct
11cc5 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d ly on any system
11cc6 20 77 68 65 72 65 0d 0a 20 20 2a 2a 20 79 6f 75 where.. ** you
11cc7 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 really cannot c
11cc8 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 ast a function p
11cc9 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 ointer into void
11cca 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e *. But then, on
11ccb 20 74 68 65 0d 0a 20 20 2a 2a 20 6f 74 68 65 72 the.. ** other
11ccc 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 hand, dlsym() w
11ccd 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 ill not work on
11cce 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 such a system ei
11ccf 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 ther, so we have
11cd0 0d 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c .. ** not reall
11cd1 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e y lost anything.
11cd2 0d 0a 20 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 .. */.. void (
11cd3 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 *(*x)(void*,cons
11cd4 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b t char*))(void);
11cd5 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
11cd6 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a ETER(NotUsed);..
11cd7 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 x = (void(*(*)
11cd8 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 (void*,const cha
11cd9 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d r*))(void))dlsym
11cda 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 ;.. return (*x)
11cdb 28 70 2c 20 7a 53 79 6d 29 3b 0d 0a 7d 0d 0a 73 (p, zSym);..}..s
11cdc 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 tatic void unixD
11cdd 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 lClose(sqlite3_v
11cde 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 fs *NotUsed, voi
11cdf 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0d 0a 20 20 d *pHandle){..
11ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
11ce1 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 64 6c (NotUsed);.. dl
11ce2 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0d close(pHandle);.
11ce3 0a 7d 0d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 .}..#else /* if
11ce4 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 SQLITE_OMIT_LOAD
11ce5 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 _EXTENSION is de
11ce6 66 69 6e 65 64 3a 20 2a 2f 0d 0a 20 20 23 64 65 fined: */.. #de
11ce7 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 fine unixDlOpen
11ce8 20 30 0d 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 0.. #define un
11ce9 69 78 44 6c 45 72 72 6f 72 20 30 0d 0a 20 20 23 ixDlError 0.. #
11cea 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d define unixDlSym
11ceb 20 20 20 30 0d 0a 20 20 23 64 65 66 69 6e 65 20 0.. #define
11cec 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0d 0a 23 unixDlClose 0..#
11ced 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
11cee 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 Write nBuf bytes
11cef 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 of random data
11cf0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 to the supplied
11cf1 62 75 66 66 65 72 20 7a 42 75 66 2e 0d 0a 2a 2f buffer zBuf...*/
11cf2 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 ..static int uni
11cf3 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 xRandomness(sqli
11cf4 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 te3_vfs *NotUsed
11cf5 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 , int nBuf, char
11cf6 20 2a 7a 42 75 66 29 7b 0d 0a 20 20 55 4e 55 53 *zBuf){.. UNUS
11cf7 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 ED_PARAMETER(Not
11cf8 55 73 65 64 29 3b 0d 0a 20 20 61 73 73 65 72 74 Used);.. assert
11cf9 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 ((size_t)nBuf>=(
11cfa 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 sizeof(time_t)+s
11cfb 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0d 0a 0d izeof(int)));...
11cfc 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f . /* We have to
11cfd 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 initialize zBuf
11cfe 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 to prevent valg
11cff 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 rind from report
11d00 69 6e 67 0d 0a 20 20 2a 2a 20 65 72 72 6f 72 73 ing.. ** errors
11d01 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 . The reports i
11d02 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e ssued by valgrin
11d03 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 d are incorrect
11d04 2d 20 77 65 20 77 6f 75 6c 64 0d 0a 20 20 2a 2a - we would.. **
11d05 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 prefer that the
11d06 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 randomness be i
11d07 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 ncreased by maki
11d08 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0d 0a 20 ng use of the..
11d09 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 ** uninitialize
11d0a 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 d space in zBuf
11d0b 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 - but valgrind e
11d0c 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f rrors tend to wo
11d0d 72 72 79 0d 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 rry.. ** some u
11d0e 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 sers. Rather th
11d0f 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 an argue, it see
11d10 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 ms easier just t
11d11 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 o initialize..
11d12 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 ** the whole arr
11d13 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 ay and silence v
11d14 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 algrind, even if
11d15 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 that means less
11d16 20 72 61 6e 64 6f 6d 6e 65 73 73 0d 0a 20 20 2a randomness.. *
11d17 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 * in the random
11d18 73 65 65 64 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a seed... **.. *
11d19 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 * When testing,
11d1a 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 initializing zBu
11d1b 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 f[] to zero is a
11d1c 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 ll we do. That
11d1d 6d 65 61 6e 73 0d 0a 20 20 2a 2a 20 74 68 61 74 means.. ** that
11d1e 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 we always use t
11d1f 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e he same random n
11d20 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 umber sequence.
11d21 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0d This makes the.
11d22 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 . ** tests repe
11d23 61 74 61 62 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 atable... */..
11d24 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c memset(zBuf, 0,
11d25 20 6e 42 75 66 29 3b 0d 0a 23 69 66 20 21 64 65 nBuf);..#if !de
11d26 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 fined(SQLITE_TES
11d27 54 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 69 6e 74 T).. {.. int
11d28 20 70 69 64 2c 20 66 64 3b 0d 0a 20 20 20 20 66 pid, fd;.. f
11d29 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 d = robust_open(
11d2a 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 "/dev/urandom",
11d2b 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0d 0a 20 O_RDONLY, 0);..
11d2c 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0d 0a if( fd<0 ){..
11d2d 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0d time_t t;.
11d2e 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b . time(&t);
11d2f 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a .. memcpy(z
11d30 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 Buf, &t, sizeof(
11d31 74 29 29 3b 0d 0a 20 20 20 20 20 20 70 69 64 20 t));.. pid
11d32 3d 20 67 65 74 70 69 64 28 29 3b 0d 0a 20 20 20 = getpid();..
11d33 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b memcpy(&zBuf[
11d34 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 sizeof(t)], &pid
11d35 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0d , sizeof(pid));.
11d36 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 . assert( s
11d37 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 izeof(t)+sizeof(
11d38 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 pid)<=(size_t)nB
11d39 75 66 20 29 3b 0d 0a 20 20 20 20 20 20 6e 42 75 uf );.. nBu
11d3a 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 f = sizeof(t) +
11d3b 73 69 7a 65 6f 66 28 70 69 64 29 3b 0d 0a 20 20 sizeof(pid);..
11d3c 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
11d3d 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65 61 do{ nBuf = osRea
11d3e 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 d(fd, zBuf, nBuf
11d3f 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66 3c ); }while( nBuf<
11d40 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 0 && errno==EINT
11d41 52 20 29 3b 0d 0a 20 20 20 20 20 20 72 6f 62 75 R );.. robu
11d42 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 st_close(0, fd,
11d43 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a 20 20 20 20 __LINE__);..
11d44 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a }.. }..#endif..
11d45 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0d 0a return nBuf;..
11d46 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 6c }....../*..** Sl
11d47 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 eep for a little
11d48 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 while. Return
11d49 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 the amount of ti
11d4a 6d 65 20 73 6c 65 70 74 2e 0d 0a 2a 2a 20 54 68 me slept...** Th
11d4b 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 e argument is th
11d4c 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 e number of micr
11d4d 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 oseconds we want
11d4e 20 74 6f 20 73 6c 65 65 70 2e 0d 0a 2a 2a 20 54 to sleep...** T
11d4f 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
11d50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
11d51 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 microseconds of
11d52 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0d sleep actually.
11d53 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 .** requested fr
11d54 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e om the underlyin
11d55 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 g operating syst
11d56 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 em, a number whi
11d57 63 68 0d 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 ch..** might be
11d58 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 greater than or
11d59 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 equal to the arg
11d5a 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c ument, but not l
11d5b 65 73 73 0d 0a 2a 2a 20 74 68 61 6e 20 74 68 65 ess..** than the
11d5c 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a argument...*/..
11d5d 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 static int unixS
11d5e 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 leep(sqlite3_vfs
11d5f 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d *NotUsed, int m
11d60 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0d 0a 23 icroseconds){..#
11d61 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 if OS_VXWORKS..
11d62 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 struct timespec
11d63 20 73 70 3b 0d 0a 0d 0a 20 20 73 70 2e 74 76 5f sp;.... sp.tv_
11d64 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e sec = microsecon
11d65 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0d 0a 20 ds / 1000000;..
11d66 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d sp.tv_nsec = (m
11d67 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 icroseconds % 10
11d68 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0d 0a 00000) * 1000;..
11d69 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c nanosleep(&sp,
11d6a 20 4e 55 4c 4c 29 3b 0d 0a 20 20 55 4e 55 53 45 NULL);.. UNUSE
11d6b 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 D_PARAMETER(NotU
11d6c 73 65 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 sed);.. return
11d6d 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0d 0a 23 microseconds;..#
11d6e 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 elif defined(HAV
11d6f 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 E_USLEEP) && HAV
11d70 45 5f 55 53 4c 45 45 50 0d 0a 20 20 75 73 6c 65 E_USLEEP.. usle
11d71 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 ep(microseconds)
11d72 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ;.. UNUSED_PARA
11d73 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d METER(NotUsed);.
11d74 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 . return micros
11d75 65 63 6f 6e 64 73 3b 0d 0a 23 65 6c 73 65 0d 0a econds;..#else..
11d76 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 int seconds =
11d77 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 (microseconds+99
11d78 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0d 0a 9999)/1000000;..
11d79 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 sleep(seconds)
11d7a 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ;.. UNUSED_PARA
11d7b 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d METER(NotUsed);.
11d7c 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 . return second
11d7d 73 2a 31 30 30 30 30 30 30 3b 0d 0a 23 65 6e 64 s*1000000;..#end
11d7e 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 if..}..../*..**
11d7f 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 The following va
11d80 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 riable, if set t
11d81 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c o a non-zero val
11d82 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 ue, is interpret
11d83 65 64 20 61 73 0d 0a 2a 2a 20 74 68 65 20 6e 75 ed as..** the nu
11d84 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 mber of seconds
11d85 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 since 1970 and i
11d86 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 s used to set th
11d87 65 20 72 65 73 75 6c 74 20 6f 66 0d 0a 2a 2a 20 e result of..**
11d88 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 sqlite3OsCurrent
11d89 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 Time() during te
11d8a 73 74 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 sting...*/..#ifd
11d8b 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0d 0a ef SQLITE_TEST..
11d8c 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
11d8d 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 qlite3_current_t
11d8e 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b ime = 0; /* Fak
11d8f 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e e system time in
11d90 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 seconds since 1
11d91 39 37 30 2e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 970. */..#endif.
11d92 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 .../*..** Find t
11d93 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 he current time
11d94 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f (in Universal Co
11d95 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e ordinated Time).
11d96 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 Write into *pi
11d97 4e 6f 77 0d 0a 2a 2a 20 74 68 65 20 63 75 72 72 Now..** the curr
11d98 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 ent time and dat
11d99 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 e as a Julian Da
11d9a 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 y number times 8
11d9b 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0d 0a 6_400_000. In..
11d9c 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 ** other words,
11d9d 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f write into *piNo
11d9e 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 w the number of
11d9f 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e milliseconds sin
11da0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0d 0a 2a ce the Julian..*
11da1 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 * epoch of noon
11da2 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 in Greenwich on
11da3 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 November 24, 471
11da4 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 4 B.C according
11da5 74 6f 20 74 68 65 0d 0a 2a 2a 20 70 72 6f 6c 65 to the..** prole
11da6 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 ptic Gregorian c
11da7 61 6c 65 6e 64 61 72 2e 0d 0a 2a 2a 0d 0a 2a 2a alendar...**..**
11da8 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 On success, ret
11da9 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 urn SQLITE_OK.
11daa 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 Return SQLITE_ER
11dab 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 ROR if the time
11dac 61 6e 64 20 64 61 74 65 20 0d 0a 2a 2a 20 63 61 and date ..** ca
11dad 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0d 0a nnot be found...
11dae 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 */..static int u
11daf 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e nixCurrentTimeIn
11db0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 t64(sqlite3_vfs
11db1 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 *NotUsed, sqlite
11db2 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 3_int64 *piNow){
11db3 0d 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 .. static const
11db4 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 sqlite3_int64 u
11db5 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 nixEpoch = 24405
11db6 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 875*(sqlite3_int
11db7 36 34 29 38 36 34 30 30 30 30 3b 0d 0a 20 20 69 64)8640000;.. i
11db8 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
11db9 4b 3b 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 K;..#if defined(
11dba 4e 4f 5f 47 45 54 54 4f 44 29 0d 0a 20 20 74 69 NO_GETTOD).. ti
11dbb 6d 65 5f 74 20 74 3b 0d 0a 20 20 74 69 6d 65 28 me_t t;.. time(
11dbc 26 74 29 3b 0d 0a 20 20 2a 70 69 4e 6f 77 20 3d &t);.. *piNow =
11dbd 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 ((sqlite3_int64
11dbe 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 )t)*1000 + unixE
11dbf 70 6f 63 68 3b 0d 0a 23 65 6c 69 66 20 4f 53 5f poch;..#elif OS_
11dc0 56 58 57 4f 52 4b 53 0d 0a 20 20 73 74 72 75 63 VXWORKS.. struc
11dc1 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b t timespec sNow;
11dc2 0d 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d .. clock_gettim
11dc3 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 e(CLOCK_REALTIME
11dc4 2c 20 26 73 4e 6f 77 29 3b 0d 0a 20 20 2a 70 69 , &sNow);.. *pi
11dc5 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 Now = unixEpoch
11dc6 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f + 1000*(sqlite3_
11dc7 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 int64)sNow.tv_se
11dc8 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 c + sNow.tv_nsec
11dc9 2f 31 30 30 30 30 30 30 3b 0d 0a 23 65 6c 73 65 /1000000;..#else
11dca 0d 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 .. struct timev
11dcb 61 6c 20 73 4e 6f 77 3b 0d 0a 20 20 69 66 28 20 al sNow;.. if(
11dcc 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e gettimeofday(&sN
11dcd 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0d 0a 20 20 ow, 0)==0 ){..
11dce 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 *piNow = unixE
11dcf 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c poch + 1000*(sql
11dd0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e ite3_int64)sNow.
11dd1 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 tv_sec + sNow.tv
11dd2 5f 75 73 65 63 2f 31 30 30 30 3b 0d 0a 20 20 7d _usec/1000;.. }
11dd3 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 20 3d 20 else{.. rc =
11dd4 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 SQLITE_ERROR;..
11dd5 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 }..#endif....#i
11dd6 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
11dd7 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f .. if( sqlite3_
11dd8 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0d current_time ){.
11dd9 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 . *piNow = 10
11dda 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 00*(sqlite3_int6
11ddb 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 4)sqlite3_curren
11ddc 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f t_time + unixEpo
11ddd 63 68 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 ch;.. }..#endif
11dde 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
11ddf 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a ETER(NotUsed);..
11de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
11de1 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 .../*..** Find t
11de2 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 he current time
11de3 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f (in Universal Co
11de4 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e ordinated Time).
11de5 20 20 57 72 69 74 65 20 74 68 65 0d 0a 2a 2a 20 Write the..**
11de6 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 current time and
11de7 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 date as a Julia
11de8 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 n Day number int
11de9 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0d 0a 2a 2a o *prNow and..**
11dea 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 return 0. Retu
11deb 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 rn 1 if the time
11dec 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 and date cannot
11ded 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 2a 2f 0d 0a be found...*/..
11dee 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 static int unixC
11def 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 urrentTime(sqlit
11df0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c e3_vfs *NotUsed,
11df1 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b double *prNow){
11df2 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 .. sqlite3_int6
11df3 34 20 69 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 4 i = 0;.. int
11df4 72 63 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 rc;.. UNUSED_PA
11df5 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 RAMETER(NotUsed)
11df6 3b 0d 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 ;.. rc = unixCu
11df7 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 rrentTimeInt64(0
11df8 2c 20 26 69 29 3b 0d 0a 20 20 2a 70 72 4e 6f 77 , &i);.. *prNow
11df9 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b = i/86400000.0;
11dfa 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
11dfb 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 65 20 61 }..../*..** We a
11dfc 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 dded the xGetLas
11dfd 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 tError() method
11dfe 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 with the intenti
11dff 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0d on of providing.
11e00 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c .** better low-l
11e01 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 evel error messa
11e02 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 ges when operati
11e03 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 ng-system proble
11e04 6d 73 20 63 6f 6d 65 20 75 70 0d 0a 2a 2a 20 64 ms come up..** d
11e05 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 uring SQLite ope
11e06 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 ration. But so
11e07 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 far, none of tha
11e08 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 t has been imple
11e09 6d 65 6e 74 65 64 0d 0a 2a 2a 20 69 6e 20 74 68 mented..** in th
11e0a 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 e core. So this
11e0b 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 routine is neve
11e0c 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e r called. For n
11e0d 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 ow, it is merely
11e0e 0d 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c ..** a place-hol
11e0f 64 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 der...*/..static
11e10 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 int unixGetLast
11e11 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 Error(sqlite3_vf
11e12 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 s *NotUsed, int
11e13 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a NotUsed2, char *
11e14 4e 6f 74 55 73 65 64 33 29 7b 0d 0a 20 20 55 4e NotUsed3){.. UN
11e15 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e USED_PARAMETER(N
11e16 6f 74 55 73 65 64 29 3b 0d 0a 20 20 55 4e 55 53 otUsed);.. UNUS
11e17 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 ED_PARAMETER(Not
11e18 55 73 65 64 32 29 3b 0d 0a 20 20 55 4e 55 53 45 Used2);.. UNUSE
11e19 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 D_PARAMETER(NotU
11e1a 73 65 64 33 29 3b 0d 0a 20 20 72 65 74 75 72 6e sed3);.. return
11e1b 20 30 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 0;..}....../*..
11e1c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e1d 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 ******** End of
11e1e 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 sqlite3_vfs meth
11e1f 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ods ************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
11e21 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
11e22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e24 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e25 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
11e26 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
11e27 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e28 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e29 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e2b 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***..***********
11e2c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 ***************
11e2d 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b Begin Proxy Lock
11e2e 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ing ************
11e2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11e30 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 50 72 6f ****..**..** Pro
11e31 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 xy locking is a
11e32 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 "uber-locking-me
11e33 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 thod" in this se
11e34 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 nse: It uses th
11e35 65 0d 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b e..** other lock
11e36 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 ing methods on s
11e37 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 econdary lock fi
11e38 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b les. Proxy lock
11e39 69 6e 67 20 69 73 20 61 0d 0a 2a 2a 20 6d 65 74 ing is a..** met
11e3a 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 a-layer over top
11e3b 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 of the primitiv
11e3c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d e locking implem
11e3d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f ented above. Fo
11e3e 72 0d 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f r..** this reaso
11e3f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 n, the division
11e40 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 that implements
11e41 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 of proxy locking
11e42 20 69 73 20 64 65 66 65 72 72 65 64 0d 0a 2a 2a is deferred..**
11e43 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 until late in t
11e44 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 he file (here) a
11e45 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 fter all of the
11e46 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 other I/O method
11e47 73 20 68 61 76 65 0d 0a 2a 2a 20 62 65 65 6e 20 s have..** been
11e48 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 defined - so tha
11e49 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 t the primitive
11e4a 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 locking methods
11e4b 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0d 0a 2a are available..*
11e4c 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f * as services to
11e4d 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 help with the i
11e4e 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
11e4f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0d proxy locking..
11e50 0a 2a 2a 0d 0a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a .**..****..**..*
11e51 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f * The default lo
11e52 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e cking schemes in
11e53 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 SQLite use byte
11e54 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 -range locks on
11e55 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 the..** database
11e56 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e file to coordin
11e57 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 ate safe, concur
11e58 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d rent access by m
11e59 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0d ultiple readers.
11e5a 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 .** and writers
11e5b 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f [http://sqlite.o
11e5c 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d rg/lockingv3.htm
11e5d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 l]. The five fi
11e5e 6c 65 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2a 20 73 le locking..** s
11e5f 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c tates (UNLOCKED,
11e60 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 PENDING, SHARED
11e61 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c , RESERVED, EXCL
11e62 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 USIVE) are imple
11e63 6d 65 6e 74 65 64 0d 0a 2a 2a 20 61 73 20 50 4f mented..** as PO
11e64 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 SIX read & write
11e65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 locks over fixe
11e66 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f d set of locatio
11e67 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0d ns (via fsctl),.
11e68 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 .** on AFP and S
11e69 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 MB only exclusiv
11e6a 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 e byte-range loc
11e6b 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 ks are available
11e6c 20 76 69 61 20 66 73 63 74 6c 0d 0a 2a 2a 20 77 via fsctl..** w
11e6d 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 ith _IOWR('z', 2
11e6e 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 3, struct ByteRa
11e6f 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 ngeLockPB2) to t
11e70 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 rack the same 5
11e71 73 74 61 74 65 73 2e 0d 0a 2a 2a 20 54 6f 20 73 states...** To s
11e72 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 imulate a F_RDLC
11e73 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 K on the shared
11e74 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 range, on AFP a
11e75 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 randomly selecte
11e76 64 0d 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e d..** address in
11e77 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 the shared rang
11e78 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 e is taken for a
11e79 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 SHARED lock, th
11e7a 65 20 65 6e 74 69 72 65 0d 0a 2a 2a 20 73 68 61 e entire..** sha
11e7b 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b red range is tak
11e7c 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 en for an EXCLUS
11e7d 49 56 45 20 6c 6f 63 6b 29 3a 0d 0a 2a 2a 0d 0a IVE lock):..**..
11e7e 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f ** PENDING_
11e7f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 BYTE 0x40
11e80 30 30 30 30 30 30 09 09 20 20 20 09 0d 0a 2a 2a 000000.. ...**
11e81 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 RESERVED_B
11e82 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 YTE 0x4000
11e83 30 30 30 31 0d 0a 2a 2a 20 20 20 20 20 20 53 48 0001..** SH
11e84 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 ARED_RANGE
11e85 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 0x40000002 ->
11e86 30 78 34 30 30 30 30 32 30 30 0d 0a 2a 2a 0d 0a 0x40000200..**..
11e87 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 ** This works we
11e88 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 ll on the local
11e89 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 file system, but
11e8a 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 shows a nearly
11e8b 31 30 30 78 0d 0a 2a 2a 20 73 6c 6f 77 64 6f 77 100x..** slowdow
11e8c 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 n in read perfor
11e8d 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 mance on AFP bec
11e8e 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 ause the AFP cli
11e8f 65 6e 74 20 64 69 73 61 62 6c 65 73 0d 0a 2a 2a ent disables..**
11e90 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 the read cache
11e91 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 when byte-range
11e92 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e locks are presen
11e93 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 t. Enabling the
11e94 20 72 65 61 64 0d 0a 2a 2a 20 63 61 63 68 65 20 read..** cache
11e95 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 exposes a cache
11e96 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 coherency proble
11e97 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e m that is presen
11e98 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0d 0a 2a t on all OS X..*
11e99 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 * supported netw
11e9a 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 ork file systems
11e9b 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 . NFS and AFP b
11e9c 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0d oth observe the.
11e9d 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 .** close-to-ope
11e9e 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 n semantics for
11e9f 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 ensuring cache c
11ea0 6f 68 65 72 65 6e 63 79 0d 0a 2a 2a 20 5b 68 74 oherency..** [ht
11ea1 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 tp://nfs.sourcef
11ea2 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 orge.net/#faq_a8
11ea3 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f ], which does no
11ea4 74 20 65 66 66 65 63 74 69 76 65 6c 79 0d 0a 2a t effectively..*
11ea5 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 * address the re
11ea6 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 quirements for c
11ea7 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 oncurrent databa
11ea8 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c se access by mul
11ea9 74 69 70 6c 65 0d 0a 2a 2a 20 72 65 61 64 65 72 tiple..** reader
11eaa 73 20 61 6e 64 20 77 72 69 74 65 72 73 0d 0a 2a s and writers..*
11eab 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 * [http://www.na
11eac 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d bble.com/SQLite-
11ead 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 on-NFS-cache-coh
11eae 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 erency-td1565570
11eaf 31 2e 68 74 6d 6c 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 1.html]...**..**
11eb0 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 To address the
11eb1 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 performance and
11eb2 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 cache coherency
11eb3 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 issues, proxy fi
11eb4 6c 65 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2a 20 63 le locking..** c
11eb5 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 hanges the way d
11eb6 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 atabase access i
11eb7 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 s controlled by
11eb8 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 limiting access
11eb9 74 6f 20 61 0d 0a 2a 2a 20 73 69 6e 67 6c 65 20 to a..** single
11eba 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 host at a time a
11ebb 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c nd moving file l
11ebc 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 ocks off of the
11ebd 64 61 74 61 62 61 73 65 20 66 69 6c 65 0d 0a 2a database file..*
11ebe 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f * and onto a pro
11ebf 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c xy file on the l
11ec0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d ocal file system
11ec1 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 . ..**..**..**
11ec2 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b Using proxy lock
11ec3 73 0d 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d s..** ----------
11ec4 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a 2a 0d 0a 2a 2a 20 -------..**..**
11ec5 43 20 41 50 49 73 0d 0a 2a 2a 0d 0a 2a 2a 20 20 C APIs..**..**
11ec6 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e sqlite3_file_con
11ec7 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c trol(db, dbname,
11ec8 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b SQLITE_SET_LOCK
11ec9 50 52 4f 58 59 46 49 4c 45 2c 0d 0a 2a 2a 20 20 PROXYFILE,..**
11eca 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11ecb 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 <proxy_path
11ecc 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0d 0a > | ":auto:");..
11ecd 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 ** sqlite3_file
11ece 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e _control(db, dbn
11ecf 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f ame, SQLITE_GET_
11ed0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 LOCKPROXYFILE, &
11ed1 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0d 0a <proxy_path>);..
11ed2 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 20 70 **..**..** SQL p
11ed3 72 61 67 6d 61 73 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ragmas..**..**
11ed4 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 PRAGMA [database
11ed5 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c .]lock_proxy_fil
11ed6 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c e=<proxy_path> |
11ed7 20 3a 61 75 74 6f 3a 0d 0a 2a 2a 20 20 50 52 41 :auto:..** PRA
11ed8 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c GMA [database.]l
11ed9 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0d 0a ock_proxy_file..
11eda 2a 2a 0d 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e **..** Specifyin
11edb 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 g ":auto:" means
11edc 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 that if there i
11edd 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 s a conch file w
11ede 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0d 0a ith a matching..
11edf 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 ** host ID in it
11ee0 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 , the proxy path
11ee1 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 in the conch fi
11ee2 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c le will be used,
11ee3 20 6f 74 68 65 72 77 69 73 65 0d 0a 2a 2a 20 61 otherwise..** a
11ee4 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 proxy path base
11ee5 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 d on the user's
11ee6 74 65 6d 70 20 64 69 72 0d 0a 2a 2a 20 28 76 69 temp dir..** (vi
11ee7 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 a confstr(_CS_DA
11ee8 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 RWIN_USER_TEMP_D
11ee9 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 IR,...)) will be
11eea 20 75 73 65 64 20 61 6e 64 20 74 68 65 0d 0a 2a used and the..*
11eeb 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 * actual proxy f
11eec 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 ile name is gene
11eed 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e rated from the n
11eee 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 ame and path of
11eef 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 the..** database
11ef0 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d file. For exam
11ef1 70 6c 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ple:..**..**
11ef2 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 For database
11ef3 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f path "/Users/me/
11ef4 66 6f 6f 2e 64 62 22 20 0d 0a 2a 2a 20 20 20 20 foo.db" ..**
11ef5 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 The lock path
11ef6 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 will be "<tmpdi
11ef7 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f r>/sqliteplocks/
11ef8 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 _Users_me_foo.db
11ef9 3a 61 75 74 6f 3a 22 29 0d 0a 2a 2a 0d 0a 2a 2a :auto:")..**..**
11efa 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f Once a lock pro
11efb 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 xy is configured
11efc 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 for a database
11efd 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 connection, it c
11efe 61 6e 20 6e 6f 74 0d 0a 2a 2a 20 62 65 20 72 65 an not..** be re
11eff 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 moved, however i
11f00 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 t may be switche
11f01 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 d to a different
11f02 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0d proxy path via.
11f03 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 .** the above AP
11f04 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 Is (assuming the
11f05 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e conch file is n
11f06 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 ot being held by
11f07 20 61 6e 6f 74 68 65 72 0d 0a 2a 2a 20 63 6f 6e another..** con
11f08 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 nection or proce
11f09 73 73 29 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a ss). ..**..**..*
11f0a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b * How proxy lock
11f0b 69 6e 67 20 77 6f 72 6b 73 0d 0a 2a 2a 20 2d 2d ing works..** --
11f0c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f0d 2d 2d 2d 2d 2d 0d 0a 2a 2a 0d 0a 2a 2a 20 50 72 -----..**..** Pr
11f0e 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 oxy file locking
11f0f 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c relies primaril
11f10 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 y on two new sup
11f11 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0d porting files: .
11f12 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e .**..** * con
11f13 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 ch file to limit
11f14 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 access to the d
11f15 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 atabase file to
11f16 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0d 0a 2a a single host..*
11f17 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 * at a time
11f18 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 70 72 ..**..** * pr
11f19 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 oxy file to act
11f1a 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 as a proxy for t
11f1b 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b he advisory lock
11f1c 73 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 2a 2a 20 20 s normally..**
11f1d 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 taken on the
11f1e 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 0d 0a 2a database..**..*
11f1f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 * The conch file
11f20 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 - to use a prox
11f21 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d y file, sqlite m
11f22 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 ust first "hold
11f23 74 68 65 20 63 6f 6e 63 68 22 0d 0a 2a 2a 20 62 the conch"..** b
11f24 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 y taking an sqli
11f25 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 te-style shared
11f26 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 lock on the conc
11f27 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 h file, reading
11f28 74 68 65 0d 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 the..** contents
11f29 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 and comparing t
11f2a 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 he host's unique
11f2b 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 host ID (see be
11f2c 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0d 0a 2a low) and lock..*
11f2d 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 * proxy path aga
11f2e 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 inst the values
11f2f 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f stored in the co
11f30 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 nch. The conch
11f31 66 69 6c 65 20 69 73 0d 0a 2a 2a 20 73 74 6f 72 file is..** stor
11f32 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 ed in the same d
11f33 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 irectory as the
11f34 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e database file an
11f35 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0d d the file name.
11f36 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 .** is patterned
11f37 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 after the datab
11f38 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 ase file name as
11f39 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 ".<databasename
11f3a 3e 2d 63 6f 6e 63 68 22 2e 0d 0a 2a 2a 20 49 66 >-conch"...** If
11f3b 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 the conch file
11f3c 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 does not exist,
11f3d 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 or it's contents
11f3e 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 do not match th
11f3f 65 0d 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e e..** host ID an
11f40 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c d/or proxy path,
11f41 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 then the lock i
11f42 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 s escalated to a
11f43 6e 20 65 78 63 6c 75 73 69 76 65 0d 0a 2a 2a 20 n exclusive..**
11f44 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e lock and the con
11f45 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 ch file contents
11f46 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 is updated with
11f47 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 the host ID and
11f48 20 70 72 6f 78 79 0d 0a 2a 2a 20 70 61 74 68 20 proxy..** path
11f49 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 and the lock is
11f4a 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 downgraded to a
11f4b 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 shared lock agai
11f4c 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 n. If the conch
11f4d 0d 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 ..** is held by
11f4e 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 another process
11f4f 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c (with a shared l
11f50 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 ock), the exclus
11f51 69 76 65 20 6c 6f 63 6b 0d 0a 2a 2a 20 77 69 6c ive lock..** wil
11f52 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 l fail and SQLIT
11f53 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e E_BUSY is return
11f54 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ed...**..** The
11f55 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 proxy file - a s
11f56 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 ingle-byte file
11f57 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 used for all adv
11f58 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 isory file locks
11f59 0d 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 ..** normally ta
11f5a 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 ken on the datab
11f5b 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 ase file. This
11f5c 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 allows for safe
11f5d 20 73 68 61 72 69 6e 67 0d 0a 2a 2a 20 6f 66 20 sharing..** of
11f5e 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
11f5f 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 e for multiple r
11f60 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 eaders and write
11f61 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0d 0a rs on the same..
11f62 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e ** host (the con
11f63 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 ch ensures that
11f64 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 they all use the
11f65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b same local lock
11f66 20 66 69 6c 65 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 file)...**..**
11f67 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c Requesting the l
11f68 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e ock proxy does n
11f69 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 ot immediately t
11f6a 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 ake the conch, i
11f6b 74 20 69 73 0d 0a 2a 2a 20 6f 6e 6c 79 20 74 61 t is..** only ta
11f6c 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 ken when the fir
11f6d 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f st request to lo
11f6e 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 ck database file
11f6f 20 69 73 20 6d 61 64 65 2e 20 20 0d 0a 2a 2a 20 is made. ..**
11f70 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 This matches the
11f71 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 semantics of th
11f72 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f e traditional lo
11f73 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 cking behavior,
11f74 77 68 65 72 65 0d 0a 2a 2a 20 6f 70 65 6e 69 6e where..** openin
11f75 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 g a connection t
11f76 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c o a database fil
11f77 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 e does not take
11f78 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0d 0a 2a a lock on it...*
11f79 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 * The shared loc
11f7a 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 k and an open fi
11f7b 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 le descriptor ar
11f7c 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 e maintained unt
11f7d 69 6c 20 0d 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e il ..** the conn
11f7e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 ection to the da
11f7f 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 tabase is closed
11f80 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 . ..**..** The p
11f81 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 roxy file and th
11f82 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 e lock file are
11f83 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f never deleted so
11f84 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0d they only need.
11f85 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 .** to be create
11f86 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 d the first time
11f87 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0d they are used..
11f88 0a 2a 2a 0d 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 .**..** Configur
11f89 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0d 0a 2a ation options..*
11f8a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * --------------
11f8b 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a 2a 0d 0a 2a 2a 20 -------..**..**
11f8c 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 SQLITE_PREFER_P
11f8d 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0d 0a 2a 2a ROXY_LOCKING..**
11f8e 0d 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 ..** Datab
11f8f 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 ase files access
11f90 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 ed on non-local
11f91 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 file systems are
11f92 0d 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d ..** autom
11f93 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 atically configu
11f94 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f red for proxy lo
11f95 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 cking, lock file
11f96 73 20 61 72 65 0d 0a 2a 2a 20 20 20 20 20 20 20 s are..**
11f97 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 named automatica
11f98 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 lly using the sa
11f99 6d 65 20 6c 6f 67 69 63 20 61 73 0d 0a 2a 2a 20 me logic as..**
11f9a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 PRAGMA loc
11f9b 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 k_proxy_file=":a
11f9c 75 74 6f 3a 22 0d 0a 2a 2a 20 20 20 20 0d 0a 2a uto:"..** ..*
11f9d 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f * SQLITE_PROXY_
11f9e 44 45 42 55 47 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 DEBUG..**..**
11f9f 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 Enables the
11fa0 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 logging of error
11fa1 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 messages during
11fa2 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0d 0a 2a host id file..*
11fa3 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 * retrieva
11fa4 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0d 0a l and creation..
11fa5 2a 2a 0d 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 **..** LOCKPROX
11fa6 59 44 49 52 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 YDIR..**..**
11fa7 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 Overrides the
11fa8 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f default directo
11fa9 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b ry used for lock
11faa 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 proxy files tha
11fab 74 0d 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 t..** are
11fac 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 named automatica
11fad 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 lly via the ":au
11fae 74 6f 3a 22 20 73 65 74 74 69 6e 67 0d 0a 2a 2a to:" setting..**
11faf 0d 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 ..** SQLITE_DEF
11fb0 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 AULT_PROXYDIR_PE
11fb1 52 4d 49 53 53 49 4f 4e 53 0d 0a 2a 2a 0d 0a 2a RMISSIONS..**..*
11fb2 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 * Permissi
11fb3 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 ons to use when
11fb4 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 creating a direc
11fb5 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 tory for storing
11fb6 20 74 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 6c the..** l
11fb7 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c ock proxy files,
11fb8 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 only used when
11fb9 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 LOCKPROXYDIR is
11fba 6e 6f 74 20 73 65 74 2e 0d 0a 2a 2a 20 20 20 20 not set...**
11fbb 0d 0a 2a 2a 20 20 20 20 0d 0a 2a 2a 20 41 73 20 ..** ..** As
11fbc 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c mentioned above,
11fbd 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 when compiled w
11fbe 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 ith SQLITE_PREFE
11fbf 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c R_PROXY_LOCKING,
11fc0 0d 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 ..** setting the
11fc1 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 environment var
11fc2 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 iable SQLITE_FOR
11fc3 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 CE_PROXY_LOCKING
11fc4 20 74 6f 20 31 20 77 69 6c 6c 0d 0a 2a 2a 20 66 to 1 will..** f
11fc5 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 orce proxy locki
11fc6 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f ng to be used fo
11fc7 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 r every database
11fc8 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e file opened, an
11fc9 64 20 30 0d 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 d 0..** will for
11fca 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f ce automatic pro
11fcb 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 xy locking to be
11fcc 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c disabled for al
11fcd 6c 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 66 l database..** f
11fce 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 iles (explicity
11fcf 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 calling the SQLI
11fd0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 TE_SET_LOCKPROXY
11fd1 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0d 0a FILE pragma or..
11fd2 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 ** sqlite_file_c
11fd3 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f ontrol API is no
11fd4 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 t affected by SQ
11fd5 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 LITE_FORCE_PROXY
11fd6 5f 4c 4f 43 4b 49 4e 47 29 2e 0d 0a 2a 2f 0d 0a _LOCKING)...*/..
11fd7 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 6f 78 79 20 6c ../*..** Proxy l
11fd8 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 ocking is only a
11fd9 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f vailable on MacO
11fda 53 58 20 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 SX ..*/..#if def
11fdb 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 ined(__APPLE__)
11fdc 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 && SQLITE_ENABLE
11fdd 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0d 0a _LOCKING_STYLE..
11fde 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 70 72 6f ../*..** The pro
11fdf 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 xyLockingContext
11fe0 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e has the path an
11fe1 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 d file structure
11fe2 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 s for the remote
11fe3 20 0d 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 ..** and local
11fe4 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 proxy files in i
11fe5 74 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 t..*/..typedef s
11fe6 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 truct proxyLocki
11fe7 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c ngContext proxyL
11fe8 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a ockingContext;..
11fe9 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b struct proxyLock
11fea 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0d 0a 20 20 ingContext {..
11feb 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 unixFile *conchF
11fec 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 ile; /*
11fed 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 Open conch file
11fee 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 */.. char *conc
11fef 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 hFilePath;
11ff0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
11ff1 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0d e conch file */.
11ff2 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 . unixFile *loc
11ff3 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 kProxy;
11ff4 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f /* Open proxy lo
11ff5 63 6b 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 63 68 ck file */.. ch
11ff6 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 ar *lockProxyPat
11ff7 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 h; /* Na
11ff8 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 me of the proxy
11ff9 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 lock file */..
11ffa 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 char *dbPath;
11ffb 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
11ffc 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e Name of the open
11ffd 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 file */.. int
11ffe 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 conchHeld;
11fff 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 /* 1 if
12000 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 the conch is he
12001 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 ld, -1 if lockle
12002 73 73 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 6f ss */.. void *o
12003 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 ldLockingContext
12004 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 ; /* Origina
12005 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 l lockingcontext
12006 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 to restore on c
12007 6c 6f 73 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 lose */.. sqlit
12008 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f e3_io_methods co
12009 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b nst *pOldMethod;
1200a 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c /* Original
1200b 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 I/O methods for
1200c 20 63 6c 6f 73 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d close */..};...
1200d 0a 2f 2a 20 0d 0a 2a 2a 20 54 68 65 20 70 72 6f ./* ..** The pro
1200e 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 xy lock file pat
1200f 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 h for the databa
12010 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 se at dbPath is
12011 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 written into lPa
12012 74 68 2c 20 0d 0a 2a 2a 20 77 68 69 63 68 20 6d th, ..** which m
12013 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c ust point to val
12014 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d id, writable mem
12015 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 ory large enough
12016 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 for a maxLen le
12017 6e 67 74 68 0d 0a 2a 2a 20 66 69 6c 65 20 70 61 ngth..** file pa
12018 74 68 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 th. ..*/..static
12019 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 int proxyGetLoc
1201a 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 kPath(const char
1201b 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a *dbPath, char *
1201c 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 lPath, size_t ma
1201d 78 4c 65 6e 29 7b 0d 0a 20 20 69 6e 74 20 6c 65 xLen){.. int le
1201e 6e 3b 0d 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b n;.. int dbLen;
1201f 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 23 69 .. int i;....#i
12020 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 fdef LOCKPROXYDI
12021 52 0d 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 R.. len = strlc
12022 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 py(lPath, LOCKPR
12023 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b OXYDIR, maxLen);
12024 0d 0a 23 65 6c 73 65 0d 0a 23 20 69 66 64 65 66 ..#else..# ifdef
12025 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 _CS_DARWIN_USER
12026 5f 54 45 4d 50 5f 44 49 52 0d 0a 20 20 7b 0d 0a _TEMP_DIR.. {..
12027 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 if( !confstr
12028 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 (_CS_DARWIN_USER
12029 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 _TEMP_DIR, lPath
1202a 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0d 0a 20 20 , maxLen) ){..
1202b 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 OSTRACE(("GE
1202c 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 TLOCKPATH faile
1202d 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 d %s errno=%d pi
1202e 64 3d 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 d=%d\n",..
1202f 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 lPath,
12030 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 errno, getpid())
12031 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e );.. return
12032 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f SQLITE_IOERR_LO
12033 43 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 CK;.. }..
12034 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 len = strlcat(lP
12035 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 ath, "sqliteploc
12036 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 ks", maxLen);
12037 20 0d 0a 20 20 7d 0d 0a 23 20 65 6c 73 65 0d 0a .. }..# else..
12038 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 len = strlcpy(
12039 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 lPath, "/tmp/",
1203a 6d 61 78 4c 65 6e 29 3b 0d 0a 23 20 65 6e 64 69 maxLen);..# endi
1203b 66 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 69 f..#endif.... i
1203c 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 f( lPath[len-1]!
1203d 3d 27 2f 27 20 29 7b 0d 0a 20 20 20 20 6c 65 6e ='/' ){.. len
1203e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 = strlcat(lPath
1203f 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0d , "/", maxLen);.
12040 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 74 . }.. .. /* t
12041 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 ransform the db
12042 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 path to a unique
12043 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0d 0a cache name */..
12044 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 dbLen = (int)s
12045 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0d 0a trlen(dbPath);..
12046 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 for( i=0; i<db
12047 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 Len && (i+len+7)
12048 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b <(int)maxLen; i+
12049 2b 29 7b 0d 0a 20 20 20 20 63 68 61 72 20 63 20 +){.. char c
1204a 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0d 0a 20 20 = dbPath[i];..
1204b 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d lPath[i+len] =
1204c 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b (c=='/')?'_':c;
1204d 0d 0a 20 20 7d 0d 0a 20 20 6c 50 61 74 68 5b 69 .. }.. lPath[i
1204e 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0d 0a 20 20 73 +len]='\0';.. s
1204f 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a trlcat(lPath, ":
12050 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b auto:", maxLen);
12051 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 .. OSTRACE(("GE
12052 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 TLOCKPATH proxy
12053 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 lock path=%s pi
12054 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 d=%d\n", lPath,
12055 67 65 74 70 69 64 28 29 29 29 3b 0d 0a 20 20 72 getpid()));.. r
12056 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
12057 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d 0a 20 2a 2a 20 ..}..../* .. **
12058 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b Creates the lock
12059 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 file and any mi
1205a 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 ssing directorie
1205b 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0d 0a 20 s in lockPath..
1205c 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 */..static int p
1205d 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 roxyCreateLockPa
1205e 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c th(const char *l
1205f 6f 63 6b 50 61 74 68 29 7b 0d 0a 20 20 69 6e 74 ockPath){.. int
12060 20 69 2c 20 6c 65 6e 3b 0d 0a 20 20 63 68 61 72 i, len;.. char
12061 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d buf[MAXPATHLEN]
12062 3b 0d 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d ;.. int start =
12063 20 30 3b 0d 0a 20 20 0d 0a 20 20 61 73 73 65 72 0;.. .. asser
12064 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c t(lockPath!=NULL
12065 29 3b 0d 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 );.. /* try to
12066 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 create all the i
12067 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 ntermediate dire
12068 63 74 6f 72 69 65 73 20 2a 2f 0d 0a 20 20 6c 65 ctories */.. le
12069 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 n = (int)strlen(
1206a 6c 6f 63 6b 50 61 74 68 29 3b 0d 0a 20 20 62 75 lockPath);.. bu
1206b 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b f[0] = lockPath[
1206c 30 5d 3b 0d 0a 20 20 66 6f 72 28 20 69 3d 31 3b 0];.. for( i=1;
1206d 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0d 0a i<len; i++ ){..
1206e 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 if( lockPath
1206f 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 [i] == '/' && (i
12070 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b - start > 0) ){
12071 0d 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 .. /* only
12072 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 mkdir if leaf di
12073 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 r != "." or "/"
12074 6f 72 20 22 2e 2e 22 20 2a 2f 0d 0a 20 20 20 20 or ".." */..
12075 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 if( i-start>2
12076 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 || (i-start==1 &
12077 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 & buf[start] !=
12078 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 '.' && buf[start
12079 5d 20 21 3d 20 27 2f 27 29 20 0d 0a 20 20 20 20 ] != '/') ..
1207a 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 || (i-start
1207b 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 ==2 && buf[start
1207c 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b ] != '.' && buf[
1207d 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 start+1] != '.')
1207e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 62 75 66 ){.. buf
1207f 5b 69 5d 3d 27 5c 30 27 3b 0d 0a 20 20 20 20 20 [i]='\0';..
12080 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 if( osMkdir(b
12081 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 uf, SQLITE_DEFAU
12082 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d LT_PROXYDIR_PERM
12083 49 53 53 49 4f 4e 53 29 20 29 7b 0d 0a 20 20 20 ISSIONS) ){..
12084 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 int err=e
12085 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 20 20 rrno;..
12086 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 if( err!=EEXIST
12087 20 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 ) {..
12088 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 OSTRACE(("CREA
12089 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c TELOCKPATH FAIL
1208a 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 ED creating %s,
1208b 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 "..
1208c 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 "'%s' pr
1208d 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 oxy lock path=%s
1208e 20 70 69 64 3d 25 64 5c 6e 22 2c 0d 0a 20 20 20 pid=%d\n",..
1208f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12090 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 buf, strerror(
12091 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 err), lockPath,
12092 67 65 74 70 69 64 28 29 29 29 3b 0d 0a 20 20 20 getpid()));..
12093 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
12094 65 72 72 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 err;..
12095 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 }.. }..
12096 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 74 61 }.. sta
12097 72 74 3d 69 2b 31 3b 0d 0a 20 20 20 20 7d 0d 0a rt=i+1;.. }..
12098 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 buf[i] = loc
12099 6b 50 61 74 68 5b 69 5d 3b 0d 0a 20 20 7d 0d 0a kPath[i];.. }..
1209a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 OSTRACE(("CREA
1209b 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 TELOCKPATH prox
1209c 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 y lock path=%s p
1209d 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 id=%d\n", lockPa
1209e 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0d th, getpid()));.
1209f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d . return 0;..}.
120a0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 .../*..** Create
120a1 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 a new VFS file
120a2 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 descriptor (stor
120a3 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 ed in memory obt
120a4 61 69 6e 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 73 ained from..** s
120a5 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 qlite3_malloc) a
120a6 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 nd open the file
120a7 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e named "path" in
120a8 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 the file descri
120a9 70 74 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 ptor...**..** Th
120aa 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 e caller is resp
120ab 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 onsible not only
120ac 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 for closing the
120ad 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
120ae 0d 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f ..** but also fo
120af 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 r freeing the me
120b0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 mory associated
120b1 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 with the file de
120b2 73 63 72 69 70 74 6f 72 2e 0d 0a 2a 2f 0d 0a 73 scriptor...*/..s
120b3 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 tatic int proxyC
120b4 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0d 0a reateUnixFile(..
120b5 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
120b6 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 path, /*
120b7 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 path for the new
120b8 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0d 0a 20 20 unixFile */..
120b9 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 unixFile **ppF
120ba 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e ile, /* un
120bb 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 ixFile created a
120bc 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 nd returned by r
120bd 65 66 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 ef */.. int i
120be 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 slockfile
120bf 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 /* if non ze
120c0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 ro missing dirs
120c1 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 will be created
120c2 2a 2f 0d 0a 29 20 7b 0d 0a 20 20 69 6e 74 20 66 */..) {.. int f
120c3 64 20 3d 20 2d 31 3b 0d 0a 20 20 75 6e 69 78 46 d = -1;.. unixF
120c4 69 6c 65 20 2a 70 4e 65 77 3b 0d 0a 20 20 69 6e ile *pNew;.. in
120c5 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
120c6 3b 0d 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 ;.. int openFla
120c7 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f gs = O_RDWR | O_
120c8 43 52 45 41 54 3b 0d 0a 20 20 73 71 6c 69 74 65 CREAT;.. sqlite
120c9 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0d 3_vfs dummyVfs;.
120ca 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 . int terrno =
120cb 30 3b 0d 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 0;.. UnixUnused
120cc 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 Fd *pUnused = NU
120cd 4c 4c 3b 0d 0a 0d 0a 20 20 2f 2a 20 31 2e 20 66 LL;.... /* 1. f
120ce 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e irst try to open
120cf 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 /create the file
120d0 0d 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 .. ** 2. if tha
120d1 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 t fails, and thi
120d2 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 s is a lock file
120d3 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 (not-conch), tr
120d4 79 20 63 72 65 61 74 69 6e 67 0d 0a 20 20 2a 2a y creating.. **
120d5 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 the parent dire
120d6 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e ctories and then
120d7 20 74 72 79 20 61 67 61 69 6e 2e 0d 0a 20 20 2a try again... *
120d8 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 * 3. if that fai
120d9 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 ls, try to open
120da 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e the file read-on
120db 6c 79 0d 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 ly.. ** otherwi
120dc 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 se return BUSY (
120dd 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 if lock file) or
120de 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 CANTOPEN for th
120df 65 20 63 6f 6e 63 68 20 66 69 6c 65 0d 0a 20 20 e conch file..
120e0 2a 2f 0d 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 */.. pUnused =
120e1 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 findReusableFd(p
120e2 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b ath, openFlags);
120e3 0d 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 .. if( pUnused
120e4 29 7b 0d 0a 20 20 20 20 66 64 20 3d 20 70 55 6e ){.. fd = pUn
120e5 75 73 65 64 2d 3e 66 64 3b 0d 0a 20 20 7d 65 6c used->fd;.. }el
120e6 73 65 7b 0d 0a 20 20 20 20 70 55 6e 75 73 65 64 se{.. pUnused
120e7 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f = sqlite3_mallo
120e8 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 c(sizeof(*pUnuse
120e9 64 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 21 70 d));.. if( !p
120ea 55 6e 75 73 65 64 20 29 7b 0d 0a 20 20 20 20 20 Unused ){..
120eb 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e return SQLITE_N
120ec 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 OMEM;.. }..
120ed 7d 0d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b }.. if( fd<0 ){
120ee 0d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 .. fd = robus
120ef 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 t_open(path, ope
120f0 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 nFlags, SQLITE_D
120f1 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d EFAULT_FILE_PERM
120f2 49 53 53 49 4f 4e 53 29 3b 0d 0a 20 20 20 20 74 ISSIONS);.. t
120f3 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a errno = errno;..
120f4 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 if( fd<0 &&
120f5 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 errno==ENOENT &&
120f6 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0d 0a islockfile ){..
120f7 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 if( proxyC
120f8 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 reateLockPath(pa
120f9 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b th) == SQLITE_OK
120fa 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 64 20 ){.. fd
120fb 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 = robust_open(pa
120fc 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 th, openFlags, S
120fd 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 QLITE_DEFAULT_FI
120fe 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b LE_PERMISSIONS);
120ff 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
12100 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 66 64 3c .. }.. if( fd<
12101 30 20 29 7b 0d 0a 20 20 20 20 6f 70 65 6e 46 6c 0 ){.. openFl
12102 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0d ags = O_RDONLY;.
12103 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 . fd = robust
12104 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e _open(path, open
12105 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 Flags, SQLITE_DE
12106 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 FAULT_FILE_PERMI
12107 53 53 49 4f 4e 53 29 3b 0d 0a 20 20 20 20 74 65 SSIONS);.. te
12108 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 rrno = errno;..
12109 20 7d 0d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 }.. if( fd<0 )
1210a 7b 0d 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 {.. if( isloc
1210b 6b 66 69 6c 65 20 29 7b 0d 0a 20 20 20 20 20 20 kfile ){..
1210c 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 return SQLITE_BU
1210d 53 59 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 SY;.. }..
1210e 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 switch (terrno)
1210f 7b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 {.. case EA
12110 43 43 45 53 3a 0d 0a 20 20 20 20 20 20 20 20 72 CCES:.. r
12111 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 eturn SQLITE_PER
12112 4d 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 45 M;.. case E
12113 49 4f 3a 20 0d 0a 20 20 20 20 20 20 20 20 72 65 IO: .. re
12114 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
12115 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 R_LOCK; /* even
12116 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 though it is the
12117 20 63 6f 6e 63 68 20 2a 2f 0d 0a 20 20 20 20 20 conch */..
12118 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 default:..
12119 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1211a 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0d _CANTOPEN_BKPT;.
1211b 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d . }.. }.. .
1211c 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 . pNew = (unixF
1211d 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 ile *)sqlite3_ma
1211e 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 lloc(sizeof(*pNe
1211f 77 29 29 3b 0d 0a 20 20 69 66 28 20 70 4e 65 77 w));.. if( pNew
12120 3d 3d 4e 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 72 ==NULL ){.. r
12121 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
12122 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f ;.. goto end_
12123 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0d 0a 20 create_proxy;..
12124 20 7d 0d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 }.. memset(pNe
12125 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 w, 0, sizeof(uni
12126 78 46 69 6c 65 29 29 3b 0d 0a 20 20 70 4e 65 77 xFile));.. pNew
12127 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 ->openFlags = op
12128 65 6e 46 6c 61 67 73 3b 0d 0a 20 20 6d 65 6d 73 enFlags;.. mems
12129 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c et(&dummyVfs, 0,
1212a 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 sizeof(dummyVfs
1212b 29 29 3b 0d 0a 20 20 64 75 6d 6d 79 56 66 73 2e ));.. dummyVfs.
1212c 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 pAppData = (void
1212d 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e *)&autolockIoFin
1212e 64 65 72 3b 0d 0a 20 20 64 75 6d 6d 79 56 66 73 der;.. dummyVfs
1212f 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 .zName = "dummy"
12130 3b 0d 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 ;.. pUnused->fd
12131 20 3d 20 66 64 3b 0d 0a 20 20 70 55 6e 75 73 65 = fd;.. pUnuse
12132 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 d->flags = openF
12133 6c 61 67 73 3b 0d 0a 20 20 70 4e 65 77 2d 3e 70 lags;.. pNew->p
12134 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 Unused = pUnused
12135 3b 0d 0a 20 20 0d 0a 20 20 72 63 20 3d 20 66 69 ;.. .. rc = fi
12136 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 llInUnixFile(&du
12137 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c mmyVfs, fd, (sql
12138 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c ite3_file*)pNew,
12139 20 70 61 74 68 2c 20 30 29 3b 0d 0a 20 20 69 66 path, 0);.. if
1213a 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1213b 29 7b 0d 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 ){.. *ppFile
1213c 3d 20 70 4e 65 77 3b 0d 0a 20 20 20 20 72 65 74 = pNew;.. ret
1213d 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
1213e 20 20 7d 0d 0a 65 6e 64 5f 63 72 65 61 74 65 5f }..end_create_
1213f 70 72 6f 78 79 3a 20 20 20 20 0d 0a 20 20 72 6f proxy: .. ro
12140 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c bust_close(pNew,
12141 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d fd, __LINE__);.
12142 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 . sqlite3_free(
12143 70 4e 65 77 29 3b 0d 0a 20 20 73 71 6c 69 74 65 pNew);.. sqlite
12144 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 3_free(pUnused);
12145 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
12146 7d 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 }....#ifdef SQLI
12147 54 45 5f 54 45 53 54 0d 0a 2f 2a 20 73 69 6d 75 TE_TEST../* simu
12148 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f late multiple ho
12149 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 sts by creating
1214a 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 unique hostid fi
1214b 6c 65 20 70 61 74 68 73 20 2a 2f 0d 0a 53 51 4c le paths */..SQL
1214c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 ITE_API int sqli
1214d 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d te3_hostid_num =
1214e 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 0;..#endif....#
1214f 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 define PROXY_HOS
12150 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a TIDLEN 16 /*
12151 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 conch file host
12152 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0d 0a 0d id length */...
12153 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 ./* Not always d
12154 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 efined in the he
12155 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 aders as it ough
12156 74 20 74 6f 20 62 65 20 2a 2f 0d 0a 65 78 74 65 t to be */..exte
12157 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 rn int gethostuu
12158 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f id(uuid_t id, co
12159 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 nst struct times
1215a 70 65 63 20 2a 77 61 69 74 29 3b 0d 0a 0d 0a 2f pec *wait);..../
1215b 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 * get the host I
1215c 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 D via gethostuui
1215d 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 d(), pHostID mus
1215e 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 t point to PROXY
1215f 5f 48 4f 53 54 49 44 4c 45 4e 20 0d 0a 2a 2a 20 _HOSTIDLEN ..**
12160 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c bytes of writabl
12161 65 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a 73 e memory...*/..s
12162 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 tatic int proxyG
12163 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 etHostID(unsigne
12164 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c d char *pHostID,
12165 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0d 0a int *pError){..
12166 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 assert(PROXY_H
12167 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 OSTIDLEN == size
12168 6f 66 28 75 75 69 64 5f 74 29 29 3b 0d 0a 20 20 of(uuid_t));..
12169 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 memset(pHostID,
1216a 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 0, PROXY_HOSTIDL
1216b 45 4e 29 3b 0d 0a 23 69 66 20 64 65 66 69 6e 65 EN);..#if define
1216c 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 d(__MAX_OS_X_VER
1216d 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 SION_MIN_REQUIRE
1216e 44 29 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 D)\..
1216f 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f && __MAC_OS_
12170 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 X_VERSION_MIN_RE
12171 51 55 49 52 45 44 3c 31 30 35 30 0d 0a 20 20 7b QUIRED<1050.. {
12172 0d 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e .. static con
12173 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 st struct timesp
12174 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c ec timeout = {1,
12175 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 0}; /* 1 sec ti
12176 6d 65 6f 75 74 20 2a 2f 0d 0a 20 20 20 20 69 66 meout */.. if
12177 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 ( gethostuuid(pH
12178 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 ostID, &timeout)
12179 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 65 ){.. int e
1217a 72 72 20 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 rr = errno;..
1217b 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b if( pError ){
1217c 0d 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f .. *pErro
1217d 72 20 3d 20 65 72 72 3b 0d 0a 20 20 20 20 20 20 r = err;..
1217e 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 }.. return
1217f 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0d 0a 20 SQLITE_IOERR;..
12180 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 }.. }..#else
12181 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
12182 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0d 0a 23 ETER(pError);..#
12183 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 53 51 endif..#ifdef SQ
12184 4c 49 54 45 5f 54 45 53 54 0d 0a 20 20 2f 2a 20 LITE_TEST.. /*
12185 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c simulate multipl
12186 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 e hosts by creat
12187 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 ing unique hosti
12188 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0d d file paths */.
12189 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 . if( sqlite3_h
1218a 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b ostid_num != 0){
1218b 0d 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d .. pHostID[0]
1218c 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 = (char)(pHostI
1218d 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 D[0] + (char)(sq
1218e 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d lite3_hostid_num
1218f 20 26 20 30 78 46 46 29 29 3b 0d 0a 20 20 7d 0d & 0xFF));.. }.
12190 0a 23 65 6e 64 69 66 0d 0a 20 20 0d 0a 20 20 72 .#endif.. .. r
12191 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
12192 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 54 68 65 20 63 6f ..}..../* The co
12193 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e nch file contain
12194 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f s the header, ho
12195 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 st id and lock f
12196 69 6c 65 20 70 61 74 68 0d 0a 20 2a 2f 0d 0a 23 ile path.. */..#
12197 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e define PROXY_CON
12198 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a CHVERSION 2 /*
12199 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 1-byte header,
1219a 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 16-byte host id,
1219b 20 70 61 74 68 20 2a 2f 0d 0a 23 64 65 66 69 6e path */..#defin
1219c 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 e PROXY_HEADERLE
1219d 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 N 1 /* conc
1219e 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 h file header le
1219f 6e 67 74 68 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ngth */..#define
121a0 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 PROXY_PATHINDEX
121a1 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 (PROXY_HEADE
121a2 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 RLEN+PROXY_HOSTI
121a3 44 4c 45 4e 29 0d 0a 23 64 65 66 69 6e 65 20 50 DLEN)..#define P
121a4 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e ROXY_MAXCONCHLEN
121a5 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c (PROXY_HEADERL
121a6 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c EN+PROXY_HOSTIDL
121a7 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0d 0a EN+MAXPATHLEN)..
121a8 0d 0a 2f 2a 20 0d 0a 2a 2a 20 54 61 6b 65 73 20 ../* ..** Takes
121a9 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 an open conch fi
121aa 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 le, copies the c
121ab 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 ontents to a new
121ac 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d path and then m
121ad 6f 76 65 73 20 0d 0a 2a 2a 20 69 74 20 62 61 63 oves ..** it bac
121ae 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 k. The newly cr
121af 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c eated file's fil
121b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 e descriptor is
121b1 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0d assigned to the.
121b2 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 .** conch file s
121b3 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e tructure and fin
121b4 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 ally the origina
121b5 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 l conch file des
121b6 63 72 69 70 74 6f 72 20 69 73 20 0d 0a 2a 2a 20 criptor is ..**
121b7 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 closed. Returns
121b8 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 zero if success
121b9 66 75 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ful...*/..static
121ba 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 int proxyBreakC
121bb 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c onchLock(unixFil
121bc 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 e *pFile, uuid_t
121bd 20 6d 79 48 6f 73 74 49 44 29 7b 0d 0a 20 20 70 myHostID){.. p
121be 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 roxyLockingConte
121bf 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 xt *pCtx = (prox
121c0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 yLockingContext
121c1 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 *)pFile->locking
121c2 43 6f 6e 74 65 78 74 3b 20 0d 0a 20 20 75 6e 69 Context; .. uni
121c3 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 xFile *conchFile
121c4 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 = pCtx->conchFi
121c5 6c 65 3b 0d 0a 20 20 63 68 61 72 20 74 50 61 74 le;.. char tPat
121c6 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0d 0a h[MAXPATHLEN];..
121c7 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 char buf[PROXY
121c8 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0d 0a _MAXCONCHLEN];..
121c9 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 char *cPath =
121ca 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 pCtx->conchFileP
121cb 61 74 68 3b 0d 0a 20 20 73 69 7a 65 5f 74 20 72 ath;.. size_t r
121cc 65 61 64 4c 65 6e 20 3d 20 30 3b 0d 0a 20 20 73 eadLen = 0;.. s
121cd 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 ize_t pathLen =
121ce 30 3b 0d 0a 20 20 63 68 61 72 20 65 72 72 6d 73 0;.. char errms
121cf 67 5b 36 34 5d 20 3d 20 22 22 3b 0d 0a 20 20 69 g[64] = "";.. i
121d0 6e 74 20 66 64 20 3d 20 2d 31 3b 0d 0a 20 20 69 nt fd = -1;.. i
121d1 6e 74 20 72 63 20 3d 20 2d 31 3b 0d 0a 20 20 55 nt rc = -1;.. U
121d2 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
121d3 6d 79 48 6f 73 74 49 44 29 3b 0d 0a 0d 0a 20 20 myHostID);....
121d4 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 /* create a new
121d5 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 path by replace
121d6 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 the trailing '-c
121d7 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 onch' with '-bre
121d8 61 6b 27 20 2a 2f 0d 0a 20 20 70 61 74 68 4c 65 ak' */.. pathLe
121d9 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 n = strlcpy(tPat
121da 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 h, cPath, MAXPAT
121db 48 4c 45 4e 29 3b 0d 0a 20 20 69 66 28 20 70 61 HLEN);.. if( pa
121dc 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e thLen>MAXPATHLEN
121dd 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c || pathLen<6 ||
121de 20 0d 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 .. (strlcpy
121df 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d (&tPath[pathLen-
121e0 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 5], "break", 6)
121e1 21 3d 20 35 29 20 29 7b 0d 0a 20 20 20 20 73 71 != 5) ){.. sq
121e2 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
121e3 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 izeof(errmsg),er
121e4 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 rmsg,"path error
121e5 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 (len %d)",(int)
121e6 70 61 74 68 4c 65 6e 29 3b 0d 0a 20 20 20 20 67 pathLen);.. g
121e7 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 oto end_breakloc
121e8 6b 3b 0d 0a 20 20 7d 0d 0a 20 20 2f 2a 20 72 65 k;.. }.. /* re
121e9 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e ad the conch con
121ea 74 65 6e 74 20 2a 2f 0d 0a 20 20 72 65 61 64 4c tent */.. readL
121eb 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e en = osPread(con
121ec 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 chFile->h, buf,
121ed 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 PROXY_MAXCONCHLE
121ee 4e 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 72 65 N, 0);.. if( re
121ef 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 adLen<PROXY_PATH
121f0 49 4e 44 45 58 20 29 7b 0d 0a 20 20 20 20 73 71 INDEX ){.. sq
121f1 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
121f2 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 izeof(errmsg),er
121f3 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 rmsg,"read error
121f4 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 (len %d)",(int)
121f5 72 65 61 64 4c 65 6e 29 3b 0d 0a 20 20 20 20 67 readLen);.. g
121f6 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 oto end_breakloc
121f7 6b 3b 0d 0a 20 20 7d 0d 0a 20 20 2f 2a 20 77 72 k;.. }.. /* wr
121f8 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 ite it out to th
121f9 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 e temporary brea
121fa 6b 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 66 64 20 k file */.. fd
121fb 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 = robust_open(tP
121fc 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 ath, (O_RDWR|O_C
121fd 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0d 0a 20 REAT|O_EXCL),..
121fe 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
121ff 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 SQLITE_DEFAULT
12200 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e _FILE_PERMISSION
12201 53 29 3b 0d 0a 20 20 69 66 28 20 66 64 3c 30 20 S);.. if( fd<0
12202 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){.. sqlite3_
12203 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 snprintf(sizeof(
12204 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c errmsg), errmsg,
12205 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 "create failed
12206 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0d 0a (%d)", errno);..
12207 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 goto end_bre
12208 61 6b 6c 6f 63 6b 3b 0d 0a 20 20 7d 0d 0a 20 20 aklock;.. }..
12209 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c if( osPwrite(fd,
1220a 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 buf, readLen, 0
1220b 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 ) != (ssize_t)re
1220c 61 64 4c 65 6e 20 29 7b 0d 0a 20 20 20 20 73 71 adLen ){.. sq
1220d 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
1220e 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 izeof(errmsg), e
1220f 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 rrmsg, "write fa
12210 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e iled (%d)", errn
12211 6f 29 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 65 6e o);.. goto en
12212 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0d 0a 20 20 d_breaklock;..
12213 7d 0d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 }.. if( rename(
12214 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b tPath, cPath) ){
12215 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e .. sqlite3_sn
12216 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 printf(sizeof(er
12217 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 rmsg), errmsg, "
12218 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 rename failed (%
12219 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0d 0a 20 20 d)", errno);..
1221a 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b goto end_break
1221b 6c 6f 63 6b 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 lock;.. }.. rc
1221c 20 3d 20 30 3b 0d 0a 20 20 66 70 72 69 6e 74 66 = 0;.. fprintf
1221d 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 (stderr, "broke
1221e 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 stale lock on %s
1221f 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0d 0a 20 20 \n", cPath);..
12220 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 robust_close(pFi
12221 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 le, conchFile->h
12222 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d 0a 20 20 , __LINE__);..
12223 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 conchFile->h = f
12224 64 3b 0d 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d d;.. conchFile-
12225 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 >openFlags = O_R
12226 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0d 0a DWR | O_CREAT;..
12227 0d 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a ..end_breaklock:
12228 0d 0a 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 .. if( rc ){..
12229 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0d if( fd>=0 ){.
1222a 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 . osUnlink(
1222b 74 50 61 74 68 29 3b 0d 0a 20 20 20 20 20 20 72 tPath);.. r
1222c 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c obust_close(pFil
1222d 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 e, fd, __LINE__)
1222e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 70 ;.. }.. fp
1222f 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 rintf(stderr, "f
12230 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 ailed to break s
12231 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c tale lock on %s,
12232 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 %s\n", cPath, e
12233 72 72 6d 73 67 29 3b 0d 0a 20 20 7d 0d 0a 20 20 rrmsg);.. }..
12234 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
12235 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 ./* Take the req
12236 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 uested lock on t
12237 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e he conch file an
12238 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 d break a stale
12239 6c 6f 63 6b 20 69 66 20 74 68 65 20 0d 0a 2a 2a lock if the ..**
1223a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 host id matches
1223b 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
1223c 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b t proxyConchLock
1223d 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 (unixFile *pFile
1223e 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 , uuid_t myHostI
1223f 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 D, int lockType)
12240 7b 0d 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e {.. proxyLockin
12241 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d gContext *pCtx =
12242 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f (proxyLockingCo
12243 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c ntext *)pFile->l
12244 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0d ockingContext; .
12245 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e . unixFile *con
12246 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 chFile = pCtx->c
12247 6f 6e 63 68 46 69 6c 65 3b 0d 0a 20 20 69 6e 74 onchFile;.. int
12248 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
12249 0d 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d .. int nTries =
1224a 20 30 3b 0d 0a 20 20 73 74 72 75 63 74 20 74 69 0;.. struct ti
1224b 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 mespec conchModT
1224c 69 6d 65 3b 0d 0a 20 20 0d 0a 20 20 6d 65 6d 73 ime;.. .. mems
1224d 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 et(&conchModTime
1224e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 , 0, sizeof(conc
1224f 68 4d 6f 64 54 69 6d 65 29 29 3b 0d 0a 20 20 64 hModTime));.. d
12250 6f 20 7b 0d 0a 20 20 20 20 72 63 20 3d 20 63 6f o {.. rc = co
12251 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 nchFile->pMethod
12252 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 ->xLock((sqlite3
12253 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 _file*)conchFile
12254 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0d 0a 20 20 , lockType);..
12255 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0d 0a 20 20 nTries ++;..
12256 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
12257 5f 42 55 53 59 20 29 7b 0d 0a 20 20 20 20 20 20 _BUSY ){..
12258 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 /* If the lock f
12259 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0d 0a 20 ailed (busy):..
1225a 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a * 1st try:
1225b 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d get the mod tim
1225c 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 e of the conch,
1225d 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 wait 0.5s and tr
1225e 79 20 61 67 61 69 6e 2e 20 0d 0a 20 20 20 20 20 y again. ..
1225f 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 * 2nd try: fai
12260 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d l if the mod tim
12261 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 e changed or hos
12262 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e t id is differen
12263 74 2c 20 77 61 69 74 20 0d 0a 20 20 20 20 20 20 t, wait ..
12264 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 * 10
12265 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 sec and try agai
12266 6e 0d 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 n.. * 3rd
12267 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c try: break the l
12268 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d ock unless the m
12269 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e od time has chan
1226a 67 65 64 2e 0d 0a 20 20 20 20 20 20 20 2a 2f 0d ged... */.
1226b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 . struct st
1226c 61 74 20 62 75 66 3b 0d 0a 20 20 20 20 20 20 69 at buf;.. i
1226d 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 f( osFstat(conch
1226e 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 File->h, &buf) )
1226f 7b 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 {.. pFile
12270 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 ->lastErrno = er
12271 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 rno;.. re
12272 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
12273 52 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 20 7d R_LOCK;.. }
12274 0d 0a 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 .. ..
12275 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b if( nTries==1 ){
12276 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d .. conchM
12277 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f odTime = buf.st_
12278 6d 74 69 6d 65 73 70 65 63 3b 0d 0a 20 20 20 20 mtimespec;..
12279 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 usleep(50000
1227a 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 0); /* wait 0.5
1227b 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 sec and try the
1227c 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0d 0a 20 20 lock again*/..
1227d 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 continue;
1227e 20 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 .. }....
1227f 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 assert( nTri
12280 65 73 3e 31 20 29 3b 0d 0a 20 20 20 20 20 20 69 es>1 );.. i
12281 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e f( conchModTime.
12282 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 tv_sec != buf.st
12283 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 _mtimespec.tv_se
12284 63 20 7c 7c 20 0d 0a 20 20 20 20 20 20 20 20 20 c || ..
12285 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f conchModTime.tv_
12286 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d nsec != buf.st_m
12287 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 timespec.tv_nsec
12288 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 ){.. ret
12289 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b urn SQLITE_BUSY;
1228a 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
1228b 20 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 .. if( nTr
1228c 69 65 73 3d 3d 32 20 29 7b 20 20 0d 0a 20 20 20 ies==2 ){ ..
1228d 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 char tBuf[P
1228e 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e ROXY_MAXCONCHLEN
1228f 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 ];.. int
12290 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f len = osPread(co
12291 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 nchFile->h, tBuf
12292 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 , PROXY_MAXCONCH
12293 4c 45 4e 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 LEN, 0);..
12294 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0d 0a if( len<0 ){..
12295 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d pFile-
12296 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 >lastErrno = err
12297 6e 6f 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 no;.. r
12298 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
12299 52 52 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 20 20 RR_LOCK;..
1229a 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 }.. if(
1229b 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 len>PROXY_PATHI
1229c 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d NDEX && tBuf[0]=
1229d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e =(char)PROXY_CON
1229e 43 48 56 45 52 53 49 4f 4e 29 7b 0d 0a 20 20 20 CHVERSION){..
1229f 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 /* don't
122a0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 break the lock i
122a1 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f f the host id do
122a2 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0d 0a esn't match */..
122a3 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 if( 0!
122a4 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 =memcmp(&tBuf[PR
122a5 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 OXY_HEADERLEN],
122a6 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f myHostID, PROXY_
122a7 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0d 0a 20 HOSTIDLEN) ){..
122a8 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
122a9 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a n SQLITE_BUSY;..
122aa 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 }..
122ab 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
122ac 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 /* don't
122ad 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f break the lock o
122ae 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 n short read or
122af 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 a version mismat
122b0 63 68 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 ch */..
122b1 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 return SQLITE_B
122b2 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d USY;.. }.
122b3 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 . usleep(
122b4 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 10000000); /* wa
122b5 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 it 10 sec and tr
122b6 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e y the lock again
122b7 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e */.. con
122b8 74 69 6e 75 65 3b 20 0d 0a 20 20 20 20 20 20 7d tinue; .. }
122b9 0d 0a 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 .. ..
122ba 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d assert( nTries==
122bb 33 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 3 );.. if(
122bc 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 0==proxyBreakCon
122bd 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 chLock(pFile, my
122be 48 6f 73 74 49 44 29 20 29 7b 0d 0a 20 20 20 20 HostID) ){..
122bf 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
122c0 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 OK;.. if(
122c1 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 lockType==EXCLU
122c2 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 SIVE_LOCK ){..
122c3 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e rc = con
122c4 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d chFile->pMethod-
122c5 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f >xLock((sqlite3_
122c6 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c file*)conchFile,
122c7 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 SHARED_LOCK);
122c8 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 ..
122c9 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 }.. if(
122ca 20 21 72 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 !rc ){..
122cb 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c rc = conchFil
122cc 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 e->pMethod->xLoc
122cd 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a k((sqlite3_file*
122ce 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b )conchFile, lock
122cf 54 79 70 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 Type);..
122d0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
122d1 7d 0d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 }.. } while( rc
122d2 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 ==SQLITE_BUSY &&
122d3 20 6e 54 72 69 65 73 3c 33 20 29 3b 0d 0a 20 20 nTries<3 );..
122d4 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
122d5 7d 0d 0a 0d 0a 2f 2a 20 54 61 6b 65 73 20 74 68 }..../* Takes th
122d6 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e e conch by takin
122d7 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 g a shared lock
122d8 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e and read the con
122d9 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 tents conch, if
122da 0d 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 ..** lockPath is
122db 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 non-NULL, the h
122dc 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 ost ID and lock
122dd 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d file path must m
122de 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0d 0a atch. A NULL ..
122df 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e ** lockPath mean
122e0 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 s that the lockP
122e1 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 ath in the conch
122e2 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 file will be us
122e3 65 64 20 69 66 20 74 68 65 20 0d 0a 2a 2a 20 68 ed if the ..** h
122e4 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f ost IDs match, o
122e5 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 r a new lock pat
122e6 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 h will be genera
122e7 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ted automaticall
122e8 79 20 0d 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 y ..** and writt
122e9 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 en to the conch
122ea 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 file...*/..stati
122eb 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 c int proxyTakeC
122ec 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 onch(unixFile *p
122ed 46 69 6c 65 29 7b 0d 0a 20 20 70 72 6f 78 79 4c File){.. proxyL
122ee 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 ockingContext *p
122ef 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b Ctx = (proxyLock
122f0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 ingContext *)pFi
122f1 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 le->lockingConte
122f2 78 74 3b 20 0d 0a 20 20 0d 0a 20 20 69 66 28 20 xt; .. .. if(
122f3 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 pCtx->conchHeld!
122f4 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 =0 ){.. retur
122f5 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 n SQLITE_OK;..
122f6 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 75 6e 69 78 }else{.. unix
122f7 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 File *conchFile
122f8 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c = pCtx->conchFil
122f9 65 3b 0d 0a 20 20 20 20 75 75 69 64 5f 74 20 6d e;.. uuid_t m
122fa 79 48 6f 73 74 49 44 3b 0d 0a 20 20 20 20 69 6e yHostID;.. in
122fb 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0d 0a 20 t pError = 0;..
122fc 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b char readBuf[
122fd 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 PROXY_MAXCONCHLE
122fe 4e 5d 3b 0d 0a 20 20 20 20 63 68 61 72 20 6c 6f N];.. char lo
122ff 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 ckPath[MAXPATHLE
12300 4e 5d 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 74 N];.. char *t
12301 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 empLockPath = NU
12302 4c 4c 3b 0d 0a 20 20 20 20 69 6e 74 20 72 63 20 LL;.. int rc
12303 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
12304 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 int createConc
12305 68 20 3d 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 h = 0;.. int
12306 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b hostIdMatch = 0;
12307 0d 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 .. int readLe
12308 6e 20 3d 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 n = 0;.. int
12309 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d tryOldLockPath =
1230a 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 66 6f 72 0;.. int for
1230b 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 ceNewLockPath =
1230c 30 3b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 4f 53 0;.. .. OS
1230d 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 TRACE(("TAKECONC
1230e 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 H %d for %s pid
1230f 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c =%d\n", conchFil
12310 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 e->h,..
12311 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 (pCtx->lockP
12312 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d roxyPath ? pCtx-
12313 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a >lockProxyPath :
12314 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 ":auto:"), getp
12315 69 64 28 29 29 29 3b 0d 0a 0d 0a 20 20 20 20 72 id()));.... r
12316 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 c = proxyGetHost
12317 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 ID(myHostID, &pE
12318 72 72 6f 72 29 3b 0d 0a 20 20 20 20 69 66 28 20 rror);.. if(
12319 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 (rc&0xff)==SQLIT
1231a 45 5f 49 4f 45 52 52 20 29 7b 0d 0a 20 20 20 20 E_IOERR ){..
1231b 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 pFile->lastErr
1231c 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0d 0a 20 20 no = pError;..
1231d 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b goto end_tak
1231e 65 63 6f 6e 63 68 3b 0d 0a 20 20 20 20 7d 0d 0a econch;.. }..
1231f 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f rc = proxyCo
12320 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d nchLock(pFile, m
12321 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f yHostID, SHARED_
12322 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 69 66 28 20 LOCK);.. if(
12323 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
12324 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 .. goto end
12325 5f 74 61 6b 65 63 6f 6e 63 68 3b 0d 0a 20 20 20 _takeconch;..
12326 20 7d 0d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 }.. /* read
12327 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e the existing con
12328 63 68 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 ch file */..
12329 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e readLen = seekAn
1232a 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a dRead((unixFile*
1232b 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 )conchFile, 0, r
1232c 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 eadBuf, PROXY_MA
1232d 58 43 4f 4e 43 48 4c 45 4e 29 3b 0d 0a 20 20 20 XCONCHLEN);..
1232e 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 if( readLen<0 )
1232f 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 {.. /* I/O
12330 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f error: lastErrno
12331 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 set by seekAndR
12332 65 61 64 20 2a 2f 0d 0a 20 20 20 20 20 20 70 46 ead */.. pF
12333 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d ile->lastErrno =
12334 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 conchFile->last
12335 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 72 63 Errno;.. rc
12336 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f = SQLITE_IOERR_
12337 52 45 41 44 3b 0d 0a 20 20 20 20 20 20 67 6f 74 READ;.. got
12338 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b o end_takeconch;
12339 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 .. }else if(
1233a 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f readLen<=(PROXY_
1233b 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f HEADERLEN+PROXY_
1233c 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0d 0a HOSTIDLEN) || ..
1233d 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 rea
1233e 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 dBuf[0]!=(char)P
1233f 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f ROXY_CONCHVERSIO
12340 4e 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 61 N ){.. /* a
12341 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 short read or v
12342 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 ersion format mi
12343 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 smatch means we
12344 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 need to create a
12345 20 6e 65 77 20 0d 0a 20 20 20 20 20 20 2a 2a 20 new .. **
12346 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0d 0a 20 20 conch file. ..
12347 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 63 72 */.. cr
12348 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0d 0a eateConch = 1;..
12349 20 20 20 20 7d 0d 0a 20 20 20 20 2f 2a 20 69 66 }.. /* if
1234a 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 the host id mat
1234b 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 ches and the loc
1234c 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 k path already e
1234d 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e xists in the con
1234e 63 68 0d 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c ch.. ** we'll
1234f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 try to use the
12350 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 path there, if w
12351 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 e can't open tha
12352 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0d 0a t path, we'll ..
12353 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 ** retry wit
12354 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e h a new auto-gen
12355 65 72 61 74 65 64 20 70 61 74 68 20 0d 0a 20 20 erated path ..
12356 20 20 2a 2f 0d 0a 20 20 20 20 64 6f 20 7b 20 2f */.. do { /
12357 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 * in case we nee
12358 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 d to try again f
12359 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d or an :auto: nam
1235a 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0d ed lock file */.
1235b 0a 0d 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 ... if( !cr
1235c 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f eateConch && !fo
1235d 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 rceNewLockPath )
1235e 7b 0d 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 {.. hostI
1235f 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 dMatch = !memcmp
12360 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f (&readBuf[PROXY_
12361 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f HEADERLEN], myHo
12362 73 74 49 44 2c 20 0d 0a 20 20 20 20 20 20 20 20 stID, ..
12363 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12364 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f PROXY_
12365 48 4f 53 54 49 44 4c 45 4e 29 3b 0d 0a 20 20 20 HOSTIDLEN);..
12366 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 /* if the c
12367 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f onch has data co
12368 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e mpare the conten
12369 74 73 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 ts */.. i
1236a 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 f( !pCtx->lockPr
1236b 6f 78 79 50 61 74 68 20 29 7b 0d 0a 20 20 20 20 oxyPath ){..
1236c 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 /* for aut
1236d 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f o-named local lo
1236e 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 ck file, just ch
1236f 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 eck the host ID
12370 61 6e 64 20 77 65 27 6c 6c 0d 0a 20 20 20 20 20 and we'll..
12371 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 ** use the
12372 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 local lock file
12373 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 path that's alr
12374 65 61 64 79 20 69 6e 20 74 68 65 72 65 0d 0a 20 eady in there..
12375 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 */..
12376 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 if( host
12377 49 64 4d 61 74 63 68 20 29 7b 0d 0a 20 20 20 20 IdMatch ){..
12378 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 size_t p
12379 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 athLen = (readLe
1237a 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e n - PROXY_PATHIN
1237b 44 45 58 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 DEX);..
1237c 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ..
1237d 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 if( pathLen>=MA
1237e 58 50 41 54 48 4c 45 4e 20 29 7b 0d 0a 20 20 20 XPATHLEN ){..
1237f 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c pathL
12380 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b en=MAXPATHLEN-1;
12381 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d .. }.
12382 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d . mem
12383 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 cpy(lockPath, &r
12384 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 eadBuf[PROXY_PAT
12385 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e HINDEX], pathLen
12386 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 );..
12387 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e lockPath[pathLen
12388 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 ] = 0;..
12389 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 tempLockPath
1238a 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0d 0a 20 20 = lockPath;..
1238b 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 tryOld
1238c 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0d 0a 20 LockPath = 1;..
1238d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 /* cr
1238e 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 eate a copy of t
1238f 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 he lock path if
12390 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b the conch is tak
12391 65 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 en */..
12392 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 goto end_take
12393 63 6f 6e 63 68 3b 0d 0a 20 20 20 20 20 20 20 20 conch;..
12394 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c }.. }el
12395 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 se if( hostIdMat
12396 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ch..
12397 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 && !strncmp(p
12398 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 Ctx->lockProxyPa
12399 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f th, &readBuf[PRO
1239a 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0d 0a XY_PATHINDEX],..
1239b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1239c 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c readL
1239d 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 en-PROXY_PATHIND
1239e 45 58 29 0d 0a 20 20 20 20 20 20 20 20 29 7b 0d EX).. ){.
1239f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f . /* co
123a0 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 nch host and loc
123a1 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0d k path match */.
123a2 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 . goto
123a3 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0d end_takeconch; .
123a4 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
123a5 20 20 7d 0d 0a 20 20 20 20 20 20 0d 0a 20 20 20 }.. ..
123a6 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e /* if the con
123a7 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c ch isn't writabl
123a8 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 e and doesn't ma
123a9 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 tch, we can't ta
123aa 6b 65 20 69 74 20 2a 2f 0d 0a 20 20 20 20 20 20 ke it */..
123ab 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e if( (conchFile->
123ac 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 openFlags&O_RDWR
123ad 29 20 3d 3d 20 30 20 29 7b 0d 0a 20 20 20 20 20 ) == 0 ){..
123ae 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
123af 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 67 6f USY;.. go
123b0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 to end_takeconch
123b1 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
123b2 20 20 0d 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 .. /* eit
123b3 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 her the conch di
123b4 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 dn't match or we
123b5 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 need to create
123b6 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0d 0a 20 20 a new one */..
123b7 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c if( !pCtx->l
123b8 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0d ockProxyPath ){.
123b9 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 . proxyGe
123ba 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e tLockPath(pCtx->
123bb 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 dbPath, lockPath
123bc 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0d 0a , MAXPATHLEN);..
123bd 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b tempLock
123be 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b Path = lockPath;
123bf 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 .. /* cre
123c0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 ate a copy of th
123c1 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c e lock path _onl
123c2 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 y_ if the conch
123c3 69 73 20 74 61 6b 65 6e 20 2a 2f 0d 0a 20 20 20 is taken */..
123c4 20 20 20 7d 0d 0a 20 20 20 20 20 20 0d 0a 20 20 }.. ..
123c5 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f /* update co
123c6 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e nch with host an
123c7 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c d path (this wil
123c8 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 l fail if other
123c9 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 2a process.. *
123ca 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c * has a shared l
123cb 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 ock already), if
123cc 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 the host id mat
123cd 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 ches, use the bi
123ce 67 0d 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 g.. ** stic
123cf 6b 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 k... */..
123d0 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 futimes(conc
123d1 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b hFile->h, NULL);
123d2 0d 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 .. if( host
123d3 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 IdMatch && !crea
123d4 74 65 43 6f 6e 63 68 20 29 7b 0d 0a 20 20 20 20 teConch ){..
123d5 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c if( conchFil
123d6 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e e->pInode && con
123d7 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e chFile->pInode->
123d8 6e 53 68 61 72 65 64 3e 31 20 29 7b 0d 0a 20 20 nShared>1 ){..
123d9 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 /* We ar
123da 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 e trying for an
123db 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 exclusive lock b
123dc 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 ut another threa
123dd 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 d in this..
123de 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 ** same pr
123df 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 ocess is still h
123e0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 olding a shared
123e1 6c 6f 63 6b 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 lock. */..
123e2 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
123e3 42 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 7d BUSY;.. }
123e4 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 else {
123e5 20 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 .. rc
123e6 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b = proxyConchLock
123e7 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 (pFile, myHostID
123e8 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b , EXCLUSIVE_LOCK
123e9 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
123ea 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
123eb 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 rc = conchF
123ec 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c ile->pMethod->xL
123ed 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c ock((sqlite3_fil
123ee 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 e*)conchFile, EX
123ef 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0d 0a CLUSIVE_LOCK);..
123f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 }.. i
123f1 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
123f2 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 61 ){.. cha
123f3 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 r writeBuffer[PR
123f4 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d OXY_MAXCONCHLEN]
123f5 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 ;.. int w
123f6 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0d 0a 20 riteSize = 0;..
123f7 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 ..
123f8 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 writeBuffer[0]
123f9 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f = (char)PROXY_CO
123fa 4e 43 48 56 45 52 53 49 4f 4e 3b 0d 0a 20 20 20 NCHVERSION;..
123fb 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 memcpy(&wri
123fc 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 teBuffer[PROXY_H
123fd 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 EADERLEN], myHos
123fe 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 tID, PROXY_HOSTI
123ff 44 4c 45 4e 29 3b 0d 0a 20 20 20 20 20 20 20 20 DLEN);..
12400 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 if( pCtx->lockPr
12401 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b oxyPath!=NULL ){
12402 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c .. strl
12403 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 cpy(&writeBuffer
12404 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 [PROXY_PATHINDEX
12405 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f ], pCtx->lockPro
12406 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c xyPath, MAXPATHL
12407 45 4e 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 EN);.. }e
12408 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
12409 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 strlcpy(&writeBu
1240a 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 ffer[PROXY_PATHI
1240b 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 NDEX], tempLockP
1240c 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 ath, MAXPATHLEN)
1240d 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
1240e 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 writeSize
1240f 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 = PROXY_PATHINDE
12410 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 X + strlen(&writ
12411 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 eBuffer[PROXY_PA
12412 54 48 49 4e 44 45 58 5d 29 3b 0d 0a 20 20 20 20 THINDEX]);..
12413 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e robust_ftrun
12414 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e cate(conchFile->
12415 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0d 0a h, writeSize);..
12416 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 rc = uni
12417 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f xWrite((sqlite3_
12418 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 file *)conchFile
12419 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 , writeBuffer, w
1241a 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0d 0a 20 riteSize, 0);..
1241b 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e fsync(con
1241c 63 68 46 69 6c 65 2d 3e 68 29 3b 0d 0a 20 20 20 chFile->h);..
1241d 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 /* If we cr
1241e 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 eated a new conc
1241f 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 h file (not just
12420 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e updated the con
12421 74 65 6e 74 73 20 6f 66 20 61 20 0d 0a 20 20 20 tents of a ..
12422 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 ** valid c
12423 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 onch file), try
12424 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 to match the per
12425 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 missions of the
12426 64 61 74 61 62 61 73 65 20 0d 0a 20 20 20 20 20 database ..
12427 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
12428 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
12429 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 K && createConch
1242a 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 ){.. s
1242b 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0d truct stat buf;.
1242c 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 . int e
1242d 72 72 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 rr = osFstat(pFi
1242e 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0d 0a 20 le->h, &buf);..
1242f 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 if( err
12430 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ==0 ){..
12431 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 mode_t cmode
12432 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 = buf.st_mode&(
12433 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 S_IRUSR|S_IWUSR
12434 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 | S_IRGRP|S_IWGR
12435 50 20 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 P |..
12436 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12437 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 S_I
12438 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0d 0a ROTH|S_IWOTH);..
12439 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 /* t
1243a 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 ry to match the
1243b 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f database file R/
1243c 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 W permissions, i
1243d 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f gnore failure */
1243e 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1243f 5f 50 52 4f 58 59 5f 44 45 42 55 47 0d 0a 20 20 _PROXY_DEBUG..
12440 20 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d osFchm
12441 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c od(conchFile->h,
12442 20 63 6d 6f 64 65 29 3b 0d 0a 23 65 6c 73 65 0d cmode);..#else.
12443 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b . do{
12444 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
12445 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f rc = osFchmod(co
12446 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 nchFile->h, cmod
12447 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 e);..
12448 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 }while( rc==(-1
12449 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 ) && errno==EINT
1244a 52 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 R );..
1244b 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0d 0a if( rc!=0 ){..
1244c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e in
1244d 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0d t code = errno;.
1244e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 . f
1244f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
12450 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 fchmod %o FAILED
12451 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0d with %d %s\n",.
12452 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
12453 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f cmode, co
12454 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 de, strerror(cod
12455 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 e));..
12456 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 } else {..
12457 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 fprint
12458 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f f(stderr, "fchmo
12459 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 d %o SUCCEDED\n"
1245a 2c 63 6d 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20 ,cmode);..
1245b 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
1245c 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1245d 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 int code
1245e 3d 20 65 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 = errno;..
1245f 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 fprintf(st
12460 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c derr, "STAT FAIL
12461 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 ED[%d] with %d %
12462 73 5c 6e 22 2c 20 0d 0a 20 20 20 20 20 20 20 20 s\n", ..
12463 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c err,
12464 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 code, strerror(
12465 63 6f 64 65 29 29 3b 0d 0a 23 65 6e 64 69 66 0d code));..#endif.
12466 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 . }..
12467 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d }.. }
12468 0d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c .. conchFil
12469 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c e->pMethod->xUnl
1246a 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c ock((sqlite3_fil
1246b 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 e*)conchFile, SH
1246c 41 52 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 ARED_LOCK);..
1246d 20 20 20 0d 0a 20 20 20 20 65 6e 64 5f 74 61 6b .. end_tak
1246e 65 63 6f 6e 63 68 3a 0d 0a 20 20 20 20 20 20 4f econch:.. O
1246f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 STRACE(("TRANSPR
12470 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e OXY: CLOSE %d\n
12471 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0d 0a ", pFile->h));..
12472 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
12473 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 LITE_OK && pFile
12474 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0d 0a ->openFlags ){..
12475 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 3b 0d int fd;.
12476 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 . if( pFi
12477 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0d 0a 20 20 20 le->h>=0 ){..
12478 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c robust_cl
12479 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 ose(pFile, pFile
1247a 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0d ->h, __LINE__);.
1247b 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
1247c 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d pFile->h = -
1247d 31 3b 0d 0a 20 20 20 20 20 20 20 20 66 64 20 3d 1;.. fd =
1247e 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74 robust_open(pCt
1247f 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 x->dbPath, pFile
12480 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0d 0a 20 20 ->openFlags,..
12481 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12482 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 SQLITE_DEFAU
12483 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 LT_FILE_PERMISSI
12484 4f 4e 53 29 3b 0d 0a 20 20 20 20 20 20 20 20 4f ONS);.. O
12485 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 STRACE(("TRANSPR
12486 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 OXY: OPEN %d\n"
12487 2c 20 66 64 29 29 3b 0d 0a 20 20 20 20 20 20 20 , fd));..
12488 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0d 0a 20 if( fd>=0 ){..
12489 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
1248a 68 20 3d 20 66 64 3b 0d 0a 20 20 20 20 20 20 20 h = fd;..
1248b 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 }else{..
1248c 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e rc=SQLITE_CAN
1248d 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 TOPEN_BKPT; /* S
1248e 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 QLITE_BUSY? prox
1248f 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 yTakeConch calle
12490 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 d.. du
12491 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0d ring locking */.
12492 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
12493 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 72 }.. if( r
12494 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
12495 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 !pCtx->lockProxy
12496 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 61 ){.. cha
12497 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f r *path = tempLo
12498 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 ckPath ? tempLoc
12499 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f kPath : pCtx->lo
1249a 63 6b 50 72 6f 78 79 50 61 74 68 3b 0d 0a 20 20 ckProxyPath;..
1249b 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 rc = proxy
1249c 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 CreateUnixFile(p
1249d 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b ath, &pCtx->lock
1249e 50 72 6f 78 79 2c 20 31 29 3b 0d 0a 20 20 20 20 Proxy, 1);..
1249f 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
124a0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c TE_OK && rc!=SQL
124a1 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 ITE_NOMEM && try
124a2 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0d 0a OldLockPath ){..
124a3 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 /* we
124a4 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 couldn't create
124a5 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 the proxy lock f
124a6 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 ile with the old
124a7 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0d lock file path.
124a8 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 . ** s
124a9 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 o try again via
124aa 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0d 0a 20 20 auto-naming ..
124ab 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 */..
124ac 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c forceNewL
124ad 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0d 0a 20 20 ockPath = 1;..
124ae 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f tryOldLo
124af 63 6b 50 61 74 68 20 3d 20 30 3b 0d 0a 20 20 20 ckPath = 0;..
124b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b continue;
124b1 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 /* go back to t
124b2 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 he do {} while s
124b3 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 tart point, try
124b4 61 67 61 69 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 again */..
124b5 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 }.. }..
124b6 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
124b7 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
124b8 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b /* Need to mak
124b9 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 e a copy of path
124ba 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 if we extracted
124bb 20 74 68 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 the value..
124bc 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 ** from the
124bd 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 conch file or t
124be 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f he path was allo
124bf 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 cated on the sta
124c0 63 6b 0d 0a 20 20 20 20 20 20 20 20 20 2a 2f 0d ck.. */.
124c1 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d . if( tem
124c2 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0d 0a 20 20 pLockPath ){..
124c3 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f pCtx->lo
124c4 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 ckProxyPath = sq
124c5 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c lite3DbStrDup(0,
124c6 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0d tempLockPath);.
124c7 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 . if( !
124c8 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 pCtx->lockProxyP
124c9 61 74 68 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ath ){..
124ca 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
124cb 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 20 20 NOMEM;..
124cc 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a }.. }..
124cd 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 }.. i
124ce 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
124cf 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 43 74 ){.. pCt
124d0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 x->conchHeld = 1
124d1 3b 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 ;.. ..
124d2 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c if( pCtx->l
124d3 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f ockProxy->pMetho
124d4 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f d == &afpIoMetho
124d5 64 73 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 ds ){..
124d6 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 afpLockingConte
124d7 78 74 20 2a 61 66 70 43 74 78 3b 0d 0a 20 20 20 xt *afpCtx;..
124d8 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 afpCtx =
124d9 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 (afpLockingConte
124da 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 xt *)pCtx->lockP
124db 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e roxy->lockingCon
124dc 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 text;..
124dd 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 afpCtx->dbPath
124de 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 = pCtx->lockProx
124df 79 50 61 74 68 3b 0d 0a 20 20 20 20 20 20 20 20 yPath;..
124e0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 }.. } else
124e1 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 {.. conch
124e2 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 File->pMethod->x
124e3 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f Unlock((sqlite3_
124e4 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c file*)conchFile,
124e5 20 4e 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 NO_LOCK);..
124e6 20 20 7d 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 }.. OSTRA
124e7 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 CE(("TAKECONCH
124e8 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 %d %s\n", conchF
124e9 69 6c 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 20 20 ile->h,..
124ea 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 rc==SQLI
124eb 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c TE_OK?"ok":"fail
124ec 65 64 22 29 29 3b 0d 0a 20 20 20 20 20 20 72 65 ed"));.. re
124ed 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 20 turn rc;.. }
124ee 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e while (1); /* in
124ef 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f case we need to
124f0 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f retry the :auto
124f1 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0d 0a : lock file - ..
124f2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
124f3 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 ** we should ne
124f4 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63 ver get here exc
124f5 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e ept via the 'con
124f6 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0d tinue' call. */.
124f7 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
124f8 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 * If pFile holds
124f9 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e a lock on a con
124fa 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 ch file, then re
124fb 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e lease that lock.
124fc 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
124fd 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e proxyReleaseCon
124fe 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 ch(unixFile *pFi
124ff 6c 65 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d le){.. int rc =
12500 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 SQLITE_OK;
12501 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e /* Subroutin
12502 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f e return code */
12503 0d 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 .. proxyLocking
12504 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 Context *pCtx;
12505 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 /* The locking c
12506 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 ontext for the p
12507 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 roxy lock */..
12508 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 unixFile *conchF
12509 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e ile; /* N
1250a 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 ame of the conch
1250b 20 66 69 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 70 43 file */.... pC
1250c 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 tx = (proxyLocki
1250d 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c ngContext *)pFil
1250e 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 e->lockingContex
1250f 74 3b 0d 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 t;.. conchFile
12510 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c = pCtx->conchFil
12511 65 3b 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 e;.. OSTRACE(("
12512 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 RELEASECONCH %d
12513 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e for %s pid=%d\n
12514 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c ", conchFile->h,
12515 0d 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 .. (pC
12516 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 tx->lockProxyPat
12517 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 h ? pCtx->lockPr
12518 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f oxyPath : ":auto
12519 3a 22 29 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 :"), ..
1251a 20 20 67 65 74 70 69 64 28 29 29 29 3b 0d 0a 20 getpid()));..
1251b 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 if( pCtx->conch
1251c 48 65 6c 64 3e 30 20 29 7b 0d 0a 20 20 20 20 72 Held>0 ){.. r
1251d 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 c = conchFile->p
1251e 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 Method->xUnlock(
1251f 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 (sqlite3_file*)c
12520 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 onchFile, NO_LOC
12521 4b 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 43 74 78 K);.. }.. pCtx
12522 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b ->conchHeld = 0;
12523 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 .. OSTRACE(("RE
12524 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 LEASECONCH %d %
12525 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d s\n", conchFile-
12526 3e 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 >h,..
12527 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f (rc==SQLITE_OK ?
12528 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 "ok" : "failed"
12529 29 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 )));.. return r
1252a 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1252b 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f Given the name o
1252c 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c f a database fil
1252d 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e e, compute the n
1252e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 ame of its conch
1252f 20 66 69 6c 65 2e 0d 0a 2a 2a 20 53 74 6f 72 65 file...** Store
12530 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e the conch filen
12531 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 ame in memory ob
12532 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 tained from sqli
12533 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a te3_malloc()...*
12534 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 * Make *pConchPa
12535 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 th point to the
12536 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 new name. Retur
12537 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 n SQLITE_OK on s
12538 75 63 63 65 73 73 0d 0a 2a 2a 20 6f 72 20 53 51 uccess..** or SQ
12539 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e LITE_NOMEM if un
1253a 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d able to obtain m
1253b 65 6d 6f 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 emory...**..** T
1253c 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 he caller is res
1253d 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 ponsible for ens
1253e 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 uring that the a
1253f 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0d llocated memory.
12540 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 .** space is eve
12541 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0d 0a ntually freed...
12542 2a 2a 0d 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 **..** *pConchPa
12543 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c th is set to NUL
12544 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c L if a memory al
12545 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f location error o
12546 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ccurs...*/..stat
12547 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 ic int proxyCrea
12548 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 teConchPathname(
12549 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 char *dbPath, ch
1254a 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 ar **pConchPath)
1254b 7b 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 {.. int i;
1254c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1254d 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 /* Loop count
1254e 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6c 65 6e er */.. int len
1254f 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 = (int)strlen(d
12550 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 bPath); /* Lengt
12551 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 h of database fi
12552 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 lename - dbPath
12553 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 */.. char *conc
12554 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 hPath;
12555 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e /* buffer in
12556 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 which to constr
12557 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a uct conch name *
12558 2f 0d 0a 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 /.... /* Alloca
12559 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 te space for the
1255a 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 conch filename
1255b 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 and initialize t
1255c 68 65 20 6e 61 6d 65 20 74 6f 0d 0a 20 20 2a 2a he name to.. **
1255d 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
1255e 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 original databa
1255f 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0d 0a 20 se file. */ ..
12560 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 *pConchPath = c
12561 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 onchPath = (char
12562 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f *)sqlite3_mallo
12563 63 28 6c 65 6e 20 2b 20 38 29 3b 0d 0a 20 20 69 c(len + 8);.. i
12564 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 f( conchPath==0
12565 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){.. return S
12566 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 QLITE_NOMEM;..
12567 7d 0d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 }.. memcpy(conc
12568 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c hPath, dbPath, l
12569 65 6e 2b 31 29 3b 0d 0a 20 20 0d 0a 20 20 2f 2a en+1);.. .. /*
1256a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e now insert a ".
1256b 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 " before the las
1256c 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f t / character */
1256d 0d 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d .. for( i=(len-
1256e 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 1); i>=0; i-- ){
1256f 0d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 .. if( conchP
12570 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0d 0a ath[i]=='/' ){..
12571 20 20 20 20 20 20 69 2b 2b 3b 0d 0a 20 20 20 20 i++;..
12572 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d break;.. }.
12573 0a 20 20 7d 0d 0a 20 20 63 6f 6e 63 68 50 61 74 . }.. conchPat
12574 68 5b 69 5d 3d 27 2e 27 3b 0d 0a 20 20 77 68 69 h[i]='.';.. whi
12575 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0d 0a 20 le ( i<len ){..
12576 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 conchPath[i+1
12577 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0d 0a 20 20 ]=dbPath[i];..
12578 20 20 69 2b 2b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 i++;.. }....
12579 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 /* append the "
1257a 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 -conch" suffix t
1257b 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 o the file */..
1257c 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 memcpy(&conchPa
1257d 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 th[i+1], "-conch
1257e 22 2c 20 37 29 3b 0d 0a 20 20 61 73 73 65 72 74 ", 7);.. assert
1257f 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f ( (int)strlen(co
12580 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b nchPath) == len+
12581 37 20 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 7 );.... return
12582 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a SQLITE_OK;..}..
12583 0d 0a 0d 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 ..../* Takes a f
12584 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 ully configured
12585 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 proxy locking-st
12586 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e yle unix file an
12587 64 20 73 77 69 74 63 68 65 73 0d 0a 2a 2a 20 74 d switches..** t
12588 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 he local lock fi
12589 6c 65 20 70 61 74 68 20 0d 0a 2a 2f 0d 0a 73 74 le path ..*/..st
1258a 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c atic int switchL
1258b 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 ockProxyPath(uni
1258c 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f xFile *pFile, co
1258d 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 nst char *path)
1258e 7b 0d 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e {.. proxyLockin
1258f 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d gContext *pCtx =
12590 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f (proxyLockingCo
12591 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f ntext*)pFile->lo
12592 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a 20 ckingContext;..
12593 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d char *oldPath =
12594 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 pCtx->lockProxy
12595 50 61 74 68 3b 0d 0a 20 20 69 6e 74 20 72 63 20 Path;.. int rc
12596 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a = SQLITE_OK;....
12597 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 if( pFile->eFi
12598 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 leLock!=NO_LOCK
12599 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){.. return S
1259a 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 20 7d QLITE_BUSY;.. }
1259b 20 20 0d 0a 0d 0a 20 20 2f 2a 20 6e 6f 74 68 69 .... /* nothi
1259c 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 ng to do if the
1259d 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 path is NULL, :a
1259e 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 uto: or matches
1259f 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 the existing pat
125a0 68 20 2a 2f 0d 0a 20 20 69 66 28 20 21 70 61 74 h */.. if( !pat
125a1 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c h || path[0]=='\
125a2 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 0' || !strcmp(pa
125a3 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c th, ":auto:") ||
125a4 0d 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 .. (oldPath &
125a5 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 & !strncmp(oldPa
125a6 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 th, path, MAXPAT
125a7 48 4c 45 4e 29 29 20 29 7b 0d 0a 20 20 20 20 72 HLEN)) ){.. r
125a8 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
125a9 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
125aa 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 unixFile *lockPr
125ab 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b oxy = pCtx->lock
125ac 50 72 6f 78 79 3b 0d 0a 20 20 20 20 70 43 74 78 Proxy;.. pCtx
125ad 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c ->lockProxy=NULL
125ae 3b 0d 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e ;.. pCtx->con
125af 63 68 48 65 6c 64 20 3d 20 30 3b 0d 0a 20 20 20 chHeld = 0;..
125b0 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d if( lockProxy!=
125b1 4e 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 20 20 72 NULL ){.. r
125b2 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 c=lockProxy->pMe
125b3 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 thod->xClose((sq
125b4 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 lite3_file *)loc
125b5 6b 50 72 6f 78 79 29 3b 0d 0a 20 20 20 20 20 20 kProxy);..
125b6 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 if( rc ) return
125b7 72 63 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 rc;.. sqlit
125b8 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 e3_free(lockProx
125b9 79 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 y);.. }..
125ba 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 sqlite3_free(old
125bb 50 61 74 68 29 3b 0d 0a 20 20 20 20 70 43 74 78 Path);.. pCtx
125bc 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 ->lockProxyPath
125bd 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 = sqlite3DbStrDu
125be 70 28 30 2c 20 70 61 74 68 29 3b 0d 0a 20 20 7d p(0, path);.. }
125bf 0d 0a 20 20 0d 0a 20 20 72 65 74 75 72 6e 20 72 .. .. return r
125c0 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
125c1 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 pFile is a file
125c2 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 that has been op
125c3 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 ened by a prior
125c4 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 xOpen call. dbP
125c5 61 74 68 0d 0a 2a 2a 20 69 73 20 61 20 73 74 72 ath..** is a str
125c6 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 ing buffer at le
125c7 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 ast MAXPATHLEN+1
125c8 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 characters in s
125c9 69 7a 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ize...**..** Thi
125ca 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 s routine find t
125cb 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f he filename asso
125cc 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c ciated with pFil
125cd 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0d e and writes it.
125ce 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0d .** int dbPath..
125cf 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
125d0 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f proxyGetDbPathFo
125d1 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 rUnixFile(unixFi
125d2 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 le *pFile, char
125d3 2a 64 62 50 61 74 68 29 7b 0d 0a 23 69 66 20 64 *dbPath){..#if d
125d4 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f efined(__APPLE__
125d5 29 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e ).. if( pFile->
125d6 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 pMethod == &afpI
125d7 6f 4d 65 74 68 6f 64 73 20 29 7b 0d 0a 20 20 20 oMethods ){..
125d8 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 /* afp style ke
125d9 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 eps a reference
125da 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69 to the db path i
125db 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 n the filePath f
125dc 69 65 6c 64 20 0d 0a 20 20 20 20 2a 2a 20 6f 66 ield .. ** of
125dd 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0d 0a the struct */..
125de 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 assert( (int
125df 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 )strlen((char*)p
125e0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e File->lockingCon
125e1 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 text)<=MAXPATHLE
125e2 4e 20 29 3b 0d 0a 20 20 20 20 73 74 72 6c 63 70 N );.. strlcp
125e3 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c y(dbPath, ((afpL
125e4 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 ockingContext *)
125e5 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f pFile->lockingCo
125e6 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 ntext)->dbPath,
125e7 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0d 0a 20 20 MAXPATHLEN);..
125e8 7d 20 65 6c 73 65 0d 0a 23 65 6e 64 69 66 0d 0a } else..#endif..
125e9 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 if( pFile->pMe
125ea 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b thod == &dotlock
125eb 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0d 0a 20 20 IoMethods ){..
125ec 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 /* dot lock st
125ed 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 yle uses the loc
125ee 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 king context to
125ef 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f store the dot lo
125f0 63 6b 0d 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 ck.. ** file
125f1 70 61 74 68 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 path */.. int
125f2 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 len = strlen((c
125f3 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 har *)pFile->loc
125f4 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 kingContext) - s
125f5 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 trlen(DOTLOCK_SU
125f6 46 46 49 58 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 FFIX);.. memc
125f7 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 py(dbPath, (char
125f8 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e *)pFile->lockin
125f9 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 gContext, len +
125fa 31 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 1);.. }else{..
125fb 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 /* all other
125fc 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c styles use the l
125fd 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 ocking context t
125fe 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 o store the db f
125ff 69 6c 65 20 70 61 74 68 20 2a 2f 0d 0a 20 20 20 ile path */..
12600 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 assert( strlen(
12601 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f (char*)pFile->lo
12602 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d ckingContext)<=M
12603 41 58 50 41 54 48 4c 45 4e 20 29 3b 0d 0a 20 20 AXPATHLEN );..
12604 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 strlcpy(dbPath
12605 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d , (char *)pFile-
12606 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c >lockingContext,
12607 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0d 0a 20 MAXPATHLEN);..
12608 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c }.. return SQL
12609 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
1260a 0d 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c ..** Takes an al
1260b 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 ready filled in
1260c 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c unix file and al
1260d 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 ters it so all f
1260e 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0d 0a 2a 2a ile locking ..**
1260f 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d will be perform
12610 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 ed on the local
12611 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e proxy lock file.
12612 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 The following
12613 66 69 65 6c 64 73 0d 0a 2a 2a 20 61 72 65 20 70 fields..** are p
12614 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 reserved in the
12615 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 locking context
12616 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e so that they can
12617 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 be restored and
12618 20 0d 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 ..** the unix s
12619 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c tructure properl
1261a 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 y cleaned up at
1261b 63 6c 6f 73 65 20 74 69 6d 65 3a 0d 0a 2a 2a 20 close time:..**
1261c 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 ->lockingContex
1261d 74 0d 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 t..** ->pMethod
1261e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1261f 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 proxyTransformU
12620 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 nixFile(unixFile
12621 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 *pFile, const c
12622 68 61 72 20 2a 70 61 74 68 29 20 7b 0d 0a 20 20 har *path) {..
12623 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 proxyLockingCont
12624 65 78 74 20 2a 70 43 74 78 3b 0d 0a 20 20 63 68 ext *pCtx;.. ch
12625 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 ar dbPath[MAXPAT
12626 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f HLEN+1]; /
12627 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 * Name of the da
12628 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a tabase file */..
12629 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 char *lockPath
1262a 3d 4e 55 4c 4c 3b 0d 0a 20 20 69 6e 74 20 72 63 =NULL;.. int rc
1262b 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 = SQLITE_OK;..
1262c 20 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e .. if( pFile->
1262d 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f eFileLock!=NO_LO
1262e 43 4b 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 CK ){.. retur
1262f 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a n SQLITE_BUSY;..
12630 20 20 7d 0d 0a 20 20 70 72 6f 78 79 47 65 74 44 }.. proxyGetD
12631 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 bPathForUnixFile
12632 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b (pFile, dbPath);
12633 0d 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c .. if( !path ||
12634 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c path[0]=='\0' |
12635 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 | !strcmp(path,
12636 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0d 0a 20 20 ":auto:") ){..
12637 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b lockPath=NULL;
12638 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
12639 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a lockPath=(char *
1263a 29 70 61 74 68 3b 0d 0a 20 20 7d 0d 0a 20 20 0d )path;.. }.. .
1263b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 . OSTRACE(("TRA
1263c 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 NSPROXY %d for
1263d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 %s pid=%d\n", pF
1263e 69 6c 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 20 20 ile->h,..
1263f 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 (lockPath ?
12640 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 lockPath : ":aut
12641 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 o:"), getpid()))
12642 3b 0d 0a 0d 0a 20 20 70 43 74 78 20 3d 20 73 71 ;.... pCtx = sq
12643 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 lite3_malloc( si
12644 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0d 0a zeof(*pCtx) );..
12645 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b if( pCtx==0 ){
12646 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
12647 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d ITE_NOMEM;.. }.
12648 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 . memset(pCtx,
12649 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 0, sizeof(*pCtx)
1264a 29 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 70 72 6f );.... rc = pro
1264b 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 xyCreateConchPat
1264c 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 hname(dbPath, &p
1264d 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 Ctx->conchFilePa
1264e 74 68 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d th);.. if( rc==
1264f 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
12650 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 rc = proxyCrea
12651 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d teUnixFile(pCtx-
12652 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 >conchFilePath,
12653 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 &pCtx->conchFile
12654 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 , 0);.. if( r
12655 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 c==SQLITE_CANTOP
12656 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f EN && ((pFile->o
12657 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 penFlags&O_RDWR)
12658 20 3d 3d 20 30 29 20 29 7b 0d 0a 20 20 20 20 20 == 0) ){..
12659 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f /* if (a) the o
1265a 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f pen flags are no
1265b 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 t O_RDWR, (b) th
1265c 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 e conch isn't th
1265d 65 72 65 2c 20 61 6e 64 0d 0a 20 20 20 20 20 20 ere, and..
1265e 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 ** (c) the file
1265f 73 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f system is read-o
12660 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 nly, then enable
12661 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 no-locking acce
12662 73 73 2e 0d 0a 20 20 20 20 20 20 2a 2a 20 55 67 ss... ** Ug
12663 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c h, since O_RDONL
12664 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 Y==0x0000 we tes
12665 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 t for !O_RDWR si
12666 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 nce unixOpen ass
12667 65 72 74 73 0d 0a 20 20 20 20 20 20 2a 2a 20 74 erts.. ** t
12668 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 hat openFlags wi
12669 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 ll have only one
1266a 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 of O_RDONLY or
1266b 4f 5f 52 44 57 52 2e 0d 0a 20 20 20 20 20 20 2a O_RDWR... *
1266c 2f 0d 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 /.. struct
1266d 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0d 0a statfs fsInfo;..
1266e 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 struct sta
1266f 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0d 0a 20 20 t conchInfo;..
12670 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 int goLockle
12671 73 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 ss = 0;....
12672 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74 78 if( osStat(pCtx
12673 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c ->conchFilePath,
12674 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 &conchInfo) ==
12675 2d 31 20 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 -1 ) {..
12676 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b int err = errno;
12677 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 .. if( (e
12678 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 rr==ENOENT) && (
12679 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 statfs(dbPath, &
1267a 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 fsInfo) != -1) )
1267b 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c {.. goL
1267c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 ockless = (fsInf
1267d 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 o.f_flags&MNT_RD
1267e 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f ONLY) == MNT_RDO
1267f 4e 4c 59 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d NLY;.. }.
12680 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
12681 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 if( goLockless )
12682 7b 0d 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d {.. pCtx-
12683 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b >conchHeld = -1;
12684 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 /* read only FS
12685 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0d 0a 20 / lockless */..
12686 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
12687 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 7d 0d TE_OK;.. }.
12688 0a 20 20 20 20 7d 0d 0a 20 20 7d 20 20 0d 0a 20 . }.. } ..
12689 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
1268a 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 OK && lockPath )
1268b 7b 0d 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 {.. pCtx->loc
1268c 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c kProxyPath = sql
1268d 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 ite3DbStrDup(0,
1268e 6c 6f 63 6b 50 61 74 68 29 3b 0d 0a 20 20 7d 0d lockPath);.. }.
1268f 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c ... if( rc==SQL
12690 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 ITE_OK ){.. p
12691 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 Ctx->dbPath = sq
12692 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c lite3DbStrDup(0,
12693 20 64 62 50 61 74 68 29 3b 0d 0a 20 20 20 20 69 dbPath);.. i
12694 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d f( pCtx->dbPath=
12695 3d 4e 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 20 20 =NULL ){..
12696 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 rc = SQLITE_NOME
12697 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a M;.. }.. }..
12698 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
12699 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 61 _OK ){.. /* a
1269a 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c ll memory is all
1269b 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 ocated, proxys a
1269c 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 re created and a
1269d 73 73 69 67 6e 65 64 2c 20 0d 0a 20 20 20 20 2a ssigned, .. *
1269e 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63 * switch the loc
1269f 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 king context and
126a0 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65 pMethod then re
126a1 74 75 72 6e 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 turn... */..
126a2 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b pCtx->oldLock
126a3 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 ingContext = pFi
126a4 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 le->lockingConte
126a5 78 74 3b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e xt;.. pFile->
126a6 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d lockingContext =
126a7 20 70 43 74 78 3b 0d 0a 20 20 20 20 70 43 74 78 pCtx;.. pCtx
126a8 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 ->pOldMethod = p
126a9 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0d 0a File->pMethod;..
126aa 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 pFile->pMeth
126ab 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 od = &proxyIoMet
126ac 68 6f 64 73 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d hods;.. }else{.
126ad 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 . if( pCtx->c
126ae 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0d 0a 20 20 onchFile ){ ..
126af 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 pCtx->conchF
126b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 ile->pMethod->xC
126b1 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 lose((sqlite3_fi
126b2 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 le *)pCtx->conch
126b3 46 69 6c 65 29 3b 0d 0a 20 20 20 20 20 20 73 71 File);.. sq
126b4 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d lite3_free(pCtx-
126b5 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0d 0a 20 20 >conchFile);..
126b6 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 }.. sqlite3
126b7 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e DbFree(0, pCtx->
126b8 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0d lockProxyPath);.
126b9 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
126ba 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c e(pCtx->conchFil
126bb 65 50 61 74 68 29 3b 20 0d 0a 20 20 20 20 73 71 ePath); .. sq
126bc 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 lite3_free(pCtx)
126bd 3b 0d 0a 20 20 7d 0d 0a 20 20 4f 53 54 52 41 43 ;.. }.. OSTRAC
126be 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 E(("TRANSPROXY
126bf 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d %d %s\n", pFile-
126c0 3e 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 >h,..
126c1 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f (rc==SQLITE_OK ?
126c2 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 "ok" : "failed"
126c3 29 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 )));.. return r
126c4 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a c;..}....../*..*
126c5 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 * This routine h
126c6 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 andles sqlite3_f
126c7 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 ile_control() ca
126c8 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65 lls that are spe
126c9 63 69 66 69 63 0d 0a 2a 2a 20 74 6f 20 70 72 6f cific..** to pro
126ca 78 79 20 6c 6f 63 6b 69 6e 67 2e 0d 0a 2a 2f 0d xy locking...*/.
126cb 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 .static int prox
126cc 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c yFileControl(sql
126cd 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
126ce 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 nt op, void *pAr
126cf 67 29 7b 0d 0a 20 20 73 77 69 74 63 68 28 20 6f g){.. switch( o
126d0 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 53 p ){.. case S
126d1 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 QLITE_GET_LOCKPR
126d2 4f 58 59 46 49 4c 45 3a 20 7b 0d 0a 20 20 20 20 OXYFILE: {..
126d3 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c unixFile *pFil
126d4 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 e = (unixFile*)i
126d5 64 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 46 d;.. if( pF
126d6 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 ile->pMethod ==
126d7 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 &proxyIoMethods
126d8 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 78 ){.. prox
126d9 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 yLockingContext
126da 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f *pCtx = (proxyLo
126db 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 ckingContext*)pF
126dc 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 ile->lockingCont
126dd 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 ext;.. pr
126de 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 oxyTakeConch(pFi
126df 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 le);.. if
126e0 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 ( pCtx->lockProx
126e1 79 50 61 74 68 20 29 7b 0d 0a 20 20 20 20 20 20 yPath ){..
126e2 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 *(const char
126e3 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d **)pArg = pCtx-
126e4 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0d >lockProxyPath;.
126e5 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d . }else{.
126e6 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e . *(con
126e7 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 st char **)pArg
126e8 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 = ":auto: (not h
126e9 65 6c 64 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 eld)";..
126ea 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 }.. } else
126eb 7b 0d 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e {.. *(con
126ec 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 st char **)pArg
126ed 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 20 20 20 20 7d = NULL;.. }
126ee 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
126ef 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d QLITE_OK;.. }
126f0 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 .. case SQLIT
126f1 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 E_SET_LOCKPROXYF
126f2 49 4c 45 3a 20 7b 0d 0a 20 20 20 20 20 20 75 6e ILE: {.. un
126f3 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 ixFile *pFile =
126f4 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a (unixFile*)id;..
126f5 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 int rc = S
126f6 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 QLITE_OK;..
126f7 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c int isProxyStyl
126f8 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 e = (pFile->pMet
126f9 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d hod == &proxyIoM
126fa 65 74 68 6f 64 73 29 3b 0d 0a 20 20 20 20 20 20 ethods);..
126fb 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c if( pArg==NULL |
126fc 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 | (const char *)
126fd 70 41 72 67 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 pArg==0 ){..
126fe 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 if( isProxyS
126ff 74 79 6c 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 tyle ){..
12700 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 /* turn off p
12701 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e roxy locking - n
12702 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0d ot supported */.
12703 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
12704 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 SQLITE_ERROR /*S
12705 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 QLITE_PROTOCOL?
12706 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f SQLITE_MISUSE?*/
12707 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 ;.. }else
12708 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 {.. /*
12709 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c turn off proxy l
1270a 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 ocking - already
1270b 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0d 0a off - NOOP */..
1270c 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 rc = S
1270d 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 QLITE_OK;..
1270e 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 }.. }els
1270f 65 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 e{.. cons
12710 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 t char *proxyPat
12711 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 h = (const char
12712 2a 29 70 41 72 67 3b 0d 0a 20 20 20 20 20 20 20 *)pArg;..
12713 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c if( isProxyStyl
12714 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 e ){..
12715 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 proxyLockingCont
12716 65 78 74 20 2a 70 43 74 78 20 3d 20 0d 0a 20 20 ext *pCtx = ..
12717 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 (proxy
12718 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 LockingContext*)
12719 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f pFile->lockingCo
1271a 6e 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 ntext;..
1271b 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 if( !strcmp(pA
1271c 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0d 0a rg, ":auto:") ..
1271d 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 || (p
1271e 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 Ctx->lockProxyPa
1271f 74 68 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 th &&..
12720 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 !strncmp(p
12721 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 Ctx->lockProxyPa
12722 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d th, proxyPath, M
12723 41 58 50 41 54 48 4c 45 4e 29 29 0d 0a 20 20 20 AXPATHLEN))..
12724 20 20 20 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 ){..
12725 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
12726 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 TE_OK;..
12727 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
12728 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 rc = switc
12729 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 hLockProxyPath(p
1272a 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 File, proxyPath)
1272b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a ;.. }..
1272c 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a }else{..
1272d 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 /* tur
1272e 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 n on proxy file
1272f 6c 6f 63 6b 69 6e 67 20 2a 2f 0d 0a 20 20 20 20 locking */..
12730 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 rc = proxy
12731 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c TransformUnixFil
12732 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 e(pFile, proxyPa
12733 74 68 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d th);.. }.
12734 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
12735 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 return rc;..
12736 7d 0d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 }.. default:
12737 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 {.. assert(
12738 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 0 ); /* The ca
12739 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20 ll assures that
1273a 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 only valid opcod
1273b 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0d 0a es are sent */..
1273c 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 2f 2a }.. }.. /*
1273d 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0d 0a 20 20 NOTREACHED*/..
1273e 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
1273f 52 4f 52 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a ROR;..}..../*..*
12740 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 * Within this di
12741 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 vision (the prox
12742 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 ying locking imp
12743 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 lementation) the
12744 20 70 72 6f 63 65 64 75 72 65 73 0d 0a 2a 2a 20 procedures..**
12745 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 above this point
12746 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 are all utiliti
12747 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 es. The lock-re
12748 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 lated methods of
12749 20 74 68 65 0d 0a 2a 2a 20 70 72 6f 78 79 2d 6c the..** proxy-l
1274a 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 ocking sqlite3_i
1274b 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 o_method object
1274c 66 6f 6c 6c 6f 77 2e 0d 0a 2a 2f 0d 0a 0d 0a 0d follow...*/.....
1274d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ./*..** This rou
1274e 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 tine checks if t
1274f 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 here is a RESERV
12750 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 ED lock held on
12751 74 68 65 20 73 70 65 63 69 66 69 65 64 0d 0a 2a the specified..*
12752 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f * file by this o
12753 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 r any other proc
12754 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c ess. If such a l
12755 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 ock is held, set
12756 20 2a 70 52 65 73 4f 75 74 0d 0a 2a 2a 20 74 6f *pResOut..** to
12757 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 a non-zero valu
12758 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 e otherwise *pRe
12759 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a sOut is set to z
1275a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e ero. The return
1275b 20 76 61 6c 75 65 0d 0a 2a 2a 20 69 73 20 73 65 value..** is se
1275c 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 t to SQLITE_OK u
1275d 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 nless an I/O err
1275e 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 or occurs during
1275f 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0d lock checking..
12760 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
12761 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 proxyCheckReserv
12762 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 edLock(sqlite3_f
12763 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 ile *id, int *pR
12764 65 73 4f 75 74 29 20 7b 0d 0a 20 20 75 6e 69 78 esOut) {.. unix
12765 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 File *pFile = (u
12766 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 nixFile*)id;..
12767 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 int rc = proxyTa
12768 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0d keConch(pFile);.
12769 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
1276a 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 72 6f E_OK ){.. pro
1276b 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 xyLockingContext
1276c 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c *pCtx = (proxyL
1276d 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 ockingContext *)
1276e 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f pFile->lockingCo
1276f 6e 74 65 78 74 3b 0d 0a 20 20 20 20 69 66 28 20 ntext;.. if(
12770 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e pCtx->conchHeld>
12771 30 20 29 7b 0d 0a 20 20 20 20 20 20 75 6e 69 78 0 ){.. unix
12772 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 File *proxy = pC
12773 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0d 0a tx->lockProxy;..
12774 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f return pro
12775 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 xy->pMethod->xCh
12776 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 eckReservedLock(
12777 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 (sqlite3_file*)p
12778 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0d roxy, pResOut);.
12779 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 . }else{ /* c
1277a 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 onchHeld < 0 is
1277b 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0d 0a 20 20 20 lockless */..
1277c 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0d 0a 20 pResOut=0;..
1277d 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 }.. }.. ret
1277e 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1277f 0d 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 ..** Lock the fi
12780 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b le with the lock
12781 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 specified by pa
12782 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 rameter eFileLoc
12783 6b 20 2d 20 6f 6e 65 0d 0a 2a 2a 20 6f 66 20 74 k - one..** of t
12784 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a he following:..*
12785 2a 0d 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 *..** (1) SH
12786 41 52 45 44 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 ARED_LOCK..**
12787 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c (2) RESERVED_L
12788 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 33 29 20 OCK..** (3)
12789 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0d 0a 2a 2a PENDING_LOCK..**
1278a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 (4) EXCLUSI
1278b 56 45 5f 4c 4f 43 4b 0d 0a 2a 2a 0d 0a 2a 2a 20 VE_LOCK..**..**
1278c 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 Sometimes when r
1278d 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f equesting one lo
1278e 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 ck state, additi
1278f 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 onal lock states
12790 0d 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 ..** are inserte
12791 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 d in between. T
12792 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 he locking might
12793 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 fail on one of
12794 74 68 65 20 6c 61 74 65 72 0d 0a 2a 2a 20 74 72 the later..** tr
12795 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e ansitions leavin
12796 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 g the lock state
12797 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 different from
12798 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 what it started
12799 62 75 74 0d 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 but..** still sh
1279a 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e ort of its goal.
1279b 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 The following
1279c 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 chart shows the
1279d 61 6c 6c 6f 77 65 64 0d 0a 2a 2a 20 74 72 61 6e allowed..** tran
1279e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 sitions and the
1279f 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 inserted interme
127a0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0d 0a 2a diate states:..*
127a1 2a 0d 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 *..** UNLOCKE
127a2 44 20 2d 3e 20 53 48 41 52 45 44 0d 0a 2a 2a 20 D -> SHARED..**
127a3 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 SHARED -> RES
127a4 45 52 56 45 44 0d 0a 2a 2a 20 20 20 20 53 48 41 ERVED..** SHA
127a5 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 RED -> (PENDING)
127a6 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a -> EXCLUSIVE..*
127a7 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e * RESERVED ->
127a8 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 (PENDING) -> EX
127a9 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 20 20 20 50 CLUSIVE..** P
127aa 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 ENDING -> EXCLUS
127ab 49 56 45 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 IVE..**..** This
127ac 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e routine will on
127ad 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f ly increase a lo
127ae 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c ck. Use the sql
127af 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0d 0a ite3OsUnlock()..
127b0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f ** routine to lo
127b1 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 wer a locking le
127b2 76 65 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 vel...*/..static
127b3 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 int proxyLock(s
127b4 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c qlite3_file *id,
127b5 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 int eFileLock)
127b6 7b 0d 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 {.. unixFile *p
127b7 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 File = (unixFile
127b8 2a 29 69 64 3b 0d 0a 20 20 69 6e 74 20 72 63 20 *)id;.. int rc
127b9 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 = proxyTakeConch
127ba 28 70 46 69 6c 65 29 3b 0d 0a 20 20 69 66 28 20 (pFile);.. if(
127bb 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
127bc 0d 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 .. proxyLocki
127bd 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 ngContext *pCtx
127be 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 = (proxyLockingC
127bf 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e ontext *)pFile->
127c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0d lockingContext;.
127c1 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 . if( pCtx->c
127c2 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0d 0a 20 onchHeld>0 ){..
127c3 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 unixFile *p
127c4 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 roxy = pCtx->loc
127c5 6b 50 72 6f 78 79 3b 0d 0a 20 20 20 20 20 20 72 kProxy;.. r
127c6 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 c = proxy->pMeth
127c7 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 od->xLock((sqlit
127c8 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 e3_file*)proxy,
127c9 65 46 69 6c 65 4c 6f 63 6b 29 3b 0d 0a 20 20 20 eFileLock);..
127ca 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c pFile->eFileL
127cb 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 ock = proxy->eFi
127cc 6c 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 7d 65 6c leLock;.. }el
127cd 73 65 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 63 6f se{.. /* co
127ce 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c nchHeld < 0 is l
127cf 6f 63 6b 6c 65 73 73 20 2a 2f 0d 0a 20 20 20 20 ockless */..
127d0 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e }.. }.. return
127d1 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d rc;..}....../*.
127d2 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f .** Lower the lo
127d3 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 cking level on f
127d4 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 ile descriptor p
127d5 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 File to eFileLoc
127d6 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0d 0a 2a k. eFileLock..*
127d7 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 * must be either
127d8 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 NO_LOCK or SHAR
127d9 45 44 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a ED_LOCK...**..**
127da 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 If the locking
127db 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c level of the fil
127dc 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 e descriptor is
127dd 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 already at or be
127de 6c 6f 77 0d 0a 2a 2a 20 74 68 65 20 72 65 71 75 low..** the requ
127df 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 ested locking le
127e0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e vel, this routin
127e1 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a e is a no-op...*
127e2 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 /..static int pr
127e3 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 oxyUnlock(sqlite
127e4 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
127e5 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0d 0a 20 20 eFileLock) {..
127e6 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 unixFile *pFile
127e7 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b = (unixFile*)id;
127e8 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f .. int rc = pro
127e9 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c xyTakeConch(pFil
127ea 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 e);.. if( rc==S
127eb 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
127ec 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e proxyLockingCon
127ed 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 text *pCtx = (pr
127ee 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 oxyLockingContex
127ef 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 t *)pFile->locki
127f0 6e 67 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 20 20 ngContext;..
127f1 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 if( pCtx->conchH
127f2 65 6c 64 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 eld>0 ){..
127f3 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 unixFile *proxy
127f4 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 = pCtx->lockProx
127f5 79 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 y;.. rc = p
127f6 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 roxy->pMethod->x
127f7 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f Unlock((sqlite3_
127f8 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 file*)proxy, eFi
127f9 6c 65 4c 6f 63 6b 29 3b 0d 0a 20 20 20 20 20 20 leLock);..
127fa 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b pFile->eFileLock
127fb 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c = proxy->eFileL
127fc 6f 63 6b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b ock;.. }else{
127fd 0d 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 .. /* conch
127fe 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b Held < 0 is lock
127ff 6c 65 73 73 20 2a 2f 0d 0a 20 20 20 20 7d 0d 0a less */.. }..
12800 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
12801 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
12802 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 lose a file that
12803 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b uses proxy lock
12804 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 s...*/..static i
12805 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 nt proxyClose(sq
12806 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 lite3_file *id)
12807 7b 0d 0a 20 20 69 66 28 20 69 64 20 29 7b 0d 0a {.. if( id ){..
12808 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 unixFile *pF
12809 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a ile = (unixFile*
1280a 29 69 64 3b 0d 0a 20 20 20 20 70 72 6f 78 79 4c )id;.. proxyL
1280b 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 ockingContext *p
1280c 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b Ctx = (proxyLock
1280d 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 ingContext *)pFi
1280e 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 le->lockingConte
1280f 78 74 3b 0d 0a 20 20 20 20 75 6e 69 78 46 69 6c xt;.. unixFil
12810 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 e *lockProxy = p
12811 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0d Ctx->lockProxy;.
12812 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 . unixFile *c
12813 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d onchFile = pCtx-
12814 3e 63 6f 6e 63 68 46 69 6c 65 3b 0d 0a 20 20 20 >conchFile;..
12815 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
12816 5f 4f 4b 3b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 _OK;.. ..
12817 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b if( lockProxy ){
12818 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 .. rc = loc
12819 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d kProxy->pMethod-
1281a 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 >xUnlock((sqlite
1281b 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 3_file*)lockProx
1281c 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 y, NO_LOCK);..
1281d 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 if( rc ) ret
1281e 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 72 urn rc;.. r
1281f 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 c = lockProxy->p
12820 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 Method->xClose((
12821 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f sqlite3_file*)lo
12822 63 6b 50 72 6f 78 79 29 3b 0d 0a 20 20 20 20 20 ckProxy);..
12823 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e if( rc ) return
12824 20 72 63 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 rc;.. sqli
12825 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f te3_free(lockPro
12826 78 79 29 3b 0d 0a 20 20 20 20 20 20 70 43 74 78 xy);.. pCtx
12827 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b ->lockProxy = 0;
12828 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
12829 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0d 0a 20 conchFile ){..
1282a 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 if( pCtx->c
1282b 6f 6e 63 68 48 65 6c 64 20 29 7b 0d 0a 20 20 20 onchHeld ){..
1282c 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 rc = proxyR
1282d 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c eleaseConch(pFil
1282e 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 e);.. if(
1282f 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b rc ) return rc;
12830 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
12831 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d rc = conchFile-
12832 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 >pMethod->xClose
12833 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 ((sqlite3_file*)
12834 63 6f 6e 63 68 46 69 6c 65 29 3b 0d 0a 20 20 20 conchFile);..
12835 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 if( rc ) retu
12836 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 73 71 rn rc;.. sq
12837 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 lite3_free(conch
12838 46 69 6c 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 File);.. }..
12839 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
1283a 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 (0, pCtx->lockPr
1283b 6f 78 79 50 61 74 68 29 3b 0d 0a 20 20 20 20 73 oxyPath);.. s
1283c 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 qlite3_free(pCtx
1283d 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 ->conchFilePath)
1283e 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 ;.. sqlite3Db
1283f 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 Free(0, pCtx->db
12840 50 61 74 68 29 3b 0d 0a 20 20 20 20 2f 2a 20 72 Path);.. /* r
12841 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 estore the origi
12842 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 nal locking cont
12843 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 ext and pMethod
12844 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f then close it */
12845 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 .. pFile->loc
12846 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 kingContext = pC
12847 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f tx->oldLockingCo
12848 6e 74 65 78 74 3b 0d 0a 20 20 20 20 70 46 69 6c ntext;.. pFil
12849 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 e->pMethod = pCt
1284a 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0d 0a x->pOldMethod;..
1284b 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
1284c 28 70 43 74 78 29 3b 0d 0a 20 20 20 20 72 65 74 (pCtx);.. ret
1284d 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 urn pFile->pMeth
1284e 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0d od->xClose(id);.
1284f 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 . }.. return S
12850 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a QLITE_OK;..}....
12851 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 ....#endif /* de
12852 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 fined(__APPLE__)
12853 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c && SQLITE_ENABL
12854 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 E_LOCKING_STYLE
12855 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 70 */../*..** The p
12856 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 roxy locking sty
12857 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 le is intended f
12858 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 or use with AFP
12859 66 69 6c 65 73 79 73 74 65 6d 73 2e 0d 0a 2a 2a filesystems...**
1285a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 And since AFP i
1285b 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 s only supported
1285c 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 on MacOSX, the
1285d 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 proxy locking is
1285e 20 61 6c 73 6f 0d 0a 2a 2a 20 72 65 73 74 72 69 also..** restri
1285f 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0d cted to MacOSX..
12860 0a 2a 2a 20 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a .** ..**..******
12861 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
12862 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c d of the proxy l
12863 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 ock implementati
12864 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a on *************
12865 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a *********..*****
12866 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12867 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12868 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12869 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1286a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a *********/..../*
1286b 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 ..** Initialize
1286c 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 the operating sy
1286d 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0d stem interface..
1286e 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 .**..** This rou
1286f 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 tine registers a
12870 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 ll VFS implement
12871 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d ations for unix-
12872 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0d 0a like operating..
12873 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 ** systems. Thi
12874 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 s routine, and t
12875 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e he sqlite3_os_en
12876 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 d() routine that
12877 20 66 6f 6c 6c 6f 77 73 2c 0d 0a 2a 2a 20 73 68 follows,..** sh
12878 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 ould be the only
12879 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 routines in thi
1287a 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 s file that are
1287b 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 visible from oth
1287c 65 72 0d 0a 2a 2a 20 66 69 6c 65 73 2e 0d 0a 2a er..** files...*
1287d 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 *..** This routi
1287e 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 ne is called onc
1287f 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 e during SQLite
12880 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 initialization a
12881 6e 64 20 62 79 20 61 0d 0a 2a 2a 20 73 69 6e 67 nd by a..** sing
12882 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 le thread. The
12883 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
12884 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 n and mutex subs
12885 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0d ystems have not.
12886 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 .** necessarily
12887 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 been initialized
12888 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 when this routi
12889 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e ne is called, an
1288a 64 20 73 6f 20 74 68 65 79 0d 0a 2a 2a 20 73 68 d so they..** sh
1288b 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 ould not be used
1288c 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 ...*/..SQLITE_AP
1288d 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 I int sqlite3_os
1288e 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0d 0a 20 _init(void){ ..
1288f 20 2f 2a 20 0d 0a 20 20 2a 2a 20 54 68 65 20 66 /* .. ** The f
12890 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 ollowing macro d
12891 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 efines an initia
12892 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c lizer for an sql
12893 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e ite3_vfs object.
12894 0d 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 .. ** The name
12895 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 of the VFS is NA
12896 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 ME. The pAppDat
12897 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 a is a pointer t
12898 6f 20 61 20 70 6f 69 6e 74 65 72 0d 0a 20 20 2a o a pointer.. *
12899 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 * to the "finder
1289a 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 " function. (pA
1289b 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e ppData is a poin
1289c 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 ter to a pointer
1289d 20 62 65 63 61 75 73 65 0d 0a 20 20 2a 2a 20 73 because.. ** s
1289e 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 illy C90 rules p
1289f 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 rohibit a void*
128a0 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 from being cast
128a1 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f to a function po
128a2 69 6e 74 65 72 0d 0a 20 20 2a 2a 20 61 6e 64 20 inter.. ** and
128a3 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f so we have to go
128a4 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 through the int
128a5 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 ermediate pointe
128a6 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c r to avoid probl
128a7 65 6d 73 0d 0a 20 20 2a 2a 20 77 68 65 6e 20 63 ems.. ** when c
128a8 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 ompiling with -p
128a9 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f edantic-errors o
128aa 6e 20 47 43 43 2e 29 0d 0a 20 20 2a 2a 0d 0a 20 n GCC.).. **..
128ab 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 ** The FINDER p
128ac 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 arameter to this
128ad 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 macro is the na
128ae 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 me of the pointe
128af 72 20 74 6f 20 74 68 65 0d 0a 20 20 2a 2a 20 66 r to the.. ** f
128b0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 inder-function.
128b1 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 The finder-func
128b2 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 tion returns a p
128b3 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0d 0a 20 ointer to the..
128b4 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 ** sqlite_io_me
128b5 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 thods object tha
128b6 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 t implements the
128b7 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 desired locking
128b8 0d 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 .. ** behaviors
128b9 2e 20 20 53 65 65 20 74 68 65 20 64 69 76 69 73 . See the divis
128ba 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 ion above that c
128bb 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 ontains the IOME
128bc 54 48 4f 44 53 0d 0a 20 20 2a 2a 20 6d 61 63 72 THODS.. ** macr
128bd 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 o for addition i
128be 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 nformation on fi
128bf 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0d nder-functions..
128c0 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 4d 6f 73 74 . **.. ** Most
128c1 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 finders simply
128c2 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 return a pointer
128c3 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 to a fixed sqli
128c4 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0d 0a te3_io_methods..
128c5 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 ** object. Bu
128c6 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 t the "autolockI
128c7 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 oFinder" availab
128c8 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 le on MacOSX doe
128c9 73 20 61 20 6c 69 74 74 6c 65 0d 0a 20 20 2a 2a s a little.. **
128ca 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b more than that;
128cb 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 it looks at the
128cc 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 filesystem type
128cd 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 that hosts the
128ce 0d 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 .. ** database
128cf 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 file and tries t
128d0 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b o choose an lock
128d1 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f ing method appro
128d2 70 72 69 61 74 65 20 66 6f 72 0d 0a 20 20 2a 2a priate for.. **
128d3 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d that filesystem
128d4 20 74 69 6d 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 time... */..
128d5 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 #define UNIXVFS(
128d6 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 VFSNAME, FINDER)
128d7 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
128d8 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 \..
128d9 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 3,
128da 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 /* iVersi
128db 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 on */
128dc 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 \..
128dd 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 sizeof(unixFile)
128de 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c , /* szOsFil
128df 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 e */
128e0 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 4d \.. M
128e1 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 AX_PATHNAME,
128e2 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 /* mxPathna
128e3 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 me */
128e4 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 30 2c \.. 0,
128e5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128e6 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 /* pNext */
128e7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128e8 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 56 46 53 \.. VFS
128e9 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 NAME,
128ea 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 /* zName */
128eb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128ec 20 20 20 20 20 5c 0d 0a 20 20 20 20 28 76 6f 69 \.. (voi
128ed 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 d*)&FINDER,
128ee 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f /* pAppData */
128ef 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128f0 20 20 20 20 5c 0d 0a 20 20 20 20 75 6e 69 78 4f \.. unixO
128f1 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 pen,
128f2 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 /* xOpen */
128f3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128f4 20 20 20 5c 0d 0a 20 20 20 20 75 6e 69 78 44 65 \.. unixDe
128f5 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 lete,
128f6 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 /* xDelete */
128f7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128f8 20 20 5c 0d 0a 20 20 20 20 75 6e 69 78 41 63 63 \.. unixAcc
128f9 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f ess, /
128fa 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20 * xAccess */
128fb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128fc 20 5c 0d 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c \.. unixFull
128fd 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a Pathname, /*
128fe 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a xFullPathname *
128ff 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /
12900 5c 0d 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 \.. unixDlOpe
12901 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 n, /*
12902 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 xDlOpen */
12903 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
12904 0d 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f .. unixDlErro
12905 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 r, /* x
12906 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 DlError */
12907 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d \.
12908 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 . unixDlSym,
12909 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 /* xD
1290a 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 lSym */
1290b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
1290c 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c unixDlClose,
1290d 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c /* xDl
1290e 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 Close */
1290f 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 \..
12910 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 unixRandomnes
12911 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e s, /* xRan
12912 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 domness */
12913 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
12914 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 unixSleep,
12915 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 /* xSlee
12916 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 p */
12917 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 \..
12918 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 unixCurrentTime
12919 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 , /* xCurre
1291a 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 ntTime */
1291b 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 \..
1291c 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 unixGetLastError
1291d 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 , /* xGetLas
1291e 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 tError */
1291f 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 75 \.. u
12920 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e nixCurrentTimeIn
12921 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 t64, /* xCurrent
12922 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 TimeInt64 */
12923 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 75 6e \.. un
12924 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c ixSetSystemCall,
12925 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 /* xSetSyste
12926 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 mCall */
12927 20 20 20 20 20 20 5c 0d 0a 20 20 20 20 75 6e 69 \.. uni
12928 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 xGetSystemCall,
12929 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d /* xGetSystem
1292a 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 Call */
1292b 20 20 20 20 20 5c 0d 0a 20 20 20 20 75 6e 69 78 \.. unix
1292c 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 NextSystemCall,
1292d 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d /* xNextSystem
1292e 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 Call */
1292f 20 20 20 20 5c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 \.. }....
12930 2f 2a 0d 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 /*.. ** All def
12931 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75 ault VFSes for u
12932 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 nix are containe
12933 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 d in the followi
12934 6e 67 20 61 72 72 61 79 2e 0d 0a 20 20 2a 2a 0d ng array... **.
12935 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 . ** Note that
12936 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e the sqlite3_vfs.
12937 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 pNext field of t
12938 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 he VFS object is
12939 20 6d 6f 64 69 66 69 65 64 0d 0a 20 20 2a 2a 20 modified.. **
1293a 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f by the SQLite co
1293b 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 re when the VFS
1293c 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 is registered.
1293d 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 So the following
1293e 0d 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e .. ** array can
1293f 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0d 0a 20 not be const...
12940 20 2a 2f 0d 0a 20 20 73 74 61 74 69 63 20 73 71 */.. static sq
12941 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d lite3_vfs aVfs[]
12942 20 3d 20 7b 0d 0a 23 69 66 20 53 51 4c 49 54 45 = {..#if SQLITE
12943 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f _ENABLE_LOCKING_
12944 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 STYLE && (OS_VXW
12945 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 ORKS || defined(
12946 5f 5f 41 50 50 4c 45 5f 5f 29 29 0d 0a 20 20 20 __APPLE__))..
12947 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c UNIXVFS("unix",
12948 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f autolo
12949 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0d 0a 23 ckIoFinder ),..#
1294a 65 6c 73 65 0d 0a 20 20 20 20 55 4e 49 58 56 46 else.. UNIXVF
1294b 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 S("unix",
1294c 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 posixIoFinder
1294d 20 29 2c 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 ),..#endif..
1294e 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e UNIXVFS("unix-n
1294f 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b one", nolock
12950 49 6f 46 69 6e 64 65 72 20 29 2c 0d 0a 20 20 20 IoFinder ),..
12951 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 UNIXVFS("unix-d
12952 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 otfile", dotloc
12953 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0d 0a 20 20 kIoFinder ),..
12954 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d UNIXVFS("unix-
12955 65 78 63 6c 22 2c 20 20 20 20 20 70 6f 73 69 78 excl", posix
12956 49 6f 46 69 6e 64 65 72 20 29 2c 0d 0a 23 69 66 IoFinder ),..#if
12957 20 4f 53 5f 56 58 57 4f 52 4b 53 0d 0a 20 20 20 OS_VXWORKS..
12958 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e UNIXVFS("unix-n
12959 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 amedsem", semIoF
1295a 69 6e 64 65 72 20 29 2c 0d 0a 23 65 6e 64 69 66 inder ),..#endif
1295b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 ..#if SQLITE_ENA
1295c 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c BLE_LOCKING_STYL
1295d 45 0d 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 E.. UNIXVFS("
1295e 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 unix-posix",
1295f 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c posixIoFinder ),
12960 0d 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b ..#if !OS_VXWORK
12961 53 0d 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 S.. UNIXVFS("
12962 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 unix-flock",
12963 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c flockIoFinder ),
12964 0d 0a 23 65 6e 64 69 66 0d 0a 23 65 6e 64 69 66 ..#endif..#endif
12965 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 ..#if SQLITE_ENA
12966 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c BLE_LOCKING_STYL
12967 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 E && defined(__A
12968 50 50 4c 45 5f 5f 29 0d 0a 20 20 20 20 55 4e 49 PPLE__).. UNI
12969 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c XVFS("unix-afp",
1296a 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65 afpIoFinde
1296b 72 20 29 2c 0d 0a 20 20 20 20 55 4e 49 58 56 46 r ),.. UNIXVF
1296c 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 S("unix-nfs",
1296d 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 nfsIoFinder )
1296e 2c 0d 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 ,.. UNIXVFS("
1296f 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 unix-proxy",
12970 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c proxyIoFinder ),
12971 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 3b 0d 0a ..#endif.. };..
12972 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 unsigned int i
12973 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f ; /* Lo
12974 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 0d op counter */...
12975 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 . /* Double-che
12976 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 ck that the aSys
12977 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 call[] array has
12978 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 been constructe
12979 64 0d 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c d.. ** correctl
1297a 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b y. See ticket [
1297b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 bb3a86e890c8e96a
1297c 62 5d 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 b] */.. assert(
1297d 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 ArraySize(aSysc
1297e 61 6c 6c 29 3d 3d 32 30 20 29 3b 0d 0a 0d 0a 20 all)==20 );....
1297f 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c /* Register all
12980 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 VFSes defined i
12981 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 n the aVfs[] arr
12982 61 79 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 ay */.. for(i=0
12983 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 ; i<(sizeof(aVfs
12984 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 )/sizeof(sqlite3
12985 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0d 0a 20 _vfs)); i++){..
12986 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 sqlite3_vfs_r
12987 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d egister(&aVfs[i]
12988 2c 20 69 3d 3d 30 29 3b 0d 0a 20 20 7d 0d 0a 20 , i==0);.. }..
12989 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1298a 4b 3b 20 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a K; ..}..../*..**
1298b 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 Shutdown the op
1298c 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 erating system i
1298d 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2a 0d 0a 2a nterface...**..*
1298e 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 * Some operating
1298f 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e systems might n
12990 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 eed to do some c
12991 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72 leanup in this r
12992 6f 75 74 69 6e 65 2c 0d 0a 2a 2a 20 74 6f 20 72 outine,..** to r
12993 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c elease dynamical
12994 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a ly allocated obj
12995 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f ects. But not o
12996 6e 20 75 6e 69 78 2e 0d 0a 2a 2a 20 54 68 69 73 n unix...** This
12997 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f routine is a no
12998 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0d 0a 2a -op for unix...*
12999 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e /..SQLITE_API in
1299a 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 t sqlite3_os_end
1299b 28 76 6f 69 64 29 7b 20 0d 0a 20 20 72 65 74 75 (void){ .. retu
1299c 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0d 0a rn SQLITE_OK; ..
1299d 7d 0d 0a 20 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 }.. ..#endif /*
1299e 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a SQLITE_OS_UNIX *
1299f 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
129a0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6f 73 5f 75 **** End of os_u
129a1 6e 69 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a nix.c **********
129a2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129a3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129a4 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
129a5 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 ***** Begin file
129a6 20 6f 73 5f 77 69 6e 2e 63 20 2a 2a 2a 2a 2a 2a os_win.c ******
129a7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129a8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129a9 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 ****/../*..** 20
129aa 30 34 20 4d 61 79 20 32 32 0d 0a 2a 2a 0d 0a 2a 04 May 22..**..*
129ab 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 * The author dis
129ac 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 claims copyright
129ad 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 to this source
129ae 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 code. In place
129af 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e of..** a legal n
129b0 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 otice, here is a
129b1 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a blessing:..**..
129b2 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f ** May you do
129b3 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 good and not ev
129b4 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 il...** May y
129b5 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e ou find forgiven
129b6 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 ess for yourself
129b7 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 and forgive oth
129b8 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 ers...** May
129b9 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 you share freely
129ba 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d , never taking m
129bb 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 ore than you giv
129bc 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a e...**..********
129bd 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129be 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129bf 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129c1 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ******..**..** T
129c2 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e his file contain
129c3 73 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 s code that is s
129c4 70 65 63 69 66 69 63 20 74 6f 20 57 69 6e 64 6f pecific to Windo
129c5 77 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c ws...*/..#if SQL
129c6 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20 20 20 ITE_OS_WIN
129c7 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 /* This
129c8 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 66 6f file is used fo
129c9 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a r Windows only *
129ca 2f 0d 0a 0d 0a 23 69 66 64 65 66 20 5f 5f 43 59 /....#ifdef __CY
129cb 47 57 49 4e 5f 5f 0d 0a 23 20 69 6e 63 6c 75 64 GWIN__..# includ
129cc 65 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e e <sys/cygwin.h>
129cd 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
129ce 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 ** Include code
129cf 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 that is common t
129d0 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c o all os_*.c fil
129d1 65 73 0d 0a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a es..*/../*******
129d2 2a 2a 2a 2a 2a 2a 2a 20 49 6e 63 6c 75 64 65 20 ******* Include
129d3 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 69 6e 20 74 os_common.h in t
129d4 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 6f 73 5f he middle of os_
129d5 77 69 6e 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a win.c **********
129d6 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
129d7 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 ******** Begin f
129d8 69 6c 65 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 ile os_common.h
129d9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129da 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129db 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a *******/../*..**
129dc 20 32 30 30 34 20 4d 61 79 20 32 32 0d 0a 2a 2a 2004 May 22..**
129dd 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 ..** The author
129de 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 disclaims copyri
129df 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 ght to this sour
129e0 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 ce code. In pla
129e1 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 ce of..** a lega
129e2 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 l notice, here i
129e3 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a s a blessing:..*
129e4 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 *..** May you
129e5 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 do good and not
129e6 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 evil...** Ma
129e7 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 y you find forgi
129e8 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 veness for yours
129e9 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 elf and forgive
129ea 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d others...** M
129eb 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 ay you share fre
129ec 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e ely, never takin
129ed 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 g more than you
129ee 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a give...**..*****
129ef 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129f1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129f2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
129f3 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a *********..**..*
129f4 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
129f5 61 69 6e 73 20 6d 61 63 72 6f 73 20 61 6e 64 20 ains macros and
129f6 61 20 6c 69 74 74 6c 65 20 62 69 74 20 6f 66 20 a little bit of
129f7 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d code that is com
129f8 6d 6f 6e 20 74 6f 0d 0a 2a 2a 20 61 6c 6c 20 6f mon to..** all o
129f9 66 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2d 73 f the platform-s
129fa 70 65 63 69 66 69 63 20 66 69 6c 65 73 20 28 6f pecific files (o
129fb 73 5f 2a 2e 63 29 20 61 6e 64 20 69 73 20 23 69 s_*.c) and is #i
129fc 6e 63 6c 75 64 65 64 20 69 6e 74 6f 20 74 68 6f ncluded into tho
129fd 73 65 0d 0a 2a 2a 20 66 69 6c 65 73 2e 0d 0a 2a se..** files...*
129fe 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 *..** This file
129ff 73 68 6f 75 6c 64 20 62 65 20 23 69 6e 63 6c 75 should be #inclu
12a00 64 65 64 20 62 79 20 74 68 65 20 6f 73 5f 2a 2e ded by the os_*.
12a01 63 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 49 c files only. I
12a02 74 20 69 73 20 6e 6f 74 20 61 0d 0a 2a 2a 20 67 t is not a..** g
12a03 65 6e 65 72 61 6c 20 70 75 72 70 6f 73 65 20 68 eneral purpose h
12a04 65 61 64 65 72 20 66 69 6c 65 2e 0d 0a 2a 2f 0d eader file...*/.
12a05 0a 23 69 66 6e 64 65 66 20 5f 4f 53 5f 43 4f 4d .#ifndef _OS_COM
12a06 4d 4f 4e 5f 48 5f 0d 0a 23 64 65 66 69 6e 65 20 MON_H_..#define
12a07 5f 4f 53 5f 43 4f 4d 4d 4f 4e 5f 48 5f 0d 0a 0d _OS_COMMON_H_...
12a08 0a 2f 2a 0d 0a 2a 2a 20 41 74 20 6c 65 61 73 74 ./*..** At least
12a09 20 74 77 6f 20 62 75 67 73 20 68 61 76 65 20 73 two bugs have s
12a0a 6c 69 70 70 65 64 20 69 6e 20 62 65 63 61 75 73 lipped in becaus
12a0b 65 20 77 65 20 63 68 61 6e 67 65 64 20 74 68 65 e we changed the
12a0c 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0d 0a 2a MEMORY_DEBUG..*
12a0d 2a 20 6d 61 63 72 6f 20 74 6f 20 53 51 4c 49 54 * macro to SQLIT
12a0e 45 5f 44 45 42 55 47 20 61 6e 64 20 73 6f 6d 65 E_DEBUG and some
12a0f 20 6f 6c 64 65 72 20 6d 61 6b 65 66 69 6c 65 73 older makefiles
12a10 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 6d 61 have not yet ma
12a11 64 65 20 74 68 65 0d 0a 2a 2a 20 73 77 69 74 63 de the..** switc
12a12 68 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e h. The followin
12a13 67 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 g code should ca
12a14 74 63 68 20 74 68 69 73 20 70 72 6f 62 6c 65 6d tch this problem
12a15 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 at compile-time
12a16 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 4d 45 ...*/..#ifdef ME
12a17 4d 4f 52 59 5f 44 45 42 55 47 0d 0a 23 20 65 72 MORY_DEBUG..# er
12a18 72 6f 72 20 22 54 68 65 20 4d 45 4d 4f 52 59 5f ror "The MEMORY_
12a19 44 45 42 55 47 20 6d 61 63 72 6f 20 69 73 20 6f DEBUG macro is o
12a1a 62 73 6f 6c 65 74 65 2e 20 20 55 73 65 20 53 51 bsolete. Use SQ
12a1b 4c 49 54 45 5f 44 45 42 55 47 20 69 6e 73 74 65 LITE_DEBUG inste
12a1c 61 64 2e 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ad."..#endif....
12a1d 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
12a1e 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 TE_TEST) && defi
12a1f 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
12a20 29 0d 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 )..# ifndef SQLI
12a21 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 TE_DEBUG_OS_TRAC
12a22 45 0d 0a 23 20 20 20 64 65 66 69 6e 65 20 53 51 E..# define SQ
12a23 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 LITE_DEBUG_OS_TR
12a24 41 43 45 20 30 0d 0a 23 20 65 6e 64 69 66 0d 0a ACE 0..# endif..
12a25 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 int sqlite3OST
12a26 72 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 race = SQLITE_DE
12a27 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0d 0a 23 BUG_OS_TRACE;..#
12a28 20 64 65 66 69 6e 65 20 4f 53 54 52 41 43 45 28 define OSTRACE(
12a29 58 29 20 20 20 20 20 20 20 20 20 20 69 66 28 20 X) if(
12a2a 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20 29 sqlite3OSTrace )
12a2b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 sqlite3DebugPri
12a2c 6e 74 66 20 58 0d 0a 23 65 6c 73 65 0d 0a 23 20 ntf X..#else..#
12a2d 64 65 66 69 6e 65 20 4f 53 54 52 41 43 45 28 58 define OSTRACE(X
12a2e 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d )..#endif..../*.
12a2f 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 70 .** Macros for p
12a30 65 72 66 6f 72 6d 61 6e 63 65 20 74 72 61 63 69 erformance traci
12a31 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 ng. Normally tu
12a32 72 6e 65 64 20 6f 66 66 2e 20 20 4f 6e 6c 79 20 rned off. Only
12a33 77 6f 72 6b 73 0d 0a 2a 2a 20 6f 6e 20 69 34 38 works..** on i48
12a34 36 20 68 61 72 64 77 61 72 65 2e 0d 0a 2a 2f 0d 6 hardware...*/.
12a35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 50 .#ifdef SQLITE_P
12a36 45 52 46 4f 52 4d 41 4e 43 45 5f 54 52 41 43 45 ERFORMANCE_TRACE
12a37 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 68 77 74 69 ..../* ..** hwti
12a38 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e me.h contains in
12a39 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 line assembler c
12a3a 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e ode for implemen
12a3b 74 69 6e 67 20 0d 0a 2a 2a 20 68 69 67 68 2d 70 ting ..** high-p
12a3c 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e erformance timin
12a3d 67 20 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a 2f 0d g routines...*/.
12a3e 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
12a3f 20 49 6e 63 6c 75 64 65 20 68 77 74 69 6d 65 2e Include hwtime.
12a40 68 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 h in the middle
12a41 6f 66 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 2a of os_common.h *
12a42 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
12a43 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
12a44 2a 20 42 65 67 69 6e 20 66 69 6c 65 20 68 77 74 * Begin file hwt
12a45 69 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ime.h **********
12a46 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a47 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a48 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 38 20 4d /../*..** 2008 M
12a49 61 79 20 32 37 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 ay 27..**..** Th
12a4a 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
12a4b 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
12a4c 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
12a4d 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
12a4e 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
12a4f 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
12a50 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
12a51 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
12a52 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
12a53 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
12a54 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
12a55 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
12a56 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
12a57 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
12a58 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
12a59 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
12a5a 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
12a5b 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
12a5c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a5d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a5e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a5f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12a60 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 **..**..** This
12a61 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 69 6e file contains in
12a62 6c 69 6e 65 20 61 73 6d 20 63 6f 64 65 20 66 6f line asm code fo
12a63 72 20 72 65 74 72 69 65 76 69 6e 67 20 22 68 69 r retrieving "hi
12a64 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 22 0d gh-performance".
12a65 0a 2a 2a 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 .** counters for
12a66 20 78 38 36 20 63 6c 61 73 73 20 43 50 55 73 2e x86 class CPUs.
12a67 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 5f 48 ..*/..#ifndef _H
12a68 57 54 49 4d 45 5f 48 5f 0d 0a 23 64 65 66 69 6e WTIME_H_..#defin
12a69 65 20 5f 48 57 54 49 4d 45 5f 48 5f 0d 0a 0d 0a e _HWTIME_H_....
12a6a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f /*..** The follo
12a6b 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f 6e 6c wing routine onl
12a6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e 74 69 y works on penti
12a6d 75 6d 2d 63 6c 61 73 73 20 28 6f 72 20 6e 65 77 um-class (or new
12a6e 65 72 29 20 70 72 6f 63 65 73 73 6f 72 73 2e 0d er) processors..
12a6f 0a 2a 2a 20 49 74 20 75 73 65 73 20 74 68 65 20 .** It uses the
12a70 52 44 54 53 43 20 6f 70 63 6f 64 65 20 74 6f 20 RDTSC opcode to
12a71 72 65 61 64 20 74 68 65 20 63 79 63 6c 65 20 63 read the cycle c
12a72 6f 75 6e 74 20 76 61 6c 75 65 20 6f 75 74 20 6f ount value out o
12a73 66 20 74 68 65 0d 0a 2a 2a 20 70 72 6f 63 65 73 f the..** proces
12a74 73 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 73 20 sor and returns
12a75 74 68 61 74 20 76 61 6c 75 65 2e 20 20 54 68 69 that value. Thi
12a76 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f s can be used fo
12a77 72 20 68 69 67 68 2d 72 65 73 0d 0a 2a 2a 20 70 r high-res..** p
12a78 72 6f 66 69 6c 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 rofiling...*/..#
12a79 69 66 20 28 64 65 66 69 6e 65 64 28 5f 5f 47 4e if (defined(__GN
12a7a 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 UC__) || defined
12a7b 28 5f 4d 53 43 5f 56 45 52 29 29 20 26 26 20 5c (_MSC_VER)) && \
12a7c 0d 0a 20 20 20 20 20 20 28 64 65 66 69 6e 65 64 .. (defined
12a7d 28 69 33 38 36 29 20 7c 7c 20 64 65 66 69 6e 65 (i386) || define
12a7e 64 28 5f 5f 69 33 38 36 5f 5f 29 20 7c 7c 20 64 d(__i386__) || d
12a7f 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 36 29 29 efined(_M_IX86))
12a80 0d 0a 0d 0a 20 20 23 69 66 20 64 65 66 69 6e 65 .... #if define
12a81 64 28 5f 5f 47 4e 55 43 5f 5f 29 0d 0a 0d 0a 20 d(__GNUC__)....
12a82 20 5f 5f 69 6e 6c 69 6e 65 5f 5f 20 73 71 6c 69 __inline__ sqli
12a83 74 65 5f 75 69 6e 74 36 34 20 73 71 6c 69 74 65 te_uint64 sqlite
12a84 33 48 77 74 69 6d 65 28 76 6f 69 64 29 7b 0d 0a 3Hwtime(void){..
12a85 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e unsigned in
12a86 74 20 6c 6f 2c 20 68 69 3b 0d 0a 20 20 20 20 20 t lo, hi;..
12a87 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 __asm__ __volati
12a88 6c 65 5f 5f 20 28 22 72 64 74 73 63 22 20 3a 20 le__ ("rdtsc" :
12a89 22 3d 61 22 20 28 6c 6f 29 2c 20 22 3d 64 22 20 "=a" (lo), "=d"
12a8a 28 68 69 29 29 3b 0d 0a 20 20 20 20 20 72 65 74 (hi));.. ret
12a8b 75 72 6e 20 28 73 71 6c 69 74 65 5f 75 69 6e 74 urn (sqlite_uint
12a8c 36 34 29 68 69 20 3c 3c 20 33 32 20 7c 20 6c 6f 64)hi << 32 | lo
12a8d 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 65 6c 69 ;.. }.... #eli
12a8e 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 f defined(_MSC_V
12a8f 45 52 29 0d 0a 0d 0a 20 20 5f 5f 64 65 63 6c 73 ER).... __decls
12a90 70 65 63 28 6e 61 6b 65 64 29 20 5f 5f 69 6e 6c pec(naked) __inl
12a91 69 6e 65 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 ine sqlite_uint6
12a92 34 20 5f 5f 63 64 65 63 6c 20 73 71 6c 69 74 65 4 __cdecl sqlite
12a93 33 48 77 74 69 6d 65 28 76 6f 69 64 29 7b 0d 0a 3Hwtime(void){..
12a94 20 20 20 20 20 5f 5f 61 73 6d 20 7b 0d 0a 20 20 __asm {..
12a95 20 20 20 20 20 20 72 64 74 73 63 0d 0a 20 20 20 rdtsc..
12a96 20 20 20 20 20 72 65 74 20 20 20 20 20 20 20 3b ret ;
12a97 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 74 return value at
12a98 20 45 44 58 3a 45 41 58 0d 0a 20 20 20 20 20 7d EDX:EAX.. }
12a99 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 65 6e 64 69 .. }.... #endi
12a9a 66 0d 0a 0d 0a 23 65 6c 69 66 20 28 64 65 66 69 f....#elif (defi
12a9b 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26 26 ned(__GNUC__) &&
12a9c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 defined(__x86_6
12a9d 34 5f 5f 29 29 0d 0a 0d 0a 20 20 5f 5f 69 6e 6c 4__)).... __inl
12a9e 69 6e 65 5f 5f 20 73 71 6c 69 74 65 5f 75 69 6e ine__ sqlite_uin
12a9f 74 36 34 20 73 71 6c 69 74 65 33 48 77 74 69 6d t64 sqlite3Hwtim
12aa0 65 28 76 6f 69 64 29 7b 0d 0a 20 20 20 20 20 20 e(void){..
12aa1 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 76 61 unsigned long va
12aa2 6c 3b 0d 0a 20 20 20 20 20 20 5f 5f 61 73 6d 5f l;.. __asm_
12aa3 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 _ __volatile__ (
12aa4 22 72 64 74 73 63 22 20 3a 20 22 3d 41 22 20 28 "rdtsc" : "=A" (
12aa5 76 61 6c 29 29 3b 0d 0a 20 20 20 20 20 20 72 65 val));.. re
12aa6 74 75 72 6e 20 76 61 6c 3b 0d 0a 20 20 7d 0d 0a turn val;.. }..
12aa7 20 0d 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 ..#elif (define
12aa8 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26 26 20 64 d(__GNUC__) && d
12aa9 65 66 69 6e 65 64 28 5f 5f 70 70 63 5f 5f 29 29 efined(__ppc__))
12aaa 0d 0a 0d 0a 20 20 5f 5f 69 6e 6c 69 6e 65 5f 5f .... __inline__
12aab 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 73 sqlite_uint64 s
12aac 71 6c 69 74 65 33 48 77 74 69 6d 65 28 76 6f 69 qlite3Hwtime(voi
12aad 64 29 7b 0d 0a 20 20 20 20 20 20 75 6e 73 69 67 d){.. unsig
12aae 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 ned long long re
12aaf 74 76 61 6c 3b 0d 0a 20 20 20 20 20 20 75 6e 73 tval;.. uns
12ab0 69 67 6e 65 64 20 6c 6f 6e 67 20 6a 75 6e 6b 3b igned long junk;
12ab1 0d 0a 20 20 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 .. __asm__
12ab2 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 5c __volatile__ ("\
12ab3 6e 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 31 3a n\.. 1:
12ab4 20 20 20 20 20 20 6d 66 74 62 75 20 20 20 25 31 mftbu %1
12ab5 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 \n\..
12ab6 20 20 20 20 20 20 20 6d 66 74 62 20 20 20 20 25 mftb %
12ab7 4c 30 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 20 L0\n\..
12ab8 20 20 20 20 20 20 20 20 20 6d 66 74 62 75 20 20 mftbu
12ab9 20 25 30 5c 6e 5c 0d 0a 20 20 20 20 20 20 20 20 %0\n\..
12aba 20 20 20 20 20 20 20 20 20 20 63 6d 70 77 20 20 cmpw
12abb 20 20 25 30 2c 25 31 5c 6e 5c 0d 0a 20 20 20 20 %0,%1\n\..
12abc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6e bn
12abd 65 20 20 20 20 20 31 62 22 0d 0a 20 20 20 20 20 e 1b"..
12abe 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 22 : "
12abf 3d 72 22 20 28 72 65 74 76 61 6c 29 2c 20 22 3d =r" (retval), "=
12ac0 72 22 20 28 6a 75 6e 6b 29 29 3b 0d 0a 20 20 20 r" (junk));..
12ac1 20 20 20 72 65 74 75 72 6e 20 72 65 74 76 61 6c return retval
12ac2 3b 0d 0a 20 20 7d 0d 0a 0d 0a 23 65 6c 73 65 0d ;.. }....#else.
12ac3 0a 0d 0a 20 20 23 65 72 72 6f 72 20 4e 65 65 64 ... #error Need
12ac4 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
12ac5 6f 66 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 of sqlite3Hwtime
12ac6 28 29 20 66 6f 72 20 79 6f 75 72 20 70 6c 61 74 () for your plat
12ac7 66 6f 72 6d 2e 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 form..... /*..
12ac8 20 2a 2a 20 54 6f 20 63 6f 6d 70 69 6c 65 20 77 ** To compile w
12ac9 69 74 68 6f 75 74 20 69 6d 70 6c 65 6d 65 6e 74 ithout implement
12aca 69 6e 67 20 73 71 6c 69 74 65 33 48 77 74 69 6d ing sqlite3Hwtim
12acb 65 28 29 20 66 6f 72 20 79 6f 75 72 20 70 6c 61 e() for your pla
12acc 74 66 6f 72 6d 2c 0d 0a 20 20 2a 2a 20 79 6f 75 tform,.. ** you
12acd 20 63 61 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 can remove the
12ace 61 62 6f 76 65 20 23 65 72 72 6f 72 20 61 6e 64 above #error and
12acf 20 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 use the followi
12ad0 6e 67 0d 0a 20 20 2a 2a 20 73 74 75 62 20 66 75 ng.. ** stub fu
12ad1 6e 63 74 69 6f 6e 2e 20 20 59 6f 75 20 77 69 6c nction. You wil
12ad2 6c 20 6c 6f 73 65 20 74 69 6d 69 6e 67 20 73 75 l lose timing su
12ad3 70 70 6f 72 74 20 66 6f 72 20 6d 61 6e 79 0d 0a pport for many..
12ad4 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 62 75 ** of the debu
12ad5 67 67 69 6e 67 20 61 6e 64 20 74 65 73 74 69 6e gging and testin
12ad6 67 20 75 74 69 6c 69 74 69 65 73 2c 20 62 75 74 g utilities, but
12ad7 20 69 74 20 73 68 6f 75 6c 64 20 61 74 0d 0a 20 it should at..
12ad8 20 2a 2a 20 6c 65 61 73 74 20 63 6f 6d 70 69 6c ** least compil
12ad9 65 20 61 6e 64 20 72 75 6e 2e 0d 0a 20 20 2a 2f e and run... */
12ada 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
12adb 20 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 sqlite_uint64
12adc 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 76 sqlite3Hwtime(v
12add 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 28 28 73 oid){ return ((s
12ade 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 30 29 3b qlite_uint64)0);
12adf 20 7d 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a }....#endif....
12ae0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e #endif /* !defin
12ae1 65 64 28 5f 48 57 54 49 4d 45 5f 48 5f 29 20 2a ed(_HWTIME_H_) *
12ae2 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
12ae3 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 68 77 74 69 **** End of hwti
12ae4 6d 65 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a me.h ***********
12ae5 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ae6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ae7 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
12ae8 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 ***** Continuing
12ae9 20 77 68 65 72 65 20 77 65 20 6c 65 66 74 20 6f where we left o
12aea 66 66 20 69 6e 20 6f 73 5f 63 6f 6d 6d 6f 6e 2e ff in os_common.
12aeb 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
12aec 2a 2a 2a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 ****/....static
12aed 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 67 5f sqlite_uint64 g_
12aee 73 74 61 72 74 3b 0d 0a 73 74 61 74 69 63 20 73 start;..static s
12aef 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 67 5f 65 qlite_uint64 g_e
12af0 6c 61 70 73 65 64 3b 0d 0a 23 64 65 66 69 6e 65 lapsed;..#define
12af1 20 54 49 4d 45 52 5f 53 54 41 52 54 20 20 20 20 TIMER_START
12af2 20 20 20 67 5f 73 74 61 72 74 3d 73 71 6c 69 74 g_start=sqlit
12af3 65 33 48 77 74 69 6d 65 28 29 0d 0a 23 64 65 66 e3Hwtime()..#def
12af4 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 20 20 20 ine TIMER_END
12af5 20 20 20 20 20 20 67 5f 65 6c 61 70 73 65 64 3d g_elapsed=
12af6 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 2d sqlite3Hwtime()-
12af7 67 5f 73 74 61 72 74 0d 0a 23 64 65 66 69 6e 65 g_start..#define
12af8 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 20 20 TIMER_ELAPSED
12af9 20 20 20 67 5f 65 6c 61 70 73 65 64 0d 0a 23 65 g_elapsed..#e
12afa 6c 73 65 0d 0a 23 64 65 66 69 6e 65 20 54 49 4d lse..#define TIM
12afb 45 52 5f 53 54 41 52 54 0d 0a 23 64 65 66 69 6e ER_START..#defin
12afc 65 20 54 49 4d 45 52 5f 45 4e 44 0d 0a 23 64 65 e TIMER_END..#de
12afd 66 69 6e 65 20 54 49 4d 45 52 5f 45 4c 41 50 53 fine TIMER_ELAPS
12afe 45 44 20 20 20 20 20 28 28 73 71 6c 69 74 65 5f ED ((sqlite_
12aff 75 69 6e 74 36 34 29 30 29 0d 0a 23 65 6e 64 69 uint64)0)..#endi
12b00 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 77 f..../*..** If w
12b01 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 74 e compile with t
12b02 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6d he SQLITE_TEST m
12b03 61 63 72 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 acro set, then t
12b04 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f he following blo
12b05 63 6b 0d 0a 2a 2a 20 6f 66 20 63 6f 64 65 20 77 ck..** of code w
12b06 69 6c 6c 20 67 69 76 65 20 75 73 20 74 68 65 20 ill give us the
12b07 61 62 69 6c 69 74 79 20 74 6f 20 73 69 6d 75 6c ability to simul
12b08 61 74 65 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 ate a disk I/O e
12b09 72 72 6f 72 2e 20 20 54 68 69 73 0d 0a 2a 2a 20 rror. This..**
12b0a 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 is used for test
12b0b 69 6e 67 20 74 68 65 20 49 2f 4f 20 72 65 63 6f ing the I/O reco
12b0c 76 65 72 79 20 6c 6f 67 69 63 2e 0d 0a 2a 2f 0d very logic...*/.
12b0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
12b0e 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 EST..SQLITE_API
12b0f 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 int sqlite3_io_e
12b10 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 20 20 20 rror_hit = 0;
12b11 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 /* Tota
12b12 6c 20 6e 75 6d 62 65 72 20 6f 66 20 49 2f 4f 20 l number of I/O
12b13 45 72 72 6f 72 73 20 2a 2f 0d 0a 53 51 4c 49 54 Errors */..SQLIT
12b14 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
12b15 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 3_io_error_hardh
12b16 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f it = 0; /
12b17 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d * Number of non-
12b18 62 65 6e 69 67 6e 20 65 72 72 6f 72 73 20 2a 2f benign errors */
12b19 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
12b1a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f sqlite3_io_erro
12b1b 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 20 20 r_pending = 0;
12b1c 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 64 /* Count d
12b1d 6f 77 6e 20 74 6f 20 66 69 72 73 74 20 49 2f 4f own to first I/O
12b1e 20 65 72 72 6f 72 20 2a 2f 0d 0a 53 51 4c 49 54 error */..SQLIT
12b1f 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 E_API int sqlite
12b20 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 3_io_error_persi
12b21 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f st = 0; /
12b22 2a 20 54 72 75 65 20 69 66 20 49 2f 4f 20 65 72 * True if I/O er
12b23 72 6f 72 73 20 70 65 72 73 69 73 74 20 2a 2f 0d rors persist */.
12b24 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
12b25 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 sqlite3_io_error
12b26 5f 62 65 6e 69 67 6e 20 3d 20 30 3b 20 20 20 20 _benign = 0;
12b27 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
12b28 65 72 72 6f 72 73 20 61 72 65 20 62 65 6e 69 67 errors are benig
12b29 6e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 n */..SQLITE_API
12b2a 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 73 int sqlite3_dis
12b2b 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 kfull_pending =
12b2c 30 3b 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 0;..SQLITE_API i
12b2d 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 nt sqlite3_diskf
12b2e 75 6c 6c 20 3d 20 30 3b 0d 0a 23 64 65 66 69 6e ull = 0;..#defin
12b2f 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f e SimulateIOErro
12b30 72 42 65 6e 69 67 6e 28 58 29 20 73 71 6c 69 74 rBenign(X) sqlit
12b31 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 62 65 6e 69 e3_io_error_beni
12b32 67 6e 3d 28 58 29 0d 0a 23 64 65 66 69 6e 65 20 gn=(X)..#define
12b33 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
12b34 43 4f 44 45 29 20 20 5c 0d 0a 20 20 69 66 28 20 CODE) \.. if(
12b35 28 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f (sqlite3_io_erro
12b36 72 5f 70 65 72 73 69 73 74 20 26 26 20 73 71 6c r_persist && sql
12b37 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 ite3_io_error_hi
12b38 74 29 20 5c 0d 0a 20 20 20 20 20 20 20 7c 7c 20 t) \.. ||
12b39 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 sqlite3_io_error
12b3a 5f 70 65 6e 64 69 6e 67 2d 2d 20 3d 3d 20 31 20 _pending-- == 1
12b3b 29 20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 ) \..
12b3c 20 20 20 20 7b 20 6c 6f 63 61 6c 5f 69 6f 65 72 { local_ioer
12b3d 72 28 29 3b 20 43 4f 44 45 3b 20 7d 0d 0a 73 74 r(); CODE; }..st
12b3e 61 74 69 63 20 76 6f 69 64 20 6c 6f 63 61 6c 5f atic void local_
12b3f 69 6f 65 72 72 28 29 7b 0d 0a 20 20 49 4f 54 52 ioerr(){.. IOTR
12b40 41 43 45 28 28 22 49 4f 45 52 52 5c 6e 22 29 29 ACE(("IOERR\n"))
12b41 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f ;.. sqlite3_io_
12b42 65 72 72 6f 72 5f 68 69 74 2b 2b 3b 0d 0a 20 20 error_hit++;..
12b43 69 66 28 20 21 73 71 6c 69 74 65 33 5f 69 6f 5f if( !sqlite3_io_
12b44 65 72 72 6f 72 5f 62 65 6e 69 67 6e 20 29 20 73 error_benign ) s
12b45 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f qlite3_io_error_
12b46 68 61 72 64 68 69 74 2b 2b 3b 0d 0a 7d 0d 0a 23 hardhit++;..}..#
12b47 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 44 define SimulateD
12b48 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 43 4f 44 iskfullError(COD
12b49 45 29 20 5c 0d 0a 20 20 20 69 66 28 20 73 71 6c E) \.. if( sql
12b4a 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 ite3_diskfull_pe
12b4b 6e 64 69 6e 67 20 29 7b 20 5c 0d 0a 20 20 20 20 nding ){ \..
12b4c 20 69 66 28 20 73 71 6c 69 74 65 33 5f 64 69 73 if( sqlite3_dis
12b4d 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 3d kfull_pending ==
12b4e 20 31 20 29 7b 20 5c 0d 0a 20 20 20 20 20 20 20 1 ){ \..
12b4f 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29 3b 20 5c local_ioerr(); \
12b50 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 .. sqlite3
12b51 5f 64 69 73 6b 66 75 6c 6c 20 3d 20 31 3b 20 5c _diskfull = 1; \
12b52 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 .. sqlite3
12b53 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 _io_error_hit =
12b54 31 3b 20 5c 0d 0a 20 20 20 20 20 20 20 43 4f 44 1; \.. COD
12b55 45 3b 20 5c 0d 0a 20 20 20 20 20 7d 65 6c 73 65 E; \.. }else
12b56 7b 20 5c 0d 0a 20 20 20 20 20 20 20 73 71 6c 69 { \.. sqli
12b57 74 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e te3_diskfull_pen
12b58 64 69 6e 67 2d 2d 3b 20 5c 0d 0a 20 20 20 20 20 ding--; \..
12b59 7d 20 5c 0d 0a 20 20 20 7d 0d 0a 23 65 6c 73 65 } \.. }..#else
12b5a 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 ..#define Simula
12b5b 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 teIOErrorBenign(
12b5c 58 29 0d 0a 23 64 65 66 69 6e 65 20 53 69 6d 75 X)..#define Simu
12b5d 6c 61 74 65 49 4f 45 72 72 6f 72 28 41 29 0d 0a lateIOError(A)..
12b5e 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 #define Simulate
12b5f 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 41 29 DiskfullError(A)
12b60 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
12b61 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c ** When testing,
12b62 20 6b 65 65 70 20 61 20 63 6f 75 6e 74 20 6f 66 keep a count of
12b63 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f the number of o
12b64 70 65 6e 20 66 69 6c 65 73 2e 0d 0a 2a 2f 0d 0a pen files...*/..
12b65 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
12b66 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 ST..SQLITE_API i
12b67 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f nt sqlite3_open_
12b68 66 69 6c 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0d file_count = 0;.
12b69 0a 23 64 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 .#define OpenCou
12b6a 6e 74 65 72 28 58 29 20 20 73 71 6c 69 74 65 33 nter(X) sqlite3
12b6b 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 _open_file_count
12b6c 2b 3d 28 58 29 0d 0a 23 65 6c 73 65 0d 0a 23 64 +=(X)..#else..#d
12b6d 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 6e 74 65 efine OpenCounte
12b6e 72 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a r(X)..#endif....
12b6f 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e #endif /* !defin
12b70 65 64 28 5f 4f 53 5f 43 4f 4d 4d 4f 4e 5f 48 5f ed(_OS_COMMON_H_
12b71 29 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a ) */..../*******
12b72 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6f ******* End of o
12b73 73 5f 63 6f 6d 6d 6f 6e 2e 68 20 2a 2a 2a 2a 2a s_common.h *****
12b74 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12b75 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12b76 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
12b77 2a 2a 2a 2a 2a 2a 2a 2a 20 43 6f 6e 74 69 6e 75 ******** Continu
12b78 69 6e 67 20 77 68 65 72 65 20 77 65 20 6c 65 66 ing where we lef
12b79 74 20 6f 66 66 20 69 6e 20 6f 73 5f 77 69 6e 2e t off in os_win.
12b7a 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a c **************
12b7b 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a *******/..../*..
12b7c 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 ** Some Microsof
12b7d 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b t compilers lack
12b7e 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e this definition
12b7f 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 49 ...*/..#ifndef I
12b80 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 NVALID_FILE_ATTR
12b81 49 42 55 54 45 53 0d 0a 23 20 64 65 66 69 6e 65 IBUTES..# define
12b82 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 INVALID_FILE_AT
12b83 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 TRIBUTES ((DWORD
12b84 29 2d 31 29 20 0d 0a 23 65 6e 64 69 66 0d 0a 0d )-1) ..#endif...
12b85 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 ./* Forward refe
12b86 72 65 6e 63 65 73 20 2a 2f 0d 0a 74 79 70 65 64 rences */..typed
12b87 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d ef struct winShm
12b88 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 winShm;
12b89 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 /* A connecti
12b8a 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d on to shared-mem
12b8b 6f 72 79 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 ory */..typedef
12b8c 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 struct winShmNod
12b8d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 e winShmNode;
12b8e 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 /* A region of s
12b8f 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0d hared-memory */.
12b90 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 69 6e 43 45 20 .../*..** WinCE
12b91 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70 lacks native sup
12b92 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f port for file lo
12b93 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65 cking so we have
12b94 20 74 6f 20 66 61 6b 65 20 69 74 0d 0a 2a 2a 20 to fake it..**
12b95 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f with some code o
12b96 66 20 6f 75 72 20 6f 77 6e 2e 0d 0a 2a 2f 0d 0a f our own...*/..
12b97 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
12b98 4e 43 45 0d 0a 74 79 70 65 64 65 66 20 73 74 72 NCE..typedef str
12b99 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0d uct winceLock {.
12b9a 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b . int nReaders;
12b9b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
12b9c 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 of reader locks
12b9d 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0d 0a 20 20 obtained */..
12b9e 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 BOOL bPending;
12b9f 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 /* Indicates
12ba0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 a pending lock
12ba1 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 has been obtaine
12ba2 64 20 2a 2f 0d 0a 20 20 42 4f 4f 4c 20 62 52 65 d */.. BOOL bRe
12ba3 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 served; /* I
12ba4 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72 ndicates a reser
12ba5 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 ved lock has bee
12ba6 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0d 0a 20 n obtained */..
12ba7 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 BOOL bExclusive
12ba8 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 ; /* Indicate
12ba9 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c s an exclusive l
12baa 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 ock has been obt
12bab 61 69 6e 65 64 20 2a 2f 0d 0a 7d 20 77 69 6e 63 ained */..} winc
12bac 65 4c 6f 63 6b 3b 0d 0a 23 65 6e 64 69 66 0d 0a eLock;..#endif..
12bad 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 77 69 6e ../*..** The win
12bae 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 File structure i
12baf 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 s a subclass of
12bb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 sqlite3_file* sp
12bb1 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 ecific to the wi
12bb2 6e 33 32 0d 0a 2a 2a 20 70 6f 72 74 61 62 69 6c n32..** portabil
12bb3 69 74 79 20 6c 61 79 65 72 2e 0d 0a 2a 2f 0d 0a ity layer...*/..
12bb4 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 typedef struct w
12bb5 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0d inFile winFile;.
12bb6 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 .struct winFile
12bb7 7b 0d 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 {.. const sqlit
12bb8 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 e3_io_methods *p
12bb9 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 Method; /*** Mus
12bba 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0d t be first ***/.
12bbb 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
12bbc 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 pVfs; /* Th
12bbd 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 e VFS used to op
12bbe 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0d en this file */.
12bbf 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 . HANDLE h;
12bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 /* Ha
12bc1 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 ndle for accessi
12bc2 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0d 0a ng the file */..
12bc3 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 u8 locktype;
12bc4 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 /* Typ
12bc5 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e e of lock curren
12bc6 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 tly held on this
12bc7 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 73 68 6f 72 file */.. shor
12bc8 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 t sharedLockByte
12bc9 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 ; /* Randomly
12bca 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 chosen byte used
12bcb 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 as a shared loc
12bcc 6b 20 2a 2f 0d 0a 20 20 75 38 20 63 74 72 6c 46 k */.. u8 ctrlF
12bcd 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 lags;
12bce 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 /* Flags. See W
12bcf 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a INFILE_* below *
12bd0 2f 0d 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 /.. DWORD lastE
12bd1 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 rrno; /*
12bd2 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e The Windows errn
12bd3 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 o from the last
12bd4 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 I/O error */..
12bd5 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 winShm *pShm;
12bd6 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 /* Insta
12bd7 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 nce of shared me
12bd8 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c mory on this fil
12bd9 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 e */.. const ch
12bda 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 ar *zPath;
12bdb 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 /* Full pathname
12bdc 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f of this file */
12bdd 0d 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b .. int szChunk;
12bde 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
12bdf 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 hunk size config
12be0 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 ured by FCNTL_CH
12be1 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0d 0a 23 69 66 UNK_SIZE */..#if
12be2 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
12be3 0d 0a 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 .. LPWSTR zDele
12be4 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e teOnClose; /* N
12be5 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 ame of file to d
12be6 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 elete when closi
12be7 6e 67 20 2a 2f 0d 0a 20 20 48 41 4e 44 4c 45 20 ng */.. HANDLE
12be8 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 hMutex;
12be9 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74 /* Mutex used t
12bea 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 o control access
12beb 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 to shared lock
12bec 2a 2f 20 20 0d 0a 20 20 48 41 4e 44 4c 45 20 68 */ .. HANDLE h
12bed 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 Shared;
12bee 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 /* Shared memory
12bef 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f segment used fo
12bf0 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0d 0a 20 20 r locking */..
12bf1 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b winceLock local;
12bf2 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 /* Locks
12bf3 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 obtained by thi
12bf4 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 s instance of wi
12bf5 6e 46 69 6c 65 20 2a 2f 0d 0a 20 20 77 69 6e 63 nFile */.. winc
12bf6 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 eLock *shared;
12bf7 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 /* Global sh
12bf8 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 ared lock memory
12bf9 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a for the file *
12bfa 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d /..#endif..};...
12bfb 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 ./*..** Allowed
12bfc 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 values for winFi
12bfd 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0d 0a 2a 2f le.ctrlFlags..*/
12bfe 0d 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c ..#define WINFIL
12bff 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 E_PERSIST_WAL
12c00 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 0x04 /* Pers
12c01 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 istent WAL mode
12c02 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 */..#define WINF
12c03 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 ILE_PSOW
12c04 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 0x10 /* SQ
12c05 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 LITE_IOCAP_POWER
12c06 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a SAFE_OVERWRITE *
12c07 2f 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 20 49 66 20 63 /..../*.. * If c
12c08 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c ompiled with SQL
12c09 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 ITE_WIN32_MALLOC
12c0a 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 on Windows, we
12c0b 77 69 6c 6c 20 75 73 65 20 74 68 65 0d 0a 20 2a will use the.. *
12c0c 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 various Win32 A
12c0d 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e PI heap function
12c0e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 s instead of our
12c0f 20 6f 77 6e 2e 0d 0a 20 2a 2f 0d 0a 23 69 66 64 own... */..#ifd
12c10 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
12c11 4d 41 4c 4c 4f 43 0d 0a 2f 2a 0d 0a 20 2a 20 54 MALLOC../*.. * T
12c12 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 he initial size
12c13 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 of the Win32-spe
12c14 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 cific heap. Thi
12c15 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a s value may be z
12c16 65 72 6f 2e 0d 0a 20 2a 2f 0d 0a 23 69 66 6e 64 ero... */..#ifnd
12c17 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
12c18 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0d 0a HEAP_INIT_SIZE..
12c19 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 # define SQLITE
12c1a 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 _WIN32_HEAP_INIT
12c1b 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 _SIZE ((SQLITE_D
12c1c 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a EFAULT_CACHE_SIZ
12c1d 45 29 20 2a 20 5c 0d 0a 20 20 20 20 20 20 20 20 E) * \..
12c1e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12c1f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
12c20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 SQLITE_DEFAULT_P
12c21 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 AGE_SIZE) + 4194
12c22 33 30 34 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 304)..#endif....
12c23 2f 2a 0d 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d /*.. * The maxim
12c24 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 um size of the W
12c25 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 in32-specific he
12c26 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 ap. This value
12c27 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0d 0a 20 2a may be zero... *
12c28 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
12c29 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 E_WIN32_HEAP_MAX
12c2a 5f 53 49 5a 45 0d 0a 23 20 20 64 65 66 69 6e 65 _SIZE..# define
12c2b 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 SQLITE_WIN32_HE
12c2c 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 AP_MAX_SIZE (0)
12c2d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
12c2e 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 * The extra fla
12c2f 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c gs to use in cal
12c30 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 ls to the Win32
12c31 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 heap APIs. This
12c32 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0d 0a 20 value may be..
12c33 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 * zero for the d
12c34 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e efault behavior.
12c35 0d 0a 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 .. */..#ifndef S
12c36 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
12c37 5f 46 4c 41 47 53 0d 0a 23 20 20 64 65 66 69 6e _FLAGS..# defin
12c38 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 e SQLITE_WIN32_H
12c39 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 EAP_FLAGS (0
12c3a 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d )..#endif..../*.
12c3b 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 .** The winMemDa
12c3c 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f ta structure sto
12c3d 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 res information
12c3e 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 required by the
12c3f 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0d 0a Win32-specific..
12c40 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d ** sqlite3_mem_m
12c41 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 ethods implement
12c42 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 ation...*/..type
12c43 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 def struct winMe
12c44 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 mData winMemData
12c45 3b 0d 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d ;..struct winMem
12c46 44 61 74 61 20 7b 0d 0a 23 69 66 6e 64 65 66 20 Data {..#ifndef
12c47 4e 44 45 42 55 47 0d 0a 20 20 75 33 32 20 6d 61 NDEBUG.. u32 ma
12c48 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 gic; /* Magic
12c49 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 number to detec
12c4a 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 t structure corr
12c4b 75 70 74 69 6f 6e 2e 20 2a 2f 0d 0a 23 65 6e 64 uption. */..#end
12c4c 69 66 0d 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 if.. HANDLE hHe
12c4d 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c ap; /* The handl
12c4e 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a e to our heap. *
12c4f 2f 0d 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 /.. BOOL bOwned
12c50 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 ; /* Do we own
12c51 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 the heap (i.e. d
12c52 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 estroy it on shu
12c53 74 64 6f 77 6e 29 3f 20 2a 2f 0d 0a 7d 3b 0d 0a tdown)? */..};..
12c54 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 ..#ifndef NDEBUG
12c55 0d 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d ..#define WINMEM
12c56 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62 _MAGIC 0x42b
12c57 32 38 33 30 62 0d 0a 23 65 6e 64 69 66 0d 0a 0d 2830b..#endif...
12c58 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 .static struct w
12c59 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 inMemData win_me
12c5a 6d 5f 64 61 74 61 20 3d 20 7b 0d 0a 23 69 66 6e m_data = {..#ifn
12c5b 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 57 49 def NDEBUG.. WI
12c5c 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0d 0a 23 65 6e NMEM_MAGIC,..#en
12c5d 64 69 66 0d 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c dif.. NULL, FAL
12c5e 53 45 0d 0a 7d 3b 0d 0a 0d 0a 23 69 66 6e 64 65 SE..};....#ifnde
12c5f 66 20 4e 44 45 42 55 47 0d 0a 23 64 65 66 69 6e f NDEBUG..#defin
12c60 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 e winMemAssertMa
12c61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69 gic() assert( wi
12c62 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 n_mem_data.magic
12c63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 ==WINMEM_MAGIC )
12c64 0d 0a 23 65 6c 73 65 0d 0a 23 64 65 66 69 6e 65 ..#else..#define
12c65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 winMemAssertMag
12c66 69 63 28 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ic()..#endif....
12c67 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 #define winMemGe
12c68 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f tHeap() win_mem_
12c69 64 61 74 61 2e 68 48 65 61 70 0d 0a 0d 0a 73 74 data.hHeap....st
12c6a 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 atic void *winMe
12c6b 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 mMalloc(int nByt
12c6c 65 73 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 es);..static voi
12c6d 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 d winMemFree(voi
12c6e 64 20 2a 70 50 72 69 6f 72 29 3b 0d 0a 73 74 61 d *pPrior);..sta
12c6f 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d tic void *winMem
12c70 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 Realloc(void *pP
12c71 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 rior, int nBytes
12c72 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 );..static int w
12c73 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a inMemSize(void *
12c74 70 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 p);..static int
12c75 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e winMemRoundup(in
12c76 74 20 6e 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e t n);..static in
12c77 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 t winMemInit(voi
12c78 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0d 0a 73 d *pAppData);..s
12c79 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 tatic void winMe
12c7a 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a mShutdown(void *
12c7b 70 41 70 70 44 61 74 61 29 3b 0d 0a 0d 0a 53 51 pAppData);....SQ
12c7c 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e LITE_PRIVATE con
12c7d 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d st sqlite3_mem_m
12c7e 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d ethods *sqlite3M
12c7f 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 emGetWin32(void)
12c80 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c ;..#endif /* SQL
12c81 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 ITE_WIN32_MALLOC
12c82 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 */..../*..** Th
12c83 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 e following vari
12c84 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c able is (normall
12c85 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 y) set once and
12c86 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0d 0a 2a never changes..*
12c87 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 * thereafter. I
12c88 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 t records whethe
12c89 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 r the operating
12c8a 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0d system is Win9x.
12c8b 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0d 0a 2a .** or WinNT...*
12c8c 2a 0d 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 *..** 0: Opera
12c8d 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e ting system unkn
12c8e 6f 77 6e 2e 0d 0a 2a 2a 20 31 3a 20 20 20 4f 70 own...** 1: Op
12c8f 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 erating system i
12c90 73 20 57 69 6e 39 78 2e 0d 0a 2a 2a 20 32 3a 20 s Win9x...** 2:
12c91 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 Operating syst
12c92 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0d 0a 2a 2a em is WinNT...**
12c93 0d 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f ..** In order to
12c94 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 facilitate test
12c95 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 ing on a WinNT s
12c96 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 ystem, the test
12c97 66 69 78 74 75 72 65 0d 0a 2a 2a 20 63 61 6e 20 fixture..** can
12c98 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 manually set thi
12c99 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 s value to 1 to
12c9a 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 emulate Win98 be
12c9b 68 61 76 69 6f 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 havior...*/..#if
12c9c 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0d def SQLITE_TEST.
12c9d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 .SQLITE_API int
12c9e 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 sqlite3_os_type
12c9f 3d 20 30 3b 0d 0a 23 65 6c 73 65 0d 0a 73 74 61 = 0;..#else..sta
12ca0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f tic int sqlite3_
12ca1 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0d 0a 23 65 os_type = 0;..#e
12ca2 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d ndif..../*..** M
12ca3 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 any system calls
12ca4 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 are accessed th
12ca5 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f rough pointer-to
12ca6 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 -functions so th
12ca7 61 74 0d 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 at..** they may
12ca8 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 be overridden at
12ca9 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 runtime to faci
12caa 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a litate fault inj
12cab 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0d 0a 2a ection during..*
12cac 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 * testing and sa
12cad 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 ndboxing. The f
12cae 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 ollowing array h
12caf 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 olds the names a
12cb0 6e 64 20 70 6f 69 6e 74 65 72 73 0d 0a 2a 2a 20 nd pointers..**
12cb1 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 to all overridea
12cb2 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 ble system calls
12cb3 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 21 53 51 4c 49 ...*/..#if !SQLI
12cb4 54 45 5f 4f 53 5f 57 49 4e 43 45 0d 0a 23 20 20 TE_OS_WINCE..#
12cb5 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 define SQLITE_WI
12cb6 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0d 0a 23 65 N32_HAS_ANSI..#e
12cb7 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 ndif....#if SQLI
12cb8 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 TE_OS_WINCE || S
12cb9 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 0d 0a QLITE_OS_WINNT..
12cba 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 # define SQLITE
12cbb 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0d _WIN32_HAS_WIDE.
12cbc 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 .#endif....#ifnd
12cbd 65 66 20 53 59 53 43 41 4c 4c 0d 0a 23 20 20 64 ef SYSCALL..# d
12cbe 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 efine SYSCALL sq
12cbf 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 lite3_syscall_pt
12cc0 72 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 r..#endif....#if
12cc1 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
12cc2 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 20 6d ../*..** These m
12cc3 61 63 72 6f 73 20 61 72 65 20 6e 65 63 65 73 73 acros are necess
12cc4 61 72 79 20 62 65 63 61 75 73 65 20 57 69 6e 64 ary because Wind
12cc5 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 ows CE does not
12cc6 6e 61 74 69 76 65 6c 79 20 73 75 70 70 6f 72 74 natively support
12cc7 20 74 68 65 0d 0a 2a 2a 20 57 69 6e 33 32 20 41 the..** Win32 A
12cc8 50 49 73 20 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e PIs LockFile, Un
12cc9 6c 6f 63 6b 46 69 6c 65 2c 20 61 6e 64 20 4c 6f lockFile, and Lo
12cca 63 6b 46 69 6c 65 45 78 2e 0d 0a 20 2a 2f 0d 0a ckFileEx... */..
12ccb 0d 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b ..# define Lock
12ccc 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 File(a,b,c,d,e)
12ccd 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 winceLockF
12cce 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c ile(&a, b, c, d,
12ccf 20 65 29 0d 0a 23 20 20 64 65 66 69 6e 65 20 55 e)..# define U
12cd0 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c nlockFile(a,b,c,
12cd1 64 2c 65 29 20 20 20 20 20 77 69 6e 63 65 55 6e d,e) winceUn
12cd2 6c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 lockFile(&a, b,
12cd3 63 2c 20 64 2c 20 65 29 0d 0a 23 20 20 64 65 66 c, d, e)..# def
12cd4 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 61 ine LockFileEx(a
12cd5 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 77 69 ,b,c,d,e,f) wi
12cd6 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 26 61 nceLockFileEx(&a
12cd7 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29 , b, c, d, e, f)
12cd8 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 73 65 ..../*..** These
12cd9 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61 6c are the special
12cda 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20 66 syscall hacks f
12cdb 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 20 or Windows CE.
12cdc 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 61 The locking rela
12cdd 74 65 64 0d 0a 2a 2a 20 64 65 66 69 6e 65 73 20 ted..** defines
12cde 68 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68 here refer to th
12cdf 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 e macros defined
12ce0 20 6a 75 73 74 20 61 62 6f 76 65 2e 0d 0a 20 2a just above... *
12ce1 2f 0d 0a 0d 0a 23 20 20 64 65 66 69 6e 65 20 6f /....# define o
12ce2 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 sAreFileApisANSI
12ce3 28 29 20 20 20 20 20 20 20 31 0d 0a 23 20 20 64 () 1..# d
12ce4 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 efine osLockFile
12ce5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12ce6 4c 6f 63 6b 46 69 6c 65 0d 0a 23 20 20 64 65 66 LockFile..# def
12ce7 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 ine osUnlockFile
12ce8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 6e Un
12ce9 6c 6f 63 6b 46 69 6c 65 0d 0a 23 20 20 64 65 66 lockFile..# def
12cea 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 ine osLockFileEx
12ceb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f Lo
12cec 63 6b 46 69 6c 65 45 78 0d 0a 23 65 6e 64 69 66 ckFileEx..#endif
12ced 0d 0a 0d 0a 73 74 61 74 69 63 20 73 74 72 75 63 ....static struc
12cee 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0d t win_syscall {.
12cef 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
12cf0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 Name;
12cf1 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 /* Name of the
12cf2 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0d 0a 20 sytem call */..
12cf3 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c sqlite3_syscall
12cf4 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f _ptr pCurrent; /
12cf5 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 * Current value
12cf6 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 of the system ca
12cf7 6c 6c 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 ll */.. sqlite3
12cf8 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 _syscall_ptr pDe
12cf9 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c fault; /* Defaul
12cfa 74 20 76 61 6c 75 65 20 2a 2f 0d 0a 7d 20 61 53 t value */..} aS
12cfb 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0d 0a 23 69 yscall[] = {..#i
12cfc 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
12cfd 43 45 0d 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 CE.. { "AreFile
12cfe 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 ApisANSI",
12cff 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 (SYSCALL)AreF
12d00 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 ileApisANSI,
12d01 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 0 },....#de
12d02 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 fine osAreFileAp
12d03 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 isANSI ((BOOL(WI
12d04 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 NAPI*)(VOID))aSy
12d05 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e scall[0].pCurren
12d06 74 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 t)..#else.. { "
12d07 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 AreFileApisANSI"
12d08 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 , (SYSCA
12d09 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
12d0a 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
12d0b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 ..#endif....#if
12d0c 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
12d0d 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
12d0e 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 E_WIN32_HAS_WIDE
12d0f 29 0d 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 ).. { "CharLowe
12d10 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 rW",
12d11 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c (SYSCALL)CharL
12d12 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 owerW,
12d13 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0 },..#else.
12d14 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 . { "CharLowerW
12d15 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
12d16 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
12d17 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12d18 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0 },..#endif..
12d19 0d 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 ..#define osChar
12d1a 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 LowerW ((LPWSTR(
12d1b 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 WINAPI*)(LPWSTR)
12d1c 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 )aSyscall[1].pCu
12d1d 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 53 51 rrent)....#if SQ
12d1e 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
12d1f 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
12d20 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0d WIN32_HAS_WIDE).
12d21 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 . { "CharUpperW
12d22 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
12d23 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 (SYSCALL)CharUpp
12d24 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 erW,
12d25 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 0 },..#else..
12d26 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c { "CharUpperW",
12d27 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
12d28 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
12d29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12d2a 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0 },..#endif....
12d2b 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 #define osCharUp
12d2c 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 perW ((LPWSTR(WI
12d2d 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 NAPI*)(LPWSTR))a
12d2e 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 Syscall[2].pCurr
12d2f 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 43 6c 6f ent).... { "Clo
12d30 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 seHandle",
12d31 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
12d32 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 CloseHandle,
12d33 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0 },...
12d34 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 .#define osClose
12d35 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 Handle ((BOOL(WI
12d36 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 NAPI*)(HANDLE))a
12d37 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 Syscall[3].pCurr
12d38 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 ent)....#if defi
12d39 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
12d3a 5f 48 41 53 5f 41 4e 53 49 29 0d 0a 20 20 7b 20 _HAS_ANSI).. {
12d3b 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 "CreateFileA",
12d3c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
12d3d 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c ALL)CreateFileA,
12d3e 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
12d3f 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 43 ,..#else.. { "C
12d40 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 reateFileA",
12d41 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
12d42 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
12d43 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0 },.
12d44 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 .#endif....#defi
12d45 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 ne osCreateFileA
12d46 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 ((HANDLE(WINAPI
12d47 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c *)(LPCSTR,DWORD,
12d48 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 20 20 20 20 DWORD, \..
12d49 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 LPSECURITY_ATT
12d4a 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 RIBUTES,DWORD,DW
12d4b 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 ORD,HANDLE))aSys
12d4c 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 call[4].pCurrent
12d4d 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 )....#if defined
12d4e 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
12d4f 53 5f 57 49 44 45 29 0d 0a 20 20 7b 20 22 43 72 S_WIDE).. { "Cr
12d50 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 eateFileW",
12d51 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
12d52 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 )CreateFileW,
12d53 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0 },..
12d54 23 65 6c 73 65 0d 0a 20 20 7b 20 22 43 72 65 61 #else.. { "Crea
12d55 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 teFileW",
12d56 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
12d57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
12d58 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 0 },..#e
12d59 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 ndif....#define
12d5a 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 osCreateFileW ((
12d5b 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 HANDLE(WINAPI*)(
12d5c 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 LPCWSTR,DWORD,DW
12d5d 4f 52 44 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 ORD, \..
12d5e 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 LPSECURITY_ATTRI
12d5f 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 BUTES,DWORD,DWOR
12d60 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 D,HANDLE))aSysca
12d61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0d ll[5].pCurrent).
12d62 0a 0d 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 ... { "CreateFi
12d63 6c 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20 leMapping",
12d64 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 (SYSCALL)Creat
12d65 65 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20 eFileMapping,
12d66 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 0 },....#def
12d67 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 ine osCreateFile
12d68 4d 61 70 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 Mapping ((HANDLE
12d69 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 (WINAPI*)(HANDLE
12d6a 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 ,LPSECURITY_ATTR
12d6b 49 42 55 54 45 53 2c 20 5c 0d 0a 20 20 20 20 20 IBUTES, \..
12d6c 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 DWORD,DWORD,D
12d6d 57 4f 52 44 2c 4c 50 43 54 53 54 52 29 29 61 53 WORD,LPCTSTR))aS
12d6e 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 yscall[6].pCurre
12d6f 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e nt)....#if defin
12d70 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
12d71 48 41 53 5f 57 49 44 45 29 0d 0a 20 20 7b 20 22 HAS_WIDE).. { "
12d72 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
12d73 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 gW", (SYSCA
12d74 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 LL)CreateFileMap
12d75 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c pingW, 0 },
12d76 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 43 72 ..#else.. { "Cr
12d77 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 eateFileMappingW
12d78 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c ", (SYSCALL
12d79 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
12d7a 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0 },..
12d7b 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e #endif....#defin
12d7c 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 e osCreateFileMa
12d7d 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 ppingW ((HANDLE(
12d7e 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
12d7f 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 LPSECURITY_ATTRI
12d80 42 55 54 45 53 2c 20 5c 0d 0a 20 20 20 20 20 20 BUTES, \..
12d81 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 DWORD,DWORD,DW
12d82 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 ORD,LPCWSTR))aSy
12d83 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e scall[7].pCurren
12d84 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 t)....#if define
12d85 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
12d86 41 53 5f 57 49 44 45 29 0d 0a 20 20 7b 20 22 43 AS_WIDE).. { "C
12d87 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 reateMutexW",
12d88 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
12d89 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 L)CreateMutexW,
12d8a 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0 },.
12d8b 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 43 72 65 .#else.. { "Cre
12d8c 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 ateMutexW",
12d8d 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
12d8e 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
12d8f 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 0 },..#
12d90 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 endif....#define
12d91 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20 osCreateMutexW
12d92 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
12d93 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 )(LPSECURITY_ATT
12d94 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0d RIBUTES,BOOL, \.
12d95 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 . LPCWSTR
12d96 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 ))aSyscall[8].pC
12d97 75 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 urrent)....#if d
12d98 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
12d99 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0d 0a 20 N32_HAS_ANSI)..
12d9a 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 { "DeleteFileA"
12d9b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 , (S
12d9c 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c YSCALL)DeleteFil
12d9d 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 eA,
12d9e 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 0 },..#else.. {
12d9f 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 "DeleteFileA",
12da0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
12da1 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
12da2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
12da3 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 },..#endif....#d
12da4 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 efine osDeleteFi
12da5 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 leA ((BOOL(WINAP
12da6 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 I*)(LPCSTR))aSys
12da7 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 call[9].pCurrent
12da8 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 )....#if defined
12da9 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
12daa 53 5f 57 49 44 45 29 0d 0a 20 20 7b 20 22 44 65 S_WIDE).. { "De
12dab 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 leteFileW",
12dac 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
12dad 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 )DeleteFileW,
12dae 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0 },..
12daf 23 65 6c 73 65 0d 0a 20 20 7b 20 22 44 65 6c 65 #else.. { "Dele
12db0 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 teFileW",
12db1 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
12db2 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
12db3 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 0 },..#e
12db4 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 ndif....#define
12db5 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 osDeleteFileW ((
12db6 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 BOOL(WINAPI*)(LP
12db7 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b CWSTR))aSyscall[
12db8 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 10].pCurrent)...
12db9 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
12dba 49 4e 43 45 0d 0a 20 20 7b 20 22 46 69 6c 65 54 INCE.. { "FileT
12dbb 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 imeToLocalFileTi
12dbc 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 me", (SYSCALL)Fi
12dbd 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c leTimeToLocalFil
12dbe 65 54 69 6d 65 2c 20 30 20 7d 2c 0d 0a 23 65 6c eTime, 0 },..#el
12dbf 73 65 0d 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d se.. { "FileTim
12dc0 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 eToLocalFileTime
12dc1 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 ", (SYSCALL)0,
12dc2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12dc3 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 0 },..#endi
12dc4 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 46 f....#define osF
12dc5 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 ileTimeToLocalFi
12dc6 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 leTime ((BOOL(WI
12dc7 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c NAPI*)(CONST FIL
12dc8 45 54 49 4d 45 2a 2c 20 5c 0d 0a 20 20 20 20 20 ETIME*, \..
12dc9 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 LPFILETIME))a
12dca 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 Syscall[11].pCur
12dcb 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 53 51 4c rent)....#if SQL
12dcc 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 ITE_OS_WINCE..
12dcd 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 { "FileTimeToSys
12dce 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 temTime", (SY
12dcf 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f SCALL)FileTimeTo
12dd0 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 SystemTime, 0
12dd1 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 },..#else.. {
12dd2 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 "FileTimeToSyste
12dd3 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 mTime", (SYSC
12dd4 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
12dd5 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
12dd6 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 ,..#endif....#de
12dd7 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 fine osFileTimeT
12dd8 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f oSystemTime ((BO
12dd9 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 OL(WINAPI*)(CONS
12dda 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0d 0a T FILETIME*, \..
12ddb 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d LPSYSTEM
12ddc 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 TIME))aSyscall[1
12ddd 32 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 2].pCurrent)....
12dde 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 { "FlushFileBu
12ddf 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 ffers", (
12de0 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c SYSCALL)FlushFil
12de1 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 eBuffers,
12de2 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 0 },....#define
12de3 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 osFlushFileBuff
12de4 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 ers ((BOOL(WINAP
12de5 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 I*)(HANDLE))aSys
12de6 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e call[13].pCurren
12de7 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 t)....#if define
12de8 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
12de9 41 53 5f 41 4e 53 49 29 0d 0a 20 20 7b 20 22 46 AS_ANSI).. { "F
12dea 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 ormatMessageA",
12deb 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
12dec 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 L)FormatMessageA
12ded 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d , 0 },.
12dee 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 46 6f 72 .#else.. { "For
12def 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 matMessageA",
12df0 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
12df1 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
12df2 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 0 },..#
12df3 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 endif....#define
12df4 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 osFormatMessage
12df5 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 A ((DWORD(WINAPI
12df6 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 *)(DWORD,LPCVOID
12df7 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 ,DWORD,DWORD,LPS
12df8 54 52 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 44 TR, \.. D
12df9 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 WORD,va_list*))a
12dfa 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 Syscall[14].pCur
12dfb 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 66 rent)....#if def
12dfc 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
12dfd 32 5f 48 41 53 5f 57 49 44 45 29 0d 0a 20 20 7b 2_HAS_WIDE).. {
12dfe 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 "FormatMessageW
12dff 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 ", (SYS
12e00 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 CALL)FormatMessa
12e01 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 geW, 0
12e02 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 },..#else.. { "
12e03 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c FormatMessageW",
12e04 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
12e05 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
12e06 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
12e07 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 ..#endif....#def
12e08 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 ine osFormatMess
12e09 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e ageW ((DWORD(WIN
12e0a 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 API*)(DWORD,LPCV
12e0b 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c OID,DWORD,DWORD,
12e0c 4c 50 57 53 54 52 2c 20 5c 0d 0a 20 20 20 20 20 LPWSTR, \..
12e0d 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 DWORD,va_list
12e0e 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e *))aSyscall[15].
12e0f 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b pCurrent).... {
12e10 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 "FreeLibrary",
12e11 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
12e12 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 CALL)FreeLibrary
12e13 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 , 0
12e14 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 },....#define os
12e15 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f FreeLibrary ((BO
12e16 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 OL(WINAPI*)(HMOD
12e17 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 ULE))aSyscall[16
12e18 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 ].pCurrent)....
12e19 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 { "GetCurrentPr
12e1a 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 ocessId", (S
12e1b 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e YSCALL)GetCurren
12e1c 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 tProcessId,
12e1d 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 0 },....#define
12e1e 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 osGetCurrentProc
12e1f 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 essId ((DWORD(WI
12e20 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 NAPI*)(VOID))aSy
12e21 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 scall[17].pCurre
12e22 6e 74 29 0d 0a 0d 0a 23 69 66 20 21 53 51 4c 49 nt)....#if !SQLI
12e23 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 TE_OS_WINCE && d
12e24 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
12e25 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0d 0a 20 N32_HAS_ANSI)..
12e26 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 { "GetDiskFreeS
12e27 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 paceA", (S
12e28 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 YSCALL)GetDiskFr
12e29 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 eeSpaceA,
12e2a 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 0 },..#else.. {
12e2b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 "GetDiskFreeSpa
12e2c 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 ceA", (SYS
12e2d 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
12e2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
12e2f 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 },..#endif....#d
12e30 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 efine osGetDiskF
12e31 72 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c reeSpaceA ((BOOL
12e32 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 (WINAPI*)(LPCSTR
12e33 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 ,LPDWORD,LPDWORD
12e34 2c 4c 50 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 20 ,LPDWORD, \..
12e35 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 LPDWORD))aS
12e36 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 yscall[18].pCurr
12e37 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 21 53 51 4c ent)....#if !SQL
12e38 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 ITE_OS_WINCE &&
12e39 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
12e3a 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0d 0a IN32_HAS_WIDE)..
12e3b 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 { "GetDiskFree
12e3c 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 SpaceW", (
12e3d 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 SYSCALL)GetDiskF
12e3e 72 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 reeSpaceW,
12e3f 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 0 },..#else..
12e40 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 { "GetDiskFreeSp
12e41 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 aceW", (SY
12e42 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
12e43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
12e44 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 },..#endif....#
12e45 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b define osGetDisk
12e46 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f FreeSpaceW ((BOO
12e47 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 L(WINAPI*)(LPCWS
12e48 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f TR,LPDWORD,LPDWO
12e49 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0d 0a 20 RD,LPDWORD, \..
12e4a 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 LPDWORD))
12e4b 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 aSyscall[19].pCu
12e4c 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 64 65 rrent)....#if de
12e4d 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
12e4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0d 0a 20 20 32_HAS_ANSI)..
12e4f 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 { "GetFileAttrib
12e50 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 utesA", (SY
12e51 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 SCALL)GetFileAtt
12e52 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 ributesA, 0
12e53 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 },..#else.. {
12e54 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 "GetFileAttribut
12e55 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 esA", (SYSC
12e56 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
12e57 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
12e58 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 ,..#endif....#de
12e59 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 fine osGetFileAt
12e5a 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 tributesA ((DWOR
12e5b 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 D(WINAPI*)(LPCST
12e5c 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e R))aSyscall[20].
12e5d 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 pCurrent)....#if
12e5e 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
12e5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0d WIN32_HAS_WIDE).
12e60 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 . { "GetFileAtt
12e61 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 ributesW",
12e62 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 (SYSCALL)GetFile
12e63 41 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 AttributesW,
12e64 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 20 0 },..#else..
12e65 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 { "GetFileAttri
12e66 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 butesW", (S
12e67 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
12e68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e69 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0 },..#endif....
12e6a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c #define osGetFil
12e6b 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28 44 eAttributesW ((D
12e6c 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 WORD(WINAPI*)(LP
12e6d 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b CWSTR))aSyscall[
12e6e 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 21].pCurrent)...
12e6f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
12e70 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
12e71 44 45 29 0d 0a 20 20 7b 20 22 47 65 74 46 69 6c DE).. { "GetFil
12e72 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c eAttributesExW",
12e73 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
12e74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 FileAttributesEx
12e75 57 2c 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 W, 0 },..#els
12e76 65 0d 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 e.. { "GetFileA
12e77 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 ttributesExW",
12e78 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
12e79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e7a 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0 },..#endif
12e7b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 ....#define osGe
12e7c 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 tFileAttributesE
12e7d 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 xW ((BOOL(WINAPI
12e7e 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 *)(LPCWSTR,GET_F
12e7f 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c ILEEX_INFO_LEVEL
12e80 53 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 S, \.. LP
12e81 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 VOID))aSyscall[2
12e82 32 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 2].pCurrent)....
12e83 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 { "GetFileSize
12e84 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ", (
12e85 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 SYSCALL)GetFileS
12e86 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ize,
12e87 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 0 },....#define
12e88 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 osGetFileSize (
12e89 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
12e8a 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 HANDLE,LPDWORD))
12e8b 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 aSyscall[23].pCu
12e8c 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 21 53 rrent)....#if !S
12e8d 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 QLITE_OS_WINCE &
12e8e 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
12e8f 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
12e90 0d 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 .. { "GetFullPa
12e91 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 thNameA",
12e92 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c (SYSCALL)GetFul
12e93 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 lPathNameA,
12e94 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 0 },..#else..
12e95 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 { "GetFullPath
12e96 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 NameA", (
12e97 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
12e98 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e99 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0 },..#endif...
12e9a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 .#define osGetFu
12e9b 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57 llPathNameA ((DW
12e9c 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 ORD(WINAPI*)(LPC
12e9d 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c STR,DWORD,LPSTR,
12e9e 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 53 54 \.. LPST
12e9f 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d R*))aSyscall[24]
12ea0 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 .pCurrent)....#i
12ea1 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
12ea2 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 CE && defined(SQ
12ea3 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 LITE_WIN32_HAS_W
12ea4 49 44 45 29 0d 0a 20 20 7b 20 22 47 65 74 46 75 IDE).. { "GetFu
12ea5 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 llPathNameW",
12ea6 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 (SYSCALL)Ge
12ea7 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 tFullPathNameW,
12ea8 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 0 },..#el
12ea9 73 65 0d 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c se.. { "GetFull
12eaa 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 PathNameW",
12eab 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
12eac 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12ead 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 0 },..#endi
12eae 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 47 f....#define osG
12eaf 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 etFullPathNameW
12eb0 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 ((DWORD(WINAPI*)
12eb1 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c (LPCWSTR,DWORD,L
12eb2 50 57 53 54 52 2c 20 5c 0d 0a 20 20 20 20 20 20 PWSTR, \..
12eb3 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 LPWSTR*))aSysc
12eb4 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 all[25].pCurrent
12eb5 29 0d 0a 0d 0a 20 20 7b 20 22 47 65 74 4c 61 73 ).... { "GetLas
12eb6 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 tError",
12eb7 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
12eb8 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 LastError,
12eb9 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 0 },....#d
12eba 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 efine osGetLastE
12ebb 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e rror ((DWORD(WIN
12ebc 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 API*)(VOID))aSys
12ebd 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e call[26].pCurren
12ebe 74 29 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 t)....#if SQLITE
12ebf 5f 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 2f 2a 20 _OS_WINCE.. /*
12ec0 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 The GetProcAddre
12ec1 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 ssA() routine is
12ec2 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 only available
12ec3 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a on Windows CE. *
12ec4 2f 0d 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 /.. { "GetProcA
12ec5 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 ddressA",
12ec6 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 (SYSCALL)GetPr
12ec7 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 ocAddressA,
12ec8 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0 },..#else.
12ec9 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 . /* All other
12eca 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d Windows platform
12ecb 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 s expect GetProc
12ecc 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b Address() to tak
12ecd 65 0d 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 e.. ** an ANSI
12ece 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 string regardles
12ecf 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 s of the _UNICOD
12ed0 45 20 73 65 74 74 69 6e 67 20 2a 2f 0d 0a 20 20 E setting */..
12ed1 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 { "GetProcAddres
12ed2 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 sA", (SY
12ed3 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 SCALL)GetProcAdd
12ed4 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 ress, 0
12ed5 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 },..#endif....#
12ed6 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 define osGetProc
12ed7 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 AddressA ((FARPR
12ed8 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 OC(WINAPI*)(HMOD
12ed9 55 4c 45 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 ULE, \..
12eda 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c LPCSTR))aSyscall
12edb 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a [27].pCurrent)..
12edc 0d 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d .. { "GetSystem
12edd 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 Info",
12ede 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 (SYSCALL)GetSys
12edf 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 temInfo,
12ee0 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 0 },....#defi
12ee1 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e ne osGetSystemIn
12ee2 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 fo ((VOID(WINAPI
12ee3 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f *)(LPSYSTEM_INFO
12ee4 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 ))aSyscall[28].p
12ee5 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 Current).... {
12ee6 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c "GetSystemTime",
12ee7 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
12ee8 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d ALL)GetSystemTim
12ee9 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d e, 0 }
12eea 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 47 ,....#define osG
12eeb 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 etSystemTime ((V
12eec 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 OID(WINAPI*)(LPS
12eed 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 YSTEMTIME))aSysc
12eee 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 all[29].pCurrent
12eef 29 0d 0a 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 )....#if !SQLITE
12ef0 5f 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 7b 20 22 _OS_WINCE.. { "
12ef1 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 GetSystemTimeAsF
12ef2 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 ileTime", (SYSCA
12ef3 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 LL)GetSystemTime
12ef4 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c AsFileTime, 0 },
12ef5 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 47 65 ..#else.. { "Ge
12ef6 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c tSystemTimeAsFil
12ef7 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c eTime", (SYSCALL
12ef8 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
12ef9 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0 },..
12efa 23 65 6e 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e #endif....#defin
12efb 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d e osGetSystemTim
12efc 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f eAsFileTime ((VO
12efd 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0d 0a ID(WINAPI*)( \..
12efe 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 LPFILETI
12eff 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d ME))aSyscall[30]
12f00 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 .pCurrent)....#i
12f01 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
12f02 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
12f03 0d 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 .. { "GetTempPa
12f04 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 thA",
12f05 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d (SYSCALL)GetTem
12f06 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 pPathA,
12f07 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0d 0a 0 },..#else..
12f08 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 { "GetTempPath
12f09 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 A", (
12f0a 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
12f0b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f0c 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0 },..#endif...
12f0d 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 .#define osGetTe
12f0e 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 mpPathA ((DWORD(
12f0f 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c WINAPI*)(DWORD,L
12f10 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 PSTR))aSyscall[3
12f11 31 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 1].pCurrent)....
12f12 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
12f13 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
12f14 45 29 0d 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 E).. { "GetTemp
12f15 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 PathW",
12f16 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 (SYSCALL)GetT
12f17 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 empPathW,
12f18 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0 },..#else
12f19 0d 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 .. { "GetTempPa
12f1a 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 thW",
12f1b 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 (SYSCALL)0,
12f1c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f1d 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0 },..#endif.
12f1e 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 ...#define osGet
12f1f 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 TempPathW ((DWOR
12f20 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 D(WINAPI*)(DWORD
12f21 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c ,LPWSTR))aSyscal
12f22 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0d l[32].pCurrent).
12f23 0a 0d 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 ... { "GetTickC
12f24 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 ount",
12f25 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 (SYSCALL)GetTi
12f26 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 ckCount,
12f27 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 0 },....#def
12f28 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 ine osGetTickCou
12f29 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 nt ((DWORD(WINAP
12f2a 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 I*)(VOID))aSysca
12f2b 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 ll[33].pCurrent)
12f2c 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ....#if defined(
12f2d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
12f2e 5f 41 4e 53 49 29 0d 0a 20 20 7b 20 22 47 65 74 _ANSI).. { "Get
12f2f 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 VersionExA",
12f30 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
12f31 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 GetVersionExA,
12f32 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 0 },..#
12f33 65 6c 73 65 0d 0a 20 20 7b 20 22 47 65 74 56 65 else.. { "GetVe
12f34 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 rsionExA",
12f35 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
12f36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f37 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 0 },..#en
12f38 64 69 66 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f dif....#define o
12f39 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 sGetVersionExA (
12f3a 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 (BOOL(WINAPI*)(
12f3b 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 \.. LPOSV
12f3c 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 ERSIONINFOA))aSy
12f3d 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 scall[34].pCurre
12f3e 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 48 65 61 70 nt).... { "Heap
12f3f 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 Alloc",
12f40 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 (SYSCALL)H
12f41 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 eapAlloc,
12f42 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 0 },....
12f43 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c #define osHeapAl
12f44 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e loc ((LPVOID(WIN
12f45 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f API*)(HANDLE,DWO
12f46 52 44 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 53 RD, \.. S
12f47 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b IZE_T))aSyscall[
12f48 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 35].pCurrent)...
12f49 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 . { "HeapCreate
12f4a 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
12f4b 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 (SYSCALL)HeapCre
12f4c 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ate,
12f4d 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 0 },....#defin
12f4e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 e osHeapCreate (
12f4f 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 (HANDLE(WINAPI*)
12f50 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c (DWORD,SIZE_T, \
12f51 0d 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 .. SIZE_T
12f52 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 ))aSyscall[36].p
12f53 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 Current).... {
12f54 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 "HeapDestroy",
12f55 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
12f56 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c ALL)HeapDestroy,
12f57 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
12f58 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 48 ,....#define osH
12f59 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f eapDestroy ((BOO
12f5a 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c L(WINAPI*)(HANDL
12f5b 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e E))aSyscall[37].
12f5c 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b pCurrent).... {
12f5d 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 "HeapFree",
12f5e 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
12f5f 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 CALL)HeapFree,
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
12f61 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 },....#define os
12f62 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 HeapFree ((BOOL(
12f63 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
12f64 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 DWORD,LPVOID))aS
12f65 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 yscall[38].pCurr
12f66 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 48 65 61 ent).... { "Hea
12f67 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 pReAlloc",
12f68 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
12f69 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 HeapReAlloc,
12f6a 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0 },...
12f6b 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 .#define osHeapR
12f6c 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 eAlloc ((LPVOID(
12f6d 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
12f6e 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0d DWORD,LPVOID, \.
12f6f 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 . SIZE_T)
12f70 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 )aSyscall[39].pC
12f71 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 urrent).... { "
12f72 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 HeapSize",
12f73 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
12f74 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 LL)HeapSize,
12f75 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
12f76 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 ....#define osHe
12f77 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 apSize ((SIZE_T(
12f78 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
12f79 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 20 20 20 20 DWORD, \..
12f7a 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 LPCVOID))aSysc
12f7b 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 all[40].pCurrent
12f7c 29 0d 0a 0d 0a 20 20 7b 20 22 48 65 61 70 56 61 ).... { "HeapVa
12f7d 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 lidate",
12f7e 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 (SYSCALL)Hea
12f7f 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 pValidate,
12f80 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 0 },....#d
12f81 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 efine osHeapVali
12f82 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 date ((BOOL(WINA
12f83 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 PI*)(HANDLE,DWOR
12f84 44 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 D, \.. LP
12f85 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b CVOID))aSyscall[
12f86 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 41].pCurrent)...
12f87 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
12f88 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
12f89 53 49 29 0d 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 SI).. { "LoadLi
12f8a 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 braryA",
12f8b 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 (SYSCALL)Loa
12f8c 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 dLibraryA,
12f8d 20 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 0 },..#els
12f8e 65 0d 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 e.. { "LoadLibr
12f8f 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 aryA",
12f90 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
12f91 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f92 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0 },..#endif
12f93 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f ....#define osLo
12f94 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f adLibraryA ((HMO
12f95 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 DULE(WINAPI*)(LP
12f96 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 CSTR))aSyscall[4
12f97 32 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 2].pCurrent)....
12f98 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
12f99 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
12f9a 45 29 0d 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 E).. { "LoadLib
12f9b 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 raryW",
12f9c 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 (SYSCALL)Load
12f9d 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 LibraryW,
12f9e 20 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6c 73 65 0 },..#else
12f9f 0d 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 .. { "LoadLibra
12fa0 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 ryW",
12fa1 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 (SYSCALL)0,
12fa2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12fa3 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0 },..#endif.
12fa4 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 ...#define osLoa
12fa5 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 dLibraryW ((HMOD
12fa6 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 ULE(WINAPI*)(LPC
12fa7 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 WSTR))aSyscall[4
12fa8 33 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 3].pCurrent)....
12fa9 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c { "LocalFree",
12faa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
12fab 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 SYSCALL)LocalFre
12fac 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
12fad 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 0 },....#define
12fae 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 osLocalFree ((H
12faf 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 LOCAL(WINAPI*)(H
12fb0 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b LOCAL))aSyscall[
12fb1 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 44].pCurrent)...
12fb2 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
12fb3 57 49 4e 43 45 0d 0a 20 20 7b 20 22 4c 6f 63 6b WINCE.. { "Lock
12fb4 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 File",
12fb5 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c (SYSCALL)L
12fb6 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 ockFile,
12fb7 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 0 },....
12fb8 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 #define osLockFi
12fb9 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 le ((BOOL(WINAPI
12fba 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c *)(HANDLE,DWORD,
12fbb 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0d 0a DWORD,DWORD, \..
12fbc 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 DWORD))a
12fbd 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 Syscall[45].pCur
12fbe 72 65 6e 74 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 rent)..#else..
12fbf 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 { "LockFile",
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
12fc1 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
12fc2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
12fc3 20 7d 2c 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 },..#endif....#
12fc4 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
12fc5 4e 43 45 0d 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 NCE.. { "LockFi
12fc6 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 leEx",
12fc7 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 (SYSCALL)Loc
12fc8 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 kFileEx,
12fc9 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 0 },....#d
12fca 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 efine osLockFile
12fcb 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 Ex ((BOOL(WINAPI
12fcc 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c *)(HANDLE,DWORD,
12fcd 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 DWORD,DWORD,DWOR
12fce 44 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 D, \.. LP
12fcf 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 OVERLAPPED))aSys
12fd0 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e call[46].pCurren
12fd1 74 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 t)..#else.. { "
12fd2 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 LockFileEx",
12fd3 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
12fd4 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
12fd5 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
12fd6 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 7b 20 ..#endif.... {
12fd7 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c "MapViewOfFile",
12fd8 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
12fd9 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c ALL)MapViewOfFil
12fda 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d e, 0 }
12fdb 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 4d ,....#define osM
12fdc 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c apViewOfFile ((L
12fdd 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 PVOID(WINAPI*)(H
12fde 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 ANDLE,DWORD,DWOR
12fdf 44 2c 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 20 20 D,DWORD, \..
12fe0 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 SIZE_T))aSys
12fe1 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e call[47].pCurren
12fe2 74 29 0d 0a 0d 0a 20 20 7b 20 22 4d 75 6c 74 69 t).... { "Multi
12fe3 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c ByteToWideChar",
12fe4 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 (SYSCALL)Mu
12fe5 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 ltiByteToWideCha
12fe6 72 2c 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 r, 0 },....#
12fe7 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 define osMultiBy
12fe8 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 teToWideChar ((i
12fe9 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 nt(WINAPI*)(UINT
12fea 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e ,DWORD,LPCSTR,in
12feb 74 2c 4c 50 57 53 54 52 2c 20 5c 0d 0a 20 20 20 t,LPWSTR, \..
12fec 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 int))aSysca
12fed 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 ll[48].pCurrent)
12fee 0d 0a 0d 0a 20 20 7b 20 22 51 75 65 72 79 50 65 .... { "QueryPe
12fef 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 rformanceCounter
12ff0 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 ", (SYSCALL)Quer
12ff1 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e yPerformanceCoun
12ff2 74 65 72 2c 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 ter, 0 },....#de
12ff3 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 fine osQueryPerf
12ff4 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 ormanceCounter (
12ff5 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 (BOOL(WINAPI*)(
12ff6 5c 0d 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 \.. LARGE
12ff7 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 _INTEGER*))aSysc
12ff8 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 all[49].pCurrent
12ff9 29 0d 0a 0d 0a 20 20 7b 20 22 52 65 61 64 46 69 ).... { "ReadFi
12ffa 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 le",
12ffb 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 (SYSCALL)Rea
12ffc 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 dFile,
12ffd 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 0 },....#d
12ffe 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 efine osReadFile
12fff 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
13000 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 (HANDLE,LPVOID,D
13001 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0d WORD,LPDWORD, \.
13002 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c . LPOVERL
13003 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b APPED))aSyscall[
13004 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 50].pCurrent)...
13005 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 . { "SetEndOfFi
13006 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 le",
13007 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f (SYSCALL)SetEndO
13008 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 fFile,
13009 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 0 },....#defin
1300a 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 e osSetEndOfFile
1300b 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
1300c 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c (HANDLE))aSyscal
1300d 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0d l[51].pCurrent).
1300e 0a 0d 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 ... { "SetFileP
1300f 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 ointer",
13010 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 (SYSCALL)SetFi
13011 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 lePointer,
13012 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 0 },....#def
13013 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 ine osSetFilePoi
13014 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e nter ((DWORD(WIN
13015 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e API*)(HANDLE,LON
13016 47 2c 50 4c 4f 4e 47 2c 20 5c 0d 0a 20 20 20 20 G,PLONG, \..
13017 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 DWORD))aSysc
13018 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 all[52].pCurrent
13019 29 0d 0a 0d 0a 20 20 7b 20 22 53 6c 65 65 70 22 ).... { "Sleep"
1301a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1301b 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 (SYSCALL)Sle
1301c 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ep,
1301d 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 0 },....#d
1301e 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 efine osSleep ((
1301f 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 VOID(WINAPI*)(DW
13020 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 ORD))aSyscall[53
13021 5d 2e 70 43 75 72 72 65 6e 74 29 0d 0a 0d 0a 20 ].pCurrent)....
13022 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f { "SystemTimeTo
13023 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 FileTime", (S
13024 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d YSCALL)SystemTim
13025 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 eToFileTime,
13026 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 0 },....#define
13027 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 osSystemTimeToFi
13028 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 leTime ((BOOL(WI
13029 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 NAPI*)(CONST SYS
1302a 54 45 4d 54 49 4d 45 2a 2c 20 5c 0d 0a 20 20 20 TEMTIME*, \..
1302b 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 LPFILETIME)
1302c 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 )aSyscall[54].pC
1302d 75 72 72 65 6e 74 29 0d 0a 0d 0a 23 69 66 20 21 urrent)....#if !
1302e 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0d SQLITE_OS_WINCE.
1302f 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 . { "UnlockFile
13030 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
13031 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 (SYSCALL)UnlockF
13032 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ile,
13033 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 0 },....#defin
13034 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 e osUnlockFile (
13035 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
13036 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 ANDLE,DWORD,DWOR
13037 44 2c 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 20 20 D,DWORD, \..
13038 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 DWORD))aSysc
13039 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 all[55].pCurrent
1303a 29 0d 0a 23 65 6c 73 65 0d 0a 20 20 7b 20 22 55 )..#else.. { "U
1303b 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 nlockFile",
1303c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
1303d 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
1303e 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0d 0 },.
1303f 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 21 .#endif....#if !
13040 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0d SQLITE_OS_WINCE.
13041 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 . { "UnlockFile
13042 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 Ex",
13043 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 (SYSCALL)UnlockF
13044 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 ileEx,
13045 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 66 69 6e 0 },....#defin
13046 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 e osUnlockFileEx
13047 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
13048 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 (HANDLE,DWORD,DW
13049 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0d 0a 20 20 ORD,DWORD, \..
1304a 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 LPOVERLAPP
1304b 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d ED))aSyscall[56]
1304c 2e 70 43 75 72 72 65 6e 74 29 0d 0a 23 65 6c 73 .pCurrent)..#els
1304d 65 0d 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 e.. { "UnlockFi
1304e 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 leEx",
1304f 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13051 20 20 20 20 30 20 7d 2c 0d 0a 23 65 6e 64 69 66 0 },..#endif
13052 0d 0a 0d 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 .... { "UnmapVi
13053 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 ewOfFile",
13054 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 (SYSCALL)Unma
13055 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 pViewOfFile,
13056 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 64 65 0 },....#de
13057 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 fine osUnmapView
13058 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 OfFile ((BOOL(WI
13059 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 NAPI*)(LPCVOID))
1305a 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 aSyscall[57].pCu
1305b 72 72 65 6e 74 29 0d 0a 0d 0a 20 20 7b 20 22 57 rrent).... { "W
1305c 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 ideCharToMultiBy
1305d 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c te", (SYSCAL
1305e 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 L)WideCharToMult
1305f 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0d iByte, 0 },.
13060 0a 0d 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 ...#define osWid
13061 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 eCharToMultiByte
13062 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 ((int(WINAPI*)(
13063 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 UINT,DWORD,LPCWS
13064 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 TR,int,LPSTR,int
13065 2c 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 43 , \.. LPC
13066 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 STR,LPBOOL))aSys
13067 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e call[58].pCurren
13068 74 29 0d 0a 0d 0a 20 20 7b 20 22 57 72 69 74 65 t).... { "Write
13069 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 File",
1306a 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 (SYSCALL)Wr
1306b 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 iteFile,
1306c 20 20 20 20 20 20 20 30 20 7d 2c 0d 0a 0d 0a 23 0 },....#
1306d 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69 define osWriteFi
1306e 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 le ((BOOL(WINAPI
1306f 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 *)(HANDLE,LPCVOI
13070 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c D,DWORD,LPDWORD,
13071 20 5c 0d 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 \.. LPOV
13072 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 ERLAPPED))aSysca
13073 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 ll[59].pCurrent)
13074 0d 0a 0d 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 ....}; /* End of
13075 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c the overrideabl
13076 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a e system calls *
13077 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 /..../*..** This
13078 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 is the xSetSyst
13079 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 emCall() method
1307a 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 of sqlite3_vfs f
1307b 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0d 0a 2a or all of the..*
1307c 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e * "win32" VFSes.
1307d 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f Return SQLITE_
1307e 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 OK opon successf
1307f 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 ully updating th
13080 65 0d 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c e..** system cal
13081 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 l pointer, or SQ
13082 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 LITE_NOTFOUND if
13083 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e there is no con
13084 66 69 67 75 72 61 62 6c 65 0d 0a 2a 2a 20 73 79 figurable..** sy
13085 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 stem call named
13086 7a 4e 61 6d 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 zName...*/..stat
13087 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 ic int winSetSys
13088 74 65 6d 43 61 6c 6c 28 0d 0a 20 20 73 71 6c 69 temCall(.. sqli
13089 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 te3_vfs *pNotUse
1308a 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 d, /* The
1308b 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e VFS pointer. N
1308c 6f 74 20 75 73 65 64 20 2a 2f 0d 0a 20 20 63 6f ot used */.. co
1308d 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
1308e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
1308f 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 ame of system ca
13090 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a ll to override *
13091 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 /.. sqlite3_sys
13092 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e call_ptr pNewFun
13093 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f c /* Pointer to
13094 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c new system call
13095 20 76 61 6c 75 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 value */..){..
13096 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b unsigned int i;
13097 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c .. int rc = SQL
13098 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0d 0a 0d ITE_NOTFOUND;...
13099 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
1309a 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0d 0a TER(pNotUsed);..
1309b 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 if( zName==0 )
1309c 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 {.. /* If no
1309d 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 zName is given,
1309e 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 restore all syst
1309f 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 em calls to thei
130a0 72 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 2a r default.. *
130a1 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 * settings and r
130a2 65 74 75 72 6e 20 4e 55 4c 4c 0d 0a 20 20 20 20 eturn NULL..
130a3 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c */.. rc = SQL
130a4 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 66 6f 72 ITE_OK;.. for
130a5 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 (i=0; i<sizeof(a
130a6 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 Syscall)/sizeof(
130a7 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b aSyscall[0]); i+
130a8 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 61 +){.. if( a
130a9 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 Syscall[i].pDefa
130aa 75 6c 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ult ){..
130ab 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 aSyscall[i].pCur
130ac 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b rent = aSyscall[
130ad 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0d 0a 20 20 i].pDefault;..
130ae 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 }.. }..
130af 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 }else{.. /* I
130b0 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 f zName is speci
130b1 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e fied, operate on
130b2 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 only the one sy
130b3 73 74 65 6d 20 63 61 6c 6c 0d 0a 20 20 20 20 2a stem call.. *
130b4 2a 20 73 70 65 63 69 66 69 65 64 2e 0d 0a 20 20 * specified...
130b5 20 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 69 3d */.. for(i=
130b6 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 0; i<sizeof(aSys
130b7 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 call)/sizeof(aSy
130b8 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b scall[0]); i++){
130b9 0d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 .. if( strc
130ba 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 mp(zName, aSysca
130bb 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 ll[i].zName)==0
130bc 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){.. if(
130bd 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 aSyscall[i].pDef
130be 61 75 6c 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 ault==0 ){..
130bf 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 aSyscall[i
130c0 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 ].pDefault = aSy
130c1 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e scall[i].pCurren
130c2 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 t;.. }..
130c3 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
130c4 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 TE_OK;..
130c5 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 if( pNewFunc==0
130c6 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 ) pNewFunc = aSy
130c7 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c scall[i].pDefaul
130c8 74 3b 0d 0a 20 20 20 20 20 20 20 20 61 53 79 73 t;.. aSys
130c9 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 call[i].pCurrent
130ca 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0d 0a 20 20 = pNewFunc;..
130cb 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
130cc 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 }.. }..
130cd 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d }.. return rc;.
130ce 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 .}..../*..** Ret
130cf 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 urn the value of
130d0 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 a system call.
130d1 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 Return NULL if
130d2 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0d 0a zName is not a..
130d3 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 ** recognized sy
130d4 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 stem call name.
130d5 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 NULL is also re
130d6 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 turned if the sy
130d7 73 74 65 6d 20 63 61 6c 6c 0d 0a 2a 2a 20 69 73 stem call..** is
130d8 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 currently undef
130d9 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ined...*/..stati
130da 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c c sqlite3_syscal
130db 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 l_ptr winGetSyst
130dc 65 6d 43 61 6c 6c 28 0d 0a 20 20 73 71 6c 69 74 emCall(.. sqlit
130dd 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 e3_vfs *pNotUsed
130de 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ,.. const char
130df 2a 7a 4e 61 6d 65 0d 0a 29 7b 0d 0a 20 20 75 6e *zName..){.. un
130e0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0d 0a 0d signed int i;...
130e1 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
130e2 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0d 0a TER(pNotUsed);..
130e3 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a for(i=0; i<siz
130e4 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 eof(aSyscall)/si
130e5 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d zeof(aSyscall[0]
130e6 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 ); i++){.. if
130e7 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 ( strcmp(zName,
130e8 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d aSyscall[i].zNam
130e9 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 e)==0 ) return a
130ea 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 Syscall[i].pCurr
130eb 65 6e 74 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ent;.. }.. ret
130ec 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d urn 0;..}..../*.
130ed 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
130ee 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 ame of the first
130ef 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 system call aft
130f0 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e er zName. If zN
130f1 61 6d 65 3d 3d 4e 55 4c 4c 0d 0a 2a 2a 20 74 68 ame==NULL..** th
130f2 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 en return the na
130f3 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 me of the first
130f4 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 system call. Re
130f5 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 turn NULL if zNa
130f6 6d 65 0d 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 me..** is the la
130f7 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f st system call o
130f8 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f r if zName is no
130f9 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 t the name of a
130fa 76 61 6c 69 64 0d 0a 2a 2a 20 73 79 73 74 65 6d valid..** system
130fb 20 63 61 6c 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 call...*/..stat
130fc 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 ic const char *w
130fd 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c inNextSystemCall
130fe 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c (sqlite3_vfs *p,
130ff 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
13100 6d 65 29 7b 0d 0a 20 20 69 6e 74 20 69 20 3d 20 me){.. int i =
13101 2d 31 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f -1;.... UNUSED_
13102 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0d 0a 20 PARAMETER(p);..
13103 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0d 0a 20 if( zName ){..
13104 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 for(i=0; i<Ar
13105 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c raySize(aSyscall
13106 29 2d 31 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 )-1; i++){..
13107 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 if( strcmp(zNa
13108 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e me, aSyscall[i].
13109 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 zName)==0 ) brea
1310a 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a k;.. }.. }..
1310b 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 for(i++; i<Arr
1310c 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 aySize(aSyscall)
1310d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 ; i++){.. if(
1310e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 aSyscall[i].pCu
1310f 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 rrent!=0 ) retur
13110 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e n aSyscall[i].zN
13111 61 6d 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ame;.. }.. ret
13112 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d urn 0;..}..../*.
13113 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
13114 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 (non-zero) if we
13115 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 are running und
13116 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c er WinNT, Win2K,
13117 20 57 69 6e 58 50 2c 0d 0a 2a 2a 20 6f 72 20 57 WinXP,..** or W
13118 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 inCE. Return fa
13119 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 lse (zero) for W
1311a 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 in95, Win98, or
1311b 57 69 6e 4d 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 48 WinME...**..** H
1311c 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 ere is an intere
1311d 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f sting observatio
1311e 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 n: Win95, Win98
1311f 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b , and WinME lack
13120 0d 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c ..** the LockFil
13121 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 eEx() API. But
13122 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 we can still sta
13123 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 tically link aga
13124 69 6e 73 74 20 74 68 61 74 0d 0a 2a 2a 20 41 50 inst that..** AP
13125 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 I as long as we
13126 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 don't call it wh
13127 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 en running Win95
13128 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 /98/ME. A call
13129 74 6f 0d 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 to..** this rout
1312a 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 ine is used to d
1312b 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 etermine if the
1312c 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 host is Win95/98
1312d 2f 4d 45 20 6f 72 0d 0a 2a 2a 20 57 69 6e 4e 54 /ME or..** WinNT
1312e 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 /2K/XP so that w
1312f 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 e will know whet
13130 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 her or not we ca
13131 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0d 0a 2a n safely call..*
13132 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 * the LockFileEx
13133 28 29 20 41 50 49 2e 0d 0a 2a 2f 0d 0a 23 69 66 () API...*/..#if
13134 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
13135 0d 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 ..# define isNT(
13136 29 20 20 28 31 29 0d 0a 23 65 6c 73 65 0d 0a 20 ) (1)..#else..
13137 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 static int isNT
13138 28 76 6f 69 64 29 7b 0d 0a 20 20 20 20 69 66 28 (void){.. if(
13139 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 sqlite3_os_type
1313a 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 4f 53 ==0 ){.. OS
1313b 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e VERSIONINFOA sIn
1313c 66 6f 3b 0d 0a 20 20 20 20 20 20 73 49 6e 66 6f fo;.. sInfo
1313d 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f .dwOSVersionInfo
1313e 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 Size = sizeof(sI
1313f 6e 66 6f 29 3b 0d 0a 20 20 20 20 20 20 6f 73 47 nfo);.. osG
13140 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 etVersionExA(&sI
13141 6e 66 6f 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c nfo);.. sql
13142 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 ite3_os_type = s
13143 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 Info.dwPlatformI
13144 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f d==VER_PLATFORM_
13145 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 WIN32_NT ? 2 : 1
13146 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 ;.. }.. re
13147 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f turn sqlite3_os_
13148 74 79 70 65 3d 3d 32 3b 0d 0a 20 20 7d 0d 0a 23 type==2;.. }..#
13149 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
1314a 4f 53 5f 57 49 4e 43 45 20 2a 2f 0d 0a 0d 0a 23 OS_WINCE */....#
1314b 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e ifdef SQLITE_WIN
1314c 33 32 5f 4d 41 4c 4c 4f 43 0d 0a 2f 2a 0d 0a 2a 32_MALLOC../*..*
1314d 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 * Allocate nByte
1314e 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f s of memory...*/
1314f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 ..static void *w
13150 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 inMemMalloc(int
13151 6e 42 79 74 65 73 29 7b 0d 0a 20 20 48 41 4e 44 nBytes){.. HAND
13152 4c 45 20 68 48 65 61 70 3b 0d 0a 20 20 76 6f 69 LE hHeap;.. voi
13153 64 20 2a 70 3b 0d 0a 0d 0a 20 20 77 69 6e 4d 65 d *p;.... winMe
13154 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0d mAssertMagic();.
13155 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 . hHeap = winMe
13156 6d 47 65 74 48 65 61 70 28 29 3b 0d 0a 20 20 61 mGetHeap();.. a
13157 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 ssert( hHeap!=0
13158 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 68 48 );.. assert( hH
13159 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e eap!=INVALID_HAN
1315a 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0d 0a 23 69 DLE_VALUE );..#i
1315b 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 fdef SQLITE_WIN3
1315c 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
1315d 45 0d 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 E.. assert ( os
1315e 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 HeapValidate(hHe
1315f 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
13160 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c _HEAP_FLAGS, NUL
13161 4c 29 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 L) );..#endif..
13162 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e assert( nBytes>
13163 3d 30 20 29 3b 0d 0a 20 20 70 20 3d 20 6f 73 48 =0 );.. p = osH
13164 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 eapAlloc(hHeap,
13165 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 SQLITE_WIN32_HEA
13166 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 P_FLAGS, (SIZE_T
13167 29 6e 42 79 74 65 73 29 3b 0d 0a 20 20 69 66 28 )nBytes);.. if(
13168 20 21 70 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 !p ){.. sqli
13169 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e te3_log(SQLITE_N
1316a 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f OMEM, "failed to
1316b 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 HeapAlloc %u by
1316c 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 tes (%d), heap=%
1316d 70 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 p",..
1316e 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 nBytes, osG
1316f 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 etLastError(), (
13170 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0d 0a 20 void*)hHeap);..
13171 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d }.. return p;.
13172 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 .}..../*..** Fre
13173 65 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a 73 e memory...*/..s
13174 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 tatic void winMe
13175 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 mFree(void *pPri
13176 6f 72 29 7b 0d 0a 20 20 48 41 4e 44 4c 45 20 68 or){.. HANDLE h
13177 48 65 61 70 3b 0d 0a 0d 0a 20 20 77 69 6e 4d 65 Heap;.... winMe
13178 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0d mAssertMagic();.
13179 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 . hHeap = winMe
1317a 6d 47 65 74 48 65 61 70 28 29 3b 0d 0a 20 20 61 mGetHeap();.. a
1317b 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 ssert( hHeap!=0
1317c 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 68 48 );.. assert( hH
1317d 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e eap!=INVALID_HAN
1317e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0d 0a 23 69 DLE_VALUE );..#i
1317f 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 fdef SQLITE_WIN3
13180 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
13181 45 0d 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 E.. assert ( os
13182 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 HeapValidate(hHe
13183 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
13184 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 _HEAP_FLAGS, pPr
13185 69 6f 72 29 20 29 3b 0d 0a 23 65 6e 64 69 66 0d ior) );..#endif.
13186 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 . if( !pPrior )
13187 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 return; /* Pass
13188 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 ing NULL to Heap
13189 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 Free is undefine
1318a 64 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 21 6f 73 d. */.. if( !os
1318b 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 HeapFree(hHeap,
1318c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 SQLITE_WIN32_HEA
1318d 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 P_FLAGS, pPrior)
1318e 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 ){.. sqlite3
1318f 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 _log(SQLITE_NOME
13190 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 M, "failed to He
13191 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 apFree block %p
13192 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0d (%d), heap=%p",.
13193 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
13194 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 pPrior, osGetLa
13195 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 stError(), (void
13196 2a 29 68 48 65 61 70 29 3b 0d 0a 20 20 7d 0d 0a *)hHeap);.. }..
13197 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e }..../*..** Chan
13198 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 ge the size of a
13199 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 n existing memor
1319a 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d 0a 2a 2f y allocation..*/
1319b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 ..static void *w
1319c 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 inMemRealloc(voi
1319d 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e d *pPrior, int n
1319e 42 79 74 65 73 29 7b 0d 0a 20 20 48 41 4e 44 4c Bytes){.. HANDL
1319f 45 20 68 48 65 61 70 3b 0d 0a 20 20 76 6f 69 64 E hHeap;.. void
131a0 20 2a 70 3b 0d 0a 0d 0a 20 20 77 69 6e 4d 65 6d *p;.... winMem
131a1 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0d 0a AssertMagic();..
131a2 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d hHeap = winMem
131a3 47 65 74 48 65 61 70 28 29 3b 0d 0a 20 20 61 73 GetHeap();.. as
131a4 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 sert( hHeap!=0 )
131a5 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 ;.. assert( hHe
131a6 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 ap!=INVALID_HAND
131a7 4c 45 5f 56 41 4c 55 45 20 29 3b 0d 0a 23 69 66 LE_VALUE );..#if
131a8 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 def SQLITE_WIN32
131a9 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 _MALLOC_VALIDATE
131aa 0d 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 .. assert ( osH
131ab 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 eapValidate(hHea
131ac 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
131ad 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 HEAP_FLAGS, pPri
131ae 6f 72 29 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a or) );..#endif..
131af 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 assert( nBytes
131b0 3e 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 21 70 >=0 );.. if( !p
131b1 50 72 69 6f 72 20 29 7b 0d 0a 20 20 20 20 70 20 Prior ){.. p
131b2 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 = osHeapAlloc(hH
131b3 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 eap, SQLITE_WIN3
131b4 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 2_HEAP_FLAGS, (S
131b5 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0d 0a IZE_T)nBytes);..
131b6 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 20 }else{.. p
131b7 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 = osHeapReAlloc(
131b8 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 hHeap, SQLITE_WI
131b9 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 N32_HEAP_FLAGS,
131ba 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 pPrior, (SIZE_T)
131bb 6e 42 79 74 65 73 29 3b 0d 0a 20 20 7d 0d 0a 20 nBytes);.. }..
131bc 20 69 66 28 20 21 70 20 29 7b 0d 0a 20 20 20 20 if( !p ){..
131bd 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 sqlite3_log(SQLI
131be 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 TE_NOMEM, "faile
131bf 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 d to %s %u bytes
131c0 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c (%d), heap=%p",
131c1 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
131c2 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 pPrior ? "Heap
131c3 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 ReAlloc" : "Heap
131c4 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 Alloc", nBytes,
131c5 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
131c6 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
131c7 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 (void*)hHeap)
131c8 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
131c9 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a p;..}..../*..**
131ca 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 Return the size
131cb 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 of an outstandi
131cc 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 ng allocation, i
131cd 6e 20 62 79 74 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 n bytes...*/..st
131ce 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 atic int winMemS
131cf 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0d 0a 20 ize(void *p){..
131d0 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0d 0a HANDLE hHeap;..
131d1 20 20 53 49 5a 45 5f 54 20 6e 3b 0d 0a 0d 0a 20 SIZE_T n;....
131d2 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 winMemAssertMag
131d3 69 63 28 29 3b 0d 0a 20 20 68 48 65 61 70 20 3d ic();.. hHeap =
131d4 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 winMemGetHeap()
131d5 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 ;.. assert( hHe
131d6 61 70 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 ap!=0 );.. asse
131d7 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c rt( hHeap!=INVAL
131d8 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 ID_HANDLE_VALUE
131d9 29 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 );..#ifdef SQLIT
131da 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 E_WIN32_MALLOC_V
131db 41 4c 49 44 41 54 45 0d 0a 20 20 61 73 73 65 72 ALIDATE.. asser
131dc 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 t ( osHeapValida
131dd 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 te(hHeap, SQLITE
131de 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 _WIN32_HEAP_FLAG
131df 53 2c 20 4e 55 4c 4c 29 20 29 3b 0d 0a 23 65 6e S, NULL) );..#en
131e0 64 69 66 0d 0a 20 20 69 66 28 20 21 70 20 29 20 dif.. if( !p )
131e1 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 6e 20 3d return 0;.. n =
131e2 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 osHeapSize(hHea
131e3 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
131e4 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0d HEAP_FLAGS, p);.
131e5 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f . if( n==(SIZE_
131e6 54 29 2d 31 20 29 7b 0d 0a 20 20 20 20 73 71 6c T)-1 ){.. sql
131e7 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f ite3_log(SQLITE_
131e8 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 NOMEM, "failed t
131e9 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b o HeapSize block
131ea 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 %p (%d), heap=%
131eb 70 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 p",..
131ec 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 p, osGetLas
131ed 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a tError(), (void*
131ee 29 68 48 65 61 70 29 3b 0d 0a 20 20 20 20 72 65 )hHeap);.. re
131ef 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 turn 0;.. }..
131f0 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0d 0a return (int)n;..
131f1 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 6f 75 6e }..../*..** Roun
131f2 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 d up a request s
131f3 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 ize to the next
131f4 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e valid allocation
131f5 20 73 69 7a 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 size...*/..stat
131f6 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 ic int winMemRou
131f7 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0d 0a 20 20 ndup(int n){..
131f8 72 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a return n;..}....
131f9 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a /*..** Initializ
131fa 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0d 0a e this module...
131fb 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 */..static int w
131fc 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a inMemInit(void *
131fd 70 41 70 70 44 61 74 61 29 7b 0d 0a 20 20 77 69 pAppData){.. wi
131fe 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 nMemData *pWinMe
131ff 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 mData = (winMemD
13200 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0d ata *)pAppData;.
13201 0a 0d 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 ... if( !pWinMe
13202 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 mData ) return S
13203 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 QLITE_ERROR;..
13204 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
13205 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d ata->magic==WINM
13206 45 4d 5f 4d 41 47 49 43 20 29 3b 0d 0a 20 20 69 EM_MAGIC );.. i
13207 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d f( !pWinMemData-
13208 3e 68 48 65 61 70 20 29 7b 0d 0a 20 20 20 20 70 >hHeap ){.. p
13209 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 WinMemData->hHea
1320a 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 p = osHeapCreate
1320b 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 (SQLITE_WIN32_HE
1320c 41 50 5f 46 4c 41 47 53 2c 0d 0a 20 20 20 20 20 AP_FLAGS,..
1320d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1320e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1320f 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 SQLITE_WIN32_HE
13210 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0d 0a 20 AP_INIT_SIZE,..
13211 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13212 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13213 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 SQLITE_WIN3
13214 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 2_HEAP_MAX_SIZE)
13215 3b 0d 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e ;.. if( !pWin
13216 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 MemData->hHeap )
13217 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {.. sqlite3
13218 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 _log(SQLITE_NOME
13219 4d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 66 M,.. "f
1321a 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 ailed to HeapCre
1321b 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d ate (%d), flags=
1321c 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c %u, initSize=%u,
1321d 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0d 0a 20 maxSize=%u",..
1321e 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 osGetLa
1321f 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 stError(), SQLIT
13220 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 E_WIN32_HEAP_FLA
13221 47 53 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 GS,.. S
13222 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
13223 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 _INIT_SIZE, SQLI
13224 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 TE_WIN32_HEAP_MA
13225 58 5f 53 49 5a 45 29 3b 0d 0a 20 20 20 20 20 20 X_SIZE);..
13226 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
13227 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 MEM;.. }..
13228 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f pWinMemData->bO
13229 77 6e 65 64 20 3d 20 54 52 55 45 3b 0d 0a 20 20 wned = TRUE;..
1322a 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 }.. assert( pWi
1322b 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 nMemData->hHeap!
1322c 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 =0 );.. assert(
1322d 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 pWinMemData->hH
1322e 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e eap!=INVALID_HAN
1322f 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0d 0a 23 69 DLE_VALUE );..#i
13230 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 fdef SQLITE_WIN3
13231 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
13232 45 0d 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 E.. assert( osH
13233 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e eapValidate(pWin
13234 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 MemData->hHeap,
13235 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 SQLITE_WIN32_HEA
13236 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 P_FLAGS, NULL) )
13237 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 ;..#endif.. ret
13238 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
13239 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 69 6e }..../*..** Dein
1323a 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f itialize this mo
1323b 64 75 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 dule...*/..stati
1323c 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 c void winMemShu
1323d 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 tdown(void *pApp
1323e 44 61 74 61 29 7b 0d 0a 20 20 77 69 6e 4d 65 6d Data){.. winMem
1323f 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 Data *pWinMemDat
13240 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 a = (winMemData
13241 2a 29 70 41 70 70 44 61 74 61 3b 0d 0a 0d 0a 20 *)pAppData;....
13242 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 if( !pWinMemDat
13243 61 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 69 a ) return;.. i
13244 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e f( pWinMemData->
13245 68 48 65 61 70 20 29 7b 0d 0a 20 20 20 20 61 73 hHeap ){.. as
13246 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 sert( pWinMemDat
13247 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 a->hHeap!=INVALI
13248 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 D_HANDLE_VALUE )
13249 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ;..#ifdef SQLITE
1324a 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 _WIN32_MALLOC_VA
1324b 4c 49 44 41 54 45 0d 0a 20 20 20 20 61 73 73 65 LIDATE.. asse
1324c 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 rt( osHeapValida
1324d 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e te(pWinMemData->
1324e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 hHeap, SQLITE_WI
1324f 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 N32_HEAP_FLAGS,
13250 4e 55 4c 4c 29 20 29 3b 0d 0a 23 65 6e 64 69 66 NULL) );..#endif
13251 0d 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 .. if( pWinMe
13252 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b mData->bOwned ){
13253 0d 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 .. if( !osH
13254 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d eapDestroy(pWinM
13255 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 emData->hHeap) )
13256 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 {.. sqlit
13257 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f e3_log(SQLITE_NO
13258 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 MEM, "failed to
13259 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29 HeapDestroy (%d)
1325a 2c 20 68 65 61 70 3d 25 70 22 2c 0d 0a 20 20 20 , heap=%p",..
1325b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1325c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
1325d 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 ), (void*)pWinMe
1325e 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0d 0a mData->hHeap);..
1325f 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 }.. p
13260 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e WinMemData->bOwn
13261 65 64 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 20 ed = FALSE;..
13262 20 7d 0d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 }.. pWinMemD
13263 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c ata->hHeap = NUL
13264 4c 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a L;.. }..}..../*
13265 0d 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 ..** Populate th
13266 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f e low-level memo
13267 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 ry allocation fu
13268 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 nction pointers
13269 69 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c in..** sqlite3Gl
1326a 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 obalConfig.m wit
1326b 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 h pointers to th
1326c 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 e routines in th
1326d 69 73 20 66 69 6c 65 2e 20 54 68 65 0d 0a 2a 2a is file. The..**
1326e 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 arguments speci
1326f 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 fy the block of
13270 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 memory to manage
13271 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 ...**..** This r
13272 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 outine is only c
13273 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 alled by sqlite3
13274 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 _config(), and t
13275 68 65 72 65 66 6f 72 65 0d 0a 2a 2a 20 69 73 20 herefore..** is
13276 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 not required to
13277 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69 be threadsafe (i
13278 74 20 69 73 20 6e 6f 74 29 2e 0d 0a 2a 2f 0d 0a t is not)...*/..
13279 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 SQLITE_PRIVATE c
1327a 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d onst sqlite3_mem
1327b 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 _methods *sqlite
1327c 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 3MemGetWin32(voi
1327d 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 63 6f d){.. static co
1327e 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f nst sqlite3_mem_
1327f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 methods winMemMe
13280 74 68 6f 64 73 20 3d 20 7b 0d 0a 20 20 20 20 77 thods = {.. w
13281 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0d 0a 20 20 inMemMalloc,..
13282 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0d 0a 20 winMemFree,..
13283 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 winMemRealloc
13284 2c 0d 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a ,.. winMemSiz
13285 65 2c 0d 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f e,.. winMemRo
13286 75 6e 64 75 70 2c 0d 0a 20 20 20 20 77 69 6e 4d undup,.. winM
13287 65 6d 49 6e 69 74 2c 0d 0a 20 20 20 20 77 69 6e emInit,.. win
13288 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0d 0a 20 20 MemShutdown,..
13289 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0d &win_mem_data.
1328a 0a 20 20 7d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 . };.. return
1328b 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0d &winMemMethods;.
1328c 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 .}....SQLITE_PRI
1328d 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
1328e 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 3MemSetDefault(v
1328f 6f 69 64 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 oid){.. sqlite3
13290 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 _config(SQLITE_C
13291 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 ONFIG_MALLOC, sq
13292 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 lite3MemGetWin32
13293 28 29 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 ());..}..#endif
13294 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f /* SQLITE_WIN32_
13295 4d 41 4c 4c 4f 43 20 2a 2f 0d 0a 0d 0a 2f 2a 0d MALLOC */..../*.
13296 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 .** Convert a UT
13297 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 F-8 string to Mi
13298 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 crosoft Unicode
13299 28 55 54 46 2d 31 36 3f 29 2e 20 0d 0a 2a 2a 0d (UTF-16?). ..**.
1329a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c .** Space to hol
1329b 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 d the returned s
1329c 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 tring is obtaine
1329d 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0d 0a d from malloc...
1329e 2a 2f 0d 0a 73 74 61 74 69 63 20 4c 50 57 53 54 */..static LPWST
1329f 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 R utf8ToUnicode(
132a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
132a1 65 6e 61 6d 65 29 7b 0d 0a 20 20 69 6e 74 20 6e ename){.. int n
132a2 43 68 61 72 3b 0d 0a 20 20 4c 50 57 53 54 52 20 Char;.. LPWSTR
132a3 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0d 0a zWideFilename;..
132a4 0d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 .. nChar = osMu
132a5 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 ltiByteToWideCha
132a6 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 r(CP_UTF8, 0, zF
132a7 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c ilename, -1, NUL
132a8 4c 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 6e 43 L, 0);.. if( nC
132a9 68 61 72 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 har==0 ){.. r
132aa 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
132ab 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d zWideFilename =
132ac 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
132ad 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 nChar*sizeof(zW
132ae 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 ideFilename[0])
132af 29 3b 0d 0a 20 20 69 66 28 20 7a 57 69 64 65 46 );.. if( zWideF
132b0 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 ilename==0 ){..
132b1 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 return 0;..
132b2 7d 0d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d }.. nChar = osM
132b3 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 ultiByteToWideCh
132b4 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a ar(CP_UTF8, 0, z
132b5 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 Filename, -1, zW
132b6 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0d 0a 20 20 ideFilename,..
132b7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
132b8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 nC
132b9 68 61 72 29 3b 0d 0a 20 20 69 66 28 20 6e 43 68 har);.. if( nCh
132ba 61 72 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71 ar==0 ){.. sq
132bb 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 lite3_free(zWide
132bc 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 Filename);..
132bd 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 zWideFilename =
132be 30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 0;.. }.. retur
132bf 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b n zWideFilename;
132c0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f ..}..../*..** Co
132c1 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 nvert Microsoft
132c2 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 Unicode to UTF-8
132c3 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 . Space to hold
132c4 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 the returned st
132c5 72 69 6e 67 20 69 73 0d 0a 2a 2a 20 6f 62 74 61 ring is..** obta
132c6 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
132c7 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a 2f 0d 3_malloc()...*/.
132c8 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e .static char *un
132c9 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 icodeToUtf8(LPCW
132ca 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d STR zWideFilenam
132cb 65 29 7b 0d 0a 20 20 69 6e 74 20 6e 42 79 74 65 e){.. int nByte
132cc 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 ;.. char *zFile
132cd 6e 61 6d 65 3b 0d 0a 0d 0a 20 20 6e 42 79 74 65 name;.... nByte
132ce 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d = osWideCharToM
132cf 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 ultiByte(CP_UTF8
132d0 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 , 0, zWideFilena
132d1 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c me, -1, 0, 0, 0,
132d2 20 30 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 0);.. if( nByt
132d3 65 20 3d 3d 20 30 20 29 7b 0d 0a 20 20 20 20 72 e == 0 ){.. r
132d4 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
132d5 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c zFilename = sql
132d6 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 ite3_malloc( nBy
132d7 74 65 20 29 3b 0d 0a 20 20 69 66 28 20 7a 46 69 te );.. if( zFi
132d8 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 20 lename==0 ){..
132d9 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d return 0;.. }
132da 0d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 .. nByte = osWi
132db 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 deCharToMultiByt
132dc 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 e(CP_UTF8, 0, zW
132dd 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c ideFilename, -1,
132de 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 zFilename, nByt
132df 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 e,..
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
132e1 20 20 20 20 30 2c 20 30 29 3b 0d 0a 20 20 69 66 0, 0);.. if
132e2 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0d ( nByte == 0 ){.
132e3 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
132e4 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 e(zFilename);..
132e5 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 zFilename = 0
132e6 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e ;.. }.. return
132e7 20 7a 46 69 6c 65 6e 61 6d 65 3b 0d 0a 7d 0d 0a zFilename;..}..
132e8 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 ../*..** Convert
132e9 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 an ANSI string
132ea 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 to Microsoft Uni
132eb 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 code, based on t
132ec 68 65 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 he..** current c
132ed 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 odepage settings
132ee 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0d for file apis..
132ef 0a 2a 2a 20 0d 0a 2a 2a 20 53 70 61 63 65 20 74 .** ..** Space t
132f0 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 o hold the retur
132f1 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 ned string is ob
132f2 74 61 69 6e 65 64 0d 0a 2a 2a 20 66 72 6f 6d 20 tained..** from
132f3 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0d sqlite3_malloc..
132f4 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 4c 50 57 53 .*/..static LPWS
132f5 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 TR mbcsToUnicode
132f6 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 (const char *zFi
132f7 6c 65 6e 61 6d 65 29 7b 0d 0a 20 20 69 6e 74 20 lename){.. int
132f8 6e 42 79 74 65 3b 0d 0a 20 20 4c 50 57 53 54 52 nByte;.. LPWSTR
132f9 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0d zMbcsFilename;.
132fa 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 . int codepage
132fb 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 = osAreFileApisA
132fc 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a NSI() ? CP_ACP :
132fd 20 43 50 5f 4f 45 4d 43 50 3b 0d 0a 0d 0a 20 20 CP_OEMCP;....
132fe 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 nByte = osMultiB
132ff 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f yteToWideChar(co
13300 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 depage, 0, zFile
13301 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0d name, -1, NULL,.
13302 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
13303 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13304 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 0)*sizeof(WCHAR
13305 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 65 3d );.. if( nByte=
13306 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 =0 ){.. retur
13307 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 4d 62 n 0;.. }.. zMb
13308 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c csFilename = sql
13309 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 ite3_malloc( nBy
1330a 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 te*sizeof(zMbcsF
1330b 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0d 0a ilename[0]) );..
1330c 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e if( zMbcsFilen
1330d 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 ame==0 ){.. r
1330e 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
1330f 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 nByte = osMulti
13310 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 ByteToWideChar(c
13311 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c odepage, 0, zFil
13312 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 ename, -1, zMbcs
13313 46 69 6c 65 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 Filename,..
13314 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13315 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 nByte
13316 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 65 3d );.. if( nByte=
13317 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 =0 ){.. sqlit
13318 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c e3_free(zMbcsFil
13319 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 7a 4d 62 ename);.. zMb
1331a 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0d csFilename = 0;.
1331b 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 7a . }.. return z
1331c 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0d 0a 7d MbcsFilename;..}
1331d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 ..../*..** Conve
1331e 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 rt Microsoft Uni
1331f 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 code to multi-by
13320 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 te character str
13321 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 ing, based on th
13322 65 0d 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 e..** user's ANS
13323 49 20 63 6f 64 65 70 61 67 65 2e 0d 0a 2a 2a 0d I codepage...**.
13324 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c .** Space to hol
13325 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 d the returned s
13326 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 tring is obtaine
13327 64 20 66 72 6f 6d 0d 0a 2a 2a 20 73 71 6c 69 74 d from..** sqlit
13328 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a 2f e3_malloc()...*/
13329 0d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 ..static char *u
1332a 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 nicodeToMbcs(LPC
1332b 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 WSTR zWideFilena
1332c 6d 65 29 7b 0d 0a 20 20 69 6e 74 20 6e 42 79 74 me){.. int nByt
1332d 65 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c e;.. char *zFil
1332e 65 6e 61 6d 65 3b 0d 0a 20 20 69 6e 74 20 63 6f ename;.. int co
1332f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 depage = osAreFi
13330 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 leApisANSI() ? C
13331 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 P_ACP : CP_OEMCP
13332 3b 0d 0a 0d 0a 20 20 6e 42 79 74 65 20 3d 20 6f ;.... nByte = o
13333 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 sWideCharToMulti
13334 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 Byte(codepage, 0
13335 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c , zWideFilename,
13336 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 -1, 0, 0, 0, 0)
13337 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d ;.. if( nByte =
13338 3d 20 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 = 0 ){.. retu
13339 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 46 rn 0;.. }.. zF
1333a 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 ilename = sqlite
1333b 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 3_malloc( nByte
1333c 29 3b 0d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e );.. if( zFilen
1333d 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 ame==0 ){.. r
1333e 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 eturn 0;.. }..
1333f 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 nByte = osWideC
13340 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 harToMultiByte(c
13341 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 odepage, 0, zWid
13342 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a eFilename, -1, z
13343 46 69 6c 65 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 Filename,..
13344 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13345 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 nByte
13346 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 , 0, 0);.. if(
13347 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0d 0a 20 nByte == 0 ){..
13348 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
13349 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 zFilename);..
1334a 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0d zFilename = 0;.
1334b 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 7a . }.. return z
1334c 46 69 6c 65 6e 61 6d 65 3b 0d 0a 7d 0d 0a 0d 0a Filename;..}....
1334d 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d /*..** Convert m
1334e 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 ultibyte charact
1334f 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 er string to UTF
13350 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f -8. Space to ho
13351 6c 64 20 74 68 65 0d 0a 2a 2a 20 72 65 74 75 72 ld the..** retur
13352 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 ned string is ob
13353 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 tained from sqli
13354 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a te3_malloc()...*
13355 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 68 /..SQLITE_API ch
13356 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 ar *sqlite3_win3
13357 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 2_mbcs_to_utf8(c
13358 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
13359 6e 61 6d 65 29 7b 0d 0a 20 20 63 68 61 72 20 2a name){.. char *
1335a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0d 0a zFilenameUtf8;..
1335b 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 LPWSTR zTmpWid
1335c 65 3b 0d 0a 0d 0a 20 20 7a 54 6d 70 57 69 64 65 e;.... zTmpWide
1335d 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 = mbcsToUnicode
1335e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 (zFilename);..
1335f 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 if( zTmpWide==0
13360 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){.. return 0
13361 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 46 69 6c 65 6e ;.. }.. zFilen
13362 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 ameUtf8 = unicod
13363 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 eToUtf8(zTmpWide
13364 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 );.. sqlite3_fr
13365 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0d 0a 20 ee(zTmpWide);..
13366 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d return zFilenam
13367 65 55 74 66 38 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d eUtf8;..}..../*.
13368 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d .** Convert UTF-
13369 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 8 to multibyte c
1336a 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e haracter string.
1336b 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 Space to hold
1336c 74 68 65 20 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 the ..** returne
1336d 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 d string is obta
1336e 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
1336f 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a 2f 0d 3_malloc()...*/.
13370 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 68 61 72 .SQLITE_API char
13371 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f *sqlite3_win32_
13372 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e utf8_to_mbcs(con
13373 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
13374 6d 65 29 7b 0d 0a 20 20 63 68 61 72 20 2a 7a 46 me){.. char *zF
13375 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0d 0a 20 20 ilenameMbcs;..
13376 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b LPWSTR zTmpWide;
13377 0d 0a 0d 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d .... zTmpWide =
13378 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a utf8ToUnicode(z
13379 46 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 69 66 Filename);.. if
1337a 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b ( zTmpWide==0 ){
1337b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d .. return 0;.
1337c 0a 20 20 7d 0d 0a 20 20 7a 46 69 6c 65 6e 61 6d . }.. zFilenam
1337d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 eMbcs = unicodeT
1337e 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b oMbcs(zTmpWide);
1337f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
13380 28 7a 54 6d 70 57 69 64 65 29 3b 0d 0a 20 20 72 (zTmpWide);.. r
13381 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d eturn zFilenameM
13382 62 63 73 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d bcs;..}....../*.
13383 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 .** The return v
13384 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 alue of getLastE
13385 72 72 6f 72 4d 73 67 0d 0a 2a 2a 20 69 73 20 7a rrorMsg..** is z
13386 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 ero if the error
13387 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e message fits in
13388 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 the buffer, or
13389 6e 6f 6e 2d 7a 65 72 6f 0d 0a 2a 2a 20 6f 74 68 non-zero..** oth
1338a 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d erwise (if the m
1338b 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 essage was trunc
1338c 61 74 65 64 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ated)...*/..stat
1338d 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 ic int getLastEr
1338e 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 rorMsg(DWORD las
1338f 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 tErrno, int nBuf
13390 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0d 0a , char *zBuf){..
13391 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 /* FormatMessa
13392 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 ge returns 0 on
13393 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 failure. Otherw
13394 69 73 65 20 69 74 0d 0a 20 20 2a 2a 20 72 65 74 ise it.. ** ret
13395 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
13396 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65 of TCHARs writte
13397 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0d n to the output.
13398 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 . ** buffer, ex
13399 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d cluding the term
1339a 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 inating null cha
1339b 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 44 57 4f 52 r... */.. DWOR
1339c 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0d 0a 20 20 D dwLen = 0;..
1339d 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0d char *zOut = 0;.
1339e 0a 0d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 ... if( isNT()
1339f 29 7b 0d 0a 20 20 20 20 4c 50 57 53 54 52 20 7a ){.. LPWSTR z
133a0 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b TempWide = NULL;
133a1 0d 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 .. dwLen = os
133a2 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 FormatMessageW(F
133a3 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c ORMAT_MESSAGE_AL
133a4 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0d LOCATE_BUFFER |.
133a5 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
133a6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f FO
133a7 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f RMAT_MESSAGE_FRO
133a8 4d 5f 53 59 53 54 45 4d 20 7c 0d 0a 20 20 20 20 M_SYSTEM |..
133a9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133aa 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f FORMAT_
133ab 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 MESSAGE_IGNORE_I
133ac 4e 53 45 52 54 53 2c 0d 0a 20 20 20 20 20 20 20 NSERTS,..
133ad 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133ae 20 20 20 20 20 20 4e 55 4c 4c 2c 0d 0a 20 20 20 NULL,..
133af 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133b0 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 lastEr
133b1 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 rno,..
133b2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133b3 20 20 20 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 0,..
133b4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133b5 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 (LPWSTR) &zT
133b6 65 6d 70 57 69 64 65 2c 0d 0a 20 20 20 20 20 20 empWide,..
133b7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133b8 20 20 20 20 20 20 20 30 2c 0d 0a 20 20 20 20 20 0,..
133b9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133ba 20 20 20 20 20 20 20 20 30 29 3b 0d 0a 20 20 20 0);..
133bb 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 if( dwLen > 0 )
133bc 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f {.. /* allo
133bd 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e cate a buffer an
133be 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 d convert to UTF
133bf 38 20 2a 2f 0d 0a 20 20 20 20 20 20 73 71 6c 69 8 */.. sqli
133c0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 te3BeginBenignMa
133c1 6c 6c 6f 63 28 29 3b 0d 0a 20 20 20 20 20 20 7a lloc();.. z
133c2 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 Out = unicodeToU
133c3 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0d tf8(zTempWide);.
133c4 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e . sqlite3En
133c5 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b dBenignMalloc();
133c6 0d 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 .. /* free
133c7 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 the system buffe
133c8 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 r allocated by F
133c9 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0d ormatMessage */.
133ca 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 . osLocalFr
133cb 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0d 0a ee(zTempWide);..
133cc 20 20 20 20 7d 0d 0a 2f 2a 20 69 73 4e 54 28 29 }../* isNT()
133cd 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f is 1 if SQLITE_
133ce 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 OS_WINCE==1, so
133cf 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 this else is nev
133d0 65 72 20 65 78 65 63 75 74 65 64 2e 20 0d 0a 2a er executed. ..*
133d1 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 * Since the ANSI
133d2 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 version of thes
133d3 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f e Windows API do
133d4 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 not exist for W
133d5 49 4e 43 45 2c 0d 0a 2a 2a 20 69 74 27 73 20 69 INCE,..** it's i
133d6 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 mportant to not
133d7 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 reference them f
133d8 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e or WINCE builds.
133d9 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 ..*/..#if SQLITE
133da 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 20 _OS_WINCE==0..
133db 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 63 68 61 72 }else{.. char
133dc 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0d *zTemp = NULL;.
133dd 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 . dwLen = osF
133de 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f ormatMessageA(FO
133df 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c RMAT_MESSAGE_ALL
133e0 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0d 0a OCATE_BUFFER |..
133e1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133e2 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 FOR
133e3 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d MAT_MESSAGE_FROM
133e4 5f 53 59 53 54 45 4d 20 7c 0d 0a 20 20 20 20 20 _SYSTEM |..
133e5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133e6 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d FORMAT_M
133e7 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e ESSAGE_IGNORE_IN
133e8 53 45 52 54 53 2c 0d 0a 20 20 20 20 20 20 20 20 SERTS,..
133e9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133ea 20 20 20 20 20 4e 55 4c 4c 2c 0d 0a 20 20 20 20 NULL,..
133eb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133ec 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 lastErr
133ed 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 no,..
133ee 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133ef 20 20 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 0,..
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133f1 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d (LPSTR) &zTem
133f2 70 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 p,..
133f3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133f4 20 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 0,..
133f5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
133f6 20 20 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 64 0);.. if( d
133f7 77 4c 65 6e 20 3e 20 30 20 29 7b 0d 0a 20 20 20 wLen > 0 ){..
133f8 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 /* allocate a
133f9 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 buffer and conv
133fa 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0d 0a ert to UTF8 */..
133fb 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 sqlite3Beg
133fc 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 inBenignMalloc()
133fd 3b 0d 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 ;.. zOut =
133fe 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 sqlite3_win32_mb
133ff 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 cs_to_utf8(zTemp
13400 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 );.. sqlite
13401 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 3EndBenignMalloc
13402 28 29 3b 0d 0a 20 20 20 20 20 20 2f 2a 20 66 72 ();.. /* fr
13403 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 ee the system bu
13404 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 ffer allocated b
13405 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 y FormatMessage
13406 2a 2f 0d 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 */.. osLoca
13407 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0d 0a 20 lFree(zTemp);..
13408 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 }..#endif..
13409 7d 0d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 }.. if( 0 == dw
1340a 4c 65 6e 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 Len ){.. sqli
1340b 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 te3_snprintf(nBu
1340c 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f f, zBuf, "OsErro
1340d 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c 61 r 0x%x (%u)", la
1340e 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 stErrno, lastErr
1340f 6e 6f 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a no);.. }else{..
13410 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 /* copy a ma
13411 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 ximum of nBuf ch
13412 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 ars to output bu
13413 66 66 65 72 20 2a 2f 0d 0a 20 20 20 20 73 71 6c ffer */.. sql
13414 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 ite3_snprintf(nB
13415 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 uf, zBuf, "%s",
13416 7a 4f 75 74 29 3b 0d 0a 20 20 20 20 2f 2a 20 66 zOut);.. /* f
13417 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66 ree the UTF8 buf
13418 66 65 72 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 fer */.. sqli
13419 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0d te3_free(zOut);.
1341a 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 30 . }.. return 0
1341b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 0d 0a ;..}..../*..**..
1341c 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
1341d 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 - winLogErrorAt
1341e 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 Line() - is only
1341f 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 ever called via
13420 20 74 68 65 20 6d 61 63 72 6f 0d 0a 2a 2a 20 77 the macro..** w
13421 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0d 0a 2a inLogError()...*
13422 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 *..** This routi
13423 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 ne is invoked af
13424 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 ter an error occ
13425 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e urs in an OS fun
13426 63 74 69 6f 6e 2e 0d 0a 2a 2a 20 49 74 20 6c 6f ction...** It lo
13427 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 gs a message usi
13428 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 ng sqlite3_log()
13429 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
1342a 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 current value of
1342b 0d 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 ..** error code
1342c 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 and, if possible
1342d 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 , the human-read
1342e 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 able equivalent
1342f 66 72 6f 6d 20 0d 0a 2a 2a 20 46 6f 72 6d 61 74 from ..** Format
13430 4d 65 73 73 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a Message...**..**
13431 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d The first argum
13432 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 ent passed to th
13433 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 e macro should b
13434 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 e the error code
13435 20 74 68 61 74 0d 0a 2a 2a 20 77 69 6c 6c 20 62 that..** will b
13436 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 e returned to SQ
13437 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 Lite (e.g. SQLIT
13438 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 E_IOERR_DELETE,
13439 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 SQLITE_CANTOPEN)
1343a 2e 20 0d 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 . ..** The two s
1343b 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 ubsequent argume
1343c 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 nts should be th
1343d 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 e name of the OS
1343e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0d 0a function that..
1343f 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 ** failed and th
13440 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 e the associated
13441 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 file-system pat
13442 68 2c 20 69 66 20 61 6e 79 2e 0d 0a 2a 2f 0d 0a h, if any...*/..
13443 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 #define winLogEr
13444 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 ror(a,b,c,d) w
13445 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 inLogErrorAtLine
13446 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f (a,b,c,d,__LINE_
13447 5f 29 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 _)..static int w
13448 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 inLogErrorAtLine
13449 28 0d 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 (.. int errcode
1344a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1344b 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 /* SQLite e
1344c 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 rror code */..
1344d 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c DWORD lastErrno,
1344e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1344f 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 /* Win32 last er
13450 72 6f 72 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 ror */.. const
13451 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 char *zFunc,
13452 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
13453 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e e of OS function
13454 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0d that failed */.
13455 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
13456 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 Path,
13457 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 /* File path
13458 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
13459 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 error */.. int
1345a 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 iLine
1345b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1345c 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 ource line numbe
1345d 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 r where error oc
1345e 63 75 72 72 65 64 20 2a 2f 0d 0a 29 7b 0d 0a 20 curred */..){..
1345f 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b char zMsg[500];
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13461 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 /* Human readab
13462 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f le error text */
13463 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 .. int i;
13464 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13465 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e /* Loop coun
13466 74 65 72 20 2a 2f 0d 0a 0d 0a 20 20 7a 4d 73 67 ter */.... zMsg
13467 5b 30 5d 20 3d 20 30 3b 0d 0a 20 20 67 65 74 4c [0] = 0;.. getL
13468 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 astErrorMsg(last
13469 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d Errno, sizeof(zM
1346a 73 67 29 2c 20 7a 4d 73 67 29 3b 0d 0a 20 20 61 sg), zMsg);.. a
1346b 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d ssert( errcode!=
1346c 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 SQLITE_OK );..
1346d 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a if( zPath==0 ) z
1346e 50 61 74 68 20 3d 20 22 22 3b 0d 0a 20 20 66 6f Path = "";.. fo
1346f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 r(i=0; zMsg[i] &
13470 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 & zMsg[i]!='\r'
13471 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 && zMsg[i]!='\n'
13472 3b 20 69 2b 2b 29 7b 7d 0d 0a 20 20 7a 4d 73 67 ; i++){}.. zMsg
13473 5b 69 5d 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 [i] = 0;.. sqli
13474 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c te3_log(errcode,
13475 0d 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e .. "os_win.
13476 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 c:%d: (%d) %s(%s
13477 29 20 2d 20 25 73 22 2c 0d 0a 20 20 20 20 20 20 ) - %s",..
13478 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f iLine, lastErrno
13479 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 , zFunc, zPath,
1347a 7a 4d 73 67 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 zMsg.. );....
1347b 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0d return errcode;.
1347c 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 .}..../*..** The
1347d 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 number of times
1347e 20 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 that a ReadFile
1347f 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c (), WriteFile(),
13480 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 and DeleteFile(
13481 29 0d 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 )..** will be re
13482 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 tried following
13483 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 a locking error
13484 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 - probably cause
13485 64 20 62 79 20 0d 0a 2a 2a 20 61 6e 74 69 76 69 d by ..** antivi
13486 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 rus software. A
13487 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 lso the initial
13488 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 delay before the
13489 20 66 69 72 73 74 20 72 65 74 72 79 2e 0d 0a 2a first retry...*
1348a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 * The delay incr
1348b 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 eases linearly w
1348c 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0d ith each retry..
1348d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
1348e 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f ITE_WIN32_IOERR_
1348f 52 45 54 52 59 0d 0a 23 20 64 65 66 69 6e 65 20 RETRY..# define
13490 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 SQLITE_WIN32_IOE
13491 52 52 5f 52 45 54 52 59 20 31 30 0d 0a 23 65 6e RR_RETRY 10..#en
13492 64 69 66 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c dif..#ifndef SQL
13493 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f ITE_WIN32_IOERR_
13494 52 45 54 52 59 5f 44 45 4c 41 59 0d 0a 23 20 64 RETRY_DELAY..# d
13495 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e efine SQLITE_WIN
13496 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 32_IOERR_RETRY_D
13497 45 4c 41 59 20 32 35 0d 0a 23 65 6e 64 69 66 0d ELAY 25..#endif.
13498 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 .static int win3
13499 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 2IoerrRetry = SQ
1349a 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 LITE_WIN32_IOERR
1349b 5f 52 45 54 52 59 3b 0d 0a 73 74 61 74 69 63 20 _RETRY;..static
1349c 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 int win32IoerrRe
1349d 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 tryDelay = SQLIT
1349e 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 E_WIN32_IOERR_RE
1349f 54 52 59 5f 44 45 4c 41 59 3b 0d 0a 0d 0a 2f 2a TRY_DELAY;..../*
134a0 0d 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 ..** If a ReadFi
134a1 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c le() or WriteFil
134a2 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 e() error occurs
134a3 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f , invoke this ro
134a4 75 74 69 6e 65 0d 0a 2a 2a 20 74 6f 20 73 65 65 utine..** to see
134a5 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 if it should be
134a6 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 retried. Retur
134a7 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e n TRUE to retry.
134a8 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0d 0a Return FALSE..
134a9 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 ** to give up wi
134aa 74 68 20 61 6e 20 65 72 72 6f 72 2e 0d 0a 2a 2f th an error...*/
134ab 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 ..static int ret
134ac 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 ryIoerr(int *pnR
134ad 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 etry, DWORD *pEr
134ae 72 6f 72 29 7b 0d 0a 20 20 44 57 4f 52 44 20 65 ror){.. DWORD e
134af 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
134b0 72 28 29 3b 0d 0a 20 20 69 66 28 20 2a 70 6e 52 r();.. if( *pnR
134b1 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 etry>=win32Ioerr
134b2 52 65 74 72 79 20 29 7b 0d 0a 20 20 20 20 69 66 Retry ){.. if
134b3 28 20 70 45 72 72 6f 72 20 29 7b 0d 0a 20 20 20 ( pError ){..
134b4 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0d *pError = e;.
134b5 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 . }.. retu
134b6 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 rn 0;.. }.. if
134b7 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 ( e==ERROR_ACCES
134b8 53 5f 44 45 4e 49 45 44 20 7c 7c 0d 0a 20 20 20 S_DENIED ||..
134b9 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b e==ERROR_LOCK
134ba 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0d 0a 20 _VIOLATION ||..
134bb 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 e==ERROR_SH
134bc 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 ARING_VIOLATION
134bd 29 7b 0d 0a 20 20 20 20 6f 73 53 6c 65 65 70 28 ){.. osSleep(
134be 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 win32IoerrRetryD
134bf 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 elay*(1+*pnRetry
134c0 29 29 3b 0d 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 ));.. ++*pnRe
134c1 74 72 79 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e try;.. return
134c2 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 1;.. }.. if(
134c3 70 45 72 72 6f 72 20 29 7b 0d 0a 20 20 20 20 2a pError ){.. *
134c4 70 45 72 72 6f 72 20 3d 20 65 3b 0d 0a 20 20 7d pError = e;.. }
134c5 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d .. return 0;..}
134c6 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 67 20 61 ..../*..** Log a
134c7 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 I/O error retry
134c8 20 65 70 69 73 6f 64 65 2e 0d 0a 2a 2f 0d 0a 73 episode...*/..s
134c9 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f tatic void logIo
134ca 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b err(int nRetry){
134cb 0d 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 .. if( nRetry )
134cc 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c {.. sqlite3_l
134cd 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c og(SQLITE_IOERR,
134ce 20 0d 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 .. "delaye
134cf 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f d %dms for lock/
134d0 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 sharing conflict
134d1 22 2c 0d 0a 20 20 20 20 20 20 77 69 6e 33 32 49 ",.. win32I
134d2 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e oerrRetryDelay*n
134d3 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 Retry*(nRetry+1)
134d4 2f 32 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 7d 0d /2.. );.. }.
134d5 0a 7d 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 .}....#if SQLITE
134d6 5f 4f 53 5f 57 49 4e 43 45 0d 0a 2f 2a 2a 2a 2a _OS_WINCE../****
134d7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
134d8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
134d9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
134da 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
134db 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 73 *****..** This s
134dc 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 ection contains
134dd 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f code for WinCE o
134de 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a nly...*/../*..**
134df 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 Windows CE does
134e0 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 not have a loca
134e1 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e ltime() function
134e2 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0d 0a . So create a..
134e3 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0d 0a ** substitute...
134e4 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 */../* #include
134e5 3c 74 69 6d 65 2e 68 3e 20 2a 2f 0d 0a 73 74 72 <time.h> */..str
134e6 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 uct tm *__cdecl
134e7 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 localtime(const
134e8 74 69 6d 65 5f 74 20 2a 74 29 0d 0a 7b 0d 0a 20 time_t *t)..{..
134e9 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 static struct t
134ea 6d 20 79 3b 0d 0a 20 20 46 49 4c 45 54 49 4d 45 m y;.. FILETIME
134eb 20 75 54 6d 2c 20 6c 54 6d 3b 0d 0a 20 20 53 59 uTm, lTm;.. SY
134ec 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0d 0a 20 STEMTIME pTm;..
134ed 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 sqlite3_int64 t
134ee 36 34 3b 0d 0a 20 20 74 36 34 20 3d 20 2a 74 3b 64;.. t64 = *t;
134ef 0d 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b .. t64 = (t64 +
134f0 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 11644473600)*10
134f1 30 30 30 30 30 30 3b 0d 0a 20 20 75 54 6d 2e 64 000000;.. uTm.d
134f2 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 wLowDateTime = (
134f3 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 DWORD)(t64 & 0xF
134f4 46 46 46 46 46 46 46 29 3b 0d 0a 20 20 75 54 6d FFFFFFF);.. uTm
134f5 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d .dwHighDateTime=
134f6 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 (DWORD)(t64 >>
134f7 33 32 29 3b 0d 0a 20 20 6f 73 46 69 6c 65 54 69 32);.. osFileTi
134f8 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d meToLocalFileTim
134f9 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0d 0a 20 e(&uTm,&lTm);..
134fa 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 osFileTimeToSys
134fb 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 temTime(&lTm,&pT
134fc 6d 29 3b 0d 0a 20 20 79 2e 74 6d 5f 79 65 61 72 m);.. y.tm_year
134fd 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 = pTm.wYear - 1
134fe 39 30 30 3b 0d 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 900;.. y.tm_mon
134ff 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 = pTm.wMonth -
13500 31 3b 0d 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 1;.. y.tm_wday
13501 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b = pTm.wDayOfWeek
13502 3b 0d 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d ;.. y.tm_mday =
13503 20 70 54 6d 2e 77 44 61 79 3b 0d 0a 20 20 79 2e pTm.wDay;.. y.
13504 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 tm_hour = pTm.wH
13505 6f 75 72 3b 0d 0a 20 20 79 2e 74 6d 5f 6d 69 6e our;.. y.tm_min
13506 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0d = pTm.wMinute;.
13507 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 . y.tm_sec = pT
13508 6d 2e 77 53 65 63 6f 6e 64 3b 0d 0a 20 20 72 65 m.wSecond;.. re
13509 74 75 72 6e 20 26 79 3b 0d 0a 7d 0d 0a 0d 0a 23 turn &y;..}....#
1350a 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f define HANDLE_TO
1350b 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e _WINFILE(a) (win
1350c 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 File*)&((char*)a
1350d 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 )[-(int)offsetof
1350e 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0d 0a 0d 0a (winFile,h)]....
1350f 2f 2a 0d 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 /*..** Acquire a
13510 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e lock on the han
13511 64 6c 65 20 68 0d 0a 2a 2f 0d 0a 73 74 61 74 69 dle h..*/..stati
13512 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 c void winceMute
13513 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 xAcquire(HANDLE
13514 68 29 7b 0d 0a 20 20 20 44 57 4f 52 44 20 64 77 h){.. DWORD dw
13515 45 72 72 3b 0d 0a 20 20 20 64 6f 20 7b 0d 0a 20 Err;.. do {..
13516 20 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 dwErr = Wait
13517 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 ForSingleObject(
13518 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0d 0a 20 h, INFINITE);..
13519 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 } while (dwErr
1351a 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f != WAIT_OBJECT_
1351b 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 0 && dwErr != WA
1351c 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0d 0a IT_ABANDONED);..
1351d 7d 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 }../*..** Releas
1351e 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 e a lock acquire
1351f 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 d by winceMutexA
13520 63 71 75 69 72 65 28 29 0d 0a 2a 2f 0d 0a 23 64 cquire()..*/..#d
13521 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 efine winceMutex
13522 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 Release(h) Relea
13523 73 65 4d 75 74 65 78 28 68 29 0d 0a 0d 0a 2f 2a seMutex(h)..../*
13524 0d 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 ..** Create the
13525 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 mutex and shared
13526 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 memory used for
13527 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 locking in the
13528 66 69 6c 65 0d 0a 2a 2a 20 64 65 73 63 72 69 70 file..** descrip
13529 74 6f 72 20 70 46 69 6c 65 0d 0a 2a 2f 0d 0a 73 tor pFile..*/..s
1352a 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 tatic BOOL wince
1352b 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 CreateLock(const
1352c 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
1352d 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 , winFile *pFile
1352e 29 7b 0d 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f ){.. LPWSTR zTo
1352f 6b 3b 0d 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 k;.. LPWSTR zNa
13530 6d 65 3b 0d 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 me;.. BOOL bIni
13531 74 20 3d 20 54 52 55 45 3b 0d 0a 0d 0a 20 20 7a t = TRUE;.... z
13532 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 Name = utf8ToUni
13533 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b code(zFilename);
13534 0d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 .. if( zName==0
13535 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 6f 75 74 20 ){.. /* out
13536 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 of memory */..
13537 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0d return FALSE;.
13538 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69 . }.... /* Ini
13539 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 tialize the loca
1353a 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0d 0a 20 l lockdata */..
1353b 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e memset(&pFile->
1353c 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 local, 0, sizeof
1353d 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b (pFile->local));
1353e 0d 0a 0d 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 .... /* Replace
1353f 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 the backslashes
13540 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 from the filena
13541 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 me and lowercase
13542 20 69 74 0d 0a 20 20 2a 2a 20 74 6f 20 64 65 72 it.. ** to der
13543 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 ive a mutex name
13544 2e 20 2a 2f 0d 0a 20 20 7a 54 6f 6b 20 3d 20 6f . */.. zTok = o
13545 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d sCharLowerW(zNam
13546 65 29 3b 0d 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 e);.. for (;*zT
13547 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0d 0a 20 20 20 ok;zTok++){..
13548 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c if (*zTok == '\
13549 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b \') *zTok = '_';
1354a 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 72 .. }.... /* Cr
1354b 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 eate/open the na
1354c 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0d 0a 20 20 med mutex */..
1354d 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 pFile->hMutex =
1354e 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e osCreateMutexW(N
1354f 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d ULL, FALSE, zNam
13550 65 29 3b 0d 0a 20 20 69 66 20 28 21 70 46 69 6c e);.. if (!pFil
13551 65 2d 3e 68 4d 75 74 65 78 29 7b 0d 0a 20 20 20 e->hMutex){..
13552 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13553 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
13554 6f 72 28 29 3b 0d 0a 20 20 20 20 77 69 6e 4c 6f or();.. winLo
13555 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 gError(SQLITE_ER
13556 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 ROR, pFile->last
13557 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43 72 65 Errno, "winceCre
13558 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 ateLock1", zFile
13559 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 73 71 6c 69 name);.. sqli
1355a 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b te3_free(zName);
1355b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c .. return FAL
1355c 53 45 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a SE;.. }.... /*
1355d 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 Acquire the mut
1355e 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e ex before contin
1355f 75 69 6e 67 20 2a 2f 0d 0a 20 20 77 69 6e 63 65 uing */.. wince
13560 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 MutexAcquire(pFi
13561 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0d 0a 20 20 le->hMutex);..
13562 0d 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 .. /* Since the
13563 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 names of named
13564 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f mutexes, semapho
13565 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e res, file mappin
13566 67 73 20 65 74 63 20 61 72 65 20 0d 0a 20 20 2a gs etc are .. *
13567 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 * case-sensitive
13568 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 , take advantage
13569 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 of that by uppe
1356a 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 rcasing the mute
1356b 78 20 6e 61 6d 65 0d 0a 20 20 2a 2a 20 61 6e 64 x name.. ** and
1356c 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 using that as t
1356d 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 he shared filema
1356e 70 70 69 6e 67 20 6e 61 6d 65 2e 0d 0a 20 20 2a pping name... *
1356f 2f 0d 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 /.. osCharUpper
13570 57 28 7a 4e 61 6d 65 29 3b 0d 0a 20 20 70 46 69 W(zName);.. pFi
13571 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 le->hShared = os
13572 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
13573 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c gW(INVALID_HANDL
13574 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0d 0a E_VALUE, NULL,..
13575 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13576 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13577 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 PAGE_REA
13578 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f DWRITE, 0, sizeo
13579 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0d 0a 20 f(winceLock),..
1357a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1357b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1357c 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 zName);
1357d 0d 0a 0d 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 .... /* Set a f
1357e 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 lag that indicat
1357f 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72 es we're the fir
13580 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 st to create the
13581 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0d 0a memory so it ..
13582 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 ** must be zer
13583 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f o-initialized */
13584 0d 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 73 .. if (osGetLas
13585 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f tError() == ERRO
13586 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 R_ALREADY_EXISTS
13587 29 7b 0d 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 ){.. bInit =
13588 46 41 4c 53 45 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 FALSE;.. }....
13589 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e sqlite3_free(zN
1358a 61 6d 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 ame);.... /* If
1358b 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e we succeeded in
1358c 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 making the shar
1358d 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 ed memory handle
1358e 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0d 0a 20 20 , map it. */..
1358f 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 if (pFile->hShar
13590 65 64 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d ed){.. pFile-
13591 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 >shared = (wince
13592 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f Lock*)osMapViewO
13593 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 fFile(pFile->hSh
13594 61 72 65 64 2c 20 0d 0a 20 20 20 20 20 20 20 20 ared, ..
13595 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 FILE_MAP_RE
13596 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 AD|FILE_MAP_WRIT
13597 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 E, 0, 0, sizeof(
13598 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0d 0a 20 20 winceLock));..
13599 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 /* If mapping
1359a 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 failed, close th
1359b 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 e shared memory
1359c 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 handle and erase
1359d 20 69 74 20 2a 2f 0d 0a 20 20 20 20 69 66 20 28 it */.. if (
1359e 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b !pFile->shared){
1359f 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c .. pFile->l
135a0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 astErrno = osGet
135a1 4c 61 73 74 45 72 72 6f 72 28 29 3b 0d 0a 20 20 LastError();..
135a2 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 winLogError(
135a3 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 SQLITE_ERROR, pF
135a4 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0d ile->lastErrno,.
135a5 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
135a6 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b "winceCreateLock
135a7 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0d 2", zFilename);.
135a8 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 . osCloseHa
135a9 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 ndle(pFile->hSha
135aa 72 65 64 29 3b 0d 0a 20 20 20 20 20 20 70 46 69 red);.. pFi
135ab 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 le->hShared = NU
135ac 4c 4c 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d LL;.. }.. }.
135ad 0a 0d 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 ... /* If share
135ae 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e d memory could n
135af 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 ot be created, t
135b0 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 hen close the mu
135b1 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0d tex and fail */.
135b2 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 . if (pFile->hS
135b3 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0d hared == NULL){.
135b4 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 . winceMutexR
135b5 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d elease(pFile->hM
135b6 75 74 65 78 29 3b 0d 0a 20 20 20 20 6f 73 43 6c utex);.. osCl
135b7 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d oseHandle(pFile-
135b8 3e 68 4d 75 74 65 78 29 3b 0d 0a 20 20 20 20 70 >hMutex);.. p
135b9 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e File->hMutex = N
135ba 55 4c 4c 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e ULL;.. return
135bb 20 46 41 4c 53 45 3b 0d 0a 20 20 7d 0d 0a 20 20 FALSE;.. }..
135bc 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a .. /* Initializ
135bd 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d e the shared mem
135be 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 ory if we're sup
135bf 70 6f 73 65 64 20 74 6f 20 2a 2f 0d 0a 20 20 69 posed to */.. i
135c0 66 20 28 62 49 6e 69 74 29 20 7b 0d 0a 20 20 20 f (bInit) {..
135c1 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 memset(pFile->s
135c2 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 hared, 0, sizeof
135c3 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0d 0a 20 (winceLock));..
135c4 20 7d 0d 0a 0d 0a 20 20 77 69 6e 63 65 4d 75 74 }.... winceMut
135c5 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d exRelease(pFile-
135c6 3e 68 4d 75 74 65 78 29 3b 0d 0a 20 20 72 65 74 >hMutex);.. ret
135c7 75 72 6e 20 54 52 55 45 3b 0d 0a 7d 0d 0a 0d 0a urn TRUE;..}....
135c8 2f 2a 0d 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 /*..** Destroy t
135c9 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 he part of winFi
135ca 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 le that deals wi
135cb 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0d 0a th wince locks..
135cc 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
135cd 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b winceDestroyLock
135ce 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 (winFile *pFile)
135cf 7b 0d 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e {.. if (pFile->
135d0 68 4d 75 74 65 78 29 7b 0d 0a 20 20 20 20 2f 2a hMutex){.. /*
135d1 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 Acquire the mut
135d2 65 78 20 2a 2f 0d 0a 20 20 20 20 77 69 6e 63 65 ex */.. wince
135d3 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 MutexAcquire(pFi
135d4 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0d 0a 0d 0a le->hMutex);....
135d5 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f /* The follo
135d6 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 wing blocks shou
135d7 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 ld probably asse
135d8 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 rt in debug mode
135d9 2c 20 62 75 74 20 74 68 65 79 0d 0a 20 20 20 20 , but they..
135da 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 are to cleanu
135db 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f p in case any lo
135dc 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 cks remained ope
135dd 6e 20 2a 2f 0d 0a 20 20 20 20 69 66 20 28 70 46 n */.. if (pF
135de 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 ile->local.nRead
135df 65 72 73 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 ers){.. pFi
135e0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 le->shared->nRea
135e1 64 65 72 73 20 2d 2d 3b 0d 0a 20 20 20 20 7d 0d ders --;.. }.
135e2 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e . if (pFile->
135e3 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 local.bReserved)
135e4 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e {.. pFile->
135e5 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 shared->bReserve
135e6 64 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 20 20 d = FALSE;..
135e7 7d 0d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 }.. if (pFile
135e8 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 ->local.bPending
135e9 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d ){.. pFile-
135ea 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e >shared->bPendin
135eb 67 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 20 20 g = FALSE;..
135ec 7d 0d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 }.. if (pFile
135ed 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 ->local.bExclusi
135ee 76 65 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c ve){.. pFil
135ef 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c e->shared->bExcl
135f0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0d 0a usive = FALSE;..
135f1 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
135f2 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 De-reference and
135f3 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 close our copy
135f4 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 of the shared me
135f5 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a mory handle */..
135f6 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f osUnmapViewO
135f7 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 fFile(pFile->sha
135f8 72 65 64 29 3b 0d 0a 20 20 20 20 6f 73 43 6c 6f red);.. osClo
135f9 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e seHandle(pFile->
135fa 68 53 68 61 72 65 64 29 3b 0d 0a 0d 0a 20 20 20 hShared);....
135fb 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 /* Done with th
135fc 65 20 6d 75 74 65 78 20 2a 2f 0d 0a 20 20 20 20 e mutex */..
135fd 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 winceMutexReleas
135fe 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 e(pFile->hMutex)
135ff 3b 20 20 20 20 0d 0a 20 20 20 20 6f 73 43 6c 6f ; .. osClo
13600 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e seHandle(pFile->
13601 68 4d 75 74 65 78 29 3b 0d 0a 20 20 20 20 70 46 hMutex);.. pF
13602 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 ile->hMutex = NU
13603 4c 4c 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f LL;.. }..}..../
13604 2a 20 0d 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d * ..** An implem
13605 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
13606 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f LockFile() API o
13607 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 f Windows for CE
13608 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 42 4f 4f ..*/..static BOO
13609 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 L winceLockFile(
1360a 0d 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 .. HANDLE *phFi
1360b 6c 65 2c 0d 0a 20 20 44 57 4f 52 44 20 64 77 46 le,.. DWORD dwF
1360c 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0d 0a 20 ileOffsetLow,..
1360d 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 DWORD dwFileOff
1360e 73 65 74 48 69 67 68 2c 0d 0a 20 20 44 57 4f 52 setHigh,.. DWOR
1360f 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 D nNumberOfBytes
13610 54 6f 4c 6f 63 6b 4c 6f 77 2c 0d 0a 20 20 44 57 ToLockLow,.. DW
13611 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 ORD nNumberOfByt
13612 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0d 0a 29 7b esToLockHigh..){
13613 0d 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 .. winFile *pFi
13614 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 le = HANDLE_TO_W
13615 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0d INFILE(phFile);.
13616 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 . BOOL bReturn
13617 3d 20 46 41 4c 53 45 3b 0d 0a 0d 0a 20 20 55 4e = FALSE;.... UN
13618 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 USED_PARAMETER(d
13619 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 wFileOffsetHigh)
1361a 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ;.. UNUSED_PARA
1361b 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 METER(nNumberOfB
1361c 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b ytesToLockHigh);
1361d 0d 0a 0d 0a 20 20 69 66 20 28 21 70 46 69 6c 65 .... if (!pFile
1361e 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e ->hMutex) return
1361f 20 54 52 55 45 3b 0d 0a 20 20 77 69 6e 63 65 4d TRUE;.. winceM
13620 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c utexAcquire(pFil
13621 65 2d 3e 68 4d 75 74 65 78 29 3b 0d 0a 0d 0a 20 e->hMutex);....
13622 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 /* Wanting an e
13623 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a xclusive lock? *
13624 2f 0d 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f /.. if (dwFileO
13625 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f ffsetLow == (DWO
13626 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0d RD)SHARED_FIRST.
13627 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 . && nNumb
13628 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c erOfBytesToLockL
13629 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 ow == (DWORD)SHA
1362a 52 45 44 5f 53 49 5a 45 29 7b 0d 0a 20 20 20 20 RED_SIZE){..
1362b 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 if (pFile->share
1362c 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 d->nReaders == 0
1362d 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 && pFile->share
1362e 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d d->bExclusive ==
1362f 20 30 29 7b 0d 0a 20 20 20 20 20 20 20 70 46 69 0){.. pFi
13630 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 le->shared->bExc
13631 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0d 0a lusive = TRUE;..
13632 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f pFile->lo
13633 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d cal.bExclusive =
13634 20 54 52 55 45 3b 0d 0a 20 20 20 20 20 20 20 62 TRUE;.. b
13635 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0d 0a Return = TRUE;..
13636 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
13637 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f /* Want a read-o
13638 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0d 0a 20 20 nly lock? */..
13639 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f else if (dwFileO
1363a 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f ffsetLow == (DWO
1363b 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 RD)SHARED_FIRST
1363c 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 6e &&.. n
1363d 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c NumberOfBytesToL
1363e 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0d 0a 20 ockLow == 1){..
1363f 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 if (pFile->sh
13640 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 ared->bExclusive
13641 20 3d 3d 20 30 29 7b 0d 0a 20 20 20 20 20 20 70 == 0){.. p
13642 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 File->local.nRea
13643 64 65 72 73 20 2b 2b 3b 0d 0a 20 20 20 20 20 20 ders ++;..
13644 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
13645 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b .nReaders == 1){
13646 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d .. pFile-
13647 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 >shared->nReader
13648 73 20 2b 2b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a s ++;.. }..
13649 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 bReturn =
1364a 54 52 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 TRUE;.. }..
1364b 7d 0d 0a 0d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 }.... /* Want a
1364c 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a pending lock? *
1364d 2f 0d 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 /.. else if (dw
1364e 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d FileOffsetLow ==
1364f 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f (DWORD)PENDING_
13650 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f BYTE && nNumberO
13651 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 fBytesToLockLow
13652 3d 3d 20 31 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 == 1){.. /* I
13653 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 f no pending loc
13654 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 k has been acqui
13655 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 red, then acquir
13656 65 20 69 74 20 2a 2f 0d 0a 20 20 20 20 69 66 20 e it */.. if
13657 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e (pFile->shared->
13658 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b bPending == 0) {
13659 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 .. pFile->s
1365a 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 hared->bPending
1365b 3d 20 54 52 55 45 3b 0d 0a 20 20 20 20 20 20 70 = TRUE;.. p
1365c 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e File->local.bPen
1365d 64 69 6e 67 20 3d 20 54 52 55 45 3b 0d 0a 20 20 ding = TRUE;..
1365e 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
1365f 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d UE;.. }.. }.
13660 0a 0d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 ... /* Want a r
13661 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f eserved lock? */
13662 0d 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 .. else if (dwF
13663 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 ileOffsetLow ==
13664 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f (DWORD)RESERVED_
13665 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f BYTE && nNumberO
13666 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 fBytesToLockLow
13667 3d 3d 20 31 29 7b 0d 0a 20 20 20 20 69 66 20 28 == 1){.. if (
13668 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
13669 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b Reserved == 0) {
1366a 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 .. pFile->s
1366b 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 hared->bReserved
1366c 20 3d 20 54 52 55 45 3b 0d 0a 20 20 20 20 20 20 = TRUE;..
1366d 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 pFile->local.bRe
1366e 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0d 0a served = TRUE;..
1366f 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 bReturn =
13670 54 52 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 TRUE;.. }..
13671 7d 0d 0a 0d 0a 20 20 77 69 6e 63 65 4d 75 74 65 }.... winceMute
13672 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e xRelease(pFile->
13673 68 4d 75 74 65 78 29 3b 0d 0a 20 20 72 65 74 75 hMutex);.. retu
13674 72 6e 20 62 52 65 74 75 72 6e 3b 0d 0a 7d 0d 0a rn bReturn;..}..
13675 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6d 70 6c ../*..** An impl
13676 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 ementation of th
13677 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 e UnlockFile API
13678 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 of Windows for
13679 43 45 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 42 CE..*/..static B
1367a 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 OOL winceUnlockF
1367b 69 6c 65 28 0d 0a 20 20 48 41 4e 44 4c 45 20 2a ile(.. HANDLE *
1367c 70 68 46 69 6c 65 2c 0d 0a 20 20 44 57 4f 52 44 phFile,.. DWORD
1367d 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 dwFileOffsetLow
1367e 2c 0d 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c ,.. DWORD dwFil
1367f 65 4f 66 66 73 65 74 48 69 67 68 2c 0d 0a 20 20 eOffsetHigh,..
13680 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 DWORD nNumberOfB
13681 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c ytesToUnlockLow,
13682 0d 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 .. DWORD nNumbe
13683 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b rOfBytesToUnlock
13684 48 69 67 68 0d 0a 29 7b 0d 0a 20 20 77 69 6e 46 High..){.. winF
13685 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e ile *pFile = HAN
13686 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 DLE_TO_WINFILE(p
13687 68 46 69 6c 65 29 3b 0d 0a 20 20 42 4f 4f 4c 20 hFile);.. BOOL
13688 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b bReturn = FALSE;
13689 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 .... UNUSED_PAR
1368a 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 AMETER(dwFileOff
1368b 73 65 74 48 69 67 68 29 3b 0d 0a 20 20 55 4e 55 setHigh);.. UNU
1368c 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e SED_PARAMETER(nN
1368d 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e umberOfBytesToUn
1368e 6c 6f 63 6b 48 69 67 68 29 3b 0d 0a 0d 0a 20 20 lockHigh);....
1368f 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 if (!pFile->hMut
13690 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b ex) return TRUE;
13691 0d 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 .. winceMutexAc
13692 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 quire(pFile->hMu
13693 74 65 78 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 tex);.... /* Re
13694 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 leasing a reader
13695 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c lock or an excl
13696 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 usive lock */..
13697 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 if (dwFileOffse
13698 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 tLow == (DWORD)S
13699 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0d 0a 20 HARED_FIRST){..
1369a 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 /* Did we hav
1369b 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c e an exclusive l
1369c 6f 63 6b 3f 20 2a 2f 0d 0a 20 20 20 20 69 66 20 ock? */.. if
1369d 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 (pFile->local.bE
1369e 78 63 6c 75 73 69 76 65 29 7b 0d 0a 20 20 20 20 xclusive){..
1369f 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 assert(nNumber
136a0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c OfBytesToUnlockL
136a1 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 ow == (DWORD)SHA
136a2 52 45 44 5f 53 49 5a 45 29 3b 0d 0a 20 20 20 20 RED_SIZE);..
136a3 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 pFile->local.b
136a4 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 Exclusive = FALS
136a5 45 3b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 2d E;.. pFile-
136a6 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 >shared->bExclus
136a7 69 76 65 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 ive = FALSE;..
136a8 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
136a9 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 UE;.. }....
136aa 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 /* Did we just
136ab 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c have a reader l
136ac 6f 63 6b 3f 20 2a 2f 0d 0a 20 20 20 20 65 6c 73 ock? */.. els
136ad 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 e if (pFile->loc
136ae 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0d 0a 20 al.nReaders){..
136af 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d assert(nNum
136b0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f berOfBytesToUnlo
136b1 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 ckLow == (DWORD)
136b2 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e SHARED_SIZE || n
136b3 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 NumberOfBytesToU
136b4 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0d nlockLow == 1);.
136b5 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f . pFile->lo
136b6 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b cal.nReaders --;
136b7 0d 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c .. if (pFil
136b8 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 e->local.nReader
136b9 73 20 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20 7b s == 0).. {
136ba 0d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d .. pFile-
136bb 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 >shared->nReader
136bc 73 20 2d 2d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a s --;.. }..
136bd 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 bReturn =
136be 54 52 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 TRUE;.. }..
136bf 7d 0d 0a 0d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 }.... /* Releas
136c0 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f ing a pending lo
136c1 63 6b 20 2a 2f 0d 0a 20 20 65 6c 73 65 20 69 66 ck */.. else if
136c2 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f (dwFileOffsetLo
136c3 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 w == (DWORD)PEND
136c4 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d ING_BYTE && nNum
136c5 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f berOfBytesToUnlo
136c6 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0d 0a 20 20 ckLow == 1){..
136c7 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 if (pFile->loc
136c8 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0d 0a 20 al.bPending){..
136c9 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 pFile->loca
136ca 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c l.bPending = FAL
136cb 53 45 3b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 SE;.. pFile
136cc 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 ->shared->bPendi
136cd 6e 67 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 20 ng = FALSE;..
136ce 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 bReturn = TRU
136cf 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a E;.. }.. }..
136d0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 /* Releasing a
136d1 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a reserved lock *
136d2 2f 0d 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 /.. else if (dw
136d3 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d FileOffsetLow ==
136d4 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 (DWORD)RESERVED
136d5 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 _BYTE && nNumber
136d6 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c OfBytesToUnlockL
136d7 6f 77 20 3d 3d 20 31 29 7b 0d 0a 20 20 20 20 69 ow == 1){.. i
136d8 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e f (pFile->local.
136d9 62 52 65 73 65 72 76 65 64 29 20 7b 0d 0a 20 20 bReserved) {..
136da 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c pFile->local
136db 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c .bReserved = FAL
136dc 53 45 3b 0d 0a 20 20 20 20 20 20 70 46 69 6c 65 SE;.. pFile
136dd 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 ->shared->bReser
136de 76 65 64 20 3d 20 46 41 4c 53 45 3b 0d 0a 20 20 ved = FALSE;..
136df 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
136e0 55 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d UE;.. }.. }.
136e1 0a 0d 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 ... winceMutexR
136e2 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d elease(pFile->hM
136e3 75 74 65 78 29 3b 0d 0a 20 20 72 65 74 75 72 6e utex);.. return
136e4 20 62 52 65 74 75 72 6e 3b 0d 0a 7d 0d 0a 0d 0a bReturn;..}....
136e5 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d /*..** An implem
136e6 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
136e7 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 LockFileEx() API
136e8 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 of Windows for
136e9 43 45 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 42 CE..*/..static B
136ea 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c OOL winceLockFil
136eb 65 45 78 28 0d 0a 20 20 48 41 4e 44 4c 45 20 2a eEx(.. HANDLE *
136ec 70 68 46 69 6c 65 2c 0d 0a 20 20 44 57 4f 52 44 phFile,.. DWORD
136ed 20 64 77 46 6c 61 67 73 2c 0d 0a 20 20 44 57 4f dwFlags,.. DWO
136ee 52 44 20 64 77 52 65 73 65 72 76 65 64 2c 0d 0a RD dwReserved,..
136ef 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f DWORD nNumberO
136f0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c fBytesToLockLow,
136f1 0d 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 .. DWORD nNumbe
136f2 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 rOfBytesToLockHi
136f3 67 68 2c 0d 0a 20 20 4c 50 4f 56 45 52 4c 41 50 gh,.. LPOVERLAP
136f4 50 45 44 20 6c 70 4f 76 65 72 6c 61 70 70 65 64 PED lpOverlapped
136f5 0d 0a 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 ..){.. UNUSED_P
136f6 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65 72 ARAMETER(dwReser
136f7 76 65 64 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f ved);.. UNUSED_
136f8 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 PARAMETER(nNumbe
136f9 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 rOfBytesToLockHi
136fa 67 68 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 gh);.... /* If
136fb 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 the caller wants
136fc 20 61 20 73 68 61 72 65 64 20 72 65 61 64 20 6c a shared read l
136fd 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 ock, forward thi
136fe 73 20 63 61 6c 6c 0d 0a 20 20 2a 2a 20 74 6f 20 s call.. ** to
136ff 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f winceLockFile */
13700 0d 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61 .. if (lpOverla
13701 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 pped->Offset ==
13702 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 (DWORD)SHARED_FI
13703 52 53 54 20 26 26 0d 0a 20 20 20 20 20 20 64 77 RST &&.. dw
13704 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0d 0a 20 Flags == 1 &&..
13705 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 nNumberOfBy
13706 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 tesToLockLow ==
13707 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 (DWORD)SHARED_SI
13708 5a 45 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e ZE){.. return
13709 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 winceLockFile(p
1370a 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 hFile, SHARED_FI
1370b 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0d 0a RST, 0, 1, 0);..
1370c 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 46 41 }.. return FA
1370d 4c 53 45 3b 0d 0a 7d 0d 0a 2f 2a 0d 0a 2a 2a 20 LSE;..}../*..**
1370e 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 End of the speci
1370f 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 al code for winc
13710 65 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a e..*************
13711 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13712 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13713 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13714 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13715 2f 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c /..#endif /* SQL
13716 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0d ITE_OS_WINCE */.
13717 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
13718 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13719 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1371a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1371b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1371c 2a 0d 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 *..** The next g
1371d 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 roup of routines
1371e 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 implement the I
1371f 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 /O methods speci
13720 66 69 65 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 fied..** by the
13721 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f sqlite3_io_metho
13722 64 73 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 2a 2a ds object...****
13723 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13724 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13725 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13726 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13727 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f **********/..../
13728 2a 0d 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f *..** Some Micro
13729 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c soft compilers l
1372a 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 ack this definit
1372b 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 ion...*/..#ifnde
1372c 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 f INVALID_SET_FI
1372d 4c 45 5f 50 4f 49 4e 54 45 52 0d 0a 23 20 64 65 LE_POINTER..# de
1372e 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 fine INVALID_SET
1372f 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 _FILE_POINTER ((
13730 44 57 4f 52 44 29 2d 31 29 0d 0a 23 65 6e 64 69 DWORD)-1)..#endi
13731 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 f..../*..** Move
13732 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 the current pos
13733 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c ition of the fil
13734 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 e handle passed
13735 61 73 20 74 68 65 20 66 69 72 73 74 20 0d 0a 2a as the first ..*
13736 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 * argument to of
13737 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 fset iOffset wit
13738 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 hin the file. If
13739 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 successful, ret
1373a 75 72 6e 20 30 2e 20 0d 0a 2a 2a 20 4f 74 68 65 urn 0. ..** Othe
1373b 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 rwise, set pFile
1373c 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 ->lastErrno and
1373d 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e return non-zero.
1373e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1373f 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e seekWinFile(win
13740 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c File *pFile, sql
13741 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 ite3_int64 iOffs
13742 65 74 29 7b 0d 0a 20 20 4c 4f 4e 47 20 75 70 70 et){.. LONG upp
13743 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 erBits;
13744 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 /* Most
13745 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 sig. 32 bits of
13746 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 20 new offset */..
13747 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b LONG lowerBits;
13748 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13749 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 /* Least sig. 3
1374a 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 2 bits of new of
1374b 66 73 65 74 20 2a 2f 0d 0a 20 20 44 57 4f 52 44 fset */.. DWORD
1374c 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 dwRet;
1374d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 /* Va
1374e 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 lue returned by
1374f 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 SetFilePointer()
13750 20 2a 2f 0d 0a 20 20 44 57 4f 52 44 20 6c 61 73 */.. DWORD las
13751 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 tErrno;
13752 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 /* Value
13753 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c returned by GetL
13754 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0d 0a 0d astError() */...
13755 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 . upperBits = (
13756 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e LONG)((iOffset>>
13757 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 32) & 0x7fffffff
13758 29 3b 0d 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 );.. lowerBits
13759 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 = (LONG)(iOffset
1375a 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0d & 0xffffffff);.
1375b 0a 0d 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 ... /* API oddi
1375c 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 ty: If successfu
1375d 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 l, SetFilePointe
1375e 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 r() returns a dw
1375f 6f 72 64 20 0d 0a 20 20 2a 2a 20 63 6f 6e 74 61 ord .. ** conta
13760 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 ining the lower
13761 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 32-bits of the n
13762 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 ew file-offset.
13763 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c Or, if it fails,
13764 0d 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e .. ** it return
13765 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 s INVALID_SET_FI
13766 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 LE_POINTER. Howe
13767 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f ver according to
13768 20 4d 53 44 4e 2c 20 0d 0a 20 20 2a 2a 20 49 4e MSDN, .. ** IN
13769 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 VALID_SET_FILE_P
1376a 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 OINTER may also
1376b 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f be a valid new o
1376c 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 ffset. So to det
1376d 65 72 6d 69 6e 65 20 0d 0a 20 20 2a 2a 20 77 68 ermine .. ** wh
1376e 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 ether an error h
1376f 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 as actually occu
13770 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 red, it is also
13771 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c necessary to cal
13772 6c 20 0d 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 l .. ** GetLast
13773 45 72 72 6f 72 28 29 2e 0d 0a 20 20 2a 2f 0d 0a Error()... */..
13774 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 dwRet = osSetF
13775 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 ilePointer(pFile
13776 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 ->h, lowerBits,
13777 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 &upperBits, FILE
13778 5f 42 45 47 49 4e 29 3b 0d 0a 0d 0a 20 20 69 66 _BEGIN);.... if
13779 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 ( (dwRet==INVALI
1377a 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 D_SET_FILE_POINT
1377b 45 52 0d 0a 20 20 20 20 20 20 26 26 20 28 28 6c ER.. && ((l
1377c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 astErrno = osGet
1377d 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f LastError())!=NO
1377e 5f 45 52 52 4f 52 29 29 20 29 7b 0d 0a 20 20 20 _ERROR)) ){..
1377f 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13780 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0d 0a o = lastErrno;..
13781 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 winLogError(
13782 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 SQLITE_IOERR_SEE
13783 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 K, pFile->lastEr
13784 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 rno,..
13785 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 "seekWinFile"
13786 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b , pFile->zPath);
13787 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d .. return 1;.
13788 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e . }.... return
13789 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 0;..}..../*..**
1378a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0d 0a Close a file...
1378b 2a 2a 0d 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 **..** It is rep
1378c 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 orted that an at
1378d 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 tempt to close a
1378e 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f handle might so
1378f 6d 65 74 69 6d 65 73 0d 0a 2a 2a 20 66 61 69 6c metimes..** fail
13790 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 . This is a ver
13791 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 y unreasonable r
13792 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f esult, but Windo
13793 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0d ws is notorious.
13794 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e .** for being un
13795 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 reasonable so I
13796 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 do not doubt tha
13797 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 t it might happe
13798 6e 2e 20 20 49 66 0d 0a 2a 2a 20 74 68 65 20 63 n. If..** the c
13799 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 lose fails, we p
1379a 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c ause for 100 mil
1379b 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 liseconds and tr
1379c 79 20 61 67 61 69 6e 2e 20 20 41 73 0d 0a 2a 2a y again. As..**
1379d 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 many as MX_CLOS
1379e 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 E_ATTEMPT attemp
1379f 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 ts to close the
137a0 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 handle are made
137a1 62 65 66 6f 72 65 0d 0a 2a 2a 20 67 69 76 69 6e before..** givin
137a2 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 g up and returni
137a3 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0d 0a 2a 2f ng an error...*/
137a4 0d 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f ..#define MX_CLO
137a5 53 45 5f 41 54 54 45 4d 50 54 20 33 0d 0a 73 74 SE_ATTEMPT 3..st
137a6 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 atic int winClos
137a7 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a e(sqlite3_file *
137a8 69 64 29 7b 0d 0a 20 20 69 6e 74 20 72 63 2c 20 id){.. int rc,
137a9 63 6e 74 20 3d 20 30 3b 0d 0a 20 20 77 69 6e 46 cnt = 0;.. winF
137aa 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 ile *pFile = (wi
137ab 6e 46 69 6c 65 2a 29 69 64 3b 0d 0a 0d 0a 20 20 nFile*)id;....
137ac 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b assert( id!=0 );
137ad 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c .. assert( pFil
137ae 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0d 0a 20 e->pShm==0 );..
137af 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 OSTRACE(("CLOSE
137b0 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 %d\n", pFile->h
137b1 29 29 3b 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20 20 ));.. do{..
137b2 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 rc = osCloseHand
137b3 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0d 0a 20 le(pFile->h);..
137b4 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f /* SimulateIO
137b5 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 Error( rc=0; cnt
137b6 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 =MX_CLOSE_ATTEMP
137b7 54 3b 20 29 3b 20 2a 2f 0d 0a 20 20 7d 77 68 69 T; ); */.. }whi
137b8 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 le( rc==0 && ++c
137b9 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 nt < MX_CLOSE_AT
137ba 54 45 4d 50 54 20 26 26 20 28 6f 73 53 6c 65 65 TEMPT && (osSlee
137bb 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0d 0a 23 p(100), 1) );..#
137bc 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
137bd 43 45 0d 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 CE..#define WINC
137be 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d E_DELETION_ATTEM
137bf 50 54 53 20 33 0d 0a 20 20 77 69 6e 63 65 44 65 PTS 3.. winceDe
137c0 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 stroyLock(pFile)
137c1 3b 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e ;.. if( pFile->
137c2 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 zDeleteOnClose )
137c3 7b 0d 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d {.. int cnt =
137c4 20 30 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 0d 0;.. while(.
137c5 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 . osDe
137c6 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d leteFileW(pFile-
137c7 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 >zDeleteOnClose)
137c8 3d 3d 30 0d 0a 20 20 20 20 20 20 20 20 26 26 20 ==0.. &&
137c9 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 osGetFileAttribu
137ca 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c tesW(pFile->zDel
137cb 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 eteOnClose)!=0xf
137cc 66 66 66 66 66 66 66 20 0d 0a 20 20 20 20 20 20 fffffff ..
137cd 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e && cnt++ < WIN
137ce 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 CE_DELETION_ATTE
137cf 4d 50 54 53 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 MPTS.. ){..
137d0 20 20 20 20 20 6f 73 53 6c 65 65 70 28 31 30 30 osSleep(100
137d1 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 ); /* Wait a li
137d2 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 ttle before tryi
137d3 6e 67 20 61 67 61 69 6e 20 2a 2f 0d 0a 20 20 20 ng again */..
137d4 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f }.. sqlite3_
137d5 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c free(pFile->zDel
137d6 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0d 0a 20 20 eteOnClose);..
137d7 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 4f 53 54 }..#endif.. OST
137d8 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 RACE(("CLOSE %d
137d9 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c %s\n", pFile->h,
137da 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 rc ? "ok" : "fa
137db 69 6c 65 64 22 29 29 3b 0d 0a 20 20 4f 70 65 6e iled"));.. Open
137dc 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0d 0a 20 20 Counter(-1);..
137dd 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 return rc ? SQLI
137de 54 45 5f 4f 4b 0d 0a 20 20 20 20 20 20 20 20 20 TE_OK..
137df 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 : winLogError
137e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c (SQLITE_IOERR_CL
137e1 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 OSE, osGetLastEr
137e2 72 6f 72 28 29 2c 0d 0a 20 20 20 20 20 20 20 20 ror(),..
137e3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
137e4 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 "winClose", pF
137e5 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0d 0a 7d 0d ile->zPath);..}.
137e6 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 61 64 20 64 .../*..** Read d
137e7 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 ata from a file
137e8 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 into a buffer.
137e9 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b Return SQLITE_OK
137ea 20 69 66 20 61 6c 6c 0d 0a 2a 2a 20 62 79 74 65 if all..** byte
137eb 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 s were read succ
137ec 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c essfully and SQL
137ed 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 ITE_IOERR if any
137ee 74 68 69 6e 67 20 67 6f 65 73 0d 0a 2a 2a 20 77 thing goes..** w
137ef 72 6f 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 rong...*/..stati
137f0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0d 0a c int winRead(..
137f1 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
137f2 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 id, /*
137f3 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f File to read fro
137f4 6d 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 42 m */.. void *pB
137f5 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 uf,
137f6 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 /* Write cont
137f7 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 ent into this bu
137f8 66 66 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 ffer */.. int a
137f9 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 mt,
137fa 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
137fb 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 of bytes to read
137fc 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 */.. sqlite3_i
137fd 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 nt64 offset
137fe 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 /* Begin readi
137ff 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 ng at this offse
13800 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 77 69 6e 46 t */..){.. winF
13801 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 ile *pFile = (wi
13802 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 nFile*)id; /* f
13803 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 ile handle */..
13804 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 DWORD nRead;
13805 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13806 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
13807 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 tes actually rea
13808 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0d 0a d from file */..
13809 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 int nRetry = 0
1380a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1380b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 /* Number of r
1380c 65 74 72 79 73 20 2a 2f 0d 0a 0d 0a 20 20 61 73 etrys */.... as
1380d 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0d 0a sert( id!=0 );..
1380e 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
1380f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f r(return SQLITE_
13810 49 4f 45 52 52 5f 52 45 41 44 29 3b 0d 0a 20 20 IOERR_READ);..
13811 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25 OSTRACE(("READ %
13812 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 d lock=%d\n", pF
13813 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c ile->h, pFile->l
13814 6f 63 6b 74 79 70 65 29 29 3b 0d 0a 0d 0a 20 20 ocktype));....
13815 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 if( seekWinFile(
13816 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 pFile, offset) )
13817 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 {.. return SQ
13818 4c 49 54 45 5f 46 55 4c 4c 3b 0d 0a 20 20 7d 0d LITE_FULL;.. }.
13819 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 . while( !osRea
1381a 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 dFile(pFile->h,
1381b 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 pBuf, amt, &nRea
1381c 64 2c 20 30 29 20 29 7b 0d 0a 20 20 20 20 44 57 d, 0) ){.. DW
1381d 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0d 0a ORD lastErrno;..
1381e 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 if( retryIoe
1381f 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 rr(&nRetry, &las
13820 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e tErrno) ) contin
13821 75 65 3b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e ue;.. pFile->
13822 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 lastErrno = last
13823 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 72 65 74 75 Errno;.. retu
13824 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 rn winLogError(S
13825 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 QLITE_IOERR_READ
13826 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
13827 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 no,..
13828 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 "winRead", pFi
13829 6c 65 2d 3e 7a 50 61 74 68 29 3b 0d 0a 20 20 7d le->zPath);.. }
1382a 0d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 .. logIoerr(nRe
1382b 74 72 79 29 3b 0d 0a 20 20 69 66 28 20 6e 52 65 try);.. if( nRe
1382c 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b ad<(DWORD)amt ){
1382d 0d 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 .. /* Unread
1382e 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 parts of the buf
1382f 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f fer must be zero
13830 2d 66 69 6c 6c 65 64 20 2a 2f 0d 0a 20 20 20 20 -filled */..
13831 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 memset(&((char*)
13832 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c pBuf)[nRead], 0,
13833 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0d 0a 20 20 amt-nRead);..
13834 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
13835 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 IOERR_SHORT_READ
13836 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 ;.. }.... retu
13837 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
13838 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 65 ..../*..** Write
13839 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 data from a buf
1383a 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e fer into a file.
1383b 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f Return SQLITE_
1383c 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0d 0a 2a OK on success..*
1383d 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 * or some other
1383e 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 error code on fa
1383f 69 6c 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ilure...*/..stat
13840 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 ic int winWrite(
13841 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 .. sqlite3_file
13842 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 *id,
13843 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 /* File to w
13844 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0d 0a 20 20 rite into */..
13845 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 const void *pBuf
13846 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
13847 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 /* The bytes to
13848 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0d 0a 20 be written */..
13849 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 int amt,
1384a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1384b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
1384c 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0d tes to write */.
1384d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
1384e 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 offset
1384f 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 /* Offset int
13850 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 o the file to be
13851 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a gin writing at *
13852 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b /..){.. int rc;
13853 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13854 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
13855 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 if error has oc
13856 63 75 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 cured, else fals
13857 65 20 2a 2f 0d 0a 20 20 77 69 6e 46 69 6c 65 20 e */.. winFile
13858 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c *pFile = (winFil
13859 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 e*)id; /* File
1385a 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 handle */.. int
1385b 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 nRetry = 0;
1385c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1385d 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 Number of retrie
1385e 73 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 s */.... assert
1385f 28 20 61 6d 74 3e 30 20 29 3b 0d 0a 20 20 61 73 ( amt>0 );.. as
13860 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0d 0a sert( pFile );..
13861 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
13862 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f r(return SQLITE_
13863 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0d 0a 20 IOERR_WRITE);..
13864 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c SimulateDiskful
13865 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 lError(return SQ
13866 4c 49 54 45 5f 46 55 4c 4c 29 3b 0d 0a 0d 0a 20 LITE_FULL);....
13867 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 OSTRACE(("WRITE
13868 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 %d lock=%d\n",
13869 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d pFile->h, pFile-
1386a 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0d 0a 0d 0a >locktype));....
1386b 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69 rc = seekWinFi
1386c 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 le(pFile, offset
1386d 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 );.. if( rc==0
1386e 29 7b 0d 0a 20 20 20 20 75 38 20 2a 61 52 65 6d ){.. u8 *aRem
1386f 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 = (u8 *)pBuf;
13870 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 /* Data ye
13871 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 t to be written
13872 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d */.. int nRem
13873 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 = amt;
13874 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
13875 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 of bytes yet to
13876 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0d 0a 20 be written */..
13877 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b DWORD nWrite;
13878 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13879 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 /* Bytes writte
1387a 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 n by each WriteF
1387b 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0d 0a 20 ile() call */..
1387c 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 DWORD lastErr
1387d 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 no = NO_ERROR;
1387e 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e /* Value return
1387f 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 ed by GetLastErr
13880 6f 72 28 29 20 2a 2f 0d 0a 0d 0a 20 20 20 20 77 or() */.... w
13881 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0d hile( nRem>0 ){.
13882 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 . if( !osWr
13883 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 iteFile(pFile->h
13884 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e , aRem, nRem, &n
13885 57 72 69 74 65 2c 20 30 29 20 29 7b 0d 0a 20 20 Write, 0) ){..
13886 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 49 if( retryI
13887 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c oerr(&nRetry, &l
13888 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 astErrno) ) cont
13889 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 62 inue;.. b
1388a 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a reak;.. }..
1388b 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 if( nWrite
1388c 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 <=0 ) break;..
1388d 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 aRem += nWri
1388e 74 65 3b 0d 0a 20 20 20 20 20 20 6e 52 65 6d 20 te;.. nRem
1388f 2d 3d 20 6e 57 72 69 74 65 3b 0d 0a 20 20 20 20 -= nWrite;..
13890 7d 0d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e }.. if( nRem>
13891 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 46 69 6c 0 ){.. pFil
13892 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c e->lastErrno = l
13893 61 73 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 astErrno;..
13894 20 72 63 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d rc = 1;.. }.
13895 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 . }.... if( rc
13896 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 20 20 28 ){.. if( (
13897 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13898 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f o==ERROR_HANDLE_
13899 44 49 53 4b 5f 46 55 4c 4c 20 29 0d 0a 20 20 20 DISK_FULL )..
1389a 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e || ( pFile->
1389b 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 lastErrno==ERROR
1389c 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0d 0a _DISK_FULL )){..
1389d 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
1389e 49 54 45 5f 46 55 4c 4c 3b 0d 0a 20 20 20 20 7d ITE_FULL;.. }
1389f 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e .. return win
138a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
138a1 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 IOERR_WRITE, pFi
138a2 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0d 0a le->lastErrno,..
138a3 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 "wi
138a4 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e nWrite", pFile->
138a5 7a 50 61 74 68 29 3b 0d 0a 20 20 7d 65 6c 73 65 zPath);.. }else
138a6 7b 0d 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 {.. logIoerr(
138a7 6e 52 65 74 72 79 29 3b 0d 0a 20 20 7d 0d 0a 20 nRetry);.. }..
138a8 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
138a9 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 K;..}..../*..**
138aa 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e Truncate an open
138ab 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 file to a speci
138ac 66 69 65 64 20 73 69 7a 65 0d 0a 2a 2f 0d 0a 73 fied size..*/..s
138ad 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 tatic int winTru
138ae 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 ncate(sqlite3_fi
138af 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f le *id, sqlite3_
138b0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0d 0a 20 int64 nByte){..
138b1 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
138b2 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 = (winFile*)id;
138b3 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 /* File handle
138b4 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 object */.. int
138b5 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
138b6 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
138b7 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 Return code for
138b8 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f this function */
138b9 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 .... assert( pF
138ba 69 6c 65 20 29 3b 0d 0a 0d 0a 20 20 4f 53 54 52 ile );.... OSTR
138bb 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 ACE(("TRUNCATE %
138bc 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 d %lld\n", pFile
138bd 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0d 0a 20 ->h, nByte));..
138be 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
138bf 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 (return SQLITE_I
138c0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0d OERR_TRUNCATE);.
138c1 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 ... /* If the u
138c2 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 ser has configur
138c3 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 ed a chunk-size
138c4 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 for this file, t
138c5 72 75 6e 63 61 74 65 20 74 68 65 0d 0a 20 20 2a runcate the.. *
138c6 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 * file so that i
138c7 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e t consists of an
138c8 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 integer number
138c9 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 of chunks (i.e.
138ca 74 68 65 0d 0a 20 20 2a 2a 20 61 63 74 75 61 6c the.. ** actual
138cb 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 file size after
138cc 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d the operation m
138cd 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 ay be larger tha
138ce 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0d n the requested.
138cf 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0d 0a 20 20 . ** size)...
138d0 2a 2f 0d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d */.. if( pFile-
138d1 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0d 0a 20 >szChunk>0 ){..
138d2 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 nByte = ((nBy
138d3 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 te + pFile->szCh
138d4 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e unk - 1)/pFile->
138d5 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 szChunk) * pFile
138d6 2d 3e 73 7a 43 68 75 6e 6b 3b 0d 0a 20 20 7d 0d ->szChunk;.. }.
138d7 0a 0d 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 ... /* SetEndOf
138d8 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e File() returns n
138d9 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 on-zero when suc
138da 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f cessful, or zero
138db 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 when it fails.
138dc 2a 2f 0d 0a 20 20 69 66 28 20 73 65 65 6b 57 69 */.. if( seekWi
138dd 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 nFile(pFile, nBy
138de 74 65 29 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d te) ){.. rc =
138df 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
138e0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 ITE_IOERR_TRUNCA
138e1 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 TE, pFile->lastE
138e2 72 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 rrno,..
138e3 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 "winTruncate
138e4 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 1", pFile->zPath
138e5 29 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 );.. }else if(
138e6 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 0==osSetEndOfFil
138e7 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0d 0a e(pFile->h) ){..
138e8 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
138e9 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
138ea 45 72 72 6f 72 28 29 3b 0d 0a 20 20 20 20 72 63 Error();.. rc
138eb 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 = winLogError(S
138ec 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e QLITE_IOERR_TRUN
138ed 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 CATE, pFile->las
138ee 74 45 72 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 tErrno,..
138ef 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 "winTrunca
138f0 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 te2", pFile->zPa
138f1 74 68 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 4f th);.. }.... O
138f2 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 STRACE(("TRUNCAT
138f3 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c E %d %lld %s\n",
138f4 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 pFile->h, nByte
138f5 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 , rc ? "failed"
138f6 3a 20 22 6f 6b 22 29 29 3b 0d 0a 20 20 72 65 74 : "ok"));.. ret
138f7 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 23 69 urn rc;..}....#i
138f8 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
138f9 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 75 6e 74 20 74 ../*..** Count t
138fa 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c he number of ful
138fb 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 lsyncs and norma
138fc 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 l syncs. This i
138fd 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0d 0a s used to test..
138fe 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e ** that syncs an
138ff 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 d fullsyncs are
13900 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 occuring at the
13901 72 69 67 68 74 20 74 69 6d 65 73 2e 0d 0a 2a 2f right times...*/
13902 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
13903 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f sqlite3_sync_co
13904 75 6e 74 20 3d 20 30 3b 0d 0a 53 51 4c 49 54 45 unt = 0;..SQLITE
13905 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
13906 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 _fullsync_count
13907 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a = 0;..#endif....
13908 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 /*..** Make sure
13909 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 all writes to a
1390a 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 particular file
1390b 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 are committed t
1390c 6f 20 64 69 73 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61 o disk...*/..sta
1390d 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 tic int winSync(
1390e 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
1390f 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0d 0a 23 , int flags){..#
13910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f ifndef SQLITE_NO
13911 5f 53 59 4e 43 0d 0a 20 20 2f 2a 0d 0a 20 20 2a _SYNC.. /*.. *
13912 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e * Used only when
13913 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 SQLITE_NO_SYNC
13914 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0d is not defined..
13915 0a 20 20 20 2a 2f 0d 0a 20 20 42 4f 4f 4c 20 72 . */.. BOOL r
13916 63 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 c;..#endif..#if
13917 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 !defined(NDEBUG)
13918 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c || !defined(SQL
13919 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 ITE_NO_SYNC) ||
1391a 5c 0d 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 \.. (defined(
1391b 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 SQLITE_TEST) &&
1391c 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 defined(SQLITE_D
1391d 45 42 55 47 29 29 0d 0a 20 20 2f 2a 0d 0a 20 20 EBUG)).. /*..
1391e 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c ** Used when SQL
1391f 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e ITE_NO_SYNC is n
13920 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 ot defined and b
13921 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 y the assert() a
13922 6e 64 2f 6f 72 0d 0a 20 20 2a 2a 20 4f 53 54 52 nd/or.. ** OSTR
13923 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0d 0a 20 ACE() macros...
13924 20 20 2a 2f 0d 0a 20 20 77 69 6e 46 69 6c 65 20 */.. winFile
13925 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c *pFile = (winFil
13926 65 2a 29 69 64 3b 0d 0a 23 65 6c 73 65 0d 0a 20 e*)id;..#else..
13927 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
13928 52 28 69 64 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a R(id);..#endif..
13929 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c .. assert( pFil
1392a 65 20 29 3b 0d 0a 20 20 2f 2a 20 43 68 65 63 6b e );.. /* Check
1392b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c that one of SQL
1392c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 ITE_SYNC_NORMAL
1392d 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 or FULL was pass
1392e 65 64 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 ed */.. assert(
1392f 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 (flags&0x0F)==SQ
13930 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c LITE_SYNC_NORMAL
13931 0d 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 .. || (flag
13932 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f s&0x0F)==SQLITE_
13933 53 59 4e 43 5f 46 55 4c 4c 0d 0a 20 20 29 3b 0d SYNC_FULL.. );.
13934 0a 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 ... OSTRACE(("S
13935 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e YNC %d lock=%d\n
13936 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 ", pFile->h, pFi
13937 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0d le->locktype));.
13938 0a 0d 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e ... /* Unix can
13939 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 not, but some sy
1393a 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e stems may return
1393b 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f SQLITE_FULL fro
1393c 6d 20 68 65 72 65 2e 20 54 68 69 73 0d 0a 20 20 m here. This..
1393d 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 ** line is to te
1393e 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f st that doing so
1393f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 does not cause
13940 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0d 0a 20 any problems...
13941 20 2a 2f 0d 0a 20 20 53 69 6d 75 6c 61 74 65 44 */.. SimulateD
13942 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 iskfullError( re
13943 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c turn SQLITE_FULL
13944 20 29 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 );....#ifndef S
13945 51 4c 49 54 45 5f 54 45 53 54 0d 0a 20 20 55 4e QLITE_TEST.. UN
13946 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 USED_PARAMETER(f
13947 6c 61 67 73 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 lags);..#else..
13948 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 if( (flags&0x0F
13949 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 )==SQLITE_SYNC_F
1394a 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 ULL ){.. sqli
1394b 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 te3_fullsync_cou
1394c 6e 74 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 nt++;.. }.. sq
1394d 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 lite3_sync_count
1394e 2b 2b 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 ++;..#endif....
1394f 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c /* If we compil
13950 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 ed with the SQLI
13951 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c TE_NO_SYNC flag,
13952 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 then syncing is
13953 20 61 0d 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0d 0a a.. ** no-op..
13954 20 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c */..#ifdef SQL
13955 49 54 45 5f 4e 4f 5f 53 59 4e 43 0d 0a 20 20 72 ITE_NO_SYNC.. r
13956 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
13957 0d 0a 23 65 6c 73 65 0d 0a 20 20 72 63 20 3d 20 ..#else.. rc =
13958 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 osFlushFileBuffe
13959 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0d 0a 20 rs(pFile->h);..
1395a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
1395b 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0d 0a 20 ( rc=FALSE );..
1395c 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 if( rc ){..
1395d 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1395e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
1395f 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13960 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
13961 6f 72 28 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 or();.. retur
13962 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 n winLogError(SQ
13963 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 LITE_IOERR_FSYNC
13964 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
13965 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 no,..
13966 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 "winSync", pFi
13967 6c 65 2d 3e 7a 50 61 74 68 29 3b 0d 0a 20 20 7d le->zPath);.. }
13968 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f ..#endif..}..../
13969 2a 0d 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 *..** Determine
1396a 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 the current size
1396b 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 of a file in by
1396c 74 65 73 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 tes..*/..static
1396d 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 int winFileSize(
1396e 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
1396f 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 , sqlite3_int64
13970 2a 70 53 69 7a 65 29 7b 0d 0a 20 20 44 57 4f 52 *pSize){.. DWOR
13971 44 20 75 70 70 65 72 42 69 74 73 3b 0d 0a 20 20 D upperBits;..
13972 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b DWORD lowerBits;
13973 0d 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 .. winFile *pFi
13974 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
13975 64 3b 0d 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 d;.. DWORD last
13976 45 72 72 6e 6f 3b 0d 0a 0d 0a 20 20 61 73 73 65 Errno;.... asse
13977 72 74 28 20 69 64 21 3d 30 20 29 3b 0d 0a 20 20 rt( id!=0 );..
13978 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
13979 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
1397a 45 52 52 5f 46 53 54 41 54 29 3b 0d 0a 20 20 6c ERR_FSTAT);.. l
1397b 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 owerBits = osGet
1397c 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e FileSize(pFile->
1397d 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0d h, &upperBits);.
1397e 0a 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 . if( (lowerB
1397f 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 its == INVALID_F
13980 49 4c 45 5f 53 49 5a 45 29 0d 0a 20 20 20 20 20 ILE_SIZE)..
13981 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d && ((lastErrno =
13982 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
13983 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 0d ))!=NO_ERROR) ).
13984 0a 20 20 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d . {.. pFile-
13985 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 >lastErrno = las
13986 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 72 65 74 tErrno;.. ret
13987 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 urn winLogError(
13988 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 SQLITE_IOERR_FST
13989 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 AT, pFile->lastE
1398a 72 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 rrno,..
1398b 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 "winFileSize
1398c 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 ", pFile->zPath)
1398d 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 53 69 7a 65 ;.. }.. *pSize
1398e 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e = (((sqlite3_in
1398f 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c t64)upperBits)<<
13990 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 32) + lowerBits;
13991 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
13992 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
13993 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c ** LOCKFILE_FAIL
13994 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 _IMMEDIATELY is
13995 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d undefined on som
13996 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d e Windows system
13997 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 s...*/..#ifndef
13998 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d LOCKFILE_FAIL_IM
13999 4d 45 44 49 41 54 45 4c 59 0d 0a 23 20 64 65 66 MEDIATELY..# def
1399a 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 ine LOCKFILE_FAI
1399b 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0d L_IMMEDIATELY 1.
1399c 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a .#endif..../*..*
1399d 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 * Acquire a read
1399e 65 72 20 6c 6f 63 6b 2e 0d 0a 2a 2a 20 44 69 66 er lock...** Dif
1399f 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 ferent API routi
139a0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 nes are called d
139a1 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 epending on whet
139a2 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0d her or not this.
139a3 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 .** is Win9x or
139a4 57 69 6e 4e 54 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 WinNT...*/..stat
139a5 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f ic int getReadLo
139a6 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c ck(winFile *pFil
139a7 65 29 7b 0d 0a 20 20 69 6e 74 20 72 65 73 3b 0d e){.. int res;.
139a8 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b . if( isNT() ){
139a9 0d 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 .. OVERLAPPED
139aa 20 6f 76 6c 70 3b 0d 0a 20 20 20 20 6f 76 6c 70 ovlp;.. ovlp
139ab 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 .Offset = SHARED
139ac 5f 46 49 52 53 54 3b 0d 0a 20 20 20 20 6f 76 6c _FIRST;.. ovl
139ad 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 p.OffsetHigh = 0
139ae 3b 0d 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 ;.. ovlp.hEve
139af 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20 72 65 73 nt = 0;.. res
139b0 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 = osLockFileEx(
139b1 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 pFile->h, LOCKFI
139b2 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 LE_FAIL_IMMEDIAT
139b3 45 4c 59 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 ELY,..
139b4 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 0,
139b5 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 SHARED_SIZE, 0,
139b6 26 6f 76 6c 70 29 3b 0d 0a 2f 2a 20 69 73 4e 54 &ovlp);../* isNT
139b7 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 () is 1 if SQLIT
139b8 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 E_OS_WINCE==1, s
139b9 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e o this else is n
139ba 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0d ever executed. .
139bb 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f .*/..#if SQLITE_
139bc 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 20 7d OS_WINCE==0.. }
139bd 65 6c 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20 6c else{.. int l
139be 6b 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f k;.. sqlite3_
139bf 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f randomness(sizeo
139c0 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0d 0a 20 20 f(lk), &lk);..
139c1 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c pFile->sharedL
139c2 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 ockByte = (short
139c3 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 )((lk & 0x7fffff
139c4 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 ff)%(SHARED_SIZE
139c5 20 2d 20 31 29 29 3b 0d 0a 20 20 20 20 72 65 73 - 1));.. res
139c6 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46 = osLockFile(pF
139c7 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 ile->h, SHARED_F
139c8 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 IRST+pFile->shar
139c9 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 edLockByte, 0, 1
139ca 2c 20 30 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 , 0);..#endif..
139cb 20 7d 0d 0a 20 20 69 66 28 20 72 65 73 20 3d 3d }.. if( res ==
139cc 20 30 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 0 ){.. pFile
139cd 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 ->lastErrno = os
139ce 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0d GetLastError();.
139cf 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 . /* No need
139d0 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 to log a failure
139d1 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 7d to lock */.. }
139d2 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0d .. return res;.
139d3 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 6e 64 .}..../*..** Und
139d4 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0d 0a 2a 2f o a readlock..*/
139d5 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c ..static int unl
139d6 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 ockReadLock(winF
139d7 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0d 0a 20 20 ile *pFile){..
139d8 69 6e 74 20 72 65 73 3b 0d 0a 20 20 44 57 4f 52 int res;.. DWOR
139d9 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0d 0a 20 20 D lastErrno;..
139da 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0d 0a 20 if( isNT() ){..
139db 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f 63 res = osUnloc
139dc 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 kFile(pFile->h,
139dd 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c SHARED_FIRST, 0,
139de 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 SHARED_SIZE, 0)
139df 3b 0d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 ;../* isNT() is
139e0 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 1 if SQLITE_OS_W
139e1 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 INCE==1, so this
139e2 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 else is never e
139e3 78 65 63 75 74 65 64 2e 20 0d 0a 2a 2f 0d 0a 23 xecuted. ..*/..#
139e4 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
139e5 43 45 3d 3d 30 0d 0a 20 20 7d 65 6c 73 65 7b 0d CE==0.. }else{.
139e6 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c . res = osUnl
139e7 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 ockFile(pFile->h
139e8 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b , SHARED_FIRST +
139e9 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f pFile->sharedLo
139ea 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 ckByte, 0, 1, 0)
139eb 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a ;..#endif.. }..
139ec 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 if( res==0 &&
139ed 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 ((lastErrno = os
139ee 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 GetLastError())!
139ef 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 =ERROR_NOT_LOCKE
139f0 44 29 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 D) ){.. pFile
139f1 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 ->lastErrno = la
139f2 73 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 77 69 stErrno;.. wi
139f3 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
139f4 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 _IOERR_UNLOCK, p
139f5 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c File->lastErrno,
139f6 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 .. "
139f7 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c unlockReadLock",
139f8 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0d pFile->zPath);.
139f9 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
139fa 65 73 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a es;..}..../*..**
139fb 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 Lock the file w
139fc 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 ith the lock spe
139fd 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 cified by parame
139fe 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f ter locktype - o
139ff 6e 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f ne..** of the fo
13a00 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a llowing:..**..**
13a01 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f (1) SHARED_
13a02 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 28 32 29 LOCK..** (2)
13a03 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0d 0a RESERVED_LOCK..
13a04 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 ** (3) PENDI
13a05 4e 47 5f 4c 4f 43 4b 0d 0a 2a 2a 20 20 20 20 20 NG_LOCK..**
13a06 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f (4) EXCLUSIVE_LO
13a07 43 4b 0d 0a 2a 2a 0d 0a 2a 2a 20 53 6f 6d 65 74 CK..**..** Somet
13a08 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 imes when reques
13a09 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 ting one lock st
13a0a 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 ate, additional
13a0b 6c 6f 63 6b 20 73 74 61 74 65 73 0d 0a 2a 2a 20 lock states..**
13a0c 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 are inserted in
13a0d 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f between. The lo
13a0e 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c cking might fail
13a0f 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c on one of the l
13a10 61 74 65 72 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 ater..** transit
13a11 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 ions leaving the
13a12 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 lock state diff
13a13 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 erent from what
13a14 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0d 0a it started but..
13a15 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f ** still short o
13a16 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 f its goal. The
13a17 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 following chart
13a18 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 shows the allow
13a19 65 64 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f ed..** transitio
13a1a 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 ns and the inser
13a1b 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 ted intermediate
13a1c 20 73 74 61 74 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a states:..**..**
13a1d 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 UNLOCKED ->
13a1e 53 48 41 52 45 44 0d 0a 2a 2a 20 20 20 20 53 48 SHARED..** SH
13a1f 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 ARED -> RESERVED
13a20 0d 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d ..** SHARED -
13a21 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 > (PENDING) -> E
13a22 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 20 20 20 XCLUSIVE..**
13a23 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e RESERVED -> (PEN
13a24 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 DING) -> EXCLUSI
13a25 56 45 0d 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e VE..** PENDIN
13a26 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0d 0a G -> EXCLUSIVE..
13a27 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
13a28 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e ine will only in
13a29 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 crease a lock.
13a2a 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 The winUnlock()
13a2b 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 65 72 61 73 routine..** eras
13a2c 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 es all locks at
13a2d 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 once and returns
13a2e 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 us immediately
13a2f 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c to locking level
13a30 20 30 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 0...** It is no
13a31 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f t possible to lo
13a32 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 wer the locking
13a33 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 level one step a
13a34 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0d 0a t a time. You..
13a35 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 ** must go strai
13a36 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c ght to locking l
13a37 65 76 65 6c 20 30 2e 0d 0a 2a 2f 0d 0a 73 74 61 evel 0...*/..sta
13a38 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 tic int winLock(
13a39 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
13a3a 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b , int locktype){
13a3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c .. int rc = SQL
13a3c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 ITE_OK; /* Re
13a3d 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 turn code from s
13a3e 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0d 0a 20 ubroutines */..
13a3f 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 int res = 1;
13a40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c /* Resul
13a41 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c t of a Windows l
13a42 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0d 0a 20 20 69 ock call */.. i
13a43 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 nt newLocktype;
13a44 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 /* Set pFi
13a45 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 le->locktype to
13a46 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 this value befor
13a47 65 20 65 78 69 74 69 6e 67 20 2a 2f 0d 0a 20 20 e exiting */..
13a48 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f int gotPendingLo
13a49 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 ck = 0;/* True i
13a4a 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 f we acquired a
13a4b 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 PENDING lock thi
13a4c 73 20 74 69 6d 65 20 2a 2f 0d 0a 20 20 77 69 6e s time */.. win
13a4d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 File *pFile = (w
13a4e 69 6e 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 44 inFile*)id;.. D
13a4f 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d WORD lastErrno =
13a50 20 4e 4f 5f 45 52 52 4f 52 3b 0d 0a 0d 0a 20 20 NO_ERROR;....
13a51 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b assert( id!=0 );
13a52 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f .. OSTRACE(("LO
13a53 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64 28 CK %d %d was %d(
13a54 25 64 29 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 %d)\n",..
13a55 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f pFile->h, lo
13a56 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c cktype, pFile->l
13a57 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e ocktype, pFile->
13a58 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 sharedLockByte))
13a59 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 ;.... /* If the
13a5a 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 re is already a
13a5b 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 lock of this typ
13a5c 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 e or more restri
13a5d 63 74 69 76 65 20 6f 6e 20 74 68 65 0d 0a 20 20 ctive on the..
13a5e 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f ** OsFile, do no
13a5f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 thing. Don't use
13a60 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 the end_lock: e
13a61 78 69 74 20 70 61 74 68 2c 20 61 73 0d 0a 20 20 xit path, as..
13a62 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 ** sqlite3OsEnte
13a63 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 rMutex() hasn't
13a64 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e been called yet.
13a65 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 46 .. */.. if( pF
13a66 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c ile->locktype>=l
13a67 6f 63 6b 74 79 70 65 20 29 7b 0d 0a 20 20 20 20 ocktype ){..
13a68 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
13a69 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4d ;.. }.... /* M
13a6a 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 ake sure the loc
13a6b 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 king sequence is
13a6c 20 63 6f 72 72 65 63 74 0d 0a 20 20 2a 2f 0d 0a correct.. */..
13a6d 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d assert( pFile-
13a6e 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f >locktype!=NO_LO
13a6f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d CK || locktype==
13a70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a SHARED_LOCK );..
13a71 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 assert( lockty
13a72 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b pe!=PENDING_LOCK
13a73 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6c );.. assert( l
13a74 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 ocktype!=RESERVE
13a75 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d D_LOCK || pFile-
13a76 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 >locktype==SHARE
13a77 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 20 2f D_LOCK );.... /
13a78 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 * Lock the PENDI
13a79 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 NG_LOCK byte if
13a7a 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 we need to acqui
13a7b 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 re a PENDING loc
13a7c 6b 20 6f 72 0d 0a 20 20 2a 2a 20 61 20 53 48 41 k or.. ** a SHA
13a7d 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 RED lock. If we
13a7e 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 are acquiring a
13a7f 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 SHARED lock, th
13a80 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 e acquisition of
13a81 0d 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 .. ** the PENDI
13a82 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 NG_LOCK byte is
13a83 74 65 6d 70 6f 72 61 72 79 2e 0d 0a 20 20 2a 2f temporary... */
13a84 0d 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 .. newLocktype
13a85 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 = pFile->locktyp
13a86 65 3b 0d 0a 20 20 69 66 28 20 20 20 28 70 46 69 e;.. if( (pFi
13a87 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f le->locktype==NO
13a88 5f 4c 4f 43 4b 29 0d 0a 20 20 20 20 20 7c 7c 20 _LOCK).. ||
13a89 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 ( (locktype==E
13a8a 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0d 0a XCLUSIVE_LOCK)..
13a8b 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 && (pFi
13a8c 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 le->locktype==RE
13a8d 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0d 0a 20 SERVED_LOCK))..
13a8e 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 63 6e 74 ){.. int cnt
13a8f 20 3d 20 33 3b 0d 0a 20 20 20 20 77 68 69 6c 65 = 3;.. while
13a90 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 ( cnt-->0 && (re
13a91 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 s = osLockFile(p
13a92 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 File->h, PENDING
13a93 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 _BYTE, 0, 1, 0))
13a94 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a ==0 ){.. /*
13a95 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 Try 3 times to
13a96 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 get the pending
13a97 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e lock. This is n
13a98 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0d 0a 20 eeded to work..
13a99 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 ** around p
13a9a 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 roblems caused b
13a9b 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f y indexing and/o
13a9c 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 r anti-virus sof
13a9d 74 77 61 72 65 20 6f 6e 0d 0a 20 20 20 20 20 20 tware on..
13a9e 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 ** Windows syste
13a9f 6d 73 2e 0d 0a 20 20 20 20 20 20 2a 2a 20 49 66 ms... ** If
13aa0 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 you are using t
13aa1 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f his code as a mo
13aa2 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 del for alternat
13aa3 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f ive VFSes, do no
13aa4 74 0d 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 t.. ** copy
13aa5 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 this retry logi
13aa6 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b c. It is a hack
13aa7 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 intended for Wi
13aa8 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0d 0a 20 20 20 ndows only...
13aa9 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 4f 53 54 */.. OST
13aaa 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 RACE(("could not
13aab 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c get a PENDING l
13aac 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 ock. cnt=%d\n",
13aad 63 6e 74 29 29 3b 0d 0a 20 20 20 20 20 20 69 66 cnt));.. if
13aae 28 20 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28 ( cnt ) osSleep(
13aaf 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 1);.. }..
13ab0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d gotPendingLock =
13ab1 20 72 65 73 3b 0d 0a 20 20 20 20 69 66 28 20 21 res;.. if( !
13ab2 72 65 73 20 29 7b 0d 0a 20 20 20 20 20 20 6c 61 res ){.. la
13ab3 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
13ab4 61 73 74 45 72 72 6f 72 28 29 3b 0d 0a 20 20 20 astError();..
13ab5 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 }.. }.... /*
13ab6 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 Acquire a shared
13ab7 20 6c 6f 63 6b 0d 0a 20 20 2a 2f 0d 0a 20 20 69 lock.. */.. i
13ab8 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 f( locktype==SHA
13ab9 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 RED_LOCK && res
13aba 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){.. assert(
13abb 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d pFile->locktype=
13abc 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 20 =NO_LOCK );..
13abd 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f res = getReadLo
13abe 63 6b 28 70 46 69 6c 65 29 3b 0d 0a 20 20 20 20 ck(pFile);..
13abf 69 66 28 20 72 65 73 20 29 7b 0d 0a 20 20 20 20 if( res ){..
13ac0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 newLocktype =
13ac1 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0d 0a 20 20 SHARED_LOCK;..
13ac2 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
13ac3 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
13ac4 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0d 0a 20 tLastError();..
13ac5 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f }.. }.... /
13ac6 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 * Acquire a RESE
13ac7 52 56 45 44 20 6c 6f 63 6b 0d 0a 20 20 2a 2f 0d RVED lock.. */.
13ac8 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d . if( locktype=
13ac9 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 =RESERVED_LOCK &
13aca 26 20 72 65 73 20 29 7b 0d 0a 20 20 20 20 61 73 & res ){.. as
13acb 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 sert( pFile->loc
13acc 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f ktype==SHARED_LO
13acd 43 4b 20 29 3b 0d 0a 20 20 20 20 72 65 73 20 3d CK );.. res =
13ace 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c osLockFile(pFil
13acf 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 e->h, RESERVED_B
13ad0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0d 0a YTE, 0, 1, 0);..
13ad1 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0d 0a if( res ){..
13ad2 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 newLocktyp
13ad3 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 e = RESERVED_LOC
13ad4 4b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a K;.. }else{..
13ad5 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 lastErrno
13ad6 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 = osGetLastError
13ad7 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d ();.. }.. }.
13ad8 0a 0d 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 ... /* Acquire
13ad9 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0d 0a a PENDING lock..
13ada 20 20 2a 2f 0d 0a 20 20 69 66 28 20 6c 6f 63 6b */.. if( lock
13adb 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f type==EXCLUSIVE_
13adc 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0d 0a LOCK && res ){..
13add 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 newLocktype
13ade 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0d = PENDING_LOCK;.
13adf 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c . gotPendingL
13ae0 6f 63 6b 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 0d ock = 0;.. }...
13ae1 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e . /* Acquire an
13ae2 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0d EXCLUSIVE lock.
13ae3 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 6c 6f 63 . */.. if( loc
13ae4 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 ktype==EXCLUSIVE
13ae5 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0d _LOCK && res ){.
13ae6 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 . assert( pFi
13ae7 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 le->locktype>=SH
13ae8 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 ARED_LOCK );..
13ae9 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 res = unlockRe
13aea 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0d 0a adLock(pFile);..
13aeb 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e OSTRACE(("un
13aec 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 readlock = %d\n"
13aed 2c 20 72 65 73 29 29 3b 0d 0a 20 20 20 20 72 65 , res));.. re
13aee 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 s = osLockFile(p
13aef 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f File->h, SHARED_
13af0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 FIRST, 0, SHARED
13af1 5f 53 49 5a 45 2c 20 30 29 3b 0d 0a 20 20 20 20 _SIZE, 0);..
13af2 69 66 28 20 72 65 73 20 29 7b 0d 0a 20 20 20 20 if( res ){..
13af3 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 newLocktype =
13af4 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0d EXCLUSIVE_LOCK;.
13af5 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
13af6 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f lastErrno = o
13af7 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b sGetLastError();
13af8 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 .. OSTRACE(
13af9 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 ("error-code = %
13afa 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 d\n", lastErrno)
13afb 29 3b 0d 0a 20 20 20 20 20 20 67 65 74 52 65 61 );.. getRea
13afc 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0d 0a 20 dLock(pFile);..
13afd 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f }.. }.... /
13afe 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 * If we are hold
13aff 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f ing a PENDING lo
13b00 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f ck that ought to
13b01 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 be released, th
13b02 65 6e 0d 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 en.. ** release
13b03 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 2a 2f 0d 0a it now... */..
13b04 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 if( gotPending
13b05 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 Lock && locktype
13b06 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b ==SHARED_LOCK ){
13b07 0d 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 .. osUnlockFi
13b08 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e le(pFile->h, PEN
13b09 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c DING_BYTE, 0, 1,
13b0a 20 30 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 0);.. }.... /
13b0b 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 * Update the sta
13b0c 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 te of the lock h
13b0d 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 as held in the f
13b0e 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 ile descriptor t
13b0f 68 65 6e 0d 0a 20 20 2a 2a 20 72 65 74 75 72 6e hen.. ** return
13b10 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 the appropriate
13b11 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0d 0a 20 result code...
13b12 20 2a 2f 0d 0a 20 20 69 66 28 20 72 65 73 20 29 */.. if( res )
13b13 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 {.. rc = SQLI
13b14 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 65 6c 73 65 7b TE_OK;.. }else{
13b15 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 .. OSTRACE(("
13b16 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 LOCK FAILED %d t
13b17 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 rying for %d but
13b18 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c got %d\n", pFil
13b19 65 2d 3e 68 2c 0d 0a 20 20 20 20 20 20 20 20 20 e->h,..
13b1a 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c locktype, newL
13b1b 6f 63 6b 74 79 70 65 29 29 3b 0d 0a 20 20 20 20 ocktype));..
13b1c 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
13b1d 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0d 0a 20 = lastErrno;..
13b1e 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
13b1f 55 53 59 3b 0d 0a 20 20 7d 0d 0a 20 20 70 46 69 USY;.. }.. pFi
13b20 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 le->locktype = (
13b21 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0d u8)newLocktype;.
13b22 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
13b23 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..../*..** This
13b24 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 routine checks i
13b25 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 f there is a RES
13b26 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 ERVED lock held
13b27 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 on the specified
13b28 0d 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 ..** file by thi
13b29 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 s or any other p
13b2a 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 rocess. If such
13b2b 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 a lock is held,
13b2c 72 65 74 75 72 6e 0d 0a 2a 2a 20 6e 6f 6e 2d 7a return..** non-z
13b2d 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a ero, otherwise z
13b2e 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ero...*/..static
13b2f 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 int winCheckRes
13b30 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 ervedLock(sqlite
13b31 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
13b32 2a 70 52 65 73 4f 75 74 29 7b 0d 0a 20 20 69 6e *pResOut){.. in
13b33 74 20 72 63 3b 0d 0a 20 20 77 69 6e 46 69 6c 65 t rc;.. winFile
13b34 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 *pFile = (winFi
13b35 6c 65 2a 29 69 64 3b 0d 0a 0d 0a 20 20 53 69 6d le*)id;.... Sim
13b36 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 ulateIOError( re
13b37 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
13b38 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c R_CHECKRESERVEDL
13b39 4f 43 4b 3b 20 29 3b 0d 0a 0d 0a 20 20 61 73 73 OCK; );.... ass
13b3a 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0d 0a 20 ert( id!=0 );..
13b3b 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b if( pFile->lock
13b3c 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c type>=RESERVED_L
13b3d 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d OCK ){.. rc =
13b3e 20 31 3b 0d 0a 20 20 20 20 4f 53 54 52 41 43 45 1;.. OSTRACE
13b3f 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 (("TEST WR-LOCK
13b40 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 %d %d (local)\n"
13b41 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 , pFile->h, rc))
13b42 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
13b43 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 rc = osLockFile
13b44 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 (pFile->h, RESER
13b45 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 VED_BYTE, 0, 1,
13b46 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 0);.. if( rc
13b47 29 7b 0d 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f ){.. osUnlo
13b48 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c ckFile(pFile->h,
13b49 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 RESERVED_BYTE,
13b4a 30 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 20 20 7d 0, 1, 0);.. }
13b4b 0d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0d .. rc = !rc;.
13b4c 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 . OSTRACE(("T
13b4d 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 EST WR-LOCK %d %
13b4e 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 d (remote)\n", p
13b4f 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0d 0a File->h, rc));..
13b50 20 20 7d 0d 0a 20 20 2a 70 52 65 73 4f 75 74 20 }.. *pResOut
13b51 3d 20 72 63 3b 0d 0a 20 20 72 65 74 75 72 6e 20 = rc;.. return
13b52 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d SQLITE_OK;..}...
13b53 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 ./*..** Lower th
13b54 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 e locking level
13b55 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 on file descript
13b56 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 or id to locktyp
13b57 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0d 0a 2a 2a e. locktype..**
13b58 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
13b59 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 NO_LOCK or SHARE
13b5a 44 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 D_LOCK...**..**
13b5b 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c If the locking l
13b5c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 evel of the file
13b5d 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 descriptor is a
13b5e 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c lready at or bel
13b5f 6f 77 0d 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 ow..** the reque
13b60 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 sted locking lev
13b61 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 el, this routine
13b62 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a is a no-op...**
13b63 0d 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 ..** It is not p
13b64 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 ossible for this
13b65 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c routine to fail
13b66 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 if the second a
13b67 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 69 73 20 4e rgument..** is N
13b68 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 O_LOCK. If the
13b69 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
13b6a 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 is SHARED_LOCK t
13b6b 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 hen this routine
13b6c 0d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 ..** might retur
13b6d 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0d n SQLITE_IOERR;.
13b6e 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
13b6f 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 winUnlock(sqlite
13b70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
13b71 6c 6f 63 6b 74 79 70 65 29 7b 0d 0a 20 20 69 6e locktype){.. in
13b72 74 20 74 79 70 65 3b 0d 0a 20 20 77 69 6e 46 69 t type;.. winFi
13b73 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e le *pFile = (win
13b74 46 69 6c 65 2a 29 69 64 3b 0d 0a 20 20 69 6e 74 File*)id;.. int
13b75 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
13b76 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c .. assert( pFil
13b77 65 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 e!=0 );.. asser
13b78 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 t( locktype<=SHA
13b79 52 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 4f RED_LOCK );.. O
13b7a 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 STRACE(("UNLOCK
13b7b 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 %d to %d was %d(
13b7c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 %d)\n", pFile->h
13b7d 2c 20 6c 6f 63 6b 74 79 70 65 2c 0d 0a 20 20 20 , locktype,..
13b7e 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f pFile->lo
13b7f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 cktype, pFile->s
13b80 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b haredLockByte));
13b81 0d 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 .. type = pFile
13b82 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0d 0a 20 20 69 ->locktype;.. i
13b83 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 f( type>=EXCLUSI
13b84 56 45 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 VE_LOCK ){..
13b85 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 osUnlockFile(pFi
13b86 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 le->h, SHARED_FI
13b87 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 RST, 0, SHARED_S
13b88 49 5a 45 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 IZE, 0);.. if
13b89 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 ( locktype==SHAR
13b8a 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 ED_LOCK && !getR
13b8b 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 eadLock(pFile) )
13b8c 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 {.. /* This
13b8d 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 should never ha
13b8e 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 ppen. We should
13b8f 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 always be able
13b90 74 6f 0d 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 to.. ** rea
13b91 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 cquire the read
13b92 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 20 20 72 lock */.. r
13b93 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 c = winLogError(
13b94 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c SQLITE_IOERR_UNL
13b95 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 OCK, osGetLastEr
13b96 72 6f 72 28 29 2c 0d 0a 20 20 20 20 20 20 20 20 ror(),..
13b97 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 "winUnloc
13b98 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 k", pFile->zPath
13b99 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
13b9a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 if( type>=RESE
13b9b 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0d 0a 20 20 RVED_LOCK ){..
13b9c 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 osUnlockFile(p
13b9d 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 File->h, RESERVE
13b9e 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 D_BYTE, 0, 1, 0)
13b9f 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6c 6f ;.. }.. if( lo
13ba0 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 cktype==NO_LOCK
13ba1 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f && type>=SHARED_
13ba2 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 75 6e 6c LOCK ){.. unl
13ba3 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c ockReadLock(pFil
13ba4 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 e);.. }.. if(
13ba5 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f type>=PENDING_LO
13ba6 43 4b 20 29 7b 0d 0a 20 20 20 20 6f 73 55 6e 6c CK ){.. osUnl
13ba7 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 ockFile(pFile->h
13ba8 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 , PENDING_BYTE,
13ba9 30 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 0, 1, 0);.. }..
13baa 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 pFile->locktyp
13bab 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 e = (u8)locktype
13bac 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
13bad 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 .}..../*..** If
13bae 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 *pArg is inititi
13baf 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 ally negative th
13bb0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 en this is a que
13bb1 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 ry. Set *pArg t
13bb2 6f 0d 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 o..** 1 or 0 dep
13bb3 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 ending on whethe
13bb4 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 r or not bit mas
13bb5 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c k of pFile->ctrl
13bb6 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0d 0a 2a Flags is set...*
13bb7 2a 0d 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 *..** If *pArg i
13bb8 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 s 0 or 1, then c
13bb9 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 lear or set the
13bba 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c mask bit of pFil
13bbb 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0d 0a 2a e->ctrlFlags...*
13bbc 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 /..static void w
13bbd 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c inModeBit(winFil
13bbe 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e e *pFile, unsign
13bbf 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e ed char mask, in
13bc0 74 20 2a 70 41 72 67 29 7b 0d 0a 20 20 69 66 28 t *pArg){.. if(
13bc1 20 2a 70 41 72 67 3c 30 20 29 7b 0d 0a 20 20 20 *pArg<0 ){..
13bc2 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d *pArg = (pFile-
13bc3 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 >ctrlFlags & mas
13bc4 6b 29 21 3d 30 3b 0d 0a 20 20 7d 65 6c 73 65 20 k)!=0;.. }else
13bc5 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 if( (*pArg)==0 )
13bc6 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 {.. pFile->ct
13bc7 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b rlFlags &= ~mask
13bc8 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
13bc9 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 pFile->ctrlFlag
13bca 73 20 7c 3d 20 6d 61 73 6b 3b 0d 0a 20 20 7d 0d s |= mask;.. }.
13bcb 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e .}..../*..** Con
13bcc 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f trol and query o
13bcd 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 f the open file
13bce 68 61 6e 64 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 handle...*/..sta
13bcf 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 tic int winFileC
13bd0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 ontrol(sqlite3_f
13bd1 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c ile *id, int op,
13bd2 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0d 0a 20 void *pArg){..
13bd3 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
13bd4 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0d = (winFile*)id;.
13bd5 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b . switch( op ){
13bd6 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 .. case SQLIT
13bd7 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 E_FCNTL_LOCKSTAT
13bd8 45 3a 20 7b 0d 0a 20 20 20 20 20 20 2a 28 69 6e E: {.. *(in
13bd9 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d t*)pArg = pFile-
13bda 3e 6c 6f 63 6b 74 79 70 65 3b 0d 0a 20 20 20 20 >locktype;..
13bdb 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
13bdc 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 OK;.. }..
13bdd 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 case SQLITE_LAST
13bde 5f 45 52 52 4e 4f 3a 20 7b 0d 0a 20 20 20 20 20 _ERRNO: {..
13bdf 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 *(int*)pArg = (
13be0 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 int)pFile->lastE
13be1 72 72 6e 6f 3b 0d 0a 20 20 20 20 20 20 72 65 74 rrno;.. ret
13be2 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
13be3 20 20 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 20 }.. case
13be4 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 SQLITE_FCNTL_CHU
13be5 4e 4b 5f 53 49 5a 45 3a 20 7b 0d 0a 20 20 20 20 NK_SIZE: {..
13be6 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b pFile->szChunk
13be7 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b = *(int *)pArg;
13be8 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
13be9 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d QLITE_OK;.. }
13bea 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 .. case SQLIT
13beb 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e E_FCNTL_SIZE_HIN
13bec 54 3a 20 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 T: {.. if(
13bed 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 pFile->szChunk>0
13bee 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c ){.. sql
13bef 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a ite3_int64 oldSz
13bf0 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 ;.. int r
13bf1 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 c = winFileSize(
13bf2 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0d 0a 20 20 id, &oldSz);..
13bf3 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
13bf4 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
13bf5 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e sqlite3_in
13bf6 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 t64 newSz = *(sq
13bf7 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 lite3_int64*)pAr
13bf8 67 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 g;.. if
13bf9 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b ( newSz>oldSz ){
13bfa 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 .. Si
13bfb 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e mulateIOErrorBen
13bfc 69 67 6e 28 31 29 3b 0d 0a 20 20 20 20 20 20 20 ign(1);..
13bfd 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 rc = winTru
13bfe 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 ncate(id, newSz)
13bff 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 ;.. S
13c00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 imulateIOErrorBe
13c01 6e 69 67 6e 28 30 29 3b 0d 0a 20 20 20 20 20 20 nign(0);..
13c02 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d }.. }
13c03 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e .. return
13c04 20 72 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 rc;.. }..
13c05 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
13c06 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 TE_OK;.. }..
13c07 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 case SQLITE_F
13c08 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c CNTL_PERSIST_WAL
13c09 3a 20 7b 0d 0a 20 20 20 20 20 20 77 69 6e 4d 6f : {.. winMo
13c0a 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e deBit(pFile, WIN
13c0b 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c FILE_PERSIST_WAL
13c0c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0d 0a , (int*)pArg);..
13c0d 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
13c0e 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a ITE_OK;.. }..
13c0f 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f case SQLITE_
13c10 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f FCNTL_POWERSAFE_
13c11 4f 56 45 52 57 52 49 54 45 3a 20 7b 0d 0a 20 20 OVERWRITE: {..
13c12 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 winModeBit(p
13c13 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 File, WINFILE_PS
13c14 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b OW, (int*)pArg);
13c15 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
13c16 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d QLITE_OK;.. }
13c17 0d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 .. case SQLIT
13c18 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a E_FCNTL_VFSNAME:
13c19 20 7b 0d 0a 20 20 20 20 20 20 2a 28 63 68 61 72 {.. *(char
13c1a 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 **)pArg = sqlite
13c1b 33 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 3_mprintf("win32
13c1c 22 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 ");.. retur
13c1d 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 n SQLITE_OK;..
13c1e 20 20 7d 0d 0a 20 20 20 20 63 61 73 65 20 53 51 }.. case SQ
13c1f 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 LITE_FCNTL_WIN32
13c20 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0d 0a 20 20 _AV_RETRY: {..
13c21 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e int *a = (in
13c22 74 2a 29 70 41 72 67 3b 0d 0a 20 20 20 20 20 20 t*)pArg;..
13c23 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0d 0a 20 if( a[0]>0 ){..
13c24 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 win32Ioer
13c25 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0d 0a rRetry = a[0];..
13c26 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
13c27 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e a[0] = win
13c28 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0d 0a 20 32IoerrRetry;..
13c29 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 }.. if
13c2a 28 20 61 5b 31 5d 3e 30 20 29 7b 0d 0a 20 20 20 ( a[1]>0 ){..
13c2b 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 win32IoerrR
13c2c 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d etryDelay = a[1]
13c2d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
13c2e 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 . a[1] =
13c2f 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 win32IoerrRetryD
13c30 65 6c 61 79 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a elay;.. }..
13c31 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
13c32 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a ITE_OK;.. }..
13c33 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 }.. return SQ
13c34 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0d 0a LITE_NOTFOUND;..
13c35 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 }..../*..** Retu
13c36 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 rn the sector si
13c37 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 ze in bytes of t
13c38 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c he underlying bl
13c39 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0d 0a ock device for..
13c3a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 ** the specified
13c3b 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 file. This is a
13c3c 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 lmost always 512
13c3d 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 bytes, but may
13c3e 62 65 0d 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f be..** larger fo
13c3f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0d r some devices..
13c40 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 63 .**..** SQLite c
13c41 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 ode assumes this
13c42 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 function cannot
13c43 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 fail. It also a
13c44 73 73 75 6d 65 73 20 74 68 61 74 0d 0a 2a 2a 20 ssumes that..**
13c45 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 if two files are
13c46 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 created in the
13c47 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d same file-system
13c48 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e directory (i.e.
13c49 0d 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 ..** a database
13c4a 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 and its journal
13c4b 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 file) that the s
13c4c 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 ector size will
13c4d 62 65 20 74 68 65 0d 0a 2a 2a 20 73 61 6d 65 20 be the..** same
13c4e 66 6f 72 20 62 6f 74 68 2e 0d 0a 2a 2f 0d 0a 73 for both...*/..s
13c4f 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 tatic int winSec
13c50 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f torSize(sqlite3_
13c51 66 69 6c 65 20 2a 69 64 29 7b 0d 0a 20 20 28 76 file *id){.. (v
13c52 6f 69 64 29 69 64 3b 0d 0a 20 20 72 65 74 75 72 oid)id;.. retur
13c53 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 n SQLITE_DEFAULT
13c54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0d 0a 7d _SECTOR_SIZE;..}
13c55 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 ..../*..** Retur
13c56 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 n a vector of de
13c57 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 vice characteris
13c58 74 69 63 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 tics...*/..stati
13c59 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 c int winDeviceC
13c5a 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 haracteristics(s
13c5b 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 qlite3_file *id)
13c5c 7b 0d 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 {.. winFile *p
13c5d 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0d = (winFile*)id;.
13c5e 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
13c5f 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 _IOCAP_UNDELETAB
13c60 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0d 0a LE_WHEN_OPEN |..
13c61 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 ((p->ct
13c62 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c rlFlags & WINFIL
13c63 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 E_PSOW)?SQLITE_I
13c64 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f OCAP_POWERSAFE_O
13c65 56 45 52 57 52 49 54 45 3a 30 29 3b 0d 0a 7d 0d VERWRITE:0);..}.
13c66 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
13c67 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 0d 0a 2f 2a E_OMIT_WAL..../*
13c68 20 0d 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 ..** Windows wi
13c69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 ll only let you
13c6a 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 create file view
13c6b 20 6d 61 70 70 69 6e 67 73 0d 0a 2a 2a 20 6f 6e mappings..** on
13c6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 allocation size
13c6d 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 granularity bou
13c6e 6e 64 61 72 69 65 73 2e 0d 0a 2a 2a 20 44 75 72 ndaries...** Dur
13c6f 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 ing sqlite3_os_i
13c70 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 nit() we do a Ge
13c71 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0d 0a 2a tSystemInfo()..*
13c72 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 * to get the gra
13c73 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0d 0a nularity size...
13c74 2a 2f 0d 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 */..SYSTEM_INFO
13c75 77 69 6e 53 79 73 49 6e 66 6f 3b 0d 0a 0d 0a 2f winSysInfo;..../
13c76 2a 0d 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e *..** Helper fun
13c77 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e ctions to obtain
13c78 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 and relinquish
13c79 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 the global mutex
13c7a 2e 20 54 68 65 0d 0a 2a 2a 20 67 6c 6f 62 61 6c . The..** global
13c7b 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 mutex is used t
13c7c 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 o protect the wi
13c7d 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 nLockInfo object
13c7e 73 20 75 73 65 64 20 62 79 20 0d 0a 2a 2a 20 74 s used by ..** t
13c7f 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 his file, all of
13c80 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 which may be sh
13c81 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 ared by multiple
13c82 20 74 68 72 65 61 64 73 2e 0d 0a 2a 2a 0d 0a 2a threads...**..*
13c83 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 * Function winSh
13c84 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 mMutexHeld() is
13c85 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 used to assert()
13c86 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c that the global
13c87 20 6d 75 74 65 78 20 0d 0a 2a 2a 20 69 73 20 68 mutex ..** is h
13c88 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 eld when require
13c89 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e d. This function
13c8a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 is only used as
13c8b 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 part of assert(
13c8c 29 20 0d 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 ) ..** statement
13c8d 73 2e 20 65 2e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 s. e.g...**..**
13c8e 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 winShmEnterMut
13c8f 65 78 28 29 0d 0a 2a 2a 20 20 20 20 20 61 73 73 ex()..** ass
13c90 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 ert( winShmMutex
13c91 48 65 6c 64 28 29 20 29 3b 0d 0a 2a 2a 20 20 20 Held() );..**
13c92 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 winShmLeaveMutex
13c93 28 29 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 ()..*/..static v
13c94 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d oid winShmEnterM
13c95 75 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 20 73 utex(void){.. s
13c96 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 qlite3_mutex_ent
13c97 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 er(sqlite3MutexA
13c98 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 lloc(SQLITE_MUTE
13c99 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 X_STATIC_MASTER)
13c9a 29 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 76 6f );..}..static vo
13c9b 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 id winShmLeaveMu
13c9c 74 65 78 28 76 6f 69 64 29 7b 0d 0a 20 20 73 71 tex(void){.. sq
13c9d 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 lite3_mutex_leav
13c9e 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c e(sqlite3MutexAl
13c9f 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
13ca0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 _STATIC_MASTER))
13ca1 3b 0d 0a 7d 0d 0a 23 69 66 64 65 66 20 53 51 4c ;..}..#ifdef SQL
13ca2 49 54 45 5f 44 45 42 55 47 0d 0a 73 74 61 74 69 ITE_DEBUG..stati
13ca3 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 c int winShmMute
13ca4 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0d 0a 20 xHeld(void) {..
13ca5 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f return sqlite3_
13ca6 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 mutex_held(sqlit
13ca7 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c e3MutexAlloc(SQL
13ca8 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 ITE_MUTEX_STATIC
13ca9 5f 4d 41 53 54 45 52 29 29 3b 0d 0a 7d 0d 0a 23 _MASTER));..}..#
13caa 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
13cab 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 Object used to r
13cac 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c epresent a singl
13cad 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e e file opened an
13cae 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f d mmapped to pro
13caf 76 69 64 65 0d 0a 2a 2a 20 73 68 61 72 65 64 20 vide..** shared
13cb0 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 memory. When mu
13cb1 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 ltiple threads a
13cb2 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 ll reference the
13cb3 20 73 61 6d 65 0d 0a 2a 2a 20 6c 6f 67 2d 73 75 same..** log-su
13cb4 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 mmary, each thre
13cb5 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 ad has its own w
13cb6 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 inFile object, b
13cb7 75 74 20 74 68 65 79 20 61 6c 6c 0d 0a 2a 2a 20 ut they all..**
13cb8 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c point to a singl
13cb9 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 e instance of th
13cba 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f is object. In o
13cbb 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 ther words, each
13cbc 0d 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 ..** log-summary
13cbd 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 is opened only
13cbe 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 once per process
13cbf 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 77 69 6e 53 68 6d ...**..** winShm
13cc0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 MutexHeld() must
13cc1 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 be true when cr
13cc2 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f eating or destro
13cc3 79 69 6e 67 0d 0a 2a 2a 20 74 68 69 73 20 6f 62 ying..** this ob
13cc4 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 ject or while re
13cc5 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 ading or writing
13cc6 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 the following f
13cc7 69 65 6c 64 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ields:..**..**
13cc8 20 20 20 20 6e 52 65 66 0d 0a 2a 2a 20 20 20 20 nRef..**
13cc9 20 20 70 4e 65 78 74 20 0d 0a 2a 2a 0d 0a 2a 2a pNext ..**..**
13cca 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 The following f
13ccb 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f ields are read-o
13ccc 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 nly after the ob
13ccd 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a ject is created:
13cce 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 20 20 20 20 66 ..** ..** f
13ccf 69 64 0d 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c id..** zFil
13cd0 65 6e 61 6d 65 0d 0a 2a 2a 0d 0a 2a 2a 20 45 69 ename..**..** Ei
13cd1 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e ther winShmNode.
13cd2 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 mutex must be he
13cd3 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 ld or winShmNode
13cd4 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0d 0a 2a 2a .nRef==0 and..**
13cd5 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 winShmMutexHeld
13cd6 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 () is true when
13cd7 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 reading or writi
13cd8 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 ng any other fie
13cd9 6c 64 0d 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 ld..** in this s
13cda 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a tructure...**..*
13cdb 2f 0d 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d /..struct winShm
13cdc 4e 6f 64 65 20 7b 0d 0a 20 20 73 71 6c 69 74 65 Node {.. sqlite
13cdd 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 3_mutex *mutex;
13cde 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f /* Mutex to
13cdf 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a access this obj
13ce0 65 63 74 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a ect */.. char *
13ce1 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 zFilename;
13ce2 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
13ce3 74 68 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 77 the file */.. w
13ce4 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 inFile hFile;
13ce5 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c /* Fil
13ce6 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 e handle from wi
13ce7 6e 4f 70 65 6e 20 2a 2f 0d 0a 0d 0a 20 20 69 6e nOpen */.... in
13ce8 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 t szRegion;
13ce9 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
13cea 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 of shared-memor
13ceb 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0d 0a 20 20 y regions */..
13cec 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 int nRegion;
13ced 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
13cee 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 ze of array apRe
13cef 67 69 6f 6e 20 2a 2f 0d 0a 20 20 73 74 72 75 63 gion */.. struc
13cf0 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0d 0a 20 t ShmRegion {..
13cf1 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 HANDLE hMap;
13cf2 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
13cf3 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 ile handle from
13cf4 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
13cf5 67 20 2a 2f 0d 0a 20 20 20 20 76 6f 69 64 20 2a g */.. void *
13cf6 70 4d 61 70 3b 0d 0a 20 20 7d 20 2a 61 52 65 67 pMap;.. } *aReg
13cf7 69 6f 6e 3b 0d 0a 20 20 44 57 4f 52 44 20 6c 61 ion;.. DWORD la
13cf8 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 stErrno;
13cf9 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 /* The Window
13cfa 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 s errno from the
13cfb 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 last I/O error
13cfc 2a 2f 0d 0a 0d 0a 20 20 69 6e 74 20 6e 52 65 66 */.... int nRef
13cfd 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
13cfe 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
13cff 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 winShm objects p
13d00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 ointing to this
13d01 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 */.. winShm *pF
13d02 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 irst;
13d03 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f /* All winShm o
13d04 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 bjects pointing
13d05 74 6f 20 74 68 69 73 20 2a 2f 0d 0a 20 20 77 69 to this */.. wi
13d06 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b nShmNode *pNext;
13d07 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 /* Next
13d08 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 in list of all
13d09 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 winShmNode objec
13d0a 74 73 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 ts */..#ifdef SQ
13d0b 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 75 38 LITE_DEBUG.. u8
13d0c 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 nextShmId;
13d0d 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 /* Next
13d0e 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 available winSh
13d0f 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0d 0a 23 m.id value */..#
13d10 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d endif..};..../*.
13d11 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 .** A global arr
13d12 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d ay of all winShm
13d13 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0d 0a 2a Node objects...*
13d14 2a 0d 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d *..** The winShm
13d15 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 MutexHeld() must
13d16 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 be true while r
13d17 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e eading or writin
13d18 67 20 74 68 69 73 20 6c 69 73 74 2e 0d 0a 2a 2f g this list...*/
13d19 0d 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e ..static winShmN
13d1a 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c ode *winShmNodeL
13d1b 69 73 74 20 3d 20 30 3b 0d 0a 0d 0a 2f 2a 0d 0a ist = 0;..../*..
13d1c 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 ** Structure use
13d1d 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 d internally by
13d1e 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f this VFS to reco
13d1f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 rd the state of
13d20 61 6e 0d 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 an..** open shar
13d21 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 ed memory connec
13d22 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 tion...**..** Th
13d23 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c e following fiel
13d24 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a ds are initializ
13d25 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a ed when this obj
13d26 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 ect is created a
13d27 6e 64 0d 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d nd..** are read-
13d28 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a only thereafter:
13d29 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 77 69 6e 53 ..**..** winS
13d2a 68 6d 2e 70 53 68 6d 4e 6f 64 65 0d 0a 2a 2a 20 hm.pShmNode..**
13d2b 20 20 20 77 69 6e 53 68 6d 2e 69 64 0d 0a 2a 2a winShm.id..**
13d2c 0d 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 ..** All other f
13d2d 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 ields are read/w
13d2e 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 rite. The winSh
13d2f 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 m.pShmNode->mute
13d30 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0d 0a x must be held..
13d31 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 ** while accessi
13d32 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 ng any read/writ
13d33 65 20 66 69 65 6c 64 73 2e 0d 0a 2a 2f 0d 0a 73 e fields...*/..s
13d34 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0d 0a truct winShm {..
13d35 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 winShmNode *pS
13d36 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 hmNode; /*
13d37 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 The underlying w
13d38 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 inShmNode object
13d39 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 20 2a 70 */.. winShm *p
13d3a 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 Next;
13d3b 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d /* Next winShm
13d3c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 with the same w
13d3d 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0d 0a 20 20 inShmNode */..
13d3e 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 u8 hasMutex;
13d3f 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
13d40 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 ue if holding th
13d41 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 e winShmNode mut
13d42 65 78 20 2a 2f 0d 0a 20 20 75 31 36 20 73 68 61 ex */.. u16 sha
13d43 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 redMask;
13d44 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 /* Mask of s
13d45 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 hared locks held
13d46 20 2a 2f 0d 0a 20 20 75 31 36 20 65 78 63 6c 4d */.. u16 exclM
13d47 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 ask;
13d48 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 /* Mask of exc
13d49 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c lusive locks hel
13d4a 64 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c d */..#ifdef SQL
13d4b 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 75 38 20 ITE_DEBUG.. u8
13d4c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 id;
13d4d 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 /* Id of
13d4e 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
13d4f 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d with its winShm
13d50 4e 6f 64 65 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d Node */..#endif.
13d51 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f .};..../*..** Co
13d52 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 nstants used for
13d53 20 6c 6f 63 6b 69 6e 67 0d 0a 2a 2f 0d 0a 23 64 locking..*/..#d
13d54 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 efine WIN_SHM_BA
13d55 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 SE ((22+SQLITE
13d56 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 _SHM_NLOCK)*4)
13d57 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c /* first l
13d58 6f 63 6b 20 62 79 74 65 20 2a 2f 0d 0a 23 64 65 ock byte */..#de
13d59 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 fine WIN_SHM_DMS
13d5a 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 (WIN_SHM_BAS
13d5b 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f E+SQLITE_SHM_NLO
13d5c 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 CK) /* deadman
13d5d 73 77 69 74 63 68 20 2a 2f 0d 0a 0d 0a 2f 2a 0d switch */..../*.
13d5e 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f .** Apply adviso
13d5f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c ry locks for all
13d60 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 n bytes beginni
13d61 6e 67 20 61 74 20 6f 66 73 74 2e 0d 0a 2a 2f 0d ng at ofst...*/.
13d62 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e .#define _SHM_UN
13d63 4c 43 4b 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 LCK 1..#define
13d64 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0d 0a 23 _SHM_RDLCK 2..#
13d65 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 define _SHM_WRLC
13d66 4b 20 20 33 0d 0a 73 74 61 74 69 63 20 69 6e 74 K 3..static int
13d67 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 winShmSystemLoc
13d68 6b 28 0d 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 k(.. winShmNode
13d69 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 *pFile, /* A
13d6a 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 pply locks to th
13d6b 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d is open shared-m
13d6c 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f emory segment */
13d6d 0d 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 .. int lockType
13d6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 , /* _SH
13d6f 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 M_UNLCK, _SHM_RD
13d70 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c LCK, or _SHM_WRL
13d71 43 4b 20 2a 2f 0d 0a 20 20 69 6e 74 20 6f 66 73 CK */.. int ofs
13d72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f t, /
13d73 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 * Offset to firs
13d74 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 t byte to be loc
13d75 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0d ked/unlocked */.
13d76 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 . int nByte
13d77 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
13d78 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c er of bytes to l
13d79 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f ock or unlock */
13d7a 0d 0a 29 7b 0d 0a 20 20 4f 56 45 52 4c 41 50 50 ..){.. OVERLAPP
13d7b 45 44 20 6f 76 6c 70 3b 0d 0a 20 20 44 57 4f 52 ED ovlp;.. DWOR
13d7c 44 20 64 77 46 6c 61 67 73 3b 0d 0a 20 20 69 6e D dwFlags;.. in
13d7d 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 t rc = 0;
13d7e 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f /* Result co
13d7f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c de form Lock/Unl
13d80 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0d 0a ockFileEx() */..
13d81 0d 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f .. /* Access to
13d82 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 the winShmNode
13d83 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c object is serial
13d84 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c ized by the call
13d85 65 72 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 er */.. assert(
13d86 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
13d87 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 eld(pFile->mutex
13d88 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 ) || pFile->nRef
13d89 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 ==0 );.... /* I
13d8a 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f nitialize the lo
13d8b 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 cking parameters
13d8c 20 2a 2f 0d 0a 20 20 64 77 46 6c 61 67 73 20 3d */.. dwFlags =
13d8d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 LOCKFILE_FAIL_I
13d8e 4d 4d 45 44 49 41 54 45 4c 59 3b 0d 0a 20 20 69 MMEDIATELY;.. i
13d8f 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f f( lockType == _
13d90 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c SHM_WRLCK ) dwFl
13d91 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f ags |= LOCKFILE_
13d92 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0d EXCLUSIVE_LOCK;.
13d93 0a 0d 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c ... memset(&ovl
13d94 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 p, 0, sizeof(OVE
13d95 52 4c 41 50 50 45 44 29 29 3b 0d 0a 20 20 6f 76 RLAPPED));.. ov
13d96 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 lp.Offset = ofst
13d97 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 ;.... /* Releas
13d98 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 e/Acquire the sy
13d99 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 stem-level lock
13d9a 2a 2f 0d 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 */.. if( lockTy
13d9b 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 pe==_SHM_UNLCK )
13d9c 7b 0d 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e {.. rc = osUn
13d9d 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 lockFileEx(pFile
13d9e 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 ->hFile.h, 0, nB
13d9f 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0d yte, 0, &ovlp);.
13da0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 . }else{.. r
13da1 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 c = osLockFileEx
13da2 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c (pFile->hFile.h,
13da3 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 dwFlags, 0, nBy
13da4 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0d 0a te, 0, &ovlp);..
13da5 20 20 7d 0d 0a 20 20 0d 0a 20 20 69 66 28 20 72 }.. .. if( r
13da6 63 21 3d 20 30 20 29 7b 0d 0a 20 20 20 20 72 63 c!= 0 ){.. rc
13da7 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 = SQLITE_OK;..
13da8 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 46 69 }else{.. pFi
13da9 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
13daa 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
13dab 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c );.. rc = SQL
13dac 49 54 45 5f 42 55 53 59 3b 0d 0a 20 20 7d 0d 0a ITE_BUSY;.. }..
13dad 0d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 .. OSTRACE(("SH
13dae 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20 M-LOCK %d %s %s
13daf 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0d 0a 20 20 0x%08lx\n", ..
13db0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
13db1 68 46 69 6c 65 2e 68 2c 0d 0a 20 20 20 20 20 20 hFile.h,..
13db2 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f rc==SQLITE_
13db3 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 OK ? "ok" : "fai
13db4 6c 65 64 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 led",..
13db5 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d lockType==_SHM
13db6 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b _UNLCK ? "Unlock
13db7 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 FileEx" : "LockF
13db8 69 6c 65 45 78 22 2c 0d 0a 20 20 20 20 20 20 20 ileEx",..
13db9 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
13dba 72 72 6e 6f 29 29 3b 0d 0a 0d 0a 20 20 72 65 74 rrno));.... ret
13dbb 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
13dbc 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e Forward referen
13dbd 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f ces to VFS metho
13dbe 64 73 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ds */..static in
13dbf 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 t winOpen(sqlite
13dc0 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 3_vfs*,const cha
13dc1 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a r*,sqlite3_file*
13dc2 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0d 0a 73 74 61 ,int,int*);..sta
13dc3 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 tic int winDelet
13dc4 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c e(sqlite3_vfs *,
13dc5 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 const char*,int)
13dc6 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 75 72 67 ;..../*..** Purg
13dc7 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 e the winShmNode
13dc8 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c List list of all
13dc9 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 entries with wi
13dca 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 nShmNode.nRef==0
13dcb 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 ...**..** This i
13dcc 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 s not a VFS shar
13dcd 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 ed-memory method
13dce 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 ; it is a utilit
13dcf 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 y function calle
13dd0 64 0d 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 d..** by VFS sha
13dd1 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f red-memory metho
13dd2 64 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ds...*/..static
13dd3 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 void winShmPurge
13dd4 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
13dd5 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c fs, int deleteFl
13dd6 61 67 29 7b 0d 0a 20 20 77 69 6e 53 68 6d 4e 6f ag){.. winShmNo
13dd7 64 65 20 2a 2a 70 70 3b 0d 0a 20 20 77 69 6e 53 de **pp;.. winS
13dd8 68 6d 4e 6f 64 65 20 2a 70 3b 0d 0a 20 20 42 4f hmNode *p;.. BO
13dd9 4f 4c 20 62 52 63 3b 0d 0a 20 20 61 73 73 65 72 OL bRc;.. asser
13dda 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 t( winShmMutexHe
13ddb 6c 64 28 29 20 29 3b 0d 0a 20 20 70 70 20 3d 20 ld() );.. pp =
13ddc 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b &winShmNodeList;
13ddd 0d 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 .. while( (p =
13dde 2a 70 70 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 *pp)!=0 ){..
13ddf 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 if( p->nRef==0 )
13de0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0d {.. int i;.
13de1 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 . if( p->mu
13de2 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 tex ) sqlite3_mu
13de3 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 tex_free(p->mute
13de4 78 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 x);.. for(i
13de5 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e =0; i<p->nRegion
13de6 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 ; i++){..
13de7 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 bRc = osUnmapVi
13de8 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 ewOfFile(p->aReg
13de9 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0d 0a 20 ion[i].pMap);..
13dea 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 OSTRACE((
13deb 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 "SHM-PURGE pid-%
13dec 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 d unmap region=%
13ded 64 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 d %s\n",..
13dee 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 (int)
13def 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 osGetCurrentProc
13df0 65 73 73 49 64 28 29 2c 20 69 2c 0d 0a 20 20 20 essId(), i,..
13df1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 bR
13df2 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c c ? "ok" : "fail
13df3 65 64 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 ed"));..
13df4 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e bRc = osCloseHan
13df5 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 dle(p->aRegion[i
13df6 5d 2e 68 4d 61 70 29 3b 0d 0a 20 20 20 20 20 20 ].hMap);..
13df7 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d OSTRACE(("SHM-
13df8 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f PURGE pid-%d clo
13df9 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c se region=%d %s\
13dfa 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 n",..
13dfb 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 (int)osGet
13dfc 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 CurrentProcessId
13dfd 28 29 2c 20 69 2c 0d 0a 20 20 20 20 20 20 20 20 (), i,..
13dfe 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 bRc ? "
13dff 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 ok" : "failed"))
13e00 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
13e01 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 if( p->hFile.h
13e02 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 != INVALID_HAND
13e03 4c 45 5f 56 41 4c 55 45 20 29 7b 0d 0a 20 20 20 LE_VALUE ){..
13e04 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 SimulateIOE
13e05 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0d 0a rrorBenign(1);..
13e06 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 winClose
13e07 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a ((sqlite3_file *
13e08 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0d 0a 20 20 )&p->hFile);..
13e09 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f SimulateIO
13e0a 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0d ErrorBenign(0);.
13e0b 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
13e0c 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 if( deleteFlag )
13e0d 7b 0d 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c {.. Simul
13e0e 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e ateIOErrorBenign
13e0f 28 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 (1);.. sq
13e10 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e lite3BeginBenign
13e11 4d 61 6c 6c 6f 63 28 29 3b 0d 0a 20 20 20 20 20 Malloc();..
13e12 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 winDelete(pVf
13e13 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c s, p->zFilename,
13e14 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 0);.. sq
13e15 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
13e16 6c 6c 6f 63 28 29 3b 0d 0a 20 20 20 20 20 20 20 lloc();..
13e17 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
13e18 42 65 6e 69 67 6e 28 30 29 3b 0d 0a 20 20 20 20 Benign(0);..
13e19 20 20 7d 0d 0a 20 20 20 20 20 20 2a 70 70 20 3d }.. *pp =
13e1a 20 70 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 p->pNext;..
13e1b 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
13e1c 2d 3e 61 52 65 67 69 6f 6e 29 3b 0d 0a 20 20 20 ->aRegion);..
13e1d 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
13e1e 70 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d p);.. }else{.
13e1f 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e . pp = &p->
13e20 70 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 pNext;.. }..
13e21 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 }..}..../*..**
13e22 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d Open the shared-
13e23 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f memory area asso
13e24 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 ciated with data
13e25 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e base file pDbFd.
13e26 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 6f 70 ..**..** When op
13e27 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 ening a new shar
13e28 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 ed-memory file,
13e29 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 if no other inst
13e2a 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0d 0a 2a ances of that..*
13e2b 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 * file are curre
13e2c 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 ntly open, in th
13e2d 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e is process or in
13e2e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 other processes
13e2f 2c 20 74 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 66 , then..** the f
13e30 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e ile must be trun
13e31 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 cated to zero le
13e32 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 ngth or have its
13e33 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e header cleared.
13e34 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
13e35 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 winOpenSharedMe
13e36 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 mory(winFile *pD
13e37 62 46 64 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 bFd){.. struct
13e38 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 winShm *p;
13e39 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
13e3a 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f he connection to
13e3b 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0d 0a 20 be opened */..
13e3c 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f struct winShmNo
13e3d 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 de *pShmNode = 0
13e3e 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 ; /* The under
13e3f 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 lying mmapped fi
13e40 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 3b le */.. int rc;
13e41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e42 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
13e43 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0d 0a 20 esult code */..
13e44 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f struct winShmNo
13e45 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 de *pNew;
13e46 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c /* Newly all
13e47 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 ocated winShmNod
13e48 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4e 61 6d e */.. int nNam
13e49 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
13e4a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
13e4b 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 ze of zName in b
13e4c 79 74 65 73 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 ytes */.... ass
13e4d 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d ert( pDbFd->pShm
13e4e 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 ==0 ); /* Not
13e4f 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e previously open
13e50 65 64 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 41 6c ed */.... /* Al
13e51 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 locate space for
13e52 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 the new sqlite3
13e53 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c _shm object. Al
13e54 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 so speculatively
13e55 0d 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 .. ** allocate
13e56 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 space for a new
13e57 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 winShmNode and f
13e58 69 6c 65 6e 61 6d 65 2e 0d 0a 20 20 2a 2f 0d 0a ilename... */..
13e59 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 p = sqlite3_ma
13e5a 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 lloc( sizeof(*p)
13e5b 20 29 3b 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 );.. if( p==0
13e5c 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
13e5d 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 IOERR_NOMEM;..
13e5e 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a memset(p, 0, siz
13e5f 65 6f 66 28 2a 70 29 29 3b 0d 0a 20 20 6e 4e 61 eof(*p));.. nNa
13e60 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c me = sqlite3Strl
13e61 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 en30(pDbFd->zPat
13e62 68 29 3b 0d 0a 20 20 70 4e 65 77 20 3d 20 73 71 h);.. pNew = sq
13e63 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 lite3_malloc( si
13e64 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 zeof(*pShmNode)
13e65 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0d + nName + 17 );.
13e66 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 . if( pNew==0 )
13e67 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 {.. sqlite3_f
13e68 72 65 65 28 70 29 3b 0d 0a 20 20 20 20 72 65 74 ree(p);.. ret
13e69 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
13e6a 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20 20 _NOMEM;.. }..
13e6b 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 memset(pNew, 0,
13e6c 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 sizeof(*pNew) +
13e6d 6e 4e 61 6d 65 20 2b 20 31 37 29 3b 0d 0a 20 20 nName + 17);..
13e6e 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 pNew->zFilename
13e6f 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 = (char*)&pNew[1
13e70 5d 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e ];.. sqlite3_sn
13e71 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c printf(nName+15,
13e72 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 pNew->zFilename
13e73 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 , "%s-shm", pDbF
13e74 64 2d 3e 7a 50 61 74 68 29 3b 0d 0a 20 20 73 71 d->zPath);.. sq
13e75 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 lite3FileSuffix3
13e76 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 (pDbFd->zPath, p
13e77 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b New->zFilename);
13e78 20 0d 0a 0d 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 .... /* Look t
13e79 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 o see if there i
13e7a 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 s an existing wi
13e7b 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 nShmNode that ca
13e7c 6e 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 2a 2a n be used... **
13e7d 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 If no matching
13e7e 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 winShmNode curre
13e7f 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 ntly exists, cre
13e80 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0d 0a ate a new one...
13e81 20 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 45 6e */.. winShmEn
13e82 74 65 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 66 terMutex();.. f
13e83 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 or(pShmNode = wi
13e84 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 nShmNodeList; pS
13e85 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 hmNode; pShmNode
13e86 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 =pShmNode->pNext
13e87 29 7b 0d 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e ){.. /* TBD n
13e88 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 eed to come up w
13e89 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 ith better match
13e8a 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0d here. Perhaps.
13e8b 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 . ** use FILE
13e8c 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 _ID_BOTH_DIR_INF
13e8d 4f 20 53 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 O Structure...
13e8e 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 73 71 */.. if( sq
13e8f 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 lite3StrICmp(pSh
13e90 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 mNode->zFilename
13e91 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d , pNew->zFilenam
13e92 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0d 0a e)==0 ) break;..
13e93 20 20 7d 0d 0a 20 20 69 66 28 20 70 53 68 6d 4e }.. if( pShmN
13e94 6f 64 65 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 ode ){.. sqli
13e95 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0d te3_free(pNew);.
13e96 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
13e97 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0d ShmNode = pNew;.
13e98 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0d 0a . pNew = 0;..
13e99 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 ((winFile*)(
13e9a 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 &pShmNode->hFile
13e9b 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f ))->h = INVALID_
13e9c 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0d 0a 20 HANDLE_VALUE;..
13e9d 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 pShmNode->pNe
13e9e 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c xt = winShmNodeL
13e9f 69 73 74 3b 0d 0a 20 20 20 20 77 69 6e 53 68 6d ist;.. winShm
13ea0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e NodeList = pShmN
13ea1 6f 64 65 3b 0d 0a 0d 0a 20 20 20 20 70 53 68 6d ode;.... pShm
13ea2 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 Node->mutex = sq
13ea3 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f lite3_mutex_allo
13ea4 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 c(SQLITE_MUTEX_F
13ea5 41 53 54 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 AST);.. if( p
13ea6 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d ShmNode->mutex==
13ea7 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 0 ){.. rc =
13ea8 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
13ea9 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 67 6f 74 6f MEM;.. goto
13eaa 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0d 0a shm_open_err;..
13eab 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 63 20 }.... rc
13eac 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d = winOpen(pDbFd-
13ead 3e 70 56 66 73 2c 0d 0a 20 20 20 20 20 20 20 20 >pVfs,..
13eae 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 pShmNod
13eaf 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 e->zFilename,
13eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
13eb1 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 e of the file (U
13eb2 54 46 2d 38 29 20 2a 2f 0d 0a 20 20 20 20 20 20 TF-8) */..
13eb3 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 (sqli
13eb4 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e te3_file*)&pShmN
13eb5 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 ode->hFile, /*
13eb6 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 File handle here
13eb7 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 */..
13eb8 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 SQLITE_OPE
13eb9 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f N_WAL | SQLITE_O
13eba 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 PEN_READWRITE |
13ebb 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
13ebc 54 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 TE, /* Mode flag
13ebd 73 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 s */..
13ebe 20 20 20 20 20 20 20 30 29 3b 0d 0a 20 20 20 20 0);..
13ebf 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 if( SQLITE_OK!=r
13ec0 63 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f c ){.. goto
13ec1 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0d 0a shm_open_err;..
13ec2 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
13ec3 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
13ec4 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 another process
13ec5 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 is holding the d
13ec6 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0d ead-man switch..
13ec7 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 . ** If not,
13ec8 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c truncate the fil
13ec9 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 e to zero length
13eca 2e 20 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 . .. */..
13ecb 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d if( winShmSystem
13ecc 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f Lock(pShmNode, _
13ecd 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 SHM_WRLCK, WIN_S
13ece 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 HM_DMS, 1)==SQLI
13ecf 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
13ed0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 rc = winTruncate
13ed1 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a ((sqlite3_file *
13ed2 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c )&pShmNode->hFil
13ed3 65 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 69 66 e, 0);.. if
13ed4 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
13ed5 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
13ed6 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
13ed7 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 ITE_IOERR_SHMOPE
13ed8 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f N, osGetLastErro
13ed9 72 28 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 r(),..
13eda 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 "winOpenS
13edb 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 hm", pDbFd->zPat
13edc 68 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 h);.. }..
13edd 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72 63 3d }.. if( rc=
13ede 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
13edf 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 winShmSyste
13ee0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 mLock(pShmNode,
13ee1 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f _SHM_UNLCK, WIN_
13ee2 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0d 0a 20 20 SHM_DMS, 1);..
13ee3 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 rc = winShmS
13ee4 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f ystemLock(pShmNo
13ee5 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 de, _SHM_RDLCK,
13ee6 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b WIN_SHM_DMS, 1);
13ee7 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
13ee8 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f rc ) goto shm_o
13ee9 70 65 6e 5f 65 72 72 3b 0d 0a 20 20 7d 0d 0a 0d pen_err;.. }...
13eea 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e . /* Make the n
13eeb 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 ew connection a
13eec 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e child of the win
13eed 53 68 6d 4e 6f 64 65 20 2a 2f 0d 0a 20 20 70 2d ShmNode */.. p-
13eee 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d >pShmNode = pShm
13eef 4e 6f 64 65 3b 0d 0a 23 69 66 64 65 66 20 53 51 Node;..#ifdef SQ
13ef0 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 70 2d LITE_DEBUG.. p-
13ef1 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e >id = pShmNode->
13ef2 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0d 0a 23 65 nextShmId++;..#e
13ef3 6e 64 69 66 0d 0a 20 20 70 53 68 6d 4e 6f 64 65 ndif.. pShmNode
13ef4 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 20 20 70 44 62 ->nRef++;.. pDb
13ef5 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0d 0a 20 Fd->pShm = p;..
13ef6 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 winShmLeaveMute
13ef7 78 28 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 x();.... /* The
13ef8 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
13ef9 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 on pShmNode has
13efa 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e already been in
13efb 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0d cremented under.
13efc 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 . ** the cover
13efd 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 of the winShmEnt
13efe 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 erMutex() mutex
13eff 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 and the pointer
13f00 66 72 6f 6d 20 74 68 65 0d 0a 20 20 2a 2a 20 6e from the.. ** n
13f01 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 ew (struct winSh
13f02 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 m) object to the
13f03 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 pShmNode has be
13f04 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 en set. All that
13f05 20 69 73 0d 0a 20 20 2a 2a 20 6c 65 66 74 20 74 is.. ** left t
13f06 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 o do is to link
13f07 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 the new object i
13f08 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c nto the linked l
13f09 69 73 74 20 73 74 61 72 74 69 6e 67 0d 0a 20 20 ist starting..
13f0a 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e ** at pShmNode->
13f0b 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 pFirst. This mus
13f0c 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 t be done while
13f0d 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d holding the pShm
13f0e 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0d 0a 20 20 Node->mutex ..
13f0f 2a 2a 20 6d 75 74 65 78 2e 0d 0a 20 20 2a 2f 0d ** mutex... */.
13f10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
13f11 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d _enter(pShmNode-
13f12 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 70 2d 3e 70 >mutex);.. p->p
13f13 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d Next = pShmNode-
13f14 3e 70 46 69 72 73 74 3b 0d 0a 20 20 70 53 68 6d >pFirst;.. pShm
13f15 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 Node->pFirst = p
13f16 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 ;.. sqlite3_mut
13f17 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 ex_leave(pShmNod
13f18 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 72 65 e->mutex);.. re
13f19 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
13f1a 0a 0d 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 ... /* Jump her
13f1b 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a e on any error *
13f1c 2f 0d 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a /..shm_open_err:
13f1d 0d 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d .. winShmSystem
13f1e 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f Lock(pShmNode, _
13f1f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 SHM_UNLCK, WIN_S
13f20 48 4d 5f 44 4d 53 2c 20 31 29 3b 0d 0a 20 20 77 HM_DMS, 1);.. w
13f21 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 inShmPurge(pDbFd
13f22 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 ->pVfs, 0);
13f23 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 /* This call fr
13f24 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 ees pShmNode if
13f25 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20 73 required */.. s
13f26 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d qlite3_free(p);.
13f27 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 . sqlite3_free(
13f28 70 4e 65 77 29 3b 0d 0a 20 20 77 69 6e 53 68 6d pNew);.. winShm
13f29 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 20 LeaveMutex();..
13f2a 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
13f2b 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 20 61 ../*..** Close a
13f2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 connection to s
13f2d 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 hared-memory. D
13f2e 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c elete the underl
13f2f 79 69 6e 67 20 0d 0a 2a 2a 20 73 74 6f 72 61 67 ying ..** storag
13f30 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 e if deleteFlag
13f31 69 73 20 74 72 75 65 2e 0d 0a 2a 2f 0d 0a 73 74 is true...*/..st
13f32 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 atic int winShmU
13f33 6e 6d 61 70 28 0d 0a 20 20 73 71 6c 69 74 65 33 nmap(.. sqlite3
13f34 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 _file *fd,
13f35 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
13f36 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d holding shared m
13f37 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 69 6e 74 20 emory */.. int
13f38 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 deleteFlag
13f39 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 /* Delete
13f3a 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 after closing i
13f3b 66 20 74 72 75 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 f true */..){..
13f3c 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b winFile *pDbFd;
13f3d 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
13f3e 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 se holding share
13f3f 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 77 d-memory */.. w
13f40 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 inShm *p;
13f41 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e /* The conn
13f42 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f ection to be clo
13f43 73 65 64 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d sed */.. winShm
13f44 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 Node *pShmNode;
13f45 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e /* The underlyin
13f46 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 g shared-memory
13f47 66 69 6c 65 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 file */.. winSh
13f48 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 m **pp;
13f49 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 /* For looping
13f4a 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e over sibling con
13f4b 6e 65 63 74 69 6f 6e 73 20 2a 2f 0d 0a 0d 0a 20 nections */....
13f4c 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c pDbFd = (winFil
13f4d 65 2a 29 66 64 3b 0d 0a 20 20 70 20 3d 20 70 44 e*)fd;.. p = pD
13f4e 62 46 64 2d 3e 70 53 68 6d 3b 0d 0a 20 20 69 66 bFd->pShm;.. if
13f4f 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ( p==0 ) return
13f50 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 70 53 SQLITE_OK;.. pS
13f51 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d hmNode = p->pShm
13f52 4e 6f 64 65 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 Node;.... /* Re
13f53 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 move connection
13f54 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f p from the set o
13f55 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 f connections as
13f56 73 6f 63 69 61 74 65 64 0d 0a 20 20 2a 2a 20 77 sociated.. ** w
13f57 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0d ith pShmNode */.
13f58 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
13f59 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d _enter(pShmNode-
13f5a 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 66 6f 72 28 >mutex);.. for(
13f5b 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 pp=&pShmNode->pF
13f5c 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 irst; (*pp)!=p;
13f5d 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 pp = &(*pp)->pNe
13f5e 78 74 29 7b 7d 0d 0a 20 20 2a 70 70 20 3d 20 70 xt){}.. *pp = p
13f5f 2d 3e 70 4e 65 78 74 3b 0d 0a 0d 0a 20 20 2f 2a ->pNext;.... /*
13f60 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 Free the connec
13f61 74 69 6f 6e 20 70 20 2a 2f 0d 0a 20 20 73 71 6c tion p */.. sql
13f62 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20 ite3_free(p);..
13f63 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 pDbFd->pShm = 0
13f64 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 ;.. sqlite3_mut
13f65 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 ex_leave(pShmNod
13f66 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 e->mutex);....
13f67 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e /* If pShmNode->
13f68 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 nRef has reached
13f69 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 0, then close t
13f6a 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0d 0a 20 he underlying..
13f6b 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 ** shared-memor
13f6c 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0d 0a y file, too */..
13f6d 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 winShmEnterMut
13f6e 65 78 28 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ex();.. assert(
13f6f 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e pShmNode->nRef>
13f70 30 20 29 3b 0d 0a 20 20 70 53 68 6d 4e 6f 64 65 0 );.. pShmNode
13f71 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a 20 20 69 66 28 ->nRef--;.. if(
13f72 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d pShmNode->nRef=
13f73 3d 30 20 29 7b 0d 0a 20 20 20 20 77 69 6e 53 68 =0 ){.. winSh
13f74 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 mPurge(pDbFd->pV
13f75 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b fs, deleteFlag);
13f76 0d 0a 20 20 7d 0d 0a 20 20 77 69 6e 53 68 6d 4c .. }.. winShmL
13f77 65 61 76 65 4d 75 74 65 78 28 29 3b 0d 0a 0d 0a eaveMutex();....
13f78 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
13f79 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a OK;..}..../*..**
13f7a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b Change the lock
13f7b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 state for a sha
13f7c 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 red-memory segme
13f7d 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 nt...*/..static
13f7e 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0d int winShmLock(.
13f7f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 . sqlite3_file
13f80 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a *fd, /*
13f81 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 Database file h
13f82 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 olding the share
13f83 64 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 69 d memory */.. i
13f84 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 nt ofst,
13f85 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
13f86 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 st lock to acqui
13f87 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f re or release */
13f88 0d 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 .. int n,
13f89 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
13f8a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b * Number of lock
13f8b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 s to acquire or
13f8c 72 65 6c 65 61 73 65 20 2a 2f 0d 0a 20 20 69 6e release */.. in
13f8d 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 t flags
13f8e 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 /* What
13f8f 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 to do with the
13f90 6c 6f 63 6b 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 77 lock */..){.. w
13f91 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 inFile *pDbFd =
13f92 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 (winFile*)fd;
13f93 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 /* Connecti
13f94 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 on holding share
13f95 64 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20 77 d memory */.. w
13f96 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 inShm *p = pDbFd
13f97 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 ->pShm;
13f98 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 /* The shar
13f99 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 ed memory being
13f9a 6c 6f 63 6b 65 64 20 2a 2f 0d 0a 20 20 77 69 6e locked */.. win
13f9b 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 Shm *pX;
13f9c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13f9d 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e /* For loopin
13f9e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 g over all sibli
13f9f 6e 67 73 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d ngs */.. winShm
13fa0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d Node *pShmNode =
13fa1 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0d 0a 20 p->pShmNode;..
13fa2 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
13fa3 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 _OK;
13fa4 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 /* Result
13fa5 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 75 31 36 20 code */.. u16
13fa6 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 mask;
13fa7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13fa8 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 /* Mask of loc
13fa9 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 ks to take or re
13faa 6c 65 61 73 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 lease */.... as
13fab 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 sert( ofst>=0 &&
13fac 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f ofst+n<=SQLITE_
13fad 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0d 0a 20 20 SHM_NLOCK );..
13fae 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0d assert( n>=1 );.
13faf 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 . assert( flags
13fb0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f ==(SQLITE_SHM_LO
13fb1 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f CK | SQLITE_SHM_
13fb2 53 48 41 52 45 44 29 0d 0a 20 20 20 20 20 20 20 SHARED)..
13fb3 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 || flags==(SQLIT
13fb4 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c E_SHM_LOCK | SQL
13fb5 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 ITE_SHM_EXCLUSIV
13fb6 45 29 0d 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c E).. || fl
13fb7 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d ags==(SQLITE_SHM
13fb8 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 _UNLOCK | SQLITE
13fb9 5f 53 48 4d 5f 53 48 41 52 45 44 29 0d 0a 20 20 _SHM_SHARED)..
13fba 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 || flags==(
13fbb 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 SQLITE_SHM_UNLOC
13fbc 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 K | SQLITE_SHM_E
13fbd 58 43 4c 55 53 49 56 45 29 20 29 3b 0d 0a 20 20 XCLUSIVE) );..
13fbe 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 assert( n==1 ||
13fbf 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f (flags & SQLITE_
13fc0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d SHM_EXCLUSIVE)!=
13fc1 30 20 29 3b 0d 0a 0d 0a 20 20 6d 61 73 6b 20 3d 0 );.... mask =
13fc2 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 (u16)((1U<<(ofs
13fc3 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 t+n)) - (1U<<ofs
13fc4 74 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 t));.. assert(
13fc5 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c n>1 || mask==(1<
13fc6 3c 6f 66 73 74 29 20 29 3b 0d 0a 20 20 73 71 6c <ofst) );.. sql
13fc7 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 ite3_mutex_enter
13fc8 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 (pShmNode->mutex
13fc9 29 3b 0d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 );.. if( flags
13fca 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c & SQLITE_SHM_UNL
13fcb 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 75 31 36 20 OCK ){.. u16
13fcc 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 allMask = 0; /*
13fcd 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 Mask of locks he
13fce 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a ld by siblings *
13fcf 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 65 65 20 /.... /* See
13fd0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 if any siblings
13fd1 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c hold this same l
13fd2 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 ock */.. for(
13fd3 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 pX=pShmNode->pFi
13fd4 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e rst; pX; pX=pX->
13fd5 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 69 pNext){.. i
13fd6 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 f( pX==p ) conti
13fd7 6e 75 65 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 nue;.. asse
13fd8 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 rt( (pX->exclMas
13fd9 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b k & (p->exclMask
13fda 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 |p->sharedMask))
13fdb 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 61 6c ==0 );.. al
13fdc 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 lMask |= pX->sha
13fdd 72 65 64 4d 61 73 6b 3b 0d 0a 20 20 20 20 7d 0d redMask;.. }.
13fde 0a 0d 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b ... /* Unlock
13fdf 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 the system-leve
13fe0 6c 20 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 20 20 l locks */..
13fe1 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d if( (mask & allM
13fe2 61 73 6b 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 ask)==0 ){..
13fe3 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 rc = winShmSys
13fe4 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 temLock(pShmNode
13fe5 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 , _SHM_UNLCK, of
13fe6 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c st+WIN_SHM_BASE,
13fe7 20 6e 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b n);.. }else{
13fe8 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c .. rc = SQL
13fe9 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a ITE_OK;.. }..
13fea 0d 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 .. /* Undo th
13feb 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f e local locks */
13fec 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
13fed 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
13fee 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d p->exclMask &=
13fef 20 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 20 20 70 ~mask;.. p
13ff0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 ->sharedMask &=
13ff1 7e 6d 61 73 6b 3b 0d 0a 20 20 20 20 7d 20 0d 0a ~mask;.. } ..
13ff2 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 }else if( flag
13ff3 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 s & SQLITE_SHM_S
13ff4 48 41 52 45 44 20 29 7b 0d 0a 20 20 20 20 75 31 HARED ){.. u1
13ff5 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 6 allShared = 0;
13ff6 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f /* Union of lo
13ff7 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e cks held by conn
13ff8 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 ections other th
13ff9 61 6e 20 22 70 22 20 2a 2f 0d 0a 0d 0a 20 20 20 an "p" */....
13ffa 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 /* Find out whi
13ffb 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 ch shared locks
13ffc 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 are already held
13ffd 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e by sibling conn
13ffe 65 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2a 2a ections... **
13fff 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 If any sibling
14000 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e already holds an
14001 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c exclusive lock,
14002 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 go ahead and re
14003 74 75 72 6e 0d 0a 20 20 20 20 2a 2a 20 53 51 4c turn.. ** SQL
14004 49 54 45 5f 42 55 53 59 2e 0d 0a 20 20 20 20 2a ITE_BUSY... *
14005 2f 0d 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 /.. for(pX=pS
14006 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 hmNode->pFirst;
14007 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 pX; pX=pX->pNext
14008 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28 70 ){.. if( (p
14009 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 X->exclMask & ma
1400a 73 6b 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 20 sk)!=0 ){..
1400b 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
1400c 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 USY;.. br
1400d 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 eak;.. }..
1400e 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c allShared |
1400f 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b = pX->sharedMask
14010 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
14011 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f /* Get shared lo
14012 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 cks at the syste
14013 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 m level, if nece
14014 73 73 61 72 79 20 2a 2f 0d 0a 20 20 20 20 69 66 ssary */.. if
14015 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
14016 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28 61 ){.. if( (a
14017 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 llShared & mask)
14018 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ==0 ){..
14019 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 rc = winShmSyste
1401a 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 mLock(pShmNode,
1401b 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 _SHM_RDLCK, ofst
1401c 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e +WIN_SHM_BASE, n
1401d 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b );.. }else{
1401e 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 .. rc = S
1401f 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 QLITE_OK;..
14020 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 }.. }....
14021 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 /* Get the loca
14022 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a l shared locks *
14023 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 /.. if( rc==S
14024 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
14025 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b p->sharedMask
14026 20 7c 3d 20 6d 61 73 6b 3b 0d 0a 20 20 20 20 7d |= mask;.. }
14027 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
14028 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 /* Make sure no
14029 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 sibling connecti
1402a 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 ons hold locks t
1402b 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 hat will block t
1402c 68 69 73 0d 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b his.. ** lock
1402d 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 . If any do, re
1402e 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 turn SQLITE_BUSY
1402f 20 72 69 67 68 74 20 61 77 61 79 2e 0d 0a 20 20 right away...
14030 20 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 70 58 */.. for(pX
14031 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 =pShmNode->pFirs
14032 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e t; pX; pX=pX->pN
14033 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 ext){.. if(
14034 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 (pX->exclMask &
14035 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 mask)!=0 || (pX
14036 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d ->sharedMask & m
14037 61 73 6b 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 ask)!=0 ){..
14038 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
14039 42 55 53 59 3b 0d 0a 20 20 20 20 20 20 20 20 62 BUSY;.. b
1403a 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a reak;.. }..
1403b 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 2f }.. .. /
1403c 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 * Get the exclus
1403d 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 ive locks at the
1403e 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 system level.
1403f 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 Then if successf
14040 75 6c 0d 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 ul.. ** also
14041 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 mark the local c
14042 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 onnection as bei
14043 6e 67 20 6c 6f 63 6b 65 64 2e 0d 0a 20 20 20 20 ng locked...
14044 2a 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d */.. if( rc==
14045 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
14046 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 rc = winShmS
14047 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f ystemLock(pShmNo
14048 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 de, _SHM_WRLCK,
14049 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 ofst+WIN_SHM_BAS
1404a 45 2c 20 6e 29 3b 0d 0a 20 20 20 20 20 20 69 66 E, n);.. if
1404b 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1404c 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 ){.. asse
1404d 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 rt( (p->sharedMa
1404e 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b sk & mask)==0 );
1404f 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 .. p->exc
14050 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0d 0a lMask |= mask;..
14051 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
14052 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d }.. sqlite3_m
14053 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e utex_leave(pShmN
14054 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 ode->mutex);..
14055 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f OSTRACE(("SHM-LO
14056 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 CK shmid-%d, pid
14057 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 -%d got %03x,%03
14058 78 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 x %s\n",..
14059 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 p->id, (int
1405a 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f )osGetCurrentPro
1405b 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 cessId(), p->sha
1405c 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c redMask, p->excl
1405d 4d 61 73 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 Mask,..
1405e 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 rc ? "failed"
1405f 3a 20 22 6f 6b 22 29 29 3b 0d 0a 20 20 72 65 74 : "ok"));.. ret
14060 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
14061 0d 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 ..** Implement a
14062 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 memory barrier
14063 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 or memory fence
14064 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 on shared memory
14065 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 . ..**..** All
14066 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 loads and stores
14067 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 begun before th
14068 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 e barrier must c
14069 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0d 0a omplete before..
1406a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 ** any load or s
1406b 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 tore begun after
1406c 20 74 68 65 20 62 61 72 72 69 65 72 2e 0d 0a 2a the barrier...*
1406d 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 /..static void w
1406e 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0d 0a 20 inShmBarrier(..
1406f 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 sqlite3_file *f
14070 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 d /* Da
14071 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 tabase holding t
14072 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 he shared memory
14073 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 55 4e 55 53 45 */..){.. UNUSE
14074 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b D_PARAMETER(fd);
14075 0d 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 .. /* MemoryBar
14076 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 rier(); // does
14077 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e not work -- do n
14078 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 ot know why not
14079 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 */.. winShmEnte
1407a 72 4d 75 74 65 78 28 29 3b 0d 0a 20 20 77 69 6e rMutex();.. win
1407b 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b ShmLeaveMutex();
1407c 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
1407d 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
1407e 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 alled to obtain
1407f 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 a pointer to reg
14080 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 ion iRegion of t
14081 68 65 20 0d 0a 2a 2a 20 73 68 61 72 65 64 2d 6d he ..** shared-m
14082 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 emory associated
14083 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 with the databa
14084 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 se file fd. Shar
14085 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e ed-memory region
14086 73 20 0d 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 s ..** are numbe
14087 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f red starting fro
14088 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 m zero. Each sha
14089 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f red-memory regio
1408a 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0d 0a n is szRegion ..
1408b 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 ** bytes in size
1408c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 ...**..** If an
1408d 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e error occurs, an
1408e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 error code is r
1408f 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 eturned and *pp
14090 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0d is set to NULL..
14091 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 .**..** Otherwis
14092 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74 e, if the isWrit
14093 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 e parameter is 0
14094 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 and the request
14095 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 ed shared-memory
14096 0d 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 ..** region has
14097 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 not been allocat
14098 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e ed (by any clien
14099 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 t, including one
1409a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0d 0a 2a running in a..*
1409b 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 * separate proce
1409c 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 ss), then *pp is
1409d 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 set to NULL and
1409e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 SQLITE_OK retur
1409f 6e 65 64 2e 20 49 66 20 0d 0a 2a 2a 20 69 73 57 ned. If ..** isW
140a0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f rite is non-zero
140a1 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 and the request
140a2 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 ed shared-memory
140a3 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 region has not
140a4 79 65 74 20 0d 0a 2a 2a 20 62 65 65 6e 20 61 6c yet ..** been al
140a5 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 located, it is a
140a6 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 llocated by this
140a7 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a function...**..
140a8 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 ** If the shared
140a9 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 -memory region h
140aa 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
140ab 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 allocated or is
140ac 61 6c 6c 6f 63 61 74 65 64 20 62 79 0d 0a 2a 2a allocated by..**
140ad 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 this call as de
140ae 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 scribed above, t
140af 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 hen it is mapped
140b0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 into this proce
140b1 73 73 65 73 20 0d 0a 2a 2a 20 61 64 64 72 65 73 sses ..** addres
140b2 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 s space (if it i
140b3 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 s not already),
140b4 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f *pp is set to po
140b5 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 int to the mappe
140b6 64 20 0d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e d ..** memory an
140b7 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 d SQLITE_OK retu
140b8 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 rned...*/..stati
140b9 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 c int winShmMap(
140ba 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 .. sqlite3_file
140bb 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 *fd,
140bc 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 /* Handle op
140bd 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 en on database f
140be 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 52 ile */.. int iR
140bf 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 egion,
140c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 /* Reg
140c1 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 ion to retrieve
140c2 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 */.. int szRegi
140c3 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 on,
140c4 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
140c5 20 72 65 67 69 6f 6e 73 20 2a 2f 0d 0a 20 20 69 regions */.. i
140c6 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 nt isWrite,
140c7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
140c8 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 * True to extend
140c9 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 file if necessa
140ca 72 79 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 76 6f ry */.. void vo
140cb 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 latile **pp
140cc 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
140cd 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a Mapped memory *
140ce 2f 0d 0a 29 7b 0d 0a 20 20 77 69 6e 46 69 6c 65 /..){.. winFile
140cf 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 *pDbFd = (winFi
140d0 6c 65 2a 29 66 64 3b 0d 0a 20 20 77 69 6e 53 68 le*)fd;.. winSh
140d1 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 m *p = pDbFd->pS
140d2 68 6d 3b 0d 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 hm;.. winShmNod
140d3 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0d 0a 20 20 e *pShmNode;..
140d4 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
140d5 4f 4b 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 70 20 OK;.... if( !p
140d6 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 77 69 6e ){.. rc = win
140d7 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 OpenSharedMemory
140d8 28 70 44 62 46 64 29 3b 0d 0a 20 20 20 20 69 66 (pDbFd);.. if
140d9 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
140da 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 ) return rc;..
140db 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 p = pDbFd->pSh
140dc 6d 3b 0d 0a 20 20 7d 0d 0a 20 20 70 53 68 6d 4e m;.. }.. pShmN
140dd 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 ode = p->pShmNod
140de 65 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 5f e;.... sqlite3_
140df 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d mutex_enter(pShm
140e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 Node->mutex);..
140e1 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f assert( szRegio
140e2 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 n==pShmNode->szR
140e3 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 egion || pShmNod
140e4 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b e->nRegion==0 );
140e5 0d 0a 0d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f .... if( pShmNo
140e6 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 de->nRegion<=iRe
140e7 67 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 73 74 72 gion ){.. str
140e8 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 uct ShmRegion *a
140e9 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 pNew;
140ea 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d /* New aRegion[]
140eb 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 20 20 69 array */.. i
140ec 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 nt nByte = (iReg
140ed 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b ion+1)*szRegion;
140ee 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 /* Minimum req
140ef 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 uired file size
140f0 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f */.. sqlite3_
140f1 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 int64 sz;
140f2 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 /* Cu
140f3 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 rrent size of wa
140f4 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0d l-index file */.
140f5 0a 0d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d ... pShmNode-
140f6 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 >szRegion = szRe
140f7 67 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 gion;.... /*
140f8 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 The requested re
140f9 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 gion is not mapp
140fa 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f ed into this pro
140fb 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 cesses address s
140fc 70 61 63 65 2e 0d 0a 20 20 20 20 2a 2a 20 43 68 pace... ** Ch
140fd 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 eck to see if it
140fe 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 has been alloca
140ff 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 ted (i.e. if the
14100 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 wal-index file
14101 69 73 0d 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 is.. ** large
14102 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 enough to conta
14103 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 in the requested
14104 20 72 65 67 69 6f 6e 29 2e 0d 0a 20 20 20 20 2a region)... *
14105 2f 0d 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 /.. rc = winF
14106 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 ileSize((sqlite3
14107 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 _file *)&pShmNod
14108 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0d e->hFile, &sz);.
14109 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
1410a 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1410b 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f rc = winLogErro
1410c 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 r(SQLITE_IOERR_S
1410d 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 HMSIZE, osGetLas
1410e 74 45 72 72 6f 72 28 29 2c 0d 0a 20 20 20 20 20 tError(),..
1410f 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 "winSh
14110 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a mMap1", pDbFd->z
14111 50 61 74 68 29 3b 0d 0a 20 20 20 20 20 20 67 6f Path);.. go
14112 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0d to shmpage_out;.
14113 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 . }.... if
14114 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0d 0a 20 ( sz<nByte ){..
14115 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 /* The requ
14116 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 ested memory reg
14117 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 ion does not exi
14118 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 st. If isWrite i
14119 73 20 73 65 74 20 74 6f 0d 0a 20 20 20 20 20 20 s set to..
1411a 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 ** zero, exit ea
1411b 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 rly. *pp will be
1411c 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 set to NULL and
1411d 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 SQLITE_OK retur
1411e 6e 65 64 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a ned... **..
1411f 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 ** Alterna
14120 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 tively, if isWri
14121 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 te is non-zero,
14122 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 use ftruncate()
14123 74 6f 20 61 6c 6c 6f 63 61 74 65 0d 0a 20 20 20 to allocate..
14124 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 ** the reques
14125 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f ted memory regio
14126 6e 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 n... */..
14127 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 if( !isWrite
14128 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f ) goto shmpage_
14129 6f 75 74 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d out;.. rc =
1412a 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 winTruncate((sq
1412b 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 lite3_file *)&pS
1412c 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e hmNode->hFile, n
1412d 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 Byte);.. if
1412e 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1412f 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
14130 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
14131 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a ITE_IOERR_SHMSIZ
14132 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f E, osGetLastErro
14133 72 28 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 r(),..
14134 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 "winShmMa
14135 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 p2", pDbFd->zPat
14136 68 29 3b 0d 0a 20 20 20 20 20 20 20 20 67 6f 74 h);.. got
14137 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0d 0a o shmpage_out;..
14138 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
14139 0d 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 .. /* Map the
1413a 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 requested memor
1413b 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 y region into th
1413c 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 is processes add
1413d 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0d 0a ress space. */..
1413e 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 apNew = (str
1413f 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 uct ShmRegion *)
14140 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 sqlite3_realloc(
14141 0d 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f .. pShmNo
14142 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 de->aRegion, (iR
14143 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 egion+1)*sizeof(
14144 61 70 4e 65 77 5b 30 5d 29 0d 0a 20 20 20 20 29 apNew[0]).. )
14145 3b 0d 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 ;.. if( !apNe
14146 77 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d w ){.. rc =
14147 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
14148 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 67 6f 74 6f MEM;.. goto
14149 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0d 0a 20 shmpage_out;..
1414a 20 20 20 7d 0d 0a 20 20 20 20 70 53 68 6d 4e 6f }.. pShmNo
1414b 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 de->aRegion = ap
1414c 4e 65 77 3b 0d 0a 0d 0a 20 20 20 20 77 68 69 6c New;.... whil
1414d 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 e( pShmNode->nRe
1414e 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b gion<=iRegion ){
1414f 0d 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 .. HANDLE h
14150 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 Map;
14151 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 /* file-mapp
14152 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 ing handle */..
14153 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 void *pMap
14154 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
14155 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 /* Mapped memor
14156 79 20 72 65 67 69 6f 6e 20 2a 2f 0d 0a 20 20 20 y region */..
14157 20 20 0d 0a 20 20 20 20 20 20 68 4d 61 70 20 3d .. hMap =
14158 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 osCreateFileMap
14159 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 ping(pShmNode->h
1415a 46 69 6c 65 2e 68 2c 20 0d 0a 20 20 20 20 20 20 File.h, ..
1415b 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 NULL, PAGE_R
1415c 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 EADWRITE, 0, nBy
1415d 74 65 2c 20 4e 55 4c 4c 0d 0a 20 20 20 20 20 20 te, NULL..
1415e 29 3b 0d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 );.. OSTRAC
1415f 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d E(("SHM-MAP pid-
14160 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e %d create region
14161 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c =%d nbyte=%d %s\
14162 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 n",..
14163 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 (int)osGetCu
14164 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 rrentProcessId()
14165 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 , pShmNode->nReg
14166 69 6f 6e 2c 20 6e 42 79 74 65 2c 0d 0a 20 20 20 ion, nByte,..
14167 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 hMap
14168 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 ? "ok" : "faile
14169 64 22 29 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 d"));.. if(
1416a 20 68 4d 61 70 20 29 7b 0d 0a 20 20 20 20 20 20 hMap ){..
1416b 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 int iOffset =
1416c 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
1416d 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0d 0a 20 20 20 n*szRegion;..
1416e 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 int iOffset
1416f 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 Shift = iOffset
14170 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 % winSysInfo.dwA
14171 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 llocationGranula
14172 72 69 74 79 3b 0d 0a 20 20 20 20 20 20 20 20 70 rity;.. p
14173 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f Map = osMapViewO
14174 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 fFile(hMap, FILE
14175 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c _MAP_WRITE | FIL
14176 45 5f 4d 41 50 5f 52 45 41 44 2c 0d 0a 20 20 20 E_MAP_READ,..
14177 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 0, iOff
14178 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 set - iOffsetShi
14179 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 ft, szRegion + i
1417a 4f 66 66 73 65 74 53 68 69 66 74 0d 0a 20 20 20 OffsetShift..
1417b 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 );..
1417c 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d OSTRACE(("SHM-M
1417d 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 AP pid-%d map re
1417e 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 gion=%d offset=%
1417f 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c d size=%d %s\n",
14180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
14181 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 (int)osGetCur
14182 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
14183 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 pShmNode->nRegi
14184 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0d 0a 20 20 on, iOffset,..
14185 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
14186 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 zRegion, pMap ?
14187 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 "ok" : "failed")
14188 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 );.. }..
14189 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0d if( !pMap ){.
1418a 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 . pShmNod
1418b 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f e->lastErrno = o
1418c 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b sGetLastError();
1418d 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 .. rc = w
1418e 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
1418f 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 E_IOERR_SHMMAP,
14190 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 pShmNode->lastEr
14191 72 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 rno,..
14192 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 "winShmMa
14193 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 p3", pDbFd->zPat
14194 68 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 h);.. if(
14195 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 hMap ) osCloseH
14196 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0d 0a 20 20 andle(hMap);..
14197 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 goto shmpa
14198 67 65 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 7d ge_out;.. }
14199 0d 0a 0d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f .... pShmNo
1419a 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d de->aRegion[pShm
1419b 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 Node->nRegion].p
1419c 4d 61 70 20 3d 20 70 4d 61 70 3b 0d 0a 20 20 20 Map = pMap;..
1419d 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 pShmNode->aRe
1419e 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e gion[pShmNode->n
1419f 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 Region].hMap = h
141a0 4d 61 70 3b 0d 0a 20 20 20 20 20 20 70 53 68 6d Map;.. pShm
141a1 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b Node->nRegion++;
141a2 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
141a3 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0d 0a 20 20 shmpage_out:..
141a4 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 if( pShmNode->nR
141a5 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b egion>iRegion ){
141a6 0d 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 .. int iOffse
141a7 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 t = iRegion*szRe
141a8 67 69 6f 6e 3b 0d 0a 20 20 20 20 69 6e 74 20 69 gion;.. int i
141a9 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f OffsetShift = iO
141aa 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e ffset % winSysIn
141ab 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 fo.dwAllocationG
141ac 72 61 6e 75 6c 61 72 69 74 79 3b 0d 0a 20 20 20 ranularity;..
141ad 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 char *p = (char
141ae 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 *)pShmNode->aRe
141af 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d gion[iRegion].pM
141b0 61 70 3b 0d 0a 20 20 20 20 2a 70 70 20 3d 20 28 ap;.. *pp = (
141b1 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 void *)&p[iOffse
141b2 74 53 68 69 66 74 5d 3b 0d 0a 20 20 7d 65 6c 73 tShift];.. }els
141b3 65 7b 0d 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b e{.. *pp = 0;
141b4 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 .. }.. sqlite3
141b5 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 _mutex_leave(pSh
141b6 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0d 0a mNode->mutex);..
141b7 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
141b8 0a 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 ...#else..# defi
141b9 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 ne winShmMap
141ba 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 0..# define win
141bb 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0d 0a 23 20 ShmLock 0..#
141bc 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 define winShmBar
141bd 72 69 65 72 20 30 0d 0a 23 20 64 65 66 69 6e 65 rier 0..# define
141be 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 winShmUnmap 0
141bf 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e ..#endif /* #ifn
141c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
141c1 57 41 4c 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a WAL */..../*..**
141c2 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 Here ends the i
141c3 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
141c4 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c all sqlite3_fil
141c5 65 20 6d 65 74 68 6f 64 73 2e 0d 0a 2a 2a 0d 0a e methods...**..
141c6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
141c7 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 ****** End sqlit
141c8 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 e3_file Methods
141c9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
141ca 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
141cb 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
141cc 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
141cd 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
141ce 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
141cf 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
141d0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..../*..** This
141d1 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 vector defines a
141d2 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 ll the methods t
141d3 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 hat can operate
141d4 6f 6e 20 61 6e 0d 0a 2a 2a 20 73 71 6c 69 74 65 on an..** sqlite
141d5 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 3_file for win32
141d6 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f ...*/..static co
141d7 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d nst sqlite3_io_m
141d8 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 ethods winIoMeth
141d9 6f 64 20 3d 20 7b 0d 0a 20 20 32 2c 20 20 20 20 od = {.. 2,
141da 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
141db 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 /* iVe
141dc 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 77 69 6e 43 rsion */.. winC
141dd 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 lose,
141de 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
141df 43 6c 6f 73 65 20 2a 2f 0d 0a 20 20 77 69 6e 52 Close */.. winR
141e0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 ead,
141e1 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
141e2 52 65 61 64 20 2a 2f 0d 0a 20 20 77 69 6e 57 72 Read */.. winWr
141e3 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ite,
141e4 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 /* xW
141e5 72 69 74 65 20 2a 2f 0d 0a 20 20 77 69 6e 54 72 rite */.. winTr
141e6 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 uncate,
141e7 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 /* xT
141e8 72 75 6e 63 61 74 65 20 2a 2f 0d 0a 20 20 77 69 runcate */.. wi
141e9 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 nSync,
141ea 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
141eb 20 78 53 79 6e 63 20 2a 2f 0d 0a 20 20 77 69 6e xSync */.. win
141ec 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 FileSize,
141ed 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
141ee 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0d 0a 20 20 xFileSize */..
141ef 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 winLock,
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
141f1 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0d 0a 20 20 77 /* xLock */.. w
141f2 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 inUnlock,
141f3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
141f4 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 * xUnlock */..
141f5 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 winCheckReserved
141f6 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 Lock,
141f7 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 /* xCheckReserve
141f8 64 4c 6f 63 6b 20 2a 2f 0d 0a 20 20 77 69 6e 46 dLock */.. winF
141f9 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 ileControl,
141fa 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
141fb 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0d 0a FileControl */..
141fc 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c winSectorSize,
141fd 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
141fe 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 /* xSectorSize
141ff 20 2a 2f 0d 0a 20 20 77 69 6e 44 65 76 69 63 65 */.. winDevice
14200 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c Characteristics,
14201 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 /* xDevic
14202 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 eCharacteristics
14203 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 4d 61 70 */.. winShmMap
14204 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
14205 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 /* xShmMa
14206 70 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d 4c 6f p */.. winShmLo
14207 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ck,
14208 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c /* xShmL
14209 6f 63 6b 20 2a 2f 0d 0a 20 20 77 69 6e 53 68 6d ock */.. winShm
1420a 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 Barrier,
1420b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 /* xSh
1420c 6d 42 61 72 72 69 65 72 20 2a 2f 0d 0a 20 20 77 mBarrier */.. w
1420d 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 inShmUnmap
1420e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1420f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0d 0a * xShmUnmap */..
14210 7d 3b 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a };..../*********
14211 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14212 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14213 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14214 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14215 2a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***..***********
14216 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14217 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 * sqlite3_vfs me
14218 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a thods **********
14219 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1421a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 **..**..** This
1421b 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e division contain
1421c 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 s the implementa
1421d 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 tion of methods
1421e 6f 6e 20 74 68 65 0d 0a 2a 2a 20 73 71 6c 69 74 on the..** sqlit
1421f 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0d 0a e3_vfs object...
14220 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e */..../*..** Con
14221 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c vert a UTF-8 fil
14222 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 ename into whate
14223 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 ver form the und
14224 65 72 6c 79 69 6e 67 0d 0a 2a 2a 20 6f 70 65 72 erlying..** oper
14225 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e ating system wan
14226 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e ts filenames in.
14227 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 Space to hold
14228 74 68 65 20 72 65 73 75 6c 74 0d 0a 2a 2a 20 69 the result..** i
14229 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 s obtained from
1422a 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 malloc and must
1422b 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 be freed by the
1422c 63 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 66 75 6e 63 calling..** func
1422d 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 tion...*/..stati
1422e 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 c void *convertU
1422f 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 tf8Filename(cons
14230 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
14231 65 29 7b 0d 0a 20 20 76 6f 69 64 20 2a 7a 43 6f e){.. void *zCo
14232 6e 76 65 72 74 65 64 20 3d 20 30 3b 0d 0a 20 20 nverted = 0;..
14233 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0d 0a 20 if( isNT() ){..
14234 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 zConverted =
14235 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 utf8ToUnicode(zF
14236 69 6c 65 6e 61 6d 65 29 3b 0d 0a 2f 2a 20 69 73 ilename);../* is
14237 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c NT() is 1 if SQL
14238 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c ITE_OS_WINCE==1,
14239 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 so this else is
1423a 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e never executed.
1423b 20 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 ..*/..#if SQLIT
1423c 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 E_OS_WINCE==0..
1423d 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 7a 43 6f }else{.. zCo
1423e 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 nverted = sqlite
1423f 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 3_win32_utf8_to_
14240 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b mbcs(zFilename);
14241 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 20 ..#endif.. }..
14242 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 /* caller will
14243 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 handle out of me
14244 6d 6f 72 79 20 2a 2f 0d 0a 20 20 72 65 74 75 72 mory */.. retur
14245 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0d 0a 7d n zConverted;..}
14246 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 ..../*..** Creat
14247 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 e a temporary fi
14248 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e le name in zBuf.
14249 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 zBuf must be b
1424a 69 67 20 65 6e 6f 75 67 68 20 74 6f 0d 0a 2a 2a ig enough to..**
1424b 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d hold at pVfs->m
1424c 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 xPathname charac
1424d 74 65 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ters...*/..stati
1424e 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d c int getTempnam
1424f 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 e(int nBuf, char
14250 20 2a 7a 42 75 66 29 7b 0d 0a 20 20 73 74 61 74 *zBuf){.. stat
14251 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d ic char zChars[]
14252 20 3d 0d 0a 20 20 20 20 22 61 62 63 64 65 66 67 =.. "abcdefg
14253 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 hijklmnopqrstuvw
14254 78 79 7a 22 0d 0a 20 20 20 20 22 41 42 43 44 45 xyz".. "ABCDE
14255 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 FGHIJKLMNOPQRSTU
14256 56 57 58 59 5a 22 0d 0a 20 20 20 20 22 30 31 32 VWXYZ".. "012
14257 33 34 35 36 37 38 39 22 3b 0d 0a 20 20 73 69 7a 3456789";.. siz
14258 65 5f 74 20 69 2c 20 6a 3b 0d 0a 20 20 63 68 61 e_t i, j;.. cha
14259 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f r zTempPath[MAX_
1425a 50 41 54 48 2b 32 5d 3b 0d 0a 0d 0a 20 20 2f 2a PATH+2];.... /*
1425b 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d It's odd to sim
1425c 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f ulate an io-erro
1425d 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c r here, but real
1425e 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0d ly this is just.
1425f 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 . ** using the
14260 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 io-error infrast
14261 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 ructure to test
14262 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 that SQLite hand
14263 6c 65 73 20 74 68 69 73 0d 0a 20 20 2a 2a 20 66 les this.. ** f
14264 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e unction failing.
14265 20 0d 0a 20 20 2a 2f 0d 0a 20 20 53 69 6d 75 6c .. */.. Simul
14266 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 ateIOError( retu
14267 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 rn SQLITE_IOERR
14268 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 );.... if( sqli
14269 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f te3_temp_directo
1426a 72 79 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 ry ){.. sqlit
1426b 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f e3_snprintf(MAX_
1426c 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 PATH-30, zTempPa
1426d 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 th, "%s", sqlite
1426e 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3_temp_directory
1426f 29 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 );.. }else if(
14270 69 73 4e 54 28 29 20 29 7b 0d 0a 20 20 20 20 63 isNT() ){.. c
14271 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0d 0a 20 20 har *zMulti;..
14272 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 WCHAR zWidePat
14273 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0d 0a 20 20 h[MAX_PATH];..
14274 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 osGetTempPathW
14275 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 (MAX_PATH-30, zW
14276 69 64 65 50 61 74 68 29 3b 0d 0a 20 20 20 20 7a idePath);.. z
14277 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 Multi = unicodeT
14278 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 oUtf8(zWidePath)
14279 3b 0d 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 ;.. if( zMult
1427a 69 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 i ){.. sqli
1427b 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 te3_snprintf(MAX
1427c 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 _PATH-30, zTempP
1427d 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 ath, "%s", zMult
1427e 69 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 i);.. sqlit
1427f 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b e3_free(zMulti);
14280 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
14281 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
14282 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0d 0a E_IOERR_NOMEM;..
14283 20 20 20 20 7d 0d 0a 2f 2a 20 69 73 4e 54 28 29 }../* isNT()
14284 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f is 1 if SQLITE_
14285 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 OS_WINCE==1, so
14286 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 this else is nev
14287 65 72 20 65 78 65 63 75 74 65 64 2e 20 0d 0a 2a er executed. ..*
14288 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 * Since the ANSI
14289 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 version of thes
1428a 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f e Windows API do
1428b 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 not exist for W
1428c 49 4e 43 45 2c 0d 0a 2a 2a 20 69 74 27 73 20 69 INCE,..** it's i
1428d 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 mportant to not
1428e 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 reference them f
1428f 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e or WINCE builds.
14290 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 ..*/..#if SQLITE
14291 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 20 _OS_WINCE==0..
14292 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 63 68 61 72 }else{.. char
14293 20 2a 7a 55 74 66 38 3b 0d 0a 20 20 20 20 63 68 *zUtf8;.. ch
14294 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 ar zMbcsPath[MAX
14295 5f 50 41 54 48 5d 3b 0d 0a 20 20 20 20 6f 73 47 _PATH];.. osG
14296 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f etTempPathA(MAX_
14297 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 PATH-30, zMbcsPa
14298 74 68 29 3b 0d 0a 20 20 20 20 7a 55 74 66 38 20 th);.. zUtf8
14299 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f = sqlite3_win32_
1429a 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 mbcs_to_utf8(zMb
1429b 63 73 50 61 74 68 29 3b 0d 0a 20 20 20 20 69 66 csPath);.. if
1429c 28 20 7a 55 74 66 38 20 29 7b 0d 0a 20 20 20 20 ( zUtf8 ){..
1429d 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
1429e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 tf(MAX_PATH-30,
1429f 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c zTempPath, "%s",
142a0 20 7a 55 74 66 38 29 3b 0d 0a 20 20 20 20 20 20 zUtf8);..
142a1 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 sqlite3_free(zUt
142a2 66 38 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b f8);.. }else{
142a3 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
142a4 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
142a5 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69 M;.. }..#endi
142a6 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 f.. }.... /* C
142a7 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 heck that the ou
142a8 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c tput buffer is l
142a9 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 arge enough for
142aa 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 the temporary fi
142ab 6c 65 20 0d 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 le .. ** name.
142ac 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 If it is not, re
142ad 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
142ae 52 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 R... */.. if(
142af 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 (sqlite3Strlen30
142b0 28 7a 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71 (zTempPath) + sq
142b1 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 lite3Strlen30(SQ
142b2 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 LITE_TEMP_FILE_P
142b3 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 REFIX) + 18) >=
142b4 6e 42 75 66 20 29 7b 0d 0a 20 20 20 20 72 65 74 nBuf ){.. ret
142b5 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
142b6 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 6f 72 28 ;.. }.... for(
142b7 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 i=sqlite3Strlen3
142b8 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 0(zTempPath); i>
142b9 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 0 && zTempPath[i
142ba 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b -1]=='\\'; i--){
142bb 7d 0d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 }.. zTempPath[i
142bc 5d 20 3d 20 30 3b 0d 0a 0d 0a 20 20 73 71 6c 69 ] = 0;.... sqli
142bd 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 te3_snprintf(nBu
142be 66 2d 31 38 2c 20 7a 42 75 66 2c 0d 0a 20 20 20 f-18, zBuf,..
142bf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
142c0 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d "%s\\"SQLITE_TEM
142c1 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a P_FILE_PREFIX, z
142c2 54 65 6d 70 50 61 74 68 29 3b 0d 0a 20 20 6a 20 TempPath);.. j
142c3 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
142c4 30 28 7a 42 75 66 29 3b 0d 0a 20 20 73 71 6c 69 0(zBuf);.. sqli
142c5 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 te3_randomness(1
142c6 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0d 0a 20 5, &zBuf[j]);..
142c7 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 for(i=0; i<15;
142c8 69 2b 2b 2c 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 i++, j++){..
142c9 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 zBuf[j] = (char)
142ca 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e zChars[ ((unsign
142cb 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 ed char)zBuf[j])
142cc 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 %(sizeof(zChars)
142cd 2d 31 29 20 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 7a -1) ];.. }.. z
142ce 42 75 66 5b 6a 5d 20 3d 20 30 3b 0d 0a 20 20 7a Buf[j] = 0;.. z
142cf 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0d 0a 0d Buf[j+1] = 0;...
142d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d . OSTRACE(("TEM
142d1 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e P FILENAME: %s\n
142d2 22 2c 20 7a 42 75 66 29 29 3b 0d 0a 20 20 72 65 ", zBuf));.. re
142d3 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 turn SQLITE_OK;
142d4 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 70 ..}..../*..** Op
142d5 65 6e 20 61 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a en a file...*/..
142d6 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 static int winOp
142d7 65 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 en(.. sqlite3_v
142d8 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 fs *pVfs,
142d9 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0d /* Not used */.
142da 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
142db 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 Name, /*
142dc 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 Name of the file
142dd 20 28 55 54 46 2d 38 29 20 2a 2f 0d 0a 20 20 73 (UTF-8) */.. s
142de 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c qlite3_file *id,
142df 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
142e0 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c e the SQLite fil
142e1 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f e handle here */
142e2 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 .. int flags,
142e3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
142e4 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 Open mode flags
142e5 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 4f 75 74 */.. int *pOut
142e6 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 Flags
142e7 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 /* Status retur
142e8 6e 20 66 6c 61 67 73 20 2a 2f 0d 0a 29 7b 0d 0a n flags */..){..
142e9 20 20 48 41 4e 44 4c 45 20 68 3b 0d 0a 20 20 44 HANDLE h;.. D
142ea 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0d WORD lastErrno;.
142eb 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 . DWORD dwDesir
142ec 65 64 41 63 63 65 73 73 3b 0d 0a 20 20 44 57 4f edAccess;.. DWO
142ed 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0d RD dwShareMode;.
142ee 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 . DWORD dwCreat
142ef 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0d ionDisposition;.
142f0 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 . DWORD dwFlags
142f1 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 AndAttributes =
142f2 30 3b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 0;..#if SQLITE_O
142f3 53 5f 57 49 4e 43 45 0d 0a 20 20 69 6e 74 20 69 S_WINCE.. int i
142f4 73 54 65 6d 70 20 3d 20 30 3b 0d 0a 23 65 6e 64 sTemp = 0;..#end
142f5 69 66 0d 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 if.. winFile *p
142f6 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a File = (winFile*
142f7 29 69 64 3b 0d 0a 20 20 76 6f 69 64 20 2a 7a 43 )id;.. void *zC
142f8 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 onverted;
142f9 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 /* Filena
142fa 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e me in OS encodin
142fb 67 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 g */.. const ch
142fc 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 ar *zUtf8Name =
142fd 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 zName; /* Filena
142fe 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f me in UTF-8 enco
142ff 64 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 ding */.. int c
14300 6e 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 2f 2a 20 nt = 0;.... /*
14301 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 If argument zPat
14302 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e h is a NULL poin
14303 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 ter, this functi
14304 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 on is required t
14305 6f 20 6f 70 65 6e 0d 0a 20 20 2a 2a 20 61 20 74 o open.. ** a t
14306 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 emporary file. U
14307 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 se this buffer t
14308 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 o store the file
14309 20 6e 61 6d 65 20 69 6e 2e 0d 0a 20 20 2a 2f 0d name in... */.
1430a 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 . char zTmpname
1430b 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20 [MAX_PATH+2];
1430c 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 /* Buffer used
1430d 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 to create temp
1430e 66 69 6c 65 6e 61 6d 65 20 2a 2f 0d 0a 0d 0a 20 filename */....
1430f 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
14310 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 _OK;
14311 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 /* Function Retu
14312 72 6e 20 43 6f 64 65 20 2a 2f 0d 0a 23 69 66 20 rn Code */..#if
14313 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 !defined(NDEBUG)
14314 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 || SQLITE_OS_WI
14315 4e 43 45 0d 0a 20 20 69 6e 74 20 65 54 79 70 65 NCE.. int eType
14316 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 = flags&0xFFFFF
14317 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 F00; /* Type of
14318 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f file to open */
14319 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 69 6e ..#endif.... in
1431a 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d t isExclusive =
1431b 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 (flags & SQLITE
1431c 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 _OPEN_EXCLUSIVE)
1431d 3b 0d 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 ;.. int isDelet
1431e 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 e = (flags &
1431f 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c SQLITE_OPEN_DEL
14320 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0d 0a 20 20 ETEONCLOSE);..
14321 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 int isCreate
14322 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 = (flags & SQLI
14323 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b TE_OPEN_CREATE);
14324 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 ..#ifndef NDEBUG
14325 0d 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e .. int isReadon
14326 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 ly = (flags &
14327 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 SQLITE_OPEN_READ
14328 4f 4e 4c 59 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a ONLY);..#endif..
14329 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 int isReadWrit
1432a 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 e = (flags & SQ
1432b 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 LITE_OPEN_READWR
1432c 49 54 45 29 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 ITE);....#ifndef
1432d 20 4e 44 45 42 55 47 0d 0a 20 20 69 6e 74 20 69 NDEBUG.. int i
1432e 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 sOpenJournal = (
1432f 69 73 43 72 65 61 74 65 20 26 26 20 28 0d 0a 20 isCreate && (..
14330 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 eType==SQ
14331 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 LITE_OPEN_MASTER
14332 5f 4a 4f 55 52 4e 41 4c 20 0d 0a 20 20 20 20 20 _JOURNAL ..
14333 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 || eType==SQLITE
14334 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e _OPEN_MAIN_JOURN
14335 41 4c 20 0d 0a 20 20 20 20 20 7c 7c 20 65 54 79 AL .. || eTy
14336 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe==SQLITE_OPEN_
14337 57 41 4c 0d 0a 20 20 29 29 3b 0d 0a 23 65 6e 64 WAL.. ));..#end
14338 69 66 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b if.... /* Check
14339 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
1433a 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 tatements are tr
1433b 75 65 3a 20 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a ue: .. **.. **
1433c 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f (a) Exactly o
1433d 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 ne of the READWR
1433e 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 ITE and READONLY
1433f 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 flags must be s
14340 65 74 2c 20 61 6e 64 20 0d 0a 20 20 2a 2a 20 20 et, and .. **
14341 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 (b) if CREATE i
14342 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 s set, then READ
14343 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 WRITE must also
14344 62 65 20 73 65 74 2c 20 61 6e 64 0d 0a 20 20 2a be set, and.. *
14345 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 * (c) if EXCLU
14346 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 SIVE is set, the
14347 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c n CREATE must al
14348 73 6f 20 62 65 20 73 65 74 2e 0d 0a 20 20 2a 2a so be set... **
14349 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 (d) if DELETE
1434a 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 ONCLOSE is set,
1434b 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 then CREATE must
1434c 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0d 0a 20 also be set...
1434d 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 28 69 */.. assert((i
1434e 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 sReadonly==0 ||
1434f 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 isReadWrite==0)
14350 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 && (isReadWrite
14351 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b || isReadonly));
14352 0d 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 .. assert(isCre
14353 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 ate==0 || isRead
14354 57 72 69 74 65 29 3b 0d 0a 20 20 61 73 73 65 72 Write);.. asser
14355 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 t(isExclusive==0
14356 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0d 0a || isCreate);..
14357 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 assert(isDelet
14358 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 e==0 || isCreate
14359 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 6d );.... /* The m
1435a 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 ain DB, main jou
1435b 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 rnal, WAL file a
1435c 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 nd master journa
1435d 6c 20 61 72 65 20 6e 65 76 65 72 20 0d 0a 20 20 l are never ..
1435e 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 ** automatically
1435f 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 deleted. Nor ar
14360 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 e they ever temp
14361 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f orary files. */
14362 0d 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 .. assert( (!is
14363 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 Delete && zName)
14364 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 || eType!=SQLIT
14365 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 E_OPEN_MAIN_DB )
14366 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 ;.. assert( (!i
14367 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 sDelete && zName
14368 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 ) || eType!=SQLI
14369 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 TE_OPEN_MAIN_JOU
1436a 52 4e 41 4c 20 29 3b 0d 0a 20 20 61 73 73 65 72 RNAL );.. asser
1436b 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 t( (!isDelete &&
1436c 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 zName) || eType
1436d 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 !=SQLITE_OPEN_MA
1436e 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0d STER_JOURNAL );.
1436f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 . assert( (!isD
14370 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 elete && zName)
14371 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 || eType!=SQLITE
14372 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0d 0a 0d 0a _OPEN_WAL );....
14373 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 /* Assert that
14374 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 the upper layer
14375 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 has set one of
14376 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 the "file-type"
14377 66 6c 61 67 73 2e 20 2a 2f 0d 0a 20 20 61 73 73 flags. */.. ass
14378 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 ert( eType==SQLI
14379 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 TE_OPEN_MAIN_DB
1437a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 || eType==S
1437b 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f QLITE_OPEN_TEMP_
1437c 44 42 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 65 DB .. || e
1437d 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
1437e 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c N_MAIN_JOURNAL |
1437f 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
14380 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 OPEN_TEMP_JOURNA
14381 4c 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 L .. || eT
14382 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype==SQLITE_OPEN
14383 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c _SUBJOURNAL ||
14384 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f eType==SQLITE_O
14385 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e PEN_MASTER_JOURN
14386 41 4c 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 65 AL .. || e
14387 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
14388 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c N_TRANSIENT_DB |
14389 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
1438a 4f 50 45 4e 5f 57 41 4c 0d 0a 20 20 29 3b 0d 0a OPEN_WAL.. );..
1438b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d .. assert( id!=
1438c 30 20 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 0 );.. UNUSED_P
1438d 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0d ARAMETER(pVfs);.
1438e 0a 0d 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 ... pFile->h =
1438f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
14390 41 4c 55 45 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 ALUE;.... /* If
14391 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
14392 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e ment to this fun
14393 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 ction is NULL, g
14394 65 6e 65 72 61 74 65 20 61 20 0d 0a 20 20 2a 2a enerate a .. **
14395 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 temporary file
14396 6e 61 6d 65 20 74 6f 20 75 73 65 20 0d 0a 20 20 name to use ..
14397 2a 2f 0d 0a 20 20 69 66 28 20 21 7a 55 74 66 38 */.. if( !zUtf8
14398 4e 61 6d 65 20 29 7b 0d 0a 20 20 20 20 61 73 73 Name ){.. ass
14399 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 ert(isDelete &&
1439a 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b !isOpenJournal);
1439b 0d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 .. rc = getTe
1439c 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b mpname(MAX_PATH+
1439d 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0d 0a 20 2, zTmpname);..
1439e 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1439f 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 E_OK ){.. r
143a0 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d eturn rc;.. }
143a1 0d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 .. zUtf8Name
143a2 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0d 0a 20 20 7d = zTmpname;.. }
143a3 0d 0a 0d 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 .... /* Databas
143a4 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 e filenames are
143a5 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d double-zero term
143a6 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 inated if they a
143a7 72 65 20 6e 6f 74 0d 0a 20 20 2a 2a 20 55 52 49 re not.. ** URI
143a8 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 s with parameter
143a9 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 s. Hence, they
143aa 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 can always be pa
143ab 73 73 65 64 20 69 6e 74 6f 0d 0a 20 20 2a 2a 20 ssed into.. **
143ac 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 sqlite3_uri_para
143ad 6d 65 74 65 72 28 29 2e 0d 0a 20 20 2a 2f 0d 0a meter()... */..
143ae 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 assert( (eType
143af 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 !=SQLITE_OPEN_MA
143b0 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 IN_DB) || (flags
143b1 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 & SQLITE_OPEN_U
143b2 52 49 29 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 RI) ||..
143b3 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e zUtf8Name[strlen
143b4 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d (zUtf8Name)+1]==
143b5 30 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 6f 6e 0 );.... /* Con
143b6 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d vert the filenam
143b7 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 e to the system
143b8 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0d 0a 20 20 encoding. */..
143b9 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e zConverted = con
143ba 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 vertUtf8Filename
143bb 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0d 0a 20 20 (zUtf8Name);..
143bc 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d if( zConverted==
143bd 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 0 ){.. return
143be 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
143bf 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 MEM;.. }.... i
143c0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 f( isReadWrite )
143c1 7b 0d 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 {.. dwDesired
143c2 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 Access = GENERIC
143c3 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f _READ | GENERIC_
143c4 57 52 49 54 45 3b 0d 0a 20 20 7d 65 6c 73 65 7b WRITE;.. }else{
143c5 0d 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 .. dwDesiredA
143c6 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f ccess = GENERIC_
143c7 52 45 41 44 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 READ;.. }....
143c8 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 /* SQLITE_OPEN_E
143c9 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 XCLUSIVE is used
143ca 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
143cb 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 at a new file is
143cc 20 0d 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e .. ** created.
143cd 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 SQLite doesn't
143ce 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 use it to indica
143cf 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 te "exclusive ac
143d0 63 65 73 73 22 20 0d 0a 20 20 2a 2a 20 61 73 20 cess" .. ** as
143d1 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e it is usually un
143d2 64 65 72 73 74 6f 6f 64 2e 0d 0a 20 20 2a 2f 0d derstood... */.
143d3 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 . if( isExclusi
143d4 76 65 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 43 72 ve ){.. /* Cr
143d5 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 eates a new file
143d6 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 , only if it doe
143d7 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 s not already ex
143d8 69 73 74 2e 20 2a 2f 0d 0a 20 20 20 20 2f 2a 20 ist. */.. /*
143d9 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 If the file exis
143da 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f ts, it fails. */
143db 0d 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e .. dwCreation
143dc 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 Disposition = CR
143dd 45 41 54 45 5f 4e 45 57 3b 0d 0a 20 20 7d 65 6c EATE_NEW;.. }el
143de 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 se if( isCreate
143df 29 7b 0d 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 ){.. /* Open
143e0 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f existing file, o
143e1 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 r create if it d
143e2 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0d oesn't exist */.
143e3 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 . dwCreationD
143e4 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 isposition = OPE
143e5 4e 5f 41 4c 57 41 59 53 3b 0d 0a 20 20 7d 65 6c N_ALWAYS;.. }el
143e6 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 4f 70 65 6e se{.. /* Open
143e7 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 s a file, only i
143e8 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0d f it exists. */.
143e9 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 . dwCreationD
143ea 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 isposition = OPE
143eb 4e 5f 45 58 49 53 54 49 4e 47 3b 0d 0a 20 20 7d N_EXISTING;.. }
143ec 0d 0a 0d 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 .... dwShareMod
143ed 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 e = FILE_SHARE_R
143ee 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 EAD | FILE_SHARE
143ef 5f 57 52 49 54 45 3b 0d 0a 0d 0a 20 20 69 66 28 _WRITE;.... if(
143f0 20 69 73 44 65 6c 65 74 65 20 29 7b 0d 0a 23 69 isDelete ){..#i
143f1 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
143f2 45 0d 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e E.. dwFlagsAn
143f3 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 dAttributes = FI
143f4 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 LE_ATTRIBUTE_HID
143f5 44 45 4e 3b 0d 0a 20 20 20 20 69 73 54 65 6d 70 DEN;.. isTemp
143f6 20 3d 20 31 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 = 1;..#else..
143f7 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 dwFlagsAndAttr
143f8 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 ibutes = FILE_AT
143f9 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 TRIBUTE_TEMPORAR
143fa 59 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y..
143fb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
143fc 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 | FILE_ATTRIBU
143fd 54 45 5f 48 49 44 44 45 4e 0d 0a 20 20 20 20 20 TE_HIDDEN..
143fe 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
143ff 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 | FILE
14400 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f _FLAG_DELETE_ON_
14401 43 4c 4f 53 45 3b 0d 0a 23 65 6e 64 69 66 0d 0a CLOSE;..#endif..
14402 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 64 77 }else{.. dw
14403 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 FlagsAndAttribut
14404 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 es = FILE_ATTRIB
14405 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0d 0a 20 20 7d UTE_NORMAL;.. }
14406 0d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 .. /* Reports f
14407 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 rom the internet
14408 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 are that perfor
14409 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0d mance is always.
1440a 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 . ** better if
1440b 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d FILE_FLAG_RANDOM
1440c 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e _ACCESS is used.
1440d 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 Ticket #2699.
1440e 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f */..#if SQLITE_O
1440f 53 5f 57 49 4e 43 45 0d 0a 20 20 64 77 46 6c 61 S_WINCE.. dwFla
14410 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 gsAndAttributes
14411 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e |= FILE_FLAG_RAN
14412 44 4f 4d 5f 41 43 43 45 53 53 3b 0d 0a 23 65 6e DOM_ACCESS;..#en
14413 64 69 66 0d 0a 0d 0a 20 20 69 66 28 20 69 73 4e dif.... if( isN
14414 54 28 29 20 29 7b 0d 0a 20 20 20 20 77 68 69 6c T() ){.. whil
14415 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 e( (h = osCreate
14416 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a FileW((LPCWSTR)z
14417 43 6f 6e 76 65 72 74 65 64 2c 0d 0a 20 20 20 20 Converted,..
14418 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14419 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 dwDesi
1441a 72 65 64 41 63 63 65 73 73 2c 0d 0a 20 20 20 20 redAccess,..
1441b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1441c 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 dwShar
1441d 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0d 0a 20 20 eMode, NULL,..
1441e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1441f 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 dwCr
14420 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
14421 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 n,..
14422 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14423 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 dwFlagsAndAttr
14424 69 62 75 74 65 73 2c 0d 0a 20 20 20 20 20 20 20 ibutes,..
14425 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14426 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 NULL))==I
14427 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
14428 4c 55 45 20 26 26 0d 0a 20 20 20 20 20 20 20 20 LUE &&..
14429 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1442a 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 retryIoerr
1442b 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
1442c 6f 29 20 29 7b 7d 0d 0a 2f 2a 20 69 73 4e 54 28 o) ){}../* isNT(
1442d 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 ) is 1 if SQLITE
1442e 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f _OS_WINCE==1, so
1442f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 this else is ne
14430 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0d 0a ver executed. ..
14431 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 ** Since the ANS
14432 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 I version of the
14433 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 se Windows API d
14434 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 o not exist for
14435 57 49 4e 43 45 2c 0d 0a 2a 2a 20 69 74 27 73 20 WINCE,..** it's
14436 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 important to not
14437 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 reference them
14438 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 for WINCE builds
14439 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 ...*/..#if SQLIT
1443a 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 E_OS_WINCE==0..
1443b 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 77 68 69 }else{.. whi
1443c 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 le( (h = osCreat
1443d 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a eFileA((LPCSTR)z
1443e 43 6f 6e 76 65 72 74 65 64 2c 0d 0a 20 20 20 20 Converted,..
1443f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14440 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 dwDesi
14441 72 65 64 41 63 63 65 73 73 2c 0d 0a 20 20 20 20 redAccess,..
14442 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14443 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 dwShar
14444 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0d 0a 20 20 eMode, NULL,..
14445 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14446 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 dwCr
14447 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
14448 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 n,..
14449 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1444a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 dwFlagsAndAttr
1444b 69 62 75 74 65 73 2c 0d 0a 20 20 20 20 20 20 20 ibutes,..
1444c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1444d 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 NULL))==I
1444e 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
1444f 4c 55 45 20 26 26 0d 0a 20 20 20 20 20 20 20 20 LUE &&..
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14451 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 retryIoerr
14452 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
14453 6f 29 20 29 7b 7d 0d 0a 23 65 6e 64 69 66 0d 0a o) ){}..#endif..
14454 20 20 7d 0d 0a 0d 0a 20 20 6c 6f 67 49 6f 65 72 }.... logIoer
14455 72 28 63 6e 74 29 3b 0d 0a 0d 0a 20 20 4f 53 54 r(cnt);.... OST
14456 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 RACE(("OPEN %d %
14457 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0d s 0x%lx %s\n", .
14458 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a . h, z
14459 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 Name, dwDesiredA
1445a 63 63 65 73 73 2c 20 0d 0a 20 20 20 20 20 20 20 ccess, ..
1445b 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 h==INVALID_H
1445c 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 ANDLE_VALUE ? "f
1445d 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b ailed" : "ok"));
1445e 0d 0a 0d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 .... if( h==INV
1445f 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
14460 45 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 2d E ){.. pFile-
14461 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 >lastErrno = las
14462 74 45 72 72 6e 6f 3b 0d 0a 20 20 20 20 77 69 6e tErrno;.. win
14463 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
14464 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d CANTOPEN, pFile-
14465 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e >lastErrno, "win
14466 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 Open", zUtf8Name
14467 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f );.. sqlite3_
14468 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
14469 3b 0d 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 ;.. if( isRea
1446a 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 dWrite && !isExc
1446b 6c 75 73 69 76 65 20 29 7b 0d 0a 20 20 20 20 20 lusive ){..
1446c 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 return winOpen(
1446d 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c pVfs, zName, id,
1446e 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
1446f 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f ((flags|SQLITE_O
14470 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 PEN_READONLY)&~(
14471 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
14472 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 TE|SQLITE_OPEN_R
14473 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74 EADWRITE)), pOut
14474 46 6c 61 67 73 29 3b 0d 0a 20 20 20 20 7d 65 6c Flags);.. }el
14475 73 65 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 se{.. retur
14476 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
14477 4e 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a N_BKPT;.. }..
14478 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4f 75 }.... if( pOu
14479 74 46 6c 61 67 73 20 29 7b 0d 0a 20 20 20 20 69 tFlags ){.. i
1447a 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 f( isReadWrite )
1447b 7b 0d 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c {.. *pOutFl
1447c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 ags = SQLITE_OPE
1447d 4e 5f 52 45 41 44 57 52 49 54 45 3b 0d 0a 20 20 N_READWRITE;..
1447e 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
1447f 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c *pOutFlags = SQL
14480 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c ITE_OPEN_READONL
14481 59 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a Y;.. }.. }..
14482 0d 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 .. memset(pFile
14483 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 , 0, sizeof(*pFi
14484 6c 65 29 29 3b 0d 0a 20 20 70 46 69 6c 65 2d 3e le));.. pFile->
14485 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f pMethod = &winIo
14486 4d 65 74 68 6f 64 3b 0d 0a 20 20 70 46 69 6c 65 Method;.. pFile
14487 2d 3e 68 20 3d 20 68 3b 0d 0a 20 20 70 46 69 6c ->h = h;.. pFil
14488 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e e->lastErrno = N
14489 4f 5f 45 52 52 4f 52 3b 0d 0a 20 20 70 46 69 6c O_ERROR;.. pFil
1448a 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0d e->pVfs = pVfs;.
1448b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d . pFile->pShm =
1448c 20 30 3b 0d 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 0;.. pFile->zP
1448d 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0d 0a 20 20 ath = zName;..
1448e 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f if( sqlite3_uri_
1448f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 boolean(zName, "
14490 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f psow", SQLITE_PO
14491 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 WERSAFE_OVERWRIT
14492 45 29 20 29 7b 0d 0a 20 20 20 20 70 46 69 6c 65 E) ){.. pFile
14493 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 ->ctrlFlags |= W
14494 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0d 0a 20 20 INFILE_PSOW;..
14495 7d 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f }....#if SQLITE_
14496 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 69 66 28 20 OS_WINCE.. if(
14497 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65 isReadWrite && e
14498 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
14499 4e 5f 4d 41 49 4e 5f 44 42 0d 0a 20 20 20 20 20 N_MAIN_DB..
1449a 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 && !winceCreat
1449b 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 eLock(zName, pFi
1449c 6c 65 29 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 6f le).. ){.. o
1449d 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b sCloseHandle(h);
1449e 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 .. sqlite3_fr
1449f 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0d ee(zConverted);.
144a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
144a1 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 TE_CANTOPEN_BKPT
144a2 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 69 73 ;.. }.. if( is
144a3 54 65 6d 70 20 29 7b 0d 0a 20 20 20 20 70 46 69 Temp ){.. pFi
144a4 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f le->zDeleteOnClo
144a5 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b se = zConverted;
144a6 0d 0a 20 20 7d 65 6c 73 65 0d 0a 23 65 6e 64 69 .. }else..#endi
144a7 66 0d 0a 20 20 7b 0d 0a 20 20 20 20 73 71 6c 69 f.. {.. sqli
144a8 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 te3_free(zConver
144a9 74 65 64 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 ted);.. }....
144aa 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b OpenCounter(+1);
144ab 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
144ac 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 }..../*..** Dele
144ad 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c te the named fil
144ae 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 e...**..** Note
144af 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 that Windows doe
144b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 s not allow a fi
144b1 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 le to be deleted
144b2 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0d 0a if some other..
144b3 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 ** process has i
144b4 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d t open. Sometim
144b5 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e es a virus scann
144b6 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 er or indexing p
144b7 72 6f 67 72 61 6d 0d 0a 2a 2a 20 77 69 6c 6c 20 rogram..** will
144b8 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 open a journal f
144b9 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 ile shortly afte
144ba 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 r it is created
144bb 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0d 0a in order to do..
144bc 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 ** whatever it d
144bd 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 oes. While this
144be 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 other process i
144bf 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0d 0a 2a s holding the..*
144c0 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 * file open, we
144c1 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 will be unable t
144c2 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f o delete it. To
144c3 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 work around thi
144c4 73 0d 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 s..** problem, w
144c5 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c e delay 100 mill
144c6 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 iseconds and try
144c7 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e to delete again
144c8 2e 20 20 55 70 0d 0a 2a 2a 20 74 6f 20 4d 58 5f . Up..** to MX_
144c9 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 DELETION_ATTEMPT
144ca 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d s deletion attem
144cb 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f pts are run befo
144cc 72 65 20 67 69 76 69 6e 67 0d 0a 2a 2a 20 75 70 re giving..** up
144cd 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 and returning a
144ce 6e 20 65 72 72 6f 72 2e 0d 0a 2a 2f 0d 0a 73 74 n error...*/..st
144cf 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 atic int winDele
144d0 74 65 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 te(.. sqlite3_v
144d1 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 fs *pVfs,
144d2 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f /* Not used o
144d3 6e 20 77 69 6e 33 32 20 2a 2f 0d 0a 20 20 63 6f n win32 */.. co
144d4 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
144d5 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d ame, /* Nam
144d6 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c e of file to del
144d7 65 74 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 ete */.. int sy
144d8 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 ncDir
144d9 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 /* Not use
144da 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0d 0a 29 d on win32 */..)
144db 7b 0d 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 {.. int cnt = 0
144dc 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 ;.. int rc;..
144dd 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b DWORD lastErrno;
144de 0d 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 .. void *zConve
144df 72 74 65 64 3b 0d 0a 20 20 55 4e 55 53 45 44 5f rted;.. UNUSED_
144e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
144e1 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
144e2 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0d 0a ETER(syncDir);..
144e3 0d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 .. SimulateIOEr
144e4 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 ror(return SQLIT
144e5 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b E_IOERR_DELETE);
144e6 0d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d .. zConverted =
144e7 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 convertUtf8File
144e8 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b name(zFilename);
144e9 0d 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 .. if( zConvert
144ea 65 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 ed==0 ){.. re
144eb 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
144ec 52 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20 R_NOMEM;.. }..
144ed 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0d 0a if( isNT() ){..
144ee 20 20 20 20 72 63 20 3d 20 31 3b 0d 0a 20 20 20 rc = 1;..
144ef 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c while( osGetFil
144f0 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f eAttributesW(zCo
144f1 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 nverted)!=INVALI
144f2 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 D_FILE_ATTRIBUTE
144f3 53 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 28 S &&.. (
144f4 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c rc = osDeleteFil
144f5 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d eW(zConverted))=
144f6 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 =0 && retryIoerr
144f7 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
144f8 6f 29 20 29 7b 7d 0d 0a 20 20 20 20 72 63 20 3d o) ){}.. rc =
144f9 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 rc ? SQLITE_OK
144fa 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d : SQLITE_ERROR;.
144fb 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 ./* isNT() is 1
144fc 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
144fd 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 CE==1, so this e
144fe 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 lse is never exe
144ff 63 75 74 65 64 2e 20 0d 0a 2a 2a 20 53 69 6e 63 cuted. ..** Sinc
14500 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 e the ANSI versi
14501 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 on of these Wind
14502 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 ows API do not e
14503 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0d xist for WINCE,.
14504 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 .** it's importa
14505 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 nt to not refere
14506 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e nce them for WIN
14507 43 45 20 62 75 69 6c 64 73 2e 0d 0a 2a 2f 0d 0a CE builds...*/..
14508 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
14509 4e 43 45 3d 3d 30 0d 0a 20 20 7d 65 6c 73 65 7b NCE==0.. }else{
1450a 0d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0d 0a 20 .. rc = 1;..
1450b 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 while( osGetF
1450c 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a ileAttributesA(z
1450d 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 Converted)!=INVA
1450e 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 LID_FILE_ATTRIBU
1450f 54 45 53 20 26 26 0d 0a 20 20 20 20 20 20 20 20 TES &&..
14510 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 (rc = osDeleteF
14511 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 ileA(zConverted)
14512 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 )==0 && retryIoe
14513 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 rr(&cnt, &lastEr
14514 72 6e 6f 29 20 29 7b 7d 0d 0a 20 20 20 20 72 63 rno) ){}.. rc
14515 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f = rc ? SQLITE_O
14516 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 K : SQLITE_ERROR
14517 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a ;..#endif.. }..
14518 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 if( rc ){..
14519 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f rc = winLogErro
1451a 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 r(SQLITE_IOERR_D
1451b 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f ELETE, lastErrno
1451c 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
1451d 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 "winDelete", zFi
1451e 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 7d 65 6c 73 lename);.. }els
1451f 65 7b 0d 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 e{.. logIoerr
14520 28 63 6e 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 (cnt);.. }.. s
14521 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
14522 76 65 72 74 65 64 29 3b 0d 0a 20 20 4f 53 54 52 verted);.. OSTR
14523 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 ACE(("DELETE \"%
14524 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 s\" %s\n", zFile
14525 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 name, (rc ? "fai
14526 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b led" : "ok" )));
14527 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
14528 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 65 63 }..../*..** Chec
14529 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 k the existance
1452a 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 and status of a
1452b 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 file...*/..stati
1452c 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 c int winAccess(
1452d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .. sqlite3_vfs
1452e 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f *pVfs, /
1452f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 * Not used on wi
14530 6e 33 32 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 n32 */.. const
14531 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c char *zFilename,
14532 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
14533 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f file to check */
14534 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 .. int flags,
14535 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
14536 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 * Type of test t
14537 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 o make on this f
14538 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 ile */.. int *p
14539 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 ResOut
1453a 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 /* OUT: Res
1453b 75 6c 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 44 57 ult */..){.. DW
1453c 4f 52 44 20 61 74 74 72 3b 0d 0a 20 20 69 6e 74 ORD attr;.. int
1453d 20 72 63 20 3d 20 30 3b 0d 0a 20 20 44 57 4f 52 rc = 0;.. DWOR
1453e 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0d 0a 20 20 D lastErrno;..
1453f 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 void *zConverted
14540 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ;.. UNUSED_PARA
14541 4d 45 54 45 52 28 70 56 66 73 29 3b 0d 0a 0d 0a METER(pVfs);....
14542 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
14543 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 r( return SQLITE
14544 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 _IOERR_ACCESS; )
14545 3b 0d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 ;.. zConverted
14546 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c = convertUtf8Fil
14547 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 ename(zFilename)
14548 3b 0d 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 ;.. if( zConver
14549 74 65 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 ted==0 ){.. r
1454a 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
1454b 52 52 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a RR_NOMEM;.. }..
1454c 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0d if( isNT() ){.
1454d 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 . int cnt = 0
1454e 3b 0d 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c ;.. WIN32_FIL
1454f 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 E_ATTRIBUTE_DATA
14550 20 73 41 74 74 72 44 61 74 61 3b 0d 0a 20 20 20 sAttrData;..
14551 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 memset(&sAttrDa
14552 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 ta, 0, sizeof(sA
14553 74 74 72 44 61 74 61 29 29 3b 0d 0a 20 20 20 20 ttrData));..
14554 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 while( !(rc = os
14555 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
14556 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 sExW((LPCWSTR)zC
14557 6f 6e 76 65 72 74 65 64 2c 0d 0a 20 20 20 20 20 onverted,..
14558 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14559 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 GetFileE
1455a 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0d xInfoStandard, .
1455b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1455c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 &s
1455d 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 AttrData)) && re
1455e 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 tryIoerr(&cnt, &
1455f 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0d 0a lastErrno) ){}..
14560 20 20 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 if( rc ){..
14561 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 /* For an S
14562 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 QLITE_ACCESS_EXI
14563 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 STS query, treat
14564 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 a zero-length f
14565 69 6c 65 0d 0a 20 20 20 20 20 20 2a 2a 20 61 73 ile.. ** as
14566 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 if it does not
14567 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 2a 2f exist... */
14568 0d 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 .. if( f
14569 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 lags==SQLITE_ACC
1456a 45 53 53 5f 45 58 49 53 54 53 0d 0a 20 20 20 20 ESS_EXISTS..
1456b 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 && sAttrDa
1456c 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 ta.nFileSizeHigh
1456d 3d 3d 30 20 0d 0a 20 20 20 20 20 20 20 20 20 20 ==0 ..
1456e 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 && sAttrData.nFi
1456f 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0d leSizeLow==0 ){.
14570 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 . attr =
14571 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
14572 52 49 42 55 54 45 53 3b 0d 0a 20 20 20 20 20 20 RIBUTES;..
14573 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
14574 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 attr = sAttrData
14575 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 .dwFileAttribute
14576 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 s;.. }..
14577 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6c }else{.. l
14578 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0d 0a 20 ogIoerr(cnt);..
14579 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 if( lastErr
1457a 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e no!=ERROR_FILE_N
1457b 4f 54 5f 46 4f 55 4e 44 20 29 7b 0d 0a 20 20 20 OT_FOUND ){..
1457c 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 winLogError
1457d 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 (SQLITE_IOERR_AC
1457e 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c CESS, lastErrno,
1457f 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 "winAccess", zF
14580 69 6c 65 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 ilename);..
14581 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
14582 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0d 0a 20 20 zConverted);..
14583 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
14584 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 ITE_IOERR_ACCESS
14585 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
14586 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 . attr =
14587 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
14588 52 49 42 55 54 45 53 3b 0d 0a 20 20 20 20 20 20 RIBUTES;..
14589 7d 0d 0a 20 20 20 20 7d 0d 0a 2f 2a 20 69 73 4e }.. }../* isN
1458a 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 T() is 1 if SQLI
1458b 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 TE_OS_WINCE==1,
1458c 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 so this else is
1458d 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 never executed.
1458e 0d 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 ..** Since the A
1458f 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 NSI version of t
14590 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 hese Windows API
14591 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f do not exist fo
14592 72 20 57 49 4e 43 45 2c 0d 0a 2a 2a 20 69 74 27 r WINCE,..** it'
14593 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e s important to n
14594 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 ot reference the
14595 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c m for WINCE buil
14596 64 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c ds...*/..#if SQL
14597 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d ITE_OS_WINCE==0.
14598 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 61 . }else{.. a
14599 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 ttr = osGetFileA
1459a 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 ttributesA((char
1459b 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0d 0a *)zConverted);..
1459c 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 20 20 73 #endif.. }.. s
1459d 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
1459e 76 65 72 74 65 64 29 3b 0d 0a 20 20 73 77 69 74 verted);.. swit
1459f 63 68 28 20 66 6c 61 67 73 20 29 7b 0d 0a 20 20 ch( flags ){..
145a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 case SQLITE_AC
145a1 43 45 53 53 5f 52 45 41 44 3a 0d 0a 20 20 20 20 CESS_READ:..
145a2 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 case SQLITE_ACCE
145a3 53 53 5f 45 58 49 53 54 53 3a 0d 0a 20 20 20 20 SS_EXISTS:..
145a4 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 rc = attr!=INV
145a5 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 ALID_FILE_ATTRIB
145a6 55 54 45 53 3b 0d 0a 20 20 20 20 20 20 62 72 65 UTES;.. bre
145a7 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 53 51 ak;.. case SQ
145a8 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 LITE_ACCESS_READ
145a9 57 52 49 54 45 3a 0d 0a 20 20 20 20 20 20 72 63 WRITE:.. rc
145aa 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 = attr!=INVALID
145ab 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 _FILE_ATTRIBUTES
145ac 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 &&..
145ad 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 (attr & FILE_A
145ae 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c TTRIBUTE_READONL
145af 59 29 3d 3d 30 3b 0d 0a 20 20 20 20 20 20 62 72 Y)==0;.. br
145b0 65 61 6b 3b 0d 0a 20 20 20 20 64 65 66 61 75 6c eak;.. defaul
145b1 74 3a 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 t:.. assert
145b2 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 (!"Invalid flags
145b3 20 61 72 67 75 6d 65 6e 74 22 29 3b 0d 0a 20 20 argument");..
145b4 7d 0d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 }.. *pResOut =
145b5 72 63 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 rc;.. return SQ
145b6 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 0d LITE_OK;..}.....
145b7 0a 2f 2a 0d 0a 2a 2a 20 54 75 72 6e 20 61 20 72 ./*..** Turn a r
145b8 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 elative pathname
145b9 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 into a full pat
145ba 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 hname. Write th
145bb 65 20 66 75 6c 6c 0d 0a 2a 2a 20 70 61 74 68 6e e full..** pathn
145bc 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e ame into zOut[].
145bd 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 zOut[] will be
145be 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e at least pVfs->
145bf 6d 78 50 61 74 68 6e 61 6d 65 0d 0a 2a 2a 20 62 mxPathname..** b
145c0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0d 0a 2a ytes in size...*
145c1 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 /..static int wi
145c2 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0d 0a nFullPathname(..
145c3 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
145c4 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 Vfs,
145c5 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 /* Pointer to vf
145c6 73 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 63 s object */.. c
145c7 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 onst char *zRela
145c8 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 tive, /*
145c9 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 Possibly relativ
145ca 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0d e input path */.
145cb 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 . int nFull,
145cc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
145cd 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 /* Size of outp
145ce 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 ut buffer in byt
145cf 65 73 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a es */.. char *z
145d0 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 Full
145d1 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 /* Output
145d2 20 62 75 66 66 65 72 20 2a 2f 0d 0a 29 7b 0d 0a buffer */..){..
145d3 20 20 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ..#if defined(
145d4 5f 5f 43 59 47 57 49 4e 5f 5f 29 0d 0a 20 20 53 __CYGWIN__).. S
145d5 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
145d6 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
145d7 52 4f 52 20 29 3b 0d 0a 20 20 55 4e 55 53 45 44 ROR );.. UNUSED
145d8 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c _PARAMETER(nFull
145d9 29 3b 0d 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e );.. cygwin_con
145da 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f v_to_full_win32_
145db 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 path(zRelative,
145dc 7a 46 75 6c 6c 29 3b 0d 0a 20 20 72 65 74 75 72 zFull);.. retur
145dd 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 23 65 n SQLITE_OK;..#e
145de 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 ndif....#if SQLI
145df 54 45 5f 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 53 TE_OS_WINCE.. S
145e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
145e1 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
145e2 52 4f 52 20 29 3b 0d 0a 20 20 55 4e 55 53 45 44 ROR );.. UNUSED
145e3 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c _PARAMETER(nFull
145e4 29 3b 0d 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 );.. /* WinCE h
145e5 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 as no concept of
145e6 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 a relative path
145e7 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d name, or so I am
145e8 20 74 6f 6c 64 2e 20 2a 2f 0d 0a 20 20 73 71 6c told. */.. sql
145e9 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 ite3_snprintf(pV
145ea 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 fs->mxPathname,
145eb 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 zFull, "%s", zRe
145ec 6c 61 74 69 76 65 29 3b 0d 0a 20 20 72 65 74 75 lative);.. retu
145ed 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 23 rn SQLITE_OK;..#
145ee 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 21 53 51 endif....#if !SQ
145ef 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
145f0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 !defined(__CYGW
145f1 49 4e 5f 5f 29 0d 0a 20 20 69 6e 74 20 6e 42 79 IN__).. int nBy
145f2 74 65 3b 0d 0a 20 20 76 6f 69 64 20 2a 7a 43 6f te;.. void *zCo
145f3 6e 76 65 72 74 65 64 3b 0d 0a 20 20 63 68 61 72 nverted;.. char
145f4 20 2a 7a 4f 75 74 3b 0d 0a 0d 0a 20 20 2f 2a 20 *zOut;.... /*
145f5 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d If this path nam
145f6 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f e begins with "/
145f7 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 X:", where "X" i
145f8 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 s any alphabetic
145f9 0d 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 .. ** character
145fa 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e , discard the in
145fb 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 itial "/" from t
145fc 68 65 20 70 61 74 68 6e 61 6d 65 2e 0d 0a 20 20 he pathname...
145fd 2a 2f 0d 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 */.. if( zRelat
145fe 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 ive[0]=='/' && s
145ff 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 qlite3Isalpha(zR
14600 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a elative[1]) && z
14601 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 Relative[2]==':'
14602 20 29 7b 0d 0a 20 20 20 20 7a 52 65 6c 61 74 69 ){.. zRelati
14603 76 65 2b 2b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 ve++;.. }....
14604 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 /* It's odd to s
14605 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 imulate an io-er
14606 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 ror here, but re
14607 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 ally this is jus
14608 74 0d 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 t.. ** using th
14609 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 e io-error infra
1460a 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 structure to tes
1460b 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 t that SQLite ha
1460c 6e 64 6c 65 73 20 74 68 69 73 0d 0a 20 20 2a 2a ndles this.. **
1460d 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e function failin
1460e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e g. This function
1460f 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 could fail if,
14610 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 for example, the
14611 0d 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 .. ** current w
14612 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 orking directory
14613 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b has been unlink
14614 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 53 69 6d ed... */.. Sim
14615 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 ulateIOError( re
14616 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
14617 52 20 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 R );.. UNUSED_P
14618 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b ARAMETER(nFull);
14619 0d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d .. zConverted =
1461a 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 convertUtf8File
1461b 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b name(zRelative);
1461c 0d 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 .. if( zConvert
1461d 65 64 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 ed==0 ){.. re
1461e 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
1461f 52 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20 R_NOMEM;.. }..
14620 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0d 0a if( isNT() ){..
14621 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 LPWSTR zTemp
14622 3b 0d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f ;.. nByte = o
14623 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 sGetFullPathName
14624 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 W((LPCWSTR)zConv
14625 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 erted, 0, 0, 0)
14626 2b 20 33 3b 0d 0a 20 20 20 20 7a 54 65 6d 70 20 + 3;.. zTemp
14627 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 = sqlite3_malloc
14628 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a ( nByte*sizeof(z
14629 54 65 6d 70 5b 30 5d 29 20 29 3b 0d 0a 20 20 20 Temp[0]) );..
1462a 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b if( zTemp==0 ){
1462b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
1462c 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
1462d 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ;.. return
1462e 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
1462f 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 EM;.. }..
14630 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d osGetFullPathNam
14631 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e eW((LPCWSTR)zCon
14632 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a verted, nByte, z
14633 54 65 6d 70 2c 20 30 29 3b 0d 0a 20 20 20 20 73 Temp, 0);.. s
14634 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
14635 76 65 72 74 65 64 29 3b 0d 0a 20 20 20 20 7a 4f verted);.. zO
14636 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 ut = unicodeToUt
14637 66 38 28 7a 54 65 6d 70 29 3b 0d 0a 20 20 20 20 f8(zTemp);..
14638 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 sqlite3_free(zTe
14639 6d 70 29 3b 0d 0a 2f 2a 20 69 73 4e 54 28 29 20 mp);../* isNT()
1463a 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f is 1 if SQLITE_O
1463b 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 S_WINCE==1, so t
1463c 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 his else is neve
1463d 72 20 65 78 65 63 75 74 65 64 2e 20 0d 0a 2a 2a r executed. ..**
1463e 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20 Since the ANSI
1463f 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 version of these
14640 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 Windows API do
14641 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 not exist for WI
14642 4e 43 45 2c 0d 0a 2a 2a 20 69 74 27 73 20 69 6d NCE,..** it's im
14643 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 portant to not r
14644 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f eference them fo
14645 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0d r WINCE builds..
14646 0a 2a 2f 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f .*/..#if SQLITE_
14647 4f 53 5f 57 49 4e 43 45 3d 3d 30 0d 0a 20 20 7d OS_WINCE==0.. }
14648 65 6c 73 65 7b 0d 0a 20 20 20 20 63 68 61 72 20 else{.. char
14649 2a 7a 54 65 6d 70 3b 0d 0a 20 20 20 20 6e 42 79 *zTemp;.. nBy
1464a 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 te = osGetFullPa
1464b 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a thNameA((char*)z
1464c 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c Converted, 0, 0,
1464d 20 30 29 20 2b 20 33 3b 0d 0a 20 20 20 20 7a 54 0) + 3;.. zT
1464e 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 emp = sqlite3_ma
1464f 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 lloc( nByte*size
14650 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0d of(zTemp[0]) );.
14651 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d . if( zTemp==
14652 30 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 0 ){.. sqli
14653 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 te3_free(zConver
14654 74 65 64 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 ted);.. ret
14655 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
14656 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a _NOMEM;.. }..
14657 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 osGetFullPat
14658 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 hNameA((char*)zC
14659 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c onverted, nByte,
1465a 20 7a 54 65 6d 70 2c 20 30 29 3b 0d 0a 20 20 20 zTemp, 0);..
1465b 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 sqlite3_free(zC
1465c 6f 6e 76 65 72 74 65 64 29 3b 0d 0a 20 20 20 20 onverted);..
1465d 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 zOut = sqlite3_w
1465e 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 in32_mbcs_to_utf
1465f 38 28 7a 54 65 6d 70 29 3b 0d 0a 20 20 20 20 73 8(zTemp);.. s
14660 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d qlite3_free(zTem
14661 70 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d p);..#endif.. }
14662 0d 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0d .. if( zOut ){.
14663 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 . sqlite3_snp
14664 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 rintf(pVfs->mxPa
14665 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 thname, zFull, "
14666 25 73 22 2c 20 7a 4f 75 74 29 3b 0d 0a 20 20 20 %s", zOut);..
14667 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f sqlite3_free(zO
14668 75 74 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e ut);.. return
14669 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d SQLITE_OK;.. }
1466a 65 6c 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 else{.. retur
1466b 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e n SQLITE_IOERR_N
1466c 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 OMEM;.. }..#end
1466d 69 66 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 if..}....#ifndef
1466e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 SQLITE_OMIT_LOA
1466f 44 5f 45 58 54 45 4e 53 49 4f 4e 0d 0a 2f 2a 0d D_EXTENSION../*.
14670 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 .** Interfaces f
14671 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 or opening a sha
14672 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e red library, fin
14673 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 ding entry point
14674 73 0d 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 s..** within the
14675 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c shared library,
14676 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 and closing the
14677 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e shared library.
14678 0d 0a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 74 ..*/../*..** Int
14679 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e erfaces for open
1467a 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 ing a shared lib
1467b 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e rary, finding en
1467c 74 72 79 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 77 try points..** w
1467d 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 ithin the shared
1467e 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c library, and cl
1467f 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 osing the shared
14680 20 6c 69 62 72 61 72 79 2e 0d 0a 2a 2f 0d 0a 73 library...*/..s
14681 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 tatic void *winD
14682 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 lOpen(sqlite3_vf
14683 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 s *pVfs, const c
14684 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b har *zFilename){
14685 0d 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0d 0a 20 .. HANDLE h;..
14686 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 void *zConverte
14687 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 d = convertUtf8F
14688 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d ilename(zFilenam
14689 65 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 e);.. UNUSED_PA
1468a 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0d 0a RAMETER(pVfs);..
1468b 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 if( zConverted
1468c 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 ==0 ){.. retu
1468d 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 rn 0;.. }.. if
1468e 28 20 69 73 4e 54 28 29 20 29 7b 0d 0a 20 20 20 ( isNT() ){..
1468f 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 h = osLoadLibra
14690 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f ryW((LPCWSTR)zCo
14691 6e 76 65 72 74 65 64 29 3b 0d 0a 2f 2a 20 69 73 nverted);../* is
14692 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c NT() is 1 if SQL
14693 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c ITE_OS_WINCE==1,
14694 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 so this else is
14695 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e never executed.
14696 20 0d 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 ..** Since the
14697 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 ANSI version of
14698 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 these Windows AP
14699 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 I do not exist f
1469a 6f 72 20 57 49 4e 43 45 2c 0d 0a 2a 2a 20 69 74 or WINCE,..** it
1469b 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 's important to
1469c 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 not reference th
1469d 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 em for WINCE bui
1469e 6c 64 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 53 51 lds...*/..#if SQ
1469f 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 LITE_OS_WINCE==0
146a0 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
146a1 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 h = osLoadLibrar
146a2 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 yA((char*)zConve
146a3 72 74 65 64 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a rted);..#endif..
146a4 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 }.. sqlite3_f
146a5 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b ree(zConverted);
146a6 0d 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 .. return (void
146a7 2a 29 68 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 *)h;..}..static
146a8 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 void winDlError(
146a9 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
146aa 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 s, int nBuf, cha
146ab 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0d 0a 20 20 r *zBufOut){..
146ac 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
146ad 28 70 56 66 73 29 3b 0d 0a 20 20 67 65 74 4c 61 (pVfs);.. getLa
146ae 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 stErrorMsg(osGet
146af 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 LastError(), nBu
146b0 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0d 0a 7d 0d f, zBufOut);..}.
146b1 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 .static void (*w
146b2 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f inDlSym(sqlite3_
146b3 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 vfs *pVfs, void
146b4 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 *pHandle, const
146b5 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 char *zSymbol))(
146b6 76 6f 69 64 29 7b 0d 0a 20 20 55 4e 55 53 45 44 void){.. UNUSED
146b7 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 _PARAMETER(pVfs)
146b8 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 ;.. return (voi
146b9 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 d(*)(void))osGet
146ba 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 ProcAddressA((HA
146bb 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 NDLE)pHandle, zS
146bc 79 6d 62 6f 6c 29 3b 0d 0a 7d 0d 0a 73 74 61 74 ymbol);..}..stat
146bd 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f ic void winDlClo
146be 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a se(sqlite3_vfs *
146bf 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e pVfs, void *pHan
146c0 64 6c 65 29 7b 0d 0a 20 20 55 4e 55 53 45 44 5f dle){.. UNUSED_
146c1 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
146c2 0d 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 .. osFreeLibrar
146c3 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c y((HANDLE)pHandl
146c4 65 29 3b 0d 0a 7d 0d 0a 23 65 6c 73 65 20 2f 2a e);..}..#else /*
146c5 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f if SQLITE_OMIT_
146c6 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 LOAD_EXTENSION i
146c7 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0d 0a 20 s defined: */..
146c8 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 #define winDlOp
146c9 65 6e 20 20 30 0d 0a 20 20 23 64 65 66 69 6e 65 en 0.. #define
146ca 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0d 0a 20 winDlError 0..
146cb 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 #define winDlSy
146cc 6d 20 20 20 30 0d 0a 20 20 23 64 65 66 69 6e 65 m 0.. #define
146cd 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0d 0a 23 winDlClose 0..#
146ce 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a endif....../*..*
146cf 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 * Write up to nB
146d0 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 uf bytes of rand
146d1 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 omness into zBuf
146d2 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
146d3 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 t winRandomness(
146d4 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
146d5 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 s, int nBuf, cha
146d6 72 20 2a 7a 42 75 66 29 7b 0d 0a 20 20 69 6e 74 r *zBuf){.. int
146d7 20 6e 20 3d 20 30 3b 0d 0a 20 20 55 4e 55 53 45 n = 0;.. UNUSE
146d8 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 D_PARAMETER(pVfs
146d9 29 3b 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
146da 53 51 4c 49 54 45 5f 54 45 53 54 29 0d 0a 20 20 SQLITE_TEST)..
146db 6e 20 3d 20 6e 42 75 66 3b 0d 0a 20 20 6d 65 6d n = nBuf;.. mem
146dc 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 set(zBuf, 0, nBu
146dd 66 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66 f);..#else.. if
146de 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 ( sizeof(SYSTEMT
146df 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0d IME)<=nBuf-n ){.
146e0 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 . SYSTEMTIME
146e1 78 3b 0d 0a 20 20 20 20 6f 73 47 65 74 53 79 73 x;.. osGetSys
146e2 74 65 6d 54 69 6d 65 28 26 78 29 3b 0d 0a 20 20 temTime(&x);..
146e3 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e memcpy(&zBuf[n
146e4 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 ], &x, sizeof(x)
146e5 29 3b 0d 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a );.. n += siz
146e6 65 6f 66 28 78 29 3b 0d 0a 20 20 7d 0d 0a 20 20 eof(x);.. }..
146e7 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 if( sizeof(DWORD
146e8 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0d 0a 20 20 )<=nBuf-n ){..
146e9 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 DWORD pid = os
146ea 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 GetCurrentProces
146eb 73 49 64 28 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 sId();.. memc
146ec 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 py(&zBuf[n], &pi
146ed 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b d, sizeof(pid));
146ee 0d 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f .. n += sizeo
146ef 66 28 70 69 64 29 3b 0d 0a 20 20 7d 0d 0a 20 20 f(pid);.. }..
146f0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 if( sizeof(DWORD
146f1 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0d 0a 20 20 )<=nBuf-n ){..
146f2 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 DWORD cnt = os
146f3 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0d GetTickCount();.
146f4 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 . memcpy(&zBu
146f5 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 f[n], &cnt, size
146f6 6f 66 28 63 6e 74 29 29 3b 0d 0a 20 20 20 20 6e of(cnt));.. n
146f7 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b += sizeof(cnt);
146f8 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 73 69 7a .. }.. if( siz
146f9 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 eof(LARGE_INTEGE
146fa 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0d 0a 20 R)<=nBuf-n ){..
146fb 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 LARGE_INTEGER
146fc 20 69 3b 0d 0a 20 20 20 20 6f 73 51 75 65 72 79 i;.. osQuery
146fd 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 PerformanceCount
146fe 65 72 28 26 69 29 3b 0d 0a 20 20 20 20 6d 65 6d er(&i);.. mem
146ff 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 cpy(&zBuf[n], &i
14700 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0d 0a 20 , sizeof(i));..
14701 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 n += sizeof(i
14702 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d );.. }..#endif.
14703 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d . return n;..}.
14704 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 6c 65 65 ...../*..** Slee
14705 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 p for a little w
14706 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 hile. Return th
14707 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 e amount of time
14708 20 73 6c 65 70 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 slept...*/..sta
14709 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 tic int winSleep
1470a 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
1470b 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 fs, int microsec
1470c 29 7b 0d 0a 20 20 6f 73 53 6c 65 65 70 28 28 6d ){.. osSleep((m
1470d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 icrosec+999)/100
1470e 30 29 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 0);.. UNUSED_PA
1470f 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0d 0a RAMETER(pVfs);..
14710 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f return ((micro
14711 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 sec+999)/1000)*1
14712 30 30 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 000;..}..../*..*
14713 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
14714 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 variable, if set
14715 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 to a non-zero v
14716 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 alue, is interpr
14717 65 74 65 64 20 61 73 0d 0a 2a 2a 20 74 68 65 20 eted as..** the
14718 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
14719 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 s since 1970 and
1471a 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 is used to set
1471b 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0d 0a 2a the result of..*
1471c 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 * sqlite3OsCurre
1471d 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 ntTime() during
1471e 74 65 73 74 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 69 testing...*/..#i
1471f 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
14720 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 ..SQLITE_API int
14721 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 sqlite3_current
14722 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 _time = 0; /* F
14723 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 ake system time
14724 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 in seconds since
14725 20 31 39 37 30 2e 20 2a 2f 0d 0a 23 65 6e 64 69 1970. */..#endi
14726 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 f..../*..** Find
14727 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d the current tim
14728 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 e (in Universal
14729 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 Coordinated Time
1472a 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a ). Write into *
1472b 70 69 4e 6f 77 0d 0a 2a 2a 20 74 68 65 20 63 75 piNow..** the cu
1472c 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 rrent time and d
1472d 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 ate as a Julian
1472e 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 Day number times
1472f 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 86_400_000. In
14730 0d 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 ..** other words
14731 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 , write into *pi
14732 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f Now the number o
14733 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 f milliseconds s
14734 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0d ince the Julian.
14735 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f .** epoch of noo
14736 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f n in Greenwich o
14737 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 n November 24, 4
14738 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 714 B.C accordin
14739 67 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 70 72 6f g to the..** pro
1473a 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e leptic Gregorian
1473b 20 63 61 6c 65 6e 64 61 72 2e 0d 0a 2a 2a 0d 0a calendar...**..
1473c 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 ** On success, r
1473d 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
1473e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f Return SQLITE_
1473f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d ERROR if the tim
14740 65 20 61 6e 64 20 64 61 74 65 20 0d 0a 2a 2a 20 e and date ..**
14741 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e cannot be found.
14742 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
14743 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 winCurrentTimeI
14744 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 nt64(sqlite3_vfs
14745 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f *pVfs, sqlite3_
14746 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0d 0a int64 *piNow){..
14747 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 /* FILETIME st
14748 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d ructure is a 64-
14749 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 bit value repres
1474a 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 enting the numbe
1474b 72 20 6f 66 20 0d 0a 20 20 20 20 20 31 30 30 2d r of .. 100-
1474c 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 nanosecond inter
1474d 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 vals since Janua
1474e 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 ry 1, 1601 (= JD
1474f 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0d 0a 20 2305813.5). ..
14750 20 2a 2f 0d 0a 20 20 46 49 4c 45 54 49 4d 45 20 */.. FILETIME
14751 66 74 3b 0d 0a 20 20 73 74 61 74 69 63 20 63 6f ft;.. static co
14752 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 nst sqlite3_int6
14753 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 4 winFiletimeEpo
14754 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 ch = 23058135*(s
14755 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 qlite3_int64)864
14756 30 30 30 30 3b 0d 0a 23 69 66 64 65 66 20 53 51 0000;..#ifdef SQ
14757 4c 49 54 45 5f 54 45 53 54 0d 0a 20 20 73 74 61 LITE_TEST.. sta
14758 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 tic const sqlite
14759 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 3_int64 unixEpoc
1475a 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 h = 24405875*(sq
1475b 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 lite3_int64)8640
1475c 30 30 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 000;..#endif..
1475d 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f /* 2^32 - to avo
1475e 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 id use of LL and
1475f 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 warnings in gcc
14760 20 2a 2f 0d 0a 20 20 73 74 61 74 69 63 20 63 6f */.. static co
14761 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 nst sqlite3_int6
14762 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 4 max32BitValue
14763 3d 20 0d 0a 20 20 20 20 20 20 28 73 71 6c 69 74 = .. (sqlit
14764 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 e3_int64)2000000
14765 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 000 + (sqlite3_i
14766 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 nt64)2000000000
14767 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 + (sqlite3_int64
14768 29 32 39 34 39 36 37 32 39 36 3b 0d 0a 0d 0a 23 )294967296;....#
14769 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
1476a 43 45 0d 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 CE.. SYSTEMTIME
1476b 20 74 69 6d 65 3b 0d 0a 20 20 6f 73 47 65 74 53 time;.. osGetS
1476c 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 ystemTime(&time)
1476d 3b 0d 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 ;.. /* if Syste
1476e 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 mTimeToFileTime(
1476f 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 ) fails, it retu
14770 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0d 0a 20 20 rns zero. */..
14771 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d if (!osSystemTim
14772 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d eToFileTime(&tim
14773 65 2c 26 66 74 29 29 7b 0d 0a 20 20 20 20 72 65 e,&ft)){.. re
14774 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
14775 52 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a R;.. }..#else..
14776 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d osGetSystemTim
14777 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 eAsFileTime( &ft
14778 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 );..#endif....
14779 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c *piNow = winFil
1477a 65 74 69 6d 65 45 70 6f 63 68 20 2b 0d 0a 20 20 etimeEpoch +..
1477b 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 ((((sq
1477c 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 lite3_int64)ft.d
1477d 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d wHighDateTime)*m
1477e 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 ax32BitValue) +
1477f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
14780 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 (sqlite3_int64)
14781 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 ft.dwLowDateTime
14782 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 )/(sqlite3_int64
14783 29 31 30 30 30 30 3b 0d 0a 0d 0a 23 69 66 64 65 )10000;....#ifde
14784 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0d 0a 20 f SQLITE_TEST..
14785 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 if( sqlite3_cur
14786 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0d 0a 20 20 rent_time ){..
14787 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a *piNow = 1000*
14788 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 (sqlite3_int64)s
14789 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 qlite3_current_t
1478a 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b ime + unixEpoch;
1478b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 .. }..#endif..
1478c 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
1478d 52 28 70 56 66 73 29 3b 0d 0a 20 20 72 65 74 75 R(pVfs);.. retu
1478e 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
1478f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 ..../*..** Find
14790 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 the current time
14791 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 (in Universal C
14792 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 oordinated Time)
14793 2e 20 20 57 72 69 74 65 20 74 68 65 0d 0a 2a 2a . Write the..**
14794 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e current time an
14795 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 d date as a Juli
14796 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e an Day number in
14797 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0d 0a 2a to *prNow and..*
14798 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 * return 0. Ret
14799 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d urn 1 if the tim
1479a 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f e and date canno
1479b 74 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 2a 2f 0d t be found...*/.
1479c 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 .static int winC
1479d 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 urrentTime(sqlit
1479e 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f e3_vfs *pVfs, do
1479f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0d 0a 20 uble *prNow){..
147a0 20 69 6e 74 20 72 63 3b 0d 0a 20 20 73 71 6c 69 int rc;.. sqli
147a1 74 65 33 5f 69 6e 74 36 34 20 69 3b 0d 0a 20 20 te3_int64 i;..
147a2 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 rc = winCurrentT
147a3 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 imeInt64(pVfs, &
147a4 69 29 3b 0d 0a 20 20 69 66 28 20 21 72 63 20 29 i);.. if( !rc )
147a5 7b 0d 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 {.. *prNow =
147a6 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0d 0a 20 i/86400000.0;..
147a7 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
147a8 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
147a9 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 e idea is that t
147aa 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 his function wor
147ab 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e ks like a combin
147ac 61 74 69 6f 6e 20 6f 66 0d 0a 2a 2a 20 47 65 74 ation of..** Get
147ad 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 LastError() and
147ae 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 FormatMessage()
147af 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 on Windows (or e
147b0 72 72 6e 6f 20 61 6e 64 0d 0a 2a 2a 20 73 74 72 rrno and..** str
147b1 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 error_r() on Uni
147b2 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 x). After an err
147b3 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 or is returned b
147b4 79 20 61 6e 20 4f 53 0d 0a 2a 2a 20 66 75 6e 63 y an OS..** func
147b5 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c tion, SQLite cal
147b6 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e ls this function
147b7 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 with zBuf point
147b8 69 6e 67 20 74 6f 0d 0a 2a 2a 20 61 20 62 75 66 ing to..** a buf
147b9 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 fer of nBuf byte
147ba 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 s. The OS layer
147bb 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 should populate
147bc 74 68 65 0d 0a 2a 2a 20 62 75 66 66 65 72 20 77 the..** buffer w
147bd 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e ith a nul-termin
147be 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 ated UTF-8 encod
147bf 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 ed error message
147c0 0d 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 ..** describing
147c1 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f the last IO erro
147c2 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 r to have occurr
147c3 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 ed within the ca
147c4 6c 6c 69 6e 67 0d 0a 2a 2a 20 74 68 72 65 61 64 lling..** thread
147c5 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
147c6 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 error message i
147c7 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 s too large for
147c8 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 the supplied buf
147c9 66 65 72 2c 0d 0a 2a 2a 20 69 74 20 73 68 6f 75 fer,..** it shou
147ca 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e ld be truncated.
147cb 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 The return valu
147cc 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 e of xGetLastErr
147cd 6f 72 0d 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 or..** is zero i
147ce 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 f the error mess
147cf 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 age fits in the
147d0 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a buffer, or non-z
147d1 65 72 6f 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73 ero..** otherwis
147d2 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 e (if the messag
147d3 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 e was truncated)
147d4 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 . If non-zero is
147d5 20 72 65 74 75 72 6e 65 64 2c 0d 0a 2a 2a 20 74 returned,..** t
147d6 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 hen it is not ne
147d7 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 cessary to inclu
147d8 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 de the nul-termi
147d9 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0d nator character.
147da 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 .** in the outpu
147db 74 20 62 75 66 66 65 72 2e 0d 0a 2a 2a 0d 0a 2a t buffer...**..*
147dc 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 * Not supplying
147dd 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
147de 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 will have no ad
147df 76 65 72 73 65 20 65 66 66 65 63 74 0d 0a 2a 2a verse effect..**
147e0 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 on SQLite. It i
147e1 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 s fine to have a
147e2 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e n implementation
147e3 20 74 68 61 74 20 6e 65 76 65 72 0d 0a 2a 2a 20 that never..**
147e4 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 returns an error
147e5 20 6d 65 73 73 61 67 65 3a 0d 0a 2a 2a 0d 0a 2a message:..**..*
147e6 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 * int xGetLast
147e7 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 Error(sqlite3_vf
147e8 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 s *pVfs, int nBu
147e9 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0d f, char *zBuf){.
147ea 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a .** assert(z
147eb 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0d 0a Buf[0]=='\0');..
147ec 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b ** return 0;
147ed 0d 0a 2a 2a 20 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2a ..** }..**..**
147ee 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 However if an e
147ef 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
147f0 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c supplied, it wil
147f1 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 l be incorporate
147f2 64 0d 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 d..** by sqlite
147f3 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d into the error m
147f4 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 essage available
147f5 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 to the user usi
147f6 6e 67 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 ng..** sqlite3_e
147f7 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c rrmsg(), possibl
147f8 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f y making IO erro
147f9 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 rs easier to deb
147fa 75 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ug...*/..static
147fb 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 int winGetLastEr
147fc 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 ror(sqlite3_vfs
147fd 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c *pVfs, int nBuf,
147fe 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0d 0a 20 char *zBuf){..
147ff 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
14800 52 28 70 56 66 73 29 3b 0d 0a 20 20 72 65 74 75 R(pVfs);.. retu
14801 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d rn getLastErrorM
14802 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f sg(osGetLastErro
14803 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 r(), nBuf, zBuf)
14804 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ;..}..../*..** I
14805 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 nitialize and de
14806 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f initialize the o
14807 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
14808 69 6e 74 65 72 66 61 63 65 2e 0d 0a 2a 2f 0d 0a interface...*/..
14809 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
1480a 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 qlite3_os_init(v
1480b 6f 69 64 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 oid){.. static
1480c 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 sqlite3_vfs winV
1480d 66 73 20 3d 20 7b 0d 0a 20 20 20 20 33 2c 20 20 fs = {.. 3,
1480e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1480f 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0d /* iVersion */.
14810 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 . sizeof(winF
14811 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f ile), /* szO
14812 73 46 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 4d 41 sFile */.. MA
14813 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 X_PATH,
14814 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 /* mxPathname
14815 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 20 20 20 20 */.. 0,
14816 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
14817 20 70 4e 65 78 74 20 2a 2f 0d 0a 20 20 20 20 22 pNext */.. "
14818 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 win32",
14819 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0d /* zName */.
1481a 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 . 0,
1481b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 /* pAp
1481c 70 44 61 74 61 20 2a 2f 0d 0a 20 20 20 20 77 69 pData */.. wi
1481d 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 nOpen,
1481e 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0d 0a /* xOpen */..
1481f 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 winDelete,
14820 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c /* xDel
14821 65 74 65 20 2a 2f 0d 0a 20 20 20 20 77 69 6e 41 ete */.. winA
14822 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 ccess,
14823 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0d 0a /* xAccess */..
14824 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e winFullPathn
14825 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c ame, /* xFul
14826 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0d 0a 20 20 lPathname */..
14827 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 winDlOpen,
14828 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 /* xDlOpe
14829 6e 20 2a 2f 0d 0a 20 20 20 20 77 69 6e 44 6c 45 n */.. winDlE
1482a 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f rror, /
1482b 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0d 0a 20 * xDlError */..
1482c 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 winDlSym,
1482d 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 /* xDlSy
1482e 6d 20 2a 2f 0d 0a 20 20 20 20 77 69 6e 44 6c 43 m */.. winDlC
1482f 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f lose, /
14830 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0d 0a 20 * xDlClose */..
14831 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 winRandomness
14832 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 , /* xRand
14833 6f 6d 6e 65 73 73 20 2a 2f 0d 0a 20 20 20 20 77 omness */.. w
14834 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 inSleep,
14835 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f /* xSleep */
14836 0d 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 .. winCurrent
14837 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 Time, /* xC
14838 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0d 0a 20 urrentTime */..
14839 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 winGetLastErr
1483a 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c or, /* xGetL
1483b 61 73 74 45 72 72 6f 72 20 2a 2f 0d 0a 20 20 20 astError */..
1483c 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 winCurrentTimeI
1483d 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e nt64, /* xCurren
1483e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0d 0a 20 tTimeInt64 */..
1483f 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 winSetSystemC
14840 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 all, /* xSetS
14841 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0d 0a 20 20 ystemCall */..
14842 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 winGetSystemCa
14843 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 ll, /* xGetSy
14844 73 74 65 6d 43 61 6c 6c 20 2a 2f 0d 0a 20 20 20 stemCall */..
14845 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 winNextSystemCa
14846 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 ll, /* xNextSy
14847 73 74 65 6d 43 61 6c 6c 20 2a 2f 0d 0a 20 20 7d stemCall */.. }
14848 3b 0d 0a 0d 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 ;.... /* Double
14849 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 -check that the
1484a 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 aSyscall[] array
1484b 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 has been constr
1484c 75 63 74 65 64 0d 0a 20 20 2a 2a 20 63 6f 72 72 ucted.. ** corr
1484d 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b ectly. See tick
1484e 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 et [bb3a86e890c8
1484f 65 39 36 61 62 5d 20 2a 2f 0d 0a 20 20 61 73 73 e96ab] */.. ass
14850 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 ert( ArraySize(a
14851 53 79 73 63 61 6c 6c 29 3d 3d 36 30 20 29 3b 0d Syscall)==60 );.
14852 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
14853 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 2f 2a E_OMIT_WAL.. /*
14854 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 get memory map
14855 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 allocation granu
14856 6c 61 72 69 74 79 20 2a 2f 0d 0a 20 20 6d 65 6d larity */.. mem
14857 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c set(&winSysInfo,
14858 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 0, sizeof(SYSTE
14859 4d 5f 49 4e 46 4f 29 29 3b 0d 0a 20 20 6f 73 47 M_INFO));.. osG
1485a 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 etSystemInfo(&wi
1485b 6e 53 79 73 49 6e 66 6f 29 3b 0d 0a 20 20 61 73 nSysInfo);.. as
1485c 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e sert(winSysInfo.
1485d 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e dwAllocationGran
1485e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0d 0a 23 ularity > 0);..#
1485f 65 6e 64 69 66 0d 0a 0d 0a 20 20 73 71 6c 69 74 endif.... sqlit
14860 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 e3_vfs_register(
14861 26 77 69 6e 56 66 73 2c 20 31 29 3b 0d 0a 20 20 &winVfs, 1);..
14862 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
14863 3b 20 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f ; ..}....SQLITE_
14864 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f API int sqlite3_
14865 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0d 0a os_end(void){ ..
14866 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
14867 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 OK;..}....#endif
14868 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 /* SQLITE_OS_WI
14869 4e 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a N */..../*******
1486a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 6f ******* End of o
1486b 73 5f 77 69 6e 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a s_win.c ********
1486c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1486d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1486e 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
1486f 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 ******** Begin f
14870 69 6c 65 20 62 69 74 76 65 63 2e 63 20 2a 2a 2a ile bitvec.c ***
14871 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14872 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14873 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a *******/../*..**
14874 20 32 30 30 38 20 46 65 62 72 75 61 72 79 20 31 2008 February 1
14875 36 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 6..**..** The au
14876 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
14877 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
14878 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
14879 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 n place of..** a
1487a 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
1487b 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
1487c 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 g:..**..** Ma
1487d 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
1487e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 d not evil...**
1487f 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
14880 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
14881 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
14882 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a give others...**
14883 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 May you shar
14884 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 e freely, never
14885 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e taking more than
14886 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a you give...**..
14887 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14888 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14889 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1488a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1488b 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 *********..** Th
1488c 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e is file implemen
1488d 74 73 20 61 6e 20 6f 62 6a 65 63 74 20 74 68 61 ts an object tha
1488e 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 66 t represents a f
1488f 69 78 65 64 2d 6c 65 6e 67 74 68 0d 0a 2a 2a 20 ixed-length..**
14890 62 69 74 6d 61 70 2e 20 20 42 69 74 73 20 61 72 bitmap. Bits ar
14891 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 e numbered start
14892 69 6e 67 20 77 69 74 68 20 31 2e 0d 0a 2a 2a 0d ing with 1...**.
14893 0a 2a 2a 20 41 20 62 69 74 6d 61 70 20 69 73 20 .** A bitmap is
14894 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 used to record w
14895 68 69 63 68 20 70 61 67 65 73 20 6f 66 20 61 20 hich pages of a
14896 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 database file ha
14897 76 65 20 62 65 65 6e 0d 0a 2a 2a 20 6a 6f 75 72 ve been..** jour
14898 6e 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 nalled during a
14899 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 transaction, or
1489a 77 68 69 63 68 20 70 61 67 65 73 20 68 61 76 65 which pages have
1489b 20 74 68 65 20 22 64 6f 6e 74 2d 77 72 69 74 65 the "dont-write
1489c 22 0d 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 20 "..** property.
1489d 20 55 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 61 20 Usually only a
1489e 66 65 77 20 70 61 67 65 73 20 61 72 65 20 6d 65 few pages are me
1489f 65 74 20 65 69 74 68 65 72 20 63 6f 6e 64 69 74 et either condit
148a0 69 6f 6e 2e 0d 0a 2a 2a 20 53 6f 20 74 68 65 20 ion...** So the
148a1 62 69 74 6d 61 70 20 69 73 20 75 73 75 61 6c 6c bitmap is usuall
148a2 79 20 73 70 61 72 73 65 20 61 6e 64 20 68 61 73 y sparse and has
148a3 20 6c 6f 77 20 63 61 72 64 69 6e 61 6c 69 74 79 low cardinality
148a4 2e 0d 0a 2a 2a 20 42 75 74 20 73 6f 6d 65 74 69 ...** But someti
148a5 6d 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 mes (for example
148a6 20 77 68 65 6e 20 64 75 72 69 6e 67 20 61 20 44 when during a D
148a7 52 4f 50 20 6f 66 20 61 20 6c 61 72 67 65 20 74 ROP of a large t
148a8 61 62 6c 65 29 20 6d 6f 73 74 0d 0a 2a 2a 20 6f able) most..** o
148a9 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 r all of the pag
148aa 65 73 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 es in a database
148ab 20 63 61 6e 20 67 65 74 20 6a 6f 75 72 6e 61 6c can get journal
148ac 6c 65 64 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 led. In those c
148ad 61 73 65 73 2c 20 0d 0a 2a 2a 20 74 68 65 20 62 ases, ..** the b
148ae 69 74 6d 61 70 20 62 65 63 6f 6d 65 73 20 64 65 itmap becomes de
148af 6e 73 65 20 77 69 74 68 20 68 69 67 68 20 63 61 nse with high ca
148b0 72 64 69 6e 61 6c 69 74 79 2e 20 20 54 68 65 20 rdinality. The
148b1 61 6c 67 6f 72 69 74 68 6d 20 6e 65 65 64 73 20 algorithm needs
148b2 0d 0a 2a 2a 20 74 6f 20 68 61 6e 64 6c 65 20 62 ..** to handle b
148b3 6f 74 68 20 63 61 73 65 73 20 77 65 6c 6c 2e 0d oth cases well..
148b4 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 69 7a 65 .**..** The size
148b5 20 6f 66 20 74 68 65 20 62 69 74 6d 61 70 20 69 of the bitmap i
148b6 73 20 66 69 78 65 64 20 77 68 65 6e 20 74 68 65 s fixed when the
148b7 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 object is creat
148b8 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 ed...**..** All
148b9 62 69 74 73 20 61 72 65 20 63 6c 65 61 72 20 77 bits are clear w
148ba 68 65 6e 20 74 68 65 20 62 69 74 6d 61 70 20 69 hen the bitmap i
148bb 73 20 63 72 65 61 74 65 64 2e 20 20 49 6e 64 69 s created. Indi
148bc 76 69 64 75 61 6c 20 62 69 74 73 0d 0a 2a 2a 20 vidual bits..**
148bd 6d 61 79 20 62 65 20 73 65 74 20 6f 72 20 63 6c may be set or cl
148be 65 61 72 65 64 20 6f 6e 65 20 61 74 20 61 20 74 eared one at a t
148bf 69 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 65 73 ime...**..** Tes
148c0 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 t operations are
148c1 20 61 62 6f 75 74 20 31 30 30 20 74 69 6d 65 73 about 100 times
148c2 20 6d 6f 72 65 20 63 6f 6d 6d 6f 6e 20 74 68 61 more common tha
148c3 74 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 t set operations
148c4 2e 0d 0a 2a 2a 20 43 6c 65 61 72 20 6f 70 65 72 ...** Clear oper
148c5 61 74 69 6f 6e 73 20 61 72 65 20 65 78 63 65 65 ations are excee
148c6 64 69 6e 67 6c 79 20 72 61 72 65 2e 20 20 54 68 dingly rare. Th
148c7 65 72 65 20 61 72 65 20 75 73 75 61 6c 6c 79 20 ere are usually
148c8 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 35 20 61 6e between..** 5 an
148c9 64 20 35 30 30 20 73 65 74 20 6f 70 65 72 61 74 d 500 set operat
148ca 69 6f 6e 73 20 70 65 72 20 42 69 74 76 65 63 20 ions per Bitvec
148cb 6f 62 6a 65 63 74 2c 20 74 68 6f 75 67 68 20 74 object, though t
148cc 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 74 he number of set
148cd 73 20 63 61 6e 0d 0a 2a 2a 20 73 6f 6d 65 74 69 s can..** someti
148ce 6d 65 73 20 67 72 6f 77 20 69 6e 74 6f 20 74 65 mes grow into te
148cf 6e 73 20 6f 66 20 74 68 6f 75 73 61 6e 64 73 20 ns of thousands
148d0 6f 72 20 6c 61 72 67 65 72 2e 20 20 54 68 65 20 or larger. The
148d1 73 69 7a 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 size of the..**
148d2 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 69 73 Bitvec object is
148d3 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 the number of p
148d4 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 ages in the data
148d5 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 base file at the
148d6 0d 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 ..** start of a
148d7 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 transaction, and
148d8 20 69 73 20 74 68 75 73 20 75 73 75 61 6c 6c 79 is thus usually
148d9 20 6c 65 73 73 20 74 68 61 6e 20 61 20 66 65 77 less than a few
148da 20 74 68 6f 75 73 61 6e 64 2c 0d 0a 2a 2a 20 62 thousand,..** b
148db 75 74 20 63 61 6e 20 62 65 20 61 73 20 6c 61 72 ut can be as lar
148dc 67 65 20 61 73 20 32 20 62 69 6c 6c 69 6f 6e 20 ge as 2 billion
148dd 66 6f 72 20 61 20 72 65 61 6c 6c 79 20 62 69 67 for a really big
148de 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2f 0d 0a database...*/..
148df 0d 0a 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 ../* Size of the
148e0 20 42 69 74 76 65 63 20 73 74 72 75 63 74 75 72 Bitvec structur
148e1 65 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0d 0a e in bytes. */..
148e2 23 64 65 66 69 6e 65 20 42 49 54 56 45 43 5f 53 #define BITVEC_S
148e3 5a 20 20 20 20 20 20 20 20 35 31 32 0d 0a 0d 0a Z 512....
148e4 2f 2a 20 52 6f 75 6e 64 20 74 68 65 20 75 6e 69 /* Round the uni
148e5 6f 6e 20 73 69 7a 65 20 64 6f 77 6e 20 74 6f 20 on size down to
148e6 74 68 65 20 6e 65 61 72 65 73 74 20 70 6f 69 6e the nearest poin
148e7 74 65 72 20 62 6f 75 6e 64 61 72 79 2c 20 73 69 ter boundary, si
148e8 6e 63 65 20 74 68 61 74 27 73 20 68 6f 77 20 0d nce that's how .
148e9 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 61 .** it will be a
148ea 6c 69 67 6e 65 64 20 77 69 74 68 69 6e 20 74 68 ligned within th
148eb 65 20 42 69 74 76 65 63 20 73 74 72 75 63 74 2e e Bitvec struct.
148ec 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 49 54 */..#define BIT
148ed 56 45 43 5f 55 53 49 5a 45 20 20 20 20 20 28 28 VEC_USIZE ((
148ee 28 42 49 54 56 45 43 5f 53 5a 2d 28 33 2a 73 69 (BITVEC_SZ-(3*si
148ef 7a 65 6f 66 28 75 33 32 29 29 29 2f 73 69 7a 65 zeof(u32)))/size
148f0 6f 66 28 42 69 74 76 65 63 2a 29 29 2a 73 69 7a of(Bitvec*))*siz
148f1 65 6f 66 28 42 69 74 76 65 63 2a 29 29 0d 0a 0d eof(Bitvec*))...
148f2 0a 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 ./* Type of the
148f3 61 72 72 61 79 20 22 65 6c 65 6d 65 6e 74 22 20 array "element"
148f4 66 6f 72 20 74 68 65 20 62 69 74 6d 61 70 20 72 for the bitmap r
148f5 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 0d epresentation. .
148f6 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 61 20 .** Should be a
148f7 70 6f 77 65 72 20 6f 66 20 32 2c 20 61 6e 64 20 power of 2, and
148f8 69 64 65 61 6c 6c 79 2c 20 65 76 65 6e 6c 79 20 ideally, evenly
148f9 64 69 76 69 64 65 20 69 6e 74 6f 20 42 49 54 56 divide into BITV
148fa 45 43 5f 55 53 49 5a 45 2e 20 0d 0a 2a 2a 20 53 EC_USIZE. ..** S
148fb 65 74 74 69 6e 67 20 74 68 69 73 20 74 6f 20 74 etting this to t
148fc 68 65 20 22 6e 61 74 75 72 61 6c 20 77 6f 72 64 he "natural word
148fd 22 20 73 69 7a 65 20 6f 66 20 79 6f 75 72 20 43 " size of your C
148fe 50 55 20 6d 61 79 20 69 6d 70 72 6f 76 65 0d 0a PU may improve..
148ff 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 ** performance.
14900 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 49 54 56 */..#define BITV
14901 45 43 5f 54 45 4c 45 4d 20 20 20 20 20 75 38 0d EC_TELEM u8.
14902 0a 2f 2a 20 53 69 7a 65 2c 20 69 6e 20 62 69 74 ./* Size, in bit
14903 73 2c 20 6f 66 20 74 68 65 20 62 69 74 6d 61 70 s, of the bitmap
14904 20 65 6c 65 6d 65 6e 74 2e 20 2a 2f 0d 0a 23 64 element. */..#d
14905 65 66 69 6e 65 20 42 49 54 56 45 43 5f 53 5a 45 efine BITVEC_SZE
14906 4c 45 4d 20 20 20 20 38 0d 0a 2f 2a 20 4e 75 6d LEM 8../* Num
14907 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 ber of elements
14908 69 6e 20 61 20 62 69 74 6d 61 70 20 61 72 72 61 in a bitmap arra
14909 79 2e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 y. */..#define B
1490a 49 54 56 45 43 5f 4e 45 4c 45 4d 20 20 20 20 20 ITVEC_NELEM
1490b 28 42 49 54 56 45 43 5f 55 53 49 5a 45 2f 73 69 (BITVEC_USIZE/si
1490c 7a 65 6f 66 28 42 49 54 56 45 43 5f 54 45 4c 45 zeof(BITVEC_TELE
1490d 4d 29 29 0d 0a 2f 2a 20 4e 75 6d 62 65 72 20 6f M))../* Number o
1490e 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 f bits in the bi
1490f 74 6d 61 70 20 61 72 72 61 79 2e 20 2a 2f 0d 0a tmap array. */..
14910 23 64 65 66 69 6e 65 20 42 49 54 56 45 43 5f 4e #define BITVEC_N
14911 42 49 54 20 20 20 20 20 20 28 42 49 54 56 45 43 BIT (BITVEC
14912 5f 4e 45 4c 45 4d 2a 42 49 54 56 45 43 5f 53 5a _NELEM*BITVEC_SZ
14913 45 4c 45 4d 29 0d 0a 0d 0a 2f 2a 20 4e 75 6d 62 ELEM)..../* Numb
14914 65 72 20 6f 66 20 75 33 32 20 76 61 6c 75 65 73 er of u32 values
14915 20 69 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20 in hash table.
14916 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 49 54 56 */..#define BITV
14917 45 43 5f 4e 49 4e 54 20 20 20 20 20 20 28 42 49 EC_NINT (BI
14918 54 56 45 43 5f 55 53 49 5a 45 2f 73 69 7a 65 6f TVEC_USIZE/sizeo
14919 66 28 75 33 32 29 29 0d 0a 2f 2a 20 4d 61 78 69 f(u32))../* Maxi
1491a 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e mum number of en
1491b 74 72 69 65 73 20 69 6e 20 68 61 73 68 20 74 61 tries in hash ta
1491c 62 6c 65 20 62 65 66 6f 72 65 20 0d 0a 2a 2a 20 ble before ..**
1491d 73 75 62 2d 64 69 76 69 64 69 6e 67 20 61 6e 64 sub-dividing and
1491e 20 72 65 2d 68 61 73 68 69 6e 67 2e 20 2a 2f 0d re-hashing. */.
1491f 0a 23 64 65 66 69 6e 65 20 42 49 54 56 45 43 5f .#define BITVEC_
14920 4d 58 48 41 53 48 20 20 20 20 28 42 49 54 56 45 MXHASH (BITVE
14921 43 5f 4e 49 4e 54 2f 32 29 0d 0a 2f 2a 20 48 61 C_NINT/2)../* Ha
14922 73 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 shing function f
14923 6f 72 20 74 68 65 20 61 48 61 73 68 20 72 65 70 or the aHash rep
14924 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0d 0a 2a 2a resentation...**
14925 20 45 6d 70 69 72 69 63 61 6c 20 74 65 73 74 69 Empirical testi
14926 6e 67 20 73 68 6f 77 65 64 20 74 68 61 74 20 74 ng showed that t
14927 68 65 20 2a 33 37 20 6d 75 6c 74 69 70 6c 69 65 he *37 multiplie
14928 72 20 0d 0a 2a 2a 20 28 61 6e 20 61 72 62 69 74 r ..** (an arbit
14929 72 61 72 79 20 70 72 69 6d 65 29 69 6e 20 74 68 rary prime)in th
1492a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
1492b 70 72 6f 76 69 64 65 64 20 0d 0a 2a 2a 20 6e 6f provided ..** no
1492c 20 66 65 77 65 72 20 63 6f 6c 6c 69 73 69 6f 6e fewer collision
1492d 73 20 74 68 61 6e 20 74 68 65 20 6e 6f 2d 6f 70 s than the no-op
1492e 20 2a 31 2e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 *1. */..#define
1492f 20 42 49 54 56 45 43 5f 48 41 53 48 28 58 29 20 BITVEC_HASH(X)
14930 20 20 28 28 28 58 29 2a 31 29 25 42 49 54 56 45 (((X)*1)%BITVE
14931 43 5f 4e 49 4e 54 29 0d 0a 0d 0a 23 64 65 66 69 C_NINT)....#defi
14932 6e 65 20 42 49 54 56 45 43 5f 4e 50 54 52 20 20 ne BITVEC_NPTR
14933 20 20 20 20 28 42 49 54 56 45 43 5f 55 53 49 5a (BITVEC_USIZ
14934 45 2f 73 69 7a 65 6f 66 28 42 69 74 76 65 63 20 E/sizeof(Bitvec
14935 2a 29 29 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 *))....../*..**
14936 41 20 62 69 74 6d 61 70 20 69 73 20 61 6e 20 69 A bitmap is an i
14937 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 nstance of the f
14938 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 ollowing structu
14939 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 re...**..** This
1493a 20 62 69 74 6d 61 70 20 72 65 63 6f 72 64 73 20 bitmap records
1493b 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 the existance of
1493c 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 62 69 zero or more bi
1493d 74 73 0d 0a 2a 2a 20 77 69 74 68 20 76 61 6c 75 ts..** with valu
1493e 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 es between 1 and
1493f 20 69 53 69 7a 65 2c 20 69 6e 63 6c 75 73 69 76 iSize, inclusiv
14940 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 e...**..** There
14941 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 are three possi
14942 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 ble representati
14943 6f 6e 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61 ons of the bitma
14944 70 2e 0d 0a 2a 2a 20 49 66 20 69 53 69 7a 65 3c p...** If iSize<
14945 3d 42 49 54 56 45 43 5f 4e 42 49 54 2c 20 74 68 =BITVEC_NBIT, th
14946 65 6e 20 42 69 74 76 65 63 2e 75 2e 61 42 69 74 en Bitvec.u.aBit
14947 6d 61 70 5b 5d 20 69 73 20 61 20 73 74 72 61 69 map[] is a strai
14948 67 68 74 0d 0a 2a 2a 20 62 69 74 6d 61 70 2e 20 ght..** bitmap.
14949 20 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 The least signi
1494a 66 69 63 61 6e 74 20 62 69 74 20 69 73 20 62 69 ficant bit is bi
1494b 74 20 31 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 t 1...**..** If
1494c 69 53 69 7a 65 3e 42 49 54 56 45 43 5f 4e 42 49 iSize>BITVEC_NBI
1494d 54 20 61 6e 64 20 69 44 69 76 69 73 6f 72 3d 3d T and iDivisor==
1494e 30 20 74 68 65 6e 20 42 69 74 76 65 63 2e 75 2e 0 then Bitvec.u.
1494f 61 48 61 73 68 5b 5d 20 69 73 0d 0a 2a 2a 20 61 aHash[] is..** a
14950 20 68 61 73 68 20 74 61 62 6c 65 20 74 68 61 74 hash table that
14951 20 77 69 6c 6c 20 68 6f 6c 64 20 75 70 20 74 6f will hold up to
14952 20 42 49 54 56 45 43 5f 4d 58 48 41 53 48 20 64 BITVEC_MXHASH d
14953 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73 2e 0d istinct values..
14954 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 .**..** Otherwis
14955 65 2c 20 74 68 65 20 76 61 6c 75 65 20 69 20 69 e, the value i i
14956 73 20 72 65 64 69 72 65 63 74 65 64 20 69 6e 74 s redirected int
14957 6f 20 6f 6e 65 20 6f 66 20 42 49 54 56 45 43 5f o one of BITVEC_
14958 4e 50 54 52 0d 0a 2a 2a 20 73 75 62 2d 62 69 74 NPTR..** sub-bit
14959 6d 61 70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 maps pointed to
1495a 62 79 20 42 69 74 76 65 63 2e 75 2e 61 70 53 75 by Bitvec.u.apSu
1495b 62 5b 5d 2e 20 20 45 61 63 68 20 73 75 62 62 69 b[]. Each subbi
1495c 74 6d 61 70 0d 0a 2a 2a 20 68 61 6e 64 6c 65 73 tmap..** handles
1495d 20 75 70 20 74 6f 20 69 44 69 76 69 73 6f 72 20 up to iDivisor
1495e 73 65 70 61 72 61 74 65 20 76 61 6c 75 65 73 20 separate values
1495f 6f 66 20 69 2e 20 20 61 70 53 75 62 5b 30 5d 20 of i. apSub[0]
14960 68 6f 6c 64 73 0d 0a 2a 2a 20 76 61 6c 75 65 73 holds..** values
14961 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 69 between 1 and i
14962 44 69 76 69 73 6f 72 2e 20 20 61 70 53 75 62 5b Divisor. apSub[
14963 31 5d 20 68 6f 6c 64 73 20 76 61 6c 75 65 73 20 1] holds values
14964 62 65 74 77 65 65 6e 0d 0a 2a 2a 20 69 44 69 76 between..** iDiv
14965 69 73 6f 72 2b 31 20 61 6e 64 20 32 2a 69 44 69 isor+1 and 2*iDi
14966 76 69 73 6f 72 2e 20 20 61 70 53 75 62 5b 4e 5d visor. apSub[N]
14967 20 68 6f 6c 64 73 20 76 61 6c 75 65 73 20 62 65 holds values be
14968 74 77 65 65 6e 0d 0a 2a 2a 20 4e 2a 69 44 69 76 tween..** N*iDiv
14969 69 73 6f 72 2b 31 20 61 6e 64 20 28 4e 2b 31 29 isor+1 and (N+1)
1496a 2a 69 44 69 76 69 73 6f 72 2e 20 20 45 61 63 68 *iDivisor. Each
1496b 20 73 75 62 62 69 74 6d 61 70 20 69 73 20 6e 6f subbitmap is no
1496c 72 6d 61 6c 69 7a 65 64 0d 0a 2a 2a 20 74 6f 20 rmalized..** to
1496d 68 6f 6c 64 20 64 65 61 6c 20 77 69 74 68 20 76 hold deal with v
1496e 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 alues between 1
1496f 61 6e 64 20 69 44 69 76 69 73 6f 72 2e 0d 0a 2a and iDivisor...*
14970 2f 0d 0a 73 74 72 75 63 74 20 42 69 74 76 65 63 /..struct Bitvec
14971 20 7b 0d 0a 20 20 75 33 32 20 69 53 69 7a 65 3b {.. u32 iSize;
14972 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d /* Maximum
14973 20 62 69 74 20 69 6e 64 65 78 2e 20 20 4d 61 78 bit index. Max
14974 20 69 53 69 7a 65 20 69 73 20 34 2c 32 39 34 2c iSize is 4,294,
14975 39 36 37 2c 32 39 36 2e 20 2a 2f 0d 0a 20 20 75 967,296. */.. u
14976 33 32 20 6e 53 65 74 3b 20 20 20 20 20 20 20 2f 32 nSet; /
14977 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 * Number of bits
14978 20 74 68 61 74 20 61 72 65 20 73 65 74 20 2d 20 that are set -
14979 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 only valid for a
1497a 48 61 73 68 0d 0a 20 20 20 20 20 20 20 20 20 20 Hash..
1497b 20 20 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 ** eleme
1497c 6e 74 2e 20 20 4d 61 78 20 69 73 20 42 49 54 56 nt. Max is BITV
1497d 45 43 5f 4e 49 4e 54 2e 20 20 46 6f 72 20 42 49 EC_NINT. For BI
1497e 54 56 45 43 5f 53 5a 20 6f 66 20 35 31 32 2c 0d TVEC_SZ of 512,.
1497f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
14980 20 20 20 2a 2a 20 74 68 69 73 20 77 6f 75 6c 64 ** this would
14981 20 62 65 20 31 32 35 2e 20 2a 2f 0d 0a 20 20 75 be 125. */.. u
14982 33 32 20 69 44 69 76 69 73 6f 72 3b 20 20 20 2f 32 iDivisor; /
14983 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 * Number of bits
14984 20 68 61 6e 64 6c 65 64 20 62 79 20 65 61 63 68 handled by each
14985 20 61 70 53 75 62 5b 5d 20 65 6e 74 72 79 2e 20 apSub[] entry.
14986 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 */..
14987 20 20 20 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20 /* Should
14988 3e 3d 30 20 66 6f 72 20 61 70 53 75 62 20 65 6c >=0 for apSub el
14989 65 6d 65 6e 74 2e 20 2a 2f 0d 0a 20 20 20 20 20 ement. */..
1498a 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1498b 4d 61 78 20 69 44 69 76 69 73 6f 72 20 69 73 20 Max iDivisor is
1498c 6d 61 78 28 75 33 32 29 20 2f 20 42 49 54 56 45 max(u32) / BITVE
1498d 43 5f 4e 50 54 52 20 2b 20 31 2e 20 20 2a 2f 0d C_NPTR + 1. */.
1498e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1498f 20 20 20 2f 2a 20 46 6f 72 20 61 20 42 49 54 56 /* For a BITV
14990 45 43 5f 53 5a 20 6f 66 20 35 31 32 2c 20 74 68 EC_SZ of 512, th
14991 69 73 20 77 6f 75 6c 64 20 62 65 20 33 34 2c 33 is would be 34,3
14992 35 39 2c 37 33 39 2e 20 2a 2f 0d 0a 20 20 75 6e 59,739. */.. un
14993 69 6f 6e 20 7b 0d 0a 20 20 20 20 42 49 54 56 45 ion {.. BITVE
14994 43 5f 54 45 4c 45 4d 20 61 42 69 74 6d 61 70 5b C_TELEM aBitmap[
14995 42 49 54 56 45 43 5f 4e 45 4c 45 4d 5d 3b 20 20 BITVEC_NELEM];
14996 20 20 2f 2a 20 42 69 74 6d 61 70 20 72 65 70 72 /* Bitmap repr
14997 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0d 0a 20 esentation */..
14998 20 20 20 75 33 32 20 61 48 61 73 68 5b 42 49 54 u32 aHash[BIT
14999 56 45 43 5f 4e 49 4e 54 5d 3b 20 20 20 20 20 20 VEC_NINT];
1499a 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 72 65 /* Hash table re
1499b 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0d presentation */.
1499c 0a 20 20 20 20 42 69 74 76 65 63 20 2a 61 70 53 . Bitvec *apS
1499d 75 62 5b 42 49 54 56 45 43 5f 4e 50 54 52 5d 3b ub[BITVEC_NPTR];
1499e 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 20 72 /* Recursive r
1499f 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f epresentation */
149a0 0d 0a 20 20 7d 20 75 3b 0d 0a 7d 3b 0d 0a 0d 0a .. } u;..};....
149a1 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 /*..** Create a
149a2 6e 65 77 20 62 69 74 6d 61 70 20 6f 62 6a 65 63 new bitmap objec
149a3 74 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 t able to handle
149a4 20 62 69 74 73 20 62 65 74 77 65 65 6e 20 30 20 bits between 0
149a5 61 6e 64 20 69 53 69 7a 65 2c 0d 0a 2a 2a 20 69 and iSize,..** i
149a6 6e 63 6c 75 73 69 76 65 2e 20 20 52 65 74 75 72 nclusive. Retur
149a7 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 n a pointer to t
149a8 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 20 he new object.
149a9 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 0d Return NULL if .
149aa 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 .** malloc fails
149ab 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
149ac 49 56 41 54 45 20 42 69 74 76 65 63 20 2a 73 71 IVATE Bitvec *sq
149ad 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 lite3BitvecCreat
149ae 65 28 75 33 32 20 69 53 69 7a 65 29 7b 0d 0a 20 e(u32 iSize){..
149af 20 42 69 74 76 65 63 20 2a 70 3b 0d 0a 20 20 61 Bitvec *p;.. a
149b0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 2a 70 ssert( sizeof(*p
149b1 29 3d 3d 42 49 54 56 45 43 5f 53 5a 20 29 3b 0d )==BITVEC_SZ );.
149b2 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 . p = sqlite3Ma
149b3 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 llocZero( sizeof
149b4 28 2a 70 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 (*p) );.. if( p
149b5 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 69 53 69 7a ){.. p->iSiz
149b6 65 20 3d 20 69 53 69 7a 65 3b 0d 0a 20 20 7d 0d e = iSize;.. }.
149b7 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d . return p;..}.
149b8 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 65 63 6b 20 .../*..** Check
149b9 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 69 2d to see if the i-
149ba 74 68 20 62 69 74 20 69 73 20 73 65 74 2e 20 20 th bit is set.
149bb 52 65 74 75 72 6e 20 74 72 75 65 20 6f 72 20 66 Return true or f
149bc 61 6c 73 65 2e 0d 0a 2a 2a 20 49 66 20 70 20 69 alse...** If p i
149bd 73 20 4e 55 4c 4c 20 28 69 66 20 74 68 65 20 62 s NULL (if the b
149be 69 74 6d 61 70 20 68 61 73 20 6e 6f 74 20 62 65 itmap has not be
149bf 65 6e 20 63 72 65 61 74 65 64 29 20 6f 72 20 69 en created) or i
149c0 66 0d 0a 2a 2a 20 69 20 69 73 20 6f 75 74 20 6f f..** i is out o
149c1 66 20 72 61 6e 67 65 2c 20 74 68 65 6e 20 72 65 f range, then re
149c2 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 2a 2f 0d turn false...*/.
149c3 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
149c4 69 6e 74 20 73 71 6c 69 74 65 33 42 69 74 76 65 int sqlite3Bitve
149c5 63 54 65 73 74 28 42 69 74 76 65 63 20 2a 70 2c cTest(Bitvec *p,
149c6 20 75 33 32 20 69 29 7b 0d 0a 20 20 69 66 28 20 u32 i){.. if(
149c7 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b p==0 ) return 0;
149c8 0d 0a 20 20 69 66 28 20 69 3e 70 2d 3e 69 53 69 .. if( i>p->iSi
149c9 7a 65 20 7c 7c 20 69 3d 3d 30 20 29 20 72 65 74 ze || i==0 ) ret
149ca 75 72 6e 20 30 3b 0d 0a 20 20 69 2d 2d 3b 0d 0a urn 0;.. i--;..
149cb 20 20 77 68 69 6c 65 28 20 70 2d 3e 69 44 69 76 while( p->iDiv
149cc 69 73 6f 72 20 29 7b 0d 0a 20 20 20 20 75 33 32 isor ){.. u32
149cd 20 62 69 6e 20 3d 20 69 2f 70 2d 3e 69 44 69 76 bin = i/p->iDiv
149ce 69 73 6f 72 3b 0d 0a 20 20 20 20 69 20 3d 20 69 isor;.. i = i
149cf 25 70 2d 3e 69 44 69 76 69 73 6f 72 3b 0d 0a 20 %p->iDivisor;..
149d0 20 20 20 70 20 3d 20 70 2d 3e 75 2e 61 70 53 75 p = p->u.apSu
149d1 62 5b 62 69 6e 5d 3b 0d 0a 20 20 20 20 69 66 20 b[bin];.. if
149d2 28 21 70 29 20 7b 0d 0a 20 20 20 20 20 20 72 65 (!p) {.. re
149d3 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a turn 0;.. }..
149d4 20 20 7d 0d 0a 20 20 69 66 28 20 70 2d 3e 69 53 }.. if( p->iS
149d5 69 7a 65 3c 3d 42 49 54 56 45 43 5f 4e 42 49 54 ize<=BITVEC_NBIT
149d6 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
149d7 28 70 2d 3e 75 2e 61 42 69 74 6d 61 70 5b 69 2f (p->u.aBitmap[i/
149d8 42 49 54 56 45 43 5f 53 5a 45 4c 45 4d 5d 20 26 BITVEC_SZELEM] &
149d9 20 28 31 3c 3c 28 69 26 28 42 49 54 56 45 43 5f (1<<(i&(BITVEC_
149da 53 5a 45 4c 45 4d 2d 31 29 29 29 29 21 3d 30 3b SZELEM-1))))!=0;
149db 0d 0a 20 20 7d 20 65 6c 73 65 7b 0d 0a 20 20 20 .. } else{..
149dc 20 75 33 32 20 68 20 3d 20 42 49 54 56 45 43 5f u32 h = BITVEC_
149dd 48 41 53 48 28 69 2b 2b 29 3b 0d 0a 20 20 20 20 HASH(i++);..
149de 77 68 69 6c 65 28 20 70 2d 3e 75 2e 61 48 61 73 while( p->u.aHas
149df 68 5b 68 5d 20 29 7b 0d 0a 20 20 20 20 20 20 69 h[h] ){.. i
149e0 66 28 20 70 2d 3e 75 2e 61 48 61 73 68 5b 68 5d f( p->u.aHash[h]
149e1 3d 3d 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0d ==i ) return 1;.
149e2 0a 20 20 20 20 20 20 68 20 3d 20 28 68 2b 31 29 . h = (h+1)
149e3 20 25 20 42 49 54 56 45 43 5f 4e 49 4e 54 3b 0d % BITVEC_NINT;.
149e4 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 . }.. retu
149e5 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d rn 0;.. }..}...
149e6 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 ./*..** Set the
149e7 69 2d 74 68 20 62 69 74 2e 20 20 52 65 74 75 72 i-th bit. Retur
149e8 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 n 0 on success a
149e9 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 nd an error code
149ea 20 69 66 0d 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 if..** anything
149eb 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0d 0a 2a 2a goes wrong...**
149ec 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
149ed 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 73 75 e might cause su
149ee 62 2d 62 69 74 6d 61 70 73 20 74 6f 20 62 65 20 b-bitmaps to be
149ef 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 61 69 6c allocated. Fail
149f0 69 6e 67 0d 0a 2a 2a 20 74 6f 20 67 65 74 20 74 ing..** to get t
149f1 68 65 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 he memory needed
149f2 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 to hold the sub
149f3 2d 62 69 74 6d 61 70 20 69 73 20 74 68 65 20 6f -bitmap is the o
149f4 6e 6c 79 0d 0a 2a 2a 20 74 68 61 74 20 63 61 6e nly..** that can
149f5 20 67 6f 20 77 72 6f 6e 67 20 77 69 74 68 20 61 go wrong with a
149f6 6e 20 69 6e 73 65 72 74 2c 20 61 73 73 75 6d 69 n insert, assumi
149f7 6e 67 20 70 20 61 6e 64 20 69 20 61 72 65 20 76 ng p and i are v
149f8 61 6c 69 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 alid...**..** Th
149f9 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 e calling functi
149fa 6f 6e 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 on must ensure t
149fb 68 61 74 20 70 20 69 73 20 61 20 76 61 6c 69 64 hat p is a valid
149fc 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 0d 0a Bitvec object..
149fd 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 ** and that the
149fe 76 61 6c 75 65 20 66 6f 72 20 22 69 22 20 69 73 value for "i" is
149ff 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 6f 66 within range of
14a00 20 74 68 65 20 42 69 74 76 65 63 20 6f 62 6a 65 the Bitvec obje
14a01 63 74 2e 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 ct...** Otherwis
14a02 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 e the behavior i
14a03 73 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2f s undefined...*/
14a04 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
14a05 20 69 6e 74 20 73 71 6c 69 74 65 33 42 69 74 76 int sqlite3Bitv
14a06 65 63 53 65 74 28 42 69 74 76 65 63 20 2a 70 2c ecSet(Bitvec *p,
14a07 20 75 33 32 20 69 29 7b 0d 0a 20 20 75 33 32 20 u32 i){.. u32
14a08 68 3b 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 h;.. if( p==0 )
14a09 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
14a0a 4b 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 3e K;.. assert( i>
14a0b 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 0 );.. assert(
14a0c 69 3c 3d 70 2d 3e 69 53 69 7a 65 20 29 3b 0d 0a i<=p->iSize );..
14a0d 20 20 69 2d 2d 3b 0d 0a 20 20 77 68 69 6c 65 28 i--;.. while(
14a0e 28 70 2d 3e 69 53 69 7a 65 20 3e 20 42 49 54 56 (p->iSize > BITV
14a0f 45 43 5f 4e 42 49 54 29 20 26 26 20 70 2d 3e 69 EC_NBIT) && p->i
14a10 44 69 76 69 73 6f 72 29 20 7b 0d 0a 20 20 20 20 Divisor) {..
14a11 75 33 32 20 62 69 6e 20 3d 20 69 2f 70 2d 3e 69 u32 bin = i/p->i
14a12 44 69 76 69 73 6f 72 3b 0d 0a 20 20 20 20 69 20 Divisor;.. i
14a13 3d 20 69 25 70 2d 3e 69 44 69 76 69 73 6f 72 3b = i%p->iDivisor;
14a14 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 61 .. if( p->u.a
14a15 70 53 75 62 5b 62 69 6e 5d 3d 3d 30 20 29 7b 0d pSub[bin]==0 ){.
14a16 0a 20 20 20 20 20 20 70 2d 3e 75 2e 61 70 53 75 . p->u.apSu
14a17 62 5b 62 69 6e 5d 20 3d 20 73 71 6c 69 74 65 33 b[bin] = sqlite3
14a18 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70 2d BitvecCreate( p-
14a19 3e 69 44 69 76 69 73 6f 72 20 29 3b 0d 0a 20 20 >iDivisor );..
14a1a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 61 70 53 if( p->u.apS
14a1b 75 62 5b 62 69 6e 5d 3d 3d 30 20 29 20 72 65 74 ub[bin]==0 ) ret
14a1c 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
14a1d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 20 ;.. }.. p
14a1e 3d 20 70 2d 3e 75 2e 61 70 53 75 62 5b 62 69 6e = p->u.apSub[bin
14a1f 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 ];.. }.. if( p
14a20 2d 3e 69 53 69 7a 65 3c 3d 42 49 54 56 45 43 5f ->iSize<=BITVEC_
14a21 4e 42 49 54 20 29 7b 0d 0a 20 20 20 20 70 2d 3e NBIT ){.. p->
14a22 75 2e 61 42 69 74 6d 61 70 5b 69 2f 42 49 54 56 u.aBitmap[i/BITV
14a23 45 43 5f 53 5a 45 4c 45 4d 5d 20 7c 3d 20 31 20 EC_SZELEM] |= 1
14a24 3c 3c 20 28 69 26 28 42 49 54 56 45 43 5f 53 5a << (i&(BITVEC_SZ
14a25 45 4c 45 4d 2d 31 29 29 3b 0d 0a 20 20 20 20 72 ELEM-1));.. r
14a26 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
14a27 0d 0a 20 20 7d 0d 0a 20 20 68 20 3d 20 42 49 54 .. }.. h = BIT
14a28 56 45 43 5f 48 41 53 48 28 69 2b 2b 29 3b 0d 0a VEC_HASH(i++);..
14a29 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20 77 61 /* if there wa
14a2a 73 6e 27 74 20 61 20 68 61 73 68 20 63 6f 6c 6c sn't a hash coll
14a2b 69 73 69 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 ision, and this
14a2c 64 6f 65 73 6e 27 74 20 2a 2f 0d 0a 20 20 2f 2a doesn't */.. /*
14a2d 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 69 6c 6c completely fill
14a2e 20 74 68 65 20 68 61 73 68 2c 20 74 68 65 6e 20 the hash, then
14a2f 6a 75 73 74 20 61 64 64 20 69 74 20 77 69 74 68 just add it with
14a30 6f 75 74 20 2a 2f 0d 0a 20 20 2f 2a 20 77 6f 72 out */.. /* wor
14a31 72 69 6e 67 20 61 62 6f 75 74 20 73 75 62 2d 64 ring about sub-d
14a32 69 76 69 64 69 6e 67 20 61 6e 64 20 72 65 2d 68 ividing and re-h
14a33 61 73 68 69 6e 67 2e 20 2a 2f 0d 0a 20 20 69 66 ashing. */.. if
14a34 28 20 21 70 2d 3e 75 2e 61 48 61 73 68 5b 68 5d ( !p->u.aHash[h]
14a35 20 29 7b 0d 0a 20 20 20 20 69 66 20 28 70 2d 3e ){.. if (p->
14a36 6e 53 65 74 3c 28 42 49 54 56 45 43 5f 4e 49 4e nSet<(BITVEC_NIN
14a37 54 2d 31 29 29 20 7b 0d 0a 20 20 20 20 20 20 67 T-1)) {.. g
14a38 6f 74 6f 20 62 69 74 76 65 63 5f 73 65 74 5f 65 oto bitvec_set_e
14a39 6e 64 3b 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 nd;.. } else
14a3a 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 69 {.. goto bi
14a3b 74 76 65 63 5f 73 65 74 5f 72 65 68 61 73 68 3b tvec_set_rehash;
14a3c 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 .. }.. }..
14a3d 2f 2a 20 74 68 65 72 65 20 77 61 73 20 61 20 63 /* there was a c
14a3e 6f 6c 6c 69 73 69 6f 6e 2c 20 63 68 65 63 6b 20 ollision, check
14a3f 74 6f 20 73 65 65 20 69 66 20 69 74 27 73 20 61 to see if it's a
14a40 6c 72 65 61 64 79 20 2a 2f 0d 0a 20 20 2f 2a 20 lready */.. /*
14a41 69 6e 20 68 61 73 68 2c 20 69 66 20 6e 6f 74 2c in hash, if not,
14a42 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 73 try to find a s
14a43 70 6f 74 20 66 6f 72 20 69 74 20 2a 2f 0d 0a 20 pot for it */..
14a44 20 64 6f 20 7b 0d 0a 20 20 20 20 69 66 28 20 70 do {.. if( p
14a45 2d 3e 75 2e 61 48 61 73 68 5b 68 5d 3d 3d 69 20 ->u.aHash[h]==i
14a46 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
14a47 4f 4b 3b 0d 0a 20 20 20 20 68 2b 2b 3b 0d 0a 20 OK;.. h++;..
14a48 20 20 20 69 66 28 20 68 3e 3d 42 49 54 56 45 43 if( h>=BITVEC
14a49 5f 4e 49 4e 54 20 29 20 68 20 3d 20 30 3b 0d 0a _NINT ) h = 0;..
14a4a 20 20 7d 20 77 68 69 6c 65 28 20 70 2d 3e 75 2e } while( p->u.
14a4b 61 48 61 73 68 5b 68 5d 20 29 3b 0d 0a 20 20 2f aHash[h] );.. /
14a4c 2a 20 77 65 20 64 69 64 6e 27 74 20 66 69 6e 64 * we didn't find
14a4d 20 69 74 20 69 6e 20 74 68 65 20 68 61 73 68 2e it in the hash.
14a4e 20 20 68 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 h points to th
14a4f 65 20 66 69 72 73 74 20 2a 2f 0d 0a 20 20 2f 2a e first */.. /*
14a50 20 61 76 61 69 6c 61 62 6c 65 20 66 72 65 65 20 available free
14a51 73 70 6f 74 2e 20 63 68 65 63 6b 20 74 6f 20 73 spot. check to s
14a52 65 65 20 69 66 20 74 68 69 73 20 69 73 20 67 6f ee if this is go
14a53 69 6e 67 20 74 6f 20 2a 2f 0d 0a 20 20 2f 2a 20 ing to */.. /*
14a54 6d 61 6b 65 20 6f 75 72 20 68 61 73 68 20 74 6f make our hash to
14a55 6f 20 22 66 75 6c 6c 22 2e 20 20 2a 2f 0d 0a 62 o "full". */..b
14a56 69 74 76 65 63 5f 73 65 74 5f 72 65 68 61 73 68 itvec_set_rehash
14a57 3a 0d 0a 20 20 69 66 28 20 70 2d 3e 6e 53 65 74 :.. if( p->nSet
14a58 3e 3d 42 49 54 56 45 43 5f 4d 58 48 41 53 48 20 >=BITVEC_MXHASH
14a59 29 7b 0d 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 ){.. unsigned
14a5a 20 69 6e 74 20 6a 3b 0d 0a 20 20 20 20 69 6e 74 int j;.. int
14a5b 20 72 63 3b 0d 0a 20 20 20 20 75 33 32 20 2a 61 rc;.. u32 *a
14a5c 69 56 61 6c 75 65 73 20 3d 20 73 71 6c 69 74 65 iValues = sqlite
14a5d 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 30 3StackAllocRaw(0
14a5e 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 75 2e 61 48 , sizeof(p->u.aH
14a5f 61 73 68 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 ash));.. if(
14a60 61 69 56 61 6c 75 65 73 3d 3d 30 20 29 7b 0d 0a aiValues==0 ){..
14a61 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
14a62 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 ITE_NOMEM;..
14a63 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 }else{.. me
14a64 6d 63 70 79 28 61 69 56 61 6c 75 65 73 2c 20 70 mcpy(aiValues, p
14a65 2d 3e 75 2e 61 48 61 73 68 2c 20 73 69 7a 65 6f ->u.aHash, sizeo
14a66 66 28 70 2d 3e 75 2e 61 48 61 73 68 29 29 3b 0d f(p->u.aHash));.
14a67 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d . memset(p-
14a68 3e 75 2e 61 70 53 75 62 2c 20 30 2c 20 73 69 7a >u.apSub, 0, siz
14a69 65 6f 66 28 70 2d 3e 75 2e 61 70 53 75 62 29 29 eof(p->u.apSub))
14a6a 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 69 44 69 76 ;.. p->iDiv
14a6b 69 73 6f 72 20 3d 20 28 70 2d 3e 69 53 69 7a 65 isor = (p->iSize
14a6c 20 2b 20 42 49 54 56 45 43 5f 4e 50 54 52 20 2d + BITVEC_NPTR -
14a6d 20 31 29 2f 42 49 54 56 45 43 5f 4e 50 54 52 3b 1)/BITVEC_NPTR;
14a6e 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c .. rc = sql
14a6f 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2c ite3BitvecSet(p,
14a70 20 69 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 i);.. for(
14a71 6a 3d 30 3b 20 6a 3c 42 49 54 56 45 43 5f 4e 49 j=0; j<BITVEC_NI
14a72 4e 54 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 NT; j++){..
14a73 20 20 20 69 66 28 20 61 69 56 61 6c 75 65 73 5b if( aiValues[
14a74 6a 5d 20 29 20 72 63 20 7c 3d 20 73 71 6c 69 74 j] ) rc |= sqlit
14a75 65 33 42 69 74 76 65 63 53 65 74 28 70 2c 20 61 e3BitvecSet(p, a
14a76 69 56 61 6c 75 65 73 5b 6a 5d 29 3b 0d 0a 20 20 iValues[j]);..
14a77 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c }.. sql
14a78 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 30 2c ite3StackFree(0,
14a79 20 61 69 56 61 6c 75 65 73 29 3b 0d 0a 20 20 20 aiValues);..
14a7a 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
14a7b 20 20 20 7d 0d 0a 20 20 7d 0d 0a 62 69 74 76 65 }.. }..bitve
14a7c 63 5f 73 65 74 5f 65 6e 64 3a 0d 0a 20 20 70 2d c_set_end:.. p-
14a7d 3e 6e 53 65 74 2b 2b 3b 0d 0a 20 20 70 2d 3e 75 >nSet++;.. p->u
14a7e 2e 61 48 61 73 68 5b 68 5d 20 3d 20 69 3b 0d 0a .aHash[h] = i;..
14a7f 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
14a80 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a OK;..}..../*..**
14a81 20 43 6c 65 61 72 20 74 68 65 20 69 2d 74 68 20 Clear the i-th
14a82 62 69 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 70 42 75 bit...**..** pBu
14a83 66 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e f must be a poin
14a84 74 65 72 20 74 6f 20 61 74 20 6c 65 61 73 74 20 ter to at least
14a85 42 49 54 56 45 43 5f 53 5a 20 62 79 74 65 73 20 BITVEC_SZ bytes
14a86 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f of temporary sto
14a87 72 61 67 65 0d 0a 2a 2a 20 74 68 61 74 20 42 69 rage..** that Bi
14a88 74 76 65 63 43 6c 65 61 72 20 63 61 6e 20 75 73 tvecClear can us
14a89 65 20 74 6f 20 72 65 62 75 69 6c 74 20 69 74 73 e to rebuilt its
14a8a 20 68 61 73 68 20 74 61 62 6c 65 2e 0d 0a 2a 2f hash table...*/
14a8b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
14a8c 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 69 74 void sqlite3Bit
14a8d 76 65 63 43 6c 65 61 72 28 42 69 74 76 65 63 20 vecClear(Bitvec
14a8e 2a 70 2c 20 75 33 32 20 69 2c 20 76 6f 69 64 20 *p, u32 i, void
14a8f 2a 70 42 75 66 29 7b 0d 0a 20 20 69 66 28 20 70 *pBuf){.. if( p
14a90 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 ==0 ) return;..
14a91 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0d assert( i>0 );.
14a92 0a 20 20 69 2d 2d 3b 0d 0a 20 20 77 68 69 6c 65 . i--;.. while
14a93 28 20 70 2d 3e 69 44 69 76 69 73 6f 72 20 29 7b ( p->iDivisor ){
14a94 0d 0a 20 20 20 20 75 33 32 20 62 69 6e 20 3d 20 .. u32 bin =
14a95 69 2f 70 2d 3e 69 44 69 76 69 73 6f 72 3b 0d 0a i/p->iDivisor;..
14a96 20 20 20 20 69 20 3d 20 69 25 70 2d 3e 69 44 69 i = i%p->iDi
14a97 76 69 73 6f 72 3b 0d 0a 20 20 20 20 70 20 3d 20 visor;.. p =
14a98 70 2d 3e 75 2e 61 70 53 75 62 5b 62 69 6e 5d 3b p->u.apSub[bin];
14a99 0d 0a 20 20 20 20 69 66 20 28 21 70 29 20 7b 0d .. if (!p) {.
14a9a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a . return;..
14a9b 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 }.. }.. if
14a9c 28 20 70 2d 3e 69 53 69 7a 65 3c 3d 42 49 54 56 ( p->iSize<=BITV
14a9d 45 43 5f 4e 42 49 54 20 29 7b 0d 0a 20 20 20 20 EC_NBIT ){..
14a9e 70 2d 3e 75 2e 61 42 69 74 6d 61 70 5b 69 2f 42 p->u.aBitmap[i/B
14a9f 49 54 56 45 43 5f 53 5a 45 4c 45 4d 5d 20 26 3d ITVEC_SZELEM] &=
14aa0 20 7e 28 31 20 3c 3c 20 28 69 26 28 42 49 54 56 ~(1 << (i&(BITV
14aa1 45 43 5f 53 5a 45 4c 45 4d 2d 31 29 29 29 3b 0d EC_SZELEM-1)));.
14aa2 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 75 . }else{.. u
14aa3 6e 73 69 67 6e 65 64 20 69 6e 74 20 6a 3b 0d 0a nsigned int j;..
14aa4 20 20 20 20 75 33 32 20 2a 61 69 56 61 6c 75 65 u32 *aiValue
14aa5 73 20 3d 20 70 42 75 66 3b 0d 0a 20 20 20 20 6d s = pBuf;.. m
14aa6 65 6d 63 70 79 28 61 69 56 61 6c 75 65 73 2c 20 emcpy(aiValues,
14aa7 70 2d 3e 75 2e 61 48 61 73 68 2c 20 73 69 7a 65 p->u.aHash, size
14aa8 6f 66 28 70 2d 3e 75 2e 61 48 61 73 68 29 29 3b of(p->u.aHash));
14aa9 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e .. memset(p->
14aaa 75 2e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 u.aHash, 0, size
14aab 6f 66 28 70 2d 3e 75 2e 61 48 61 73 68 29 29 3b of(p->u.aHash));
14aac 0d 0a 20 20 20 20 70 2d 3e 6e 53 65 74 20 3d 20 .. p->nSet =
14aad 30 3b 0d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 0;.. for(j=0;
14aae 20 6a 3c 42 49 54 56 45 43 5f 4e 49 4e 54 3b 20 j<BITVEC_NINT;
14aaf 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 j++){.. if(
14ab0 20 61 69 56 61 6c 75 65 73 5b 6a 5d 20 26 26 20 aiValues[j] &&
14ab1 61 69 56 61 6c 75 65 73 5b 6a 5d 21 3d 28 69 2b aiValues[j]!=(i+
14ab2 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 75 1) ){.. u
14ab3 33 32 20 68 20 3d 20 42 49 54 56 45 43 5f 48 41 32 h = BITVEC_HA
14ab4 53 48 28 61 69 56 61 6c 75 65 73 5b 6a 5d 2d 31 SH(aiValues[j]-1
14ab5 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e );.. p->n
14ab6 53 65 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 Set++;..
14ab7 77 68 69 6c 65 28 20 70 2d 3e 75 2e 61 48 61 73 while( p->u.aHas
14ab8 68 5b 68 5d 20 29 7b 0d 0a 20 20 20 20 20 20 20 h[h] ){..
14ab9 20 20 20 68 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 h++;..
14aba 20 20 20 69 66 28 20 68 3e 3d 42 49 54 56 45 43 if( h>=BITVEC
14abb 5f 4e 49 4e 54 20 29 20 68 20 3d 20 30 3b 0d 0a _NINT ) h = 0;..
14abc 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
14abd 20 20 20 70 2d 3e 75 2e 61 48 61 73 68 5b 68 5d p->u.aHash[h]
14abe 20 3d 20 61 69 56 61 6c 75 65 73 5b 6a 5d 3b 0d = aiValues[j];.
14abf 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
14ac0 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
14ac1 2a 20 44 65 73 74 72 6f 79 20 61 20 62 69 74 6d * Destroy a bitm
14ac2 61 70 20 6f 62 6a 65 63 74 2e 20 20 52 65 63 6c ap object. Recl
14ac3 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 aim all memory u
14ac4 73 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 sed...*/..SQLITE
14ac5 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
14ac6 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 lite3BitvecDestr
14ac7 6f 79 28 42 69 74 76 65 63 20 2a 70 29 7b 0d 0a oy(Bitvec *p){..
14ac8 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 if( p==0 ) ret
14ac9 75 72 6e 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 69 urn;.. if( p->i
14aca 44 69 76 69 73 6f 72 20 29 7b 0d 0a 20 20 20 20 Divisor ){..
14acb 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0d unsigned int i;.
14acc 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
14acd 42 49 54 56 45 43 5f 4e 50 54 52 3b 20 69 2b 2b BITVEC_NPTR; i++
14ace 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){.. sqlite
14acf 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 3BitvecDestroy(p
14ad0 2d 3e 75 2e 61 70 53 75 62 5b 69 5d 29 3b 0d 0a ->u.apSub[i]);..
14ad1 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 73 71 }.. }.. sq
14ad2 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a lite3_free(p);..
14ad3 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 }..../*..** Retu
14ad4 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 rn the value of
14ad5 74 68 65 20 69 53 69 7a 65 20 70 61 72 61 6d 65 the iSize parame
14ad6 74 65 72 20 73 70 65 63 69 66 69 65 64 20 77 68 ter specified wh
14ad7 65 6e 20 42 69 74 76 65 63 20 2a 70 0d 0a 2a 2a en Bitvec *p..**
14ad8 20 77 61 73 20 63 72 65 61 74 65 64 2e 0d 0a 2a was created...*
14ad9 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
14ada 45 20 75 33 32 20 73 71 6c 69 74 65 33 42 69 74 E u32 sqlite3Bit
14adb 76 65 63 53 69 7a 65 28 42 69 74 76 65 63 20 2a vecSize(Bitvec *
14adc 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 2d p){.. return p-
14add 3e 69 53 69 7a 65 3b 0d 0a 7d 0d 0a 0d 0a 23 69 >iSize;..}....#i
14ade 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
14adf 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0d 0a T_BUILTIN_TEST..
14ae0 2f 2a 0d 0a 2a 2a 20 4c 65 74 20 56 5b 5d 20 62 /*..** Let V[] b
14ae1 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e e an array of un
14ae2 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 signed character
14ae3 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 s sufficient to
14ae4 68 6f 6c 64 0d 0a 2a 2a 20 75 70 20 74 6f 20 4e hold..** up to N
14ae5 20 62 69 74 73 2e 20 20 4c 65 74 20 49 20 62 65 bits. Let I be
14ae6 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 an integer betw
14ae7 65 65 6e 20 30 20 61 6e 64 20 4e 2e 20 20 30 3c een 0 and N. 0<
14ae8 3d 49 3c 4e 2e 0d 0a 2a 2a 20 54 68 65 6e 20 74 =I<N...** Then t
14ae9 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 he following mac
14aea 72 6f 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 ros can be used
14aeb 74 6f 20 73 65 74 2c 20 63 6c 65 61 72 2c 20 6f to set, clear, o
14aec 72 20 74 65 73 74 0d 0a 2a 2a 20 69 6e 64 69 76 r test..** indiv
14aed 69 64 75 61 6c 20 62 69 74 73 20 77 69 74 68 69 idual bits withi
14aee 6e 20 56 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e n V...*/..#defin
14aef 65 20 53 45 54 42 49 54 28 56 2c 49 29 20 20 20 e SETBIT(V,I)
14af0 20 20 20 56 5b 49 3e 3e 33 5d 20 7c 3d 20 28 31 V[I>>3] |= (1
14af1 3c 3c 28 49 26 37 29 29 0d 0a 23 64 65 66 69 6e <<(I&7))..#defin
14af2 65 20 43 4c 45 41 52 42 49 54 28 56 2c 49 29 20 e CLEARBIT(V,I)
14af3 20 20 20 56 5b 49 3e 3e 33 5d 20 26 3d 20 7e 28 V[I>>3] &= ~(
14af4 31 3c 3c 28 49 26 37 29 29 0d 0a 23 64 65 66 69 1<<(I&7))..#defi
14af5 6e 65 20 54 45 53 54 42 49 54 28 56 2c 49 29 20 ne TESTBIT(V,I)
14af6 20 20 20 20 28 56 5b 49 3e 3e 33 5d 26 28 31 3c (V[I>>3]&(1<
14af7 3c 28 49 26 37 29 29 29 21 3d 30 0d 0a 0d 0a 2f <(I&7)))!=0..../
14af8 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 *..** This routi
14af9 6e 65 20 72 75 6e 73 20 61 6e 20 65 78 74 65 6e ne runs an exten
14afa 73 69 76 65 20 74 65 73 74 20 6f 66 20 74 68 65 sive test of the
14afb 20 42 69 74 76 65 63 20 63 6f 64 65 2e 0d 0a 2a Bitvec code...*
14afc 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 *..** The input
14afd 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 is an array of i
14afe 6e 74 65 67 65 72 73 20 74 68 61 74 20 61 63 74 ntegers that act
14aff 73 20 61 73 20 61 20 70 72 6f 67 72 61 6d 0d 0a s as a program..
14b00 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 42 ** to test the B
14b01 69 74 76 65 63 2e 20 20 54 68 65 20 69 6e 74 65 itvec. The inte
14b02 67 65 72 73 20 61 72 65 20 6f 70 63 6f 64 65 73 gers are opcodes
14b03 20 66 6f 6c 6c 6f 77 65 64 0d 0a 2a 2a 20 62 79 followed..** by
14b04 20 30 2c 20 31 2c 20 6f 72 20 33 20 6f 70 65 72 0, 1, or 3 oper
14b05 61 6e 64 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 ands, depending
14b06 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 20 20 on the opcode.
14b07 41 6e 6f 74 68 65 72 0d 0a 2a 2a 20 6f 70 63 6f Another..** opco
14b08 64 65 20 66 6f 6c 6c 6f 77 73 20 69 6d 6d 65 64 de follows immed
14b09 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 iately after the
14b0a 20 6c 61 73 74 20 6f 70 65 72 61 6e 64 2e 0d 0a last operand...
14b0b 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 **..** There are
14b0c 20 36 20 6f 70 63 6f 64 65 73 20 6e 75 6d 62 65 6 opcodes numbe
14b0d 72 65 64 20 66 72 6f 6d 20 30 20 74 68 72 6f 75 red from 0 throu
14b0e 67 68 20 35 2e 20 20 30 20 69 73 20 74 68 65 0d gh 5. 0 is the.
14b0f 0a 2a 2a 20 22 68 61 6c 74 22 20 6f 70 63 6f 64 .** "halt" opcod
14b10 65 20 61 6e 64 20 63 61 75 73 65 73 20 74 68 65 e and causes the
14b11 20 74 65 73 74 20 74 6f 20 65 6e 64 2e 0d 0a 2a test to end...*
14b12 2a 0d 0a 2a 2a 20 20 20 20 30 20 20 20 20 20 20 *..** 0
14b13 20 20 20 20 48 61 6c 74 20 61 6e 64 20 72 65 74 Halt and ret
14b14 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
14b15 66 20 65 72 72 6f 72 73 0d 0a 2a 2a 20 20 20 20 f errors..**
14b16 31 20 4e 20 53 20 58 20 20 20 20 53 65 74 20 4e 1 N S X Set N
14b17 20 62 69 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 bits beginning
14b18 77 69 74 68 20 53 20 61 6e 64 20 69 6e 63 72 65 with S and incre
14b19 6d 65 6e 74 69 6e 67 20 62 79 20 58 0d 0a 2a 2a menting by X..**
14b1a 20 20 20 20 32 20 4e 20 53 20 58 20 20 20 20 43 2 N S X C
14b1b 6c 65 61 72 20 4e 20 62 69 74 73 20 62 65 67 69 lear N bits begi
14b1c 6e 6e 69 6e 67 20 77 69 74 68 20 53 20 61 6e 64 nning with S and
14b1d 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 62 79 incrementing by
14b1e 20 58 0d 0a 2a 2a 20 20 20 20 33 20 4e 20 20 20 X..** 3 N
14b1f 20 20 20 20 20 53 65 74 20 4e 20 72 61 6e 64 6f Set N rando
14b20 6d 6c 79 20 63 68 6f 73 65 6e 20 62 69 74 73 0d mly chosen bits.
14b21 0a 2a 2a 20 20 20 20 34 20 4e 20 20 20 20 20 20 .** 4 N
14b22 20 20 43 6c 65 61 72 20 4e 20 72 61 6e 64 6f 6d Clear N random
14b23 6c 79 20 63 68 6f 73 65 6e 20 62 69 74 73 0d 0a ly chosen bits..
14b24 2a 2a 20 20 20 20 35 20 4e 20 53 20 58 20 20 20 ** 5 N S X
14b25 20 53 65 74 20 4e 20 62 69 74 73 20 66 72 6f 6d Set N bits from
14b26 20 53 20 69 6e 63 72 65 6d 65 6e 74 20 58 20 69 S increment X i
14b27 6e 20 61 72 72 61 79 20 6f 6e 6c 79 2c 20 6e 6f n array only, no
14b28 74 20 69 6e 20 62 69 74 76 65 63 0d 0a 2a 2a 0d t in bitvec..**.
14b29 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20 .** The opcodes
14b2a 31 20 74 68 72 6f 75 67 68 20 34 20 70 65 72 66 1 through 4 perf
14b2b 6f 72 6d 20 73 65 74 20 61 6e 64 20 63 6c 65 61 orm set and clea
14b2c 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 r operations are
14b2d 20 70 65 72 66 6f 72 6d 65 64 0d 0a 2a 2a 20 6f performed..** o
14b2e 6e 20 62 6f 74 68 20 61 20 42 69 74 76 65 63 20 n both a Bitvec
14b2f 6f 62 6a 65 63 74 20 61 6e 64 20 6f 6e 20 61 20 object and on a
14b30 6c 69 6e 65 61 72 20 61 72 72 61 79 20 6f 66 20 linear array of
14b31 62 69 74 73 20 6f 62 74 61 69 6e 65 64 20 66 72 bits obtained fr
14b32 6f 6d 20 6d 61 6c 6c 6f 63 2e 0d 0a 2a 2a 20 4f om malloc...** O
14b33 70 63 6f 64 65 20 35 20 77 6f 72 6b 73 20 6f 6e pcode 5 works on
14b34 20 74 68 65 20 6c 69 6e 65 61 72 20 61 72 72 61 the linear arra
14b35 79 20 6f 6e 6c 79 2c 20 6e 6f 74 20 6f 6e 20 74 y only, not on t
14b36 68 65 20 42 69 74 76 65 63 2e 0d 0a 2a 2a 20 4f he Bitvec...** O
14b37 70 63 6f 64 65 20 35 20 69 73 20 75 73 65 64 20 pcode 5 is used
14b38 74 6f 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 to deliberately
14b39 69 6e 64 75 63 65 20 61 20 66 61 75 6c 74 20 69 induce a fault i
14b3a 6e 20 6f 72 64 65 72 20 74 6f 0d 0a 2a 2a 20 63 n order to..** c
14b3b 6f 6e 66 69 72 6d 20 74 68 61 74 20 65 72 72 6f onfirm that erro
14b3c 72 20 64 65 74 65 63 74 69 6f 6e 20 77 6f 72 6b r detection work
14b3d 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 74 20 74 68 s...**..** At th
14b3e 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 e conclusion of
14b3f 74 68 65 20 74 65 73 74 20 74 68 65 20 6c 69 6e the test the lin
14b40 65 61 72 20 61 72 72 61 79 20 69 73 20 63 6f 6d ear array is com
14b41 70 61 72 65 64 0d 0a 2a 2a 20 61 67 61 69 6e 73 pared..** agains
14b42 74 20 74 68 65 20 42 69 74 76 65 63 20 6f 62 6a t the Bitvec obj
14b43 65 63 74 2e 20 20 49 66 20 74 68 65 72 65 20 61 ect. If there a
14b44 72 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 re any differenc
14b45 65 73 2c 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 es,..** an error
14b46 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 is returned. I
14b47 66 20 74 68 65 79 20 61 72 65 20 74 68 65 20 73 f they are the s
14b48 61 6d 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 ame, zero is ret
14b49 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 urned...**..** I
14b4a 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 f a memory alloc
14b4b 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 ation error occu
14b4c 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 2e 0d 0a rs, return -1...
14b4d 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
14b4e 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 69 TE int sqlite3Bi
14b4f 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 tvecBuiltinTest(
14b50 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 61 4f 70 int sz, int *aOp
14b51 29 7b 0d 0a 20 20 42 69 74 76 65 63 20 2a 70 42 ){.. Bitvec *pB
14b52 69 74 76 65 63 20 3d 20 30 3b 0d 0a 20 20 75 6e itvec = 0;.. un
14b53 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 56 20 signed char *pV
14b54 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d = 0;.. int rc =
14b55 20 2d 31 3b 0d 0a 20 20 69 6e 74 20 69 2c 20 6e -1;.. int i, n
14b56 78 2c 20 70 63 2c 20 6f 70 3b 0d 0a 20 20 76 6f x, pc, op;.. vo
14b57 69 64 20 2a 70 54 6d 70 53 70 61 63 65 3b 0d 0a id *pTmpSpace;..
14b58 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 .. /* Allocate
14b59 74 68 65 20 42 69 74 76 65 63 20 74 6f 20 62 65 the Bitvec to be
14b5a 20 74 65 73 74 65 64 20 61 6e 64 20 61 20 6c 69 tested and a li
14b5b 6e 65 61 72 20 61 72 72 61 79 20 6f 66 0d 0a 20 near array of..
14b5c 20 2a 2a 20 62 69 74 73 20 74 6f 20 61 63 74 20 ** bits to act
14b5d 61 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 as the reference
14b5e 20 2a 2f 0d 0a 20 20 70 42 69 74 76 65 63 20 3d */.. pBitvec =
14b5f 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 sqlite3BitvecCr
14b60 65 61 74 65 28 20 73 7a 20 29 3b 0d 0a 20 20 70 eate( sz );.. p
14b61 56 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c V = sqlite3_mall
14b62 6f 63 28 20 28 73 7a 2b 37 29 2f 38 20 2b 20 31 oc( (sz+7)/8 + 1
14b63 20 29 3b 0d 0a 20 20 70 54 6d 70 53 70 61 63 65 );.. pTmpSpace
14b64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f = sqlite3_mallo
14b65 63 28 42 49 54 56 45 43 5f 53 5a 29 3b 0d 0a 20 c(BITVEC_SZ);..
14b66 20 69 66 28 20 70 42 69 74 76 65 63 3d 3d 30 20 if( pBitvec==0
14b67 7c 7c 20 70 56 3d 3d 30 20 7c 7c 20 70 54 6d 70 || pV==0 || pTmp
14b68 53 70 61 63 65 3d 3d 30 20 20 29 20 67 6f 74 6f Space==0 ) goto
14b69 20 62 69 74 76 65 63 5f 65 6e 64 3b 0d 0a 20 20 bitvec_end;..
14b6a 6d 65 6d 73 65 74 28 70 56 2c 20 30 2c 20 28 73 memset(pV, 0, (s
14b6b 7a 2b 37 29 2f 38 20 2b 20 31 29 3b 0d 0a 0d 0a z+7)/8 + 1);....
14b6c 20 20 2f 2a 20 4e 55 4c 4c 20 70 42 69 74 76 65 /* NULL pBitve
14b6d 63 20 74 65 73 74 73 20 2a 2f 0d 0a 20 20 73 71 c tests */.. sq
14b6e 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 30 lite3BitvecSet(0
14b6f 2c 20 31 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 , 1);.. sqlite3
14b70 42 69 74 76 65 63 43 6c 65 61 72 28 30 2c 20 31 BitvecClear(0, 1
14b71 2c 20 70 54 6d 70 53 70 61 63 65 29 3b 0d 0a 0d , pTmpSpace);...
14b72 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 . /* Run the pr
14b73 6f 67 72 61 6d 20 2a 2f 0d 0a 20 20 70 63 20 3d ogram */.. pc =
14b74 20 30 3b 0d 0a 20 20 77 68 69 6c 65 28 20 28 6f 0;.. while( (o
14b75 70 20 3d 20 61 4f 70 5b 70 63 5d 29 21 3d 30 20 p = aOp[pc])!=0
14b76 29 7b 0d 0a 20 20 20 20 73 77 69 74 63 68 28 20 ){.. switch(
14b77 6f 70 20 29 7b 0d 0a 20 20 20 20 20 20 63 61 73 op ){.. cas
14b78 65 20 31 3a 0d 0a 20 20 20 20 20 20 63 61 73 65 e 1:.. case
14b79 20 32 3a 0d 0a 20 20 20 20 20 20 63 61 73 65 20 2:.. case
14b7a 35 3a 20 7b 0d 0a 20 20 20 20 20 20 20 20 6e 78 5: {.. nx
14b7b 20 3d 20 34 3b 0d 0a 20 20 20 20 20 20 20 20 69 = 4;.. i
14b7c 20 3d 20 61 4f 70 5b 70 63 2b 32 5d 20 2d 20 31 = aOp[pc+2] - 1
14b7d 3b 0d 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 70 ;.. aOp[p
14b7e 63 2b 32 5d 20 2b 3d 20 61 4f 70 5b 70 63 2b 33 c+2] += aOp[pc+3
14b7f 5d 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 ];.. brea
14b80 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 k;.. }..
14b81 20 20 20 63 61 73 65 20 33 3a 0d 0a 20 20 20 20 case 3:..
14b82 20 20 63 61 73 65 20 34 3a 20 0d 0a 20 20 20 20 case 4: ..
14b83 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 default: {..
14b84 20 20 20 20 20 20 6e 78 20 3d 20 32 3b 0d 0a 20 nx = 2;..
14b85 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 sqlite3_r
14b86 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 andomness(sizeof
14b87 28 69 29 2c 20 26 69 29 3b 0d 0a 20 20 20 20 20 (i), &i);..
14b88 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 break;..
14b89 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 }.. }.. i
14b8a 66 28 20 28 2d 2d 61 4f 70 5b 70 63 2b 31 5d 29 f( (--aOp[pc+1])
14b8b 20 3e 20 30 20 29 20 6e 78 20 3d 20 30 3b 0d 0a > 0 ) nx = 0;..
14b8c 20 20 20 20 70 63 20 2b 3d 20 6e 78 3b 0d 0a 20 pc += nx;..
14b8d 20 20 20 69 20 3d 20 28 69 20 26 20 30 78 37 66 i = (i & 0x7f
14b8e 66 66 66 66 66 66 29 25 73 7a 3b 0d 0a 20 20 20 ffffff)%sz;..
14b8f 20 69 66 28 20 28 6f 70 20 26 20 31 29 21 3d 30 if( (op & 1)!=0
14b90 20 29 7b 0d 0a 20 20 20 20 20 20 53 45 54 42 49 ){.. SETBI
14b91 54 28 70 56 2c 20 28 69 2b 31 29 29 3b 0d 0a 20 T(pV, (i+1));..
14b92 20 20 20 20 20 69 66 28 20 6f 70 21 3d 35 20 29 if( op!=5 )
14b93 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 {.. if( s
14b94 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 qlite3BitvecSet(
14b95 70 42 69 74 76 65 63 2c 20 69 2b 31 29 20 29 20 pBitvec, i+1) )
14b96 67 6f 74 6f 20 62 69 74 76 65 63 5f 65 6e 64 3b goto bitvec_end;
14b97 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
14b98 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 43 4c 45 else{.. CLE
14b99 41 52 42 49 54 28 70 56 2c 20 28 69 2b 31 29 29 ARBIT(pV, (i+1))
14b9a 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ;.. sqlite3
14b9b 42 69 74 76 65 63 43 6c 65 61 72 28 70 42 69 74 BitvecClear(pBit
14b9c 76 65 63 2c 20 69 2b 31 2c 20 70 54 6d 70 53 70 vec, i+1, pTmpSp
14b9d 61 63 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ace);.. }..
14b9e 7d 0d 0a 0d 0a 20 20 2f 2a 20 54 65 73 74 20 74 }.... /* Test t
14b9f 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 o make sure the
14ba0 6c 69 6e 65 61 72 20 61 72 72 61 79 20 65 78 61 linear array exa
14ba1 63 74 6c 79 20 6d 61 74 63 68 65 73 20 74 68 65 ctly matches the
14ba2 0d 0a 20 20 2a 2a 20 42 69 74 76 65 63 20 6f 62 .. ** Bitvec ob
14ba3 6a 65 63 74 2e 20 20 53 74 61 72 74 20 77 69 74 ject. Start wit
14ba4 68 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e h the assumption
14ba5 20 74 68 61 74 20 74 68 65 79 20 64 6f 0d 0a 20 that they do..
14ba6 20 2a 2a 20 6d 61 74 63 68 20 28 72 63 3d 3d 30 ** match (rc==0
14ba7 29 2e 20 20 43 68 61 6e 67 65 20 72 63 20 74 6f ). Change rc to
14ba8 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 64 non-zero if a d
14ba9 69 73 63 72 65 70 61 6e 63 79 0d 0a 20 20 2a 2a iscrepancy.. **
14baa 20 69 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 2a 2f is found... */
14bab 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 .. rc = sqlite3
14bac 42 69 74 76 65 63 54 65 73 74 28 30 2c 30 29 20 BitvecTest(0,0)
14bad 2b 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 + sqlite3BitvecT
14bae 65 73 74 28 70 42 69 74 76 65 63 2c 20 73 7a 2b est(pBitvec, sz+
14baf 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20 2b 20 1).. +
14bb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 sqlite3BitvecTes
14bb1 74 28 70 42 69 74 76 65 63 2c 20 30 29 0d 0a 20 t(pBitvec, 0)..
14bb2 20 20 20 20 20 20 20 20 20 2b 20 28 73 71 6c 69 + (sqli
14bb3 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 te3BitvecSize(pB
14bb4 69 74 76 65 63 29 20 2d 20 73 7a 29 3b 0d 0a 20 itvec) - sz);..
14bb5 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 7a 3b for(i=1; i<=sz;
14bb6 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 i++){.. if(
14bb7 20 28 54 45 53 54 42 49 54 28 70 56 2c 69 29 29 (TESTBIT(pV,i))
14bb8 21 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 !=sqlite3BitvecT
14bb9 65 73 74 28 70 42 69 74 76 65 63 2c 69 29 20 29 est(pBitvec,i) )
14bba 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 69 3b {.. rc = i;
14bbb 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a .. break;..
14bbc 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
14bbd 2f 2a 20 46 72 65 65 20 61 6c 6c 6f 63 61 74 65 /* Free allocate
14bbe 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a d structure */..
14bbf 62 69 74 76 65 63 5f 65 6e 64 3a 0d 0a 20 20 73 bitvec_end:.. s
14bc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 6d 70 qlite3_free(pTmp
14bc1 53 70 61 63 65 29 3b 0d 0a 20 20 73 71 6c 69 74 Space);.. sqlit
14bc2 65 33 5f 66 72 65 65 28 70 56 29 3b 0d 0a 20 20 e3_free(pV);..
14bc3 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 sqlite3BitvecDes
14bc4 74 72 6f 79 28 70 42 69 74 76 65 63 29 3b 0d 0a troy(pBitvec);..
14bc5 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
14bc6 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
14bc7 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 E_OMIT_BUILTIN_T
14bc8 45 53 54 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a EST */..../*****
14bc9 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 ********* End of
14bca 20 62 69 74 76 65 63 2e 63 20 2a 2a 2a 2a 2a 2a bitvec.c ******
14bcb 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14bcc 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14bcd 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
14bce 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
14bcf 20 66 69 6c 65 20 70 63 61 63 68 65 2e 63 20 2a file pcache.c *
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14bd1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14bd2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a *********/../*..
14bd3 2a 2a 20 32 30 30 38 20 41 75 67 75 73 74 20 30 ** 2008 August 0
14bd4 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 5..**..** The au
14bd5 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
14bd6 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
14bd7 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
14bd8 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 n place of..** a
14bd9 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
14bda 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
14bdb 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 g:..**..** Ma
14bdc 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
14bdd 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 d not evil...**
14bde 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
14bdf 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
14be0 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
14be1 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a give others...**
14be2 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 May you shar
14be3 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 e freely, never
14be4 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e taking more than
14be5 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a you give...**..
14be6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14be7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14be8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14be9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14bea 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 54 68 *********..** Th
14beb 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e is file implemen
14bec 74 73 20 74 68 61 74 20 70 61 67 65 20 63 61 63 ts that page cac
14bed 68 65 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a he...*/..../*..*
14bee 2a 20 41 20 63 6f 6d 70 6c 65 74 65 20 70 61 67 * A complete pag
14bef 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e e cache is an in
14bf0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 stance of this s
14bf1 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2f 0d 0a 73 tructure...*/..s
14bf2 74 72 75 63 74 20 50 43 61 63 68 65 20 7b 0d 0a truct PCache {..
14bf3 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c PgHdr *pDirty,
14bf4 20 2a 70 44 69 72 74 79 54 61 69 6c 3b 20 20 20 *pDirtyTail;
14bf5 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 /* List of
14bf6 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 dirty pages in
14bf7 4c 52 55 20 6f 72 64 65 72 20 2a 2f 0d 0a 20 20 LRU order */..
14bf8 50 67 48 64 72 20 2a 70 53 79 6e 63 65 64 3b 20 PgHdr *pSynced;
14bf9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14bfa 20 20 20 20 2f 2a 20 4c 61 73 74 20 73 79 6e 63 /* Last sync
14bfb 65 64 20 70 61 67 65 20 69 6e 20 64 69 72 74 79 ed page in dirty
14bfc 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0d 0a 20 page list */..
14bfd 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 int nRef;
14bfe 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14bff 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
14c00 66 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 f referenced pag
14c01 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 43 es */.. int szC
14c02 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 ache;
14c03 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14c04 43 6f 6e 66 69 67 75 72 65 64 20 63 61 63 68 65 Configured cache
14c05 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 size */.. int
14c06 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 szPage;
14c07 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14c08 2f 2a 20 53 69 7a 65 20 6f 66 20 65 76 65 72 79 /* Size of every
14c09 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 page in this ca
14c0a 63 68 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a che */.. int sz
14c0b 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 Extra;
14c0c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
14c0d 20 53 69 7a 65 20 6f 66 20 65 78 74 72 61 20 73 Size of extra s
14c0e 70 61 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 pace for each pa
14c0f 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 50 75 ge */.. int bPu
14c10 72 67 65 61 62 6c 65 3b 20 20 20 20 20 20 20 20 rgeable;
14c11 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14c12 54 72 75 65 20 69 66 20 70 61 67 65 73 20 61 72 True if pages ar
14c13 65 20 6f 6e 20 62 61 63 6b 69 6e 67 20 73 74 6f e on backing sto
14c14 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 re */.. int (*x
14c15 53 74 72 65 73 73 29 28 76 6f 69 64 2a 2c 50 67 Stress)(void*,Pg
14c16 48 64 72 2a 29 3b 20 20 20 20 20 20 20 2f 2a 20 Hdr*); /*
14c17 43 61 6c 6c 20 74 6f 20 74 72 79 20 6d 61 6b 65 Call to try make
14c18 20 61 20 70 61 67 65 20 63 6c 65 61 6e 20 2a 2f a page clean */
14c19 0d 0a 20 20 76 6f 69 64 20 2a 70 53 74 72 65 73 .. void *pStres
14c1a 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s;
14c1b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d /* Argum
14c1c 65 6e 74 20 74 6f 20 78 53 74 72 65 73 73 20 2a ent to xStress *
14c1d 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 /.. sqlite3_pca
14c1e 63 68 65 20 2a 70 43 61 63 68 65 3b 20 20 20 20 che *pCache;
14c1f 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 75 67 /* Plug
14c20 67 61 62 6c 65 20 63 61 63 68 65 20 6d 6f 64 75 gable cache modu
14c21 6c 65 20 2a 2f 0d 0a 20 20 50 67 48 64 72 20 2a le */.. PgHdr *
14c22 70 50 61 67 65 31 3b 20 20 20 20 20 20 20 20 20 pPage1;
14c23 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14c24 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 Reference to pag
14c25 65 20 31 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a e 1 */..};..../*
14c26 0d 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 ..** Some of the
14c27 20 61 73 73 65 72 74 28 29 20 6d 61 63 72 6f 73 assert() macros
14c28 20 69 6e 20 74 68 69 73 20 63 6f 64 65 20 61 72 in this code ar
14c29 65 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 e too expensive
14c2a 74 6f 20 72 75 6e 0d 0a 2a 2a 20 65 76 65 6e 20 to run..** even
14c2b 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 64 65 during normal de
14c2c 62 75 67 67 69 6e 67 2e 20 20 55 73 65 20 74 68 bugging. Use th
14c2d 65 6d 20 6f 6e 6c 79 20 72 61 72 65 6c 79 20 6f em only rarely o
14c2e 6e 20 6c 6f 6e 67 2d 72 75 6e 6e 69 6e 67 0d 0a n long-running..
14c2f 2a 2a 20 74 65 73 74 73 2e 20 20 45 6e 61 62 6c ** tests. Enabl
14c30 65 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 20 e the expensive
14c31 61 73 73 65 72 74 73 20 75 73 69 6e 67 20 74 68 asserts using th
14c32 65 0d 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 45 e..** -DSQLITE_E
14c33 4e 41 42 4c 45 5f 45 58 50 45 4e 53 49 56 45 5f NABLE_EXPENSIVE_
14c34 41 53 53 45 52 54 3d 31 20 63 6f 6d 70 69 6c 65 ASSERT=1 compile
14c35 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0d 0a 2a -time option...*
14c36 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
14c37 5f 45 4e 41 42 4c 45 5f 45 58 50 45 4e 53 49 56 _ENABLE_EXPENSIV
14c38 45 5f 41 53 53 45 52 54 0d 0a 23 20 64 65 66 69 E_ASSERT..# defi
14c39 6e 65 20 65 78 70 65 6e 73 69 76 65 5f 61 73 73 ne expensive_ass
14c3a 65 72 74 28 58 29 20 20 61 73 73 65 72 74 28 58 ert(X) assert(X
14c3b 29 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 )..#else..# defi
14c3c 6e 65 20 65 78 70 65 6e 73 69 76 65 5f 61 73 73 ne expensive_ass
14c3d 65 72 74 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a ert(X)..#endif..
14c3e 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
14c3f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14c40 2a 2a 2a 2a 2a 20 4c 69 6e 6b 65 64 20 4c 69 73 ***** Linked Lis
14c41 74 20 4d 61 6e 61 67 65 6d 65 6e 74 20 2a 2a 2a t Management ***
14c42 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14c43 2a 2f 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 6e */....#if !defin
14c44 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 64 65 ed(NDEBUG) && de
14c45 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 fined(SQLITE_ENA
14c46 42 4c 45 5f 45 58 50 45 4e 53 49 56 45 5f 41 53 BLE_EXPENSIVE_AS
14c47 53 45 52 54 29 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 SERT)../*..** Ch
14c48 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 43 61 eck that the pCa
14c49 63 68 65 2d 3e 70 53 79 6e 63 65 64 20 76 61 72 che->pSynced var
14c4a 69 61 62 6c 65 20 69 73 20 73 65 74 20 63 6f 72 iable is set cor
14c4b 72 65 63 74 6c 79 2e 20 49 66 20 69 74 0d 0a 2a rectly. If it..*
14c4c 2a 20 69 73 20 6e 6f 74 2c 20 65 69 74 68 65 72 * is not, either
14c4d 20 66 61 69 6c 20 61 6e 20 61 73 73 65 72 74 20 fail an assert
14c4e 6f 72 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 or return zero.
14c4f 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 Otherwise, retur
14c50 6e 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 n..** non-zero.
14c51 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 This is only use
14c52 64 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20 62 d in debugging b
14c53 75 69 6c 64 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 uilds, as follow
14c54 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 65 78 70 s:..**..** exp
14c55 65 6e 73 69 76 65 5f 61 73 73 65 72 74 28 20 70 ensive_assert( p
14c56 63 61 63 68 65 43 68 65 63 6b 53 79 6e 63 65 64 cacheCheckSynced
14c57 28 70 43 61 63 68 65 29 20 29 3b 0d 0a 2a 2f 0d (pCache) );..*/.
14c58 0a 73 74 61 74 69 63 20 69 6e 74 20 70 63 61 63 .static int pcac
14c59 68 65 43 68 65 63 6b 53 79 6e 63 65 64 28 50 43 heCheckSynced(PC
14c5a 61 63 68 65 20 2a 70 43 61 63 68 65 29 7b 0d 0a ache *pCache){..
14c5b 20 20 50 67 48 64 72 20 2a 70 3b 0d 0a 20 20 66 PgHdr *p;.. f
14c5c 6f 72 28 70 3d 70 43 61 63 68 65 2d 3e 70 44 69 or(p=pCache->pDi
14c5d 72 74 79 54 61 69 6c 3b 20 70 21 3d 70 43 61 63 rtyTail; p!=pCac
14c5e 68 65 2d 3e 70 53 79 6e 63 65 64 3b 20 70 3d 70 he->pSynced; p=p
14c5f 2d 3e 70 44 69 72 74 79 50 72 65 76 29 7b 0d 0a ->pDirtyPrev){..
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e assert( p->n
14c61 52 65 66 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 Ref || (p->flags
14c62 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 &PGHDR_NEED_SYNC
14c63 29 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ) );.. }.. ret
14c64 75 72 6e 20 28 70 3d 3d 30 20 7c 7c 20 70 2d 3e urn (p==0 || p->
14c65 6e 52 65 66 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 nRef || (p->flag
14c66 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e s&PGHDR_NEED_SYN
14c67 43 29 3d 3d 30 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 C)==0);..}..#end
14c68 69 66 20 2f 2a 20 21 4e 44 45 42 55 47 20 26 26 if /* !NDEBUG &&
14c69 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 SQLITE_ENABLE_E
14c6a 58 50 45 4e 53 49 56 45 5f 41 53 53 45 52 54 20 XPENSIVE_ASSERT
14c6b 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 6d */..../*..** Rem
14c6c 6f 76 65 20 70 61 67 65 20 70 50 61 67 65 20 66 ove page pPage f
14c6d 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 rom the list of
14c6e 64 69 72 74 79 20 70 61 67 65 73 2e 0d 0a 2a 2f dirty pages...*/
14c6f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 63 ..static void pc
14c70 61 63 68 65 52 65 6d 6f 76 65 46 72 6f 6d 44 69 acheRemoveFromDi
14c71 72 74 79 4c 69 73 74 28 50 67 48 64 72 20 2a 70 rtyList(PgHdr *p
14c72 50 61 67 65 29 7b 0d 0a 20 20 50 43 61 63 68 65 Page){.. PCache
14c73 20 2a 70 20 3d 20 70 50 61 67 65 2d 3e 70 43 61 *p = pPage->pCa
14c74 63 68 65 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 che;.... assert
14c75 28 20 70 50 61 67 65 2d 3e 70 44 69 72 74 79 4e ( pPage->pDirtyN
14c76 65 78 74 20 7c 7c 20 70 50 61 67 65 3d 3d 70 2d ext || pPage==p-
14c77 3e 70 44 69 72 74 79 54 61 69 6c 20 29 3b 0d 0a >pDirtyTail );..
14c78 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d assert( pPage-
14c79 3e 70 44 69 72 74 79 50 72 65 76 20 7c 7c 20 70 >pDirtyPrev || p
14c7a 50 61 67 65 3d 3d 70 2d 3e 70 44 69 72 74 79 20 Page==p->pDirty
14c7b 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 55 70 64 61 74 );.... /* Updat
14c7c 65 20 74 68 65 20 50 43 61 63 68 65 31 2e 70 53 e the PCache1.pS
14c7d 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65 20 69 ynced variable i
14c7e 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0d f necessary. */.
14c7f 0a 20 20 69 66 28 20 70 2d 3e 70 53 79 6e 63 65 . if( p->pSynce
14c80 64 3d 3d 70 50 61 67 65 20 29 7b 0d 0a 20 20 20 d==pPage ){..
14c81 20 50 67 48 64 72 20 2a 70 53 79 6e 63 65 64 20 PgHdr *pSynced
14c82 3d 20 70 50 61 67 65 2d 3e 70 44 69 72 74 79 50 = pPage->pDirtyP
14c83 72 65 76 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 rev;.. while(
14c84 20 70 53 79 6e 63 65 64 20 26 26 20 28 70 53 79 pSynced && (pSy
14c85 6e 63 65 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 nced->flags&PGHD
14c86 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0d R_NEED_SYNC) ){.
14c87 0a 20 20 20 20 20 20 70 53 79 6e 63 65 64 20 3d . pSynced =
14c88 20 70 53 79 6e 63 65 64 2d 3e 70 44 69 72 74 79 pSynced->pDirty
14c89 50 72 65 76 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 Prev;.. }..
14c8a 20 20 70 2d 3e 70 53 79 6e 63 65 64 20 3d 20 70 p->pSynced = p
14c8b 53 79 6e 63 65 64 3b 0d 0a 20 20 7d 0d 0a 0d 0a Synced;.. }....
14c8c 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 44 69 if( pPage->pDi
14c8d 72 74 79 4e 65 78 74 20 29 7b 0d 0a 20 20 20 20 rtyNext ){..
14c8e 70 50 61 67 65 2d 3e 70 44 69 72 74 79 4e 65 78 pPage->pDirtyNex
14c8f 74 2d 3e 70 44 69 72 74 79 50 72 65 76 20 3d 20 t->pDirtyPrev =
14c90 70 50 61 67 65 2d 3e 70 44 69 72 74 79 50 72 65 pPage->pDirtyPre
14c91 76 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 v;.. }else{..
14c92 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d assert( pPage=
14c93 3d 70 2d 3e 70 44 69 72 74 79 54 61 69 6c 20 29 =p->pDirtyTail )
14c94 3b 0d 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 ;.. p->pDirty
14c95 54 61 69 6c 20 3d 20 70 50 61 67 65 2d 3e 70 44 Tail = pPage->pD
14c96 69 72 74 79 50 72 65 76 3b 0d 0a 20 20 7d 0d 0a irtyPrev;.. }..
14c97 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 44 69 if( pPage->pDi
14c98 72 74 79 50 72 65 76 20 29 7b 0d 0a 20 20 20 20 rtyPrev ){..
14c99 70 50 61 67 65 2d 3e 70 44 69 72 74 79 50 72 65 pPage->pDirtyPre
14c9a 76 2d 3e 70 44 69 72 74 79 4e 65 78 74 20 3d 20 v->pDirtyNext =
14c9b 70 50 61 67 65 2d 3e 70 44 69 72 74 79 4e 65 78 pPage->pDirtyNex
14c9c 74 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 t;.. }else{..
14c9d 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d assert( pPage=
14c9e 3d 70 2d 3e 70 44 69 72 74 79 20 29 3b 0d 0a 20 =p->pDirty );..
14c9f 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 p->pDirty = p
14ca0 50 61 67 65 2d 3e 70 44 69 72 74 79 4e 65 78 74 Page->pDirtyNext
14ca1 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 67 65 2d ;.. }.. pPage-
14ca2 3e 70 44 69 72 74 79 4e 65 78 74 20 3d 20 30 3b >pDirtyNext = 0;
14ca3 0d 0a 20 20 70 50 61 67 65 2d 3e 70 44 69 72 74 .. pPage->pDirt
14ca4 79 50 72 65 76 20 3d 20 30 3b 0d 0a 0d 0a 20 20 yPrev = 0;....
14ca5 65 78 70 65 6e 73 69 76 65 5f 61 73 73 65 72 74 expensive_assert
14ca6 28 20 70 63 61 63 68 65 43 68 65 63 6b 53 79 6e ( pcacheCheckSyn
14ca7 63 65 64 28 70 29 20 29 3b 0d 0a 7d 0d 0a 0d 0a ced(p) );..}....
14ca8 2f 2a 0d 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 /*..** Add page
14ca9 70 50 61 67 65 20 74 6f 20 74 68 65 20 68 65 61 pPage to the hea
14caa 64 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 6c d of the dirty l
14cab 69 73 74 20 28 50 43 61 63 68 65 31 2e 70 44 69 ist (PCache1.pDi
14cac 72 74 79 20 69 73 20 73 65 74 20 74 6f 0d 0a 2a rty is set to..*
14cad 2a 20 70 50 61 67 65 29 2e 0d 0a 2a 2f 0d 0a 73 * pPage)...*/..s
14cae 74 61 74 69 63 20 76 6f 69 64 20 70 63 61 63 68 tatic void pcach
14caf 65 41 64 64 54 6f 44 69 72 74 79 4c 69 73 74 28 eAddToDirtyList(
14cb0 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0d 0a PgHdr *pPage){..
14cb1 20 20 50 43 61 63 68 65 20 2a 70 20 3d 20 70 50 PCache *p = pP
14cb2 61 67 65 2d 3e 70 43 61 63 68 65 3b 0d 0a 0d 0a age->pCache;....
14cb3 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d assert( pPage-
14cb4 3e 70 44 69 72 74 79 4e 65 78 74 3d 3d 30 20 26 >pDirtyNext==0 &
14cb5 26 20 70 50 61 67 65 2d 3e 70 44 69 72 74 79 50 & pPage->pDirtyP
14cb6 72 65 76 3d 3d 30 20 26 26 20 70 2d 3e 70 44 69 rev==0 && p->pDi
14cb7 72 74 79 21 3d 70 50 61 67 65 20 29 3b 0d 0a 0d rty!=pPage );...
14cb8 0a 20 20 70 50 61 67 65 2d 3e 70 44 69 72 74 79 . pPage->pDirty
14cb9 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 Next = p->pDirty
14cba 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e ;.. if( pPage->
14cbb 70 44 69 72 74 79 4e 65 78 74 20 29 7b 0d 0a 20 pDirtyNext ){..
14cbc 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 assert( pPage
14cbd 2d 3e 70 44 69 72 74 79 4e 65 78 74 2d 3e 70 44 ->pDirtyNext->pD
14cbe 69 72 74 79 50 72 65 76 3d 3d 30 20 29 3b 0d 0a irtyPrev==0 );..
14cbf 20 20 20 20 70 50 61 67 65 2d 3e 70 44 69 72 74 pPage->pDirt
14cc0 79 4e 65 78 74 2d 3e 70 44 69 72 74 79 50 72 65 yNext->pDirtyPre
14cc1 76 20 3d 20 70 50 61 67 65 3b 0d 0a 20 20 7d 0d v = pPage;.. }.
14cc2 0a 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 . p->pDirty = p
14cc3 50 61 67 65 3b 0d 0a 20 20 69 66 28 20 21 70 2d Page;.. if( !p-
14cc4 3e 70 44 69 72 74 79 54 61 69 6c 20 29 7b 0d 0a >pDirtyTail ){..
14cc5 20 20 20 20 70 2d 3e 70 44 69 72 74 79 54 61 69 p->pDirtyTai
14cc6 6c 20 3d 20 70 50 61 67 65 3b 0d 0a 20 20 7d 0d l = pPage;.. }.
14cc7 0a 20 20 69 66 28 20 21 70 2d 3e 70 53 79 6e 63 . if( !p->pSync
14cc8 65 64 20 26 26 20 30 3d 3d 28 70 50 61 67 65 2d ed && 0==(pPage-
14cc9 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 >flags&PGHDR_NEE
14cca 44 5f 53 59 4e 43 29 20 29 7b 0d 0a 20 20 20 20 D_SYNC) ){..
14ccb 70 2d 3e 70 53 79 6e 63 65 64 20 3d 20 70 50 61 p->pSynced = pPa
14ccc 67 65 3b 0d 0a 20 20 7d 0d 0a 20 20 65 78 70 65 ge;.. }.. expe
14ccd 6e 73 69 76 65 5f 61 73 73 65 72 74 28 20 70 63 nsive_assert( pc
14cce 61 63 68 65 43 68 65 63 6b 53 79 6e 63 65 64 28 acheCheckSynced(
14ccf 70 29 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a p) );..}..../*..
14cd0 2a 2a 20 57 72 61 70 70 65 72 20 61 72 6f 75 6e ** Wrapper aroun
14cd1 64 20 74 68 65 20 70 6c 75 67 67 61 62 6c 65 20 d the pluggable
14cd2 63 61 63 68 65 73 20 78 55 6e 70 69 6e 20 6d 65 caches xUnpin me
14cd3 74 68 6f 64 2e 20 49 66 20 74 68 65 20 63 61 63 thod. If the cac
14cd4 68 65 20 69 73 0d 0a 2a 2a 20 62 65 69 6e 67 20 he is..** being
14cd5 75 73 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d used for an in-m
14cd6 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 emory database,
14cd7 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 this function is
14cd8 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 a no-op...*/..s
14cd9 74 61 74 69 63 20 76 6f 69 64 20 70 63 61 63 68 tatic void pcach
14cda 65 55 6e 70 69 6e 28 50 67 48 64 72 20 2a 70 29 eUnpin(PgHdr *p)
14cdb 7b 0d 0a 20 20 50 43 61 63 68 65 20 2a 70 43 61 {.. PCache *pCa
14cdc 63 68 65 20 3d 20 70 2d 3e 70 43 61 63 68 65 3b che = p->pCache;
14cdd 0d 0a 20 20 69 66 28 20 70 43 61 63 68 65 2d 3e .. if( pCache->
14cde 62 50 75 72 67 65 61 62 6c 65 20 29 7b 0d 0a 20 bPurgeable ){..
14cdf 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3d 3d if( p->pgno==
14ce0 31 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 61 63 1 ){.. pCac
14ce1 68 65 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0d he->pPage1 = 0;.
14ce2 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 . }.. sqli
14ce3 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
14ce4 70 63 61 63 68 65 32 2e 78 55 6e 70 69 6e 28 70 pcache2.xUnpin(p
14ce5 43 61 63 68 65 2d 3e 70 43 61 63 68 65 2c 20 70 Cache->pCache, p
14ce6 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0d 0a 20 20 ->pPage, 0);..
14ce7 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a }..}..../*******
14ce8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14ce9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
14cea 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 47 65 6e ************ Gen
14ceb 65 72 61 6c 20 49 6e 74 65 72 66 61 63 65 73 20 eral Interfaces
14cec 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 49 ******..**..** I
14ced 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 73 68 nitialize and sh
14cee 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 utdown the page
14cef 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d 2e cache subsystem.
14cf0 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 Neither of thes
14cf1 65 20 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 e ..** functions
14cf2 20 61 72 65 20 74 68 72 65 61 64 73 61 66 65 2e are threadsafe.
14cf3 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
14cf4 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
14cf5 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 PcacheInitialize
14cf6 28 76 6f 69 64 29 7b 0d 0a 20 20 69 66 28 20 73 (void){.. if( s
14cf7 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
14cf8 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 ig.pcache2.xInit
14cf9 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 ==0 ){.. /* I
14cfa 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 MPLEMENTATION-OF
14cfb 3a 20 52 2d 32 36 38 30 31 2d 36 34 31 33 37 20 : R-26801-64137
14cfc 49 66 20 74 68 65 20 78 49 6e 69 74 28 29 20 6d If the xInit() m
14cfd 65 74 68 6f 64 20 69 73 20 4e 55 4c 4c 2c 20 74 ethod is NULL, t
14cfe 68 65 6e 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 hen the.. **
14cff 62 75 69 6c 74 2d 69 6e 20 64 65 66 61 75 6c 74 built-in default
14d00 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 75 page cache is u
14d01 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 sed instead of t
14d02 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 he application d
14d03 65 66 69 6e 65 64 0d 0a 20 20 20 20 2a 2a 20 70 efined.. ** p
14d04 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0d 0a 20 age cache. */..
14d05 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 sqlite3PCache
14d06 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0d 0a 20 SetDefault();..
14d07 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c }.. return sql
14d08 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
14d09 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 28 73 .pcache2.xInit(s
14d0a 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
14d0b 69 67 2e 70 63 61 63 68 65 32 2e 70 41 72 67 29 ig.pcache2.pArg)
14d0c 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ;..}..SQLITE_PRI
14d0d 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
14d0e 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 3PcacheShutdown(
14d0f 76 6f 69 64 29 7b 0d 0a 20 20 69 66 28 20 73 71 void){.. if( sq
14d10 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
14d11 67 2e 70 63 61 63 68 65 32 2e 78 53 68 75 74 64 g.pcache2.xShutd
14d12 6f 77 6e 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 own ){.. /* I
14d13 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 MPLEMENTATION-OF
14d14 3a 20 52 2d 32 36 30 30 30 2d 35 36 35 38 39 20 : R-26000-56589
14d15 54 68 65 20 78 53 68 75 74 64 6f 77 6e 28 29 20 The xShutdown()
14d16 6d 65 74 68 6f 64 20 6d 61 79 20 62 65 20 4e 55 method may be NU
14d17 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 LL. */.. sqli
14d18 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
14d19 70 63 61 63 68 65 32 2e 78 53 68 75 74 64 6f 77 pcache2.xShutdow
14d1a 6e 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 n(sqlite3GlobalC
14d1b 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 70 41 onfig.pcache2.pA
14d1c 72 67 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a rg);.. }..}....
14d1d 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 /*..** Return th
14d1e 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 e size in bytes
14d1f 6f 66 20 61 20 50 43 61 63 68 65 20 6f 62 6a 65 of a PCache obje
14d20 63 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ct...*/..SQLITE_
14d21 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
14d22 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 76 6f te3PcacheSize(vo
14d23 69 64 29 7b 20 72 65 74 75 72 6e 20 73 69 7a 65 id){ return size
14d24 6f 66 28 50 43 61 63 68 65 29 3b 20 7d 0d 0a 0d of(PCache); }...
14d25 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61 ./*..** Create a
14d26 20 6e 65 77 20 50 43 61 63 68 65 20 6f 62 6a 65 new PCache obje
14d27 63 74 2e 20 53 74 6f 72 61 67 65 20 73 70 61 63 ct. Storage spac
14d28 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 e to hold the ob
14d29 6a 65 63 74 0d 0a 2a 2a 20 68 61 73 20 61 6c 72 ject..** has alr
14d2a 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 eady been alloca
14d2b 74 65 64 20 61 6e 64 20 69 73 20 70 61 73 73 65 ted and is passe
14d2c 64 20 69 6e 20 61 73 20 74 68 65 20 70 20 70 6f d in as the p po
14d2d 69 6e 74 65 72 2e 20 0d 0a 2a 2a 20 54 68 65 20 inter. ..** The
14d2e 63 61 6c 6c 65 72 20 64 69 73 63 6f 76 65 72 73 caller discovers
14d2f 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 how much space
14d30 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6c 6c 6f needs to be allo
14d31 63 61 74 65 64 20 62 79 20 0d 0a 2a 2a 20 63 61 cated by ..** ca
14d32 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 lling sqlite3Pca
14d33 63 68 65 53 69 7a 65 28 29 2e 0d 0a 2a 2f 0d 0a cheSize()...*/..
14d34 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
14d35 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 68 oid sqlite3Pcach
14d36 65 4f 70 65 6e 28 0d 0a 20 20 69 6e 74 20 73 7a eOpen(.. int sz
14d37 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 Page,
14d38 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
14d39 66 20 65 76 65 72 79 20 70 61 67 65 20 2a 2f 0d f every page */.
14d3a 0a 20 20 69 6e 74 20 73 7a 45 78 74 72 61 2c 20 . int szExtra,
14d3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14d3c 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 /* Extra space a
14d3d 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 ssociated with e
14d3e 61 63 68 20 70 61 67 65 20 2a 2f 0d 0a 20 20 69 ach page */.. i
14d3f 6e 74 20 62 50 75 72 67 65 61 62 6c 65 2c 20 20 nt bPurgeable,
14d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
14d41 72 75 65 20 69 66 20 70 61 67 65 73 20 61 72 65 rue if pages are
14d42 20 6f 6e 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 on backing stor
14d43 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 53 e */.. int (*xS
14d44 74 72 65 73 73 29 28 76 6f 69 64 2a 2c 50 67 48 tress)(void*,PgH
14d45 64 72 2a 29 2c 2f 2a 20 43 61 6c 6c 20 74 6f 20 dr*),/* Call to
14d46 74 72 79 20 74 6f 20 6d 61 6b 65 20 70 61 67 65 try to make page
14d47 73 20 63 6c 65 61 6e 20 2a 2f 0d 0a 20 20 76 6f s clean */.. vo
14d48 69 64 20 2a 70 53 74 72 65 73 73 2c 20 20 20 20 id *pStress,
14d49 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 /* Ar
14d4a 67 75 6d 65 6e 74 20 74 6f 20 78 53 74 72 65 73 gument to xStres
14d4b 73 20 2a 2f 0d 0a 20 20 50 43 61 63 68 65 20 2a s */.. PCache *
14d4c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
14d4d 20 20 20 20 20 2f 2a 20 50 72 65 61 6c 6c 6f 63 /* Prealloc
14d4e 61 74 65 64 20 73 70 61 63 65 20 66 6f 72 20 74 ated space for t
14d4f 68 65 20 50 43 61 63 68 65 20 2a 2f 0d 0a 29 7b he PCache */..){
14d50 0d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c .. memset(p, 0,
14d51 20 73 69 7a 65 6f 66 28 50 43 61 63 68 65 29 29 sizeof(PCache))
14d52 3b 0d 0a 20 20 70 2d 3e 73 7a 50 61 67 65 20 3d ;.. p->szPage =
14d53 20 73 7a 50 61 67 65 3b 0d 0a 20 20 70 2d 3e 73 szPage;.. p->s
14d54 7a 45 78 74 72 61 20 3d 20 73 7a 45 78 74 72 61 zExtra = szExtra
14d55 3b 0d 0a 20 20 70 2d 3e 62 50 75 72 67 65 61 62 ;.. p->bPurgeab
14d56 6c 65 20 3d 20 62 50 75 72 67 65 61 62 6c 65 3b le = bPurgeable;
14d57 0d 0a 20 20 70 2d 3e 78 53 74 72 65 73 73 20 3d .. p->xStress =
14d58 20 78 53 74 72 65 73 73 3b 0d 0a 20 20 70 2d 3e xStress;.. p->
14d59 70 53 74 72 65 73 73 20 3d 20 70 53 74 72 65 73 pStress = pStres
14d5a 73 3b 0d 0a 20 20 70 2d 3e 73 7a 43 61 63 68 65 s;.. p->szCache
14d5b 20 3d 20 31 30 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a = 100;..}..../*
14d5c 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 ..** Change the
14d5d 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 50 43 page size for PC
14d5e 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 54 68 65 ache object. The
14d5f 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 caller must ens
14d60 75 72 65 20 74 68 61 74 20 74 68 65 72 65 0d 0a ure that there..
14d61 2a 2a 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 ** are no outsta
14d62 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 nding page refer
14d63 65 6e 63 65 73 20 77 68 65 6e 20 74 68 69 73 20 ences when this
14d64 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
14d65 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ed...*/..SQLITE_
14d66 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
14d67 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 ite3PcacheSetPag
14d68 65 53 69 7a 65 28 50 43 61 63 68 65 20 2a 70 43 eSize(PCache *pC
14d69 61 63 68 65 2c 20 69 6e 74 20 73 7a 50 61 67 65 ache, int szPage
14d6a 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 ){.. assert( pC
14d6b 61 63 68 65 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 ache->nRef==0 &&
14d6c 20 70 43 61 63 68 65 2d 3e 70 44 69 72 74 79 3d pCache->pDirty=
14d6d 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 70 43 61 =0 );.. if( pCa
14d6e 63 68 65 2d 3e 70 43 61 63 68 65 20 29 7b 0d 0a che->pCache ){..
14d6f 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 sqlite3Globa
14d70 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e lConfig.pcache2.
14d71 78 44 65 73 74 72 6f 79 28 70 43 61 63 68 65 2d xDestroy(pCache-
14d72 3e 70 43 61 63 68 65 29 3b 0d 0a 20 20 20 20 70 >pCache);.. p
14d73 43 61 63 68 65 2d 3e 70 43 61 63 68 65 20 3d 20 Cache->pCache =
14d74 30 3b 0d 0a 20 20 20 20 70 43 61 63 68 65 2d 3e 0;.. pCache->
14d75 70 50 61 67 65 31 20 3d 20 30 3b 0d 0a 20 20 7d pPage1 = 0;.. }
14d76 0d 0a 20 20 70 43 61 63 68 65 2d 3e 73 7a 50 61 .. pCache->szPa
14d77 67 65 20 3d 20 73 7a 50 61 67 65 3b 0d 0a 7d 0d ge = szPage;..}.
14d78 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 75 74 .../*..** Comput
14d79 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 e the number of
14d7a 70 61 67 65 73 20 6f 66 20 63 61 63 68 65 20 72 pages of cache r
14d7b 65 71 75 65 73 74 65 64 2e 0d 0a 2a 2f 0d 0a 73 equested...*/..s
14d7c 74 61 74 69 63 20 69 6e 74 20 6e 75 6d 62 65 72 tatic int number
14d7d 4f 66 43 61 63 68 65 50 61 67 65 73 28 50 43 61 OfCachePages(PCa
14d7e 63 68 65 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 che *p){.. if(
14d7f 70 2d 3e 73 7a 43 61 63 68 65 3e 3d 30 20 29 7b p->szCache>=0 ){
14d80 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e .. return p->
14d81 73 7a 43 61 63 68 65 3b 0d 0a 20 20 7d 65 6c 73 szCache;.. }els
14d82 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 e{.. return (
14d83 69 6e 74 29 28 28 2d 31 30 32 34 2a 28 69 36 34 int)((-1024*(i64
14d84 29 70 2d 3e 73 7a 43 61 63 68 65 29 2f 28 70 2d )p->szCache)/(p-
14d85 3e 73 7a 50 61 67 65 2b 70 2d 3e 73 7a 45 78 74 >szPage+p->szExt
14d86 72 61 29 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d ra));.. }..}...
14d87 0a 2f 2a 0d 0a 2a 2a 20 54 72 79 20 74 6f 20 6f ./*..** Try to o
14d88 62 74 61 69 6e 20 61 20 70 61 67 65 20 66 72 6f btain a page fro
14d89 6d 20 74 68 65 20 63 61 63 68 65 2e 0d 0a 2a 2f m the cache...*/
14d8a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
14d8b 20 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 63 int sqlite3Pcac
14d8c 68 65 46 65 74 63 68 28 0d 0a 20 20 50 43 61 63 heFetch(.. PCac
14d8d 68 65 20 2a 70 43 61 63 68 65 2c 20 20 20 20 20 he *pCache,
14d8e 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 /* Obtain the
14d8f 70 61 67 65 20 66 72 6f 6d 20 74 68 69 73 20 63 page from this c
14d90 61 63 68 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 ache */.. Pgno
14d91 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 pgno,
14d92 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 /* Page number
14d93 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0d 0a 20 20 to obtain */..
14d94 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 2c 20 int createFlag,
14d95 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 /* If true
14d96 2c 20 63 72 65 61 74 65 20 70 61 67 65 20 69 66 , create page if
14d97 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 it does not exi
14d98 73 74 20 61 6c 72 65 61 64 79 20 2a 2f 0d 0a 20 st already */..
14d99 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 PgHdr **ppPage
14d9a 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 /* Write
14d9b 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f the page here */
14d9c 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f ..){.. sqlite3_
14d9d 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 pcache_page *pPa
14d9e 67 65 20 3d 20 30 3b 0d 0a 20 20 50 67 48 64 72 ge = 0;.. PgHdr
14d9f 20 2a 70 50 67 48 64 72 20 3d 20 30 3b 0d 0a 20 *pPgHdr = 0;..
14da0 20 69 6e 74 20 65 43 72 65 61 74 65 3b 0d 0a 0d int eCreate;...
14da1 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 63 68 . assert( pCach
14da2 65 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 e!=0 );.. asser
14da3 74 28 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 t( createFlag==1
14da4 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 3d 3d || createFlag==
14da5 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 0 );.. assert(
14da6 70 67 6e 6f 3e 30 20 29 3b 0d 0a 0d 0a 20 20 2f pgno>0 );.... /
14da7 2a 20 49 66 20 74 68 65 20 70 6c 75 67 67 61 62 * If the pluggab
14da8 6c 65 20 63 61 63 68 65 20 28 73 71 6c 69 74 65 le cache (sqlite
14da9 33 5f 70 63 61 63 68 65 2a 29 20 68 61 73 20 6e 3_pcache*) has n
14daa 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 ot been allocate
14dab 64 2c 0d 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 d,.. ** allocat
14dac 65 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 2a 2f 0d e it now... */.
14dad 0a 20 20 69 66 28 20 21 70 43 61 63 68 65 2d 3e . if( !pCache->
14dae 70 43 61 63 68 65 20 26 26 20 63 72 65 61 74 65 pCache && create
14daf 46 6c 61 67 20 29 7b 0d 0a 20 20 20 20 73 71 6c Flag ){.. sql
14db0 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 3b 0d ite3_pcache *p;.
14db1 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 . p = sqlite3
14db2 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 GlobalConfig.pca
14db3 63 68 65 32 2e 78 43 72 65 61 74 65 28 0d 0a 20 che2.xCreate(..
14db4 20 20 20 20 20 20 20 70 43 61 63 68 65 2d 3e 73 pCache->s
14db5 7a 50 61 67 65 2c 20 70 43 61 63 68 65 2d 3e 73 zPage, pCache->s
14db6 7a 45 78 74 72 61 20 2b 20 73 69 7a 65 6f 66 28 zExtra + sizeof(
14db7 50 67 48 64 72 29 2c 20 70 43 61 63 68 65 2d 3e PgHdr), pCache->
14db8 62 50 75 72 67 65 61 62 6c 65 0d 0a 20 20 20 20 bPurgeable..
14db9 29 3b 0d 0a 20 20 20 20 69 66 28 20 21 70 20 29 );.. if( !p )
14dba 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 {.. return
14dbb 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 SQLITE_NOMEM;..
14dbc 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 }.. sqlite
14dbd 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 3GlobalConfig.pc
14dbe 61 63 68 65 32 2e 78 43 61 63 68 65 73 69 7a 65 ache2.xCachesize
14dbf 28 70 2c 20 6e 75 6d 62 65 72 4f 66 43 61 63 68 (p, numberOfCach
14dc0 65 50 61 67 65 73 28 70 43 61 63 68 65 29 29 3b ePages(pCache));
14dc1 0d 0a 20 20 20 20 70 43 61 63 68 65 2d 3e 70 43 .. pCache->pC
14dc2 61 63 68 65 20 3d 20 70 3b 0d 0a 20 20 7d 0d 0a ache = p;.. }..
14dc3 0d 0a 20 20 65 43 72 65 61 74 65 20 3d 20 63 72 .. eCreate = cr
14dc4 65 61 74 65 46 6c 61 67 20 2a 20 28 31 20 2b 20 eateFlag * (1 +
14dc5 28 21 70 43 61 63 68 65 2d 3e 62 50 75 72 67 65 (!pCache->bPurge
14dc6 61 62 6c 65 20 7c 7c 20 21 70 43 61 63 68 65 2d able || !pCache-
14dc7 3e 70 44 69 72 74 79 29 29 3b 0d 0a 20 20 69 66 >pDirty));.. if
14dc8 28 20 70 43 61 63 68 65 2d 3e 70 43 61 63 68 65 ( pCache->pCache
14dc9 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 20 3d ){.. pPage =
14dca 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
14dcb 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 46 65 nfig.pcache2.xFe
14dcc 74 63 68 28 70 43 61 63 68 65 2d 3e 70 43 61 63 tch(pCache->pCac
14dcd 68 65 2c 20 70 67 6e 6f 2c 20 65 43 72 65 61 74 he, pgno, eCreat
14dce 65 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 e);.. }.... if
14dcf 28 20 21 70 50 61 67 65 20 26 26 20 65 43 72 65 ( !pPage && eCre
14dd0 61 74 65 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 50 ate==1 ){.. P
14dd1 67 48 64 72 20 2a 70 50 67 3b 0d 0a 0d 0a 20 20 gHdr *pPg;....
14dd2 20 20 2f 2a 20 46 69 6e 64 20 61 20 64 69 72 74 /* Find a dirt
14dd3 79 20 70 61 67 65 20 74 6f 20 77 72 69 74 65 2d y page to write-
14dd4 6f 75 74 20 61 6e 64 20 72 65 63 79 63 6c 65 2e out and recycle.
14dd5 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 66 69 First try to fi
14dd6 6e 64 20 61 20 0d 0a 20 20 20 20 2a 2a 20 70 61 nd a .. ** pa
14dd7 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 ge that does not
14dd8 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e require a journ
14dd9 61 6c 2d 73 79 6e 63 20 28 6f 6e 65 20 77 69 74 al-sync (one wit
14dda 68 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e h PGHDR_NEED_SYN
14ddb 43 0d 0a 20 20 20 20 2a 2a 20 63 6c 65 61 72 65 C.. ** cleare
14ddc 64 29 2c 20 62 75 74 20 69 66 20 74 68 61 74 20 d), but if that
14ddd 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 is not possible
14dde 73 65 74 74 6c 65 20 66 6f 72 20 61 6e 79 20 6f settle for any o
14ddf 74 68 65 72 20 0d 0a 20 20 20 20 2a 2a 20 75 6e ther .. ** un
14de0 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 referenced dirty
14de1 20 70 61 67 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a page... */..
14de2 20 20 20 20 65 78 70 65 6e 73 69 76 65 5f 61 73 expensive_as
14de3 73 65 72 74 28 20 70 63 61 63 68 65 43 68 65 63 sert( pcacheChec
14de4 6b 53 79 6e 63 65 64 28 70 43 61 63 68 65 29 20 kSynced(pCache)
14de5 29 3b 0d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d );.. for(pPg=
14de6 70 43 61 63 68 65 2d 3e 70 53 79 6e 63 65 64 3b pCache->pSynced;
14de7 20 0d 0a 20 20 20 20 20 20 20 20 70 50 67 20 26 .. pPg &
14de8 26 20 28 70 50 67 2d 3e 6e 52 65 66 20 7c 7c 20 & (pPg->nRef ||
14de9 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 (pPg->flags&PGHD
14dea 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 20 0d R_NEED_SYNC)); .
14deb 0a 20 20 20 20 20 20 20 20 70 50 67 3d 70 50 67 . pPg=pPg
14dec 2d 3e 70 44 69 72 74 79 50 72 65 76 0d 0a 20 20 ->pDirtyPrev..
14ded 20 20 29 3b 0d 0a 20 20 20 20 70 43 61 63 68 65 );.. pCache
14dee 2d 3e 70 53 79 6e 63 65 64 20 3d 20 70 50 67 3b ->pSynced = pPg;
14def 0d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 .. if( !pPg )
14df0 7b 0d 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 {.. for(pPg
14df1 3d 70 43 61 63 68 65 2d 3e 70 44 69 72 74 79 54 =pCache->pDirtyT
14df2 61 69 6c 3b 20 70 50 67 20 26 26 20 70 50 67 2d ail; pPg && pPg-
14df3 3e 6e 52 65 66 3b 20 70 50 67 3d 70 50 67 2d 3e >nRef; pPg=pPg->
14df4 70 44 69 72 74 79 50 72 65 76 29 3b 0d 0a 20 20 pDirtyPrev);..
14df5 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 50 67 }.. if( pPg
14df6 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 72 ){.. int r
14df7 63 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 c;..#ifdef SQLIT
14df8 45 5f 4c 4f 47 5f 43 41 43 48 45 5f 53 50 49 4c E_LOG_CACHE_SPIL
14df9 4c 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 L.. sqlite3
14dfa 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c _log(SQLITE_FULL
14dfb 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 , ..
14dfc 20 20 20 20 20 20 22 73 70 69 6c 6c 20 70 61 67 "spill pag
14dfd 65 20 25 64 20 6d 61 6b 69 6e 67 20 72 6f 6f 6d e %d making room
14dfe 20 66 6f 72 20 25 64 20 2d 20 63 61 63 68 65 20 for %d - cache
14dff 75 73 65 64 3a 20 25 64 2f 25 64 22 2c 0d 0a 20 used: %d/%d",..
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e01 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f pPg->pgno, pgno
14e02 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
14e03 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 sqlite3Glob
14e04 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 2e alConfig.pcache.
14e05 78 50 61 67 65 63 6f 75 6e 74 28 70 43 61 63 68 xPagecount(pCach
14e06 65 2d 3e 70 43 61 63 68 65 29 2c 0d 0a 20 20 20 e->pCache),..
14e07 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e n
14e08 75 6d 62 65 72 4f 66 43 61 63 68 65 50 61 67 65 umberOfCachePage
14e09 73 28 70 43 61 63 68 65 29 29 3b 0d 0a 23 65 6e s(pCache));..#en
14e0a 64 69 66 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 dif.. rc =
14e0b 70 43 61 63 68 65 2d 3e 78 53 74 72 65 73 73 28 pCache->xStress(
14e0c 70 43 61 63 68 65 2d 3e 70 53 74 72 65 73 73 2c pCache->pStress,
14e0d 20 70 50 67 29 3b 0d 0a 20 20 20 20 20 20 69 66 pPg);.. if
14e0e 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
14e0f 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 && rc!=SQLITE_BU
14e10 53 59 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 SY ){.. r
14e11 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 eturn rc;..
14e12 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 }.. }....
14e13 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 pPage = sqlite3
14e14 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 GlobalConfig.pca
14e15 63 68 65 32 2e 78 46 65 74 63 68 28 70 43 61 63 che2.xFetch(pCac
14e16 68 65 2d 3e 70 43 61 63 68 65 2c 20 70 67 6e 6f he->pCache, pgno
14e17 2c 20 32 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 , 2);.. }....
14e18 69 66 28 20 70 50 61 67 65 20 29 7b 0d 0a 20 20 if( pPage ){..
14e19 20 20 70 50 67 48 64 72 20 3d 20 28 50 67 48 64 pPgHdr = (PgHd
14e1a 72 20 2a 29 70 50 61 67 65 2d 3e 70 45 78 74 72 r *)pPage->pExtr
14e1b 61 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 21 70 a;.... if( !p
14e1c 50 67 48 64 72 2d 3e 70 50 61 67 65 20 29 7b 0d PgHdr->pPage ){.
14e1d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 . memset(pP
14e1e 67 48 64 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 gHdr, 0, sizeof(
14e1f 50 67 48 64 72 29 29 3b 0d 0a 20 20 20 20 20 20 PgHdr));..
14e20 70 50 67 48 64 72 2d 3e 70 50 61 67 65 20 3d 20 pPgHdr->pPage =
14e21 70 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 70 50 pPage;.. pP
14e22 67 48 64 72 2d 3e 70 44 61 74 61 20 3d 20 70 50 gHdr->pData = pP
14e23 61 67 65 2d 3e 70 42 75 66 3b 0d 0a 20 20 20 20 age->pBuf;..
14e24 20 20 70 50 67 48 64 72 2d 3e 70 45 78 74 72 61 pPgHdr->pExtra
14e25 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 50 67 48 = (void *)&pPgH
14e26 64 72 5b 31 5d 3b 0d 0a 20 20 20 20 20 20 6d 65 dr[1];.. me
14e27 6d 73 65 74 28 70 50 67 48 64 72 2d 3e 70 45 78 mset(pPgHdr->pEx
14e28 74 72 61 2c 20 30 2c 20 70 43 61 63 68 65 2d 3e tra, 0, pCache->
14e29 73 7a 45 78 74 72 61 29 3b 0d 0a 20 20 20 20 20 szExtra);..
14e2a 20 70 50 67 48 64 72 2d 3e 70 43 61 63 68 65 20 pPgHdr->pCache
14e2b 3d 20 70 43 61 63 68 65 3b 0d 0a 20 20 20 20 20 = pCache;..
14e2c 20 70 50 67 48 64 72 2d 3e 70 67 6e 6f 20 3d 20 pPgHdr->pgno =
14e2d 70 67 6e 6f 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 pgno;.. }..
14e2e 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 assert( pPgHdr
14e2f 2d 3e 70 43 61 63 68 65 3d 3d 70 43 61 63 68 65 ->pCache==pCache
14e30 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
14e31 20 70 50 67 48 64 72 2d 3e 70 67 6e 6f 3d 3d 70 pPgHdr->pgno==p
14e32 67 6e 6f 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 gno );.. asse
14e33 72 74 28 20 70 50 67 48 64 72 2d 3e 70 44 61 74 rt( pPgHdr->pDat
14e34 61 3d 3d 70 50 61 67 65 2d 3e 70 42 75 66 20 29 a==pPage->pBuf )
14e35 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
14e36 50 67 48 64 72 2d 3e 70 45 78 74 72 61 3d 3d 28 PgHdr->pExtra==(
14e37 76 6f 69 64 20 2a 29 26 70 50 67 48 64 72 5b 31 void *)&pPgHdr[1
14e38 5d 20 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 ] );.... if(
14e39 30 3d 3d 70 50 67 48 64 72 2d 3e 6e 52 65 66 20 0==pPgHdr->nRef
14e3a 29 7b 0d 0a 20 20 20 20 20 20 70 43 61 63 68 65 ){.. pCache
14e3b 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 20 20 20 20 7d ->nRef++;.. }
14e3c 0d 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 52 .. pPgHdr->nR
14e3d 65 66 2b 2b 3b 0d 0a 20 20 20 20 69 66 28 20 70 ef++;.. if( p
14e3e 67 6e 6f 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 gno==1 ){..
14e3f 20 70 43 61 63 68 65 2d 3e 70 50 61 67 65 31 20 pCache->pPage1
14e40 3d 20 70 50 67 48 64 72 3b 0d 0a 20 20 20 20 7d = pPgHdr;.. }
14e41 0d 0a 20 20 7d 0d 0a 20 20 2a 70 70 50 61 67 65 .. }.. *ppPage
14e42 20 3d 20 70 50 67 48 64 72 3b 0d 0a 20 20 72 65 = pPgHdr;.. re
14e43 74 75 72 6e 20 28 70 50 67 48 64 72 3d 3d 30 20 turn (pPgHdr==0
14e44 26 26 20 65 43 72 65 61 74 65 29 20 3f 20 53 51 && eCreate) ? SQ
14e45 4c 49 54 45 5f 4e 4f 4d 45 4d 20 3a 20 53 51 4c LITE_NOMEM : SQL
14e46 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
14e47 0d 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 ..** Decrement t
14e48 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 he reference cou
14e49 6e 74 20 6f 6e 20 61 20 70 61 67 65 2e 20 49 66 nt on a page. If
14e4a 20 74 68 65 20 70 61 67 65 20 69 73 20 63 6c 65 the page is cle
14e4b 61 6e 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 72 an and the..** r
14e4c 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 64 eference count d
14e4d 72 6f 70 73 20 74 6f 20 30 2c 20 74 68 65 6e 20 rops to 0, then
14e4e 69 74 20 69 73 20 6d 61 64 65 20 65 6c 69 62 6c it is made elibl
14e4f 65 20 66 6f 72 20 72 65 63 79 63 6c 69 6e 67 2e e for recycling.
14e50 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
14e51 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
14e52 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 50 3PcacheRelease(P
14e53 67 48 64 72 20 2a 70 29 7b 0d 0a 20 20 61 73 73 gHdr *p){.. ass
14e54 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 ert( p->nRef>0 )
14e55 3b 0d 0a 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0d ;.. p->nRef--;.
14e56 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d . if( p->nRef==
14e57 30 20 29 7b 0d 0a 20 20 20 20 50 43 61 63 68 65 0 ){.. PCache
14e58 20 2a 70 43 61 63 68 65 20 3d 20 70 2d 3e 70 43 *pCache = p->pC
14e59 61 63 68 65 3b 0d 0a 20 20 20 20 70 43 61 63 68 ache;.. pCach
14e5a 65 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a 20 20 20 20 e->nRef--;..
14e5b 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 26 50 47 if( (p->flags&PG
14e5c 48 44 52 5f 44 49 52 54 59 29 3d 3d 30 20 29 7b HDR_DIRTY)==0 ){
14e5d 0d 0a 20 20 20 20 20 20 70 63 61 63 68 65 55 6e .. pcacheUn
14e5e 70 69 6e 28 70 29 3b 0d 0a 20 20 20 20 7d 65 6c pin(p);.. }el
14e5f 73 65 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 4d 6f se{.. /* Mo
14e60 76 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 ve the page to t
14e61 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 64 he head of the d
14e62 69 72 74 79 20 6c 69 73 74 2e 20 2a 2f 0d 0a 20 irty list. */..
14e63 20 20 20 20 20 70 63 61 63 68 65 52 65 6d 6f 76 pcacheRemov
14e64 65 46 72 6f 6d 44 69 72 74 79 4c 69 73 74 28 70 eFromDirtyList(p
14e65 29 3b 0d 0a 20 20 20 20 20 20 70 63 61 63 68 65 );.. pcache
14e66 41 64 64 54 6f 44 69 72 74 79 4c 69 73 74 28 70 AddToDirtyList(p
14e67 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
14e68 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 63 72 }..../*..** Incr
14e69 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e ease the referen
14e6a 63 65 20 63 6f 75 6e 74 20 6f 66 20 61 20 73 75 ce count of a su
14e6b 70 70 6c 69 65 64 20 70 61 67 65 20 62 79 20 31 pplied page by 1
14e6c 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
14e6d 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
14e6e 65 33 50 63 61 63 68 65 52 65 66 28 50 67 48 64 e3PcacheRef(PgHd
14e6f 72 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 r *p){.. assert
14e70 28 70 2d 3e 6e 52 65 66 3e 30 29 3b 0d 0a 20 20 (p->nRef>0);..
14e71 70 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a 7d 0d 0a 0d p->nRef++;..}...
14e72 0a 2f 2a 0d 0a 2a 2a 20 44 72 6f 70 20 61 20 70 ./*..** Drop a p
14e73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 age from the cac
14e74 68 65 2e 20 54 68 65 72 65 20 6d 75 73 74 20 62 he. There must b
14e75 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 e exactly one re
14e76 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0d 0a ference to the..
14e77 2a 2a 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 ** page. This fu
14e78 6e 63 74 69 6f 6e 20 64 65 6c 65 74 65 73 20 74 nction deletes t
14e79 68 61 74 20 72 65 66 65 72 65 6e 63 65 2c 20 73 hat reference, s
14e7a 6f 20 61 66 74 65 72 20 69 74 20 72 65 74 75 72 o after it retur
14e7b 6e 73 20 74 68 65 0d 0a 2a 2a 20 70 61 67 65 20 ns the..** page
14e7c 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 20 pointed to by p
14e7d 69 73 20 69 6e 76 61 6c 69 64 2e 0d 0a 2a 2f 0d is invalid...*/.
14e7e 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
14e7f 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 61 63 void sqlite3Pcac
14e80 68 65 44 72 6f 70 28 50 67 48 64 72 20 2a 70 29 heDrop(PgHdr *p)
14e81 7b 0d 0a 20 20 50 43 61 63 68 65 20 2a 70 43 61 {.. PCache *pCa
14e82 63 68 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 che;.. assert(
14e83 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0d 0a 20 p->nRef==1 );..
14e84 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 50 47 if( p->flags&PG
14e85 48 44 52 5f 44 49 52 54 59 20 29 7b 0d 0a 20 20 HDR_DIRTY ){..
14e86 20 20 70 63 61 63 68 65 52 65 6d 6f 76 65 46 72 pcacheRemoveFr
14e87 6f 6d 44 69 72 74 79 4c 69 73 74 28 70 29 3b 0d omDirtyList(p);.
14e88 0a 20 20 7d 0d 0a 20 20 70 43 61 63 68 65 20 3d . }.. pCache =
14e89 20 70 2d 3e 70 43 61 63 68 65 3b 0d 0a 20 20 70 p->pCache;.. p
14e8a 43 61 63 68 65 2d 3e 6e 52 65 66 2d 2d 3b 0d 0a Cache->nRef--;..
14e8b 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3d 3d 31 if( p->pgno==1
14e8c 20 29 7b 0d 0a 20 20 20 20 70 43 61 63 68 65 2d ){.. pCache-
14e8d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0d 0a 20 20 >pPage1 = 0;..
14e8e 7d 0d 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 }.. sqlite3Glob
14e8f 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 alConfig.pcache2
14e90 2e 78 55 6e 70 69 6e 28 70 43 61 63 68 65 2d 3e .xUnpin(pCache->
14e91 70 43 61 63 68 65 2c 20 70 2d 3e 70 50 61 67 65 pCache, p->pPage
14e92 2c 20 31 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a , 1);..}..../*..
14e93 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 ** Make sure the
14e94 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 page is marked
14e95 61 73 20 64 69 72 74 79 2e 20 49 66 20 69 74 20 as dirty. If it
14e96 69 73 6e 27 74 20 64 69 72 74 79 20 61 6c 72 65 isn't dirty alre
14e97 61 64 79 2c 0d 0a 2a 2a 20 6d 61 6b 65 20 69 74 ady,..** make it
14e98 20 73 6f 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 so...*/..SQLITE
14e99 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
14e9a 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 lite3PcacheMakeD
14e9b 69 72 74 79 28 50 67 48 64 72 20 2a 70 29 7b 0d irty(PgHdr *p){.
14e9c 0a 20 20 70 2d 3e 66 6c 61 67 73 20 26 3d 20 7e . p->flags &= ~
14e9d 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 PGHDR_DONT_WRITE
14e9e 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e ;.. assert( p->
14e9f 6e 52 65 66 3e 30 20 29 3b 0d 0a 20 20 69 66 28 nRef>0 );.. if(
14ea0 20 30 3d 3d 28 70 2d 3e 66 6c 61 67 73 20 26 20 0==(p->flags &
14ea1 50 47 48 44 52 5f 44 49 52 54 59 29 20 29 7b 0d PGHDR_DIRTY) ){.
14ea2 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d . p->flags |=
14ea3 20 50 47 48 44 52 5f 44 49 52 54 59 3b 0d 0a 20 PGHDR_DIRTY;..
14ea4 20 20 20 70 63 61 63 68 65 41 64 64 54 6f 44 69 pcacheAddToDi
14ea5 72 74 79 4c 69 73 74 28 20 70 29 3b 0d 0a 20 20 rtyList( p);..
14ea6 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d }..}..../*..** M
14ea7 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67 ake sure the pag
14ea8 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 63 e is marked as c
14ea9 6c 65 61 6e 2e 20 49 66 20 69 74 20 69 73 6e 27 lean. If it isn'
14eaa 74 20 63 6c 65 61 6e 20 61 6c 72 65 61 64 79 2c t clean already,
14eab 0d 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 73 6f 2e ..** make it so.
14eac 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
14ead 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
14eae 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 3PcacheMakeClean
14eaf 28 50 67 48 64 72 20 2a 70 29 7b 0d 0a 20 20 69 (PgHdr *p){.. i
14eb0 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 50 f( (p->flags & P
14eb1 47 48 44 52 5f 44 49 52 54 59 29 20 29 7b 0d 0a GHDR_DIRTY) ){..
14eb2 20 20 20 20 70 63 61 63 68 65 52 65 6d 6f 76 65 pcacheRemove
14eb3 46 72 6f 6d 44 69 72 74 79 4c 69 73 74 28 70 29 FromDirtyList(p)
14eb4 3b 0d 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 ;.. p->flags
14eb5 26 3d 20 7e 28 50 47 48 44 52 5f 44 49 52 54 59 &= ~(PGHDR_DIRTY
14eb6 7c 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 |PGHDR_NEED_SYNC
14eb7 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e );.. if( p->n
14eb8 52 65 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 Ref==0 ){..
14eb9 20 70 63 61 63 68 65 55 6e 70 69 6e 28 70 29 3b pcacheUnpin(p);
14eba 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d .. }.. }..}.
14ebb 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 20 65 .../*..** Make e
14ebc 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 very page in the
14ebd 20 63 61 63 68 65 20 63 6c 65 61 6e 2e 0d 0a 2a cache clean...*
14ebe 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
14ebf 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 63 E void sqlite3Pc
14ec0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 50 43 61 acheCleanAll(PCa
14ec1 63 68 65 20 2a 70 43 61 63 68 65 29 7b 0d 0a 20 che *pCache){..
14ec2 20 50 67 48 64 72 20 2a 70 3b 0d 0a 20 20 77 68 PgHdr *p;.. wh
14ec3 69 6c 65 28 20 28 70 20 3d 20 70 43 61 63 68 65 ile( (p = pCache
14ec4 2d 3e 70 44 69 72 74 79 29 21 3d 30 20 29 7b 0d ->pDirty)!=0 ){.
14ec5 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 . sqlite3Pcac
14ec6 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 29 3b 0d heMakeClean(p);.
14ec7 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
14ec8 2a 20 43 6c 65 61 72 20 74 68 65 20 50 47 48 44 * Clear the PGHD
14ec9 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 R_NEED_SYNC flag
14eca 20 66 72 6f 6d 20 61 6c 6c 20 64 69 72 74 79 20 from all dirty
14ecb 70 61 67 65 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 pages...*/..SQLI
14ecc 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
14ecd 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 sqlite3PcacheCle
14ece 61 72 53 79 6e 63 46 6c 61 67 73 28 50 43 61 63 arSyncFlags(PCac
14ecf 68 65 20 2a 70 43 61 63 68 65 29 7b 0d 0a 20 20 he *pCache){..
14ed0 50 67 48 64 72 20 2a 70 3b 0d 0a 20 20 66 6f 72 PgHdr *p;.. for
14ed1 28 70 3d 70 43 61 63 68 65 2d 3e 70 44 69 72 74 (p=pCache->pDirt
14ed2 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 y; p; p=p->pDirt
14ed3 79 4e 65 78 74 29 7b 0d 0a 20 20 20 20 70 2d 3e yNext){.. p->
14ed4 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f flags &= ~PGHDR_
14ed5 4e 45 45 44 5f 53 59 4e 43 3b 0d 0a 20 20 7d 0d NEED_SYNC;.. }.
14ed6 0a 20 20 70 43 61 63 68 65 2d 3e 70 53 79 6e 63 . pCache->pSync
14ed7 65 64 20 3d 20 70 43 61 63 68 65 2d 3e 70 44 69 ed = pCache->pDi
14ed8 72 74 79 54 61 69 6c 3b 0d 0a 7d 0d 0a 0d 0a 2f rtyTail;..}..../
14ed9 2a 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 *..** Change the
14eda 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 page number of
14edb 70 61 67 65 20 70 20 74 6f 20 6e 65 77 50 67 6e page p to newPgn
14edc 6f 2e 20 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f o. ..*/..SQLITE_
14edd 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
14ede 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 50 ite3PcacheMove(P
14edf 67 48 64 72 20 2a 70 2c 20 50 67 6e 6f 20 6e 65 gHdr *p, Pgno ne
14ee0 77 50 67 6e 6f 29 7b 0d 0a 20 20 50 43 61 63 68 wPgno){.. PCach
14ee1 65 20 2a 70 43 61 63 68 65 20 3d 20 70 2d 3e 70 e *pCache = p->p
14ee2 43 61 63 68 65 3b 0d 0a 20 20 61 73 73 65 72 74 Cache;.. assert
14ee3 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0d 0a ( p->nRef>0 );..
14ee4 20 20 61 73 73 65 72 74 28 20 6e 65 77 50 67 6e assert( newPgn
14ee5 6f 3e 30 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 o>0 );.. sqlite
14ee6 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 3GlobalConfig.pc
14ee7 61 63 68 65 32 2e 78 52 65 6b 65 79 28 70 43 61 ache2.xRekey(pCa
14ee8 63 68 65 2d 3e 70 43 61 63 68 65 2c 20 70 2d 3e che->pCache, p->
14ee9 70 50 61 67 65 2c 20 70 2d 3e 70 67 6e 6f 2c 6e pPage, p->pgno,n
14eea 65 77 50 67 6e 6f 29 3b 0d 0a 20 20 70 2d 3e 70 ewPgno);.. p->p
14eeb 67 6e 6f 20 3d 20 6e 65 77 50 67 6e 6f 3b 0d 0a gno = newPgno;..
14eec 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 26 if( (p->flags&
14eed 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 PGHDR_DIRTY) &&
14eee 28 70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f (p->flags&PGHDR_
14eef 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0d 0a 20 NEED_SYNC) ){..
14ef0 20 20 20 70 63 61 63 68 65 52 65 6d 6f 76 65 46 pcacheRemoveF
14ef1 72 6f 6d 44 69 72 74 79 4c 69 73 74 28 70 29 3b romDirtyList(p);
14ef2 0d 0a 20 20 20 20 70 63 61 63 68 65 41 64 64 54 .. pcacheAddT
14ef3 6f 44 69 72 74 79 4c 69 73 74 28 70 29 3b 0d 0a oDirtyList(p);..
14ef4 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
14ef5 20 44 72 6f 70 20 65 76 65 72 79 20 63 61 63 68 Drop every cach
14ef6 65 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70 61 e entry whose pa
14ef7 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 ge number is gre
14ef8 61 74 65 72 20 74 68 61 6e 20 22 70 67 6e 6f 22 ater than "pgno"
14ef9 2e 20 54 68 65 0d 0a 2a 2a 20 63 61 6c 6c 65 72 . The..** caller
14efa 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 must ensure tha
14efb 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f t there are no o
14efc 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 utstanding refer
14efd 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 ences to any pag
14efe 65 73 0d 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 es..** other tha
14eff 6e 20 70 61 67 65 20 31 20 77 69 74 68 20 61 20 n page 1 with a
14f00 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 page number grea
14f01 74 65 72 20 74 68 61 6e 20 70 67 6e 6f 2e 0d 0a ter than pgno...
14f02 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 **..** If there
14f03 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 is a reference t
14f04 6f 20 70 61 67 65 20 31 20 61 6e 64 20 74 68 65 o page 1 and the
14f05 20 70 67 6e 6f 20 70 61 72 61 6d 65 74 65 72 20 pgno parameter
14f06 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 0d 0a passed to this..
14f07 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 30 ** function is 0
14f08 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 , then the data
14f09 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 area associated
14f0a 77 69 74 68 20 70 61 67 65 20 31 20 69 73 20 7a with page 1 is z
14f0b 65 72 6f 65 64 2c 20 62 75 74 0d 0a 2a 2a 20 74 eroed, but..** t
14f0c 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 he page object i
14f0d 73 20 6e 6f 74 20 64 72 6f 70 70 65 64 2e 0d 0a s not dropped...
14f0e 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
14f0f 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
14f10 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 50 43 cacheTruncate(PC
14f11 61 63 68 65 20 2a 70 43 61 63 68 65 2c 20 50 67 ache *pCache, Pg
14f12 6e 6f 20 70 67 6e 6f 29 7b 0d 0a 20 20 69 66 28 no pgno){.. if(
14f13 20 70 43 61 63 68 65 2d 3e 70 43 61 63 68 65 20 pCache->pCache
14f14 29 7b 0d 0a 20 20 20 20 50 67 48 64 72 20 2a 70 ){.. PgHdr *p
14f15 3b 0d 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e ;.. PgHdr *pN
14f16 65 78 74 3b 0d 0a 20 20 20 20 66 6f 72 28 70 3d ext;.. for(p=
14f17 70 43 61 63 68 65 2d 3e 70 44 69 72 74 79 3b 20 pCache->pDirty;
14f18 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0d 0a 20 20 p; p=pNext){..
14f19 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 pNext = p->p
14f1a 44 69 72 74 79 4e 65 78 74 3b 0d 0a 20 20 20 20 DirtyNext;..
14f1b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e /* This routin
14f1c 65 20 6e 65 76 65 72 20 67 65 74 73 20 63 61 6c e never gets cal
14f1d 6c 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 l with a positiv
14f1e 65 20 70 67 6e 6f 20 65 78 63 65 70 74 20 72 69 e pgno except ri
14f1f 67 68 74 0d 0a 20 20 20 20 20 20 2a 2a 20 61 66 ght.. ** af
14f20 74 65 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 ter sqlite3Pcach
14f21 65 43 6c 65 61 6e 41 6c 6c 28 29 2e 20 20 53 6f eCleanAll(). So
14f22 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 if there are di
14f23 72 74 79 20 70 61 67 65 73 2c 0d 0a 20 20 20 20 rty pages,..
14f24 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 ** it must be
14f25 74 68 61 74 20 70 67 6e 6f 3d 3d 30 2e 0d 0a 20 that pgno==0...
14f26 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 61 */.. a
14f27 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 3e 30 ssert( p->pgno>0
14f28 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 41 );.. if( A
14f29 4c 57 41 59 53 28 70 2d 3e 70 67 6e 6f 3e 70 67 LWAYS(p->pgno>pg
14f2a 6e 6f 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 no) ){..
14f2b 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 assert( p->flags
14f2c 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0d &PGHDR_DIRTY );.
14f2d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
14f2e 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 PcacheMakeClean(
14f2f 70 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 p);.. }..
14f30 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 67 6e }.. if( pgn
14f31 6f 3d 3d 30 20 26 26 20 70 43 61 63 68 65 2d 3e o==0 && pCache->
14f32 70 50 61 67 65 31 20 29 7b 0d 0a 20 20 20 20 20 pPage1 ){..
14f33 20 6d 65 6d 73 65 74 28 70 43 61 63 68 65 2d 3e memset(pCache->
14f34 70 50 61 67 65 31 2d 3e 70 44 61 74 61 2c 20 30 pPage1->pData, 0
14f35 2c 20 70 43 61 63 68 65 2d 3e 73 7a 50 61 67 65 , pCache->szPage
14f36 29 3b 0d 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d );.. pgno =
14f37 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 1;.. }..
14f38 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
14f39 66 69 67 2e 70 63 61 63 68 65 32 2e 78 54 72 75 fig.pcache2.xTru
14f3a 6e 63 61 74 65 28 70 43 61 63 68 65 2d 3e 70 43 ncate(pCache->pC
14f3b 61 63 68 65 2c 20 70 67 6e 6f 2b 31 29 3b 0d 0a ache, pgno+1);..
14f3c 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
14f3d 20 43 6c 6f 73 65 20 61 20 63 61 63 68 65 2e 0d Close a cache..
14f3e 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
14f3f 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
14f40 50 63 61 63 68 65 43 6c 6f 73 65 28 50 43 61 63 PcacheClose(PCac
14f41 68 65 20 2a 70 43 61 63 68 65 29 7b 0d 0a 20 20 he *pCache){..
14f42 69 66 28 20 70 43 61 63 68 65 2d 3e 70 43 61 63 if( pCache->pCac
14f43 68 65 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 he ){.. sqlit
14f44 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 e3GlobalConfig.p
14f45 63 61 63 68 65 32 2e 78 44 65 73 74 72 6f 79 28 cache2.xDestroy(
14f46 70 43 61 63 68 65 2d 3e 70 43 61 63 68 65 29 3b pCache->pCache);
14f47 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d .. }..}..../* .
14f48 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 .** Discard the
14f49 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
14f4a 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 cache...*/..SQLI
14f4b 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
14f4c 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 sqlite3PcacheCle
14f4d 61 72 28 50 43 61 63 68 65 20 2a 70 43 61 63 68 ar(PCache *pCach
14f4e 65 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 50 63 e){.. sqlite3Pc
14f4f 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 43 61 acheTruncate(pCa
14f50 63 68 65 2c 20 30 29 3b 0d 0a 7d 0d 0a 0d 0a 2f che, 0);..}..../
14f51 2a 0d 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 *..** Merge two
14f52 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 lists of pages c
14f53 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 onnected by pDir
14f54 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f ty and in pgno o
14f55 72 64 65 72 2e 0d 0a 2a 2a 20 44 6f 20 6e 6f 74 rder...** Do not
14f56 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 both fixing the
14f57 20 70 44 69 72 74 79 50 72 65 76 20 70 6f 69 6e pDirtyPrev poin
14f58 74 65 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ters...*/..stati
14f59 63 20 50 67 48 64 72 20 2a 70 63 61 63 68 65 4d c PgHdr *pcacheM
14f5a 65 72 67 65 44 69 72 74 79 4c 69 73 74 28 50 67 ergeDirtyList(Pg
14f5b 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a Hdr *pA, PgHdr *
14f5c 70 42 29 7b 0d 0a 20 20 50 67 48 64 72 20 72 65 pB){.. PgHdr re
14f5d 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0d 0a 20 sult, *pTail;..
14f5e 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 pTail = &result
14f5f 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 ;.. while( pA &
14f60 26 20 70 42 20 29 7b 0d 0a 20 20 20 20 69 66 28 & pB ){.. if(
14f61 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 pA->pgno<pB->pg
14f62 6e 6f 20 29 7b 0d 0a 20 20 20 20 20 20 70 54 61 no ){.. pTa
14f63 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b il->pDirty = pA;
14f64 0d 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 .. pTail =
14f65 70 41 3b 0d 0a 20 20 20 20 20 20 70 41 20 3d 20 pA;.. pA =
14f66 70 41 2d 3e 70 44 69 72 74 79 3b 0d 0a 20 20 20 pA->pDirty;..
14f67 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 }else{.. p
14f68 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 Tail->pDirty = p
14f69 42 3b 0d 0a 20 20 20 20 20 20 70 54 61 69 6c 20 B;.. pTail
14f6a 3d 20 70 42 3b 0d 0a 20 20 20 20 20 20 70 42 20 = pB;.. pB
14f6b 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0d 0a 20 = pB->pDirty;..
14f6c 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 }.. }.. if(
14f6d 20 70 41 20 29 7b 0d 0a 20 20 20 20 70 54 61 69 pA ){.. pTai
14f6e 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0d l->pDirty = pA;.
14f6f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 . }else if( pB
14f70 29 7b 0d 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 ){.. pTail->p
14f71 44 69 72 74 79 20 3d 20 70 42 3b 0d 0a 20 20 7d Dirty = pB;.. }
14f72 65 6c 73 65 7b 0d 0a 20 20 20 20 70 54 61 69 6c else{.. pTail
14f73 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0d 0a 20 ->pDirty = 0;..
14f74 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 }.. return res
14f75 75 6c 74 2e 70 44 69 72 74 79 3b 0d 0a 7d 0d 0a ult.pDirty;..}..
14f76 0d 0a 2f 2a 0d 0a 2a 2a 20 53 6f 72 74 20 74 68 ../*..** Sort th
14f77 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 e list of pages
14f78 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 in accending ord
14f79 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 er by pgno. Pag
14f7a 65 73 20 61 72 65 0d 0a 2a 2a 20 63 6f 6e 6e 65 es are..** conne
14f7b 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70 cted by pDirty p
14f7c 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 44 ointers. The pD
14f7d 69 72 74 79 50 72 65 76 20 70 6f 69 6e 74 65 72 irtyPrev pointer
14f7e 73 20 61 72 65 0d 0a 2a 2a 20 63 6f 72 72 75 70 s are..** corrup
14f7f 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 ted by this sort
14f80 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 69 6e 63 65 20 ...**..** Since
14f81 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 there cannot be
14f82 6d 6f 72 65 20 74 68 61 6e 20 32 5e 33 31 20 64 more than 2^31 d
14f83 69 73 74 69 6e 63 74 20 70 61 67 65 73 20 69 6e istinct pages in
14f84 20 61 20 64 61 74 61 62 61 73 65 2c 0d 0a 2a 2a a database,..**
14f85 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65 there cannot be
14f86 20 6d 6f 72 65 20 74 68 61 6e 20 33 31 20 62 75 more than 31 bu
14f87 63 6b 65 74 73 20 72 65 71 75 69 72 65 64 20 62 ckets required b
14f88 79 20 74 68 65 20 6d 65 72 67 65 20 73 6f 72 74 y the merge sort
14f89 65 72 2e 0d 0a 2a 2a 20 4f 6e 65 20 65 78 74 72 er...** One extr
14f8a 61 20 62 75 63 6b 65 74 20 69 73 20 61 64 64 65 a bucket is adde
14f8b 64 20 74 6f 20 63 61 74 63 68 20 6f 76 65 72 66 d to catch overf
14f8c 6c 6f 77 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 low in case some
14f8d 74 68 69 6e 67 0d 0a 2a 2a 20 65 76 65 72 20 63 thing..** ever c
14f8e 68 61 6e 67 65 73 20 74 6f 20 6d 61 6b 65 20 74 hanges to make t
14f8f 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 he previous sent
14f90 65 6e 63 65 20 69 6e 63 6f 72 72 65 63 74 2e 0d ence incorrect..
14f91 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4e 5f 53 .*/..#define N_S
14f92 4f 52 54 5f 42 55 43 4b 45 54 20 20 33 32 0d 0a ORT_BUCKET 32..
14f93 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 63 static PgHdr *pc
14f94 61 63 68 65 53 6f 72 74 44 69 72 74 79 4c 69 73 acheSortDirtyLis
14f95 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0d 0a t(PgHdr *pIn){..
14f96 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 PgHdr *a[N_SOR
14f97 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0d 0a T_BUCKET], *p;..
14f98 20 20 69 6e 74 20 69 3b 0d 0a 20 20 6d 65 6d 73 int i;.. mems
14f99 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 et(a, 0, sizeof(
14f9a 61 29 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 a));.. while( p
14f9b 49 6e 20 29 7b 0d 0a 20 20 20 20 70 20 3d 20 70 In ){.. p = p
14f9c 49 6e 3b 0d 0a 20 20 20 20 70 49 6e 20 3d 20 70 In;.. pIn = p
14f9d 2d 3e 70 44 69 72 74 79 3b 0d 0a 20 20 20 20 70 ->pDirty;.. p
14f9e 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0d 0a 20 ->pDirty = 0;..
14f9f 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 for(i=0; ALWA
14fa0 59 53 28 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b YS(i<N_SORT_BUCK
14fa1 45 54 2d 31 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 ET-1); i++){..
14fa2 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 if( a[i]==0
14fa3 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 5b 69 5d ){.. a[i]
14fa4 20 3d 20 70 3b 0d 0a 20 20 20 20 20 20 20 20 62 = p;.. b
14fa5 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 65 6c reak;.. }el
14fa6 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 70 20 3d se{.. p =
14fa7 20 70 63 61 63 68 65 4d 65 72 67 65 44 69 72 74 pcacheMergeDirt
14fa8 79 4c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0d yList(a[i], p);.
14fa9 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 . a[i] =
14faa 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 0;.. }..
14fab 20 7d 0d 0a 20 20 20 20 69 66 28 20 4e 45 56 45 }.. if( NEVE
14fac 52 28 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b R(i==N_SORT_BUCK
14fad 45 54 2d 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 ET-1) ){..
14fae 2f 2a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 /* To get here,
14faf 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 there need to be
14fb0 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 2^(N_SORT_BUCKE
14fb1 54 29 20 65 6c 65 6d 65 6e 74 73 20 69 6e 0d 0a T) elements in..
14fb2 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 70 ** the inp
14fb3 75 74 20 6c 69 73 74 2e 20 20 42 75 74 20 74 68 ut list. But th
14fb4 61 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 at is impossible
14fb5 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 ... */..
14fb6 20 20 20 61 5b 69 5d 20 3d 20 70 63 61 63 68 65 a[i] = pcache
14fb7 4d 65 72 67 65 44 69 72 74 79 4c 69 73 74 28 61 MergeDirtyList(a
14fb8 5b 69 5d 2c 20 70 29 3b 0d 0a 20 20 20 20 7d 0d [i], p);.. }.
14fb9 0a 20 20 7d 0d 0a 20 20 70 20 3d 20 61 5b 30 5d . }.. p = a[0]
14fba 3b 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c ;.. for(i=1; i<
14fbb 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 N_SORT_BUCKET; i
14fbc 2b 2b 29 7b 0d 0a 20 20 20 20 70 20 3d 20 70 63 ++){.. p = pc
14fbd 61 63 68 65 4d 65 72 67 65 44 69 72 74 79 4c 69 acheMergeDirtyLi
14fbe 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0d 0a 20 20 st(p, a[i]);..
14fbf 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a }.. return p;..
14fc0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 }..../*..** Retu
14fc1 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c rn a list of all
14fc2 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 dirty pages in
14fc3 74 68 65 20 63 61 63 68 65 2c 20 73 6f 72 74 65 the cache, sorte
14fc4 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 d by page number
14fc5 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
14fc6 49 56 41 54 45 20 50 67 48 64 72 20 2a 73 71 6c IVATE PgHdr *sql
14fc7 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c ite3PcacheDirtyL
14fc8 69 73 74 28 50 43 61 63 68 65 20 2a 70 43 61 63 ist(PCache *pCac
14fc9 68 65 29 7b 0d 0a 20 20 50 67 48 64 72 20 2a 70 he){.. PgHdr *p
14fca 3b 0d 0a 20 20 66 6f 72 28 70 3d 70 43 61 63 68 ;.. for(p=pCach
14fcb 65 2d 3e 70 44 69 72 74 79 3b 20 70 3b 20 70 3d e->pDirty; p; p=
14fcc 70 2d 3e 70 44 69 72 74 79 4e 65 78 74 29 7b 0d p->pDirtyNext){.
14fcd 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d . p->pDirty =
14fce 20 70 2d 3e 70 44 69 72 74 79 4e 65 78 74 3b 0d p->pDirtyNext;.
14fcf 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 . }.. return p
14fd0 63 61 63 68 65 53 6f 72 74 44 69 72 74 79 4c 69 cacheSortDirtyLi
14fd1 73 74 28 70 43 61 63 68 65 2d 3e 70 44 69 72 74 st(pCache->pDirt
14fd2 79 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d 0a 2a y);..}..../* ..*
14fd3 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 * Return the tot
14fd4 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 al number of ref
14fd5 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 68 65 erenced pages he
14fd6 6c 64 20 62 79 20 74 68 65 20 63 61 63 68 65 2e ld by the cache.
14fd7 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
14fd8 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
14fd9 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 50 PcacheRefCount(P
14fda 43 61 63 68 65 20 2a 70 43 61 63 68 65 29 7b 0d Cache *pCache){.
14fdb 0a 20 20 72 65 74 75 72 6e 20 70 43 61 63 68 65 . return pCache
14fdc 2d 3e 6e 52 65 66 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ->nRef;..}..../*
14fdd 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
14fde 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 number of refere
14fdf 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 nces to the page
14fe0 20 73 75 70 70 6c 69 65 64 20 61 73 20 61 6e 20 supplied as an
14fe1 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 53 argument...*/..S
14fe2 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
14fe3 74 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 t sqlite3PcacheP
14fe4 61 67 65 52 65 66 63 6f 75 6e 74 28 50 67 48 64 ageRefcount(PgHd
14fe5 72 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e r *p){.. return
14fe6 20 70 2d 3e 6e 52 65 66 3b 0d 0a 7d 0d 0a 0d 0a p->nRef;..}....
14fe7 2f 2a 20 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 /* ..** Return t
14fe8 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 he total number
14fe9 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 of pages in the
14fea 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 cache...*/..SQLI
14feb 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
14fec 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 qlite3PcachePage
14fed 63 6f 75 6e 74 28 50 43 61 63 68 65 20 2a 70 43 count(PCache *pC
14fee 61 63 68 65 29 7b 0d 0a 20 20 69 6e 74 20 6e 50 ache){.. int nP
14fef 61 67 65 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 age = 0;.. if(
14ff0 70 43 61 63 68 65 2d 3e 70 43 61 63 68 65 20 29 pCache->pCache )
14ff1 7b 0d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 73 {.. nPage = s
14ff2 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
14ff3 69 67 2e 70 63 61 63 68 65 32 2e 78 50 61 67 65 ig.pcache2.xPage
14ff4 63 6f 75 6e 74 28 70 43 61 63 68 65 2d 3e 70 43 count(pCache->pC
14ff5 61 63 68 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 ache);.. }.. r
14ff6 65 74 75 72 6e 20 6e 50 61 67 65 3b 0d 0a 7d 0d eturn nPage;..}.
14ff7 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
14ff8 5f 54 45 53 54 0d 0a 2f 2a 0d 0a 2a 2a 20 47 65 _TEST../*..** Ge
14ff9 74 20 74 68 65 20 73 75 67 67 65 73 74 65 64 20 t the suggested
14ffa 63 61 63 68 65 2d 73 69 7a 65 20 76 61 6c 75 65 cache-size value
14ffb 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
14ffc 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
14ffd 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 3PcacheGetCaches
14ffe 69 7a 65 28 50 43 61 63 68 65 20 2a 70 43 61 63 ize(PCache *pCac
14fff 68 65 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 6e he){.. return n
15000 75 6d 62 65 72 4f 66 43 61 63 68 65 50 61 67 65 umberOfCachePage
15001 73 28 70 43 61 63 68 65 29 3b 0d 0a 7d 0d 0a 23 s(pCache);..}..#
15002 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
15003 53 65 74 20 74 68 65 20 73 75 67 67 65 73 74 65 Set the suggeste
15004 64 20 63 61 63 68 65 2d 73 69 7a 65 20 76 61 6c d cache-size val
15005 75 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ue...*/..SQLITE_
15006 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
15007 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 ite3PcacheSetCac
15008 68 65 73 69 7a 65 28 50 43 61 63 68 65 20 2a 70 hesize(PCache *p
15009 43 61 63 68 65 2c 20 69 6e 74 20 6d 78 50 61 67 Cache, int mxPag
1500a 65 29 7b 0d 0a 20 20 70 43 61 63 68 65 2d 3e 73 e){.. pCache->s
1500b 7a 43 61 63 68 65 20 3d 20 6d 78 50 61 67 65 3b zCache = mxPage;
1500c 0d 0a 20 20 69 66 28 20 70 43 61 63 68 65 2d 3e .. if( pCache->
1500d 70 43 61 63 68 65 20 29 7b 0d 0a 20 20 20 20 73 pCache ){.. s
1500e 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
1500f 69 67 2e 70 63 61 63 68 65 32 2e 78 43 61 63 68 ig.pcache2.xCach
15010 65 73 69 7a 65 28 70 43 61 63 68 65 2d 3e 70 43 esize(pCache->pC
15011 61 63 68 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 ache,..
15012 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15013 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15014 20 20 6e 75 6d 62 65 72 4f 66 43 61 63 68 65 50 numberOfCacheP
15015 61 67 65 73 28 70 43 61 63 68 65 29 29 3b 0d 0a ages(pCache));..
15016 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
15017 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 Free up as much
15018 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 memory as possi
15019 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 ble from the pag
1501a 65 20 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 51 e cache...*/..SQ
1501b 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
1501c 64 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 d sqlite3PcacheS
1501d 68 72 69 6e 6b 28 50 43 61 63 68 65 20 2a 70 43 hrink(PCache *pC
1501e 61 63 68 65 29 7b 0d 0a 20 20 69 66 28 20 70 43 ache){.. if( pC
1501f 61 63 68 65 2d 3e 70 43 61 63 68 65 20 29 7b 0d ache->pCache ){.
15020 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 . sqlite3Glob
15021 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 alConfig.pcache2
15022 2e 78 53 68 72 69 6e 6b 28 70 43 61 63 68 65 2d .xShrink(pCache-
15023 3e 70 43 61 63 68 65 29 3b 0d 0a 20 20 7d 0d 0a >pCache);.. }..
15024 7d 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 }....#if defined
15025 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 (SQLITE_CHECK_PA
15026 47 45 53 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 GES) || defined(
15027 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0d 0a 2f SQLITE_DEBUG)../
15028 2a 0d 0a 2a 2a 20 46 6f 72 20 61 6c 6c 20 64 69 *..** For all di
15029 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e rty pages curren
1502a 74 6c 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 tly in the cache
1502b 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 70 65 , invoke the spe
1502c 63 69 66 69 65 64 0d 0a 2a 2a 20 63 61 6c 6c 62 cified..** callb
1502d 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c ack. This is onl
1502e 79 20 75 73 65 64 20 69 66 20 74 68 65 20 53 51 y used if the SQ
1502f 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 LITE_CHECK_PAGES
15030 20 6d 61 63 72 6f 20 69 73 0d 0a 2a 2a 20 64 65 macro is..** de
15031 66 69 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 fined...*/..SQLI
15032 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
15033 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 sqlite3PcacheIte
15034 72 61 74 65 44 69 72 74 79 28 50 43 61 63 68 65 rateDirty(PCache
15035 20 2a 70 43 61 63 68 65 2c 20 76 6f 69 64 20 28 *pCache, void (
15036 2a 78 49 74 65 72 29 28 50 67 48 64 72 20 2a 29 *xIter)(PgHdr *)
15037 29 7b 0d 0a 20 20 50 67 48 64 72 20 2a 70 44 69 ){.. PgHdr *pDi
15038 72 74 79 3b 0d 0a 20 20 66 6f 72 28 70 44 69 72 rty;.. for(pDir
15039 74 79 3d 70 43 61 63 68 65 2d 3e 70 44 69 72 74 ty=pCache->pDirt
1503a 79 3b 20 70 44 69 72 74 79 3b 20 70 44 69 72 74 y; pDirty; pDirt
1503b 79 3d 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79 y=pDirty->pDirty
1503c 4e 65 78 74 29 7b 0d 0a 20 20 20 20 78 49 74 65 Next){.. xIte
1503d 72 28 70 44 69 72 74 79 29 3b 0d 0a 20 20 7d 0d r(pDirty);.. }.
1503e 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a .}..#endif..../*
1503f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
15040 64 20 6f 66 20 70 63 61 63 68 65 2e 63 20 2a 2a d of pcache.c **
15041 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15042 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15043 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
15044 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 ************** B
15045 65 67 69 6e 20 66 69 6c 65 20 70 63 61 63 68 65 egin file pcache
15046 31 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 1.c ************
15047 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15048 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
15049 2f 2a 0d 0a 2a 2a 20 32 30 30 38 20 4e 6f 76 65 /*..** 2008 Nove
1504a 6d 62 65 72 20 30 35 0d 0a 2a 2a 0d 0a 2a 2a 20 mber 05..**..**
1504b 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c The author discl
1504c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 aims copyright t
1504d 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f o this source co
1504e 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 de. In place of
1504f 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 ..** a legal not
15050 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 ice, here is a b
15051 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a lessing:..**..**
15052 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 May you do g
15053 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c ood and not evil
15054 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 ...** May you
15055 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 find forgivenes
15056 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 s for yourself a
15057 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 nd forgive other
15058 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f s...** May yo
15059 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 u share freely,
1505a 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 never taking mor
1505b 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e e than you give.
1505c 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**..**********
1505d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1505e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1505f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d ***************.
15061 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c .**..** This fil
15062 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 e implements the
15063 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 63 61 default page ca
15064 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 che implementati
15065 6f 6e 20 28 74 68 65 0d 0a 2a 2a 20 73 71 6c 69 on (the..** sqli
15066 74 65 33 5f 70 63 61 63 68 65 20 69 6e 74 65 72 te3_pcache inter
15067 66 61 63 65 29 2e 20 49 74 20 61 6c 73 6f 20 63 face). It also c
15068 6f 6e 74 61 69 6e 73 20 70 61 72 74 20 6f 66 20 ontains part of
15069 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 the implementati
1506a 6f 6e 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 on..** of the SQ
1506b 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 LITE_CONFIG_PAGE
1506c 43 41 43 48 45 20 61 6e 64 20 73 71 6c 69 74 65 CACHE and sqlite
1506d 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 3_release_memory
1506e 28 29 20 66 65 61 74 75 72 65 73 2e 0d 0a 2a 2a () features...**
1506f 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 If the default
15070 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 page cache imple
15071 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6f 76 65 mentation is ove
15072 72 72 69 64 65 6e 2c 20 74 68 65 6e 20 6e 65 69 rriden, then nei
15073 74 68 65 72 20 6f 66 0d 0a 2a 2a 20 74 68 65 73 ther of..** thes
15074 65 20 74 77 6f 20 66 65 61 74 75 72 65 73 20 61 e two features a
15075 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 2a re available...*
15076 2f 0d 0a 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 /......typedef s
15077 74 72 75 63 74 20 50 43 61 63 68 65 31 20 50 43 truct PCache1 PC
15078 61 63 68 65 31 3b 0d 0a 74 79 70 65 64 65 66 20 ache1;..typedef
15079 73 74 72 75 63 74 20 50 67 48 64 72 31 20 50 67 struct PgHdr1 Pg
1507a 48 64 72 31 3b 0d 0a 74 79 70 65 64 65 66 20 73 Hdr1;..typedef s
1507b 74 72 75 63 74 20 50 67 46 72 65 65 73 6c 6f 74 truct PgFreeslot
1507c 20 50 67 46 72 65 65 73 6c 6f 74 3b 0d 0a 74 79 PgFreeslot;..ty
1507d 70 65 64 65 66 20 73 74 72 75 63 74 20 50 47 72 pedef struct PGr
1507e 6f 75 70 20 50 47 72 6f 75 70 3b 0d 0a 0d 0a 2f oup PGroup;..../
1507f 2a 20 45 61 63 68 20 70 61 67 65 20 63 61 63 68 * Each page cach
15080 65 20 28 6f 72 20 50 43 61 63 68 65 29 20 62 65 e (or PCache) be
15081 6c 6f 6e 67 73 20 74 6f 20 61 20 50 47 72 6f 75 longs to a PGrou
15082 70 2e 20 20 41 20 50 47 72 6f 75 70 20 69 73 20 p. A PGroup is
15083 61 20 73 65 74 20 0d 0a 2a 2a 20 6f 66 20 6f 6e a set ..** of on
15084 65 20 6f 72 20 6d 6f 72 65 20 50 43 61 63 68 65 e or more PCache
15085 73 20 74 68 61 74 20 61 72 65 20 61 62 6c 65 20 s that are able
15086 74 6f 20 72 65 63 79 63 6c 65 20 65 61 63 68 20 to recycle each
15087 6f 74 68 65 72 73 20 75 6e 70 69 6e 6e 65 64 0d others unpinned.
15088 0a 2a 2a 20 70 61 67 65 73 20 77 68 65 6e 20 74 .** pages when t
15089 68 65 79 20 61 72 65 20 75 6e 64 65 72 20 6d 65 hey are under me
1508a 6d 6f 72 79 20 70 72 65 73 73 75 72 65 2e 20 20 mory pressure.
1508b 41 20 50 47 72 6f 75 70 20 69 73 20 61 6e 20 69 A PGroup is an i
1508c 6e 73 74 61 6e 63 65 20 6f 66 0d 0a 2a 2a 20 74 nstance of..** t
1508d 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a he following obj
1508e 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ect...**..** Thi
1508f 73 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 s page cache imp
15090 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b lementation work
15091 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 77 6f 20 s in one of two
15092 6d 6f 64 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 modes:..**..**
15093 20 28 31 29 20 20 45 76 65 72 79 20 50 43 61 63 (1) Every PCac
15094 68 65 20 69 73 20 74 68 65 20 73 6f 6c 65 20 6d he is the sole m
15095 65 6d 62 65 72 20 6f 66 20 69 74 73 20 6f 77 6e ember of its own
15096 20 50 47 72 6f 75 70 2e 20 20 54 68 65 72 65 20 PGroup. There
15097 69 73 0d 0a 2a 2a 20 20 20 20 20 20 20 20 6f 6e is..** on
15098 65 20 50 47 72 6f 75 70 20 70 65 72 20 50 43 61 e PGroup per PCa
15099 63 68 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 che...**..** (
1509a 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 73 2) There is a s
1509b 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 20 50 47 72 ingle global PGr
1509c 6f 75 70 20 74 68 61 74 20 61 6c 6c 20 50 43 61 oup that all PCa
1509d 63 68 65 73 20 61 72 65 20 61 20 6d 65 6d 62 65 ches are a membe
1509e 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 2e r..** of.
1509f 0d 0a 2a 2a 0d 0a 2a 2a 20 4d 6f 64 65 20 31 20 ..**..** Mode 1
150a0 75 73 65 73 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 uses more memory
150a1 20 28 73 69 6e 63 65 20 50 43 61 63 68 65 20 69 (since PCache i
150a2 6e 73 74 61 6e 63 65 73 20 61 72 65 20 6e 6f 74 nstances are not
150a3 20 61 62 6c 65 20 74 6f 20 72 6f 62 0d 0a 2a 2a able to rob..**
150a4 20 75 6e 75 73 65 64 20 70 61 67 65 73 20 66 72 unused pages fr
150a5 6f 6d 20 6f 74 68 65 72 20 50 43 61 63 68 65 73 om other PCaches
150a6 29 20 62 75 74 20 69 74 20 61 6c 73 6f 20 6f 70 ) but it also op
150a7 65 72 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 erates without a
150a8 20 6d 75 74 65 78 2c 0d 0a 2a 2a 20 61 6e 64 20 mutex,..** and
150a9 69 73 20 74 68 65 72 65 66 6f 72 65 20 6f 66 74 is therefore oft
150aa 65 6e 20 66 61 73 74 65 72 2e 20 20 4d 6f 64 65 en faster. Mode
150ab 20 32 20 72 65 71 75 69 72 65 73 20 61 20 6d 75 2 requires a mu
150ac 74 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 tex in order to
150ad 62 65 0d 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 be..** threadsaf
150ae 65 2c 20 62 75 74 20 72 65 63 79 63 6c 65 73 20 e, but recycles
150af 70 61 67 65 73 20 6d 6f 72 65 20 65 66 66 69 63 pages more effic
150b0 69 65 6e 74 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 iently...**..**
150b1 46 6f 72 20 6d 6f 64 65 20 28 31 29 2c 20 50 47 For mode (1), PG
150b2 72 6f 75 70 2e 6d 75 74 65 78 20 69 73 20 4e 55 roup.mutex is NU
150b3 4c 4c 2e 20 20 46 6f 72 20 6d 6f 64 65 20 28 32 LL. For mode (2
150b4 29 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 ) there is only
150b5 61 20 73 69 6e 67 6c 65 0d 0a 2a 2a 20 50 47 72 a single..** PGr
150b6 6f 75 70 20 77 68 69 63 68 20 69 73 20 74 68 65 oup which is the
150b7 20 70 63 61 63 68 65 31 2e 67 72 70 20 67 6c 6f pcache1.grp glo
150b8 62 61 6c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 bal variable and
150b9 20 69 74 73 20 6d 75 74 65 78 20 69 73 0d 0a 2a its mutex is..*
150ba 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 * SQLITE_MUTEX_S
150bb 54 41 54 49 43 5f 4c 52 55 2e 0d 0a 2a 2f 0d 0a TATIC_LRU...*/..
150bc 73 74 72 75 63 74 20 50 47 72 6f 75 70 20 7b 0d struct PGroup {.
150bd 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
150be 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 *mutex;
150bf 20 20 2f 2a 20 4d 55 54 45 58 5f 53 54 41 54 49 /* MUTEX_STATI
150c0 43 5f 4c 52 55 20 6f 72 20 4e 55 4c 4c 20 2a 2f C_LRU or NULL */
150c1 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 .. unsigned int
150c2 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20 nMaxPage;
150c3 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 6e 4d 61 /* Sum of nMa
150c4 78 20 66 6f 72 20 70 75 72 67 65 61 62 6c 65 20 x for purgeable
150c5 63 61 63 68 65 73 20 2a 2f 0d 0a 20 20 75 6e 73 caches */.. uns
150c6 69 67 6e 65 64 20 69 6e 74 20 6e 4d 69 6e 50 61 igned int nMinPa
150c7 67 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 ge; /* S
150c8 75 6d 20 6f 66 20 6e 4d 69 6e 20 66 6f 72 20 70 um of nMin for p
150c9 75 72 67 65 61 62 6c 65 20 63 61 63 68 65 73 20 urgeable caches
150ca 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 */.. unsigned i
150cb 6e 74 20 6d 78 50 69 6e 6e 65 64 3b 20 20 20 20 nt mxPinned;
150cc 20 20 20 20 20 2f 2a 20 6e 4d 61 78 70 61 67 65 /* nMaxpage
150cd 20 2b 20 31 30 20 2d 20 6e 4d 69 6e 50 61 67 65 + 10 - nMinPage
150ce 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 */.. unsigned
150cf 69 6e 74 20 6e 43 75 72 72 65 6e 74 50 61 67 65 int nCurrentPage
150d0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 ; /* Number
150d1 6f 66 20 70 75 72 67 65 61 62 6c 65 20 70 61 67 of purgeable pag
150d2 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0d es allocated */.
150d3 0a 20 20 50 67 48 64 72 31 20 2a 70 4c 72 75 48 . PgHdr1 *pLruH
150d4 65 61 64 2c 20 2a 70 4c 72 75 54 61 69 6c 3b 20 ead, *pLruTail;
150d5 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f 66 /* LRU list of
150d6 20 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 20 unpinned pages
150d7 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 45 61 63 */..};..../* Eac
150d8 68 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 h page cache is
150d9 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 an instance of t
150da 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a he following obj
150db 65 63 74 2e 20 20 45 76 65 72 79 0d 0a 2a 2a 20 ect. Every..**
150dc 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 open database fi
150dd 6c 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 65 61 le (including ea
150de 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 ch in-memory dat
150df 61 62 61 73 65 20 61 6e 64 20 65 61 63 68 0d 0a abase and each..
150e0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 ** temporary or
150e1 74 72 61 6e 73 69 65 6e 74 20 64 61 74 61 62 61 transient databa
150e2 73 65 29 20 68 61 73 20 61 20 73 69 6e 67 6c 65 se) has a single
150e3 20 70 61 67 65 20 63 61 63 68 65 20 77 68 69 63 page cache whic
150e4 68 0d 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 73 74 h..** is an inst
150e5 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a ance of this obj
150e6 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 6f 69 ect...**..** Poi
150e7 6e 74 65 72 73 20 74 6f 20 73 74 72 75 63 74 75 nters to structu
150e8 72 65 73 20 6f 66 20 74 68 69 73 20 74 79 70 65 res of this type
150e9 20 61 72 65 20 63 61 73 74 20 61 6e 64 20 72 65 are cast and re
150ea 74 75 72 6e 65 64 20 61 73 20 0d 0a 2a 2a 20 6f turned as ..** o
150eb 70 61 71 75 65 20 73 71 6c 69 74 65 33 5f 70 63 paque sqlite3_pc
150ec 61 63 68 65 2a 20 68 61 6e 64 6c 65 73 2e 0d 0a ache* handles...
150ed 2a 2f 0d 0a 73 74 72 75 63 74 20 50 43 61 63 68 */..struct PCach
150ee 65 31 20 7b 0d 0a 20 20 2f 2a 20 43 61 63 68 65 e1 {.. /* Cache
150ef 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 configuration p
150f0 61 72 61 6d 65 74 65 72 73 2e 20 50 61 67 65 20 arameters. Page
150f1 73 69 7a 65 20 28 73 7a 50 61 67 65 29 20 61 6e size (szPage) an
150f2 64 20 74 68 65 20 70 75 72 67 65 61 62 6c 65 0d d the purgeable.
150f3 0a 20 20 2a 2a 20 66 6c 61 67 20 28 62 50 75 72 . ** flag (bPur
150f4 67 65 61 62 6c 65 29 20 61 72 65 20 73 65 74 20 geable) are set
150f5 77 68 65 6e 20 74 68 65 20 63 61 63 68 65 20 69 when the cache i
150f6 73 20 63 72 65 61 74 65 64 2e 20 6e 4d 61 78 20 s created. nMax
150f7 6d 61 79 20 62 65 20 0d 0a 20 20 2a 2a 20 6d 6f may be .. ** mo
150f8 64 69 66 69 65 64 20 61 74 20 61 6e 79 20 74 69 dified at any ti
150f9 6d 65 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 me by a call to
150fa 74 68 65 20 70 63 61 63 68 65 31 43 61 63 68 65 the pcache1Cache
150fb 73 69 7a 65 28 29 20 6d 65 74 68 6f 64 2e 0d 0a size() method...
150fc 20 20 2a 2a 20 54 68 65 20 50 47 72 6f 75 70 20 ** The PGroup
150fd 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 mutex must be he
150fe 6c 64 20 77 68 65 6e 20 61 63 63 65 73 73 69 6e ld when accessin
150ff 67 20 6e 4d 61 78 2e 0d 0a 20 20 2a 2f 0d 0a 20 g nMax... */..
15100 20 50 47 72 6f 75 70 20 2a 70 47 72 6f 75 70 3b PGroup *pGroup;
15101 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15102 20 20 20 20 20 2f 2a 20 50 47 72 6f 75 70 20 74 /* PGroup t
15103 68 69 73 20 63 61 63 68 65 20 62 65 6c 6f 6e 67 his cache belong
15104 73 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 s to */.. int s
15105 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 zPage;
15106 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15107 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 * Size of alloca
15108 74 65 64 20 70 61 67 65 73 20 69 6e 20 62 79 74 ted pages in byt
15109 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 45 es */.. int szE
1510a 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 xtra;
1510b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1510c 53 69 7a 65 20 6f 66 20 65 78 74 72 61 20 73 70 Size of extra sp
1510d 61 63 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d ace in bytes */.
1510e 0a 20 20 69 6e 74 20 62 50 75 72 67 65 61 62 6c . int bPurgeabl
1510f 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
15110 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
15111 66 20 63 61 63 68 65 20 69 73 20 70 75 72 67 65 f cache is purge
15112 61 62 6c 65 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 able */.. unsig
15113 6e 65 64 20 69 6e 74 20 6e 4d 69 6e 3b 20 20 20 ned int nMin;
15114 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15115 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 * Minimum number
15116 20 6f 66 20 70 61 67 65 73 20 72 65 73 65 72 76 of pages reserv
15117 65 64 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 ed */.. unsigne
15118 64 20 69 6e 74 20 6e 4d 61 78 3b 20 20 20 20 20 d int nMax;
15119 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1511a 43 6f 6e 66 69 67 75 72 65 64 20 22 63 61 63 68 Configured "cach
1511b 65 5f 73 69 7a 65 22 20 76 61 6c 75 65 20 2a 2f e_size" value */
1511c 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 .. unsigned int
1511d 20 6e 39 30 70 63 74 3b 20 20 20 20 20 20 20 20 n90pct;
1511e 20 20 20 20 20 20 20 20 2f 2a 20 6e 4d 61 78 2a /* nMax*
1511f 39 2f 31 30 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 9/10 */.... /*
15120 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 61 6c Hash table of al
15121 6c 20 70 61 67 65 73 2e 20 54 68 65 20 66 6f 6c l pages. The fol
15122 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 lowing variables
15123 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 61 63 63 may only be acc
15124 65 73 73 65 64 0d 0a 20 20 2a 2a 20 77 68 65 6e essed.. ** when
15125 20 74 68 65 20 61 63 63 65 73 73 6f 72 20 69 73 the accessor is
15126 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 50 47 72 holding the PGr
15127 6f 75 70 20 6d 75 74 65 78 2e 0d 0a 20 20 2a 2f oup mutex... */
15128 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 .. unsigned int
15129 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 20 20 20 nRecyclable;
1512a 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1512b 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 r of pages in th
1512c 65 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0d 0a 20 e LRU list */..
1512d 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 50 unsigned int nP
1512e 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 age;
1512f 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 /* Total nu
15130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e mber of pages in
15131 20 61 70 48 61 73 68 20 2a 2f 0d 0a 20 20 75 6e apHash */.. un
15132 73 69 67 6e 65 64 20 69 6e 74 20 6e 48 61 73 68 signed int nHash
15133 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
15134 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 /* Number of s
15135 6c 6f 74 73 20 69 6e 20 61 70 48 61 73 68 5b 5d lots in apHash[]
15136 20 2a 2f 0d 0a 20 20 50 67 48 64 72 31 20 2a 2a */.. PgHdr1 **
15137 61 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 apHash;
15138 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 /* Ha
15139 73 68 20 74 61 62 6c 65 20 66 6f 72 20 66 61 73 sh table for fas
1513a 74 20 6c 6f 6f 6b 75 70 20 62 79 20 6b 65 79 20 t lookup by key
1513b 2a 2f 0d 0a 0d 0a 20 20 75 6e 73 69 67 6e 65 64 */.... unsigned
1513c 20 69 6e 74 20 69 4d 61 78 4b 65 79 3b 20 20 20 int iMaxKey;
1513d 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
1513e 61 72 67 65 73 74 20 6b 65 79 20 73 65 65 6e 20 argest key seen
1513f 73 69 6e 63 65 20 78 54 72 75 6e 63 61 74 65 28 since xTruncate(
15140 29 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a ) */..};..../*..
15141 2a 2a 20 45 61 63 68 20 63 61 63 68 65 20 65 6e ** Each cache en
15142 74 72 79 20 69 73 20 72 65 70 72 65 73 65 6e 74 try is represent
15143 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 ed by an instanc
15144 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
15145 6e 67 20 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 ng ..** structur
15146 65 2e 20 55 6e 6c 65 73 73 20 53 51 4c 49 54 45 e. Unless SQLITE
15147 5f 50 43 41 43 48 45 5f 53 45 50 41 52 41 54 45 _PCACHE_SEPARATE
15148 5f 48 45 41 44 45 52 20 69 73 20 64 65 66 69 6e _HEADER is defin
15149 65 64 2c 20 61 20 62 75 66 66 65 72 20 6f 66 0d ed, a buffer of.
1514a 0a 2a 2a 20 50 67 48 64 72 31 2e 70 43 61 63 68 .** PgHdr1.pCach
1514b 65 2d 3e 73 7a 50 61 67 65 20 62 79 74 65 73 20 e->szPage bytes
1514c 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 72 is allocated dir
1514d 65 63 74 6c 79 20 62 65 66 6f 72 65 20 74 68 69 ectly before thi
1514e 73 20 73 74 72 75 63 74 75 72 65 20 0d 0a 2a 2a s structure ..**
1514f 20 69 6e 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d in memory...*/.
15150 0a 73 74 72 75 63 74 20 50 67 48 64 72 31 20 7b .struct PgHdr1 {
15151 0d 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 .. sqlite3_pcac
15152 68 65 5f 70 61 67 65 20 70 61 67 65 3b 0d 0a 20 he_page page;..
15153 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4b unsigned int iK
15154 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ey;
15155 2f 2a 20 4b 65 79 20 76 61 6c 75 65 20 28 70 61 /* Key value (pa
15156 67 65 20 6e 75 6d 62 65 72 29 20 2a 2f 0d 0a 20 ge number) */..
15157 20 50 67 48 64 72 31 20 2a 70 4e 65 78 74 3b 20 PgHdr1 *pNext;
15158 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15159 2f 2a 20 4e 65 78 74 20 69 6e 20 68 61 73 68 20 /* Next in hash
1515a 74 61 62 6c 65 20 63 68 61 69 6e 20 2a 2f 0d 0a table chain */..
1515b 20 20 50 43 61 63 68 65 31 20 2a 70 43 61 63 68 PCache1 *pCach
1515c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1515d 20 2f 2a 20 43 61 63 68 65 20 74 68 61 74 20 63 /* Cache that c
1515e 75 72 72 65 6e 74 6c 79 20 6f 77 6e 73 20 74 68 urrently owns th
1515f 69 73 20 70 61 67 65 20 2a 2f 0d 0a 20 20 50 67 is page */.. Pg
15160 48 64 72 31 20 2a 70 4c 72 75 4e 65 78 74 3b 20 Hdr1 *pLruNext;
15161 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
15162 4e 65 78 74 20 69 6e 20 4c 52 55 20 6c 69 73 74 Next in LRU list
15163 20 6f 66 20 75 6e 70 69 6e 6e 65 64 20 70 61 67 of unpinned pag
15164 65 73 20 2a 2f 0d 0a 20 20 50 67 48 64 72 31 20 es */.. PgHdr1
15165 2a 70 4c 72 75 50 72 65 76 3b 20 20 20 20 20 20 *pLruPrev;
15166 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 /* Previ
15167 6f 75 73 20 69 6e 20 4c 52 55 20 6c 69 73 74 20 ous in LRU list
15168 6f 66 20 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 of unpinned page
15169 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a s */..};..../*..
1516a 2a 2a 20 46 72 65 65 20 73 6c 6f 74 73 20 69 6e ** Free slots in
1516b 20 74 68 65 20 61 6c 6c 6f 63 61 74 6f 72 20 75 the allocator u
1516c 73 65 64 20 74 6f 20 64 69 76 69 64 65 20 75 70 sed to divide up
1516d 20 74 68 65 20 62 75 66 66 65 72 20 70 72 6f 76 the buffer prov
1516e 69 64 65 64 20 75 73 69 6e 67 0d 0a 2a 2a 20 74 ided using..** t
1516f 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 he SQLITE_CONFIG
15170 5f 50 41 47 45 43 41 43 48 45 20 6d 65 63 68 61 _PAGECACHE mecha
15171 6e 69 73 6d 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 nism...*/..struc
15172 74 20 50 67 46 72 65 65 73 6c 6f 74 20 7b 0d 0a t PgFreeslot {..
15173 20 20 50 67 46 72 65 65 73 6c 6f 74 20 2a 70 4e PgFreeslot *pN
15174 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 66 72 ext; /* Next fr
15175 65 65 20 73 6c 6f 74 20 2a 2f 0d 0a 7d 3b 0d 0a ee slot */..};..
15176 0d 0a 2f 2a 0d 0a 2a 2a 20 47 6c 6f 62 61 6c 20 ../*..** Global
15177 64 61 74 61 20 75 73 65 64 20 62 79 20 74 68 69 data used by thi
15178 73 20 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 73 74 s cache...*/..st
15179 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 atic SQLITE_WSD
1517a 73 74 72 75 63 74 20 50 43 61 63 68 65 47 6c 6f struct PCacheGlo
1517b 62 61 6c 20 7b 0d 0a 20 20 50 47 72 6f 75 70 20 bal {.. PGroup
1517c 67 72 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 grp;
1517d 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 /* The g
1517e 6c 6f 62 61 6c 20 50 47 72 6f 75 70 20 66 6f 72 lobal PGroup for
1517f 20 6d 6f 64 65 20 28 32 29 20 2a 2f 0d 0a 0d 0a mode (2) */....
15180 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 72 /* Variables r
15181 65 6c 61 74 65 64 20 74 6f 20 53 51 4c 49 54 45 elated to SQLITE
15182 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 _CONFIG_PAGECACH
15183 45 20 73 65 74 74 69 6e 67 73 2e 20 20 54 68 65 E settings. The
15184 0d 0a 20 20 2a 2a 20 73 7a 53 6c 6f 74 2c 20 6e .. ** szSlot, n
15185 53 6c 6f 74 2c 20 70 53 74 61 72 74 2c 20 70 45 Slot, pStart, pE
15186 6e 64 2c 20 6e 52 65 73 65 72 76 65 2c 20 61 6e nd, nReserve, an
15187 64 20 69 73 49 6e 69 74 20 76 61 6c 75 65 73 20 d isInit values
15188 61 72 65 20 61 6c 6c 0d 0a 20 20 2a 2a 20 66 69 are all.. ** fi
15189 78 65 64 20 61 74 20 73 71 6c 69 74 65 33 5f 69 xed at sqlite3_i
1518a 6e 69 74 69 61 6c 69 7a 65 28 29 20 74 69 6d 65 nitialize() time
1518b 20 61 6e 64 20 64 6f 20 6e 6f 74 20 72 65 71 75 and do not requ
1518c 69 72 65 20 6d 75 74 65 78 20 70 72 6f 74 65 63 ire mutex protec
1518d 74 69 6f 6e 2e 0d 0a 20 20 2a 2a 20 54 68 65 20 tion... ** The
1518e 6e 46 72 65 65 53 6c 6f 74 20 61 6e 64 20 70 46 nFreeSlot and pF
1518f 72 65 65 20 76 61 6c 75 65 73 20 64 6f 20 72 65 ree values do re
15190 71 75 69 72 65 20 6d 75 74 65 78 20 70 72 6f 74 quire mutex prot
15191 65 63 74 69 6f 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 ection... */..
15192 20 69 6e 74 20 69 73 49 6e 69 74 3b 20 20 20 20 int isInit;
15193 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15194 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 69 74 69 /* True if initi
15195 61 6c 69 7a 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 alized */.. int
15196 20 73 7a 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 szSlot;
15197 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
15198 69 7a 65 20 6f 66 20 65 61 63 68 20 66 72 65 65 ize of each free
15199 20 73 6c 6f 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 slot */.. int
1519a 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 nSlot;
1519b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1519c 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 63 61 63 e number of pcac
1519d 68 65 20 73 6c 6f 74 73 20 2a 2f 0d 0a 20 20 69 he slots */.. i
1519e 6e 74 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 nt nReserve;
1519f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
151a0 20 54 72 79 20 74 6f 20 6b 65 65 70 20 6e 46 72 Try to keep nFr
151a1 65 65 53 6c 6f 74 20 61 62 6f 76 65 20 74 68 69 eeSlot above thi
151a2 73 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 53 s */.. void *pS
151a3 74 61 72 74 2c 20 2a 70 45 6e 64 3b 20 20 20 20 tart, *pEnd;
151a4 20 20 20 20 20 20 20 2f 2a 20 42 6f 75 6e 64 73 /* Bounds
151a5 20 6f 66 20 70 61 67 65 63 61 63 68 65 20 6d 61 of pagecache ma
151a6 6c 6c 6f 63 20 72 61 6e 67 65 20 2a 2f 0d 0a 20 lloc range */..
151a7 20 2f 2a 20 41 62 6f 76 65 20 72 65 71 75 69 72 /* Above requir
151a8 65 73 20 6e 6f 20 6d 75 74 65 78 2e 20 20 55 73 es no mutex. Us
151a9 65 20 6d 75 74 65 78 20 62 65 6c 6f 77 20 66 6f e mutex below fo
151aa 72 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 r variable that
151ab 66 6f 6c 6c 6f 77 2e 20 2a 2f 0d 0a 20 20 73 71 follow. */.. sq
151ac 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 lite3_mutex *mut
151ad 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ex; /*
151ae 4d 75 74 65 78 20 66 6f 72 20 61 63 63 65 73 73 Mutex for access
151af 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e ing the followin
151b0 67 3a 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 46 72 g: */.. int nFr
151b1 65 65 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 eeSlot;
151b2 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
151b3 72 20 6f 66 20 75 6e 75 73 65 64 20 70 63 61 63 r of unused pcac
151b4 68 65 20 73 6c 6f 74 73 20 2a 2f 0d 0a 20 20 50 he slots */.. P
151b5 67 46 72 65 65 73 6c 6f 74 20 2a 70 46 72 65 65 gFreeslot *pFree
151b6 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
151b7 20 46 72 65 65 20 70 61 67 65 20 62 6c 6f 63 6b Free page block
151b8 73 20 2a 2f 0d 0a 20 20 2f 2a 20 54 68 65 20 66 s */.. /* The f
151b9 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 20 72 ollowing value r
151ba 65 71 75 69 72 65 73 20 61 20 6d 75 74 65 78 20 equires a mutex
151bb 74 6f 20 63 68 61 6e 67 65 2e 20 20 57 65 20 73 to change. We s
151bc 6b 69 70 20 74 68 65 20 6d 75 74 65 78 20 6f 6e kip the mutex on
151bd 0d 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 62 .. ** reading b
151be 65 63 61 75 73 65 20 28 31 29 20 6d 6f 73 74 20 ecause (1) most
151bf 70 6c 61 74 66 6f 72 6d 73 20 72 65 61 64 20 61 platforms read a
151c0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 32-bit integer
151c1 61 74 6f 6d 69 63 61 6c 6c 79 20 61 6e 64 0d 0a atomically and..
151c2 20 20 2a 2a 20 28 32 29 20 65 76 65 6e 20 69 66 ** (2) even if
151c3 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 76 61 an incorrect va
151c4 6c 75 65 20 69 73 20 72 65 61 64 2c 20 6e 6f 20 lue is read, no
151c5 67 72 65 61 74 20 68 61 72 6d 20 69 73 20 64 6f great harm is do
151c6 6e 65 20 73 69 6e 63 65 20 74 68 69 73 0d 0a 20 ne since this..
151c7 20 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 ** is really ju
151c8 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 st an optimizati
151c9 6f 6e 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 55 on. */.. int bU
151ca 6e 64 65 72 50 72 65 73 73 75 72 65 3b 20 20 20 nderPressure;
151cb 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
151cc 20 69 66 20 6c 6f 77 20 6f 6e 20 50 41 47 45 43 if low on PAGEC
151cd 41 43 48 45 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a ACHE memory */..
151ce 7d 20 70 63 61 63 68 65 31 5f 67 3b 0d 0a 0d 0a } pcache1_g;....
151cf 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 /*..** All code
151d0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68 6f in this file sho
151d1 75 6c 64 20 61 63 63 65 73 73 20 74 68 65 20 67 uld access the g
151d2 6c 6f 62 61 6c 20 73 74 72 75 63 74 75 72 65 20 lobal structure
151d3 61 62 6f 76 65 20 76 69 61 20 74 68 65 0d 0a 2a above via the..*
151d4 2a 20 61 6c 69 61 73 20 22 70 63 61 63 68 65 31 * alias "pcache1
151d5 22 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 ". This ensures
151d6 74 68 61 74 20 74 68 65 20 57 53 44 20 65 6d 75 that the WSD emu
151d7 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 lation is used w
151d8 68 65 6e 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e hen..** compilin
151d9 67 20 66 6f 72 20 73 79 73 74 65 6d 73 20 74 68 g for systems th
151da 61 74 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 at do not suppor
151db 74 20 72 65 61 6c 20 57 53 44 2e 0d 0a 2a 2f 0d t real WSD...*/.
151dc 0a 23 64 65 66 69 6e 65 20 70 63 61 63 68 65 31 .#define pcache1
151dd 20 28 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 (GLOBAL(struct
151de 50 43 61 63 68 65 47 6c 6f 62 61 6c 2c 20 70 63 PCacheGlobal, pc
151df 61 63 68 65 31 5f 67 29 29 0d 0a 0d 0a 2f 2a 0d ache1_g))..../*.
151e0 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20 65 6e .** Macros to en
151e1 74 65 72 20 61 6e 64 20 6c 65 61 76 65 20 74 68 ter and leave th
151e2 65 20 50 43 61 63 68 65 20 4c 52 55 20 6d 75 74 e PCache LRU mut
151e3 65 78 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 ex...*/..#define
151e4 20 70 63 61 63 68 65 31 45 6e 74 65 72 4d 75 74 pcache1EnterMut
151e5 65 78 28 58 29 20 73 71 6c 69 74 65 33 5f 6d 75 ex(X) sqlite3_mu
151e6 74 65 78 5f 65 6e 74 65 72 28 28 58 29 2d 3e 6d tex_enter((X)->m
151e7 75 74 65 78 29 0d 0a 23 64 65 66 69 6e 65 20 70 utex)..#define p
151e8 63 61 63 68 65 31 4c 65 61 76 65 4d 75 74 65 78 cache1LeaveMutex
151e9 28 58 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 (X) sqlite3_mute
151ea 78 5f 6c 65 61 76 65 28 28 58 29 2d 3e 6d 75 74 x_leave((X)->mut
151eb 65 78 29 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ex)..../********
151ec 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
151ed 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
151ee 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
151ef 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
151f0 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a ******/../******
151f1 2a 2a 20 50 61 67 65 20 41 6c 6c 6f 63 61 74 69 ** Page Allocati
151f2 6f 6e 2f 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 on/SQLITE_CONFIG
151f3 5f 50 43 41 43 48 45 20 52 65 6c 61 74 65 64 20 _PCACHE Related
151f4 46 75 6e 63 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a Functions ******
151f5 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d ********/..../*.
151f6 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
151f7 6e 20 69 73 20 63 61 6c 6c 65 64 20 64 75 72 69 n is called duri
151f8 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ng initializatio
151f9 6e 20 69 66 20 61 20 73 74 61 74 69 63 20 62 75 n if a static bu
151fa 66 66 65 72 20 69 73 20 0d 0a 2a 2a 20 73 75 70 ffer is ..** sup
151fb 70 6c 69 65 64 20 74 6f 20 75 73 65 20 66 6f 72 plied to use for
151fc 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 the page-cache
151fd 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 53 by passing the S
151fe 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 QLITE_CONFIG_PAG
151ff 45 43 41 43 48 45 0d 0a 2a 2a 20 76 65 72 62 20 ECACHE..** verb
15200 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 to sqlite3_confi
15201 67 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 70 g(). Parameter p
15202 42 75 66 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e Buf points to an
15203 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 61 72 67 allocation larg
15204 65 0d 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 e..** enough to
15205 63 6f 6e 74 61 69 6e 20 27 6e 27 20 62 75 66 66 contain 'n' buff
15206 65 72 73 20 6f 66 20 27 73 7a 27 20 62 79 74 65 ers of 'sz' byte
15207 73 20 65 61 63 68 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 s each...**..**
15208 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
15209 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 called from sqli
1520a 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 te3_initialize()
1520b 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 67 75 and so it is gu
1520c 61 72 61 6e 74 65 65 64 0d 0a 2a 2a 20 74 6f 20 aranteed..** to
1520d 62 65 20 73 65 72 69 61 6c 69 7a 65 64 20 61 6c be serialized al
1520e 72 65 61 64 79 2e 20 20 54 68 65 72 65 20 69 73 ready. There is
1520f 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 66 75 72 no need for fur
15210 74 68 65 72 20 6d 75 74 65 78 69 6e 67 2e 0d 0a ther mutexing...
15211 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
15212 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
15213 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70 CacheBufferSetup
15214 28 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 (void *pBuf, int
15215 20 73 7a 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 sz, int n){..
15216 69 66 28 20 70 63 61 63 68 65 31 2e 69 73 49 6e if( pcache1.isIn
15217 69 74 20 29 7b 0d 0a 20 20 20 20 50 67 46 72 65 it ){.. PgFre
15218 65 73 6c 6f 74 20 2a 70 3b 0d 0a 20 20 20 20 73 eslot *p;.. s
15219 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 z = ROUNDDOWN8(s
1521a 7a 29 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 z);.. pcache1
1521b 2e 73 7a 53 6c 6f 74 20 3d 20 73 7a 3b 0d 0a 20 .szSlot = sz;..
1521c 20 20 20 70 63 61 63 68 65 31 2e 6e 53 6c 6f 74 pcache1.nSlot
1521d 20 3d 20 70 63 61 63 68 65 31 2e 6e 46 72 65 65 = pcache1.nFree
1521e 53 6c 6f 74 20 3d 20 6e 3b 0d 0a 20 20 20 20 70 Slot = n;.. p
1521f 63 61 63 68 65 31 2e 6e 52 65 73 65 72 76 65 20 cache1.nReserve
15220 3d 20 6e 3e 39 30 20 3f 20 31 30 20 3a 20 28 6e = n>90 ? 10 : (n
15221 2f 31 30 20 2b 20 31 29 3b 0d 0a 20 20 20 20 70 /10 + 1);.. p
15222 63 61 63 68 65 31 2e 70 53 74 61 72 74 20 3d 20 cache1.pStart =
15223 70 42 75 66 3b 0d 0a 20 20 20 20 70 63 61 63 68 pBuf;.. pcach
15224 65 31 2e 70 46 72 65 65 20 3d 20 30 3b 0d 0a 20 e1.pFree = 0;..
15225 20 20 20 70 63 61 63 68 65 31 2e 62 55 6e 64 65 pcache1.bUnde
15226 72 50 72 65 73 73 75 72 65 20 3d 20 30 3b 0d 0a rPressure = 0;..
15227 20 20 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 while( n-- )
15228 7b 0d 0a 20 20 20 20 20 20 70 20 3d 20 28 50 67 {.. p = (Pg
15229 46 72 65 65 73 6c 6f 74 2a 29 70 42 75 66 3b 0d Freeslot*)pBuf;.
1522a 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 . p->pNext
1522b 3d 20 70 63 61 63 68 65 31 2e 70 46 72 65 65 3b = pcache1.pFree;
1522c 0d 0a 20 20 20 20 20 20 70 63 61 63 68 65 31 2e .. pcache1.
1522d 70 46 72 65 65 20 3d 20 70 3b 0d 0a 20 20 20 20 pFree = p;..
1522e 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 pBuf = (void*)
1522f 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 73 &((char*)pBuf)[s
15230 7a 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 z];.. }..
15231 70 63 61 63 68 65 31 2e 70 45 6e 64 20 3d 20 70 pcache1.pEnd = p
15232 42 75 66 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a Buf;.. }..}....
15233 2f 2a 0d 0a 2a 2a 20 4d 61 6c 6c 6f 63 20 66 75 /*..** Malloc fu
15234 6e 63 74 69 6f 6e 20 75 73 65 64 20 77 69 74 68 nction used with
15235 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 6f 20 in this file to
15236 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 allocate space f
15237 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 0d 0a rom the buffer..
15238 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 75 73 ** configured us
15239 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 ing sqlite3_conf
1523a 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ig(SQLITE_CONFIG
1523b 5f 50 41 47 45 43 41 43 48 45 29 20 6f 70 74 69 _PAGECACHE) opti
1523c 6f 6e 2e 20 49 66 20 6e 6f 20 0d 0a 2a 2a 20 73 on. If no ..** s
1523d 75 63 68 20 62 75 66 66 65 72 20 65 78 69 73 74 uch buffer exist
1523e 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f s or there is no
1523f 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 69 space left in i
15240 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e t, this function
15241 20 66 61 6c 6c 73 20 0d 0a 2a 2a 20 62 61 63 6b falls ..** back
15242 20 74 6f 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f to sqlite3Mallo
15243 63 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4d 75 6c c()...**..** Mul
15244 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 63 61 tiple threads ca
15245 6e 20 72 75 6e 20 74 68 69 73 20 72 6f 75 74 69 n run this routi
15246 6e 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 ne at the same t
15247 69 6d 65 2e 20 20 47 6c 6f 62 61 6c 20 76 61 72 ime. Global var
15248 69 61 62 6c 65 73 0d 0a 2a 2a 20 69 6e 20 70 63 iables..** in pc
15249 61 63 68 65 31 20 6e 65 65 64 20 74 6f 20 62 65 ache1 need to be
1524a 20 70 72 6f 74 65 63 74 65 64 20 76 69 61 20 6d protected via m
1524b 75 74 65 78 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 utex...*/..stati
1524c 63 20 76 6f 69 64 20 2a 70 63 61 63 68 65 31 41 c void *pcache1A
1524d 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 7b lloc(int nByte){
1524e 0d 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b .. void *p = 0;
1524f 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
15250 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c te3_mutex_nothel
15251 64 28 70 63 61 63 68 65 31 2e 67 72 70 2e 6d 75 d(pcache1.grp.mu
15252 74 65 78 29 20 29 3b 0d 0a 20 20 73 71 6c 69 74 tex) );.. sqlit
15253 65 33 53 74 61 74 75 73 53 65 74 28 53 51 4c 49 e3StatusSet(SQLI
15254 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 TE_STATUS_PAGECA
15255 43 48 45 5f 53 49 5a 45 2c 20 6e 42 79 74 65 29 CHE_SIZE, nByte)
15256 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d ;.. if( nByte<=
15257 70 63 61 63 68 65 31 2e 73 7a 53 6c 6f 74 20 29 pcache1.szSlot )
15258 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d {.. sqlite3_m
15259 75 74 65 78 5f 65 6e 74 65 72 28 70 63 61 63 68 utex_enter(pcach
1525a 65 31 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 20 e1.mutex);..
1525b 70 20 3d 20 28 50 67 48 64 72 31 20 2a 29 70 63 p = (PgHdr1 *)pc
1525c 61 63 68 65 31 2e 70 46 72 65 65 3b 0d 0a 20 20 ache1.pFree;..
1525d 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20 20 20 if( p ){..
1525e 20 20 70 63 61 63 68 65 31 2e 70 46 72 65 65 20 pcache1.pFree
1525f 3d 20 70 63 61 63 68 65 31 2e 70 46 72 65 65 2d = pcache1.pFree-
15260 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 70 >pNext;.. p
15261 63 61 63 68 65 31 2e 6e 46 72 65 65 53 6c 6f 74 cache1.nFreeSlot
15262 2d 2d 3b 0d 0a 20 20 20 20 20 20 70 63 61 63 68 --;.. pcach
15263 65 31 2e 62 55 6e 64 65 72 50 72 65 73 73 75 72 e1.bUnderPressur
15264 65 20 3d 20 70 63 61 63 68 65 31 2e 6e 46 72 65 e = pcache1.nFre
15265 65 53 6c 6f 74 3c 70 63 61 63 68 65 31 2e 6e 52 eSlot<pcache1.nR
15266 65 73 65 72 76 65 3b 0d 0a 20 20 20 20 20 20 61 eserve;.. a
15267 73 73 65 72 74 28 20 70 63 61 63 68 65 31 2e 6e ssert( pcache1.n
15268 46 72 65 65 53 6c 6f 74 3e 3d 30 20 29 3b 0d 0a FreeSlot>=0 );..
15269 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 sqlite3Sta
1526a 74 75 73 41 64 64 28 53 51 4c 49 54 45 5f 53 54 tusAdd(SQLITE_ST
1526b 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 ATUS_PAGECACHE_U
1526c 53 45 44 2c 20 31 29 3b 0d 0a 20 20 20 20 7d 0d SED, 1);.. }.
1526d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 . sqlite3_mut
1526e 65 78 5f 6c 65 61 76 65 28 70 63 61 63 68 65 31 ex_leave(pcache1
1526f 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a 20 .mutex);.. }..
15270 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 if( p==0 ){..
15271 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 69 73 20 6e /* Memory is n
15272 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 ot available in
15273 74 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 the SQLITE_CONFI
15274 47 5f 50 41 47 45 43 41 43 48 45 20 70 6f 6f 6c G_PAGECACHE pool
15275 2e 20 20 47 65 74 0d 0a 20 20 20 20 2a 2a 20 69 . Get.. ** i
15276 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 t from sqlite3Ma
15277 6c 6c 6f 63 20 69 6e 73 74 65 61 64 2e 0d 0a 20 lloc instead...
15278 20 20 20 2a 2f 0d 0a 20 20 20 20 70 20 3d 20 73 */.. p = s
15279 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 42 79 qlite3Malloc(nBy
1527a 74 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 20 te);.. if( p
1527b 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 73 7a ){.. int sz
1527c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 = sqlite3Malloc
1527d 53 69 7a 65 28 70 29 3b 0d 0a 20 20 20 20 20 20 Size(p);..
1527e 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e sqlite3_mutex_en
1527f 74 65 72 28 70 63 61 63 68 65 31 2e 6d 75 74 65 ter(pcache1.mute
15280 78 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 x);.. sqlit
15281 65 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 e3StatusAdd(SQLI
15282 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 TE_STATUS_PAGECA
15283 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 73 7a CHE_OVERFLOW, sz
15284 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 );.. sqlite
15285 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 63 3_mutex_leave(pc
15286 61 63 68 65 31 2e 6d 75 74 65 78 29 3b 0d 0a 20 ache1.mutex);..
15287 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 }.. sqlite
15288 33 4d 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 3MemdebugSetType
15289 28 70 2c 20 4d 45 4d 54 59 50 45 5f 50 43 41 43 (p, MEMTYPE_PCAC
1528a 48 45 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 HE);.. }.. ret
1528b 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d urn p;..}..../*.
1528c 0a 2a 2a 20 46 72 65 65 20 61 6e 20 61 6c 6c 6f .** Free an allo
1528d 63 61 74 65 64 20 62 75 66 66 65 72 20 6f 62 74 cated buffer obt
1528e 61 69 6e 65 64 20 66 72 6f 6d 20 70 63 61 63 68 ained from pcach
1528f 65 31 41 6c 6c 6f 63 28 29 2e 0d 0a 2a 2f 0d 0a e1Alloc()...*/..
15290 73 74 61 74 69 63 20 69 6e 74 20 70 63 61 63 68 static int pcach
15291 65 31 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b e1Free(void *p){
15292 0d 0a 20 20 69 6e 74 20 6e 46 72 65 65 64 20 3d .. int nFreed =
15293 20 30 3b 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 0;.. if( p==0
15294 29 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 69 ) return 0;.. i
15295 66 28 20 70 3e 3d 70 63 61 63 68 65 31 2e 70 53 f( p>=pcache1.pS
15296 74 61 72 74 20 26 26 20 70 3c 70 63 61 63 68 65 tart && p<pcache
15297 31 2e 70 45 6e 64 20 29 7b 0d 0a 20 20 20 20 50 1.pEnd ){.. P
15298 67 46 72 65 65 73 6c 6f 74 20 2a 70 53 6c 6f 74 gFreeslot *pSlot
15299 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d ;.. sqlite3_m
1529a 75 74 65 78 5f 65 6e 74 65 72 28 70 63 61 63 68 utex_enter(pcach
1529b 65 31 2e 6d 75 74 65 78 29 3b 0d 0a 20 20 20 20 e1.mutex);..
1529c 73 71 6c 69 74 65 33 53 74 61 74 75 73 41 64 64 sqlite3StatusAdd
1529d 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 (SQLITE_STATUS_P
1529e 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 2d AGECACHE_USED, -
1529f 31 29 3b 0d 0a 20 20 20 20 70 53 6c 6f 74 20 3d 1);.. pSlot =
152a0 20 28 50 67 46 72 65 65 73 6c 6f 74 2a 29 70 3b (PgFreeslot*)p;
152a1 0d 0a 20 20 20 20 70 53 6c 6f 74 2d 3e 70 4e 65 .. pSlot->pNe
152a2 78 74 20 3d 20 70 63 61 63 68 65 31 2e 70 46 72 xt = pcache1.pFr
152a3 65 65 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 ee;.. pcache1
152a4 2e 70 46 72 65 65 20 3d 20 70 53 6c 6f 74 3b 0d .pFree = pSlot;.
152a5 0a 20 20 20 20 70 63 61 63 68 65 31 2e 6e 46 72 . pcache1.nFr
152a6 65 65 53 6c 6f 74 2b 2b 3b 0d 0a 20 20 20 20 70 eeSlot++;.. p
152a7 63 61 63 68 65 31 2e 62 55 6e 64 65 72 50 72 65 cache1.bUnderPre
152a8 73 73 75 72 65 20 3d 20 70 63 61 63 68 65 31 2e ssure = pcache1.
152a9 6e 46 72 65 65 53 6c 6f 74 3c 70 63 61 63 68 65 nFreeSlot<pcache
152aa 31 2e 6e 52 65 73 65 72 76 65 3b 0d 0a 20 20 20 1.nReserve;..
152ab 20 61 73 73 65 72 74 28 20 70 63 61 63 68 65 31 assert( pcache1
152ac 2e 6e 46 72 65 65 53 6c 6f 74 3c 3d 70 63 61 63 .nFreeSlot<=pcac
152ad 68 65 31 2e 6e 53 6c 6f 74 20 29 3b 0d 0a 20 20 he1.nSlot );..
152ae 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
152af 6c 65 61 76 65 28 70 63 61 63 68 65 31 2e 6d 75 leave(pcache1.mu
152b0 74 65 78 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d tex);.. }else{.
152b1 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c . assert( sql
152b2 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 ite3MemdebugHasT
152b3 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 50 ype(p, MEMTYPE_P
152b4 43 41 43 48 45 29 20 29 3b 0d 0a 20 20 20 20 73 CACHE) );.. s
152b5 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 qlite3MemdebugSe
152b6 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59 50 45 tType(p, MEMTYPE
152b7 5f 48 45 41 50 29 3b 0d 0a 20 20 20 20 6e 46 72 _HEAP);.. nFr
152b8 65 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c eed = sqlite3Mal
152b9 6c 6f 63 53 69 7a 65 28 70 29 3b 0d 0a 20 20 20 locSize(p);..
152ba 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
152bb 6e 74 65 72 28 70 63 61 63 68 65 31 2e 6d 75 74 nter(pcache1.mut
152bc 65 78 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 ex);.. sqlite
152bd 33 53 74 61 74 75 73 41 64 64 28 53 51 4c 49 54 3StatusAdd(SQLIT
152be 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 E_STATUS_PAGECAC
152bf 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 2d 6e 46 HE_OVERFLOW, -nF
152c0 72 65 65 64 29 3b 0d 0a 20 20 20 20 73 71 6c 69 reed);.. sqli
152c1 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
152c2 70 63 61 63 68 65 31 2e 6d 75 74 65 78 29 3b 0d pcache1.mutex);.
152c3 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
152c4 65 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 e(p);.. }.. re
152c5 74 75 72 6e 20 6e 46 72 65 65 64 3b 0d 0a 7d 0d turn nFreed;..}.
152c6 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
152c7 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d _ENABLE_MEMORY_M
152c8 41 4e 41 47 45 4d 45 4e 54 0d 0a 2f 2a 0d 0a 2a ANAGEMENT../*..*
152c9 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a * Return the siz
152ca 65 20 6f 66 20 61 20 70 63 61 63 68 65 20 61 6c e of a pcache al
152cb 6c 6f 63 61 74 69 6f 6e 0d 0a 2a 2f 0d 0a 73 74 location..*/..st
152cc 61 74 69 63 20 69 6e 74 20 70 63 61 63 68 65 31 atic int pcache1
152cd 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 MemSize(void *p)
152ce 7b 0d 0a 20 20 69 66 28 20 70 3e 3d 70 63 61 63 {.. if( p>=pcac
152cf 68 65 31 2e 70 53 74 61 72 74 20 26 26 20 70 3c he1.pStart && p<
152d0 70 63 61 63 68 65 31 2e 70 45 6e 64 20 29 7b 0d pcache1.pEnd ){.
152d1 0a 20 20 20 20 72 65 74 75 72 6e 20 70 63 61 63 . return pcac
152d2 68 65 31 2e 73 7a 53 6c 6f 74 3b 0d 0a 20 20 7d he1.szSlot;.. }
152d3 65 6c 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20 69 else{.. int i
152d4 53 69 7a 65 3b 0d 0a 20 20 20 20 61 73 73 65 72 Size;.. asser
152d5 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 t( sqlite3Memdeb
152d6 75 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d ugHasType(p, MEM
152d7 54 59 50 45 5f 50 43 41 43 48 45 29 20 29 3b 0d TYPE_PCACHE) );.
152d8 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 . sqlite3Memd
152d9 65 62 75 67 53 65 74 54 79 70 65 28 70 2c 20 4d ebugSetType(p, M
152da 45 4d 54 59 50 45 5f 48 45 41 50 29 3b 0d 0a 20 EMTYPE_HEAP);..
152db 20 20 20 69 53 69 7a 65 20 3d 20 73 71 6c 69 74 iSize = sqlit
152dc 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29 3b e3MallocSize(p);
152dd 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d .. sqlite3Mem
152de 64 65 62 75 67 53 65 74 54 79 70 65 28 70 2c 20 debugSetType(p,
152df 4d 45 4d 54 59 50 45 5f 50 43 41 43 48 45 29 3b MEMTYPE_PCACHE);
152e0 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 53 69 .. return iSi
152e1 7a 65 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e ze;.. }..}..#en
152e2 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e dif /* SQLITE_EN
152e3 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 ABLE_MEMORY_MANA
152e4 47 45 4d 45 4e 54 20 2a 2f 0d 0a 0d 0a 2f 2a 0d GEMENT */..../*.
152e5 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e .** Allocate a n
152e6 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 ew page object i
152e7 6e 69 74 69 61 6c 6c 79 20 61 73 73 6f 63 69 61 nitially associa
152e8 74 65 64 20 77 69 74 68 20 63 61 63 68 65 20 70 ted with cache p
152e9 43 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 Cache...*/..stat
152ea 69 63 20 50 67 48 64 72 31 20 2a 70 63 61 63 68 ic PgHdr1 *pcach
152eb 65 31 41 6c 6c 6f 63 50 61 67 65 28 50 43 61 63 e1AllocPage(PCac
152ec 68 65 31 20 2a 70 43 61 63 68 65 29 7b 0d 0a 20 he1 *pCache){..
152ed 20 50 67 48 64 72 31 20 2a 70 20 3d 20 30 3b 0d PgHdr1 *p = 0;.
152ee 0a 20 20 76 6f 69 64 20 2a 70 50 67 3b 0d 0a 0d . void *pPg;...
152ef 0a 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 . /* The group
152f0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 72 65 mutex must be re
152f1 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 70 63 leased before pc
152f2 61 63 68 65 31 41 6c 6c 6f 63 28 29 20 69 73 20 ache1Alloc() is
152f3 63 61 6c 6c 65 64 2e 20 54 68 69 73 0d 0a 20 20 called. This..
152f4 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 69 74 ** is because it
152f5 20 6d 61 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 may call sqlite
152f6 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 3_release_memory
152f7 28 29 2c 20 77 68 69 63 68 20 61 73 73 75 6d 65 (), which assume
152f8 73 20 74 68 61 74 20 0d 0a 20 20 2a 2a 20 74 68 s that .. ** th
152f9 69 73 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 is mutex is not
152fa 68 65 6c 64 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 held. */.. asse
152fb 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
152fc 78 5f 68 65 6c 64 28 70 43 61 63 68 65 2d 3e 70 x_held(pCache->p
152fd 47 72 6f 75 70 2d 3e 6d 75 74 65 78 29 20 29 3b Group->mutex) );
152fe 0d 0a 20 20 70 63 61 63 68 65 31 4c 65 61 76 65 .. pcache1Leave
152ff 4d 75 74 65 78 28 70 43 61 63 68 65 2d 3e 70 47 Mutex(pCache->pG
15300 72 6f 75 70 29 3b 0d 0a 23 69 66 64 65 66 20 53 roup);..#ifdef S
15301 51 4c 49 54 45 5f 50 43 41 43 48 45 5f 53 45 50 QLITE_PCACHE_SEP
15302 41 52 41 54 45 5f 48 45 41 44 45 52 0d 0a 20 20 ARATE_HEADER..
15303 70 50 67 20 3d 20 70 63 61 63 68 65 31 41 6c 6c pPg = pcache1All
15304 6f 63 28 70 43 61 63 68 65 2d 3e 73 7a 50 61 67 oc(pCache->szPag
15305 65 29 3b 0d 0a 20 20 70 20 3d 20 73 71 6c 69 74 e);.. p = sqlit
15306 65 33 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 e3Malloc(sizeof(
15307 50 67 48 64 72 31 29 20 2b 20 70 43 61 63 68 65 PgHdr1) + pCache
15308 2d 3e 73 7a 45 78 74 72 61 29 3b 0d 0a 20 20 69 ->szExtra);.. i
15309 66 28 20 21 70 50 67 20 7c 7c 20 21 70 20 29 7b f( !pPg || !p ){
1530a 0d 0a 20 20 20 20 70 63 61 63 68 65 31 46 72 65 .. pcache1Fre
1530b 65 28 70 50 67 29 3b 0d 0a 20 20 20 20 73 71 6c e(pPg);.. sql
1530c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20 ite3_free(p);..
1530d 20 20 20 70 50 67 20 3d 20 30 3b 0d 0a 20 20 7d pPg = 0;.. }
1530e 0d 0a 23 65 6c 73 65 0d 0a 20 20 70 50 67 20 3d ..#else.. pPg =
1530f 20 70 63 61 63 68 65 31 41 6c 6c 6f 63 28 73 69 pcache1Alloc(si
15310 7a 65 6f 66 28 50 67 48 64 72 31 29 20 2b 20 70 zeof(PgHdr1) + p
15311 43 61 63 68 65 2d 3e 73 7a 50 61 67 65 20 2b 20 Cache->szPage +
15312 70 43 61 63 68 65 2d 3e 73 7a 45 78 74 72 61 29 pCache->szExtra)
15313 3b 0d 0a 20 20 70 20 3d 20 28 50 67 48 64 72 31 ;.. p = (PgHdr1
15314 20 2a 29 26 28 28 75 38 20 2a 29 70 50 67 29 5b *)&((u8 *)pPg)[
15315 70 43 61 63 68 65 2d 3e 73 7a 50 61 67 65 5d 3b pCache->szPage];
15316 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 70 63 61 63 ..#endif.. pcac
15317 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 70 43 he1EnterMutex(pC
15318 61 63 68 65 2d 3e 70 47 72 6f 75 70 29 3b 0d 0a ache->pGroup);..
15319 0d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0d 0a .. if( pPg ){..
1531a 20 20 20 20 70 2d 3e 70 61 67 65 2e 70 42 75 66 p->page.pBuf
1531b 20 3d 20 70 50 67 3b 0d 0a 20 20 20 20 70 2d 3e = pPg;.. p->
1531c 70 61 67 65 2e 70 45 78 74 72 61 20 3d 20 26 70 page.pExtra = &p
1531d 5b 31 5d 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 [1];.. if( pC
1531e 61 63 68 65 2d 3e 62 50 75 72 67 65 61 62 6c 65 ache->bPurgeable
1531f 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 61 63 68 ){.. pCach
15320 65 2d 3e 70 47 72 6f 75 70 2d 3e 6e 43 75 72 72 e->pGroup->nCurr
15321 65 6e 74 50 61 67 65 2b 2b 3b 0d 0a 20 20 20 20 entPage++;..
15322 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b }.. return p;
15323 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
15324 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0;..}..../*..**
15325 46 72 65 65 20 61 20 70 61 67 65 20 6f 62 6a 65 Free a page obje
15326 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 ct allocated by
15327 70 63 61 63 68 65 31 41 6c 6c 6f 63 50 61 67 65 pcache1AllocPage
15328 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ()...**..** The
15329 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 6c 6f 77 pointer is allow
1532a 65 64 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 77 ed to be NULL, w
1532b 68 69 63 68 20 69 73 20 70 72 75 64 65 6e 74 2e hich is prudent.
1532c 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f But it turns o
1532d 75 74 0d 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 ut..** that the
1532e 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e current implemen
1532f 74 61 74 69 6f 6e 20 68 61 70 70 65 6e 73 20 74 tation happens t
15330 6f 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 o never call thi
15331 73 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 77 69 s routine..** wi
15332 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 th a NULL pointe
15333 72 2c 20 73 6f 20 77 65 20 6d 61 72 6b 20 74 68 r, so we mark th
15334 65 20 4e 55 4c 4c 20 74 65 73 74 20 77 69 74 68 e NULL test with
15335 20 41 4c 57 41 59 53 28 29 2e 0d 0a 2a 2f 0d 0a ALWAYS()...*/..
15336 73 74 61 74 69 63 20 76 6f 69 64 20 70 63 61 63 static void pcac
15337 68 65 31 46 72 65 65 50 61 67 65 28 50 67 48 64 he1FreePage(PgHd
15338 72 31 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 41 r1 *p){.. if( A
15339 4c 57 41 59 53 28 70 29 20 29 7b 0d 0a 20 20 20 LWAYS(p) ){..
1533a 20 50 43 61 63 68 65 31 20 2a 70 43 61 63 68 65 PCache1 *pCache
1533b 20 3d 20 70 2d 3e 70 43 61 63 68 65 3b 0d 0a 20 = p->pCache;..
1533c 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 assert( sqlit
1533d 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d e3_mutex_held(p-
1533e 3e 70 43 61 63 68 65 2d 3e 70 47 72 6f 75 70 2d >pCache->pGroup-
1533f 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 20 20 >mutex) );..
15340 70 63 61 63 68 65 31 46 72 65 65 28 70 2d 3e 70 pcache1Free(p->p
15341 61 67 65 2e 70 42 75 66 29 3b 0d 0a 23 69 66 64 age.pBuf);..#ifd
15342 65 66 20 53 51 4c 49 54 45 5f 50 43 41 43 48 45 ef SQLITE_PCACHE
15343 5f 53 45 50 41 52 41 54 45 5f 48 45 41 44 45 52 _SEPARATE_HEADER
15344 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 .. sqlite3_fr
15345 65 65 28 70 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a ee(p);..#endif..
15346 20 20 20 20 69 66 28 20 70 43 61 63 68 65 2d 3e if( pCache->
15347 62 50 75 72 67 65 61 62 6c 65 20 29 7b 0d 0a 20 bPurgeable ){..
15348 20 20 20 20 20 70 43 61 63 68 65 2d 3e 70 47 72 pCache->pGr
15349 6f 75 70 2d 3e 6e 43 75 72 72 65 6e 74 50 61 67 oup->nCurrentPag
1534a 65 2d 2d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d e--;.. }.. }
1534b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 ..}..../*..** Ma
1534c 6c 6c 6f 63 20 66 75 6e 63 74 69 6f 6e 20 75 73 lloc function us
1534d 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 6f 20 ed by SQLite to
1534e 6f 62 74 61 69 6e 20 73 70 61 63 65 20 66 72 6f obtain space fro
1534f 6d 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 6e m the buffer con
15350 66 69 67 75 72 65 64 0d 0a 2a 2a 20 75 73 69 6e figured..** usin
15351 67 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 g sqlite3_config
15352 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 (SQLITE_CONFIG_P
15353 41 47 45 43 41 43 48 45 29 20 6f 70 74 69 6f 6e AGECACHE) option
15354 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 62 75 66 . If no such buf
15355 66 65 72 0d 0a 2a 2a 20 65 78 69 73 74 73 2c 20 fer..** exists,
15356 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 61 this function fa
15357 6c 6c 73 20 62 61 63 6b 20 74 6f 20 73 71 6c 69 lls back to sqli
15358 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 0d 0a 2a 2f te3Malloc()...*/
15359 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1535a 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 void *sqlite3Pa
1535b 67 65 4d 61 6c 6c 6f 63 28 69 6e 74 20 73 7a 29 geMalloc(int sz)
1535c 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 63 61 63 {.. return pcac
1535d 68 65 31 41 6c 6c 6f 63 28 73 7a 29 3b 0d 0a 7d he1Alloc(sz);..}
1535e 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 ..../*..** Free
1535f 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 an allocated buf
15360 66 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f fer obtained fro
15361 6d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c m sqlite3PageMal
15362 6c 6f 63 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 loc()...*/..SQLI
15363 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
15364 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 sqlite3PageFree(
15365 76 6f 69 64 20 2a 70 29 7b 0d 0a 20 20 70 63 61 void *p){.. pca
15366 63 68 65 31 46 72 65 65 28 70 29 3b 0d 0a 7d 0d che1Free(p);..}.
15367 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 ...../*..** Retu
15368 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 65 rn true if it de
15369 73 69 72 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 sirable to avoid
1536a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 allocating a ne
1536b 77 20 70 61 67 65 20 63 61 63 68 65 0d 0a 2a 2a w page cache..**
1536c 20 65 6e 74 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 entry...**..**
1536d 49 66 20 6d 65 6d 6f 72 79 20 77 61 73 20 61 6c If memory was al
1536e 6c 6f 63 61 74 65 64 20 73 70 65 63 69 66 69 63 located specific
1536f 61 6c 6c 79 20 74 6f 20 74 68 65 20 70 61 67 65 ally to the page
15370 20 63 61 63 68 65 20 75 73 69 6e 67 0d 0a 2a 2a cache using..**
15371 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 SQLITE_CONFIG_P
15372 41 47 45 43 41 43 48 45 20 62 75 74 20 74 68 61 AGECACHE but tha
15373 74 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 6c t memory has all
15374 20 62 65 65 6e 20 75 73 65 64 2c 20 74 68 65 6e been used, then
15375 0d 0a 2a 2a 20 69 74 20 69 73 20 64 65 73 69 72 ..** it is desir
15376 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 6c able to avoid al
15377 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 70 locating a new p
15378 61 67 65 20 63 61 63 68 65 20 65 6e 74 72 79 20 age cache entry
15379 62 65 63 61 75 73 65 0d 0a 2a 2a 20 70 72 65 73 because..** pres
1537a 75 6d 61 62 6c 79 20 53 51 4c 49 54 45 5f 43 4f umably SQLITE_CO
1537b 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 20 77 NFIG_PAGECACHE w
1537c 61 73 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 as suppose to be
1537d 20 73 75 66 66 69 63 69 65 6e 74 0d 0a 2a 2a 20 sufficient..**
1537e 66 6f 72 20 61 6c 6c 20 70 61 67 65 20 63 61 63 for all page cac
1537f 68 65 20 6e 65 65 64 73 20 61 6e 64 20 77 65 20 he needs and we
15380 73 68 6f 75 6c 64 20 6e 6f 74 20 6e 65 65 64 20 should not need
15381 74 6f 20 73 70 69 6c 6c 20 74 68 65 0d 0a 2a 2a to spill the..**
15382 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 6e 74 6f allocation onto
15383 20 74 68 65 20 68 65 61 70 2e 0d 0a 2a 2a 0d 0a the heap...**..
15384 2a 2a 20 4f 72 2c 20 74 68 65 20 68 65 61 70 20 ** Or, the heap
15385 69 73 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 is used for all
15386 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 page cache memor
15387 79 20 62 75 74 20 74 68 65 20 68 65 61 70 20 69 y but the heap i
15388 73 0d 0a 2a 2a 20 75 6e 64 65 72 20 6d 65 6d 6f s..** under memo
15389 72 79 20 70 72 65 73 73 75 72 65 2c 20 74 68 65 ry pressure, the
1538a 6e 20 61 67 61 69 6e 20 69 74 20 69 73 20 64 65 n again it is de
1538b 73 69 72 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 sirable to avoid
1538c 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 ..** allocating
1538d 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 a new page cache
1538e 20 65 6e 74 72 79 20 69 6e 20 6f 72 64 65 72 20 entry in order
1538f 74 6f 20 61 76 6f 69 64 20 73 74 72 65 73 73 69 to avoid stressi
15390 6e 67 0d 0a 2a 2a 20 74 68 65 20 68 65 61 70 20 ng..** the heap
15391 65 76 65 6e 20 66 75 72 74 68 65 72 2e 0d 0a 2a even further...*
15392 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 63 /..static int pc
15393 61 63 68 65 31 55 6e 64 65 72 4d 65 6d 6f 72 79 ache1UnderMemory
15394 50 72 65 73 73 75 72 65 28 50 43 61 63 68 65 31 Pressure(PCache1
15395 20 2a 70 43 61 63 68 65 29 7b 0d 0a 20 20 69 66 *pCache){.. if
15396 28 20 70 63 61 63 68 65 31 2e 6e 53 6c 6f 74 20 ( pcache1.nSlot
15397 26 26 20 28 70 43 61 63 68 65 2d 3e 73 7a 50 61 && (pCache->szPa
15398 67 65 2b 70 43 61 63 68 65 2d 3e 73 7a 45 78 74 ge+pCache->szExt
15399 72 61 29 3c 3d 70 63 61 63 68 65 31 2e 73 7a 53 ra)<=pcache1.szS
1539a 6c 6f 74 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 lot ){.. retu
1539b 72 6e 20 70 63 61 63 68 65 31 2e 62 55 6e 64 65 rn pcache1.bUnde
1539c 72 50 72 65 73 73 75 72 65 3b 0d 0a 20 20 7d 65 rPressure;.. }e
1539d 6c 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e lse{.. return
1539e 20 73 71 6c 69 74 65 33 48 65 61 70 4e 65 61 72 sqlite3HeapNear
1539f 6c 79 46 75 6c 6c 28 29 3b 0d 0a 20 20 7d 0d 0a lyFull();.. }..
153a0 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }..../**********
153a1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153a2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153a3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153a4 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153a5 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ****/../********
153a6 20 47 65 6e 65 72 61 6c 20 49 6d 70 6c 65 6d 65 General Impleme
153a7 6e 74 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e ntation Function
153a8 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a s **************
153a9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
153aa 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a ******/..../*..*
153ab 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
153ac 69 73 20 75 73 65 64 20 74 6f 20 72 65 73 69 7a is used to resiz
153ad 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 e the hash table
153ae 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 63 used by the cac
153af 68 65 20 70 61 73 73 65 64 0d 0a 2a 2a 20 61 73 he passed..** as
153b0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d the first argum
153b1 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ent...**..** The
153b2 20 50 43 61 63 68 65 20 6d 75 74 65 78 20 6d 75 PCache mutex mu
153b3 73 74 20 62 65 20 68 65 6c 64 20 77 68 65 6e 20 st be held when
153b4 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 this function is
153b5 20 63 61 6c 6c 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 called...*/..st
153b6 61 74 69 63 20 69 6e 74 20 70 63 61 63 68 65 31 atic int pcache1
153b7 52 65 73 69 7a 65 48 61 73 68 28 50 43 61 63 68 ResizeHash(PCach
153b8 65 31 20 2a 70 29 7b 0d 0a 20 20 50 67 48 64 72 e1 *p){.. PgHdr
153b9 31 20 2a 2a 61 70 4e 65 77 3b 0d 0a 20 20 75 6e 1 **apNew;.. un
153ba 73 69 67 6e 65 64 20 69 6e 74 20 6e 4e 65 77 3b signed int nNew;
153bb 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 .. unsigned int
153bc 20 69 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 i;.... assert(
153bd 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
153be 65 6c 64 28 70 2d 3e 70 47 72 6f 75 70 2d 3e 6d eld(p->pGroup->m
153bf 75 74 65 78 29 20 29 3b 0d 0a 0d 0a 20 20 6e 4e utex) );.... nN
153c0 65 77 20 3d 20 70 2d 3e 6e 48 61 73 68 2a 32 3b ew = p->nHash*2;
153c1 0d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 32 35 36 .. if( nNew<256
153c2 20 29 7b 0d 0a 20 20 20 20 6e 4e 65 77 20 3d 20 ){.. nNew =
153c3 32 35 36 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 256;.. }.... p
153c4 63 61 63 68 65 31 4c 65 61 76 65 4d 75 74 65 78 cache1LeaveMutex
153c5 28 70 2d 3e 70 47 72 6f 75 70 29 3b 0d 0a 20 20 (p->pGroup);..
153c6 69 66 28 20 70 2d 3e 6e 48 61 73 68 20 29 7b 20 if( p->nHash ){
153c7 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 sqlite3BeginBeni
153c8 67 6e 4d 61 6c 6c 6f 63 28 29 3b 20 7d 0d 0a 20 gnMalloc(); }..
153c9 20 61 70 4e 65 77 20 3d 20 28 50 67 48 64 72 31 apNew = (PgHdr1
153ca 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c **)sqlite3_mall
153cb 6f 63 28 73 69 7a 65 6f 66 28 50 67 48 64 72 31 oc(sizeof(PgHdr1
153cc 20 2a 29 2a 6e 4e 65 77 29 3b 0d 0a 20 20 69 66 *)*nNew);.. if
153cd 28 20 70 2d 3e 6e 48 61 73 68 20 29 7b 20 73 71 ( p->nHash ){ sq
153ce 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
153cf 6c 6c 6f 63 28 29 3b 20 7d 0d 0a 20 20 70 63 61 lloc(); }.. pca
153d0 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 70 che1EnterMutex(p
153d1 2d 3e 70 47 72 6f 75 70 29 3b 0d 0a 20 20 69 66 ->pGroup);.. if
153d2 28 20 61 70 4e 65 77 20 29 7b 0d 0a 20 20 20 20 ( apNew ){..
153d3 6d 65 6d 73 65 74 28 61 70 4e 65 77 2c 20 30 2c memset(apNew, 0,
153d4 20 73 69 7a 65 6f 66 28 50 67 48 64 72 31 20 2a sizeof(PgHdr1 *
153d5 29 2a 6e 4e 65 77 29 3b 0d 0a 20 20 20 20 66 6f )*nNew);.. fo
153d6 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 48 61 73 r(i=0; i<p->nHas
153d7 68 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 h; i++){..
153d8 50 67 48 64 72 31 20 2a 70 50 61 67 65 3b 0d 0a PgHdr1 *pPage;..
153d9 20 20 20 20 20 20 50 67 48 64 72 31 20 2a 70 4e PgHdr1 *pN
153da 65 78 74 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b ext = p->apHash[
153db 69 5d 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 i];.. while
153dc 28 20 28 70 50 61 67 65 20 3d 20 70 4e 65 78 74 ( (pPage = pNext
153dd 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 )!=0 ){..
153de 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 68 20 unsigned int h
153df 3d 20 70 50 61 67 65 2d 3e 69 4b 65 79 20 25 20 = pPage->iKey %
153e0 6e 4e 65 77 3b 0d 0a 20 20 20 20 20 20 20 20 70 nNew;.. p
153e1 4e 65 78 74 20 3d 20 70 50 61 67 65 2d 3e 70 4e Next = pPage->pN
153e2 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 70 50 ext;.. pP
153e3 61 67 65 2d 3e 70 4e 65 78 74 20 3d 20 61 70 4e age->pNext = apN
153e4 65 77 5b 68 5d 3b 0d 0a 20 20 20 20 20 20 20 20 ew[h];..
153e5 61 70 4e 65 77 5b 68 5d 20 3d 20 70 50 61 67 65 apNew[h] = pPage
153e6 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
153e7 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 }.. sqlite3_f
153e8 72 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0d ree(p->apHash);.
153e9 0a 20 20 20 20 70 2d 3e 61 70 48 61 73 68 20 3d . p->apHash =
153ea 20 61 70 4e 65 77 3b 0d 0a 20 20 20 20 70 2d 3e apNew;.. p->
153eb 6e 48 61 73 68 20 3d 20 6e 4e 65 77 3b 0d 0a 20 nHash = nNew;..
153ec 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 28 }.... return (
153ed 70 2d 3e 61 70 48 61 73 68 20 3f 20 53 51 4c 49 p->apHash ? SQLI
153ee 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e TE_OK : SQLITE_N
153ef 4f 4d 45 4d 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d OMEM);..}..../*.
153f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
153f1 6e 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e n is used intern
153f2 61 6c 6c 79 20 74 6f 20 72 65 6d 6f 76 65 20 74 ally to remove t
153f3 68 65 20 70 61 67 65 20 70 50 61 67 65 20 66 72 he page pPage fr
153f4 6f 6d 20 74 68 65 20 0d 0a 2a 2a 20 50 47 72 6f om the ..** PGro
153f5 75 70 20 4c 52 55 20 6c 69 73 74 2c 20 69 66 20 up LRU list, if
153f6 69 73 20 70 61 72 74 20 6f 66 20 69 74 2e 20 49 is part of it. I
153f7 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 70 f pPage is not p
153f8 61 72 74 20 6f 66 20 74 68 65 20 50 47 72 6f 75 art of the PGrou
153f9 70 0d 0a 2a 2a 20 4c 52 55 20 6c 69 73 74 2c 20 p..** LRU list,
153fa 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 then this functi
153fb 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a on is a no-op...
153fc 2a 2a 0d 0a 2a 2a 20 54 68 65 20 50 47 72 6f 75 **..** The PGrou
153fd 70 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 p mutex must be
153fe 68 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20 66 held when this f
153ff 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
15400 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 50 d...**..** If pP
15401 61 67 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e age is NULL then
15402 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
15403 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 a no-op...*/..s
15404 74 61 74 69 63 20 76 6f 69 64 20 70 63 61 63 68 tatic void pcach
15405 65 31 50 69 6e 50 61 67 65 28 50 67 48 64 72 31 e1PinPage(PgHdr1
15406 20 2a 70 50 61 67 65 29 7b 0d 0a 20 20 50 43 61 *pPage){.. PCa
15407 63 68 65 31 20 2a 70 43 61 63 68 65 3b 0d 0a 20 che1 *pCache;..
15408 20 50 47 72 6f 75 70 20 2a 70 47 72 6f 75 70 3b PGroup *pGroup;
15409 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61 67 65 3d .... if( pPage=
1540a 3d 30 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 =0 ) return;..
1540b 70 43 61 63 68 65 20 3d 20 70 50 61 67 65 2d 3e pCache = pPage->
1540c 70 43 61 63 68 65 3b 0d 0a 20 20 70 47 72 6f 75 pCache;.. pGrou
1540d 70 20 3d 20 70 43 61 63 68 65 2d 3e 70 47 72 6f p = pCache->pGro
1540e 75 70 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 up;.. assert( s
1540f 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
15410 64 28 70 47 72 6f 75 70 2d 3e 6d 75 74 65 78 29 d(pGroup->mutex)
15411 20 29 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 65 );.. if( pPage
15412 2d 3e 70 4c 72 75 4e 65 78 74 20 7c 7c 20 70 50 ->pLruNext || pP
15413 61 67 65 3d 3d 70 47 72 6f 75 70 2d 3e 70 4c 72 age==pGroup->pLr
15414 75 54 61 69 6c 20 29 7b 0d 0a 20 20 20 20 69 66 uTail ){.. if
15415 28 20 70 50 61 67 65 2d 3e 70 4c 72 75 50 72 65 ( pPage->pLruPre
15416 76 20 29 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 v ){.. pPag
15417 65 2d 3e 70 4c 72 75 50 72 65 76 2d 3e 70 4c 72 e->pLruPrev->pLr
15418 75 4e 65 78 74 20 3d 20 70 50 61 67 65 2d 3e 70 uNext = pPage->p
15419 4c 72 75 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d LruNext;.. }.
1541a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e . if( pPage->
1541b 70 4c 72 75 4e 65 78 74 20 29 7b 0d 0a 20 20 20 pLruNext ){..
1541c 20 20 20 70 50 61 67 65 2d 3e 70 4c 72 75 4e 65 pPage->pLruNe
1541d 78 74 2d 3e 70 4c 72 75 50 72 65 76 20 3d 20 70 xt->pLruPrev = p
1541e 50 61 67 65 2d 3e 70 4c 72 75 50 72 65 76 3b 0d Page->pLruPrev;.
1541f 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
15420 70 47 72 6f 75 70 2d 3e 70 4c 72 75 48 65 61 64 pGroup->pLruHead
15421 3d 3d 70 50 61 67 65 20 29 7b 0d 0a 20 20 20 20 ==pPage ){..
15422 20 20 70 47 72 6f 75 70 2d 3e 70 4c 72 75 48 65 pGroup->pLruHe
15423 61 64 20 3d 20 70 50 61 67 65 2d 3e 70 4c 72 75 ad = pPage->pLru
15424 4e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 Next;.. }..
15425 20 20 69 66 28 20 70 47 72 6f 75 70 2d 3e 70 4c if( pGroup->pL
15426 72 75 54 61 69 6c 3d 3d 70 50 61 67 65 20 29 7b ruTail==pPage ){
15427 0d 0a 20 20 20 20 20 20 70 47 72 6f 75 70 2d 3e .. pGroup->
15428 70 4c 72 75 54 61 69 6c 20 3d 20 70 50 61 67 65 pLruTail = pPage
15429 2d 3e 70 4c 72 75 50 72 65 76 3b 0d 0a 20 20 20 ->pLruPrev;..
1542a 20 7d 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 }.. pPage->p
1542b 4c 72 75 4e 65 78 74 20 3d 20 30 3b 0d 0a 20 20 LruNext = 0;..
1542c 20 20 70 50 61 67 65 2d 3e 70 4c 72 75 50 72 65 pPage->pLruPre
1542d 76 20 3d 20 30 3b 0d 0a 20 20 20 20 70 50 61 67 v = 0;.. pPag
1542e 65 2d 3e 70 43 61 63 68 65 2d 3e 6e 52 65 63 79 e->pCache->nRecy
1542f 63 6c 61 62 6c 65 2d 2d 3b 0d 0a 20 20 7d 0d 0a clable--;.. }..
15430 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 }....../*..** Re
15431 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 73 75 move the page su
15432 70 70 6c 69 65 64 20 61 73 20 61 6e 20 61 72 67 pplied as an arg
15433 75 6d 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 68 ument from the h
15434 61 73 68 20 74 61 62 6c 65 20 0d 0a 2a 2a 20 28 ash table ..** (
15435 50 43 61 63 68 65 31 2e 61 70 48 61 73 68 20 73 PCache1.apHash s
15436 74 72 75 63 74 75 72 65 29 20 74 68 61 74 20 69 tructure) that i
15437 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 t is currently s
15438 74 6f 72 65 64 20 69 6e 2e 0d 0a 2a 2a 0d 0a 2a tored in...**..*
15439 2a 20 54 68 65 20 50 47 72 6f 75 70 20 6d 75 74 * The PGroup mut
1543a 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 ex must be held
1543b 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 when this functi
1543c 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0d 0a 2a on is called...*
1543d 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 /..static void p
1543e 63 61 63 68 65 31 52 65 6d 6f 76 65 46 72 6f 6d cache1RemoveFrom
1543f 48 61 73 68 28 50 67 48 64 72 31 20 2a 70 50 61 Hash(PgHdr1 *pPa
15440 67 65 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 ge){.. unsigned
15441 20 69 6e 74 20 68 3b 0d 0a 20 20 50 43 61 63 68 int h;.. PCach
15442 65 31 20 2a 70 43 61 63 68 65 20 3d 20 70 50 61 e1 *pCache = pPa
15443 67 65 2d 3e 70 43 61 63 68 65 3b 0d 0a 20 20 50 ge->pCache;.. P
15444 67 48 64 72 31 20 2a 2a 70 70 3b 0d 0a 0d 0a 20 gHdr1 **pp;....
15445 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
15446 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 61 63 _mutex_held(pCac
15447 68 65 2d 3e 70 47 72 6f 75 70 2d 3e 6d 75 74 65 he->pGroup->mute
15448 78 29 20 29 3b 0d 0a 20 20 68 20 3d 20 70 50 61 x) );.. h = pPa
15449 67 65 2d 3e 69 4b 65 79 20 25 20 70 43 61 63 68 ge->iKey % pCach
1544a 65 2d 3e 6e 48 61 73 68 3b 0d 0a 20 20 66 6f 72 e->nHash;.. for
1544b 28 70 70 3d 26 70 43 61 63 68 65 2d 3e 61 70 48 (pp=&pCache->apH
1544c 61 73 68 5b 68 5d 3b 20 28 2a 70 70 29 21 3d 70 ash[h]; (*pp)!=p
1544d 50 61 67 65 3b 20 70 70 3d 26 28 2a 70 70 29 2d Page; pp=&(*pp)-
1544e 3e 70 4e 65 78 74 29 3b 0d 0a 20 20 2a 70 70 20 >pNext);.. *pp
1544f 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0d = (*pp)->pNext;.
15450 0a 0d 0a 20 20 70 43 61 63 68 65 2d 3e 6e 50 61 ... pCache->nPa
15451 67 65 2d 2d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a ge--;..}..../*..
15452 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 ** If there are
15453 63 75 72 72 65 6e 74 6c 79 20 6d 6f 72 65 20 74 currently more t
15454 68 61 6e 20 6e 4d 61 78 50 61 67 65 20 70 61 67 han nMaxPage pag
15455 65 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 72 es allocated, tr
15456 79 0d 0a 2a 2a 20 74 6f 20 72 65 63 79 63 6c 65 y..** to recycle
15457 20 70 61 67 65 73 20 74 6f 20 72 65 64 75 63 65 pages to reduce
15458 20 74 68 65 20 6e 75 6d 62 65 72 20 61 6c 6c 6f the number allo
15459 63 61 74 65 64 20 74 6f 20 6e 4d 61 78 50 61 67 cated to nMaxPag
1545a 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 e...*/..static v
1545b 6f 69 64 20 70 63 61 63 68 65 31 45 6e 66 6f 72 oid pcache1Enfor
1545c 63 65 4d 61 78 50 61 67 65 28 50 47 72 6f 75 70 ceMaxPage(PGroup
1545d 20 2a 70 47 72 6f 75 70 29 7b 0d 0a 20 20 61 73 *pGroup){.. as
1545e 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
1545f 74 65 78 5f 68 65 6c 64 28 70 47 72 6f 75 70 2d tex_held(pGroup-
15460 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 77 68 >mutex) );.. wh
15461 69 6c 65 28 20 70 47 72 6f 75 70 2d 3e 6e 43 75 ile( pGroup->nCu
15462 72 72 65 6e 74 50 61 67 65 3e 70 47 72 6f 75 70 rrentPage>pGroup
15463 2d 3e 6e 4d 61 78 50 61 67 65 20 26 26 20 70 47 ->nMaxPage && pG
15464 72 6f 75 70 2d 3e 70 4c 72 75 54 61 69 6c 20 29 roup->pLruTail )
15465 7b 0d 0a 20 20 20 20 50 67 48 64 72 31 20 2a 70 {.. PgHdr1 *p
15466 20 3d 20 70 47 72 6f 75 70 2d 3e 70 4c 72 75 54 = pGroup->pLruT
15467 61 69 6c 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 ail;.. assert
15468 28 20 70 2d 3e 70 43 61 63 68 65 2d 3e 70 47 72 ( p->pCache->pGr
15469 6f 75 70 3d 3d 70 47 72 6f 75 70 20 29 3b 0d 0a oup==pGroup );..
1546a 20 20 20 20 70 63 61 63 68 65 31 50 69 6e 50 61 pcache1PinPa
1546b 67 65 28 70 29 3b 0d 0a 20 20 20 20 70 63 61 63 ge(p);.. pcac
1546c 68 65 31 52 65 6d 6f 76 65 46 72 6f 6d 48 61 73 he1RemoveFromHas
1546d 68 28 70 29 3b 0d 0a 20 20 20 20 70 63 61 63 68 h(p);.. pcach
1546e 65 31 46 72 65 65 50 61 67 65 28 70 29 3b 0d 0a e1FreePage(p);..
1546f 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
15470 20 44 69 73 63 61 72 64 20 61 6c 6c 20 70 61 67 Discard all pag
15471 65 73 20 66 72 6f 6d 20 63 61 63 68 65 20 70 43 es from cache pC
15472 61 63 68 65 20 77 69 74 68 20 61 20 70 61 67 65 ache with a page
15473 20 6e 75 6d 62 65 72 20 28 6b 65 79 20 76 61 6c number (key val
15474 75 65 29 20 0d 0a 2a 2a 20 67 72 65 61 74 65 72 ue) ..** greater
15475 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 than or equal t
15476 6f 20 69 4c 69 6d 69 74 2e 20 41 6e 79 20 70 69 o iLimit. Any pi
15477 6e 6e 65 64 20 70 61 67 65 73 20 74 68 61 74 20 nned pages that
15478 6d 65 65 74 20 74 68 69 73 20 0d 0a 2a 2a 20 63 meet this ..** c
15479 72 69 74 65 72 69 61 20 61 72 65 20 75 6e 70 69 riteria are unpi
1547a 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 79 nned before they
1547b 20 61 72 65 20 64 69 73 63 61 72 64 65 64 2e 0d are discarded..
1547c 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 50 43 61 63 .**..** The PCac
1547d 68 65 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 he mutex must be
1547e 20 68 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20 held when this
1547f 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
15480 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ed...*/..static
15481 76 6f 69 64 20 70 63 61 63 68 65 31 54 72 75 6e void pcache1Trun
15482 63 61 74 65 55 6e 73 61 66 65 28 0d 0a 20 20 50 cateUnsafe(.. P
15483 43 61 63 68 65 31 20 2a 70 43 61 63 68 65 2c 20 Cache1 *pCache,
15484 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
15485 68 65 20 63 61 63 68 65 20 74 6f 20 74 72 75 6e he cache to trun
15486 63 61 74 65 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 cate */.. unsig
15487 6e 65 64 20 69 6e 74 20 69 4c 69 6d 69 74 20 20 ned int iLimit
15488 20 20 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 /* Drop
15489 70 61 67 65 73 20 77 69 74 68 20 74 68 69 73 20 pages with this
1548a 70 67 6e 6f 20 6f 72 20 6c 61 72 67 65 72 20 2a pgno or larger *
1548b 2f 0d 0a 29 7b 0d 0a 20 20 54 45 53 54 4f 4e 4c /..){.. TESTONL
1548c 59 28 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 Y( unsigned int
1548d 6e 50 61 67 65 20 3d 20 30 3b 20 29 20 20 2f 2a nPage = 0; ) /*
1548e 20 54 6f 20 61 73 73 65 72 74 20 70 43 61 63 68 To assert pCach
1548f 65 2d 3e 6e 50 61 67 65 20 69 73 20 63 6f 72 72 e->nPage is corr
15490 65 63 74 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e ect */.. unsign
15491 65 64 20 69 6e 74 20 68 3b 0d 0a 20 20 61 73 73 ed int h;.. ass
15492 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
15493 65 78 5f 68 65 6c 64 28 70 43 61 63 68 65 2d 3e ex_held(pCache->
15494 70 47 72 6f 75 70 2d 3e 6d 75 74 65 78 29 20 29 pGroup->mutex) )
15495 3b 0d 0a 20 20 66 6f 72 28 68 3d 30 3b 20 68 3c ;.. for(h=0; h<
15496 70 43 61 63 68 65 2d 3e 6e 48 61 73 68 3b 20 68 pCache->nHash; h
15497 2b 2b 29 7b 0d 0a 20 20 20 20 50 67 48 64 72 31 ++){.. PgHdr1
15498 20 2a 2a 70 70 20 3d 20 26 70 43 61 63 68 65 2d **pp = &pCache-
15499 3e 61 70 48 61 73 68 5b 68 5d 3b 20 0d 0a 20 20 >apHash[h]; ..
1549a 20 20 50 67 48 64 72 31 20 2a 70 50 61 67 65 3b PgHdr1 *pPage;
1549b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 50 .. while( (pP
1549c 61 67 65 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b age = *pp)!=0 ){
1549d 0d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 .. if( pPag
1549e 65 2d 3e 69 4b 65 79 3e 3d 69 4c 69 6d 69 74 20 e->iKey>=iLimit
1549f 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 43 61 63 ){.. pCac
154a0 68 65 2d 3e 6e 50 61 67 65 2d 2d 3b 0d 0a 20 20 he->nPage--;..
154a1 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 61 67 *pp = pPag
154a2 65 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 e->pNext;..
154a3 20 20 20 70 63 61 63 68 65 31 50 69 6e 50 61 67 pcache1PinPag
154a4 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 e(pPage);..
154a5 20 20 20 70 63 61 63 68 65 31 46 72 65 65 50 61 pcache1FreePa
154a6 67 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 ge(pPage);..
154a7 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
154a8 20 20 70 70 20 3d 20 26 70 50 61 67 65 2d 3e 70 pp = &pPage->p
154a9 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 54 Next;.. T
154aa 45 53 54 4f 4e 4c 59 28 20 6e 50 61 67 65 2b 2b ESTONLY( nPage++
154ab 3b 20 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 ; ).. }..
154ac 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 }.. }.. asse
154ad 72 74 28 20 70 43 61 63 68 65 2d 3e 6e 50 61 67 rt( pCache->nPag
154ae 65 3d 3d 6e 50 61 67 65 20 29 3b 0d 0a 7d 0d 0a e==nPage );..}..
154af 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b4 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 */../******** sq
154b5 6c 69 74 65 33 5f 70 63 61 63 68 65 20 4d 65 74 lite3_pcache Met
154b6 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a hods ***********
154b7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
154b9 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ***/..../*..** I
154ba 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
154bb 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 the sqlite3_pca
154bc 63 68 65 2e 78 49 6e 69 74 20 6d 65 74 68 6f 64 che.xInit method
154bd 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
154be 74 20 70 63 61 63 68 65 31 49 6e 69 74 28 76 6f t pcache1Init(vo
154bf 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0d 0a 20 id *NotUsed){..
154c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
154c1 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 61 R(NotUsed);.. a
154c2 73 73 65 72 74 28 20 70 63 61 63 68 65 31 2e 69 ssert( pcache1.i
154c3 73 49 6e 69 74 3d 3d 30 20 29 3b 0d 0a 20 20 6d sInit==0 );.. m
154c4 65 6d 73 65 74 28 26 70 63 61 63 68 65 31 2c 20 emset(&pcache1,
154c5 30 2c 20 73 69 7a 65 6f 66 28 70 63 61 63 68 65 0, sizeof(pcache
154c6 31 29 29 3b 0d 0a 20 20 69 66 28 20 73 71 6c 69 1));.. if( sqli
154c7 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
154c8 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0d 0a 20 bCoreMutex ){..
154c9 20 20 20 70 63 61 63 68 65 31 2e 67 72 70 2e 6d pcache1.grp.m
154ca 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d utex = sqlite3_m
154cb 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 utex_alloc(SQLIT
154cc 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c E_MUTEX_STATIC_L
154cd 52 55 29 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 RU);.. pcache
154ce 31 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 1.mutex = sqlite
154cf 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 3_mutex_alloc(SQ
154d0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 LITE_MUTEX_STATI
154d1 43 5f 50 4d 45 4d 29 3b 0d 0a 20 20 7d 0d 0a 20 C_PMEM);.. }..
154d2 20 70 63 61 63 68 65 31 2e 67 72 70 2e 6d 78 50 pcache1.grp.mxP
154d3 69 6e 6e 65 64 20 3d 20 31 30 3b 0d 0a 20 20 70 inned = 10;.. p
154d4 63 61 63 68 65 31 2e 69 73 49 6e 69 74 20 3d 20 cache1.isInit =
154d5 31 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 1;.. return SQL
154d6 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
154d7 0d 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 ..** Implementat
154d8 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 ion of the sqlit
154d9 65 33 5f 70 63 61 63 68 65 2e 78 53 68 75 74 64 e3_pcache.xShutd
154da 6f 77 6e 20 6d 65 74 68 6f 64 2e 0d 0a 2a 2a 20 own method...**
154db 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 Note that the st
154dc 61 74 69 63 20 6d 75 74 65 78 20 61 6c 6c 6f 63 atic mutex alloc
154dd 61 74 65 64 20 69 6e 20 78 49 6e 69 74 20 64 6f ated in xInit do
154de 65 73 20 0d 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 es ..** not need
154df 20 74 6f 20 62 65 20 66 72 65 65 64 2e 0d 0a 2a to be freed...*
154e0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 /..static void p
154e1 63 61 63 68 65 31 53 68 75 74 64 6f 77 6e 28 76 cache1Shutdown(v
154e2 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0d 0a oid *NotUsed){..
154e3 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
154e4 45 52 28 4e 6f 74 55 73 65 64 29 3b 0d 0a 20 20 ER(NotUsed);..
154e5 61 73 73 65 72 74 28 20 70 63 61 63 68 65 31 2e assert( pcache1.
154e6 69 73 49 6e 69 74 21 3d 30 20 29 3b 0d 0a 20 20 isInit!=0 );..
154e7 6d 65 6d 73 65 74 28 26 70 63 61 63 68 65 31 2c memset(&pcache1,
154e8 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 61 63 68 0, sizeof(pcach
154e9 65 31 29 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a e1));..}..../*..
154ea 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ** Implementatio
154eb 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 n of the sqlite3
154ec 5f 70 63 61 63 68 65 2e 78 43 72 65 61 74 65 20 _pcache.xCreate
154ed 6d 65 74 68 6f 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 method...**..**
154ee 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 63 Allocate a new c
154ef 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ache...*/..stati
154f0 63 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 c sqlite3_pcache
154f1 20 2a 70 63 61 63 68 65 31 43 72 65 61 74 65 28 *pcache1Create(
154f2 69 6e 74 20 73 7a 50 61 67 65 2c 20 69 6e 74 20 int szPage, int
154f3 73 7a 45 78 74 72 61 2c 20 69 6e 74 20 62 50 75 szExtra, int bPu
154f4 72 67 65 61 62 6c 65 29 7b 0d 0a 20 20 50 43 61 rgeable){.. PCa
154f5 63 68 65 31 20 2a 70 43 61 63 68 65 3b 20 20 20 che1 *pCache;
154f6 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 6c 79 20 /* The newly
154f7 63 72 65 61 74 65 64 20 70 61 67 65 20 63 61 63 created page cac
154f8 68 65 20 2a 2f 0d 0a 20 20 50 47 72 6f 75 70 20 he */.. PGroup
154f9 2a 70 47 72 6f 75 70 3b 20 20 20 20 20 20 20 2f *pGroup; /
154fa 2a 20 54 68 65 20 67 72 6f 75 70 20 74 68 65 20 * The group the
154fb 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 77 new page cache w
154fc 69 6c 6c 20 62 65 6c 6f 6e 67 20 74 6f 20 2a 2f ill belong to */
154fd 0d 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 .. int sz;
154fe 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 /* Byt
154ff 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 es of memory req
15500 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 uired to allocat
15501 65 20 74 68 65 20 6e 65 77 20 63 61 63 68 65 20 e the new cache
15502 2a 2f 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a */.... /*.. **
15503 20 54 68 65 20 73 65 70 65 72 61 74 65 43 61 63 The seperateCac
15504 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 he variable is t
15505 72 75 65 20 69 66 20 65 61 63 68 20 50 43 61 63 rue if each PCac
15506 68 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20 70 he has its own p
15507 72 69 76 61 74 65 0d 0a 20 20 2a 2a 20 50 47 72 rivate.. ** PGr
15508 6f 75 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 oup. In other w
15509 6f 72 64 73 2c 20 73 65 70 61 72 61 74 65 43 61 ords, separateCa
1550a 63 68 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 che is true for
1550b 6d 6f 64 65 20 28 31 29 20 77 68 65 72 65 20 6e mode (1) where n
1550c 6f 0d 0a 20 20 2a 2a 20 6d 75 74 65 78 69 6e 67 o.. ** mutexing
1550d 20 69 73 20 72 65 71 75 69 72 65 64 2e 0d 0a 20 is required...
1550e 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 2a 20 20 41 **.. ** * A
1550f 6c 77 61 79 73 20 75 73 65 20 61 20 75 6e 69 66 lways use a unif
15510 69 65 64 20 63 61 63 68 65 20 28 6d 6f 64 65 2d ied cache (mode-
15511 32 29 20 69 66 20 45 4e 41 42 4c 45 5f 4d 45 4d 2) if ENABLE_MEM
15512 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0d 0a ORY_MANAGEMENT..
15513 20 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 2a 20 20 **.. ** *
15514 41 6c 77 61 79 73 20 75 73 65 20 61 20 75 6e 69 Always use a uni
15515 66 69 65 64 20 63 61 63 68 65 20 69 6e 20 73 69 fied cache in si
15516 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 61 70 ngle-threaded ap
15517 70 6c 69 63 61 74 69 6f 6e 73 0d 0a 20 20 2a 2a plications.. **
15518 0d 0a 20 20 2a 2a 20 20 20 2a 20 20 4f 74 68 65 .. ** * Othe
15519 72 77 69 73 65 20 28 69 66 20 6d 75 6c 74 69 2d rwise (if multi-
1551a 74 68 72 65 61 64 65 64 20 61 6e 64 20 45 4e 41 threaded and ENA
1551b 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 BLE_MEMORY_MANAG
1551c 45 4d 45 4e 54 20 69 73 20 6f 66 66 29 0d 0a 20 EMENT is off)..
1551d 20 2a 2a 20 20 20 20 20 20 75 73 65 20 73 65 70 ** use sep
1551e 61 72 61 74 65 20 63 61 63 68 65 73 20 28 6d 6f arate caches (mo
1551f 64 65 2d 31 29 0d 0a 20 20 2a 2f 0d 0a 23 69 66 de-1).. */..#if
15520 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
15521 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 ENABLE_MEMORY_MA
15522 4e 41 47 45 4d 45 4e 54 29 20 7c 7c 20 53 51 4c NAGEMENT) || SQL
15523 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d ITE_THREADSAFE==
15524 30 0d 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 0.. const int s
15525 65 70 61 72 61 74 65 43 61 63 68 65 20 3d 20 30 eparateCache = 0
15526 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 6e 74 20 ;..#else.. int
15527 73 65 70 61 72 61 74 65 43 61 63 68 65 20 3d 20 separateCache =
15528 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
15529 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3e 30 fig.bCoreMutex>0
1552a 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 61 ;..#endif.... a
1552b 73 73 65 72 74 28 20 28 73 7a 50 61 67 65 20 26 ssert( (szPage &
1552c 20 28 73 7a 50 61 67 65 2d 31 29 29 3d 3d 30 20 (szPage-1))==0
1552d 26 26 20 73 7a 50 61 67 65 3e 3d 35 31 32 20 26 && szPage>=512 &
1552e 26 20 73 7a 50 61 67 65 3c 3d 36 35 35 33 36 20 & szPage<=65536
1552f 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 7a );.. assert( sz
15530 45 78 74 72 61 20 3c 20 33 30 30 20 29 3b 0d 0a Extra < 300 );..
15531 0d 0a 20 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 .. sz = sizeof(
15532 50 43 61 63 68 65 31 29 20 2b 20 73 69 7a 65 6f PCache1) + sizeo
15533 66 28 50 47 72 6f 75 70 29 2a 73 65 70 61 72 61 f(PGroup)*separa
15534 74 65 43 61 63 68 65 3b 0d 0a 20 20 70 43 61 63 teCache;.. pCac
15535 68 65 20 3d 20 28 50 43 61 63 68 65 31 20 2a 29 he = (PCache1 *)
15536 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 sqlite3_malloc(s
15537 7a 29 3b 0d 0a 20 20 69 66 28 20 70 43 61 63 68 z);.. if( pCach
15538 65 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 e ){.. memset
15539 28 70 43 61 63 68 65 2c 20 30 2c 20 73 7a 29 3b (pCache, 0, sz);
1553a 0d 0a 20 20 20 20 69 66 28 20 73 65 70 61 72 61 .. if( separa
1553b 74 65 43 61 63 68 65 20 29 7b 0d 0a 20 20 20 20 teCache ){..
1553c 20 20 70 47 72 6f 75 70 20 3d 20 28 50 47 72 6f pGroup = (PGro
1553d 75 70 2a 29 26 70 43 61 63 68 65 5b 31 5d 3b 0d up*)&pCache[1];.
1553e 0a 20 20 20 20 20 20 70 47 72 6f 75 70 2d 3e 6d . pGroup->m
1553f 78 50 69 6e 6e 65 64 20 3d 20 31 30 3b 0d 0a 20 xPinned = 10;..
15540 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
15541 20 70 47 72 6f 75 70 20 3d 20 26 70 63 61 63 68 pGroup = &pcach
15542 65 31 2e 67 72 70 3b 0d 0a 20 20 20 20 7d 0d 0a e1.grp;.. }..
15543 20 20 20 20 70 43 61 63 68 65 2d 3e 70 47 72 6f pCache->pGro
15544 75 70 20 3d 20 70 47 72 6f 75 70 3b 0d 0a 20 20 up = pGroup;..
15545 20 20 70 43 61 63 68 65 2d 3e 73 7a 50 61 67 65 pCache->szPage
15546 20 3d 20 73 7a 50 61 67 65 3b 0d 0a 20 20 20 20 = szPage;..
15547 70 43 61 63 68 65 2d 3e 73 7a 45 78 74 72 61 20 pCache->szExtra
15548 3d 20 73 7a 45 78 74 72 61 3b 0d 0a 20 20 20 20 = szExtra;..
15549 70 43 61 63 68 65 2d 3e 62 50 75 72 67 65 61 62 pCache->bPurgeab
1554a 6c 65 20 3d 20 28 62 50 75 72 67 65 61 62 6c 65 le = (bPurgeable
1554b 20 3f 20 31 20 3a 20 30 29 3b 0d 0a 20 20 20 20 ? 1 : 0);..
1554c 69 66 28 20 62 50 75 72 67 65 61 62 6c 65 20 29 if( bPurgeable )
1554d 7b 0d 0a 20 20 20 20 20 20 70 43 61 63 68 65 2d {.. pCache-
1554e 3e 6e 4d 69 6e 20 3d 20 31 30 3b 0d 0a 20 20 20 >nMin = 10;..
1554f 20 20 20 70 63 61 63 68 65 31 45 6e 74 65 72 4d pcache1EnterM
15550 75 74 65 78 28 70 47 72 6f 75 70 29 3b 0d 0a 20 utex(pGroup);..
15551 20 20 20 20 20 70 47 72 6f 75 70 2d 3e 6e 4d 69 pGroup->nMi
15552 6e 50 61 67 65 20 2b 3d 20 70 43 61 63 68 65 2d nPage += pCache-
15553 3e 6e 4d 69 6e 3b 0d 0a 20 20 20 20 20 20 70 47 >nMin;.. pG
15554 72 6f 75 70 2d 3e 6d 78 50 69 6e 6e 65 64 20 3d roup->mxPinned =
15555 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 61 67 pGroup->nMaxPag
15556 65 20 2b 20 31 30 20 2d 20 70 47 72 6f 75 70 2d e + 10 - pGroup-
15557 3e 6e 4d 69 6e 50 61 67 65 3b 0d 0a 20 20 20 20 >nMinPage;..
15558 20 20 70 63 61 63 68 65 31 4c 65 61 76 65 4d 75 pcache1LeaveMu
15559 74 65 78 28 70 47 72 6f 75 70 29 3b 0d 0a 20 20 tex(pGroup);..
1555a 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
1555b 72 6e 20 28 73 71 6c 69 74 65 33 5f 70 63 61 63 rn (sqlite3_pcac
1555c 68 65 20 2a 29 70 43 61 63 68 65 3b 0d 0a 7d 0d he *)pCache;..}.
1555d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d .../*..** Implem
1555e 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
1555f 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 2e 78 sqlite3_pcache.x
15560 43 61 63 68 65 73 69 7a 65 20 6d 65 74 68 6f 64 Cachesize method
15561 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 43 6f 6e 66 69 . ..**..** Confi
15562 67 75 72 65 20 74 68 65 20 63 61 63 68 65 5f 73 gure the cache_s
15563 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 61 20 ize limit for a
15564 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 cache...*/..stat
15565 69 63 20 76 6f 69 64 20 70 63 61 63 68 65 31 43 ic void pcache1C
15566 61 63 68 65 73 69 7a 65 28 73 71 6c 69 74 65 33 achesize(sqlite3
15567 5f 70 63 61 63 68 65 20 2a 70 2c 20 69 6e 74 20 _pcache *p, int
15568 6e 4d 61 78 29 7b 0d 0a 20 20 50 43 61 63 68 65 nMax){.. PCache
15569 31 20 2a 70 43 61 63 68 65 20 3d 20 28 50 43 61 1 *pCache = (PCa
1556a 63 68 65 31 20 2a 29 70 3b 0d 0a 20 20 69 66 28 che1 *)p;.. if(
1556b 20 70 43 61 63 68 65 2d 3e 62 50 75 72 67 65 61 pCache->bPurgea
1556c 62 6c 65 20 29 7b 0d 0a 20 20 20 20 50 47 72 6f ble ){.. PGro
1556d 75 70 20 2a 70 47 72 6f 75 70 20 3d 20 70 43 61 up *pGroup = pCa
1556e 63 68 65 2d 3e 70 47 72 6f 75 70 3b 0d 0a 20 20 che->pGroup;..
1556f 20 20 70 63 61 63 68 65 31 45 6e 74 65 72 4d 75 pcache1EnterMu
15570 74 65 78 28 70 47 72 6f 75 70 29 3b 0d 0a 20 20 tex(pGroup);..
15571 20 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 61 pGroup->nMaxPa
15572 67 65 20 2b 3d 20 28 6e 4d 61 78 20 2d 20 70 43 ge += (nMax - pC
15573 61 63 68 65 2d 3e 6e 4d 61 78 29 3b 0d 0a 20 20 ache->nMax);..
15574 20 20 70 47 72 6f 75 70 2d 3e 6d 78 50 69 6e 6e pGroup->mxPinn
15575 65 64 20 3d 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 ed = pGroup->nMa
15576 78 50 61 67 65 20 2b 20 31 30 20 2d 20 70 47 72 xPage + 10 - pGr
15577 6f 75 70 2d 3e 6e 4d 69 6e 50 61 67 65 3b 0d 0a oup->nMinPage;..
15578 20 20 20 20 70 43 61 63 68 65 2d 3e 6e 4d 61 78 pCache->nMax
15579 20 3d 20 6e 4d 61 78 3b 0d 0a 20 20 20 20 70 43 = nMax;.. pC
1557a 61 63 68 65 2d 3e 6e 39 30 70 63 74 20 3d 20 70 ache->n90pct = p
1557b 43 61 63 68 65 2d 3e 6e 4d 61 78 2a 39 2f 31 30 Cache->nMax*9/10
1557c 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 45 6e ;.. pcache1En
1557d 66 6f 72 63 65 4d 61 78 50 61 67 65 28 70 47 72 forceMaxPage(pGr
1557e 6f 75 70 29 3b 0d 0a 20 20 20 20 70 63 61 63 68 oup);.. pcach
1557f 65 31 4c 65 61 76 65 4d 75 74 65 78 28 70 47 72 e1LeaveMutex(pGr
15580 6f 75 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d oup);.. }..}...
15581 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e ./*..** Implemen
15582 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 tation of the sq
15583 6c 69 74 65 33 5f 70 63 61 63 68 65 2e 78 53 68 lite3_pcache.xSh
15584 72 69 6e 6b 20 6d 65 74 68 6f 64 2e 20 0d 0a 2a rink method. ..*
15585 2a 0d 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 *..** Free up as
15586 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 much memory as
15587 70 6f 73 73 69 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 possible...*/..s
15588 74 61 74 69 63 20 76 6f 69 64 20 70 63 61 63 68 tatic void pcach
15589 65 31 53 68 72 69 6e 6b 28 73 71 6c 69 74 65 33 e1Shrink(sqlite3
1558a 5f 70 63 61 63 68 65 20 2a 70 29 7b 0d 0a 20 20 _pcache *p){..
1558b 50 43 61 63 68 65 31 20 2a 70 43 61 63 68 65 20 PCache1 *pCache
1558c 3d 20 28 50 43 61 63 68 65 31 2a 29 70 3b 0d 0a = (PCache1*)p;..
1558d 20 20 69 66 28 20 70 43 61 63 68 65 2d 3e 62 50 if( pCache->bP
1558e 75 72 67 65 61 62 6c 65 20 29 7b 0d 0a 20 20 20 urgeable ){..
1558f 20 50 47 72 6f 75 70 20 2a 70 47 72 6f 75 70 20 PGroup *pGroup
15590 3d 20 70 43 61 63 68 65 2d 3e 70 47 72 6f 75 70 = pCache->pGroup
15591 3b 0d 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 ;.. int saved
15592 4d 61 78 50 61 67 65 3b 0d 0a 20 20 20 20 70 63 MaxPage;.. pc
15593 61 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 ache1EnterMutex(
15594 70 47 72 6f 75 70 29 3b 0d 0a 20 20 20 20 73 61 pGroup);.. sa
15595 76 65 64 4d 61 78 50 61 67 65 20 3d 20 70 47 72 vedMaxPage = pGr
15596 6f 75 70 2d 3e 6e 4d 61 78 50 61 67 65 3b 0d 0a oup->nMaxPage;..
15597 20 20 20 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 pGroup->nMax
15598 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 20 20 70 Page = 0;.. p
15599 63 61 63 68 65 31 45 6e 66 6f 72 63 65 4d 61 78 cache1EnforceMax
1559a 50 61 67 65 28 70 47 72 6f 75 70 29 3b 0d 0a 20 Page(pGroup);..
1559b 20 20 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 pGroup->nMaxP
1559c 61 67 65 20 3d 20 73 61 76 65 64 4d 61 78 50 61 age = savedMaxPa
1559d 67 65 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 ge;.. pcache1
1559e 4c 65 61 76 65 4d 75 74 65 78 28 70 47 72 6f 75 LeaveMutex(pGrou
1559f 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f p);.. }..}..../
155a0 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 *..** Implementa
155a1 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 tion of the sqli
155a2 74 65 33 5f 70 63 61 63 68 65 2e 78 50 61 67 65 te3_pcache.xPage
155a3 63 6f 75 6e 74 20 6d 65 74 68 6f 64 2e 20 0d 0a count method. ..
155a4 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 */..static int p
155a5 63 61 63 68 65 31 50 61 67 65 63 6f 75 6e 74 28 cache1Pagecount(
155a6 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a sqlite3_pcache *
155a7 70 29 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 20 p){.. int n;..
155a8 20 50 43 61 63 68 65 31 20 2a 70 43 61 63 68 65 PCache1 *pCache
155a9 20 3d 20 28 50 43 61 63 68 65 31 2a 29 70 3b 0d = (PCache1*)p;.
155aa 0a 20 20 70 63 61 63 68 65 31 45 6e 74 65 72 4d . pcache1EnterM
155ab 75 74 65 78 28 70 43 61 63 68 65 2d 3e 70 47 72 utex(pCache->pGr
155ac 6f 75 70 29 3b 0d 0a 20 20 6e 20 3d 20 70 43 61 oup);.. n = pCa
155ad 63 68 65 2d 3e 6e 50 61 67 65 3b 0d 0a 20 20 70 che->nPage;.. p
155ae 63 61 63 68 65 31 4c 65 61 76 65 4d 75 74 65 78 cache1LeaveMutex
155af 28 70 43 61 63 68 65 2d 3e 70 47 72 6f 75 70 29 (pCache->pGroup)
155b0 3b 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a ;.. return n;..
155b1 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c }..../*..** Impl
155b2 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 ementation of th
155b3 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 e sqlite3_pcache
155b4 2e 78 46 65 74 63 68 20 6d 65 74 68 6f 64 2e 20 .xFetch method.
155b5 0d 0a 2a 2a 0d 0a 2a 2a 20 46 65 74 63 68 20 61 ..**..** Fetch a
155b6 20 70 61 67 65 20 62 79 20 6b 65 79 20 76 61 6c page by key val
155b7 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 74 ue...**..** Whet
155b8 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6e 65 77 her or not a new
155b9 20 70 61 67 65 20 6d 61 79 20 62 65 20 61 6c 6c page may be all
155ba 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 ocated by this f
155bb 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 73 20 unction depends
155bc 6f 6e 0d 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 on..** the value
155bd 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 46 6c of the createFl
155be 61 67 20 61 72 67 75 6d 65 6e 74 2e 20 20 30 20 ag argument. 0
155bf 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 61 6c 6c means do not all
155c0 6f 63 61 74 65 20 61 20 6e 65 77 0d 0a 2a 2a 20 ocate a new..**
155c1 70 61 67 65 2e 20 20 31 20 6d 65 61 6e 73 20 61 page. 1 means a
155c2 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 llocate a new pa
155c3 67 65 20 69 66 20 73 70 61 63 65 20 69 73 20 65 ge if space is e
155c4 61 73 69 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e asily available.
155c5 20 20 32 20 0d 0a 2a 2a 20 6d 65 61 6e 73 20 74 2 ..** means t
155c6 6f 20 74 72 79 20 72 65 61 6c 6c 79 20 68 61 72 o try really har
155c7 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 d to allocate a
155c8 6e 65 77 20 70 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a new page...**..*
155c9 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d 70 75 72 67 * For a non-purg
155ca 65 61 62 6c 65 20 63 61 63 68 65 20 28 61 20 63 eable cache (a c
155cb 61 63 68 65 20 75 73 65 64 20 61 73 20 74 68 65 ache used as the
155cc 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 storage for an
155cd 69 6e 2d 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 64 61 in-memory..** da
155ce 74 61 62 61 73 65 29 20 74 68 65 72 65 20 69 73 tabase) there is
155cf 20 72 65 61 6c 6c 79 20 6e 6f 20 64 69 66 66 65 really no diffe
155d0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 63 72 rence between cr
155d1 65 61 74 65 46 6c 61 67 20 31 20 61 6e 64 20 32 eateFlag 1 and 2
155d2 2e 20 20 53 6f 0d 0a 2a 2a 20 74 68 65 20 63 61 . So..** the ca
155d3 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 28 lling function (
155d4 70 63 61 63 68 65 2e 63 29 20 77 69 6c 6c 20 6e pcache.c) will n
155d5 65 76 65 72 20 68 61 76 65 20 61 20 63 72 65 61 ever have a crea
155d6 74 65 46 6c 61 67 20 6f 66 20 31 20 6f 6e 0d 0a teFlag of 1 on..
155d7 2a 2a 20 61 20 6e 6f 6e 2d 70 75 72 67 65 61 62 ** a non-purgeab
155d8 6c 65 20 63 61 63 68 65 2e 0d 0a 2a 2a 0d 0a 2a le cache...**..*
155d9 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 * There are thre
155da 65 20 64 69 66 66 65 72 65 6e 74 20 61 70 70 72 e different appr
155db 6f 61 63 68 65 73 20 74 6f 20 6f 62 74 61 69 6e oaches to obtain
155dc 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 61 20 ing space for a
155dd 70 61 67 65 2c 0d 0a 2a 2a 20 64 65 70 65 6e 64 page,..** depend
155de 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 ing on the value
155df 20 6f 66 20 70 61 72 61 6d 65 74 65 72 20 63 72 of parameter cr
155e0 65 61 74 65 46 6c 61 67 20 28 77 68 69 63 68 20 eateFlag (which
155e1 6d 61 79 20 62 65 20 30 2c 20 31 20 6f 72 20 32 may be 0, 1 or 2
155e2 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 31 2e 20 )...**..** 1.
155e3 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 Regardless of th
155e4 65 20 76 61 6c 75 65 20 6f 66 20 63 72 65 61 74 e value of creat
155e5 65 46 6c 61 67 2c 20 74 68 65 20 63 61 63 68 65 eFlag, the cache
155e6 20 69 73 20 73 65 61 72 63 68 65 64 20 66 6f 72 is searched for
155e7 20 61 20 0d 0a 2a 2a 20 20 20 20 20 20 63 6f 70 a ..** cop
155e8 79 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 y of the request
155e9 65 64 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 20 ed page. If one
155ea 69 73 20 66 6f 75 6e 64 2c 20 69 74 20 69 73 20 is found, it is
155eb 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a returned...**..*
155ec 2a 20 20 20 32 2e 20 49 66 20 63 72 65 61 74 65 * 2. If create
155ed 46 6c 61 67 3d 3d 30 20 61 6e 64 20 74 68 65 20 Flag==0 and the
155ee 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 page is not alre
155ef 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 ady in the cache
155f0 2c 20 4e 55 4c 4c 20 69 73 0d 0a 2a 2a 20 20 20 , NULL is..**
155f1 20 20 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a returned...**
155f2 0d 0a 2a 2a 20 20 20 33 2e 20 49 66 20 63 72 65 ..** 3. If cre
155f3 61 74 65 46 6c 61 67 20 69 73 20 31 2c 20 61 6e ateFlag is 1, an
155f4 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f d the page is no
155f5 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 t already in the
155f6 20 63 61 63 68 65 2c 20 74 68 65 6e 0d 0a 2a 2a cache, then..**
155f7 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c return NUL
155f8 4c 20 28 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 L (do not alloca
155f9 74 65 20 61 20 6e 65 77 20 70 61 67 65 29 20 69 te a new page) i
155fa 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c f any of the fol
155fb 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 lowing..**
155fc 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 74 conditions are t
155fd 72 75 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 rue:..**..**
155fe 20 20 20 28 61 29 20 74 68 65 20 6e 75 6d 62 65 (a) the numbe
155ff 72 20 6f 66 20 70 61 67 65 73 20 70 69 6e 6e 65 r of pages pinne
15600 64 20 62 79 20 74 68 65 20 63 61 63 68 65 20 69 d by the cache i
15601 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0d 0a s greater than..
15602 2a 2a 20 20 20 20 20 20 20 20 20 20 20 50 43 61 ** PCa
15603 63 68 65 31 2e 6e 4d 61 78 2c 20 6f 72 0d 0a 2a che1.nMax, or..*
15604 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 28 62 29 20 *..** (b)
15605 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 the number of pa
15606 67 65 73 20 70 69 6e 6e 65 64 20 62 79 20 74 68 ges pinned by th
15607 65 20 63 61 63 68 65 20 69 73 20 67 72 65 61 74 e cache is great
15608 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 20 20 20 20 er than..**
15609 20 20 20 20 20 20 74 68 65 20 73 75 6d 20 6f 66 the sum of
1560a 20 6e 4d 61 78 20 66 6f 72 20 61 6c 6c 20 70 75 nMax for all pu
1560b 72 67 65 61 62 6c 65 20 63 61 63 68 65 73 2c 20 rgeable caches,
1560c 6c 65 73 73 20 74 68 65 20 73 75 6d 20 6f 66 20 less the sum of
1560d 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6e ..** n
1560e 4d 69 6e 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 Min for all othe
1560f 72 20 70 75 72 67 65 61 62 6c 65 20 63 61 63 68 r purgeable cach
15610 65 73 2c 20 6f 72 0d 0a 2a 2a 0d 0a 2a 2a 20 20 es, or..**..**
15611 20 34 2e 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 4. If none of t
15612 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 63 he first three c
15613 6f 6e 64 69 74 69 6f 6e 73 20 61 70 70 6c 79 20 onditions apply
15614 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73 and the cache is
15615 20 6d 61 72 6b 65 64 0d 0a 2a 2a 20 20 20 20 20 marked..**
15616 20 61 73 20 70 75 72 67 65 61 62 6c 65 2c 20 61 as purgeable, a
15617 6e 64 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 nd if one of the
15618 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 following is tr
15619 75 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 ue:..**..**
1561a 20 20 28 61 29 20 54 68 65 20 6e 75 6d 62 65 72 (a) The number
1561b 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 of pages alloca
1561c 74 65 64 20 66 6f 72 20 74 68 65 20 63 61 63 68 ted for the cach
1561d 65 20 69 73 20 61 6c 72 65 61 64 79 20 0d 0a 2a e is already ..*
1561e 2a 20 20 20 20 20 20 20 20 20 20 20 50 43 61 63 * PCac
1561f 68 65 31 2e 6e 4d 61 78 2c 20 6f 72 0d 0a 2a 2a he1.nMax, or..**
15620 0d 0a 2a 2a 20 20 20 20 20 20 20 28 62 29 20 54 ..** (b) T
15621 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 he number of pag
15622 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 es allocated for
15623 20 61 6c 6c 20 70 75 72 67 65 61 62 6c 65 20 63 all purgeable c
15624 61 63 68 65 73 20 69 73 0d 0a 2a 2a 20 20 20 20 aches is..**
15625 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 65 already e
15626 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 qual to or great
15627 65 72 20 74 68 61 6e 20 74 68 65 20 73 75 6d 20 er than the sum
15628 6f 66 20 6e 4d 61 78 20 66 6f 72 20 61 6c 6c 0d of nMax for all.
15629 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 75 .** pu
1562a 72 67 65 61 62 6c 65 20 63 61 63 68 65 73 2c 0d rgeable caches,.
1562b 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 28 63 .**..** (c
1562c 29 20 54 68 65 20 73 79 73 74 65 6d 20 69 73 20 ) The system is
1562d 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72 65 under memory pre
1562e 73 73 75 72 65 20 61 6e 64 20 77 61 6e 74 73 20 ssure and wants
1562f 74 6f 20 61 76 6f 69 64 0d 0a 2a 2a 20 20 20 20 to avoid..**
15630 20 20 20 20 20 20 20 75 6e 6e 65 63 65 73 73 61 unnecessa
15631 72 79 20 70 61 67 65 73 20 63 61 63 68 65 20 65 ry pages cache e
15632 6e 74 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 ntry allocations
15633 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 74 68 ..**..** th
15634 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 en attempt to re
15635 63 79 63 6c 65 20 61 20 70 61 67 65 20 66 72 6f cycle a page fro
15636 6d 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 m the LRU list.
15637 49 66 20 69 74 20 69 73 20 74 68 65 20 72 69 67 If it is the rig
15638 68 74 0d 0a 2a 2a 20 20 20 20 20 20 73 69 7a 65 ht..** size
15639 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 63 , return the rec
1563a 79 63 6c 65 64 20 62 75 66 66 65 72 2e 20 4f 74 ycled buffer. Ot
1563b 68 65 72 77 69 73 65 2c 20 66 72 65 65 20 74 68 herwise, free th
1563c 65 20 62 75 66 66 65 72 20 61 6e 64 0d 0a 2a 2a e buffer and..**
1563d 20 20 20 20 20 20 70 72 6f 63 65 65 64 20 74 6f proceed to
1563e 20 73 74 65 70 20 35 2e 20 0d 0a 2a 2a 0d 0a 2a step 5. ..**..*
1563f 2a 20 20 20 35 2e 20 4f 74 68 65 72 77 69 73 65 * 5. Otherwise
15640 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 , allocate and r
15641 65 74 75 72 6e 20 61 20 6e 65 77 20 70 61 67 65 eturn a new page
15642 20 62 75 66 66 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 buffer...*/..st
15643 61 74 69 63 20 73 71 6c 69 74 65 33 5f 70 63 61 atic sqlite3_pca
15644 63 68 65 5f 70 61 67 65 20 2a 70 63 61 63 68 65 che_page *pcache
15645 31 46 65 74 63 68 28 0d 0a 20 20 73 71 6c 69 74 1Fetch(.. sqlit
15646 65 33 5f 70 63 61 63 68 65 20 2a 70 2c 20 0d 0a e3_pcache *p, ..
15647 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 unsigned int i
15648 4b 65 79 2c 20 0d 0a 20 20 69 6e 74 20 63 72 65 Key, .. int cre
15649 61 74 65 46 6c 61 67 0d 0a 29 7b 0d 0a 20 20 75 ateFlag..){.. u
1564a 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 50 69 6e nsigned int nPin
1564b 6e 65 64 3b 0d 0a 20 20 50 43 61 63 68 65 31 20 ned;.. PCache1
1564c 2a 70 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 *pCache = (PCach
1564d 65 31 20 2a 29 70 3b 0d 0a 20 20 50 47 72 6f 75 e1 *)p;.. PGrou
1564e 70 20 2a 70 47 72 6f 75 70 3b 0d 0a 20 20 50 67 p *pGroup;.. Pg
1564f 48 64 72 31 20 2a 70 50 61 67 65 20 3d 20 30 3b Hdr1 *pPage = 0;
15650 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 .... assert( pC
15651 61 63 68 65 2d 3e 62 50 75 72 67 65 61 62 6c 65 ache->bPurgeable
15652 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 21 3d || createFlag!=
15653 31 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 1 );.. assert(
15654 70 43 61 63 68 65 2d 3e 62 50 75 72 67 65 61 62 pCache->bPurgeab
15655 6c 65 20 7c 7c 20 70 43 61 63 68 65 2d 3e 6e 4d le || pCache->nM
15656 69 6e 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 in==0 );.. asse
15657 72 74 28 20 70 43 61 63 68 65 2d 3e 62 50 75 72 rt( pCache->bPur
15658 67 65 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 43 61 geable==0 || pCa
15659 63 68 65 2d 3e 6e 4d 69 6e 3d 3d 31 30 20 29 3b che->nMin==10 );
1565a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 63 .. assert( pCac
1565b 68 65 2d 3e 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 70 he->nMin==0 || p
1565c 43 61 63 68 65 2d 3e 62 50 75 72 67 65 61 62 6c Cache->bPurgeabl
1565d 65 20 29 3b 0d 0a 20 20 70 63 61 63 68 65 31 45 e );.. pcache1E
1565e 6e 74 65 72 4d 75 74 65 78 28 70 47 72 6f 75 70 nterMutex(pGroup
1565f 20 3d 20 70 43 61 63 68 65 2d 3e 70 47 72 6f 75 = pCache->pGrou
15660 70 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 74 65 70 p);.... /* Step
15661 20 31 3a 20 53 65 61 72 63 68 20 74 68 65 20 68 1: Search the h
15662 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 61 6e ash table for an
15663 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e existing entry.
15664 20 2a 2f 0d 0a 20 20 69 66 28 20 70 43 61 63 68 */.. if( pCach
15665 65 2d 3e 6e 48 61 73 68 3e 30 20 29 7b 0d 0a 20 e->nHash>0 ){..
15666 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
15667 68 20 3d 20 69 4b 65 79 20 25 20 70 43 61 63 68 h = iKey % pCach
15668 65 2d 3e 6e 48 61 73 68 3b 0d 0a 20 20 20 20 66 e->nHash;.. f
15669 6f 72 28 70 50 61 67 65 3d 70 43 61 63 68 65 2d or(pPage=pCache-
1566a 3e 61 70 48 61 73 68 5b 68 5d 3b 20 70 50 61 67 >apHash[h]; pPag
1566b 65 26 26 70 50 61 67 65 2d 3e 69 4b 65 79 21 3d e&&pPage->iKey!=
1566c 69 4b 65 79 3b 20 70 50 61 67 65 3d 70 50 61 67 iKey; pPage=pPag
1566d 65 2d 3e 70 4e 65 78 74 29 3b 0d 0a 20 20 7d 0d e->pNext);.. }.
1566e 0a 0d 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 ... /* Step 2:
1566f 41 62 6f 72 74 20 69 66 20 6e 6f 20 65 78 69 73 Abort if no exis
15670 74 69 6e 67 20 70 61 67 65 20 69 73 20 66 6f 75 ting page is fou
15671 6e 64 20 61 6e 64 20 63 72 65 61 74 65 46 6c 61 nd and createFla
15672 67 20 69 73 20 30 20 2a 2f 0d 0a 20 20 69 66 28 g is 0 */.. if(
15673 20 70 50 61 67 65 20 7c 7c 20 63 72 65 61 74 65 pPage || create
15674 46 6c 61 67 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 Flag==0 ){..
15675 70 63 61 63 68 65 31 50 69 6e 50 61 67 65 28 70 pcache1PinPage(p
15676 50 61 67 65 29 3b 0d 0a 20 20 20 20 67 6f 74 6f Page);.. goto
15677 20 66 65 74 63 68 5f 6f 75 74 3b 0d 0a 20 20 7d fetch_out;.. }
15678 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 70 47 72 .... /* The pGr
15679 6f 75 70 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 oup local variab
1567a 6c 65 20 77 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 le will normally
1567b 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 be initialized
1567c 62 79 20 74 68 65 0d 0a 20 20 2a 2a 20 70 63 61 by the.. ** pca
1567d 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 29 che1EnterMutex()
1567e 20 6d 61 63 72 6f 20 61 62 6f 76 65 2e 20 20 42 macro above. B
1567f 75 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 ut if SQLITE_MUT
15680 45 58 5f 4f 4d 49 54 20 69 73 20 64 65 66 69 6e EX_OMIT is defin
15681 65 64 2c 0d 0a 20 20 2a 2a 20 74 68 65 6e 20 70 ed,.. ** then p
15682 63 61 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 cache1EnterMutex
15683 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 73 () is a no-op, s
15684 6f 20 77 65 20 68 61 76 65 20 74 6f 20 69 6e 69 o we have to ini
15685 74 69 61 6c 69 7a 65 20 74 68 65 0d 0a 20 20 2a tialize the.. *
15686 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 * local variable
15687 20 68 65 72 65 2e 20 20 44 65 6c 61 79 69 6e 67 here. Delaying
15688 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 the initializat
15689 69 6f 6e 20 6f 66 20 70 47 72 6f 75 70 20 69 73 ion of pGroup is
1568a 20 61 6e 0d 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 an.. ** optimi
1568b 7a 61 74 69 6f 6e 3a 20 20 54 68 65 20 63 6f 6d zation: The com
1568c 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 6f 20 65 mon case is to e
1568d 78 69 74 20 74 68 65 20 6d 6f 64 75 6c 65 20 62 xit the module b
1568e 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0d 0a efore reaching..
1568f 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e ** this point.
15690 0d 0a 20 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 .. */..#ifdef S
15691 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 QLITE_MUTEX_OMIT
15692 0d 0a 20 20 70 47 72 6f 75 70 20 3d 20 70 43 61 .. pGroup = pCa
15693 63 68 65 2d 3e 70 47 72 6f 75 70 3b 0d 0a 23 65 che->pGroup;..#e
15694 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a 20 53 74 65 ndif.... /* Ste
15695 70 20 33 3a 20 41 62 6f 72 74 20 69 66 20 63 72 p 3: Abort if cr
15696 65 61 74 65 46 6c 61 67 20 69 73 20 31 20 62 75 eateFlag is 1 bu
15697 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6e t the cache is n
15698 65 61 72 6c 79 20 66 75 6c 6c 20 2a 2f 0d 0a 20 early full */..
15699 20 61 73 73 65 72 74 28 20 70 43 61 63 68 65 2d assert( pCache-
1569a 3e 6e 50 61 67 65 20 3e 3d 20 70 43 61 63 68 65 >nPage >= pCache
1569b 2d 3e 6e 52 65 63 79 63 6c 61 62 6c 65 20 29 3b ->nRecyclable );
1569c 0d 0a 20 20 6e 50 69 6e 6e 65 64 20 3d 20 70 43 .. nPinned = pC
1569d 61 63 68 65 2d 3e 6e 50 61 67 65 20 2d 20 70 43 ache->nPage - pC
1569e 61 63 68 65 2d 3e 6e 52 65 63 79 63 6c 61 62 6c ache->nRecyclabl
1569f 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 47 e;.. assert( pG
156a0 72 6f 75 70 2d 3e 6d 78 50 69 6e 6e 65 64 20 3d roup->mxPinned =
156a1 3d 20 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 61 = pGroup->nMaxPa
156a2 67 65 20 2b 20 31 30 20 2d 20 70 47 72 6f 75 70 ge + 10 - pGroup
156a3 2d 3e 6e 4d 69 6e 50 61 67 65 20 29 3b 0d 0a 20 ->nMinPage );..
156a4 20 61 73 73 65 72 74 28 20 70 43 61 63 68 65 2d assert( pCache-
156a5 3e 6e 39 30 70 63 74 20 3d 3d 20 70 43 61 63 68 >n90pct == pCach
156a6 65 2d 3e 6e 4d 61 78 2a 39 2f 31 30 20 29 3b 0d e->nMax*9/10 );.
156a7 0a 20 20 69 66 28 20 63 72 65 61 74 65 46 6c 61 . if( createFla
156a8 67 3d 3d 31 20 26 26 20 28 0d 0a 20 20 20 20 20 g==1 && (..
156a9 20 20 20 6e 50 69 6e 6e 65 64 3e 3d 70 47 72 6f nPinned>=pGro
156aa 75 70 2d 3e 6d 78 50 69 6e 6e 65 64 0d 0a 20 20 up->mxPinned..
156ab 20 20 20 7c 7c 20 6e 50 69 6e 6e 65 64 3e 3d 70 || nPinned>=p
156ac 43 61 63 68 65 2d 3e 6e 39 30 70 63 74 0d 0a 20 Cache->n90pct..
156ad 20 20 20 20 7c 7c 20 70 63 61 63 68 65 31 55 6e || pcache1Un
156ae 64 65 72 4d 65 6d 6f 72 79 50 72 65 73 73 75 72 derMemoryPressur
156af 65 28 70 43 61 63 68 65 29 0d 0a 20 20 29 29 7b e(pCache).. )){
156b0 0d 0a 20 20 20 20 67 6f 74 6f 20 66 65 74 63 68 .. goto fetch
156b1 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 _out;.. }....
156b2 69 66 28 20 70 43 61 63 68 65 2d 3e 6e 50 61 67 if( pCache->nPag
156b3 65 3e 3d 70 43 61 63 68 65 2d 3e 6e 48 61 73 68 e>=pCache->nHash
156b4 20 26 26 20 70 63 61 63 68 65 31 52 65 73 69 7a && pcache1Resiz
156b5 65 48 61 73 68 28 70 43 61 63 68 65 29 20 29 7b eHash(pCache) ){
156b6 0d 0a 20 20 20 20 67 6f 74 6f 20 66 65 74 63 68 .. goto fetch
156b7 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 _out;.. }....
156b8 2f 2a 20 53 74 65 70 20 34 2e 20 54 72 79 20 74 /* Step 4. Try t
156b9 6f 20 72 65 63 79 63 6c 65 20 61 20 70 61 67 65 o recycle a page
156ba 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 43 61 63 . */.. if( pCac
156bb 68 65 2d 3e 62 50 75 72 67 65 61 62 6c 65 20 26 he->bPurgeable &
156bc 26 20 70 47 72 6f 75 70 2d 3e 70 4c 72 75 54 61 & pGroup->pLruTa
156bd 69 6c 20 26 26 20 28 0d 0a 20 20 20 20 20 20 20 il && (..
156be 20 20 28 70 43 61 63 68 65 2d 3e 6e 50 61 67 65 (pCache->nPage
156bf 2b 31 3e 3d 70 43 61 63 68 65 2d 3e 6e 4d 61 78 +1>=pCache->nMax
156c0 29 0d 0a 20 20 20 20 20 20 7c 7c 20 70 47 72 6f ).. || pGro
156c1 75 70 2d 3e 6e 43 75 72 72 65 6e 74 50 61 67 65 up->nCurrentPage
156c2 3e 3d 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 61 >=pGroup->nMaxPa
156c3 67 65 0d 0a 20 20 20 20 20 20 7c 7c 20 70 63 61 ge.. || pca
156c4 63 68 65 31 55 6e 64 65 72 4d 65 6d 6f 72 79 50 che1UnderMemoryP
156c5 72 65 73 73 75 72 65 28 70 43 61 63 68 65 29 0d ressure(pCache).
156c6 0a 20 20 29 29 7b 0d 0a 20 20 20 20 50 43 61 63 . )){.. PCac
156c7 68 65 31 20 2a 70 4f 74 68 65 72 3b 0d 0a 20 20 he1 *pOther;..
156c8 20 20 70 50 61 67 65 20 3d 20 70 47 72 6f 75 70 pPage = pGroup
156c9 2d 3e 70 4c 72 75 54 61 69 6c 3b 0d 0a 20 20 20 ->pLruTail;..
156ca 20 70 63 61 63 68 65 31 52 65 6d 6f 76 65 46 72 pcache1RemoveFr
156cb 6f 6d 48 61 73 68 28 70 50 61 67 65 29 3b 0d 0a omHash(pPage);..
156cc 20 20 20 20 70 63 61 63 68 65 31 50 69 6e 50 61 pcache1PinPa
156cd 67 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 ge(pPage);..
156ce 70 4f 74 68 65 72 20 3d 20 70 50 61 67 65 2d 3e pOther = pPage->
156cf 70 43 61 63 68 65 3b 0d 0a 0d 0a 20 20 20 20 2f pCache;.... /
156d0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 76 65 72 * We want to ver
156d1 69 66 79 20 74 68 61 74 20 73 7a 50 61 67 65 20 ify that szPage
156d2 61 6e 64 20 73 7a 45 78 74 72 61 20 61 72 65 20 and szExtra are
156d3 74 68 65 20 73 61 6d 65 20 66 6f 72 20 70 4f 74 the same for pOt
156d4 68 65 72 0d 0a 20 20 20 20 2a 2a 20 61 6e 64 20 her.. ** and
156d5 70 43 61 63 68 65 2e 20 20 41 73 73 65 72 74 20 pCache. Assert
156d6 74 68 61 74 20 77 65 20 63 61 6e 20 76 65 72 69 that we can veri
156d7 66 79 20 74 68 69 73 20 62 79 20 63 6f 6d 70 61 fy this by compa
156d8 72 69 6e 67 20 73 75 6d 73 2e 20 2a 2f 0d 0a 20 ring sums. */..
156d9 20 20 20 61 73 73 65 72 74 28 20 28 70 43 61 63 assert( (pCac
156da 68 65 2d 3e 73 7a 50 61 67 65 20 26 20 28 70 43 he->szPage & (pC
156db 61 63 68 65 2d 3e 73 7a 50 61 67 65 2d 31 29 29 ache->szPage-1))
156dc 3d 3d 30 20 26 26 20 70 43 61 63 68 65 2d 3e 73 ==0 && pCache->s
156dd 7a 50 61 67 65 3e 3d 35 31 32 20 29 3b 0d 0a 20 zPage>=512 );..
156de 20 20 20 61 73 73 65 72 74 28 20 70 43 61 63 68 assert( pCach
156df 65 2d 3e 73 7a 45 78 74 72 61 3c 35 31 32 20 29 e->szExtra<512 )
156e0 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 ;.. assert( (
156e1 70 4f 74 68 65 72 2d 3e 73 7a 50 61 67 65 20 26 pOther->szPage &
156e2 20 28 70 4f 74 68 65 72 2d 3e 73 7a 50 61 67 65 (pOther->szPage
156e3 2d 31 29 29 3d 3d 30 20 26 26 20 70 4f 74 68 65 -1))==0 && pOthe
156e4 72 2d 3e 73 7a 50 61 67 65 3e 3d 35 31 32 20 29 r->szPage>=512 )
156e5 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
156e6 4f 74 68 65 72 2d 3e 73 7a 45 78 74 72 61 3c 35 Other->szExtra<5
156e7 31 32 20 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 12 );.... if(
156e8 20 70 4f 74 68 65 72 2d 3e 73 7a 50 61 67 65 2b pOther->szPage+
156e9 70 4f 74 68 65 72 2d 3e 73 7a 45 78 74 72 61 20 pOther->szExtra
156ea 21 3d 20 70 43 61 63 68 65 2d 3e 73 7a 50 61 67 != pCache->szPag
156eb 65 2b 70 43 61 63 68 65 2d 3e 73 7a 45 78 74 72 e+pCache->szExtr
156ec 61 20 29 7b 0d 0a 20 20 20 20 20 20 70 63 61 63 a ){.. pcac
156ed 68 65 31 46 72 65 65 50 61 67 65 28 70 50 61 67 he1FreePage(pPag
156ee 65 29 3b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 e);.. pPage
156ef 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 = 0;.. }else
156f0 7b 0d 0a 20 20 20 20 20 20 70 47 72 6f 75 70 2d {.. pGroup-
156f1 3e 6e 43 75 72 72 65 6e 74 50 61 67 65 20 2d 3d >nCurrentPage -=
156f2 20 28 70 4f 74 68 65 72 2d 3e 62 50 75 72 67 65 (pOther->bPurge
156f3 61 62 6c 65 20 2d 20 70 43 61 63 68 65 2d 3e 62 able - pCache->b
156f4 50 75 72 67 65 61 62 6c 65 29 3b 0d 0a 20 20 20 Purgeable);..
156f5 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 }.. }.... /*
156f6 53 74 65 70 20 35 2e 20 49 66 20 61 20 75 73 61 Step 5. If a usa
156f7 62 6c 65 20 70 61 67 65 20 62 75 66 66 65 72 20 ble page buffer
156f8 68 61 73 20 73 74 69 6c 6c 20 6e 6f 74 20 62 65 has still not be
156f9 65 6e 20 66 6f 75 6e 64 2c 20 0d 0a 20 20 2a 2a en found, .. **
156fa 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f attempt to allo
156fb 63 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 cate a new one.
156fc 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 21 70 .. */.. if( !p
156fd 50 61 67 65 20 29 7b 0d 0a 20 20 20 20 69 66 28 Page ){.. if(
156fe 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 20 29 createFlag==1 )
156ff 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e sqlite3BeginBen
15700 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0d 0a 20 20 ignMalloc();..
15701 20 20 70 50 61 67 65 20 3d 20 70 63 61 63 68 65 pPage = pcache
15702 31 41 6c 6c 6f 63 50 61 67 65 28 70 43 61 63 68 1AllocPage(pCach
15703 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 63 72 65 e);.. if( cre
15704 61 74 65 46 6c 61 67 3d 3d 31 20 29 20 73 71 6c ateFlag==1 ) sql
15705 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c ite3EndBenignMal
15706 6c 6f 63 28 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 loc();.. }....
15707 20 69 66 28 20 70 50 61 67 65 20 29 7b 0d 0a 20 if( pPage ){..
15708 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
15709 68 20 3d 20 69 4b 65 79 20 25 20 70 43 61 63 68 h = iKey % pCach
1570a 65 2d 3e 6e 48 61 73 68 3b 0d 0a 20 20 20 20 70 e->nHash;.. p
1570b 43 61 63 68 65 2d 3e 6e 50 61 67 65 2b 2b 3b 0d Cache->nPage++;.
1570c 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 4b 65 79 . pPage->iKey
1570d 20 3d 20 69 4b 65 79 3b 0d 0a 20 20 20 20 70 50 = iKey;.. pP
1570e 61 67 65 2d 3e 70 4e 65 78 74 20 3d 20 70 43 61 age->pNext = pCa
1570f 63 68 65 2d 3e 61 70 48 61 73 68 5b 68 5d 3b 0d che->apHash[h];.
15710 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 43 61 63 . pPage->pCac
15711 68 65 20 3d 20 70 43 61 63 68 65 3b 0d 0a 20 20 he = pCache;..
15712 20 20 70 50 61 67 65 2d 3e 70 4c 72 75 50 72 65 pPage->pLruPre
15713 76 20 3d 20 30 3b 0d 0a 20 20 20 20 70 50 61 67 v = 0;.. pPag
15714 65 2d 3e 70 4c 72 75 4e 65 78 74 20 3d 20 30 3b e->pLruNext = 0;
15715 0d 0a 20 20 20 20 2a 28 76 6f 69 64 20 2a 2a 29 .. *(void **)
15716 70 50 61 67 65 2d 3e 70 61 67 65 2e 70 45 78 74 pPage->page.pExt
15717 72 61 20 3d 20 30 3b 0d 0a 20 20 20 20 70 43 61 ra = 0;.. pCa
15718 63 68 65 2d 3e 61 70 48 61 73 68 5b 68 5d 20 3d che->apHash[h] =
15719 20 70 50 61 67 65 3b 0d 0a 20 20 7d 0d 0a 0d 0a pPage;.. }....
1571a 66 65 74 63 68 5f 6f 75 74 3a 0d 0a 20 20 69 66 fetch_out:.. if
1571b 28 20 70 50 61 67 65 20 26 26 20 69 4b 65 79 3e ( pPage && iKey>
1571c 70 43 61 63 68 65 2d 3e 69 4d 61 78 4b 65 79 20 pCache->iMaxKey
1571d 29 7b 0d 0a 20 20 20 20 70 43 61 63 68 65 2d 3e ){.. pCache->
1571e 69 4d 61 78 4b 65 79 20 3d 20 69 4b 65 79 3b 0d iMaxKey = iKey;.
1571f 0a 20 20 7d 0d 0a 20 20 70 63 61 63 68 65 31 4c . }.. pcache1L
15720 65 61 76 65 4d 75 74 65 78 28 70 47 72 6f 75 70 eaveMutex(pGroup
15721 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 26 70 50 );.. return &pP
15722 61 67 65 2d 3e 70 61 67 65 3b 0d 0a 7d 0d 0a 0d age->page;..}...
15723 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d .../*..** Implem
15724 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
15725 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 2e 78 sqlite3_pcache.x
15726 55 6e 70 69 6e 20 6d 65 74 68 6f 64 2e 0d 0a 2a Unpin method...*
15727 2a 0d 0a 2a 2a 20 4d 61 72 6b 20 61 20 70 61 67 *..** Mark a pag
15728 65 20 61 73 20 75 6e 70 69 6e 6e 65 64 20 28 65 e as unpinned (e
15729 6c 69 67 69 62 6c 65 20 66 6f 72 20 61 73 79 6e ligible for asyn
1572a 63 68 72 6f 6e 6f 75 73 20 72 65 63 79 63 6c 69 chronous recycli
1572b 6e 67 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ng)...*/..static
1572c 20 76 6f 69 64 20 70 63 61 63 68 65 31 55 6e 70 void pcache1Unp
1572d 69 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 70 in(.. sqlite3_p
1572e 63 61 63 68 65 20 2a 70 2c 20 0d 0a 20 20 73 71 cache *p, .. sq
1572f 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 lite3_pcache_pag
15730 65 20 2a 70 50 67 2c 20 0d 0a 20 20 69 6e 74 20 e *pPg, .. int
15731 72 65 75 73 65 55 6e 6c 69 6b 65 6c 79 0d 0a 29 reuseUnlikely..)
15732 7b 0d 0a 20 20 50 43 61 63 68 65 31 20 2a 70 43 {.. PCache1 *pC
15733 61 63 68 65 20 3d 20 28 50 43 61 63 68 65 31 20 ache = (PCache1
15734 2a 29 70 3b 0d 0a 20 20 50 67 48 64 72 31 20 2a *)p;.. PgHdr1 *
15735 70 50 61 67 65 20 3d 20 28 50 67 48 64 72 31 20 pPage = (PgHdr1
15736 2a 29 70 50 67 3b 0d 0a 20 20 50 47 72 6f 75 70 *)pPg;.. PGroup
15737 20 2a 70 47 72 6f 75 70 20 3d 20 70 43 61 63 68 *pGroup = pCach
15738 65 2d 3e 70 47 72 6f 75 70 3b 0d 0a 20 0d 0a 20 e->pGroup;.. ..
15739 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e assert( pPage->
1573a 70 43 61 63 68 65 3d 3d 70 43 61 63 68 65 20 29 pCache==pCache )
1573b 3b 0d 0a 20 20 70 63 61 63 68 65 31 45 6e 74 65 ;.. pcache1Ente
1573c 72 4d 75 74 65 78 28 70 47 72 6f 75 70 29 3b 0d rMutex(pGroup);.
1573d 0a 0d 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 6e ... /* It is an
1573e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 error to call t
1573f 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 his function if
15740 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 the page is alre
15741 61 64 79 20 0d 0a 20 20 2a 2a 20 70 61 72 74 20 ady .. ** part
15742 6f 66 20 74 68 65 20 50 47 72 6f 75 70 20 4c 52 of the PGroup LR
15743 55 20 6c 69 73 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 U list... */..
15744 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e assert( pPage->
15745 70 4c 72 75 50 72 65 76 3d 3d 30 20 26 26 20 70 pLruPrev==0 && p
15746 50 61 67 65 2d 3e 70 4c 72 75 4e 65 78 74 3d 3d Page->pLruNext==
15747 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 0 );.. assert(
15748 70 47 72 6f 75 70 2d 3e 70 4c 72 75 48 65 61 64 pGroup->pLruHead
15749 21 3d 70 50 61 67 65 20 26 26 20 70 47 72 6f 75 !=pPage && pGrou
1574a 70 2d 3e 70 4c 72 75 54 61 69 6c 21 3d 70 50 61 p->pLruTail!=pPa
1574b 67 65 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 72 ge );.... if( r
1574c 65 75 73 65 55 6e 6c 69 6b 65 6c 79 20 7c 7c 20 euseUnlikely ||
1574d 70 47 72 6f 75 70 2d 3e 6e 43 75 72 72 65 6e 74 pGroup->nCurrent
1574e 50 61 67 65 3e 70 47 72 6f 75 70 2d 3e 6e 4d 61 Page>pGroup->nMa
1574f 78 50 61 67 65 20 29 7b 0d 0a 20 20 20 20 70 63 xPage ){.. pc
15750 61 63 68 65 31 52 65 6d 6f 76 65 46 72 6f 6d 48 ache1RemoveFromH
15751 61 73 68 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 ash(pPage);..
15752 20 70 63 61 63 68 65 31 46 72 65 65 50 61 67 65 pcache1FreePage
15753 28 70 50 61 67 65 29 3b 0d 0a 20 20 7d 65 6c 73 (pPage);.. }els
15754 65 7b 0d 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 e{.. /* Add t
15755 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 50 he page to the P
15756 47 72 6f 75 70 20 4c 52 55 20 6c 69 73 74 2e 20 Group LRU list.
15757 2a 2f 0d 0a 20 20 20 20 69 66 28 20 70 47 72 6f */.. if( pGro
15758 75 70 2d 3e 70 4c 72 75 48 65 61 64 20 29 7b 0d up->pLruHead ){.
15759 0a 20 20 20 20 20 20 70 47 72 6f 75 70 2d 3e 70 . pGroup->p
1575a 4c 72 75 48 65 61 64 2d 3e 70 4c 72 75 50 72 65 LruHead->pLruPre
1575b 76 20 3d 20 70 50 61 67 65 3b 0d 0a 20 20 20 20 v = pPage;..
1575c 20 20 70 50 61 67 65 2d 3e 70 4c 72 75 4e 65 78 pPage->pLruNex
1575d 74 20 3d 20 70 47 72 6f 75 70 2d 3e 70 4c 72 75 t = pGroup->pLru
1575e 48 65 61 64 3b 0d 0a 20 20 20 20 20 20 70 47 72 Head;.. pGr
1575f 6f 75 70 2d 3e 70 4c 72 75 48 65 61 64 20 3d 20 oup->pLruHead =
15760 70 50 61 67 65 3b 0d 0a 20 20 20 20 7d 65 6c 73 pPage;.. }els
15761 65 7b 0d 0a 20 20 20 20 20 20 70 47 72 6f 75 70 e{.. pGroup
15762 2d 3e 70 4c 72 75 54 61 69 6c 20 3d 20 70 50 61 ->pLruTail = pPa
15763 67 65 3b 0d 0a 20 20 20 20 20 20 70 47 72 6f 75 ge;.. pGrou
15764 70 2d 3e 70 4c 72 75 48 65 61 64 20 3d 20 70 50 p->pLruHead = pP
15765 61 67 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 age;.. }..
15766 20 70 43 61 63 68 65 2d 3e 6e 52 65 63 79 63 6c pCache->nRecycl
15767 61 62 6c 65 2b 2b 3b 0d 0a 20 20 7d 0d 0a 0d 0a able++;.. }....
15768 20 20 70 63 61 63 68 65 31 4c 65 61 76 65 4d 75 pcache1LeaveMu
15769 74 65 78 28 70 43 61 63 68 65 2d 3e 70 47 72 6f tex(pCache->pGro
1576a 75 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a up);..}..../*..*
1576b 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e * Implementation
1576c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f of the sqlite3_
1576d 70 63 61 63 68 65 2e 78 52 65 6b 65 79 20 6d 65 pcache.xRekey me
1576e 74 68 6f 64 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 thod. ..*/..stat
1576f 69 63 20 76 6f 69 64 20 70 63 61 63 68 65 31 52 ic void pcache1R
15770 65 6b 65 79 28 0d 0a 20 20 73 71 6c 69 74 65 33 ekey(.. sqlite3
15771 5f 70 63 61 63 68 65 20 2a 70 2c 0d 0a 20 20 73 _pcache *p,.. s
15772 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 qlite3_pcache_pa
15773 67 65 20 2a 70 50 67 2c 0d 0a 20 20 75 6e 73 69 ge *pPg,.. unsi
15774 67 6e 65 64 20 69 6e 74 20 69 4f 6c 64 2c 0d 0a gned int iOld,..
15775 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 unsigned int i
15776 4e 65 77 0d 0a 29 7b 0d 0a 20 20 50 43 61 63 68 New..){.. PCach
15777 65 31 20 2a 70 43 61 63 68 65 20 3d 20 28 50 43 e1 *pCache = (PC
15778 61 63 68 65 31 20 2a 29 70 3b 0d 0a 20 20 50 67 ache1 *)p;.. Pg
15779 48 64 72 31 20 2a 70 50 61 67 65 20 3d 20 28 50 Hdr1 *pPage = (P
1577a 67 48 64 72 31 20 2a 29 70 50 67 3b 0d 0a 20 20 gHdr1 *)pPg;..
1577b 50 67 48 64 72 31 20 2a 2a 70 70 3b 0d 0a 20 20 PgHdr1 **pp;..
1577c 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 68 3b 20 unsigned int h;
1577d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 .. assert( pPag
1577e 65 2d 3e 69 4b 65 79 3d 3d 69 4f 6c 64 20 29 3b e->iKey==iOld );
1577f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 .. assert( pPag
15780 65 2d 3e 70 43 61 63 68 65 3d 3d 70 43 61 63 68 e->pCache==pCach
15781 65 20 29 3b 0d 0a 0d 0a 20 20 70 63 61 63 68 65 e );.... pcache
15782 31 45 6e 74 65 72 4d 75 74 65 78 28 70 43 61 63 1EnterMutex(pCac
15783 68 65 2d 3e 70 47 72 6f 75 70 29 3b 0d 0a 0d 0a he->pGroup);....
15784 20 20 68 20 3d 20 69 4f 6c 64 25 70 43 61 63 68 h = iOld%pCach
15785 65 2d 3e 6e 48 61 73 68 3b 0d 0a 20 20 70 70 20 e->nHash;.. pp
15786 3d 20 26 70 43 61 63 68 65 2d 3e 61 70 48 61 73 = &pCache->apHas
15787 68 5b 68 5d 3b 0d 0a 20 20 77 68 69 6c 65 28 20 h[h];.. while(
15788 28 2a 70 70 29 21 3d 70 50 61 67 65 20 29 7b 0d (*pp)!=pPage ){.
15789 0a 20 20 20 20 70 70 20 3d 20 26 28 2a 70 70 29 . pp = &(*pp)
1578a 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d 0a 20 ->pNext;.. }..
1578b 20 2a 70 70 20 3d 20 70 50 61 67 65 2d 3e 70 4e *pp = pPage->pN
1578c 65 78 74 3b 0d 0a 0d 0a 20 20 68 20 3d 20 69 4e ext;.... h = iN
1578d 65 77 25 70 43 61 63 68 65 2d 3e 6e 48 61 73 68 ew%pCache->nHash
1578e 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 69 4b 65 79 ;.. pPage->iKey
1578f 20 3d 20 69 4e 65 77 3b 0d 0a 20 20 70 50 61 67 = iNew;.. pPag
15790 65 2d 3e 70 4e 65 78 74 20 3d 20 70 43 61 63 68 e->pNext = pCach
15791 65 2d 3e 61 70 48 61 73 68 5b 68 5d 3b 0d 0a 20 e->apHash[h];..
15792 20 70 43 61 63 68 65 2d 3e 61 70 48 61 73 68 5b pCache->apHash[
15793 68 5d 20 3d 20 70 50 61 67 65 3b 0d 0a 20 20 69 h] = pPage;.. i
15794 66 28 20 69 4e 65 77 3e 70 43 61 63 68 65 2d 3e f( iNew>pCache->
15795 69 4d 61 78 4b 65 79 20 29 7b 0d 0a 20 20 20 20 iMaxKey ){..
15796 70 43 61 63 68 65 2d 3e 69 4d 61 78 4b 65 79 20 pCache->iMaxKey
15797 3d 20 69 4e 65 77 3b 0d 0a 20 20 7d 0d 0a 0d 0a = iNew;.. }....
15798 20 20 70 63 61 63 68 65 31 4c 65 61 76 65 4d 75 pcache1LeaveMu
15799 74 65 78 28 70 43 61 63 68 65 2d 3e 70 47 72 6f tex(pCache->pGro
1579a 75 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a up);..}..../*..*
1579b 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e * Implementation
1579c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f of the sqlite3_
1579d 70 63 61 63 68 65 2e 78 54 72 75 6e 63 61 74 65 pcache.xTruncate
1579e 20 6d 65 74 68 6f 64 2e 20 0d 0a 2a 2a 0d 0a 2a method. ..**..*
1579f 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 75 6e * Discard all un
157a0 70 69 6e 6e 65 64 20 70 61 67 65 73 20 69 6e 20 pinned pages in
157a1 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 61 the cache with a
157a2 20 70 61 67 65 20 6e 75 6d 62 65 72 20 65 71 75 page number equ
157a3 61 6c 20 74 6f 0d 0a 2a 2a 20 6f 72 20 67 72 65 al to..** or gre
157a4 61 74 65 72 20 74 68 61 6e 20 70 61 72 61 6d 65 ater than parame
157a5 74 65 72 20 69 4c 69 6d 69 74 2e 20 41 6e 79 20 ter iLimit. Any
157a6 70 69 6e 6e 65 64 20 70 61 67 65 73 20 77 69 74 pinned pages wit
157a7 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0d h a page number.
157a8 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 .** equal to or
157a9 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 4c 69 greater than iLi
157aa 6d 69 74 20 61 72 65 20 69 6d 70 6c 69 63 69 74 mit are implicit
157ab 6c 79 20 75 6e 70 69 6e 6e 65 64 2e 0d 0a 2a 2f ly unpinned...*/
157ac 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 63 ..static void pc
157ad 61 63 68 65 31 54 72 75 6e 63 61 74 65 28 73 71 ache1Truncate(sq
157ae 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c lite3_pcache *p,
157af 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c unsigned int iL
157b0 69 6d 69 74 29 7b 0d 0a 20 20 50 43 61 63 68 65 imit){.. PCache
157b1 31 20 2a 70 43 61 63 68 65 20 3d 20 28 50 43 61 1 *pCache = (PCa
157b2 63 68 65 31 20 2a 29 70 3b 0d 0a 20 20 70 63 61 che1 *)p;.. pca
157b3 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 70 che1EnterMutex(p
157b4 43 61 63 68 65 2d 3e 70 47 72 6f 75 70 29 3b 0d Cache->pGroup);.
157b5 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 3d 70 . if( iLimit<=p
157b6 43 61 63 68 65 2d 3e 69 4d 61 78 4b 65 79 20 29 Cache->iMaxKey )
157b7 7b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 54 72 {.. pcache1Tr
157b8 75 6e 63 61 74 65 55 6e 73 61 66 65 28 70 43 61 uncateUnsafe(pCa
157b9 63 68 65 2c 20 69 4c 69 6d 69 74 29 3b 0d 0a 20 che, iLimit);..
157ba 20 20 20 70 43 61 63 68 65 2d 3e 69 4d 61 78 4b pCache->iMaxK
157bb 65 79 20 3d 20 69 4c 69 6d 69 74 2d 31 3b 0d 0a ey = iLimit-1;..
157bc 20 20 7d 0d 0a 20 20 70 63 61 63 68 65 31 4c 65 }.. pcache1Le
157bd 61 76 65 4d 75 74 65 78 28 70 43 61 63 68 65 2d aveMutex(pCache-
157be 3e 70 47 72 6f 75 70 29 3b 0d 0a 7d 0d 0a 0d 0a >pGroup);..}....
157bf 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 /*..** Implement
157c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c ation of the sql
157c1 69 74 65 33 5f 70 63 61 63 68 65 2e 78 44 65 73 ite3_pcache.xDes
157c2 74 72 6f 79 20 6d 65 74 68 6f 64 2e 20 0d 0a 2a troy method. ..*
157c3 2a 0d 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 20 *..** Destroy a
157c4 63 61 63 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 cache allocated
157c5 75 73 69 6e 67 20 70 63 61 63 68 65 31 43 72 65 using pcache1Cre
157c6 61 74 65 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ate()...*/..stat
157c7 69 63 20 76 6f 69 64 20 70 63 61 63 68 65 31 44 ic void pcache1D
157c8 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 70 estroy(sqlite3_p
157c9 63 61 63 68 65 20 2a 70 29 7b 0d 0a 20 20 50 43 cache *p){.. PC
157ca 61 63 68 65 31 20 2a 70 43 61 63 68 65 20 3d 20 ache1 *pCache =
157cb 28 50 43 61 63 68 65 31 20 2a 29 70 3b 0d 0a 20 (PCache1 *)p;..
157cc 20 50 47 72 6f 75 70 20 2a 70 47 72 6f 75 70 20 PGroup *pGroup
157cd 3d 20 70 43 61 63 68 65 2d 3e 70 47 72 6f 75 70 = pCache->pGroup
157ce 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 ;.. assert( pCa
157cf 63 68 65 2d 3e 62 50 75 72 67 65 61 62 6c 65 20 che->bPurgeable
157d0 7c 7c 20 28 70 43 61 63 68 65 2d 3e 6e 4d 61 78 || (pCache->nMax
157d1 3d 3d 30 20 26 26 20 70 43 61 63 68 65 2d 3e 6e ==0 && pCache->n
157d2 4d 69 6e 3d 3d 30 29 20 29 3b 0d 0a 20 20 70 63 Min==0) );.. pc
157d3 61 63 68 65 31 45 6e 74 65 72 4d 75 74 65 78 28 ache1EnterMutex(
157d4 70 47 72 6f 75 70 29 3b 0d 0a 20 20 70 63 61 63 pGroup);.. pcac
157d5 68 65 31 54 72 75 6e 63 61 74 65 55 6e 73 61 66 he1TruncateUnsaf
157d6 65 28 70 43 61 63 68 65 2c 20 30 29 3b 0d 0a 20 e(pCache, 0);..
157d7 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 2d assert( pGroup-
157d8 3e 6e 4d 61 78 50 61 67 65 20 3e 3d 20 70 43 61 >nMaxPage >= pCa
157d9 63 68 65 2d 3e 6e 4d 61 78 20 29 3b 0d 0a 20 20 che->nMax );..
157da 70 47 72 6f 75 70 2d 3e 6e 4d 61 78 50 61 67 65 pGroup->nMaxPage
157db 20 2d 3d 20 70 43 61 63 68 65 2d 3e 6e 4d 61 78 -= pCache->nMax
157dc 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 47 72 ;.. assert( pGr
157dd 6f 75 70 2d 3e 6e 4d 69 6e 50 61 67 65 20 3e 3d oup->nMinPage >=
157de 20 70 43 61 63 68 65 2d 3e 6e 4d 69 6e 20 29 3b pCache->nMin );
157df 0d 0a 20 20 70 47 72 6f 75 70 2d 3e 6e 4d 69 6e .. pGroup->nMin
157e0 50 61 67 65 20 2d 3d 20 70 43 61 63 68 65 2d 3e Page -= pCache->
157e1 6e 4d 69 6e 3b 0d 0a 20 20 70 47 72 6f 75 70 2d nMin;.. pGroup-
157e2 3e 6d 78 50 69 6e 6e 65 64 20 3d 20 70 47 72 6f >mxPinned = pGro
157e3 75 70 2d 3e 6e 4d 61 78 50 61 67 65 20 2b 20 31 up->nMaxPage + 1
157e4 30 20 2d 20 70 47 72 6f 75 70 2d 3e 6e 4d 69 6e 0 - pGroup->nMin
157e5 50 61 67 65 3b 0d 0a 20 20 70 63 61 63 68 65 31 Page;.. pcache1
157e6 45 6e 66 6f 72 63 65 4d 61 78 50 61 67 65 28 70 EnforceMaxPage(p
157e7 47 72 6f 75 70 29 3b 0d 0a 20 20 70 63 61 63 68 Group);.. pcach
157e8 65 31 4c 65 61 76 65 4d 75 74 65 78 28 70 47 72 e1LeaveMutex(pGr
157e9 6f 75 70 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 oup);.. sqlite3
157ea 5f 66 72 65 65 28 70 43 61 63 68 65 2d 3e 61 70 _free(pCache->ap
157eb 48 61 73 68 29 3b 0d 0a 20 20 73 71 6c 69 74 65 Hash);.. sqlite
157ec 33 5f 66 72 65 65 28 70 43 61 63 68 65 29 3b 0d 3_free(pCache);.
157ed 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 .}..../*..** Thi
157ee 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 s function is ca
157ef 6c 6c 65 64 20 64 75 72 69 6e 67 20 69 6e 69 74 lled during init
157f0 69 61 6c 69 7a 61 74 69 6f 6e 20 28 73 71 6c 69 ialization (sqli
157f1 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 te3_initialize()
157f2 29 20 74 6f 0d 0a 2a 2a 20 69 6e 73 74 61 6c 6c ) to..** install
157f3 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 75 the default plu
157f4 67 67 61 62 6c 65 20 63 61 63 68 65 20 6d 6f 64 ggable cache mod
157f5 75 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 ule, assuming th
157f6 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 0d 0a e user has not..
157f7 2a 2a 20 61 6c 72 65 61 64 79 20 70 72 6f 76 69 ** already provi
157f8 64 65 64 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 ded an alternati
157f9 76 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ve...*/..SQLITE_
157fa 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
157fb 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 ite3PCacheSetDef
157fc 61 75 6c 74 28 76 6f 69 64 29 7b 0d 0a 20 20 73 ault(void){.. s
157fd 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 tatic const sqli
157fe 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f te3_pcache_metho
157ff 64 73 32 20 64 65 66 61 75 6c 74 4d 65 74 68 6f ds2 defaultMetho
15800 64 73 20 3d 20 7b 0d 0a 20 20 20 20 31 2c 20 20 ds = {.. 1,
15801 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15802 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e /* iVersion
15803 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 20 20 20 20 */.. 0,
15804 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15805 20 20 2f 2a 20 70 41 72 67 20 2a 2f 0d 0a 20 20 /* pArg */..
15806 20 20 70 63 61 63 68 65 31 49 6e 69 74 2c 20 20 pcache1Init,
15807 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 49 /* xI
15808 6e 69 74 20 2a 2f 0d 0a 20 20 20 20 70 63 61 63 nit */.. pcac
15809 68 65 31 53 68 75 74 64 6f 77 6e 2c 20 20 20 20 he1Shutdown,
1580a 20 20 20 20 20 2f 2a 20 78 53 68 75 74 64 6f 77 /* xShutdow
1580b 6e 20 2a 2f 0d 0a 20 20 20 20 70 63 61 63 68 65 n */.. pcache
1580c 31 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 1Create,
1580d 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f /* xCreate */
1580e 0d 0a 20 20 20 20 70 63 61 63 68 65 31 43 61 63 .. pcache1Cac
1580f 68 65 73 69 7a 65 2c 20 20 20 20 20 20 20 20 2f hesize, /
15810 2a 20 78 43 61 63 68 65 73 69 7a 65 20 2a 2f 0d * xCachesize */.
15811 0a 20 20 20 20 70 63 61 63 68 65 31 50 61 67 65 . pcache1Page
15812 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 2f 2a count, /*
15813 20 78 50 61 67 65 63 6f 75 6e 74 20 2a 2f 0d 0a xPagecount */..
15814 20 20 20 20 70 63 61 63 68 65 31 46 65 74 63 68 pcache1Fetch
15815 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
15816 78 46 65 74 63 68 20 2a 2f 0d 0a 20 20 20 20 70 xFetch */.. p
15817 63 61 63 68 65 31 55 6e 70 69 6e 2c 20 20 20 20 cache1Unpin,
15818 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 70 69 /* xUnpi
15819 6e 20 2a 2f 0d 0a 20 20 20 20 70 63 61 63 68 65 n */.. pcache
1581a 31 52 65 6b 65 79 2c 20 20 20 20 20 20 20 20 20 1Rekey,
1581b 20 20 20 2f 2a 20 78 52 65 6b 65 79 20 2a 2f 0d /* xRekey */.
1581c 0a 20 20 20 20 70 63 61 63 68 65 31 54 72 75 6e . pcache1Trun
1581d 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a cate, /*
1581e 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0d 0a 20 xTruncate */..
1581f 20 20 20 70 63 61 63 68 65 31 44 65 73 74 72 6f pcache1Destro
15820 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 y, /* x
15821 44 65 73 74 72 6f 79 20 2a 2f 0d 0a 20 20 20 20 Destroy */..
15822 70 63 61 63 68 65 31 53 68 72 69 6e 6b 20 20 20 pcache1Shrink
15823 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 72 /* xShr
15824 69 6e 6b 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 20 20 ink */.. };..
15825 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 sqlite3_config(S
15826 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 QLITE_CONFIG_PCA
15827 43 48 45 32 2c 20 26 64 65 66 61 75 6c 74 4d 65 CHE2, &defaultMe
15828 74 68 6f 64 73 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69 thods);..}....#i
15829 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
1582a 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 LE_MEMORY_MANAGE
1582b 4d 45 4e 54 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 MENT../*..** Thi
1582c 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 s function is ca
1582d 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 lled to free sup
1582e 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 erfluous dynamic
1582f 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d ally allocated m
15830 65 6d 6f 72 79 0d 0a 2a 2a 20 68 65 6c 64 20 62 emory..** held b
15831 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74 y the pager syst
15832 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 em. Memory in us
15833 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 e by any SQLite
15834 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0d pager allocated.
15835 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 .** by the curre
15836 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 nt thread may be
15837 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65 sqlite3_free()e
15838 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 6e 52 65 71 20 d...**..** nReq
15839 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
1583a 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 bytes of memory
1583b 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 required. Once
1583c 74 68 69 73 20 6d 75 63 68 20 68 61 73 0d 0a 2a this much has..*
1583d 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c * been released,
1583e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 the function re
1583f 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 turns. The retur
15840 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 n value is the t
15841 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0d 0a 2a 2a otal number ..**
15842 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d of bytes of mem
15843 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0d 0a 2a ory released...*
15844 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
15845 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 63 61 E int sqlite3Pca
15846 63 68 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 cheReleaseMemory
15847 28 69 6e 74 20 6e 52 65 71 29 7b 0d 0a 20 20 69 (int nReq){.. i
15848 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0d 0a 20 nt nFree = 0;..
15849 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
1584a 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 _mutex_notheld(p
1584b 63 61 63 68 65 31 2e 67 72 70 2e 6d 75 74 65 78 cache1.grp.mutex
1584c 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1584d 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f sqlite3_mutex_no
1584e 74 68 65 6c 64 28 70 63 61 63 68 65 31 2e 6d 75 theld(pcache1.mu
1584f 74 65 78 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 tex) );.. if( p
15850 63 61 63 68 65 31 2e 70 53 74 61 72 74 3d 3d 30 cache1.pStart==0
15851 20 29 7b 0d 0a 20 20 20 20 50 67 48 64 72 31 20 ){.. PgHdr1
15852 2a 70 3b 0d 0a 20 20 20 20 70 63 61 63 68 65 31 *p;.. pcache1
15853 45 6e 74 65 72 4d 75 74 65 78 28 26 70 63 61 63 EnterMutex(&pcac
15854 68 65 31 2e 67 72 70 29 3b 0d 0a 20 20 20 20 77 he1.grp);.. w
15855 68 69 6c 65 28 20 28 6e 52 65 71 3c 30 20 7c 7c hile( (nReq<0 ||
15856 20 6e 46 72 65 65 3c 6e 52 65 71 29 20 26 26 20 nFree<nReq) &&
15857 28 28 70 3d 70 63 61 63 68 65 31 2e 67 72 70 2e ((p=pcache1.grp.
15858 70 4c 72 75 54 61 69 6c 29 21 3d 30 29 20 29 7b pLruTail)!=0) ){
15859 0d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d .. nFree +=
1585a 20 70 63 61 63 68 65 31 4d 65 6d 53 69 7a 65 28 pcache1MemSize(
1585b 70 2d 3e 70 61 67 65 2e 70 42 75 66 29 3b 0d 0a p->page.pBuf);..
1585c 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 50 43 #ifdef SQLITE_PC
1585d 41 43 48 45 5f 53 45 50 41 52 41 54 45 5f 48 45 ACHE_SEPARATE_HE
1585e 41 44 45 52 0d 0a 20 20 20 20 20 20 6e 46 72 65 ADER.. nFre
1585f 65 20 2b 3d 20 73 71 6c 69 74 65 33 4d 65 6d 53 e += sqlite3MemS
15860 69 7a 65 28 70 29 3b 0d 0a 23 65 6e 64 69 66 0d ize(p);..#endif.
15861 0a 20 20 20 20 20 20 70 63 61 63 68 65 31 50 69 . pcache1Pi
15862 6e 50 61 67 65 28 70 29 3b 0d 0a 20 20 20 20 20 nPage(p);..
15863 20 70 63 61 63 68 65 31 52 65 6d 6f 76 65 46 72 pcache1RemoveFr
15864 6f 6d 48 61 73 68 28 70 29 3b 0d 0a 20 20 20 20 omHash(p);..
15865 20 20 70 63 61 63 68 65 31 46 72 65 65 50 61 67 pcache1FreePag
15866 65 28 70 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 e(p);.. }..
15867 20 20 70 63 61 63 68 65 31 4c 65 61 76 65 4d 75 pcache1LeaveMu
15868 74 65 78 28 26 70 63 61 63 68 65 31 2e 67 72 70 tex(&pcache1.grp
15869 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 );.. }.. retur
1586a 6e 20 6e 46 72 65 65 3b 0d 0a 7d 0d 0a 23 65 6e n nFree;..}..#en
1586b 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e dif /* SQLITE_EN
1586c 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 ABLE_MEMORY_MANA
1586d 47 45 4d 45 4e 54 20 2a 2f 0d 0a 0d 0a 23 69 66 GEMENT */....#if
1586e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0d def SQLITE_TEST.
1586f 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e ./*..** This fun
15870 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 ction is used by
15871 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 73 test procedures
15872 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 to inspect the
15873 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 0d 0a internal state..
15874 2a 2a 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c ** of the global
15875 20 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c cache...*/..SQL
15876 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
15877 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 sqlite3PcacheSt
15878 61 74 73 28 0d 0a 20 20 69 6e 74 20 2a 70 6e 43 ats(.. int *pnC
15879 75 72 72 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20 urrent, /*
1587a 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 OUT: Total numbe
1587b 72 20 6f 66 20 70 61 67 65 73 20 63 61 63 68 65 r of pages cache
1587c 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 4d d */.. int *pnM
1587d 61 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ax, /*
1587e 4f 55 54 3a 20 47 6c 6f 62 61 6c 20 6d 61 78 69 OUT: Global maxi
1587f 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 20 2a mum cache size *
15880 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 4d 69 6e 2c /.. int *pnMin,
15881 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 /* OUT
15882 3a 20 53 75 6d 20 6f 66 20 50 43 61 63 68 65 31 : Sum of PCache1
15883 2e 6e 4d 69 6e 20 66 6f 72 20 70 75 72 67 65 61 .nMin for purgea
15884 62 6c 65 20 63 61 63 68 65 73 20 2a 2f 0d 0a 20 ble caches */..
15885 20 69 6e 74 20 2a 70 6e 52 65 63 79 63 6c 61 62 int *pnRecyclab
15886 6c 65 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f le /* OUT: To
15887 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 tal number of pa
15888 67 65 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f ges available fo
15889 72 20 72 65 63 79 63 6c 69 6e 67 20 2a 2f 0d 0a r recycling */..
1588a 29 7b 0d 0a 20 20 50 67 48 64 72 31 20 2a 70 3b ){.. PgHdr1 *p;
1588b 0d 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c 61 .. int nRecycla
1588c 62 6c 65 20 3d 20 30 3b 0d 0a 20 20 66 6f 72 28 ble = 0;.. for(
1588d 70 3d 70 63 61 63 68 65 31 2e 67 72 70 2e 70 4c p=pcache1.grp.pL
1588e 72 75 48 65 61 64 3b 20 70 3b 20 70 3d 70 2d 3e ruHead; p; p=p->
1588f 70 4c 72 75 4e 65 78 74 29 7b 0d 0a 20 20 20 20 pLruNext){..
15890 6e 52 65 63 79 63 6c 61 62 6c 65 2b 2b 3b 0d 0a nRecyclable++;..
15891 20 20 7d 0d 0a 20 20 2a 70 6e 43 75 72 72 65 6e }.. *pnCurren
15892 74 20 3d 20 70 63 61 63 68 65 31 2e 67 72 70 2e t = pcache1.grp.
15893 6e 43 75 72 72 65 6e 74 50 61 67 65 3b 0d 0a 20 nCurrentPage;..
15894 20 2a 70 6e 4d 61 78 20 3d 20 28 69 6e 74 29 70 *pnMax = (int)p
15895 63 61 63 68 65 31 2e 67 72 70 2e 6e 4d 61 78 50 cache1.grp.nMaxP
15896 61 67 65 3b 0d 0a 20 20 2a 70 6e 4d 69 6e 20 3d age;.. *pnMin =
15897 20 28 69 6e 74 29 70 63 61 63 68 65 31 2e 67 72 (int)pcache1.gr
15898 70 2e 6e 4d 69 6e 50 61 67 65 3b 0d 0a 20 20 2a p.nMinPage;.. *
15899 70 6e 52 65 63 79 63 6c 61 62 6c 65 20 3d 20 6e pnRecyclable = n
1589a 52 65 63 79 63 6c 61 62 6c 65 3b 0d 0a 7d 0d 0a Recyclable;..}..
1589b 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a #endif..../*****
1589c 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 ********* End of
1589d 20 70 63 61 63 68 65 31 2e 63 20 2a 2a 2a 2a 2a pcache1.c *****
1589e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1589f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a ********/../****
158a1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e ********** Begin
158a2 20 66 69 6c 65 20 72 6f 77 73 65 74 2e 63 20 2a file rowset.c *
158a3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158a4 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158a5 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a *********/../*..
158a6 2a 2a 20 32 30 30 38 20 44 65 63 65 6d 62 65 72 ** 2008 December
158a7 20 33 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 3..**..** The a
158a8 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 uthor disclaims
158a9 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 copyright to thi
158aa 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 s source code.
158ab 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 In place of..**
158ac 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 a legal notice,
158ad 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 here is a blessi
158ae 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d ng:..**..** M
158af 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
158b0 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a nd not evil...**
158b1 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 May you find
158b2 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 forgiveness for
158b3 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f yourself and fo
158b4 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a rgive others...*
158b5 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 * May you sha
158b6 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 re freely, never
158b7 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 taking more tha
158b8 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d n you give...**.
158b9 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
158ba 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158bb 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158bc 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
158bd 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a **********..**..
158be 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 ** This module i
158bf 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 62 6a mplements an obj
158c0 65 63 74 20 77 65 20 63 61 6c 6c 20 61 20 22 52 ect we call a "R
158c1 6f 77 53 65 74 22 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 owSet"...**..**
158c2 54 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 The RowSet objec
158c3 74 20 69 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f t is a collectio
158c4 6e 20 6f 66 20 72 6f 77 69 64 73 2e 20 20 52 6f n of rowids. Ro
158c5 77 69 64 73 0d 0a 2a 2a 20 61 72 65 20 69 6e 73 wids..** are ins
158c6 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 52 erted into the R
158c7 6f 77 53 65 74 20 69 6e 20 61 6e 20 61 72 62 69 owSet in an arbi
158c8 74 72 61 72 79 20 6f 72 64 65 72 2e 20 20 49 6e trary order. In
158c9 73 65 72 74 73 0d 0a 2a 2a 20 63 61 6e 20 62 65 serts..** can be
158ca 20 69 6e 74 65 72 6d 69 78 65 64 20 77 69 74 68 intermixed with
158cb 20 74 65 73 74 73 20 74 6f 20 73 65 65 20 69 66 tests to see if
158cc 20 61 20 67 69 76 65 6e 20 72 6f 77 69 64 20 68 a given rowid h
158cd 61 73 20 62 65 65 6e 0d 0a 2a 2a 20 70 72 65 76 as been..** prev
158ce 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20 iously inserted
158cf 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e into the RowSet.
158d0 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66 74 65 72 20 61 ..**..** After a
158d1 6c 6c 20 69 6e 73 65 72 74 73 20 61 72 65 20 66 ll inserts are f
158d2 69 6e 69 73 68 65 64 2c 20 69 74 20 69 73 20 70 inished, it is p
158d3 6f 73 73 69 62 6c 65 20 74 6f 20 65 78 74 72 61 ossible to extra
158d4 63 74 20 74 68 65 0d 0a 2a 2a 20 65 6c 65 6d 65 ct the..** eleme
158d5 6e 74 73 20 6f 66 20 74 68 65 20 52 6f 77 53 65 nts of the RowSe
158d6 74 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 t in sorted orde
158d7 72 2e 20 20 4f 6e 63 65 20 74 68 69 73 20 65 78 r. Once this ex
158d8 74 72 61 63 74 69 6f 6e 0d 0a 2a 2a 20 70 72 6f traction..** pro
158d9 63 65 73 73 20 68 61 73 20 73 74 61 72 74 65 64 cess has started
158da 2c 20 6e 6f 20 6e 65 77 20 65 6c 65 6d 65 6e 74 , no new element
158db 73 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 s may be inserte
158dc 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 48 65 6e 63 65 d...**..** Hence
158dd 2c 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 , the primitive
158de 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 61 operations for a
158df 20 52 6f 77 53 65 74 20 61 72 65 3a 0d 0a 2a 2a RowSet are:..**
158e0 0d 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 0d 0a ..** CREATE..
158e1 2a 2a 20 20 20 20 49 4e 53 45 52 54 0d 0a 2a 2a ** INSERT..**
158e2 20 20 20 20 54 45 53 54 0d 0a 2a 2a 20 20 20 20 TEST..**
158e3 53 4d 41 4c 4c 45 53 54 0d 0a 2a 2a 20 20 20 20 SMALLEST..**
158e4 44 45 53 54 52 4f 59 0d 0a 2a 2a 0d 0a 2a 2a 20 DESTROY..**..**
158e5 54 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 44 The CREATE and D
158e6 45 53 54 52 4f 59 20 70 72 69 6d 69 74 69 76 65 ESTROY primitive
158e7 73 20 61 72 65 20 74 68 65 20 63 6f 6e 73 74 72 s are the constr
158e8 75 63 74 6f 72 20 61 6e 64 20 64 65 73 74 72 75 uctor and destru
158e9 63 74 6f 72 2c 0d 0a 2a 2a 20 6f 62 76 69 6f 75 ctor,..** obviou
158ea 73 6c 79 2e 20 20 54 68 65 20 49 4e 53 45 52 54 sly. The INSERT
158eb 20 70 72 69 6d 69 74 69 76 65 20 61 64 64 73 20 primitive adds
158ec 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f a new element to
158ed 20 74 68 65 20 52 6f 77 53 65 74 2e 0d 0a 2a 2a the RowSet...**
158ee 20 54 45 53 54 20 63 68 65 63 6b 73 20 74 6f 20 TEST checks to
158ef 73 65 65 20 69 66 20 61 6e 20 65 6c 65 6d 65 6e see if an elemen
158f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 t is already in
158f1 74 68 65 20 52 6f 77 53 65 74 2e 20 20 53 4d 41 the RowSet. SMA
158f2 4c 4c 45 53 54 0d 0a 2a 2a 20 65 78 74 72 61 63 LLEST..** extrac
158f3 74 73 20 74 68 65 20 6c 65 61 73 74 20 76 61 6c ts the least val
158f4 75 65 20 66 72 6f 6d 20 74 68 65 20 52 6f 77 53 ue from the RowS
158f5 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 et...**..** The
158f6 49 4e 53 45 52 54 20 70 72 69 6d 69 74 69 76 65 INSERT primitive
158f7 20 6d 69 67 68 74 20 61 6c 6c 6f 63 61 74 65 20 might allocate
158f8 61 64 64 69 74 69 6f 6e 61 6c 20 6d 65 6d 6f 72 additional memor
158f9 79 2e 20 20 4d 65 6d 6f 72 79 20 69 73 0d 0a 2a y. Memory is..*
158fa 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 63 * allocated in c
158fb 68 75 6e 6b 73 20 73 6f 20 6d 6f 73 74 20 49 4e hunks so most IN
158fc 53 45 52 54 73 20 64 6f 20 6e 6f 20 61 6c 6c 6f SERTs do no allo
158fd 63 61 74 69 6f 6e 2e 20 20 54 68 65 72 65 20 69 cation. There i
158fe 73 20 61 6e 20 0d 0a 2a 2a 20 75 70 70 65 72 20 s an ..** upper
158ff 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69 7a bound on the siz
15900 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d e of allocated m
15901 65 6d 6f 72 79 2e 20 20 4e 6f 20 6d 65 6d 6f 72 emory. No memor
15902 79 20 69 73 20 66 72 65 65 64 0d 0a 2a 2a 20 75 y is freed..** u
15903 6e 74 69 6c 20 44 45 53 54 52 4f 59 2e 0d 0a 2a ntil DESTROY...*
15904 2a 0d 0a 2a 2a 20 54 68 65 20 54 45 53 54 20 70 *..** The TEST p
15905 72 69 6d 69 74 69 76 65 20 69 6e 63 6c 75 64 65 rimitive include
15906 73 20 61 20 22 62 61 74 63 68 22 20 6e 75 6d 62 s a "batch" numb
15907 65 72 2e 20 20 54 68 65 20 54 45 53 54 20 70 72 er. The TEST pr
15908 69 6d 69 74 69 76 65 0d 0a 2a 2a 20 77 69 6c 6c imitive..** will
15909 20 6f 6e 6c 79 20 73 65 65 20 65 6c 65 6d 65 6e only see elemen
1590a 74 73 20 74 68 61 74 20 77 65 72 65 20 69 6e 73 ts that were ins
1590b 65 72 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 erted before the
1590c 20 6c 61 73 74 20 63 68 61 6e 67 65 0d 0a 2a 2a last change..**
1590d 20 69 6e 20 74 68 65 20 62 61 74 63 68 20 6e 75 in the batch nu
1590e 6d 62 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 mber. In other
1590f 77 6f 72 64 73 2c 20 69 66 20 61 6e 20 49 4e 53 words, if an INS
15910 45 52 54 20 6f 63 63 75 72 73 20 62 65 74 77 65 ERT occurs betwe
15911 65 6e 0d 0a 2a 2a 20 74 77 6f 20 54 45 53 54 73 en..** two TESTs
15912 20 77 68 65 72 65 20 74 68 65 20 54 45 53 54 73 where the TESTs
15913 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 62 have the same b
15914 61 74 63 68 20 6e 75 62 6d 65 72 2c 20 74 68 65 atch nubmer, the
15915 6e 20 74 68 65 0d 0a 2a 2a 20 76 61 6c 75 65 20 n the..** value
15916 61 64 64 65 64 20 62 79 20 74 68 65 20 49 4e 53 added by the INS
15917 45 52 54 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 ERT will not be
15918 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 73 visible to the s
15919 65 63 6f 6e 64 20 54 45 53 54 2e 0d 0a 2a 2a 20 econd TEST...**
1591a 54 68 65 20 69 6e 69 74 69 61 6c 20 62 61 74 63 The initial batc
1591b 68 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f h number is zero
1591c 2c 20 73 6f 20 69 66 20 74 68 65 20 76 65 72 79 , so if the very
1591d 20 66 69 72 73 74 20 54 45 53 54 20 63 6f 6e 74 first TEST cont
1591e 61 69 6e 73 0d 0a 2a 2a 20 61 20 6e 6f 6e 2d 7a ains..** a non-z
1591f 65 72 6f 20 62 61 74 63 68 20 6e 75 6d 62 65 72 ero batch number
15920 2c 20 69 74 20 77 69 6c 6c 20 73 65 65 20 61 6c , it will see al
15921 6c 20 70 72 69 6f 72 20 49 4e 53 45 52 54 73 2e l prior INSERTs.
15922 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 20 49 4e 53 45 ..**..** No INSE
15923 52 54 73 20 6d 61 79 20 6f 63 63 75 72 73 20 61 RTs may occurs a
15924 66 74 65 72 20 61 20 53 4d 41 4c 4c 45 53 54 2e fter a SMALLEST.
15925 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 77 An assertion w
15926 69 6c 6c 20 66 61 69 6c 20 69 66 0d 0a 2a 2a 20 ill fail if..**
15927 74 68 61 74 20 69 73 20 61 74 74 65 6d 70 74 65 that is attempte
15928 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 d...**..** The c
15929 6f 73 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 ost of an INSERT
1592a 20 69 73 20 72 6f 75 67 68 6c 79 20 63 6f 6e 73 is roughly cons
1592b 74 61 6e 74 2e 20 20 28 53 6f 6d 65 74 69 6d 65 tant. (Sometime
1592c 20 6e 65 77 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 new memory..**
1592d 68 61 73 20 74 6f 20 62 65 20 61 6c 6c 6f 63 61 has to be alloca
1592e 74 65 64 20 6f 6e 20 61 6e 20 49 4e 53 45 52 54 ted on an INSERT
1592f 2e 29 20 20 54 68 65 20 63 6f 73 74 20 6f 66 20 .) The cost of
15930 61 20 54 45 53 54 20 77 69 74 68 20 61 20 6e 65 a TEST with a ne
15931 77 0d 0a 2a 2a 20 62 61 74 63 68 20 6e 75 6d 62 w..** batch numb
15932 65 72 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 20 77 er is O(NlogN) w
15933 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 here N is the nu
15934 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 mber of elements
15935 20 69 6e 20 74 68 65 20 52 6f 77 53 65 74 2e 0d in the RowSet..
15936 0a 2a 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 .** The cost of
15937 61 20 54 45 53 54 20 75 73 69 6e 67 20 74 68 65 a TEST using the
15938 20 73 61 6d 65 20 62 61 74 63 68 20 6e 75 6d 62 same batch numb
15939 65 72 20 69 73 20 4f 28 6c 6f 67 4e 29 2e 20 20 er is O(logN).
1593a 54 68 65 20 63 6f 73 74 0d 0a 2a 2a 20 6f 66 20 The cost..** of
1593b 74 68 65 20 66 69 72 73 74 20 53 4d 41 4c 4c 45 the first SMALLE
1593c 53 54 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 20 ST is O(NlogN).
1593d 20 53 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 Second and subs
1593e 65 71 75 65 6e 74 20 53 4d 41 4c 4c 45 53 54 0d equent SMALLEST.
1593f 0a 2a 2a 20 70 72 69 6d 69 74 69 76 65 73 20 61 .** primitives a
15940 72 65 20 63 6f 6e 73 74 61 6e 74 20 74 69 6d 65 re constant time
15941 2e 20 20 54 68 65 20 63 6f 73 74 20 6f 66 20 44 . The cost of D
15942 45 53 54 52 4f 59 20 69 73 20 4f 28 4e 29 2e 0d ESTROY is O(N)..
15943 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 20 69 73 .**..** There is
15944 20 61 6e 20 61 64 64 65 64 20 63 6f 73 74 20 6f an added cost o
15945 66 20 4f 28 4e 29 20 77 68 65 6e 20 73 77 69 74 f O(N) when swit
15946 63 68 69 6e 67 20 62 65 74 77 65 65 6e 20 54 45 ching between TE
15947 53 54 20 61 6e 64 0d 0a 2a 2a 20 53 4d 41 4c 4c ST and..** SMALL
15948 45 53 54 20 70 72 69 6d 69 74 69 76 65 73 2e 0d EST primitives..
15949 0a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 .*/....../*..**
1594a 54 61 72 67 65 74 20 73 69 7a 65 20 66 6f 72 20 Target size for
1594b 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 68 75 6e 6b allocation chunk
1594c 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 s...*/..#define
1594d 52 4f 57 53 45 54 5f 41 4c 4c 4f 43 41 54 49 4f ROWSET_ALLOCATIO
1594e 4e 5f 53 49 5a 45 20 31 30 32 34 0d 0a 0d 0a 2f N_SIZE 1024..../
1594f 2a 0d 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 *..** The number
15950 20 6f 66 20 72 6f 77 73 65 74 20 65 6e 74 72 69 of rowset entri
15951 65 73 20 70 65 72 20 61 6c 6c 6f 63 61 74 69 6f es per allocatio
15952 6e 20 63 68 75 6e 6b 2e 0d 0a 2a 2f 0d 0a 23 64 n chunk...*/..#d
15953 65 66 69 6e 65 20 52 4f 57 53 45 54 5f 45 4e 54 efine ROWSET_ENT
15954 52 59 5f 50 45 52 5f 43 48 55 4e 4b 20 20 5c 0d RY_PER_CHUNK \.
15955 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
15956 20 20 20 20 20 20 20 20 28 28 52 4f 57 53 45 54 ((ROWSET
15957 5f 41 4c 4c 4f 43 41 54 49 4f 4e 5f 53 49 5a 45 _ALLOCATION_SIZE
15958 2d 38 29 2f 73 69 7a 65 6f 66 28 73 74 72 75 63 -8)/sizeof(struc
15959 74 20 52 6f 77 53 65 74 45 6e 74 72 79 29 29 0d t RowSetEntry)).
1595a 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 65 .../*..** Each e
1595b 6e 74 72 79 20 69 6e 20 61 20 52 6f 77 53 65 74 ntry in a RowSet
1595c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 is an instance
1595d 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 of the following
1595e 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 object...*/..st
1595f 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 ruct RowSetEntry
15960 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a { ..
15961 20 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 i64 v;
15962 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15963 2f 2a 20 52 4f 57 49 44 20 76 61 6c 75 65 20 66 /* ROWID value f
15964 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 2a 2f or this entry */
15965 0d 0a 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 .. struct RowSe
15966 74 45 6e 74 72 79 20 2a 70 52 69 67 68 74 3b 20 tEntry *pRight;
15967 20 20 2f 2a 20 52 69 67 68 74 20 73 75 62 74 72 /* Right subtr
15968 65 65 20 28 6c 61 72 67 65 72 20 65 6e 74 72 69 ee (larger entri
15969 65 73 29 20 6f 72 20 6c 69 73 74 20 2a 2f 0d 0a es) or list */..
1596a 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 struct RowSetE
1596b 6e 74 72 79 20 2a 70 4c 65 66 74 3b 20 20 20 20 ntry *pLeft;
1596c 2f 2a 20 4c 65 66 74 20 73 75 62 74 72 65 65 20 /* Left subtree
1596d 28 73 6d 61 6c 6c 65 72 20 65 6e 74 72 69 65 73 (smaller entries
1596e 29 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a ) */..};..../*..
1596f 2a 2a 20 52 6f 77 53 65 74 45 6e 74 72 79 20 6f ** RowSetEntry o
15970 62 6a 65 63 74 73 20 61 72 65 20 61 6c 6c 6f 63 bjects are alloc
15971 61 74 65 64 20 69 6e 20 6c 61 72 67 65 20 63 68 ated in large ch
15972 75 6e 6b 73 20 28 69 6e 73 74 61 6e 63 65 73 20 unks (instances
15973 6f 66 20 74 68 65 0d 0a 2a 2a 20 66 6f 6c 6c 6f of the..** follo
15974 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 29 20 wing structure)
15975 74 6f 20 72 65 64 75 63 65 20 6d 65 6d 6f 72 79 to reduce memory
15976 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 76 65 72 allocation over
15977 68 65 61 64 2e 20 20 54 68 65 0d 0a 2a 2a 20 63 head. The..** c
15978 68 75 6e 6b 73 20 61 72 65 20 6b 65 70 74 20 6f hunks are kept o
15979 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 n a linked list
1597a 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e so that they can
1597b 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 0d be deallocated.
1597c 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 52 6f 77 .** when the Row
1597d 53 65 74 20 69 73 20 64 65 73 74 72 6f 79 65 64 Set is destroyed
1597e 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 52 6f ...*/..struct Ro
1597f 77 53 65 74 43 68 75 6e 6b 20 7b 0d 0a 20 20 73 wSetChunk {.. s
15980 74 72 75 63 74 20 52 6f 77 53 65 74 43 68 75 6e truct RowSetChun
15981 6b 20 2a 70 4e 65 78 74 43 68 75 6e 6b 3b 20 20 k *pNextChunk;
15982 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 /* Next ch
15983 75 6e 6b 20 6f 6e 20 6c 69 73 74 20 6f 66 20 74 unk on list of t
15984 68 65 6d 20 61 6c 6c 20 2a 2f 0d 0a 20 20 73 74 hem all */.. st
15985 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 ruct RowSetEntry
15986 20 61 45 6e 74 72 79 5b 52 4f 57 53 45 54 5f 45 aEntry[ROWSET_E
15987 4e 54 52 59 5f 50 45 52 5f 43 48 55 4e 4b 5d 3b NTRY_PER_CHUNK];
15988 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 65 6e /* Allocated en
15989 74 72 69 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a tries */..};....
1598a 2f 2a 0d 0a 2a 2a 20 41 20 52 6f 77 53 65 74 20 /*..** A RowSet
1598b 69 6e 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f in an instance o
1598c 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
1598d 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a structure...**..
1598e 2a 2a 20 41 20 74 79 70 65 64 65 66 20 6f 66 20 ** A typedef of
1598f 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 this structure i
15990 66 20 66 6f 75 6e 64 20 69 6e 20 73 71 6c 69 74 f found in sqlit
15991 65 49 6e 74 2e 68 2e 0d 0a 2a 2f 0d 0a 73 74 72 eInt.h...*/..str
15992 75 63 74 20 52 6f 77 53 65 74 20 7b 0d 0a 20 20 uct RowSet {..
15993 73 74 72 75 63 74 20 52 6f 77 53 65 74 43 68 75 struct RowSetChu
15994 6e 6b 20 2a 70 43 68 75 6e 6b 3b 20 20 20 20 2f nk *pChunk; /
15995 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 * List of all ch
15996 75 6e 6b 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 unk allocations
15997 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 */.. sqlite3 *d
15998 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
15999 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 /* The data
1599a 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
1599b 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 52 6f 77 */.. struct Row
1599c 53 65 74 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 SetEntry *pEntry
1599d 3b 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 ; /* List of
1599e 65 6e 74 72 69 65 73 20 75 73 69 6e 67 20 70 52 entries using pR
1599f 69 67 68 74 20 2a 2f 0d 0a 20 20 73 74 72 75 63 ight */.. struc
159a0 74 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a 70 t RowSetEntry *p
159a1 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 Last; /* Las
159a2 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 t entry on the p
159a3 45 6e 74 72 79 20 6c 69 73 74 20 2a 2f 0d 0a 20 Entry list */..
159a4 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e struct RowSetEn
159a5 74 72 79 20 2a 70 46 72 65 73 68 3b 20 20 20 20 try *pFresh;
159a6 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 6e 65 77 /* Source of new
159a7 20 65 6e 74 72 79 20 6f 62 6a 65 63 74 73 20 2a entry objects *
159a8 2f 0d 0a 20 20 73 74 72 75 63 74 20 52 6f 77 53 /.. struct RowS
159a9 65 74 45 6e 74 72 79 20 2a 70 54 72 65 65 3b 20 etEntry *pTree;
159aa 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 74 72 /* Binary tr
159ab 65 65 20 6f 66 20 65 6e 74 72 69 65 73 20 2a 2f ee of entries */
159ac 0d 0a 20 20 75 31 36 20 6e 46 72 65 73 68 3b 20 .. u16 nFresh;
159ad 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
159ae 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
159af 6f 62 6a 65 63 74 73 20 6f 6e 20 70 46 72 65 73 objects on pFres
159b0 68 20 2a 2f 0d 0a 20 20 75 38 20 69 73 53 6f 72 h */.. u8 isSor
159b1 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 ted;
159b2 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
159b3 66 20 70 45 6e 74 72 79 20 69 73 20 73 6f 72 74 f pEntry is sort
159b4 65 64 20 2a 2f 0d 0a 20 20 75 38 20 69 42 61 74 ed */.. u8 iBat
159b5 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ch;
159b6 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 /* Curre
159b7 6e 74 20 69 6e 73 65 72 74 20 62 61 74 63 68 20 nt insert batch
159b8 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
159b9 20 54 75 72 6e 20 62 75 6c 6b 20 6d 65 6d 6f 72 Turn bulk memor
159ba 79 20 69 6e 74 6f 20 61 20 52 6f 77 53 65 74 20 y into a RowSet
159bb 6f 62 6a 65 63 74 2e 20 20 4e 20 62 79 74 65 73 object. N bytes
159bc 20 6f 66 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 61 of memory..** a
159bd 72 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 re available at
159be 70 53 70 61 63 65 2e 20 20 54 68 65 20 64 62 20 pSpace. The db
159bf 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 pointer is used
159c0 61 73 20 61 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 as a memory cont
159c1 65 78 74 0d 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 ext..** for any
159c2 73 75 62 73 65 71 75 65 6e 74 20 61 6c 6c 6f 63 subsequent alloc
159c3 61 74 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 ations that need
159c4 20 74 6f 20 6f 63 63 75 72 2e 0d 0a 2a 2a 20 52 to occur...** R
159c5 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 eturn a pointer
159c6 74 6f 20 74 68 65 20 6e 65 77 20 52 6f 77 53 65 to the new RowSe
159c7 74 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a t object...**..*
159c8 2a 20 49 74 20 6d 75 73 74 20 62 65 20 74 68 65 * It must be the
159c9 20 63 61 73 65 20 74 68 61 74 20 4e 20 69 73 20 case that N is
159ca 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 6d 61 sufficient to ma
159cb 6b 65 20 61 20 52 6f 77 73 65 74 2e 20 20 49 66 ke a Rowset. If
159cc 20 6e 6f 74 0d 0a 2a 2a 20 61 6e 20 61 73 73 65 not..** an asse
159cd 72 74 69 6f 6e 20 66 61 75 6c 74 20 6f 63 63 75 rtion fault occu
159ce 72 73 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66 20 rs...** ..** If
159cf 4e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e N is larger than
159d0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2c 20 75 73 the minimum, us
159d1 65 20 74 68 65 20 73 75 72 70 6c 75 73 20 61 73 e the surplus as
159d2 20 61 6e 20 69 6e 69 74 69 61 6c 0d 0a 2a 2a 20 an initial..**
159d3 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 65 6e allocation of en
159d4 74 72 69 65 73 20 61 76 61 69 6c 61 62 6c 65 20 tries available
159d5 74 6f 20 62 65 20 66 69 6c 6c 65 64 2e 0d 0a 2a to be filled...*
159d6 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
159d7 45 20 52 6f 77 53 65 74 20 2a 73 71 6c 69 74 65 E RowSet *sqlite
159d8 33 52 6f 77 53 65 74 49 6e 69 74 28 73 71 6c 69 3RowSetInit(sqli
159d9 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 te3 *db, void *p
159da 53 70 61 63 65 2c 20 75 6e 73 69 67 6e 65 64 20 Space, unsigned
159db 69 6e 74 20 4e 29 7b 0d 0a 20 20 52 6f 77 53 65 int N){.. RowSe
159dc 74 20 2a 70 3b 0d 0a 20 20 61 73 73 65 72 74 28 t *p;.. assert(
159dd 20 4e 20 3e 3d 20 52 4f 55 4e 44 38 28 73 69 7a N >= ROUND8(siz
159de 65 6f 66 28 2a 70 29 29 20 29 3b 0d 0a 20 20 70 eof(*p)) );.. p
159df 20 3d 20 70 53 70 61 63 65 3b 0d 0a 20 20 70 2d = pSpace;.. p-
159e0 3e 70 43 68 75 6e 6b 20 3d 20 30 3b 0d 0a 20 20 >pChunk = 0;..
159e1 70 2d 3e 64 62 20 3d 20 64 62 3b 0d 0a 20 20 70 p->db = db;.. p
159e2 2d 3e 70 45 6e 74 72 79 20 3d 20 30 3b 0d 0a 20 ->pEntry = 0;..
159e3 20 70 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0d 0a p->pLast = 0;..
159e4 20 20 70 2d 3e 70 54 72 65 65 20 3d 20 30 3b 0d p->pTree = 0;.
159e5 0a 20 20 70 2d 3e 70 46 72 65 73 68 20 3d 20 28 . p->pFresh = (
159e6 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 struct RowSetEnt
159e7 72 79 2a 29 28 52 4f 55 4e 44 38 28 73 69 7a 65 ry*)(ROUND8(size
159e8 6f 66 28 2a 70 29 29 20 2b 20 28 63 68 61 72 2a of(*p)) + (char*
159e9 29 70 29 3b 0d 0a 20 20 70 2d 3e 6e 46 72 65 73 )p);.. p->nFres
159ea 68 20 3d 20 28 75 31 36 29 28 28 4e 20 2d 20 52 h = (u16)((N - R
159eb 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 29 OUND8(sizeof(*p)
159ec 29 29 2f 73 69 7a 65 6f 66 28 73 74 72 75 63 74 ))/sizeof(struct
159ed 20 52 6f 77 53 65 74 45 6e 74 72 79 29 29 3b 0d RowSetEntry));.
159ee 0a 20 20 70 2d 3e 69 73 53 6f 72 74 65 64 20 3d . p->isSorted =
159ef 20 31 3b 0d 0a 20 20 70 2d 3e 69 42 61 74 63 68 1;.. p->iBatch
159f0 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 = 0;.. return
159f1 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 p;..}..../*..**
159f2 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 Deallocate all c
159f3 68 75 6e 6b 73 20 66 72 6f 6d 20 61 20 52 6f 77 hunks from a Row
159f4 53 65 74 2e 20 20 54 68 69 73 20 66 72 65 65 73 Set. This frees
159f5 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 74 68 61 74 all memory that
159f6 0d 0a 2a 2a 20 74 68 65 20 52 6f 77 53 65 74 20 ..** the RowSet
159f7 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 76 has allocated ov
159f8 65 72 20 69 74 73 20 6c 69 66 65 74 69 6d 65 2e er its lifetime.
159f9 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 This routine i
159fa 73 0d 0a 2a 2a 20 74 68 65 20 64 65 73 74 72 75 s..** the destru
159fb 63 74 6f 72 20 66 6f 72 20 74 68 65 20 52 6f 77 ctor for the Row
159fc 53 65 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 Set...*/..SQLITE
159fd 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
159fe 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 lite3RowSetClear
159ff 28 52 6f 77 53 65 74 20 2a 70 29 7b 0d 0a 20 20 (RowSet *p){..
15a00 73 74 72 75 63 74 20 52 6f 77 53 65 74 43 68 75 struct RowSetChu
15a01 6e 6b 20 2a 70 43 68 75 6e 6b 2c 20 2a 70 4e 65 nk *pChunk, *pNe
15a02 78 74 43 68 75 6e 6b 3b 0d 0a 20 20 66 6f 72 28 xtChunk;.. for(
15a03 70 43 68 75 6e 6b 3d 70 2d 3e 70 43 68 75 6e 6b pChunk=p->pChunk
15a04 3b 20 70 43 68 75 6e 6b 3b 20 70 43 68 75 6e 6b ; pChunk; pChunk
15a05 20 3d 20 70 4e 65 78 74 43 68 75 6e 6b 29 7b 0d = pNextChunk){.
15a06 0a 20 20 20 20 70 4e 65 78 74 43 68 75 6e 6b 20 . pNextChunk
15a07 3d 20 70 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 43 = pChunk->pNextC
15a08 68 75 6e 6b 3b 0d 0a 20 20 20 20 73 71 6c 69 74 hunk;.. sqlit
15a09 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 e3DbFree(p->db,
15a0a 70 43 68 75 6e 6b 29 3b 0d 0a 20 20 7d 0d 0a 20 pChunk);.. }..
15a0b 20 70 2d 3e 70 43 68 75 6e 6b 20 3d 20 30 3b 0d p->pChunk = 0;.
15a0c 0a 20 20 70 2d 3e 6e 46 72 65 73 68 20 3d 20 30 . p->nFresh = 0
15a0d 3b 0d 0a 20 20 70 2d 3e 70 45 6e 74 72 79 20 3d ;.. p->pEntry =
15a0e 20 30 3b 0d 0a 20 20 70 2d 3e 70 4c 61 73 74 20 0;.. p->pLast
15a0f 3d 20 30 3b 0d 0a 20 20 70 2d 3e 70 54 72 65 65 = 0;.. p->pTree
15a10 20 3d 20 30 3b 0d 0a 20 20 70 2d 3e 69 73 53 6f = 0;.. p->isSo
15a11 72 74 65 64 20 3d 20 31 3b 0d 0a 7d 0d 0a 0d 0a rted = 1;..}....
15a12 2f 2a 0d 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 /*..** Insert a
15a13 6e 65 77 20 76 61 6c 75 65 20 69 6e 74 6f 20 61 new value into a
15a14 20 52 6f 77 53 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a RowSet...**..**
15a15 20 54 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 The mallocFaile
15a16 64 20 66 6c 61 67 20 6f 66 20 74 68 65 20 64 61 d flag of the da
15a17 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
15a18 6e 20 69 73 20 73 65 74 20 69 66 20 61 0d 0a 2a n is set if a..*
15a19 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 * memory allocat
15a1a 69 6f 6e 20 66 61 69 6c 73 2e 0d 0a 2a 2f 0d 0a ion fails...*/..
15a1b 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
15a1c 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 53 65 oid sqlite3RowSe
15a1d 74 49 6e 73 65 72 74 28 52 6f 77 53 65 74 20 2a tInsert(RowSet *
15a1e 70 2c 20 69 36 34 20 72 6f 77 69 64 29 7b 0d 0a p, i64 rowid){..
15a1f 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 struct RowSetE
15a20 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 20 20 2f ntry *pEntry; /
15a21 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 * The new entry
15a22 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 52 6f 77 */.. struct Row
15a23 53 65 74 45 6e 74 72 79 20 2a 70 4c 61 73 74 3b SetEntry *pLast;
15a24 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 70 /* The last p
15a25 72 69 6f 72 20 65 6e 74 72 79 20 2a 2f 0d 0a 20 rior entry */..
15a26 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b assert( p!=0 );
15a27 0d 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 65 73 .. if( p->nFres
15a28 68 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 73 74 72 h==0 ){.. str
15a29 75 63 74 20 52 6f 77 53 65 74 43 68 75 6e 6b 20 uct RowSetChunk
15a2a 2a 70 4e 65 77 3b 0d 0a 20 20 20 20 70 4e 65 77 *pNew;.. pNew
15a2b 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c = sqlite3DbMall
15a2c 6f 63 52 61 77 28 70 2d 3e 64 62 2c 20 73 69 7a ocRaw(p->db, siz
15a2d 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0d 0a 20 20 eof(*pNew));..
15a2e 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b if( pNew==0 ){
15a2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d .. return;.
15a30 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 4e 65 77 . }.. pNew
15a31 2d 3e 70 4e 65 78 74 43 68 75 6e 6b 20 3d 20 70 ->pNextChunk = p
15a32 2d 3e 70 43 68 75 6e 6b 3b 0d 0a 20 20 20 20 70 ->pChunk;.. p
15a33 2d 3e 70 43 68 75 6e 6b 20 3d 20 70 4e 65 77 3b ->pChunk = pNew;
15a34 0d 0a 20 20 20 20 70 2d 3e 70 46 72 65 73 68 20 .. p->pFresh
15a35 3d 20 70 4e 65 77 2d 3e 61 45 6e 74 72 79 3b 0d = pNew->aEntry;.
15a36 0a 20 20 20 20 70 2d 3e 6e 46 72 65 73 68 20 3d . p->nFresh =
15a37 20 52 4f 57 53 45 54 5f 45 4e 54 52 59 5f 50 45 ROWSET_ENTRY_PE
15a38 52 5f 43 48 55 4e 4b 3b 0d 0a 20 20 7d 0d 0a 20 R_CHUNK;.. }..
15a39 20 70 45 6e 74 72 79 20 3d 20 70 2d 3e 70 46 72 pEntry = p->pFr
15a3a 65 73 68 2b 2b 3b 0d 0a 20 20 70 2d 3e 6e 46 72 esh++;.. p->nFr
15a3b 65 73 68 2d 2d 3b 0d 0a 20 20 70 45 6e 74 72 79 esh--;.. pEntry
15a3c 2d 3e 76 20 3d 20 72 6f 77 69 64 3b 0d 0a 20 20 ->v = rowid;..
15a3d 70 45 6e 74 72 79 2d 3e 70 52 69 67 68 74 20 3d pEntry->pRight =
15a3e 20 30 3b 0d 0a 20 20 70 4c 61 73 74 20 3d 20 70 0;.. pLast = p
15a3f 2d 3e 70 4c 61 73 74 3b 0d 0a 20 20 69 66 28 20 ->pLast;.. if(
15a40 70 4c 61 73 74 20 29 7b 0d 0a 20 20 20 20 69 66 pLast ){.. if
15a41 28 20 70 2d 3e 69 73 53 6f 72 74 65 64 20 26 26 ( p->isSorted &&
15a42 20 72 6f 77 69 64 3c 3d 70 4c 61 73 74 2d 3e 76 rowid<=pLast->v
15a43 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e 69 73 ){.. p->is
15a44 53 6f 72 74 65 64 20 3d 20 30 3b 0d 0a 20 20 20 Sorted = 0;..
15a45 20 7d 0d 0a 20 20 20 20 70 4c 61 73 74 2d 3e 70 }.. pLast->p
15a46 52 69 67 68 74 20 3d 20 70 45 6e 74 72 79 3b 0d Right = pEntry;.
15a47 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 61 . }else{.. a
15a48 73 73 65 72 74 28 20 70 2d 3e 70 45 6e 74 72 79 ssert( p->pEntry
15a49 3d 3d 30 20 29 3b 20 2f 2a 20 46 69 72 65 73 20 ==0 ); /* Fires
15a4a 69 66 20 49 4e 53 45 52 54 20 61 66 74 65 72 20 if INSERT after
15a4b 53 4d 41 4c 4c 45 53 54 20 2a 2f 0d 0a 20 20 20 SMALLEST */..
15a4c 20 70 2d 3e 70 45 6e 74 72 79 20 3d 20 70 45 6e p->pEntry = pEn
15a4d 74 72 79 3b 0d 0a 20 20 7d 0d 0a 20 20 70 2d 3e try;.. }.. p->
15a4e 70 4c 61 73 74 20 3d 20 70 45 6e 74 72 79 3b 0d pLast = pEntry;.
15a4f 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 65 72 .}..../*..** Mer
15a50 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 ge two lists of
15a51 52 6f 77 53 65 74 45 6e 74 72 79 20 6f 62 6a 65 RowSetEntry obje
15a52 63 74 73 2e 20 20 52 65 6d 6f 76 65 20 64 75 70 cts. Remove dup
15a53 6c 69 63 61 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a licates...**..**
15a54 20 54 68 65 20 69 6e 70 75 74 20 6c 69 73 74 73 The input lists
15a55 20 61 72 65 20 63 6f 6e 6e 65 63 74 65 64 20 76 are connected v
15a56 69 61 20 70 52 69 67 68 74 20 70 6f 69 6e 74 65 ia pRight pointe
15a57 72 73 20 61 6e 64 20 61 72 65 20 0d 0a 2a 2a 20 rs and are ..**
15a58 61 73 73 75 6d 65 64 20 74 6f 20 65 61 63 68 20 assumed to each
15a59 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 73 6f already be in so
15a5a 72 74 65 64 20 6f 72 64 65 72 2e 0d 0a 2a 2f 0d rted order...*/.
15a5b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 52 .static struct R
15a5c 6f 77 53 65 74 45 6e 74 72 79 20 2a 72 6f 77 53 owSetEntry *rowS
15a5d 65 74 4d 65 72 67 65 28 0d 0a 20 20 73 74 72 75 etMerge(.. stru
15a5e 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a ct RowSetEntry *
15a5f 70 41 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 pA, /* First
15a60 73 6f 72 74 65 64 20 6c 69 73 74 20 74 6f 20 62 sorted list to b
15a61 65 20 6d 65 72 67 65 64 20 2a 2f 0d 0a 20 20 73 e merged */.. s
15a62 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 truct RowSetEntr
15a63 79 20 2a 70 42 20 20 20 20 20 2f 2a 20 53 65 63 y *pB /* Sec
15a64 6f 6e 64 20 73 6f 72 74 65 64 20 6c 69 73 74 20 ond sorted list
15a65 74 6f 20 62 65 20 6d 65 72 67 65 64 20 2a 2f 0d to be merged */.
15a66 0a 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 52 6f .){.. struct Ro
15a67 77 53 65 74 45 6e 74 72 79 20 68 65 61 64 3b 0d wSetEntry head;.
15a68 0a 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 . struct RowSet
15a69 45 6e 74 72 79 20 2a 70 54 61 69 6c 3b 0d 0a 0d Entry *pTail;...
15a6a 0a 20 20 70 54 61 69 6c 20 3d 20 26 68 65 61 64 . pTail = &head
15a6b 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 ;.. while( pA &
15a6c 26 20 70 42 20 29 7b 0d 0a 20 20 20 20 61 73 73 & pB ){.. ass
15a6d 65 72 74 28 20 70 41 2d 3e 70 52 69 67 68 74 3d ert( pA->pRight=
15a6e 3d 30 20 7c 7c 20 70 41 2d 3e 76 3c 3d 70 41 2d =0 || pA->v<=pA-
15a6f 3e 70 52 69 67 68 74 2d 3e 76 20 29 3b 0d 0a 20 >pRight->v );..
15a70 20 20 20 61 73 73 65 72 74 28 20 70 42 2d 3e 70 assert( pB->p
15a71 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 42 2d 3e Right==0 || pB->
15a72 76 3c 3d 70 42 2d 3e 70 52 69 67 68 74 2d 3e 76 v<=pB->pRight->v
15a73 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 41 2d );.. if( pA-
15a74 3e 76 3c 70 42 2d 3e 76 20 29 7b 0d 0a 20 20 20 >v<pB->v ){..
15a75 20 20 20 70 54 61 69 6c 2d 3e 70 52 69 67 68 74 pTail->pRight
15a76 20 3d 20 70 41 3b 0d 0a 20 20 20 20 20 20 70 41 = pA;.. pA
15a77 20 3d 20 70 41 2d 3e 70 52 69 67 68 74 3b 0d 0a = pA->pRight;..
15a78 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 54 pTail = pT
15a79 61 69 6c 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 20 ail->pRight;..
15a7a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e }else if( pB->
15a7b 76 3c 70 41 2d 3e 76 20 29 7b 0d 0a 20 20 20 20 v<pA->v ){..
15a7c 20 20 70 54 61 69 6c 2d 3e 70 52 69 67 68 74 20 pTail->pRight
15a7d 3d 20 70 42 3b 0d 0a 20 20 20 20 20 20 70 42 20 = pB;.. pB
15a7e 3d 20 70 42 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 = pB->pRight;..
15a7f 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 54 61 pTail = pTa
15a80 69 6c 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 20 20 il->pRight;..
15a81 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 }else{.. p
15a82 41 20 3d 20 70 41 2d 3e 70 52 69 67 68 74 3b 0d A = pA->pRight;.
15a83 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 . }.. }.. i
15a84 66 28 20 70 41 20 29 7b 0d 0a 20 20 20 20 61 73 f( pA ){.. as
15a85 73 65 72 74 28 20 70 41 2d 3e 70 52 69 67 68 74 sert( pA->pRight
15a86 3d 3d 30 20 7c 7c 20 70 41 2d 3e 76 3c 3d 70 41 ==0 || pA->v<=pA
15a87 2d 3e 70 52 69 67 68 74 2d 3e 76 20 29 3b 0d 0a ->pRight->v );..
15a88 20 20 20 20 70 54 61 69 6c 2d 3e 70 52 69 67 68 pTail->pRigh
15a89 74 20 3d 20 70 41 3b 0d 0a 20 20 7d 65 6c 73 65 t = pA;.. }else
15a8a 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 {.. assert( p
15a8b 42 3d 3d 30 20 7c 7c 20 70 42 2d 3e 70 52 69 67 B==0 || pB->pRig
15a8c 68 74 3d 3d 30 20 7c 7c 20 70 42 2d 3e 76 3c 3d ht==0 || pB->v<=
15a8d 70 42 2d 3e 70 52 69 67 68 74 2d 3e 76 20 29 3b pB->pRight->v );
15a8e 0d 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 52 69 .. pTail->pRi
15a8f 67 68 74 20 3d 20 70 42 3b 0d 0a 20 20 7d 0d 0a ght = pB;.. }..
15a90 20 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 52 return head.pR
15a91 69 67 68 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a ight;..}..../*..
15a92 2a 2a 20 53 6f 72 74 20 61 6c 6c 20 65 6c 65 6d ** Sort all elem
15a93 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 45 6e 74 ents on the pEnt
15a94 72 79 20 6c 69 73 74 20 6f 66 20 74 68 65 20 52 ry list of the R
15a95 6f 77 53 65 74 20 69 6e 74 6f 20 61 73 63 65 6e owSet into ascen
15a96 64 69 6e 67 20 6f 72 64 65 72 2e 0d 0a 2a 2f 20 ding order...*/
15a97 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f ..static void ro
15a98 77 53 65 74 53 6f 72 74 28 52 6f 77 53 65 74 20 wSetSort(RowSet
15a99 2a 70 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 *p){.. unsigned
15a9a 20 69 6e 74 20 69 3b 0d 0a 20 20 73 74 72 75 63 int i;.. struc
15a9b 74 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a 70 t RowSetEntry *p
15a9c 45 6e 74 72 79 3b 0d 0a 20 20 73 74 72 75 63 74 Entry;.. struct
15a9d 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a 61 42 RowSetEntry *aB
15a9e 75 63 6b 65 74 5b 34 30 5d 3b 0d 0a 0d 0a 20 20 ucket[40];....
15a9f 61 73 73 65 72 74 28 20 70 2d 3e 69 73 53 6f 72 assert( p->isSor
15aa0 74 65 64 3d 3d 30 20 29 3b 0d 0a 20 20 6d 65 6d ted==0 );.. mem
15aa1 73 65 74 28 61 42 75 63 6b 65 74 2c 20 30 2c 20 set(aBucket, 0,
15aa2 73 69 7a 65 6f 66 28 61 42 75 63 6b 65 74 29 29 sizeof(aBucket))
15aa3 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 ;.. while( p->p
15aa4 45 6e 74 72 79 20 29 7b 0d 0a 20 20 20 20 70 45 Entry ){.. pE
15aa5 6e 74 72 79 20 3d 20 70 2d 3e 70 45 6e 74 72 79 ntry = p->pEntry
15aa6 3b 0d 0a 20 20 20 20 70 2d 3e 70 45 6e 74 72 79 ;.. p->pEntry
15aa7 20 3d 20 70 45 6e 74 72 79 2d 3e 70 52 69 67 68 = pEntry->pRigh
15aa8 74 3b 0d 0a 20 20 20 20 70 45 6e 74 72 79 2d 3e t;.. pEntry->
15aa9 70 52 69 67 68 74 20 3d 20 30 3b 0d 0a 20 20 20 pRight = 0;..
15aaa 20 66 6f 72 28 69 3d 30 3b 20 61 42 75 63 6b 65 for(i=0; aBucke
15aab 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 t[i]; i++){..
15aac 20 20 20 70 45 6e 74 72 79 20 3d 20 72 6f 77 53 pEntry = rowS
15aad 65 74 4d 65 72 67 65 28 61 42 75 63 6b 65 74 5b etMerge(aBucket[
15aae 69 5d 2c 20 70 45 6e 74 72 79 29 3b 0d 0a 20 20 i], pEntry);..
15aaf 20 20 20 20 61 42 75 63 6b 65 74 5b 69 5d 20 3d aBucket[i] =
15ab0 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0;.. }..
15ab1 61 42 75 63 6b 65 74 5b 69 5d 20 3d 20 70 45 6e aBucket[i] = pEn
15ab2 74 72 79 3b 0d 0a 20 20 7d 0d 0a 20 20 70 45 6e try;.. }.. pEn
15ab3 74 72 79 20 3d 20 30 3b 0d 0a 20 20 66 6f 72 28 try = 0;.. for(
15ab4 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 42 i=0; i<sizeof(aB
15ab5 75 63 6b 65 74 29 2f 73 69 7a 65 6f 66 28 61 42 ucket)/sizeof(aB
15ab6 75 63 6b 65 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b ucket[0]); i++){
15ab7 0d 0a 20 20 20 20 70 45 6e 74 72 79 20 3d 20 72 .. pEntry = r
15ab8 6f 77 53 65 74 4d 65 72 67 65 28 70 45 6e 74 72 owSetMerge(pEntr
15ab9 79 2c 20 61 42 75 63 6b 65 74 5b 69 5d 29 3b 0d y, aBucket[i]);.
15aba 0a 20 20 7d 0d 0a 20 20 70 2d 3e 70 45 6e 74 72 . }.. p->pEntr
15abb 79 20 3d 20 70 45 6e 74 72 79 3b 0d 0a 20 20 70 y = pEntry;.. p
15abc 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0d 0a 20 20 ->pLast = 0;..
15abd 70 2d 3e 69 73 53 6f 72 74 65 64 20 3d 20 31 3b p->isSorted = 1;
15abe 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ..}....../*..**
15abf 54 68 65 20 69 6e 70 75 74 2c 20 70 49 6e 2c 20 The input, pIn,
15ac0 69 73 20 61 20 62 69 6e 61 72 79 20 74 72 65 65 is a binary tree
15ac1 20 28 6f 72 20 73 75 62 74 72 65 65 29 20 6f 66 (or subtree) of
15ac2 20 52 6f 77 53 65 74 45 6e 74 72 79 20 6f 62 6a RowSetEntry obj
15ac3 65 63 74 73 2e 0d 0a 2a 2a 20 43 6f 6e 76 65 72 ects...** Conver
15ac4 74 20 74 68 69 73 20 74 72 65 65 20 69 6e 74 6f t this tree into
15ac5 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 63 a linked list c
15ac6 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 onnected by the
15ac7 70 52 69 67 68 74 20 70 6f 69 6e 74 65 72 73 0d pRight pointers.
15ac8 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 70 .** and return p
15ac9 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 66 ointers to the f
15aca 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 65 6c irst and last el
15acb 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 6e 65 ements of the ne
15acc 77 20 6c 69 73 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 w list...*/..sta
15acd 74 69 63 20 76 6f 69 64 20 72 6f 77 53 65 74 54 tic void rowSetT
15ace 72 65 65 54 6f 4c 69 73 74 28 0d 0a 20 20 73 74 reeToList(.. st
15acf 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 ruct RowSetEntry
15ad0 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20 2f *pIn, /
15ad1 2a 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 69 6e * Root of the in
15ad2 70 75 74 20 74 72 65 65 20 2a 2f 0d 0a 20 20 73 put tree */.. s
15ad3 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 truct RowSetEntr
15ad4 79 20 2a 2a 70 70 46 69 72 73 74 2c 20 20 20 20 y **ppFirst,
15ad5 2f 2a 20 57 72 69 74 65 20 68 65 61 64 20 6f 66 /* Write head of
15ad6 20 74 68 65 20 6f 75 74 70 75 74 20 6c 69 73 74 the output list
15ad7 20 68 65 72 65 20 2a 2f 0d 0a 20 20 73 74 72 75 here */.. stru
15ad8 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a ct RowSetEntry *
15ad9 2a 70 70 4c 61 73 74 20 20 20 20 20 20 2f 2a 20 *ppLast /*
15ada 57 72 69 74 65 20 74 61 69 6c 20 6f 66 20 74 68 Write tail of th
15adb 65 20 6f 75 74 70 75 74 20 6c 69 73 74 20 68 65 e output list he
15adc 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 61 73 73 re */..){.. ass
15add 65 72 74 28 20 70 49 6e 21 3d 30 20 29 3b 0d 0a ert( pIn!=0 );..
15ade 20 20 69 66 28 20 70 49 6e 2d 3e 70 4c 65 66 74 if( pIn->pLeft
15adf 20 29 7b 0d 0a 20 20 20 20 73 74 72 75 63 74 20 ){.. struct
15ae0 52 6f 77 53 65 74 45 6e 74 72 79 20 2a 70 3b 0d RowSetEntry *p;.
15ae1 0a 20 20 20 20 72 6f 77 53 65 74 54 72 65 65 54 . rowSetTreeT
15ae2 6f 4c 69 73 74 28 70 49 6e 2d 3e 70 4c 65 66 74 oList(pIn->pLeft
15ae3 2c 20 70 70 46 69 72 73 74 2c 20 26 70 29 3b 0d , ppFirst, &p);.
15ae4 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 20 3d . p->pRight =
15ae5 20 70 49 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d pIn;.. }else{.
15ae6 0a 20 20 20 20 2a 70 70 46 69 72 73 74 20 3d 20 . *ppFirst =
15ae7 70 49 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 pIn;.. }.. if(
15ae8 20 70 49 6e 2d 3e 70 52 69 67 68 74 20 29 7b 0d pIn->pRight ){.
15ae9 0a 20 20 20 20 72 6f 77 53 65 74 54 72 65 65 54 . rowSetTreeT
15aea 6f 4c 69 73 74 28 70 49 6e 2d 3e 70 52 69 67 68 oList(pIn->pRigh
15aeb 74 2c 20 26 70 49 6e 2d 3e 70 52 69 67 68 74 2c t, &pIn->pRight,
15aec 20 70 70 4c 61 73 74 29 3b 0d 0a 20 20 7d 65 6c ppLast);.. }el
15aed 73 65 7b 0d 0a 20 20 20 20 2a 70 70 4c 61 73 74 se{.. *ppLast
15aee 20 3d 20 70 49 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 = pIn;.. }..
15aef 61 73 73 65 72 74 28 20 28 2a 70 70 4c 61 73 74 assert( (*ppLast
15af0 29 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0d )->pRight==0 );.
15af1 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 .}....../*..** C
15af2 6f 6e 76 65 72 74 20 61 20 73 6f 72 74 65 64 20 onvert a sorted
15af3 6c 69 73 74 20 6f 66 20 65 6c 65 6d 65 6e 74 73 list of elements
15af4 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 (connected by p
15af5 52 69 67 68 74 29 20 69 6e 74 6f 20 61 20 62 69 Right) into a bi
15af6 6e 61 72 79 0d 0a 2a 2a 20 74 72 65 65 20 77 69 nary..** tree wi
15af7 74 68 20 64 65 70 74 68 20 6f 66 20 69 44 65 70 th depth of iDep
15af8 74 68 2e 20 20 41 20 64 65 70 74 68 20 6f 66 20 th. A depth of
15af9 31 20 6d 65 61 6e 73 20 74 68 65 20 74 72 65 65 1 means the tree
15afa 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 contains a sing
15afb 6c 65 0d 0a 2a 2a 20 6e 6f 64 65 20 74 61 6b 65 le..** node take
15afc 6e 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 20 n from the head
15afd 6f 66 20 2a 70 70 4c 69 73 74 2e 20 20 41 20 64 of *ppList. A d
15afe 65 70 74 68 20 6f 66 20 32 20 6d 65 61 6e 73 20 epth of 2 means
15aff 61 20 74 72 65 65 20 77 69 74 68 0d 0a 2a 2a 20 a tree with..**
15b00 74 68 72 65 65 20 6e 6f 64 65 73 2e 20 20 41 6e three nodes. An
15b01 64 20 73 6f 20 66 6f 72 74 68 2e 0d 0a 2a 2a 0d d so forth...**.
15b02 0a 2a 2a 20 55 73 65 20 61 73 20 6d 61 6e 79 20 .** Use as many
15b03 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 entries from the
15b04 20 69 6e 70 75 74 20 6c 69 73 74 20 61 73 20 72 input list as r
15b05 65 71 75 69 72 65 64 20 61 6e 64 20 75 70 64 61 equired and upda
15b06 74 65 20 74 68 65 0d 0a 2a 2a 20 2a 70 70 4c 69 te the..** *ppLi
15b07 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 st to point to t
15b08 68 65 20 75 6e 75 73 65 64 20 65 6c 65 6d 65 6e he unused elemen
15b09 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 ts of the list.
15b0a 20 49 66 20 74 68 65 20 69 6e 70 75 74 0d 0a 2a If the input..*
15b0b 2a 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 * list contains
15b0c 74 6f 6f 20 66 65 77 20 65 6c 65 6d 65 6e 74 73 too few elements
15b0d 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 , then construct
15b0e 20 61 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 20 74 an incomplete t
15b0f 72 65 65 0d 0a 2a 2a 20 61 6e 64 20 6c 65 61 76 ree..** and leav
15b10 65 20 2a 70 70 4c 69 73 74 20 73 65 74 20 74 6f e *ppList set to
15b11 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 NULL...**..** R
15b12 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 eturn a pointer
15b13 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 to the root of t
15b14 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 he constructed b
15b15 69 6e 61 72 79 20 74 72 65 65 2e 0d 0a 2a 2f 0d inary tree...*/.
15b16 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 52 .static struct R
15b17 6f 77 53 65 74 45 6e 74 72 79 20 2a 72 6f 77 53 owSetEntry *rowS
15b18 65 74 4e 44 65 65 70 54 72 65 65 28 0d 0a 20 20 etNDeepTree(..
15b19 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 struct RowSetEnt
15b1a 72 79 20 2a 2a 70 70 4c 69 73 74 2c 0d 0a 20 20 ry **ppList,..
15b1b 69 6e 74 20 69 44 65 70 74 68 0d 0a 29 7b 0d 0a int iDepth..){..
15b1c 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 struct RowSetE
15b1d 6e 74 72 79 20 2a 70 3b 20 20 20 20 20 20 20 20 ntry *p;
15b1e 20 2f 2a 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 /* Root of the
15b1f 6e 65 77 20 74 72 65 65 20 2a 2f 0d 0a 20 20 73 new tree */.. s
15b20 74 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 truct RowSetEntr
15b21 79 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a y *pLeft; /*
15b22 20 4c 65 66 74 20 73 75 62 74 72 65 65 20 2a 2f Left subtree */
15b23 0d 0a 20 20 69 66 28 20 2a 70 70 4c 69 73 74 3d .. if( *ppList=
15b24 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 =0 ){.. retur
15b25 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 n 0;.. }.. if(
15b26 20 69 44 65 70 74 68 3d 3d 31 20 29 7b 0d 0a 20 iDepth==1 ){..
15b27 20 20 20 70 20 3d 20 2a 70 70 4c 69 73 74 3b 0d p = *ppList;.
15b28 0a 20 20 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 . *ppList = p
15b29 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 20 20 20 70 ->pRight;.. p
15b2a 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 52 69 ->pLeft = p->pRi
15b2b 67 68 74 20 3d 20 30 3b 0d 0a 20 20 20 20 72 65 ght = 0;.. re
15b2c 74 75 72 6e 20 70 3b 0d 0a 20 20 7d 0d 0a 20 20 turn p;.. }..
15b2d 70 4c 65 66 74 20 3d 20 72 6f 77 53 65 74 4e 44 pLeft = rowSetND
15b2e 65 65 70 54 72 65 65 28 70 70 4c 69 73 74 2c 20 eepTree(ppList,
15b2f 69 44 65 70 74 68 2d 31 29 3b 0d 0a 20 20 70 20 iDepth-1);.. p
15b30 3d 20 2a 70 70 4c 69 73 74 3b 0d 0a 20 20 69 66 = *ppList;.. if
15b31 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 ( p==0 ){.. r
15b32 65 74 75 72 6e 20 70 4c 65 66 74 3b 0d 0a 20 20 eturn pLeft;..
15b33 7d 0d 0a 20 20 70 2d 3e 70 4c 65 66 74 20 3d 20 }.. p->pLeft =
15b34 70 4c 65 66 74 3b 0d 0a 20 20 2a 70 70 4c 69 73 pLeft;.. *ppLis
15b35 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0d 0a t = p->pRight;..
15b36 20 20 70 2d 3e 70 52 69 67 68 74 20 3d 20 72 6f p->pRight = ro
15b37 77 53 65 74 4e 44 65 65 70 54 72 65 65 28 70 70 wSetNDeepTree(pp
15b38 4c 69 73 74 2c 20 69 44 65 70 74 68 2d 31 29 3b List, iDepth-1);
15b39 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d .. return p;..}
15b3a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 ..../*..** Conve
15b3b 72 74 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 rt a sorted list
15b3c 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 74 of elements int
15b3d 6f 20 61 20 62 69 6e 61 72 79 20 74 72 65 65 2e o a binary tree.
15b3e 20 4d 61 6b 65 20 74 68 65 20 74 72 65 65 0d 0a Make the tree..
15b3f 2a 2a 20 61 73 20 64 65 65 70 20 61 73 20 69 74 ** as deep as it
15b40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 20 needs to be in
15b41 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e order to contain
15b42 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 the entire list
15b43 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 73 74 ...*/..static st
15b44 72 75 63 74 20 52 6f 77 53 65 74 45 6e 74 72 79 ruct RowSetEntry
15b45 20 2a 72 6f 77 53 65 74 4c 69 73 74 54 6f 54 72 *rowSetListToTr
15b46 65 65 28 73 74 72 75 63 74 20 52 6f 77 53 65 74 ee(struct RowSet
15b47 45 6e 74 72 79 20 2a 70 4c 69 73 74 29 7b 0d 0a Entry *pList){..
15b48 20 20 69 6e 74 20 69 44 65 70 74 68 3b 20 20 20 int iDepth;
15b49 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 /* Depth
15b4a 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 20 of the tree so
15b4b 66 61 72 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 far */.. struct
15b4c 20 52 6f 77 53 65 74 45 6e 74 72 79 20 2a 70 3b RowSetEntry *p;
15b4d 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e /* Curren
15b4e 74 20 74 72 65 65 20 72 6f 6f 74 20 2a 2f 0d 0a t tree root */..
15b4f 20 20 73 74 72 75 63 74 20 52 6f 77 53 65 74 45 struct RowSetE
15b50 6e 74 72 79 20 2a 70 4c 65 66 74 3b 20 20 20 2f ntry *pLeft; /
15b51 2a 20 4c 65 66 74 20 73 75 62 74 72 65 65 20 2a * Left subtree *
15b52 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 /.... assert( p
15b53 4c 69 73 74 21 3d 30 20 29 3b 0d 0a 20 20 70 20 List!=0 );.. p
15b54 3d 20 70 4c 69 73 74 3b 0d 0a 20 20 70 4c 69 73 = pList;.. pLis
15b55 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0d 0a t = p->pRight;..
15b56 20 20 70 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e p->pLeft = p->
15b57 70 52 69 67 68 74 20 3d 20 30 3b 0d 0a 20 20 66 pRight = 0;.. f
15b58 6f 72 28 69 44 65 70 74 68 3d 31 3b 20 70 4c 69 or(iDepth=1; pLi
15b59 73 74 3b 20 69 44 65 70 74 68 2b 2b 29 7b 0d 0a st; iDepth++){..
15b5a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 3b 0d 0a pLeft = p;..
15b5b 20 20 20 20 70 20 3d 20 70 4c 69 73 74 3b 0d 0a p = pList;..
15b5c 20 20 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 pList = p->p
15b5d 52 69 67 68 74 3b 0d 0a 20 20 20 20 70 2d 3e 70 Right;.. p->p
15b5e 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0d 0a 20 Left = pLeft;..
15b5f 20 20 20 70 2d 3e 70 52 69 67 68 74 20 3d 20 72 p->pRight = r
15b60 6f 77 53 65 74 4e 44 65 65 70 54 72 65 65 28 26 owSetNDeepTree(&
15b61 70 4c 69 73 74 2c 20 69 44 65 70 74 68 29 3b 0d pList, iDepth);.
15b62 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 . }.. return p
15b63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
15b64 6f 6e 76 65 72 74 20 74 68 65 20 6c 69 73 74 20 onvert the list
15b65 69 6e 20 70 2d 3e 70 45 6e 74 72 79 20 69 6e 74 in p->pEntry int
15b66 6f 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 o a sorted list
15b67 69 66 20 69 74 20 69 73 20 6e 6f 74 0d 0a 2a 2a if it is not..**
15b68 20 73 6f 72 74 65 64 20 61 6c 72 65 61 64 79 2e sorted already.
15b69 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 If there is a
15b6a 62 69 6e 61 72 79 20 74 72 65 65 20 6f 6e 20 70 binary tree on p
15b6b 2d 3e 70 54 72 65 65 2c 20 74 68 65 6e 0d 0a 2a ->pTree, then..*
15b6c 2a 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 * convert it int
15b6d 6f 20 61 20 6c 69 73 74 20 74 6f 6f 20 61 6e 64 o a list too and
15b6e 20 6d 65 72 67 65 20 69 74 20 69 6e 74 6f 20 74 merge it into t
15b6f 68 65 20 70 2d 3e 70 45 6e 74 72 79 20 6c 69 73 he p->pEntry lis
15b70 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 t...*/..static v
15b71 6f 69 64 20 72 6f 77 53 65 74 54 6f 4c 69 73 74 oid rowSetToList
15b72 28 52 6f 77 53 65 74 20 2a 70 29 7b 0d 0a 20 20 (RowSet *p){..
15b73 69 66 28 20 21 70 2d 3e 69 73 53 6f 72 74 65 64 if( !p->isSorted
15b74 20 29 7b 0d 0a 20 20 20 20 72 6f 77 53 65 74 53 ){.. rowSetS
15b75 6f 72 74 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 ort(p);.. }..
15b76 69 66 28 20 70 2d 3e 70 54 72 65 65 20 29 7b 0d if( p->pTree ){.
15b77 0a 20 20 20 20 73 74 72 75 63 74 20 52 6f 77 53 . struct RowS
15b78 65 74 45 6e 74 72 79 20 2a 70 48 65 61 64 2c 20 etEntry *pHead,
15b79 2a 70 54 61 69 6c 3b 0d 0a 20 20 20 20 72 6f 77 *pTail;.. row
15b7a 53 65 74 54 72 65 65 54 6f 4c 69 73 74 28 70 2d SetTreeToList(p-
15b7b 3e 70 54 72 65 65 2c 20 26 70 48 65 61 64 2c 20 >pTree, &pHead,
15b7c 26 70 54 61 69 6c 29 3b 0d 0a 20 20 20 20 70 2d &pTail);.. p-
15b7d 3e 70 54 72 65 65 20 3d 20 30 3b 0d 0a 20 20 20 >pTree = 0;..
15b7e 20 70 2d 3e 70 45 6e 74 72 79 20 3d 20 72 6f 77 p->pEntry = row
15b7f 53 65 74 4d 65 72 67 65 28 70 2d 3e 70 45 6e 74 SetMerge(p->pEnt
15b80 72 79 2c 20 70 48 65 61 64 29 3b 0d 0a 20 20 7d ry, pHead);.. }
15b81 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 78 ..}..../*..** Ex
15b82 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c 65 tract the smalle
15b83 73 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 st element from
15b84 74 68 65 20 52 6f 77 53 65 74 2e 0d 0a 2a 2a 20 the RowSet...**
15b85 57 72 69 74 65 20 74 68 65 20 65 6c 65 6d 65 6e Write the elemen
15b86 74 20 69 6e 74 6f 20 2a 70 52 6f 77 69 64 2e 20 t into *pRowid.
15b87 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 73 75 63 Return 1 on suc
15b88 63 65 73 73 2e 20 20 52 65 74 75 72 6e 0d 0a 2a cess. Return..*
15b89 2a 20 30 20 69 66 20 74 68 65 20 52 6f 77 53 65 * 0 if the RowSe
15b8a 74 20 69 73 20 61 6c 72 65 61 64 79 20 65 6d 70 t is already emp
15b8b 74 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66 74 65 ty...**..** Afte
15b8c 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 r this routine h
15b8d 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 as been called,
15b8e 74 68 65 20 73 71 6c 69 74 65 33 52 6f 77 53 65 the sqlite3RowSe
15b8f 74 49 6e 73 65 72 74 28 29 0d 0a 2a 2a 20 72 6f tInsert()..** ro
15b90 75 74 69 6e 65 20 6d 61 79 20 6e 6f 74 20 62 65 utine may not be
15b91 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 20 called again.
15b92 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
15b93 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
15b94 52 6f 77 53 65 74 4e 65 78 74 28 52 6f 77 53 65 RowSetNext(RowSe
15b95 74 20 2a 70 2c 20 69 36 34 20 2a 70 52 6f 77 69 t *p, i64 *pRowi
15b96 64 29 7b 0d 0a 20 20 72 6f 77 53 65 74 54 6f 4c d){.. rowSetToL
15b97 69 73 74 28 70 29 3b 0d 0a 20 20 69 66 28 20 70 ist(p);.. if( p
15b98 2d 3e 70 45 6e 74 72 79 20 29 7b 0d 0a 20 20 20 ->pEntry ){..
15b99 20 2a 70 52 6f 77 69 64 20 3d 20 70 2d 3e 70 45 *pRowid = p->pE
15b9a 6e 74 72 79 2d 3e 76 3b 0d 0a 20 20 20 20 70 2d ntry->v;.. p-
15b9b 3e 70 45 6e 74 72 79 20 3d 20 70 2d 3e 70 45 6e >pEntry = p->pEn
15b9c 74 72 79 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 20 try->pRight;..
15b9d 20 20 69 66 28 20 70 2d 3e 70 45 6e 74 72 79 3d if( p->pEntry=
15b9e 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c =0 ){.. sql
15b9f 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28 ite3RowSetClear(
15ba0 70 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 p);.. }..
15ba1 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 7d 65 6c return 1;.. }el
15ba2 73 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 se{.. return
15ba3 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0;.. }..}..../*
15ba4 0d 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 ..** Check to se
15ba5 65 20 69 66 20 65 6c 65 6d 65 6e 74 20 69 52 6f e if element iRo
15ba6 77 69 64 20 77 61 73 20 69 6e 73 65 72 74 65 64 wid was inserted
15ba7 20 69 6e 74 6f 20 74 68 65 20 74 68 65 20 72 6f into the the ro
15ba8 77 73 65 74 20 61 73 0d 0a 2a 2a 20 70 61 72 74 wset as..** part
15ba9 20 6f 66 20 61 6e 79 20 69 6e 73 65 72 74 20 62 of any insert b
15baa 61 74 63 68 20 70 72 69 6f 72 20 74 6f 20 69 42 atch prior to iB
15bab 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 31 20 atch. Return 1
15bac 6f 72 20 30 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 or 0...*/..SQLIT
15bad 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
15bae 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28 lite3RowSetTest(
15baf 52 6f 77 53 65 74 20 2a 70 52 6f 77 53 65 74 2c RowSet *pRowSet,
15bb0 20 75 38 20 69 42 61 74 63 68 2c 20 73 71 6c 69 u8 iBatch, sqli
15bb1 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 te3_int64 iRowid
15bb2 29 7b 0d 0a 20 20 73 74 72 75 63 74 20 52 6f 77 ){.. struct Row
15bb3 53 65 74 45 6e 74 72 79 20 2a 70 3b 0d 0a 20 20 SetEntry *p;..
15bb4 69 66 28 20 69 42 61 74 63 68 21 3d 70 52 6f 77 if( iBatch!=pRow
15bb5 53 65 74 2d 3e 69 42 61 74 63 68 20 29 7b 0d 0a Set->iBatch ){..
15bb6 20 20 20 20 69 66 28 20 70 52 6f 77 53 65 74 2d if( pRowSet-
15bb7 3e 70 45 6e 74 72 79 20 29 7b 0d 0a 20 20 20 20 >pEntry ){..
15bb8 20 20 72 6f 77 53 65 74 54 6f 4c 69 73 74 28 70 rowSetToList(p
15bb9 52 6f 77 53 65 74 29 3b 0d 0a 20 20 20 20 20 20 RowSet);..
15bba 70 52 6f 77 53 65 74 2d 3e 70 54 72 65 65 20 3d pRowSet->pTree =
15bbb 20 72 6f 77 53 65 74 4c 69 73 74 54 6f 54 72 65 rowSetListToTre
15bbc 65 28 70 52 6f 77 53 65 74 2d 3e 70 45 6e 74 72 e(pRowSet->pEntr
15bbd 79 29 3b 0d 0a 20 20 20 20 20 20 70 52 6f 77 53 y);.. pRowS
15bbe 65 74 2d 3e 70 45 6e 74 72 79 20 3d 20 30 3b 0d et->pEntry = 0;.
15bbf 0a 20 20 20 20 20 20 70 52 6f 77 53 65 74 2d 3e . pRowSet->
15bc0 70 4c 61 73 74 20 3d 20 30 3b 0d 0a 20 20 20 20 pLast = 0;..
15bc1 7d 0d 0a 20 20 20 20 70 52 6f 77 53 65 74 2d 3e }.. pRowSet->
15bc2 69 42 61 74 63 68 20 3d 20 69 42 61 74 63 68 3b iBatch = iBatch;
15bc3 0d 0a 20 20 7d 0d 0a 20 20 70 20 3d 20 70 52 6f .. }.. p = pRo
15bc4 77 53 65 74 2d 3e 70 54 72 65 65 3b 0d 0a 20 20 wSet->pTree;..
15bc5 77 68 69 6c 65 28 20 70 20 29 7b 0d 0a 20 20 20 while( p ){..
15bc6 20 69 66 28 20 70 2d 3e 76 3c 69 52 6f 77 69 64 if( p->v<iRowid
15bc7 20 29 7b 0d 0a 20 20 20 20 20 20 70 20 3d 20 70 ){.. p = p
15bc8 2d 3e 70 52 69 67 68 74 3b 0d 0a 20 20 20 20 7d ->pRight;.. }
15bc9 65 6c 73 65 20 69 66 28 20 70 2d 3e 76 3e 69 52 else if( p->v>iR
15bca 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 70 owid ){.. p
15bcb 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0d 0a 20 20 = p->pLeft;..
15bcc 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
15bcd 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d return 1;.. }
15bce 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
15bcf 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 0;..}..../******
15bd0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 ******** End of
15bd1 72 6f 77 73 65 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a rowset.c *******
15bd2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bd3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bd4 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
15bd5 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 ********* Begin
15bd6 66 69 6c 65 20 70 61 67 65 72 2e 63 20 2a 2a 2a file pager.c ***
15bd7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bd8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bd9 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a ********/../*..*
15bda 2a 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72 * 2001 September
15bdb 20 31 35 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 15..**..** The
15bdc 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 author disclaims
15bdd 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 copyright to th
15bde 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 is source code.
15bdf 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a In place of..**
15be0 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
15be1 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
15be2 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ing:..**..**
15be3 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 May you do good
15be4 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a and not evil...*
15be5 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e * May you fin
15be6 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f d forgiveness fo
15be7 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 r yourself and f
15be8 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a orgive others...
15be9 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 ** May you sh
15bea 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 are freely, neve
15beb 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 r taking more th
15bec 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a an you give...**
15bed 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
15bee 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bef 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15bf1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 ***********..**
15bf2 54 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c This is the impl
15bf3 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 ementation of th
15bf4 65 20 70 61 67 65 20 63 61 63 68 65 20 73 75 62 e page cache sub
15bf5 73 79 73 74 65 6d 20 6f 72 20 22 70 61 67 65 72 system or "pager
15bf6 22 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 54 68 65 20 "...** ..** The
15bf7 70 61 67 65 72 20 69 73 20 75 73 65 64 20 74 6f pager is used to
15bf8 20 61 63 63 65 73 73 20 61 20 64 61 74 61 62 61 access a databa
15bf9 73 65 20 64 69 73 6b 20 66 69 6c 65 2e 20 20 49 se disk file. I
15bfa 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0d 0a 2a 2a t implements..**
15bfb 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 20 61 atomic commit a
15bfc 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 74 68 72 6f nd rollback thro
15bfd 75 67 68 20 74 68 65 20 75 73 65 20 6f 66 20 61 ugh the use of a
15bfe 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 journal file th
15bff 61 74 0d 0a 2a 2a 20 69 73 20 73 65 70 61 72 61 at..** is separa
15c00 74 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 te from the data
15c01 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 base file. The
15c02 70 61 67 65 72 20 61 6c 73 6f 20 69 6d 70 6c 65 pager also imple
15c03 6d 65 6e 74 73 20 66 69 6c 65 0d 0a 2a 2a 20 6c ments file..** l
15c04 6f 63 6b 69 6e 67 20 74 6f 20 70 72 65 76 65 6e ocking to preven
15c05 74 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 t two processes
15c06 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 68 65 from writing the
15c07 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0d 0a same database..
15c08 2a 2a 20 66 69 6c 65 20 73 69 6d 75 6c 74 61 6e ** file simultan
15c09 65 6f 75 73 6c 79 2c 20 6f 72 20 6f 6e 65 20 70 eously, or one p
15c0a 72 6f 63 65 73 73 20 66 72 6f 6d 20 72 65 61 64 rocess from read
15c0b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 ing the database
15c0c 20 77 68 69 6c 65 0d 0a 2a 2a 20 61 6e 6f 74 68 while..** anoth
15c0d 65 72 20 69 73 20 77 72 69 74 69 6e 67 2e 0d 0a er is writing...
15c0e 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
15c0f 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0d 0a TE_OMIT_DISKIO..
15c10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
15c11 49 6e 63 6c 75 64 65 20 77 61 6c 2e 68 20 69 6e Include wal.h in
15c12 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 70 the middle of p
15c13 61 67 65 72 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ager.c *********
15c14 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
15c15 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
15c16 20 42 65 67 69 6e 20 66 69 6c 65 20 77 61 6c 2e Begin file wal.
15c17 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a h **************
15c18 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15c19 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
15c1a 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 30 20 46 65 ../*..** 2010 Fe
15c1b 62 72 75 61 72 79 20 31 0d 0a 2a 2a 0d 0a 2a 2a bruary 1..**..**
15c1c 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63 The author disc
15c1d 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20 laims copyright
15c1e 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63 to this source c
15c1f 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f ode. In place o
15c20 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f f..** a legal no
15c21 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 tice, here is a
15c22 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a blessing:..**..*
15c23 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 * May you do
15c24 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 good and not evi
15c25 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f l...** May yo
15c26 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 u find forgivene
15c27 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 ss for yourself
15c28 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 and forgive othe
15c29 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 rs...** May y
15c2a 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c ou share freely,
15c2b 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f never taking mo
15c2c 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 re than you give
15c2d 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ...**..*********
15c2e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15c2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15c31 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15c32 0d 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 ..** This header
15c33 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 74 68 file defines th
15c34 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 e interface to t
15c35 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c he write-ahead l
15c36 6f 67 67 69 6e 67 20 0d 0a 2a 2a 20 73 79 73 74 ogging ..** syst
15c37 65 6d 2e 20 52 65 66 65 72 20 74 6f 20 74 68 65 em. Refer to the
15c38 20 63 6f 6d 6d 65 6e 74 73 20 62 65 6c 6f 77 20 comments below
15c39 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 63 and the header c
15c3a 6f 6d 6d 65 6e 74 20 61 74 74 61 63 68 65 64 20 omment attached
15c3b 74 6f 20 0d 0a 2a 2a 20 74 68 65 20 69 6d 70 6c to ..** the impl
15c3c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 65 61 ementation of ea
15c3d 63 68 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 6c ch function in l
15c3e 6f 67 2e 63 20 66 6f 72 20 66 75 72 74 68 65 72 og.c for further
15c3f 20 64 65 74 61 69 6c 73 2e 0d 0a 2a 2f 0d 0a 0d details...*/...
15c40 0a 23 69 66 6e 64 65 66 20 5f 57 41 4c 5f 48 5f .#ifndef _WAL_H_
15c41 0d 0a 23 64 65 66 69 6e 65 20 5f 57 41 4c 5f 48 ..#define _WAL_H
15c42 5f 0d 0a 0d 0a 0d 0a 2f 2a 20 41 64 64 69 74 69 _....../* Additi
15c43 6f 6e 61 6c 20 76 61 6c 75 65 73 20 74 68 61 74 onal values that
15c44 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f can be added to
15c45 20 74 68 65 20 73 79 6e 63 5f 66 6c 61 67 73 20 the sync_flags
15c46 61 72 67 75 6d 65 6e 74 20 6f 66 0d 0a 2a 2a 20 argument of..**
15c47 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 sqlite3WalFrames
15c48 28 29 3a 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 ():..*/..#define
15c49 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 WAL_SYNC_TRANSA
15c4a 43 54 49 4f 4e 53 20 20 30 78 32 30 20 20 20 2f CTIONS 0x20 /
15c4b 2a 20 53 79 6e 63 20 61 74 20 74 68 65 20 65 6e * Sync at the en
15c4c 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61 d of each transa
15c4d 63 74 69 6f 6e 20 2a 2f 0d 0a 23 64 65 66 69 6e ction */..#defin
15c4e 65 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4d 41 e SQLITE_SYNC_MA
15c4f 53 4b 20 20 20 20 20 20 20 30 78 31 33 20 20 20 SK 0x13
15c50 2f 2a 20 4d 61 73 6b 20 6f 66 66 20 74 68 65 20 /* Mask off the
15c51 53 51 4c 49 54 45 5f 53 59 4e 43 5f 2a 20 76 61 SQLITE_SYNC_* va
15c52 6c 75 65 73 20 2a 2f 0d 0a 0d 0a 23 69 66 64 65 lues */....#ifde
15c53 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 f SQLITE_OMIT_WA
15c54 4c 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 L..# define sqli
15c55 74 65 33 57 61 6c 4f 70 65 6e 28 78 2c 79 2c 7a te3WalOpen(x,y,z
15c56 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 )
15c57 20 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 0..# define
15c58 73 71 6c 69 74 65 33 57 61 6c 4c 69 6d 69 74 28 sqlite3WalLimit(
15c59 78 2c 79 29 0d 0a 23 20 64 65 66 69 6e 65 20 73 x,y)..# define s
15c5a 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 77 qlite3WalClose(w
15c5b 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20 20 20 20 ,x,y,z)
15c5c 20 20 20 20 20 20 20 30 0d 0a 23 20 64 65 66 69 0..# defi
15c5d 6e 65 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 ne sqlite3WalBeg
15c5e 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f inReadTransactio
15c5f 6e 28 79 2c 7a 29 20 20 20 20 20 30 0d 0a 23 20 n(y,z) 0..#
15c60 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 57 61 define sqlite3Wa
15c61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 lEndReadTransact
15c62 69 6f 6e 28 7a 29 0d 0a 23 20 64 65 66 69 6e 65 ion(z)..# define
15c63 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 sqlite3WalRead(
15c64 76 2c 77 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20 v,w,x,y,z)
15c65 20 20 20 20 20 20 20 20 20 30 0d 0a 23 20 64 65 0..# de
15c66 66 69 6e 65 20 73 71 6c 69 74 65 33 57 61 6c 44 fine sqlite3WalD
15c67 62 73 69 7a 65 28 79 29 20 20 20 20 20 20 20 20 bsize(y)
15c68 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 0..
15c69 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 # define sqlite3
15c6a 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 WalBeginWriteTra
15c6b 6e 73 61 63 74 69 6f 6e 28 79 29 20 20 20 20 20 nsaction(y)
15c6c 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 0..# define sql
15c6d 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 ite3WalEndWriteT
15c6e 72 61 6e 73 61 63 74 69 6f 6e 28 78 29 20 20 20 ransaction(x)
15c6f 20 20 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 0..# define
15c70 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 sqlite3WalUndo(
15c71 78 2c 79 2c 7a 29 20 20 20 20 20 20 20 20 20 20 x,y,z)
15c72 20 20 20 20 20 20 20 20 20 30 0d 0a 23 20 64 65 0..# de
15c73 66 69 6e 65 20 73 71 6c 69 74 65 33 57 61 6c 53 fine sqlite3WalS
15c74 61 76 65 70 6f 69 6e 74 28 79 2c 7a 29 0d 0a 23 avepoint(y,z)..#
15c75 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 57 define sqlite3W
15c76 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 alSavepointUndo(
15c77 79 2c 7a 29 20 20 20 20 20 20 20 20 20 20 20 20 y,z)
15c78 30 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 0..# define sqli
15c79 74 65 33 57 61 6c 46 72 61 6d 65 73 28 75 2c 76 te3WalFrames(u,v
15c7a 2c 77 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20 20 ,w,x,y,z)
15c7b 20 20 20 20 30 0d 0a 23 20 64 65 66 69 6e 65 20 0..# define
15c7c 73 71 6c 69 74 65 33 57 61 6c 43 68 65 63 6b 70 sqlite3WalCheckp
15c7d 6f 69 6e 74 28 72 2c 73 2c 74 2c 75 2c 76 2c 77 oint(r,s,t,u,v,w
15c7e 2c 78 2c 79 2c 7a 29 20 30 0d 0a 23 20 64 65 66 ,x,y,z) 0..# def
15c7f 69 6e 65 20 73 71 6c 69 74 65 33 57 61 6c 43 61 ine sqlite3WalCa
15c80 6c 6c 62 61 63 6b 28 7a 29 20 20 20 20 20 20 20 llback(z)
15c81 20 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 23 0..#
15c82 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 57 define sqlite3W
15c83 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 alExclusiveMode(
15c84 79 2c 7a 29 20 20 20 20 20 20 20 20 20 20 20 20 y,z)
15c85 30 0d 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 0..# define sqli
15c86 74 65 33 57 61 6c 48 65 61 70 4d 65 6d 6f 72 79 te3WalHeapMemory
15c87 28 7a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 (z)
15c88 20 20 20 20 30 0d 0a 23 65 6c 73 65 0d 0a 0d 0a 0..#else....
15c89 23 64 65 66 69 6e 65 20 57 41 4c 5f 53 41 56 45 #define WAL_SAVE
15c8a 50 4f 49 4e 54 5f 4e 44 41 54 41 20 34 0d 0a 0d POINT_NDATA 4...
15c8b 0a 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 ./* Connection t
15c8c 6f 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 o a write-ahead
15c8d 6c 6f 67 20 28 57 41 4c 29 20 66 69 6c 65 2e 20 log (WAL) file.
15c8e 0d 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e ..** There is on
15c8f 65 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 69 73 e object of this
15c90 20 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 70 type for each p
15c91 61 67 65 72 2e 20 0d 0a 2a 2f 0d 0a 74 79 70 65 ager. ..*/..type
15c92 64 65 66 20 73 74 72 75 63 74 20 57 61 6c 20 57 def struct Wal W
15c93 61 6c 3b 0d 0a 0d 0a 2f 2a 20 4f 70 65 6e 20 61 al;..../* Open a
15c94 6e 64 20 63 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 nd close a conne
15c95 63 74 69 6f 6e 20 74 6f 20 61 20 77 72 69 74 65 ction to a write
15c96 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0d 0a -ahead log. */..
15c97 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
15c98 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 nt sqlite3WalOpe
15c99 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 n(sqlite3_vfs*,
15c9a 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 63 sqlite3_file*, c
15c9b 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 onst char *, int
15c9c 2c 20 69 36 34 2c 20 57 61 6c 2a 2a 29 3b 0d 0a , i64, Wal**);..
15c9d 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
15c9e 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f nt sqlite3WalClo
15c9f 73 65 28 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e se(Wal *pWal, in
15ca0 74 20 73 79 6e 63 5f 66 6c 61 67 73 2c 20 69 6e t sync_flags, in
15ca1 74 2c 20 75 38 20 2a 29 3b 0d 0a 0d 0a 2f 2a 20 t, u8 *);..../*
15ca2 53 65 74 20 74 68 65 20 6c 69 6d 69 74 69 6e 67 Set the limiting
15ca3 20 73 69 7a 65 20 6f 66 20 61 20 57 41 4c 20 66 size of a WAL f
15ca4 69 6c 65 2e 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f ile. */..SQLITE_
15ca5 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
15ca6 69 74 65 33 57 61 6c 4c 69 6d 69 74 28 57 61 6c ite3WalLimit(Wal
15ca7 2a 2c 20 69 36 34 29 3b 0d 0a 0d 0a 2f 2a 20 55 *, i64);..../* U
15ca8 73 65 64 20 62 79 20 72 65 61 64 65 72 73 20 74 sed by readers t
15ca9 6f 20 6f 70 65 6e 20 28 6c 6f 63 6b 29 20 61 6e o open (lock) an
15caa 64 20 63 6c 6f 73 65 20 28 75 6e 6c 6f 63 6b 29 d close (unlock)
15cab 20 61 20 73 6e 61 70 73 68 6f 74 2e 20 20 41 20 a snapshot. A
15cac 0d 0a 2a 2a 20 73 6e 61 70 73 68 6f 74 20 69 73 ..** snapshot is
15cad 20 6c 69 6b 65 20 61 20 72 65 61 64 2d 74 72 61 like a read-tra
15cae 6e 73 61 63 74 69 6f 6e 2e 20 20 49 74 20 69 73 nsaction. It is
15caf 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 the state of th
15cb0 65 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 61 e database..** a
15cb1 74 20 61 6e 20 69 6e 73 74 61 6e 74 20 69 6e 20 t an instant in
15cb2 74 69 6d 65 2e 20 20 73 71 6c 69 74 65 33 57 61 time. sqlite3Wa
15cb3 6c 4f 70 65 6e 53 6e 61 70 73 68 6f 74 20 67 65 lOpenSnapshot ge
15cb4 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 ts a read lock a
15cb5 6e 64 0d 0a 2a 2a 20 70 72 65 73 65 72 76 65 73 nd..** preserves
15cb6 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 the current sta
15cb7 74 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f te even if the o
15cb8 74 68 65 72 20 74 68 72 65 61 64 73 20 6f 72 20 ther threads or
15cb9 70 72 6f 63 65 73 73 65 73 0d 0a 2a 2a 20 77 72 processes..** wr
15cba 69 74 65 20 74 6f 20 6f 72 20 63 68 65 63 6b 70 ite to or checkp
15cbb 6f 69 6e 74 20 74 68 65 20 57 41 4c 2e 20 20 73 oint the WAL. s
15cbc 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 53 6e qlite3WalCloseSn
15cbd 61 70 73 68 6f 74 28 29 20 63 6c 6f 73 65 73 20 apshot() closes
15cbe 74 68 65 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 the..** transact
15cbf 69 6f 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 73 ion and releases
15cc0 20 74 68 65 20 6c 6f 63 6b 2e 0d 0a 2a 2f 0d 0a the lock...*/..
15cc1 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
15cc2 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 nt sqlite3WalBeg
15cc3 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f inReadTransactio
15cc4 6e 28 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e 74 n(Wal *pWal, int
15cc5 20 2a 29 3b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 *);..SQLITE_PRI
15cc6 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
15cc7 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 3WalEndReadTrans
15cc8 61 63 74 69 6f 6e 28 57 61 6c 20 2a 70 57 61 6c action(Wal *pWal
15cc9 29 3b 0d 0a 0d 0a 2f 2a 20 52 65 61 64 20 61 20 );..../* Read a
15cca 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 page from the wr
15ccb 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2c 20 69 ite-ahead log, i
15ccc 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e f it is present.
15ccd 20 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 */..SQLITE_PRIV
15cce 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 ATE int sqlite3W
15ccf 61 6c 52 65 61 64 28 57 61 6c 20 2a 70 57 61 6c alRead(Wal *pWal
15cd0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 , Pgno pgno, int
15cd1 20 2a 70 49 6e 57 61 6c 2c 20 69 6e 74 20 6e 4f *pInWal, int nO
15cd2 75 74 2c 20 75 38 20 2a 70 4f 75 74 29 3b 0d 0a ut, u8 *pOut);..
15cd3 0d 0a 2f 2a 20 49 66 20 74 68 65 20 57 41 4c 20 ../* If the WAL
15cd4 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 72 65 is not empty, re
15cd5 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 turn the size of
15cd6 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a the database. *
15cd7 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
15cd8 45 20 50 67 6e 6f 20 73 71 6c 69 74 65 33 57 61 E Pgno sqlite3Wa
15cd9 6c 44 62 73 69 7a 65 28 57 61 6c 20 2a 70 57 61 lDbsize(Wal *pWa
15cda 6c 29 3b 0d 0a 0d 0a 2f 2a 20 4f 62 74 61 69 6e l);..../* Obtain
15cdb 20 6f 72 20 72 65 6c 65 61 73 65 20 74 68 65 20 or release the
15cdc 57 52 49 54 45 52 20 6c 6f 63 6b 2e 20 2a 2f 0d WRITER lock. */.
15cdd 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
15cde 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 42 65 int sqlite3WalBe
15cdf 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 ginWriteTransact
15ce0 69 6f 6e 28 57 61 6c 20 2a 70 57 61 6c 29 3b 0d ion(Wal *pWal);.
15ce1 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
15ce2 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 45 6e int sqlite3WalEn
15ce3 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f dWriteTransactio
15ce4 6e 28 57 61 6c 20 2a 70 57 61 6c 29 3b 0d 0a 0d n(Wal *pWal);...
15ce5 0a 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 66 72 61 ./* Undo any fra
15ce6 6d 65 73 20 77 72 69 74 74 65 6e 20 28 62 75 74 mes written (but
15ce7 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 not committed)
15ce8 74 6f 20 74 68 65 20 6c 6f 67 20 2a 2f 0d 0a 53 to the log */..S
15ce9 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
15cea 74 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f t sqlite3WalUndo
15ceb 28 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e 74 20 (Wal *pWal, int
15cec 28 2a 78 55 6e 64 6f 29 28 76 6f 69 64 20 2a 2c (*xUndo)(void *,
15ced 20 50 67 6e 6f 29 2c 20 76 6f 69 64 20 2a 70 55 Pgno), void *pU
15cee 6e 64 6f 43 74 78 29 3b 0d 0a 0d 0a 2f 2a 20 52 ndoCtx);..../* R
15cef 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
15cf0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 74 68 that records th
15cf1 65 20 63 75 72 72 65 6e 74 20 28 75 6e 63 6f 6d e current (uncom
15cf2 6d 69 74 74 65 64 29 20 77 72 69 74 65 0d 0a 2a mitted) write..*
15cf3 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 * position in th
15cf4 65 20 57 41 4c 20 2a 2f 0d 0a 53 51 4c 49 54 45 e WAL */..SQLITE
15cf5 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
15cf6 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e lite3WalSavepoin
15cf7 74 28 57 61 6c 20 2a 70 57 61 6c 2c 20 75 33 32 t(Wal *pWal, u32
15cf8 20 2a 61 57 61 6c 44 61 74 61 29 3b 0d 0a 0d 0a *aWalData);....
15cf9 2f 2a 20 4d 6f 76 65 20 74 68 65 20 77 72 69 74 /* Move the writ
15cfa 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 e position of th
15cfb 65 20 57 41 4c 20 62 61 63 6b 20 74 6f 20 69 46 e WAL back to iF
15cfc 72 61 6d 65 2e 20 20 43 61 6c 6c 65 64 20 69 6e rame. Called in
15cfd 0d 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 74 6f ..** response to
15cfe 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 a ROLLBACK TO c
15cff 6f 6d 6d 61 6e 64 2e 20 2a 2f 0d 0a 53 51 4c 49 ommand. */..SQLI
15d00 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
15d01 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 qlite3WalSavepoi
15d02 6e 74 55 6e 64 6f 28 57 61 6c 20 2a 70 57 61 6c ntUndo(Wal *pWal
15d03 2c 20 75 33 32 20 2a 61 57 61 6c 44 61 74 61 29 , u32 *aWalData)
15d04 3b 0d 0a 0d 0a 2f 2a 20 57 72 69 74 65 20 61 20 ;..../* Write a
15d05 66 72 61 6d 65 20 6f 72 20 66 72 61 6d 65 73 20 frame or frames
15d06 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0d 0a to the log. */..
15d07 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
15d08 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 nt sqlite3WalFra
15d09 6d 65 73 28 57 61 6c 20 2a 70 57 61 6c 2c 20 69 mes(Wal *pWal, i
15d0a 6e 74 2c 20 50 67 48 64 72 20 2a 2c 20 50 67 6e nt, PgHdr *, Pgn
15d0b 6f 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0d 0a 0d o, int, int);...
15d0c 0a 2f 2a 20 43 6f 70 79 20 70 61 67 65 73 20 66 ./* Copy pages f
15d0d 72 6f 6d 20 74 68 65 20 6c 6f 67 20 74 6f 20 74 rom the log to t
15d0e 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
15d0f 20 2a 2f 20 0d 0a 53 51 4c 49 54 45 5f 50 52 49 */ ..SQLITE_PRI
15d10 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
15d11 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 0d 0a WalCheckpoint(..
15d12 20 20 57 61 6c 20 2a 70 57 61 6c 2c 20 20 20 20 Wal *pWal,
15d13 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d14 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 /* Write-ahead
15d15 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 log connection
15d16 2a 2f 0d 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c */.. int eMode,
15d17 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d18 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 /* One of
15d19 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 61 6e PASSIVE, FULL an
15d1a 64 20 52 45 53 54 41 52 54 20 2a 2f 0d 0a 20 20 d RESTART */..
15d1b 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 int (*xBusy)(voi
15d1c 64 2a 29 2c 20 20 20 20 20 20 20 20 20 20 20 20 d*),
15d1d 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 /* Function to c
15d1e 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f all when busy */
15d1f 0d 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41 .. void *pBusyA
15d20 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 rg,
15d21 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 /* Context a
15d22 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 rgument for xBus
15d23 79 48 61 6e 64 6c 65 72 20 2a 2f 0d 0a 20 20 69 yHandler */.. i
15d24 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73 2c 20 20 nt sync_flags,
15d25 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15d26 2a 20 46 6c 61 67 73 20 74 6f 20 73 79 6e 63 20 * Flags to sync
15d27 64 62 20 66 69 6c 65 20 77 69 74 68 20 28 6f 72 db file with (or
15d28 20 30 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 0) */.. int nB
15d29 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 uf,
15d2a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a /* Siz
15d2b 65 20 6f 66 20 62 75 66 66 65 72 20 6e 42 75 66 e of buffer nBuf
15d2c 20 2a 2f 0d 0a 20 20 75 38 20 2a 7a 42 75 66 2c */.. u8 *zBuf,
15d2d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d2e 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 /* Tempor
15d2f 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 75 73 ary buffer to us
15d30 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 4c e */.. int *pnL
15d31 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 og,
15d32 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
15d33 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 Number of frames
15d34 20 69 6e 20 57 41 4c 20 2a 2f 0d 0a 20 20 69 6e in WAL */.. in
15d35 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 t *pnCkpt
15d36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
15d37 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 OUT: Number of
15d38 62 61 63 6b 66 69 6c 6c 65 64 20 66 72 61 6d 65 backfilled frame
15d39 73 20 69 6e 20 57 41 4c 20 2a 2f 0d 0a 29 3b 0d s in WAL */..);.
15d3a 0a 0d 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 .../* Return the
15d3b 20 76 61 6c 75 65 20 74 6f 20 70 61 73 73 20 74 value to pass t
15d3c 6f 20 61 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f o a sqlite3_wal_
15d3d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 2c 20 74 hook callback, t
15d3e 68 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 he..** number of
15d3f 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 57 frames in the W
15d40 41 4c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 AL at the point
15d41 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 6d of the last comm
15d42 69 74 20 73 69 6e 63 65 0d 0a 2a 2a 20 73 71 6c it since..** sql
15d43 69 74 65 33 57 61 6c 43 61 6c 6c 62 61 63 6b 28 ite3WalCallback(
15d44 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 ) was called. I
15d45 66 20 6e 6f 20 63 6f 6d 6d 69 74 73 20 68 61 76 f no commits hav
15d46 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 e occurred since
15d47 0d 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 63 61 ..** the last ca
15d48 6c 6c 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 ll, then return
15d49 30 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 0...*/..SQLITE_P
15d4a 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
15d4b 65 33 57 61 6c 43 61 6c 6c 62 61 63 6b 28 57 61 e3WalCallback(Wa
15d4c 6c 20 2a 70 57 61 6c 29 3b 0d 0a 0d 0a 2f 2a 20 l *pWal);..../*
15d4d 54 65 6c 6c 20 74 68 65 20 77 61 6c 20 6c 61 79 Tell the wal lay
15d4e 65 72 20 74 68 61 74 20 61 6e 20 45 58 43 4c 55 er that an EXCLU
15d4f 53 49 56 45 20 6c 6f 63 6b 20 68 61 73 20 62 65 SIVE lock has be
15d50 65 6e 20 6f 62 74 61 69 6e 65 64 20 28 6f 72 20 en obtained (or
15d51 72 65 6c 65 61 73 65 64 29 0d 0a 2a 2a 20 62 79 released)..** by
15d52 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 the pager layer
15d53 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
15d54 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 file...*/..SQLI
15d55 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
15d56 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 qlite3WalExclusi
15d57 76 65 4d 6f 64 65 28 57 61 6c 20 2a 70 57 61 6c veMode(Wal *pWal
15d58 2c 20 69 6e 74 20 6f 70 29 3b 0d 0a 0d 0a 2f 2a , int op);..../*
15d59 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 Return true if
15d5a 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 the argument is
15d5b 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 74 68 65 non-NULL and the
15d5c 20 57 41 4c 20 6d 6f 64 75 6c 65 20 69 73 20 75 WAL module is u
15d5d 73 69 6e 67 0d 0a 2a 2a 20 68 65 61 70 2d 6d 65 sing..** heap-me
15d5e 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 77 61 6c mory for the wal
15d5f 2d 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 -index. Otherwis
15d60 65 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 e, if the argume
15d61 6e 74 20 69 73 20 4e 55 4c 4c 20 6f 72 20 74 68 nt is NULL or th
15d62 65 0d 0a 2a 2a 20 57 41 4c 20 6d 6f 64 75 6c 65 e..** WAL module
15d63 20 69 73 20 75 73 69 6e 67 20 73 68 61 72 65 64 is using shared
15d64 2d 6d 65 6d 6f 72 79 2c 20 72 65 74 75 72 6e 20 -memory, return
15d65 66 61 6c 73 65 2e 20 0d 0a 2a 2f 0d 0a 53 51 4c false. ..*/..SQL
15d66 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
15d67 73 71 6c 69 74 65 33 57 61 6c 48 65 61 70 4d 65 sqlite3WalHeapMe
15d68 6d 6f 72 79 28 57 61 6c 20 2a 70 57 61 6c 29 3b mory(Wal *pWal);
15d69 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 ....#endif /* if
15d6a 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
15d6b 5f 57 41 4c 20 2a 2f 0d 0a 23 65 6e 64 69 66 20 _WAL */..#endif
15d6c 2f 2a 20 5f 57 41 4c 5f 48 5f 20 2a 2f 0d 0a 0d /* _WAL_H_ */...
15d6d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
15d6e 20 45 6e 64 20 6f 66 20 77 61 6c 2e 68 20 2a 2a End of wal.h **
15d6f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15d71 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
15d72 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
15d73 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 65 * Continuing whe
15d74 72 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 69 re we left off i
15d75 6e 20 70 61 67 65 72 2e 63 20 2a 2a 2a 2a 2a 2a n pager.c ******
15d76 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15d77 2f 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a /....../********
15d78 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 4f 54 45 *********** NOTE
15d79 53 20 4f 4e 20 54 48 45 20 44 45 53 49 47 4e 20 S ON THE DESIGN
15d7a 4f 46 20 54 48 45 20 50 41 47 45 52 20 2a 2a 2a OF THE PAGER ***
15d7b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15d7c 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 *****..**..** Th
15d7d 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63 6b is comment block
15d7e 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61 72 describes invar
15d7f 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64 20 iants that hold
15d80 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f 6c when using a rol
15d81 6c 62 61 63 6b 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 lback..** journa
15d82 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69 l. These invari
15d83 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c ants do not appl
15d84 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f y for journal_mo
15d85 64 65 3d 57 41 4c 2c 0d 0a 2a 2a 20 6a 6f 75 72 de=WAL,..** jour
15d86 6e 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c nal_mode=MEMORY,
15d87 20 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 or journal_mode
15d88 3d 4f 46 46 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 69 =OFF...**..** Wi
15d89 74 68 69 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e thin this commen
15d8a 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 t block, a page
15d8b 69 73 20 64 65 65 6d 65 64 20 74 6f 20 68 61 76 is deemed to hav
15d8c 65 20 62 65 65 6e 20 73 79 6e 63 65 64 0d 0a 2a e been synced..*
15d8d 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 * automatically
15d8e 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20 69 73 as soon as it is
15d8f 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20 50 52 written when PR
15d90 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 AGMA synchronous
15d91 3d 4f 46 46 2e 0d 0a 2a 2a 20 4f 74 68 65 72 77 =OFF...** Otherw
15d92 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 ise, the page is
15d93 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74 69 not synced unti
15d94 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 l the xSync meth
15d95 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0d 0a 2a od of the VFS..*
15d96 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63 * is called succ
15d97 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20 essfully on the
15d98 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 file containing
15d99 74 68 65 20 70 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a the page...**..*
15d9a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 * Definition: A
15d9b 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 page of the dat
15d9c 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 abase file is sa
15d9d 69 64 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 id to be "overwr
15d9e 69 74 65 61 62 6c 65 22 20 69 66 0d 0a 2a 2a 20 iteable" if..**
15d9f 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 one or more of t
15da0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 he following are
15da1 20 74 72 75 65 20 61 62 6f 75 74 20 74 68 65 20 true about the
15da2 70 61 67 65 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 page:..** ..**
15da3 20 20 20 28 61 29 20 20 54 68 65 20 6f 72 69 67 (a) The orig
15da4 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 inal content of
15da5 74 68 65 20 70 61 67 65 20 61 73 20 69 74 20 77 the page as it w
15da6 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e as at the beginn
15da7 69 6e 67 20 6f 66 0d 0a 2a 2a 20 20 20 20 20 20 ing of..**
15da8 20 20 20 20 74 68 65 20 74 72 61 6e 73 61 63 74 the transact
15da9 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 77 72 69 ion has been wri
15daa 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f tten into the ro
15dab 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 llback journal a
15dac 6e 64 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 nd..**
15dad 73 79 6e 63 65 64 2e 0d 0a 2a 2a 20 0d 0a 2a 2a synced...** ..**
15dae 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70 61 (b) The pa
15daf 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69 73 ge was a freelis
15db0 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20 74 t leaf page at t
15db1 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 he start of the
15db2 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2a transaction...**
15db3 20 0d 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 ..** (c) T
15db4 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 he page number i
15db5 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 s greater than t
15db6 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 he largest page
15db7 74 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0d that existed in.
15db8 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 .** the
15db9 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 database file a
15dba 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 t the start of t
15dbb 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d he transaction..
15dbc 0a 2a 2a 20 0d 0a 2a 2a 20 28 31 29 20 41 20 70 .** ..** (1) A p
15dbd 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 age of the datab
15dbe 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65 76 65 ase file is neve
15dbf 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20 75 6e r overwritten un
15dc0 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68 65 0d less one of the.
15dc1 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e .** followin
15dc2 67 20 61 72 65 20 74 72 75 65 3a 0d 0a 2a 2a 20 g are true:..**
15dc3 0d 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 ..** (a) The
15dc4 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 page and all ot
15dc5 68 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 her pages on the
15dc6 20 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 same sector are
15dc7 20 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0d overwriteable..
15dc8 0a 2a 2a 20 0d 0a 2a 2a 20 20 20 20 20 28 62 29 .** ..** (b)
15dc9 20 54 68 65 20 61 74 6f 6d 69 63 20 70 61 67 65 The atomic page
15dca 20 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 write optimizat
15dcb 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 ion is enabled,
15dcc 61 6e 64 20 74 68 65 20 65 6e 74 69 72 65 0d 0a and the entire..
15dcd 2a 2a 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 ** trans
15dce 61 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 action other tha
15dcf 6e 20 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 n the update of
15dd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 the transaction
15dd1 73 65 71 75 65 6e 63 65 0d 0a 2a 2a 20 20 20 20 sequence..**
15dd2 20 20 20 20 20 6e 75 6d 62 65 72 20 63 6f 6e 73 number cons
15dd3 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 ists of a single
15dd4 20 70 61 67 65 20 63 68 61 6e 67 65 2e 0d 0a 2a page change...*
15dd5 2a 20 0d 0a 2a 2a 20 28 32 29 20 54 68 65 20 63 * ..** (2) The c
15dd6 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 ontent of a page
15dd7 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 written into th
15dd8 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e e rollback journ
15dd9 61 6c 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 al exactly match
15dda 65 73 0d 0a 2a 2a 20 20 20 20 20 62 6f 74 68 20 es..** both
15ddb 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 the content in t
15ddc 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65 6e he database when
15ddd 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f the rollback jo
15dde 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74 74 65 urnal was writte
15ddf 6e 0d 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 n..** and th
15de0 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 e content in the
15de1 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 database at the
15de2 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 beginning of th
15de3 65 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 20 20 e current..**
15de4 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a transaction...
15de5 2a 2a 20 0d 0a 2a 2a 20 28 33 29 20 57 72 69 74 ** ..** (3) Writ
15de6 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 es to the databa
15de7 73 65 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 se file are an i
15de8 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 nteger multiple
15de9 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 of the page size
15dea 0d 0a 2a 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 ..** in leng
15deb 74 68 20 61 6e 64 20 61 72 65 20 61 6c 69 67 6e th and are align
15dec 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 ed on a page bou
15ded 6e 64 61 72 79 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 ndary...** ..**
15dee 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20 74 (4) Reads from t
15def 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
15df0 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69 67 are either alig
15df1 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62 6f ned on a page bo
15df2 75 6e 64 61 72 79 20 61 6e 64 0d 0a 2a 2a 20 20 undary and..**
15df3 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 an integer mu
15df4 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 ltiple of the pa
15df5 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74 ge size in lengt
15df6 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66 h or are taken f
15df7 72 6f 6d 20 74 68 65 0d 0a 2a 2a 20 20 20 20 20 rom the..**
15df8 66 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 first 100 bytes
15df9 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
15dfa 66 69 6c 65 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 28 file...** ..** (
15dfb 35 29 20 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 5) All writes to
15dfc 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
15dfd 6c 65 20 61 72 65 20 73 79 6e 63 65 64 20 70 72 le are synced pr
15dfe 69 6f 72 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 ior to the rollb
15dff 61 63 6b 20 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 ack journal..**
15e00 20 20 20 20 62 65 69 6e 67 20 64 65 6c 65 74 65 being delete
15e01 64 2c 20 74 72 75 6e 63 61 74 65 64 2c 20 6f 72 d, truncated, or
15e02 20 7a 65 72 6f 65 64 2e 0d 0a 2a 2a 20 0d 0a 2a zeroed...** ..*
15e03 2a 20 28 36 29 20 49 66 20 61 20 6d 61 73 74 65 * (6) If a maste
15e04 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 r journal file i
15e05 73 20 75 73 65 64 2c 20 74 68 65 6e 20 61 6c 6c s used, then all
15e06 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 writes to the d
15e07 61 74 61 62 61 73 65 20 66 69 6c 65 0d 0a 2a 2a atabase file..**
15e08 20 20 20 20 20 61 72 65 20 73 79 6e 63 65 64 20 are synced
15e09 70 72 69 6f 72 20 74 6f 20 74 68 65 20 6d 61 73 prior to the mas
15e0a 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e ter journal bein
15e0b 67 20 64 65 6c 65 74 65 64 2e 0d 0a 2a 2a 20 0d g deleted...** .
15e0c 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a 20 .** Definition:
15e0d 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28 6f Two databases (o
15e0e 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 r the same datab
15e0f 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e 74 ase at two point
15e10 73 20 69 74 20 74 69 6d 65 29 0d 0a 2a 2a 20 61 s it time)..** a
15e11 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c re said to be "l
15e12 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c ogically equival
15e13 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76 ent" if they giv
15e14 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 e the same answe
15e15 72 20 74 6f 0d 0a 2a 2a 20 61 6c 6c 20 71 75 65 r to..** all que
15e16 72 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 ries. Note in p
15e17 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 articular the th
15e18 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 e content of fre
15e19 65 6c 69 73 74 20 6c 65 61 66 0d 0a 2a 2a 20 70 elist leaf..** p
15e1a 61 67 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e ages can be chan
15e1b 67 65 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 ged arbitarily w
15e1c 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 ithout effecting
15e1d 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 the logical equ
15e1e 69 76 61 6c 65 6e 63 65 0d 0a 2a 2a 20 6f 66 20 ivalence..** of
15e1f 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a the database...*
15e20 2a 20 0d 0a 2a 2a 20 28 37 29 20 41 74 20 61 6e * ..** (7) At an
15e21 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20 73 y time, if any s
15e22 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e 67 ubset, including
15e23 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20 61 the empty set a
15e24 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65 74 nd the total set
15e25 2c 0d 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 ,..** of the
15e26 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65 unsynced change
15e27 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20 s to a rollback
15e28 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f journal are remo
15e29 76 65 64 20 61 6e 64 20 74 68 65 20 0d 0a 2a 2a ved and the ..**
15e2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 journal is
15e2b 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 rolled back, the
15e2c 20 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 resulting datab
15e2d 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 ase file will be
15e2e 20 6c 6f 67 69 63 61 6c 0d 0a 2a 2a 20 20 20 20 logical..**
15e2f 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 equivalent to t
15e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
15e31 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e at the beginnin
15e32 67 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 g of the transac
15e33 74 69 6f 6e 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 28 tion...** ..** (
15e34 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e 73 61 8) When a transa
15e35 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 ction is rolled
15e36 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75 6e 63 back, the xTrunc
15e37 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 ate method of th
15e38 65 20 56 46 53 0d 0a 2a 2a 20 20 20 20 20 69 73 e VFS..** is
15e39 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74 6f called to resto
15e3a 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 re the database
15e3b 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d 65 file to the same
15e3c 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74 0d size it was at.
15e3d 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69 .** the begi
15e3e 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61 nning of the tra
15e3f 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73 nsaction. (In s
15e40 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78 ome VFSes, the x
15e41 54 72 75 6e 63 61 74 65 0d 0a 2a 2a 20 20 20 20 Truncate..**
15e42 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d method is a no-
15e43 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 op, but that doe
15e44 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 s not change the
15e45 20 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 fact the SQLite
15e46 20 77 69 6c 6c 0d 0a 2a 2a 20 20 20 20 20 69 6e will..** in
15e47 76 6f 6b 65 20 69 74 2e 29 0d 0a 2a 2a 20 0d 0a voke it.)..** ..
15e48 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 ** (9) Whenever
15e49 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
15e4a 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 e is modified, a
15e4b 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 t least one bit
15e4c 69 6e 20 74 68 65 20 72 61 6e 67 65 0d 0a 2a 2a in the range..**
15e4d 20 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 of bytes fr
15e4e 6f 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 om 24 through 39
15e4f 20 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 inclusive will
15e50 62 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 be changed prior
15e51 20 74 6f 20 72 65 6c 65 61 73 69 6e 67 0d 0a 2a to releasing..*
15e52 2a 20 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 * the EXCLUS
15e53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 IVE lock, thus s
15e54 69 67 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 ignaling other c
15e55 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 onnections on th
15e56 65 20 73 61 6d 65 0d 0a 2a 2a 20 20 20 20 20 64 e same..** d
15e57 61 74 61 62 61 73 65 20 74 6f 20 66 6c 75 73 68 atabase to flush
15e58 20 74 68 65 69 72 20 63 61 63 68 65 73 2e 0d 0a their caches...
15e59 2a 2a 0d 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 **..** (10) The
15e5a 70 61 74 74 65 72 6e 20 6f 66 20 62 69 74 73 20 pattern of bits
15e5b 69 6e 20 62 79 74 65 73 20 32 34 20 74 68 72 6f in bytes 24 thro
15e5c 75 67 68 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 ugh 39 shall not
15e5d 20 72 65 70 65 61 74 20 69 6e 20 6c 65 73 73 0d repeat in less.
15e5e 0a 2a 2a 20 20 20 20 20 20 74 68 61 6e 20 6f 6e .** than on
15e5f 65 20 62 69 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 e billion transa
15e60 63 74 69 6f 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ctions...**..**
15e61 28 31 31 29 20 41 20 64 61 74 61 62 61 73 65 20 (11) A database
15e62 66 69 6c 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 file is well-for
15e63 6d 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e med at the begin
15e64 6e 69 6e 67 20 61 6e 64 20 61 74 20 74 68 65 20 ning and at the
15e65 63 6f 6e 63 6c 75 73 69 6f 6e 0d 0a 2a 2a 20 20 conclusion..**
15e66 20 20 20 20 6f 66 20 65 76 65 72 79 20 74 72 61 of every tra
15e67 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a nsaction...**..*
15e68 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55 53 * (12) An EXCLUS
15e69 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 IVE lock is held
15e6a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
15e6b 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74 69 file when writi
15e6c 6e 67 20 74 6f 0d 0a 2a 2a 20 20 20 20 20 20 74 ng to..** t
15e6d 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
15e6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 28 31 33 29 20 41 ...**..** (13) A
15e6f 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 SHARED lock is
15e70 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 held on the data
15e71 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 base file while
15e72 72 65 61 64 69 6e 67 20 61 6e 79 0d 0a 2a 2a 20 reading any..**
15e73 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 content out
15e74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
15e75 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a file...**..****
15e76 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e77 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e78 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e79 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e7a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f **********/..../
15e7b 2a 0d 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 *..** Macros for
15e7c 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 troubleshooting
15e7d 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e . Normally turn
15e7e 65 64 20 6f 66 66 0d 0a 2a 2f 0d 0a 23 69 66 20 ed off..*/..#if
15e7f 30 0d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 0..int sqlite3Pa
15e80 67 65 72 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 gerTrace=1; /*
15e81 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 True to enable t
15e82 72 61 63 69 6e 67 20 2a 2f 0d 0a 23 64 65 66 69 racing */..#defi
15e83 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 ne sqlite3DebugP
15e84 72 69 6e 74 66 20 70 72 69 6e 74 66 0d 0a 23 64 rintf printf..#d
15e85 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 efine PAGERTRACE
15e86 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c 69 (X) if( sqli
15e87 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29 7b te3PagerTrace ){
15e88 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 sqlite3DebugPri
15e89 6e 74 66 20 58 3b 20 7d 0d 0a 23 65 6c 73 65 0d ntf X; }..#else.
15e8a 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 .#define PAGERTR
15e8b 41 43 45 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a ACE(X)..#endif..
15e8c 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c ../*..** The fol
15e8d 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f lowing two macro
15e8e 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 s are used withi
15e8f 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 n the PAGERTRACE
15e90 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0d () macros above.
15e91 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 .** to print out
15e92 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 file-descriptor
15e93 73 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 50 41 47 45 s. ..**..** PAGE
15e94 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f RID() takes a po
15e95 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 inter to a Pager
15e96 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 struct as its a
15e97 72 67 75 6d 65 6e 74 2e 20 54 68 65 0d 0a 2a 2a rgument. The..**
15e98 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 associated file
15e99 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 -descriptor is r
15e9a 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e eturned. FILEHAN
15e9b 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e DLEID() takes an
15e9c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0d 0a 2a sqlite3_file..*
15e9d 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 * struct as its
15e9e 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 23 argument...*/..#
15e9f 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 define PAGERID(p
15ea0 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29 ) ((int)(p->fd))
15ea1 0d 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 ..#define FILEHA
15ea2 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 NDLEID(fd) ((int
15ea3 29 66 64 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 )fd)..../*..** T
15ea4 68 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 he Pager.eState
15ea5 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 variable stores
15ea6 74 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 the current 'sta
15ea7 74 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 te' of a pager.
15ea8 41 0d 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 A..** pager may
15ea9 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 be in any one of
15eaa 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 the seven state
15eab 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 s shown in the f
15eac 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20 73 74 61 ollowing..** sta
15ead 74 65 20 64 69 61 67 72 61 6d 2e 0d 0a 2a 2a 0d te diagram...**.
15eae 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
15eaf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f O
15eb0 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d PEN <------+----
15eb1 2d 2d 2b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 --+..**
15eb2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15eb3 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c | |
15eb4 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 20 20 20 20 |..**
15eb5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15eb6 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 V
15eb7 20 20 20 7c 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 | |..**
15eb8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d +-
15eb9 2d 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 --------> READER
15eba 2d 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0d -------+ |.
15ebb 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
15ebc 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 |
15ebd 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
15ebe 20 20 7c 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 |..**
15ebf 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 |
15ec0 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 V
15ec1 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 20 20 20 20 |..**
15ec2 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d |<----
15ec3 2d 2d 2d 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 ---WRITER_LOCKED
15ec4 2d 2d 2d 2d 2d 2d 3e 20 45 52 52 4f 52 0d 0a 2a ------> ERROR..*
15ec5 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
15ec6 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c | |
15ec7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15ec8 5e 20 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 ^ ..**
15ec9 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 |
15eca 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 V
15ecb 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 20 20 20 20 |..**
15ecc 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d |<----
15ecd 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f --WRITER_CACHEMO
15ece 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0d 0a 2a 2a 20 D-------->|..**
15ecf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 |
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 |
15ed1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0d |.
15ed2 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
15ed3 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 |
15ed4 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 V
15ed5 20 20 7c 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 |..**
15ed6 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 |<-------W
15ed7 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d RITER_DBMOD-----
15ed8 2d 2d 2d 2d 2d 3e 7c 0d 0a 2a 2a 20 20 20 20 20 ----->|..**
15ed9 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 |
15eda 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 |
15edb 20 20 20 20 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 |..**
15edc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 |
15edd 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20 V
15ede 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0d |.
15edf 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
15ee0 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 +<------WRITER
15ee1 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d _FINISHED-------
15ee2 2d 3e 2b 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 ->+..**..**..**
15ee3 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 List of state tr
15ee4 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 ansitions and th
15ee5 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 e C [function] t
15ee6 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 hat performs eac
15ee7 68 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 20 4f 50 h:..** ..** OP
15ee8 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 EN
15ee9 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20 -> READER
15eea 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 [sqlite3P
15eeb 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0d agerSharedLock].
15eec 0a 2a 2a 20 20 20 52 45 41 44 45 52 20 20 20 20 .** READER
15eed 20 20 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 -> OPEN
15eee 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b [
15eef 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0d 0a 2a pager_unlock]..*
15ef0 2a 0d 0a 2a 2a 20 20 20 52 45 41 44 45 52 20 20 *..** READER
15ef1 20 20 20 20 20 20 20 20 20 20 2d 3e 20 57 52 49 -> WRI
15ef2 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 TER_LOCKED
15ef3 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 [sqlite3PagerBe
15ef4 67 69 6e 5d 0d 0a 2a 2a 20 20 20 57 52 49 54 45 gin]..** WRITE
15ef5 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20 2d 3e 20 R_LOCKED ->
15ef6 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 WRITER_CACHEMOD
15ef7 20 20 20 20 5b 70 61 67 65 72 5f 6f 70 65 6e 5f [pager_open_
15ef8 6a 6f 75 72 6e 61 6c 5d 0d 0a 2a 2a 20 20 20 57 journal]..** W
15ef9 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 RITER_CACHEMOD
15efa 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 -> WRITER_DBMOD
15efb 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a 6f 75 [syncJou
15efc 72 6e 61 6c 5d 0d 0a 2a 2a 20 20 20 57 52 49 54 rnal]..** WRIT
15efd 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d 3e ER_DBMOD ->
15efe 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 WRITER_FINISHED
15eff 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 [sqlite3Pag
15f00 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 erCommitPhaseOne
15f01 5d 0d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a ]..** WRITER_*
15f02 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41 ** -> REA
15f03 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 DER
15f04 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e [pager_end_tran
15f05 73 61 63 74 69 6f 6e 5d 0d 0a 2a 2a 0d 0a 2a 2a saction]..**..**
15f06 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 WRITER_***
15f07 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 -> ERROR
15f08 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 [pag
15f09 65 72 5f 65 72 72 6f 72 5d 0d 0a 2a 2a 20 20 20 er_error]..**
15f0a 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 ERROR
15f0b 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 -> OPEN
15f0c 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f [pager_
15f0d 75 6e 6c 6f 63 6b 5d 0d 0a 2a 2a 20 0d 0a 2a 2a unlock]..** ..**
15f0e 0d 0a 2a 2a 20 20 4f 50 45 4e 3a 0d 0a 2a 2a 0d ..** OPEN:..**.
15f0f 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 .** The pager
15f10 20 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 starts up in th
15f11 69 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e is state. Nothin
15f12 67 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 g is guaranteed
15f13 69 6e 20 74 68 69 73 0d 0a 2a 2a 20 20 20 20 73 in this..** s
15f14 74 61 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 tate - the file
15f15 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 may or may not b
15f16 65 20 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 e locked and the
15f17 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 database size i
15f18 73 0d 0a 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e s..** unknown
15f19 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d . The database m
15f1a 61 79 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f ay not be read o
15f1b 72 20 77 72 69 74 74 65 6e 2e 0d 0a 2a 2a 0d 0a r written...**..
15f1c 2a 2a 20 20 20 20 2a 20 4e 6f 20 72 65 61 64 20 ** * No read
15f1d 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 or write transac
15f1e 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0d tion is active..
15f1f 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20 6c 6f 63 .** * Any loc
15f20 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b 20 61 74 k, or no lock at
15f21 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20 68 65 6c all, may be hel
15f22 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 d on the databas
15f23 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 20 20 20 2a e file...** *
15f24 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f The dbSize, dbO
15f25 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 rigSize and dbFi
15f26 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 leSize variables
15f27 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 may not be trus
15f28 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 52 45 ted...**..** RE
15f29 41 44 45 52 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 ADER:..**..**
15f2a 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 In this state a
15f2b 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 ll the requireme
15f2c 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 nts for reading
15f2d 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 the database in
15f2e 0d 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b ..** rollback
15f2f 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 (non-WAL) mode
15f30 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 are met. Unless
15f31 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72 the pager is (or
15f32 20 72 65 63 65 6e 74 6c 79 0d 0a 2a 2a 20 20 20 recently..**
15f33 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 was) in exclusi
15f34 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c ve-locking mode,
15f35 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 a user-level re
15f36 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 ad transaction i
15f37 73 20 0d 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 s ..** open.
15f38 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a The database siz
15f39 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 e is known in th
15f3a 69 73 20 73 74 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a is state...**..*
15f3b 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f * A connectio
15f3c 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c n running with l
15f3d 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d ocking_mode=norm
15f3e 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 al enters this s
15f3f 74 61 74 65 20 77 68 65 6e 0d 0a 2a 2a 20 20 20 tate when..**
15f40 20 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 it opens a read
15f41 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 -transaction on
15f42 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 the database and
15f43 20 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 returns to stat
15f44 65 0d 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 e..** OPEN af
15f45 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 ter the read-tra
15f46 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 nsaction is comp
15f47 6c 65 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 leted. However a
15f48 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 connection..**
15f49 20 20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f running in lo
15f4a 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 cking_mode=exclu
15f4b 73 69 76 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 sive (including
15f4c 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 29 20 temp databases)
15f4d 72 65 6d 61 69 6e 73 20 69 6e 0d 0a 2a 2a 20 20 remains in..**
15f4e 20 20 74 68 69 73 20 73 74 61 74 65 20 65 76 65 this state eve
15f4f 6e 20 61 66 74 65 72 20 74 68 65 20 72 65 61 64 n after the read
15f50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 -transaction is
15f51 63 6c 6f 73 65 64 2e 20 54 68 65 20 6f 6e 6c 79 closed. The only
15f52 20 77 61 79 0d 0a 2a 2a 20 20 20 20 61 20 6c 6f way..** a lo
15f53 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 cking_mode=exclu
15f54 73 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 sive connection
15f55 63 61 6e 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 can transition f
15f56 72 6f 6d 20 52 45 41 44 45 52 20 74 6f 20 4f 50 rom READER to OP
15f57 45 4e 0d 0a 2a 2a 20 20 20 20 69 73 20 76 69 61 EN..** is via
15f58 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 the ERROR state
15f59 20 28 73 65 65 20 62 65 6c 6f 77 29 2e 0d 0a 2a (see below)...*
15f5a 2a 20 0d 0a 2a 2a 20 20 20 20 2a 20 41 20 72 65 * ..** * A re
15f5b 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d ad transaction m
15f5c 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62 75 ay be active (bu
15f5d 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 t a write-transa
15f5e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0d 0a ction cannot)...
15f5f 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44 ** * A SHARED
15f60 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b or greater lock
15f61 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 is held on the
15f62 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a database file...
15f63 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 ** * The dbSi
15f64 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 ze variable may
15f65 62 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e be trusted (even
15f66 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c if a user-level
15f67 20 72 65 61 64 20 0d 0a 2a 2a 20 20 20 20 20 20 read ..**
15f68 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e transaction is n
15f69 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 ot active). The
15f6a 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 dbOrigSize and d
15f6b 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 bFileSize variab
15f6c 6c 65 73 0d 0a 2a 2a 20 20 20 20 20 20 6d 61 79 les..** may
15f6d 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20 not be trusted
15f6e 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0d 0a at this point...
15f6f 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 ** * If the d
15f70 61 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c atabase is a WAL
15f71 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 database, then
15f72 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 the WAL connecti
15f73 6f 6e 20 69 73 20 6f 70 65 6e 2e 0d 0a 2a 2a 20 on is open...**
15f74 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 * Even if a r
15f75 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 ead-transaction
15f76 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 is not open, it
15f77 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 is guaranteed th
15f78 61 74 20 0d 0a 2a 2a 20 20 20 20 20 20 74 68 65 at ..** the
15f79 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 re is no hot-jou
15f7a 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 rnal in the file
15f7b 2d 73 79 73 74 65 6d 2e 0d 0a 2a 2a 0d 0a 2a 2a -system...**..**
15f7c 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a WRITER_LOCKED:
15f7d 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 54 68 65 20 ..**..** The
15f7e 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 pager moves to t
15f7f 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 52 his state from R
15f80 45 41 44 45 52 20 77 68 65 6e 20 61 20 77 72 69 EADER when a wri
15f81 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a te-transaction..
15f82 2a 2a 20 20 20 20 69 73 20 66 69 72 73 74 20 6f ** is first o
15f83 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 pened on the dat
15f84 61 62 61 73 65 2e 20 49 6e 20 57 52 49 54 45 52 abase. In WRITER
15f85 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 _LOCKED state, a
15f86 6c 6c 20 6c 6f 63 6b 73 20 0d 0a 2a 2a 20 20 20 ll locks ..**
15f87 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 61 required to sta
15f88 72 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 rt a write-trans
15f89 61 63 74 69 6f 6e 20 61 72 65 20 68 65 6c 64 2c action are held,
15f8a 20 62 75 74 20 6e 6f 20 61 63 74 75 61 6c 20 0d but no actual .
15f8b 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69 63 61 74 .** modificat
15f8c 69 6f 6e 73 20 74 6f 20 74 68 65 20 63 61 63 68 ions to the cach
15f8d 65 20 6f 72 20 64 61 74 61 62 61 73 65 20 68 61 e or database ha
15f8e 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2e 0d ve taken place..
15f8f 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 49 6e 20 72 6f .**..** In ro
15f90 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20 52 llback mode, a R
15f91 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20 74 ESERVED or (if t
15f92 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 he transaction w
15f93 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 0d as opened with .
15f94 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43 .** BEGIN EXC
15f95 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56 LUSIVE) EXCLUSIV
15f96 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e E lock is obtain
15f97 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 ed on the databa
15f98 73 65 20 66 69 6c 65 20 77 68 65 6e 0d 0a 2a 2a se file when..**
15f99 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 moving to th
15f9a 69 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 is state, but th
15f9b 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 e journal file i
15f9c 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f s not written to
15f9d 20 6f 72 20 6f 70 65 6e 65 64 20 0d 0a 2a 2a 20 or opened ..**
15f9e 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 to in this st
15f9f 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e ate. If the tran
15fa0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 saction is commi
15fa1 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 tted or rolled b
15fa2 61 63 6b 20 77 68 69 6c 65 20 0d 0a 2a 2a 20 20 ack while ..**
15fa3 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b in WRITER_LOCK
15fa4 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 ED state, all th
15fa5 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 at is required i
15fa6 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 s to unlock the
15fa7 64 61 74 61 62 61 73 65 20 0d 0a 2a 2a 20 20 20 database ..**
15fa8 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 file...**..**
15fa9 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 IN WAL mode, W
15faa 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e alBeginWriteTran
15fab 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c saction() is cal
15fac 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 led to lock the
15fad 6c 6f 67 20 66 69 6c 65 2e 0d 0a 2a 2a 20 20 20 log file...**
15fae 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 If the connecti
15faf 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 on is running wi
15fb0 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d th locking_mode=
15fb1 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 exclusive, an at
15fb2 74 65 6d 70 74 0d 0a 2a 2a 20 20 20 20 69 73 20 tempt..** is
15fb3 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 made to obtain a
15fb4 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b n EXCLUSIVE lock
15fb5 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
15fb6 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 file...**..**
15fb7 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e * A write tran
15fb8 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 saction is activ
15fb9 65 2e 0d 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 e...** * If t
15fba 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 he connection is
15fbb 20 6f 70 65 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 open in rollbac
15fbc 6b 2d 6d 6f 64 65 2c 20 61 20 52 45 53 45 52 56 k-mode, a RESERV
15fbd 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 0d 0a ED or greater ..
15fbe 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 69 73 20 ** lock is
15fbf 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 held on the data
15fc0 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 20 base file...**
15fc1 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 * If the conne
15fc2 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e ction is open in
15fc3 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20 57 41 4c WAL-mode, a WAL
15fc4 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 write transacti
15fc5 6f 6e 0d 0a 2a 2a 20 20 20 20 20 20 69 73 20 6f on..** is o
15fc6 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69 74 65 pen (i.e. sqlite
15fc7 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 3WalBeginWriteTr
15fc8 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61 73 20 ansaction() has
15fc9 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c been successfull
15fca 79 0d 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c 65 y..** calle
15fcb 64 29 2e 0d 0a 2a 2a 20 20 20 20 2a 20 54 68 65 d)...** * The
15fcc 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 dbSize, dbOrigS
15fcd 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 ize and dbFileSi
15fce 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 ze variables are
15fcf 20 61 6c 6c 20 76 61 6c 69 64 2e 0d 0a 2a 2a 20 all valid...**
15fd0 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 * The content
15fd1 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 s of the pager c
15fd2 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 ache have not be
15fd3 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0d 0a 2a 2a en modified...**
15fd4 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 * The journa
15fd5 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 l file may or ma
15fd6 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0d 0a y not be open...
15fd7 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 ** * Nothing
15fd8 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69 (not even the fi
15fd9 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20 rst header) has
15fda 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 been written to
15fdb 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0d 0a 2a 2a the journal...**
15fdc 0d 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 ..** WRITER_CAC
15fdd 48 45 4d 4f 44 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 HEMOD:..**..**
15fde 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 A pager moves
15fdf 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b from WRITER_LOCK
15fe0 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 ED state to this
15fe1 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 state when a pa
15fe2 67 65 20 69 73 0d 0a 2a 2a 20 20 20 20 66 69 72 ge is..** fir
15fe3 73 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 st modified by t
15fe4 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 he upper layer.
15fe5 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 In rollback mode
15fe6 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
15fe7 65 0d 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e e..** is open
15fe8 65 64 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 ed (if it is not
15fe9 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 already open) a
15fea 6e 64 20 61 20 68 65 61 64 65 72 20 77 72 69 74 nd a header writ
15feb 74 65 6e 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 20 ten to the..**
15fec 20 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 54 start of it. T
15fed 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
15fee 20 6f 6e 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 on disk has not
15fef 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0d been modified..
15ff0 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 2a 20 41 20 77 .**..** * A w
15ff1 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e rite transaction
15ff2 20 69 73 20 61 63 74 69 76 65 2e 0d 0a 2a 2a 20 is active...**
15ff3 20 20 20 2a 20 41 20 52 45 53 45 52 56 45 44 20 * A RESERVED
15ff4 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 or greater lock
15ff5 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 is held on the d
15ff6 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a atabase file...*
15ff7 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e * * The journ
15ff8 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 al file is open
15ff9 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 and the first he
15ffa 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 ader has been wr
15ffb 69 74 74 65 6e 20 0d 0a 2a 2a 20 20 20 20 20 20 itten ..**
15ffc 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20 68 to it, but the h
15ffd 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62 65 eader has not be
15ffe 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 en synced to dis
15fff 6b 2e 0d 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 k...** * The
16000 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
16001 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20 page cache have
16002 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0d 0a been modified...
16003 2a 2a 0d 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 **..** WRITER_D
16004 42 4d 4f 44 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 BMOD:..**..**
16005 20 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 The pager trans
16006 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 itions from WRIT
16007 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f ER_CACHEMOD into
16008 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 WRITER_DBMOD st
16009 61 74 65 0d 0a 2a 2a 20 20 20 20 77 68 65 6e 20 ate..** when
1600a 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 it modifies the
1600b 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
1600c 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 database file. W
1600d 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a AL connections..
1600e 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65 ** never ente
1600f 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69 r this state (si
16010 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 nce they do not
16011 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 modify the datab
16012 61 73 65 20 66 69 6c 65 2c 0d 0a 2a 2a 20 20 20 ase file,..**
16013 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 just the log fi
16014 6c 65 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 le)...**..**
16015 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 * A write transa
16016 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e ction is active.
16017 0d 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 ..** * An EXC
16018 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 LUSIVE or greate
16019 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f r lock is held o
1601a 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 n the database f
1601b 69 6c 65 2e 0d 0a 2a 2a 20 20 20 20 2a 20 54 68 ile...** * Th
1601c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 e journal file i
1601d 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 s open and the f
1601e 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73 20 irst header has
1601f 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0d 0a 2a been written ..*
16020 2a 20 20 20 20 20 20 61 6e 64 20 73 79 6e 63 65 * and synce
16021 64 20 74 6f 20 64 69 73 6b 2e 0d 0a 2a 2a 20 20 d to disk...**
16022 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 * The contents
16023 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 of the page cac
16024 68 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 he have been mod
16025 69 66 69 65 64 20 28 61 6e 64 20 70 6f 73 73 69 ified (and possi
16026 62 6c 79 0d 0a 2a 2a 20 20 20 20 20 20 77 72 69 bly..** wri
16027 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e 0d 0a tten to disk)...
16028 2a 2a 0d 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46 **..** WRITER_F
16029 49 4e 49 53 48 45 44 3a 0d 0a 2a 2a 0d 0a 2a 2a INISHED:..**..**
1602a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f It is not po
1602b 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c ssible for a WAL
1602c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 connection to e
1602d 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65 2e nter this state.
1602e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 41 20 72 6f ..**..** A ro
1602f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 llback-mode page
16030 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 r changes to WRI
16031 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 TER_FINISHED sta
16032 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 te from WRITER_D
16033 42 4d 4f 44 0d 0a 2a 2a 20 20 20 20 73 74 61 74 BMOD..** stat
16034 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 e after the enti
16035 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 re transaction h
16036 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 as been successf
16037 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 ully written int
16038 6f 20 74 68 65 0d 0a 2a 2a 20 20 20 20 64 61 74 o the..** dat
16039 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 abase file. In t
1603a 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72 his state the tr
1603b 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 ansaction may be
1603c 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c committed simpl
1603d 79 0d 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 y..** by fina
1603e 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e lizing the journ
1603f 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e al file. Once in
16040 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 WRITER_FINISHED
16041 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0d 0a state, it is ..
16042 2a 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 ** not possib
16043 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 le to modify the
16044 20 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 database furthe
16045 72 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 r. At this point
16046 2c 20 74 68 65 20 75 70 70 65 72 20 0d 0a 2a 2a , the upper ..**
16047 20 20 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 layer must e
16048 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 ither commit or
16049 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 rollback the tra
1604a 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a nsaction...**..*
1604b 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74 * * A write t
1604c 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 ransaction is ac
1604d 74 69 76 65 2e 0d 0a 2a 2a 20 20 20 20 2a 20 41 tive...** * A
1604e 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20 67 n EXCLUSIVE or g
1604f 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 reater lock is h
16050 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 eld on the datab
16051 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 20 20 ase file...**
16052 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e 67 20 61 * All writing a
16053 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66 20 6a 6f nd syncing of jo
16054 75 72 6e 61 6c 20 61 6e 64 20 64 61 74 61 62 61 urnal and databa
16055 73 65 20 64 61 74 61 20 68 61 73 20 66 69 6e 69 se data has fini
16056 73 68 65 64 2e 0d 0a 2a 2a 20 20 20 20 20 20 49 shed...** I
16057 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 f no error occur
16058 65 64 2c 20 61 6c 6c 20 74 68 61 74 20 72 65 6d ed, all that rem
16059 61 69 6e 73 20 69 73 20 74 6f 20 66 69 6e 61 6c ains is to final
1605a 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 ize the journal
1605b 74 6f 0d 0a 2a 2a 20 20 20 20 20 20 63 6f 6d 6d to..** comm
1605c 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 it the transacti
1605d 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 on. If an error
1605e 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65 20 63 did occur, the c
1605f 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65 64 0d aller will need.
16060 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c 6c .** to roll
16061 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 back the transac
16062 74 69 6f 6e 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 20 tion. ..**..**
16063 45 52 52 4f 52 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ERROR:..**..**
16064 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 The ERROR stat
16065 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 e is entered whe
16066 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d n an IO or disk-
16067 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c full error (incl
16068 75 64 69 6e 67 0d 0a 2a 2a 20 20 20 20 53 51 4c uding..** SQL
16069 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 ITE_IOERR_NOMEM)
1606a 20 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 occurs at a poi
1606b 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 nt in the code t
1606c 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0d 0a 2a hat makes it ..*
1606d 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 * difficult t
1606e 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20 74 o be sure that t
1606f 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 he in-memory pag
16070 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65 20 er state (cache
16071 63 6f 6e 74 65 6e 74 73 2c 20 0d 0a 2a 2a 20 20 contents, ..**
16072 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20 db size etc.)
16073 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 are consistent w
16074 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 ith the contents
16075 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 of the file-sys
16076 74 65 6d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 tem...**..**
16077 54 65 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 Temporary pager
16078 66 69 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 files may enter
16079 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c the ERROR state,
1607a 20 62 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 but in-memory p
1607b 61 67 65 72 73 0d 0a 2a 2a 20 20 20 20 63 61 6e agers..** can
1607c 6e 6f 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 not...**..**
1607d 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 For example, if
1607e 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 an IO error occu
1607f 72 73 20 77 68 69 6c 65 20 70 65 72 66 6f 72 6d rs while perform
16080 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 ing a rollback,
16081 0d 0a 2a 2a 20 20 20 20 74 68 65 20 63 6f 6e 74 ..** the cont
16082 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 ents of the page
16083 2d 63 61 63 68 65 20 6d 61 79 20 62 65 20 6c 65 -cache may be le
16084 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 ft in an inconsi
16085 73 74 65 6e 74 20 73 74 61 74 65 2e 0d 0a 2a 2a stent state...**
16086 20 20 20 20 41 74 20 74 68 69 73 20 70 6f 69 6e At this poin
16087 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 64 61 t it would be da
16088 6e 67 65 72 6f 75 73 20 74 6f 20 63 68 61 6e 67 ngerous to chang
16089 65 20 62 61 63 6b 20 74 6f 20 52 45 41 44 45 52 e back to READER
1608a 20 73 74 61 74 65 0d 0a 2a 2a 20 20 20 20 28 61 state..** (a
1608b 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70 65 6e s usually happen
1608c 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 s after a rollba
1608d 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65 71 75 ck). Any subsequ
1608e 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69 67 68 ent readers migh
1608f 74 0d 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74 20 t..** report
16090 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 database corrupt
16091 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65 20 ion (due to the
16092 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 inconsistent cac
16093 68 65 29 2c 20 61 6e 64 20 69 66 0d 0a 2a 2a 20 he), and if..**
16094 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20 they upgrade
16095 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79 to writers, they
16096 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74 may inadvertent
16097 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 ly corrupt the d
16098 61 74 61 62 61 73 65 0d 0a 2a 2a 20 20 20 20 66 atabase..** f
16099 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 ile. To avoid th
1609a 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 is hazard, the p
1609b 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e ager switches in
1609c 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 to the ERROR sta
1609d 74 65 0d 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 te..** instea
1609e 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c d of READER foll
1609f 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 owing such an er
160a0 72 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ror...**..**
160a1 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 Once it has ente
160a2 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 red the ERROR st
160a3 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 ate, any attempt
160a4 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 to use the page
160a5 72 0d 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 r..** to read
160a6 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20 72 or write data r
160a7 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e eturns an error.
160a8 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 Eventually, onc
160a9 65 20 61 6c 6c 20 0d 0a 2a 2a 20 20 20 20 6f 75 e all ..** ou
160aa 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 tstanding transa
160ab 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e ctions have been
160ac 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 abandoned, the
160ad 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f pager is able to
160ae 0d 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 ..** transiti
160af 6f 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 on back to OPEN
160b0 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e state, discardin
160b1 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f g the contents o
160b2 66 20 74 68 65 20 0d 0a 2a 2a 20 20 20 20 70 61 f the ..** pa
160b3 67 65 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 ge-cache and any
160b4 20 6f 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 other in-memory
160b5 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 61 state at the sa
160b6 6d 65 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 me time. Everyth
160b7 69 6e 67 0d 0a 2a 2a 20 20 20 20 69 73 20 72 65 ing..** is re
160b8 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b loaded from disk
160b9 20 28 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 (and, if necess
160ba 61 72 79 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c ary, hot-journal
160bb 20 72 6f 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d rollback peform
160bc 65 64 29 0d 0a 2a 2a 20 20 20 20 77 68 65 6e 20 ed)..** when
160bd 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 a read-transacti
160be 6f 6e 20 69 73 20 6e 65 78 74 20 6f 70 65 6e 65 on is next opene
160bf 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 d on the pager (
160c0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 0d 0a 2a transitioning..*
160c1 2a 20 20 20 20 74 68 65 20 70 61 67 65 72 20 69 * the pager i
160c2 6e 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 nto READER state
160c3 29 2e 20 41 74 20 74 68 61 74 20 70 6f 69 6e 74 ). At that point
160c4 20 74 68 65 20 73 79 73 74 65 6d 20 68 61 73 20 the system has
160c5 72 65 63 6f 76 65 72 65 64 20 0d 0a 2a 2a 20 20 recovered ..**
160c6 20 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 from the error
160c7 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 53 70 65 ...**..** Spe
160c8 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 70 cifically, the p
160c9 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74 6f 20 ager jumps into
160ca 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 the ERROR state
160cb 69 66 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 if:..**..**
160cc 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 1. An error occ
160cd 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 urs while attemp
160ce 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e ting a rollback.
160cf 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e This happens in
160d0 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e ..** fun
160d1 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 ction sqlite3Pag
160d2 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0d 0a 2a erRollback()...*
160d3 2a 0d 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e *..** 2. An
160d4 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 error occurs wh
160d5 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 ile attempting t
160d6 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 o finalize a jou
160d7 72 6e 61 6c 20 66 69 6c 65 0d 0a 2a 2a 20 20 20 rnal file..**
160d8 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 following
160d9 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 a commit in func
160da 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 tion sqlite3Page
160db 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 rCommitPhaseTwo(
160dc 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 )...**..**
160dd 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 3. An error occu
160de 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 rs while attempt
160df 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20 ing to write to
160e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0d 0a the journal or..
160e1 2a 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 ** datab
160e2 61 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 ase file in func
160e3 74 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 tion pagerStress
160e4 28 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 () in order to f
160e5 72 65 65 20 75 70 0d 0a 2a 2a 20 20 20 20 20 20 ree up..**
160e6 20 20 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a 0d 0a memory...**..
160e7 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65 72 20 63 ** In other c
160e8 61 73 65 73 2c 20 74 68 65 20 65 72 72 6f 72 20 ases, the error
160e9 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 is returned to t
160ea 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e he b-tree layer.
160eb 20 54 68 65 20 62 2d 74 72 65 65 0d 0a 2a 2a 20 The b-tree..**
160ec 20 20 20 6c 61 79 65 72 20 74 68 65 6e 20 61 74 layer then at
160ed 74 65 6d 70 74 73 20 61 20 72 6f 6c 6c 62 61 63 tempts a rollbac
160ee 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 k operation. If
160ef 74 68 65 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 the error condit
160f0 69 6f 6e 20 0d 0a 2a 2a 20 20 20 20 70 65 72 73 ion ..** pers
160f1 69 73 74 73 2c 20 74 68 65 20 70 61 67 65 72 20 ists, the pager
160f2 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 enters the ERROR
160f3 20 73 74 61 74 65 20 76 69 61 20 63 6f 6e 64 69 state via condi
160f4 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65 2e 0d tion (1) above..
160f5 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 43 6f 6e 64 69 .**..** Condi
160f6 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65 63 65 tion (3) is nece
160f7 73 73 61 72 79 20 62 65 63 61 75 73 65 20 69 74 ssary because it
160f8 20 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 can be triggere
160f9 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79 d by a read-only
160fa 0d 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65 6e ..** statemen
160fb 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68 69 t executed withi
160fc 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e n a transaction.
160fd 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 In this case, i
160fe 66 20 74 68 65 20 65 72 72 6f 72 0d 0a 2a 2a 20 f the error..**
160ff 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d code were sim
16100 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20 ply returned to
16101 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d the user, the b-
16102 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64 tree layer would
16103 20 6e 6f 74 0d 0a 2a 2a 20 20 20 20 61 75 74 6f not..** auto
16104 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 matically attemp
16105 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 t a rollback, as
16106 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 it assumes that
16107 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0d 0a an error in a..
16108 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 ** read-only
16109 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 statement cannot
1610a 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72 leave the pager
1610b 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c in an internall
1610c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0d y inconsistent .
1610d 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0d 0a 2a .** state...*
1610e 2a 0d 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 *..** * The P
1610f 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 ager.errCode var
16110 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 iable is set to
16111 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 something other
16112 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d than SQLITE_OK..
16113 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61 .** * There a
16114 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f re one or more o
16115 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 utstanding refer
16116 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28 ences to pages (
16117 61 66 74 65 72 20 74 68 65 0d 0a 2a 2a 20 20 20 after the..**
16118 20 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 last referenc
16119 65 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 e is dropped the
1611a 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f pager should mo
1611b 76 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 ve back to OPEN
1611c 73 74 61 74 65 29 2e 0d 0a 2a 2a 20 20 20 20 2a state)...** *
1611d 20 54 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f The pager is no
1611e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 t an in-memory p
1611f 61 67 65 72 2e 0d 0a 2a 2a 20 20 20 20 0d 0a 2a ager...** ..*
16120 2a 0d 0a 2a 2a 20 4e 6f 74 65 73 3a 0d 0a 2a 2a *..** Notes:..**
16121 0d 0a 2a 2a 20 20 20 2a 20 41 20 70 61 67 65 72 ..** * A pager
16122 20 69 73 20 6e 65 76 65 72 20 69 6e 20 57 52 49 is never in WRI
16123 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20 57 52 49 TER_DBMOD or WRI
16124 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 TER_FINISHED sta
16125 74 65 20 69 66 20 74 68 65 0d 0a 2a 2a 20 20 20 te if the..**
16126 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 connection is
16127 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 open in WAL mode
16128 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 . A WAL connecti
16129 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 on is always in
1612a 6f 6e 65 0d 0a 2a 2a 20 20 20 20 20 6f 66 20 74 one..** of t
1612b 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73 74 he first four st
1612c 61 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 ates...**..**
1612d 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f * Normally, a co
1612e 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e nnection open in
1612f 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 exclusive mode
16130 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 is never in PAGE
16131 52 5f 4f 50 45 4e 0d 0a 2a 2a 20 20 20 20 20 73 R_OPEN..** s
16132 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 tate. There are
16133 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 two exceptions:
16134 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 immediately afte
16135 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 r exclusive-mode
16136 20 68 61 73 0d 0a 2a 2a 20 20 20 20 20 62 65 65 has..** bee
16137 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 n turned on (and
16138 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 before any read
16139 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 or write transa
1613a 63 74 69 6f 6e 73 20 61 72 65 20 0d 0a 2a 2a 20 ctions are ..**
1613b 20 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 executed), a
1613c 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 nd when the page
1613d 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 r is leaving the
1613e 20 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0d "error state"..
1613f 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 53 65 65 20 .**..** * See
16140 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 also: assert_pag
16141 65 72 5f 73 74 61 74 65 28 29 2e 0d 0a 2a 2f 0d er_state()...*/.
16142 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f .#define PAGER_O
16143 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 PEN
16144 20 20 20 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 0..#define
16145 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 PAGER_READER
16146 20 20 20 20 20 20 20 20 20 20 20 20 31 0d 0a 23 1..#
16147 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 define PAGER_WRI
16148 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 TER_LOCKED
16149 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 50 41 2..#define PA
1614a 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 GER_WRITER_CACHE
1614b 4d 4f 44 20 20 20 20 20 20 20 33 0d 0a 23 64 65 MOD 3..#de
1614c 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 fine PAGER_WRITE
1614d 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20 20 R_DBMOD
1614e 20 34 0d 0a 23 64 65 66 69 6e 65 20 50 41 47 45 4..#define PAGE
1614f 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 R_WRITER_FINISHE
16150 44 20 20 20 20 20 20 20 35 0d 0a 23 64 65 66 69 D 5..#defi
16151 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 20 ne PAGER_ERROR
16152 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 6
16153 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 50 ..../*..** The P
16154 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 ager.eLock varia
16155 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c ble is almost al
16156 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 ways set to one
16157 6f 66 20 74 68 65 20 0d 0a 2a 2a 20 66 6f 6c 6c of the ..** foll
16158 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 owing locking-st
16159 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 ates, according
1615a 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 to the lock curr
1615b 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0d 0a 2a ently held on..*
1615c 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 * the database f
1615d 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 ile: NO_LOCK, SH
1615e 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 ARED_LOCK, RESER
1615f 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c VED_LOCK or EXCL
16160 55 53 49 56 45 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 20 USIVE_LOCK...**
16161 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 This variable is
16162 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 kept up to date
16163 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 as locks are ta
16164 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 ken and released
16165 20 62 79 0d 0a 2a 2a 20 74 68 65 20 70 61 67 65 by..** the page
16166 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 rLockDb() and pa
16167 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 gerUnlockDb() wr
16168 61 70 70 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 appers...**..**
16169 49 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b If the VFS xLock
1616a 28 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 () or xUnlock()
1616b 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 returns an error
1616c 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 other than SQLI
1616d 54 45 5f 42 55 53 59 0d 0a 2a 2a 20 28 69 2e 65 TE_BUSY..** (i.e
1616e 2e 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c . one of the SQL
1616f 49 54 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 ITE_IOERR subtyp
16170 65 73 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 es), it is not c
16171 6c 65 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 lear whether or
16172 6e 6f 74 0d 0a 2a 2a 20 74 68 65 20 6f 70 65 72 not..** the oper
16173 61 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 ation was succes
16174 73 66 75 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 sful. In these c
16175 69 72 63 75 6d 73 74 61 6e 63 65 73 20 70 61 67 ircumstances pag
16176 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 0d 0a erLockDb() and..
16177 2a 2a 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 ** pagerUnlockDb
16178 28 29 20 74 61 6b 65 20 61 20 63 6f 6e 73 65 72 () take a conser
16179 76 61 74 69 76 65 20 61 70 70 72 6f 61 63 68 20 vative approach
1617a 2d 20 65 4c 6f 63 6b 20 69 73 20 61 6c 77 61 79 - eLock is alway
1617b 73 20 75 70 64 61 74 65 64 0d 0a 2a 2a 20 77 68 s updated..** wh
1617c 65 6e 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 en unlocking the
1617d 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 file, and only
1617e 75 70 64 61 74 65 64 20 77 68 65 6e 20 6c 6f 63 updated when loc
1617f 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 king the file if
16180 20 74 68 65 0d 0a 2a 2a 20 56 46 53 20 63 61 6c the..** VFS cal
16181 6c 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e l is successful.
16182 20 54 68 69 73 20 77 61 79 2c 20 74 68 65 20 50 This way, the P
16183 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 ager.eLock varia
16184 62 6c 65 20 6d 61 79 20 62 65 20 73 65 74 0d 0a ble may be set..
16185 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20 65 78 63 ** to a less exc
16186 6c 75 73 69 76 65 20 28 6c 6f 77 65 72 29 20 76 lusive (lower) v
16187 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 6c 6f alue than the lo
16188 63 6b 20 74 68 61 74 20 69 73 20 61 63 74 75 61 ck that is actua
16189 6c 6c 79 20 68 65 6c 64 0d 0a 2a 2a 20 61 74 20 lly held..** at
1618a 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c the system level
1618b 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65 76 65 , but it is neve
1618c 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72 65 20 r set to a more
1618d 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75 65 2e exclusive value.
1618e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 ..**..** This is
1618f 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49 usually safe. I
16190 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69 f an xUnlock fai
16191 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f ls or appears to
16192 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79 fail, there may
16193 20 0d 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 ..** be a few r
16194 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 edundant xLock()
16195 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b calls or a lock
16196 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 may be held for
16197 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0d 0a 2a 2a longer than..**
16198 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e required, but n
16199 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f othing really go
1619a 65 73 20 77 72 6f 6e 67 2e 0d 0a 2a 2a 0d 0a 2a es wrong...**..*
1619b 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 * The exception
1619c 69 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 is when the data
1619d 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c base file is unl
1619e 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 ocked as the pag
1619f 65 72 20 6d 6f 76 65 73 0d 0a 2a 2a 20 66 72 6f er moves..** fro
161a0 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 m ERROR to OPEN
161a1 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 state. At this p
161a2 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 oint there may b
161a3 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 e a hot-journal
161a4 66 69 6c 65 20 0d 0a 2a 2a 20 69 6e 20 74 68 65 file ..** in the
161a5 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 file-system tha
161a6 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f t needs to be ro
161a7 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61 lled back (as pa
161a8 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 rt of a OPEN->SH
161a9 41 52 45 44 0d 0a 2a 2a 20 74 72 61 6e 73 69 74 ARED..** transit
161aa 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 ion, by the same
161ab 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 pager or any ot
161ac 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c her). If the cal
161ad 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0d 0a l to xUnlock()..
161ae 2a 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 ** fails at this
161af 20 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 point and the p
161b0 61 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c ager is left hol
161b1 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 ding an EXCLUSIV
161b2 45 20 6c 6f 63 6b 2c 20 74 68 69 73 0d 0a 2a 2a E lock, this..**
161b3 20 63 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 can confuse the
161b4 20 63 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 call to xCheckR
161b5 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 eservedLock() ca
161b6 6c 6c 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 ll made later as
161b7 20 70 61 72 74 0d 0a 2a 2a 20 6f 66 20 68 6f 74 part..** of hot
161b8 2d 6a 6f 75 72 6e 61 6c 20 64 65 74 65 63 74 69 -journal detecti
161b9 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 43 68 65 on...**..** xChe
161ba 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 ckReservedLock()
161bb 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 72 is defined as r
161bc 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 22 69 eturning true "i
161bd 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 f there is a RES
161be 45 52 56 45 44 20 0d 0a 2a 2a 20 6c 6f 63 6b 20 ERVED ..** lock
161bf 68 65 6c 64 20 62 79 20 74 68 69 73 20 70 72 6f held by this pro
161c0 63 65 73 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 cess or any othe
161c1 72 73 22 2e 20 53 6f 20 78 43 68 65 63 6b 52 65 rs". So xCheckRe
161c2 73 65 72 76 65 64 4c 6f 63 6b 20 6d 61 79 20 0d servedLock may .
161c3 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20 .** return true
161c4 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c because the call
161c5 65 72 20 69 74 73 65 6c 66 20 69 73 20 68 6f 6c er itself is hol
161c6 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 ding an EXCLUSIV
161c7 45 20 6c 6f 63 6b 20 28 62 75 74 0d 0a 2a 2a 20 E lock (but..**
161c8 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69 74 20 doesn't know it
161c9 62 65 63 61 75 73 65 20 6f 66 20 61 20 70 72 65 because of a pre
161ca 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e 20 78 vious error in x
161cb 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68 69 73 Unlock). If this
161cc 20 68 61 70 70 65 6e 73 0d 0a 2a 2a 20 61 20 68 happens..** a h
161cd 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 ot-journal may b
161ce 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20 61 e mistaken for a
161cf 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20 63 journal being c
161d0 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63 74 reated by an act
161d1 69 76 65 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 ive..** transact
161d2 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70 ion in another p
161d3 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20 rocess, causing
161d4 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66 SQLite to read f
161d5 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 rom the database
161d6 0d 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c ..** without rol
161d7 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0d 0a 2a ling it back...*
161d8 2a 0d 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 *..** To work ar
161d9 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 ound this, if a
161da 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 call to xUnlock(
161db 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c ) fails when unl
161dc 6f 63 6b 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 64 ocking the..** d
161dd 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 atabase in the E
161de 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 RROR state, Page
161df 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 r.eLock is set t
161e0 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 o UNKNOWN_LOCK.
161e1 49 74 0d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 It..** is only c
161e2 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61 hanged back to a
161e3 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 real locking st
161e4 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63 ate after a succ
161e5 65 73 73 66 75 6c 20 63 61 6c 6c 0d 0a 2a 2a 20 essful call..**
161e6 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 to xLock(EXCLUSI
161e7 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 VE). Also, the c
161e8 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 ode to do the OP
161e9 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 EN->SHARED state
161ea 20 74 72 61 6e 73 69 74 69 6f 6e 0d 0a 2a 2a 20 transition..**
161eb 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 omits the check
161ec 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 for a hot-journa
161ed 6c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b l if Pager.eLock
161ee 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f is set to UNKNO
161ef 57 4e 5f 4c 4f 43 4b 20 0d 0a 2a 2a 20 6c 6f 63 WN_LOCK ..** loc
161f0 6b 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 k. Instead, it a
161f1 73 73 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 ssumes a hot-jou
161f2 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 rnal exists and
161f3 6f 62 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 obtains an EXCLU
161f4 53 49 56 45 0d 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e SIVE..** lock on
161f5 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
161f6 6c 65 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 le before attemp
161f7 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 ting to roll it
161f8 62 61 63 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 back. See functi
161f9 6f 6e 0d 0a 2a 2a 20 50 61 67 65 72 53 68 61 72 on..** PagerShar
161fa 65 64 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 edLock() for mor
161fb 65 20 64 65 74 61 69 6c 2e 0d 0a 2a 2a 0d 0a 2a e detail...**..*
161fc 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 61 * Pager.eLock ma
161fd 79 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 74 6f y only be set to
161fe 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 UNKNOWN_LOCK wh
161ff 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 en the pager is
16200 69 6e 20 0d 0a 2a 2a 20 50 41 47 45 52 5f 4f 50 in ..** PAGER_OP
16201 45 4e 20 73 74 61 74 65 2e 0d 0a 2a 2f 0d 0a 23 EN state...*/..#
16202 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f 4c define UNKNOWN_L
16203 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 OCK
16204 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c 4f (EXCLUSIVE_LO
16205 43 4b 2b 31 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 CK+1)..../*..**
16206 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 A macro used for
16207 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f invoking the co
16208 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 dec if there is
16209 6f 6e 65 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 one..*/..#ifdef
1620a 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 SQLITE_HAS_CODEC
1620b 0d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 ..# define CODEC
1620c 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0d 0a 1(P,D,N,X,E) \..
1620d 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 if( P->xCode
1620e 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 c && P->xCodec(P
1620f 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d ->pCodec,D,N,X)=
16210 3d 30 20 29 7b 20 45 3b 20 7d 0d 0a 23 20 64 65 =0 ){ E; }..# de
16211 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c fine CODEC2(P,D,
16212 4e 2c 58 2c 45 2c 4f 29 20 5c 0d 0a 20 20 20 20 N,X,E,O) \..
16213 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 if( P->xCodec==0
16214 20 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 ){ O=(char*)D;
16215 7d 65 6c 73 65 20 5c 0d 0a 20 20 20 20 69 66 28 }else \.. if(
16216 20 28 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 (O=(char*)(P->x
16217 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c Codec(P->pCodec,
16218 44 2c 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 D,N,X)))==0 ){ E
16219 3b 20 7d 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 ; }..#else..# de
1621a 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c fine CODEC1(P,D,
1621b 4e 2c 58 2c 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f N,X,E) /* NO-O
1621c 50 20 2a 2f 0d 0a 23 20 64 65 66 69 6e 65 20 43 P */..# define C
1621d 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c ODEC2(P,D,N,X,E,
1621e 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44 0d 0a 23 O) O=(char*)D..#
1621f 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 endif..../*..**
16220 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f The maximum allo
16221 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e wed sector size.
16222 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78 64KiB. If the x
16223 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 Sectorsize() met
16224 68 6f 64 20 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 hod ..** returns
16225 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 a value larger
16226 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 than this, then
16227 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 MAX_SECTOR_SIZE
16228 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e is used instead.
16229 0d 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 ..** This could
1622a 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 conceivably caus
1622b 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c e corruption fol
1622c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 lowing a power f
1622d 61 69 6c 75 72 65 20 6f 6e 0d 0a 2a 2a 20 73 75 ailure on..** su
1622e 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 ch a system. Thi
1622f 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 s is currently a
16230 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c n undocumented l
16231 69 6d 69 74 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 imit...*/..#defi
16232 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 ne MAX_SECTOR_SI
16233 5a 45 20 30 78 31 30 30 30 30 0d 0a 0d 0a 2f 2a ZE 0x10000..../*
16234 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 ..** An instance
16235 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
16236 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 g structure is a
16237 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 llocated for eac
16238 68 20 61 63 74 69 76 65 0d 0a 2a 2a 20 73 61 76 h active..** sav
16239 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 epoint and state
1623a 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
1623b 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 in the system.
1623c 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 All such structu
1623d 72 65 73 0d 0a 2a 2a 20 61 72 65 20 73 74 6f 72 res..** are stor
1623e 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e ed in the Pager.
1623f 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 aSavepoint[] arr
16240 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c ay, which is all
16241 6f 63 61 74 65 64 20 61 6e 64 0d 0a 2a 2a 20 72 ocated and..** r
16242 65 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c esized using sql
16243 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0d 0a ite3Realloc()...
16244 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 **..** When a sa
16245 76 65 70 6f 69 6e 74 20 69 73 20 63 72 65 61 74 vepoint is creat
16246 65 64 2c 20 74 68 65 20 50 61 67 65 72 53 61 76 ed, the PagerSav
16247 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 epoint.iHdrOffse
16248 74 20 66 69 65 6c 64 20 69 73 0d 0a 2a 2a 20 73 t field is..** s
16249 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20 6a 6f et to 0. If a jo
1624a 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 urnal-header is
1624b 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 written into the
1624c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 main journal wh
1624d 69 6c 65 0d 0a 2a 2a 20 74 68 65 20 73 61 76 65 ile..** the save
1624e 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2c point is active,
1624f 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65 74 then iHdrOffset
16250 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 62 is set to the b
16251 79 74 65 20 6f 66 66 73 65 74 20 0d 0a 2a 2a 20 yte offset ..**
16252 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c immediately foll
16253 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a owing the last j
16254 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72 ournal record wr
16255 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d itten into the m
16256 61 69 6e 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 ain..** journal
16257 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e before the journ
16258 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 al-header. This
16259 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 is required duri
1625a 6e 67 20 73 61 76 65 70 6f 69 6e 74 0d 0a 2a 2a ng savepoint..**
1625b 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 rollback (see p
1625c 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 agerPlaybackSave
1625d 70 6f 69 6e 74 28 29 29 2e 0d 0a 2a 2f 0d 0a 74 point())...*/..t
1625e 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61 ypedef struct Pa
1625f 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 gerSavepoint Pag
16260 65 72 53 61 76 65 70 6f 69 6e 74 3b 0d 0a 73 74 erSavepoint;..st
16261 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f ruct PagerSavepo
16262 69 6e 74 20 7b 0d 0a 20 20 69 36 34 20 69 4f 66 int {.. i64 iOf
16263 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 fset;
16264 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e /* Startin
16265 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e g offset in main
16266 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 20 69 journal */.. i
16267 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 64 iHdrOffset;
16268 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
16269 65 65 20 61 62 6f 76 65 20 2a 2f 0d 0a 20 20 42 ee above */.. B
1626a 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f itvec *pInSavepo
1626b 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 int; /* S
1626c 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 et of pages in t
1626d 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f his savepoint */
1626e 0d 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 .. Pgno nOrig;
1626f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16270 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d /* Original num
16271 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 ber of pages in
16272 66 69 6c 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 file */.. Pgno
16273 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 iSubRec;
16274 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 /* Index
16275 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 of first record
16276 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 in sub-journal
16277 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
16278 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 75 TE_OMIT_WAL.. u
16279 33 32 20 61 57 61 6c 44 61 74 61 5b 57 41 4c 5f 32 aWalData[WAL_
1627a 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41 54 41 5d SAVEPOINT_NDATA]
1627b 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 ; /* WAL
1627c 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e 74 65 78 savepoint contex
1627d 74 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b t */..#endif..};
1627e 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 6f 70 65 ..../*..** A ope
1627f 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 n page cache is
16280 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 an instance of s
16281 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 truct Pager. A d
16282 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0d 0a 2a escription of..*
16283 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f * some of the mo
16284 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d re important mem
16285 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f ber variables fo
16286 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 65 llows:..**..** e
16287 53 74 61 74 65 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 State..**..**
16288 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 The current 'sta
16289 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 te' of the pager
1628a 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 object. See the
1628b 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 comment and sta
1628c 74 65 0d 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d te..** diagram
1628d 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 above for a des
1628e 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
1628f 70 61 67 65 72 20 73 74 61 74 65 2e 0d 0a 2a 2a pager state...**
16290 0d 0a 2a 2a 20 65 4c 6f 63 6b 0d 0a 2a 2a 0d 0a ..** eLock..**..
16291 2a 2a 20 20 20 46 6f 72 20 61 20 72 65 61 6c 20 ** For a real
16292 6f 6e 2d 64 69 73 6b 20 64 61 74 61 62 61 73 65 on-disk database
16293 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f , the current lo
16294 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 ck held on the d
16295 61 74 61 62 61 73 65 20 66 69 6c 65 20 2d 0d 0a atabase file -..
16296 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 ** NO_LOCK, SH
16297 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 ARED_LOCK, RESER
16298 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c VED_LOCK or EXCL
16299 55 53 49 56 45 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d USIVE_LOCK...**.
1629a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d 70 .** For a temp
1629b 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f orary or in-memo
1629c 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65 69 ry database (nei
1629d 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72 65 ther of which re
1629e 71 75 69 72 65 20 61 6e 79 0d 0a 2a 2a 20 20 20 quire any..**
1629f 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72 locks), this var
162a0 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 iable is always
162a1 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45 set to EXCLUSIVE
162a2 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63 _LOCK. Since suc
162a3 68 0d 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 h..** database
162a4 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 s always have Pa
162a5 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 ger.exclusiveMod
162a6 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b e==1, this trick
162a7 73 20 74 68 65 20 70 61 67 65 72 0d 0a 2a 2a 20 s the pager..**
162a8 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 logic into thi
162a9 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c nking that it al
162aa 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 ready has all th
162ab 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 e locks it will
162ac 65 76 65 72 0d 0a 2a 2a 20 20 20 6e 65 65 64 20 ever..** need
162ad 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 (and no reason t
162ae 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e o release them).
162af 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 6e 20 73 6f ..**..** In so
162b0 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 me (obscure) cir
162b1 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 cumstances, this
162b2 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c variable may al
162b3 73 6f 20 62 65 20 73 65 74 20 74 6f 0d 0a 2a 2a so be set to..**
162b4 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e UNKNOWN_LOCK.
162b5 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 See the comment
162b6 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 above the #defi
162b7 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f ne of UNKNOWN_LO
162b8 43 4b 20 66 6f 72 0d 0a 2a 2a 20 20 20 64 65 74 CK for..** det
162b9 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 63 68 ails...**..** ch
162ba 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0d 0a 2a angeCountDone..*
162bb 2a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f *..** This boo
162bc 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 lean variable is
162bd 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 used to make su
162be 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
162bf 67 65 2d 63 6f 75 6e 74 65 72 20 0d 0a 2a 2a 20 ge-counter ..**
162c0 20 20 28 74 68 65 20 34 2d 62 79 74 65 20 68 65 (the 4-byte he
162c1 61 64 65 72 20 66 69 65 6c 64 20 61 74 20 62 79 ader field at by
162c2 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 te offset 24 of
162c3 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
162c4 65 29 20 69 73 20 0d 0a 2a 2a 20 20 20 6e 6f 74 e) is ..** not
162c5 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 updated more of
162c6 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73 73 61 ten than necessa
162c7 72 79 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 ry. ..**..** I
162c8 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 t is set to true
162c9 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 when the change
162ca 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69 -counter field i
162cb 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68 s updated, which
162cc 20 0d 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 ..** can only
162cd 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 happen if an ex
162ce 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 clusive lock is
162cf 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 held on the data
162d0 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 20 base file...**
162d1 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 It is cleared (
162d2 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 set to false) wh
162d3 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 enever an exclus
162d4 69 76 65 20 6c 6f 63 6b 20 69 73 20 0d 0a 2a 2a ive lock is ..**
162d5 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 relinquished
162d6 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 on the database
162d7 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 file. Each time
162d8 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 a transaction is
162d9 20 63 6f 6d 6d 69 74 74 65 64 2c 0d 0a 2a 2a 20 committed,..**
162da 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e The changeCoun
162db 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e tDone flag is in
162dc 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 spected. If it i
162dd 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b s true, the work
162de 20 6f 66 0d 0a 2a 2a 20 20 20 75 70 64 61 74 69 of..** updati
162df 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f ng the change-co
162e0 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 unter is omitted
162e1 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
162e2 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a transaction...*
162e3 2a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 *..** This mec
162e4 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 hanism means tha
162e5 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 t when running i
162e6 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 n exclusive mode
162e7 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0d , a connection .
162e8 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 .** need only
162e9 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 update the chang
162ea 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 e-counter once,
162eb 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 for the first tr
162ec 61 6e 73 61 63 74 69 6f 6e 0d 0a 2a 2a 20 20 20 ansaction..**
162ed 63 6f 6d 6d 69 74 74 65 64 2e 0d 0a 2a 2a 0d 0a committed...**..
162ee 2a 2a 20 73 65 74 4d 61 73 74 65 72 0d 0a 2a 2a ** setMaster..**
162ef 0d 0a 2a 2a 20 20 20 57 68 65 6e 20 50 61 67 65 ..** When Page
162f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 rCommitPhaseOne(
162f1 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 ) is called to c
162f2 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 ommit a transact
162f3 69 6f 6e 2c 20 69 74 20 6d 61 79 0d 0a 2a 2a 20 ion, it may..**
162f4 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 73 (or may not) s
162f5 70 65 63 69 66 79 20 61 20 6d 61 73 74 65 72 2d pecify a master-
162f6 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 journal name to
162f7 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 be written into
162f8 74 68 65 20 0d 0a 2a 2a 20 20 20 6a 6f 75 72 6e the ..** journ
162f9 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 al file before i
162fa 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 t is synced to d
162fb 69 73 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 57 isk...**..** W
162fc 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 hether or not a
162fd 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e journal file con
162fe 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a tains a master-j
162ff 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 ournal pointer a
16300 66 66 65 63 74 73 20 0d 0a 2a 2a 20 20 20 74 68 ffects ..** th
16301 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 e way in which t
16302 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 he journal file
16303 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 is finalized aft
16304 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 er the transacti
16305 6f 6e 20 69 73 20 0d 0a 2a 2a 20 20 20 63 6f 6d on is ..** com
16306 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 mitted or rolled
16307 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 back when runni
16308 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d ng in "journal_m
16309 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 ode=PERSIST" mod
1630a 65 2e 0d 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f e...** If a jo
1630b 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 urnal file does
1630c 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 not contain a ma
1630d 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 ster-journal poi
1630e 6e 74 65 72 2c 20 69 74 20 69 73 0d 0a 2a 2a 20 nter, it is..**
1630f 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f finalized by o
16310 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 verwriting the f
16311 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 irst journal hea
16312 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e der with zeroes.
16313 20 49 66 0d 0a 2a 2a 20 20 20 69 74 20 64 6f 65 If..** it doe
16314 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 s contain a mast
16315 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 er-journal point
16316 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 er the journal f
16317 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 ile is finalized
16318 20 0d 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 ..** by trunc
16319 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f ating it to zero
1631a 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 bytes, just as
1631b 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f if the connectio
1631c 6e 20 77 65 72 65 20 0d 0a 2a 2a 20 20 20 72 75 n were ..** ru
1631d 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 nning in "journa
1631e 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 l_mode=truncate"
1631f 20 6d 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 mode...**..**
16320 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 Journal files t
16321 68 61 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 hat contain mast
16322 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 er journal point
16323 65 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 ers cannot be fi
16324 6e 61 6c 69 7a 65 64 0d 0a 2a 2a 20 20 20 73 69 nalized..** si
16325 6d 70 6c 79 20 62 79 20 6f 76 65 72 77 72 69 74 mply by overwrit
16326 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f ing the first jo
16327 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 77 69 74 urnal-header wit
16328 68 20 7a 65 72 6f 65 73 2c 20 61 73 20 74 68 65 h zeroes, as the
16329 0d 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f ..** master jo
1632a 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 63 6f urnal pointer co
1632b 75 6c 64 20 69 6e 74 65 72 66 65 72 65 20 77 69 uld interfere wi
1632c 74 68 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 th hot-journal r
1632d 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 6e 79 0d 0a ollback of any..
1632e 2a 2a 20 20 20 73 75 62 73 65 71 75 65 6e 74 6c ** subsequentl
1632f 79 20 69 6e 74 65 72 72 75 70 74 65 64 20 74 72 y interrupted tr
16330 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 ansaction that r
16331 65 75 73 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 euses the journa
16332 6c 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 l file...**..**
16333 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 63 6c The flag is cl
16334 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 eared as soon as
16335 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
16336 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 28 e is finalized (
16337 65 69 74 68 65 72 0d 0a 2a 2a 20 20 20 62 79 20 either..** by
16338 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 PagerCommitPhase
16339 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c 6c Two or PagerRoll
1633a 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f 20 back). If an IO
1633b 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20 74 error prevents t
1633c 68 65 0d 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c he..** journal
1633d 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 file from being
1633e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69 successfully fi
1633f 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74 nalized, the set
16340 4d 61 73 74 65 72 20 66 6c 61 67 0d 0a 2a 2a 20 Master flag..**
16341 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 is cleared any
16342 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 way (and the pag
16343 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 er will move to
16344 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0d 0a 2a ERROR state)...*
16345 2a 0d 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c *..** doNotSpill
16346 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c , doNotSyncSpill
16347 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 73 65 ..**..** These
16348 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 two boolean var
16349 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 iables control t
1634a 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66 20 he behaviour of
1634b 63 61 63 68 65 2d 73 70 69 6c 6c 73 0d 0a 2a 2a cache-spills..**
1634c 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 (calls made b
1634d 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 y the pcache mod
1634e 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 ule to the pager
1634f 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 Stress() routine
16350 20 74 6f 0d 0a 2a 2a 20 20 20 77 72 69 74 65 20 to..** write
16351 63 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 cached data to t
16352 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 he file-system i
16353 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 n order to free
16354 75 70 20 6d 65 6d 6f 72 79 29 2e 0d 0a 2a 2a 0d up memory)...**.
16355 0a 2a 2a 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 .** When doNot
16356 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 Spill is non-zer
16357 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 o, writing to th
16358 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 e database from
16359 70 61 67 65 72 53 74 72 65 73 73 28 29 0d 0a 2a pagerStress()..*
1635a 2a 20 20 20 69 73 20 64 69 73 61 62 6c 65 64 20 * is disabled
1635b 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 altogether. This
1635c 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 is done in a ve
1635d 72 79 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 ry obscure case
1635e 74 68 61 74 0d 0a 2a 2a 20 20 20 63 6f 6d 65 73 that..** comes
1635f 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65 70 up during savep
16360 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 oint rollback th
16361 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 at requires the
16362 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0d 0a 2a pcache module..*
16363 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 * to allocate
16364 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72 a new page to pr
16365 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 event the journa
16366 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e l file from bein
16367 67 20 77 72 69 74 74 65 6e 0d 0a 2a 2a 20 20 20 g written..**
16368 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e while it is bein
16369 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 g traversed by c
1636a 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 ode in pager_pla
1636b 79 62 61 63 6b 28 29 2e 0d 0a 2a 2a 20 0d 0a 2a yback()...** ..*
1636c 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53 79 6e 63 * If doNotSync
1636d 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 Spill is non-zer
1636e 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 o, writing to th
1636f 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 e database from
16370 70 61 67 65 72 53 74 72 65 73 73 28 29 0d 0a 2a pagerStress()..*
16371 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 * is permitted
16372 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 , but syncing th
16373 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 e journal file i
16374 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 s not. This flag
16375 20 69 73 20 73 65 74 0d 0a 2a 2a 20 20 20 62 79 is set..** by
16376 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 sqlite3PagerWri
16377 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 te() when the fi
16378 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 le-system sector
16379 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 -size is larger
1637a 74 68 61 6e 0d 0a 2a 2a 20 20 20 74 68 65 20 64 than..** the d
1637b 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a atabase page-siz
1637c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 e in order to pr
1637d 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 event a journal
1637e 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e sync from happen
1637f 69 6e 67 20 0d 0a 2a 2a 20 20 20 69 6e 20 62 65 ing ..** in be
16380 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 tween the journa
16381 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 lling of two pag
16382 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 es on the same s
16383 65 63 74 6f 72 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 ector. ..**..**
16384 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0d 0a 2a 2a subjInMemory..**
16385 0d 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 ..** This is a
16386 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c boolean variabl
16387 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e e. If true, then
16388 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 any required su
16389 62 2d 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 20 20 b-journal..**
1638a 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 is opened as an
1638b 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 in-memory journa
1638c 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 l file. If false
1638d 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 , then in-memory
1638e 0d 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e ..** sub-journ
1638f 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 als are only use
16390 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 d for in-memory
16391 70 61 67 65 72 20 66 69 6c 65 73 2e 0d 0a 2a 2a pager files...**
16392 0d 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 ..** This vari
16393 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 able is updated
16394 62 79 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 by the upper lay
16395 65 72 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e er each time a n
16396 65 77 20 0d 0a 2a 2a 20 20 20 77 72 69 74 65 2d ew ..** write-
16397 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f transaction is o
16398 70 65 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 64 pened...**..** d
16399 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a bSize, dbOrigSiz
1639a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0d 0a 2a e, dbFileSize..*
1639b 2a 0d 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 *..** Variable
1639c 20 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 dbSize is set t
1639d 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 o the number of
1639e 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 pages in the dat
1639f 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 abase file...**
163a0 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e It is valid in
163a1 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e PAGER_READER an
163a2 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73 20 d higher states
163a3 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 (all states exce
163a4 70 74 20 66 6f 72 0d 0a 2a 2a 20 20 20 4f 50 45 pt for..** OPE
163a5 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0d 0a N and ERROR). ..
163a6 2a 2a 0d 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 **..** dbSize
163a7 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 is set based on
163a8 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 the size of the
163a9 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 database file, w
163aa 68 69 63 68 20 6d 61 79 20 62 65 20 0d 0a 2a 2a hich may be ..**
163ab 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 larger than t
163ac 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 he size of the d
163ad 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c atabase (the val
163ae 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 ue stored at off
163af 73 65 74 0d 0a 2a 2a 20 20 20 32 38 20 6f 66 20 set..** 28 of
163b0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 the database hea
163b1 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 der by the btree
163b2 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f ). If the size o
163b3 66 20 74 68 65 20 66 69 6c 65 0d 0a 2a 2a 20 20 f the file..**
163b4 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 is not an integ
163b5 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 er multiple of t
163b6 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 he page-size, th
163b7 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 e value stored i
163b8 6e 0d 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 n..** dbSize i
163b9 73 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 s rounded down (
163ba 69 2e 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 i.e. a 5KB file
163bb 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a with 2K page-siz
163bc 65 20 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 e has dbSize==2)
163bd 2e 0d 0a 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 ...** Except,
163be 61 6e 79 20 66 69 6c 65 20 74 68 61 74 20 69 73 any file that is
163bf 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 greater than 0
163c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 bytes in size is
163c1 20 63 6f 6e 73 69 64 65 72 65 64 0d 0a 2a 2a 20 considered..**
163c2 20 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 to have at lea
163c3 73 74 20 6f 6e 65 20 70 61 67 65 2e 20 28 69 2e st one page. (i.
163c4 65 2e 20 61 20 31 4b 42 20 66 69 6c 65 20 77 69 e. a 1KB file wi
163c5 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 th 2K page-size
163c6 6c 65 61 64 73 0d 0a 2a 2a 20 20 20 74 6f 20 64 leads..** to d
163c7 62 53 69 7a 65 3d 3d 31 29 2e 0d 0a 2a 2a 0d 0a bSize==1)...**..
163c8 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77 72 ** During a wr
163c9 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c ite-transaction,
163ca 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20 70 if pages with p
163cb 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65 61 age-numbers grea
163cc 74 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 20 20 64 ter than..** d
163cd 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69 bSize are modifi
163ce 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c ed in the cache,
163cf 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 dbSize is updat
163d0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0d ed accordingly..
163d1 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c .** Similarly,
163d2 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 if the database
163d3 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 is truncated us
163d4 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 ing PagerTruncat
163d5 65 49 6d 61 67 65 28 29 2c 20 0d 0a 2a 2a 20 20 eImage(), ..**
163d6 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 dbSize is updat
163d7 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 56 61 ed...**..** Va
163d8 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69 riables dbOrigSi
163d9 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a ze and dbFileSiz
163da 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73 e are valid in s
163db 74 61 74 65 73 20 0d 0a 2a 2a 20 20 20 50 41 47 tates ..** PAG
163dc 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 ER_WRITER_LOCKED
163dd 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f and higher. dbO
163de 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 rigSize is a cop
163df 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0d y of the dbSize.
163e0 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 .** variable a
163e1 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 t the start of t
163e2 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 he transaction.
163e3 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e It is used durin
163e4 67 20 72 6f 6c 6c 62 61 63 6b 2c 0d 0a 2a 2a 20 g rollback,..**
163e5 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 and to determi
163e6 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f ne whether or no
163e7 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 t pages need to
163e8 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 be journalled be
163e9 66 6f 72 65 0d 0a 2a 2a 20 20 20 62 65 69 6e 67 fore..** being
163ea 20 6d 6f 64 69 66 69 65 64 2e 0d 0a 2a 2a 0d 0a modified...**..
163eb 2a 2a 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 ** Throughout
163ec 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 a write-transact
163ed 69 6f 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 ion, dbFileSize
163ee 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a contains the siz
163ef 65 20 6f 66 0d 0a 2a 2a 20 20 20 74 68 65 20 66 e of..** the f
163f0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 ile on disk in p
163f1 61 67 65 73 2e 20 49 74 20 69 73 20 73 65 74 20 ages. It is set
163f2 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 64 62 53 to a copy of dbS
163f3 69 7a 65 20 77 68 65 6e 20 74 68 65 0d 0a 2a 2a ize when the..**
163f4 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 write-transac
163f5 74 69 6f 6e 20 69 73 20 66 69 72 73 74 20 6f 70 tion is first op
163f6 65 6e 65 64 2c 20 61 6e 64 20 75 70 64 61 74 65 ened, and update
163f7 64 20 77 68 65 6e 20 56 46 53 20 63 61 6c 6c 73 d when VFS calls
163f8 20 61 72 65 20 6d 61 64 65 0d 0a 2a 2a 20 20 20 are made..**
163f9 74 6f 20 77 72 69 74 65 20 6f 72 20 74 72 75 6e to write or trun
163fa 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 cate the databas
163fb 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 e file on disk.
163fc 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 20 6f ..**..** The o
163fd 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20 64 nly reason the d
163fe 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 bFileSize variab
163ff 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 69 le is required i
16400 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0d 0a s to suppress ..
16401 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79 ** unnecessary
16402 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63 calls to xTrunc
16403 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d ate() after comm
16404 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 itting a transac
16405 74 69 6f 6e 2e 20 49 66 2c 20 0d 0a 2a 2a 20 20 tion. If, ..**
16406 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 when a transact
16407 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 ion is committed
16408 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 , the dbFileSize
16409 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 variable indica
1640a 74 65 73 20 0d 0a 2a 2a 20 20 20 74 68 61 74 20 tes ..** that
1640b 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
1640c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e e is larger than
1640d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d the database im
1640e 61 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a age (Pager.dbSiz
1640f 65 29 2c 20 0d 0a 2a 2a 20 20 20 70 61 67 65 72 e), ..** pager
16410 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 _truncate() is c
16411 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 alled. The pager
16412 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c _truncate() call
16413 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 uses xFilesize(
16414 29 0d 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 )..** to measu
16415 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 re the database
16416 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e file on disk, an
16417 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73 d then truncates
16418 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e it if required.
16419 0d 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a ..** dbFileSiz
1641a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 e is not used wh
1641b 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 en rolling back
1641c 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 a transaction. I
1641d 6e 20 74 68 69 73 20 63 61 73 65 0d 0a 2a 2a 20 n this case..**
1641e 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 pager_truncate
1641f 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 () is called unc
16420 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 onditionally (wh
16421 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 ich means there
16422 6d 61 79 20 62 65 0d 0a 2a 2a 20 20 20 61 20 63 may be..** a c
16423 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 all to xFilesize
16424 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 () that is not s
16425 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 trictly required
16426 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 ). In either cas
16427 65 2c 0d 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 e,..** pager_t
16428 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 runcate() may ca
16429 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 use the file to
1642a 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f become smaller o
1642b 72 20 6c 61 72 67 65 72 2e 0d 0a 2a 2a 0d 0a 2a r larger...**..*
1642c 2a 20 64 62 48 69 6e 74 53 69 7a 65 0d 0a 2a 2a * dbHintSize..**
1642d 0d 0a 2a 2a 20 20 20 54 68 65 20 64 62 48 69 6e ..** The dbHin
1642e 74 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 tSize variable i
1642f 73 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 s used to limit
16430 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 the number of ca
16431 6c 6c 73 20 6d 61 64 65 20 74 6f 0d 0a 2a 2a 20 lls made to..**
16432 20 20 74 68 65 20 56 46 53 20 78 46 69 6c 65 43 the VFS xFileC
16433 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a ontrol(FCNTL_SIZ
16434 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 2e 20 E_HINT) method.
16435 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 64 62 48 69 6e ..**..** dbHin
16436 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 tSize is set to
16437 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 a copy of the db
16438 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77 68 Size variable wh
16439 65 6e 20 61 0d 0a 2a 2a 20 20 20 77 72 69 74 65 en a..** write
1643a 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 -transaction is
1643b 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73 opened (at the s
1643c 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69 ame time as dbFi
1643d 6c 65 53 69 7a 65 20 61 6e 64 0d 0a 2a 2a 20 20 leSize and..**
1643e 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 dbOrigSize). If
1643f 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f the xFileContro
16440 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e l(FCNTL_SIZE_HIN
16441 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c T) method is cal
16442 6c 65 64 2c 0d 0a 2a 2a 20 20 20 64 62 48 69 6e led,..** dbHin
16443 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 tSize is increas
16444 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 ed to the number
16445 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 of pages that c
16446 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 orrespond to the
16447 0d 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 ..** size-hint
16448 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d passed to the m
16449 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 ethod call. See
1644a 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 pager_write_page
1644b 6c 69 73 74 28 29 20 66 6f 72 20 0d 0a 2a 2a 20 list() for ..**
1644c 20 20 64 65 74 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a details...**..
1644d 2a 2a 20 65 72 72 43 6f 64 65 0d 0a 2a 2a 0d 0a ** errCode..**..
1644e 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 ** The Pager.e
1644f 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 rrCode variable
16450 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 is only ever use
16451 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 d in PAGER_ERROR
16452 20 73 74 61 74 65 2e 20 49 74 0d 0a 2a 2a 20 20 state. It..**
16453 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 is set to zero
16454 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 in all other sta
16455 74 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 tes. In PAGER_ER
16456 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 ROR state, Pager
16457 2e 65 72 72 43 6f 64 65 20 0d 0a 2a 2a 20 20 20 .errCode ..**
16458 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f is always set to
16459 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 SQLITE_FULL, SQ
1645a 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e LITE_IOERR or on
1645b 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f e of the SQLITE_
1645c 49 4f 45 52 52 5f 58 58 58 20 0d 0a 2a 2a 20 20 IOERR_XXX ..**
1645d 20 73 75 62 2d 63 6f 64 65 73 2e 0d 0a 2a 2f 0d sub-codes...*/.
1645e 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0d .struct Pager {.
1645f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
16460 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f pVfs; /
16461 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 * OS functions t
16462 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0d o use for IO */.
16463 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d . u8 exclusiveM
16464 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f ode; /
16465 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 * Boolean. True
16466 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d if locking_mode=
16467 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0d 0a 20 =EXCLUSIVE */..
16468 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b u8 journalMode;
16469 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1646a 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 One of the PAGER
1646b 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 _JOURNALMODE_* v
1646c 61 6c 75 65 73 20 2a 2f 0d 0a 20 20 75 38 20 75 alues */.. u8 u
1646d 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 seJournal;
1646e 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 /* Use a
1646f 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 rollback journa
16470 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a l on this file *
16471 2f 0d 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f /.. u8 noReadlo
16472 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ck;
16473 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 /* Do not bothe
16474 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 r to obtain read
16475 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 75 38 20 6e locks */.. u8 n
16476 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 oSync;
16477 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f /* Do no
16478 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e t sync the journ
16479 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0d 0a 20 al if true */..
1647a 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 u8 fullSync;
1647b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1647c 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f Do extra syncs o
1647d 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f f the journal fo
1647e 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0d r robustness */.
1647f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e 63 46 6c . u8 ckptSyncFl
16480 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f ags; /
16481 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 * SYNC_NORMAL or
16482 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 SYNC_FULL for c
16483 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0d 0a 20 20 heckpoint */..
16484 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b u8 walSyncFlags;
16485 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
16486 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 YNC_NORMAL or SY
16487 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61 6c 20 NC_FULL for wal
16488 77 72 69 74 65 73 20 2a 2f 0d 0a 20 20 75 38 20 writes */.. u8
16489 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 syncFlags;
1648a 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 /* SYNC
1648b 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f _NORMAL or SYNC_
1648c 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20 2a FULL otherwise *
1648d 2f 0d 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 /.. u8 tempFile
1648e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1648f 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 /* zFilename is
16490 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c a temporary fil
16491 65 20 2a 2f 0d 0a 20 20 75 38 20 72 65 61 64 4f e */.. u8 readO
16492 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 nly;
16493 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 /* True for
16494 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 a read-only data
16495 62 61 73 65 20 2a 2f 0d 0a 20 20 75 38 20 6d 65 base */.. u8 me
16496 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 mDb;
16497 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 /* True t
16498 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 o inhibit all fi
16499 6c 65 20 49 2f 4f 20 2a 2f 0d 0a 0d 0a 20 20 2f le I/O */.... /
1649a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1649b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1649c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1649d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1649e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 20 2a 2a **********.. **
1649f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 The following b
164a0 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 lock contains th
164a1 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 ose class member
164a2 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 s that change du
164a3 72 69 6e 67 0d 0a 20 20 2a 2a 20 72 6f 75 74 69 ring.. ** routi
164a4 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c ne opertion. Cl
164a5 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 ass members not
164a6 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 in this block ar
164a7 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0d 0a e either fixed..
164a8 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 ** when the pa
164a9 67 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 ger is first cre
164aa 61 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c ated or else onl
164ab 79 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 y change when th
164ac 65 72 65 20 69 73 20 61 0d 0a 20 20 2a 2a 20 73 ere is a.. ** s
164ad 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 ignificant mode
164ae 63 68 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 change (such as
164af 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 changing the pag
164b0 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f e_size, locking_
164b1 6d 6f 64 65 2c 0d 0a 20 20 2a 2a 20 6f 72 20 74 mode,.. ** or t
164b2 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 he journal_mode)
164b3 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 . From another
164b4 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61 73 view, these clas
164b5 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 s members descri
164b6 62 65 0d 0a 20 20 2a 2a 20 74 68 65 20 22 73 74 be.. ** the "st
164b7 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65 ate" of the page
164b8 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63 r, while other c
164b9 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 lass members des
164ba 63 72 69 62 65 20 74 68 65 0d 0a 20 20 2a 2a 20 cribe the.. **
164bb 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 "configuration"
164bc 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0d 0a 20 of the pager...
164bd 20 2a 2f 0d 0a 20 20 75 38 20 65 53 74 61 74 65 */.. u8 eState
164be 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
164bf 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 /* Pager stat
164c0 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c e (OPEN, READER,
164c1 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e WRITER_LOCKED..
164c2 29 20 2a 2f 0d 0a 20 20 75 38 20 65 4c 6f 63 6b ) */.. u8 eLock
164c3 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
164c4 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c /* Current l
164c5 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 ock held on data
164c6 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 base file */..
164c7 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f u8 changeCountDo
164c8 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 ne; /* S
164c9 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 et after increme
164ca 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 nting the change
164cb 2d 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 75 -counter */.. u
164cc 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 8 setMaster;
164cd 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
164ce 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 ue if a m-j name
164cf 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 has been writte
164d0 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0d 0a 20 20 n to jrnl */..
164d1 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 u8 doNotSpill;
164d2 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
164d3 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 o not spill the
164d4 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a cache when non-z
164d5 65 72 6f 20 2a 2f 0d 0a 20 20 75 38 20 64 6f 4e ero */.. u8 doN
164d6 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 otSyncSpill;
164d7 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 /* Do not
164d8 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 do a spill that
164d9 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 requires jrnl sy
164da 6e 63 20 2a 2f 0d 0a 20 20 75 38 20 73 75 62 6a nc */.. u8 subj
164db 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 InMemory;
164dc 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 /* True to
164dd 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 use in-memory su
164de 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0d 0a 20 b-journals */..
164df 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 Pgno dbSize;
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
164e1 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 Number of pages
164e2 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 in the database
164e3 2a 2f 0d 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 */.. Pgno dbOri
164e4 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 gSize;
164e5 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f /* dbSize befo
164e6 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 re the current t
164e7 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0d 0a 20 ransaction */..
164e8 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 Pgno dbFileSize
164e9 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
164ea 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 Number of pages
164eb 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 in the database
164ec 66 69 6c 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 file */.. Pgno
164ed 64 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 dbHintSize;
164ee 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 /* Value
164ef 70 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f passed to FCNTL_
164f0 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a SIZE_HINT call *
164f1 2f 0d 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 /.. int errCode
164f2 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
164f3 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 /* One of sever
164f4 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f al kinds of erro
164f5 72 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 52 65 rs */.. int nRe
164f6 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c;
164f7 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f /* Pages jo
164f8 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c urnalled since l
164f9 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72 69 ast j-header wri
164fa 74 74 65 6e 20 2a 2f 0d 0a 20 20 75 33 32 20 63 tten */.. u32 c
164fb 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 ksumInit;
164fc 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d /* Quasi-
164fd 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 random value add
164fe 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 ed to every chec
164ff 6b 73 75 6d 20 2a 2f 0d 0a 20 20 75 33 32 20 6e ksum */.. u32 n
16500 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 SubRec;
16501 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
16502 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 of records writ
16503 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e ten to sub-journ
16504 61 6c 20 2a 2f 0d 0a 20 20 42 69 74 76 65 63 20 al */.. Bitvec
16505 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 *pInJournal;
16506 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 /* One bit
16507 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e for each page in
16508 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
16509 6c 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 le */.. sqlite3
1650a 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 _file *fd;
1650b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 /* File des
1650c 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 criptor for data
1650d 62 61 73 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 base */.. sqlit
1650e 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 e3_file *jfd;
1650f 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 /* File d
16510 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 escriptor for ma
16511 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 in journal */..
16512 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 sqlite3_file *s
16513 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 jfd; /*
16514 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 File descriptor
16515 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 for sub-journal
16516 2a 2f 0d 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 */.. i64 journa
16517 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 lOff;
16518 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 /* Current wri
16519 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 te offset in the
1651a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f journal file */
1651b 0d 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 .. i64 journalH
1651c 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dr;
1651d 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 /* Byte offset t
1651e 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e o previous journ
1651f 61 6c 20 68 65 61 64 65 72 20 2a 2f 0d 0a 20 20 al header */..
16520 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a sqlite3_backup *
16521 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 pBackup; /* P
16522 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f ointer to list o
16523 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 f ongoing backup
16524 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0d 0a 20 processes */..
16525 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 PagerSavepoint
16526 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 *aSavepoint; /*
16527 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 Array of active
16528 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0d 0a 20 savepoints */..
16529 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b int nSavepoint;
1652a 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1652b 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e Number of elemen
1652c 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 ts in aSavepoint
1652d 5b 5d 20 2a 2f 0d 0a 20 20 63 68 61 72 20 64 62 [] */.. char db
1652e 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 FileVers[16];
1652f 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 /* Changes
16530 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 whenever databas
16531 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a e file changes *
16532 2f 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 45 6e /.. /*.. ** En
16533 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 d of the routine
16534 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 ly-changing clas
16535 73 20 6d 65 6d 62 65 72 73 0d 0a 20 20 2a 2a 2a s members.. ***
16536 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
16537 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
16538 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
16539 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1653a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 20 20 75 ********/.... u
1653b 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 16 nExtra;
1653c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 /* Ad
1653d 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 d this many byte
1653e 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d s to each in-mem
1653f 6f 72 79 20 70 61 67 65 20 2a 2f 0d 0a 20 20 69 ory page */.. i
16540 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 16 nReserve;
16541 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
16542 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 mber of unused b
16543 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 ytes at end of e
16544 61 63 68 20 70 61 67 65 20 2a 2f 0d 0a 20 20 75 ach page */.. u
16545 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 32 vfsFlags;
16546 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c /* Fl
16547 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f ags for sqlite3_
16548 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0d 0a vfs.xOpen() */..
16549 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 u32 sectorSize
1654a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
1654b 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 Assumed sector
1654c 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c size during roll
1654d 62 61 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 back */.. int p
1654e 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 ageSize;
1654f 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
16550 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 of bytes in a p
16551 61 67 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 6d age */.. Pgno m
16552 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 xPgno;
16553 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d /* Maximum
16554 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 allowed size of
16555 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f the database */
16556 0d 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 .. i64 journalS
16557 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 izeLimit;
16558 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f /* Size limit fo
16559 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 r persistent jou
1655a 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0d 0a 20 rnal files */..
1655b 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
1655c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
1655d 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 Name of the data
1655e 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 base file */..
1655f 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 char *zJournal;
16560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
16561 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e ame of the journ
16562 61 6c 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e al file */.. in
16563 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 t (*xBusyHandler
16564 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e )(void*); /* Fun
16565 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 ction to call wh
16566 65 6e 20 62 75 73 79 20 2a 2f 0d 0a 20 20 76 6f en busy */.. vo
16567 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 id *pBusyHandler
16568 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e Arg; /* Con
16569 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f text argument fo
1656a 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a r xBusyHandler *
1656b 2f 0d 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e /.. int nHit, n
1656c 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 Miss;
1656d 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 /* Total cache
1656e 68 69 74 73 20 61 6e 64 20 6d 69 73 73 65 73 20 hits and misses
1656f 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */..#ifdef SQLIT
16570 45 5f 54 45 53 54 0d 0a 20 20 69 6e 74 20 6e 52 E_TEST.. int nR
16571 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 ead, nWrite;
16572 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 /* Databas
16573 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 e pages read/wri
16574 74 74 65 6e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d tten */..#endif.
16575 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 . void (*xReini
16576 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f ter)(DbPage*); /
16577 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 * Call this rout
16578 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 ine when reloadi
16579 6e 67 20 70 61 67 65 73 20 2a 2f 0d 0a 23 69 66 ng pages */..#if
1657a 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 def SQLITE_HAS_C
1657b 4f 44 45 43 0d 0a 20 20 76 6f 69 64 20 2a 28 2a ODEC.. void *(*
1657c 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f xCodec)(void*,vo
1657d 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f id*,Pgno,int); /
1657e 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e * Routine for en
1657f 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a /decoding data *
16580 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 /.. void (*xCod
16581 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 ecSizeChng)(void
16582 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e *,int,int); /* N
16583 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 otify of page si
16584 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0d 0a 20 ze changes */..
16585 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 void (*xCodecFr
16586 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 ee)(void*);
16587 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 /* Destr
16588 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f uctor for the co
16589 64 65 63 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a dec */.. void *
1658a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 pCodec;
1658b 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 /* First a
1658c 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 rgument to xCode
1658d 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0d c... methods */.
1658e 0a 23 65 6e 64 69 66 0d 0a 20 20 63 68 61 72 20 .#endif.. char
1658f 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 *pTmpSpace;
16590 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e /* Pager.
16591 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f pageSize bytes o
16592 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 f space for tmp
16593 75 73 65 20 2a 2f 0d 0a 20 20 50 43 61 63 68 65 use */.. PCache
16594 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 *pPCache;
16595 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
16596 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f to page cache o
16597 62 6a 65 63 74 20 2a 2f 0d 0a 23 69 66 6e 64 65 bject */..#ifnde
16598 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 f SQLITE_OMIT_WA
16599 4c 0d 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 L.. Wal *pWal;
1659a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1659b 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 /* Write-ahead
1659c 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 log used by "jou
1659d 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a rnal_mode=wal" *
1659e 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b /.. char *zWal;
1659f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
165a0 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f /* File name fo
165a1 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f r write-ahead lo
165a2 67 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b g */..#endif..};
165a3 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 ..../*..** The f
165a4 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 ollowing global
165a5 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 variables hold c
165a6 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 ounters used for
165a7 0d 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 ..** testing pur
165a8 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 poses only. The
165a9 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 se variables do
165aa 6e 6f 74 20 65 78 69 73 74 20 69 6e 0d 0a 2a 2a not exist in..**
165ab 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 a non-testing b
165ac 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 uild. These var
165ad 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 iables are not t
165ae 68 72 65 61 64 2d 73 61 66 65 2e 0d 0a 2a 2f 0d hread-safe...*/.
165af 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
165b0 45 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 EST..SQLITE_API
165b1 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 int sqlite3_page
165b2 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d r_readdb_count =
165b3 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 0; /* Number
165b4 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 of full pages r
165b5 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0d 0a ead from DB */..
165b6 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 SQLITE_API int s
165b7 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 qlite3_pager_wri
165b8 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 tedb_count = 0;
165b9 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 /* Number of f
165ba 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 ull pages writte
165bb 6e 20 74 6f 20 44 42 20 2a 2f 0d 0a 53 51 4c 49 n to DB */..SQLI
165bc 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 TE_API int sqlit
165bd 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f e3_pager_writej_
165be 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a count = 0; /*
165bf 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 Number of pages
165c0 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 written to jour
165c1 6e 61 6c 20 2a 2f 0d 0a 23 20 64 65 66 69 6e 65 nal */..# define
165c2 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 PAGER_INCR(v)
165c3 76 2b 2b 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 v++..#else..# de
165c4 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 fine PAGER_INCR(
165c5 76 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a v)..#endif......
165c6 0d 0a 2f 2a 0d 0a 2a 2a 20 4a 6f 75 72 6e 61 6c ../*..** Journal
165c7 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 files begin wit
165c8 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 h the following
165c9 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 magic string. T
165ca 68 65 20 64 61 74 61 0d 0a 2a 2a 20 77 61 73 20 he data..** was
165cb 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 obtained from /d
165cc 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 ev/random. It i
165cd 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 s used only as a
165ce 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0d 0a sanity check...
165cf 2a 2a 0d 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 **..** Since ver
165d0 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 sion 2.8.0, the
165d1 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 journal format c
165d2 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e ontains addition
165d3 61 6c 20 73 61 6e 69 74 79 0d 0a 2a 2a 20 63 68 al sanity..** ch
165d4 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 ecking informati
165d5 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 on. If the powe
165d6 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 r fails while th
165d7 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 e journal is bei
165d8 6e 67 0d 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 ng..** written,
165d9 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 semi-random garb
165da 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 age data might a
165db 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 ppear in the jou
165dc 72 6e 61 6c 0d 0a 2a 2a 20 66 69 6c 65 20 61 66 rnal..** file af
165dd 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 ter power is res
165de 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 tored. If an at
165df 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 tempt is then ma
165e0 64 65 0d 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 de..** to roll t
165e1 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c he journal back,
165e2 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f the database co
165e3 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 uld be corrupted
165e4 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 . The additiona
165e5 6c 0d 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 l..** sanity che
165e6 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e cking data is an
165e7 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 attempt to disc
165e8 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 over the garbage
165e9 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 6a 6f 75 72 in the..** jour
165ea 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 nal and ignore i
165eb 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 t...**..** The s
165ec 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 anity checking i
165ed 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 nformation for t
165ee 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 he new journal f
165ef 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0d 0a ormat consists..
165f0 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 ** of a 32-bit c
165f1 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 hecksum on each
165f2 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 page of data. T
165f3 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 he checksum cove
165f4 72 73 20 62 6f 74 68 0d 0a 2a 2a 20 74 68 65 20 rs both..** the
165f5 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 page number and
165f6 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 the pPager->page
165f7 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 Size bytes of da
165f8 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e ta for the page.
165f9 0d 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 ..** This cksum
165fa 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 is initialized t
165fb 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f o a 32-bit rando
165fc 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 m value that app
165fd 65 61 72 73 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 ears in the..**
165fe 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 journal file rig
165ff 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 ht after the hea
16600 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d der. The random
16601 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 initializer is
16602 69 6d 70 6f 72 74 61 6e 74 2c 0d 0a 2a 2a 20 62 important,..** b
16603 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 ecause garbage d
16604 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 ata that appears
16605 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 at the end of a
16606 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 journal is like
16607 6c 79 0d 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 ly..** data that
16608 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 was once in oth
16609 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 er files that ha
1660a 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 ve now been dele
1660b 74 65 64 2e 20 20 49 66 20 74 68 65 0d 0a 2a 2a ted. If the..**
1660c 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 garbage data ca
1660d 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c me from an obsol
1660e 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ete journal file
1660f 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 , the checksums
16610 6d 69 67 68 74 0d 0a 2a 2a 20 62 65 20 63 6f 72 might..** be cor
16611 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e rect. But by in
16612 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 itializing the c
16613 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f hecksum to rando
16614 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0d 0a 2a m value which..*
16615 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 * is different f
16616 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c or every journal
16617 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 , we minimize th
16618 61 74 20 72 69 73 6b 2e 0d 0a 2a 2f 0d 0a 73 74 at risk...*/..st
16619 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 atic const unsig
1661a 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 ned char aJourna
1661b 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0d 0a 20 20 lMagic[] = {..
1661c 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 0xd9, 0xd5, 0x05
1661d 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 , 0xf9, 0x20, 0x
1661e 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0d a1, 0x63, 0xd7,.
1661f 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 .};..../*..** Th
16620 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 e size of the of
16621 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 each page recor
16622 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c d in the journal
16623 20 69 73 20 67 69 76 65 6e 20 62 79 0d 0a 2a 2a is given by..**
16624 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d the following m
16625 61 63 72 6f 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 acro...*/..#defi
16626 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a ne JOURNAL_PG_SZ
16627 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 (pPager) ((pPag
16628 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 er->pageSize) +
16629 38 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 8)..../*..** The
1662a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 journal header
1662b 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 size for this pa
1662c 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 ger. This is usu
1662d 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0d 0a ally the same ..
1662e 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e ** size as a sin
1662f 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e gle disk sector.
16630 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 See also setSec
16631 74 6f 72 53 69 7a 65 28 29 2e 0d 0a 2a 2f 0d 0a torSize()...*/..
16632 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f #define JOURNAL_
16633 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 HDR_SZ(pPager) (
16634 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 pPager->sectorSi
16635 7a 65 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ze)..../*..** Th
16636 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 e macro MEMDB is
16637 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 true if we are
16638 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 dealing with an
16639 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 in-memory databa
1663a 73 65 2e 0d 0a 2a 2a 20 57 65 20 64 6f 20 74 68 se...** We do th
1663b 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f is as a macro so
1663c 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c that if the SQL
1663d 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 ITE_OMIT_MEMORYD
1663e 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0d B macro is set,.
1663f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 .** the value of
16640 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 MEMDB will be a
16641 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 constant and th
16642 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 e compiler will
16643 6f 70 74 69 6d 69 7a 65 0d 0a 2a 2a 20 6f 75 74 optimize..** out
16644 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 code that would
16645 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0d never execute..
16646 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 .*/..#ifdef SQLI
16647 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 TE_OMIT_MEMORYDB
16648 0d 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 ..# define MEMDB
16649 20 30 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 0..#else..# def
1664a 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 ine MEMDB pPager
1664b 2d 3e 6d 65 6d 44 62 0d 0a 23 65 6e 64 69 66 0d ->memDb..#endif.
1664c 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 6d 61 .../*..** The ma
1664d 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 ximum legal page
1664e 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 number is (2^31
1664f 20 2d 20 31 29 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 - 1)...*/..#def
16650 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 ine PAGER_MAX_PG
16651 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0d 0a 0d NO 2147483647...
16652 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 61 72 67 75 ./*..** The argu
16653 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 ment to this mac
16654 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 ro is a file des
16655 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 criptor (type sq
16656 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0d 0a 2a lite3_file*)...*
16657 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 * Return 0 if it
16658 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 is not open, or
16659 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e non-zero (but n
1665a 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0d ot 1) if it is..
1665b 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 .**..** This is
1665c 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 so that expressi
1665d 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 ons can be writt
1665e 65 6e 20 61 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 en as:..**..**
1665f 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 if( isOpen(pPag
16660 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0d er->jfd) ){ ....
16661 0a 2a 2a 0d 0a 2a 2a 20 69 6e 73 74 65 61 64 20 .**..** instead
16662 6f 66 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 69 66 28 of..**..** if(
16663 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d pPager->jfd->pM
16664 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0d 0a 2a ethods ){ .....*
16665 2f 0d 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 /..#define isOpe
16666 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 n(pFd) ((pFd)->p
16667 4d 65 74 68 6f 64 73 29 0d 0a 0d 0a 2f 2a 0d 0a Methods)..../*..
16668 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 ** Return true i
16669 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 f this pager use
1666a 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 s a write-ahead
1666b 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 log instead of t
1666c 68 65 20 75 73 75 61 6c 0d 0a 2a 2a 20 72 6f 6c he usual..** rol
1666d 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f lback journal. O
1666e 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0d therwise false..
1666f 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .*/..#ifndef SQL
16670 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 73 74 ITE_OMIT_WAL..st
16671 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 atic int pagerUs
16672 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 eWal(Pager *pPag
16673 65 72 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 28 er){.. return (
16674 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 pPager->pWal!=0)
16675 3b 0d 0a 7d 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 ;..}..#else..# d
16676 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 efine pagerUseWa
16677 6c 28 78 29 20 30 0d 0a 23 20 64 65 66 69 6e 65 l(x) 0..# define
16678 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 pagerRollbackWa
16679 6c 28 78 29 20 30 0d 0a 23 20 64 65 66 69 6e 65 l(x) 0..# define
1667a 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 pagerWalFrames(
1667b 76 2c 77 2c 78 2c 79 29 20 30 0d 0a 23 20 64 65 v,w,x,y) 0..# de
1667c 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 fine pagerOpenWa
1667d 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 lIfPresent(z) SQ
1667e 4c 49 54 45 5f 4f 4b 0d 0a 23 20 64 65 66 69 6e LITE_OK..# defin
1667f 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 e pagerBeginRead
16680 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 Transaction(z) S
16681 51 4c 49 54 45 5f 4f 4b 0d 0a 23 65 6e 64 69 66 QLITE_OK..#endif
16682 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 ....#ifndef NDEB
16683 55 47 20 0d 0a 2f 2a 0d 0a 2a 2a 20 55 73 61 67 UG ../*..** Usag
16684 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 61 73 73 e:..**..** ass
16685 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 ert( assert_page
16686 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 r_state(pPager)
16687 29 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 );..**..** This
16688 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 function runs ma
16689 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 ny asserts to tr
1668a 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 y to find incons
1668b 69 73 74 65 6e 63 69 65 73 20 69 6e 0d 0a 2a 2a istencies in..**
1668c 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 the internal st
1668d 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 ate of the Pager
1668e 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 object...*/..st
1668f 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f atic int assert_
16690 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 pager_state(Page
16691 72 20 2a 70 29 7b 0d 0a 20 20 50 61 67 65 72 20 r *p){.. Pager
16692 2a 70 50 61 67 65 72 20 3d 20 70 3b 0d 0a 0d 0a *pPager = p;....
16693 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 /* State must
16694 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0d 0a 20 20 be valid. */..
16695 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 assert( p->eStat
16696 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0d 0a 20 e==PAGER_OPEN..
16697 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 || p->eSta
16698 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 te==PAGER_READER
16699 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 .. || p->e
1669a 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 State==PAGER_WRI
1669b 54 45 52 5f 4c 4f 43 4b 45 44 0d 0a 20 20 20 20 TER_LOCKED..
1669c 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d || p->eState=
1669d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 =PAGER_WRITER_CA
1669e 43 48 45 4d 4f 44 0d 0a 20 20 20 20 20 20 20 7c CHEMOD.. |
1669f 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 | p->eState==PAG
166a0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0d ER_WRITER_DBMOD.
166a1 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 . || p->eS
166a2 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 tate==PAGER_WRIT
166a3 45 52 5f 46 49 4e 49 53 48 45 44 0d 0a 20 20 20 ER_FINISHED..
166a4 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 || p->eState
166a5 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0d 0a 20 ==PAGER_ERROR..
166a6 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 67 61 );.... /* Rega
166a7 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 rdless of the cu
166a8 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 rrent state, a t
166a9 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 emp-file connect
166aa 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 ion always behav
166ab 65 73 0d 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 es.. ** as if i
166ac 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 t has an exclusi
166ad 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 ve lock on the d
166ae 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 atabase file. It
166af 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0d 0a never updates..
166b0 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d ** the change-
166b1 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 counter field, s
166b2 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e o the changeCoun
166b3 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c tDone flag is al
166b4 77 61 79 73 20 73 65 74 2e 0d 0a 20 20 2a 2f 0d ways set... */.
166b5 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 . assert( p->te
166b6 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e mpFile==0 || p->
166b7 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 eLock==EXCLUSIVE
166b8 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 61 73 73 65 _LOCK );.. asse
166b9 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d rt( p->tempFile=
166ba 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 =0 || pPager->ch
166bb 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b angeCountDone );
166bc 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 .... /* If the
166bd 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 useJournal flag
166be 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f is clear, the jo
166bf 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 urnal-mode must
166c0 62 65 20 22 4f 46 46 22 2e 20 0d 0a 20 20 2a 2a be "OFF". .. **
166c1 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 And if the jour
166c2 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 nal-mode is "OFF
166c3 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 ", the journal f
166c4 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 ile must not be
166c5 6f 70 65 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 open... */.. a
166c6 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 ssert( p->journa
166c7 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 lMode==PAGER_JOU
166c8 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 RNALMODE_OFF ||
166c9 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b p->useJournal );
166ca 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a .. assert( p->j
166cb 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 ournalMode!=PAGE
166cc 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 R_JOURNALMODE_OF
166cd 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e F || !isOpen(p->
166ce 6a 66 64 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 jfd) );.... /*
166cf 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 Check that MEMDB
166d0 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e implies noSync.
166d1 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 And an in-memor
166d2 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 y journal. Since
166d3 20 0d 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 .. ** this mea
166d4 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 ns an in-memory
166d5 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e pager performs n
166d6 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 o IO at all, it
166d7 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 cannot encounter
166d8 20 0d 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 .. ** either S
166d9 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 QLITE_IOERR or S
166da 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e QLITE_FULL durin
166db 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 g rollback or wh
166dc 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0d ile finalizing .
166dd 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 . ** a journal
166de 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 file. (although
166df 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f the in-memory jo
166e0 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 urnal implementa
166e1 74 69 6f 6e 20 6d 61 79 20 0d 0a 20 20 2a 2a 20 tion may .. **
166e2 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
166e3 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 ERR_NOMEM while
166e4 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 the journal file
166e5 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 is being writte
166e6 6e 29 2e 20 49 74 20 0d 0a 20 20 2a 2a 20 69 73 n). It .. ** is
166e7 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 therefore not p
166e8 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 ossible for an i
166e9 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 n-memory pager t
166ea 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f o enter the ERRO
166eb 52 20 0d 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0d R .. ** state..
166ec 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 4d 45 4d . */.. if( MEM
166ed 44 42 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 DB ){.. asser
166ee 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0d t( p->noSync );.
166ef 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e . assert( p->
166f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 journalMode==PAG
166f1 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f ER_JOURNALMODE_O
166f2 46 46 20 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c FF .. ||
166f3 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d p->journalMode=
166f4 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
166f5 44 45 5f 4d 45 4d 4f 52 59 20 0d 0a 20 20 20 20 DE_MEMORY ..
166f6 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
166f7 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 p->eState!=PAGER
166f8 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 _ERROR && p->eSt
166f9 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 ate!=PAGER_OPEN
166fa 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
166fb 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d pagerUseWal(p)==
166fc 30 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 0 );.. }.... /
166fd 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 * If changeCount
166fe 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 Done is set, a R
166ff 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 ESERVED lock or
16700 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 greater must be
16701 68 65 6c 64 0d 0a 20 20 2a 2a 20 6f 6e 20 74 68 held.. ** on th
16702 65 20 66 69 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 e file... */..
16703 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
16704 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 >changeCountDone
16705 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 ==0 || pPager->e
16706 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c Lock>=RESERVED_L
16707 4f 43 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 OCK );.. assert
16708 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 ( p->eLock!=PEND
16709 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 ING_LOCK );....
1670a 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 switch( p->eSta
1670b 74 65 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 te ){.. case
1670c 50 41 47 45 52 5f 4f 50 45 4e 3a 0d 0a 20 20 20 PAGER_OPEN:..
1670d 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 assert( !MEMD
1670e 42 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 B );.. asse
1670f 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 rt( pPager->errC
16710 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 ode==SQLITE_OK )
16711 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ;.. assert(
16712 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 sqlite3PcacheRe
16713 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 fCount(pPager->p
16714 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 PCache)==0 || pP
16715 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 ager->tempFile )
16716 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d ;.. break;.
16717 0a 0d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 ... case PAGE
16718 52 5f 52 45 41 44 45 52 3a 0d 0a 20 20 20 20 20 R_READER:..
16719 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
1671a 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 >errCode==SQLITE
1671b 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 _OK );.. as
1671c 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d sert( p->eLock!=
1671d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0d UNKNOWN_LOCK );.
1671e 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
1671f 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f ->eLock>=SHARED_
16720 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 LOCK || p->noRea
16721 64 6c 6f 63 6b 20 29 3b 0d 0a 20 20 20 20 20 20 dlock );..
16722 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 63 61 break;.... ca
16723 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f se PAGER_WRITER_
16724 4c 4f 43 4b 45 44 3a 0d 0a 20 20 20 20 20 20 61 LOCKED:.. a
16725 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 ssert( p->eLock!
16726 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b =UNKNOWN_LOCK );
16727 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
16728 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d pPager->errCode=
16729 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 =SQLITE_OK );..
1672a 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 if( !pagerU
1672b 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b seWal(pPager) ){
1672c 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 .. assert
1672d 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 ( p->eLock>=RESE
1672e 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 RVED_LOCK );..
1672f 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 61 73 73 }.. ass
16730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 ert( pPager->dbS
16731 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f ize==pPager->dbO
16732 72 69 67 53 69 7a 65 20 29 3b 0d 0a 20 20 20 20 rigSize );..
16733 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
16734 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 ->dbOrigSize==pP
16735 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 ager->dbFileSize
16736 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 );.. asser
16737 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 t( pPager->dbOri
16738 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 gSize==pPager->d
16739 62 48 69 6e 74 53 69 7a 65 20 29 3b 0d 0a 20 20 bHintSize );..
1673a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 assert( pPag
1673b 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 er->setMaster==0
1673c 20 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b );.. break
1673d 3b 0d 0a 0d 0a 20 20 20 20 63 61 73 65 20 50 41 ;.... case PA
1673e 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 GER_WRITER_CACHE
1673f 4d 4f 44 3a 0d 0a 20 20 20 20 20 20 61 73 73 65 MOD:.. asse
16740 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e rt( p->eLock!=UN
16741 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 KNOWN_LOCK );..
16742 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 assert( pPa
16743 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 ger->errCode==SQ
16744 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 LITE_OK );..
16745 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 if( !pagerUseW
16746 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 al(pPager) ){..
16747 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 /* It is
16748 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 possible that if
16749 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 journal_mode=wa
1674a 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 l here that neit
1674b 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 her the..
1674c 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ** journal file
1674d 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c nor the WAL fil
1674e 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 e are open. This
1674f 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0d happens during.
16750 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f . ** a ro
16751 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 llback transacti
16752 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73 on that switches
16753 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f from journal_mo
16754 64 65 3d 6f 66 66 0d 0a 20 20 20 20 20 20 20 20 de=off..
16755 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f ** to journal_mo
16756 64 65 3d 77 61 6c 2e 0d 0a 20 20 20 20 20 20 20 de=wal...
16757 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 61 73 73 */.. ass
16758 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 ert( p->eLock>=R
16759 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0d ESERVED_LOCK );.
1675a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
1675b 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 isOpen(p->jfd)
1675c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c .. |
1675d 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 | p->journalMode
1675e 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d ==PAGER_JOURNALM
1675f 4f 44 45 5f 4f 46 46 20 0d 0a 20 20 20 20 20 20 ODE_OFF ..
16760 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 || p->jou
16761 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f rnalMode==PAGER_
16762 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 JOURNALMODE_WAL
16763 0d 0a 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 .. );..
16764 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 61 73 73 }.. ass
16765 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f ert( pPager->dbO
16766 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d rigSize==pPager-
16767 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0d 0a >dbFileSize );..
16768 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 assert( pP
16769 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 ager->dbOrigSize
1676a 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 ==pPager->dbHint
1676b 53 69 7a 65 20 29 3b 0d 0a 20 20 20 20 20 20 62 Size );.. b
1676c 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 63 61 73 reak;.... cas
1676d 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 e PAGER_WRITER_D
1676e 42 4d 4f 44 3a 0d 0a 20 20 20 20 20 20 61 73 73 BMOD:.. ass
1676f 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 ert( p->eLock==E
16770 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b XCLUSIVE_LOCK );
16771 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
16772 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d pPager->errCode=
16773 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 =SQLITE_OK );..
16774 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 assert( !pa
16775 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 gerUseWal(pPager
16776 29 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 ) );.. asse
16777 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 rt( p->eLock>=EX
16778 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0d CLUSIVE_LOCK );.
16779 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 . assert( i
1677a 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0d 0a sOpen(p->jfd) ..
1677b 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d || p-
1677c 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 >journalMode==PA
1677d 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
1677e 4f 46 46 20 0d 0a 20 20 20 20 20 20 20 20 20 20 OFF ..
1677f 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f || p->journalMo
16780 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 de==PAGER_JOURNA
16781 4c 4d 4f 44 45 5f 57 41 4c 20 0d 0a 20 20 20 20 LMODE_WAL ..
16782 20 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 );.. asse
16783 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 rt( pPager->dbOr
16784 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e igSize<=pPager->
16785 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0d 0a 20 dbHintSize );..
16786 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 break;....
16787 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 case PAGER_WR
16788 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0d 0a ITER_FINISHED:..
16789 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d assert( p-
1678a 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 >eLock==EXCLUSIV
1678b 45 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 20 E_LOCK );..
1678c 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
1678d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 >errCode==SQLITE
1678e 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 _OK );.. as
1678f 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 sert( !pagerUseW
16790 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 al(pPager) );..
16791 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f assert( isO
16792 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0d 0a 20 20 pen(p->jfd) ..
16793 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a || p->j
16794 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 ournalMode==PAGE
16795 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 R_JOURNALMODE_OF
16796 46 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 7c F .. |
16797 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 | p->journalMode
16798 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d ==PAGER_JOURNALM
16799 4f 44 45 5f 57 41 4c 20 0d 0a 20 20 20 20 20 20 ODE_WAL ..
1679a 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b );.. break;
1679b 0d 0a 0d 0a 20 20 20 20 63 61 73 65 20 50 41 47 .... case PAG
1679c 45 52 5f 45 52 52 4f 52 3a 0d 0a 20 20 20 20 20 ER_ERROR:..
1679d 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 /* There must b
1679e 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f e at least one o
1679f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 utstanding refer
167a0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 ence to the page
167a1 72 20 69 66 0d 0a 20 20 20 20 20 20 2a 2a 20 69 r if.. ** i
167a2 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f n ERROR state. O
167a3 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 therwise the pag
167a4 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 er should have a
167a5 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0d 0a lready dropped..
167a6 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f ** back to
167a7 20 4f 50 45 4e 20 73 74 61 74 65 2e 0d 0a 20 20 OPEN state...
167a8 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 61 73 */.. as
167a9 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 sert( pPager->er
167aa 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b rCode!=SQLITE_OK
167ab 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 );.. asser
167ac 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 t( sqlite3Pcache
167ad 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d RefCount(pPager-
167ae 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0d 0a >pPCache)>0 );..
167af 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 break;..
167b0 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 31 3b }.... return 1;
167b1 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 ..}..#endif /* i
167b2 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0d fndef NDEBUG */.
167b3 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
167b4 5f 44 45 42 55 47 20 0d 0a 2f 2a 0d 0a 2a 2a 20 _DEBUG ../*..**
167b5 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 Return a pointer
167b6 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 to a human read
167b7 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 able string in a
167b8 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0d 0a static buffer..
167b9 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 ** containing th
167ba 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 e state of the P
167bb 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 ager object pass
167bc 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e ed as an argumen
167bd 74 2e 20 54 68 69 73 0d 0a 2a 2a 20 69 73 20 69 t. This..** is i
167be 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 ntended to be us
167bf 65 64 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 ed within debugg
167c0 65 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 ers. For example
167c1 2c 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 , as an alternat
167c2 69 76 65 0d 0a 2a 2a 20 74 6f 20 22 70 72 69 6e ive..** to "prin
167c3 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64 t *pPager" in gd
167c4 62 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 28 67 64 62 29 b:..**..** (gdb)
167c5 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72 printf "%s", pr
167c6 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 int_pager_state(
167c7 70 50 61 67 65 72 29 0d 0a 2a 2f 0d 0a 73 74 61 pPager)..*/..sta
167c8 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f tic char *print_
167c9 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 pager_state(Page
167ca 72 20 2a 70 29 7b 0d 0a 20 20 73 74 61 74 69 63 r *p){.. static
167cb 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d char zRet[1024]
167cc 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 5f 73 ;.... sqlite3_s
167cd 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 nprintf(1024, zR
167ce 65 74 2c 0d 0a 20 20 20 20 20 20 22 46 69 6c 65 et,.. "File
167cf 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 name: %s\n"
167d0 0d 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 .. "State:
167d1 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f %s errCo
167d2 64 65 3d 25 64 5c 6e 22 0d 0a 20 20 20 20 20 20 de=%d\n"..
167d3 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 "Lock:
167d4 25 73 5c 6e 22 0d 0a 20 20 20 20 20 20 22 4c 6f %s\n".. "Lo
167d5 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 cking mode: loc
167d6 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0d king_mode=%s\n".
167d7 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 . "Journal
167d8 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d mode: journal_m
167d9 6f 64 65 3d 25 73 5c 6e 22 0d 0a 20 20 20 20 20 ode=%s\n"..
167da 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a "Backing store:
167db 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d tempFile=%d mem
167dc 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c Db=%d useJournal
167dd 3d 25 64 5c 6e 22 0d 0a 20 20 20 20 20 20 22 4a =%d\n".. "J
167de 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f ournal: jo
167df 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f urnalOff=%lld jo
167e0 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 urnalHdr=%lld\n"
167e1 0d 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 .. "Size:
167e2 20 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 dbsize=%
167e3 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 d dbOrigSize=%d
167e4 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 dbFileSize=%d\n"
167e5 0d 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 .. , p->zFi
167e6 6c 65 6e 61 6d 65 0d 0a 20 20 20 20 20 20 2c 20 lename.. ,
167e7 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 p->eState==PAGER
167e8 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 _OPEN
167e9 20 3f 20 22 4f 50 45 4e 22 20 3a 0d 0a 20 20 20 ? "OPEN" :..
167ea 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d p->eState==
167eb 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 PAGER_READER
167ec 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22 ? "READER"
167ed 20 3a 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 :.. p->e
167ee 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 State==PAGER_WRI
167ef 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 TER_LOCKED ? "
167f0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a WRITER_LOCKED" :
167f1 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 .. p->eSt
167f2 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 ate==PAGER_WRITE
167f3 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 R_CACHEMOD ? "WR
167f4 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a ITER_CACHEMOD" :
167f5 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 .. p->eSt
167f6 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 ate==PAGER_WRITE
167f7 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 R_DBMOD ? "WR
167f8 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0d 0a 20 ITER_DBMOD" :..
167f9 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 p->eState
167fa 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 ==PAGER_WRITER_F
167fb 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 INISHED ? "WRITE
167fc 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0d 0a 20 R_FINISHED" :..
167fd 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 p->eState
167fe 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 ==PAGER_ERROR
167ff 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 ? "ERROR
16800 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0d 0a 20 " : "?error?"..
16801 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 , (int)p->e
16802 72 72 43 6f 64 65 0d 0a 20 20 20 20 20 20 2c 20 rrCode.. ,
16803 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 p->eLock==NO_LOC
16804 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f K ? "NO_
16805 4c 4f 43 4b 22 20 3a 0d 0a 20 20 20 20 20 20 20 LOCK" :..
16806 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 p->eLock==RESER
16807 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 VED_LOCK ? "RE
16808 53 45 52 56 45 44 22 20 3a 0d 0a 20 20 20 20 20 SERVED" :..
16809 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 p->eLock==EXC
1680a 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 LUSIVE_LOCK ? "
1680b 45 58 43 4c 55 53 49 56 45 22 20 3a 0d 0a 20 20 EXCLUSIVE" :..
1680c 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d p->eLock==
1680d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 SHARED_LOCK
1680e 3f 20 22 53 48 41 52 45 44 22 20 3a 0d 0a 20 20 ? "SHARED" :..
1680f 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d p->eLock==
16810 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 UNKNOWN_LOCK
16811 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f ? "UNKNOWN" : "?
16812 65 72 72 6f 72 3f 22 0d 0a 20 20 20 20 20 20 2c error?".. ,
16813 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 p->exclusiveMod
16814 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 e ? "exclusive"
16815 3a 20 22 6e 6f 72 6d 61 6c 22 0d 0a 20 20 20 20 : "normal"..
16816 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f , p->journalMo
16817 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 de==PAGER_JOURNA
16818 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f LMODE_MEMORY ?
16819 20 22 6d 65 6d 6f 72 79 22 20 3a 0d 0a 20 20 20 "memory" :..
1681a 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d p->journalM
1681b 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e ode==PAGER_JOURN
1681c 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 ALMODE_OFF
1681d 3f 20 22 6f 66 66 22 20 3a 0d 0a 20 20 20 20 20 ? "off" :..
1681e 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 p->journalMod
1681f 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c e==PAGER_JOURNAL
16820 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 MODE_DELETE ?
16821 22 64 65 6c 65 74 65 22 20 3a 0d 0a 20 20 20 20 "delete" :..
16822 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f p->journalMo
16823 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 de==PAGER_JOURNA
16824 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f LMODE_PERSIST ?
16825 20 22 70 65 72 73 69 73 74 22 20 3a 0d 0a 20 20 "persist" :..
16826 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c p->journal
16827 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 Mode==PAGER_JOUR
16828 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 NALMODE_TRUNCATE
16829 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0d ? "truncate" :.
1682a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 . p->jour
1682b 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a nalMode==PAGER_J
1682c 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 OURNALMODE_WAL
1682d 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f ? "wal" : "?
1682e 65 72 72 6f 72 3f 22 0d 0a 20 20 20 20 20 20 2c error?".. ,
1682f 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c (int)p->tempFil
16830 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 e, (int)p->memDb
16831 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 , (int)p->useJou
16832 72 6e 61 6c 0d 0a 20 20 20 20 20 20 2c 20 70 2d rnal.. , p-
16833 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e >journalOff, p->
16834 6a 6f 75 72 6e 61 6c 48 64 72 0d 0a 20 20 20 20 journalHdr..
16835 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 , (int)p->dbSi
16836 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 ze, (int)p->dbOr
16837 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e igSize, (int)p->
16838 64 62 46 69 6c 65 53 69 7a 65 0d 0a 20 20 29 3b dbFileSize.. );
16839 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 .... return zRe
1683a 74 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d t;..}..#endif...
1683b 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ./*..** Return t
1683c 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 rue if it is nec
1683d 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 essary to write
1683e 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 page *pPg into t
1683f 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0d he sub-journal..
16840 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 .** A page needs
16841 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 to be written i
16842 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 nto the sub-jour
16843 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 nal if there exi
16844 73 74 73 20 6f 6e 65 0d 0a 2a 2a 20 6f 72 20 6d sts one..** or m
16845 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 ore open savepoi
16846 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0d 0a nts for which:..
16847 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 **..** * The p
16848 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 age-number is le
16849 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c ss than or equal
1684a 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 to PagerSavepoi
1684b 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0d 0a 2a nt.nOrig, and..*
1684c 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f * * The bit co
1684d 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 rresponding to t
1684e 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 he page-number i
1684f 73 20 6e 6f 74 20 73 65 74 20 69 6e 0d 0a 2a 2a s not set in..**
16850 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f PagerSavepo
16851 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 int.pInSavepoint
16852 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
16853 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 t subjRequiresPa
16854 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0d ge(PgHdr *pPg){.
16855 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 . Pgno pgno = p
16856 50 67 2d 3e 70 67 6e 6f 3b 0d 0a 20 20 50 61 67 Pg->pgno;.. Pag
16857 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 er *pPager = pPg
16858 2d 3e 70 50 61 67 65 72 3b 0d 0a 20 20 69 6e 74 ->pPager;.. int
16859 20 69 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 i;.. for(i=0;
1685a 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 i<pPager->nSavep
1685b 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 oint; i++){..
1685c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 PagerSavepoint
1685d 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 *p = &pPager->aS
1685e 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0d 0a 20 20 avepoint[i];..
1685f 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d if( p->nOrig>=
16860 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 pgno && 0==sqlit
16861 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e e3BitvecTest(p->
16862 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 pInSavepoint, pg
16863 6e 6f 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 no) ){.. re
16864 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a turn 1;.. }..
16865 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b }.. return 0;
16866 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
16867 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 turn true if the
16868 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 page is already
16869 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 in the journal
1686a 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 file...*/..stati
1686b 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 c int pageInJour
1686c 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b nal(PgHdr *pPg){
1686d 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 .. return sqlit
1686e 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 e3BitvecTest(pPg
1686f 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 ->pPager->pInJou
16870 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 rnal, pPg->pgno)
16871 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
16872 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 ead a 32-bit int
16873 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 eger from the gi
16874 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 ven file descrip
16875 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 tor. Store the
16876 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 74 68 61 74 integer..** that
16877 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 is read in *pRe
16878 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 s. Return SQLIT
16879 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 E_OK if everythi
1687a 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e ng worked, or an
1687b 0d 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 ..** error code
1687c 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 is something goe
1687d 73 20 77 72 6f 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a s wrong...**..**
1687e 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 All values are
1687f 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 stored on disk a
16880 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0d 0a 2a s big-endian...*
16881 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 /..static int re
16882 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 ad32bits(sqlite3
16883 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f _file *fd, i64 o
16884 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 ffset, u32 *pRes
16885 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 ){.. unsigned c
16886 68 61 72 20 61 63 5b 34 5d 3b 0d 0a 20 20 69 6e har ac[4];.. in
16887 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 t rc = sqlite3Os
16888 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a Read(fd, ac, siz
16889 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 eof(ac), offset)
1688a 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c ;.. if( rc==SQL
1688b 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 2a ITE_OK ){.. *
1688c 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 pRes = sqlite3Ge
1688d 74 34 62 79 74 65 28 61 63 29 3b 0d 0a 20 20 7d t4byte(ac);.. }
1688e 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
1688f 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 }..../*..** Writ
16890 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 e a 32-bit integ
16891 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 er into a string
16892 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 buffer in big-e
16893 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 ndian byte order
16894 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 70 ...*/..#define p
16895 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 ut32bits(A,B) s
16896 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 qlite3Put4byte((
16897 75 38 2a 29 41 2c 42 29 0d 0a 0d 0a 0d 0a 2f 2a u8*)A,B)....../*
16898 0d 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d ..** Write a 32-
16899 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f bit integer into
1689a 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 the given file
1689b 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 descriptor. Ret
1689c 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a urn SQLITE_OK..*
1689d 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 * on success or
1689e 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 an error code is
1689f 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 something goes
168a0 77 72 6f 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 wrong...*/..stat
168a1 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 ic int write32bi
168a2 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ts(sqlite3_file
168a3 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c *fd, i64 offset,
168a4 20 75 33 32 20 76 61 6c 29 7b 0d 0a 20 20 63 68 u32 val){.. ch
168a5 61 72 20 61 63 5b 34 5d 3b 0d 0a 20 20 70 75 74 ar ac[4];.. put
168a6 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 32bits(ac, val);
168a7 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 .. return sqlit
168a8 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 e3OsWrite(fd, ac
168a9 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0d 0a 7d , 4, offset);..}
168aa 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 55 6e 6c 6f 63 ..../*..** Unloc
168ab 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 k the database f
168ac 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f ile to level eLo
168ad 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 ck, which must b
168ae 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b e either NO_LOCK
168af 0d 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c ..** or SHARED_L
168b0 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 OCK. Regardless
168b1 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f of whether or no
168b2 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 t the call to xU
168b3 6e 6c 6f 63 6b 28 29 0d 0a 2a 2a 20 73 75 63 63 nlock()..** succ
168b4 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 eeds, set the Pa
168b5 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 ger.eLock variab
168b6 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 le to match the
168b7 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 (attempted) new
168b8 6c 6f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 lock...**..** Ex
168b9 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 cept, if Pager.e
168ba 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 Lock is set to U
168bb 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e NKNOWN_LOCK when
168bc 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
168bd 73 0d 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f s..** called, do
168be 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 not modify it.
168bf 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 See the comment
168c0 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e above the #defin
168c1 65 20 6f 66 20 0d 0a 2a 2a 20 55 4e 4b 4e 4f 57 e of ..** UNKNOW
168c2 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 N_LOCK for an ex
168c3 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 planation of thi
168c4 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 s...*/..static i
168c5 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 nt pagerUnlockDb
168c6 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 (Pager *pPager,
168c7 69 6e 74 20 65 4c 6f 63 6b 29 7b 0d 0a 20 20 69 int eLock){.. i
168c8 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
168c9 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 K;.... assert(
168ca 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 !pPager->exclusi
168cb 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 veMode || pPager
168cc 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 ->eLock==eLock )
168cd 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f ;.. assert( eLo
168ce 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 ck==NO_LOCK || e
168cf 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 Lock==SHARED_LOC
168d0 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 K );.. assert(
168d1 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c eLock!=NO_LOCK |
168d2 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 | pagerUseWal(pP
168d3 61 67 65 72 29 3d 3d 30 20 29 3b 0d 0a 20 20 69 ager)==0 );.. i
168d4 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 f( isOpen(pPager
168d5 2d 3e 66 64 29 20 29 7b 0d 0a 20 20 20 20 61 73 ->fd) ){.. as
168d6 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c sert( pPager->eL
168d7 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0d 0a 20 ock>=eLock );..
168d8 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f rc = sqlite3O
168d9 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e sUnlock(pPager->
168da 66 64 2c 20 65 4c 6f 63 6b 29 3b 0d 0a 20 20 20 fd, eLock);..
168db 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f if( pPager->eLo
168dc 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b ck!=UNKNOWN_LOCK
168dd 20 29 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 ){.. pPage
168de 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 r->eLock = (u8)e
168df 4c 6f 63 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 Lock;.. }..
168e0 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f IOTRACE(("UNLO
168e1 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 CK %p %d\n", pPa
168e2 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0d 0a 20 20 ger, eLock))..
168e3 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d }.. return rc;.
168e4 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 63 .}..../*..** Loc
168e5 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 k the database f
168e6 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f ile to level eLo
168e7 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 ck, which must b
168e8 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f e either SHARED_
168e9 4c 4f 43 4b 2c 0d 0a 2a 2a 20 52 45 53 45 52 56 LOCK,..** RESERV
168ea 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 ED_LOCK or EXCLU
168eb 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 SIVE_LOCK. If th
168ec 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 e caller is succ
168ed 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0d essful, set the.
168ee 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 .** Pager.eLock
168ef 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 variable to the
168f0 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 new locking stat
168f1 65 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 63 65 e. ..**..** Exce
168f2 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f pt, if Pager.eLo
168f3 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b ck is set to UNK
168f4 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 NOWN_LOCK when t
168f5 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
168f6 0d 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 ..** called, do
168f7 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e not modify it un
168f8 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 less the new loc
168f9 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 king state is EX
168fa 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0d 0a CLUSIVE_LOCK. ..
168fb 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 ** See the comme
168fc 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 nt above the #de
168fd 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f fine of UNKNOWN_
168fe 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c LOCK for an expl
168ff 61 6e 61 74 69 6f 6e 20 0d 0a 2a 2a 20 6f 66 20 anation ..** of
16900 74 68 69 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 this...*/..stati
16901 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 c int pagerLockD
16902 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c b(Pager *pPager,
16903 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0d 0a 20 20 int eLock){..
16904 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
16905 4f 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 OK;.... assert(
16906 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c eLock==SHARED_L
16907 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 OCK || eLock==RE
16908 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 SERVED_LOCK || e
16909 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f Lock==EXCLUSIVE_
1690a 4c 4f 43 4b 20 29 3b 0d 0a 20 20 69 66 28 20 70 LOCK );.. if( p
1690b 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f Pager->eLock<eLo
1690c 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c ck || pPager->eL
1690d 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 ock==UNKNOWN_LOC
1690e 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 K ){.. rc = s
1690f 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 qlite3OsLock(pPa
16910 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b ger->fd, eLock);
16911 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
16912 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 LITE_OK && (pPag
16913 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f er->eLock!=UNKNO
16914 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d WN_LOCK||eLock==
16915 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 EXCLUSIVE_LOCK)
16916 29 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 ){.. pPager
16917 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c ->eLock = (u8)eL
16918 6f 63 6b 3b 0d 0a 20 20 20 20 20 20 49 4f 54 52 ock;.. IOTR
16919 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 ACE(("LOCK %p %d
1691a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f \n", pPager, eLo
1691b 63 6b 29 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d ck)).. }.. }
1691c 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
1691d 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 }..../*..** This
1691e 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d function determ
1691f 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 ines whether or
16920 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 not the atomic-w
16921 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f rite optimizatio
16922 6e 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 n..** can be use
16923 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 d with this page
16924 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 r. The optimizat
16925 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 ion can be used
16926 69 66 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 28 61 29 if:..**..** (a)
16927 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 the value retur
16928 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 ned by OsDeviceC
16929 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 haracteristics()
1692a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0d indicates that.
1692b 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 .** a datab
1692c 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 ase page may be
1692d 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c written atomical
1692e 6c 79 2c 20 61 6e 64 0d 0a 2a 2a 20 20 28 62 29 ly, and..** (b)
1692f 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 the value retur
16930 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 ned by OsSectorS
16931 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 ize() is less th
16932 61 6e 20 6f 72 20 65 71 75 61 6c 0d 0a 2a 2a 20 an or equal..**
16933 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 to the page
16934 20 73 69 7a 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 size...**..** T
16935 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 he optimization
16936 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 is also always e
16937 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f nabled for tempo
16938 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 rary files. It i
16939 73 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 s..** an error t
1693a 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 o call this func
1693b 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 tion if pPager i
1693c 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 s opened on an i
1693d 6e 2d 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 64 61 74 n-memory..** dat
1693e 61 62 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 abase...**..** I
1693f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 f the optimizati
16940 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 on cannot be use
16941 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 d, 0 is returned
16942 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 . If it can be u
16943 73 65 64 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 sed,..** then th
16944 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 e value returned
16945 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 is the size of
16946 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 the journal file
16947 20 77 68 65 6e 20 69 74 0d 0a 2a 2a 20 63 6f 6e when it..** con
16948 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 tains rollback d
16949 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 ata for exactly
1694a 6f 6e 65 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 23 one page...*/..#
1694b 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
1694c 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 BLE_ATOMIC_WRITE
1694d 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e ..static int jrn
1694e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 lBufferSize(Page
1694f 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 61 r *pPager){.. a
16950 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b ssert( !MEMDB );
16951 0d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d .. if( !pPager-
16952 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0d 0a 20 20 >tempFile ){..
16953 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 int dc;
16954 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16955 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 /* Device ch
16956 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f aracteristics */
16957 0d 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f .. int nSecto
16958 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
16959 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f /* Secto
1695a 72 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 20 20 69 r size */.. i
1695b 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 nt szPage;
1695c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1695d 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f /* Page size */
1695e 0d 0a 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 .... assert(
1695f 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 isOpen(pPager->f
16960 64 29 20 29 3b 0d 0a 20 20 20 20 64 63 20 3d 20 d) );.. dc =
16961 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 sqlite3OsDeviceC
16962 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 haracteristics(p
16963 50 61 67 65 72 2d 3e 66 64 29 3b 0d 0a 20 20 20 Pager->fd);..
16964 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 nSector = pPage
16965 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0d 0a r->sectorSize;..
16966 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 szPage = pPa
16967 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0d 0a ger->pageSize;..
16968 0d 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c .. assert(SQL
16969 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 ITE_IOCAP_ATOMIC
1696a 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0d 512==(512>>8));.
1696b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 . assert(SQLI
1696c 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 TE_IOCAP_ATOMIC6
1696d 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 4K==(65536>>8));
1696e 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 .. if( 0==(dc
1696f 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 &(SQLITE_IOCAP_A
16970 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 TOMIC|(szPage>>8
16971 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a )) || nSector>sz
16972 50 61 67 65 29 20 29 7b 0d 0a 20 20 20 20 20 20 Page) ){..
16973 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d return 0;.. }
16974 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 .. }.... retur
16975 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a n JOURNAL_HDR_SZ
16976 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e (pPager) + JOURN
16977 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 AL_PG_SZ(pPager)
16978 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ;..}..#endif....
16979 2f 2a 0d 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 /*..** If SQLITE
1697a 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 _CHECK_PAGES is
1697b 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 defined then we
1697c 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 do some sanity c
1697d 68 65 63 6b 69 6e 67 0d 0a 2a 2a 20 6f 6e 20 74 hecking..** on t
1697e 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 he cache using a
1697f 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 hash function.
16980 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f This is used fo
16981 72 20 74 65 73 74 69 6e 67 0d 0a 2a 2a 20 61 6e r testing..** an
16982 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 d debugging only
16983 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 ...*/..#ifdef SQ
16984 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 LITE_CHECK_PAGES
16985 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ../*..** Return
16986 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 a 32-bit hash of
16987 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 the page data f
16988 6f 72 20 70 50 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 or pPage...*/..s
16989 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f tatic u32 pager_
1698a 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 datahash(int nBy
1698b 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 te, unsigned cha
1698c 72 20 2a 70 44 61 74 61 29 7b 0d 0a 20 20 75 33 r *pData){.. u3
1698d 32 20 68 61 73 68 20 3d 20 30 3b 0d 0a 20 20 69 2 hash = 0;.. i
1698e 6e 74 20 69 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 nt i;.. for(i=0
1698f 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b ; i<nByte; i++){
16990 0d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 .. hash = (ha
16991 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 sh*1039) + pData
16992 5b 69 5d 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 [i];.. }.. ret
16993 75 72 6e 20 68 61 73 68 3b 0d 0a 7d 0d 0a 73 74 urn hash;..}..st
16994 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 atic u32 pager_p
16995 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 agehash(PgHdr *p
16996 50 61 67 65 29 7b 0d 0a 20 20 72 65 74 75 72 6e Page){.. return
16997 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 pager_datahash(
16998 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 pPage->pPager->p
16999 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e ageSize, (unsign
1699a 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d ed char *)pPage-
1699b 3e 70 44 61 74 61 29 3b 0d 0a 7d 0d 0a 73 74 61 >pData);..}..sta
1699c 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 tic void pager_s
1699d 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 et_pagehash(PgHd
1699e 72 20 2a 70 50 61 67 65 29 7b 0d 0a 20 20 70 50 r *pPage){.. pP
1699f 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 age->pageHash =
169a0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 pager_pagehash(p
169a1 50 61 67 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d Page);..}..../*.
169a2 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 .** The CHECK_PA
169a3 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 GE macro takes a
169a4 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 PgHdr* as an ar
169a5 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 gument. If SQLIT
169a6 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0d 0a 2a E_CHECK_PAGES..*
169a7 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e * is defined, an
169a8 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 d NDEBUG is not
169a9 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 defined, an asse
169aa 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 rt() statement c
169ab 68 65 63 6b 73 0d 0a 2a 2a 20 74 68 61 74 20 74 hecks..** that t
169ac 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 he page is eithe
169ad 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c r dirty or still
169ae 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c matches the cal
169af 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 culated page-has
169b0 68 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 h...*/..#define
169b1 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 CHECK_PAGE(x) ch
169b2 65 63 6b 50 61 67 65 28 78 29 0d 0a 73 74 61 74 eckPage(x)..stat
169b3 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 ic void checkPag
169b4 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0d 0a e(PgHdr *pPg){..
169b5 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 Pager *pPager
169b6 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0d 0a = pPg->pPager;..
169b7 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
169b8 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f ->eState!=PAGER_
169b9 45 52 52 4f 52 20 29 3b 0d 0a 20 20 61 73 73 65 ERROR );.. asse
169ba 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 rt( (pPg->flags&
169bb 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 PGHDR_DIRTY) ||
169bc 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 pPg->pageHash==p
169bd 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 ager_pagehash(pP
169be 67 29 20 29 3b 0d 0a 7d 0d 0a 0d 0a 23 65 6c 73 g) );..}....#els
169bf 65 0d 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 e..#define pager
169c0 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 _datahash(X,Y)
169c1 30 0d 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 0..#define pager
169c2 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0d _pagehash(X) 0.
169c3 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 .#define pager_s
169c4 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0d 0a et_pagehash(X)..
169c5 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 #define CHECK_PA
169c6 47 45 28 78 29 0d 0a 23 65 6e 64 69 66 20 20 2f GE(x)..#endif /
169c7 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 * SQLITE_CHECK_P
169c8 41 47 45 53 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a AGES */..../*..*
169c9 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 * When this is c
169ca 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 alled the journa
169cb 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 l file for pager
169cc 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 pPager must be
169cd 6f 70 65 6e 2e 0d 0a 2a 2a 20 54 68 69 73 20 66 open...** This f
169ce 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 unction attempts
169cf 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 to read a maste
169d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e r journal file n
169d1 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0d 0a 2a ame from the ..*
169d2 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c * end of the fil
169d3 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 e and, if succes
169d4 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 sful, copies it
169d5 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 into memory supp
169d6 6c 69 65 64 20 0d 0a 2a 2a 20 62 79 20 74 68 65 lied ..** by the
169d7 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d caller. See com
169d8 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 ments above writ
169d9 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 eMasterJournal()
169da 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0d for the format.
169db 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 .** used to stor
169dc 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e e a master journ
169dd 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 al file name at
169de 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 the end of a jou
169df 72 6e 61 6c 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a rnal file...**..
169e0 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 ** zMaster must
169e1 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 point to a buffe
169e2 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d r of at least nM
169e3 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f aster bytes allo
169e4 63 61 74 65 64 20 62 79 0d 0a 2a 2a 20 74 68 65 cated by..** the
169e5 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 caller. This sh
169e6 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f ould be sqlite3_
169e7 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 vfs.mxPathname+1
169e8 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 (to ensure ther
169e9 65 20 69 73 0d 0a 2a 2a 20 65 6e 6f 75 67 68 20 e is..** enough
169ea 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 space to write t
169eb 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
169ec 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 l name). If the
169ed 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0d 0a master journal..
169ee 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a ** name in the j
169ef 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 ournal is longer
169f0 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 than nMaster by
169f1 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 tes (including a
169f2 0d 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 ..** nul-termina
169f3 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 tor), then this
169f4 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 is handled as if
169f5 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e no master journ
169f6 61 6c 20 6e 61 6d 65 0d 0a 2a 2a 20 77 65 72 65 al name..** were
169f7 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 present in the
169f8 6a 6f 75 72 6e 61 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a journal...**..**
169f9 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 If a master jou
169fa 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 rnal file name i
169fb 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 s present at the
169fc 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 end of the jour
169fd 6e 61 6c 0d 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 nal..** file, th
169fe 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 en it is copied
169ff 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 into the buffer
16a00 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d pointed to by zM
16a01 61 73 74 65 72 2e 20 41 0d 0a 2a 2a 20 6e 75 6c aster. A..** nul
16a02 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 -terminator byte
16a03 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 is appended to
16a04 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f the buffer follo
16a05 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0d wing the master.
16a06 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 .** journal file
16a07 20 6e 61 6d 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 name...**..** I
16a08 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e f it is determin
16a09 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 ed that no maste
16a0a 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e r journal file n
16a0b 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0d ame is present .
16a0c 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 .** zMaster[0] i
16a0d 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 s set to 0 and S
16a0e 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 QLITE_OK returne
16a0f 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e d...**..** If an
16a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 error occurs wh
16a11 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d ile reading from
16a12 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
16a13 65 2c 20 61 6e 20 53 51 4c 69 74 65 0d 0a 2a 2a e, an SQLite..**
16a14 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 error code is r
16a15 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 eturned...*/..st
16a16 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 atic int readMas
16a17 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 terJournal(sqlit
16a18 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 e3_file *pJrnl,
16a19 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 char *zMaster, u
16a1a 33 32 20 6e 4d 61 73 74 65 72 29 7b 0d 0a 20 20 32 nMaster){..
16a1b 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
16a1c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
16a1d 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 turn code */..
16a1e 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 u32 len;
16a1f 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 /* Le
16a20 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 ngth in bytes of
16a21 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
16a22 6e 61 6d 65 20 2a 2f 0d 0a 20 20 69 36 34 20 73 name */.. i64 s
16a23 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 zJ;
16a24 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 /* Total s
16a25 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 ize in bytes of
16a26 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 journal file pJr
16a27 6e 6c 20 2a 2f 0d 0a 20 20 75 33 32 20 63 6b 73 nl */.. u32 cks
16a28 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 um;
16a29 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 /* MJ checks
16a2a 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 um value read fr
16a2b 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 om journal */..
16a2c 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 u32 u;
16a2d 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 /* U
16a2e 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 nsigned loop cou
16a2f 6e 74 65 72 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 nter */.. unsig
16a30 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b ned char aMagic[
16a31 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 8]; /* A buffe
16a32 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 r to hold the ma
16a33 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0d 0a 20 gic header */..
16a34 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c zMaster[0] = '\
16a35 30 27 3b 0d 0a 0d 0a 20 20 69 66 28 20 53 51 4c 0';.... if( SQL
16a36 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 ITE_OK!=(rc = sq
16a37 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 lite3OsFileSize(
16a38 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0d 0a 20 pJrnl, &szJ))..
16a39 20 20 7c 7c 20 73 7a 4a 3c 31 36 0d 0a 20 20 20 || szJ<16..
16a3a 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 || SQLITE_OK!=(r
16a3b 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 c = read32bits(p
16a3c 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c Jrnl, szJ-16, &l
16a3d 65 6e 29 29 0d 0a 20 20 20 7c 7c 20 6c 65 6e 3e en)).. || len>
16a3e 3d 6e 4d 61 73 74 65 72 20 0d 0a 20 20 20 7c 7c =nMaster .. ||
16a3f 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 SQLITE_OK!=(rc
16a40 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 = read32bits(pJr
16a41 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 nl, szJ-12, &cks
16a42 75 6d 29 29 0d 0a 20 20 20 7c 7c 20 53 51 4c 49 um)).. || SQLI
16a43 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c TE_OK!=(rc = sql
16a44 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c ite3OsRead(pJrnl
16a45 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a , aMagic, 8, szJ
16a46 2d 38 29 29 0d 0a 20 20 20 7c 7c 20 6d 65 6d 63 -8)).. || memc
16a47 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 mp(aMagic, aJour
16a48 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0d 0a 20 20 nalMagic, 8)..
16a49 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 || SQLITE_OK!=(
16a4a 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 rc = sqlite3OsRe
16a4b 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 ad(pJrnl, zMaste
16a4c 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c r, len, szJ-16-l
16a4d 65 6e 29 29 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 en)).. ){..
16a4e 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d return rc;.. }.
16a4f 0a 0d 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 ... /* See if t
16a50 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 he checksum matc
16a51 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a hes the master j
16a52 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0d 0a ournal name */..
16a53 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e for(u=0; u<len
16a54 3b 20 75 2b 2b 29 7b 0d 0a 20 20 20 20 63 6b 73 ; u++){.. cks
16a55 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d um -= zMaster[u]
16a56 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 63 6b ;.. }.. if( ck
16a57 73 75 6d 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 sum ){.. /* I
16a58 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 f the checksum d
16a59 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 oesn't add up, t
16a5a 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 hen one or more
16a5b 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 of the disk sect
16a5c 6f 72 73 0d 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 ors.. ** cont
16a5d 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 aining the maste
16a5e 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 r journal filena
16a5f 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e me is corrupted.
16a60 20 54 68 69 73 20 6d 65 61 6e 73 0d 0a 20 20 20 This means..
16a61 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 ** definitely r
16a62 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 oll back, so jus
16a63 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f t return SQLITE_
16a64 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 OK and report a
16a65 28 6e 75 6c 29 0d 0a 20 20 20 20 2a 2a 20 6d 61 (nul).. ** ma
16a66 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c ster-journal fil
16a67 65 6e 61 6d 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a ename... */..
16a68 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0d 0a 20 20 len = 0;..
16a69 7d 0d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e }.. zMaster[len
16a6a 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 0d 0a ] = '\0';.. ..
16a6b 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
16a6c 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a OK;..}..../*..**
16a6d 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 Return the offs
16a6e 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 et of the sector
16a6f 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 boundary at or
16a70 69 6d 6d 65 64 69 61 74 65 6c 79 20 0d 0a 2a 2a immediately ..**
16a71 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 following the v
16a72 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e alue in pPager->
16a73 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 journalOff, assu
16a74 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0d 0a ming a sector ..
16a75 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 ** size of pPage
16a76 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 r->sectorSize by
16a77 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 69 2e 65 tes...**..** i.e
16a78 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 for a sector si
16a79 7a 65 20 6f 66 20 35 31 32 3a 0d 0a 2a 2a 0d 0a ze of 512:..**..
16a7a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e ** Pager.journ
16a7b 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 alOff R
16a7c 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 2a 2a 20 eturn value..**
16a7d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
16a7e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a7f 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a 2a 20 20 20 ---------..**
16a80 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
16a81 20 20 20 20 20 20 20 20 20 20 30 0d 0a 2a 2a 20 0..**
16a82 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 512
16a83 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0d 512.
16a84 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 .** 100
16a85 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16a86 35 31 32 0d 0a 2a 2a 20 20 20 32 30 30 30 20 20 512..** 2000
16a87 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16a88 20 20 20 20 32 30 34 38 0d 0a 2a 2a 20 0d 0a 2a 2048..** ..*
16a89 2f 0d 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f /..static i64 jo
16a8a 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 urnalHdrOffset(P
16a8b 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a ager *pPager){..
16a8c 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 i64 offset = 0
16a8d 3b 0d 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 ;.. i64 c = pPa
16a8e 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b ger->journalOff;
16a8f 0d 0a 20 20 69 66 28 20 63 20 29 7b 0d 0a 20 20 .. if( c ){..
16a90 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 offset = ((c-1
16a91 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a )/JOURNAL_HDR_SZ
16a92 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 (pPager) + 1) *
16a93 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 JOURNAL_HDR_SZ(p
16a94 50 61 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 Pager);.. }..
16a95 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a assert( offset%J
16a96 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 OURNAL_HDR_SZ(pP
16a97 61 67 65 72 29 3d 3d 30 20 29 3b 0d 0a 20 20 61 ager)==0 );.. a
16a98 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 ssert( offset>=c
16a99 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 );.. assert( (
16a9a 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 offset-c)<JOURNA
16a9b 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 L_HDR_SZ(pPager)
16a9c 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 6f 66 );.. return of
16a9d 66 73 65 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a fset;..}..../*..
16a9e 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 ** The journal f
16a9f 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e ile must be open
16aa0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 when this funct
16aa1 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0d 0a ion is called...
16aa2 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 **..** This func
16aa3 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 tion is a no-op
16aa4 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 if the journal f
16aa5 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e ile has not been
16aa6 20 77 72 69 74 74 65 6e 20 74 6f 0d 0a 2a 2a 20 written to..**
16aa7 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 within the curre
16aa8 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 nt transaction (
16aa9 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f i.e. if Pager.jo
16aaa 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0d 0a 2a urnalOff==0)...*
16aab 2a 0d 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 *..** If doTrunc
16aac 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 ate is non-zero
16aad 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 or the Pager.jou
16aae 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 rnalSizeLimit va
16aaf 72 69 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 73 65 riable is..** se
16ab0 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 t to 0, then tru
16ab1 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 ncate the journa
16ab2 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 l file to zero b
16ab3 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 ytes in size. Ot
16ab4 68 65 72 77 69 73 65 2c 0d 0a 2a 2a 20 7a 65 72 herwise,..** zer
16ab5 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 o the 28-byte he
16ab6 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 ader at the star
16ab7 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c t of the journal
16ab8 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 file. In either
16ab9 20 63 61 73 65 2c 20 0d 0a 2a 2a 20 69 66 20 74 case, ..** if t
16aba 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 he pager is not
16abb 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c in no-sync mode,
16abc 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 sync the journa
16abd 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 l file immediate
16abe 6c 79 20 0d 0a 2a 2a 20 61 66 74 65 72 20 77 72 ly ..** after wr
16abf 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 iting or truncat
16ac0 69 6e 67 20 69 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ing it...**..**
16ac1 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c If Pager.journal
16ac2 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 SizeLimit is set
16ac3 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 to a positive,
16ac4 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 non-zero value,
16ac5 61 6e 64 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e and..** followin
16ac6 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e g the truncation
16ac7 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 or zeroing desc
16ac8 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 ribed above the
16ac9 73 69 7a 65 20 6f 66 20 74 68 65 20 0d 0a 2a 2a size of the ..**
16aca 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e journal file in
16acb 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 bytes is larger
16acc 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 than this value
16acd 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 , then truncate
16ace 74 68 65 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 the..** journal
16acf 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f file to Pager.jo
16ad0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 urnalSizeLimit b
16ad1 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 ytes. The journa
16ad2 6c 20 66 69 6c 65 20 64 6f 65 73 0d 0a 2a 2a 20 l file does..**
16ad3 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 not need to be s
16ad4 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 ynced following
16ad5 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0d this operation..
16ad6 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 49 4f .**..** If an IO
16ad7 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 error occurs, a
16ad8 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e bandon processin
16ad9 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 g and return the
16ada 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0d IO error code..
16adb 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 .** Otherwise, r
16adc 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
16add 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
16ade 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 zeroJournalHdr(
16adf 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 Pager *pPager, i
16ae0 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0d nt doTruncate){.
16ae1 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
16ae2 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 TE_OK;
16ae3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16ae4 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 /* Return c
16ae5 6f 64 65 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 ode */.. assert
16ae6 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d ( isOpen(pPager-
16ae7 3e 6a 66 64 29 20 29 3b 0d 0a 20 20 69 66 28 20 >jfd) );.. if(
16ae8 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f pPager->journalO
16ae9 66 66 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 ff ){.. const
16aea 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 i64 iLimit = pP
16aeb 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a ager->journalSiz
16aec 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f eLimit; /* Lo
16aed 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c cal cache of jsl
16aee 20 2a 2f 0d 0a 0d 0a 20 20 20 20 49 4f 54 52 41 */.... IOTRA
16aef 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 CE(("JZEROHDR %p
16af0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0d 0a 20 \n", pPager))..
16af1 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 if( doTruncat
16af2 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 e || iLimit==0 )
16af3 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 {.. rc = sq
16af4 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 lite3OsTruncate(
16af5 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b pPager->jfd, 0);
16af6 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
16af7 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
16af8 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 char zeroHdr[28
16af9 5d 20 3d 20 7b 30 7d 3b 0d 0a 20 20 20 20 20 20 ] = {0};..
16afa 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 rc = sqlite3OsWr
16afb 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c ite(pPager->jfd,
16afc 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 zeroHdr, sizeof
16afd 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0d 0a (zeroHdr), 0);..
16afe 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72 }.. if( r
16aff 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
16b00 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 !pPager->noSync
16b01 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 ){.. rc = s
16b02 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 qlite3OsSync(pPa
16b03 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 ger->jfd, SQLITE
16b04 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 _SYNC_DATAONLY|p
16b05 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 Pager->syncFlags
16b06 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 );.. }....
16b07 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e /* At this poin
16b08 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f t the transactio
16b09 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 n is committed b
16b0a 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 ut the write loc
16b0b 6b 20 0d 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 k .. ** is st
16b0c 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 ill held on the
16b0d 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 file. If there i
16b0e 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 s a size limit c
16b0f 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0d 0a onfigured for ..
16b10 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 ** the persi
16b11 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e stent journal an
16b12 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 d the journal fi
16b13 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e le currently con
16b14 73 75 6d 65 73 20 6d 6f 72 65 0d 0a 20 20 20 20 sumes more..
16b15 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 ** space than th
16b16 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 at limit allows
16b17 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 for, truncate it
16b18 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e now. There is n
16b19 6f 20 6e 65 65 64 0d 0a 20 20 20 20 2a 2a 20 74 o need.. ** t
16b1a 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 o sync the file
16b1b 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f following this o
16b1c 70 65 72 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 2a peration... *
16b1d 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 /.. if( rc==S
16b1e 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d QLITE_OK && iLim
16b1f 69 74 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 it>0 ){.. i
16b20 36 34 20 73 7a 3b 0d 0a 20 20 20 20 20 20 72 63 64 sz;.. rc
16b21 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 = sqlite3OsFile
16b22 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 Size(pPager->jfd
16b23 2c 20 26 73 7a 29 3b 0d 0a 20 20 20 20 20 20 69 , &sz);.. i
16b24 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
16b25 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b && sz>iLimit ){
16b26 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 .. rc = s
16b27 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 qlite3OsTruncate
16b28 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c (pPager->jfd, iL
16b29 69 6d 69 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d imit);.. }.
16b2a 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 . }.. }.. r
16b2b 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
16b2c 2f 2a 0d 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e /*..** The journ
16b2d 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 al file must be
16b2e 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 open when this r
16b2f 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 outine is called
16b30 2e 20 41 20 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 . A journal..**
16b31 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f header (JOURNAL_
16b32 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 HDR_SZ bytes) is
16b33 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 written into th
16b34 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 e journal file a
16b35 74 20 74 68 65 0d 0a 2a 2a 20 63 75 72 72 65 6e t the..** curren
16b36 74 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d t location...**.
16b37 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 .** The format f
16b38 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 or the journal h
16b39 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c eader is as foll
16b3a 6f 77 73 3a 0d 0a 2a 2a 20 2d 20 38 20 62 79 74 ows:..** - 8 byt
16b3b 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 es: Magic identi
16b3c 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f fying journal fo
16b3d 72 6d 61 74 2e 0d 0a 2a 2a 20 2d 20 34 20 62 79 rmat...** - 4 by
16b3e 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 tes: Number of r
16b3f 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 ecords in journa
16b40 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 l, or -1 no-sync
16b41 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0d 0a 2a 2a mode is on...**
16b42 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 - 4 bytes: Rand
16b43 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 om number used f
16b44 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0d 0a 2a or page hash...*
16b45 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 * - 4 bytes: Ini
16b46 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 tial database pa
16b47 67 65 20 63 6f 75 6e 74 2e 0d 0a 2a 2a 20 2d 20 ge count...** -
16b48 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 4 bytes: Sector
16b49 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 size used by the
16b4a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 process that wr
16b4b 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c ote this journal
16b4c 2e 0d 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a ...** - 4 bytes:
16b4d 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 Database page s
16b4e 69 7a 65 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 46 6f ize...** ..** Fo
16b4f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e llowed by (JOURN
16b50 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 AL_HDR_SZ - 28)
16b51 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 bytes of unused
16b52 73 70 61 63 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 space...*/..stat
16b53 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 ic int writeJour
16b54 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 nalHdr(Pager *pP
16b55 61 67 65 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 ager){.. int rc
16b56 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 = SQLITE_OK;
16b57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
16b58 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d Return code */.
16b59 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 . char *zHeader
16b5a 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 = pPager->pTmpS
16b5b 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 pace; /* Tempor
16b5c 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 ary space used t
16b5d 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a o build header *
16b5e 2f 0d 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 /.. u32 nHeader
16b5f 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e = (u32)pPager->
16b60 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 pageSize;/* Size
16b61 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 of buffer point
16b62 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 ed to by zHeader
16b63 20 2a 2f 0d 0a 20 20 75 33 32 20 6e 57 72 69 74 */.. u32 nWrit
16b64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
16b65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 /* By
16b66 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 tes of header se
16b67 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0d ctor written */.
16b68 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 . int ii;
16b69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16b6a 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 /* Loop c
16b6b 6f 75 6e 74 65 72 20 2a 2f 0d 0a 0d 0a 20 20 61 ounter */.... a
16b6c 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 ssert( isOpen(pP
16b6d 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 ager->jfd) );
16b6e 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 /* Journal fi
16b6f 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e le must be open.
16b70 20 2a 2f 0d 0a 0d 0a 20 20 69 66 28 20 6e 48 65 */.... if( nHe
16b71 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 ader>JOURNAL_HDR
16b72 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0d 0a _SZ(pPager) ){..
16b73 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f nHeader = JO
16b74 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 URNAL_HDR_SZ(pPa
16b75 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 ger);.. }....
16b76 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 /* If there are
16b77 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 active savepoint
16b78 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 s and any of the
16b79 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0d m were created .
16b7a 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 . ** since the
16b7b 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 most recent jour
16b7c 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 nal header was w
16b7d 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 ritten, update t
16b7e 68 65 20 0d 0a 20 20 2a 2a 20 50 61 67 65 72 53 he .. ** PagerS
16b7f 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 avepoint.iHdrOff
16b80 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0d set fields now..
16b81 0a 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 69 3d . */.. for(ii=
16b82 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 0; ii<pPager->nS
16b83 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b avepoint; ii++){
16b84 0d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 .. if( pPager
16b85 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d ->aSavepoint[ii]
16b86 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 .iHdrOffset==0 )
16b87 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d {.. pPager-
16b88 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e >aSavepoint[ii].
16b89 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 iHdrOffset = pPa
16b8a 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b ger->journalOff;
16b8b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
16b8c 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 pPager->journa
16b8d 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a lHdr = pPager->j
16b8e 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 ournalOff = jour
16b8f 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 nalHdrOffset(pPa
16b90 67 65 72 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 0d 0a ger);.... /* ..
16b91 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e ** Write the n
16b92 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 Rec Field - the
16b93 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 number of page r
16b94 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c ecords that foll
16b95 6f 77 20 74 68 69 73 0d 0a 20 20 2a 2a 20 6a 6f ow this.. ** jo
16b96 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f urnal header. No
16b97 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 rmally, zero is
16b98 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 written to this
16b99 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 value at this ti
16b9a 6d 65 2e 0d 0a 20 20 2a 2a 20 41 66 74 65 72 20 me... ** After
16b9b 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 the records are
16b9c 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 added to the jou
16b9d 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f rnal (and the jo
16b9e 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0d 0a urnal synced, ..
16b9f 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d ** if in full-
16ba0 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 sync mode), the
16ba1 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 zero is overwrit
16ba2 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 ten with the tru
16ba3 65 20 6e 75 6d 62 65 72 0d 0a 20 20 2a 2a 20 6f e number.. ** o
16ba4 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 f records (see s
16ba5 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0d 0a yncJournal())...
16ba6 20 20 2a 2a 0d 0a 20 20 2a 2a 20 41 20 66 61 73 **.. ** A fas
16ba7 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 ter alternative
16ba8 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 is to write 0xFF
16ba9 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 FFFFFF to the nR
16baa 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0d 0a ec field. When..
16bab 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 ** reading the
16bac 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 journal this va
16bad 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 lue tells SQLite
16bae 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 to assume that
16baf 74 68 65 0d 0a 20 20 2a 2a 20 72 65 73 74 20 6f the.. ** rest o
16bb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 f the journal fi
16bb1 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 le contains vali
16bb2 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 d page records.
16bb3 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0d This assumption.
16bb4 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f . ** is dangero
16bb5 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c us, as if a fail
16bb6 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 ure occurred whi
16bb7 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 lst writing to t
16bb8 68 65 20 6a 6f 75 72 6e 61 6c 0d 0a 20 20 2a 2a he journal.. **
16bb9 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e file it may con
16bba 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 tain some garbag
16bbb 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 e data. There ar
16bbc 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0d e two scenarios.
16bbd 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 . ** where this
16bbe 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e risk can be ign
16bbf 6f 72 65 64 3a 0d 0a 20 20 2a 2a 0d 0a 20 20 2a ored:.. **.. *
16bc0 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 * * When the p
16bc1 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 ager is in no-sy
16bc2 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 nc mode. Corrupt
16bc3 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 ion can follow a
16bc4 0d 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 .. ** power
16bc5 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 failure in this
16bc6 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0d 0a 20 case anyway...
16bc7 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 2a 20 57 68 **.. ** * Wh
16bc8 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f en the SQLITE_IO
16bc9 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 CAP_SAFE_APPEND
16bca 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 flag is set. Thi
16bcb 73 20 67 75 61 72 61 6e 74 65 65 73 0d 0a 20 20 s guarantees..
16bcc 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 ** that garb
16bcd 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 age data is neve
16bce 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 r appended to th
16bcf 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0d e journal file..
16bd0 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 . */.. assert(
16bd1 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e isOpen(pPager->
16bd2 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e fd) || pPager->n
16bd3 6f 53 79 6e 63 20 29 3b 0d 0a 20 20 69 66 28 20 oSync );.. if(
16bd4 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c pPager->noSync |
16bd5 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e | (pPager->journ
16bd6 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f alMode==PAGER_JO
16bd7 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 URNALMODE_MEMORY
16bd8 29 0d 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 ).. || (sqlite
16bd9 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 3OsDeviceCharact
16bda 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d eristics(pPager-
16bdb 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 >fd)&SQLITE_IOCA
16bdc 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0d P_SAFE_APPEND) .
16bdd 0a 20 20 29 7b 0d 0a 20 20 20 20 6d 65 6d 63 70 . ){.. memcp
16bde 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 y(zHeader, aJour
16bdf 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 nalMagic, sizeof
16be0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 (aJournalMagic))
16be1 3b 0d 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 ;.. put32bits
16be2 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 (&zHeader[sizeof
16be3 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d (aJournalMagic)]
16be4 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0d 0a , 0xffffffff);..
16be5 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6d 65 }else{.. me
16be6 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c mset(zHeader, 0,
16be7 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c sizeof(aJournal
16be8 4d 61 67 69 63 29 2b 34 29 3b 0d 0a 20 20 7d 0d Magic)+4);.. }.
16be9 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 ... /* The rand
16bea 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e om check-hash in
16beb 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0d 0a 20 itialiser */ ..
16bec 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e sqlite3_randomn
16bed 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 ess(sizeof(pPage
16bee 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 r->cksumInit), &
16bef 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 pPager->cksumIni
16bf0 74 29 3b 0d 0a 20 20 70 75 74 33 32 62 69 74 73 t);.. put32bits
16bf1 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 (&zHeader[sizeof
16bf2 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b (aJournalMagic)+
16bf3 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 4], pPager->cksu
16bf4 6d 49 6e 69 74 29 3b 0d 0a 20 20 2f 2a 20 54 68 mInit);.. /* Th
16bf5 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 e initial databa
16bf6 73 65 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 70 75 se size */.. pu
16bf7 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 t32bits(&zHeader
16bf8 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c [sizeof(aJournal
16bf9 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 Magic)+8], pPage
16bfa 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0d r->dbOrigSize);.
16bfb 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 . /* The assume
16bfc 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f d sector size fo
16bfd 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a r this process *
16bfe 2f 0d 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 /.. put32bits(&
16bff 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 zHeader[sizeof(a
16c00 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 JournalMagic)+12
16c01 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f ], pPager->secto
16c02 72 53 69 7a 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 rSize);.... /*
16c03 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f The page size */
16c04 0d 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a .. put32bits(&z
16c05 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a Header[sizeof(aJ
16c06 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d ournalMagic)+16]
16c07 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 , pPager->pageSi
16c08 7a 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69 ze);.... /* Ini
16c09 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 tializing the ta
16c0a 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 il of the buffer
16c0b 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 is not necessar
16c0c 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0d 0a y. Everything..
16c0d 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 ** works find
16c0e 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 if the following
16c0f 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 memset() is omi
16c10 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 tted. But initi
16c11 61 6c 69 7a 69 6e 67 0d 0a 20 20 2a 2a 20 74 68 alizing.. ** th
16c12 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 e memory prevent
16c13 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 s valgrind from
16c14 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 complaining, so
16c15 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 we are willing t
16c16 6f 0d 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 o.. ** take the
16c17 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 performance hit
16c18 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 6d 65 6d 73 65 ... */.. memse
16c19 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f t(&zHeader[sizeo
16c1a 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 f(aJournalMagic)
16c1b 2b 32 30 5d 2c 20 30 2c 0d 0a 20 20 20 20 20 20 +20], 0,..
16c1c 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 nHeader-(size
16c1d 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 of(aJournalMagic
16c1e 29 2b 32 30 29 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 )+20));.... /*
16c1f 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 In theory, it is
16c20 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 only necessary
16c21 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 to write the 28
16c22 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0d bytes that the .
16c23 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 . ** journal he
16c24 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f ader consumes to
16c25 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
16c26 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 e here. Then inc
16c27 72 65 6d 65 6e 74 20 74 68 65 20 0d 0a 20 20 2a rement the .. *
16c28 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f * Pager.journalO
16c29 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a ff variable by J
16c2a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f OURNAL_HDR_SZ so
16c2b 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0d that the next .
16c2c 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 . ** record is
16c2d 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 written to the f
16c2e 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 ollowing sector
16c2f 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 (leaving a gap i
16c30 6e 20 74 68 65 20 66 69 6c 65 0d 0a 20 20 2a 2a n the file.. **
16c31 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d that will be im
16c32 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 plicitly filled
16c33 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0d 0a in by the OS)...
16c34 20 20 2a 2a 0d 0a 20 20 2a 2a 20 48 6f 77 65 76 **.. ** Howev
16c35 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 er it has been d
16c36 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f iscovered that o
16c37 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 n some systems t
16c38 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 his pattern can
16c39 0d 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 .. ** be signif
16c3a 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 icantly slower t
16c3b 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 han contiguously
16c3c 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f writing data to
16c3d 20 74 68 65 20 66 69 6c 65 2c 0d 0a 20 20 2a 2a the file,.. **
16c3e 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 even if that me
16c3f 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 ans explicitly w
16c40 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 riting data to t
16c41 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0d 0a 20 20 he block of ..
16c42 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f ** (JOURNAL_HDR_
16c43 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 SZ - 28) bytes t
16c44 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 hat will not be
16c45 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 used. So that is
16c46 20 77 68 61 74 0d 0a 20 20 2a 2a 20 69 73 20 64 what.. ** is d
16c47 6f 6e 65 2e 20 0d 0a 20 20 2a 2a 0d 0a 20 20 2a one. .. **.. *
16c48 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 * The loop is re
16c49 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 quired here in c
16c4a 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 ase the sector-s
16c4b 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 ize is larger th
16c4c 61 6e 20 74 68 65 20 0d 0a 20 20 2a 2a 20 64 61 an the .. ** da
16c4d 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 tabase page size
16c4e 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 . Since the zHea
16c4f 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e der buffer is on
16c50 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a ly Pager.pageSiz
16c51 65 0d 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e e.. ** bytes in
16c52 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e size, more than
16c53 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c one call to sql
16c54 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 ite3OsWrite() ma
16c55 79 20 62 65 20 72 65 71 75 69 72 65 64 0d 0a 20 y be required..
16c56 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 ** to populate
16c57 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e the entire journ
16c58 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 al header sector
16c59 2e 0d 0a 20 20 2a 2f 20 0d 0a 20 20 66 6f 72 28 ... */ .. for(
16c5a 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 nWrite=0; rc==SQ
16c5b 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c LITE_OK&&nWrite<
16c5c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 JOURNAL_HDR_SZ(p
16c5d 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d Pager); nWrite+=
16c5e 6e 48 65 61 64 65 72 29 7b 0d 0a 20 20 20 20 49 nHeader){.. I
16c5f 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 OTRACE(("JHDR %p
16c60 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 %lld %d\n", pPa
16c61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 ger, pPager->jou
16c62 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 rnalHdr, nHeader
16c63 29 29 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c )).. rc = sql
16c64 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 ite3OsWrite(pPag
16c65 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 er->jfd, zHeader
16c66 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 , nHeader, pPage
16c67 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0d r->journalOff);.
16c68 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 . assert( pPa
16c69 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 ger->journalHdr
16c6a 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e <= pPager->journ
16c6b 61 6c 4f 66 66 20 29 3b 0d 0a 20 20 20 20 70 50 alOff );.. pP
16c6c 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 ager->journalOff
16c6d 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0d 0a 20 20 += nHeader;..
16c6e 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.... return rc
16c6f 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 ;..}..../*..** T
16c70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 he journal file
16c71 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 must be open whe
16c72 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 n this is called
16c73 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 . A journal head
16c74 65 72 20 66 69 6c 65 0d 0a 2a 2a 20 28 4a 4f 55 er file..** (JOU
16c75 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 RNAL_HDR_SZ byte
16c76 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 s) is read from
16c77 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 the current loca
16c78 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 tion in the jour
16c79 6e 61 6c 0d 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 nal..** file. Th
16c7a 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 e current locati
16c7b 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 on in the journa
16c7c 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 l file is given
16c7d 62 79 0d 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a by..** pPager->j
16c7e 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 ournalOff. See c
16c7f 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 omments above fu
16c80 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 nction writeJour
16c81 6e 61 6c 48 64 72 28 29 20 66 6f 72 0d 0a 2a 2a nalHdr() for..**
16c82 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f a description o
16c83 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 f the journal he
16c84 61 64 65 72 20 66 6f 72 6d 61 74 2e 0d 0a 2a 2a ader format...**
16c85 0d 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 ..** If the head
16c86 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 er is read succe
16c87 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 ssfully, *pNRec
16c88 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 is set to the nu
16c89 6d 62 65 72 20 6f 66 0d 0a 2a 2a 20 70 61 67 65 mber of..** page
16c8a 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 records followi
16c8b 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 ng this header a
16c8c 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 nd *pDbSize is s
16c8d 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f et to the size o
16c8e 66 20 74 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 f the..** databa
16c8f 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 se before the tr
16c90 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c ansaction began,
16c91 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c in pages. Also,
16c92 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e pPager->cksumIn
16c93 69 74 0d 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f it..** is set to
16c94 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 the value read
16c95 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c from the journal
16c96 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f header. SQLITE_
16c97 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0d 0a OK is returned..
16c98 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e ** in this case.
16c99 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 ..**..** If the
16c9a 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 journal header f
16c9b 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 ile appears to b
16c9c 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c e corrupted, SQL
16c9d 49 54 45 5f 44 4f 4e 45 20 69 73 0d 0a 2a 2a 20 ITE_DONE is..**
16c9e 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e returned and *pN
16c9f 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 Rec and *PDbSize
16ca0 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 are undefined.
16ca1 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f If JOURNAL_HDR_
16ca2 53 5a 20 62 79 74 65 73 0d 0a 2a 2a 20 63 61 6e SZ bytes..** can
16ca3 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d not be read from
16ca4 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
16ca5 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 e an error code
16ca6 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f is returned...*/
16ca7 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 ..static int rea
16ca8 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0d 0a 20 20 dJournalHdr(..
16ca9 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 Pager *pPager,
16caa 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
16cab 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0d Pager object */.
16cac 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0d 0a 20 . int isHot,..
16cad 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 i64 journalSize
16cae 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a , /*
16caf 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 Size of the ope
16cb0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 n journal file i
16cb1 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 75 33 n bytes */.. u3
16cb2 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 2 *pNRec,
16cb3 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 /* OU
16cb4 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 T: Value read fr
16cb5 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c om the nRec fiel
16cb6 64 20 2a 2f 0d 0a 20 20 75 33 32 20 2a 70 44 62 d */.. u32 *pDb
16cb7 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 Size
16cb8 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c /* OUT: Val
16cb9 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 ue of original d
16cba 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 atabase size fie
16cbb 6c 64 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 ld */..){.. int
16cbc 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
16cbd 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 /* Ret
16cbe 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 75 urn code */.. u
16cbf 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 nsigned char aMa
16cc0 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 gic[8]; /* A
16cc1 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 buffer to hold
16cc2 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 the magic header
16cc3 20 2a 2f 0d 0a 20 20 69 36 34 20 69 48 64 72 4f */.. i64 iHdrO
16cc4 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ff;
16cc5 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 /* Offset of
16cc6 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 journal header
16cc7 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0d 0a 0d being read */...
16cc8 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 . assert( isOpe
16cc9 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 n(pPager->jfd) )
16cca 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 ; /* Journa
16ccb 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f l file must be o
16ccc 70 65 6e 2e 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 pen. */.... /*
16ccd 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f Advance Pager.jo
16cce 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 urnalOff to the
16ccf 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 start of the nex
16cd0 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 t sector. If the
16cd1 0d 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 .. ** journal f
16cd2 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c ile is too small
16cd3 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 for there to be
16cd4 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 a header stored
16cd5 20 61 74 20 74 68 69 73 0d 0a 20 20 2a 2a 20 70 at this.. ** p
16cd6 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c oint, return SQL
16cd7 49 54 45 5f 44 4f 4e 45 2e 0d 0a 20 20 2a 2f 0d ITE_DONE... */.
16cd8 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e . pPager->journ
16cd9 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 alOff = journalH
16cda 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 drOffset(pPager)
16cdb 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d ;.. if( pPager-
16cdc 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 >journalOff+JOUR
16cdd 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 NAL_HDR_SZ(pPage
16cde 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 r) > journalSize
16cdf 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
16ce0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0d 0a 20 20 SQLITE_DONE;..
16ce1 7d 0d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 }.. iHdrOff = p
16ce2 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 Pager->journalOf
16ce3 66 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 61 64 20 f;.... /* Read
16ce4 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 in the first 8 b
16ce5 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 ytes of the jour
16ce6 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 nal header. If t
16ce7 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 hey do not match
16ce8 0d 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 .. ** the magi
16ce9 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 c string found a
16cea 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 t the start of e
16ceb 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 ach journal head
16cec 65 72 2c 20 72 65 74 75 72 6e 0d 0a 20 20 2a 2a er, return.. **
16ced 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 SQLITE_DONE. If
16cee 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 an IO error occ
16cef 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 urs, return an e
16cf0 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 rror code. Other
16cf1 77 69 73 65 2c 0d 0a 20 20 2a 2a 20 70 72 6f 63 wise,.. ** proc
16cf2 65 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 eed... */.. if
16cf3 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f ( isHot || iHdrO
16cf4 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 ff!=pPager->jour
16cf5 6e 61 6c 48 64 72 20 29 7b 0d 0a 20 20 20 20 72 nalHdr ){.. r
16cf6 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 c = sqlite3OsRea
16cf7 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 d(pPager->jfd, a
16cf8 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d Magic, sizeof(aM
16cf9 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b agic), iHdrOff);
16cfa 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0d .. if( rc ){.
16cfb 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 . return rc
16cfc 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 ;.. }.. if
16cfd 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c ( memcmp(aMagic,
16cfe 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 aJournalMagic,
16cff 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 sizeof(aMagic))!
16d00 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 =0 ){.. ret
16d01 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b urn SQLITE_DONE;
16d02 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
16d03 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 /* Read the fi
16d04 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 rst three 32-bit
16d05 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a fields of the j
16d06 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 ournal header: T
16d07 68 65 20 6e 52 65 63 0d 0a 20 20 2a 2a 20 66 69 he nRec.. ** fi
16d08 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 eld, the checksu
16d09 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e m-initializer an
16d0a 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 d the database s
16d0b 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 ize at the start
16d0c 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 .. ** of the tr
16d0d 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 ansaction. Retur
16d0e 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 n an error code
16d0f 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 if anything goes
16d10 20 77 72 6f 6e 67 2e 0d 0a 20 20 2a 2f 0d 0a 20 wrong... */..
16d11 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d if( SQLITE_OK!=
16d12 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 (rc = read32bits
16d13 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 (pPager->jfd, iH
16d14 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 drOff+8, pNRec))
16d15 0d 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f .. || SQLITE_O
16d16 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 K!=(rc = read32b
16d17 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c its(pPager->jfd,
16d18 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 iHdrOff+12, &pP
16d19 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 ager->cksumInit)
16d1a 29 0d 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f ).. || SQLITE_
16d1b 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 OK!=(rc = read32
16d1c 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 bits(pPager->jfd
16d1d 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 , iHdrOff+16, pD
16d1e 62 53 69 7a 65 29 29 0d 0a 20 20 29 7b 0d 0a 20 bSize)).. ){..
16d1f 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
16d20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61 67 }.... if( pPag
16d21 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d er->journalOff==
16d22 30 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 69 50 0 ){.. u32 iP
16d23 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 ageSize;
16d24 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 /* Page-s
16d25 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 ize field of jou
16d26 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0d 0a rnal header */..
16d27 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 u32 iSectorS
16d28 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ize;
16d29 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 /* Sector-size
16d2a 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c field of journal
16d2b 20 68 65 61 64 65 72 20 2a 2f 0d 0a 0d 0a 20 20 header */....
16d2c 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 /* Read the pa
16d2d 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 ge-size and sect
16d2e 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 or-size journal
16d2f 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a header fields. *
16d30 2f 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 /.. if( SQLIT
16d31 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 E_OK!=(rc = read
16d32 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 32bits(pPager->j
16d33 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 fd, iHdrOff+20,
16d34 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0d 0a &iSectorSize))..
16d35 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f || SQLITE_O
16d36 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 K!=(rc = read32b
16d37 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c its(pPager->jfd,
16d38 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 iHdrOff+24, &iP
16d39 61 67 65 53 69 7a 65 29 29 0d 0a 20 20 20 20 29 ageSize)).. )
16d3a 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 {.. return
16d3b 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 rc;.. }....
16d3c 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 /* Versions of
16d3d 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f SQLite prior to
16d3e 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 3.5.8 set the p
16d3f 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f age-size field o
16d40 66 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 6a 6f f the.. ** jo
16d41 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 urnal header to
16d42 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 zero. In this ca
16d43 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 se, assume that
16d44 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 the Pager.pageSi
16d45 7a 65 0d 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 ze.. ** varia
16d46 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 ble is already s
16d47 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 et to the correc
16d48 74 20 70 61 67 65 20 73 69 7a 65 2e 0d 0a 20 20 t page size...
16d49 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 69 50 */.. if( iP
16d4a 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0d 0a 20 ageSize==0 ){..
16d4b 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d iPageSize =
16d4c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a pPager->pageSiz
16d4d 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 e;.. }....
16d4e 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 /* Check that t
16d4f 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 he values read f
16d50 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a rom the page-siz
16d51 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a e and sector-siz
16d52 65 20 66 69 65 6c 64 73 0d 0a 20 20 20 20 2a 2a e fields.. **
16d53 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 are within rang
16d54 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e e. To be 'in ran
16d55 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 ge', both values
16d56 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f need to be a po
16d57 77 65 72 0d 0a 20 20 20 20 2a 2a 20 6f 66 20 74 wer.. ** of t
16d58 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 wo greater than
16d59 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 or equal to 512
16d5a 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 or 32, and not g
16d5b 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 reater than thei
16d5c 72 20 0d 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 r .. ** respe
16d5d 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 ctive compile ti
16d5e 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 me maximum limit
16d5f 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 s... */..
16d60 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 if( iPageSize<51
16d61 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2
16d62 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a || iSectorSiz
16d63 65 3c 33 32 0d 0a 20 20 20 20 20 7c 7c 20 69 50 e<32.. || iP
16d64 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d ageSize>SQLITE_M
16d65 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 AX_PAGE_SIZE ||
16d66 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f iSectorSize>MAX_
16d67 53 45 43 54 4f 52 5f 53 49 5a 45 0d 0a 20 20 20 SECTOR_SIZE..
16d68 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 || ((iPageSize
16d69 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d -1)&iPageSize)!=
16d6a 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 0 || ((iSector
16d6b 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 Size-1)&iSectorS
16d6c 69 7a 65 29 21 3d 30 20 0d 0a 20 20 20 20 29 7b ize)!=0 .. ){
16d6d 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 .. /* If th
16d6e 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 e either the pag
16d6f 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 e-size or sector
16d70 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 -size in the jou
16d71 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0d rnal-header is .
16d72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 . ** invali
16d73 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 d, then the proc
16d74 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 ess that wrote t
16d75 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 he journal-heade
16d76 72 20 6d 75 73 74 20 68 61 76 65 20 0d 0a 20 20 r must have ..
16d77 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 ** crashed b
16d78 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 efore the header
16d79 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 was synced. In
16d7a 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 this case stop r
16d7b 65 61 64 69 6e 67 20 0d 0a 20 20 20 20 20 20 2a eading .. *
16d7c 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 * the journal fi
16d7d 6c 65 20 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 le here...
16d7e 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e */.. return
16d7f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0d 0a 20 SQLITE_DONE;..
16d80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 55 }.... /* U
16d81 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 pdate the page-s
16d82 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 ize to match the
16d83 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d value read from
16d84 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0d 0a the journal. ..
16d85 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 ** Use a tes
16d86 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f tcase() macro to
16d87 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
16d88 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 malloc failure w
16d89 69 74 68 69 6e 20 0d 0a 20 20 20 20 2a 2a 20 50 ithin .. ** P
16d8a 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 agerSetPagesize(
16d8b 29 20 69 73 20 74 65 73 74 65 64 2e 0d 0a 20 20 ) is tested...
16d8c 20 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 73 */.. rc = s
16d8d 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 qlite3PagerSetPa
16d8e 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 gesize(pPager, &
16d8f 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0d iPageSize, -1);.
16d90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 . testcase( r
16d91 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d c!=SQLITE_OK );.
16d92 0a 0d 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 ... /* Update
16d93 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 the assumed sec
16d94 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 tor-size to matc
16d95 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 h the value used
16d96 20 62 79 20 0d 0a 20 20 20 20 2a 2a 20 74 68 65 by .. ** the
16d97 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 process that cr
16d98 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e eated this journ
16d99 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 al. If this jour
16d9a 6e 61 6c 20 77 61 73 0d 0a 20 20 20 20 2a 2a 20 nal was.. **
16d9b 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f created by a pro
16d9c 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 cess other than
16d9d 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 this one, then t
16d9e 68 69 73 20 72 6f 75 74 69 6e 65 0d 0a 20 20 20 his routine..
16d9f 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c ** is being cal
16da0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 led from within
16da1 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 pager_playback()
16da2 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 . The local valu
16da3 65 0d 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 e.. ** of Pag
16da4 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 er.sectorSize is
16da5 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 restored at the
16da6 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 end of that rou
16da7 74 69 6e 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 tine... */..
16da8 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f pPager->secto
16da9 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 rSize = iSectorS
16daa 69 7a 65 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 ize;.. }.... p
16dab 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 Pager->journalOf
16dac 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 f += JOURNAL_HDR
16dad 5f 53 5a 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 _SZ(pPager);..
16dae 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
16daf 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 .../*..** Write
16db0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 the supplied mas
16db1 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 ter journal name
16db2 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 into the journa
16db3 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 l file for pager
16db4 0d 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 ..** pPager at t
16db5 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 he current locat
16db6 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 ion. The master
16db7 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 journal name mus
16db8 74 20 62 65 20 74 68 65 20 6c 61 73 74 0d 0a 2a t be the last..*
16db9 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 * thing written
16dba 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c to a journal fil
16dbb 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 e. If the pager
16dbc 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 is in full-sync
16dbd 6d 6f 64 65 2c 20 74 68 65 0d 0a 2a 2a 20 6a 6f mode, the..** jo
16dbe 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 urnal file descr
16dbf 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 iptor is advance
16dc0 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 d to the next se
16dc1 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 ctor boundary be
16dc2 66 6f 72 65 0d 0a 2a 2a 20 61 6e 79 74 68 69 6e fore..** anythin
16dc3 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 g is written. Th
16dc4 65 20 66 6f 72 6d 61 74 20 69 73 3a 0d 0a 2a 2a e format is:..**
16dc5 0d 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 ..** + 4 bytes
16dc6 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e : PAGER_MJ_PGNO.
16dc7 0d 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 ..** + N bytes
16dc8 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c : Master journal
16dc9 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 filename in utf
16dca 2d 38 2e 0d 0a 2a 2a 20 20 20 2b 20 34 20 62 79 -8...** + 4 by
16dcb 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f tes: N (length o
16dcc 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c f master journal
16dcd 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 name in bytes,
16dce 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f no nul-terminato
16dcf 72 29 2e 0d 0a 2a 2a 20 20 20 2b 20 34 20 62 79 r)...** + 4 by
16dd0 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 tes: Master jour
16dd1 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 nal name checksu
16dd2 6d 2e 0d 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 m...** + 8 byt
16dd3 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 es: aJournalMagi
16dd4 63 5b 5d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 c[]...**..** The
16dd5 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
16dd6 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 page checksum is
16dd7 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 the sum of the
16dd8 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 bytes in the mas
16dd9 74 65 72 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 ter..** journal
16dda 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 name, where each
16ddb 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 byte is interpr
16ddc 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 eted as a signed
16ddd 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0d 8-bit integer..
16dde 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 .**..** If zMast
16ddf 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 er is a NULL poi
16de0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 nter (occurs for
16de1 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 a single databa
16de2 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c se transaction),
16de3 20 0d 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 ..** this call
16de4 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d is a no-op...*/.
16de5 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 .static int writ
16de6 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 eMasterJournal(P
16de7 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f ager *pPager, co
16de8 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 nst char *zMaste
16de9 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 r){.. int rc;
16dea 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16deb 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
16dec 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 n code */.. int
16ded 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 nMaster;
16dee 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
16def 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e Length of strin
16df0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0d 0a 20 20 g zMaster */..
16df1 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 i64 iHdrOff;
16df2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16df3 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 /* Offset of he
16df4 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 ader in journal
16df5 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 36 34 20 6a file */.. i64 j
16df6 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 rnlSize;
16df7 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
16df8 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 ize of journal f
16df9 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0d 0a ile on disk */..
16dfa 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b u32 cksum = 0;
16dfb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16dfc 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f /* Checksum o
16dfd 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 f string zMaster
16dfe 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 */.... assert(
16dff 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 pPager->setMast
16e00 65 72 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 er==0 );.. asse
16e01 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c rt( !pagerUseWal
16e02 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 0d 0a 20 (pPager) );....
16e03 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0d 0a if( !zMaster ..
16e04 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f || pPager->jo
16e05 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 urnalMode==PAGER
16e06 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d _JOURNALMODE_MEM
16e07 4f 52 59 20 0d 0a 20 20 20 7c 7c 20 70 50 61 67 ORY .. || pPag
16e08 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d er->journalMode=
16e09 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
16e0a 44 45 5f 4f 46 46 20 0d 0a 20 20 29 7b 0d 0a 20 DE_OFF .. ){..
16e0b 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
16e0c 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 _OK;.. }.. pPa
16e0d 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d ger->setMaster =
16e0e 20 31 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 1;.. assert( i
16e0f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 sOpen(pPager->jf
16e10 64 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 d) );.. assert(
16e11 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
16e12 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a Hdr <= pPager->j
16e13 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0d 0a 0d 0a ournalOff );....
16e14 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 /* Calculate t
16e15 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 he length in byt
16e16 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b es and the check
16e17 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a sum of zMaster *
16e18 2f 0d 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 /.. for(nMaster
16e19 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 =0; zMaster[nMas
16e1a 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 ter]; nMaster++)
16e1b 7b 0d 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 {.. cksum +=
16e1c 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d zMaster[nMaster]
16e1d 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 ;.. }.... /* I
16e1e 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d f in full-sync m
16e1f 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 ode, advance to
16e20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 the next disk se
16e21 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 ctor before writ
16e22 69 6e 67 0d 0a 20 20 2a 2a 20 74 68 65 20 6d 61 ing.. ** the ma
16e23 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d ster journal nam
16e24 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 e. This is in ca
16e25 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 se the previous
16e26 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0d page written to.
16e27 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 . ** the journa
16e28 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 l has already be
16e29 65 6e 20 73 79 6e 63 65 64 2e 0d 0a 20 20 2a 2f en synced... */
16e2a 0d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e .. if( pPager->
16e2b 66 75 6c 6c 53 79 6e 63 20 29 7b 0d 0a 20 20 20 fullSync ){..
16e2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
16e2d 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 Off = journalHdr
16e2e 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0d Offset(pPager);.
16e2f 0a 20 20 7d 0d 0a 20 20 69 48 64 72 4f 66 66 20 . }.. iHdrOff
16e30 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 = pPager->journa
16e31 6c 4f 66 66 3b 0d 0a 0d 0a 20 20 2f 2a 20 57 72 lOff;.... /* Wr
16e32 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a ite the master j
16e33 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 ournal data to t
16e34 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f he end of the jo
16e35 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0d 0a urnal file. If..
16e36 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 ** an error oc
16e37 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 curs, return the
16e38 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 error code to t
16e39 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 2a 2f he caller... */
16e3a 0d 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 .. if( (0 != (r
16e3b 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 c = write32bits(
16e3c 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 pPager->jfd, iHd
16e3d 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 rOff, PAGER_MJ_P
16e3e 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0d 0a GNO(pPager))))..
16e3f 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 || (0 != (rc
16e40 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 = sqlite3OsWrite
16e41 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d (pPager->jfd, zM
16e42 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 aster, nMaster,
16e43 69 48 64 72 4f 66 66 2b 34 29 29 29 0d 0a 20 20 iHdrOff+4)))..
16e44 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 || (0 != (rc =
16e45 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 write32bits(pPag
16e46 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 er->jfd, iHdrOff
16e47 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 +4+nMaster, nMas
16e48 74 65 72 29 29 29 0d 0a 20 20 20 7c 7c 20 28 30 ter))).. || (0
16e49 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 != (rc = write3
16e4a 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 2bits(pPager->jf
16e4b 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 d, iHdrOff+4+nMa
16e4c 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 ster+4, cksum)))
16e4d 0d 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 .. || (0 != (r
16e4e 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 c = sqlite3OsWri
16e4f 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 te(pPager->jfd,
16e50 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 aJournalMagic, 8
16e51 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 , iHdrOff+4+nMas
16e52 74 65 72 2b 38 29 29 29 0d 0a 20 20 29 7b 0d 0a ter+8))).. ){..
16e53 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
16e54 20 20 7d 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6a }.. pPager->j
16e55 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d ournalOff += (nM
16e56 61 73 74 65 72 2b 32 30 29 3b 0d 0a 0d 0a 20 20 aster+20);....
16e57 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 /* If the pager
16e58 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d is in peristent-
16e59 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 journal mode, th
16e5a 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 en the physical
16e5b 0d 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 .. ** journal-f
16e5c 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 ile may extend p
16e5d 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 ast the end of t
16e5e 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 he master-journa
16e5f 6c 20 6e 61 6d 65 0d 0a 20 20 2a 2a 20 61 6e 64 l name.. ** and
16e60 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 8 bytes of magi
16e61 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 c data just writ
16e62 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e ten to the file.
16e63 20 54 68 69 73 20 69 73 20 0d 0a 20 20 2a 2a 20 This is .. **
16e64 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 dangerous becaus
16e65 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f e the code to ro
16e66 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 llback a hot-jou
16e67 72 6e 61 6c 20 66 69 6c 65 0d 0a 20 20 2a 2a 20 rnal file.. **
16e68 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 will not be able
16e69 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 to find the mas
16e6a 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 ter-journal name
16e6b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0d 0a to determine ..
16e6c 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 ** whether or
16e6d 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 not the journal
16e6e 69 73 20 68 6f 74 2e 20 0d 0a 20 20 2a 2a 0d 0a is hot. .. **..
16e6f 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 ** Easiest thi
16e70 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 ng to do in this
16e71 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 scenario is to
16e72 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 truncate the jou
16e73 72 6e 61 6c 20 0d 0a 20 20 2a 2a 20 66 69 6c 65 rnal .. ** file
16e74 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 to the required
16e75 20 73 69 7a 65 2e 0d 0a 20 20 2a 2f 20 0d 0a 20 size... */ ..
16e76 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d if( SQLITE_OK==
16e77 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 (rc = sqlite3OsF
16e78 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e ileSize(pPager->
16e79 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 jfd, &jrnlSize))
16e7a 0d 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 .. && jrnlSize
16e7b 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c >pPager->journal
16e7c 4f 66 66 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 Off.. ){.. r
16e7d 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 c = sqlite3OsTru
16e7e 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 ncate(pPager->jf
16e7f 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e d, pPager->journ
16e80 61 6c 4f 66 66 29 3b 0d 0a 20 20 7d 0d 0a 20 20 alOff);.. }..
16e81 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
16e82 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 61 20 70 ./*..** Find a p
16e83 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 age in the hash
16e84 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 table given its
16e85 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 page number. Ret
16e86 75 72 6e 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 urn..** a pointe
16e87 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 r to the page or
16e88 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 NULL if the req
16e89 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e uested page is n
16e8a 6f 74 20 0d 0a 2a 2a 20 61 6c 72 65 61 64 79 20 ot ..** already
16e8b 69 6e 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2f 0d 0a in memory...*/..
16e8c 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 static PgHdr *pa
16e8d 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 ger_lookup(Pager
16e8e 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 *pPager, Pgno p
16e8f 67 6e 6f 29 7b 0d 0a 20 20 50 67 48 64 72 20 2a gno){.. PgHdr *
16e90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p;
16e91 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
16e92 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0d 0a 0d turn value */...
16e93 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 . /* It is not
16e94 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 possible for a c
16e95 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 all to PcacheFet
16e96 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 ch() with create
16e97 46 6c 61 67 3d 3d 30 20 74 6f 0d 0a 20 20 2a 2a Flag==0 to.. **
16e98 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 fail, since no
16e99 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 attempt to alloc
16e9a 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f ate dynamic memo
16e9b 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e ry will be made.
16e9c 0d 0a 20 20 2a 2f 0d 0a 20 20 28 76 6f 69 64 29 .. */.. (void)
16e9d 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 sqlite3PcacheFet
16e9e 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 ch(pPager->pPCac
16e9f 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 he, pgno, 0, &p)
16ea0 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a ;.. return p;..
16ea1 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 69 73 63 }..../*..** Disc
16ea2 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 ard the entire c
16ea3 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 ontents of the i
16ea4 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 n-memory page-ca
16ea5 63 68 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 che...*/..static
16ea6 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 void pager_rese
16ea7 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 t(Pager *pPager)
16ea8 7b 0d 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b {.. sqlite3Back
16ea9 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 upRestart(pPager
16eaa 2d 3e 70 42 61 63 6b 75 70 29 3b 0d 0a 20 20 73 ->pBackup);.. s
16eab 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 qlite3PcacheClea
16eac 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 r(pPager->pPCach
16ead 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a e);..}..../*..**
16eae 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 Free all struct
16eaf 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 ures in the Page
16eb0 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 r.aSavepoint[] a
16eb1 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 rray and set bot
16eb2 68 0d 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 h..** Pager.aSav
16eb3 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 epoint and Pager
16eb4 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a .nSavepoint to z
16eb5 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 ero. Close the s
16eb6 75 62 2d 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 69 ub-journal..** i
16eb7 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 f it is open and
16eb8 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f the pager is no
16eb9 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d t in exclusive m
16eba 6f 64 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ode...*/..static
16ebb 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c void releaseAll
16ebc 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 Savepoints(Pager
16ebd 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 69 6e *pPager){.. in
16ebe 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 t ii;
16ebf 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 /* Iterator
16ec0 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f for looping thro
16ec1 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 ugh Pager.aSavep
16ec2 6f 69 6e 74 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 oint */.. for(i
16ec3 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e i=0; ii<pPager->
16ec4 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b nSavepoint; ii++
16ec5 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 ){.. sqlite3B
16ec6 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 itvecDestroy(pPa
16ec7 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b ger->aSavepoint[
16ec8 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 ii].pInSavepoint
16ec9 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 21 );.. }.. if( !
16eca 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 pPager->exclusiv
16ecb 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 eMode || sqlite3
16ecc 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 IsMemJournal(pPa
16ecd 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0d 0a 20 ger->sjfd) ){..
16ece 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 sqlite3OsClos
16ecf 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b e(pPager->sjfd);
16ed0 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 .. }.. sqlite3
16ed1 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 _free(pPager->aS
16ed2 61 76 65 70 6f 69 6e 74 29 3b 0d 0a 20 20 70 50 avepoint);.. pP
16ed3 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 ager->aSavepoint
16ed4 20 3d 20 30 3b 0d 0a 20 20 70 50 61 67 65 72 2d = 0;.. pPager-
16ed5 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b >nSavepoint = 0;
16ed6 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 .. pPager->nSub
16ed7 52 65 63 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f Rec = 0;..}..../
16ed8 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 *..** Set the bi
16ed9 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e t number pgno in
16eda 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f the PagerSavepo
16edb 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 int.pInSavepoint
16edc 20 0d 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 ..** bitvecs of
16edd 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f all open savepo
16ede 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c ints. Return SQL
16edf 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 ITE_OK if succes
16ee0 73 66 75 6c 0d 0a 2a 2a 20 6f 72 20 53 51 4c 49 sful..** or SQLI
16ee1 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 TE_NOMEM if a ma
16ee2 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 lloc failure occ
16ee3 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 urs...*/..static
16ee4 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f int addToSavepo
16ee5 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 intBitvecs(Pager
16ee6 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 *pPager, Pgno p
16ee7 67 6e 6f 29 7b 0d 0a 20 20 69 6e 74 20 69 69 3b gno){.. int ii;
16ee8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16ee9 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 /* Loop count
16eea 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 20 er */.. int rc
16eeb 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
16eec 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 /* Result cod
16eed 65 20 2a 2f 0d 0a 0d 0a 20 20 66 6f 72 28 69 69 e */.... for(ii
16eee 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e =0; ii<pPager->n
16eef 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 Savepoint; ii++)
16ef0 7b 0d 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 {.. PagerSave
16ef1 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 point *p = &pPag
16ef2 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 er->aSavepoint[i
16ef3 69 5d 3b 0d 0a 20 20 20 20 69 66 28 20 70 67 6e i];.. if( pgn
16ef4 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0d 0a o<=p->nOrig ){..
16ef5 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 rc |= sqli
16ef6 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e te3BitvecSet(p->
16ef7 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 pInSavepoint, pg
16ef8 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 74 65 73 74 no);.. test
16ef9 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 case( rc==SQLITE
16efa 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 20 20 20 _NOMEM );..
16efb 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
16efc 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 ITE_OK || rc==SQ
16efd 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 LITE_NOMEM );..
16efe 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 }.. }.. ret
16eff 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
16f00 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
16f01 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 on is a no-op if
16f02 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e the pager is in
16f03 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 exclusive mode
16f04 61 6e 64 20 6e 6f 74 0d 0a 2a 2a 20 69 6e 20 74 and not..** in t
16f05 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 he ERROR state.
16f06 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 Otherwise, it sw
16f07 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 itches the pager
16f08 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0d 0a to PAGER_OPEN..
16f09 2a 2a 20 73 74 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a ** state...**..*
16f0a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 * If the pager i
16f0b 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 s not in exclusi
16f0c 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 ve-access mode,
16f0d 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
16f0e 65 20 69 73 0d 0a 2a 2a 20 63 6f 6d 70 6c 65 74 e is..** complet
16f0f 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 ely unlocked. If
16f10 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c the file is unl
16f11 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 ocked and the fi
16f12 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0d 0a le-system does..
16f13 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 ** not exhibit t
16f14 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 he UNDELETABLE_W
16f15 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 HEN_OPEN propert
16f16 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 y, the journal f
16f17 69 6c 65 20 69 73 0d 0a 2a 2a 20 63 6c 6f 73 65 ile is..** close
16f18 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e d (if it is open
16f19 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 )...**..** If th
16f1a 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 e pager is in ER
16f1b 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 ROR state when t
16f1c 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
16f1d 63 61 6c 6c 65 64 2c 20 74 68 65 20 0d 0a 2a 2a called, the ..**
16f1e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 contents of the
16f1f 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 pager cache are
16f20 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 discarded befor
16f21 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b e switching back
16f22 20 74 6f 20 0d 0a 2a 2a 20 74 68 65 20 4f 50 45 to ..** the OPE
16f23 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c N state. Regardl
16f24 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 ess of whether t
16f25 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 he pager is in e
16f26 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0d 0a 2a xclusive-mode..*
16f27 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f * or not, any jo
16f28 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 urnal file left
16f29 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 in the file-syst
16f2a 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 em will be treat
16f2b 65 64 0d 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d ed..** as a hot-
16f2c 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c journal and roll
16f2d 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 ed back the next
16f2e 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 time a read-tra
16f2f 6e 73 61 63 74 69 6f 6e 0d 0a 2a 2a 20 69 73 20 nsaction..** is
16f30 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 opened (by this
16f31 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 or by any other
16f32 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 2a 2f connection)...*/
16f33 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 ..static void pa
16f34 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 ger_unlock(Pager
16f35 20 2a 70 50 61 67 65 72 29 7b 0d 0a 0d 0a 20 20 *pPager){....
16f36 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
16f37 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 eState==PAGER_RE
16f38 41 44 45 52 20 0d 0a 20 20 20 20 20 20 20 7c 7c ADER .. ||
16f39 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d pPager->eState=
16f3a 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0d 0a 20 20 =PAGER_OPEN ..
16f3b 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e || pPager->
16f3c 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 eState==PAGER_ER
16f3d 52 4f 52 20 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 ROR .. );....
16f3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 sqlite3BitvecDes
16f3f 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e troy(pPager->pIn
16f40 4a 6f 75 72 6e 61 6c 29 3b 0d 0a 20 20 70 50 61 Journal);.. pPa
16f41 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 ger->pInJournal
16f42 3d 20 30 3b 0d 0a 20 20 72 65 6c 65 61 73 65 41 = 0;.. releaseA
16f43 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 llSavepoints(pPa
16f44 67 65 72 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 ger);.... if( p
16f45 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 agerUseWal(pPage
16f46 72 29 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 r) ){.. asser
16f47 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 t( !isOpen(pPage
16f48 72 2d 3e 6a 66 64 29 20 29 3b 0d 0a 20 20 20 20 r->jfd) );..
16f49 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 sqlite3WalEndRea
16f4a 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 dTransaction(pPa
16f4b 67 65 72 2d 3e 70 57 61 6c 29 3b 0d 0a 20 20 20 ger->pWal);..
16f4c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 pPager->eState
16f4d 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0d 0a 20 = PAGER_OPEN;..
16f4e 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 }else if( !pPag
16f4f 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 er->exclusiveMod
16f50 65 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 72 63 e ){.. int rc
16f51 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
16f52 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 /* Error
16f53 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 code returned b
16f54 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 y pagerUnlockDb(
16f55 29 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 44 ) */.. int iD
16f56 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 c = isOpen(pPage
16f57 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 r->fd)?sqlite3Os
16f58 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 DeviceCharacteri
16f59 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 stics(pPager->fd
16f5a 29 3a 30 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 ):0;.... /* I
16f5b 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 f the operating
16f5c 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 system support d
16f5d 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 eletion of open
16f5e 66 69 6c 65 73 2c 20 74 68 65 6e 0d 0a 20 20 20 files, then..
16f5f 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f ** close the jo
16f60 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 urnal file when
16f61 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 dropping the dat
16f62 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 abase lock. Oth
16f63 65 72 77 69 73 65 0d 0a 20 20 20 20 2a 2a 20 61 erwise.. ** a
16f64 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f nother connectio
16f65 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d n with journal_m
16f66 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 ode=delete might
16f67 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 delete the file
16f68 0d 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f .. ** out fro
16f69 6d 20 75 6e 64 65 72 20 75 73 2e 0d 0a 20 20 20 m under us...
16f6a 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 */.. assert(
16f6b 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d (PAGER_JOURNALM
16f6c 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 ODE_MEMORY & 5
16f6d 29 21 3d 31 20 29 3b 0d 0a 20 20 20 20 61 73 73 )!=1 );.. ass
16f6e 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 ert( (PAGER_JOUR
16f6f 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 NALMODE_OFF
16f70 20 26 20 35 29 21 3d 31 20 29 3b 0d 0a 20 20 20 & 5)!=1 );..
16f71 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f assert( (PAGER_
16f72 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 JOURNALMODE_WAL
16f73 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0d & 5)!=1 );.
16f74 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 . assert( (PA
16f75 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
16f76 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 DELETE & 5)!=1
16f77 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
16f78 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d (PAGER_JOURNALM
16f79 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 ODE_TRUNCATE & 5
16f7a 29 3d 3d 31 20 29 3b 0d 0a 20 20 20 20 61 73 73 )==1 );.. ass
16f7b 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 ert( (PAGER_JOUR
16f7c 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 NALMODE_PERSIST
16f7d 20 26 20 35 29 3d 3d 31 20 29 3b 0d 0a 20 20 20 & 5)==1 );..
16f7e 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 if( 0==(iDc & S
16f7f 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 QLITE_IOCAP_UNDE
16f80 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 LETABLE_WHEN_OPE
16f81 4e 29 0d 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 N).. || 1!=(
16f82 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d pPager->journalM
16f83 6f 64 65 20 26 20 35 29 0d 0a 20 20 20 20 29 7b ode & 5).. ){
16f84 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f .. sqlite3O
16f85 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a sClose(pPager->j
16f86 66 64 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 fd);.. }....
16f87 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 /* If the pag
16f88 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 er is in the ERR
16f89 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 OR state and the
16f8a 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 call to unlock
16f8b 74 68 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 the database..
16f8c 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c ** file fails,
16f8d 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 set the current
16f8e 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e lock to UNKNOWN
16f8f 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 _LOCK. See the c
16f90 6f 6d 6d 65 6e 74 0d 0a 20 20 20 20 2a 2a 20 61 omment.. ** a
16f91 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 bove the #define
16f92 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 for UNKNOWN_LOC
16f93 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 K for an explana
16f94 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 tion of why this
16f95 0d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 .. ** is nece
16f96 73 73 61 72 79 2e 0d 0a 20 20 20 20 2a 2f 0d 0a ssary... */..
16f97 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e rc = pagerUn
16f98 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e lockDb(pPager, N
16f99 4f 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 69 66 O_LOCK);.. if
16f9a 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
16f9b 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 && pPager->eStat
16f9c 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 e==PAGER_ERROR )
16f9d 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d {.. pPager-
16f9e 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e >eLock = UNKNOWN
16f9f 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d _LOCK;.. }...
16fa0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 . /* The page
16fa1 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 r state may be c
16fa2 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 hanged from PAGE
16fa3 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 R_ERROR to PAGER
16fa4 5f 4f 50 45 4e 20 68 65 72 65 0d 0a 20 20 20 20 _OPEN here..
16fa5 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 ** without clear
16fa6 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f ing the error co
16fa7 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 de. This is inte
16fa8 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 ntional - the er
16fa9 72 6f 72 0d 0a 20 20 20 20 2a 2a 20 63 6f 64 65 ror.. ** code
16faa 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 is cleared and
16fab 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 the cache reset
16fac 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c in the block bel
16fad 6f 77 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 ow... */..
16fae 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
16faf 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 >errCode || pPag
16fb0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 er->eState!=PAGE
16fb1 52 5f 45 52 52 4f 52 20 29 3b 0d 0a 20 20 20 20 R_ERROR );..
16fb2 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f pPager->changeCo
16fb3 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0d 0a 20 20 untDone = 0;..
16fb4 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 pPager->eState
16fb5 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0d 0a = PAGER_OPEN;..
16fb6 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 50 }.... /* If P
16fb7 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 ager.errCode is
16fb8 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 set, the content
16fb9 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 s of the pager c
16fba 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0d 0a ache cannot be..
16fbb 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f ** trusted. No
16fbc 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 w that there are
16fbd 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 no outstanding
16fbe 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 references to th
16fbf 65 20 70 61 67 65 72 2c 0d 0a 20 20 2a 2a 20 69 e pager,.. ** i
16fc0 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 t can safely mov
16fc1 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f e back to PAGER_
16fc2 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 OPEN state. This
16fc3 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 happens in both
16fc4 0d 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e .. ** normal an
16fc5 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b d exclusive-lock
16fc6 69 6e 67 20 6d 6f 64 65 2e 0d 0a 20 20 2a 2f 0d ing mode... */.
16fc7 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 . if( pPager->e
16fc8 72 72 43 6f 64 65 20 29 7b 0d 0a 20 20 20 20 61 rrCode ){.. a
16fc9 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b ssert( !MEMDB );
16fca 0d 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 .. pager_rese
16fcb 74 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 t(pPager);..
16fcc 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f pPager->changeCo
16fcd 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 untDone = pPager
16fce 2d 3e 74 65 6d 70 46 69 6c 65 3b 0d 0a 20 20 20 ->tempFile;..
16fcf 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 pPager->eState
16fd0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0d 0a 20 = PAGER_OPEN;..
16fd1 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f pPager->errCo
16fd2 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d de = SQLITE_OK;.
16fd3 0a 20 20 7d 0d 0a 0d 0a 20 20 70 50 61 67 65 72 . }.... pPager
16fd4 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 ->journalOff = 0
16fd5 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 ;.. pPager->jou
16fd6 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0d 0a 20 20 rnalHdr = 0;..
16fd7 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 pPager->setMaste
16fd8 72 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d r = 0;..}..../*.
16fd9 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
16fda 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e n is called when
16fdb 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 ever an IOERR or
16fdc 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 FULL error that
16fdd 20 72 65 71 75 69 72 65 73 0d 0a 2a 2a 20 74 68 requires..** th
16fde 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 e pager to trans
16fdf 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 ition into the E
16fe0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 RROR state may a
16fe1 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0d 0a 2a hve occurred...*
16fe2 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 * The first argu
16fe3 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 ment is a pointe
16fe4 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 r to the pager s
16fe5 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 tructure, the se
16fe6 63 6f 6e 64 20 0d 0a 2a 2a 20 74 68 65 20 65 72 cond ..** the er
16fe7 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 ror-code about t
16fe8 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 o be returned by
16fe9 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e a pager API fun
16fea 63 74 69 6f 6e 2e 20 54 68 65 20 0d 0a 2a 2a 20 ction. The ..**
16feb 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 value returned i
16fec 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 s a copy of the
16fed 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
16fee 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e to this function
16fef 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 . ..**..** If th
16ff0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e e second argumen
16ff1 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c t is SQLITE_FULL
16ff2 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f , SQLITE_IOERR o
16ff3 72 20 6f 6e 65 20 6f 66 20 74 68 65 0d 0a 2a 2a r one of the..**
16ff4 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 IOERR sub-codes
16ff5 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 , the pager ente
16ff6 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 rs the ERROR sta
16ff7 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 te and the error
16ff8 20 63 6f 64 65 0d 0a 2a 2a 20 69 73 20 73 74 6f code..** is sto
16ff9 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 red in Pager.err
16ffa 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 Code. While the
16ffb 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e pager remains in
16ffc 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 the ERROR state
16ffd 2c 0d 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 ,..** all major
16ffe 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 API calls on the
16fff 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 Pager will imme
17000 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 diately return P
17001 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0d 0a 2a ager.errCode...*
17002 2a 0d 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 *..** The ERROR
17003 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 state indicates
17004 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 that the content
17005 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 s of the pager-c
17006 61 63 68 65 20 0d 0a 2a 2a 20 63 61 6e 6e 6f 74 ache ..** cannot
17007 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 be trusted. Thi
17008 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 s state can be c
17009 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 leared by comple
1700a 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 tely discarding
1700b 0d 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 ..** the content
1700c 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 s of the pager-c
1700d 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 ache. If a trans
1700e 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 action was activ
1700f 65 20 77 68 65 6e 0d 0a 2a 2a 20 74 68 65 20 70 e when..** the p
17010 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 ersistent error
17011 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 occurred, then t
17012 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 he rollback jour
17013 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0d 0a 2a 2a nal may need..**
17014 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 to be replayed
17015 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 to restore the c
17016 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 ontents of the d
17017 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 atabase file (as
17018 20 69 66 0d 0a 2a 2a 20 69 74 20 77 65 72 65 20 if..** it were
17019 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0d a hot-journal)..
1701a 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
1701b 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 pager_error(Page
1701c 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 r *pPager, int r
1701d 63 29 7b 0d 0a 20 20 69 6e 74 20 72 63 32 20 3d c){.. int rc2 =
1701e 20 72 63 20 26 20 30 78 66 66 3b 0d 0a 20 20 61 rc & 0xff;.. a
1701f 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 ssert( rc==SQLIT
17020 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 E_OK || !MEMDB )
17021 3b 0d 0a 20 20 61 73 73 65 72 74 28 0d 0a 20 20 ;.. assert(..
17022 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 pPager->err
17023 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c Code==SQLITE_FUL
17024 4c 20 7c 7c 0d 0a 20 20 20 20 20 20 20 70 50 61 L ||.. pPa
17025 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 ger->errCode==SQ
17026 4c 49 54 45 5f 4f 4b 20 7c 7c 0d 0a 20 20 20 20 LITE_OK ||..
17027 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 (pPager->errC
17028 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c ode & 0xff)==SQL
17029 49 54 45 5f 49 4f 45 52 52 0d 0a 20 20 29 3b 0d ITE_IOERR.. );.
1702a 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 . if( rc2==SQLI
1702b 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d TE_FULL || rc2==
1702c 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0d SQLITE_IOERR ){.
1702d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 . pPager->err
1702e 43 6f 64 65 20 3d 20 72 63 3b 0d 0a 20 20 20 20 Code = rc;..
1702f 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d pPager->eState =
17030 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0d 0a 20 PAGER_ERROR;..
17031 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
17032 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
17033 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 is routine ends
17034 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 a transaction. A
17035 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 transaction is
17036 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 usually ended by
17037 20 0d 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 ..** either a C
17038 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 OMMIT or a ROLLB
17039 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 ACK operation. T
1703a 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 his routine may
1703b 62 65 20 63 61 6c 6c 65 64 20 0d 0a 2a 2a 20 61 be called ..** a
1703c 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 fter rollback of
1703d 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 a hot-journal,
1703e 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f or if an error o
1703f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e ccurs while open
17040 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 ing..** the jour
17041 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 nal file or writ
17042 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 ing the very fir
17043 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 st journal-heade
17044 72 20 6f 66 20 61 0d 0a 2a 2a 20 64 61 74 61 62 r of a..** datab
17045 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e ase transaction.
17046 0d 0a 2a 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 72 ..** ..** This r
17047 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 outine is never
17048 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f called in PAGER_
17049 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 ERROR state. If
1704a 69 74 20 69 73 20 63 61 6c 6c 65 64 0d 0a 2a 2a it is called..**
1704b 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f in PAGER_NONE o
1704c 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 r PAGER_SHARED s
1704d 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 tate and the loc
1704e 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0d 0a k held is less..
1704f 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 ** exclusive tha
17050 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 n a RESERVED loc
17051 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 k, it is a no-op
17052 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 ...**..** Otherw
17053 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 ise, any active
17054 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 savepoints are r
17055 65 6c 65 61 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a eleased...**..**
17056 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 If the journal
17057 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 file is open, th
17058 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 en it is "finali
17059 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 zed". Once a jou
1705a 72 6e 61 6c 20 0d 0a 2a 2a 20 66 69 6c 65 20 68 rnal ..** file h
1705b 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 as been finalize
1705c 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 d it is not poss
1705d 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 ible to use it t
1705e 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0d 0a o roll back a ..
1705f 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 ** transaction.
17060 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 Nor will it be c
17061 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 onsidered to be
17062 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 a hot-journal by
17063 20 74 68 69 73 0d 0a 2a 2a 20 6f 72 20 61 6e 79 this..** or any
17064 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 other database
17065 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 connection. Exac
17066 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 tly how a journa
17067 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0d 0a l is finalized..
17068 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 ** depends on wh
17069 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 ether or not the
1706a 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e pager is runnin
1706b 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d g in exclusive m
1706c 6f 64 65 20 61 6e 64 0d 0a 2a 2a 20 74 68 65 20 ode and..** the
1706d 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d current journal-
1706e 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 mode (Pager.jour
1706f 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 nalMode value),
17070 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d as follows:..**.
17071 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 .** journalMod
17072 65 3d 3d 4d 45 4d 4f 52 59 0d 0a 2a 2a 20 20 20 e==MEMORY..**
17073 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 Journal file d
17074 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d escriptor is sim
17075 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 ply closed. This
17076 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0d 0a 2a destroys an ..*
17077 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 * in-memory
17078 6a 6f 75 72 6e 61 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a journal...**..**
17079 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d journalMode==
1707a 54 52 55 4e 43 41 54 45 0d 0a 2a 2a 20 20 20 20 TRUNCATE..**
1707b 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 Journal file is
1707c 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 truncated to ze
1707d 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 ro bytes in size
1707e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 6a 6f 75 72 ...**..** jour
1707f 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 nalMode==PERSIST
17080 0d 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 ..** The fir
17081 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 st 28 bytes of t
17082 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 he journal file
17083 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 are zeroed. This
17084 20 69 6e 76 61 6c 69 64 61 74 65 73 0d 0a 2a 2a invalidates..**
17085 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a the first j
17086 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e ournal header in
17087 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 the file, and h
17088 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 ence the entire
17089 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 20 20 20 20 journal..**
1708a 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 file. An invalid
1708b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 journal file ca
1708c 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 nnot be rolled b
1708d 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 6a ack...**..** j
1708e 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 ournalMode==DELE
1708f 54 45 0d 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a TE..** The j
17090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 ournal file is c
17091 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 losed and delete
17092 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f d using sqlite3O
17093 73 44 65 6c 65 74 65 28 29 2e 0d 0a 2a 2a 0d 0a sDelete()...**..
17094 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 ** If the pa
17095 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 ger is running i
17096 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 n exclusive mode
17097 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 , this method of
17098 20 66 69 6e 61 6c 69 7a 69 6e 67 0d 0a 2a 2a 20 finalizing..**
17099 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 the journal
1709a 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 file is never us
1709b 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 ed. Instead, if
1709c 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 the journalMode
1709d 69 73 0d 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 is..** DELET
1709e 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 E and the pager
1709f 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 is in exclusive
170a0 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 mode, the method
170a1 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 described under
170a2 0d 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c ..** journal
170a3 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 Mode==PERSIST is
170a4 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0d 0a used instead...
170a5 2a 2a 0d 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 **..** After the
170a6 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 journal is fina
170a7 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 lized, the pager
170a8 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f moves to PAGER_
170a9 52 45 41 44 45 52 20 73 74 61 74 65 2e 0d 0a 2a READER state...*
170aa 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 * If running in
170ab 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f non-exclusive ro
170ac 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 llback mode, the
170ad 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c lock on the fil
170ae 65 20 69 73 20 0d 0a 2a 2a 20 64 6f 77 6e 67 72 e is ..** downgr
170af 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 aded to a SHARED
170b0 5f 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 _LOCK...**..** S
170b1 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 QLITE_OK is retu
170b2 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 rned if no error
170b3 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 occurs. If an e
170b4 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 rror occurs duri
170b5 6e 67 0d 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 ng..** any of th
170b6 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 e IO operations
170b7 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 to finalize the
170b8 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 journal file or
170b9 75 6e 6c 6f 63 6b 20 74 68 65 0d 0a 2a 2a 20 64 unlock the..** d
170ba 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 atabase then the
170bb 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 IO error code i
170bc 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 s returned to th
170bd 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0d e user. If the .
170be 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f .** operation to
170bf 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f finalize the jo
170c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 urnal file fails
170c1 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 , then the code
170c2 73 74 69 6c 6c 0d 0a 2a 2a 20 74 72 69 65 73 20 still..** tries
170c3 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 to unlock the da
170c4 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e tabase file if n
170c5 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 ot in exclusive
170c6 6d 6f 64 65 2e 20 49 66 20 74 68 65 0d 0a 2a 2a mode. If the..**
170c7 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f unlock operatio
170c8 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c n fails as well,
170c9 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 then the first
170ca 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 error code relat
170cb 65 64 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 ed..** to the fi
170cc 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e rst error encoun
170cd 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e tered (the journ
170ce 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 al finalization
170cf 6f 6e 65 29 20 69 73 0d 0a 2a 2a 20 72 65 74 75 one) is..** retu
170d0 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 rned...*/..stati
170d1 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f c int pager_end_
170d2 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 transaction(Page
170d3 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 r *pPager, int h
170d4 61 73 4d 61 73 74 65 72 29 7b 0d 0a 20 20 69 6e asMaster){.. in
170d5 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
170d6 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 ; /* Error
170d7 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 code from journa
170d8 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f l finalization o
170d9 70 65 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 peration */.. i
170da 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f nt rc2 = SQLITE_
170db 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 OK; /* Error
170dc 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 code from db fi
170dd 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 le unlock operat
170de 69 6f 6e 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 44 ion */.... /* D
170df 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 o nothing if the
170e0 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 pager does not
170e1 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 have an open wri
170e2 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a te transaction..
170e3 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 ** or at least
170e4 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b a RESERVED lock
170e5 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 . This function
170e6 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 may be called wh
170e7 65 6e 20 74 68 65 72 65 0d 0a 20 20 2a 2a 20 69 en there.. ** i
170e8 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 s no write-trans
170e9 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 action active bu
170ea 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 t a RESERVED or
170eb 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0d greater lock is.
170ec 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 . ** held under
170ed 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 two circumstanc
170ee 65 73 3a 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 es:.. **.. **
170ef 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 1. After a suc
170f0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 cessful hot-jour
170f1 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 nal rollback, it
170f2 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0d is called with.
170f3 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 . ** eStat
170f4 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e e==PAGER_NONE an
170f5 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 d eLock==EXCLUSI
170f6 56 45 5f 4c 4f 43 4b 2e 0d 0a 20 20 2a 2a 0d 0a VE_LOCK... **..
170f7 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 ** 2. If a c
170f8 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c onnection with l
170f9 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c ocking_mode=excl
170fa 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e usive holding an
170fb 20 45 58 43 4c 55 53 49 56 45 20 0d 0a 20 20 2a EXCLUSIVE .. *
170fc 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 * lock swit
170fd 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 ches back to loc
170fe 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c king_mode=normal
170ff 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 and then execut
17100 65 73 20 61 0d 0a 20 20 2a 2a 20 20 20 20 20 20 es a.. **
17101 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e read-transaction
17102 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 , this function
17103 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 is called with e
17104 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 State==PAGER_REA
17105 44 45 52 20 0d 0a 20 20 2a 2a 20 20 20 20 20 20 DER .. **
17106 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 and eLock==EXCLU
17107 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 SIVE_LOCK when t
17108 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 he read-transact
17109 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a ion is closed...
1710a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 */.. assert(
1710b 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 assert_pager_sta
1710c 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 te(pPager) );..
1710d 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
1710e 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 >eState!=PAGER_E
1710f 52 52 4f 52 20 29 3b 0d 0a 20 20 69 66 28 20 70 RROR );.. if( p
17110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 Pager->eState<PA
17111 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 GER_WRITER_LOCKE
17112 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f D && pPager->eLo
17113 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b ck<RESERVED_LOCK
17114 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
17115 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d SQLITE_OK;.. }.
17116 0a 0d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 ... releaseAllS
17117 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 avepoints(pPager
17118 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 73 );.. assert( is
17119 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 Open(pPager->jfd
1711a 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e ) || pPager->pIn
1711b 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0d 0a 20 Journal==0 );..
1711c 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 if( isOpen(pPag
1711d 65 72 2d 3e 6a 66 64 29 20 29 7b 0d 0a 20 20 20 er->jfd) ){..
1711e 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 assert( !pagerU
1711f 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b seWal(pPager) );
17120 0d 0a 0d 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c .... /* Final
17121 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 ize the journal
17122 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 20 20 69 66 file. */.. if
17123 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f ( sqlite3IsMemJo
17124 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 urnal(pPager->jf
17125 64 29 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 d) ){.. ass
17126 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 ert( pPager->jou
17127 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f rnalMode==PAGER_
17128 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f JOURNALMODE_MEMO
17129 52 59 20 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c RY );.. sql
1712a 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 ite3OsClose(pPag
1712b 65 72 2d 3e 6a 66 64 29 3b 0d 0a 20 20 20 20 7d er->jfd);.. }
1712c 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d else if( pPager-
1712d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 >journalMode==PA
1712e 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
1712f 54 52 55 4e 43 41 54 45 20 29 7b 0d 0a 20 20 20 TRUNCATE ){..
17130 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a if( pPager->j
17131 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0d ournalOff==0 ){.
17132 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 . rc = SQ
17133 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 LITE_OK;..
17134 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
17135 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 rc = sqlite3OsTr
17136 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a uncate(pPager->j
17137 66 64 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 7d fd, 0);.. }
17138 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e .. pPager->
17139 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0d journalOff = 0;.
1713a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 . }else if( p
1713b 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f Pager->journalMo
1713c 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 de==PAGER_JOURNA
1713d 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0d 0a 20 LMODE_PERSIST..
1713e 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d || (pPager-
1713f 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 >exclusiveMode &
17140 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 & pPager->journa
17141 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 lMode!=PAGER_JOU
17142 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0d 0a 20 RNALMODE_WAL)..
17143 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 ){.. rc
17144 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 = zeroJournalHdr
17145 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 (pPager, hasMast
17146 65 72 29 3b 0d 0a 20 20 20 20 20 20 70 50 61 67 er);.. pPag
17147 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d er->journalOff =
17148 20 30 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0;.. }else{.
17149 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 . /* This b
1714a 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 ranch may be exe
1714b 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 cuted with Pager
1714c 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 .journalMode==ME
1714d 4d 4f 52 59 20 69 66 0d 0a 20 20 20 20 20 20 2a MORY if.. *
1714e 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 * a hot-journal
1714f 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 was just rolled
17150 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 back. In this ca
17151 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0d 0a se the journal..
17152 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 ** file sh
17153 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 ould be closed a
17154 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 nd deleted. If t
17155 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 his connection w
17156 72 69 74 65 73 20 74 6f 0d 0a 20 20 20 20 20 20 rites to..
17157 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ** the database
17158 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f file, it will do
17159 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d so using an in-
1715a 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 memory journal.
1715b 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 .. */..
1715c 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
1715d 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 ->journalMode==P
1715e 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 AGER_JOURNALMODE
1715f 5f 44 45 4c 45 54 45 20 0d 0a 20 20 20 20 20 20 _DELETE ..
17160 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e || pPager->
17161 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 journalMode==PAG
17162 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d ER_JOURNALMODE_M
17163 45 4d 4f 52 59 20 0d 0a 20 20 20 20 20 20 20 20 EMORY ..
17164 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f || pPager->jo
17165 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 urnalMode==PAGER
17166 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c _JOURNALMODE_WAL
17167 20 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 .. );..
17168 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 sqlite3OsClos
17169 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0d e(pPager->jfd);.
1716a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 . if( !pPag
1716b 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0d er->tempFile ){.
1716c 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
1716d 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 lite3OsDelete(pP
1716e 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 ager->pVfs, pPag
1716f 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 er->zJournal, 0)
17170 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
17171 7d 0d 0a 20 20 7d 0d 0a 0d 0a 23 69 66 64 65 66 }.. }....#ifdef
17172 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 SQLITE_CHECK_PA
17173 47 45 53 0d 0a 20 20 73 71 6c 69 74 65 33 50 63 GES.. sqlite3Pc
17174 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 acheIterateDirty
17175 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 (pPager->pPCache
17176 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 , pager_set_page
17177 68 61 73 68 29 3b 0d 0a 20 20 69 66 28 20 70 50 hash);.. if( pP
17178 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 ager->dbSize==0
17179 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 && sqlite3Pcache
1717a 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d RefCount(pPager-
1717b 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0d 0a >pPCache)>0 ){..
1717c 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 PgHdr *p = p
1717d 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 ager_lookup(pPag
1717e 65 72 2c 20 31 29 3b 0d 0a 20 20 20 20 69 66 28 er, 1);.. if(
1717f 20 70 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e p ){.. p->
17180 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0d 0a 20 pageHash = 0;..
17181 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 sqlite3Page
17182 72 55 6e 72 65 66 28 70 29 3b 0d 0a 20 20 20 20 rUnref(p);..
17183 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a }.. }..#endif..
17184 0d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 .. sqlite3Bitve
17185 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d cDestroy(pPager-
17186 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0d 0a 20 >pInJournal);..
17187 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 pPager->pInJour
17188 6e 61 6c 20 3d 20 30 3b 0d 0a 20 20 70 50 61 67 nal = 0;.. pPag
17189 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0d 0a 20 er->nRec = 0;..
1718a 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c sqlite3PcacheCl
1718b 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 eanAll(pPager->p
1718c 50 43 61 63 68 65 29 3b 0d 0a 20 20 73 71 6c 69 PCache);.. sqli
1718d 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 te3PcacheTruncat
1718e 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 e(pPager->pPCach
1718f 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a e, pPager->dbSiz
17190 65 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 61 67 e);.... if( pag
17191 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 erUseWal(pPager)
17192 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 ){.. /* Drop
17193 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c the WAL write-l
17194 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 ock, if any. Als
17195 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 o, if the connec
17196 74 69 6f 6e 20 77 61 73 20 69 6e 20 0d 0a 20 20 tion was in ..
17197 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 ** locking_mod
17198 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 e=exclusive mode
17199 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 but is no longe
1719a 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c r, drop the EXCL
1719b 55 53 49 56 45 20 0d 0a 20 20 20 20 2a 2a 20 6c USIVE .. ** l
1719c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 ock held on the
1719d 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a database file...
1719e 20 20 20 20 2a 2f 0d 0a 20 20 20 20 72 63 32 20 */.. rc2
1719f 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 = sqlite3WalEndW
171a0 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 riteTransaction(
171a1 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0d 0a pPager->pWal);..
171a2 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d assert( rc2=
171a3 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 =SQLITE_OK );..
171a4 20 7d 0d 0a 20 20 69 66 28 20 21 70 50 61 67 65 }.. if( !pPage
171a5 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 r->exclusiveMode
171a6 20 0d 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 .. && (!pager
171a7 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c UseWal(pPager) |
171a8 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c | sqlite3WalExcl
171a9 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 usiveMode(pPager
171aa 2d 3e 70 57 61 6c 2c 20 30 29 29 0d 0a 20 20 29 ->pWal, 0)).. )
171ab 7b 0d 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 {.. rc2 = pag
171ac 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 erUnlockDb(pPage
171ad 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b r, SHARED_LOCK);
171ae 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 .. pPager->ch
171af 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 angeCountDone =
171b0 30 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 67 65 0;.. }.. pPage
171b1 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 r->eState = PAGE
171b2 52 5f 52 45 41 44 45 52 3b 0d 0a 20 20 70 50 61 R_READER;.. pPa
171b3 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d ger->setMaster =
171b4 20 30 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 0;.... return
171b5 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 (rc==SQLITE_OK?r
171b6 63 32 3a 72 63 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a c2:rc);..}..../*
171b7 0d 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 ..** Execute a r
171b8 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 ollback if a tra
171b9 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 nsaction is acti
171ba 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 ve and unlock th
171bb 65 20 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 e ..** database
171bc 66 69 6c 65 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 file. ..**..** I
171bd 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 f the pager has
171be 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 already entered
171bf 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c the ERROR state,
171c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 do not attempt
171c1 0d 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 ..** the rollbac
171c2 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 k at this time.
171c3 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 Instead, pager_u
171c4 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 nlock() is calle
171c5 64 2e 20 54 68 65 0d 0a 2a 2a 20 63 61 6c 6c 20 d. The..** call
171c6 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 to pager_unlock(
171c7 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 ) will discard a
171c8 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 ll in-memory pag
171c9 65 73 2c 20 75 6e 6c 6f 63 6b 0d 0a 2a 2a 20 74 es, unlock..** t
171ca 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
171cb 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 and move the pa
171cc 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e ger back to OPEN
171cd 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 state. If this
171ce 0d 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 ..** means that
171cf 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a there is a hot-j
171d0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 ournal left in t
171d1 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 he file-system,
171d2 74 68 65 20 6e 65 78 74 20 0d 0a 2a 2a 20 63 6f the next ..** co
171d3 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 nnection to obta
171d4 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b in a shared lock
171d5 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 on the pager (w
171d6 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 hich may be this
171d7 20 6f 6e 65 29 20 0d 0a 2a 2a 20 77 69 6c 6c 20 one) ..** will
171d8 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0d 0a 2a roll it back...*
171d9 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 *..** If the pag
171da 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 er has not alrea
171db 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 dy entered the E
171dc 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 RROR state, but
171dd 61 6e 20 49 4f 20 6f 72 0d 0a 2a 2a 20 6d 61 6c an IO or..** mal
171de 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 loc error occurs
171df 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 during a rollba
171e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 ck, then this wi
171e1 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 ll itself cause
171e2 0d 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 ..** the pager t
171e3 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f o enter the ERRO
171e4 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 R state. Which w
171e5 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 ill be cleared b
171e6 79 20 74 68 65 0d 0a 2a 2a 20 63 61 6c 6c 20 74 y the..** call t
171e7 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 o pager_unlock()
171e8 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 , as described a
171e9 62 6f 76 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 bove...*/..stati
171ea 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f c void pagerUnlo
171eb 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 ckAndRollback(Pa
171ec 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 ger *pPager){..
171ed 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 if( pPager->eSt
171ee 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 ate!=PAGER_ERROR
171ef 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 && pPager->eSta
171f0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 te!=PAGER_OPEN )
171f1 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 {.. assert( a
171f2 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 ssert_pager_stat
171f3 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 e(pPager) );..
171f4 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 if( pPager->eS
171f5 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 tate>=PAGER_WRIT
171f6 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0d 0a 20 20 ER_LOCKED ){..
171f7 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e sqlite3Begin
171f8 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0d BenignMalloc();.
171f9 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 . sqlite3Pa
171fa 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 gerRollback(pPag
171fb 65 72 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 er);.. sqli
171fc 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c te3EndBenignMall
171fd 6f 63 28 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 oc();.. }else
171fe 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 if( !pPager->ex
171ff 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0d 0a clusiveMode ){..
17200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 assert( pP
17201 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 ager->eState==PA
17202 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0d 0a 20 GER_READER );..
17203 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 pager_end_t
17204 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 ransaction(pPage
17205 72 2c 20 30 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 r, 0);.. }..
17206 20 7d 0d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f }.. pager_unlo
17207 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 7d 0d 0a ck(pPager);..}..
17208 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 61 6d 65 74 ../*..** Paramet
17209 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f er aData must po
1720a 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 int to a buffer
1720b 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 of pPager->pageS
1720c 69 7a 65 20 62 79 74 65 73 0d 0a 2a 2a 20 6f 66 ize bytes..** of
1720d 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 data. Compute a
1720e 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 nd return a chec
1720f 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 ksum based ont t
17210 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 he contents of t
17211 68 65 20 0d 0a 2a 2a 20 70 61 67 65 20 6f 66 20 he ..** page of
17212 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 data and the cur
17213 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 rent value of pP
17214 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e ager->cksumInit.
17215 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 69 73 ..**..** This is
17216 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 not a real chec
17217 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c ksum. It is real
17218 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 ly just the sum
17219 6f 66 20 74 68 65 20 0d 0a 2a 2a 20 72 61 6e 64 of the ..** rand
1721a 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 om initial value
1721b 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 (pPager->cksumI
1721c 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 nit) and every 2
1721d 30 30 74 68 20 62 79 74 65 0d 0a 2a 2a 20 6f 66 00th byte..** of
1721e 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 the page data,
1721f 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 starting with by
17220 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 te offset (pPage
17221 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 r->pageSize%200)
17222 2e 0d 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 ...** Each byte
17223 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 is interpreted a
17224 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 s an 8-bit unsig
17225 6e 65 64 20 69 6e 74 65 67 65 72 2e 0d 0a 2a 2a ned integer...**
17226 0d 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 ..** Changing th
17227 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 e formula used t
17228 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 o compute this c
17229 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 hecksum results
1722a 69 6e 20 61 6e 0d 0a 2a 2a 20 69 6e 63 6f 6d 70 in an..** incomp
1722b 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 atible journal f
1722c 69 6c 65 20 66 6f 72 6d 61 74 2e 0d 0a 2a 2a 0d ile format...**.
1722d 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 .** If journal c
1722e 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 orruption occurs
1722f 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 due to a power
17230 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 failure, the mos
17231 74 20 6c 69 6b 65 6c 79 20 0d 0a 2a 2a 20 73 63 t likely ..** sc
17232 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f enario is that o
17233 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 ne end or the ot
17234 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 her of the recor
17235 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 d will be change
17236 64 2e 20 0d 0a 2a 2a 20 49 74 20 69 73 20 6d 75 d. ..** It is mu
17237 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 ch less likely t
17238 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 hat the two ends
17239 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 of the journal
1723a 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0d 0a record will be..
1723b 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 ** correct and t
1723c 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 he middle be cor
1723d 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 rupt. Thus, thi
1723e 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 s "checksum" sch
1723f 65 6d 65 2c 0d 0a 2a 2a 20 74 68 6f 75 67 68 20 eme,..** though
17240 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c fast and simple,
17241 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 catches the mos
17242 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 tly likely kind
17243 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0d 0a of corruption...
17244 2a 2f 0d 0a 73 74 61 74 69 63 20 75 33 32 20 70 */..static u32 p
17245 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 ager_cksum(Pager
17246 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 *pPager, const
17247 75 38 20 2a 61 44 61 74 61 29 7b 0d 0a 20 20 75 u8 *aData){.. u
17248 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 32 cksum = pPage
17249 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 r->cksumInit;
1724a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 /* Checksu
1724b 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 m value to retur
1724c 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 20 3d 20 n */.. int i =
1724d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 pPager->pageSize
1724e 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f -200; /
1724f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
17250 2f 0d 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 /.. while( i>0
17251 29 7b 0d 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d ){.. cksum +=
17252 20 61 44 61 74 61 5b 69 5d 3b 0d 0a 20 20 20 20 aData[i];..
17253 69 20 2d 3d 20 32 30 30 3b 0d 0a 20 20 7d 0d 0a i -= 200;.. }..
17254 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0d return cksum;.
17255 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 70 .}..../*..** Rep
17256 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 ort the current
17257 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 page size and nu
17258 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 mber of reserved
17259 20 62 79 74 65 73 20 62 61 63 6b 0d 0a 2a 2a 20 bytes back..**
1725a 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0d 0a 2a to the codec...*
1725b 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
1725c 5f 48 41 53 5f 43 4f 44 45 43 0d 0a 73 74 61 74 _HAS_CODEC..stat
1725d 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 ic void pagerRep
1725e 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 ortSize(Pager *p
1725f 50 61 67 65 72 29 7b 0d 0a 20 20 69 66 28 20 70 Pager){.. if( p
17260 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a Pager->xCodecSiz
17261 65 43 68 6e 67 20 29 7b 0d 0a 20 20 20 20 70 50 eChng ){.. pP
17262 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 ager->xCodecSize
17263 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f Chng(pPager->pCo
17264 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 dec, pPager->pag
17265 65 53 69 7a 65 2c 0d 0a 20 20 20 20 20 20 20 20 eSize,..
17266 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17267 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e (int)pPager->
17268 6e 52 65 73 65 72 76 65 29 3b 0d 0a 20 20 7d 0d nReserve);.. }.
17269 0a 7d 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 .}..#else..# def
1726a 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 ine pagerReportS
1726b 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f ize(X) /* No
1726c 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 -op if we do not
1726d 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 support a codec
1726e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f */..#endif..../
1726f 2a 0d 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e *..** Read a sin
17270 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 gle page from ei
17271 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c ther the journal
17272 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e file (if isMain
17273 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0d 0a 2a 2a 20 Jrnl==1) or..**
17274 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 from the sub-jou
17275 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a rnal (if isMainJ
17276 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 rnl==0) and play
17277 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0d back that page..
17278 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 .** The page beg
17279 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 ins at offset *p
1727a 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 Offset into the
1727b 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 file. The *pOffs
1727c 65 74 0d 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 et..** value is
1727d 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 increased to the
1727e 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 start of the ne
1727f 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a xt page in the j
17280 6f 75 72 6e 61 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ournal...**..**
17281 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 The main rollbac
17282 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 k journal uses c
17283 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 hecksums - the s
17284 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c tatement journal
17285 20 64 6f 65 73 20 0d 0a 2a 2a 20 6e 6f 74 2e 0d does ..** not..
17286 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 70 .**..** If the p
17287 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 age number of th
17288 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 e page record re
17289 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 ad from the (sub
1728a 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0d 0a -)journal file..
1728b 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 ** is greater th
1728c 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 an the current v
1728d 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 alue of Pager.db
1728e 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 Size, then playb
1728f 61 63 6b 20 69 73 0d 0a 2a 2a 20 73 6b 69 70 70 ack is..** skipp
17290 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b ed and SQLITE_OK
17291 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a is returned...*
17292 2a 0d 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 *..** If pDone i
17293 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e s not NULL, then
17294 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 it is a record
17295 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 of pages that ha
17296 76 65 20 61 6c 72 65 61 64 79 0d 0a 2a 2a 20 62 ve already..** b
17297 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e een played back.
17298 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 If the page at
17299 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c *pOffset has al
1729a 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 ready been playe
1729b 64 20 62 61 63 6b 0d 0a 2a 2a 20 28 69 66 20 74 d back..** (if t
1729c 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
1729d 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 pDone bit is se
1729e 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 t) then skip the
1729f 20 70 6c 61 79 62 61 63 6b 2e 0d 0a 2a 2a 20 4d playback...** M
172a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f ake sure the pDo
172a1 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e ne bit correspon
172a2 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 ding to the *pOf
172a3 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 fset page is set
172a4 0d 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 ..** prior to re
172a5 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a turning...**..**
172a6 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 If the page rec
172a7 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 ord is successfu
172a8 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 lly read from th
172a9 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 e (sub-)journal
172aa 66 69 6c 65 0d 0a 2a 2a 20 61 6e 64 20 70 6c 61 file..** and pla
172ab 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 yed back, then S
172ac 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 QLITE_OK is retu
172ad 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 rned. If an IO e
172ae 72 72 6f 72 20 6f 63 63 75 72 73 0d 0a 2a 2a 20 rror occurs..**
172af 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 while reading th
172b0 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 e record from th
172b1 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 e (sub-)journal
172b2 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 file or while wr
172b3 69 74 69 6e 67 0d 0a 2a 2a 20 74 6f 20 74 68 65 iting..** to the
172b4 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 database file,
172b5 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f then the IO erro
172b6 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e r code is return
172b7 65 64 2e 20 49 66 20 64 61 74 61 0d 0a 2a 2a 20 ed. If data..**
172b8 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 is successfully
172b9 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 read from the (s
172ba 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ub-)journal file
172bb 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 but appears to
172bc 62 65 0d 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 be..** corrupted
172bd 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 , SQLITE_DONE is
172be 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 returned. Data
172bf 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f is considered co
172c0 72 72 75 70 74 65 64 20 69 6e 0d 0a 2a 2a 20 74 rrupted in..** t
172c1 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 wo circumstances
172c2 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 20 2a 20 49 :..** ..** * I
172c3 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 f the record pag
172c4 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 e-number is ille
172c5 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f gal (0 or PAGER_
172c6 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0d 0a 2a 2a MJ_PGNO), or..**
172c7 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f * If the reco
172c8 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c rd is being roll
172c9 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 ed back from the
172ca 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 main journal fi
172cb 6c 65 0d 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 le..** and t
172cc 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c he checksum fiel
172cd 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 d does not match
172ce 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 the record cont
172cf 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 65 69 ent...**..** Nei
172d0 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 ther of these tw
172d1 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 o scenarios are
172d2 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 possible during
172d3 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c a savepoint roll
172d4 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 back...**..** If
172d5 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 this is a savep
172d6 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 oint rollback, t
172d7 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 hen memory may h
172d8 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 ave to be dynami
172d9 63 61 6c 6c 79 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 cally..** alloca
172da 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 ted by this func
172db 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 tion. If this is
172dc 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e the case and an
172dd 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c allocation fail
172de 73 2c 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f s,..** SQLITE_NO
172df 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e MEM is returned.
172e0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
172e1 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f pager_playback_
172e2 6f 6e 65 5f 70 61 67 65 28 0d 0a 20 20 50 61 67 one_page(.. Pag
172e3 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 er *pPager,
172e4 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
172e5 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c e pager being pl
172e6 61 79 65 64 20 62 61 63 6b 20 2a 2f 0d 0a 20 20 ayed back */..
172e7 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 i64 *pOffset,
172e8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
172e9 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 Offset of recor
172ea 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f d to playback */
172eb 0d 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e .. Bitvec *pDon
172ec 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
172ed 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 /* Bitvec of p
172ee 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 ages already pla
172ef 79 65 64 20 62 61 63 6b 20 2a 2f 0d 0a 20 20 69 yed back */.. i
172f0 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 nt isMainJrnl,
172f1 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
172f2 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 1 -> main journa
172f3 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 l. 0 -> sub-jour
172f4 6e 61 6c 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 nal. */.. int i
172f5 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 sSavepnt
172f6 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
172f7 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 for a savepoint
172f8 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29 7b rollback */..){
172f9 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 50 .. int rc;.. P
172fa 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 gHdr *pPg;
172fb 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
172fc 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 An existing page
172fd 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f in the cache */
172fe 0d 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 .. Pgno pgno;
172ff 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17300 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 /* The page nu
17301 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 mber of a page i
17302 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 20 n journal */..
17303 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 u32 cksum;
17304 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
17305 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 Checksum used f
17306 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 or sanity checki
17307 6e 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 61 ng */.. char *a
17308 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 Data;
17309 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 /* Tempor
1730a 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 ary storage for
1730b 74 68 65 20 70 61 67 65 20 2a 2f 0d 0a 20 20 73 the page */.. s
1730c 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 qlite3_file *jfd
1730d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
1730e 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 The file descrip
1730f 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 tor for the jour
17310 6e 61 6c 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 nal file */.. i
17311 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 nt isSynced;
17312 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
17313 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 True if journal
17314 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a page is synced *
17315 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 28 /.... assert( (
17316 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d isMainJrnl&~1)==
17317 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 0 ); /* isM
17318 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 ainJrnl is 0 or
17319 31 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 1 */.. assert(
1731a 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d (isSavepnt&~1)==
1731b 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 0 ); /* is
1731c 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 Savepnt is 0 or
1731d 31 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 1 */.. assert(
1731e 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 isMainJrnl || pD
1731f 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 one ); /* pD
17320 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 one always used
17321 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 on sub-journals
17322 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 69 73 */.. assert( is
17323 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 Savepnt || pDone
17324 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e ==0 ); /* pDon
17325 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 e never used on
17326 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f non-savepoint */
17327 0d 0a 0d 0a 20 20 61 44 61 74 61 20 3d 20 70 50 .... aData = pP
17328 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b ager->pTmpSpace;
17329 0d 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 .. assert( aDat
1732a 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 a ); /*
1732b 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 Temp storage mus
1732c 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 t have already b
1732d 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f een allocated */
1732e 0d 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 .. assert( page
1732f 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d rUseWal(pPager)=
17330 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 =0 || (!isMainJr
17331 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 nl && isSavepnt)
17332 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 45 69 74 68 );.... /* Eith
17333 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 er the state is
17334 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 greater than PAG
17335 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d ER_WRITER_CACHEM
17336 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f OD (a transactio
17337 6e 20 0d 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 n .. ** or save
17338 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 point rollback d
17339 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 one at the reque
1733a 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 st of the caller
1733b 29 20 6f 72 20 74 68 69 73 20 69 73 0d 0a 20 20 ) or this is..
1733c 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c ** a hot-journal
1733d 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 rollback. If it
1733e 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 is a hot-journa
1733f 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 l rollback, the
17340 70 61 67 65 72 0d 0a 20 20 2a 2a 20 69 73 20 69 pager.. ** is i
17341 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 n state OPEN and
17342 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 holds an EXCLUS
17343 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f IVE lock. Hot-jo
17344 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0d 0a urnal rollback..
17345 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 ** only reads
17346 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f from the main jo
17347 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 urnal, not the s
17348 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0d 0a 20 20 2a ub-journal... *
17349 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 /.. assert( pPa
1734a 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 ger->eState>=PAG
1734b 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d ER_WRITER_CACHEM
1734c 4f 44 0d 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 OD.. || (p
1734d 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 Pager->eState==P
1734e 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 AGER_OPEN && pPa
1734f 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c ger->eLock==EXCL
17350 55 53 49 56 45 5f 4c 4f 43 4b 29 0d 0a 20 20 29 USIVE_LOCK).. )
17351 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
17352 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 ger->eState>=PAG
17353 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d ER_WRITER_CACHEM
17354 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c OD || isMainJrnl
17355 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 52 65 61 64 );.... /* Read
17356 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 the page number
17357 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 and page data f
17358 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 rom the journal
17359 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0d 0a or sub-journal..
1735a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 ** file. Retur
1735b 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 n an error code
1735c 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 to the caller if
1735d 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 an IO error occ
1735e 75 72 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 6a 66 urs... */.. jf
1735f 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f d = isMainJrnl ?
17360 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 pPager->jfd : p
17361 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0d 0a 20 20 Pager->sjfd;..
17362 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 rc = read32bits(
17363 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 jfd, *pOffset, &
17364 70 67 6e 6f 29 3b 0d 0a 20 20 69 66 28 20 72 63 pgno);.. if( rc
17365 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 !=SQLITE_OK ) re
17366 74 75 72 6e 20 72 63 3b 0d 0a 20 20 72 63 20 3d turn rc;.. rc =
17367 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a sqlite3OsRead(j
17368 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 fd, (u8*)aData,
17369 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 pPager->pageSize
1736a 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b , (*pOffset)+4);
1736b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 .. if( rc!=SQLI
1736c 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 TE_OK ) return r
1736d 63 3b 0d 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b c;.. *pOffset +
1736e 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 = pPager->pageSi
1736f 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a ze + 4 + isMainJ
17370 72 6e 6c 2a 34 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 rnl*4;.... /* S
17371 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f anity checking o
17372 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 n the page. Thi
17373 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 s is more import
17374 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 ant that I origi
17375 6e 61 6c 6c 79 0d 0a 20 20 2a 2a 20 74 68 6f 75 nally.. ** thou
17376 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 ght. If a power
17377 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 failure occurs
17378 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 while the journa
17379 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 l is being writt
1737a 65 6e 2c 0d 0a 20 20 2a 2a 20 69 74 20 63 6f 75 en,.. ** it cou
1737b 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 ld cause invalid
1737c 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 data to be writ
1737d 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 ten into the jou
1737e 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 rnal. We need t
1737f 6f 0d 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 o.. ** detect t
17380 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 his invalid data
17381 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 (with high prob
17382 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e ability) and ign
17383 6f 72 65 20 69 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 ore it... */..
17384 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 if( pgno==0 ||
17385 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 pgno==PAGER_MJ_P
17386 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0d 0a GNO(pPager) ){..
17387 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 assert( !isS
17388 61 76 65 70 6e 74 20 29 3b 0d 0a 20 20 20 20 72 avepnt );.. r
17389 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e eturn SQLITE_DON
1738a 45 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 E;.. }.. if( p
1738b 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 gno>(Pgno)pPager
1738c 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 ->dbSize || sqli
1738d 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 te3BitvecTest(pD
1738e 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0d 0a 20 one, pgno) ){..
1738f 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
17390 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 _OK;.. }.. if(
17391 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0d 0a isMainJrnl ){..
17392 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 rc = read32b
17393 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 its(jfd, (*pOffs
17394 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0d et)-4, &cksum);.
17395 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 . if( rc ) re
17396 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 69 66 turn rc;.. if
17397 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 ( !isSavepnt &&
17398 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 pager_cksum(pPag
17399 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 er, (u8*)aData)!
1739a 3d 63 6b 73 75 6d 20 29 7b 0d 0a 20 20 20 20 20 =cksum ){..
1739b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 return SQLITE_D
1739c 4f 4e 45 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d ONE;.. }.. }
1739d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 .... /* If this
1739e 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 page has alread
1739f 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 y been played by
173a0 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 before during t
173a1 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 2a 2a he current.. **
173a2 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 rollback, then
173a3 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 don't bother to
173a4 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 play it back aga
173a5 69 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 in... */.. if(
173a6 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 pDone && (rc =
173a7 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 sqlite3BitvecSet
173a8 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d (pDone, pgno))!=
173a9 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
173aa 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 return rc;..
173ab 7d 0d 0a 0d 0a 20 20 2f 2a 20 57 68 65 6e 20 70 }.... /* When p
173ac 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 laying back page
173ad 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 1, restore the
173ae 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 nReserve setting
173af 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 67 .. */.. if( pg
173b0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d no==1 && pPager-
173b1 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a >nReserve!=((u8*
173b2 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0d 0a )aData)[20] ){..
173b3 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 pPager->nRes
173b4 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 erve = ((u8*)aDa
173b5 74 61 29 5b 32 30 5d 3b 0d 0a 20 20 20 20 70 61 ta)[20];.. pa
173b6 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 gerReportSize(pP
173b7 61 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 ager);.. }....
173b8 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 /* If the pager
173b9 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 is in CACHEMOD
173ba 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 state, then ther
173bb 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 e must be a copy
173bc 20 6f 66 20 74 68 69 73 0d 0a 20 20 2a 2a 20 70 of this.. ** p
173bd 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 age in the pager
173be 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 cache. In this
173bf 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 case just update
173c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 the pager cache
173c1 2c 0d 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 ,.. ** not the
173c2 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 database file. T
173c3 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 he page is left
173c4 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 marked dirty in
173c5 74 68 69 73 20 63 61 73 65 2e 0d 0a 20 20 2a 2a this case... **
173c6 0d 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 .. ** An except
173c7 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 ion to the above
173c8 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 rule: If the da
173c9 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d tabase is in no-
173ca 73 79 6e 63 20 6d 6f 64 65 0d 0a 20 20 2a 2a 20 sync mode.. **
173cb 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f and a page is mo
173cc 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e ved during an in
173cd 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d cremental vacuum
173ce 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d then the page m
173cf 61 79 0d 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 ay.. ** not be
173d0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 in the pager cac
173d1 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 he. Later: if a
173d2 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 malloc() or IO e
173d3 72 72 6f 72 20 6f 63 63 75 72 73 0d 0a 20 20 2a rror occurs.. *
173d4 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 * during a Movep
173d5 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e age() call, then
173d6 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f the page may no
173d7 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 t be in the cach
173d8 65 0d 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 e.. ** either.
173d9 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e So the condition
173da 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 described in th
173db 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 e above paragrap
173dc 68 20 69 73 20 6e 6f 74 0d 0a 20 20 2a 2a 20 61 h is not.. ** a
173dd 73 73 65 72 74 28 29 61 62 6c 65 2e 0d 0a 20 20 ssert()able...
173de 2a 2a 0d 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 **.. ** If in W
173df 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 RITER_DBMOD, WRI
173e0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 TER_FINISHED or
173e1 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e OPEN state, then
173e2 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0d 0a we update the..
173e3 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 ** pager cache
173e4 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e if it exists an
173e5 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e d the main file.
173e6 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 The page is the
173e7 6e 20 6d 61 72 6b 65 64 20 0d 0a 20 20 2a 2a 20 n marked .. **
173e8 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 not dirty. Since
173e9 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e this code is on
173ea 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 ly executed in P
173eb 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 AGER_OPEN state
173ec 66 6f 72 0d 0a 20 20 2a 2a 20 61 20 68 6f 74 2d for.. ** a hot-
173ed 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b journal rollback
173ee 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 , it is guarante
173ef 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 ed that the page
173f0 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0d -cache is empty.
173f1 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 . ** if the pag
173f2 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 er is in OPEN st
173f3 61 74 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a ate... **.. **
173f4 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 Ticket #1171:
173f5 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f The statement jo
173f6 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 urnal might cont
173f7 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 ain page content
173f8 20 74 68 61 74 20 69 73 0d 0a 20 20 2a 2a 20 64 that is.. ** d
173f9 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 ifferent from th
173fa 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 e page content a
173fb 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 t the start of t
173fc 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d he transaction..
173fd 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 . ** This occur
173fe 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 s when a page is
173ff 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 changed prior t
17400 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 o the start of a
17401 20 73 74 61 74 65 6d 65 6e 74 0d 0a 20 20 2a 2a statement.. **
17402 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 then changed ag
17403 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 ain within the s
17404 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 tatement. When
17405 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 rolling back suc
17406 68 20 61 0d 0a 20 20 2a 2a 20 73 74 61 74 65 6d h a.. ** statem
17407 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 ent we must not
17408 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 write to the ori
17409 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 ginal database u
1740a 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0d 0a 20 nless we know..
1740b 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 ** for certain
1740c 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 that original pa
1740d 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 ge contents are
1740e 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 synced into the
1740f 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0d 0a 20 main rollback..
17410 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 ** journal. Ot
17411 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 herwise, a power
17412 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 loss might leav
17413 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 e modified data
17414 69 6e 20 74 68 65 0d 0a 20 20 2a 2a 20 64 61 74 in the.. ** dat
17415 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f abase file witho
17416 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 ut an entry in t
17417 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 he rollback jour
17418 6e 61 6c 20 74 68 61 74 20 63 61 6e 0d 0a 20 20 nal that can..
17419 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 ** restore the d
1741a 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f atabase to its o
1741b 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 riginal form. T
1741c 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 wo conditions mu
1741d 73 74 20 62 65 0d 0a 20 20 2a 2a 20 6d 65 74 20 st be.. ** met
1741e 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 before writing t
1741f 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 o the database f
17420 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 iles. (1) the da
17421 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0d 0a tabase must be..
17422 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 ** locked. (2
17423 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 ) we know that t
17424 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 he original page
17425 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c content is full
17426 79 20 73 79 6e 63 65 64 0d 0a 20 20 2a 2a 20 69 y synced.. ** i
17427 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e n the main journ
17428 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 al either becaus
17429 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f e the page is no
1742a 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c t in cache or el
1742b 73 65 0d 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 se.. ** the pag
1742c 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e e is marked as n
1742d 65 65 64 53 79 6e 63 3d 3d 30 2e 0d 0a 20 20 2a eedSync==0... *
1742e 2a 0d 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d *.. ** 2008-04-
1742f 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 14: When attemp
17430 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 ting to vacuum a
17431 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 corrupt databas
17432 65 20 66 69 6c 65 2c 20 69 74 0d 0a 20 20 2a 2a e file, it.. **
17433 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 is possible to
17434 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 fail a statement
17435 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 on a database t
17436 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 hat does not yet
17437 20 65 78 69 73 74 2e 0d 0a 20 20 2a 2a 20 44 6f exist... ** Do
17438 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 not attempt to
17439 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 write if databas
1743a 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 e file has never
1743b 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0d 0a 20 been opened...
1743c 20 2a 2f 0d 0a 20 20 69 66 28 20 70 61 67 65 72 */.. if( pager
1743d 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 UseWal(pPager) )
1743e 7b 0d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0d {.. pPg = 0;.
1743f 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
17440 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 Pg = pager_looku
17441 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b p(pPager, pgno);
17442 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
17443 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 pPg || !MEMDB )
17444 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
17445 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 ger->eState!=PAG
17446 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d ER_OPEN || pPg==
17447 30 20 29 3b 0d 0a 20 20 50 41 47 45 52 54 52 41 0 );.. PAGERTRA
17448 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 CE(("PLAYBACK %d
17449 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 page %d hash(%0
1744a 38 78 29 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 8x) %s\n",..
1744b 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 PAGERID(p
1744c 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 Pager), pgno, pa
1744d 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 ger_datahash(pPa
1744e 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 ger->pageSize, (
1744f 75 38 2a 29 61 44 61 74 61 29 2c 0d 0a 20 20 20 u8*)aData),..
17450 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a (isMainJ
17451 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 rnl?"main-journa
17452 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 l":"sub-journal"
17453 29 0d 0a 20 20 29 29 3b 0d 0a 20 20 69 66 28 20 ).. ));.. if(
17454 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0d 0a 20 isMainJrnl ){..
17455 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 isSynced = pP
17456 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 ager->noSync ||
17457 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 (*pOffset <= pPa
17458 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 ger->journalHdr)
17459 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
1745a 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 isSynced = (pPg
1745b 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e ==0 || 0==(pPg->
1745c 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 flags & PGHDR_NE
1745d 45 44 5f 53 59 4e 43 29 29 3b 0d 0a 20 20 7d 0d ED_SYNC));.. }.
1745e 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 . if( isOpen(pP
1745f 61 67 65 72 2d 3e 66 64 29 0d 0a 20 20 20 26 26 ager->fd).. &&
17460 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 (pPager->eState
17461 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 >=PAGER_WRITER_D
17462 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e BMOD || pPager->
17463 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 eState==PAGER_OP
17464 45 4e 29 0d 0a 20 20 20 26 26 20 69 73 53 79 6e EN).. && isSyn
17465 63 65 64 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 69 ced.. ){.. i
17466 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 64 ofst = (pgno-
17467 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 1)*(i64)pPager->
17468 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 20 20 74 pageSize;.. t
17469 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 estcase( !isSave
1746a 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 pnt && pPg!=0 &&
1746b 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 (pPg->flags&PGH
1746c 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 DR_NEED_SYNC)!=0
1746d 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
1746e 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 !pagerUseWal(pP
1746f 61 67 65 72 29 20 29 3b 0d 0a 20 20 20 20 72 63 ager) );.. rc
17470 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 = sqlite3OsWrit
17471 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 e(pPager->fd, (u
17472 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 8*)aData, pPager
17473 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 ->pageSize, ofst
17474 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 67 6e 6f );.. if( pgno
17475 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 >pPager->dbFileS
17476 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 70 50 ize ){.. pP
17477 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 ager->dbFileSize
17478 20 3d 20 70 67 6e 6f 3b 0d 0a 20 20 20 20 7d 0d = pgno;.. }.
17479 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d . if( pPager-
1747a 3e 70 42 61 63 6b 75 70 20 29 7b 0d 0a 20 20 20 >pBackup ){..
1747b 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 CODEC1(pPager
1747c 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 , aData, pgno, 3
1747d 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 , rc=SQLITE_NOME
1747e 4d 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 M);.. sqlit
1747f 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 e3BackupUpdate(p
17480 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 Pager->pBackup,
17481 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 pgno, (u8*)aData
17482 29 3b 0d 0a 20 20 20 20 20 20 43 4f 44 45 43 32 );.. CODEC2
17483 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 (pPager, aData,
17484 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 pgno, 7, rc=SQLI
17485 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 TE_NOMEM, aData)
17486 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 ;.. }.. }els
17487 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e e if( !isMainJrn
17488 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0d 0a l && pPg==0 ){..
17489 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 /* If this i
1748a 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 s a rollback of
1748b 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 a savepoint and
1748c 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 data was not wri
1748d 74 74 65 6e 20 74 6f 0d 0a 20 20 20 20 2a 2a 20 tten to.. **
1748e 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 the database and
1748f 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 the page is not
17490 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 in-memory, ther
17491 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c e is a potential
17492 0d 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d .. ** problem
17493 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 . When the page
17494 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 is next fetched
17495 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 by the b-tree la
17496 79 65 72 2c 20 69 74 20 0d 0a 20 20 20 20 2a 2a yer, it .. **
17497 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 will be read fr
17498 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 om the database
17499 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 file, which may
1749a 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0d 0a or may not be ..
1749b 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 ** current.
1749c 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a .. **.. **
1749d 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 There are a cou
1749e 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 ple of different
1749f 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 ways this can h
174a0 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 appen. All are q
174a1 75 69 74 65 0d 0a 20 20 20 20 2a 2a 20 6f 62 73 uite.. ** obs
174a2 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 cure. When runni
174a3 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 ng in synchronou
174a4 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e s mode, this can
174a5 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0d 0a 20 only happen ..
174a6 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 ** if the pag
174a7 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 e is on the free
174a8 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 -list at the sta
174a9 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 rt of the transa
174aa 63 74 69 6f 6e 2c 20 74 68 65 6e 0d 0a 20 20 20 ction, then..
174ab 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 ** populated, t
174ac 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 hen moved using
174ad 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 sqlite3PagerMove
174ae 70 61 67 65 28 29 2e 0d 0a 20 20 20 20 2a 2a 0d page()... **.
174af 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 . ** The solu
174b0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 tion is to add a
174b1 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 n in-memory page
174b2 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f to the cache co
174b3 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20 2a 2a ntaining.. **
174b4 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 the data just r
174b5 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 ead from the sub
174b6 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 -journal. Mark t
174b7 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 he page as dirty
174b8 20 0d 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 .. ** and if
174b9 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 the pager requi
174ba 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 res a journal-sy
174bb 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 nc, then mark th
174bc 65 20 70 61 67 65 20 61 73 20 0d 0a 20 20 20 20 e page as ..
174bd 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a ** requiring a j
174be 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f ournal-sync befo
174bf 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e re it is written
174c0 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 ... */.. a
174c1 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 ssert( isSavepnt
174c2 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
174c3 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 pPager->doNotSp
174c4 69 6c 6c 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 70 ill==0 );.. p
174c5 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c Pager->doNotSpil
174c6 6c 2b 2b 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 l++;.. rc = s
174c7 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 qlite3PagerAcqui
174c8 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c re(pPager, pgno,
174c9 20 26 70 50 67 2c 20 31 29 3b 0d 0a 20 20 20 20 &pPg, 1);..
174ca 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
174cb 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b doNotSpill==1 );
174cc 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f .. pPager->do
174cd 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0d 0a 20 20 20 NotSpill--;..
174ce 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
174cf 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d OK ) return rc;.
174d0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 . pPg->flags
174d1 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 &= ~PGHDR_NEED_R
174d2 45 41 44 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 EAD;.. sqlite
174d3 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 3PcacheMakeDirty
174d4 28 70 50 67 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 (pPg);.. }.. i
174d5 66 28 20 70 50 67 20 29 7b 0d 0a 20 20 20 20 2f f( pPg ){.. /
174d6 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 * No page should
174d7 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 ever be explici
174d8 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 tly rolled back
174d9 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 that is in use,
174da 65 78 63 65 70 74 0d 0a 20 20 20 20 2a 2a 20 66 except.. ** f
174db 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 or page 1 which
174dc 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 is held in use i
174dd 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 n order to keep
174de 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0d the lock on the.
174df 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 . ** database
174e0 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 active. However
174e1 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 such a page may
174e2 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 be rolled back
174e3 61 73 20 61 20 72 65 73 75 6c 74 0d 0a 20 20 20 as a result..
174e4 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e ** of an intern
174e5 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 al error resulti
174e6 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 ng in an automat
174e7 69 63 20 63 61 6c 6c 20 74 6f 0d 0a 20 20 20 20 ic call to..
174e8 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 ** sqlite3PagerR
174e9 6f 6c 6c 62 61 63 6b 28 29 2e 0d 0a 20 20 20 20 ollback()...
174ea 2a 2f 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 */.. void *pD
174eb 61 74 61 3b 0d 0a 20 20 20 20 70 44 61 74 61 20 ata;.. pData
174ec 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0d 0a 20 = pPg->pData;..
174ed 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c memcpy(pData,
174ee 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 (u8*)aData, pPa
174ef 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0d ger->pageSize);.
174f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 . pPager->xRe
174f1 69 6e 69 74 65 72 28 70 50 67 29 3b 0d 0a 20 20 initer(pPg);..
174f2 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c if( isMainJrnl
174f3 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 && (!isSavepnt
174f4 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 || *pOffset<=pPa
174f5 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 ger->journalHdr)
174f6 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 ){.. /* If
174f7 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 the contents of
174f8 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 this page were
174f9 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 just restored fr
174fa 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0d 0a 20 20 om the main ..
174fb 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 ** journal f
174fc 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f ile, then its co
174fd 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 ntent must be as
174fe 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 they were when
174ff 74 68 65 20 0d 0a 20 20 20 20 20 20 2a 2a 20 74 the .. ** t
17500 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 ransaction was f
17501 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 irst opened. In
17502 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e this case we can
17503 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0d 0a mark the page..
17504 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 ** as clea
17505 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 n, since there w
17506 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 ill be no need t
17507 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 o write it out t
17508 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 o the.. **
17509 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 database...
1750a 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 54 68 **.. ** Th
1750b 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 ere is one excep
1750c 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c tion to this rul
1750d 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 e. If the page i
1750e 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0d 0a s being rolled..
1750f 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 ** back as
17510 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 part of a savep
17511 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 oint (or stateme
17512 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f nt) rollback fro
17513 6d 20 61 6e 20 0d 0a 20 20 20 20 20 20 2a 2a 20 m an .. **
17514 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e unsynced portion
17515 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 of the main jou
17516 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 rnal file, then
17517 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0d 0a it is not safe..
17518 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b ** to mark
17519 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 the page as cle
1751a 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 an. This is beca
1751b 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 use marking the
1751c 70 61 67 65 20 61 73 0d 0a 20 20 20 20 20 20 2a page as.. *
1751d 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 * clean will cle
1751e 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 ar the PGHDR_NEE
1751f 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e D_SYNC flag. Sin
17520 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0d 0a ce the page is..
17521 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 ** already
17522 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 in the journal
17523 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 file (recorded i
17524 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e n Pager.pInJourn
17525 61 6c 29 20 61 6e 64 0d 0a 20 20 20 20 20 20 2a al) and.. *
17526 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 * the PGHDR_NEED
17527 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c _SYNC flag is cl
17528 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 eared, if the pa
17529 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f ge is written to
1752a 0d 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e .. ** again
1752b 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 within this tra
1752c 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c nsaction, it wil
1752d 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 l be marked as d
1752e 69 72 74 79 20 62 75 74 0d 0a 20 20 20 20 20 20 irty but..
1752f 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 ** the PGHDR_NEE
17530 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c D_SYNC flag will
17531 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 not be set. It
17532 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e could then poten
17533 74 69 61 6c 6c 79 0d 0a 20 20 20 20 20 20 2a 2a tially.. **
17534 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 be written out
17535 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 into the databas
17536 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 e file before it
17537 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0d 0a s journal file..
17538 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 ** segment
17539 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 is synced. If a
1753a 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 crash occurs du
1753b 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e ring or followin
1753c 67 20 74 68 69 73 2c 0d 0a 20 20 20 20 20 20 2a g this,.. *
1753d 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 * database corru
1753e 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e ption may ensue.
1753f 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 .. */..
17540 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 assert( !pager
17541 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 UseWal(pPager) )
17542 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ;.. sqlite3
17543 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 PcacheMakeClean(
17544 70 50 67 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 pPg);.. }..
17545 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 pager_set_page
17546 68 61 73 68 28 70 50 67 29 3b 0d 0a 0d 0a 20 20 hash(pPg);....
17547 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 /* If this was
17548 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 page 1, then re
17549 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 store the value
1754a 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 of Pager.dbFileV
1754b 65 72 73 2e 0d 0a 20 20 20 20 2a 2a 20 44 6f 20 ers... ** Do
1754c 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 this before any
1754d 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0d 0a 20 20 decoding. */..
1754e 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b if( pgno==1 ){
1754f 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 .. memcpy(&
17550 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 pPager->dbFileVe
17551 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 rs, &((u8*)pData
17552 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 )[24],sizeof(pPa
17553 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 ger->dbFileVers)
17554 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 );.. }....
17555 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 /* Decode the p
17556 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 age just read fr
17557 6f 6d 20 64 69 73 6b 20 2a 2f 0d 0a 20 20 20 20 om disk */..
17558 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 CODEC1(pPager, p
17559 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c Data, pPg->pgno,
1755a 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 3, rc=SQLITE_NO
1755b 4d 45 4d 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 MEM);.. sqlit
1755c 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 e3PcacheRelease(
1755d 70 50 67 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 pPg);.. }.. re
1755e 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
1755f 2a 0d 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 *..** Parameter
17560 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e zMaster is the n
17561 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 ame of a master
17562 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 journal file. A
17563 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0d 0a single journal..
17564 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 ** file that ref
17565 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 erred to the mas
17566 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
17567 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 has just been r
17568 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 2a 2a 20 olled back...**
17569 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 This routine che
1756a 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 cks if it is pos
1756b 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 sible to delete
1756c 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
1756d 61 6c 20 66 69 6c 65 2c 0d 0a 2a 2a 20 61 6e 64 al file,..** and
1756e 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 does so if it i
1756f 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 72 67 75 6d s...**..** Argum
17570 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 ent zMaster may
17571 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 point to Pager.p
17572 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 TmpSpace. So tha
17573 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 t buffer is not
17574 0d 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 ..** available f
17575 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 or use within th
17576 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a is function...**
17577 0d 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 ..** When a mast
17578 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
17579 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 is created, it i
1757a 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 s populated with
1757b 20 74 68 65 20 6e 61 6d 65 73 20 0d 0a 2a 2a 20 the names ..**
1757c 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 of all of its ch
1757d 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e ild journals, on
1757e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c e after another,
1757f 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 formatted as ut
17580 66 2d 38 20 0d 0a 2a 2a 20 65 6e 63 6f 64 65 64 f-8 ..** encoded
17581 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f text. The end o
17582 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 f each child jou
17583 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 rnal file is mar
17584 6b 65 64 20 77 69 74 68 20 61 20 0d 0a 2a 2a 20 ked with a ..**
17585 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 nul-terminator b
17586 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e yte (0x00). i.e.
17587 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 the entire cont
17588 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 ents of a master
17589 20 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 66 69 6c journal..** fil
1758a 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 e for a transact
1758b 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 ion involving tw
1758c 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 o databases migh
1758d 74 20 62 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 t be:..**..**
1758e 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 "/home/bill/a.db
1758f 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d -journal\x00/hom
17590 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 e/bill/b.db-jour
17591 6e 61 6c 5c 78 30 30 22 0d 0a 2a 2a 0d 0a 2a 2a nal\x00"..**..**
17592 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 A master journa
17593 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 l file may only
17594 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 be deleted once
17595 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 all of its child
17596 20 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 ..** journals h
17597 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 ave been rolled
17598 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 back...**..** Th
17599 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 is function read
1759a 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f s the contents o
1759b 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 f the master-jou
1759c 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0d rnal file into .
1759d 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c .** memory and l
1759e 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 oops through eac
1759f 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a h of the child j
175a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f ournal names. Fo
175a1 72 0d 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 r..** each child
175a2 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 journal, it che
175a3 63 6b 73 20 69 66 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 cks if:..**..**
175a4 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 * if the child
175a5 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c journal exists,
175a6 20 61 6e 64 20 69 66 20 73 6f 0d 0a 2a 2a 20 20 and if so..**
175a7 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 * if the child
175a8 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 journal contains
175a9 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 a reference to
175aa 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0d master journal .
175ab 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 .** file zMa
175ac 73 74 65 72 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 ster..**..** If
175ad 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 a child journal
175ae 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 can be found tha
175af 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f t matches both o
175b0 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0d 0a f the criteria..
175b1 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 ** above, this f
175b2 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
175b3 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e without doing an
175b4 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 ything. Otherwis
175b5 65 2c 20 69 66 0d 0a 2a 2a 20 6e 6f 20 73 75 63 e, if..** no suc
175b6 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 h child journal
175b7 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 can be found, fi
175b8 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 le zMaster is de
175b9 6c 65 74 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 74 leted from..** t
175ba 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 he file-system u
175bb 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 sing sqlite3OsDe
175bc 6c 65 74 65 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 lete()...**..**
175bd 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 If an IO error w
175be 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 ithin this funct
175bf 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f ion, an error co
175c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 de is returned.
175c1 54 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f This..** functio
175c2 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f n allocates memo
175c3 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 ry by calling sq
175c4 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 lite3Malloc(). I
175c5 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d f an allocation.
175c6 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 .** fails, SQLIT
175c7 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 E_NOMEM is retur
175c8 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ned. Otherwise,
175c9 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c if no IO or mall
175ca 6f 63 20 65 72 72 6f 72 73 20 0d 0a 2a 2a 20 6f oc errors ..** o
175cb 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 ccur, SQLITE_OK
175cc 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a is returned...**
175cd 0d 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 ..** TODO: This
175ce 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 function allocat
175cf 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 es a single bloc
175d0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c k of memory to l
175d1 6f 61 64 0d 0a 2a 2a 20 74 68 65 20 65 6e 74 69 oad..** the enti
175d2 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 re contents of t
175d3 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
175d4 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 l file. This cou
175d5 6c 64 20 62 65 0d 0a 2a 2a 20 61 20 63 6f 75 70 ld be..** a coup
175d6 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 le of kilobytes
175d7 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 or so - potentia
175d8 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 lly larger than
175d9 74 68 65 20 70 61 67 65 20 0d 0a 2a 2a 20 73 69 the page ..** si
175da 7a 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ze...*/..static
175db 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 int pager_delmas
175dc 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 ter(Pager *pPage
175dd 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a r, const char *z
175de 4d 61 73 74 65 72 29 7b 0d 0a 20 20 73 71 6c 69 Master){.. sqli
175df 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 te3_vfs *pVfs =
175e0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0d 0a 20 pPager->pVfs;..
175e1 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
175e2 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
175e3 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 turn code */..
175e4 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d sqlite3_file *pM
175e5 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c aster; /* Mal
175e6 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 loc'd master-jou
175e7 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 rnal file descri
175e8 70 74 6f 72 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 ptor */.. sqlit
175e9 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 e3_file *pJourna
175ea 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 l; /* Malloc'd
175eb 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 child-journal f
175ec 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a ile descriptor *
175ed 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 /.. char *zMast
175ee 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f erJournal = 0; /
175ef 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 * Contents of ma
175f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
175f1 65 20 2a 2f 0d 0a 20 20 69 36 34 20 6e 4d 61 73 e */.. i64 nMas
175f2 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 terJournal;
175f3 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 /* Size of mas
175f4 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
175f5 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4a 6f */.. char *zJo
175f6 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 urnal;
175f7 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f /* Pointer to o
175f8 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 ne journal withi
175f9 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 n MJ file */..
175fa 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 char *zMasterPtr
175fb 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 ; /* Spa
175fc 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 ce to hold MJ fi
175fd 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f lename from a jo
175fe 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0d 0a 20 urnal file */..
175ff 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b int nMasterPtr;
17600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d /* Am
17601 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c ount of space al
17602 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 located to zMast
17603 65 72 50 74 72 5b 5d 20 2a 2f 0d 0a 0d 0a 20 20 erPtr[] */....
17604 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 /* Allocate spac
17605 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 e for both the p
17606 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 Journal and pMas
17607 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 ter file descrip
17608 74 6f 72 73 2e 0d 0a 20 20 2a 2a 20 49 66 20 73 tors... ** If s
17609 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 uccessful, open
1760a 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
1760b 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 al file for read
1760c 69 6e 67 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 70 4d ing... */.. pM
1760d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 aster = (sqlite3
1760e 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d _file *)sqlite3M
1760f 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e allocZero(pVfs->
17610 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0d 0a szOsFile * 2);..
17611 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 pJournal = (sq
17612 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 lite3_file *)(((
17613 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 u8 *)pMaster) +
17614 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b pVfs->szOsFile);
17615 0d 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 .. if( !pMaster
17616 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 ){.. rc = SQ
17617 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d LITE_NOMEM;.. }
17618 65 6c 73 65 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 else{.. const
17619 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 int flags = (SQ
1761a 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e LITE_OPEN_READON
1761b 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d LY|SQLITE_OPEN_M
1761c 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0d ASTER_JOURNAL);.
1761d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1761e 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 3OsOpen(pVfs, zM
1761f 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 aster, pMaster,
17620 66 6c 61 67 73 2c 20 30 29 3b 0d 0a 20 20 7d 0d flags, 0);.. }.
17621 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 . if( rc!=SQLIT
17622 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d E_OK ) goto delm
17623 61 73 74 65 72 5f 6f 75 74 3b 0d 0a 0d 0a 20 20 aster_out;....
17624 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 /* Load the enti
17625 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 re master journa
17626 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 l file into spac
17627 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0d e obtained from.
17628 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 . ** sqlite3_ma
17629 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 lloc() and point
1762a 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 ed to by zMaster
1762b 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 Journal. Also
1762c 6f 62 74 61 69 6e 0d 0a 20 20 2a 2a 20 73 75 66 obtain.. ** suf
1762d 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 ficient space (i
1762e 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f n zMasterPtr) to
1762f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 hold the names
17630 6f 66 20 6d 61 73 74 65 72 0d 0a 20 20 2a 2a 20 of master.. **
17631 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 journal files ex
17632 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 tracted from reg
17633 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f ular rollback-jo
17634 75 72 6e 61 6c 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 urnals... */..
17635 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 rc = sqlite3OsF
17636 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c ileSize(pMaster,
17637 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c &nMasterJournal
17638 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 );.. if( rc!=SQ
17639 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 LITE_OK ) goto d
1763a 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0d 0a 20 elmaster_out;..
1763b 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 nMasterPtr = pV
1763c 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 fs->mxPathname+1
1763d 3b 0d 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 ;.. zMasterJour
1763e 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c nal = sqlite3Mal
1763f 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 loc((int)nMaster
17640 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 Journal + nMaste
17641 72 50 74 72 20 2b 20 31 29 3b 0d 0a 20 20 69 66 rPtr + 1);.. if
17642 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 ( !zMasterJourna
17643 6c 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 l ){.. rc = S
17644 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 QLITE_NOMEM;..
17645 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 goto delmaster
17646 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 4d _out;.. }.. zM
17647 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 asterPtr = &zMas
17648 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 terJournal[nMast
17649 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0d 0a 20 erJournal+1];..
1764a 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 rc = sqlite3OsR
1764b 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 ead(pMaster, zMa
1764c 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e sterJournal, (in
1764d 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c t)nMasterJournal
1764e 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 , 0);.. if( rc!
1764f 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 =SQLITE_OK ) got
17650 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b o delmaster_out;
17651 0d 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e .. zMasterJourn
17652 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 al[nMasterJourna
17653 6c 5d 20 3d 20 30 3b 0d 0a 0d 0a 20 20 7a 4a 6f l] = 0;.... zJo
17654 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a urnal = zMasterJ
17655 6f 75 72 6e 61 6c 3b 0d 0a 20 20 77 68 69 6c 65 ournal;.. while
17656 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 ( (zJournal-zMas
17657 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 terJournal)<nMas
17658 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0d 0a 20 terJournal ){..
17659 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0d 0a int exists;..
1765a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
1765b 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a OsAccess(pVfs, z
1765c 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f Journal, SQLITE_
1765d 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 ACCESS_EXISTS, &
1765e 65 78 69 73 74 73 29 3b 0d 0a 20 20 20 20 69 66 exists);.. if
1765f 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
17660 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 ){.. goto d
17661 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0d 0a 20 elmaster_out;..
17662 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 65 78 }.. if( ex
17663 69 73 74 73 20 29 7b 0d 0a 20 20 20 20 20 20 2f ists ){.. /
17664 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 * One of the jou
17665 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f rnals pointed to
17666 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a by the master j
17667 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0d 0a ournal exists...
17668 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 ** Open it
17669 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 and check if it
1766a 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d points at the m
1766b 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 aster journal. I
1766c 66 0d 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 f.. ** so,
1766d 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 return without d
1766e 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 eleting the mast
1766f 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e er journal file.
17670 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 .. */..
17671 20 20 69 6e 74 20 63 3b 0d 0a 20 20 20 20 20 20 int c;..
17672 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c int flags = (SQL
17673 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c ITE_OPEN_READONL
17674 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 Y|SQLITE_OPEN_MA
17675 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0d 0a 20 20 IN_JOURNAL);..
17676 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
17677 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f OsOpen(pVfs, zJo
17678 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c urnal, pJournal,
17679 20 66 6c 61 67 73 2c 20 30 29 3b 0d 0a 20 20 20 flags, 0);..
1767a 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1767b 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
1767c 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f goto delmaster_
1767d 6f 75 74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d out;.. }...
1767e 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 . rc = read
1767f 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a MasterJournal(pJ
17680 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 ournal, zMasterP
17681 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b tr, nMasterPtr);
17682 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f .. sqlite3O
17683 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 sClose(pJournal)
17684 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 ;.. if( rc!
17685 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
17686 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d goto delm
17687 61 73 74 65 72 5f 6f 75 74 3b 0d 0a 20 20 20 20 aster_out;..
17688 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 63 20 3d }.... c =
17689 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d zMasterPtr[0]!=
1768a 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 0 && strcmp(zMas
1768b 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 terPtr, zMaster)
1768c 3d 3d 30 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 ==0;.. if(
1768d 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a c ){.. /*
1768e 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 We have a match
1768f 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 . Do not delete
17690 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
17691 61 6c 20 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 20 al file. */..
17692 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 goto delmas
17693 74 65 72 5f 6f 75 74 3b 0d 0a 20 20 20 20 20 20 ter_out;..
17694 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 7a 4a }.. }.. zJ
17695 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 ournal += (sqlit
17696 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 e3Strlen30(zJour
17697 6e 61 6c 29 2b 31 29 3b 0d 0a 20 20 7d 0d 0a 20 nal)+1);.. }..
17698 0d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f .. sqlite3OsClo
17699 73 65 28 70 4d 61 73 74 65 72 29 3b 0d 0a 20 20 se(pMaster);..
1769a 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 rc = sqlite3OsDe
1769b 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 lete(pVfs, zMast
1769c 65 72 2c 20 30 29 3b 0d 0a 0d 0a 64 65 6c 6d 61 er, 0);....delma
1769d 73 74 65 72 5f 6f 75 74 3a 0d 0a 20 20 73 71 6c ster_out:.. sql
1769e 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 ite3_free(zMaste
1769f 72 4a 6f 75 72 6e 61 6c 29 3b 0d 0a 20 20 69 66 rJournal);.. if
176a0 28 20 70 4d 61 73 74 65 72 20 29 7b 0d 0a 20 20 ( pMaster ){..
176a1 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 sqlite3OsClose
176a2 28 70 4d 61 73 74 65 72 29 3b 0d 0a 20 20 20 20 (pMaster);..
176a3 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 assert( !isOpen(
176a4 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0d 0a 20 20 pJournal) );..
176a5 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
176a6 4d 61 73 74 65 72 29 3b 0d 0a 20 20 7d 0d 0a 20 Master);.. }..
176a7 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
176a8 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..../*..** This
176a9 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
176aa 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 to change the a
176ab 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 ctual size of th
176ac 65 20 64 61 74 61 62 61 73 65 20 0d 0a 2a 2a 20 e database ..**
176ad 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 file in the file
176ae 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e -system. This on
176af 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 ly happens when
176b0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 committing a tra
176b1 6e 73 61 63 74 69 6f 6e 2c 0d 0a 2a 2a 20 6f 72 nsaction,..** or
176b2 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 rolling back a
176b3 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 transaction (inc
176b4 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 luding rolling b
176b5 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 ack a hot-journa
176b6 6c 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 l)...**..** If t
176b7 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 he main database
176b8 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 file is not ope
176b9 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 n, or the pager
176ba 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 is not in either
176bb 0d 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 ..** DBMOD or OP
176bc 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 EN state, this f
176bd 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d unction is a no-
176be 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 op. Otherwise, t
176bf 68 65 20 73 69 7a 65 20 0d 0a 2a 2a 20 6f 66 20 he size ..** of
176c0 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e the file is chan
176c1 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 ged to nPage pag
176c2 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 es (nPage*pPager
176c3 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 ->pageSize bytes
176c4 29 2e 20 0d 0a 2a 2a 20 49 66 20 74 68 65 20 66 ). ..** If the f
176c5 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 ile on disk is c
176c6 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 urrently larger
176c7 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 than nPage pages
176c8 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 , then use the V
176c9 46 53 0d 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 FS..** xTruncate
176ca 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 () method to tru
176cb 6e 63 61 74 65 20 69 74 2e 0d 0a 2a 2a 0d 0a 2a ncate it...**..*
176cc 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d * Or, it might m
176cd 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 ight be the case
176ce 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f that the file o
176cf 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 n disk is smalle
176d0 72 20 74 68 61 6e 20 0d 0a 2a 2a 20 6e 50 61 67 r than ..** nPag
176d1 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 e pages. Some op
176d2 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 erating system i
176d3 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 mplementations c
176d4 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 an get confused
176d5 69 66 20 0d 0a 2a 2a 20 79 6f 75 20 74 72 79 20 if ..** you try
176d6 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 to truncate a fi
176d7 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 le to some size
176d8 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 that is larger t
176d9 68 61 6e 20 69 74 20 0d 0a 2a 2a 20 63 75 72 72 han it ..** curr
176da 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 ently is, so det
176db 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e ect this case an
176dc 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 d write a single
176dd 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0d 0a zero byte to ..
176de 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 ** the end of th
176df 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 e new file inste
176e0 61 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 ad...**..** If s
176e1 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 uccessful, retur
176e2 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 n SQLITE_OK. If
176e3 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 an IO error occu
176e4 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 rs while modifyi
176e5 6e 67 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 ng..** the datab
176e6 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e ase file, return
176e7 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 the error code
176e8 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a to the caller...
176e9 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 */..static int p
176ea 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 ager_truncate(Pa
176eb 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e ger *pPager, Pgn
176ec 6f 20 6e 50 61 67 65 29 7b 0d 0a 20 20 69 6e 74 o nPage){.. int
176ed 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
176ee 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 .. assert( pPag
176ef 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 er->eState!=PAGE
176f0 52 5f 45 52 52 4f 52 20 29 3b 0d 0a 20 20 61 73 R_ERROR );.. as
176f1 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 sert( pPager->eS
176f2 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 tate!=PAGER_READ
176f3 45 52 20 29 3b 0d 0a 20 20 0d 0a 20 20 69 66 28 ER );.. .. if(
176f4 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e isOpen(pPager->
176f5 66 64 29 20 0d 0a 20 20 20 26 26 20 28 70 50 61 fd) .. && (pPa
176f6 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 ger->eState>=PAG
176f7 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 ER_WRITER_DBMOD
176f8 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 || pPager->eStat
176f9 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0d e==PAGER_OPEN) .
176fa 0a 20 20 29 7b 0d 0a 20 20 20 20 69 36 34 20 63 . ){.. i64 c
176fb 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 urrentSize, newS
176fc 69 7a 65 3b 0d 0a 20 20 20 20 69 6e 74 20 73 7a ize;.. int sz
176fd 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 Page = pPager->p
176fe 61 67 65 53 69 7a 65 3b 0d 0a 20 20 20 20 61 73 ageSize;.. as
176ff 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c sert( pPager->eL
17700 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c ock==EXCLUSIVE_L
17701 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 2f 2a 20 54 OCK );.. /* T
17702 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 ODO: Is it safe
17703 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 to use Pager.dbF
17704 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f ileSize here? */
17705 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
17706 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 e3OsFileSize(pPa
17707 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e ger->fd, ¤
17708 74 53 69 7a 65 29 3b 0d 0a 20 20 20 20 6e 65 77 tSize);.. new
17709 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 Size = szPage*(i
1770a 36 34 29 6e 50 61 67 65 3b 0d 0a 20 20 20 20 69 64)nPage;.. i
1770b 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
1770c 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 && currentSize!
1770d 3d 6e 65 77 53 69 7a 65 20 29 7b 0d 0a 20 20 20 =newSize ){..
1770e 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 if( currentSi
1770f 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0d 0a 20 ze>newSize ){..
17710 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
17711 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 te3OsTruncate(pP
17712 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a ager->fd, newSiz
17713 65 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 e);.. }else
17714 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a if( (currentSiz
17715 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 e+szPage)<=newSi
17716 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 ze ){.. c
17717 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 har *pTmp = pPag
17718 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0d 0a er->pTmpSpace;..
17719 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 memset(p
1771a 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b Tmp, 0, szPage);
1771b 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 .. testca
1771c 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 se( (newSize-szP
1771d 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 age) == currentS
1771e 69 7a 65 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 ize );..
1771f 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 testcase( (newSi
17720 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 ze-szPage) > cu
17721 72 72 65 6e 74 53 69 7a 65 20 29 3b 0d 0a 20 20 rrentSize );..
17722 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
17723 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 e3OsWrite(pPager
17724 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 ->fd, pTmp, szPa
17725 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 ge, newSize-szPa
17726 67 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 ge);.. }..
17727 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
17728 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
17729 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c pPager->dbFil
1772a 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0d 0a eSize = nPage;..
1772b 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
1772c 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
1772d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 ;..}..../*..** S
1772e 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 et the value of
1772f 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 the Pager.sector
17730 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f Size variable fo
17731 72 20 74 68 65 20 67 69 76 65 6e 0d 0a 2a 2a 20 r the given..**
17732 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 pager based on t
17733 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 he value returne
17734 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 d by the xSector
17735 53 69 7a 65 20 6d 65 74 68 6f 64 0d 0a 2a 2a 20 Size method..**
17736 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 of the open data
17737 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 base file. The s
17738 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 ector size will
17739 62 65 20 75 73 65 64 20 75 73 65 64 20 0d 0a 2a be used used ..*
1773a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 * to determine t
1773b 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 he size and alig
1773c 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c nment of journal
1773d 20 68 65 61 64 65 72 20 61 6e 64 20 0d 0a 2a 2a header and ..**
1773e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
1773f 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 pointers within
17740 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 created journal
17741 66 69 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 files...**..** F
17742 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c or temporary fil
17743 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 es the effective
17744 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 sector size is
17745 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 always 512 bytes
17746 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 ...**..** Otherw
17747 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d ise, for non-tem
17748 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 porary files, th
17749 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 e effective sect
1774a 6f 72 20 73 69 7a 65 20 69 73 0d 0a 2a 2a 20 74 or size is..** t
1774b 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 he value returne
1774c 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 d by the xSector
1774d 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f Size() method ro
1774e 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 unded up to 32 i
1774f 66 0d 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 f..** it is less
17750 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 than 32, or rou
17751 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 nded down to MAX
17752 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 _SECTOR_SIZE if
17753 69 74 0d 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 it..** is greate
17754 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f r than MAX_SECTO
17755 52 5f 53 49 5a 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 R_SIZE...**..**
17756 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 If the file has
17757 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 the SQLITE_IOCAP
17758 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 _POWERSAFE_OVERW
17759 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 RITE property, t
1775a 68 65 6e 20 73 65 74 0d 0a 2a 2a 20 74 68 65 20 hen set..** the
1775b 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 effective sector
1775c 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e size to its min
1775d 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 imum value (512)
1775e 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f . The purpose o
1775f 66 0d 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 f..** pPager->se
17760 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 ctorSize is to d
17761 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 efine the "blast
17762 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 radius" of byte
17763 73 20 74 68 61 74 0d 0a 2a 2a 20 6d 69 67 68 74 s that..** might
17764 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 change if a cra
17765 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 sh occurs while
17766 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e writing to a sin
17767 67 6c 65 20 62 79 74 65 20 69 6e 0d 0a 2a 2a 20 gle byte in..**
17768 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 that range. But
17769 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f with POWERSAFE_
1776a 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 OVERWRITE, the b
1776b 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a last radius is z
1776c 65 72 6f 0d 0a 2a 2a 20 28 74 68 61 74 20 69 73 ero..** (that is
1776d 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f what POWERSAFE_
1776e 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 OVERWRITE means)
1776f 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 , so we minimize
17770 20 74 68 65 20 73 65 63 74 6f 72 0d 0a 2a 2a 20 the sector..**
17771 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 size. For backw
17772 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 ards compatibili
17773 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 ty of the rollba
17774 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 ck journal file
17775 66 6f 72 6d 61 74 2c 0d 0a 2a 2a 20 77 65 20 63 format,..** we c
17776 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 annot reduce the
17777 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f effective secto
17778 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 r size below 512
17779 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f ...*/..static vo
1777a 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 id setSectorSize
1777b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b (Pager *pPager){
1777c 0d 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 .. assert( isOp
1777d 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c en(pPager->fd) |
1777e 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 | pPager->tempFi
1777f 6c 65 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 le );.... if( p
17780 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0d Pager->tempFile.
17781 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f . || (sqlite3O
17782 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 sDeviceCharacter
17783 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 istics(pPager->f
17784 64 29 20 26 20 0d 0a 20 20 20 20 20 20 20 20 20 d) & ..
17785 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 SQLITE_IOCA
17786 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 P_POWERSAFE_OVER
17787 57 52 49 54 45 29 21 3d 30 0d 0a 20 20 29 7b 0d WRITE)!=0.. ){.
17788 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 . /* Sector s
17789 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 ize doesn't matt
1778a 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 er for temporary
1778b 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 files. Also, th
1778c 65 20 66 69 6c 65 0d 0a 20 20 20 20 2a 2a 20 6d e file.. ** m
1778d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e ay not have been
1778e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 opened yet, in
1778f 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f which case the O
17790 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0d 0a 20 sSectorSize()..
17791 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 ** call will
17792 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0d 0a 20 20 segfault. */..
17793 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 pPager->sector
17794 53 69 7a 65 20 3d 20 35 31 32 3b 0d 0a 20 20 7d Size = 512;.. }
17795 65 6c 73 65 7b 0d 0a 20 20 20 20 70 50 61 67 65 else{.. pPage
17796 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 r->sectorSize =
17797 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 sqlite3OsSectorS
17798 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b ize(pPager->fd);
17799 0d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 .. if( pPager
1779a 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 ->sectorSize<32
1779b 29 7b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 ){.. pPager
1779c 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 ->sectorSize = 5
1779d 31 32 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 12;.. }..
1779e 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 if( pPager->sect
1779f 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f orSize>MAX_SECTO
177a0 52 5f 53 49 5a 45 20 29 7b 0d 0a 20 20 20 20 20 R_SIZE ){..
177a1 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 assert( MAX_SEC
177a2 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b TOR_SIZE>=512 );
177a3 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e .. pPager->
177a4 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 sectorSize = MAX
177a5 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0d 0a 20 _SECTOR_SIZE;..
177a6 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a }.. }..}....
177a7 2f 2a 0d 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 /*..** Playback
177a8 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 the journal and
177a9 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 thus restore the
177aa 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 database file t
177ab 6f 0d 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 o..** the state
177ac 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 it was in before
177ad 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 we started maki
177ae 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0d 0a 2a ng changes. ..*
177af 2a 0d 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 *..** The journa
177b0 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 l file format is
177b1 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0d 0a 2a as follows: ..*
177b2 2a 0d 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 *..** (1) 8 by
177b3 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f te prefix. A co
177b4 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 py of aJournalMa
177b5 67 69 63 5b 5d 2e 0d 0a 2a 2a 20 20 28 32 29 20 gic[]...** (2)
177b6 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 4 byte big-endi
177b7 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 an integer which
177b8 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f is the number o
177b9 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 f valid page rec
177ba 6f 72 64 73 0d 0a 2a 2a 20 20 20 20 20 20 20 69 ords..** i
177bb 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 n the journal.
177bc 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 If this value is
177bd 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 0xffffffff, the
177be 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0d 0a 2a n compute the..*
177bf 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f * number o
177c0 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 f page records f
177c1 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 rom the journal
177c2 73 69 7a 65 2e 0d 0a 2a 2a 20 20 28 33 29 20 20 size...** (3)
177c3 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 4 byte big-endia
177c4 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 n integer which
177c5 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 is the initial v
177c6 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0d 0a 2a alue for the ..*
177c7 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 * sanity c
177c8 68 65 63 6b 73 75 6d 2e 0d 0a 2a 2a 20 20 28 34 hecksum...** (4
177c9 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 ) 4 byte intege
177ca 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e r which is the n
177cb 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 umber of pages t
177cc 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0d 0a o truncate the..
177cd 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 ** databas
177ce 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f e to during a ro
177cf 6c 6c 62 61 63 6b 2e 0d 0a 2a 2a 20 20 28 35 29 llback...** (5)
177d0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 4 byte big-end
177d1 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 ian integer whic
177d2 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 h is the sector
177d3 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 size. The heade
177d4 72 0d 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 r..** is t
177d5 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 his many bytes i
177d6 6e 20 73 69 7a 65 2e 0d 0a 2a 2a 20 20 28 36 29 n size...** (6)
177d7 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 4 byte big-end
177d8 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 ian integer whic
177d9 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 h is the page si
177da 7a 65 2e 0d 0a 2a 2a 20 20 28 37 29 20 20 7a 65 ze...** (7) ze
177db 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 ro padding out t
177dc 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f o the next secto
177dd 72 20 73 69 7a 65 2e 0d 0a 2a 2a 20 20 28 38 29 r size...** (8)
177de 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 Zero or more p
177df 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 ages instances,
177e0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a each as follows:
177e1 0d 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 ..** + 4
177e2 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 byte page numbe
177e3 72 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 r...** +
177e4 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a pPager->pageSiz
177e5 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e e bytes of data.
177e6 0d 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 ..** + 4
177e7 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0d 0a byte checksum..
177e8 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 **..** When we s
177e9 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 peak of the jour
177ea 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d nal header, we m
177eb 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 ean the first 7
177ec 69 74 65 6d 73 20 61 62 6f 76 65 2e 0d 0a 2a 2a items above...**
177ed 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 Each entry in t
177ee 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e he journal is an
177ef 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
177f0 20 38 74 68 20 69 74 65 6d 2e 0d 0a 2a 2a 0d 0a 8th item...**..
177f1 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 ** Call the valu
177f2 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e e from the secon
177f3 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e d bullet "nRec".
177f4 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 nRec is the nu
177f5 6d 62 65 72 20 6f 66 0d 0a 2a 2a 20 76 61 6c 69 mber of..** vali
177f6 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 d page entries i
177f7 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 n the journal.
177f8 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 In most cases, y
177f9 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 ou can compute t
177fa 68 65 0d 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 he..** value of
177fb 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 nRec from the si
177fc 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 ze of the journa
177fd 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 l file. But if
177fe 61 20 70 6f 77 65 72 0d 0a 2a 2a 20 66 61 69 6c a power..** fail
177ff 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 ure occurred whi
17800 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 le the journal w
17801 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e as being written
17802 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 , it could be th
17803 65 0d 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 e..** case that
17804 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 the size of the
17805 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 journal file had
17806 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e already been in
17807 63 72 65 61 73 65 64 20 62 75 74 0d 0a 2a 2a 20 creased but..**
17808 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 the extra entrie
17809 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 s had not yet ma
1780a 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 de it safely to
1780b 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 disk. In such a
1780c 20 63 61 73 65 2c 0d 0a 2a 2a 20 74 68 65 20 76 case,..** the v
1780d 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d alue of nRec com
1780e 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 puted from the f
1780f 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 ile size would b
17810 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f e too large. Fo
17811 72 0d 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f r..** that reaso
17812 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 n, we always use
17813 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 the nRec value
17814 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0d 0a in the header...
17815 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 **..** If the nR
17816 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 ec value is 0xff
17817 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 ffffff it means
17818 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 that nRec should
17819 20 62 65 20 63 6f 6d 70 75 74 65 64 0d 0a 2a 2a be computed..**
1781a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 from the file s
1781b 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 ize. This value
1781c 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 is used when th
1781d 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 e user selects t
1781e 68 65 0d 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f he..** no-sync o
1781f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f ption for the jo
17820 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 urnal. A power
17821 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 failure could le
17822 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e ad to corruption
17823 0d 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 ..** in this cas
17824 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e e. But for thin
17825 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 gs like temporar
17826 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 y table (which w
17827 69 6c 6c 20 62 65 0d 0a 2a 2a 20 64 65 6c 65 74 ill be..** delet
17828 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 ed when the powe
17829 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 r is restored) w
1782a 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0d e don't care. .
1782b 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 66 .**..** If the f
1782c 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 ile opened as th
1782d 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 e journal file i
1782e 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 s not a well-for
1782f 6d 65 64 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 med..** journal
17830 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 file then all pa
17831 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 ges up to the fi
17832 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 rst corrupted pa
17833 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0d 0a 2a ge are rolled..*
17834 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 * back (or no pa
17835 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e ges if the journ
17836 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 al header is cor
17837 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 rupted). The jou
17838 72 6e 61 6c 20 66 69 6c 65 0d 0a 2a 2a 20 69 73 rnal file..** is
17839 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e then deleted an
1783a 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 d SQLITE_OK retu
1783b 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 rned, just as if
1783c 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 no corruption h
1783d 61 64 0d 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f ad..** been enco
1783e 75 6e 74 65 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a untered...**..**
1783f 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 If an I/O or ma
17840 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 lloc() error occ
17841 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c urs, the journal
17842 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c -file is not del
17843 65 74 65 64 0d 0a 2a 2a 20 61 6e 64 20 61 6e 20 eted..** and an
17844 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
17845 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 turned...**..**
17846 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 The isHot parame
17847 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 ter indicates th
17848 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 at we are trying
17849 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a to rollback a j
1784a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 74 68 61 74 20 ournal..** that
1784b 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a might be a hot j
1784c 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 ournal. Or, it
1784d 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 could be that th
1784e 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0d 0a 2a e journal is ..*
1784f 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 * preserved beca
17850 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f use of JOURNALMO
17851 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f DE_PERSIST or JO
17852 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 URNALMODE_TRUNCA
17853 54 45 2e 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6a TE...** If the j
17854 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 ournal really is
17855 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 hot, reset the
17856 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f pager cache prio
17857 72 20 72 6f 6c 6c 69 6e 67 0d 0a 2a 2a 20 62 61 r rolling..** ba
17858 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 ck any content.
17859 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 If the journal
1785a 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 is merely persis
1785b 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 tent, no reset i
1785c 73 0d 0a 2a 2a 20 6e 65 65 64 65 64 2e 0d 0a 2a s..** needed...*
1785d 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 /..static int pa
1785e 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 ger_playback(Pag
1785f 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 er *pPager, int
17860 69 73 48 6f 74 29 7b 0d 0a 20 20 73 71 6c 69 74 isHot){.. sqlit
17861 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 e3_vfs *pVfs = p
17862 50 61 67 65 72 2d 3e 70 56 66 73 3b 0d 0a 20 20 Pager->pVfs;..
17863 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 i64 szJ;
17864 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
17865 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 of the journal
17866 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f file in bytes */
17867 0d 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 .. u32 nRec;
17868 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
17869 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 Number of Record
1786a 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c s in the journal
1786b 20 2a 2f 0d 0a 20 20 75 33 32 20 75 3b 20 20 20 */.. u32 u;
1786c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1786d 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 /* Unsigned loop
1786e 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 50 counter */.. P
1786f 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 gno mxPg = 0;
17870 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
17871 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 of the original
17872 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f file in pages */
17873 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 .. int rc;
17874 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
17875 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 Result code of a
17876 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0d 0a subroutine */..
17877 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 int res = 1;
17878 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 /* Va
17879 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 lue returned by
1787a 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 sqlite3OsAccess(
1787b 29 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4d ) */.. char *zM
1787c 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 aster = 0;
1787d 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 /* Name of mast
1787e 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
1787f 69 66 20 61 6e 79 20 2a 2f 0d 0a 20 20 69 6e 74 if any */.. int
17880 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b needPagerReset;
17881 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f /* True to
17882 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f reset page prio
17883 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 r to first page
17884 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 0d 0a 20 rollback */....
17885 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 /* Figure out h
17886 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 ow many records
17887 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e are in the journ
17888 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 al. Abort early
17889 20 69 66 0d 0a 20 20 2a 2a 20 74 68 65 20 6a 6f if.. ** the jo
1788a 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0d urnal is empty..
1788b 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 . */.. assert(
1788c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e isOpen(pPager->
1788d 6a 66 64 29 20 29 3b 0d 0a 20 20 72 63 20 3d 20 jfd) );.. rc =
1788e 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a sqlite3OsFileSiz
1788f 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 e(pPager->jfd, &
17890 73 7a 4a 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 szJ);.. if( rc!
17891 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
17892 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 goto end_play
17893 62 61 63 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 back;.. }....
17894 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 /* Read the mast
17895 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 er journal name
17896 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c from the journal
17897 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 , if it is prese
17898 6e 74 2e 0d 0a 20 20 2a 2a 20 49 66 20 61 20 6d nt... ** If a m
17899 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
1789a 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 le name is speci
1789b 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 fied, but the fi
1789c 6c 65 20 69 73 20 6e 6f 74 0d 0a 20 20 2a 2a 20 le is not.. **
1789d 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c present on disk,
1789e 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 then the journa
1789f 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 l is not hot and
178a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 does not need t
178a1 6f 20 62 65 0d 0a 20 20 2a 2a 20 70 6c 61 79 65 o be.. ** playe
178a2 64 20 62 61 63 6b 2e 0d 0a 20 20 2a 2a 0d 0a 20 d back... **..
178a3 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 ** TODO: Techni
178a4 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 cally the follow
178a5 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 ing is an error
178a6 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d because it assum
178a7 65 73 20 74 68 61 74 0d 0a 20 20 2a 2a 20 62 75 es that.. ** bu
178a8 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 ffer Pager.pTmpS
178a9 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e pace is (mxPathn
178aa 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 ame+1) bytes or
178ab 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 larger. i.e. tha
178ac 74 0d 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d t.. ** (pPager-
178ad 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 >pageSize >= pPa
178ae 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 ger->pVfs->mxPat
178af 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 hname+1). Using
178b0 6f 73 5f 75 6e 69 78 2e 63 2c 0d 0a 20 20 2a 2a os_unix.c,.. **
178b1 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 mxPathname is
178b2 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 512, which is th
178b3 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 e same as the mi
178b4 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 nimum allowable
178b5 76 61 6c 75 65 0d 0a 20 20 2a 2a 20 66 6f 72 20 value.. ** for
178b6 70 61 67 65 53 69 7a 65 2e 0d 0a 20 20 2a 2f 0d pageSize... */.
178b7 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 . zMaster = pPa
178b8 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0d ger->pTmpSpace;.
178b9 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 . rc = readMast
178ba 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 erJournal(pPager
178bb 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 ->jfd, zMaster,
178bc 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 pPager->pVfs->mx
178bd 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0d 0a 20 20 Pathname+1);..
178be 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
178bf 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 K && zMaster[0]
178c0 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c ){.. rc = sql
178c1 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 ite3OsAccess(pVf
178c2 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 s, zMaster, SQLI
178c3 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 TE_ACCESS_EXISTS
178c4 2c 20 26 72 65 73 29 3b 0d 0a 20 20 7d 0d 0a 20 , &res);.. }..
178c5 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0d 0a 20 zMaster = 0;..
178c6 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
178c7 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0d 0a 20 OK || !res ){..
178c8 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 goto end_play
178c9 62 61 63 6b 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 back;.. }.. pP
178ca 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 ager->journalOff
178cb 20 3d 20 30 3b 0d 0a 20 20 6e 65 65 64 50 61 67 = 0;.. needPag
178cc 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b erReset = isHot;
178cd 0d 0a 0d 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f .... /* This lo
178ce 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 op terminates ei
178cf 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 ther when a read
178d0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 JournalHdr() or
178d1 0d 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 .. ** pager_pla
178d2 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 yback_one_page()
178d3 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 call returns SQ
178d4 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 LITE_DONE or an
178d5 49 4f 20 65 72 72 6f 72 20 0d 0a 20 20 2a 2a 20 IO error .. **
178d6 6f 63 63 75 72 73 2e 20 0d 0a 20 20 2a 2f 0d 0a occurs. .. */..
178d7 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0d 0a 20 while( 1 ){..
178d8 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e /* Read the n
178d9 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 ext journal head
178da 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 er from the jour
178db 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 nal file. If th
178dc 65 72 65 20 61 72 65 0d 0a 20 20 20 20 2a 2a 20 ere are.. **
178dd 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 not enough bytes
178de 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 left in the jou
178df 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 rnal file for a
178e0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c complete header,
178e1 20 6f 72 0d 0a 20 20 20 20 2a 2a 20 69 74 20 69 or.. ** it i
178e2 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 s corrupted, the
178e3 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 n a process must
178e4 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 have failed whi
178e5 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0d 0a le writing it...
178e6 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 ** This indi
178e7 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f cates nothing mo
178e8 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 re needs to be r
178e9 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 20 20 20 olled back...
178ea 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 72 65 */.. rc = re
178eb 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 adJournalHdr(pPa
178ec 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c ger, isHot, szJ,
178ed 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0d &nRec, &mxPg);.
178ee 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
178ef 49 54 45 5f 4f 4b 20 29 7b 20 0d 0a 20 20 20 20 ITE_OK ){ ..
178f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
178f1 5f 44 4f 4e 45 20 29 7b 0d 0a 20 20 20 20 20 20 _DONE ){..
178f2 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
178f3 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
178f4 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 goto end_playb
178f5 61 63 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 ack;.. }....
178f6 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 /* If nRec is
178f7 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 0xffffffff, the
178f8 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 n this journal w
178f9 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 as created by a
178fa 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 2a 2a 20 process.. **
178fb 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 working in no-sy
178fc 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 nc mode. This me
178fd 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 ans that the res
178fe 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c t of the journal
178ff 0d 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f .. ** file co
17900 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c nsists of pages,
17901 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f there are no mo
17902 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 re journal heade
17903 72 73 2e 20 43 6f 6d 70 75 74 65 0d 0a 20 20 20 rs. Compute..
17904 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 ** the value of
17905 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 nRec based on t
17906 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0d his assumption..
17907 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 . */.. if(
17908 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 nRec==0xfffffff
17909 66 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 f ){.. asse
1790a 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 rt( pPager->jour
1790b 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f nalOff==JOURNAL_
1790c 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 HDR_SZ(pPager) )
1790d 3b 0d 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 ;.. nRec =
1790e 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 (int)((szJ - JOU
1790f 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 RNAL_HDR_SZ(pPag
17910 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f er))/JOURNAL_PG_
17911 53 5a 28 70 50 61 67 65 72 29 29 3b 0d 0a 20 20 SZ(pPager));..
17912 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 }.... /* If
17913 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 nRec is 0 and t
17914 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 his rollback is
17915 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e of a transaction
17916 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 created by this
17917 0d 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 .. ** process
17918 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 and if this is
17919 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 the final header
1791a 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c in the journal,
1791b 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0d 0a then it means..
1791c 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 ** that this
1791d 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 part of the jou
1791e 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 rnal was being f
1791f 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f illed but has no
17920 74 20 79 65 74 20 62 65 65 6e 0d 0a 20 20 20 20 t yet been..
17921 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 ** synced to dis
17922 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 k. Compute the
17923 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 number of pages
17924 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d based on the rem
17925 61 69 6e 69 6e 67 0d 0a 20 20 20 20 2a 2a 20 73 aining.. ** s
17926 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e ize of the file.
17927 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a .. **.. **
17928 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 The third term
17929 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 of the test was
1792a 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 added to fix tic
1792b 6b 65 74 20 23 32 35 36 35 2e 0d 0a 20 20 20 20 ket #2565...
1792c 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 ** When rolling
1792d 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e back a hot journ
1792e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 al, nRec==0 alwa
1792f 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 ys means that th
17930 65 20 6e 65 78 74 0d 0a 20 20 20 20 2a 2a 20 63 e next.. ** c
17931 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 hunk of the jour
17932 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 nal contains zer
17933 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f o pages to be ro
17934 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0d lled back. But.
17935 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 . ** when doi
17936 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e ng a ROLLBACK an
17937 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 d the nRec==0 ch
17938 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 unk is the last
17939 63 68 75 6e 6b 20 69 6e 0d 0a 20 20 20 20 2a 2a chunk in.. **
1793a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 the journal, it
1793b 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 means that the
1793c 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f journal might co
1793d 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c ntain additional
1793e 0d 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 .. ** pages t
1793f 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 hat need to be r
17940 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 olled back and t
17941 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f hat the number o
17942 66 20 70 61 67 65 73 20 0d 0a 20 20 20 20 2a 2a f pages .. **
17943 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 should be compu
17944 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 ted based on the
17945 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 journal file si
17946 7a 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 ze... */..
17947 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 if( nRec==0 &&
17948 21 69 73 48 6f 74 20 26 26 0d 0a 20 20 20 20 20 !isHot &&..
17949 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e pPager->journ
1794a 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 alHdr+JOURNAL_HD
1794b 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 R_SZ(pPager)==pP
1794c 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 ager->journalOff
1794d 20 29 7b 0d 0a 20 20 20 20 20 20 6e 52 65 63 20 ){.. nRec
1794e 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 = (int)((szJ - p
1794f 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 Pager->journalOf
17950 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f f) / JOURNAL_PG_
17951 53 5a 28 70 50 61 67 65 72 29 29 3b 0d 0a 20 20 SZ(pPager));..
17952 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 }.... /* If
17953 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 this is the fir
17954 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 st header read f
17955 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c rom the journal,
17956 20 74 72 75 6e 63 61 74 65 20 74 68 65 0d 0a 20 truncate the..
17957 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 ** database f
17958 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 ile back to its
17959 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0d 0a original size...
1795a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 */.. if(
1795b 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f pPager->journalO
1795c 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f ff==JOURNAL_HDR_
1795d 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 SZ(pPager) ){..
1795e 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f rc = pager_
1795f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c truncate(pPager,
17960 20 6d 78 50 67 29 3b 0d 0a 20 20 20 20 20 20 69 mxPg);.. i
17961 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
17962 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 67 6f 74 ){.. got
17963 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0d o end_playback;.
17964 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
17965 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d pPager->dbSize =
17966 20 6d 78 50 67 3b 0d 0a 20 20 20 20 7d 0d 0a 0d mxPg;.. }...
17967 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 . /* Copy ori
17968 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 ginal pages out
17969 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 of the journal a
1796a 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 nd back into the
1796b 20 0d 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 .. ** databa
1796c 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 se file and/or p
1796d 61 67 65 20 63 61 63 68 65 2e 0d 0a 20 20 20 20 age cache...
1796e 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b */.. for(u=0;
1796f 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0d 0a u<nRec; u++){..
17970 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 if( needPa
17971 67 65 72 52 65 73 65 74 20 29 7b 0d 0a 20 20 20 gerReset ){..
17972 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 pager_reset
17973 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 (pPager);..
17974 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 needPagerRese
17975 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d t = 0;.. }.
17976 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 . rc = page
17977 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 r_playback_one_p
17978 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 age(pPager,&pPag
17979 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 er->journalOff,0
1797a 2c 31 2c 30 29 3b 0d 0a 20 20 20 20 20 20 69 66 ,1,0);.. if
1797b 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1797c 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){.. if(
1797d 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 rc==SQLITE_DONE
1797e 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 50 ){.. pP
1797f 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 ager->journalOff
17980 20 3d 20 73 7a 4a 3b 0d 0a 20 20 20 20 20 20 20 = szJ;..
17981 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 break;..
17982 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d }else if( rc=
17983 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 =SQLITE_IOERR_SH
17984 4f 52 54 5f 52 45 41 44 20 29 7b 0d 0a 20 20 20 ORT_READ ){..
17985 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 /* If the
17986 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 journal has bee
17987 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d n truncated, sim
17988 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 ply stop reading
17989 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 20 20 and..
1798a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 ** processing th
1798b 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 e journal. This
1798c 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 might happen if
1798d 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0d the journal was.
1798e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f . ** no
1798f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 t completely wri
17990 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 tten and synced
17991 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 prior to a crash
17992 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 . In that..
17993 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 ** case, t
17994 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 he database shou
17995 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 ld have never be
17996 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 en written in th
17997 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 e.. **
17998 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 first place so i
17999 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c t is OK to simpl
1799a 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f y abandon the ro
1799b 6c 6c 62 61 63 6b 2e 20 2a 2f 0d 0a 20 20 20 20 llback. */..
1799c 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
1799d 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 20 E_OK;..
1799e 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 goto end_playba
1799f 63 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c ck;.. }el
179a0 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f se{.. /
179a1 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 * If we are unab
179a2 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 le to rollback,
179a3 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 quit and return
179a4 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 the error..
179a5 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 ** code. T
179a6 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 his will cause t
179a7 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 he pager to ente
179a8 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 r the error stat
179a9 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 e.. **
179aa 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 so that no furth
179ab 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 er harm will be
179ac 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 done. Perhaps t
179ad 68 65 20 6e 65 78 74 0d 0a 20 20 20 20 20 20 20 he next..
179ae 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f ** process to
179af 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c come along will
179b0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c be able to roll
179b1 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 back the databas
179b2 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f e... */
179b3 0d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f .. goto
179b4 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0d 0a end_playback;..
179b5 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
179b6 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a }.. }.. }..
179b7 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f /*NOTREACHED*/
179b8 0d 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b .. assert( 0 );
179b9 0d 0a 0d 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b ....end_playback
179ba 3a 0d 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e :.. /* Followin
179bb 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 g a rollback, th
179bc 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
179bd 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 should be back i
179be 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0d 0a n its original..
179bf 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 ** state prior
179c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 to the start of
179c1 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
179c2 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0d , so invoke the.
179c3 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e . ** SQLITE_FCN
179c4 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 TL_DB_UNCHANGED
179c5 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 file-control met
179c6 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 hod to disable t
179c7 68 65 0d 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 he.. ** asserti
179c8 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e on that the tran
179c9 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 saction counter
179ca 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0d 0a 20 was modified...
179cb 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 */..#ifdef SQLI
179cc 54 45 5f 44 45 42 55 47 0d 0a 20 20 69 66 28 20 TE_DEBUG.. if(
179cd 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 pPager->fd->pMet
179ce 68 6f 64 73 20 29 7b 0d 0a 20 20 20 20 73 71 6c hods ){.. sql
179cf 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f ite3OsFileContro
179d0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 lHint(pPager->fd
179d1 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 ,SQLITE_FCNTL_DB
179d2 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0d 0a _UNCHANGED,0);..
179d3 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 }..#endif....
179d4 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 /* If this play
179d5 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e back is happenin
179d6 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 g automatically
179d7 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 as a result of a
179d8 6e 20 49 4f 20 6f 72 20 0d 0a 20 20 2a 2a 20 6d n IO or .. ** m
179d9 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 alloc error that
179da 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 occurred after
179db 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 the change-count
179dc 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 er was updated b
179dd 75 74 20 0d 0a 20 20 2a 2a 20 62 65 66 6f 72 65 ut .. ** before
179de 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
179df 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 was committed,
179e0 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d then the change-
179e1 63 6f 75 6e 74 65 72 20 0d 0a 20 20 2a 2a 20 6d counter .. ** m
179e2 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 odification may
179e3 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 just have been r
179e4 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 everted. If this
179e5 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c happens in excl
179e6 75 73 69 76 65 20 0d 0a 20 20 2a 2a 20 6d 6f 64 usive .. ** mod
179e7 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 e, then subseque
179e8 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 nt transactions
179e9 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 performed by the
179ea 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c connection will
179eb 20 6e 6f 74 0d 0a 20 20 2a 2a 20 75 70 64 61 74 not.. ** updat
179ec 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 e the change-cou
179ed 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 nter at all. Thi
179ee 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 s may lead to ca
179ef 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 che inconsistenc
179f0 79 0d 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 y.. ** problems
179f1 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 for other proce
179f2 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 sses at some poi
179f3 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 nt in the future
179f4 2e 20 53 6f 2c 20 6a 75 73 74 0d 0a 20 20 2a 2a . So, just.. **
179f5 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 in case this ha
179f6 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 s happened, clea
179f7 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e r the changeCoun
179f8 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0d tDone flag now..
179f9 0a 20 20 2a 2f 0d 0a 20 20 70 50 61 67 65 72 2d . */.. pPager-
179fa 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 >changeCountDone
179fb 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 = pPager->tempF
179fc 69 6c 65 3b 0d 0a 0d 0a 20 20 69 66 28 20 72 63 ile;.... if( rc
179fd 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
179fe 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 zMaster = pP
179ff 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b ager->pTmpSpace;
17a00 0d 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d .. rc = readM
17a01 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 asterJournal(pPa
17a02 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 ger->jfd, zMaste
17a03 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d r, pPager->pVfs-
17a04 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0d >mxPathname+1);.
17a05 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 . testcase( r
17a06 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d c!=SQLITE_OK );.
17a07 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d . }.. if( rc==
17a08 53 51 4c 49 54 45 5f 4f 4b 0d 0a 20 20 20 26 26 SQLITE_OK.. &&
17a09 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 (pPager->eState
17a0a 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 >=PAGER_WRITER_D
17a0b 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e BMOD || pPager->
17a0c 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 eState==PAGER_OP
17a0d 45 4e 29 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 EN).. ){.. r
17a0e 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 c = sqlite3Pager
17a0f 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0d 0a 20 Sync(pPager);..
17a10 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 }.. if( rc==SQ
17a11 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
17a12 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 rc = pager_end_t
17a13 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 ransaction(pPage
17a14 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 r, zMaster[0]!='
17a15 5c 30 27 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 \0');.. testc
17a16 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f ase( rc!=SQLITE_
17a17 4f 4b 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 OK );.. }.. if
17a18 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
17a19 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 && zMaster[0] &&
17a1a 20 72 65 73 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 res ){.. /*
17a1b 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d If there was a m
17a1c 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e aster journal an
17a1d 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 d this routine w
17a1e 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 ill return succe
17a1f 73 73 2c 0d 0a 20 20 20 20 2a 2a 20 73 65 65 20 ss,.. ** see
17a20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c if it is possibl
17a21 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 e to delete the
17a22 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0d master journal..
17a23 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 72 63 20 . */.. rc
17a24 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 = pager_delmaste
17a25 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 r(pPager, zMaste
17a26 72 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 r);.. testcas
17a27 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b e( rc!=SQLITE_OK
17a28 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a );.. }.... /*
17a29 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f The Pager.secto
17a2a 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d rSize variable m
17a2b 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 ay have been upd
17a2c 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 ated while rolli
17a2d 6e 67 0d 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 ng.. ** back a
17a2e 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 journal created
17a2f 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 by a process wit
17a30 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 h a different se
17a31 63 74 6f 72 20 73 69 7a 65 0d 0a 20 20 2a 2a 20 ctor size.. **
17a32 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 value. Reset it
17a33 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 to the correct v
17a34 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 alue for this pr
17a35 6f 63 65 73 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 ocess... */..
17a36 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 setSectorSize(pP
17a37 61 67 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e ager);.. return
17a38 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d rc;..}....../*.
17a39 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e .** Read the con
17a3a 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 tent for page pP
17a3b 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 g out of the dat
17a3c 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 abase file and i
17a3d 6e 74 6f 20 0d 0a 2a 2a 20 70 50 67 2d 3e 70 44 nto ..** pPg->pD
17a3e 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f ata. A shared lo
17a3f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 ck or greater mu
17a40 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 st be held on th
17a41 65 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 66 e database..** f
17a42 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 ile before this
17a43 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
17a44 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 ed...**..** If p
17a45 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 age 1 is read, t
17a46 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 hen the value of
17a47 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 Pager.dbFileVer
17a48 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0d 0a 2a s[] is set to..*
17a49 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 * the value read
17a4a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 from the databa
17a4b 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a se file...**..**
17a4c 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 If an IO error
17a4d 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 occurs, then the
17a4e 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 IO error is ret
17a4f 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c urned to the cal
17a50 6c 65 72 2e 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 ler...** Otherwi
17a51 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 se, SQLITE_OK is
17a52 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a returned...*/..
17a53 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 static int readD
17a54 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 bPage(PgHdr *pPg
17a55 29 7b 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 61 ){.. Pager *pPa
17a56 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 ger = pPg->pPage
17a57 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 r; /* Pager obje
17a58 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ct associated wi
17a59 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0d 0a th page pPg */..
17a5a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 Pgno pgno = pP
17a5b 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f g->pgno; /
17a5c 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f * Page number to
17a5d 20 72 65 61 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 read */.. int
17a5e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 rc = SQLITE_OK;
17a5f 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
17a60 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e rn code */.. in
17a61 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 t isInWal = 0;
17a62 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
17a63 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e ue if page is in
17a64 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 log file */..
17a65 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 int pgsz = pPage
17a66 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 r->pageSize; /*
17a67 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
17a68 74 6f 20 72 65 61 64 20 2a 2f 0d 0a 0d 0a 20 20 to read */....
17a69 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
17a6a 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 eState>=PAGER_RE
17a6b 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 ADER && !MEMDB )
17a6c 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f ;.. assert( isO
17a6d 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 pen(pPager->fd)
17a6e 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 4e 45 56 45 );.... if( NEVE
17a6f 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 R(!isOpen(pPager
17a70 2d 3e 66 64 29 29 20 29 7b 0d 0a 20 20 20 20 61 ->fd)) ){.. a
17a71 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 ssert( pPager->t
17a72 65 6d 70 46 69 6c 65 20 29 3b 0d 0a 20 20 20 20 empFile );..
17a73 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 memset(pPg->pDat
17a74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 a, 0, pPager->pa
17a75 67 65 53 69 7a 65 29 3b 0d 0a 20 20 20 20 72 65 geSize);.. re
17a76 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
17a77 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 61 . }.... if( pa
17a78 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 gerUseWal(pPager
17a79 29 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 54 72 79 ) ){.. /* Try
17a7a 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 to pull the pag
17a7b 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 e from the write
17a7c 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0d 0a -ahead log. */..
17a7d 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
17a7e 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e WalRead(pPager->
17a7f 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 pWal, pgno, &isI
17a80 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d nWal, pgsz, pPg-
17a81 3e 70 44 61 74 61 29 3b 0d 0a 20 20 7d 0d 0a 20 >pData);.. }..
17a82 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
17a83 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 OK && !isInWal )
17a84 7b 0d 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 {.. i64 iOffs
17a85 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 et = (pgno-1)*(i
17a86 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 64)pPager->pageS
17a87 69 7a 65 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 ize;.. rc = s
17a88 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 qlite3OsRead(pPa
17a89 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 ger->fd, pPg->pD
17a8a 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 ata, pgsz, iOffs
17a8b 65 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 et);.. if( rc
17a8c 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 ==SQLITE_IOERR_S
17a8d 48 4f 52 54 5f 52 45 41 44 20 29 7b 0d 0a 20 20 HORT_READ ){..
17a8e 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
17a8f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d OK;.. }.. }.
17a90 0a 0d 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 ... if( pgno==1
17a91 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 ){.. if( rc
17a92 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 ){.. /* If
17a93 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 the read is unsu
17a94 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 ccessful, set th
17a95 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 e dbFileVers[] t
17a96 6f 20 73 6f 6d 65 74 68 69 6e 67 0d 0a 20 20 20 o something..
17a97 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 ** that will
17a98 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 never be a valid
17a99 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 file version.
17a9a 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 dbFileVers[] is
17a9b 61 20 63 6f 70 79 0d 0a 20 20 20 20 20 20 2a 2a a copy.. **
17a9c 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 of bytes 24..39
17a9d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
17a9e 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 . Bytes 28..31
17a9f 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 should always be
17aa0 0d 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 .. ** zero
17aa1 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 or the size of t
17aa2 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 he database in p
17aa3 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 age. Bytes 32..3
17aa4 35 20 61 6e 64 20 33 35 2e 2e 33 39 0d 0a 20 20 5 and 35..39..
17aa5 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 ** should be
17aa6 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 page numbers wh
17aa7 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 ich are never 0x
17aa8 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 ffffffff. So fi
17aa9 6c 6c 69 6e 67 0d 0a 20 20 20 20 20 20 2a 2a 20 lling.. **
17aaa 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 pPager->dbFileVe
17aab 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 rs[] with all 0x
17aac 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 ff bytes should
17aad 73 75 66 66 69 63 65 2e 0d 0a 20 20 20 20 20 20 suffice...
17aae 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 **.. ** For
17aaf 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 an encrypted da
17ab0 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 tabase, the situ
17ab1 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f ation is more co
17ab2 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0d 0a 20 mplex: bytes..
17ab3 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f ** 24..39 o
17ab4 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 f the database a
17ab5 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 re white noise.
17ab6 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 But the probabi
17ab7 6c 69 74 79 20 6f 66 0d 0a 20 20 20 20 20 20 2a lity of.. *
17ab8 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 * white noising
17ab9 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 equaling 16 byte
17aba 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e s of 0xff is van
17abb 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 ishingly small s
17abc 6f 0d 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 o.. ** we s
17abd 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f hould still be o
17abe 6b 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 k... */..
17abf 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 memset(pPage
17ac0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 r->dbFileVers, 0
17ac1 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 xff, sizeof(pPag
17ac2 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 er->dbFileVers))
17ac3 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
17ac4 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 u8 *dbFileV
17ac5 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 ers = &((u8*)pPg
17ac6 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0d 0a 20 ->pData)[24];..
17ac7 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 memcpy(&pPa
17ac8 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c ger->dbFileVers,
17ac9 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a dbFileVers, siz
17aca 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 eof(pPager->dbFi
17acb 6c 65 56 65 72 73 29 29 3b 0d 0a 20 20 20 20 7d leVers));.. }
17acc 0d 0a 20 20 7d 0d 0a 20 20 43 4f 44 45 43 31 28 .. }.. CODEC1(
17acd 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 pPager, pPg->pDa
17ace 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 ta, pgno, 3, rc
17acf 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b = SQLITE_NOMEM);
17ad0 0d 0a 0d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 .... PAGER_INCR
17ad1 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 (sqlite3_pager_r
17ad2 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0d 0a 20 eaddb_count);..
17ad3 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 PAGER_INCR(pPag
17ad4 65 72 2d 3e 6e 52 65 61 64 29 3b 0d 0a 20 20 49 er->nRead);.. I
17ad5 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 OTRACE(("PGIN %p
17ad6 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 %d\n", pPager,
17ad7 70 67 6e 6f 29 29 3b 0d 0a 20 20 50 41 47 45 52 pgno));.. PAGER
17ad8 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 TRACE(("FETCH %d
17ad9 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 page %d hash(%0
17ada 38 78 29 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 8x)\n",..
17adb 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 PAGERID(
17adc 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 pPager), pgno, p
17add 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 ager_pagehash(pP
17ade 67 29 29 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 g)));.... retur
17adf 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
17ae0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 ** Update the va
17ae1 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 lue of the chang
17ae2 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 e-counter at off
17ae3 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 sets 24 and 92 i
17ae4 6e 0d 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 n..** the header
17ae5 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 and the sqlite
17ae6 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 version number a
17ae7 74 20 6f 66 66 73 65 74 20 39 36 2e 0d 0a 2a 2a t offset 96...**
17ae8 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 ..** This is an
17ae9 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 unconditional up
17aea 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 date. See also
17aeb 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 the pager_incr_c
17aec 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0d 0a hangecounter()..
17aed 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 ** routine which
17aee 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 only updates th
17aef 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 e change-counter
17af0 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 if the update i
17af1 73 20 61 63 74 75 61 6c 6c 79 0d 0a 2a 2a 20 6e s actually..** n
17af2 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d eeded, as determ
17af3 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 ined by the pPag
17af4 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 er->changeCountD
17af5 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 one state variab
17af6 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 le...*/..static
17af7 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 void pager_write
17af8 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 _changecounter(P
17af9 67 48 64 72 20 2a 70 50 67 29 7b 0d 0a 20 20 75 gHdr *pPg){.. u
17afa 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 32 change_counte
17afb 72 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 63 72 65 r;.... /* Incre
17afc 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a ment the value j
17afd 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 ust read and wri
17afe 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 te it back to by
17aff 74 65 20 32 34 2e 20 2a 2f 0d 0a 20 20 63 68 61 te 24. */.. cha
17b00 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 nge_counter = sq
17b01 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 lite3Get4byte((u
17b02 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 8*)pPg->pPager->
17b03 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0d 0a dbFileVers)+1;..
17b04 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 put32bits(((ch
17b05 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b ar*)pPg->pData)+
17b06 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 24, change_count
17b07 65 72 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 6c 73 er);.... /* Als
17b08 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 o store the SQLi
17b09 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 te version numbe
17b0a 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 r in bytes 96..9
17b0b 39 20 61 6e 64 20 69 6e 0d 0a 20 20 2a 2a 20 62 9 and in.. ** b
17b0c 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 ytes 92..95 stor
17b0d 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 e the change cou
17b0e 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 nter for which t
17b0f 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 he version numbe
17b10 72 0d 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 r.. ** is valid
17b11 2e 20 2a 2f 0d 0a 20 20 70 75 74 33 32 62 69 74 . */.. put32bit
17b12 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 s(((char*)pPg->p
17b13 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 Data)+92, change
17b14 5f 63 6f 75 6e 74 65 72 29 3b 0d 0a 20 20 70 75 _counter);.. pu
17b15 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 t32bits(((char*)
17b16 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 pPg->pData)+96,
17b17 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e SQLITE_VERSION_N
17b18 55 4d 42 45 52 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69 UMBER);..}....#i
17b19 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
17b1a 54 5f 57 41 4c 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 T_WAL../*..** Th
17b1b 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
17b1c 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 nvoked once for
17b1d 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 each page that h
17b1e 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
17b1f 0d 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 ..** written int
17b20 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 o the log file w
17b21 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 hen a WAL transa
17b22 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 ction is rolled
17b23 62 61 63 6b 2e 0d 0a 2a 2a 20 50 61 72 61 6d 65 back...** Parame
17b24 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 ter iPg is the p
17b25 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 age number of sa
17b26 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 id page. The pCt
17b27 78 20 61 72 67 75 6d 65 6e 74 20 0d 0a 2a 2a 20 x argument ..**
17b28 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f is actually a po
17b29 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 inter to the Pag
17b2a 65 72 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a er structure...*
17b2b 2a 0d 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 *..** If page iP
17b2c 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 g is present in
17b2d 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 the cache, and h
17b2e 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e as no outstandin
17b2f 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0d 0a 2a g references,..*
17b30 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 * it is discarde
17b31 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 d. Otherwise, if
17b32 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f there are one o
17b33 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 r more outstandi
17b34 6e 67 0d 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 ng..** reference
17b35 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 s, the page cont
17b36 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 ent is reloaded
17b37 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
17b38 65 2e 20 49 66 20 74 68 65 0d 0a 2a 2a 20 61 74 e. If the..** at
17b39 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 tempt to reload
17b3a 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 content from the
17b3b 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 database is req
17b3c 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c uired and fails,
17b3d 20 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 ..** return an
17b3e 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 SQLite error cod
17b3f 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 e. Otherwise, SQ
17b40 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2f 0d 0a 73 74 LITE_OK...*/..st
17b41 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e atic int pagerUn
17b42 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 doCallback(void
17b43 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 *pCtx, Pgno iPg)
17b44 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 {.. int rc = SQ
17b45 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 50 61 67 65 LITE_OK;.. Page
17b46 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 r *pPager = (Pag
17b47 65 72 20 2a 29 70 43 74 78 3b 0d 0a 20 20 50 67 er *)pCtx;.. Pg
17b48 48 64 72 20 2a 70 50 67 3b 0d 0a 0d 0a 20 20 70 Hdr *pPg;.... p
17b49 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 Pg = sqlite3Page
17b4a 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 rLookup(pPager,
17b4b 69 50 67 29 3b 0d 0a 20 20 69 66 28 20 70 50 67 iPg);.. if( pPg
17b4c 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 73 71 6c ){.. if( sql
17b4d 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 ite3PcachePageRe
17b4e 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 fcount(pPg)==1 )
17b4f 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {.. sqlite3
17b50 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b PcacheDrop(pPg);
17b51 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
17b52 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 rc = readDbP
17b53 61 67 65 28 70 50 67 29 3b 0d 0a 20 20 20 20 20 age(pPg);..
17b54 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
17b55 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 OK ){.. p
17b56 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 Pager->xReiniter
17b57 28 70 50 67 29 3b 0d 0a 20 20 20 20 20 20 7d 0d (pPg);.. }.
17b58 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 . sqlite3Pa
17b59 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0d 0a gerUnref(pPg);..
17b5a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
17b5b 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 /* Normally, if
17b5c 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 a transaction is
17b5d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e rolled back, an
17b5e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 y backup process
17b5f 65 73 20 61 72 65 0d 0a 20 20 2a 2a 20 75 70 64 es are.. ** upd
17b60 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 ated as data is
17b61 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 copied out of th
17b62 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e e rollback journ
17b63 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0d al and into the.
17b64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 . ** database.
17b65 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 This is not gene
17b66 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 rally possible w
17b67 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 ith a WAL databa
17b68 73 65 2c 20 61 73 0d 0a 20 20 2a 2a 20 72 6f 6c se, as.. ** rol
17b69 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 lback involves s
17b6a 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 imply truncating
17b6b 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 the log file. T
17b6c 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 herefore, if one
17b6d 0d 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 .. ** or more f
17b6e 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 rames have alrea
17b6f 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 dy been written
17b70 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 to the log (and
17b71 74 68 65 72 65 66 6f 72 65 20 0d 0a 20 20 2a 2a therefore .. **
17b72 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 also copied int
17b73 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 o the backup dat
17b74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 abases) as part
17b75 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 of this transact
17b76 69 6f 6e 2c 0d 0a 20 20 2a 2a 20 74 68 65 20 62 ion,.. ** the b
17b77 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 ackups must be r
17b78 65 73 74 61 72 74 65 64 2e 0d 0a 20 20 2a 2f 0d estarted... */.
17b79 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 . sqlite3Backup
17b7a 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e Restart(pPager->
17b7b 70 42 61 63 6b 75 70 29 3b 0d 0a 0d 0a 20 20 72 pBackup);.... r
17b7c 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
17b7d 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 /*..** This func
17b7e 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 tion is called t
17b7f 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 o rollback a tra
17b80 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 nsaction on a WA
17b81 4c 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2f 0d L database...*/.
17b82 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 .static int page
17b83 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 rRollbackWal(Pag
17b84 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 er *pPager){..
17b85 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
17b86 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17b87 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a /* Return Code *
17b88 2f 0d 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 /.. PgHdr *pLis
17b89 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
17b8a 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 /* List of
17b8b 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 dirty pages to r
17b8c 65 76 65 72 74 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a evert */.... /*
17b8d 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 For all pages i
17b8e 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 n the cache that
17b8f 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 are currently d
17b90 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 irty or have alr
17b91 65 61 64 79 0d 0a 20 20 2a 2a 20 62 65 65 6e 20 eady.. ** been
17b92 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 written (but not
17b93 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 committed) to t
17b94 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 he log file, do
17b95 6f 6e 65 20 6f 66 20 74 68 65 20 0d 0a 20 20 2a one of the .. *
17b96 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 20 20 * following:..
17b97 2a 2a 0d 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 **.. ** + Dis
17b98 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 card the cached
17b99 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e page (if refcoun
17b9a 74 3d 3d 30 29 2c 20 6f 72 0d 0a 20 20 2a 2a 20 t==0), or.. **
17b9b 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 + Reload page
17b9c 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 content from the
17b9d 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 database (if re
17b9e 66 63 6f 75 6e 74 3e 30 29 2e 0d 0a 20 20 2a 2f fcount>0)... */
17b9f 0d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 .. pPager->dbSi
17ba0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f ze = pPager->dbO
17ba1 72 69 67 53 69 7a 65 3b 0d 0a 20 20 72 63 20 3d rigSize;.. rc =
17ba2 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 sqlite3WalUndo(
17ba3 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 pPager->pWal, pa
17ba4 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c gerUndoCallback,
17ba5 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 (void *)pPager)
17ba6 3b 0d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c ;.. pList = sql
17ba7 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c ite3PcacheDirtyL
17ba8 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 ist(pPager->pPCa
17ba9 63 68 65 29 3b 0d 0a 20 20 77 68 69 6c 65 28 20 che);.. while(
17baa 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c pList && rc==SQL
17bab 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 50 ITE_OK ){.. P
17bac 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c gHdr *pNext = pL
17bad 69 73 74 2d 3e 70 44 69 72 74 79 3b 0d 0a 20 20 ist->pDirty;..
17bae 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f rc = pagerUndo
17baf 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a Callback((void *
17bb0 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e )pPager, pList->
17bb1 70 67 6e 6f 29 3b 0d 0a 20 20 20 20 70 4c 69 73 pgno);.. pLis
17bb2 74 20 3d 20 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d t = pNext;.. }.
17bb3 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ... return rc;.
17bb4 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 .}..../*..** Thi
17bb5 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 s function is a
17bb6 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 wrapper around s
17bb7 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 qlite3WalFrames(
17bb8 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f ). As well as lo
17bb9 67 67 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 63 6f gging..** the co
17bba 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 ntents of the li
17bbb 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 st of pages head
17bbc 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e ed by pList (con
17bbd 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 nected by pDirty
17bbe 29 2c 0d 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 ),..** this func
17bbf 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e tion notifies an
17bc0 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 y active backup
17bc1 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 processes that t
17bc2 68 65 20 70 61 67 65 73 20 68 61 76 65 0d 0a 2a he pages have..*
17bc3 2a 20 63 68 61 6e 67 65 64 2e 20 0d 0a 2a 2a 0d * changed. ..**.
17bc4 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 .** The list of
17bc5 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 pages passed int
17bc6 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 o this routine i
17bc7 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 s always sorted
17bc8 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0d by page number..
17bc9 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 .** Hence, if pa
17bca 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 ge 1 appears any
17bcb 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 where on the lis
17bcc 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 t, it will be th
17bcd 65 20 66 69 72 73 74 20 70 61 67 65 2e 0d 0a 2a e first page...*
17bce 2f 20 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 / ..static int p
17bcf 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0d 0a agerWalFrames(..
17bd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c Pager *pPager,
17bd1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17bd2 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 /* Pager objec
17bd3 74 20 2a 2f 0d 0a 20 20 50 67 48 64 72 20 2a 70 t */.. PgHdr *p
17bd4 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 List,
17bd5 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 /* List
17bd6 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 of frames to log
17bd7 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 6e 54 72 75 */.. Pgno nTru
17bd8 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 ncate,
17bd9 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
17bda 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 se size after th
17bdb 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0d 0a 20 20 is commit */..
17bdc 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 int isCommit
17bdd 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17bde 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 /* True if this
17bdf 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0d 0a is a commit */..
17be0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 ){.. int rc;
17be1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17be2 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 /* Return
17be3 63 6f 64 65 20 2a 2f 0d 0a 23 69 66 20 64 65 66 code */..#if def
17be4 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 ined(SQLITE_DEBU
17be5 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 G) || defined(SQ
17be6 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 LITE_CHECK_PAGES
17be7 29 0d 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 ).. PgHdr *p;
17be8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17be9 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 /* For loop
17bea 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a ing over pages *
17beb 2f 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 61 /..#endif.... a
17bec 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 ssert( pPager->p
17bed 57 61 6c 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 Wal );.. assert
17bee 28 20 70 4c 69 73 74 20 29 3b 0d 0a 23 69 66 64 ( pList );..#ifd
17bef 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d ef SQLITE_DEBUG.
17bf0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 . /* Verify tha
17bf1 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 t the page list
17bf2 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 is in accending
17bf3 6f 72 64 65 72 20 2a 2f 0d 0a 20 20 66 6f 72 28 order */.. for(
17bf4 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d p=pList; p && p-
17bf5 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 >pDirty; p=p->pD
17bf6 69 72 74 79 29 7b 0d 0a 20 20 20 20 61 73 73 65 irty){.. asse
17bf7 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d rt( p->pgno < p-
17bf8 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b >pDirty->pgno );
17bf9 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d .. }..#endif...
17bfa 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 . if( isCommit
17bfb 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 ){.. /* If a
17bfc 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 WAL transaction
17bfd 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 is being committ
17bfe 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 ed, there is no
17bff 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 point in writing
17c00 0d 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 .. ** any pag
17c01 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d es with page num
17c02 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 bers greater tha
17c03 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f n nTruncate into
17c04 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0d 0a the WAL file...
17c05 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c ** They will
17c06 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 never be read b
17c07 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f y any client. So
17c08 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f remove them fro
17c09 6d 20 74 68 65 20 70 44 69 72 74 79 0d 0a 20 20 m the pDirty..
17c0a 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 ** list here.
17c0b 2a 2f 0d 0a 20 20 20 20 50 67 48 64 72 20 2a 70 */.. PgHdr *p
17c0c 3b 0d 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 ;.. PgHdr **p
17c0d 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0d pNext = &pList;.
17c0e 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 . for(p=pList
17c0f 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 3b ; (*ppNext = p);
17c10 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0d 0a p=p->pDirty){..
17c11 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e if( p->pgn
17c12 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70 o<=nTruncate ) p
17c13 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 pNext = &p->pDir
17c14 74 79 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ty;.. }..
17c15 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b assert( pList );
17c16 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 .. }.... if( p
17c17 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 List->pgno==1 )
17c18 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e pager_write_chan
17c19 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 gecounter(pList)
17c1a 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 ;.. rc = sqlite
17c1b 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 3WalFrames(pPage
17c1c 72 2d 3e 70 57 61 6c 2c 20 0d 0a 20 20 20 20 20 r->pWal, ..
17c1d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a pPager->pageSiz
17c1e 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 e, pList, nTrunc
17c1f 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 ate, isCommit, p
17c20 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c Pager->walSyncFl
17c21 61 67 73 0d 0a 20 20 29 3b 0d 0a 20 20 69 66 28 ags.. );.. if(
17c22 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
17c23 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 & pPager->pBacku
17c24 70 20 29 7b 0d 0a 20 20 20 20 50 67 48 64 72 20 p ){.. PgHdr
17c25 2a 70 3b 0d 0a 20 20 20 20 66 6f 72 28 70 3d 70 *p;.. for(p=p
17c26 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 List; p; p=p->pD
17c27 69 72 74 79 29 7b 0d 0a 20 20 20 20 20 20 73 71 irty){.. sq
17c28 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 lite3BackupUpdat
17c29 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 e(pPager->pBacku
17c2a 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 p, p->pgno, (u8
17c2b 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0d 0a 20 20 *)p->pData);..
17c2c 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 23 69 66 64 }.. }....#ifd
17c2d 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f ef SQLITE_CHECK_
17c2e 50 41 47 45 53 0d 0a 20 20 70 4c 69 73 74 20 3d PAGES.. pList =
17c2f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 sqlite3PcacheDi
17c30 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e rtyList(pPager->
17c31 70 50 43 61 63 68 65 29 3b 0d 0a 20 20 66 6f 72 pPCache);.. for
17c32 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 (p=pList; p; p=p
17c33 2d 3e 70 44 69 72 74 79 29 7b 0d 0a 20 20 20 20 ->pDirty){..
17c34 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 pager_set_pageha
17c35 73 68 28 70 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e sh(p);.. }..#en
17c36 64 69 66 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 dif.... return
17c37 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a rc;..}..../*..**
17c38 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 Begin a read tr
17c39 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 ansaction on the
17c3a 20 57 41 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 WAL...**..** Th
17c3b 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 is routine used
17c3c 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 to be called "pa
17c3d 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 gerOpenSnapshot(
17c3e 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 )" because it es
17c3f 73 65 6e 74 69 61 6c 6c 79 0d 0a 2a 2a 20 6d 61 sentially..** ma
17c40 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f kes a snapshot o
17c41 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 f the database a
17c42 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f t the current po
17c43 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 int in time and
17c44 70 72 65 73 65 72 76 65 73 0d 0a 2a 2a 20 74 68 preserves..** th
17c45 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 at snapshot for
17c46 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 use by the reade
17c47 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f r in spite of co
17c48 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 ncurrently chang
17c49 65 73 20 62 79 0d 0a 2a 2a 20 6f 74 68 65 72 20 es by..** other
17c4a 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b writers or check
17c4b 70 6f 69 6e 74 65 72 73 2e 0d 0a 2a 2f 0d 0a 73 pointers...*/..s
17c4c 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 tatic int pagerB
17c4d 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 eginReadTransact
17c4e 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 ion(Pager *pPage
17c4f 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 r){.. int rc;
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c51 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
17c52 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 code */.. int
17c53 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 changed = 0;
17c54 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
17c55 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 rue if cache mus
17c56 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0d 0a 0d t be reset */...
17c57 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 . assert( pager
17c58 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 UseWal(pPager) )
17c59 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
17c5a 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 ger->eState==PAG
17c5b 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 ER_OPEN || pPage
17c5c 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
17c5d 5f 52 45 41 44 45 52 20 29 3b 0d 0a 0d 0a 20 20 _READER );....
17c5e 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 /* sqlite3WalEnd
17c5f 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 ReadTransaction(
17c60 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 ) was not called
17c61 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 for the previou
17c62 73 0d 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 s.. ** transact
17c63 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d ion in locking_m
17c64 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 ode=EXCLUSIVE.
17c65 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 So call it now.
17c66 20 49 66 20 77 65 0d 0a 20 20 2a 2a 20 61 72 65 If we.. ** are
17c67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 in locking_mode
17c68 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 =NORMAL and EndR
17c69 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f ead() was previo
17c6a 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0d 0a 20 20 usly called,..
17c6b 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 ** the duplicate
17c6c 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 call is harmles
17c6d 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 6c 69 s... */.. sqli
17c6e 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 te3WalEndReadTra
17c6f 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d nsaction(pPager-
17c70 3e 70 57 61 6c 29 3b 0d 0a 0d 0a 20 20 72 63 20 >pWal);.... rc
17c71 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 = sqlite3WalBegi
17c72 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e nReadTransaction
17c73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 (pPager->pWal, &
17c74 63 68 61 6e 67 65 64 29 3b 0d 0a 20 20 69 66 28 changed);.. if(
17c75 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c rc!=SQLITE_OK |
17c76 7c 20 63 68 61 6e 67 65 64 20 29 7b 0d 0a 20 20 | changed ){..
17c77 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 pager_reset(pP
17c78 61 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 ager);.. }....
17c79 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
17c7a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
17c7b 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
17c7c 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 s called as part
17c7d 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 of the transiti
17c7e 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 on from PAGER_OP
17c7f 45 4e 0d 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f EN..** to PAGER_
17c80 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 READER state to
17c81 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 determine the si
17c82 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 ze of the databa
17c83 73 65 20 66 69 6c 65 0d 0a 2a 2a 20 69 6e 20 70 se file..** in p
17c84 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 ages (assuming t
17c85 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 he page size cur
17c86 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e rently stored in
17c87 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 Pager.pageSize)
17c88 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 6e 6f 20 ...**..** If no
17c89 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 error occurs, SQ
17c8a 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 LITE_OK is retur
17c8b 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 ned and the size
17c8c 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
17c8d 0d 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 ..** in pages is
17c8e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 stored in *pnPa
17c8f 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 ge. Otherwise, a
17c90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 n error code (pe
17c91 72 68 61 70 73 0d 0a 2a 2a 20 53 51 4c 49 54 45 rhaps..** SQLITE
17c92 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 _IOERR_FSTAT) is
17c93 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 returned and *p
17c94 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e nPage is left un
17c95 6d 6f 64 69 66 69 65 64 2e 0d 0a 2a 2f 0d 0a 73 modified...*/..s
17c96 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 tatic int pagerP
17c97 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a agecount(Pager *
17c98 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e pPager, Pgno *pn
17c99 50 61 67 65 29 7b 0d 0a 20 20 50 67 6e 6f 20 6e Page){.. Pgno n
17c9a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 Page;
17c9b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c /* Val
17c9c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 ue to return via
17c9d 20 2a 70 6e 50 61 67 65 20 2a 2f 0d 0a 0d 0a 20 *pnPage */....
17c9e 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 /* Query the WA
17c9f 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 L sub-system for
17ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 the database si
17ca1 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a ze. The WalDbsiz
17ca2 65 28 29 0d 0a 20 20 2a 2a 20 66 75 6e 63 74 69 e().. ** functi
17ca3 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 on returns zero
17ca4 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f if the WAL is no
17ca5 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 t open (i.e. Pag
17ca6 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0d er.pWal==0), or.
17ca7 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 . ** if the dat
17ca8 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f abase size is no
17ca9 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 t available. The
17caa 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 database size i
17cab 73 20 6e 6f 74 0d 0a 20 20 2a 2a 20 61 76 61 69 s not.. ** avai
17cac 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 lable from the W
17cad 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 AL sub-system if
17cae 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 the log file is
17caf 20 65 6d 70 74 79 20 6f 72 0d 0a 20 20 2a 2a 20 empty or.. **
17cb0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 contains no vali
17cb1 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e d committed tran
17cb2 73 61 63 74 69 6f 6e 73 2e 0d 0a 20 20 2a 2f 0d sactions... */.
17cb3 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 . assert( pPage
17cb4 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
17cb5 5f 4f 50 45 4e 20 29 3b 0d 0a 20 20 61 73 73 65 _OPEN );.. asse
17cb6 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 rt( pPager->eLoc
17cb7 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c k>=SHARED_LOCK |
17cb8 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 | pPager->noRead
17cb9 6c 6f 63 6b 20 29 3b 0d 0a 20 20 6e 50 61 67 65 lock );.. nPage
17cba 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 = sqlite3WalDbs
17cbb 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c ize(pPager->pWal
17cbc 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 );.... /* If th
17cbd 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 e database size
17cbe 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c was not availabl
17cbf 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 e from the WAL s
17cc0 75 62 2d 73 79 73 74 65 6d 2c 0d 0a 20 20 2a 2a ub-system,.. **
17cc1 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 determine it ba
17cc2 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 sed on the size
17cc3 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
17cc4 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a file. If the siz
17cc5 65 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 e.. ** of the d
17cc6 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 atabase file is
17cc7 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d not an integer m
17cc8 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 ultiple of the p
17cc9 61 67 65 2d 73 69 7a 65 2c 0d 0a 20 20 2a 2a 20 age-size,.. **
17cca 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 round down to th
17ccb 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 e nearest page.
17ccc 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 Except, any file
17ccd 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0d 0a larger than 0..
17cce 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 ** bytes in si
17ccf 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 ze is considered
17cd0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c to contain at l
17cd1 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0d 0a east one page...
17cd2 20 20 2a 2f 0d 0a 20 20 69 66 28 20 6e 50 61 67 */.. if( nPag
17cd3 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 36 34 e==0 ){.. i64
17cd4 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 n = 0;
17cd5 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
17cd6 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e ze of db file in
17cd7 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 20 20 61 bytes */.. a
17cd8 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 ssert( isOpen(pP
17cd9 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 ager->fd) || pPa
17cda 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b ger->tempFile );
17cdb 0d 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e .. if( isOpen
17cdc 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0d (pPager->fd) ){.
17cdd 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 . int rc =
17cde 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a sqlite3OsFileSiz
17cdf 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e e(pPager->fd, &n
17ce0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 );.. if( rc
17ce1 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
17ce2 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 return r
17ce3 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 c;.. }..
17ce4 20 7d 0d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 }.. nPage =
17ce5 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 (Pgno)((n+pPager
17ce6 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 ->pageSize-1) /
17ce7 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 pPager->pageSize
17ce8 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 );.. }.... /*
17ce9 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e If the current n
17cea 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 umber of pages i
17ceb 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 n the file is gr
17cec 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0d 0a eater than the..
17ced 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 ** configured
17cee 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 maximum pager nu
17cef 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 mber, increase t
17cf0 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 he allowed limit
17cf1 20 73 6f 0d 0a 20 20 2a 2a 20 74 68 61 74 20 74 so.. ** that t
17cf2 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 he file can be r
17cf3 65 61 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 ead... */.. if
17cf4 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e ( nPage>pPager->
17cf5 6d 78 50 67 6e 6f 20 29 7b 0d 0a 20 20 20 20 70 mxPgno ){.. p
17cf6 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 Pager->mxPgno =
17cf7 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0d 0a 20 20 (Pgno)nPage;..
17cf8 7d 0d 0a 0d 0a 20 20 2a 70 6e 50 61 67 65 20 3d }.... *pnPage =
17cf9 20 6e 50 61 67 65 3b 0d 0a 20 20 72 65 74 75 72 nPage;.. retur
17cfa 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
17cfb 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
17cfc 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 2f 2a 0d 0a E_OMIT_WAL../*..
17cfd 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 ** Check if the
17cfe 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 *-wal file that
17cff 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 corresponds to t
17d00 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e he database open
17d01 65 64 20 62 79 20 70 50 61 67 65 72 0d 0a 2a 2a ed by pPager..**
17d02 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64 exists if the d
17d03 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 atabase is not e
17d04 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 mpy, or verify t
17d05 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 hat the *-wal fi
17d06 6c 65 20 64 6f 65 73 0d 0a 2a 2a 20 6e 6f 74 20 le does..** not
17d07 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 exist (by deleti
17d08 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 ng it) if the da
17d09 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 tabase file is e
17d0a 6d 70 74 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 mpty...**..** If
17d0b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 the database is
17d0c 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 not empty and t
17d0d 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 he *-wal file ex
17d0e 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 ists, open the p
17d0f 61 67 65 72 0d 0a 2a 2a 20 69 6e 20 57 41 4c 20 ager..** in WAL
17d10 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 mode. If the da
17d11 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 tabase is empty
17d12 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 or if no *-wal f
17d13 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0d 0a ile exists and..
17d14 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f ** if no error o
17d15 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 ccurs, make sure
17d16 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f Pager.journalMo
17d17 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f de is not set to
17d18 0d 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e ..** PAGER_JOURN
17d19 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0d 0a 2a 2a 0d ALMODE_WAL...**.
17d1a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 .** Return SQLIT
17d1b 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 E_OK or an error
17d1c 20 63 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 code...**..** T
17d1d 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 he caller must h
17d1e 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 old a SHARED loc
17d1f 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 k on the databas
17d20 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 e file to call t
17d21 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e his..** function
17d22 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 . Because an EXC
17d23 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 LUSIVE lock on t
17d24 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 he db file is re
17d25 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 quired to delete
17d26 20 0d 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 ..** a WAL on a
17d27 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 none-empty data
17d28 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 base, this ensur
17d29 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 es there is no r
17d2a 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0d 0a ace condition ..
17d2b 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 ** between the x
17d2c 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 Access() below a
17d2d 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 nd an xDelete()
17d2e 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 being executed b
17d2f 79 20 73 6f 6d 65 20 0d 0a 2a 2a 20 6f 74 68 65 y some ..** othe
17d30 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 2a r connection...*
17d31 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 /..static int pa
17d32 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 gerOpenWalIfPres
17d33 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 ent(Pager *pPage
17d34 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 r){.. int rc =
17d35 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 61 73 SQLITE_OK;.. as
17d36 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 sert( pPager->eS
17d37 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e tate==PAGER_OPEN
17d38 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
17d39 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 Pager->eLock>=SH
17d3a 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 ARED_LOCK || pPa
17d3b 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 ger->noReadlock
17d3c 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 70 50 61 );.... if( !pPa
17d3d 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b ger->tempFile ){
17d3e 0d 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b .. int isWal;
17d3f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17d40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 /* True if W
17d41 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a AL file exists *
17d42 2f 0d 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 /.. Pgno nPag
17d43 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
17d44 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
17d45 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
17d46 65 20 2a 2f 0d 0a 0d 0a 20 20 20 20 72 63 20 3d e */.... rc =
17d47 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 pagerPagecount(
17d48 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b pPager, &nPage);
17d49 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 .. if( rc ) r
17d4a 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 69 eturn rc;.. i
17d4b 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0d 0a f( nPage==0 ){..
17d4c 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
17d4d 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 e3OsDelete(pPage
17d4e 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d r->pVfs, pPager-
17d4f 3e 7a 57 61 6c 2c 20 30 29 3b 0d 0a 20 20 20 20 >zWal, 0);..
17d50 20 20 69 73 57 61 6c 20 3d 20 30 3b 0d 0a 20 20 isWal = 0;..
17d51 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
17d52 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 rc = sqlite3OsAc
17d53 63 65 73 73 28 0d 0a 20 20 20 20 20 20 20 20 20 cess(..
17d54 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 pPager->pVfs, p
17d55 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c Pager->zWal, SQL
17d56 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 ITE_ACCESS_EXIST
17d57 53 2c 20 26 69 73 57 61 6c 0d 0a 20 20 20 20 20 S, &isWal..
17d58 20 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 );.. }..
17d59 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
17d5a 4b 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 K ){.. if(
17d5b 69 73 57 61 6c 20 29 7b 0d 0a 20 20 20 20 20 20 isWal ){..
17d5c 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 testcase( sqli
17d5d 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 te3PcachePagecou
17d5e 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 nt(pPager->pPCac
17d5f 68 65 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 he)==0 );..
17d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 rc = sqlite3P
17d61 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 agerOpenWal(pPag
17d62 65 72 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 7d er, 0);.. }
17d63 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d else if( pPager-
17d64 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 >journalMode==PA
17d65 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
17d66 57 41 4c 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 WAL ){..
17d67 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d pPager->journalM
17d68 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 ode = PAGER_JOUR
17d69 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0d NALMODE_DELETE;.
17d6a 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
17d6b 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
17d6c 63 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d c;..}..#endif...
17d6d 0a 2f 2a 0d 0a 2a 2a 20 50 6c 61 79 62 61 63 6b ./*..** Playback
17d6e 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 savepoint pSave
17d6f 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 point. Or, if pS
17d70 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 avepoint==NULL,
17d71 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0d 0a 2a then playback..*
17d72 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 * the entire mas
17d73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
17d74 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 . The case pSave
17d75 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 point==NULL occu
17d76 72 73 20 77 68 65 6e 20 0d 0a 2a 2a 20 61 20 52 rs when ..** a R
17d77 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 OLLBACK TO comma
17d78 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e nd is invoked on
17d79 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 a SAVEPOINT tha
17d7a 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 t is a transacti
17d7b 6f 6e 20 0d 0a 2a 2a 20 73 61 76 65 70 6f 69 6e on ..** savepoin
17d7c 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 t...**..** When
17d7d 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f pSavepoint is no
17d7e 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 t NULL (meaning
17d7f 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f a non-transactio
17d80 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0d n savepoint is .
17d81 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 .** being rolled
17d82 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 back), then the
17d83 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 rollback consis
17d84 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 ts of up to thre
17d85 65 20 73 74 61 67 65 73 2c 0d 0a 2a 2a 20 70 65 e stages,..** pe
17d86 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f rformed in the o
17d87 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0d rder specified:.
17d88 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 50 61 67 65 .**..** * Page
17d89 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 s are played bac
17d8a 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 k from the main
17d8b 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 journal starting
17d8c 20 61 74 20 62 79 74 65 0d 0a 2a 2a 20 20 20 20 at byte..**
17d8d 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 offset PagerSav
17d8e 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 epoint.iOffset a
17d8f 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f nd continuing to
17d90 20 0d 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 ..** PagerS
17d91 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 avepoint.iHdrOff
17d92 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 set, or to the e
17d93 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a nd of the main j
17d94 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 20 20 20 20 66 ournal..** f
17d95 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 ile if PagerSave
17d96 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 point.iHdrOffset
17d97 20 69 73 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a is zero...**..*
17d98 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 * * If PagerSa
17d99 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 vepoint.iHdrOffs
17d9a 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 et is not zero,
17d9b 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 then pages are p
17d9c 6c 61 79 65 64 0d 0a 2a 2a 20 20 20 20 20 62 61 layed..** ba
17d9d 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d ck starting from
17d9e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 the journal hea
17d9f 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 der immediately
17da0 66 6f 6c 6c 6f 77 69 6e 67 20 0d 0a 2a 2a 20 20 following ..**
17da1 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e PagerSavepoin
17da2 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 t.iHdrOffset to
17da3 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d the end of the m
17da4 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ain journal file
17da5 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 50 61 ...**..** * Pa
17da6 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 ges are then pla
17da7 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 yed back from th
17da8 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 e sub-journal fi
17da9 6c 65 2c 20 73 74 61 72 74 69 6e 67 0d 0a 2a 2a le, starting..**
17daa 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 with the Pa
17dab 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 gerSavepoint.iSu
17dac 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 bRec and continu
17dad 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f ing to the end o
17dae 66 0d 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f f..** the jo
17daf 75 72 6e 61 6c 20 66 69 6c 65 2e 0d 0a 2a 2a 0d urnal file...**.
17db0 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 .** Throughout t
17db1 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 he rollback proc
17db2 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 ess, each time a
17db3 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 page is rolled
17db4 62 61 63 6b 2c 20 74 68 65 0d 0a 2a 2a 20 63 6f back, the..** co
17db5 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 rresponding bit
17db6 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 is set in a bitv
17db7 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 ec structure (va
17db8 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 riable pDone in
17db9 74 68 65 0d 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e the..** implemen
17dba 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 tation below). T
17dbb 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 his is used to e
17dbc 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 nsure that a pag
17dbd 65 20 69 73 20 6f 6e 6c 79 0d 0a 2a 2a 20 72 6f e is only..** ro
17dbe 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 lled back the fi
17dbf 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 rst time it is e
17dc0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 ncountered in ei
17dc1 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0d 0a 2a ther journal...*
17dc2 2a 0d 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f *..** If pSavepo
17dc3 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 int is NULL, the
17dc4 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 n pages are only
17dc5 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f played back fro
17dc6 6d 20 74 68 65 20 6d 61 69 6e 0d 0a 2a 2a 20 6a m the main..** j
17dc7 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 ournal file. The
17dc8 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f re is no need fo
17dc9 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 r a bitvec in th
17dca 69 73 20 63 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a is case...**..**
17dcb 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c In either case,
17dcc 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b before playback
17dcd 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 commences the P
17dce 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 ager.dbSize vari
17dcf 61 62 6c 65 0d 0a 2a 2a 20 69 73 20 72 65 73 65 able..** is rese
17dd0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 t to the value t
17dd1 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 hat it held at t
17dd2 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 he start of the
17dd3 73 61 76 65 70 6f 69 6e 74 20 0d 0a 2a 2a 20 28 savepoint ..** (
17dd4 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e or transaction).
17dd5 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 No page with a
17dd6 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 page-number grea
17dd7 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 ter than this va
17dd8 6c 75 65 0d 0a 2a 2a 20 69 73 20 70 6c 61 79 65 lue..** is playe
17dd9 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 d back. If one i
17dda 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 s encountered it
17ddb 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 is simply skipp
17ddc 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ed...*/..static
17ddd 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 int pagerPlaybac
17dde 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 kSavepoint(Pager
17ddf 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 *pPager, PagerS
17de0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 avepoint *pSavep
17de1 6f 69 6e 74 29 7b 0d 0a 20 20 69 36 34 20 73 7a oint){.. i64 sz
17de2 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 J;
17de3 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 /* Effective
17de4 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e size of the main
17de5 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 20 69 journal */.. i
17de6 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 64 iHdrOff;
17de7 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f /* End o
17de8 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 f first segment
17de9 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 of main-journal
17dea 72 65 63 6f 72 64 73 20 2a 2f 0d 0a 20 20 69 6e records */.. in
17deb 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
17dec 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e ; /* Return
17ded 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 42 69 74 76 code */.. Bitv
17dee 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 ec *pDone = 0;
17def 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 /* Bitvec t
17df0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 o ensure pages p
17df1 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 layed back only
17df2 6f 6e 63 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 once */.... ass
17df3 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 ert( pPager->eSt
17df4 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 ate!=PAGER_ERROR
17df5 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
17df6 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 Pager->eState>=P
17df7 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b AGER_WRITER_LOCK
17df8 45 44 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 6c ED );.... /* Al
17df9 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 locate a bitvec
17dfa 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 to use to store
17dfb 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 the set of pages
17dfc 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0d rolled back */.
17dfd 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e . if( pSavepoin
17dfe 74 20 29 7b 0d 0a 20 20 20 20 70 44 6f 6e 65 20 t ){.. pDone
17dff 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 = sqlite3BitvecC
17e00 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 reate(pSavepoint
17e01 2d 3e 6e 4f 72 69 67 29 3b 0d 0a 20 20 20 20 69 ->nOrig);.. i
17e02 66 28 20 21 70 44 6f 6e 65 20 29 7b 0d 0a 20 20 f( !pDone ){..
17e03 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
17e04 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d E_NOMEM;.. }.
17e05 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 53 65 74 . }.... /* Set
17e06 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 the database si
17e07 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 ze back to the v
17e08 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f alue it was befo
17e09 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 re the savepoint
17e0a 20 0d 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 .. ** being re
17e0b 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 verted was opene
17e0c 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 70 50 61 67 d... */.. pPag
17e0d 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 er->dbSize = pSa
17e0e 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 vepoint ? pSavep
17e0f 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 oint->nOrig : pP
17e10 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 ager->dbOrigSize
17e11 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 ;.. pPager->cha
17e12 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 ngeCountDone = p
17e13 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b Pager->tempFile;
17e14 0d 0a 0d 0a 20 20 69 66 28 20 21 70 53 61 76 65 .... if( !pSave
17e15 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 point && pagerUs
17e16 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0d eWal(pPager) ){.
17e17 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 . return page
17e18 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 rRollbackWal(pPa
17e19 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 ger);.. }....
17e1a 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a /* Use pPager->j
17e1b 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 ournalOff as the
17e1c 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 effective size
17e1d 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c of the main roll
17e1e 62 61 63 6b 0d 0a 20 20 2a 2a 20 6a 6f 75 72 6e back.. ** journ
17e1f 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 al. The actual
17e20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 file might be la
17e21 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 rger than this i
17e22 6e 0d 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f n.. ** PAGER_JO
17e23 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 URNALMODE_TRUNCA
17e24 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 TE or PAGER_JOUR
17e25 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e NALMODE_PERSIST.
17e26 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0d 0a But anything..
17e27 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 ** past pPager
17e28 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 ->journalOff is
17e29 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 off-limits to us
17e2a 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 7a 4a 20 3d ... */.. szJ =
17e2b 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
17e2c 4f 66 66 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 Off;.. assert(
17e2d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 pagerUseWal(pPag
17e2e 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 er)==0 || szJ==0
17e2f 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 42 65 67 69 );.... /* Begi
17e30 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 n by rolling bac
17e31 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 k records from t
17e32 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 he main journal
17e33 73 74 61 72 74 69 6e 67 20 61 74 0d 0a 20 20 2a starting at.. *
17e34 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 * PagerSavepoint
17e35 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e .iOffset and con
17e36 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e tinuing to the n
17e37 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 ext journal head
17e38 65 72 2e 0d 0a 20 20 2a 2a 20 54 68 65 72 65 20 er... ** There
17e39 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 might be records
17e3a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 in the main jou
17e3b 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 rnal that have a
17e3c 20 70 61 67 65 20 6e 75 6d 62 65 72 0d 0a 20 20 page number..
17e3d 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 ** greater than
17e3e 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 the current data
17e3f 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 base size (pPage
17e40 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 r->dbSize) but t
17e41 68 6f 73 65 0d 0a 20 20 2a 2a 20 77 69 6c 6c 20 hose.. ** will
17e42 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d be skipped autom
17e43 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 atically. Pages
17e44 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 are added to pD
17e45 6f 6e 65 20 61 73 20 74 68 65 79 0d 0a 20 20 2a one as they.. *
17e46 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 * are played bac
17e47 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 k... */.. if(
17e48 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 pSavepoint && !p
17e49 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 agerUseWal(pPage
17e4a 72 29 20 29 7b 0d 0a 20 20 20 20 69 48 64 72 4f r) ){.. iHdrO
17e4b 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d ff = pSavepoint-
17e4c 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 >iHdrOffset ? pS
17e4d 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 avepoint->iHdrOf
17e4e 66 73 65 74 20 3a 20 73 7a 4a 3b 0d 0a 20 20 20 fset : szJ;..
17e4f 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
17e50 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 Off = pSavepoint
17e51 2d 3e 69 4f 66 66 73 65 74 3b 0d 0a 20 20 20 20 ->iOffset;..
17e52 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 while( rc==SQLIT
17e53 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e E_OK && pPager->
17e54 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f journalOff<iHdrO
17e55 66 66 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 ff ){.. rc
17e56 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b = pager_playback
17e57 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 _one_page(pPager
17e58 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e , &pPager->journ
17e59 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c alOff, pDone, 1,
17e5a 20 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 1);.. }..
17e5b 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c assert( rc!=SQL
17e5c 49 54 45 5f 44 4f 4e 45 20 29 3b 0d 0a 20 20 7d ITE_DONE );.. }
17e5d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 50 61 67 65 else{.. pPage
17e5e 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 r->journalOff =
17e5f 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 0;.. }.... /*
17e60 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 Continue rolling
17e61 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 back records ou
17e62 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f t of the main jo
17e63 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 urnal starting a
17e64 74 0d 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 t.. ** the firs
17e65 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 t journal header
17e66 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e seen and contin
17e67 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 uing until the e
17e68 66 66 65 63 74 69 76 65 20 65 6e 64 0d 0a 20 20 ffective end..
17e69 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a ** of the main j
17e6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f ournal file. Co
17e6b 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f ntinue to skip o
17e6c 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 ut-of-range page
17e6d 73 20 61 6e 64 0d 0a 20 20 2a 2a 20 63 6f 6e 74 s and.. ** cont
17e6e 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 inue adding page
17e6f 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f s rolled back to
17e70 20 70 44 6f 6e 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 pDone... */..
17e71 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 while( rc==SQLI
17e72 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d TE_OK && pPager-
17e73 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 >journalOff<szJ
17e74 29 7b 0d 0a 20 20 20 20 75 33 32 20 69 69 3b 20 ){.. u32 ii;
17e75 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
17e76 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 op counter */..
17e77 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 u32 nJRec = 0
17e78 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 ; /* Number
17e79 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 of Journal Recor
17e7a 64 73 20 2a 2f 0d 0a 20 20 20 20 75 33 32 20 64 ds */.. u32 d
17e7b 75 6d 6d 79 3b 0d 0a 20 20 20 20 72 63 20 3d 20 ummy;.. rc =
17e7c 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 readJournalHdr(p
17e7d 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 Pager, 0, szJ, &
17e7e 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0d nJRec, &dummy);.
17e7f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 . assert( rc!
17e80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0d =SQLITE_DONE );.
17e81 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 2a ... /*.. *
17e82 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a * The "pPager->j
17e83 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 ournalHdr+JOURNA
17e84 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 L_HDR_SZ(pPager)
17e85 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 ==pPager->journa
17e86 6c 4f 66 66 22 0d 0a 20 20 20 20 2a 2a 20 74 65 lOff".. ** te
17e87 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f st is related to
17e88 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 ticket #2565.
17e89 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 See the discussi
17e8a 6f 6e 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 2a on in the.. *
17e8b 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b * pager_playback
17e8c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 () function for
17e8d 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 additional infor
17e8e 6d 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 2a 2f 0d mation... */.
17e8f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d . if( nJRec==
17e90 30 20 0d 0a 20 20 20 20 20 26 26 20 70 50 61 67 0 .. && pPag
17e91 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a er->journalHdr+J
17e92 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 OURNAL_HDR_SZ(pP
17e93 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a ager)==pPager->j
17e94 6f 75 72 6e 61 6c 4f 66 66 0d 0a 20 20 20 20 29 ournalOff.. )
17e95 7b 0d 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d {.. nJRec =
17e96 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 (u32)((szJ - pP
17e97 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 ager->journalOff
17e98 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 )/JOURNAL_PG_SZ(
17e99 70 50 61 67 65 72 29 29 3b 0d 0a 20 20 20 20 7d pPager));.. }
17e9a 0d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 .. for(ii=0;
17e9b 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
17e9c 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 ii<nJRec && pPa
17e9d 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c ger->journalOff<
17e9e 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 szJ; ii++){..
17e9f 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c rc = pager_pl
17ea0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 ayback_one_page(
17ea1 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d pPager, &pPager-
17ea2 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f >journalOff, pDo
17ea3 6e 65 2c 20 31 2c 20 31 29 3b 0d 0a 20 20 20 20 ne, 1, 1);..
17ea4 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 }.. assert( r
17ea5 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 c!=SQLITE_DONE )
17ea6 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 ;.. }.. assert
17ea7 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
17ea8 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e || pPager->journ
17ea9 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0d 0a 0d alOff>=szJ );...
17eaa 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 . /* Finally,
17eab 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 rollback pages f
17eac 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 rom the sub-jour
17ead 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 nal. Page that
17eae 77 65 72 65 0d 0a 20 20 2a 2a 20 70 72 65 76 69 were.. ** previ
17eaf 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 ously rolled bac
17eb0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 k out of the mai
17eb1 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 n journal (and a
17eb2 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e re hence in pDon
17eb3 65 29 0d 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 e).. ** will be
17eb4 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f skipped. Out-o
17eb5 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 f-range pages ar
17eb6 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0d e also skipped..
17eb7 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 53 61 . */.. if( pSa
17eb8 76 65 70 6f 69 6e 74 20 29 7b 0d 0a 20 20 20 20 vepoint ){..
17eb9 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 u32 ii;
17eba 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 /* Loop count
17ebb 65 72 20 2a 2f 0d 0a 20 20 20 20 69 36 34 20 6f er */.. i64 o
17ebc 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 ffset = (i64)pSa
17ebd 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 vepoint->iSubRec
17ebe 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 *(4+pPager->page
17ebf 53 69 7a 65 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 Size);.... if
17ec0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 ( pagerUseWal(pP
17ec1 61 67 65 72 29 20 29 7b 0d 0a 20 20 20 20 20 20 ager) ){..
17ec2 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 rc = sqlite3WalS
17ec3 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 avepointUndo(pPa
17ec4 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 ger->pWal, pSave
17ec5 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 point->aWalData)
17ec6 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 6f ;.. }.. fo
17ec7 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d r(ii=pSavepoint-
17ec8 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 >iSubRec; rc==SQ
17ec9 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 LITE_OK && ii<pP
17eca 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 ager->nSubRec; i
17ecb 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 i++){.. ass
17ecc 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 ert( offset==(i6
17ecd 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 4)ii*(4+pPager->
17ece 70 61 67 65 53 69 7a 65 29 20 29 3b 0d 0a 20 20 pageSize) );..
17ecf 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 rc = pager_p
17ed0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 layback_one_page
17ed1 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 (pPager, &offset
17ed2 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0d , pDone, 0, 1);.
17ed3 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 . }.. asse
17ed4 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 rt( rc!=SQLITE_D
17ed5 4f 4e 45 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 ONE );.. }....
17ed6 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 sqlite3BitvecDe
17ed7 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0d 0a 20 stroy(pDone);..
17ed8 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
17ed9 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 OK ){.. pPage
17eda 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 r->journalOff =
17edb 73 7a 4a 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 szJ;.. }.... r
17edc 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
17edd 2f 2a 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 /*..** Change th
17ede 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 e maximum number
17edf 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 of in-memory pa
17ee0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c ges that are all
17ee1 6f 77 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 owed...*/..SQLIT
17ee2 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
17ee3 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 qlite3PagerSetCa
17ee4 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 chesize(Pager *p
17ee5 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 Pager, int mxPag
17ee6 65 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 50 63 e){.. sqlite3Pc
17ee7 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 acheSetCachesize
17ee8 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 (pPager->pPCache
17ee9 2c 20 6d 78 50 61 67 65 29 3b 0d 0a 7d 0d 0a 0d , mxPage);..}...
17eea 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 61 73 20 ./*..** Free as
17eeb 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 much memory as p
17eec 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 ossible from the
17eed 20 70 61 67 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c pager...*/..SQL
17eee 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
17eef 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 sqlite3PagerShr
17ef0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 ink(Pager *pPage
17ef1 72 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 50 63 r){.. sqlite3Pc
17ef2 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 acheShrink(pPage
17ef3 72 2d 3e 70 50 43 61 63 68 65 29 3b 0d 0a 7d 0d r->pPCache);..}.
17ef4 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 6a 75 73 74 .../*..** Adjust
17ef5 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 the robustness
17ef6 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
17ef7 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f to damage due to
17ef8 20 4f 53 20 63 72 61 73 68 65 73 0d 0a 2a 2a 20 OS crashes..**
17ef9 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 or power failure
17efa 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 s by changing th
17efb 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 e number of sync
17efc 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e s()s when writin
17efd 67 0d 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 g..** the rollba
17efe 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 ck journal. The
17eff 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 re are three lev
17f00 65 6c 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 els:..**..**
17f01 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 OFF sqlite
17f02 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 3OsSync() is nev
17f03 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 er called. This
17f04 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0d is the default.
17f05 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
17f06 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 for temporary a
17f07 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c nd transient fil
17f08 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4e es...**..** N
17f09 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 ORMAL The jou
17f0a 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f rnal is synced o
17f0b 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 nce before write
17f0c 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0d 0a s begin on the..
17f0d 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 **
17f0e 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 database. This
17f0f 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 is normally adeq
17f10 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c uate protection,
17f11 20 62 75 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 but..**
17f12 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f it is theo
17f13 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 retically possib
17f14 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 le, though very
17f15 75 6e 6c 69 6b 65 6c 79 2c 0d 0a 2a 2a 20 20 20 unlikely,..**
17f16 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 that
17f17 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f an inopertune po
17f18 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c wer failure coul
17f19 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 d leave the jour
17f1a 6e 61 6c 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 nal..**
17f1b 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 in a state
17f1c 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 which would caus
17f1d 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 e damage to the
17f1e 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 20 20 20 database..**
17f1f 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 when i
17f20 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b t is rolled back
17f21 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 46 55 4c ...**..** FUL
17f22 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e L The journ
17f23 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 al is synced twi
17f24 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 ce before writes
17f25 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0d 0a 2a begin on the..*
17f26 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 * d
17f27 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f atabase (with so
17f28 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e me additional in
17f29 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 formation - the
17f2a 6e 52 65 63 20 66 69 65 6c 64 0d 0a 2a 2a 20 20 nRec field..**
17f2b 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 of t
17f2c 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 he journal heade
17f2d 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 r - being writte
17f2e 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 n in between the
17f2f 20 74 77 6f 0d 0a 2a 2a 20 20 20 20 20 20 20 20 two..**
17f30 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 syncs). I
17f31 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 f we assume that
17f32 20 77 72 69 74 69 6e 67 20 61 0d 0a 2a 2a 20 20 writing a..**
17f33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 sing
17f34 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 le disk sector i
17f35 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 s atomic, then t
17f36 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 his mode provide
17f37 73 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 s..**
17f38 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 assurance tha
17f39 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 t the journal wi
17f3a 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 ll not be corrup
17f3b 74 65 64 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 20 ted to the..**
17f3c 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e poin
17f3d 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d t of causing dam
17f3e 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 age to the datab
17f3f 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 ase during rollb
17f40 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ack...**..** The
17f41 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 above is for a
17f42 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c rollback-journal
17f43 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 mode. For WAL
17f44 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e mode, OFF contin
17f45 75 65 73 0d 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 ues..** to mean
17f46 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 that no syncs ev
17f47 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 er occur. NORMA
17f48 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 L means that the
17f49 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0d 0a WAL is synced..
17f4a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 ** prior to the
17f4b 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f start of checkpo
17f4c 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 int and that the
17f4d 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
17f4e 73 20 73 79 6e 63 65 64 0d 0a 2a 2a 20 61 74 20 s synced..** at
17f4f 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f the conclusion o
17f50 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 f the checkpoint
17f51 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 if the entire c
17f52 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 ontent of the WA
17f53 4c 0d 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 L..** was writte
17f54 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 n back into the
17f55 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e database. But n
17f56 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e o sync operation
17f57 73 20 6f 63 63 75 72 20 66 6f 72 0d 0a 2a 2a 20 s occur for..**
17f58 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d an ordinary comm
17f59 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 it in NORMAL mod
17f5a 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c e with WAL. FUL
17f5b 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 L means that the
17f5c 20 57 41 4c 0d 0a 2a 2a 20 66 69 6c 65 20 69 73 WAL..** file is
17f5d 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e synced followin
17f5e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 g each commit op
17f5f 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 eration, in addi
17f60 74 69 6f 6e 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 tion to the..**
17f61 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 syncs associated
17f62 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0d 0a 2a with NORMAL...*
17f63 2a 0d 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e *..** Do not con
17f64 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 fuse synchronous
17f65 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 =FULL with SQLIT
17f66 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 E_SYNC_FULL. Th
17f67 65 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e e..** SQLITE_SYN
17f68 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 C_FULL macro mea
17f69 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 ns to use the Ma
17f6a 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d cOSX-style full-
17f6b 66 73 79 6e 63 0d 0a 2a 2a 20 75 73 69 6e 67 20 fsync..** using
17f6c 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e fcntl(F_FULLFSYN
17f6d 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 C). SQLITE_SYNC
17f6e 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f _NORMAL means to
17f6f 20 64 6f 20 61 6e 0d 0a 2a 2a 20 6f 72 64 69 6e do an..** ordin
17f70 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c ary fsync() call
17f71 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 . There is no d
17f72 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 ifference betwee
17f73 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 n SQLITE_SYNC_FU
17f74 4c 4c 0d 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 LL..** and SQLIT
17f75 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e E_SYNC_NORMAL on
17f76 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 platforms other
17f77 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 than MacOSX. B
17f78 75 74 20 74 68 65 0d 0a 2a 2a 20 73 79 6e 63 68 ut the..** synch
17f79 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 ronous=FULL vers
17f7a 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e us synchronous=N
17f7b 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 ORMAL setting de
17f7c 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0d 0a 2a termines when..*
17f7d 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d * the xSync prim
17f7e 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 itive is called
17f7f 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 and is relevant
17f80 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 to all platforms
17f81 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 75 6d 65 72 69 ...**..** Numeri
17f82 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 c values associa
17f83 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 ted with these s
17f84 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 tates are OFF==1
17f85 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0d 0a 2a 2a 20 , NORMAL=2,..**
17f86 61 6e 64 20 46 55 4c 4c 3d 33 2e 0d 0a 2a 2f 0d and FULL=3...*/.
17f87 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
17f88 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d OMIT_PAGER_PRAGM
17f89 41 53 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 AS..SQLITE_PRIVA
17f8a 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
17f8b 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 agerSetSafetyLev
17f8c 65 6c 28 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 el(.. Pager *pP
17f8d 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 ager, /*
17f8e 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 The pager to set
17f8f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f safety level fo
17f90 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6c 65 76 65 r */.. int leve
17f91 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a l, /*
17f92 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e PRAGMA synchron
17f93 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e ous. 1=OFF, 2=N
17f94 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f ORMAL, 3=FULL */
17f95 20 20 0d 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46 .. int bFullF
17f96 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50 sync, /* P
17f97 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 RAGMA fullfsync
17f98 2a 2f 0d 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 */.. int bCkptF
17f99 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 ullFsync /* P
17f9a 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 RAGMA checkpoint
17f9b 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0d 0a 29 _fullfsync */..)
17f9c 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 {.. assert( lev
17f9d 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d el>=1 && level<=
17f9e 33 20 29 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 3 );.. pPager->
17f9f 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c noSync = (level
17fa0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 ==1 || pPager->t
17fa1 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0d 0a empFile) ?1:0;..
17fa2 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 pPager->fullSy
17fa3 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 nc = (level==3 &
17fa4 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 & !pPager->tempF
17fa5 69 6c 65 29 20 3f 31 3a 30 3b 0d 0a 20 20 69 66 ile) ?1:0;.. if
17fa6 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 ( pPager->noSync
17fa7 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d ){.. pPager-
17fa8 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0d >syncFlags = 0;.
17fa9 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 . pPager->ckp
17faa 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0d tSyncFlags = 0;.
17fab 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 46 75 . }else if( bFu
17fac 6c 6c 46 73 79 6e 63 20 29 7b 0d 0a 20 20 20 20 llFsync ){..
17fad 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 pPager->syncFlag
17fae 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f s = SQLITE_SYNC_
17faf 46 55 4c 4c 3b 0d 0a 20 20 20 20 70 50 61 67 65 FULL;.. pPage
17fb0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 r->ckptSyncFlags
17fb1 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 = SQLITE_SYNC_F
17fb2 55 4c 4c 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 ULL;.. }else if
17fb3 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 ( bCkptFullFsync
17fb4 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d ){.. pPager-
17fb5 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c >syncFlags = SQL
17fb6 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b ITE_SYNC_NORMAL;
17fb7 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b .. pPager->ck
17fb8 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 ptSyncFlags = SQ
17fb9 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0d LITE_SYNC_FULL;.
17fba 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
17fbb 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 Pager->syncFlags
17fbc 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e = SQLITE_SYNC_N
17fbd 4f 52 4d 41 4c 3b 0d 0a 20 20 20 20 70 50 61 67 ORMAL;.. pPag
17fbe 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 er->ckptSyncFlag
17fbf 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f s = SQLITE_SYNC_
17fc0 4e 4f 52 4d 41 4c 3b 0d 0a 20 20 7d 0d 0a 20 20 NORMAL;.. }..
17fc1 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 pPager->walSyncF
17fc2 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 lags = pPager->s
17fc3 79 6e 63 46 6c 61 67 73 3b 0d 0a 20 20 69 66 28 yncFlags;.. if(
17fc4 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e pPager->fullSyn
17fc5 63 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 72 c ){.. pPager
17fc6 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c ->walSyncFlags |
17fc7 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 = WAL_SYNC_TRANS
17fc8 41 43 54 49 4f 4e 53 3b 0d 0a 20 20 7d 0d 0a 7d ACTIONS;.. }..}
17fc9 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
17fca 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
17fcb 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 global variable
17fcc 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 is incremented
17fcd 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 whenever the lib
17fce 72 61 72 79 0d 0a 2a 2a 20 61 74 74 65 6d 70 74 rary..** attempt
17fcf 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 s to open a temp
17fd0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 orary file. Thi
17fd1 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 s information is
17fd2 20 75 73 65 64 20 66 6f 72 0d 0a 2a 2a 20 74 65 used for..** te
17fd3 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 sting and analys
17fd4 69 73 20 6f 6e 6c 79 2e 20 20 0d 0a 2a 2f 0d 0a is only. ..*/..
17fd5 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
17fd6 53 54 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 ST..SQLITE_API i
17fd7 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 nt sqlite3_opent
17fd8 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a emp_count = 0;..
17fd9 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
17fda 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 Open a temporar
17fdb 79 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 y file...**..**
17fdc 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 Write the file d
17fdd 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a escriptor into *
17fde 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 pFile. Return SQ
17fdf 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 LITE_OK on succe
17fe0 73 73 20 0d 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 ss ..** or some
17fe1 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 other error code
17fe2 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 if we fail. The
17fe3 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 OS will automat
17fe4 69 63 61 6c 6c 79 20 0d 0a 2a 2a 20 64 65 6c 65 ically ..** dele
17fe5 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 te the temporary
17fe6 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 file when it is
17fe7 20 63 6c 6f 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a closed...**..**
17fe8 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 The flags passe
17fe9 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 d to the VFS lay
17fea 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 er xOpen() call
17feb 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 are those specif
17fec 69 65 64 0d 0a 2a 2a 20 62 79 20 70 61 72 61 6d ied..** by param
17fed 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 eter vfsFlags OR
17fee 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c ed with the foll
17fef 6f 77 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 owing:..**..**
17ff0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 SQLITE_OPEN_R
17ff1 45 41 44 57 52 49 54 45 0d 0a 2a 2a 20 20 20 20 EADWRITE..**
17ff2 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 SQLITE_OPEN_CRE
17ff3 41 54 45 0d 0a 2a 2a 20 20 20 20 20 53 51 4c 49 ATE..** SQLI
17ff4 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 TE_OPEN_EXCLUSIV
17ff5 45 0d 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 E..** SQLITE
17ff6 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c _OPEN_DELETEONCL
17ff7 4f 53 45 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 OSE..*/..static
17ff8 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d int pagerOpentem
17ff9 70 28 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 61 p(.. Pager *pPa
17ffa 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 ger, /* T
17ffb 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 he pager object
17ffc 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 */.. sqlite3_fi
17ffd 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 le *pFile, /* W
17ffe 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 rite the file de
17fff 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f scriptor here */
18000 0d 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 .. int vfsFlags
18001 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 /* Fla
18002 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 gs passed throug
18003 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0d h to the VFS */.
18004 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 .){.. int rc;
18005 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18006 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
18007 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
18008 54 45 53 54 0d 0a 20 20 73 71 6c 69 74 65 33 5f TEST.. sqlite3_
18009 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b opentemp_count++
1800a 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 ; /* Used for t
1800b 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 esting and analy
1800c 73 69 73 20 6f 6e 6c 79 20 2a 2f 0d 0a 23 65 6e sis only */..#en
1800d 64 69 66 0d 0a 0d 0a 20 20 76 66 73 46 6c 61 67 dif.... vfsFlag
1800e 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 s |= SQLITE_OPE
1800f 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 N_READWRITE | SQ
18010 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 LITE_OPEN_CREATE
18011 20 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 |..
18012 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c SQLITE_OPEN_EXCL
18013 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f USIVE | SQLITE_O
18014 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 PEN_DELETEONCLOS
18015 45 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 E;.. rc = sqlit
18016 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d e3OsOpen(pPager-
18017 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c >pVfs, 0, pFile,
18018 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0d 0a vfsFlags, 0);..
18019 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 assert( rc!=SQ
1801a 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 LITE_OK || isOpe
1801b 6e 28 70 46 69 6c 65 29 20 29 3b 0d 0a 20 20 72 n(pFile) );.. r
1801c 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1801d 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 /*..** Set the b
1801e 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 usy handler func
1801f 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 tion...**..** Th
18020 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 e pager invokes
18021 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 the busy-handler
18022 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 if sqlite3OsLoc
18023 6b 28 29 20 72 65 74 75 72 6e 73 20 0d 0a 2a 2a k() returns ..**
18024 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 SQLITE_BUSY whe
18025 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 n trying to upgr
18026 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b ade from no-lock
18027 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 to a SHARED loc
18028 6b 2c 0d 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 k,..** or when t
18029 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 rying to upgrade
1802a 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 from a RESERVED
1802b 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c lock to an EXCL
1802c 55 53 49 56 45 20 0d 0a 2a 2a 20 6c 6f 63 6b 2e USIVE ..** lock.
1802d 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 It does *not* i
1802e 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 nvoke the busy h
1802f 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 andler when upgr
18030 61 64 69 6e 67 20 66 72 6f 6d 0d 0a 2a 2a 20 53 ading from..** S
18031 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 HARED to RESERVE
18032 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 D, or when upgra
18033 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 ding from SHARED
18034 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0d 0a 2a to EXCLUSIVE..*
18035 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 * (which occurs
18036 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e during hot-journ
18037 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 al rollback). Su
18038 6d 6d 61 72 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 mmary:..**..**
18039 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 Transition
1803a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1803b 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 | Invokes xBu
1803c 73 79 48 61 6e 64 6c 65 72 0d 0a 2a 2a 20 20 20 syHandler..**
1803d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1803e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1803f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18040 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a 2a 20 20 20 4e --------..** N
18041 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 O_LOCK ->
18042 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 SHARED_LOCK
18043 20 7c 20 59 65 73 0d 0a 2a 2a 20 20 20 53 48 41 | Yes..** SHA
18044 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 RED_LOCK -> RE
18045 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c SERVED_LOCK |
18046 20 4e 6f 0d 0a 2a 2a 20 20 20 53 48 41 52 45 44 No..** SHARED
18047 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 _LOCK -> EXCLU
18048 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f SIVE_LOCK | No
18049 0d 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f ..** RESERVED_
1804a 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 LOCK -> EXCLUSIV
1804b 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0d 0a E_LOCK | Yes..
1804c 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 **..** If the bu
1804d 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 sy-handler callb
1804e 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d ack returns non-
1804f 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 zero, the lock i
18050 73 20 0d 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 s ..** retried.
18051 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 If it returns ze
18052 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c ro, then the SQL
18053 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 ITE_BUSY error i
18054 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 s..** returned t
18055 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 o the caller of
18056 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 the pager API fu
18057 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c nction...*/..SQL
18058 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
18059 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 sqlite3PagerSet
1805a 42 75 73 79 68 61 6e 64 6c 65 72 28 0d 0a 20 20 Busyhandler(..
1805b 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 Pager *pPager,
1805c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1805d 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 /* Pager ob
1805e 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 ject */.. int (
1805f 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 *xBusyHandler)(v
18060 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 oid *),
18061 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 /* Pointer to bu
18062 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 sy-handler funct
18063 69 6f 6e 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a ion */.. void *
18064 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 pBusyHandlerArg
18065 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
18066 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 * Argument to pa
18067 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c ss to xBusyHandl
18068 65 72 20 2a 2f 0d 0a 29 7b 20 20 0d 0a 20 20 70 er */..){ .. p
18069 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 Pager->xBusyHand
1806a 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c ler = xBusyHandl
1806b 65 72 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 70 er;.. pPager->p
1806c 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d BusyHandlerArg =
1806d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 pBusyHandlerArg
1806e 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
1806f 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 hange the page s
18070 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 ize used by the
18071 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 Pager object. Th
18072 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 e new page size
18073 0d 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 ..** is passed i
18074 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0d 0a 2a n *pPageSize...*
18075 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 *..** If the pag
18076 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 er is in the err
18077 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 or state when th
18078 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
18079 61 6c 6c 65 64 2c 20 69 74 0d 0a 2a 2a 20 69 73 alled, it..** is
1807a 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 a no-op. The va
1807b 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 lue returned is
1807c 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 the error state
1807d 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e error code (i.e.
1807e 20 0d 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c ..** one of SQL
1807f 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 ITE_IOERR, an SQ
18080 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 LITE_IOERR_xxx s
18081 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 ub-code or SQLIT
18082 45 5f 46 55 4c 4c 29 2e 0d 0a 2a 2a 0d 0a 2a 2a E_FULL)...**..**
18083 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 Otherwise, if a
18084 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ll of the follow
18085 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0d 0a 2a ing are true:..*
18086 2a 0d 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 *..** * the ne
18087 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c w page size (val
18088 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 ue of *pPageSize
18089 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f ) is valid (a po
1808a 77 65 72 20 0d 0a 2a 2a 20 20 20 20 20 6f 66 20 wer ..** of
1808b 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 two between 512
1808c 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 and SQLITE_MAX_P
1808d 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 AGE_SIZE, inclus
1808e 69 76 65 29 2c 20 61 6e 64 0d 0a 2a 2a 0d 0a 2a ive), and..**..*
1808f 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 * * there are
18090 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 no outstanding p
18091 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 age references,
18092 61 6e 64 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 and..**..** *
18093 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 the database is
18094 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e either not an in
18095 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 -memory database
18096 20 6f 72 20 69 74 20 69 73 0d 0a 2a 2a 20 20 20 or it is..**
18097 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 an in-memory d
18098 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 atabase that cur
18099 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 rently consists
1809a 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0d 0a of zero pages...
1809b 2a 2a 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 **..** then the
1809c 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 pager object pag
1809d 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f e size is set to
1809e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0d 0a 2a 2a *pPageSize...**
1809f 0d 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 ..** If the page
180a0 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 size is changed
180a1 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 , then this func
180a2 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 tion uses sqlite
180a3 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0d 3PagerMalloc() .
180a4 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 .** to obtain a
180a5 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 new Pager.pTmpSp
180a6 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 ace buffer. If t
180a7 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 his allocation a
180a8 74 74 65 6d 70 74 20 0d 0a 2a 2a 20 66 61 69 6c ttempt ..** fail
180a9 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 s, SQLITE_NOMEM
180aa 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 is returned and
180ab 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 the page size re
180ac 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e mains unchanged.
180ad 20 0d 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 ..** In all oth
180ae 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 er cases, SQLITE
180af 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e _OK is returned.
180b0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 ..**..** If the
180b1 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 page size is not
180b2 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 changed, either
180b3 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 because one of
180b4 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a the enumerated..
180b5 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 ** conditions ab
180b6 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c ove is not true,
180b7 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 the pager was i
180b8 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 n error state wh
180b9 65 6e 20 74 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 en this..** func
180ba 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c tion was called,
180bb 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 or because the
180bc 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
180bd 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 n attempt failed
180be 2c 20 0d 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 , ..** then *pPa
180bf 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f geSize is set to
180c0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e the old, retain
180c1 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 ed page size bef
180c2 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a ore returning...
180c3 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
180c4 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 TE int sqlite3Pa
180c5 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 gerSetPagesize(P
180c6 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 ager *pPager, u3
180c7 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 2 *pPageSize, in
180c8 74 20 6e 52 65 73 65 72 76 65 29 7b 0d 0a 20 20 t nReserve){..
180c9 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
180ca 4f 4b 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 74 20 69 OK;.... /* It i
180cb 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 s not possible t
180cc 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 o do a full asse
180cd 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 rt_pager_state()
180ce 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0d 0a here, as this..
180cf 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 ** function ma
180d0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d y be called from
180d1 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 within PagerOpe
180d2 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 n(), before the
180d3 73 74 61 74 65 0d 0a 20 20 2a 2a 20 6f 66 20 74 state.. ** of t
180d4 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 he Pager object
180d5 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f is internally co
180d6 6e 73 69 73 74 65 6e 74 2e 0d 0a 20 20 2a 2a 0d nsistent... **.
180d7 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 . ** At one poi
180d8 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e nt this function
180d9 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 returned an err
180da 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 or if the pager
180db 77 61 73 20 69 6e 20 0d 0a 20 20 2a 2a 20 50 41 was in .. ** PA
180dc 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e GER_ERROR state.
180dd 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 But since PAGER
180de 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 _ERROR state gua
180df 72 61 6e 74 65 65 73 20 74 68 61 74 0d 0a 20 20 rantees that..
180e0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c ** there is at l
180e1 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e east one outstan
180e2 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 ding page refere
180e3 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 nce, this functi
180e4 6f 6e 0d 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f on.. ** is a no
180e5 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 -op for that cas
180e6 65 20 61 6e 79 68 6f 77 2e 0d 0a 20 20 2a 2f 0d e anyhow... */.
180e7 0a 0d 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a ... u32 pageSiz
180e8 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0d e = *pPageSize;.
180e9 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 . assert( pageS
180ea 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 ize==0 || (pageS
180eb 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 ize>=512 && page
180ec 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 Size<=SQLITE_MAX
180ed 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0d 0a _PAGE_SIZE) );..
180ee 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d if( (pPager->m
180ef 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 emDb==0 || pPage
180f0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0d 0a 20 r->dbSize==0)..
180f1 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 && sqlite3Pcac
180f2 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 heRefCount(pPage
180f3 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0d r->pPCache)==0 .
180f4 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 . && pageSize
180f5 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 && pageSize!=(u3
180f6 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 2)pPager->pageSi
180f7 7a 65 20 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 63 ze .. ){.. c
180f8 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c har *pNew = NULL
180f9 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
180fa 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 New temp space
180fb 2a 2f 0d 0a 20 20 20 20 69 36 34 20 6e 42 79 74 */.. i64 nByt
180fc 65 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 69 66 e = 0;.... if
180fd 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 ( pPager->eState
180fe 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 >PAGER_OPEN && i
180ff 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 sOpen(pPager->fd
18100 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d ) ){.. rc =
18101 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 sqlite3OsFileSi
18102 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 ze(pPager->fd, &
18103 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a nByte);.. }..
18104 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
18105 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
18106 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 pNew = (char *)s
18107 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 qlite3PageMalloc
18108 28 70 61 67 65 53 69 7a 65 29 3b 0d 0a 20 20 20 (pageSize);..
18109 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 if( !pNew ) r
1810a 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
1810b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
1810c 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1810d 4b 20 29 7b 0d 0a 20 20 20 20 20 20 70 61 67 65 K ){.. page
1810e 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b r_reset(pPager);
1810f 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e .. pPager->
18110 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 dbSize = (Pgno)(
18111 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d (nByte+pageSize-
18112 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0d 0a 20 1)/pageSize);..
18113 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 pPager->pag
18114 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 eSize = pageSize
18115 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ;.. sqlite3
18116 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d PageFree(pPager-
18117 3e 70 54 6d 70 53 70 61 63 65 29 3b 0d 0a 20 20 >pTmpSpace);..
18118 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 pPager->pTmp
18119 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0d 0a 20 Space = pNew;..
1811a 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 sqlite3Pcac
1811b 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 heSetPageSize(pP
1811c 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 ager->pPCache, p
1811d 61 67 65 53 69 7a 65 29 3b 0d 0a 20 20 20 20 7d ageSize);.. }
1811e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 50 61 67 .. }.... *pPag
1811f 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e eSize = pPager->
18120 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 69 66 28 pageSize;.. if(
18121 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
18122 7b 0d 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 {.. if( nRese
18123 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 rve<0 ) nReserve
18124 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 = pPager->nRese
18125 72 76 65 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 rve;.. assert
18126 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 ( nReserve>=0 &&
18127 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 nReserve<1000 )
18128 3b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e ;.. pPager->n
18129 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e Reserve = (i16)n
1812a 52 65 73 65 72 76 65 3b 0d 0a 20 20 20 20 70 61 Reserve;.. pa
1812b 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 gerReportSize(pP
1812c 61 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 ager);.. }.. r
1812d 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1812e 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 /*..** Return a
1812f 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 pointer to the "
18130 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 temporary page"
18131 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 buffer held inte
18132 72 6e 61 6c 6c 79 0d 0a 2a 2a 20 62 79 20 74 68 rnally..** by th
18133 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 e pager. This i
18134 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 s a buffer that
18135 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f is big enough to
18136 20 68 6f 6c 64 20 74 68 65 0d 0a 2a 2a 20 65 6e hold the..** en
18137 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 tire content of
18138 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e a database page.
18139 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 This buffer is
1813a 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 used internally
1813b 0d 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c ..** during roll
1813c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 back and will be
1813d 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 overwritten whe
1813e 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b never a rollback
1813f 0d 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 ..** occurs. Bu
18140 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 t other modules
18141 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 are free to use
18142 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 it too, as long
18143 61 73 0d 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 as..** no rollba
18144 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e cks are happenin
18145 67 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 g...*/..SQLITE_P
18146 52 49 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c RIVATE void *sql
18147 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 ite3PagerTempSpa
18148 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 ce(Pager *pPager
18149 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 ){.. return pPa
1814a 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0d ger->pTmpSpace;.
1814b 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 74 74 .}..../*..** Att
1814c 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 empt to set the
1814d 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 maximum database
1814e 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d page count if m
1814f 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 xPage is positiv
18150 65 2e 20 0d 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 e. ..** Make no
18151 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 changes if mxPag
18152 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 e is zero or neg
18153 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 ative. And neve
18154 72 20 72 65 64 75 63 65 20 74 68 65 0d 0a 2a 2a r reduce the..**
18155 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f maximum page co
18156 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 unt below the cu
18157 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 rrent size of th
18158 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2a 0d e database...**.
18159 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f .** Regardless o
1815a 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e f mxPage, return
1815b 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 the current max
1815c 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e imum page count.
1815d 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1815e 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1815f 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e PagerMaxPageCoun
18160 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c t(Pager *pPager,
18161 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0d 0a 20 int mxPage){..
18162 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b if( mxPage>0 ){
18163 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 .. pPager->mx
18164 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0d 0a Pgno = mxPage;..
18165 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
18166 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 Pager->eState!=P
18167 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 AGER_OPEN );
18168 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 /* Called only
18169 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 by OP_MaxPgcnt
1816a 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 */.. assert( pP
1816b 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 ager->mxPgno>=pP
1816c 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 ager->dbSize );
1816d 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 /* OP_MaxPgcnt
1816e 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f enforces this */
1816f 0d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 .. return pPage
18170 72 2d 3e 6d 78 50 67 6e 6f 3b 0d 0a 7d 0d 0a 0d r->mxPgno;..}...
18171 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c ./*..** The foll
18172 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 owing set of rou
18173 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 tines are used t
18174 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 o disable the si
18175 6d 75 6c 61 74 65 64 0d 0a 2a 2a 20 49 2f 4f 20 mulated..** I/O
18176 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e error mechanism.
18177 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 These routines
18178 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f are used to avo
18179 69 64 20 73 69 6d 75 6c 61 74 65 64 0d 0a 2a 2a id simulated..**
1817a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 errors in place
1817b 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f s where we do no
1817c 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 t care about err
1817d 6f 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 55 6e 6c ors...**..** Unl
1817e 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 ess -DSQLITE_TES
1817f 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 T=1 is used, the
18180 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 se routines are
18181 61 6c 6c 20 6e 6f 2d 6f 70 73 0d 0a 2a 2a 20 61 all no-ops..** a
18182 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 nd generate no c
18183 6f 64 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 ode...*/..#ifdef
18184 20 53 51 4c 49 54 45 5f 54 45 53 54 0d 0a 53 51 SQLITE_TEST..SQ
18185 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 LITE_API extern
18186 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 int sqlite3_io_e
18187 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0d 0a 53 rror_pending;..S
18188 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e QLITE_API extern
18189 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f int sqlite3_io_
1818a 65 72 72 6f 72 5f 68 69 74 3b 0d 0a 73 74 61 74 error_hit;..stat
1818b 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 ic int saved_cnt
1818c 3b 0d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f ;..void disable_
1818d 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 simulated_io_err
1818e 6f 72 73 28 76 6f 69 64 29 7b 0d 0a 20 20 73 61 ors(void){.. sa
1818f 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 ved_cnt = sqlite
18190 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 3_io_error_pendi
18191 6e 67 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 ng;.. sqlite3_i
18192 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 o_error_pending
18193 3d 20 2d 31 3b 0d 0a 7d 0d 0a 76 6f 69 64 20 65 = -1;..}..void e
18194 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f nable_simulated_
18195 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b io_errors(void){
18196 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 .. sqlite3_io_e
18197 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 rror_pending = s
18198 61 76 65 64 5f 63 6e 74 3b 0d 0a 7d 0d 0a 23 65 aved_cnt;..}..#e
18199 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 64 69 lse..# define di
1819a 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f sable_simulated_
1819b 69 6f 5f 65 72 72 6f 72 73 28 29 0d 0a 23 20 64 io_errors()..# d
1819c 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d efine enable_sim
1819d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 ulated_io_errors
1819e 28 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a ()..#endif..../*
1819f 0d 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 ..** Read the fi
181a0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d rst N bytes from
181a1 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f the beginning o
181a2 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 f the file into
181a3 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 74 68 61 74 20 memory..** that
181a4 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e pDest points to.
181a5 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ..**..** If the
181a6 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 pager was opene
181a7 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 d on a transient
181a8 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 file (zFilename
181a9 3d 3d 22 22 29 2c 20 6f 72 0d 0a 2a 2a 20 6f 70 ==""), or..** op
181aa 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c ened on a file l
181ab 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 ess than N bytes
181ac 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 in size, the ou
181ad 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0d 0a tput buffer is..
181ae 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 ** zeroed and SQ
181af 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 LITE_OK returned
181b0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 . The rationale
181b1 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 for this is that
181b2 20 74 68 69 73 20 0d 0a 2a 2a 20 66 75 6e 63 74 this ..** funct
181b3 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 ion is used to r
181b4 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 ead database hea
181b5 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 ders, and a new
181b6 74 72 61 6e 73 69 65 6e 74 20 6f 72 0d 0a 2a 2a transient or..**
181b7 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 zero sized data
181b8 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 base has a heade
181b9 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 r than consists
181ba 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f entirely of zero
181bb 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 es...**..** If a
181bc 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 ny IO error apar
181bd 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f t from SQLITE_IO
181be 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 ERR_SHORT_READ i
181bf 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0d 0a s encountered,..
181c0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 ** the error cod
181c1 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f e is returned to
181c2 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 the caller and
181c3 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 the contents of
181c4 74 68 65 0d 0a 2a 2a 20 6f 75 74 70 75 74 20 62 the..** output b
181c5 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e uffer undefined.
181c6 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
181c7 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
181c8 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 PagerReadFilehea
181c9 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 der(Pager *pPage
181ca 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e r, int N, unsign
181cb 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b ed char *pDest){
181cc 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c .. int rc = SQL
181cd 49 54 45 5f 4f 4b 3b 0d 0a 20 20 6d 65 6d 73 65 ITE_OK;.. memse
181ce 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0d t(pDest, 0, N);.
181cf 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 . assert( isOpe
181d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c n(pPager->fd) ||
181d1 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c pPager->tempFil
181d2 65 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 69 e );.... /* Thi
181d3 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c s routine is onl
181d4 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 y called by btre
181d5 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 e immediately af
181d6 74 65 72 20 63 72 65 61 74 69 6e 67 0d 0a 20 20 ter creating..
181d7 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a ** the Pager obj
181d8 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 ect. There has
181d9 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f not been an oppo
181da 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 rtunity to trans
181db 69 74 69 6f 6e 0d 0a 20 20 2a 2a 20 74 6f 20 57 ition.. ** to W
181dc 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0d 0a 20 20 AL mode yet...
181dd 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 21 70 */.. assert( !p
181de 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 agerUseWal(pPage
181df 72 29 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 69 r) );.... if( i
181e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 sOpen(pPager->fd
181e1 29 20 29 7b 0d 0a 20 20 20 20 49 4f 54 52 41 43 ) ){.. IOTRAC
181e2 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 E(("DBHDR %p 0 %
181e3 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 d\n", pPager, N)
181e4 29 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 ).. rc = sqli
181e5 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 te3OsRead(pPager
181e6 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 ->fd, pDest, N,
181e7 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 0);.. if( rc=
181e8 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 =SQLITE_IOERR_SH
181e9 4f 52 54 5f 52 45 41 44 20 29 7b 0d 0a 20 20 20 ORT_READ ){..
181ea 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
181eb 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a K;.. }.. }..
181ec 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
181ed 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 .../*..** This f
181ee 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 unction may only
181ef 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 be called when
181f0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 a read-transacti
181f1 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0d 0a 2a on is open on..*
181f2 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 * the pager. It
181f3 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 returns the tota
181f4 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 l number of page
181f5 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 s in the databas
181f6 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 48 6f 77 65 76 e...**..** Howev
181f7 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 er, if the file
181f8 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 is between 1 and
181f9 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 <page-size> byt
181fa 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e es in size, then
181fb 20 0d 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f ..** this is co
181fc 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 nsidered a 1 pag
181fd 65 20 66 69 6c 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c e file...*/..SQL
181fe 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
181ff 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 sqlite3PagerPag
18200 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 ecount(Pager *pP
18201 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 ager, int *pnPag
18202 65 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 e){.. assert( p
18203 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 Pager->eState>=P
18204 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0d 0a AGER_READER );..
18205 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
18206 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f ->eState!=PAGER_
18207 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 WRITER_FINISHED
18208 29 3b 0d 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 );.. *pnPage =
18209 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 (int)pPager->dbS
1820a 69 7a 65 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d ize;..}....../*.
1820b 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 .** Try to obtai
1820c 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 n a lock of type
1820d 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 locktype on the
1820e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 database file.
1820f 49 66 0d 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 If..** a similar
18210 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b or greater lock
18211 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 is already held
18212 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 , this function
18213 69 73 20 61 20 6e 6f 2d 6f 70 0d 0a 2a 2a 20 28 is a no-op..** (
18214 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 returning SQLITE
18215 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 _OK immediately)
18216 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 ...**..** Otherw
18217 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 ise, attempt to
18218 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 obtain the lock
18219 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c using sqlite3OsL
1821a 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0d 0a ock(). Invoke ..
1821b 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c ** the busy call
1821c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b back if the lock
1821d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f is currently no
1821e 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 t available. Rep
1821f 65 61 74 20 0d 0a 2a 2a 20 75 6e 74 69 6c 20 74 eat ..** until t
18220 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b he busy callback
18221 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f returns false o
18222 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 r until the atte
18223 6d 70 74 20 74 6f 20 0d 0a 2a 2a 20 6f 62 74 61 mpt to ..** obta
18224 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 in the lock succ
18225 65 65 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 eeds...**..** Re
18226 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f turn SQLITE_OK o
18227 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e n success and an
18228 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 error code if w
18229 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0d e cannot obtain.
1822a 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 .** the lock. If
1822b 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 the lock is obt
1822c 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c ained successful
1822d 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 ly, set the Page
1822e 72 2e 73 74 61 74 65 20 0d 0a 2a 2a 20 76 61 72 r.state ..** var
1822f 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 iable to locktyp
18230 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 e before returni
18231 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ng...*/..static
18232 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f int pager_wait_o
18233 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 n_lock(Pager *pP
18234 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 ager, int lockty
18235 70 65 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 pe){.. int rc;
18236 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18237 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18238 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
18239 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 .. /* Check tha
1823a 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 t this is either
1823b 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 a no-op (becaus
1823c 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 e the requested
1823d 6c 6f 63 6b 20 69 73 20 0d 0a 20 20 2a 2a 20 61 lock is .. ** a
1823e 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 lready held, or
1823f 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 one of the trans
18240 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 istions that the
18241 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0d 0a 20 busy-handler..
18242 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b ** may be invok
18243 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 ed during, accor
18244 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d ding to the comm
18245 65 6e 74 20 61 62 6f 76 65 0d 0a 20 20 2a 2a 20 ent above.. **
18246 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 sqlite3PagerSetB
18247 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0d 0a 20 usyhandler()...
18248 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 28 */.. assert( (
18249 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c pPager->eLock>=l
1824a 6f 63 6b 74 79 70 65 29 0d 0a 20 20 20 20 20 20 ocktype)..
1824b 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f || (pPager->eLo
1824c 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c ck==NO_LOCK && l
1824d 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f ocktype==SHARED_
1824e 4c 4f 43 4b 29 0d 0a 20 20 20 20 20 20 20 7c 7c LOCK).. ||
1824f 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d (pPager->eLock=
18250 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 =RESERVED_LOCK &
18251 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c & locktype==EXCL
18252 55 53 49 56 45 5f 4c 4f 43 4b 29 0d 0a 20 20 29 USIVE_LOCK).. )
18253 3b 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20 20 ;.... do {..
18254 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 rc = pagerLockD
18255 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 b(pPager, lockty
18256 70 65 29 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 pe);.. }while(
18257 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc==SQLITE_BUSY
18258 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 && pPager->xBusy
18259 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e Handler(pPager->
1825a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 pBusyHandlerArg)
1825b 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 );.. return rc
1825c 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 ;..}..../*..** F
1825d 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 unction assertTr
1825e 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 uncateConstraint
1825f 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 (pPager) checks
18260 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 that one of the
18261 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 ..** following i
18262 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 s true for all d
18263 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 irty pages curre
18264 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 ntly in the page
18265 2d 63 61 63 68 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 -cache:..**..**
18266 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 a) The page nu
18267 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 mber is less tha
18268 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 n or equal to th
18269 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0d 0a e size of the ..
1826a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 ** current
1826b 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 database image,
1826c 69 6e 20 70 61 67 65 73 2c 20 4f 52 0d 0a 2a 2a in pages, OR..**
1826d 0d 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 ..** b) if the
1826e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 page content we
1826f 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 re written at th
18270 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c is time, it woul
18271 64 20 6e 6f 74 0d 0a 2a 2a 20 20 20 20 20 20 62 d not..** b
18272 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 e necessary to w
18273 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 rite the current
18274 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 content out to
18275 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0d the sub-journal.
18276 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 .** (as det
18277 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 ermined by funct
18278 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 ion subjRequires
18279 50 61 67 65 28 29 29 2e 0d 0a 2a 2a 0d 0a 2a 2a Page())...**..**
1827a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f If the conditio
1827b 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 n asserted by th
1827c 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 is function were
1827d 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 not true, and t
1827e 68 65 0d 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 he..** dirty pag
1827f 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 e were to be dis
18280 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 carded from the
18281 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 cache via the pa
18282 67 65 72 53 74 72 65 73 73 28 29 0d 0a 2a 2a 20 gerStress()..**
18283 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 routine, pagerSt
18284 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 ress() would not
18285 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 write the curre
18286 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 nt page content
18287 74 6f 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 to..** the datab
18288 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 ase file. If a s
18289 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 avepoint transac
1828a 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 tion were rolled
1828b 20 62 61 63 6b 20 61 66 74 65 72 0d 0a 2a 2a 20 back after..**
1828c 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 this happened, t
1828d 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 he correct behav
1828e 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f iour would be to
1828f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 restore the cur
18290 72 65 6e 74 0d 0a 2a 2a 20 63 6f 6e 74 65 6e 74 rent..** content
18291 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f of the page. Ho
18292 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 wever, since thi
18293 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 s content is not
18294 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 present in eith
18295 65 72 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 er..** the datab
18296 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 ase file or the
18297 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 portion of the r
18298 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 ollback journal
18299 61 6e 64 20 0d 0a 2a 2a 20 73 75 62 2d 6a 6f 75 and ..** sub-jou
1829a 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b rnal rolled back
1829b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 the content cou
1829c 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 ld not be restor
1829d 65 64 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 64 ed and the..** d
1829e 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f atabase image wo
1829f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 uld become corru
182a0 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 pt. It is theref
182a1 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 ore fortunate th
182a2 61 74 20 0d 0a 2a 2a 20 74 68 69 73 20 63 69 72 at ..** this cir
182a3 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 cumstance cannot
182a4 20 61 72 69 73 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 arise...*/..#if
182a5 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
182a6 44 45 42 55 47 29 0d 0a 73 74 61 74 69 63 20 76 DEBUG)..static v
182a7 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 oid assertTrunca
182a8 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 teConstraintCb(P
182a9 67 48 64 72 20 2a 70 50 67 29 7b 0d 0a 20 20 61 gHdr *pPg){.. a
182aa 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 ssert( pPg->flag
182ab 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b s&PGHDR_DIRTY );
182ac 0d 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 .. assert( !sub
182ad 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 jRequiresPage(pP
182ae 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c g) || pPg->pgno<
182af 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 =pPg->pPager->db
182b0 53 69 7a 65 20 29 3b 0d 0a 7d 0d 0a 73 74 61 74 Size );..}..stat
182b1 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 ic void assertTr
182b2 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 uncateConstraint
182b3 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b (Pager *pPager){
182b4 0d 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 .. sqlite3Pcach
182b5 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 eIterateDirty(pP
182b6 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 ager->pPCache, a
182b7 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e ssertTruncateCon
182b8 73 74 72 61 69 6e 74 43 62 29 3b 0d 0a 7d 0d 0a straintCb);..}..
182b9 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 #else..# define
182ba 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f assertTruncateCo
182bb 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 nstraint(pPager)
182bc 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
182bd 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 ** Truncate the
182be 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 in-memory databa
182bf 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f se file image to
182c0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 nPage pages. Th
182c1 69 73 20 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e is ..** function
182c2 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c does not actual
182c3 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 ly modify the da
182c4 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 tabase file on d
182c5 69 73 6b 2e 20 49 74 20 0d 0a 2a 2a 20 6a 75 73 isk. It ..** jus
182c6 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 t sets the inter
182c7 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 nal state of the
182c8 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f pager object so
182c9 20 74 68 61 74 20 74 68 65 20 0d 0a 2a 2a 20 74 that the ..** t
182ca 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 runcation will b
182cb 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 e done when the
182cc 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 current transact
182cd 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 ion is committed
182ce 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
182cf 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
182d0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 e3PagerTruncateI
182d1 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 mage(Pager *pPag
182d2 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b er, Pgno nPage){
182d3 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 .. assert( pPag
182d4 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 er->dbSize>=nPag
182d5 65 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 e );.. assert(
182d6 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d pPager->eState>=
182d7 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 PAGER_WRITER_CAC
182d8 48 45 4d 4f 44 20 29 3b 0d 0a 20 20 70 50 61 67 HEMOD );.. pPag
182d9 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 er->dbSize = nPa
182da 67 65 3b 0d 0a 20 20 61 73 73 65 72 74 54 72 75 ge;.. assertTru
182db 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 ncateConstraint(
182dc 70 50 61 67 65 72 29 3b 0d 0a 7d 0d 0a 0d 0a 0d pPager);..}.....
182dd 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e ./*..** This fun
182de 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 ction is called
182df 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e before attemptin
182e0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 g a hot-journal
182e1 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0d 0a 2a 2a rollback. It..**
182e2 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e syncs the journ
182e3 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c al file to disk,
182e4 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 then sets pPage
182e5 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f r->journalHdr to
182e6 20 74 68 65 0d 0a 2a 2a 20 73 69 7a 65 20 6f 66 the..** size of
182e7 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
182e8 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 e so that the pa
182e9 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 ger_playback() r
182ea 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0d 0a 2a 2a outine knows..**
182eb 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 that the entire
182ec 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 journal file ha
182ed 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0d 0a s been synced...
182ee 2a 2a 0d 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 **..** Syncing a
182ef 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 hot-journal to
182f0 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 disk before atte
182f1 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 mpting to roll i
182f2 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0d t back ensures .
182f3 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f .** that if a po
182f4 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 wer-failure occu
182f5 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f rs during the ro
182f6 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 llback, the proc
182f7 65 73 73 20 74 68 61 74 0d 0a 2a 2a 20 61 74 74 ess that..** att
182f8 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 empts rollback f
182f9 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 ollowing system
182fa 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 recovery sees th
182fb 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0d 0a e same journal..
182fc 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 ** content as th
182fd 69 73 20 70 72 6f 63 65 73 73 2e 0d 0a 2a 2a 0d is process...**.
182fe 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e .** If everythin
182ff 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 g goes as planne
18300 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 d, SQLITE_OK is
18301 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 returned. Otherw
18302 69 73 65 2c 20 0d 0a 2a 2a 20 61 6e 20 53 51 4c ise, ..** an SQL
18303 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0d ite error code..
18304 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
18305 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 pagerSyncHotJour
18306 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 nal(Pager *pPage
18307 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 r){.. int rc =
18308 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 SQLITE_OK;.. if
18309 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e ( !pPager->noSyn
1830a 63 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 c ){.. rc = s
1830b 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 qlite3OsSync(pPa
1830c 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 ger->jfd, SQLITE
1830d 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0d 0a _SYNC_NORMAL);..
1830e 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 }.. if( rc==S
1830f 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
18310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 rc = sqlite3OsF
18311 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e ileSize(pPager->
18312 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f jfd, &pPager->jo
18313 75 72 6e 61 6c 48 64 72 29 3b 0d 0a 20 20 7d 0d urnalHdr);.. }.
18314 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
18315 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 68 75 74 64 ..../*..** Shutd
18316 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 own the page cac
18317 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 he. Free all me
18318 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 mory and close a
18319 6c 6c 20 66 69 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a ll files...**..*
1831a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 * If a transacti
1831b 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 on was in progre
1831c 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 ss when this rou
1831d 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 tine is called,
1831e 74 68 61 74 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 that..** transac
1831f 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 tion is rolled b
18320 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 ack. All outsta
18321 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 nding pages are
18322 69 6e 76 61 6c 69 64 61 74 65 64 0d 0a 2a 2a 20 invalidated..**
18323 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 and their memory
18324 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 is freed. Any
18325 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 attempt to use a
18326 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 page associated
18327 0d 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 ..** with this p
18328 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 age cache after
18329 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 this function re
1832a 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c turns will likel
1832b 79 0d 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 y..** result in
1832c 61 20 63 6f 72 65 64 75 6d 70 2e 0d 0a 2a 2a 0d a coredump...**.
1832d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1832e 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 n always succeed
1832f 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 s. If a transact
18330 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e ion is active an
18331 20 61 74 74 65 6d 70 74 0d 0a 2a 2a 20 69 73 20 attempt..** is
18332 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 made to roll it
18333 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f back. If an erro
18334 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 r occurs during
18335 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0d 0a 2a the rollback ..*
18336 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 * a hot journal
18337 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 may be left in t
18338 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 he filesystem bu
18339 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 t no error is re
1833a 74 75 72 6e 65 64 0d 0a 2a 2a 20 74 6f 20 74 68 turned..** to th
1833b 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a 2f 0d 0a 53 e caller...*/..S
1833c 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1833d 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c t sqlite3PagerCl
1833e 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 ose(Pager *pPage
1833f 72 29 7b 0d 0a 20 20 75 38 20 2a 70 54 6d 70 20 r){.. u8 *pTmp
18340 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e = (u8 *)pPager->
18341 70 54 6d 70 53 70 61 63 65 3b 0d 0a 0d 0a 20 20 pTmpSpace;....
18342 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 assert( assert_p
18343 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 ager_state(pPage
18344 72 29 20 29 3b 0d 0a 20 20 64 69 73 61 62 6c 65 r) );.. disable
18345 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 _simulated_io_er
18346 72 6f 72 73 28 29 3b 0d 0a 20 20 73 71 6c 69 74 rors();.. sqlit
18347 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c e3BeginBenignMal
18348 6c 6f 63 28 29 3b 0d 0a 20 20 2f 2a 20 70 50 61 loc();.. /* pPa
18349 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 ger->errCode = 0
1834a 3b 20 2a 2f 0d 0a 20 20 70 50 61 67 65 72 2d 3e ; */.. pPager->
1834b 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 exclusiveMode =
1834c 30 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 0;..#ifndef SQLI
1834d 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 73 TE_OMIT_WAL.. s
1834e 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 qlite3WalClose(p
1834f 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 Pager->pWal, pPa
18350 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 ger->ckptSyncFla
18351 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 gs, pPager->page
18352 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0d 0a 20 20 Size, pTmp);..
18353 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 pPager->pWal = 0
18354 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 70 61 67 ;..#endif.. pag
18355 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 er_reset(pPager)
18356 3b 0d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 ;.. if( MEMDB )
18357 7b 0d 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c {.. pager_unl
18358 6f 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 ock(pPager);..
18359 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 }else{.. /* I
1835a 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 f it is open, sy
1835b 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 nc the journal f
1835c 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 ile before calli
1835d 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c ng UnlockAndRoll
1835e 62 61 63 6b 2e 0d 0a 20 20 20 20 2a 2a 20 49 66 back... ** If
1835f 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e this is not don
18360 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e e, then an unsyn
18361 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 ced portion of t
18362 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 he open journal
18363 0d 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 .. ** file ma
18364 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b y be played back
18365 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 into the databa
18366 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 se. If a power f
18367 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0d 0a ailure occurs ..
18368 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 ** while thi
18369 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 s is happening,
1836a 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 the database cou
1836b 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 ld become corrup
1836c 74 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 t... **..
1836d 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f ** If an error o
1836e 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 ccurs while tryi
1836f 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a ng to sync the j
18370 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 ournal, shift th
18371 65 20 70 61 67 65 72 0d 0a 20 20 20 20 2a 2a 20 e pager.. **
18372 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 into the ERROR s
18373 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 tate. This cause
18374 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 s UnlockAndRollb
18375 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 ack to unlock th
18376 65 0d 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 e.. ** databa
18377 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 se and close the
18378 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 journal file wi
18379 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 thout attempting
1837a 20 74 6f 20 72 6f 6c 6c 20 69 74 0d 0a 20 20 20 to roll it..
1837b 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 ** back or fina
1837c 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 lize it. The nex
1837d 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 t database user
1837e 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 will have to do
1837f 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0d 0a 20 20 20 hot-journal..
18380 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 ** rollback bef
18381 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 ore accessing th
18382 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e e database file.
18383 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 .. */.. if
18384 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d ( isOpen(pPager-
18385 3e 6a 66 64 29 20 29 7b 0d 0a 20 20 20 20 20 20 >jfd) ){..
18386 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 pager_error(pPag
18387 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 er, pagerSyncHot
18388 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 Journal(pPager))
18389 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 61 ;.. }.. pa
1838a 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c gerUnlockAndRoll
1838b 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 back(pPager);..
1838c 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 }.. sqlite3End
1838d 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0d BenignMalloc();.
1838e 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 . enable_simula
1838f 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b ted_io_errors();
18390 0d 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 .. PAGERTRACE((
18391 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 "CLOSE %d\n", PA
18392 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b GERID(pPager)));
18393 0d 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c .. IOTRACE(("CL
18394 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 OSE %p\n", pPage
18395 72 29 29 0d 0a 20 20 73 71 6c 69 74 65 33 4f 73 r)).. sqlite3Os
18396 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 Close(pPager->jf
18397 64 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 4f 73 d);.. sqlite3Os
18398 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 Close(pPager->fd
18399 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 );.. sqlite3Pag
1839a 65 46 72 65 65 28 70 54 6d 70 29 3b 0d 0a 20 20 eFree(pTmp);..
1839b 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f sqlite3PcacheClo
1839c 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 se(pPager->pPCac
1839d 68 65 29 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 he);....#ifdef S
1839e 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0d QLITE_HAS_CODEC.
1839f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 . if( pPager->x
183a0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 CodecFree ) pPag
183a1 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 er->xCodecFree(p
183a2 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0d Pager->pCodec);.
183a3 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 61 73 73 .#endif.... ass
183a4 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 ert( !pPager->aS
183a5 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 avepoint && !pPa
183a6 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 ger->pInJournal
183a7 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 21 69 );.. assert( !i
183a8 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 sOpen(pPager->jf
183a9 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 d) && !isOpen(pP
183aa 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0d 0a ager->sjfd) );..
183ab 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
183ac 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 72 65 74 (pPager);.. ret
183ad 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
183ae 7d 0d 0a 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 }....#if !define
183af 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 d(NDEBUG) || def
183b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 ined(SQLITE_TEST
183b1 29 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e )../*..** Return
183b2 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 the page number
183b3 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0d 0a for page pPg...
183b4 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
183b5 54 45 20 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 TE Pgno sqlite3P
183b6 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 agerPagenumber(D
183b7 62 50 61 67 65 20 2a 70 50 67 29 7b 0d 0a 20 20 bPage *pPg){..
183b8 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f return pPg->pgno
183b9 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a ;..}..#endif....
183ba 2f 2a 0d 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 /*..** Increment
183bb 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 the reference c
183bc 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 ount for page pP
183bd 67 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 g...*/..SQLITE_P
183be 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
183bf 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 te3PagerRef(DbPa
183c0 67 65 20 2a 70 50 67 29 7b 0d 0a 20 20 73 71 6c ge *pPg){.. sql
183c1 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 ite3PcacheRef(pP
183c2 67 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a g);..}..../*..**
183c3 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 Sync the journa
183c4 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 l. In other word
183c5 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c s, make sure all
183c6 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 the pages that
183c7 68 61 76 65 0d 0a 2a 2a 20 62 65 65 6e 20 77 72 have..** been wr
183c8 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 itten to the jou
183c9 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c rnal have actual
183ca 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 ly reached the s
183cb 75 72 66 61 63 65 20 6f 66 20 74 68 65 0d 0a 2a urface of the..*
183cc 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 * disk and can b
183cd 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 e restored in th
183ce 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 e event of a hot
183cf 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 -journal rollbac
183d0 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 k...**..** If th
183d1 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 e Pager.noSync f
183d2 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e lag is set, then
183d3 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
183d4 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 20 4f s a no-op...** O
183d5 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 therwise, the ac
183d6 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 tions required d
183d7 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 epend on the jou
183d8 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 rnal-mode and th
183d9 65 20 0d 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 e ..** device ch
183da 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 aracteristics of
183db 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 the the file-sy
183dc 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 stem, as follows
183dd 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 49 66 :..**..** * If
183de 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
183df 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 e is an in-memor
183e0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 y journal file,
183e1 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0d 0a no action need..
183e2 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e ** be taken.
183e3 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 4f 74 68 ..**..** * Oth
183e4 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 erwise, if the d
183e5 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 evice does not s
183e6 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f upport the SAFE_
183e7 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c APPEND property,
183e8 0d 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 ..** then th
183e9 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 e nRec field of
183ea 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c the most recentl
183eb 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 y written journa
183ec 6c 20 68 65 61 64 65 72 0d 0a 2a 2a 20 20 20 20 l header..**
183ed 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 is updated to c
183ee 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 ontain the numbe
183ef 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 r of journal rec
183f0 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0d 0a ords that have..
183f1 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 ** been writ
183f2 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 ten following it
183f3 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 . If the pager i
183f4 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 s operating in f
183f5 75 6c 6c 2d 73 79 6e 63 0d 0a 2a 2a 20 20 20 20 ull-sync..**
183f6 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 mode, then the
183f7 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 journal file is
183f8 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 synced before th
183f9 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 is field is upda
183fa 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a ted...**..** *
183fb 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 If the device d
183fc 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 oes not support
183fd 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 the SEQUENTIAL p
183fe 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0d 0a roperty, then ..
183ff 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 ** journal f
18400 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0d 0a ile is synced...
18401 2a 2a 0d 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 **..** Or, in ps
18402 65 75 64 6f 2d 63 6f 64 65 3a 0d 0a 2a 2a 0d 0a eudo-code:..**..
18403 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e ** if( NOT <in
18404 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e -memory journal>
18405 20 29 7b 0d 0a 2a 2a 20 20 20 20 20 69 66 28 20 ){..** if(
18406 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 NOT SAFE_APPEND
18407 29 7b 0d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 ){..** if(
18408 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 <full-sync mode
18409 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e > ) xSync(<journ
1840a 61 6c 20 66 69 6c 65 3e 29 3b 0d 0a 2a 2a 20 20 al file>);..**
1840b 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 <update nRe
1840c 63 20 66 69 65 6c 64 3e 0d 0a 2a 2a 20 20 20 20 c field>..**
1840d 20 7d 20 0d 0a 2a 2a 20 20 20 20 20 69 66 28 20 } ..** if(
1840e 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 NOT SEQUENTIAL )
1840f 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 xSync(<journal
18410 66 69 6c 65 3e 29 3b 0d 0a 2a 2a 20 20 20 7d 0d file>);..** }.
18411 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63 63 65 .**..** If succe
18412 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 ssful, this rout
18413 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 ine clears the P
18414 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 GHDR_NEED_SYNC f
18415 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0d 0a 2a lag of every ..*
18416 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 * page currently
18417 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 held in memory
18418 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 before returning
18419 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 SQLITE_OK. If a
1841a 6e 20 49 4f 0d 0a 2a 2a 20 65 72 72 6f 72 20 69 n IO..** error i
1841b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 s encountered, t
1841c 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 hen the IO error
1841d 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 code is returne
1841e 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e d to the caller.
1841f 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
18420 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 syncJournal(Pag
18421 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 er *pPager, int
18422 6e 65 77 48 64 72 29 7b 0d 0a 20 20 69 6e 74 20 newHdr){.. int
18423 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
18424 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
18425 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d eturn code */...
18426 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 . assert( pPage
18427 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
18428 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 _WRITER_CACHEMOD
18429 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 .. || pPag
1842a 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 er->eState==PAGE
1842b 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0d 0a R_WRITER_DBMOD..
1842c 20 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 );.. assert(
1842d 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 assert_pager_sta
1842e 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 te(pPager) );..
1842f 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 assert( !pagerU
18430 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b seWal(pPager) );
18431 0d 0a 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 .... rc = sqlit
18432 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 e3PagerExclusive
18433 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 Lock(pPager);..
18434 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
18435 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d OK ) return rc;.
18436 0a 0d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 ... if( !pPager
18437 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0d 0a 20 20 20 ->noSync ){..
18438 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 assert( !pPager
18439 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0d 0a 20 ->tempFile );..
1843a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 if( isOpen(pP
1843b 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 ager->jfd) && pP
1843c 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 ager->journalMod
1843d 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c e!=PAGER_JOURNAL
1843e 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0d 0a MODE_MEMORY ){..
1843f 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 const int
18440 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 iDc = sqlite3OsD
18441 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 eviceCharacteris
18442 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 tics(pPager->fd)
18443 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ;.. assert(
18444 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e isOpen(pPager->
18445 6a 66 64 29 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 jfd) );....
18446 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c if( 0==(iDc&SQL
18447 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 ITE_IOCAP_SAFE_A
18448 50 50 45 4e 44 29 20 29 7b 0d 0a 20 20 20 20 20 PPEND) ){..
18449 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b /* This block
1844a 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f deals with an o
1844b 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 bscure problem.
1844c 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e If the last conn
1844d 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 ection..
1844e 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f ** that wrote to
1844f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 this database w
18450 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 as operating in
18451 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e persistent-journ
18452 61 6c 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d al.. ** m
18453 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f ode, then the jo
18454 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 urnal file may a
18455 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 t this point act
18456 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0d ually be larger.
18457 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e . ** than
18458 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 Pager.journalOf
18459 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 f bytes. If the
1845a 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 next thing in th
1845b 65 20 6a 6f 75 72 6e 61 6c 0d 0a 20 20 20 20 20 e journal..
1845c 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 ** file happe
1845d 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e ns to be a journ
1845e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 al-header (writt
1845f 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 en as part of th
18460 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 e.. ** pr
18461 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f evious connectio
18462 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 n's transaction)
18463 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 , and a crash or
18464 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0d power-failure .
18465 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 . ** occu
18466 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 rs after nRec is
18467 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 updated but bef
18468 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 ore this connect
18469 69 6f 6e 20 77 72 69 74 65 73 20 0d 0a 20 20 20 ion writes ..
1846a 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 ** anything
1846b 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 else to the jou
1846c 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f rnal file (or co
1846d 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b mmits/rolls back
1846e 20 69 74 73 20 0d 0a 20 20 20 20 20 20 20 20 2a its .. *
1846f 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 * transaction),
18470 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 then SQLite may
18471 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 become confused
18472 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0d when doing the .
18473 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d . ** hot-
18474 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b journal rollback
18475 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 following recov
18476 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c ery. It may roll
18477 20 62 61 63 6b 20 61 6c 6c 0d 0a 20 20 20 20 20 back all..
18478 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f ** of this co
18479 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 nnections data,
1847a 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 then proceed to
1847b 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 rolling back the
1847c 20 6f 6c 64 2c 0d 0a 20 20 20 20 20 20 20 20 2a old,.. *
1847d 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 * out-of-date da
1847e 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 ta that follows
1847f 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 it. Database cor
18480 72 75 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 ruption...
18481 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a **.. **
18482 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 To work around
18483 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 this, if the jou
18484 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 rnal file does a
18485 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e ppear to contain
18486 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 .. ** a v
18487 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c alid header foll
18488 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 owing Pager.jour
18489 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 nalOff, then wri
1848a 74 65 20 61 20 30 78 30 30 0d 0a 20 20 20 20 20 te a 0x00..
1848b 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 ** byte to th
1848c 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f e start of it to
1848d 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d prevent it from
1848e 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 being recognize
1848f 64 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a d... **..
18490 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 ** Varia
18491 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 ble iNextHdrOffs
18492 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 et is set to the
18493 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 offset at which
18494 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 2a this.. *
18495 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 * problematic he
18496 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c ader will occur,
18497 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 if it exists. a
18498 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0d 0a Magic is used ..
18499 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 ** as a
1849a 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 temporary buffer
1849b 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 to inspect the
1849c 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 first couple of
1849d 62 79 74 65 73 20 6f 66 0d 0a 20 20 20 20 20 20 bytes of..
1849e 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 ** the potenti
1849f 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 al journal heade
184a0 72 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a r... */..
184a1 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 i64 iNex
184a2 74 48 64 72 4f 66 66 73 65 74 3b 0d 0a 20 20 20 tHdrOffset;..
184a3 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 u8 aMagic[8
184a4 5d 3b 0d 0a 20 20 20 20 20 20 20 20 75 38 20 7a ];.. u8 z
184a5 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a Header[sizeof(aJ
184a6 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b ournalMagic)+4];
184a7 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 .... memc
184a8 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 py(zHeader, aJou
184a9 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f rnalMagic, sizeo
184aa 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 f(aJournalMagic)
184ab 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 75 74 33 );.. put3
184ac 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 2bits(&zHeader[s
184ad 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 izeof(aJournalMa
184ae 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e gic)], pPager->n
184af 52 65 63 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 Rec);....
184b0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 iNextHdrOffset
184b1 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 = journalHdrOffs
184b2 65 74 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 et(pPager);..
184b3 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
184b4 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 3OsRead(pPager->
184b5 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 jfd, aMagic, 8,
184b6 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b iNextHdrOffset);
184b7 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 .. if( rc
184b8 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 ==SQLITE_OK && 0
184b9 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c ==memcmp(aMagic,
184ba 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 aJournalMagic,
184bb 38 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 8) ){..
184bc 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 static const u8
184bd 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0d 0a zerobyte = 0;..
184be 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 rc = s
184bf 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 qlite3OsWrite(pP
184c0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f ager->jfd, &zero
184c1 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 byte, 1, iNextHd
184c2 72 4f 66 66 73 65 74 29 3b 0d 0a 20 20 20 20 20 rOffset);..
184c3 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 }.. if
184c4 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
184c5 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f && rc!=SQLITE_IO
184c6 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 ERR_SHORT_READ )
184c7 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 {.. ret
184c8 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 urn rc;..
184c9 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2a }.... /*
184ca 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 Write the nRec
184cb 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a value into the j
184cc 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 ournal file head
184cd 65 72 2e 20 49 66 20 69 6e 0d 0a 20 20 20 20 20 er. If in..
184ce 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 ** full-synch
184cf 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e ronous mode, syn
184d0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 c the journal fi
184d1 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 rst. This ensure
184d2 73 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20 s that..
184d3 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 ** all data has
184d4 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 really hit the d
184d5 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 isk before nRec
184d6 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 is updated to ma
184d7 72 6b 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 rk.. ** i
184d8 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 t as a candidate
184d9 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0d 0a for rollback...
184da 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 **..
184db 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e ** This is n
184dc 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 ot required if t
184dd 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 he persistent me
184de 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 dia supports the
184df 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 .. ** SAF
184e0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 E_APPEND propert
184e1 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 y. Because in th
184e2 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f is case it is no
184e3 74 20 70 6f 73 73 69 62 6c 65 20 0d 0a 20 20 20 t possible ..
184e4 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 ** for garb
184e5 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 age data to be a
184e6 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 ppended to the f
184e7 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 ile, the nRec fi
184e8 65 6c 64 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 eld.. **
184e9 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 is populated wit
184ea 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 h 0xFFFFFFFF whe
184eb 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 n the journal he
184ec 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0d ader is written.
184ed 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 . ** and
184ee 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 never needs to b
184ef 65 20 75 70 64 61 74 65 64 2e 0d 0a 20 20 20 20 e updated...
184f0 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
184f1 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c if( pPager->full
184f2 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 Sync && 0==(iDc&
184f3 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 SQLITE_IOCAP_SEQ
184f4 55 45 4e 54 49 41 4c 29 20 29 7b 0d 0a 20 20 20 UENTIAL) ){..
184f5 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 PAGERTRAC
184f6 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c E(("SYNC journal
184f7 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 of %d\n", PAGER
184f8 49 44 28 70 50 61 67 65 72 29 29 29 3b 0d 0a 20 ID(pPager)));..
184f9 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 IOTRACE
184fa 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 (("JSYNC %p\n",
184fb 70 50 61 67 65 72 29 29 0d 0a 20 20 20 20 20 20 pPager))..
184fc 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
184fd 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a OsSync(pPager->j
184fe 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 fd, pPager->sync
184ff 46 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 Flags);..
18500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
18501 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
18502 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
18503 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 IOTRACE(("
18504 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c JHDR %p %lld\n",
18505 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d pPager, pPager-
18506 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0d 0a >journalHdr));..
18507 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
18508 69 74 65 33 4f 73 57 72 69 74 65 28 0d 0a 20 20 ite3OsWrite(..
18509 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 pPager
1850a 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 ->jfd, zHeader,
1850b 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c sizeof(zHeader),
1850c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
1850d 48 64 72 0d 0a 20 20 20 20 20 20 20 20 29 3b 0d Hdr.. );.
1850e 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 . if( rc!
1850f 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 =SQLITE_OK ) ret
18510 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 7d urn rc;.. }
18511 0d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 .. if( 0==(
18512 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 iDc&SQLITE_IOCAP
18513 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0d _SEQUENTIAL) ){.
18514 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 . PAGERTR
18515 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e ACE(("SYNC journ
18516 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 al of %d\n", PAG
18517 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0d ERID(pPager)));.
18518 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 . IOTRACE
18519 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 (("JSYNC %p\n",
1851a 70 50 61 67 65 72 29 29 0d 0a 20 20 20 20 20 20 pPager))..
1851b 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
1851c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 Sync(pPager->jfd
1851d 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c , pPager->syncFl
1851e 61 67 73 7c 20 0d 0a 20 20 20 20 20 20 20 20 20 ags| ..
1851f 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c (pPager->syncFl
18520 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 ags==SQLITE_SYNC
18521 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e _FULL?SQLITE_SYN
18522 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0d 0a 20 C_DATAONLY:0)..
18523 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 );..
18524 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
18525 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
18526 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 ;.. }....
18527 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 pPager->jour
18528 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d nalHdr = pPager-
18529 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0d 0a 20 20 >journalOff;..
1852a 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 if( newHdr &
1852b 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 & 0==(iDc&SQLITE
1852c 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 _IOCAP_SAFE_APPE
1852d 4e 44 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ND) ){..
1852e 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 pPager->nRec = 0
1852f 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ;.. rc =
18530 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 writeJournalHdr(
18531 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 20 pPager);..
18532 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
18533 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b _OK ) return rc;
18534 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
18535 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 50 61 else{.. pPa
18536 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 ger->journalHdr
18537 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 = pPager->journa
18538 6c 4f 66 66 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 lOff;.. }..
18539 7d 0d 0a 0d 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 }.... /* Unless
1853a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e the pager is in
1853b 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 noSync mode, th
1853c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 e journal file w
1853d 61 73 20 6a 75 73 74 20 0d 0a 20 20 2a 2a 20 73 as just .. ** s
1853e 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 uccessfully sync
1853f 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 ed. Either way,
18540 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f clear the PGHDR_
18541 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f NEED_SYNC flag o
18542 6e 20 0d 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 n .. ** all pag
18543 65 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 73 71 6c es... */.. sql
18544 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 ite3PcacheClearS
18545 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d yncFlags(pPager-
18546 3e 70 50 43 61 63 68 65 29 3b 0d 0a 20 20 70 50 >pPCache);.. pP
18547 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 ager->eState = P
18548 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f AGER_WRITER_DBMO
18549 44 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 61 73 D;.. assert( as
1854a 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 sert_pager_state
1854b 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 72 (pPager) );.. r
1854c 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1854d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
1854e 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 e argument is th
1854f 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e e first in a lin
18550 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 ked list of dirt
18551 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 y pages connecte
18552 64 0d 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 d..** by the PgH
18553 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 dr.pDirty pointe
18554 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e r. This function
18555 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 writes each one
18556 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 69 6e 2d 6d of the..** in-m
18557 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 emory pages in t
18558 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 he list to the d
18559 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 atabase file. Th
1855a 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0d 0a e argument may..
1855b 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 ** be NULL, repr
1855c 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 esenting an empt
1855d 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 y list. In this
1855e 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 case this functi
1855f 6f 6e 20 69 73 0d 0a 2a 2a 20 61 20 6e 6f 2d 6f on is..** a no-o
18560 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 p...**..** The p
18561 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 ager must hold a
18562 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 t least a RESERV
18563 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 ED lock when thi
18564 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 69 s function..** i
18565 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 s called. Before
18566 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e writing anythin
18567 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 g to the databas
18568 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 e file, this loc
18569 6b 0d 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 k..** is upgrade
1856a 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 d to an EXCLUSIV
1856b 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c E lock. If the l
1856c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 ock cannot be ob
1856d 74 61 69 6e 65 64 2c 0d 0a 2a 2a 20 53 51 4c 49 tained,..** SQLI
1856e 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 TE_BUSY is retur
1856f 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 ned and no data
18570 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 is written to th
18571 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e e database file.
18572 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66 20 74 68 65 ..** ..** If the
18573 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 pager is a temp
18574 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 -file pager and
18575 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d the actual file-
18576 73 79 73 74 65 6d 20 66 69 6c 65 0d 0a 2a 2a 20 system file..**
18577 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c is not yet open,
18578 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 it is created a
18579 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 nd opened before
1857a 20 61 6e 79 20 64 61 74 61 20 69 73 20 0d 0a 2a any data is ..*
1857b 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0d 0a * written out...
1857c 2a 2a 0d 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 **..** Once the
1857d 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 lock has been up
1857e 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e graded and, if n
1857f 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 ecessary, the fi
18580 6c 65 20 6f 70 65 6e 65 64 2c 0d 0a 2a 2a 20 74 le opened,..** t
18581 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 he pages are wri
18582 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 tten out to the
18583 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e database file in
18584 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 list order. Wri
18585 74 69 6e 67 0d 0a 2a 2a 20 61 20 70 61 67 65 20 ting..** a page
18586 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 is skipped if it
18587 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 meets either of
18588 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 the following c
18589 72 69 74 65 72 69 61 3a 0d 0a 2a 2a 0d 0a 2a 2a riteria:..**..**
1858a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 * The page nu
1858b 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 mber is greater
1858c 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a than Pager.dbSiz
1858d 65 2c 20 6f 72 0d 0a 2a 2a 20 20 20 2a 20 54 68 e, or..** * Th
1858e 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 e PGHDR_DONT_WRI
1858f 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f TE flag is set o
18590 6e 20 74 68 65 20 70 61 67 65 2e 0d 0a 2a 2a 0d n the page...**.
18591 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f .** If writing o
18592 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 ut a page causes
18593 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
18594 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 le to grow, Page
18595 72 2e 64 62 46 69 6c 65 53 69 7a 65 0d 0a 2a 2a r.dbFileSize..**
18596 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f is updated acco
18597 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 rdingly. If page
18598 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 1 is written ou
18599 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 t, then the valu
1859a 65 20 63 61 63 68 65 64 0d 0a 2a 2a 20 69 6e 20 e cached..** in
1859b 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 Pager.dbFileVers
1859c 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f [] is updated to
1859d 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 match the new v
1859e 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0d 0a alue stored in..
1859f 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ** the database
185a0 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 file...**..** If
185a1 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 everything is s
185a2 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 uccessful, SQLIT
185a3 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 E_OK is returned
185a4 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 . If an IO error
185a5 20 0d 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e ..** occurs, an
185a6 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 IO error code i
185a7 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 s returned. Or,
185a8 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 if the EXCLUSIVE
185a9 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0d 0a 2a 2a lock cannot..**
185aa 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 be obtained, SQ
185ab 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 LITE_BUSY is ret
185ac 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 urned...*/..stat
185ad 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 ic int pager_wri
185ae 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 te_pagelist(Page
185af 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 r *pPager, PgHdr
185b0 20 2a 70 4c 69 73 74 29 7b 0d 0a 20 20 69 6e 74 *pList){.. int
185b1 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
185b2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
185b3 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 /* Return code
185b4 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 54 68 69 73 */.... /* This
185b5 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c function is onl
185b6 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c y called for rol
185b7 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 lback pagers in
185b8 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 WRITER_DBMOD sta
185b9 74 65 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 te. */.. assert
185ba 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 ( !pagerUseWal(p
185bb 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 61 73 73 Pager) );.. ass
185bc 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 ert( pPager->eSt
185bd 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 ate==PAGER_WRITE
185be 52 5f 44 42 4d 4f 44 20 29 3b 0d 0a 20 20 61 73 R_DBMOD );.. as
185bf 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c sert( pPager->eL
185c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c ock==EXCLUSIVE_L
185c1 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 OCK );.... /* I
185c2 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 f the file is a
185c3 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f temp-file has no
185c4 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 t yet been opene
185c5 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 d, open it now.
185c6 49 74 0d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 It.. ** is not
185c7 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 possible for rc
185c8 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e to be other than
185c9 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 SQLITE_OK if th
185ca 69 73 20 62 72 61 6e 63 68 0d 0a 20 20 2a 2a 20 is branch.. **
185cb 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 is taken, as pag
185cc 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 er_wait_on_lock(
185cd 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 ) is a no-op for
185ce 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0d 0a 20 20 temp-files...
185cf 2a 2f 0d 0a 20 20 69 66 28 20 21 69 73 4f 70 65 */.. if( !isOpe
185d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b n(pPager->fd) ){
185d1 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 .. assert( pP
185d2 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 ager->tempFile &
185d3 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 & rc==SQLITE_OK
185d4 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 70 61 67 );.. rc = pag
185d5 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 erOpentemp(pPage
185d6 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 r, pPager->fd, p
185d7 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 Pager->vfsFlags)
185d8 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 42 ;.. }.... /* B
185d9 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 efore the first
185da 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 write, give the
185db 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 VFS a hint of wh
185dc 61 74 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 at the final..
185dd 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c ** file size wil
185de 6c 20 62 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 l be... */.. a
185df 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 ssert( rc!=SQLIT
185e0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 E_OK || isOpen(p
185e1 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0d 0a 20 Pager->fd) );..
185e2 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
185e3 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 OK && pPager->db
185e4 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 Size>pPager->dbH
185e5 69 6e 74 53 69 7a 65 20 29 7b 0d 0a 20 20 20 20 intSize ){..
185e6 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a sqlite3_int64 sz
185e7 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 File = pPager->p
185e8 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 ageSize * (sqlit
185e9 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d e3_int64)pPager-
185ea 3e 64 62 53 69 7a 65 3b 0d 0a 20 20 20 20 73 71 >dbSize;.. sq
185eb 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 lite3OsFileContr
185ec 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 olHint(pPager->f
185ed 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f d, SQLITE_FCNTL_
185ee 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 SIZE_HINT, &szFi
185ef 6c 65 29 3b 0d 0a 20 20 20 20 70 50 61 67 65 72 le);.. pPager
185f0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 ->dbHintSize = p
185f1 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0d 0a Pager->dbSize;..
185f2 20 20 7d 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20 }.... while(
185f3 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
185f4 20 70 4c 69 73 74 20 29 7b 0d 0a 20 20 20 20 50 pList ){.. P
185f5 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 gno pgno = pList
185f6 2d 3e 70 67 6e 6f 3b 0d 0a 0d 0a 20 20 20 20 2f ->pgno;.... /
185f7 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 * If there are d
185f8 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 irty pages in th
185f9 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 e page cache wit
185fa 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 h page numbers g
185fb 72 65 61 74 65 72 0d 0a 20 20 20 20 2a 2a 20 74 reater.. ** t
185fc 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 han Pager.dbSize
185fd 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c , this means sql
185fe 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 ite3PagerTruncat
185ff 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c eImage() was cal
18600 6c 65 64 20 74 6f 0d 0a 20 20 20 20 2a 2a 20 6d led to.. ** m
18601 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 ake the file sma
18602 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 ller (presumably
18603 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 by auto-vacuum
18604 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 code). Do not wr
18605 69 74 65 0d 0a 20 20 20 20 2a 2a 20 61 6e 79 20 ite.. ** any
18606 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 such pages to th
18607 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 2a 2a 0d e file... **.
18608 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f . ** Also, do
18609 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 not write out a
1860a 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 ny page that has
1860b 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f the PGHDR_DONT_
1860c 57 52 49 54 45 20 66 6c 61 67 0d 0a 20 20 20 20 WRITE flag..
1860d 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 ** set (set by s
1860e 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 qlite3PagerDontW
1860f 72 69 74 65 28 29 29 2e 0d 0a 20 20 20 20 2a 2f rite())... */
18610 0d 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d .. if( pgno<=
18611 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 pPager->dbSize &
18612 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 & 0==(pList->fla
18613 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 gs&PGHDR_DONT_WR
18614 49 54 45 29 20 29 7b 0d 0a 20 20 20 20 20 20 69 ITE) ){.. i
18615 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 64 offset = (pgn
18616 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 o-1)*(i64)pPager
18617 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a ->pageSize; /*
18618 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 Offset to write
18619 20 2a 2f 0d 0a 20 20 20 20 20 20 63 68 61 72 20 */.. char
1861a 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 *pData;
1861b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1861c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 /* Dat
1861d 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 a to write */
1861e 20 0d 0a 0d 0a 20 20 20 20 20 20 61 73 73 65 72 .... asser
1861f 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 t( (pList->flags
18620 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 &PGHDR_NEED_SYNC
18621 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 69 )==0 );.. i
18622 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d f( pList->pgno==
18623 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 1 ) pager_write_
18624 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c changecounter(pL
18625 69 73 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f ist);.... /
18626 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 * Encode the dat
18627 61 62 61 73 65 20 2a 2f 0d 0a 20 20 20 20 20 20 abase */..
18628 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 CODEC2(pPager, p
18629 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e List->pData, pgn
1862a 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c o, 6, return SQL
1862b 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 ITE_NOMEM, pData
1862c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 57 );.... /* W
1862d 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 rite out the pag
1862e 65 20 64 61 74 61 2e 20 2a 2f 0d 0a 20 20 20 20 e data. */..
1862f 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
18630 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 Write(pPager->fd
18631 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d , pData, pPager-
18632 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 >pageSize, offse
18633 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 t);.... /*
18634 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 If page 1 was ju
18635 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 st written, upda
18636 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 te Pager.dbFileV
18637 65 72 73 20 74 6f 20 6d 61 74 63 68 0d 0a 20 20 ers to match..
18638 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 ** the value
18639 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 now stored in t
1863a 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1863b 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 . If writing thi
1863c 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 s .. ** pag
1863d 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 e caused the dat
1863e 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 abase file to gr
1863f 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c ow, update dbFil
18640 65 53 69 7a 65 2e 20 0d 0a 20 20 20 20 20 20 2a eSize. .. *
18641 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e /.. if( pgn
18642 6f 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 20 o==1 ){..
18643 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d memcpy(&pPager-
18644 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 >dbFileVers, &pD
18645 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 ata[24], sizeof(
18646 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 pPager->dbFileVe
18647 72 73 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a rs));.. }..
18648 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 if( pgno>p
18649 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a Pager->dbFileSiz
1864a 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 50 e ){.. pP
1864b 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 ager->dbFileSize
1864c 20 3d 20 70 67 6e 6f 3b 0d 0a 20 20 20 20 20 20 = pgno;..
1864d 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 55 70 }.... /* Up
1864e 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 date any backup
1864f 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 objects copying
18650 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 the contents of
18651 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0d 0a this pager. */..
18652 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 sqlite3Bac
18653 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 kupUpdate(pPager
18654 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c ->pBackup, pgno,
18655 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 (u8*)pList->pDa
18656 74 61 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 50 41 ta);.... PA
18657 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 GERTRACE(("STORE
18658 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 %d page %d hash
18659 28 25 30 38 78 29 5c 6e 22 2c 0d 0a 20 20 20 20 (%08x)\n",..
1865a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 P
1865b 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 AGERID(pPager),
1865c 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 pgno, pager_page
1865d 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0d 0a hash(pList)));..
1865e 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 IOTRACE(("
1865f 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 PGOUT %p %d\n",
18660 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0d pPager, pgno));.
18661 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 . PAGER_INC
18662 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f R(sqlite3_pager_
18663 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0d writedb_count);.
18664 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 . PAGER_INC
18665 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 R(pPager->nWrite
18666 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a );.. }else{..
18667 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 PAGERTRACE
18668 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 (("NOSTORE %d pa
18669 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 ge %d\n", PAGERI
1866a 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 D(pPager), pgno)
1866b 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 );.. }.. p
1866c 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 ager_set_pagehas
1866d 68 28 70 4c 69 73 74 29 3b 0d 0a 20 20 20 20 70 h(pList);.. p
1866e 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 List = pList->pD
1866f 69 72 74 79 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 irty;.. }....
18670 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
18671 0a 2f 2a 0d 0a 2a 2a 20 45 6e 73 75 72 65 20 74 ./*..** Ensure t
18672 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 hat the sub-jour
18673 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e nal file is open
18674 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 . If it is alrea
18675 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0d 0a dy open, this ..
18676 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 ** function is a
18677 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 no-op...**..**
18678 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 SQLITE_OK is ret
18679 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 urned if everyth
1867a 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 ing goes accordi
1867b 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0d ng to plan. An .
1867c 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 .** SQLITE_IOERR
1867d 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 _XXX error code
1867e 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 is returned if a
1867f 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
18680 4f 73 4f 70 65 6e 28 29 20 0d 0a 2a 2a 20 66 61 OsOpen() ..** fa
18681 69 6c 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ils...*/..static
18682 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 int openSubJour
18683 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 nal(Pager *pPage
18684 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 r){.. int rc =
18685 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 SQLITE_OK;.. if
18686 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 ( !isOpen(pPager
18687 2d 3e 73 6a 66 64 29 20 29 7b 0d 0a 20 20 20 20 ->sjfd) ){..
18688 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 if( pPager->jour
18689 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a nalMode==PAGER_J
1868a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 OURNALMODE_MEMOR
1868b 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 Y || pPager->sub
1868c 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0d 0a 20 20 jInMemory ){..
1868d 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f sqlite3MemJo
1868e 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 urnalOpen(pPager
1868f 2d 3e 73 6a 66 64 29 3b 0d 0a 20 20 20 20 7d 65 ->sjfd);.. }e
18690 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d lse{.. rc =
18691 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 pagerOpentemp(p
18692 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 Pager, pPager->s
18693 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e jfd, SQLITE_OPEN
18694 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0d 0a 20 _SUBJOURNAL);..
18695 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 }.. }.. ret
18696 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
18697 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 ..** Append a re
18698 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 cord of the curr
18699 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 ent state of pag
1869a 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 e pPg to the sub
1869b 2d 6a 6f 75 72 6e 61 6c 2e 20 0d 0a 2a 2a 20 49 -journal. ..** I
1869c 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 t is the callers
1869d 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 responsibility
1869e 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 to use subjRequi
1869f 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 resPage() to che
186a0 63 6b 20 0d 0a 2a 2a 20 74 68 61 74 20 69 74 20 ck ..** that it
186a1 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 is really requir
186a2 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e ed before callin
186a3 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e g this function.
186a4 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63 63 ..**..** If succ
186a5 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 essful, set the
186a6 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e bit correspondin
186a7 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 g to pPg->pgno i
186a8 6e 20 74 68 65 20 62 69 74 76 65 63 73 0d 0a 2a n the bitvecs..*
186a9 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 * for all open s
186aa 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 avepoints before
186ab 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a 0d returning...**.
186ac 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
186ad 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 n returns SQLITE
186ae 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e _OK if everythin
186af 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c g is successful,
186b0 20 61 6e 20 49 4f 0d 0a 2a 2a 20 65 72 72 6f 72 an IO..** error
186b1 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 code if the att
186b2 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f empt to write to
186b3 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c the sub-journal
186b4 20 66 61 69 6c 73 2c 20 6f 72 20 0d 0a 2a 2a 20 fails, or ..**
186b5 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 SQLITE_NOMEM if
186b6 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 a malloc fails w
186b7 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 hile setting a b
186b8 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e it in a savepoin
186b9 74 0d 0a 2a 2a 20 62 69 74 76 65 63 2e 0d 0a 2a t..** bitvec...*
186ba 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 /..static int su
186bb 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 bjournalPage(PgH
186bc 64 72 20 2a 70 50 67 29 7b 0d 0a 20 20 69 6e 74 dr *pPg){.. int
186bd 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
186be 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 .. Pager *pPage
186bf 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b r = pPg->pPager;
186c0 0d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e .. if( pPager->
186c1 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 journalMode!=PAG
186c2 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f ER_JOURNALMODE_O
186c3 46 46 20 29 7b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 FF ){.... /*
186c4 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 Open the sub-jou
186c5 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 rnal, if it has
186c6 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e not already been
186c7 20 6f 70 65 6e 65 64 20 2a 2f 0d 0a 20 20 20 20 opened */..
186c8 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
186c9 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0d 0a 20 useJournal );..
186ca 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 assert( isOpe
186cb 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c n(pPager->jfd) |
186cc 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 | pagerUseWal(pP
186cd 61 67 65 72 29 20 29 3b 0d 0a 20 20 20 20 61 73 ager) );.. as
186ce 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 sert( isOpen(pPa
186cf 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 ger->sjfd) || pP
186d0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 ager->nSubRec==0
186d1 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
186d2 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 pagerUseWal(pPa
186d3 67 65 72 29 20 0d 0a 20 20 20 20 20 20 20 20 20 ger) ..
186d4 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c || pageInJournal
186d5 28 70 50 67 29 20 0d 0a 20 20 20 20 20 20 20 20 (pPg) ..
186d6 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 || pPg->pgno>pP
186d7 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 ager->dbOrigSize
186d8 20 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 20 20 72 .. );.. r
186d9 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e c = openSubJourn
186da 61 6c 28 70 50 61 67 65 72 29 3b 0d 0a 0d 0a 20 al(pPager);....
186db 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 /* If the sub
186dc 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 -journal was ope
186dd 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 ned successfully
186de 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 (or was already
186df 20 6f 70 65 6e 29 2c 0d 0a 20 20 20 20 2a 2a 20 open),.. **
186e0 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 write the journa
186e1 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 l record into th
186e2 65 20 66 69 6c 65 2e 20 20 2a 2f 0d 0a 20 20 20 e file. */..
186e3 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
186e4 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 76 6f 69 OK ){.. voi
186e5 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e d *pData = pPg->
186e6 70 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 69 36 pData;.. i6
186e7 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 4 offset = (i64)
186e8 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a pPager->nSubRec*
186e9 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 (4+pPager->pageS
186ea 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20 63 68 61 ize);.. cha
186eb 72 20 2a 70 44 61 74 61 32 3b 0d 0a 20 20 0d 0a r *pData2;.. ..
186ec 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 CODEC2(pPa
186ed 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d ger, pData, pPg-
186ee 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e >pgno, 7, return
186ef 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 SQLITE_NOMEM, p
186f0 44 61 74 61 32 29 3b 0d 0a 20 20 20 20 20 20 50 Data2);.. P
186f1 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 AGERTRACE(("STMT
186f2 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 -JOURNAL %d page
186f3 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 %d\n", PAGERID(
186f4 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 pPager), pPg->pg
186f5 6e 6f 29 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 no));.. rc
186f6 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 = write32bits(pP
186f7 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 ager->sjfd, offs
186f8 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0d et, pPg->pgno);.
186f9 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 . if( rc==S
186fa 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
186fb 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
186fc 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3OsWrite(pPager-
186fd 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 >sjfd, pData2, p
186fe 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c Pager->pageSize,
186ff 20 6f 66 66 73 65 74 2b 34 29 3b 0d 0a 20 20 20 offset+4);..
18700 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d }.. }.. }
18701 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 .. if( rc==SQLI
18702 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 50 TE_OK ){.. pP
18703 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b ager->nSubRec++;
18704 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 .. assert( pP
18705 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 ager->nSavepoint
18706 3e 30 20 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 >0 );.. rc =
18707 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 addToSavepointBi
18708 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 tvecs(pPager, pP
18709 67 2d 3e 70 67 6e 6f 29 3b 0d 0a 20 20 7d 0d 0a g->pgno);.. }..
1870a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
1870b 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 .../*..** This f
1870c 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
1870d 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 d by the pcache
1870e 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 layer when it ha
1870f 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0d 0a s reached some..
18710 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c ** soft memory l
18711 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 imit. The first
18712 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f argument is a po
18713 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 inter to a Pager
18714 20 6f 62 6a 65 63 74 0d 0a 2a 2a 20 28 63 61 73 object..** (cas
18715 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 t as a void*). T
18716 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 he pager is alwa
18717 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 ys 'purgeable' (
18718 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 not an in-memory
18719 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 ..** database).
1871a 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d The second argum
1871b 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e ent is a referen
1871c 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 ce to a page tha
1871d 74 20 69 73 20 0d 0a 2a 2a 20 63 75 72 72 65 6e t is ..** curren
1871e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 tly dirty but ha
1871f 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 s no outstanding
18720 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 references. The
18721 20 70 61 67 65 0d 0a 2a 2a 20 69 73 20 61 6c 77 page..** is alw
18722 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 ays associated w
18723 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 ith the Pager ob
18724 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 ject passed as t
18725 68 65 20 66 69 72 73 74 20 0d 0a 2a 2a 20 61 72 he first ..** ar
18726 67 75 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 gument...**..**
18727 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 The job of this
18728 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d function is to m
18729 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 ake pPg clean by
1872a 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e writing its con
1872b 74 65 6e 74 73 0d 0a 2a 2a 20 6f 75 74 20 74 6f tents..** out to
1872c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1872d 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e le, if possible.
1872e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 This may involv
1872f 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0d 0a 2a e syncing the..*
18730 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 * journal file.
18731 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63 63 ..**..** If succ
18732 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 essful, sqlite3P
18733 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 cacheMakeClean()
18734 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 is called on th
18735 65 20 70 61 67 65 20 61 6e 64 0d 0a 2a 2a 20 53 e page and..** S
18736 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 QLITE_OK returne
18737 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f d. If an IO erro
18738 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 r occurs while t
18739 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 rying to make th
1873a 65 0d 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e e..** page clean
1873b 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 , the IO error c
1873c 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e ode is returned.
1873d 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e If the page can
1873e 6e 6f 74 20 62 65 0d 0a 2a 2a 20 6d 61 64 65 20 not be..** made
1873f 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f clean for some o
18740 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 ther reason, but
18741 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 no error occurs
18742 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b , then SQLITE_OK
18743 0d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 ..** is returned
18744 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 by sqlite3Pcach
18745 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 eMakeClean() is
18746 6e 6f 74 20 63 61 6c 6c 65 64 2e 0d 0a 2a 2f 0d not called...*/.
18747 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 .static int page
18748 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c rStress(void *p,
18749 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0d 0a 20 PgHdr *pPg){..
1874a 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d Pager *pPager =
1874b 20 28 50 61 67 65 72 20 2a 29 70 3b 0d 0a 20 20 (Pager *)p;..
1874c 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
1874d 4f 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 OK;.... assert(
1874e 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 pPg->pPager==pP
1874f 61 67 65 72 20 29 3b 0d 0a 20 20 61 73 73 65 72 ager );.. asser
18750 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 t( pPg->flags&PG
18751 48 44 52 5f 44 49 52 54 59 20 29 3b 0d 0a 0d 0a HDR_DIRTY );....
18752 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 /* The doNotSy
18753 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 ncSpill flag is
18754 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 set during times
18755 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 when doing a sy
18756 6e 63 20 6f 66 0d 0a 20 20 2a 2a 20 6a 6f 75 72 nc of.. ** jour
18757 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 nal (and adding
18758 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 a new header) is
18759 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 not allowed. T
1875a 68 69 73 20 6f 63 63 75 72 73 0d 0a 20 20 2a 2a his occurs.. **
1875b 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f during calls to
1875c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 sqlite3PagerWri
1875d 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e te() while tryin
1875e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c g to journal mul
1875f 74 69 70 6c 65 0d 0a 20 20 2a 2a 20 70 61 67 65 tiple.. ** page
18760 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 s belonging to t
18761 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0d he same sector..
18762 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 . **.. ** The
18763 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 doNotSpill flag
18764 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 inhibits all cac
18765 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 he spilling rega
18766 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 rdless of whethe
18767 72 0d 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 r.. ** or not a
18768 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 sync is require
18769 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 d. This is set
1876a 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 during a rollbac
1876b 6b 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 53 k... **.. ** S
1876c 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 pilling is also
1876d 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 prohibited when
1876e 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 in an error stat
1876f 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 e since that cou
18770 6c 64 0d 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f ld.. ** lead to
18771 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 database corrup
18772 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 tion. In the c
18773 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 urrent implement
18774 61 74 6f 6e 20 69 74 20 0d 0a 20 20 2a 2a 20 69 aton it .. ** i
18775 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 s impossible for
18776 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 sqlite3PcacheFe
18777 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c tch() to be call
18778 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c ed with createFl
18779 61 67 3d 3d 31 0d 0a 20 20 2a 2a 20 77 68 69 6c ag==1.. ** whil
1877a 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 e in the error s
1877b 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 tate, hence it i
1877c 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 s impossible for
1877d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f this routine to
1877e 0d 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 .. ** be called
1877f 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 in the error st
18780 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 ate. Neverthele
18781 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 ss, we include a
18782 20 4e 45 56 45 52 28 29 0d 0a 20 20 2a 2a 20 74 NEVER().. ** t
18783 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f est for the erro
18784 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66 r state as a saf
18785 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 eguard against f
18786 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0d 0a uture changes...
18787 20 20 2a 2f 0d 0a 20 20 69 66 28 20 4e 45 56 45 */.. if( NEVE
18788 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 R(pPager->errCod
18789 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 e) ) return SQLI
1878a 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 70 50 TE_OK;.. if( pP
1878b 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c ager->doNotSpill
1878c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
1878d 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 _OK;.. if( pPag
1878e 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 er->doNotSyncSpi
1878f 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 ll && (pPg->flag
18790 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 s & PGHDR_NEED_S
18791 59 4e 43 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 YNC)!=0 ){..
18792 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
18793 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 50 67 2d ;.. }.... pPg-
18794 3e 70 44 69 72 74 79 20 3d 20 30 3b 0d 0a 20 20 >pDirty = 0;..
18795 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 if( pagerUseWal(
18796 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 20 20 pPager) ){..
18797 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c /* Write a singl
18798 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 e frame for this
18799 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 page to the log
1879a 2e 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 73 75 . */.. if( su
1879b 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 bjRequiresPage(p
1879c 50 67 29 20 29 7b 20 0d 0a 20 20 20 20 20 20 72 Pg) ){ .. r
1879d 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 c = subjournalPa
1879e 67 65 28 70 50 67 29 3b 20 0d 0a 20 20 20 20 7d ge(pPg); .. }
1879f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
187a0 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
187a1 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 rc = pagerWalF
187a2 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 rames(pPager, pP
187a3 67 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20 20 7d g, 0, 0);.. }
187a4 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 0d 0a .. }else{.. ..
187a5 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 /* Sync the
187a6 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 journal file if
187a7 72 65 71 75 69 72 65 64 2e 20 2a 2f 0d 0a 20 20 required. */..
187a8 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 if( pPg->flags
187a9 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 &PGHDR_NEED_SYNC
187aa 20 0d 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 .. || pPage
187ab 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
187ac 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 _WRITER_CACHEMOD
187ad 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 .. ){..
187ae 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c rc = syncJournal
187af 28 70 50 61 67 65 72 2c 20 31 29 3b 0d 0a 20 20 (pPager, 1);..
187b0 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 2f 2a 20 }.. .. /*
187b1 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 If the page numb
187b2 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 er of this page
187b3 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 is larger than t
187b4 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 he current size
187b5 6f 66 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 of.. ** the d
187b6 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 atabase image, i
187b7 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 t may need to be
187b8 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 written to the
187b9 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0d 0a 20 20 sub-journal...
187ba 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 ** This is bec
187bb 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f ause the call to
187bc 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 pager_write_pag
187bd 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 elist() below wi
187be 6c 6c 20 6e 6f 74 0d 0a 20 20 20 20 2a 2a 20 61 ll not.. ** a
187bf 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 ctually write da
187c0 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 ta to the file i
187c1 6e 20 74 68 69 73 20 63 61 73 65 2e 0d 0a 20 20 n this case...
187c2 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 43 6f 6e **.. ** Con
187c3 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 sider the follow
187c4 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 ing sequence of
187c5 65 76 65 6e 74 73 3a 0d 0a 20 20 20 20 2a 2a 0d events:.. **.
187c6 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b . ** BEGIN;
187c7 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f .. ** <jo
187c8 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0d 0a 20 urnal page X>..
187c9 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 ** <modif
187ca 79 20 70 61 67 65 20 58 3e 0d 0a 20 20 20 20 2a y page X>.. *
187cb 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 * SAVEPOINT
187cc 73 70 3b 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 sp;.. **
187cd 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 <shrink databa
187ce 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 se file to Y pag
187cf 65 73 3e 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 es>.. **
187d0 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 pagerStress(pa
187d1 67 65 20 58 29 0d 0a 20 20 20 20 2a 2a 20 20 20 ge X).. **
187d2 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 ROLLBACK TO sp
187d3 3b 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a ;.. **.. *
187d4 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e * If (X>Y), then
187d5 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 when pagerStres
187d6 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 s is called page
187d7 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 X will not be w
187d8 72 69 74 74 65 6e 0d 0a 20 20 20 20 2a 2a 20 6f ritten.. ** o
187d9 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 ut to the databa
187da 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c se file, but wil
187db 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f l be dropped fro
187dc 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 m the cache. The
187dd 6e 2c 0d 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f n,.. ** follo
187de 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 wing the "ROLLBA
187df 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d CK TO sp" statem
187e0 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 ent, reading pag
187e1 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0d 0a 20 e X will read..
187e2 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 ** data from
187e3 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
187e4 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 e. This will be
187e5 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 the copy of page
187e6 20 58 20 61 73 20 69 74 0d 0a 20 20 20 20 2a 2a X as it.. **
187e7 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 was when the tr
187e8 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 ansaction starte
187e9 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 d, not as it was
187ea 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 when "SAVEPOINT
187eb 20 73 70 22 0d 0a 20 20 20 20 2a 2a 20 77 61 73 sp".. ** was
187ec 20 65 78 65 63 75 74 65 64 2e 0d 0a 20 20 20 20 executed...
187ed 2a 2a 0d 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 **.. ** The s
187ee 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 olution is to wr
187ef 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 ite the current
187f0 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 data for page X
187f1 69 6e 74 6f 20 74 68 65 20 0d 0a 20 20 20 20 2a into the .. *
187f2 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 * sub-journal fi
187f3 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 le now (if it is
187f4 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 not already the
187f5 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 re), so that it
187f6 77 69 6c 6c 0d 0a 20 20 20 20 2a 2a 20 62 65 20 will.. ** be
187f7 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 restored to its
187f8 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 current value wh
187f9 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b en the "ROLLBACK
187fa 20 54 4f 20 73 70 22 20 69 73 20 0d 0a 20 20 20 TO sp" is ..
187fb 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0d 0a 20 ** executed...
187fc 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 4e */.. if( N
187fd 45 56 45 52 28 0d 0a 20 20 20 20 20 20 20 20 72 EVER(.. r
187fe 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
187ff 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 pPg->pgno>pPager
18800 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a ->dbSize && subj
18801 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 RequiresPage(pPg
18802 29 0d 0a 20 20 20 20 29 20 29 7b 0d 0a 20 20 20 ).. ) ){..
18803 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e rc = subjourn
18804 61 6c 50 61 67 65 28 70 50 67 29 3b 0d 0a 20 20 alPage(pPg);..
18805 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 2f 2a 20 }.. .. /*
18806 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e Write the conten
18807 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f ts of the page o
18808 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 ut to the databa
18809 73 65 20 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 20 se file. */..
1880a 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
1880b 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 OK ){.. ass
1880c 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 ert( (pPg->flags
1880d 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 &PGHDR_NEED_SYNC
1880e 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 72 )==0 );.. r
1880f 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f c = pager_write_
18810 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c pagelist(pPager,
18811 20 70 50 67 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 pPg);.. }..
18812 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 4d 61 72 6b 20 }.... /* Mark
18813 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 the page as clea
18814 6e 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d n. */.. if( rc=
18815 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
18816 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 PAGERTRACE(("
18817 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 STRESS %d page %
18818 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 d\n", PAGERID(pP
18819 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f ager), pPg->pgno
1881a 29 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 ));.. sqlite3
1881b 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 PcacheMakeClean(
1881c 70 50 67 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 pPg);.. }....
1881d 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 return pager_err
1881e 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 or(pPager, rc);
1881f 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ..}....../*..**
18820 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 Allocate and ini
18821 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 tialize a new Pa
18822 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 ger object and p
18823 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ut a pointer to
18824 69 74 0d 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 it..** in *ppPag
18825 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 er. The pager sh
18826 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 ould eventually
18827 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 be freed by pass
18828 69 6e 67 20 69 74 0d 0a 2a 2a 20 74 6f 20 73 71 ing it..** to sq
18829 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 lite3PagerClose(
1882a 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 7a )...**..** The z
1882b 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e Filename argumen
1882c 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f t is the path to
1882d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1882e 6c 65 20 74 6f 20 6f 70 65 6e 2e 0d 0a 2a 2a 20 le to open...**
1882f 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 If zFilename is
18830 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 NULL then a rand
18831 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f omly-named tempo
18832 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 rary file is cre
18833 61 74 65 64 0d 0a 2a 2a 20 61 6e 64 20 75 73 65 ated..** and use
18834 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f d as the file to
18835 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 be cached. Temp
18836 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 orary files are
18837 62 65 20 64 65 6c 65 74 65 64 0d 0a 2a 2a 20 61 be deleted..** a
18838 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 utomatically whe
18839 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 n they are close
1883a 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 d. If zFilename
1883b 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 is ":memory:" th
1883c 65 6e 20 0d 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f en ..** all info
1883d 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 rmation is held
1883e 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 in cache. It is
1883f 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f never written to
18840 20 64 69 73 6b 2e 20 0d 0a 2a 2a 20 54 68 69 73 disk. ..** This
18841 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 can be used to
18842 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d implement an in-
18843 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e memory database.
18844 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6e 45 78 ..**..** The nEx
18845 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 tra parameter sp
18846 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 ecifies the numb
18847 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 er of bytes of s
18848 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0d 0a pace allocated..
18849 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 ** along with ea
1884a 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 ch page referenc
1884b 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 e. This space is
1884c 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 available to th
1884d 65 20 75 73 65 72 0d 0a 2a 2a 20 76 69 61 20 74 e user..** via t
1884e 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 he sqlite3PagerG
1884f 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0d 0a etExtra() API...
18850 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 **..** The flags
18851 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 argument is use
18852 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f d to specify pro
18853 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 perties that aff
18854 65 63 74 20 74 68 65 0d 0a 2a 2a 20 6f 70 65 72 ect the..** oper
18855 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 ation of the pag
18856 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 er. It should be
18857 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 passed some bit
18858 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e wise combination
18859 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 ..** of the PAGE
1885a 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 R_OMIT_JOURNAL a
1885b 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 nd PAGER_NO_READ
1885c 4c 4f 43 4b 20 66 6c 61 67 73 2e 0d 0a 2a 2a 0d LOCK flags...**.
1885d 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 .** The vfsFlags
1885e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 parameter is a
1885f 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 bitmask to pass
18860 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 to the flags par
18861 61 6d 65 74 65 72 0d 0a 2a 2a 20 6f 66 20 74 68 ameter..** of th
18862 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 e xOpen() method
18863 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 of the supplied
18864 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e VFS when openin
18865 67 20 66 69 6c 65 73 2e 20 0d 0a 2a 2a 0d 0a 2a g files. ..**..*
18866 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f * If the pager o
18867 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 bject is allocat
18868 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 ed and the speci
18869 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 fied file opened
1886a 20 0d 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c ..** successful
1886b 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 ly, SQLITE_OK is
1886c 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 returned and *p
1886d 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f pPager set to po
1886e 69 6e 74 20 74 6f 0d 0a 2a 2a 20 74 68 65 20 6e int to..** the n
1886f 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e ew pager object.
18870 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 If an error occ
18871 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 urs, *ppPager is
18872 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0d 0a 2a 2a set to NULL..**
18873 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 and error code
18874 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 returned. This f
18875 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 unction may retu
18876 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0d rn SQLITE_NOMEM.
18877 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c .** (sqlite3Mall
18878 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 oc() is used to
18879 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 allocate memory)
1887a 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 , SQLITE_CANTOPE
1887b 4e 20 6f 72 20 0d 0a 2a 2a 20 76 61 72 69 6f 75 N or ..** variou
1887c 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 s SQLITE_IO_XXX
1887d 65 72 72 6f 72 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c errors...*/..SQL
1887e 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
1887f 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e sqlite3PagerOpen
18880 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 (.. sqlite3_vfs
18881 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a *pVfs, /*
18882 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c The virtual fil
18883 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 e system to use
18884 2a 2f 0d 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 */.. Pager **pp
18885 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f Pager, /
18886 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 * OUT: Return th
18887 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 e Pager structur
18888 65 20 68 65 72 65 20 2a 2f 0d 0a 20 20 63 6f 6e e here */.. con
18889 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
1888a 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 me, /* Name of
1888b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1888c 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0d 0a 20 le to open */..
1888d 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 int nExtra,
1888e 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 /* Ext
1888f 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 ra bytes append
18890 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 to each in-memor
18891 79 20 70 61 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 y page */.. int
18892 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 flags,
18893 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 /* flags c
18894 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 ontrolling this
18895 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 76 file */.. int v
18896 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 fsFlags,
18897 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 /* flags pas
18898 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 sed through to s
18899 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e qlite3_vfs.xOpen
1889a 28 29 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a () */.. void (*
1889b 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a xReinit)(DbPage*
1889c 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f ) /* Function to
1889d 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 reinitialize pa
1889e 67 65 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 38 ges */..){.. u8
1889f 20 2a 70 50 74 72 3b 0d 0a 20 20 50 61 67 65 72 *pPtr;.. Pager
188a0 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 *pPager = 0;
188a1 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a /* Pager obj
188a2 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 ect to allocate
188a3 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0d 0a 20 and return */..
188a4 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
188a5 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 _OK; /* Ret
188a6 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 urn code */.. i
188a7 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b nt tempFile = 0;
188a8 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
188a9 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 for temp files (
188aa 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 incl. in-memory
188ab 66 69 6c 65 73 29 20 2a 2f 0d 0a 20 20 69 6e 74 files) */.. int
188ac 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 memDb = 0;
188ad 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
188ae 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d this is an in-m
188af 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0d 0a 20 emory file */..
188b0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 int readOnly =
188b1 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 0; /* Tru
188b2 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 e if this is a r
188b3 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f ead-only file */
188b4 0d 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 .. int journalF
188b5 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 ileSize; /*
188b6 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 Bytes to allocat
188b7 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e e for each journ
188b8 61 6c 20 66 64 20 2a 2f 0d 0a 20 20 63 68 61 72 al fd */.. char
188b9 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b *zPathname = 0;
188ba 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 /* Full pat
188bb 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 h to database fi
188bc 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 61 le */.. int nPa
188bd 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 thname = 0;
188be 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
188bf 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d ytes in zPathnam
188c0 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 75 73 65 4a e */.. int useJ
188c1 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 ournal = (flags
188c2 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 & PAGER_OMIT_JOU
188c3 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c RNAL)==0; /* Fal
188c4 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e se to omit journ
188c5 61 6c 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 6f 52 al */.. int noR
188c6 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 eadlock = (flags
188c7 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 & PAGER_NO_READ
188c8 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 LOCK)!=0; /* Tr
188c9 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d ue to omit read-
188ca 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 lock */.. int p
188cb 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 cacheSize = sqli
188cc 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b te3PcacheSize();
188cd 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
188ce 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 to allocate for
188cf 50 43 61 63 68 65 20 2a 2f 0d 0a 20 20 75 33 32 PCache */.. u32
188d0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 szPageDflt = SQ
188d1 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 LITE_DEFAULT_PAG
188d2 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 E_SIZE; /* Defa
188d3 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f ult page size */
188d4 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
188d5 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 zUri = 0; /*
188d6 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 URI args to copy
188d7 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 55 72 69 20 */.. int nUri
188d8 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
188d9 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
188da 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 es of URI args a
188db 74 20 2a 7a 55 72 69 20 2a 2f 0d 0a 0d 0a 20 20 t *zUri */....
188dc 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f /* Figure out ho
188dd 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 w much space is
188de 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 required for eac
188df 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 h journal file-h
188e0 61 6e 64 6c 65 0d 0a 20 20 2a 2a 20 28 74 68 65 andle.. ** (the
188e1 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 re are two of th
188e2 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 em, the main jou
188e3 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 rnal and the sub
188e4 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0d -journal). This.
188e5 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 . ** is the max
188e6 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 imum space requi
188e7 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 red for an in-me
188e8 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c mory journal fil
188e9 65 20 68 61 6e 64 6c 65 20 0d 0a 20 20 2a 2a 20 e handle .. **
188ea 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f and a regular jo
188eb 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c urnal file-handl
188ec 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 e. Note that a "
188ed 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d regular journal-
188ee 68 61 6e 64 6c 65 22 0d 0a 20 20 2a 2a 20 6d 61 handle".. ** ma
188ef 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 y be a wrapper c
188f0 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e apable of cachin
188f1 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 g the first port
188f2 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e ion of the journ
188f3 61 6c 0d 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e al.. ** file in
188f4 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 memory to imple
188f5 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d ment the atomic-
188f6 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 write optimizati
188f7 6f 6e 20 28 73 65 65 20 0d 0a 20 20 2a 2a 20 73 on (see .. ** s
188f8 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e ource file journ
188f9 61 6c 2e 63 29 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 al.c)... */..
188fa 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e if( sqlite3Journ
188fb 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c alSize(pVfs)>sql
188fc 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 ite3MemJournalSi
188fd 7a 65 28 29 20 29 7b 0d 0a 20 20 20 20 6a 6f 75 ze() ){.. jou
188fe 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 rnalFileSize = R
188ff 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 OUND8(sqlite3Jou
18900 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b rnalSize(pVfs));
18901 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
18902 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 journalFileSize
18903 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 = ROUND8(sqlite3
18904 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 MemJournalSize()
18905 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 );.. }.... /*
18906 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 Set the output v
18907 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 ariable to NULL
18908 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 in case an error
18909 20 6f 63 63 75 72 73 2e 20 2a 2f 0d 0a 20 20 2a occurs. */.. *
1890a 70 70 50 61 67 65 72 20 3d 20 30 3b 0d 0a 0d 0a ppPager = 0;....
1890b 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
1890c 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0d 0a 20 20 MIT_MEMORYDB..
1890d 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 if( flags & PAGE
1890e 52 5f 4d 45 4d 4f 52 59 20 29 7b 0d 0a 20 20 20 R_MEMORY ){..
1890f 20 6d 65 6d 44 62 20 3d 20 31 3b 0d 0a 20 20 20 memDb = 1;..
18910 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0d zFilename = 0;.
18911 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a . }..#endif....
18912 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 /* Compute and
18913 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 store the full
18914 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 pathname in an a
18915 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 llocated buffer
18916 70 6f 69 6e 74 65 64 0d 0a 20 20 2a 2a 20 74 6f pointed.. ** to
18917 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c by zPathname, l
18918 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e ength nPathname.
18919 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 Or, if this is
1891a 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 a temporary file
1891b 2c 0d 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f ,.. ** leave bo
1891c 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 th nPathname and
1891d 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 zPathname set t
1891e 6f 20 30 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 o 0... */.. if
1891f 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a ( zFilename && z
18920 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0d 0a Filename[0] ){..
18921 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
18922 7a 3b 0d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d z;.. nPathnam
18923 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 e = pVfs->mxPath
18924 6e 61 6d 65 2b 31 3b 0d 0a 20 20 20 20 7a 50 61 name+1;.. zPa
18925 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 thname = sqlite3
18926 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 Malloc(nPathname
18927 2a 32 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a 50 *2);.. if( zP
18928 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0d 0a 20 athname==0 ){..
18929 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
1892a 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d TE_NOMEM;.. }
1892b 0d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b .. zPathname[
1892c 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 0] = 0; /* Make
1892d 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 sure initialized
1892e 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 even if FullPat
1892f 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f hname() fails */
18930 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
18931 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 e3OsFullPathname
18932 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 (pVfs, zFilename
18933 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 , nPathname, zPa
18934 74 68 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 6e 50 thname);.. nP
18935 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 athname = sqlite
18936 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 3Strlen30(zPathn
18937 61 6d 65 29 3b 0d 0a 20 20 20 20 7a 20 3d 20 7a ame);.. z = z
18938 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 Uri = &zFilename
18939 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 [sqlite3Strlen30
1893a 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0d (zFilename)+1];.
1893b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 . while( *z )
1893c 7b 0d 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 {.. z += sq
1893d 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 lite3Strlen30(z)
1893e 2b 31 3b 0d 0a 20 20 20 20 20 20 7a 20 2b 3d 20 +1;.. z +=
1893f 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
18940 7a 29 2b 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 z)+1;.. }..
18941 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 nUri = (int)(&
18942 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0d 0a 20 z[1] - zUri);..
18943 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e assert( nUri>
18944 3d 30 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 =0 );.. if( r
18945 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
18946 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 nPathname+8>pVfs
18947 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0d ->mxPathname ){.
18948 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 . /* This b
18949 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 ranch is taken w
1894a 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 hen the journal
1894b 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 path required by
1894c 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 .. ** the d
1894d 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 atabase being op
1894e 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 ened will be mor
1894f 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 e than pVfs->mxP
18950 61 74 68 6e 61 6d 65 0d 0a 20 20 20 20 20 20 2a athname.. *
18951 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 * bytes in lengt
18952 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 h. This means th
18953 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f e database canno
18954 74 20 62 65 20 6f 70 65 6e 65 64 2c 0d 0a 20 20 t be opened,..
18955 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c ** as it wil
18956 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c l not be possibl
18957 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f e to open the jo
18958 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 urnal file or ev
18959 65 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 en.. ** che
1895a 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 ck for a hot-jou
1895b 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 rnal before read
1895c 69 6e 67 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a ing... */..
1895d 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
1895e 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b E_CANTOPEN_BKPT;
1895f 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
18960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
18961 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {.. sqlite3
18962 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 _free(zPathname)
18963 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ;.. return
18964 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d rc;.. }.. }.
18965 0a 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 ... /* Allocate
18966 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 memory for the
18967 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c Pager structure,
18968 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 PCache object,
18969 74 68 65 0d 0a 20 20 2a 2a 20 74 68 72 65 65 20 the.. ** three
1896a 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 file descriptors
1896b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 , the database f
1896c 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 ile name and the
1896d 20 6a 6f 75 72 6e 61 6c 20 0d 0a 20 20 2a 2a 20 journal .. **
1896e 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c file name. The l
1896f 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 ayout in memory
18970 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a is as follows:..
18971 20 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 20 20 50 **.. ** P
18972 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 ager object
18973 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
18974 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 sizeof(Pager) by
18975 74 65 73 29 0d 0a 20 20 2a 2a 20 20 20 20 20 50 tes).. ** P
18976 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 Cache object
18977 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
18978 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a sqlite3PcacheSiz
18979 65 28 29 20 62 79 74 65 73 29 0d 0a 20 20 2a 2a e() bytes).. **
1897a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 Database fi
1897b 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 le handle
1897c 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 (pVfs->szOs
1897d 46 69 6c 65 20 62 79 74 65 73 29 0d 0a 20 20 2a File bytes).. *
1897e 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 * Sub-journa
1897f 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 l file handle
18980 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 (journalFi
18981 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0d 0a 20 leSize bytes)..
18982 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 ** Main jou
18983 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 rnal file handle
18984 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c (journal
18985 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0d FileSize bytes).
18986 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 . ** Databa
18987 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 se file name
18988 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 (nPath
18989 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0d 0a 20 name+1 bytes)..
1898a 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 ** Journal
1898b 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 file name
1898c 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 (nPathna
1898d 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0d 0a 20 me+8+1 bytes)..
1898e 20 2a 2f 0d 0a 20 20 70 50 74 72 20 3d 20 28 75 */.. pPtr = (u
1898f 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 8 *)sqlite3Mallo
18990 63 5a 65 72 6f 28 0d 0a 20 20 20 20 52 4f 55 4e cZero(.. ROUN
18991 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 D8(sizeof(*pPage
18992 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 r)) + /* Pa
18993 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f ger structure */
18994 0d 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 .. ROUND8(pca
18995 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 cheSize) +
18996 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f /* PCache o
18997 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 20 20 52 4f bject */.. RO
18998 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 UND8(pVfs->szOsF
18999 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 ile) + /*
1899a 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 The main db file
1899b 20 2a 2f 0d 0a 20 20 20 20 6a 6f 75 72 6e 61 6c */.. journal
1899c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 FileSize * 2 +
1899d 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 /* The t
1899e 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 wo journal files
1899f 20 2a 2f 20 0d 0a 20 20 20 20 6e 50 61 74 68 6e */ .. nPathn
189a0 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b ame + 1 + nUri +
189a1 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c /* zFil
189a2 65 6e 61 6d 65 20 2a 2f 0d 0a 20 20 20 20 6e 50 ename */.. nP
189a3 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 athname + 8 + 2
189a4 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
189a5 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 23 69 66 zJournal */..#if
189a6 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
189a7 5f 57 41 4c 0d 0a 20 20 20 20 2b 20 6e 50 61 74 _WAL.. + nPat
189a8 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 hname + 4 + 2
189a9 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c /* zWal
189aa 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 29 */..#endif.. )
189ab 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 ;.. assert( EIG
189ac 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
189ad 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f T(SQLITE_INT_TO_
189ae 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 PTR(journalFileS
189af 69 7a 65 29 29 20 29 3b 0d 0a 20 20 69 66 28 20 ize)) );.. if(
189b0 21 70 50 74 72 20 29 7b 0d 0a 20 20 20 20 73 71 !pPtr ){.. sq
189b1 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 lite3_free(zPath
189b2 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 72 65 74 75 name);.. retu
189b3 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
189b4 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 67 65 72 20 .. }.. pPager
189b5 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 = (
189b6 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0d 0a Pager*)(pPtr);..
189b7 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 pPager->pPCach
189b8 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 e = (PCache*)
189b9 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 (pPtr += ROUND8(
189ba 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 sizeof(*pPager))
189bb 29 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 );.. pPager->fd
189bc 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 = (sqlite3_fi
189bd 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 le*)(pPtr += ROU
189be 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 ND8(pcacheSize))
189bf 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 ;.. pPager->sjf
189c0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c d = (sqlite3_fil
189c1 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e e*)(pPtr += ROUN
189c2 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c D8(pVfs->szOsFil
189c3 65 29 29 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e e));.. pPager->
189c4 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f jfd = (sqlite3_
189c5 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a file*)(pPtr += j
189c6 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b ournalFileSize);
189c7 0d 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c .. pPager->zFil
189c8 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 ename = (char
189c9 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e *)(pPtr += journ
189ca 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0d 0a 20 20 alFileSize);..
189cb 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 assert( EIGHT_BY
189cc 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 TE_ALIGNMENT(pPa
189cd 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0d 0a 0d 0a ger->jfd) );....
189ce 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 /* Fill in the
189cf 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 Pager.zFilename
189d0 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 and Pager.zJour
189d1 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 nal buffers, if
189d2 72 65 71 75 69 72 65 64 2e 20 2a 2f 0d 0a 20 20 required. */..
189d3 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b if( zPathname ){
189d4 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 .. assert( nP
189d5 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0d 0a 20 20 athname>0 );..
189d6 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e pPager->zJourn
189d7 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 al = (char*)(p
189d8 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 Ptr += nPathname
189d9 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0d 0a 20 + 1 + nUri);..
189da 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 memcpy(pPager
189db 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 ->zFilename, zPa
189dc 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d thname, nPathnam
189dd 65 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 e);.. memcpy(
189de 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 &pPager->zFilena
189df 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c me[nPathname+1],
189e0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0d 0a 20 zUri, nUri);..
189e1 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 memcpy(pPager
189e2 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 ->zJournal, zPat
189e3 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 hname, nPathname
189e4 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 );.. memcpy(&
189e5 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c pPager->zJournal
189e6 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a [nPathname], "-j
189e7 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 31 ournal\000", 8+1
189e8 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 );.. sqlite3F
189e9 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 ileSuffix3(pPage
189ea 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 r->zFilename, pP
189eb 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b ager->zJournal);
189ec 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
189ed 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 20 20 20 70 _OMIT_WAL.. p
189ee 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 Pager->zWal = &p
189ef 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b Pager->zJournal[
189f0 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0d nPathname+8+1];.
189f1 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 . memcpy(pPag
189f2 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e er->zWal, zPathn
189f3 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b ame, nPathname);
189f4 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 .. memcpy(&pP
189f5 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 ager->zWal[nPath
189f6 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 name], "-wal\000
189f7 22 2c 20 34 2b 31 29 3b 0d 0a 20 20 20 20 73 71 ", 4+1);.. sq
189f8 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 lite3FileSuffix3
189f9 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 (pPager->zFilena
189fa 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c me, pPager->zWal
189fb 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 );..#endif..
189fc 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 sqlite3_free(zPa
189fd 74 68 6e 61 6d 65 29 3b 0d 0a 20 20 7d 0d 0a 20 thname);.. }..
189fe 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 pPager->pVfs =
189ff 70 56 66 73 3b 0d 0a 20 20 70 50 61 67 65 72 2d pVfs;.. pPager-
18a00 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 >vfsFlags = vfsF
18a01 6c 61 67 73 3b 0d 0a 0d 0a 20 20 2f 2a 20 4f 70 lags;.... /* Op
18a02 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c en the pager fil
18a03 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 e... */.. if(
18a04 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 zFilename && zFi
18a05 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0d 0a 20 20 lename[0] ){..
18a06 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 int fout = 0;
18a07 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18a08 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 /* VFS flags
18a09 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 returned by xOpe
18a0a 6e 28 29 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d n() */.. rc =
18a0b 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 sqlite3OsOpen(p
18a0c 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 Vfs, pPager->zFi
18a0d 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e lename, pPager->
18a0e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 fd, vfsFlags, &f
18a0f 6f 75 74 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 out);.. asser
18a10 74 28 20 21 6d 65 6d 44 62 20 29 3b 0d 0a 20 20 t( !memDb );..
18a11 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f readOnly = (fo
18a12 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 ut&SQLITE_OPEN_R
18a13 45 41 44 4f 4e 4c 59 29 3b 0d 0a 0d 0a 20 20 20 EADONLY);....
18a14 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 /* If the file
18a15 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 was successfully
18a16 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 opened for read
18a17 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0d 0a /write access,..
18a18 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 ** choose a
18a19 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a default page siz
18a1a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 e in case we hav
18a1b 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0d e to create the.
18a1c 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 . ** database
18a1d 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 file. The defau
18a1e 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 lt page size is
18a1f 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0d the maximum of:.
18a20 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 . **.. **
18a21 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 + SQLITE_DEFA
18a22 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0d 0a ULT_PAGE_SIZE,..
18a23 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 ** + The
18a24 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 value returned b
18a25 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f y sqlite3OsSecto
18a26 72 53 69 7a 65 28 29 0d 0a 20 20 20 20 2a 2a 20 rSize().. **
18a27 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 + The largest
18a28 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 page size that
18a29 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 can be written a
18a2a 74 6f 6d 69 63 61 6c 6c 79 2e 0d 0a 20 20 20 20 tomically...
18a2b 2a 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d */.. if( rc==
18a2c 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 SQLITE_OK && !re
18a2d 61 64 4f 6e 6c 79 20 29 7b 0d 0a 20 20 20 20 20 adOnly ){..
18a2e 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 setSectorSize(p
18a2f 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 20 61 Pager);.. a
18a30 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 ssert(SQLITE_DEF
18a31 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d AULT_PAGE_SIZE<=
18a32 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 SQLITE_MAX_DEFAU
18a33 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0d 0a LT_PAGE_SIZE);..
18a34 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 if( szPage
18a35 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 Dflt<pPager->sec
18a36 74 6f 72 53 69 7a 65 20 29 7b 0d 0a 20 20 20 20 torSize ){..
18a37 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e if( pPager->
18a38 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 sectorSize>SQLIT
18a39 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 E_MAX_DEFAULT_PA
18a3a 47 45 5f 53 49 5a 45 20 29 7b 0d 0a 20 20 20 20 GE_SIZE ){..
18a3b 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 szPageDflt
18a3c 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 = SQLITE_MAX_DE
18a3d 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b FAULT_PAGE_SIZE;
18a3e 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b .. }else{
18a3f 0d 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 .. szPa
18a40 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 geDflt = (u32)pP
18a41 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 ager->sectorSize
18a42 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
18a43 20 20 20 20 7d 0d 0a 23 69 66 64 65 66 20 53 51 }..#ifdef SQ
18a44 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d LITE_ENABLE_ATOM
18a45 49 43 5f 57 52 49 54 45 0d 0a 20 20 20 20 20 20 IC_WRITE..
18a46 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 {.. int i
18a47 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 Dc = sqlite3OsDe
18a48 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 viceCharacterist
18a49 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b ics(pPager->fd);
18a4a 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 .. int ii
18a4b 3b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 ;.. asser
18a4c 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 t(SQLITE_IOCAP_A
18a4d 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e TOMIC512==(512>>
18a4e 38 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 73 8));.. as
18a4f 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 sert(SQLITE_IOCA
18a50 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 P_ATOMIC64K==(65
18a51 35 33 36 3e 3e 38 29 29 3b 0d 0a 20 20 20 20 20 536>>8));..
18a52 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 assert(SQLITE
18a53 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 _MAX_DEFAULT_PAG
18a54 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0d E_SIZE<=65536);.
18a55 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d . for(ii=
18a56 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d szPageDflt; ii<=
18a57 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 SQLITE_MAX_DEFAU
18a58 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 LT_PAGE_SIZE; ii
18a59 3d 69 69 2a 32 29 7b 0d 0a 20 20 20 20 20 20 20 =ii*2){..
18a5a 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 if( iDc&(SQLI
18a5b 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c TE_IOCAP_ATOMIC|
18a5c 28 69 69 3e 3e 38 29 29 20 29 7b 0d 0a 20 20 20 (ii>>8)) ){..
18a5d 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 szPageD
18a5e 66 6c 74 20 3d 20 69 69 3b 0d 0a 20 20 20 20 20 flt = ii;..
18a5f 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
18a60 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 }.. }..#end
18a61 69 66 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c if.. }.. }el
18a62 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 61 se{.. /* If a
18a63 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 temporary file
18a64 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 is requested, it
18a65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 is not opened i
18a66 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20 mmediately...
18a67 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 ** In this case
18a68 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 we accept the d
18a69 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 efault page size
18a6a 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 and delay actua
18a6b 6c 6c 79 0d 0a 20 20 20 20 2a 2a 20 6f 70 65 6e lly.. ** open
18a6c 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 ing the file unt
18a6d 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c il the first cal
18a6e 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0d l to OsWrite()..
18a6f 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 . **.. **
18a70 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 This branch is a
18a71 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 lso run for an i
18a72 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 n-memory databas
18a73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0d e. An in-memory.
18a74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 . ** database
18a75 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 is the same as
18a76 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 a temp-file that
18a77 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 is never writte
18a78 6e 20 6f 75 74 20 74 6f 0d 0a 20 20 20 20 2a 2a n out to.. **
18a79 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 disk and uses a
18a7a 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c n in-memory roll
18a7b 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0d 0a 20 back journal...
18a7c 20 20 20 2a 2f 20 0d 0a 20 20 20 20 74 65 6d 70 */ .. temp
18a7d 46 69 6c 65 20 3d 20 31 3b 0d 0a 20 20 20 20 70 File = 1;.. p
18a7e 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 Pager->eState =
18a7f 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0d 0a 20 PAGER_READER;..
18a80 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b pPager->eLock
18a81 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 = EXCLUSIVE_LOC
18a82 4b 3b 0d 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 K;.. readOnly
18a83 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c = (vfsFlags&SQL
18a84 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c ITE_OPEN_READONL
18a85 59 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a Y);.. }.... /*
18a86 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 The following c
18a87 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 all to PagerSetP
18a88 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 agesize() serves
18a89 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 to set the valu
18a8a 65 20 6f 66 20 0d 0a 20 20 2a 2a 20 50 61 67 65 e of .. ** Page
18a8b 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 r.pageSize and t
18a8c 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 o allocate the P
18a8d 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 ager.pTmpSpace b
18a8e 75 66 66 65 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 uffer... */..
18a8f 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
18a90 4b 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 K ){.. assert
18a91 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d ( pPager->memDb=
18a92 3d 30 20 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 =0 );.. rc =
18a93 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 sqlite3PagerSetP
18a94 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 agesize(pPager,
18a95 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 &szPageDflt, -1)
18a96 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 ;.. testcase(
18a97 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
18a98 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 ;.. }.... /* I
18a99 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
18a9a 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 red in either of
18a9b 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 the blocks abov
18a9c 65 2c 20 66 72 65 65 20 74 68 65 20 0d 0a 20 20 e, free the ..
18a9d 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 ** Pager structu
18a9e 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 re and close the
18a9f 20 66 69 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 file... */..
18aa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
18aa1 4b 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 K ){.. assert
18aa2 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 ( !pPager->pTmpS
18aa3 70 61 63 65 20 29 3b 0d 0a 20 20 20 20 73 71 6c pace );.. sql
18aa4 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 ite3OsClose(pPag
18aa5 65 72 2d 3e 66 64 29 3b 0d 0a 20 20 20 20 73 71 er->fd);.. sq
18aa6 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 lite3_free(pPage
18aa7 72 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
18aa8 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a rc;.. }.... /*
18aa9 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 Initialize the
18aaa 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a PCache object. *
18aab 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 /.. assert( nEx
18aac 74 72 61 3c 31 30 30 30 20 29 3b 0d 0a 20 20 6e tra<1000 );.. n
18aad 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e Extra = ROUND8(n
18aae 45 78 74 72 61 29 3b 0d 0a 20 20 73 71 6c 69 74 Extra);.. sqlit
18aaf 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 e3PcacheOpen(szP
18ab0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c ageDflt, nExtra,
18ab1 20 21 6d 65 6d 44 62 2c 0d 0a 20 20 20 20 20 20 !memDb,..
18ab2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d !m
18ab3 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 emDb?pagerStress
18ab4 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 :0, (void *)pPag
18ab5 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 er, pPager->pPCa
18ab6 63 68 65 29 3b 0d 0a 0d 0a 20 20 50 41 47 45 52 che);.... PAGER
18ab7 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 TRACE(("OPEN %d
18ab8 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c %s\n", FILEHANDL
18ab9 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c EID(pPager->fd),
18aba 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 pPager->zFilena
18abb 6d 65 29 29 3b 0d 0a 20 20 49 4f 54 52 41 43 45 me));.. IOTRACE
18abc 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 (("OPEN %p %s\n"
18abd 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 , pPager, pPager
18abe 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0d 0a 0d ->zFilename))...
18abf 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f . pPager->useJo
18ac0 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a urnal = (u8)useJ
18ac1 6f 75 72 6e 61 6c 3b 0d 0a 20 20 70 50 61 67 65 ournal;.. pPage
18ac2 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 r->noReadlock =
18ac3 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 (noReadlock && r
18ac4 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0d 0a eadOnly) ?1:0;..
18ac5 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d /* pPager->stm
18ac6 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0d 0a 20 tOpen = 0; */..
18ac7 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 /* pPager->stmt
18ac8 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0d 0a 20 InUse = 0; */..
18ac9 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 /* pPager->nRef
18aca 20 3d 20 30 3b 20 2a 2f 0d 0a 20 20 2f 2a 20 70 = 0; */.. /* p
18acb 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 Pager->stmtSize
18acc 3d 20 30 3b 20 2a 2f 0d 0a 20 20 2f 2a 20 70 50 = 0; */.. /* pP
18acd 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 ager->stmtJSize
18ace 3d 20 30 3b 20 2a 2f 0d 0a 20 20 2f 2a 20 70 50 = 0; */.. /* pP
18acf 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b ager->nPage = 0;
18ad0 20 2a 2f 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6d */.. pPager->m
18ad1 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d xPgno = SQLITE_M
18ad2 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0d 0a AX_PAGE_COUNT;..
18ad3 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 /* pPager->sta
18ad4 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 te = PAGER_UNLOC
18ad5 4b 3b 20 2a 2f 0d 0a 23 69 66 20 30 0d 0a 20 20 K; */..#if 0..
18ad6 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
18ad7 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 state == (tempFi
18ad8 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 le ? PAGER_EXCLU
18ad9 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c SIVE : PAGER_UNL
18ada 4f 43 4b 29 20 29 3b 0d 0a 23 65 6e 64 69 66 0d OCK) );..#endif.
18adb 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 . /* pPager->er
18adc 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0d 0a 20 rMask = 0; */..
18add 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c pPager->tempFil
18ade 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 e = (u8)tempFile
18adf 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d ;.. assert( tem
18ae0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 pFile==PAGER_LOC
18ae1 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 KINGMODE_NORMAL
18ae2 0d 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 .. || t
18ae3 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c empFile==PAGER_L
18ae4 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 OCKINGMODE_EXCLU
18ae5 53 49 56 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 SIVE );.. asser
18ae6 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 t( PAGER_LOCKING
18ae7 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d MODE_EXCLUSIVE==
18ae8 31 20 29 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 1 );.. pPager->
18ae9 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 exclusiveMode =
18aea 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0d 0a (u8)tempFile; ..
18aeb 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 pPager->change
18aec 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 CountDone = pPag
18aed 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0d 0a 20 er->tempFile;..
18aee 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d pPager->memDb =
18aef 20 28 75 38 29 6d 65 6d 44 62 3b 0d 0a 20 20 70 (u8)memDb;.. p
18af0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 Pager->readOnly
18af1 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0d = (u8)readOnly;.
18af2 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f . assert( useJo
18af3 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d urnal || pPager-
18af4 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0d 0a 20 20 >tempFile );..
18af5 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d pPager->noSync =
18af6 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c pPager->tempFil
18af7 65 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 65 72 e;.. if( pPager
18af8 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0d 0a 20 20 20 ->noSync ){..
18af9 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
18afa 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0d >fullSync==0 );.
18afb 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 . assert( pPa
18afc 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d ger->syncFlags==
18afd 30 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 0 );.. assert
18afe 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e ( pPager->walSyn
18aff 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0d 0a 20 20 cFlags==0 );..
18b00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
18b01 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d ->ckptSyncFlags=
18b02 3d 30 20 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d =0 );.. }else{.
18b03 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c . pPager->ful
18b04 6c 53 79 6e 63 20 3d 20 31 3b 0d 0a 20 20 20 20 lSync = 1;..
18b05 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 pPager->syncFlag
18b06 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f s = SQLITE_SYNC_
18b07 4e 4f 52 4d 41 4c 3b 0d 0a 20 20 20 20 70 50 61 NORMAL;.. pPa
18b08 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 ger->walSyncFlag
18b09 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f s = SQLITE_SYNC_
18b0a 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e NORMAL | WAL_SYN
18b0b 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0d C_TRANSACTIONS;.
18b0c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 . pPager->ckp
18b0d 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c tSyncFlags = SQL
18b0e 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b ITE_SYNC_NORMAL;
18b0f 0d 0a 20 20 7d 0d 0a 20 20 2f 2a 20 70 50 61 67 .. }.. /* pPag
18b10 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 er->pFirst = 0;
18b11 2a 2f 0d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d */.. /* pPager-
18b12 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 >pFirstSynced =
18b13 30 3b 20 2a 2f 0d 0a 20 20 2f 2a 20 70 50 61 67 0; */.. /* pPag
18b14 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a er->pLast = 0; *
18b15 2f 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 /.. pPager->nEx
18b16 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 tra = (u16)nExtr
18b17 61 3b 0d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f a;.. pPager->jo
18b18 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d urnalSizeLimit =
18b19 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f SQLITE_DEFAULT_
18b1a 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d JOURNAL_SIZE_LIM
18b1b 49 54 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 IT;.. assert( i
18b1c 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 sOpen(pPager->fd
18b1d 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b ) || tempFile );
18b1e 0d 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a .. setSectorSiz
18b1f 65 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 69 66 e(pPager);.. if
18b20 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b ( !useJournal ){
18b21 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f .. pPager->jo
18b22 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 urnalMode = PAGE
18b23 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 R_JOURNALMODE_OF
18b24 46 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 F;.. }else if(
18b25 6d 65 6d 44 62 20 29 7b 0d 0a 20 20 20 20 70 50 memDb ){.. pP
18b26 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 ager->journalMod
18b27 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 e = PAGER_JOURNA
18b28 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0d 0a 20 LMODE_MEMORY;..
18b29 20 7d 0d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d }.. /* pPager-
18b2a 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 >xBusyHandler =
18b2b 30 3b 20 2a 2f 0d 0a 20 20 2f 2a 20 70 50 61 67 0; */.. /* pPag
18b2c 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 er->pBusyHandler
18b2d 41 72 67 20 3d 20 30 3b 20 2a 2f 0d 0a 20 20 70 Arg = 0; */.. p
18b2e 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 Pager->xReiniter
18b2f 20 3d 20 78 52 65 69 6e 69 74 3b 0d 0a 20 20 2f = xReinit;.. /
18b30 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d * memset(pPager-
18b31 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f >aHash, 0, sizeo
18b32 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 f(pPager->aHash)
18b33 29 3b 20 2a 2f 0d 0a 0d 0a 20 20 2a 70 70 50 61 ); */.... *ppPa
18b34 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0d 0a 20 ger = pPager;..
18b35 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
18b36 4b 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 0d K;..}......../*.
18b37 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
18b38 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 n is called afte
18b39 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 r transitioning
18b3a 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 from PAGER_UNLOC
18b3b 4b 20 74 6f 0d 0a 2a 2a 20 50 41 47 45 52 5f 53 K to..** PAGER_S
18b3c 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 HARED state. It
18b3d 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 tests if there i
18b3e 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 s a hot journal
18b3f 70 72 65 73 65 6e 74 20 69 6e 0d 0a 2a 2a 20 74 present in..** t
18b40 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 he file-system f
18b41 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 or the given pag
18b42 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 er. A hot journa
18b43 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0d 0a l is one that ..
18b44 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 ** needs to be p
18b45 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f layed back. Acco
18b46 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 rding to this fu
18b47 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f nction, a hot-jo
18b48 75 72 6e 61 6c 0d 0a 2a 2a 20 66 69 6c 65 20 65 urnal..** file e
18b49 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c xists if the fol
18b4a 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 lowing criteria
18b4b 61 72 65 20 6d 65 74 3a 0d 0a 2a 2a 0d 0a 2a 2a are met:..**..**
18b4c 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c * The journal
18b4d 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 file exists in
18b4e 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c the file system,
18b4f 20 61 6e 64 0d 0a 2a 2a 20 20 20 2a 20 4e 6f 20 and..** * No
18b50 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 process holds a
18b51 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 RESERVED or grea
18b52 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 ter lock on the
18b53 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 database file, a
18b54 6e 64 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 nd..** * The d
18b55 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 atabase file its
18b56 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 elf is greater t
18b57 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 han 0 bytes in s
18b58 69 7a 65 2c 20 61 6e 64 0d 0a 2a 2a 20 20 20 2a ize, and..** *
18b59 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 The first byte
18b5a 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 of the journal f
18b5b 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 ile exists and i
18b5c 73 20 6e 6f 74 20 30 78 30 30 2e 0d 0a 2a 2a 0d s not 0x00...**.
18b5d 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 .** If the curre
18b5e 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 nt size of the d
18b5f 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 atabase file is
18b60 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 0 but a journal
18b61 66 69 6c 65 0d 0a 2a 2a 20 65 78 69 73 74 73 2c file..** exists,
18b62 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c that is probabl
18b63 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c y an old journal
18b64 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 left over from
18b65 61 20 70 72 69 6f 72 0d 0a 2a 2a 20 64 61 74 61 a prior..** data
18b66 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 base with the sa
18b67 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 me name. In this
18b68 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 case the journa
18b69 6c 20 66 69 6c 65 20 69 73 0d 0a 2a 2a 20 6a 75 l file is..** ju
18b6a 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 st deleted using
18b6b 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 OsDelete, *pExi
18b6c 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 sts is set to 0
18b6d 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a and SQLITE_OK..*
18b6e 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a * is returned...
18b6f 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
18b70 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 ine does not che
18b71 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 ck if there is a
18b72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
18b73 66 69 6c 65 6e 61 6d 65 0d 0a 2a 2a 20 61 74 20 filename..** at
18b74 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 the end of the f
18b75 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 ile. If there is
18b76 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 , and that maste
18b77 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0d 0a r journal file..
18b78 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 ** does not exis
18b79 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 t, then the jour
18b7a 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 nal file is not
18b7b 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 really hot. In t
18b7c 68 69 73 0d 0a 2a 2a 20 63 61 73 65 20 74 68 69 his..** case thi
18b7d 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 s routine will r
18b7e 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f eturn a false-po
18b7f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 sitive. The page
18b80 72 5f 70 6c 61 79 62 61 63 6b 28 29 0d 0a 2a 2a r_playback()..**
18b81 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 routine will di
18b82 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 scover that the
18b83 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 journal file is
18b84 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 not really hot a
18b85 6e 64 20 0d 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 nd ..** will not
18b86 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0d roll it back. .
18b87 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 68 6f 74 .**..** If a hot
18b88 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 -journal file is
18b89 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c found to exist,
18b8a 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 *pExists is set
18b8b 20 74 6f 20 31 20 61 6e 64 20 0d 0a 2a 2a 20 53 to 1 and ..** S
18b8c 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 QLITE_OK returne
18b8d 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 d. If no hot-jou
18b8e 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 rnal file is pre
18b8f 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 sent, *pExists i
18b90 73 0d 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 s..** set to 0 a
18b91 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 nd SQLITE_OK ret
18b92 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 urned. If an IO
18b93 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 error occurs whi
18b94 6c 65 20 74 72 79 69 6e 67 0d 0a 2a 2a 20 74 6f le trying..** to
18b95 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 determine wheth
18b96 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d er or not a hot-
18b97 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 journal file exi
18b98 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f sts, the IO erro
18b99 72 0d 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 r..** code is re
18b9a 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 turned and the v
18b9b 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 alue of *pExists
18b9c 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0d 0a is undefined...
18b9d 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 68 */..static int h
18b9e 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 asHotJournal(Pag
18b9f 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 er *pPager, int
18ba0 2a 70 45 78 69 73 74 73 29 7b 0d 0a 20 20 73 71 *pExists){.. sq
18ba1 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 lite3_vfs * cons
18ba2 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d t pVfs = pPager-
18ba3 3e 70 56 66 73 3b 0d 0a 20 20 69 6e 74 20 72 63 >pVfs;.. int rc
18ba4 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 = SQLITE_OK;
18ba5 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
18ba6 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 n code */.. int
18ba7 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 exists = 1;
18ba8 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
18ba9 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 ue if a journal
18baa 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 file is present
18bab 2a 2f 0d 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 */.. int jrnlOp
18bac 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 en = !!isOpen(pP
18bad 61 67 65 72 2d 3e 6a 66 64 29 3b 0d 0a 0d 0a 20 ager->jfd);....
18bae 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
18baf 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0d 0a >useJournal );..
18bb0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e assert( isOpen
18bb1 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0d (pPager->fd) );.
18bb2 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 . assert( pPage
18bb3 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
18bb4 5f 4f 50 45 4e 20 29 3b 0d 0a 0d 0a 20 20 61 73 _OPEN );.... as
18bb5 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d sert( jrnlOpen==
18bb6 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 0 || ( sqlite3Os
18bb7 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 DeviceCharacteri
18bb8 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 stics(pPager->jf
18bb9 64 29 20 26 0d 0a 20 20 20 20 53 51 4c 49 54 45 d) &.. SQLITE
18bba 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 _IOCAP_UNDELETAB
18bbb 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0d 0a 20 20 LE_WHEN_OPEN..
18bbc 29 29 3b 0d 0a 0d 0a 20 20 2a 70 45 78 69 73 74 ));.... *pExist
18bbd 73 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 21 6a s = 0;.. if( !j
18bbe 72 6e 6c 4f 70 65 6e 20 29 7b 0d 0a 20 20 20 20 rnlOpen ){..
18bbf 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 rc = sqlite3OsAc
18bc0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 cess(pVfs, pPage
18bc1 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c r->zJournal, SQL
18bc2 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 ITE_ACCESS_EXIST
18bc3 53 2c 20 26 65 78 69 73 74 73 29 3b 0d 0a 20 20 S, &exists);..
18bc4 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c }.. if( rc==SQL
18bc5 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 ITE_OK && exists
18bc6 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6c 6f 63 ){.. int loc
18bc7 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 ked = 0;
18bc8 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
18bc9 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c some process hol
18bca 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f ds a RESERVED lo
18bcb 63 6b 20 2a 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 ck */.... /*
18bcc 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 Race condition h
18bcd 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 ere: Another pr
18bce 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 ocess might have
18bcf 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 been holding th
18bd0 65 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 e.. ** the RE
18bd1 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 SERVED lock and
18bd2 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f have a journal o
18bd3 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 pen at the sqlit
18bd4 65 33 4f 73 41 63 63 65 73 73 28 29 20 0d 0a 20 e3OsAccess() ..
18bd5 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 ** call above
18bd6 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 , but then delet
18bd7 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e e the journal an
18bd8 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 d drop the lock
18bd9 62 65 66 6f 72 65 0d 0a 20 20 20 20 2a 2a 20 77 before.. ** w
18bda 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c e get to the fol
18bdb 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 lowing sqlite3Os
18bdc 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
18bdd 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 k() call. If th
18bde 61 74 0d 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 at.. ** is th
18bdf 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 e case, this rou
18be0 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b tine might think
18be1 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 there is a hot
18be2 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0d 0a 20 20 journal when..
18be3 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 ** in fact the
18be4 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 re is none. Thi
18be5 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 s results in a f
18be6 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 alse-positive wh
18be7 69 63 68 20 77 69 6c 6c 0d 0a 20 20 20 20 2a 2a ich will.. **
18be8 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 be dealt with b
18be9 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 y the playback r
18bea 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 outine. Ticket
18beb 23 33 38 38 33 2e 0d 0a 20 20 20 20 2a 2f 0d 0a #3883... */..
18bec 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
18bed 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c OsCheckReservedL
18bee 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 ock(pPager->fd,
18bef 26 6c 6f 63 6b 65 64 29 3b 0d 0a 20 20 20 20 69 &locked);.. i
18bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
18bf1 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0d 0a && !locked ){..
18bf2 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 Pgno nPage
18bf3 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
18bf4 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 /* Number of p
18bf5 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 ages in database
18bf6 20 66 69 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 20 20 file */....
18bf7 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 /* Check the s
18bf8 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 ize of the datab
18bf9 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 ase file. If it
18bfa 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 consists of 0 pa
18bfb 67 65 73 2c 0d 0a 20 20 20 20 20 20 2a 2a 20 74 ges,.. ** t
18bfc 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a hen delete the j
18bfd 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 ournal file. See
18bfe 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d the header comm
18bff 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0d 0a ent above for ..
18c00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 ** the rea
18c01 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 soning here. De
18c02 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 lete the obsolet
18c03 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 e journal file u
18c04 6e 64 65 72 0d 0a 20 20 20 20 20 20 2a 2a 20 61 nder.. ** a
18c05 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 RESERVED lock t
18c06 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e o avoid race con
18c07 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 ditions and to a
18c08 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0d 0a void violating..
18c09 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 ** [H33020
18c0a 5d 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 ]... */..
18c0b 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 rc = pagerPa
18c0c 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 gecount(pPager,
18c0d 26 6e 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 &nPage);..
18c0e 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
18c0f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 K ){.. if
18c10 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0d 0a 20 ( nPage==0 ){..
18c11 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
18c12 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f BeginBenignMallo
18c13 63 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 c();..
18c14 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 if( pagerLockDb(
18c15 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 pPager, RESERVED
18c16 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f _LOCK)==SQLITE_O
18c17 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 K ){..
18c18 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 sqlite3OsDelet
18c19 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e e(pVfs, pPager->
18c1a 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0d 0a 20 zJournal, 0);..
18c1b 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 if( !
18c1c 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 pPager->exclusiv
18c1d 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c eMode ) pagerUnl
18c1e 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 ockDb(pPager, SH
18c1f 41 52 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 ARED_LOCK);..
18c20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
18c21 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 sqlite3EndBe
18c22 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0d 0a 20 nignMalloc();..
18c23 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 }else{..
18c24 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
18c25 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 journal file exi
18c26 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 sts and no other
18c27 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 connection has
18c28 61 20 72 65 73 65 72 76 65 64 0d 0a 20 20 20 20 a reserved..
18c29 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 ** or grea
18c2a 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 ter lock on the
18c2b 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e database file. N
18c2c 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 ow check that th
18c2d 65 72 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 ere is..
18c2e 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e ** at least on
18c2f 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 e non-zero bytes
18c30 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 at the start of
18c31 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
18c32 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a e... **
18c33 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 If there is, th
18c34 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 en we consider t
18c35 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 his journal to b
18c36 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0d e hot. If not, .
18c37 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 . ** it
18c38 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e can be ignored.
18c39 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a .. */..
18c3a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a if( !j
18c3b 72 6e 6c 4f 70 65 6e 20 29 7b 0d 0a 20 20 20 20 rnlOpen ){..
18c3c 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 int f =
18c3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 SQLITE_OPEN_READ
18c3e 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e ONLY|SQLITE_OPEN
18c3f 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0d 0a _MAIN_JOURNAL;..
18c40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d rc =
18c41 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 sqlite3OsOpen(p
18c42 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f Vfs, pPager->zJo
18c43 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a urnal, pPager->j
18c44 66 64 2c 20 66 2c 20 26 66 29 3b 0d 0a 20 20 20 fd, f, &f);..
18c45 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
18c46 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
18c47 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
18c48 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d u8 first =
18c49 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 0;..
18c4a 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 rc = sqlite3OsR
18c4b 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c ead(pPager->jfd,
18c4c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c (void *)&first,
18c4d 20 31 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 1, 0);..
18c4e 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
18c4f 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f ITE_IOERR_SHORT_
18c50 52 45 41 44 20 29 7b 0d 0a 20 20 20 20 20 20 20 READ ){..
18c51 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
18c52 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 TE_OK;..
18c53 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 }..
18c54 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e if( !jrnlOpen
18c55 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ){..
18c56 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 sqlite3OsClos
18c57 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0d e(pPager->jfd);.
18c58 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a . }..
18c59 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 *pEx
18c5a 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 ists = (first!=0
18c5b 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 );.. }e
18c5c 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 lse if( rc==SQLI
18c5d 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0d 0a TE_CANTOPEN ){..
18c5e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
18c5f 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e f we cannot open
18c60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f the rollback jo
18c61 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 urnal file in or
18c62 64 65 72 20 74 6f 20 73 65 65 20 69 66 0d 0a 20 der to see if..
18c63 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 ** it
18c64 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 s has a zero hea
18c65 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 der, that might
18c66 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f be due to an I/O
18c67 20 65 72 72 6f 72 2c 20 6f 72 0d 0a 20 20 20 20 error, or..
18c68 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 ** it mi
18c69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 ght be due to th
18c6a 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e e race condition
18c6b 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 described above
18c6c 20 61 6e 64 20 69 6e 0d 0a 20 20 20 20 20 20 20 and in..
18c6d 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 ** ticket #
18c6e 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 3883. Either wa
18c6f 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 y, assume that t
18c70 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f he journal is ho
18c71 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 t...
18c72 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 ** This might be
18c73 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 a false positiv
18c74 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 e. But if it is
18c75 2c 20 74 68 65 6e 20 74 68 65 0d 0a 20 20 20 20 , then the..
18c76 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d ** autom
18c77 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 atic journal pla
18c78 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 yback and recove
18c79 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c ry mechanism wil
18c7a 6c 20 64 65 61 6c 0d 0a 20 20 20 20 20 20 20 20 l deal..
18c7b 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 ** with it u
18c7c 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 nder an EXCLUSIV
18c7d 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 E lock where we
18c7e 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0d 0a do not need to..
18c7f 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 ** w
18c80 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 orry so much wit
18c81 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e h race condition
18c82 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 s...
18c83 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 */..
18c84 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0d 0a 20 *pExists = 1;..
18c85 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 rc =
18c86 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 SQLITE_OK;..
18c87 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
18c88 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 }.. }..
18c89 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 }.. }.... ret
18c8a 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
18c8b 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
18c8c 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 on is called to
18c8d 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 obtain a shared
18c8e 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 lock on the data
18c8f 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 49 base file...** I
18c90 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 t is illegal to
18c91 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 call sqlite3Page
18c92 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c rAcquire() until
18c93 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 after this func
18c94 74 69 6f 6e 0d 0a 2a 2a 20 68 61 73 20 62 65 65 tion..** has bee
18c95 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 n successfully c
18c96 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 alled. If a shar
18c97 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 ed-lock is alrea
18c98 64 79 20 68 65 6c 64 20 77 68 65 6e 0d 0a 2a 2a dy held when..**
18c99 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
18c9a 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 s called, it is
18c9b 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a a no-op...**..**
18c9c 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f The following o
18c9d 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c perations are al
18c9e 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 so performed by
18c9f 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a this function...
18ca0 2a 2a 0d 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 **..** 1) If t
18ca1 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 he pager is curr
18ca2 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f ently in PAGER_O
18ca3 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f PEN state (no lo
18ca4 63 6b 20 68 65 6c 64 0d 0a 2a 2a 20 20 20 20 20 ck held..**
18ca5 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
18ca6 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 file), then an
18ca7 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 attempt is made
18ca8 74 6f 20 6f 62 74 61 69 6e 20 61 0d 0a 2a 2a 20 to obtain a..**
18ca9 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b SHARED lock
18caa 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
18cab 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 file. Immediate
18cac 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 ly after obtaini
18cad 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 ng..** the
18cae 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 SHARED lock, the
18caf 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 file-system is
18cb0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f checked for a ho
18cb1 74 2d 6a 6f 75 72 6e 61 6c 2c 0d 0a 2a 2a 20 20 t-journal,..**
18cb2 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 which is pla
18cb3 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 yed back if pres
18cb4 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 ent. Following a
18cb5 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0d ny hot-journal .
18cb6 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 .** rollbac
18cb7 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 k, the contents
18cb8 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 of the cache are
18cb9 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 validated by ch
18cba 65 63 6b 69 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 ecking..**
18cbb 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e the 'change-coun
18cbc 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 ter' field of th
18cbd 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
18cbe 68 65 61 64 65 72 20 61 6e 64 0d 0a 2a 2a 20 20 header and..**
18cbf 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 discarded if
18cc0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 they are found
18cc1 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0d 0a to be invalid...
18cc2 2a 2a 0d 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 **..** 2) If t
18cc3 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e he pager is runn
18cc4 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 ing in exclusive
18cc5 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 -mode, and there
18cc6 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0d 0a are currently..
18cc7 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 ** no outst
18cc8 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 anding reference
18cc9 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 s to any pages,
18cca 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 and is in the er
18ccb 72 6f 72 20 73 74 61 74 65 2c 0d 0a 2a 2a 20 20 ror state,..**
18ccc 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 then an atte
18ccd 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 mpt is made to c
18cce 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 lear the error s
18ccf 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 tate by discardi
18cd0 6e 67 0d 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 ng..** the
18cd1 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
18cd2 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 page cache and r
18cd3 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 olling back any
18cd4 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a open journal..**
18cd5 20 20 20 20 20 20 66 69 6c 65 2e 0d 0a 2a 2a 0d file...**.
18cd6 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e .** If everythin
18cd7 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c g is successful,
18cd8 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 SQLITE_OK is re
18cd9 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f turned. If an IO
18cda 20 65 72 72 6f 72 20 0d 0a 2a 2a 20 6f 63 63 75 error ..** occu
18cdb 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 rs while locking
18cdc 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 the database, c
18cdd 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f hecking for a ho
18cde 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f t-journal file o
18cdf 72 20 0d 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 r ..** rolling b
18ce0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 ack a journal fi
18ce1 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 le, the IO error
18ce2 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 code is returne
18ce3 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 d...*/..SQLITE_P
18ce4 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
18ce5 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 e3PagerSharedLoc
18ce6 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 k(Pager *pPager)
18ce7 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 {.. int rc = SQ
18ce8 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
18ce9 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
18cea 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 2f n code */.... /
18ceb 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
18cec 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 s only called fr
18ced 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e om b-tree and on
18cee 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 ly when there ar
18cef 65 20 6e 6f 0d 0a 20 20 2a 2a 20 6f 75 74 73 74 e no.. ** outst
18cf0 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 anding pages. Th
18cf1 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 is implies that
18cf2 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 the pager state
18cf3 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0d 0a 20 should either..
18cf4 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 ** be OPEN or R
18cf5 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 EADER. READER is
18cf6 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 only possible i
18cf7 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f f the pager is o
18cf8 72 20 77 61 73 20 69 6e 20 0d 0a 20 20 2a 2a 20 r was in .. **
18cf9 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 exclusive access
18cfa 20 6d 6f 64 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 mode... */..
18cfb 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 assert( sqlite3P
18cfc 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 cacheRefCount(pP
18cfd 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d ager->pPCache)==
18cfe 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 0 );.. assert(
18cff 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 assert_pager_sta
18d00 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 te(pPager) );..
18d01 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
18d02 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f >eState==PAGER_O
18d03 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 PEN || pPager->e
18d04 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 State==PAGER_REA
18d05 44 45 52 20 29 3b 0d 0a 20 20 69 66 28 20 4e 45 DER );.. if( NE
18d06 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 VER(MEMDB && pPa
18d07 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b ger->errCode) ){
18d08 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e return pPager->
18d09 65 72 72 43 6f 64 65 3b 20 7d 0d 0a 0d 0a 20 20 errCode; }....
18d0a 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c if( !pagerUseWal
18d0b 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 (pPager) && pPag
18d0c 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 er->eState==PAGE
18d0d 52 5f 4f 50 45 4e 20 29 7b 0d 0a 20 20 20 20 69 R_OPEN ){.. i
18d0e 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d nt bHotJournal =
18d0f 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 1; /*
18d10 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 True if there ex
18d11 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e ists a hot journ
18d12 61 6c 2d 66 69 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 al-file */....
18d13 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 assert( !MEMDB
18d14 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
18d15 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c pPager->noReadl
18d16 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 ock==0 || pPager
18d17 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0d 0a 0d ->readOnly );...
18d18 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d . if( pPager-
18d19 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 >noReadlock==0 )
18d1a 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 {.. rc = pa
18d1b 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b ger_wait_on_lock
18d1c 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f (pPager, SHARED_
18d1d 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 20 20 69 66 LOCK);.. if
18d1e 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
18d1f 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 ){.. asse
18d20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 rt( pPager->eLoc
18d21 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 k==NO_LOCK || pP
18d22 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b ager->eLock==UNK
18d23 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 NOWN_LOCK );..
18d24 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 goto faile
18d25 64 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 d;.. }..
18d26 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 20 }.... /* If
18d27 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 a journal file e
18d28 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 xists, and there
18d29 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 is no RESERVED
18d2a 6c 6f 63 6b 20 6f 6e 20 74 68 65 0d 0a 20 20 20 lock on the..
18d2b 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c ** database fil
18d2c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 e, then it eithe
18d2d 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c r needs to be pl
18d2e 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c ayed back or del
18d2f 65 74 65 64 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 eted... */..
18d30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 if( pPager->e
18d31 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 Lock<=SHARED_LOC
18d32 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d K ){.. rc =
18d33 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 hasHotJournal(p
18d34 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 Pager, &bHotJour
18d35 6e 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 nal);.. }..
18d36 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
18d37 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f _OK ){.. go
18d38 74 6f 20 66 61 69 6c 65 64 3b 0d 0a 20 20 20 20 to failed;..
18d39 7d 0d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a }.. if( bHotJ
18d3a 6f 75 72 6e 61 6c 20 29 7b 0d 0a 20 20 20 20 20 ournal ){..
18d3b 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 /* Get an EXCLU
18d3c 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 SIVE lock on the
18d3d 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 database file.
18d3e 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 At this point it
18d3f 20 69 73 0d 0a 20 20 20 20 20 20 2a 2a 20 69 6d is.. ** im
18d40 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 portant that a R
18d41 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 ESERVED lock is
18d42 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 not obtained on
18d43 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0d 0a the way to the..
18d44 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 ** EXCLUSI
18d45 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 VE lock. If it w
18d46 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f ere, another pro
18d47 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 cess might open
18d48 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 64 61 the.. ** da
18d49 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 tabase file, det
18d4a 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 ect the RESERVED
18d4b 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c lock, and concl
18d4c 75 64 65 20 74 68 61 74 20 74 68 65 0d 0a 20 20 ude that the..
18d4d 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 ** database
18d4e 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 is safe to read
18d4f 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 while this proce
18d50 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c ss is still roll
18d51 69 6e 67 20 74 68 65 20 0d 0a 20 20 20 20 20 20 ing the ..
18d52 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 ** hot-journal b
18d53 61 63 6b 2e 0d 0a 20 20 20 20 20 20 2a 2a 20 0d ack... ** .
18d54 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 . ** Becaus
18d55 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 e the intermedia
18d56 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b te RESERVED lock
18d57 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 is not requeste
18d58 64 2c 20 61 6e 79 0d 0a 20 20 20 20 20 20 2a 2a d, any.. **
18d59 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 other process a
18d5a 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 ttempting to acc
18d5b 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 ess the database
18d5c 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 file will get t
18d5d 6f 20 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 o .. ** thi
18d5e 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 s point in the c
18d5f 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 ode and fail to
18d60 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 obtain its own E
18d61 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0d 0a XCLUSIVE lock ..
18d62 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 ** on the
18d63 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a database file...
18d64 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 **..
18d65 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 ** Unless the pa
18d66 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e ger is in lockin
18d67 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 g_mode=exclusive
18d68 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 mode, the lock
18d69 69 73 0d 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 is.. ** dow
18d6a 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 ngraded to SHARE
18d6b 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 D_LOCK before th
18d6c 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
18d6d 72 6e 73 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a rns... */..
18d6e 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 rc = pager
18d6f 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 LockDb(pPager, E
18d70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0d XCLUSIVE_LOCK);.
18d71 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
18d72 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
18d73 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 goto failed
18d74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 0d 0a 20 ;.. }.. ..
18d75 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 /* If it is
18d76 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 not already ope
18d77 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 n and the file e
18d78 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f xists on disk, o
18d79 70 65 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20 pen the ..
18d7a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 ** journal for r
18d7b 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 ead/write access
18d7c 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 . Write access i
18d7d 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 s required becau
18d7e 73 65 20 0d 0a 20 20 20 20 20 20 2a 2a 20 69 6e se .. ** in
18d7f 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 exclusive-acces
18d80 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 s mode the file
18d81 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 descriptor will
18d82 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0d 0a 20 be kept open ..
18d83 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 ** and poss
18d84 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 ibly used for a
18d85 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 transaction late
18d86 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 r on. Also, writ
18d87 65 2d 61 63 63 65 73 73 20 0d 0a 20 20 20 20 20 e-access ..
18d88 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 ** is usually r
18d89 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c equired to final
18d8a 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 ize the journal
18d8b 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d in journal_mode=
18d8c 70 65 72 73 69 73 74 20 0d 0a 20 20 20 20 20 20 persist ..
18d8d 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 ** mode (and als
18d8e 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f o for journal_mo
18d8f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 de=truncate on s
18d90 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0d 0a 20 ome systems)...
18d91 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a **.. *
18d92 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c * If the journal
18d93 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c does not exist,
18d94 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e it usually mean
18d95 73 20 74 68 61 74 20 73 6f 6d 65 20 0d 0a 20 20 s that some ..
18d96 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e ** other con
18d97 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 nection managed
18d98 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f to get in and ro
18d99 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 ll it back befor
18d9a 65 20 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 e .. ** thi
18d9b 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 s connection obt
18d9c 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 ained the exclus
18d9d 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 ive lock above.
18d9e 4f 72 2c 20 69 74 20 0d 0a 20 20 20 20 20 20 2a Or, it .. *
18d9f 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 * may mean that
18da0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e the pager was in
18da1 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 the error-state
18da2 20 77 68 65 6e 20 74 68 69 73 0d 0a 20 20 20 20 when this..
18da3 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 ** function wa
18da4 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 s called and the
18da5 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f journal file do
18da6 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 es not exist...
18da7 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 */.. i
18da8 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 f( !isOpen(pPage
18da9 72 2d 3e 6a 66 64 29 20 29 7b 0d 0a 20 20 20 20 r->jfd) ){..
18daa 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 sqlite3_vfs
18dab 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 * const pVfs = p
18dac 50 61 67 65 72 2d 3e 70 56 66 73 3b 0d 0a 20 20 Pager->pVfs;..
18dad 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 int bExist
18dae 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s;
18daf 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e /* True if journ
18db0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a al file exists *
18db1 2f 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 /.. rc =
18db2 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 sqlite3OsAccess(
18db3 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 .. pV
18db4 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 fs, pPager->zJou
18db5 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 rnal, SQLITE_ACC
18db6 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 ESS_EXISTS, &bEx
18db7 69 73 74 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 ists);..
18db8 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
18db9 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0d K && bExists ){.
18dba 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 . int f
18dbb 6f 75 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 out = 0;..
18dbc 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 int f = SQLI
18dbd 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 TE_OPEN_READWRIT
18dbe 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 E|SQLITE_OPEN_MA
18dbf 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0d 0a 20 20 20 IN_JOURNAL;..
18dc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 assert( !
18dc1 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 pPager->tempFile
18dc2 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 );.. r
18dc3 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 c = sqlite3OsOpe
18dc4 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e n(pVfs, pPager->
18dc5 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 zJournal, pPager
18dc6 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 ->jfd, f, &fout)
18dc7 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 ;.. ass
18dc8 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f ert( rc!=SQLITE_
18dc9 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 OK || isOpen(pPa
18dca 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0d 0a 20 20 ger->jfd) );..
18dcb 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
18dcc 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 SQLITE_OK && fou
18dcd 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 t&SQLITE_OPEN_RE
18dce 41 44 4f 4e 4c 59 20 29 7b 0d 0a 20 20 20 20 20 ADONLY ){..
18dcf 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
18dd0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 TE_CANTOPEN_BKPT
18dd1 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ;.. s
18dd2 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 qlite3OsClose(pP
18dd3 61 67 65 72 2d 3e 6a 66 64 29 3b 0d 0a 20 20 20 ager->jfd);..
18dd4 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
18dd5 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 0d }.. }.. .
18dd6 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 . /* Playba
18dd7 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 ck and delete th
18dd8 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 e journal. Drop
18dd9 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 the database wr
18dda 69 74 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6c 6f ite.. ** lo
18ddb 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 ck and reacquire
18ddc 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 the read lock.
18ddd 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 Purge the cache
18dde 62 65 66 6f 72 65 0d 0a 20 20 20 20 20 20 2a 2a before.. **
18ddf 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 playing back th
18de0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f e hot-journal so
18de1 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 that we don't e
18de2 6e 64 20 75 70 20 77 69 74 68 0d 0a 20 20 20 20 nd up with..
18de3 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 ** an inconsis
18de4 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e tent cache. Syn
18de5 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 c the hot journa
18de6 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 l before playing
18de7 0d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 .. ** it ba
18de8 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f ck since the pro
18de9 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 cess that crashe
18dea 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 d and left the h
18deb 6f 74 20 6a 6f 75 72 6e 61 6c 0d 0a 20 20 20 20 ot journal..
18dec 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 ** probably di
18ded 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e d not sync it an
18dee 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 d we are require
18def 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 d to always sync
18df0 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a .. ** the j
18df1 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c ournal before pl
18df2 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0d 0a aying it back...
18df3 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 */..
18df4 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 if( isOpen(pPage
18df5 72 2d 3e 6a 66 64 29 20 29 7b 0d 0a 20 20 20 20 r->jfd) ){..
18df6 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d assert( rc==
18df7 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 SQLITE_OK );..
18df8 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 rc = pager
18df9 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 SyncHotJournal(p
18dfa 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 Pager);..
18dfb 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
18dfc 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 OK ){..
18dfd 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 rc = pager_play
18dfe 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b back(pPager, 1);
18dff 0d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 .. pPag
18e00 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 er->eState = PAG
18e01 45 52 5f 4f 50 45 4e 3b 0d 0a 20 20 20 20 20 20 ER_OPEN;..
18e02 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }.. }else
18e03 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 if( !pPager->ex
18e04 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0d 0a clusiveMode ){..
18e05 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c pagerUnl
18e06 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 ockDb(pPager, SH
18e07 41 52 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 ARED_LOCK);..
18e08 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 }.... if
18e09 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
18e0a 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 ){.. /* T
18e0b 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 his branch is ta
18e0c 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ken if an error
18e0d 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 occurs while try
18e0e 69 6e 67 20 74 6f 20 6f 70 65 6e 0d 0a 20 20 20 ing to open..
18e0f 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 ** or roll
18e10 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e back a hot-journ
18e11 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 al while holding
18e12 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f an EXCLUSIVE lo
18e13 63 6b 2e 20 54 68 65 0d 0a 20 20 20 20 20 20 20 ck. The..
18e14 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b ** pager_unlock
18e15 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 () routine will
18e16 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 be called before
18e17 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e returning to un
18e18 6c 6f 63 6b 0d 0a 20 20 20 20 20 20 20 20 2a 2a lock.. **
18e19 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 the file. If th
18e1a 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 e unlock attempt
18e1b 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 fails, then Pag
18e1c 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 er.eLock must be
18e1d 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 .. ** set
18e1e 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b to UNKNOWN_LOCK
18e1f 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e (see the commen
18e20 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 t above the #def
18e21 69 6e 65 20 66 6f 72 20 0d 0a 20 20 20 20 20 20 ine for ..
18e22 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 ** UNKNOWN_LOC
18e23 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 K above for an e
18e24 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0d 0a 20 xplanation). ..
18e25 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 **..
18e26 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 ** In order t
18e27 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f o get pager_unlo
18e28 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c ck() to do this,
18e29 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 set Pager.eStat
18e2a 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 2a 2a e to.. **
18e2b 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 PAGER_ERROR now
18e2c 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 . This is not ac
18e2d 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 tually counted a
18e2e 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0d 0a s a transition..
18e2f 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 ** to ER
18e30 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 ROR state in the
18e31 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 state diagram a
18e32 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 t the top of thi
18e33 73 20 66 69 6c 65 2c 0d 0a 20 20 20 20 20 20 20 s file,..
18e34 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f ** since we kno
18e35 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 w that the same
18e36 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e call to pager_un
18e37 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 lock() will very
18e38 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f .. ** sho
18e39 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 rtly transition
18e3a 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 the pager object
18e3b 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 to the OPEN sta
18e3c 74 65 2e 20 43 61 6c 6c 69 6e 67 0d 0a 20 20 20 te. Calling..
18e3d 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 ** assert_p
18e3e 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 ager_state() wou
18e3f 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 ld fail now, as
18e40 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 it should not be
18e41 20 70 6f 73 73 69 62 6c 65 0d 0a 20 20 20 20 20 possible..
18e42 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 ** to be in E
18e43 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 RROR state when
18e44 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f there are zero o
18e45 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 utstanding page
18e46 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 .. ** ref
18e47 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 erences...
18e48 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 70 61 */.. pa
18e49 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 ger_error(pPager
18e4a 2c 20 72 63 29 3b 0d 0a 20 20 20 20 20 20 20 20 , rc);..
18e4b 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0d 0a 20 20 goto failed;..
18e4c 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 61 }.... a
18e4d 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 ssert( pPager->e
18e4e 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 State==PAGER_OPE
18e4f 4e 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 N );.. asse
18e50 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f rt( (pPager->eLo
18e51 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 ck==SHARED_LOCK)
18e52 0d 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 .. ||
18e53 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 (pPager->exclusi
18e54 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 veMode && pPager
18e55 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c ->eLock>SHARED_L
18e56 4f 43 4b 29 0d 0a 20 20 20 20 20 20 29 3b 0d 0a OCK).. );..
18e57 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 }.... if(
18e58 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 !pPager->tempFi
18e59 6c 65 20 0d 0a 20 20 20 20 20 26 26 20 28 70 50 le .. && (pP
18e5a 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c ager->pBackup ||
18e5b 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 sqlite3PcachePa
18e5c 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e gecount(pPager->
18e5d 70 50 43 61 63 68 65 29 3e 30 29 20 0d 0a 20 20 pPCache)>0) ..
18e5e 20 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 ){.. /* T
18e5f 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 he shared-lock h
18e60 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 as just been acq
18e61 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 uired on the dat
18e62 61 62 61 73 65 20 66 69 6c 65 0d 0a 20 20 20 20 abase file..
18e63 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 ** and there a
18e64 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 re already pages
18e65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 in the cache (f
18e66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0d 0a rom a previous..
18e67 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 ** read or
18e68 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 write transacti
18e69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 on). Check to s
18e6a 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 ee if the databa
18e6b 73 65 0d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 se.. ** has
18e6c 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 been modified.
18e6d 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 If the database
18e6e 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c has changed, fl
18e6f 75 73 68 20 74 68 65 0d 0a 20 20 20 20 20 20 2a ush the.. *
18e70 2a 20 63 61 63 68 65 2e 0d 0a 20 20 20 20 20 20 * cache...
18e71 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 **.. ** Dat
18e72 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 abase changes is
18e73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f detected by loo
18e74 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 king at 15 bytes
18e75 20 62 65 67 69 6e 6e 69 6e 67 0d 0a 20 20 20 20 beginning..
18e76 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 ** at offset 2
18e77 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 4 into the file.
18e78 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 The first 4 of
18e79 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 these 16 bytes
18e7a 61 72 65 0d 0a 20 20 20 20 20 20 2a 2a 20 61 20 are.. ** a
18e7b 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 32-bit counter t
18e7c 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 hat is increment
18e7d 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 ed with each cha
18e7e 6e 67 65 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 nge. The..
18e7f 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 ** other bytes
18e80 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 change randomly
18e81 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 with each file c
18e82 68 61 6e 67 65 20 77 68 65 6e 0d 0a 20 20 20 20 hange when..
18e83 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 ** a codec is
18e84 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 2a in use... *
18e85 2a 20 0d 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 * .. ** The
18e86 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e re is a vanishin
18e87 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 gly small chance
18e88 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 that a change w
18e89 69 6c 6c 20 6e 6f 74 20 62 65 20 0d 0a 20 20 20 ill not be ..
18e8a 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 ** detected.
18e8b 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 The chance of a
18e8c 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 n undetected cha
18e8d 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 nge is so small
18e8e 74 68 61 74 0d 0a 20 20 20 20 20 20 2a 2a 20 69 that.. ** i
18e8f 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 t can be neglect
18e90 65 64 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 ed... */..
18e91 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 Pgno nPage
18e92 3d 20 30 3b 0d 0a 20 20 20 20 20 20 63 68 61 72 = 0;.. char
18e93 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 dbFileVers[size
18e94 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c of(pPager->dbFil
18e95 65 56 65 72 73 29 5d 3b 0d 0a 0d 0a 20 20 20 20 eVers)];....
18e96 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 rc = pagerPage
18e97 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e count(pPager, &n
18e98 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 Page);.. if
18e99 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c ( rc ) goto fail
18e9a 65 64 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28 ed;.... if(
18e9b 20 6e 50 61 67 65 3e 30 20 29 7b 0d 0a 20 20 20 nPage>0 ){..
18e9c 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 IOTRACE(("C
18e9d 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 KVERS %p %d\n",
18e9e 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 pPager, sizeof(d
18e9f 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0d 0a 20 bFileVers)));..
18ea0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
18ea1 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 te3OsRead(pPager
18ea2 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 ->fd, &dbFileVer
18ea3 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 s, sizeof(dbFile
18ea4 56 65 72 73 29 2c 20 32 34 29 3b 0d 0a 20 20 20 Vers), 24);..
18ea5 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
18ea6 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
18ea7 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 goto failed
18ea8 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
18ea9 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
18eaa 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c memset(dbFil
18eab 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 eVers, 0, sizeof
18eac 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0d 0a (dbFileVers));..
18ead 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 }....
18eae 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 if( memcmp(pPag
18eaf 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 er->dbFileVers,
18eb0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 dbFileVers, size
18eb1 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 of(dbFileVers))!
18eb2 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 =0 ){.. p
18eb3 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 ager_reset(pPage
18eb4 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 r);.. }..
18eb5 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 }.... /* If
18eb6 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 there is a WAL
18eb7 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 file in the file
18eb8 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 -system, open th
18eb9 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 is database in W
18eba 41 4c 0d 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e AL.. ** mode.
18ebb 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 Otherwise, the
18ebc 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 following functi
18ebd 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d on call is a no-
18ebe 6f 70 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 op... */..
18ebf 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 rc = pagerOpenW
18ec0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 alIfPresent(pPag
18ec1 65 72 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 er);..#ifndef SQ
18ec2 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 20 LITE_OMIT_WAL..
18ec3 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 assert( pPage
18ec4 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 r->pWal==0 || rc
18ec5 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a ==SQLITE_OK );..
18ec6 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 #endif.. }....
18ec7 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c if( pagerUseWal
18ec8 28 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 20 (pPager) ){..
18ec9 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
18eca 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 72 ITE_OK );.. r
18ecb 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 c = pagerBeginRe
18ecc 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 adTransaction(pP
18ecd 61 67 65 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 ager);.. }....
18ece 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 if( pPager->eSt
18ecf 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 ate==PAGER_OPEN
18ed0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b && rc==SQLITE_OK
18ed1 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 70 61 ){.. rc = pa
18ed2 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 gerPagecount(pPa
18ed3 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 ger, &pPager->db
18ed4 53 69 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 Size);.. }....
18ed5 66 61 69 6c 65 64 3a 0d 0a 20 20 69 66 28 20 72 failed:.. if( r
18ed6 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
18ed7 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 . assert( !ME
18ed8 4d 44 42 20 29 3b 0d 0a 20 20 20 20 70 61 67 65 MDB );.. page
18ed9 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 r_unlock(pPager)
18eda 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
18edb 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 Pager->eState==P
18edc 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0d 0a 20 20 AGER_OPEN );..
18edd 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 50 61 67 }else{.. pPag
18ede 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 er->eState = PAG
18edf 45 52 5f 52 45 41 44 45 52 3b 0d 0a 20 20 7d 0d ER_READER;.. }.
18ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
18ee1 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 ..../*..** If th
18ee2 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e e reference coun
18ee3 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 t has reached ze
18ee4 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 ro, rollback any
18ee5 20 61 63 74 69 76 65 0d 0a 2a 2a 20 74 72 61 6e active..** tran
18ee6 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f saction and unlo
18ee7 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0d 0a 2a ck the pager...*
18ee8 2a 0d 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e *..** Except, in
18ee9 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 locking_mode=EX
18eea 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 CLUSIVE when the
18eeb 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f re is nothing to
18eec 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c in..** the roll
18eed 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 back journal, th
18eee 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 e unlock is not
18eef 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 performed and th
18ef0 65 72 65 20 69 73 0d 0a 2a 2a 20 6e 6f 74 68 69 ere is..** nothi
18ef1 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 ng to rollback,
18ef2 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 so this routine
18ef3 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 20 is a no-op...*/
18ef4 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 ..static void pa
18ef5 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 gerUnlockIfUnuse
18ef6 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 d(Pager *pPager)
18ef7 7b 0d 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 {.. if( (sqlite
18ef8 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 3PcacheRefCount(
18ef9 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 pPager->pPCache)
18efa 3d 3d 30 29 20 29 7b 0d 0a 20 20 20 20 70 61 67 ==0) ){.. pag
18efb 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 erUnlockAndRollb
18efc 61 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 ack(pPager);..
18efd 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 }..}..../*..** A
18efe 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e cquire a referen
18eff 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 ce to page numbe
18f00 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 r pgno in pager
18f01 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0d 0a pPager (a page..
18f02 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 ** reference has
18f03 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 type DbPage*).
18f04 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 If the requested
18f05 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0d 0a reference is ..
18f06 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 ** successfully
18f07 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 obtained, it is
18f08 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 copied to *ppPag
18f09 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 e and SQLITE_OK
18f0a 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a returned...**..*
18f0b 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 * If the request
18f0c 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 ed page is alrea
18f0d 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c dy in the cache,
18f0e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e it is returned.
18f0f 20 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c ..** Otherwise,
18f10 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 a new page obje
18f11 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 ct is allocated
18f12 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 and populated wi
18f13 74 68 20 64 61 74 61 0d 0a 2a 2a 20 72 65 61 64 th data..** read
18f14 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 from the databa
18f15 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 se file. In some
18f16 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 cases, the pcac
18f17 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0d 0a 2a he module may..*
18f18 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 * choose not to
18f19 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 allocate a new p
18f1a 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d age object and m
18f1b 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 ay reuse an exis
18f1c 74 69 6e 67 0d 0a 2a 2a 20 6f 62 6a 65 63 74 20 ting..** object
18f1d 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 with no outstand
18f1e 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0d ing references..
18f1f 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 65 78 74 72 .**..** The extr
18f20 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 a data appended
18f21 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 to a page is alw
18f22 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 ays initialized
18f23 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0d 0a 2a to zeros the ..*
18f24 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 * first time a p
18f25 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e age is loaded in
18f26 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 to memory. If th
18f27 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 e page requested
18f28 20 69 73 20 0d 0a 2a 2a 20 61 6c 72 65 61 64 79 is ..** already
18f29 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 in the cache wh
18f2a 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e en this function
18f2b 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e is called, then
18f2c 20 74 68 65 20 65 78 74 72 61 0d 0a 2a 2a 20 64 the extra..** d
18f2d 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 ata is left as i
18f2e 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 t was when the p
18f2f 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c age object was l
18f30 61 73 74 20 75 73 65 64 2e 0d 0a 2a 2a 0d 0a 2a ast used...**..*
18f31 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 * If the databas
18f32 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c e image is small
18f33 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 er than the requ
18f34 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 ested page or if
18f35 20 61 20 0d 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f a ..** non-zero
18f36 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 value is passed
18f37 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e as the noConten
18f38 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 t parameter and
18f39 74 68 65 20 0d 0a 2a 2a 20 72 65 71 75 65 73 74 the ..** request
18f3a 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 ed page is not a
18f3b 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e lready stored in
18f3c 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e the cache, then
18f3d 20 6e 6f 20 0d 0a 2a 2a 20 61 63 74 75 61 6c 20 no ..** actual
18f3e 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 disk read occurs
18f3f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 . In this case t
18f40 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 he memory image
18f41 6f 66 20 74 68 65 20 0d 0a 2a 2a 20 70 61 67 65 of the ..** page
18f42 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 is initialized
18f43 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0d 0a to all zeros. ..
18f44 2a 2a 0d 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 **..** If noCont
18f45 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 ent is true, it
18f46 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f means that we do
18f47 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 not care about
18f48 74 68 65 20 63 6f 6e 74 65 6e 74 73 0d 0a 2a 2a the contents..**
18f49 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 of the page. Th
18f4a 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f is occurs in two
18f4b 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 seperate scenar
18f4c 69 6f 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 61 ios:..**..** a
18f4d 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 ) When reading a
18f4e 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 free-list leaf
18f4f 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 page from the da
18f50 74 61 62 61 73 65 2c 20 61 6e 64 0d 0a 2a 2a 0d tabase, and..**.
18f51 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 .** b) When a
18f52 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 savepoint is bei
18f53 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 ng rolled back a
18f54 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f nd we need to lo
18f55 61 64 0d 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 ad..** a ne
18f56 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 w page into the
18f57 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c cache to be fill
18f58 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 ed with the data
18f59 20 72 65 61 64 0d 0a 2a 2a 20 20 20 20 20 20 66 read..** f
18f5a 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e rom the savepoin
18f5b 74 20 6a 6f 75 72 6e 61 6c 2e 0d 0a 2a 2a 0d 0a t journal...**..
18f5c 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 ** If noContent
18f5d 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 is true, then th
18f5e 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 e data returned
18f5f 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 is zeroed instea
18f60 64 20 6f 66 0d 0a 2a 2a 20 62 65 69 6e 67 20 72 d of..** being r
18f61 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 ead from the dat
18f62 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 abase. Additiona
18f63 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f lly, the bits co
18f64 72 72 65 73 70 6f 6e 64 69 6e 67 0d 0a 2a 2a 20 rresponding..**
18f65 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 to pgno in Pager
18f66 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 .pInJournal (bit
18f67 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 vec of pages alr
18f68 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 eady written to
18f69 74 68 65 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 the..** journal
18f6a 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 file) and the Pa
18f6b 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e gerSavepoint.pIn
18f6c 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 Savepoint bitvec
18f6d 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0d 0a 2a s of any open..*
18f6e 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 * savepoints are
18f6f 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 set. This means
18f70 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 if the page is
18f71 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 made writable at
18f72 20 61 6e 79 0d 0a 2a 2a 20 70 6f 69 6e 74 20 69 any..** point i
18f73 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 n the future, us
18f74 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 ing a call to sq
18f75 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 lite3PagerWrite(
18f76 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0d ), its contents.
18f77 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 .** will not be
18f78 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 journaled. This
18f79 73 61 76 65 73 20 49 4f 2e 0d 0a 2a 2a 0d 0a 2a saves IO...**..*
18f7a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f * The acquisitio
18f7b 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 n might fail for
18f7c 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 several reasons
18f7d 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c . In all cases,
18f7e 0d 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 ..** an appropri
18f7f 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 ate error code i
18f80 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a s returned and *
18f81 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f ppPage is set to
18f82 20 4e 55 4c 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 NULL...**..** S
18f83 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 ee also sqlite3P
18f84 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 agerLookup(). B
18f85 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 oth this routine
18f86 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 and Lookup() at
18f87 74 65 6d 70 74 0d 0a 2a 2a 20 74 6f 20 66 69 6e tempt..** to fin
18f88 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 d a page in the
18f89 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 in-memory cache
18f8a 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 first. If the p
18f8b 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 age is not alrea
18f8c 64 79 0d 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 dy..** in memory
18f8d 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 , this routine g
18f8e 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 oes to disk to r
18f8f 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 ead it in wherea
18f90 73 20 4c 6f 6f 6b 75 70 28 29 0d 0a 2a 2a 20 6a s Lookup()..** j
18f91 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 ust returns 0.
18f92 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 This routine acq
18f93 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 uires a read-loc
18f94 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 k the first time
18f95 20 69 74 0d 0a 2a 2a 20 68 61 73 20 74 6f 20 67 it..** has to g
18f96 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 o to disk, and c
18f97 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 ould also playba
18f98 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 ck an old journa
18f99 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d l if necessary..
18f9a 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 .** Since Lookup
18f9b 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f () never goes to
18f9c 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 disk, it never
18f9d 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 has to deal with
18f9e 20 6c 6f 63 6b 73 0d 0a 2a 2a 20 6f 72 20 6a 6f locks..** or jo
18f9f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0d 0a 2a 2f urnal files...*/
18fa0 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
18fa1 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
18fa2 72 41 63 71 75 69 72 65 28 0d 0a 20 20 50 61 67 rAcquire(.. Pag
18fa3 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 er *pPager,
18fa4 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 /* The pager op
18fa5 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 en on the databa
18fa6 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 50 67 se file */.. Pg
18fa7 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 no pgno,
18fa8 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 /* Page number
18fa9 20 74 6f 20 66 65 74 63 68 20 2a 2f 0d 0a 20 20 to fetch */..
18faa 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c DbPage **ppPage,
18fab 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 /* Write a p
18fac 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 ointer to the pa
18fad 67 65 20 68 65 72 65 20 2a 2f 0d 0a 20 20 69 6e ge here */.. in
18fae 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 t noContent
18faf 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 /* Do not both
18fb0 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 er reading conte
18fb1 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 nt from disk if
18fb2 74 72 75 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 true */..){.. i
18fb3 6e 74 20 72 63 3b 0d 0a 20 20 50 67 48 64 72 20 nt rc;.. PgHdr
18fb4 2a 70 50 67 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 *pPg;.... asser
18fb5 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 t( pPager->eStat
18fb6 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 e>=PAGER_READER
18fb7 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 61 73 );.. assert( as
18fb8 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 sert_pager_state
18fb9 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 0d 0a 20 (pPager) );....
18fba 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0d if( pgno==0 ){.
18fbb 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
18fbc 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
18fbd 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 .. }.... /* If
18fbe 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e the pager is in
18fbf 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 the error state
18fc0 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f , return an erro
18fc1 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0d r immediately. .
18fc2 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c . ** Otherwise,
18fc3 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 request the pag
18fc4 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 e from the PCach
18fc5 65 20 6c 61 79 65 72 2e 20 2a 2f 0d 0a 20 20 69 e layer. */.. i
18fc6 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f f( pPager->errCo
18fc7 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b de!=SQLITE_OK ){
18fc8 0d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 .. rc = pPage
18fc9 72 2d 3e 65 72 72 43 6f 64 65 3b 0d 0a 20 20 7d r->errCode;.. }
18fca 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 20 3d 20 else{.. rc =
18fcb 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 sqlite3PcacheFet
18fcc 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 ch(pPager->pPCac
18fcd 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 he, pgno, 1, ppP
18fce 61 67 65 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 age);.. }....
18fcf 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
18fd0 4b 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 45 69 74 K ){.. /* Eit
18fd1 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 her the call to
18fd2 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 sqlite3PcacheFet
18fd3 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e ch() returned an
18fd4 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0d 0a 20 error or the..
18fd5 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 ** pager was
18fd6 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 already in the e
18fd7 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 rror-state when
18fd8 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 this function wa
18fd9 73 20 63 61 6c 6c 65 64 2e 0d 0a 20 20 20 20 2a s called... *
18fda 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 * Set pPg to 0 a
18fdb 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 nd jump to the e
18fdc 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 xception handler
18fdd 2e 20 20 2a 2f 0d 0a 20 20 20 20 70 50 67 20 3d . */.. pPg =
18fde 20 30 3b 0d 0a 20 20 20 20 67 6f 74 6f 20 70 61 0;.. goto pa
18fdf 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b ger_acquire_err;
18fe0 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
18fe1 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f (*ppPage)->pgno
18fe2 3d 3d 70 67 6e 6f 20 29 3b 0d 0a 20 20 61 73 73 ==pgno );.. ass
18fe3 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e ert( (*ppPage)->
18fe4 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c pPager==pPager |
18fe5 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 | (*ppPage)->pPa
18fe6 67 65 72 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69 ger==0 );.... i
18fe7 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 f( (*ppPage)->pP
18fe8 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 ager && !noConte
18fe9 6e 74 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 6e nt ){.. /* In
18fea 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 this case the p
18feb 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f cache already co
18fec 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 ntains an initia
18fed 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0d 0a 20 lized copy of..
18fee 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 ** the page.
18fef 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 Return without f
18ff0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0d urther ado. */.
18ff1 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e . assert( pgn
18ff2 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e o<=PAGER_MAX_PGN
18ff3 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 O && pgno!=PAGER
18ff4 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 _MJ_PGNO(pPager)
18ff5 20 29 3b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d );.. pPager-
18ff6 3e 6e 48 69 74 2b 2b 3b 0d 0a 20 20 20 20 72 65 >nHit++;.. re
18ff7 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
18ff8 0a 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ... }else{..
18ff9 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 /* The pager ca
18ffa 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 che has created
18ffb 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 a new page. Its
18ffc 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f content needs to
18ffd 20 0d 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 .. ** be ini
18ffe 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0d 0a 0d tialized. */...
18fff 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 . pPg = *ppPa
19000 67 65 3b 0d 0a 20 20 20 20 70 50 67 2d 3e 70 50 ge;.. pPg->pP
19001 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0d 0a ager = pPager;..
19002 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 .. /* The max
19003 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 imum page number
19004 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e is 2^31. Return
19005 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 SQLITE_CORRUPT
19006 69 66 20 61 20 70 61 67 65 0d 0a 20 20 20 20 2a if a page.. *
19007 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 * number greater
19008 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 than this, or t
19009 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e he unused lockin
1900a 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 g-page, is reque
1900b 73 74 65 64 2e 20 2a 2f 0d 0a 20 20 20 20 69 66 sted. */.. if
1900c 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 ( pgno>PAGER_MAX
1900d 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 _PGNO || pgno==P
1900e 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 AGER_MJ_PGNO(pPa
1900f 67 65 72 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 ger) ){.. r
19010 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 c = SQLITE_CORRU
19011 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 PT_BKPT;..
19012 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 goto pager_acqui
19013 72 65 5f 65 72 72 3b 0d 0a 20 20 20 20 7d 0d 0a re_err;.. }..
19014 0d 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 .. if( MEMDB
19015 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a || pPager->dbSiz
19016 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 e<pgno || noCont
19017 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 ent || !isOpen(p
19018 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0d 0a 20 Pager->fd) ){..
19019 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 if( pgno>pP
1901a 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0d ager->mxPgno ){.
1901b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 . rc = SQ
1901c 4c 49 54 45 5f 46 55 4c 4c 3b 0d 0a 20 20 20 20 LITE_FULL;..
1901d 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 goto pager_a
1901e 63 71 75 69 72 65 5f 65 72 72 3b 0d 0a 20 20 20 cquire_err;..
1901f 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 }.. if(
19020 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0d 0a 20 20 noContent ){..
19021 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 /* Failure
19022 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 to set the bits
19023 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 in the InJourna
19024 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 l bit-vectors is
19025 20 62 65 6e 69 67 6e 2e 0d 0a 20 20 20 20 20 20 benign...
19026 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d ** It merely m
19027 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 eans that we mig
19028 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 ht do some extra
19029 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c work to journal
1902a 20 61 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 a .. **
1902b 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e page that does n
1902c 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f ot need to be jo
1902d 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 urnaled. Nevert
1902e 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 heless, be sure
1902f 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 .. ** to
19030 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 test the case wh
19031 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 ere a malloc err
19032 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 or occurs while
19033 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0d 0a trying to set ..
19034 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 ** a bit
19035 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 in a bit vector
19036 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 ... */..
19037 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 sqlite3Be
19038 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 ginBenignMalloc(
19039 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 );.. if(
1903a 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 pgno<=pPager->db
1903b 4f 72 69 67 53 69 7a 65 20 29 7b 0d 0a 20 20 20 OrigSize ){..
1903c 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 TESTONLY(
1903d 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 rc = ) sqlite3B
1903e 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d itvecSet(pPager-
1903f 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e >pInJournal, pgn
19040 6f 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 o);.. t
19041 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c estcase( rc==SQL
19042 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 ITE_NOMEM );..
19043 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
19044 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 TESTONLY( rc =
19045 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 ) addToSavepoint
19046 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 Bitvecs(pPager,
19047 70 67 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 20 20 pgno);..
19048 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 testcase( rc==SQ
19049 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 LITE_NOMEM );..
1904a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e sqlite3En
1904b 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b dBenignMalloc();
1904c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
1904d 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 memset(pPg->pDa
1904e 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 ta, 0, pPager->p
1904f 61 67 65 53 69 7a 65 29 3b 0d 0a 20 20 20 20 20 ageSize);..
19050 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 IOTRACE(("ZERO
19051 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 %p %d\n", pPager
19052 2c 20 70 67 6e 6f 29 29 3b 0d 0a 20 20 20 20 7d , pgno));.. }
19053 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 73 73 else{.. ass
19054 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 ert( pPg->pPager
19055 3d 3d 70 50 61 67 65 72 20 29 3b 0d 0a 20 20 20 ==pPager );..
19056 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 pPager->nMiss
19057 2b 2b 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 ++;.. rc =
19058 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b readDbPage(pPg);
19059 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d .. if( rc!=
1905a 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1905b 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 goto pager
1905c 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0d 0a 20 _acquire_err;..
1905d 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 }.. }..
1905e 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 pager_set_pag
1905f 65 68 61 73 68 28 70 50 67 29 3b 0d 0a 20 20 7d ehash(pPg);.. }
19060 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c .... return SQL
19061 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 70 61 67 65 72 ITE_OK;....pager
19062 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0d 0a 20 _acquire_err:..
19063 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c assert( rc!=SQL
19064 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 69 66 28 ITE_OK );.. if(
19065 20 70 50 67 20 29 7b 0d 0a 20 20 20 20 73 71 6c pPg ){.. sql
19066 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 ite3PcacheDrop(p
19067 50 67 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 61 67 Pg);.. }.. pag
19068 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 erUnlockIfUnused
19069 28 70 50 61 67 65 72 29 3b 0d 0a 0d 0a 20 20 2a (pPager);.... *
1906a 70 70 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 72 ppPage = 0;.. r
1906b 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1906c 2f 2a 0d 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 /*..** Acquire a
1906d 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 page if it is a
1906e 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e lready in the in
1906f 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 -memory cache.
19070 44 6f 0d 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 Do..** not read
19071 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 the page from di
19072 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f sk. Return a po
19073 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 inter to the pag
19074 65 2c 0d 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 e,..** or 0 if t
19075 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 he page is not i
19076 6e 20 63 61 63 68 65 2e 20 0d 0a 2a 2a 0d 0a 2a n cache. ..**..*
19077 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 * See also sqlit
19078 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 e3PagerGet(). T
19079 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 he difference be
1907a 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 tween this routi
1907b 6e 65 0d 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 ne..** and sqlit
1907c 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 e3PagerGet() is
1907d 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c that _get() will
1907e 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 go to the disk
1907f 61 6e 64 20 72 65 61 64 0d 0a 2a 2a 20 69 6e 20 and read..** in
19080 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 the page if the
19081 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 page is not alre
19082 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 ady in cache. T
19083 68 69 73 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 his routine..**
19084 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 returns NULL if
19085 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 the page is not
19086 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 in cache or if a
19087 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 disk I/O error
19088 0d 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 ..** has ever ha
19089 70 70 65 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c ppened...*/..SQL
1908a 49 54 45 5f 50 52 49 56 41 54 45 20 44 62 50 61 ITE_PRIVATE DbPa
1908b 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 ge *sqlite3Pager
1908c 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 Lookup(Pager *pP
1908d 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 ager, Pgno pgno)
1908e 7b 0d 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 {.. PgHdr *pPg
1908f 3d 20 30 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 = 0;.. assert(
19090 70 50 61 67 65 72 21 3d 30 20 29 3b 0d 0a 20 20 pPager!=0 );..
19091 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 assert( pgno!=0
19092 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 );.. assert( pP
19093 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 ager->pPCache!=0
19094 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
19095 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 Pager->eState>=P
19096 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 AGER_READER && p
19097 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 Pager->eState!=P
19098 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0d 0a 20 AGER_ERROR );..
19099 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 sqlite3PcacheFe
1909a 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 tch(pPager->pPCa
1909b 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 che, pgno, 0, &p
1909c 50 67 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 Pg);.. return p
1909d 50 67 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a Pg;..}..../*..**
1909e 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 Release a page
1909f 72 65 66 65 72 65 6e 63 65 2e 0d 0a 2a 2a 0d 0a reference...**..
190a0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 ** If the number
190a1 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 of references t
190a2 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 o the page drop
190a3 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 to zero, then th
190a4 65 0d 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 e..** page is ad
190a5 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c ded to the LRU l
190a6 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 ist. When all r
190a7 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c eferences to all
190a8 20 70 61 67 65 73 0d 0a 2a 2a 20 61 72 65 20 72 pages..** are r
190a9 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 eleased, a rollb
190aa 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 ack occurs and t
190ab 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 he lock on the d
190ac 61 74 61 62 61 73 65 20 69 73 0d 0a 2a 2a 20 72 atabase is..** r
190ad 65 6d 6f 76 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c emoved...*/..SQL
190ae 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
190af 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 sqlite3PagerUnr
190b0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b ef(DbPage *pPg){
190b1 0d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0d 0a .. if( pPg ){..
190b2 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 Pager *pPage
190b3 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b r = pPg->pPager;
190b4 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 .. sqlite3Pca
190b5 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b cheRelease(pPg);
190b6 0d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 .. pagerUnloc
190b7 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 kIfUnused(pPager
190b8 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a );.. }..}..../*
190b9 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
190ba 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 on is called at
190bb 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 the start of eve
190bc 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 ry write transac
190bd 74 69 6f 6e 2e 0d 0a 2a 2a 20 54 68 65 72 65 20 tion...** There
190be 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 must already be
190bf 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 a RESERVED or EX
190c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 CLUSIVE lock on
190c1 74 68 65 20 64 61 74 61 62 61 73 65 20 0d 0a 2a the database ..*
190c2 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 * file when this
190c3 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
190c4 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 70 65 6e ed...**..** Open
190c5 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
190c6 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 e for pager pPag
190c7 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a er and write a j
190c8 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0d 0a 2a ournal header..*
190c9 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f * to the start o
190ca 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 f it. If there a
190cb 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f re active savepo
190cc 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 ints, open the s
190cd 75 62 2d 6a 6f 75 72 6e 61 6c 0d 0a 2a 2a 20 61 ub-journal..** a
190ce 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e s well. This fun
190cf 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 ction is only us
190d0 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 ed when the jour
190d1 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e nal file is bein
190d2 67 20 0d 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f g ..** opened to
190d3 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 write a rollbac
190d4 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e k log for a tran
190d5 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e saction. It is n
190d6 6f 74 20 75 73 65 64 20 0d 0a 2a 2a 20 77 68 65 ot used ..** whe
190d7 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 n opening a hot
190d8 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 journal file to
190d9 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0d 0a 2a roll it back...*
190da 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 *..** If the jou
190db 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 rnal file is alr
190dc 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 eady open (as it
190dd 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 may be in exclu
190de 73 69 76 65 20 6d 6f 64 65 29 2c 0d 0a 2a 2a 20 sive mode),..**
190df 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 then this functi
190e0 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 on just writes a
190e1 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 journal header
190e2 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 to the start of
190e3 74 68 65 0d 0a 2a 2a 20 61 6c 72 65 61 64 79 20 the..** already
190e4 6f 70 65 6e 20 66 69 6c 65 2e 20 0d 0a 2a 2a 0d open file. ..**.
190e5 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e .** Whether or n
190e6 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 ot the journal f
190e7 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 ile is opened by
190e8 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 this function,
190e9 74 68 65 0d 0a 2a 2a 20 50 61 67 65 72 2e 70 49 the..** Pager.pI
190ea 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 nJournal bitvec
190eb 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c structure is all
190ec 6f 63 61 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ocated...**..**
190ed 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b Return SQLITE_OK
190ee 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 if everything i
190ef 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 s successful. Ot
190f0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 herwise, return
190f1 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 ..** SQLITE_NOME
190f2 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 M if the attempt
190f3 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 to allocate Pag
190f4 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 er.pInJournal fa
190f5 69 6c 73 2c 20 6f 72 20 0d 0a 2a 2a 20 61 6e 20 ils, or ..** an
190f6 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IO error code if
190f7 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 opening or writ
190f8 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 ing the journal
190f9 66 69 6c 65 20 66 61 69 6c 73 2e 0d 0a 2a 2f 0d file fails...*/.
190fa 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 .static int page
190fb 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 r_open_journal(P
190fc 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a ager *pPager){..
190fd 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
190fe 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 E_OK;
190ff 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
19100 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
19101 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 sqlite3_vfs *
19102 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 const pVfs = pPa
19103 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 ger->pVfs; /*
19104 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 Local cache of v
19105 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a 0d fs pointer */...
19106 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 . assert( pPage
19107 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
19108 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 _WRITER_LOCKED )
19109 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 ;.. assert( ass
1910a 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 ert_pager_state(
1910b 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 61 73 pPager) );.. as
1910c 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 sert( pPager->pI
1910d 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0d 0a nJournal==0 );..
1910e 20 20 0d 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 .. /* If alre
1910f 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 ady in the error
19110 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e state, this fun
19111 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 ction is a no-op
19112 2e 20 20 42 75 74 20 6f 6e 0d 0a 20 20 2a 2a 20 . But on.. **
19113 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 the other hand,
19114 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
19115 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 never called if
19116 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 we are already i
19117 6e 0d 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 n.. ** an error
19118 20 73 74 61 74 65 2e 20 2a 2f 0d 0a 20 20 69 66 state. */.. if
19119 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e ( NEVER(pPager->
1911a 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 errCode) ) retur
1911b 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 n pPager->errCod
1911c 65 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 70 61 67 e;.... if( !pag
1911d 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 erUseWal(pPager)
1911e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 && pPager->jour
1911f 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a nalMode!=PAGER_J
19120 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 OURNALMODE_OFF )
19121 7b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 {.. pPager->p
19122 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 InJournal = sqli
19123 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 te3BitvecCreate(
19124 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b pPager->dbSize);
19125 0d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 .. if( pPager
19126 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 ->pInJournal==0
19127 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
19128 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a SQLITE_NOMEM;..
19129 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 2f }.. .. /
1912a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e * Open the journ
1912b 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 al file if it is
1912c 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 not already ope
1912d 6e 2e 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 21 n. */.. if( !
1912e 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a isOpen(pPager->j
1912f 66 64 29 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 fd) ){.. if
19130 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 ( pPager->journa
19131 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 lMode==PAGER_JOU
19132 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 RNALMODE_MEMORY
19133 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){.. sqli
19134 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 te3MemJournalOpe
19135 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0d n(pPager->jfd);.
19136 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 . }else{..
19137 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 const int
19138 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 flags =
19139 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 /* VF
1913a 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 S flags to open
1913b 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0d journal file */.
1913c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 . SQLIT
1913d 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 E_OPEN_READWRITE
1913e 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 |SQLITE_OPEN_CRE
1913f 41 54 45 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 ATE|..
19140 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c (pPager->tempFil
19141 65 20 3f 20 0d 0a 20 20 20 20 20 20 20 20 20 20 e ? ..
19142 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 (SQLITE_OPEN_D
19143 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c ELETEONCLOSE|SQL
19144 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f ITE_OPEN_TEMP_JO
19145 55 52 4e 41 4c 29 3a 0d 0a 20 20 20 20 20 20 20 URNAL):..
19146 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 (SQLITE_OPE
19147 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0d N_MAIN_JOURNAL).
19148 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 . );..
19149 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 #ifdef SQLITE_E
1914a 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 NABLE_ATOMIC_WRI
1914b 54 45 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d TE.. rc =
1914c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f sqlite3JournalO
1914d 70 65 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 pen(..
1914e 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e pVfs, pPager->
1914f 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 zJournal, pPager
19150 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 ->jfd, flags, jr
19151 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 nlBufferSize(pPa
19152 67 65 72 29 0d 0a 20 20 20 20 20 20 20 20 29 3b ger).. );
19153 0d 0a 20 20 23 65 6c 73 65 0d 0a 20 20 20 20 20 .. #else..
19154 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f rc = sqlite3O
19155 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 sOpen(pVfs, pPag
19156 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 er->zJournal, pP
19157 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 ager->jfd, flags
19158 2c 20 30 29 3b 0d 0a 20 20 23 65 6e 64 69 66 0d , 0);.. #endif.
19159 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1915a 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 assert( rc!=SQLI
1915b 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 TE_OK || isOpen(
1915c 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0d pPager->jfd) );.
1915d 0a 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 20 0d 0a . }.. .. ..
1915e 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 /* Write the
1915f 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 first journal h
19160 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 eader to the jou
19161 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 rnal file and op
19162 65 6e 20 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 en .. ** the
19163 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e sub-journal if n
19164 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 2a ecessary... *
19165 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 /.. if( rc==S
19166 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
19167 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 /* TODO: Chec
19168 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 k if all of thes
19169 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 e are really req
1916a 75 69 72 65 64 2e 20 2a 2f 0d 0a 20 20 20 20 20 uired. */..
1916b 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 pPager->nRec =
1916c 30 3b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 0;.. pPager
1916d 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 ->journalOff = 0
1916e 3b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d ;.. pPager-
1916f 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0d >setMaster = 0;.
19170 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a . pPager->j
19171 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0d 0a ournalHdr = 0;..
19172 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 rc = write
19173 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 JournalHdr(pPage
19174 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d r);.. }.. }.
19175 0a 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c ... if( rc!=SQL
19176 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73 ITE_OK ){.. s
19177 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 qlite3BitvecDest
19178 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a roy(pPager->pInJ
19179 6f 75 72 6e 61 6c 29 3b 0d 0a 20 20 20 20 70 50 ournal);.. pP
1917a 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c ager->pInJournal
1917b 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d = 0;.. }else{.
1917c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 . assert( pPa
1917d 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 ger->eState==PAG
1917e 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 ER_WRITER_LOCKED
1917f 20 29 3b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d );.. pPager-
19180 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f >eState = PAGER_
19181 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b WRITER_CACHEMOD;
19182 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 .. }.... retur
19183 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
19184 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 ** Begin a write
19185 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 -transaction on
19186 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 the specified pa
19187 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 ger object. If a
19188 20 0d 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e ..** write-tran
19189 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 saction has alre
1918a 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c ady been opened,
1918b 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
1918c 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a s a no-op...**..
1918d 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 ** If the exFlag
1918e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c argument is fal
1918f 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 se, then acquire
19190 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 at least a RESE
19191 52 56 45 44 0d 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e RVED..** lock on
19192 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
19193 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 le. If exFlag is
19194 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 true, then acqu
19195 69 72 65 20 61 74 20 6c 65 61 73 74 0d 0a 2a 2a ire at least..**
19196 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f an EXCLUSIVE lo
19197 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f ck. If such a lo
19198 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 ck is already he
19199 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0d ld, no locking .
1919a 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 .** functions ne
1919b 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0d 0a 2a ed be called...*
1919c 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 *..** If the sub
1919d 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 jInMemory argume
1919e 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 nt is non-zero,
1919f 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 then any sub-jou
191a0 72 6e 61 6c 20 6f 70 65 6e 65 64 0d 0a 2a 2a 20 rnal opened..**
191a1 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e within this tran
191a2 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 saction will be
191a3 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d opened as an in-
191a4 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 memory file. Thi
191a5 73 0d 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 s..** has no eff
191a6 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a ect if the sub-j
191a7 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 ournal is alread
191a8 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 y opened (as it
191a9 6d 61 79 20 62 65 20 77 68 65 6e 0d 0a 2a 2a 20 may be when..**
191aa 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 running in exclu
191ab 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 sive mode) or if
191ac 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
191ad 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 does not requir
191ae 65 20 61 0d 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 e a..** sub-jour
191af 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a nal. If the subj
191b0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e InMemory argumen
191b1 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 t is zero, then
191b2 61 6e 79 20 72 65 71 75 69 72 65 64 0d 0a 2a 2a any required..**
191b3 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 sub-journal is
191b4 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d implemented in-m
191b5 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 emory if pPager
191b6 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 is an in-memory
191b7 64 61 74 61 62 61 73 65 2c 20 0d 0a 2a 2a 20 6f database, ..** o
191b8 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 r using a tempor
191b9 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 ary file otherwi
191ba 73 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f se...*/..SQLITE_
191bb 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
191bc 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 te3PagerBegin(Pa
191bd 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 ger *pPager, int
191be 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 exFlag, int sub
191bf 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0d 0a 20 20 69 jInMemory){.. i
191c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
191c1 4b 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61 67 K;.... if( pPag
191c2 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 er->errCode ) re
191c3 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 turn pPager->err
191c4 43 6f 64 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 Code;.. assert(
191c5 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e pPager->eState>
191c6 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 =PAGER_READER &&
191c7 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c pPager->eState<
191c8 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0d 0a PAGER_ERROR );..
191c9 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e pPager->subjIn
191ca 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 Memory = (u8)sub
191cb 6a 49 6e 4d 65 6d 6f 72 79 3b 0d 0a 0d 0a 20 20 jInMemory;....
191cc 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 if( ALWAYS(pPage
191cd 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
191ce 5f 52 45 41 44 45 52 29 20 29 7b 0d 0a 20 20 20 _READER) ){..
191cf 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
191d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 >pInJournal==0 )
191d1 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 70 61 67 ;.... if( pag
191d2 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 erUseWal(pPager)
191d3 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 ){.. /* If
191d4 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f the pager is co
191d5 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 nfigured to use
191d6 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 locking_mode=exc
191d7 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0d 0a lusive, and an..
191d8 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 ** exclusi
191d9 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 ve lock on the d
191da 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 atabase is not a
191db 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 lready held, obt
191dc 61 69 6e 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 ain it now...
191dd 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 */.. if(
191de 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 pPager->exclusi
191df 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 veMode && sqlite
191e0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 3WalExclusiveMod
191e1 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 e(pPager->pWal,
191e2 2d 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 -1) ){..
191e3 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 rc = pagerLockDb
191e4 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 (pPager, EXCLUSI
191e5 56 45 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 20 VE_LOCK);..
191e6 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
191e7 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
191e8 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
191e9 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
191ea 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c sqlite3WalExcl
191eb 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 usiveMode(pPager
191ec 2d 3e 70 57 61 6c 2c 20 31 29 3b 0d 0a 20 20 20 ->pWal, 1);..
191ed 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a }.... /*
191ee 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 Grab the write
191ef 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 lock on the log
191f0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 file. If success
191f1 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0d ful, upgrade to.
191f2 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f . ** PAGER_
191f3 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 RESERVED state.
191f4 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 Otherwise, retur
191f5 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 n an error code
191f6 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a to the caller...
191f7 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 ** The bus
191f8 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 y-handler is not
191f9 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 invoked if anot
191fa 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 her connection a
191fb 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 2a 2a lready.. **
191fc 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 holds the write
191fd 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 -lock. If possib
191fe 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 le, the upper la
191ff 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 yer will call it
19200 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 ... */..
19201 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 rc = sqlite3W
19202 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e alBeginWriteTran
19203 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e saction(pPager->
19204 70 57 61 6c 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 pWal);.. }els
19205 65 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 e{.. /* Obt
19206 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c ain a RESERVED l
19207 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 ock on the datab
19208 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 ase file. If the
19209 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 exFlag paramete
1920a 72 0d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 r.. ** is t
1920b 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 rue, then immedi
1920c 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 ately upgrade th
1920d 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 is to an EXCLUSI
1920e 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0d 0a 20 20 VE lock. The..
1920f 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 ** busy-hand
19210 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e ler callback can
19211 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 be used when up
19212 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 grading to the E
19213 58 43 4c 55 53 49 56 45 0d 0a 20 20 20 20 20 20 XCLUSIVE..
19214 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 ** lock, but not
19215 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 when obtaining
19216 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 the RESERVED loc
19217 6b 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 k... */..
19218 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f rc = pagerLo
19219 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 ckDb(pPager, RES
1921a 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 ERVED_LOCK);..
1921b 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
1921c 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 TE_OK && exFlag
1921d 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
1921e 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c pager_wait_on_l
1921f 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c ock(pPager, EXCL
19220 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 USIVE_LOCK);..
19221 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a }.. }....
19222 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
19223 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
19224 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 /* Change to WRI
19225 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 TER_LOCKED state
19226 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 ... **..
19227 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 ** WAL mode s
19228 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 ets Pager.eState
19229 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 to PAGER_WRITER
1922a 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 _LOCKED or CACHE
1922b 4d 4f 44 0d 0a 20 20 20 20 20 20 2a 2a 20 77 68 MOD.. ** wh
1922c 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 en it has an ope
1922d 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 n transaction, b
1922e 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f ut never to DBMO
1922f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0d 0a D or FINISHED...
19230 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 ** This is
19231 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 because in thos
19232 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 e states the cod
19233 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 e to roll back s
19234 61 76 65 70 6f 69 6e 74 20 0d 0a 20 20 20 20 20 avepoint ..
19235 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 ** transactions
19236 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 may copy data f
19237 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 rom the sub-jour
19238 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 nal into the dat
19239 61 62 61 73 65 20 0d 0a 20 20 20 20 20 20 2a 2a abase .. **
1923a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 file as well as
1923b 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 into the page c
1923c 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c ache. Which woul
1923d 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 d be incorrect i
1923e 6e 20 0d 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c n .. ** WAL
1923f 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 2a 2f mode... */
19240 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e .. pPager->
19241 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 eState = PAGER_W
19242 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0d 0a 20 RITER_LOCKED;..
19243 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 pPager->dbH
19244 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 intSize = pPager
19245 2d 3e 64 62 53 69 7a 65 3b 0d 0a 20 20 20 20 20 ->dbSize;..
19246 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 pPager->dbFileS
19247 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 ize = pPager->db
19248 53 69 7a 65 3b 0d 0a 20 20 20 20 20 20 70 50 61 Size;.. pPa
19249 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 ger->dbOrigSize
1924a 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 = pPager->dbSize
1924b 3b 0d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d ;.. pPager-
1924c 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b >journalOff = 0;
1924d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 61 .. }.... a
1924e 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 ssert( rc==SQLIT
1924f 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e E_OK || pPager->
19250 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 eState==PAGER_RE
19251 41 44 45 52 20 29 3b 0d 0a 20 20 20 20 61 73 73 ADER );.. ass
19252 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f ert( rc!=SQLITE_
19253 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 OK || pPager->eS
19254 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 tate==PAGER_WRIT
19255 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0d 0a 20 20 ER_LOCKED );..
19256 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 assert( assert
19257 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 _pager_state(pPa
19258 67 65 72 29 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a ger) );.. }....
19259 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 PAGERTRACE(("T
1925a 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 RANSACTION %d\n"
1925b 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 , PAGERID(pPager
1925c 29 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 )));.. return r
1925d 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1925e 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 Mark a single da
1925f 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 ta page as write
19260 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 able. The page i
19261 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 s written into t
19262 68 65 20 0d 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 he ..** main jou
19263 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 rnal or sub-jour
19264 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e nal as required.
19265 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 If the page is
19266 77 72 69 74 74 65 6e 20 69 6e 74 6f 0d 0a 2a 2a written into..**
19267 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 one of the jour
19268 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 nals, the corres
19269 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 ponding bit is s
1926a 65 74 20 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 50 et in the ..** P
1926b 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 ager.pInJournal
1926c 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 bitvec and the P
1926d 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 agerSavepoint.pI
1926e 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 nSavepoint bitve
1926f 63 73 0d 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 cs..** of any op
19270 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 en savepoints as
19271 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0d 0a 2a appropriate...*
19272 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 /..static int pa
19273 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 ger_write(PgHdr
19274 2a 70 50 67 29 7b 0d 0a 20 20 76 6f 69 64 20 2a *pPg){.. void *
19275 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 pData = pPg->pDa
19276 74 61 3b 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 ta;.. Pager *pP
19277 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 ager = pPg->pPag
19278 65 72 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 er;.. int rc =
19279 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 SQLITE_OK;....
1927a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 /* This routine
1927b 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e is not called un
1927c 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 less a write-tra
1927d 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 nsaction has alr
1927e 65 61 64 79 20 0d 0a 20 20 2a 2a 20 62 65 65 6e eady .. ** been
1927f 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f started. The jo
19280 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f urnal file may o
19281 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 r may not be ope
19282 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e n at this point.
19283 0d 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 .. ** It is nev
19284 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 er called in the
19285 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0d 0a 20 ERROR state...
19286 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 */.. assert( p
19287 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 Pager->eState==P
19288 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b AGER_WRITER_LOCK
19289 45 44 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 ED.. || pP
1928a 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 ager->eState==PA
1928b 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 GER_WRITER_CACHE
1928c 4d 4f 44 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 MOD.. || p
1928d 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 Pager->eState==P
1928e 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f AGER_WRITER_DBMO
1928f 44 0d 0a 20 20 29 3b 0d 0a 20 20 61 73 73 65 72 D.. );.. asser
19290 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f t( assert_pager_
19291 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b state(pPager) );
19292 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 .... /* If an e
19293 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 rror has been pr
19294 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 eviously detecte
19295 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 d, report the sa
19296 6d 65 20 65 72 72 6f 72 0d 0a 20 20 2a 2a 20 61 me error.. ** a
19297 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c gain. This shoul
19298 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 d not happen, bu
19299 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 t the check prov
1929a 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e ides robustness.
1929b 20 2a 2f 0d 0a 20 20 69 66 28 20 4e 45 56 45 52 */.. if( NEVER
1929c 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 (pPager->errCode
1929d 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 ) ) return pPag
1929e 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0d 0a 0d 0a er->errCode;....
1929f 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 /* Higher-leve
192a0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 l routines never
192a1 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 call this funct
192a2 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 ion if database
192a3 69 73 20 6e 6f 74 0d 0a 20 20 2a 2a 20 77 72 69 is not.. ** wri
192a4 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 table. But chec
192a5 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 k anyway, just f
192a6 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a or robustness. *
192a7 2f 0d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 /.. if( NEVER(p
192a8 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 Pager->readOnly)
192a9 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
192aa 5f 50 45 52 4d 3b 0d 0a 0d 0a 20 20 43 48 45 43 _PERM;.... CHEC
192ab 4b 5f 50 41 47 45 28 70 50 67 29 3b 0d 0a 0d 0a K_PAGE(pPg);....
192ac 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c /* The journal
192ad 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 file needs to b
192ae 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 e opened. Higher
192af 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 level routines
192b0 68 61 76 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 have already..
192b1 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 ** obtained the
192b2 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 necessary locks
192b3 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 to begin the wri
192b4 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 te-transaction,
192b5 62 75 74 20 74 68 65 0d 0a 20 20 2a 2a 20 72 6f but the.. ** ro
192b6 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d llback journal m
192b7 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 ight not yet be
192b8 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f open. Open it no
192b9 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 w if this is the
192ba 20 63 61 73 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 case... **..
192bb 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 ** This is done
192bc 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 before calling s
192bd 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 qlite3PcacheMake
192be 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 Dirty() on the p
192bf 61 67 65 2e 20 0d 0a 20 20 2a 2a 20 4f 74 68 65 age. .. ** Othe
192c0 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 rwise, if it wer
192c1 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c e done after cal
192c2 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 ling sqlite3Pcac
192c3 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 heMakeDirty(), t
192c4 68 65 6e 0d 0a 20 20 2a 2a 20 61 6e 20 65 72 72 hen.. ** an err
192c5 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 or might occur a
192c6 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 nd the pager wou
192c7 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 ld end up in WRI
192c8 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 TER_LOCKED state
192c9 0d 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 .. ** with page
192ca 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 s marked as dirt
192cb 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0d y in the cache..
192cc 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 50 61 . */.. if( pPa
192cd 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 ger->eState==PAG
192ce 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 ER_WRITER_LOCKED
192cf 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 70 61 ){.. rc = pa
192d0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c ger_open_journal
192d1 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 69 (pPager);.. i
192d2 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
192d3 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 ) return rc;..
192d4 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 }.. assert( pP
192d5 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 ager->eState>=PA
192d6 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 GER_WRITER_CACHE
192d7 4d 4f 44 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 MOD );.. assert
192d8 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 ( assert_pager_s
192d9 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d tate(pPager) );.
192da 0a 0d 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 ... /* Mark the
192db 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 page as dirty.
192dc 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 If the page has
192dd 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 already been wr
192de 69 74 74 65 6e 0d 0a 20 20 2a 2a 20 74 6f 20 74 itten.. ** to t
192df 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 he journal then
192e0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 we can return ri
192e1 67 68 74 20 61 77 61 79 2e 0d 0a 20 20 2a 2f 0d ght away... */.
192e2 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 . sqlite3Pcache
192e3 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0d MakeDirty(pPg);.
192e4 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 . if( pageInJou
192e5 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 rnal(pPg) && !su
192e6 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 bjRequiresPage(p
192e7 50 67 29 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 Pg) ){.. asse
192e8 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c rt( !pagerUseWal
192e9 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 7d (pPager) );.. }
192ea 65 6c 73 65 7b 0d 0a 20 20 0d 0a 20 20 20 20 2f else{.. .. /
192eb 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f * The transactio
192ec 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 n journal now ex
192ed 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 ists and we have
192ee 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 a RESERVED or a
192ef 6e 0d 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 n.. ** EXCLUS
192f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 IVE lock on the
192f1 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 main database fi
192f2 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 le. Write the c
192f3 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0d 0a urrent page to..
192f4 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 ** the trans
192f5 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 action journal i
192f6 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 f it is not ther
192f7 65 20 61 6c 72 65 61 64 79 2e 0d 0a 20 20 20 20 e already...
192f8 2a 2f 0d 0a 20 20 20 20 69 66 28 20 21 70 61 67 */.. if( !pag
192f9 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 eInJournal(pPg)
192fa 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 && !pagerUseWal(
192fb 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 20 20 pPager) ){..
192fc 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 assert( pagerU
192fd 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 seWal(pPager)==0
192fe 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 );.. if( p
192ff 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 Pg->pgno<=pPager
19300 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 ->dbOrigSize &&
19301 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a isOpen(pPager->j
19302 66 64 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 fd) ){..
19303 75 33 32 20 63 6b 73 75 6d 3b 0d 0a 20 20 20 20 u32 cksum;..
19304 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 char *pData2
19305 3b 0d 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 ;.. i64 i
19306 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f Off = pPager->jo
19307 75 72 6e 61 6c 4f 66 66 3b 0d 0a 0d 0a 20 20 20 urnalOff;....
19308 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c /* We shoul
19309 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f d never write to
1930a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
1930b 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0d e the page that.
1930c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 . ** cont
1930d 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 ains the databas
1930e 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f e locks. The fo
1930f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 llowing assert v
19310 65 72 69 66 69 65 73 0d 0a 20 20 20 20 20 20 20 erifies..
19311 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e ** that we do n
19312 6f 74 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 ot. */..
19313 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e assert( pPg->pgn
19314 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f o!=PAGER_MJ_PGNO
19315 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 0d 0a 20 (pPager) );....
19316 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
19317 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 Pager->journalHd
19318 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e r<=pPager->journ
19319 61 6c 4f 66 66 20 29 3b 0d 0a 20 20 20 20 20 20 alOff );..
1931a 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c CODEC2(pPager,
1931b 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e pData, pPg->pgn
1931c 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c o, 7, return SQL
1931d 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 ITE_NOMEM, pData
1931e 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6b 73 2);.. cks
1931f 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d um = pager_cksum
19320 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 (pPager, (u8*)pD
19321 61 74 61 32 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 ata2);....
19322 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 /* Even if an
19323 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 IO or diskfull e
19324 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c rror occurs whil
19325 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 e journalling th
19326 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 e.. ** pa
19327 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 ge in the block
19328 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e above, set the n
19329 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f eed-sync flag fo
1932a 72 20 74 68 65 20 70 61 67 65 2e 0d 0a 20 20 20 r the page...
1932b 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 ** Otherwis
1932c 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e e, when the tran
1932d 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 saction is rolle
1932e 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 d back, the logi
1932f 63 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 2a 2a c in.. **
19330 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 playback_one_pa
19331 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 ge() will think
19332 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 that the page ne
19333 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 eds to be restor
19334 65 64 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 ed.. ** i
19335 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 n the database f
19336 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 ile. And if an I
19337 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 O error occurs w
19338 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0d 0a hile doing so,..
19339 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 ** then
1933a 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 corruption may f
1933b 6f 6c 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 ollow...
1933c 2a 2f 0d 0a 20 20 20 20 20 20 20 20 70 50 67 2d */.. pPg-
1933d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f >flags |= PGHDR_
1933e 4e 45 45 44 5f 53 59 4e 43 3b 0d 0a 0d 0a 20 20 NEED_SYNC;....
1933f 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 rc = write
19340 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 32bits(pPager->j
19341 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 fd, iOff, pPg->p
19342 67 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 gno);.. i
19343 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
19344 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 ) return rc;..
19345 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
19346 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 te3OsWrite(pPage
19347 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 r->jfd, pData2,
19348 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 pPager->pageSize
19349 2c 20 69 4f 66 66 2b 34 29 3b 0d 0a 20 20 20 20 , iOff+4);..
1934a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1934b 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 TE_OK ) return r
1934c 63 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d c;.. rc =
1934d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 write32bits(pPa
1934e 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 ger->jfd, iOff+p
1934f 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b Pager->pageSize+
19350 34 2c 20 63 6b 73 75 6d 29 3b 0d 0a 20 20 20 20 4, cksum);..
19351 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
19352 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 TE_OK ) return r
19353 63 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 49 4f c;.... IO
19354 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 TRACE(("JOUT %p
19355 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 %d %lld %d\n", p
19356 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f Pager, pPg->pgno
19357 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 , ..
19358 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 pPager->jou
19359 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d rnalOff, pPager-
1935a 3e 70 61 67 65 53 69 7a 65 29 29 3b 0d 0a 20 20 >pageSize));..
1935b 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 PAGER_INCR
1935c 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 (sqlite3_pager_w
1935d 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0d 0a 20 ritej_count);..
1935e 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 PAGERTRAC
1935f 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 E(("JOURNAL %d p
19360 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d age %d needSync=
19361 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 %d hash(%08x)\n"
19362 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
19363 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c PAGERID(pPager),
19364 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0d 0a 20 20 pPg->pgno, ..
19365 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 ((pPg
19366 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 ->flags&PGHDR_NE
19367 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 ED_SYNC)?1:0), p
19368 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 ager_pagehash(pP
19369 67 29 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 g)));....
1936a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
1936b 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 Off += 8 + pPage
1936c 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 r->pageSize;..
1936d 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 pPager->nR
1936e 65 63 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 61 ec++;.. a
1936f 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 ssert( pPager->p
19370 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0d InJournal!=0 );.
19371 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
19372 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 lite3BitvecSet(p
19373 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 Pager->pInJourna
19374 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0d 0a l, pPg->pgno);..
19375 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
19376 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d ( rc==SQLITE_NOM
19377 45 4d 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 EM );.. a
19378 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 ssert( rc==SQLIT
19379 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 E_OK || rc==SQLI
1937a 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 20 TE_NOMEM );..
1937b 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f rc |= addTo
1937c 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 SavepointBitvecs
1937d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 (pPager, pPg->pg
1937e 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 no);.. if
1937f 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
19380 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 73 ){.. as
19381 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 sert( rc==SQLITE
19382 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a 20 20 20 20 20 _NOMEM );..
19383 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d return rc;.
19384 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
19385 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
19386 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 if( pPager->eS
19387 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 tate!=PAGER_WRIT
19388 45 52 5f 44 42 4d 4f 44 20 29 7b 0d 0a 20 20 20 ER_DBMOD ){..
19389 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 pPg->flag
1938a 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f s |= PGHDR_NEED_
1938b 53 59 4e 43 3b 0d 0a 20 20 20 20 20 20 20 20 7d SYNC;.. }
1938c 0d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 .. PAGERT
1938d 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 RACE(("APPEND %d
1938e 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e page %d needSyn
1938f 63 3d 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 c=%d\n",..
19390 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 PAGERI
19391 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e D(pPager), pPg->
19392 70 67 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 pgno,..
19393 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 ((pPg->fla
19394 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 gs&PGHDR_NEED_SY
19395 4e 43 29 3f 31 3a 30 29 29 29 3b 0d 0a 20 20 20 NC)?1:0)));..
19396 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 0d }.. }.. .
19397 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 . /* If the s
19398 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c tatement journal
19399 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 is open and the
1939a 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 page is not in
1939b 69 74 2c 0d 0a 20 20 20 20 2a 2a 20 74 68 65 6e it,.. ** then
1939c 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 write the curre
1939d 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 nt page to the s
1939e 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c tatement journal
1939f 2e 20 20 4e 6f 74 65 20 74 68 61 74 0d 0a 20 20 . Note that..
193a0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 ** the stateme
193a1 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 nt journal forma
193a2 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 t differs from t
193a3 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 he standard jour
193a4 6e 61 6c 20 66 6f 72 6d 61 74 0d 0a 20 20 20 20 nal format..
193a5 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d ** in that it om
193a6 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d its the checksum
193a7 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 s and the header
193a8 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 ... */.. i
193a9 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 f( subjRequiresP
193aa 61 67 65 28 70 50 67 29 20 29 7b 0d 0a 20 20 20 age(pPg) ){..
193ab 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e rc = subjourn
193ac 61 6c 50 61 67 65 28 70 50 67 29 3b 0d 0a 20 20 alPage(pPg);..
193ad 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a }.. }.... /*
193ae 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 Update the data
193af 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 base size and re
193b0 74 75 72 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 turn... */.. i
193b1 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a f( pPager->dbSiz
193b2 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0d 0a e<pPg->pgno ){..
193b3 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 pPager->dbSi
193b4 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0d ze = pPg->pgno;.
193b5 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
193b6 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
193b7 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 Mark a data page
193b8 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 as writeable. T
193b9 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 his routine must
193ba 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 be called befor
193bb 65 20 0d 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 e ..** making ch
193bc 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e anges to a page.
193bd 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 The caller must
193be 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 check the retur
193bf 6e 20 76 61 6c 75 65 20 0d 0a 2a 2a 20 6f 66 20 n value ..** of
193c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e this function an
193c1 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 d be careful not
193c2 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 to change any p
193c3 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 age data unless
193c4 0d 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e ..** this routin
193c5 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 e returns SQLITE
193c6 5f 4f 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 _OK...**..** The
193c7 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 difference betw
193c8 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f een this functio
193c9 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 n and pager_writ
193ca 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 e() is that this
193cb 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c ..** function al
193cc 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 so deals with th
193cd 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 e special case w
193ce 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 here 2 or more p
193cf 61 67 65 73 0d 0a 2a 2a 20 66 69 74 20 6f 6e 20 ages..** fit on
193d0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 a single disk se
193d1 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 ctor. In this ca
193d2 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 se all co-reside
193d3 6e 74 20 70 61 67 65 73 0d 0a 2a 2a 20 6d 75 73 nt pages..** mus
193d4 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 t have been writ
193d5 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e ten to the journ
193d6 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 al file before r
193d7 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a eturning...**..*
193d8 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 * If an error oc
193d9 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d curs, SQLITE_NOM
193da 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f EM or an IO erro
193db 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e r code is return
193dc 65 64 0d 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 ed..** as approp
193dd 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 riate. Otherwise
193de 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2f , SQLITE_OK...*/
193df 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
193e0 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
193e1 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 rWrite(DbPage *p
193e2 44 62 50 61 67 65 29 7b 0d 0a 20 20 69 6e 74 20 DbPage){.. int
193e3 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d rc = SQLITE_OK;.
193e4 0a 0d 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 ... PgHdr *pPg
193e5 3d 20 70 44 62 50 61 67 65 3b 0d 0a 20 20 50 61 = pDbPage;.. Pa
193e6 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 ger *pPager = pP
193e7 67 2d 3e 70 50 61 67 65 72 3b 0d 0a 20 20 50 67 g->pPager;.. Pg
193e8 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f no nPagePerSecto
193e9 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 r = (pPager->sec
193ea 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e torSize/pPager->
193eb 70 61 67 65 53 69 7a 65 29 3b 0d 0a 0d 0a 20 20 pageSize);....
193ec 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
193ed 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 eState>=PAGER_WR
193ee 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0d 0a ITER_LOCKED );..
193ef 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
193f0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f ->eState!=PAGER_
193f1 45 52 52 4f 52 20 29 3b 0d 0a 20 20 61 73 73 65 ERROR );.. asse
193f2 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 rt( assert_pager
193f3 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 _state(pPager) )
193f4 3b 0d 0a 0d 0a 20 20 69 66 28 20 6e 50 61 67 65 ;.... if( nPage
193f5 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0d 0a PerSector>1 ){..
193f6 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f Pgno nPageCo
193f7 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a unt; /*
193f8 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 Total number of
193f9 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 pages in databa
193fa 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 se file */..
193fb 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 Pgno pg1;
193fc 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
193fd 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 st page of the s
193fe 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 ector pPg is loc
193ff 61 74 65 64 20 6f 6e 2e 20 2a 2f 0d 0a 20 20 20 ated on. */..
19400 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 int nPage = 0;
19401 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
19402 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 mber of pages st
19403 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f arting at pg1 to
19404 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0d 0a 20 20 20 journal */..
19405 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 int ii;
19406 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
19407 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 op counter */..
19408 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 int needSync
19409 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 = 0; /*
1940a 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 True if any page
1940b 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f has PGHDR_NEED_
1940c 53 59 4e 43 20 2a 2f 0d 0a 0d 0a 20 20 20 20 2f SYNC */.... /
1940d 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 * Set the doNotS
1940e 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f yncSpill flag to
1940f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 1. This is beca
19410 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c use we cannot al
19411 6c 6f 77 0d 0a 20 20 20 20 2a 2a 20 61 20 6a 6f low.. ** a jo
19412 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 urnal header to
19413 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 be written betwe
19414 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 en the pages jou
19415 72 6e 61 6c 65 64 20 62 79 0d 0a 20 20 20 20 2a rnaled by.. *
19416 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e * this function.
19417 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 73 .. */.. as
19418 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0d sert( !MEMDB );.
19419 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 . assert( pPa
1941a 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 ger->doNotSyncSp
1941b 69 6c 6c 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 70 ill==0 );.. p
1941c 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 Pager->doNotSync
1941d 53 70 69 6c 6c 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 Spill++;....
1941e 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 /* This trick as
1941f 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 sumes that both
19420 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e the page-size an
19421 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 d sector-size ar
19422 65 0d 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 e.. ** an int
19423 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e eger power of 2.
19424 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c It sets variabl
19425 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 e pg1 to the ide
19426 6e 74 69 66 69 65 72 0d 0a 20 20 20 20 2a 2a 20 ntifier.. **
19427 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 of the first pag
19428 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 e of the sector
19429 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f pPg is located o
1942a 6e 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 n... */..
1942b 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e pg1 = ((pPg->pgn
1942c 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 o-1) & ~(nPagePe
1942d 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b rSector-1)) + 1;
1942e 0d 0a 0d 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 .... nPageCou
1942f 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 nt = pPager->dbS
19430 69 7a 65 3b 0d 0a 20 20 20 20 69 66 28 20 70 50 ize;.. if( pP
19431 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 g->pgno>nPageCou
19432 6e 74 20 29 7b 0d 0a 20 20 20 20 20 20 6e 50 61 nt ){.. nPa
19433 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 ge = (pPg->pgno
19434 2d 20 70 67 31 29 2b 31 3b 0d 0a 20 20 20 20 7d - pg1)+1;.. }
19435 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 else if( (pg1+nP
19436 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e agePerSector-1)>
19437 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0d 0a 20 nPageCount ){..
19438 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 nPage = nPa
19439 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0d 0a geCount+1-pg1;..
1943a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1943b 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 nPage = nPageP
1943c 65 72 53 65 63 74 6f 72 3b 0d 0a 20 20 20 20 7d erSector;.. }
1943d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 .. assert(nPa
1943e 67 65 3e 30 29 3b 0d 0a 20 20 20 20 61 73 73 65 ge>0);.. asse
1943f 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e rt(pg1<=pPg->pgn
19440 6f 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 o);.. assert(
19441 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d (pg1+nPage)>pPg-
19442 3e 70 67 6e 6f 29 3b 0d 0a 0d 0a 20 20 20 20 66 >pgno);.... f
19443 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 or(ii=0; ii<nPag
19444 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f e && rc==SQLITE_
19445 4f 4b 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 OK; ii++){..
19446 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b Pgno pg = pg1+
19447 69 69 3b 0d 0a 20 20 20 20 20 20 50 67 48 64 72 ii;.. PgHdr
19448 20 2a 70 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 *pPage;..
19449 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e if( pg==pPg->pgn
1944a 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 o || !sqlite3Bit
1944b 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e vecTest(pPager->
1944c 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 pInJournal, pg)
1944d 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){.. if(
1944e 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e pg!=PAGER_MJ_PGN
1944f 4f 28 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 O(pPager) ){..
19450 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
19451 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 ite3PagerGet(pPa
19452 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 ger, pg, &pPage)
19453 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ;.. if(
19454 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
19455 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 {.. r
19456 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 c = pager_write(
19457 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 pPage);..
19458 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e if( pPage->
19459 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 flags&PGHDR_NEED
1945a 5f 53 59 4e 43 20 29 7b 0d 0a 20 20 20 20 20 20 _SYNC ){..
1945b 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 needSync
1945c 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 = 1;..
1945d 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 }..
1945e 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e sqlite3PagerUn
1945f 72 65 66 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 ref(pPage);..
19460 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
19461 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }.. }else
19462 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 if( (pPage = pa
19463 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 ger_lookup(pPage
19464 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0d 0a 20 r, pg))!=0 ){..
19465 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 if( pPage
19466 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 ->flags&PGHDR_NE
19467 45 44 5f 53 59 4e 43 20 29 7b 0d 0a 20 20 20 20 ED_SYNC ){..
19468 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d needSync =
19469 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 1;.. }..
1946a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 sqlite3P
1946b 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 agerUnref(pPage)
1946c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1946d 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 }.... /* If t
1946e 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 he PGHDR_NEED_SY
1946f 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 NC flag is set f
19470 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 or any of the nP
19471 61 67 65 20 70 61 67 65 73 20 0d 0a 20 20 20 20 age pages ..
19472 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 ** starting at p
19473 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 g1, then it need
19474 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 s to be set for
19475 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 all of them. Bec
19476 61 75 73 65 0d 0a 20 20 20 20 2a 2a 20 77 72 69 ause.. ** wri
19477 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 ting to any of t
19478 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 hese nPage pages
19479 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 may damage the
1947a 6f 74 68 65 72 73 2c 20 74 68 65 0d 0a 20 20 20 others, the..
1947b 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ** journal file
1947c 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 must contain sy
1947d 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 nc()ed copies of
1947e 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0d 0a 20 20 all of them..
1947f 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 ** before any
19480 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 of them can be w
19481 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 ritten out to th
19482 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e e database file.
19483 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 .. */.. if
19484 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
19485 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0d 0a && needSync ){..
19486 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d assert( !M
19487 45 4d 44 42 20 29 3b 0d 0a 20 20 20 20 20 20 66 EMDB );.. f
19488 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 or(ii=0; ii<nPag
19489 65 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 e; ii++){..
1948a 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 PgHdr *pPage
1948b 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 = pager_lookup(p
1948c 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0d Pager, pg1+ii);.
1948d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 . if( pPa
1948e 67 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 ge ){..
1948f 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d pPage->flags |=
19490 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 PGHDR_NEED_SYNC
19491 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ;.. sql
19492 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 ite3PagerUnref(p
19493 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 Page);..
19494 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
19495 7d 0d 0a 0d 0a 20 20 20 20 61 73 73 65 72 74 28 }.... assert(
19496 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 pPager->doNotSy
19497 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0d 0a 20 ncSpill==1 );..
19498 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 pPager->doNot
19499 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0d 0a 20 20 SyncSpill--;..
1949a 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 20 3d }else{.. rc =
1949b 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 pager_write(pDb
1949c 50 61 67 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 Page);.. }.. r
1949d 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1949e 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 /*..** Return TR
1949f 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 UE if the page g
194a0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 iven in the argu
194a1 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 ment was previou
194a2 73 6c 79 20 70 61 73 73 65 64 0d 0a 2a 2a 20 74 sly passed..** t
194a3 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 o sqlite3PagerWr
194a4 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 ite(). In other
194a5 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 words, return T
194a6 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0d RUE if it is ok.
194a7 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 .** to change th
194a8 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 e content of the
194a9 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e page...*/..#ifn
194aa 64 65 66 20 4e 44 45 42 55 47 0d 0a 53 51 4c 49 def NDEBUG..SQLI
194ab 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
194ac 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 qlite3PagerIswri
194ad 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 teable(DbPage *p
194ae 50 67 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 Pg){.. return p
194af 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f Pg->flags&PGHDR_
194b0 44 49 52 54 59 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 DIRTY;..}..#endi
194b1 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 63 61 f..../*..** A ca
194b2 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 ll to this routi
194b3 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 ne tells the pag
194b4 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f er that it is no
194b5 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0d 0a t necessary to..
194b6 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 ** write the inf
194b7 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 ormation on page
194b8 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 pPg back to the
194b9 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 disk, even thou
194ba 67 68 0d 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 gh..** that page
194bb 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 might be marked
194bc 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 as dirty. This
194bd 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 happens, for ex
194be 61 6d 70 6c 65 2c 20 77 68 65 6e 0d 0a 2a 2a 20 ample, when..**
194bf 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 the page has bee
194c0 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 n added as a lea
194c1 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 f of the freelis
194c2 74 20 61 6e 64 20 73 6f 20 69 74 73 0d 0a 2a 2a t and so its..**
194c3 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 content no long
194c4 65 72 20 6d 61 74 74 65 72 73 2e 0d 0a 2a 2a 0d er matters...**.
194c5 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e .** The overlyin
194c6 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 g software layer
194c7 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 calls this rout
194c8 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 ine when all of
194c9 74 68 65 20 64 61 74 61 0d 0a 2a 2a 20 6f 6e 20 the data..** on
194ca 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 the given page i
194cb 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 s unused. The pa
194cc 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 ger marks the pa
194cd 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0d 0a ge as clean so..
194ce 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 ** that it does
194cf 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 not get written
194d0 74 6f 20 64 69 73 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a to disk...**..**
194d1 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 Tests show that
194d2 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 this optimizati
194d3 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 on can quadruple
194d4 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 the speed of la
194d5 72 67 65 20 0d 0a 2a 2a 20 44 45 4c 45 54 45 20 rge ..** DELETE
194d6 6f 70 65 72 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d operations...*/.
194d7 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
194d8 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 void sqlite3Page
194d9 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 rDontWrite(PgHdr
194da 20 2a 70 50 67 29 7b 0d 0a 20 20 50 61 67 65 72 *pPg){.. Pager
194db 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e *pPager = pPg->
194dc 70 50 61 67 65 72 3b 0d 0a 20 20 69 66 28 20 28 pPager;.. if( (
194dd 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 pPg->flags&PGHDR
194de 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 _DIRTY) && pPage
194df 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 r->nSavepoint==0
194e0 20 29 7b 0d 0a 20 20 20 20 50 41 47 45 52 54 52 ){.. PAGERTR
194e1 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 ACE(("DONT_WRITE
194e2 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e page %d of %d\n
194e3 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 ", pPg->pgno, PA
194e4 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b GERID(pPager)));
194e5 0d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 .. IOTRACE(("
194e6 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 CLEAN %p %d\n",
194e7 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e pPager, pPg->pgn
194e8 6f 29 29 0d 0a 20 20 20 20 70 50 67 2d 3e 66 6c o)).. pPg->fl
194e9 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e ags |= PGHDR_DON
194ea 54 5f 57 52 49 54 45 3b 0d 0a 20 20 20 20 70 61 T_WRITE;.. pa
194eb 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 ger_set_pagehash
194ec 28 70 50 67 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a (pPg);.. }..}..
194ed 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f ../*..** This ro
194ee 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 utine is called
194ef 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 to increment the
194f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 value of the da
194f1 74 61 62 61 73 65 20 66 69 6c 65 20 0d 0a 2a 2a tabase file ..**
194f2 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c change-counter,
194f3 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 stored as a 4-b
194f4 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 yte big-endian i
194f5 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 nteger starting
194f6 61 74 20 0d 0a 2a 2a 20 62 79 74 65 20 6f 66 66 at ..** byte off
194f7 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 set 24 of the pa
194f8 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73 ger file. The s
194f9 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20 econdary change
194fa 63 6f 75 6e 74 65 72 20 61 74 0d 0a 2a 2a 20 39 counter at..** 9
194fb 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 2 is also update
194fc 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c d, as is the SQL
194fd 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 ite version numb
194fe 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e er at offset 96.
194ff 0d 0a 2a 2a 0d 0a 2a 2a 20 42 75 74 20 74 68 69 ..**..** But thi
19500 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 s only happens i
19501 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 f the pPager->ch
19502 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c angeCountDone fl
19503 61 67 20 69 73 20 66 61 6c 73 65 2e 0d 0a 2a 2a ag is false...**
19504 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 To avoid excess
19505 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 churning of pag
19506 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 e 1, the update
19507 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 only happens onc
19508 65 2e 0d 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 e...** See also
19509 74 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f the pager_write_
1950a 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 changecounter()
1950b 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 routine that doe
1950c 73 20 61 6e 20 0d 0a 2a 2a 20 75 6e 63 6f 6e 64 s an ..** uncond
1950d 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f itional update o
1950e 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 f the change cou
1950f 6e 74 65 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 nters...**..** I
19510 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f f the isDirectMo
19511 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c de flag is zero,
19512 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f then this is do
19513 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0d 0a ne by calling ..
19514 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 ** sqlite3PagerW
19515 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 rite() on page 1
19516 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 , then modifying
19517 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 the contents of
19518 20 74 68 65 0d 0a 2a 2a 20 70 61 67 65 20 64 61 the..** page da
19519 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 ta. In this case
1951a 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 the file will b
1951b 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 e updated when t
1951c 68 65 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 74 he current..** t
1951d 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f ransaction is co
1951e 6d 6d 69 74 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a mmitted...**..**
1951f 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 The isDirectMod
19520 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 e flag may only
19521 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 be non-zero if t
19522 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 he library was c
19523 6f 6d 70 69 6c 65 64 0d 0a 2a 2a 20 77 69 74 68 ompiled..** with
19524 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 the SQLITE_ENAB
19525 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 LE_ATOMIC_WRITE
19526 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 macro defined. I
19527 6e 20 74 68 69 73 20 63 61 73 65 2c 0d 0a 2a 2a n this case,..**
19528 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 if isDirect is
19529 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 non-zero, then t
1952a 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1952b 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 is updated dire
1952c 63 74 6c 79 0d 0a 2a 2a 20 62 79 20 77 72 69 74 ctly..** by writ
1952d 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 ing an updated v
1952e 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 ersion of page 1
1952f 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f using a call to
19530 20 74 68 65 20 0d 0a 2a 2a 20 73 71 6c 69 74 65 the ..** sqlite
19531 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 3OsWrite() funct
19532 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ion...*/..static
19533 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f int pager_incr_
19534 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 changecounter(Pa
19535 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 ger *pPager, int
19536 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0d isDirectMode){.
19537 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
19538 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 TE_OK;.... asse
19539 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 rt( pPager->eSta
1953a 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 te==PAGER_WRITER
1953b 5f 43 41 43 48 45 4d 4f 44 0d 0a 20 20 20 20 20 _CACHEMOD..
1953c 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 || pPager->eSt
1953d 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 ate==PAGER_WRITE
1953e 52 5f 44 42 4d 4f 44 0d 0a 20 20 29 3b 0d 0a 20 R_DBMOD.. );..
1953f 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f assert( assert_
19540 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 pager_state(pPag
19541 65 72 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 44 er) );.... /* D
19542 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 eclare and initi
19543 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 alize constant i
19544 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 nteger 'isDirect
19545 27 2e 20 49 66 20 74 68 65 0d 0a 20 20 2a 2a 20 '. If the.. **
19546 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 atomic-write opt
19547 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 imization is ena
19548 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 bled in this bui
19549 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 ld, then isDirec
1954a 74 0d 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 t.. ** is initi
1954b 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 alized to the va
1954c 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 lue passed as th
1954d 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 e isDirectMode p
1954e 61 72 61 6d 65 74 65 72 0d 0a 20 20 2a 2a 20 74 arameter.. ** t
1954f 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e o this function.
19550 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 Otherwise, it i
19551 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 s always set to
19552 7a 65 72 6f 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a zero... **.. *
19553 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 * The idea is th
19554 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 at if the atomic
19555 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 -write optimizat
19556 69 6f 6e 20 69 73 20 6e 6f 74 0d 0a 20 20 2a 2a ion is not.. **
19557 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 enabled at comp
19558 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f ile time, the co
19559 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 mpiler can omit
1955a 74 68 65 20 74 65 73 74 73 20 6f 66 0d 0a 20 20 the tests of..
1955b 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 ** 'isDirect' be
1955c 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 low, as well as
1955d 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 the block enclos
1955e 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 2a 2a 20 ed in the.. **
1955f 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 "if( isDirect )"
19560 20 63 6f 6e 64 69 74 69 6f 6e 2e 0d 0a 20 20 2a condition... *
19561 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
19562 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f E_ENABLE_ATOMIC_
19563 57 52 49 54 45 0d 0a 23 20 64 65 66 69 6e 65 20 WRITE..# define
19564 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0d 0a 20 DIRECT_MODE 0..
19565 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 assert( isDirec
19566 74 4d 6f 64 65 3d 3d 30 20 29 3b 0d 0a 20 20 55 tMode==0 );.. U
19567 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
19568 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0d 0a isDirectMode);..
19569 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 #else..# define
1956a 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 DIRECT_MODE isDi
1956b 72 65 63 74 4d 6f 64 65 0d 0a 23 65 6e 64 69 66 rectMode..#endif
1956c 0d 0a 0d 0a 20 20 69 66 28 20 21 70 50 61 67 65 .... if( !pPage
1956d 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f r->changeCountDo
1956e 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 ne && pPager->db
1956f 53 69 7a 65 3e 30 20 29 7b 0d 0a 20 20 20 20 50 Size>0 ){.. P
19570 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 gHdr *pPgHdr;
19571 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
19572 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 Reference to pag
19573 65 20 31 20 2a 2f 0d 0a 0d 0a 20 20 20 20 61 73 e 1 */.... as
19574 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 sert( !pPager->t
19575 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 empFile && isOpe
19576 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b n(pPager->fd) );
19577 0d 0a 0d 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 .... /* Open
19578 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 page 1 of the fi
19579 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 le for writing.
1957a 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c */.. rc = sql
1957b 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 ite3PagerGet(pPa
1957c 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 ger, 1, &pPgHdr)
1957d 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
1957e 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d PgHdr==0 || rc==
1957f 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 0d 0a SQLITE_OK );....
19580 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f /* If page o
19581 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 ne was fetched s
19582 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 uccessfully, and
19583 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 this function i
19584 73 20 6e 6f 74 0d 0a 20 20 20 20 2a 2a 20 6f 70 s not.. ** op
19585 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 erating in direc
19586 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 t-mode, make pag
19587 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 e 1 writable. W
19588 68 65 6e 20 6e 6f 74 20 69 6e 20 0d 0a 20 20 20 hen not in ..
19589 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c ** direct mode,
1958a 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 page 1 is alway
1958b 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 s held in cache
1958c 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 and hence the Pa
1958d 67 65 72 47 65 74 28 29 0d 0a 20 20 20 20 2a 2a gerGet().. **
1958e 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 above is always
1958f 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 successful - he
19590 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f nce the ALWAYS o
19591 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e n rc==SQLITE_OK.
19592 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 .. */.. if
19593 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 ( !DIRECT_MODE &
19594 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c & ALWAYS(rc==SQL
19595 49 54 45 5f 4f 4b 29 20 29 7b 0d 0a 20 20 20 20 ITE_OK) ){..
19596 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
19597 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 gerWrite(pPgHdr)
19598 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
19599 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1959a 4b 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 41 K ){.. /* A
1959b 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75 ctually do the u
1959c 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 61 pdate of the cha
1959d 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a nge counter */..
1959e 20 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74 pager_writ
1959f 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 e_changecounter(
195a0 70 50 67 48 64 72 29 3b 0d 0a 0d 0a 20 20 20 20 pPgHdr);....
195a1 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 /* If running
195a2 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 in direct mode,
195a3 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e write the conten
195a4 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 ts of page 1 to
195a5 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 the file. */..
195a6 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d if( DIRECT_M
195a7 4f 44 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ODE ){..
195a8 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 const void *zBuf
195a9 3b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 ;.. asser
195aa 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c t( pPager->dbFil
195ab 65 53 69 7a 65 3e 30 20 29 3b 0d 0a 20 20 20 20 eSize>0 );..
195ac 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 CODEC2(pPage
195ad 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 r, pPgHdr->pData
195ae 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 , 1, 6, rc=SQLIT
195af 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0d E_NOMEM, zBuf);.
195b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d . if( rc=
195b1 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
195b2 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 rc = sq
195b3 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 lite3OsWrite(pPa
195b4 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 ger->fd, zBuf, p
195b5 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c Pager->pageSize,
195b6 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0);.. }.
195b7 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d . if( rc=
195b8 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
195b9 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d pPager-
195ba 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 >changeCountDone
195bb 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 7d = 1;.. }
195bc 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
195bd 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e pPager->
195be 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 changeCountDone
195bf 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 = 1;.. }..
195c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 52 }.... /* R
195c1 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 elease the page
195c2 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0d 0a 20 reference. */..
195c3 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 sqlite3PagerU
195c4 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0d 0a 20 nref(pPgHdr);..
195c5 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
195c6 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 79 ..}..../*..** Sy
195c7 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 nc the database
195c8 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 file to disk. Th
195c9 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f is is a no-op fo
195ca 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 r in-memory data
195cb 62 61 73 65 73 0d 0a 2a 2a 20 6f 72 20 70 61 67 bases..** or pag
195cc 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 es with the Page
195cd 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 r.noSync flag se
195ce 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 t...**..** If su
195cf 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 ccessful, or if
195d0 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 called on a page
195d1 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 r for which it i
195d2 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0d s a no-op, this.
195d3 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 .** function ret
195d4 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 urns SQLITE_OK.
195d5 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f Otherwise, an IO
195d6 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 error code is r
195d7 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 eturned...*/..SQ
195d8 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
195d9 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e sqlite3PagerSyn
195da 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 c(Pager *pPager)
195db 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 {.. int rc = SQ
195dc 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 LITE_OK;.. if(
195dd 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 !pPager->noSync
195de 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){.. assert(
195df 21 4d 45 4d 44 42 20 29 3b 0d 0a 20 20 20 20 72 !MEMDB );.. r
195e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e c = sqlite3OsSyn
195e1 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 c(pPager->fd, pP
195e2 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 ager->syncFlags)
195e3 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 ;.. }else if( i
195e4 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 sOpen(pPager->fd
195e5 29 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 ) ){.. assert
195e6 28 20 21 4d 45 4d 44 42 20 29 3b 0d 0a 20 20 20 ( !MEMDB );..
195e7 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 rc = sqlite3OsF
195e8 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 ileControl(pPage
195e9 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 r->fd, SQLITE_FC
195ea 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 NTL_SYNC_OMITTED
195eb 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 , 0);.. if( r
195ec 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 c==SQLITE_NOTFOU
195ed 4e 44 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 ND ){.. rc
195ee 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 = SQLITE_OK;..
195ef 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
195f0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
195f1 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
195f2 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 n may only be ca
195f3 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 lled while a wri
195f4 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 te-transaction i
195f5 73 20 61 63 74 69 76 65 20 69 6e 0d 0a 2a 2a 20 s active in..**
195f6 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 rollback. If the
195f7 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 connection is i
195f8 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 n WAL mode, this
195f9 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 call is a no-op
195fa 2e 20 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 . ..** Otherwise
195fb 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 , if the connect
195fc 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 ion does not alr
195fd 65 61 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 eady have an EXC
195fe 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0d LUSIVE lock on .
195ff 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 .** the database
19600 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 file, an attemp
19601 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 t is made to obt
19602 61 69 6e 20 6f 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ain one...**..**
19603 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 If the EXCLUSIV
19604 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 E lock is alread
19605 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74 y held or the at
19606 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 tempt to obtain
19607 69 74 20 69 73 0d 0a 2a 2a 20 73 75 63 63 65 73 it is..** succes
19608 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e sful, or the con
19609 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 nection is in WA
1960a 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f L mode, SQLITE_O
1960b 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a K is returned...
1960c 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 ** Otherwise, ei
1960d 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 ther SQLITE_BUSY
1960e 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f or an SQLITE_IO
1960f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f ERR_XXX error co
19610 64 65 20 69 73 20 0d 0a 2a 2a 20 72 65 74 75 72 de is ..** retur
19611 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ned...*/..SQLITE
19612 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
19613 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 ite3PagerExclusi
19614 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 veLock(Pager *pP
19615 61 67 65 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 ager){.. int rc
19616 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 = SQLITE_OK;..
19617 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
19618 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 >eState==PAGER_W
19619 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0d RITER_CACHEMOD .
1961a 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 . || pPage
1961b 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 r->eState==PAGER
1961c 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0d 0a _WRITER_DBMOD ..
1961d 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 || pPager
1961e 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f ->eState==PAGER_
1961f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0d 0a WRITER_LOCKED ..
19620 20 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 );.. assert(
19621 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 assert_pager_sta
19622 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 te(pPager) );..
19623 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 if( 0==pagerUse
19624 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0d 0a Wal(pPager) ){..
19625 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 rc = pager_w
19626 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 ait_on_lock(pPag
19627 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f er, EXCLUSIVE_LO
19628 43 4b 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 CK);.. }.. ret
19629 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1962a 0d 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 ..** Sync the da
1962b 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 tabase file for
1962c 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 the pager pPager
1962d 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 . zMaster points
1962e 20 74 6f 20 74 68 65 20 6e 61 6d 65 0d 0a 2a 2a to the name..**
1962f 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 of a master jou
19630 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 rnal file that s
19631 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e hould be written
19632 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 into the indivi
19633 64 75 61 6c 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 6c dual..** journal
19634 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d file. zMaster m
19635 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 ay be NULL, whic
19636 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 h is interpreted
19637 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0d 0a 2a as no master..*
19638 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e * journal (a sin
19639 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 gle database tra
1963a 6e 73 61 63 74 69 6f 6e 29 2e 0d 0a 2a 2a 0d 0a nsaction)...**..
1963b 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
1963c 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0d 0a 2a ensures that:..*
1963d 2a 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 *..** * The da
1963e 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e tabase file chan
1963f 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 ge-counter is up
19640 64 61 74 65 64 2c 0d 0a 2a 2a 20 20 20 2a 20 74 dated,..** * t
19641 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 he journal is sy
19642 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 nced (unless the
19643 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 atomic-write op
19644 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 timization is us
19645 65 64 29 2c 0d 0a 2a 2a 20 20 20 2a 20 61 6c 6c ed),..** * all
19646 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 dirty pages are
19647 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 written to the
19648 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0d database file, .
19649 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 .** * the data
1964a 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 base file is tru
1964b 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 ncated (if requi
1964c 72 65 64 29 2c 20 61 6e 64 0d 0a 2a 2a 20 20 20 red), and..**
1964d 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 * the database f
1964e 69 6c 65 20 73 79 6e 63 65 64 2e 20 0d 0a 2a 2a ile synced. ..**
1964f 0d 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 ..** The only th
19650 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 ing that remains
19651 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 to commit the t
19652 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f ransaction is to
19653 20 66 69 6e 61 6c 69 7a 65 20 0d 0a 2a 2a 20 28 finalize ..** (
19654 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 delete, truncate
19655 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 or zero the fir
19656 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 st part of) the
19657 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 journal file (or
19658 20 0d 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 ..** delete the
19659 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
1965a 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 file if specifie
1965b 64 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 d)...**..** Note
1965c 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 that if zMaster
1965d 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 ==NULL, this doe
1965e 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 s not overwrite
1965f 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 a previous value
19660 0d 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 ..** passed to a
19661 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f n sqlite3PagerCo
19662 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 mmitPhaseOne() c
19663 61 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 all...**..** If
19664 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 the final parame
19665 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 ter - noSync - i
19666 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 s true, then the
19667 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
19668 74 73 65 6c 66 0d 0a 2a 2a 20 69 73 20 6e 6f 74 tself..** is not
19669 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c synced. The cal
1966a 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 ler must call sq
1966b 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 lite3PagerSync()
1966c 20 64 69 72 65 63 74 6c 79 20 74 6f 0d 0a 2a 2a directly to..**
1966d 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 sync the databa
1966e 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 se file before c
1966f 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 alling CommitPha
19670 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 seTwo() to delet
19671 65 20 74 68 65 0d 0a 2a 2a 20 6a 6f 75 72 6e 61 e the..** journa
19672 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 l file in this c
19673 61 73 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ase...*/..SQLITE
19674 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
19675 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 ite3PagerCommitP
19676 68 61 73 65 4f 6e 65 28 0d 0a 20 20 50 61 67 65 haseOne(.. Page
19677 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 r *pPager,
19678 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
19679 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a ager object */..
1967a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d const char *zM
1967b 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 aster,
1967c 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c /* If not NULL
1967d 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 , the master jou
1967e 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0d 0a 20 20 rnal name */..
1967f 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 int noSync
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19681 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 /* True to omit
19682 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 the xSync on the
19683 20 64 62 20 66 69 6c 65 20 2a 2f 0d 0a 29 7b 0d db file */..){.
19684 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
19685 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 TE_OK;
19686 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 /* Return cod
19687 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 e */.... assert
19688 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 ( pPager->eState
19689 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c ==PAGER_WRITER_L
1968a 4f 43 4b 45 44 0d 0a 20 20 20 20 20 20 20 7c 7c OCKED.. ||
1968b 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d pPager->eState=
1968c 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 =PAGER_WRITER_CA
1968d 43 48 45 4d 4f 44 0d 0a 20 20 20 20 20 20 20 7c CHEMOD.. |
1968e 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 | pPager->eState
1968f 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 ==PAGER_WRITER_D
19690 42 4d 4f 44 0d 0a 20 20 20 20 20 20 20 7c 7c 20 BMOD.. ||
19691 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d pPager->eState==
19692 50 41 47 45 52 5f 45 52 52 4f 52 0d 0a 20 20 29 PAGER_ERROR.. )
19693 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 ;.. assert( ass
19694 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 ert_pager_state(
19695 70 50 61 67 65 72 29 20 29 3b 0d 0a 0d 0a 20 20 pPager) );....
19696 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 /* If a prior er
19697 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 ror occurred, re
19698 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 port that error
19699 61 67 61 69 6e 2e 20 2a 2f 0d 0a 20 20 69 66 28 again. */.. if(
1969a 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 NEVER(pPager->e
1969b 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e rrCode) ) return
1969c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 pPager->errCode
1969d 3b 0d 0a 0d 0a 20 20 50 41 47 45 52 54 52 41 43 ;.... PAGERTRAC
1969e 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e E(("DATABASE SYN
1969f 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 C: File=%s zMast
196a0 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e er=%s nSize=%d\n
196a1 22 2c 20 0d 0a 20 20 20 20 20 20 70 50 61 67 65 ", .. pPage
196a2 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d r->zFilename, zM
196a3 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 aster, pPager->d
196a4 62 53 69 7a 65 29 29 3b 0d 0a 0d 0a 20 20 2f 2a bSize));.... /*
196a5 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 If no database
196a6 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 changes have bee
196a7 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65 n made, return e
196a8 61 72 6c 79 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 arly. */.. if(
196a9 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 pPager->eState<P
196aa 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 AGER_WRITER_CACH
196ab 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53 51 EMOD ) return SQ
196ac 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 69 66 LITE_OK;.... if
196ad 28 20 4d 45 4d 44 42 20 29 7b 0d 0a 20 20 20 20 ( MEMDB ){..
196ae 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e /* If this is an
196af 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f in-memory db, o
196b0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 r no pages have
196b1 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c been written to,
196b2 20 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 2a 2a or this.. **
196b3 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c function has al
196b4 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 ready been calle
196b5 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 d, it is mostly
196b6 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 a no-op. Howeve
196b7 72 2c 20 61 6e 79 0d 0a 20 20 20 20 2a 2a 20 62 r, any.. ** b
196b8 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 ackup in progres
196b9 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 s needs to be re
196ba 73 74 61 72 74 65 64 2e 0d 0a 20 20 20 20 2a 2f started... */
196bb 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 .. sqlite3Bac
196bc 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 kupRestart(pPage
196bd 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0d 0a 20 20 r->pBackup);..
196be 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 66 28 20 }else{.. if(
196bf 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 pagerUseWal(pPag
196c0 65 72 29 20 29 7b 0d 0a 20 20 20 20 20 20 50 67 er) ){.. Pg
196c1 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c Hdr *pList = sql
196c2 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c ite3PcacheDirtyL
196c3 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 ist(pPager->pPCa
196c4 63 68 65 29 3b 0d 0a 20 20 20 20 20 20 50 67 48 che);.. PgH
196c5 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 dr *pPageOne = 0
196c6 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 ;.. if( pLi
196c7 73 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 st==0 ){..
196c8 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 /* Must have a
196c9 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 t least one page
196ca 20 66 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d for the WAL com
196cb 6d 69 74 20 66 6c 61 67 2e 0d 0a 20 20 20 20 20 mit flag...
196cc 20 20 20 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 ** Ticket [2d
196cd 31 61 35 63 36 37 64 66 63 32 33 36 33 65 34 34 1a5c67dfc2363e44
196ce 66 32 39 64 39 62 62 64 35 37 66 5d 20 32 30 31 f29d9bbd57f] 201
196cf 31 2d 30 35 2d 31 38 20 2a 2f 0d 0a 20 20 20 20 1-05-18 */..
196d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
196d1 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c PagerGet(pPager,
196d2 20 31 2c 20 26 70 50 61 67 65 4f 6e 65 29 3b 0d 1, &pPageOne);.
196d3 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d . pList =
196d4 20 70 50 61 67 65 4f 6e 65 3b 0d 0a 20 20 20 20 pPageOne;..
196d5 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 pList->pDirt
196d6 79 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d y = 0;.. }.
196d7 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 . assert( r
196d8 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d c==SQLITE_OK );.
196d9 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 . if( ALWAY
196da 53 28 70 4c 69 73 74 29 20 29 7b 0d 0a 20 20 20 S(pList) ){..
196db 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 rc = pagerW
196dc 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c alFrames(pPager,
196dd 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e pList, pPager->
196de 64 62 53 69 7a 65 2c 20 31 29 3b 0d 0a 20 20 20 dbSize, 1);..
196df 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c 69 }.. sqli
196e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 te3PagerUnref(pP
196e1 61 67 65 4f 6e 65 29 3b 0d 0a 20 20 20 20 20 20 ageOne);..
196e2 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
196e3 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 K ){.. sq
196e4 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e lite3PcacheClean
196e5 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 All(pPager->pPCa
196e6 63 68 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a che);.. }..
196e7 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
196e8 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 /* The followi
196e9 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 ng block updates
196ea 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e the change-coun
196eb 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 ter. Exactly how
196ec 20 69 74 0d 0a 20 20 20 20 20 20 2a 2a 20 64 6f it.. ** do
196ed 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 es this depends
196ee 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f on whether or no
196ef 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 t the atomic-upd
196f0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e ate optimization
196f1 0d 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 .. ** was e
196f2 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c nabled at compil
196f3 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 e time, and if t
196f4 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 his transaction
196f5 6d 65 65 74 73 20 74 68 65 20 0d 0a 20 20 20 20 meets the ..
196f6 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 ** runtime cri
196f7 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 teria to use the
196f8 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0d 0a 20 20 operation: ..
196f9 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a **.. **
196fa 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 * The file-s
196fb 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 ystem supports t
196fc 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 he atomic-write
196fd 70 72 6f 70 65 72 74 79 20 66 6f 72 0d 0a 20 20 property for..
196fe 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 ** bloc
196ff 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d ks of size page-
19700 73 69 7a 65 2c 20 61 6e 64 20 0d 0a 20 20 20 20 size, and ..
19701 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 ** * This c
19702 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 ommit is not par
19703 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c t of a multi-fil
19704 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 e transaction, a
19705 6e 64 0d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 nd.. **
19706 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 * Exactly one pa
19707 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 ge has been modi
19708 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 fied and store i
19709 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 n the journal fi
1970a 6c 65 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 le... **..
1970b 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f ** If the o
1970c 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 ptimization was
1970d 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 not enabled at c
1970e 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 ompile time, the
1970f 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 n the.. **
19710 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 pager_incr_chang
19711 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 ecounter() funct
19712 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
19713 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e update the chan
19714 67 65 0d 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 ge.. ** cou
19715 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 nter in 'indirec
19716 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 t-mode'. If the
19717 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 optimization is
19718 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0d compiled in but.
19719 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 . ** is not
1971a 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 applicable to t
1971b 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c his transaction,
1971c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 call sqlite3Jou
1971d 72 6e 61 6c 43 72 65 61 74 65 28 29 0d 0a 20 20 rnalCreate()..
1971e 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 ** to make s
1971f 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 ure the journal
19720 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c file has actuall
19721 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 y been created,
19722 74 68 65 6e 20 63 61 6c 6c 0d 0a 20 20 20 20 20 then call..
19723 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 ** pager_incr_c
19724 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 hangecounter() t
19725 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 o update the cha
19726 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 nge-counter in i
19727 6e 64 69 72 65 63 74 0d 0a 20 20 20 20 20 20 2a ndirect.. *
19728 2a 20 6d 6f 64 65 2e 20 0d 0a 20 20 20 20 20 20 * mode. ..
19729 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 **.. ** Oth
1972a 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f erwise, if the o
1972b 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 ptimization is b
1972c 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 oth enabled and
1972d 61 70 70 6c 69 63 61 62 6c 65 2c 0d 0a 20 20 20 applicable,..
1972e 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 ** then call
1972f 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 pager_incr_chang
19730 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 ecounter() to up
19731 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d date the change-
19732 63 6f 75 6e 74 65 72 0d 0a 20 20 20 20 20 20 2a counter.. *
19733 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f * in 'direct' mo
19734 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 de. In this case
19735 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
19736 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0d e will never be.
19737 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 . ** create
19738 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 d for this trans
19739 61 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2a action... *
1973a 2f 0d 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 /.. #ifdef SQLI
1973b 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 TE_ENABLE_ATOMIC
1973c 5f 57 52 49 54 45 0d 0a 20 20 20 20 20 20 50 67 _WRITE.. Pg
1973d 48 64 72 20 2a 70 50 67 3b 0d 0a 20 20 20 20 20 Hdr *pPg;..
1973e 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 assert( isOpen(
1973f 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0d 0a 20 pPager->jfd) ..
19740 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 || pPa
19741 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 ger->journalMode
19742 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d ==PAGER_JOURNALM
19743 4f 44 45 5f 4f 46 46 20 0d 0a 20 20 20 20 20 20 ODE_OFF ..
19744 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e || pPager->
19745 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 journalMode==PAG
19746 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 ER_JOURNALMODE_W
19747 41 4c 20 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 AL .. );..
19748 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 if( !zMaste
19749 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 r && isOpen(pPag
1974a 65 72 2d 3e 6a 66 64 29 20 0d 0a 20 20 20 20 20 er->jfd) ..
1974b 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 && pPager->jou
1974c 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 rnalOff==jrnlBuf
1974d 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 ferSize(pPager)
1974e 0d 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 .. && pPag
1974f 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 er->dbSize>=pPag
19750 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0d 0a er->dbOrigSize..
19751 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 && (0==(p
19752 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 Pg = sqlite3Pcac
19753 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 heDirtyList(pPag
19754 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c er->pPCache)) ||
19755 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0==pPg->pDirty)
19756 0d 0a 20 20 20 20 20 20 29 7b 0d 0a 20 20 20 20 .. ){..
19757 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 /* Update th
19758 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 e db file change
19759 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 counter via the
1975a 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 direct-write me
1975b 74 68 6f 64 2e 20 54 68 65 20 0d 0a 20 20 20 20 thod. The ..
1975c 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 ** following
1975d 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 call will modif
1975e 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 y the in-memory
1975f 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f representation o
19760 66 20 70 61 67 65 20 31 20 0d 0a 20 20 20 20 20 f page 1 ..
19761 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 ** to include
19762 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 the updated cha
19763 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 nge counter and
19764 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 then write page
19765 31 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 1 .. ** d
19766 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 irectly to the d
19767 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 atabase file. Be
19768 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f cause of the ato
19769 6d 69 63 2d 77 72 69 74 65 20 0d 0a 20 20 20 20 mic-write ..
1976a 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 ** property
1976b 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 of the host file
1976c 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 -system, this is
1976d 20 73 61 66 65 2e 0d 0a 20 20 20 20 20 20 20 20 safe...
1976e 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d */.. rc =
1976f 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e pager_incr_chan
19770 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 gecounter(pPager
19771 2c 20 31 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c , 1);.. }el
19772 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 se{.. rc
19773 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c = sqlite3Journal
19774 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a Create(pPager->j
19775 66 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 fd);.. if
19776 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
19777 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 ){.. rc
19778 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 = pager_incr_ch
19779 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 angecounter(pPag
1977a 65 72 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 er, 0);..
1977b 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 23 }.. }.. #
1977c 65 6c 73 65 0d 0a 20 20 20 20 20 20 72 63 20 3d else.. rc =
1977d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e pager_incr_chan
1977e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 gecounter(pPager
1977f 2c 20 30 29 3b 0d 0a 20 20 23 65 6e 64 69 66 0d , 0);.. #endif.
19780 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
19781 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 QLITE_OK ) goto
19782 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 commit_phase_one
19783 5f 65 78 69 74 3b 0d 0a 20 20 0d 0a 20 20 20 20 _exit;.. ..
19784 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 /* If this tra
19785 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 nsaction has mad
19786 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 e the database s
19787 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c maller, then all
19788 20 70 61 67 65 73 0d 0a 20 20 20 20 20 20 2a 2a pages.. **
19789 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 being discarded
1978a 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 by the truncati
1978b 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 on must be writt
1978c 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 en to the journa
1978d 6c 0d 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 l.. ** file
1978e 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 . This can only
1978f 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 happen in auto-v
19790 61 63 75 75 6d 20 6d 6f 64 65 2e 0d 0a 20 20 20 acuum mode...
19791 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 **.. **
19792 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 Before reading t
19793 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 he pages with pa
19794 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 ge numbers large
19795 72 20 74 68 61 6e 20 74 68 65 20 0d 0a 20 20 20 r than the ..
19796 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 ** current va
19797 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 lue of Pager.dbS
19798 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 ize, set dbSize
19799 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 back to the valu
1979a 65 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 e.. ** that
1979b 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 it took at the
1979c 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 start of the tra
1979d 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 nsaction. Otherw
1979e 69 73 65 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 ise, the..
1979f 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 ** calls to sqli
197a0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 te3PagerGet() re
197a1 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 turn zeroed page
197a2 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0d 0a 20 s instead of ..
197a3 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 ** reading
197a4 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 data from the da
197a5 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 tabase file...
197a6 20 20 20 20 2a 2f 0d 0a 20 20 23 69 66 6e 64 65 */.. #ifnde
197a7 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 f SQLITE_OMIT_AU
197a8 54 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 20 20 TOVACUUM..
197a9 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 if( pPager->dbSi
197aa 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 ze<pPager->dbOri
197ab 67 53 69 7a 65 20 0d 0a 20 20 20 20 20 20 20 26 gSize .. &
197ac 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 & pPager->journa
197ad 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 lMode!=PAGER_JOU
197ae 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0d 0a 20 20 RNALMODE_OFF..
197af 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ){..
197b0 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 Pgno i;
197b1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
197b2 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 /* Ite
197b3 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a rator variable *
197b4 2f 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 /.. const
197b5 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 Pgno iSkip = PA
197b6 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 GER_MJ_PGNO(pPag
197b7 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 er); /* Pending
197b8 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0d 0a 20 20 lock page */..
197b9 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f const Pgno
197ba 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 dbSize = pPager
197bb 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 ->dbSize;
197bc 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 /* Database imag
197bd 65 20 73 69 7a 65 20 2a 2f 20 0d 0a 20 20 20 20 e size */ ..
197be 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 pPager->dbSi
197bf 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f ze = pPager->dbO
197c0 72 69 67 53 69 7a 65 3b 0d 0a 20 20 20 20 20 20 rigSize;..
197c1 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b for( i=dbSize+
197c2 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 1; i<=pPager->db
197c3 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b OrigSize; i++ ){
197c4 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 .. if(
197c5 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 !sqlite3BitvecTe
197c6 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f st(pPager->pInJo
197c7 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d urnal, i) && i!=
197c8 69 53 6b 69 70 20 29 7b 0d 0a 20 20 20 20 20 20 iSkip ){..
197c9 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 PgHdr *pPa
197ca 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ge;
197cb 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e /* Page to journ
197cc 61 6c 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 al */..
197cd 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 rc = sqlite3P
197ce 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 agerGet(pPager,
197cf 69 2c 20 26 70 50 61 67 65 29 3b 0d 0a 20 20 20 i, &pPage);..
197d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 if( rc!
197d1 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 =SQLITE_OK ) got
197d2 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f o commit_phase_o
197d3 6e 65 5f 65 78 69 74 3b 0d 0a 20 20 20 20 20 20 ne_exit;..
197d4 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
197d5 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 e3PagerWrite(pPa
197d6 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 ge);..
197d7 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e sqlite3PagerUn
197d8 72 65 66 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 ref(pPage);..
197d9 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 if( rc!
197da 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 =SQLITE_OK ) got
197db 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f o commit_phase_o
197dc 6e 65 5f 65 78 69 74 3b 0d 0a 20 20 20 20 20 20 ne_exit;..
197dd 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d }.. }
197de 0d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 .. pPager
197df 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a ->dbSize = dbSiz
197e0 65 3b 0d 0a 20 20 20 20 20 20 7d 20 0d 0a 20 20 e;.. } ..
197e1 23 65 6e 64 69 66 0d 0a 20 20 0d 0a 20 20 20 20 #endif.. ..
197e2 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d /* Write the m
197e3 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 aster journal na
197e4 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 me into the jour
197e5 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d nal file. If a m
197e6 61 73 74 65 72 20 0d 0a 20 20 20 20 20 20 2a 2a aster .. **
197e7 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 journal file na
197e8 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 me has already b
197e9 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 een written to t
197ea 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c he journal file,
197eb 20 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 .. ** or i
197ec 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c f zMaster is NUL
197ed 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 L (no master jou
197ee 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 rnal), then this
197ef 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 call is a no-op
197f0 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 ... */..
197f1 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 rc = writeMas
197f2 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 terJournal(pPage
197f3 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0d 0a 20 20 r, zMaster);..
197f4 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
197f5 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d TE_OK ) goto com
197f6 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 mit_phase_one_ex
197f7 69 74 3b 0d 0a 20 20 0d 0a 20 20 20 20 20 20 2f it;.. .. /
197f8 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e * Sync the journ
197f9 61 6c 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74 al file and writ
197fa 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 e all dirty page
197fb 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 s to the databas
197fc 65 2e 0d 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 e... ** If
197fd 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 the atomic-updat
197fe 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 e optimization i
197ff 73 20 62 65 69 6e 67 20 75 73 65 64 2c 20 74 68 s being used, th
19800 69 73 20 73 79 6e 63 20 77 69 6c 6c 20 6e 6f 74 is sync will not
19801 20 0d 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 .. ** crea
19802 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 te the journal f
19803 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 ile or perform a
19804 6e 79 20 72 65 61 6c 20 49 4f 2e 0d 0a 20 20 20 ny real IO...
19805 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 **.. **
19806 42 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e Because the chan
19807 67 65 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20 ge-counter page
19808 77 61 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65 was just modifie
19809 64 2c 20 75 6e 6c 65 73 73 20 74 68 65 0d 0a 20 d, unless the..
1980a 20 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 ** atomic-u
1980b 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 pdate optimizati
1980c 6f 6e 20 69 73 20 75 73 65 64 20 69 74 20 69 73 on is used it is
1980d 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 almost certain
1980e 74 68 61 74 20 74 68 65 0d 0a 20 20 20 20 20 20 that the..
1980f 2a 2a 20 6a 6f 75 72 6e 61 6c 20 72 65 71 75 69 ** journal requi
19810 72 65 73 20 61 20 73 79 6e 63 20 68 65 72 65 2e res a sync here.
19811 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 6c 6f 63 However, in loc
19812 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 king_mode=exclus
19813 69 76 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 6e ive.. ** on
19814 20 61 20 73 79 73 74 65 6d 20 75 6e 64 65 72 20 a system under
19815 6d 65 6d 6f 72 79 20 70 72 65 73 73 75 72 65 20 memory pressure
19816 69 74 20 69 73 20 6a 75 73 74 20 70 6f 73 73 69 it is just possi
19817 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 73 ble that this is
19818 20 0d 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 .. ** not
19819 74 68 65 20 63 61 73 65 2e 20 49 6e 20 74 68 69 the case. In thi
1981a 73 20 63 61 73 65 20 69 74 20 69 73 20 6c 69 6b s case it is lik
1981b 65 6c 79 20 65 6e 6f 75 67 68 20 74 68 61 74 20 ely enough that
1981c 74 68 65 20 72 65 64 75 6e 64 61 6e 74 0d 0a 20 the redundant..
1981d 20 20 20 20 20 2a 2a 20 78 53 79 6e 63 28 29 20 ** xSync()
1981e 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 68 61 call will be cha
1981f 6e 67 65 64 20 74 6f 20 61 20 6e 6f 2d 6f 70 20 nged to a no-op
19820 62 79 20 74 68 65 20 4f 53 20 61 6e 79 68 6f 77 by the OS anyhow
19821 2e 20 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 . .. */..
19822 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 rc = syncJou
19823 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b rnal(pPager, 0);
19824 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d .. if( rc!=
19825 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f SQLITE_OK ) goto
19826 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e commit_phase_on
19827 65 5f 65 78 69 74 3b 0d 0a 20 20 0d 0a 20 20 20 e_exit;.. ..
19828 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 rc = pager_wr
19829 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 ite_pagelist(pPa
1982a 67 65 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68 ger,sqlite3Pcach
1982b 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 eDirtyList(pPage
1982c 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0d 0a 20 r->pPCache));..
1982d 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
1982e 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1982f 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 assert( rc!=S
19830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 QLITE_IOERR_BLOC
19831 4b 45 44 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 KED );..
19832 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 goto commit_phas
19833 65 5f 6f 6e 65 5f 65 78 69 74 3b 0d 0a 20 20 20 e_one_exit;..
19834 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c 69 }.. sqli
19835 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c te3PcacheCleanAl
19836 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 l(pPager->pPCach
19837 65 29 3b 0d 0a 20 20 0d 0a 20 20 20 20 20 20 2f e);.. .. /
19838 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e * If the file on
19839 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 disk is not the
1983a 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 same size as th
1983b 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 e database image
1983c 2c 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e ,.. ** then
1983d 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63 use pager_trunc
1983e 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 ate to grow or s
1983f 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 hrink the file h
19840 65 72 65 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a ere... */..
19841 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 if( pPager
19842 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 ->dbSize!=pPager
19843 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0d ->dbFileSize ){.
19844 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e . Pgno nN
19845 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 ew = pPager->dbS
19846 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 ize - (pPager->d
19847 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f bSize==PAGER_MJ_
19848 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0d 0a PGNO(pPager));..
19849 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
1984a 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d pPager->eState==
1984b 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d PAGER_WRITER_DBM
1984c 4f 44 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 OD );.. r
1984d 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 c = pager_trunca
1984e 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 te(pPager, nNew)
1984f 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 ;.. if( r
19850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 c!=SQLITE_OK ) g
19851 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 oto commit_phase
19852 5f 6f 6e 65 5f 65 78 69 74 3b 0d 0a 20 20 20 20 _one_exit;..
19853 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 20 20 2f }.. .. /
19854 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 * Finally, sync
19855 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
19856 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 e. */.. if(
19857 20 21 6e 6f 53 79 6e 63 20 29 7b 0d 0a 20 20 20 !noSync ){..
19858 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
19859 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 3PagerSync(pPage
1985a 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 r);.. }..
1985b 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 IOTRACE(("DB
1985c 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 SYNC %p\n", pPag
1985d 65 72 29 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d er)).. }.. }
1985e 0d 0a 0d 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 ....commit_phase
1985f 5f 6f 6e 65 5f 65 78 69 74 3a 0d 0a 20 20 69 66 _one_exit:.. if
19860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
19861 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 && !pagerUseWal(
19862 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 20 20 pPager) ){..
19863 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d pPager->eState =
19864 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 PAGER_WRITER_FI
19865 4e 49 53 48 45 44 3b 0d 0a 20 20 7d 0d 0a 20 20 NISHED;.. }..
19866 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
19867 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 68 65 6e 20 74 .../*..** When t
19868 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
19869 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 called, the data
1986a 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 base file has be
1986b 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0d 0a 2a en completely..*
1986c 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 * updated to ref
1986d 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 lect the changes
1986e 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 made by the cur
1986f 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e rent transaction
19870 20 61 6e 64 0d 0a 2a 2a 20 73 79 6e 63 65 64 20 and..** synced
19871 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 to disk. The jou
19872 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 rnal file still
19873 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 exists in the fi
19874 6c 65 2d 73 79 73 74 65 6d 20 0d 0a 2a 2a 20 74 le-system ..** t
19875 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 hough, and if a
19876 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 failure occurs a
19877 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 t this point it
19878 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0d will eventually.
19879 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 .** be used as a
1987a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 hot-journal and
1987b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 the current tra
1987c 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 nsaction rolled
1987d 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 back...**..** Th
1987e 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 is function fina
1987f 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 lizes the journa
19880 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 l file, either b
19881 79 20 64 65 6c 65 74 69 6e 67 2c 20 0d 0a 2a 2a y deleting, ..**
19882 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 truncating or p
19883 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 artially zeroing
19884 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 it, so that it
19885 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0d cannot be used .
19886 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 .** for hot-jour
19887 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e nal rollback. On
19888 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 ce this is done
19889 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 the transaction
1988a 69 73 0d 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 is..** irrevocab
1988b 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0d 0a 2a ly committed...*
1988c 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f *..** If an erro
1988d 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 r occurs, an IO
1988e 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
1988f 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 turned and the p
19890 61 67 65 72 0d 0a 2a 2a 20 6d 6f 76 65 73 20 69 ager..** moves i
19891 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 nto the error st
19892 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ate. Otherwise,
19893 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 SQLITE_OK is ret
19894 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 urned...*/..SQLI
19895 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
19896 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 qlite3PagerCommi
19897 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 tPhaseTwo(Pager
19898 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 69 6e 74 *pPager){.. int
19899 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
1989a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1989b 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 /* Return code
1989c 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 54 68 69 73 */.... /* This
1989d 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 routine should
1989e 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 not be called if
1989f 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 a prior error h
198a0 61 73 20 6f 63 63 75 72 72 65 64 2e 0d 0a 20 20 as occurred...
198a1 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74 ** But if (due t
198a2 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 o a coding error
198a3 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 elsewhere in th
198a4 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 e system) it doe
198a5 73 20 67 65 74 0d 0a 20 20 2a 2a 20 63 61 6c 6c s get.. ** call
198a6 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 ed, just return
198a7 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 the same error c
198a8 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e ode without doin
198a9 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0d 0a g anything. */..
198aa 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 if( NEVER(pPag
198ab 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 er->errCode) ) r
198ac 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 eturn pPager->er
198ad 72 43 6f 64 65 3b 0d 0a 0d 0a 20 20 61 73 73 65 rCode;.... asse
198ae 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 rt( pPager->eSta
198af 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 te==PAGER_WRITER
198b0 5f 4c 4f 43 4b 45 44 0d 0a 20 20 20 20 20 20 20 _LOCKED..
198b1 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 || pPager->eStat
198b2 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f e==PAGER_WRITER_
198b3 46 49 4e 49 53 48 45 44 0d 0a 20 20 20 20 20 20 FINISHED..
198b4 20 7c 7c 20 28 70 61 67 65 72 55 73 65 57 61 6c || (pagerUseWal
198b5 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 (pPager) && pPag
198b6 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 er->eState==PAGE
198b7 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f R_WRITER_CACHEMO
198b8 44 29 0d 0a 20 20 29 3b 0d 0a 20 20 61 73 73 65 D).. );.. asse
198b9 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 rt( assert_pager
198ba 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 _state(pPager) )
198bb 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 ;.... /* An opt
198bc 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 imization. If th
198bd 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e e database was n
198be 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 ot actually modi
198bf 66 69 65 64 20 64 75 72 69 6e 67 0d 0a 20 20 2a fied during.. *
198c0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 * this transacti
198c1 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 on, the pager is
198c2 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c running in excl
198c3 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 usive-mode and i
198c4 73 0d 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 s.. ** using pe
198c5 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c rsistent journal
198c6 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e s, then this fun
198c7 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 ction is a no-op
198c8 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 ... **.. ** Th
198c9 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a e start of the j
198ca 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 ournal file curr
198cb 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 ently contains a
198cc 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 single journal
198cd 0d 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 .. ** header wi
198ce 74 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c th the nRec fiel
198cf 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 d set to 0. If s
198d0 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 uch a journal is
198d1 20 75 73 65 64 20 61 73 0d 0a 20 20 2a 2a 20 61 used as.. ** a
198d2 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 hot-journal dur
198d3 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 ing hot-journal
198d4 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e rollback, 0 chan
198d5 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 ges will be made
198d6 0d 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 .. ** to the da
198d7 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 tabase file. So
198d8 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 there is no need
198d9 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 to zero the jou
198da 72 6e 61 6c 20 0d 0a 20 20 2a 2a 20 68 65 61 64 rnal .. ** head
198db 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 er. Since the pa
198dc 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 ger is in exclus
198dd 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 ive mode, there
198de 69 73 20 6e 6f 20 6e 65 65 64 0d 0a 20 20 2a 2a is no need.. **
198df 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 to drop any loc
198e0 6b 73 20 65 69 74 68 65 72 2e 0d 0a 20 20 2a 2f ks either... */
198e1 0d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e .. if( pPager->
198e2 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 eState==PAGER_WR
198e3 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0d 0a 20 20 ITER_LOCKED ..
198e4 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c && pPager->excl
198e5 75 73 69 76 65 4d 6f 64 65 20 0d 0a 20 20 20 26 usiveMode .. &
198e6 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 & pPager->journa
198e7 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 lMode==PAGER_JOU
198e8 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 RNALMODE_PERSIST
198e9 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 .. ){.. asse
198ea 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 rt( pPager->jour
198eb 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f nalOff==JOURNAL_
198ec 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 7c HDR_SZ(pPager) |
198ed 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e | !pPager->journ
198ee 61 6c 4f 66 66 20 29 3b 0d 0a 20 20 20 20 70 50 alOff );.. pP
198ef 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 ager->eState = P
198f0 41 47 45 52 5f 52 45 41 44 45 52 3b 0d 0a 20 20 AGER_READER;..
198f1 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
198f2 4f 4b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 50 41 OK;.. }.... PA
198f3 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 GERTRACE(("COMMI
198f4 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 T %d\n", PAGERID
198f5 28 70 50 61 67 65 72 29 29 29 3b 0d 0a 20 20 72 (pPager)));.. r
198f6 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 c = pager_end_tr
198f7 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 ansaction(pPager
198f8 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 , pPager->setMas
198f9 74 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 ter);.. return
198fa 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 pager_error(pPag
198fb 65 72 2c 20 72 63 29 3b 0d 0a 7d 0d 0a 0d 0a 2f er, rc);..}..../
198fc 2a 0d 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65 *..** If a write
198fd 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 transaction is
198fe 6f 70 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20 63 open, then all c
198ff 68 61 6e 67 65 73 20 6d 61 64 65 20 77 69 74 68 hanges made with
19900 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 74 72 61 6e in the ..** tran
19901 73 61 63 74 69 6f 6e 20 61 72 65 20 72 65 76 65 saction are reve
19902 72 74 65 64 20 61 6e 64 20 74 68 65 20 63 75 72 rted and the cur
19903 72 65 6e 74 20 77 72 69 74 65 2d 74 72 61 6e 73 rent write-trans
19904 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 action is closed
19905 2e 0d 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 ...** The pager
19906 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 falls back to PA
19907 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 GER_READER state
19908 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 if successful,
19909 6f 72 20 50 41 47 45 52 5f 45 52 52 4f 52 0d 0a or PAGER_ERROR..
1990a 2a 2a 20 73 74 61 74 65 20 69 66 20 61 6e 20 65 ** state if an e
1990b 72 72 6f 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2a rror occurs...**
1990c 0d 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 ..** If the page
1990d 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 r is already in
1990e 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 PAGER_ERROR stat
1990f 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 e when this func
19910 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0d tion is called,.
19911 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 50 .** it returns P
19912 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 6d 6d ager.errCode imm
19913 65 64 69 61 74 65 6c 79 2e 20 4e 6f 20 77 6f 72 ediately. No wor
19914 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 k is performed i
19915 6e 20 74 68 69 73 20 63 61 73 65 2e 0d 0a 2a 2a n this case...**
19916 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 ..** Otherwise,
19917 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 in rollback mode
19918 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 , this function
19919 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 66 75 6e performs two fun
1991a 63 74 69 6f 6e 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 ctions:..**..**
1991b 20 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 1) It rolls ba
1991c 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 ck the journal f
1991d 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 ile, restoring a
1991e 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 ll database file
1991f 20 61 6e 64 20 0d 0a 2a 2a 20 20 20 20 20 20 69 and ..** i
19920 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 n-memory cache p
19921 61 67 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 ages to the stat
19922 65 20 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 e they were in w
19923 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 hen the transact
19924 69 6f 6e 0d 0a 2a 2a 20 20 20 20 20 20 77 61 73 ion..** was
19925 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0d 0a 2a 2a opened, and..**
19926 0d 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e ..** 2) It fin
19927 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e alizes the journ
19928 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 al file, so that
19929 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 it is not used
1992a 66 6f 72 20 68 6f 74 0d 0a 2a 2a 20 20 20 20 20 for hot..**
1992b 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 rollback at any
1992c 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 point in the fu
1992d 74 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 69 ture...**..** Fi
1992e 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 nalization of th
1992f 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 e journal file (
19930 74 61 73 6b 20 32 29 20 69 73 20 6f 6e 6c 79 20 task 2) is only
19931 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 performed if the
19932 20 0d 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 ..** rollback i
19933 73 20 73 75 63 63 65 73 73 66 75 6c 2e 0d 0a 2a s successful...*
19934 2a 0d 0a 2a 2a 20 49 6e 20 57 41 4c 20 6d 6f 64 *..** In WAL mod
19935 65 2c 20 61 6c 6c 20 63 61 63 68 65 2d 65 6e 74 e, all cache-ent
19936 72 69 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ries containing
19937 64 61 74 61 20 6d 6f 64 69 66 69 65 64 20 77 69 data modified wi
19938 74 68 69 6e 20 74 68 65 0d 0a 2a 2a 20 63 75 72 thin the..** cur
19939 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e rent transaction
1993a 20 61 72 65 20 65 69 74 68 65 72 20 65 78 70 65 are either expe
1993b 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 lled from the ca
1993c 63 68 65 20 6f 72 20 72 65 76 65 72 74 65 64 20 che or reverted
1993d 74 6f 0d 0a 2a 2a 20 74 68 65 69 72 20 70 72 65 to..** their pre
1993e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 -transaction sta
1993f 74 65 20 62 79 20 72 65 2d 72 65 61 64 69 6e 67 te by re-reading
19940 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 data from the d
19941 61 74 61 62 61 73 65 20 6f 72 0d 0a 2a 2a 20 57 atabase or..** W
19942 41 4c 20 66 69 6c 65 73 2e 20 54 68 65 20 57 41 AL files. The WA
19943 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 L transaction is
19944 20 74 68 65 6e 20 63 6c 6f 73 65 64 2e 0d 0a 2a then closed...*
19945 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
19946 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 E int sqlite3Pag
19947 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 erRollback(Pager
19948 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 69 6e *pPager){.. in
19949 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
1994a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1994b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 /* Return cod
1994c 65 20 2a 2f 0d 0a 20 20 50 41 47 45 52 54 52 41 e */.. PAGERTRA
1994d 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 CE(("ROLLBACK %d
1994e 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 \n", PAGERID(pPa
1994f 67 65 72 29 29 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 ger)));.... /*
19950 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 PagerRollback()
19951 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 63 61 is a no-op if ca
19952 6c 6c 65 64 20 69 6e 20 52 45 41 44 45 52 20 6f lled in READER o
19953 72 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 r OPEN state. If
19954 0d 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 .. ** the pager
19955 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 is already in t
19956 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 he ERROR state,
19957 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 the rollback is
19958 6e 6f 74 20 0d 0a 20 20 2a 2a 20 61 74 74 65 6d not .. ** attem
19959 70 74 65 64 20 68 65 72 65 2e 20 49 6e 73 74 65 pted here. Inste
1995a 61 64 2c 20 74 68 65 20 65 72 72 6f 72 20 63 6f ad, the error co
1995b 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 de is returned t
1995c 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 o the caller...
1995d 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 61 */.. assert( a
1995e 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 ssert_pager_stat
1995f 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 e(pPager) );..
19960 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 if( pPager->eSta
19961 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 te==PAGER_ERROR
19962 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d ) return pPager-
19963 3e 65 72 72 43 6f 64 65 3b 0d 0a 20 20 69 66 28 >errCode;.. if(
19964 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c pPager->eState<
19965 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 20 =PAGER_READER )
19966 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
19967 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 61 67 65 72 ;.... if( pager
19968 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 UseWal(pPager) )
19969 7b 0d 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0d {.. int rc2;.
1996a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1996b 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 3PagerSavepoint(
1996c 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e pPager, SAVEPOIN
1996d 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b T_ROLLBACK, -1);
1996e 0d 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 .. rc2 = page
1996f 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f r_end_transactio
19970 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 n(pPager, pPager
19971 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0d 0a 20 ->setMaster);..
19972 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
19973 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b E_OK ) rc = rc2;
19974 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 .. }else if( !i
19975 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 sOpen(pPager->jf
19976 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 d) || pPager->eS
19977 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 tate==PAGER_WRIT
19978 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0d 0a 20 20 ER_LOCKED ){..
19979 20 20 69 6e 74 20 65 53 74 61 74 65 20 3d 20 70 int eState = p
1997a 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3b 0d 0a Pager->eState;..
1997b 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 rc = pager_e
1997c 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 nd_transaction(p
1997d 50 61 67 65 72 2c 20 30 29 3b 0d 0a 20 20 20 20 Pager, 0);..
1997e 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 65 53 if( !MEMDB && eS
1997f 74 61 74 65 3e 50 41 47 45 52 5f 57 52 49 54 45 tate>PAGER_WRITE
19980 52 5f 4c 4f 43 4b 45 44 20 29 7b 0d 0a 20 20 20 R_LOCKED ){..
19981 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e 20 68 /* This can h
19982 61 70 70 65 6e 20 75 73 69 6e 67 20 6a 6f 75 72 appen using jour
19983 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 2e 20 4d 6f nal_mode=off. Mo
19984 76 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 ve the pager to
19985 74 68 65 20 65 72 72 6f 72 20 0d 0a 20 20 20 20 the error ..
19986 20 20 2a 2a 20 73 74 61 74 65 20 74 6f 20 69 6e ** state to in
19987 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 dicate that the
19988 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
19989 63 61 63 68 65 20 6d 61 79 20 6e 6f 74 20 62 65 cache may not be
1998a 20 74 72 75 73 74 65 64 2e 0d 0a 20 20 20 20 20 trusted...
1998b 20 2a 2a 20 41 6e 79 20 61 63 74 69 76 65 20 72 ** Any active r
1998c 65 61 64 65 72 73 20 77 69 6c 6c 20 67 65 74 20 eaders will get
1998d 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0d 0a 20 SQLITE_ABORT...
1998e 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 70 */.. p
1998f 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d Pager->errCode =
19990 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0d 0a SQLITE_ABORT;..
19991 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 pPager->eS
19992 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 tate = PAGER_ERR
19993 4f 52 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 OR;.. retur
19994 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 n rc;.. }..
19995 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 20 3d }else{.. rc =
19996 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 pager_playback(
19997 70 50 61 67 65 72 2c 20 30 29 3b 0d 0a 20 20 7d pPager, 0);.. }
19998 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 .... assert( pP
19999 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 ager->eState==PA
1999a 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 72 63 GER_READER || rc
1999b 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a !=SQLITE_OK );..
1999c 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 assert( rc==SQ
1999d 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 LITE_OK || rc==S
1999e 51 4c 49 54 45 5f 46 55 4c 4c 0d 0a 20 20 20 20 QLITE_FULL..
1999f 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c || rc==SQL
199a0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 28 72 63 ITE_NOMEM || (rc
199a1 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 49 &0xFF)==SQLITE_I
199a2 4f 45 52 52 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 OERR );.... /*
199a3 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 If an error occu
199a4 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c rs during a ROLL
199a5 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 BACK, we can no
199a6 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 longer trust the
199a7 20 70 61 67 65 72 0d 0a 20 20 2a 2a 20 63 61 63 pager.. ** cac
199a8 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 he. So call page
199a9 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 r_error() on the
199aa 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 way out to make
199ab 20 61 6e 79 20 65 72 72 6f 72 20 70 65 72 73 69 any error persi
199ac 73 74 65 6e 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 stent... */..
199ad 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 return pager_err
199ae 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0d or(pPager, rc);.
199af 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 .}..../*..** Ret
199b0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 urn TRUE if the
199b1 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 database file is
199b2 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c opened read-onl
199b3 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 y. Return FALSE
199b4 0d 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 ..** if the data
199b5 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f base is (in theo
199b6 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0d 0a 2a ry) writable...*
199b7 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
199b8 45 20 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 E u8 sqlite3Page
199b9 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 rIsreadonly(Page
199ba 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 72 r *pPager){.. r
199bb 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 eturn pPager->re
199bc 61 64 4f 6e 6c 79 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a adOnly;..}..../*
199bd 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
199be 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 number of refere
199bf 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 nces to the page
199c0 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 r...*/..SQLITE_P
199c1 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
199c2 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 e3PagerRefcount(
199c3 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d Pager *pPager){.
199c4 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
199c5 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 3PcacheRefCount(
199c6 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 pPager->pPCache)
199c7 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
199c8 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78 eturn the approx
199c9 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 imate number of
199ca 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 bytes of memory
199cb 63 75 72 72 65 6e 74 6c 79 0d 0a 2a 2a 20 75 73 currently..** us
199cc 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 ed by the pager
199cd 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 and its associat
199ce 65 64 20 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 ed cache...*/..S
199cf 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
199d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 t sqlite3PagerMe
199d1 6d 55 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 mUsed(Pager *pPa
199d2 67 65 72 29 7b 0d 0a 20 20 69 6e 74 20 70 65 72 ger){.. int per
199d3 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 PageSize = pPage
199d4 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 70 50 r->pageSize + pP
199d5 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b 20 73 ager->nExtra + s
199d6 69 7a 65 6f 66 28 50 67 48 64 72 29 0d 0a 20 20 izeof(PgHdr)..
199d7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
199d8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
199d9 20 20 20 2b 20 35 2a 73 69 7a 65 6f 66 28 76 6f + 5*sizeof(vo
199da 69 64 2a 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 id*);.. return
199db 70 65 72 50 61 67 65 53 69 7a 65 2a 73 71 6c 69 perPageSize*sqli
199dc 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 te3PcachePagecou
199dd 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 nt(pPager->pPCac
199de 68 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 he)..
199df 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 + sqlite3MallocS
199e0 69 7a 65 28 70 50 61 67 65 72 29 0d 0a 20 20 20 ize(pPager)..
199e1 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65 72 + pPager
199e2 2d 3e 70 61 67 65 53 69 7a 65 3b 0d 0a 7d 0d 0a ->pageSize;..}..
199e3 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ../*..** Return
199e4 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 the number of re
199e5 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 ferences to the
199e6 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0d specified page..
199e7 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
199e8 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
199e9 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 agerPageRefcount
199ea 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b (DbPage *pPage){
199eb 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 .. return sqlit
199ec 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 e3PcachePageRefc
199ed 6f 75 6e 74 28 70 50 61 67 65 29 3b 0d 0a 7d 0d ount(pPage);..}.
199ee 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
199ef 5f 54 45 53 54 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 _TEST../*..** Th
199f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 is routine is us
199f1 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 ed for testing a
199f2 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 nd analysis only
199f3 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
199f4 49 56 41 54 45 20 69 6e 74 20 2a 73 71 6c 69 74 IVATE int *sqlit
199f5 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 e3PagerStats(Pag
199f6 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 er *pPager){..
199f7 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d static int a[11]
199f8 3b 0d 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 ;.. a[0] = sqli
199f9 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e te3PcacheRefCoun
199fa 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 t(pPager->pPCach
199fb 65 29 3b 0d 0a 20 20 61 5b 31 5d 20 3d 20 73 71 e);.. a[1] = sq
199fc 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 lite3PcachePagec
199fd 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 ount(pPager->pPC
199fe 61 63 68 65 29 3b 0d 0a 20 20 61 5b 32 5d 20 3d ache);.. a[2] =
199ff 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 sqlite3PcacheGe
19a00 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 tCachesize(pPage
19a01 72 2d 3e 70 50 43 61 63 68 65 29 3b 0d 0a 20 20 r->pPCache);..
19a02 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 a[3] = pPager->e
19a03 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 State==PAGER_OPE
19a04 4e 20 3f 20 2d 31 20 3a 20 28 69 6e 74 29 20 70 N ? -1 : (int) p
19a05 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0d 0a Pager->dbSize;..
19a06 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d a[4] = pPager-
19a07 3e 65 53 74 61 74 65 3b 0d 0a 20 20 61 5b 35 5d >eState;.. a[5]
19a08 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f = pPager->errCo
19a09 64 65 3b 0d 0a 20 20 61 5b 36 5d 20 3d 20 70 50 de;.. a[6] = pP
19a0a 61 67 65 72 2d 3e 6e 48 69 74 3b 0d 0a 20 20 61 ager->nHit;.. a
19a0b 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d [7] = pPager->nM
19a0c 69 73 73 3b 0d 0a 20 20 61 5b 38 5d 20 3d 20 30 iss;.. a[8] = 0
19a0d 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 ; /* Used to be
19a0e 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a pPager->nOvfl *
19a0f 2f 0d 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 /.. a[9] = pPag
19a10 65 72 2d 3e 6e 52 65 61 64 3b 0d 0a 20 20 61 5b er->nRead;.. a[
19a11 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 10] = pPager->nW
19a12 72 69 74 65 3b 0d 0a 20 20 72 65 74 75 72 6e 20 rite;.. return
19a13 61 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d a;..}..#endif...
19a14 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 61 6d 65 74 65 ./*..** Paramete
19a15 72 20 65 53 74 61 74 20 6d 75 73 74 20 62 65 20 r eStat must be
19a16 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 44 42 either SQLITE_DB
19a17 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 STATUS_CACHE_HIT
19a18 20 6f 72 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 or..** SQLITE_D
19a19 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 BSTATUS_CACHE_MI
19a1a 53 53 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 SS. Before retur
19a1b 6e 69 6e 67 2c 20 2a 70 6e 56 61 6c 20 69 73 20 ning, *pnVal is
19a1c 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 incremented by t
19a1d 68 65 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 he..** current c
19a1e 61 63 68 65 20 68 69 74 20 6f 72 20 6d 69 73 73 ache hit or miss
19a1f 20 63 6f 75 6e 74 2c 20 61 63 63 6f 72 64 69 6e count, accordin
19a20 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f g to the value o
19a21 66 20 65 53 74 61 74 2e 20 49 66 20 74 68 65 20 f eStat. If the
19a22 0d 0a 2a 2a 20 72 65 73 65 74 20 70 61 72 61 6d ..** reset param
19a23 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f eter is non-zero
19a24 2c 20 74 68 65 20 63 61 63 68 65 20 68 69 74 20 , the cache hit
19a25 6f 72 20 6d 69 73 73 20 63 6f 75 6e 74 20 69 73 or miss count is
19a26 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 0d zeroed before .
19a27 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a .** returning...
19a28 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
19a29 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 TE void sqlite3P
19a2a 61 67 65 72 43 61 63 68 65 53 74 61 74 28 50 61 agerCacheStat(Pa
19a2b 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 ger *pPager, int
19a2c 20 65 53 74 61 74 2c 20 69 6e 74 20 72 65 73 65 eStat, int rese
19a2d 74 2c 20 69 6e 74 20 2a 70 6e 56 61 6c 29 7b 0d t, int *pnVal){.
19a2e 0a 20 20 69 6e 74 20 2a 70 69 53 74 61 74 3b 0d . int *piStat;.
19a2f 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 ... assert( eSt
19a30 61 74 3d 3d 53 51 4c 49 54 45 5f 44 42 53 54 41 at==SQLITE_DBSTA
19a31 54 55 53 5f 43 41 43 48 45 5f 48 49 54 0d 0a 20 TUS_CACHE_HIT..
19a32 20 20 20 20 20 20 7c 7c 20 65 53 74 61 74 3d 3d || eStat==
19a33 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f SQLITE_DBSTATUS_
19a34 43 41 43 48 45 5f 4d 49 53 53 0d 0a 20 20 29 3b CACHE_MISS.. );
19a35 0d 0a 20 20 69 66 28 20 65 53 74 61 74 3d 3d 53 .. if( eStat==S
19a36 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 QLITE_DBSTATUS_C
19a37 41 43 48 45 5f 48 49 54 20 29 7b 0d 0a 20 20 20 ACHE_HIT ){..
19a38 20 70 69 53 74 61 74 20 3d 20 26 70 50 61 67 65 piStat = &pPage
19a39 72 2d 3e 6e 48 69 74 3b 0d 0a 20 20 7d 65 6c 73 r->nHit;.. }els
19a3a 65 7b 0d 0a 20 20 20 20 70 69 53 74 61 74 20 3d e{.. piStat =
19a3b 20 26 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b &pPager->nMiss;
19a3c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 6e 56 61 .. }.... *pnVa
19a3d 6c 20 2b 3d 20 2a 70 69 53 74 61 74 3b 0d 0a 20 l += *piStat;..
19a3e 20 69 66 28 20 72 65 73 65 74 20 29 7b 0d 0a 20 if( reset ){..
19a3f 20 20 20 2a 70 69 53 74 61 74 20 3d 20 30 3b 0d *piStat = 0;.
19a40 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
19a41 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
19a42 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d this is an in-m
19a43 65 6d 6f 72 79 20 70 61 67 65 72 2e 0d 0a 2a 2f emory pager...*/
19a44 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
19a45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
19a46 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a rIsMemdb(Pager *
19a47 70 50 61 67 65 72 29 7b 0d 0a 20 20 72 65 74 75 pPager){.. retu
19a48 72 6e 20 4d 45 4d 44 42 3b 0d 0a 7d 0d 0a 0d 0a rn MEMDB;..}....
19a49 2f 2a 0d 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 /*..** Check tha
19a4a 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c t there are at l
19a4b 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 east nSavepoint
19a4c 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e savepoints open.
19a4d 20 49 66 20 74 68 65 72 65 20 61 72 65 0d 0a 2a If there are..*
19a4e 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 * currently less
19a4f 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 than nSavepoint
19a50 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 s open, then ope
19a51 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 n one or more sa
19a52 76 65 70 6f 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 vepoints..** to
19a53 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 make up the diff
19a54 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e erence. If the n
19a55 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 umber of savepoi
19a56 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0d 0a nts is already..
19a57 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 ** equal to nSav
19a58 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 epoint, then thi
19a59 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 s function is a
19a5a 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 no-op...**..** I
19a5b 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 f a memory alloc
19a5c 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c ation fails, SQL
19a5d 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 ITE_NOMEM is ret
19a5e 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 urned. If an err
19a5f 6f 72 20 0d 0a 2a 2a 20 6f 63 63 75 72 73 20 77 or ..** occurs w
19a60 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 hile opening the
19a61 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c sub-journal fil
19a62 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 e, then an IO er
19a63 72 6f 72 20 63 6f 64 65 20 69 73 0d 0a 2a 2a 20 ror code is..**
19a64 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 returned. Otherw
19a65 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d ise, SQLITE_OK..
19a66 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
19a67 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
19a68 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e agerOpenSavepoin
19a69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c t(Pager *pPager,
19a6a 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 int nSavepoint)
19a6b 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 {.. int rc = SQ
19a6c 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
19a6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
19a6e 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
19a6f 0d 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 .. int nCurrent
19a70 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 = pPager->nSave
19a71 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a point; /*
19a72 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 Current number
19a73 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f of savepoints */
19a74 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 .... assert( pP
19a75 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 ager->eState>=PA
19a76 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 GER_WRITER_LOCKE
19a77 44 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 D );.. assert(
19a78 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 assert_pager_sta
19a79 74 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 0d te(pPager) );...
19a7a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e . if( nSavepoin
19a7b 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 t>nCurrent && pP
19a7c 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c ager->useJournal
19a7d 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 69 3b ){.. int ii;
19a7e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19a7f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19a80 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 /* Iterator var
19a81 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 50 61 iable */.. Pa
19a82 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e gerSavepoint *aN
19a83 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ew;
19a84 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 /* New Pag
19a85 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 er.aSavepoint ar
19a86 72 61 79 20 2a 2f 0d 0a 0d 0a 20 20 20 20 2f 2a ray */.... /*
19a87 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e Grow the Pager.
19a88 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 aSavepoint array
19a89 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 using realloc()
19a8a 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f . Return SQLITE_
19a8b 4e 4f 4d 45 4d 0d 0a 20 20 20 20 2a 2a 20 69 66 NOMEM.. ** if
19a8c 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 the allocation
19a8d 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 fails. Otherwise
19a8e 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 , zero the new p
19a8f 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 ortion in case a
19a90 20 0d 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 .. ** malloc
19a91 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 failure occurs
19a92 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 while populating
19a93 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e it in the for(.
19a94 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0d ..) loop below..
19a95 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 4e 65 . */.. aNe
19a96 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f w = (PagerSavepo
19a97 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 int *)sqlite3Rea
19a98 6c 6c 6f 63 28 0d 0a 20 20 20 20 20 20 20 20 70 lloc(.. p
19a99 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e Pager->aSavepoin
19a9a 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 t, sizeof(PagerS
19a9b 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 avepoint)*nSavep
19a9c 6f 69 6e 74 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 oint.. );..
19a9d 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0d 0a if( !aNew ){..
19a9e 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
19a9f 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 ITE_NOMEM;..
19aa0 7d 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 }.. memset(&a
19aa1 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 New[nCurrent], 0
19aa2 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 , (nSavepoint-nC
19aa3 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 urrent) * sizeof
19aa4 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 (PagerSavepoint)
19aa5 29 3b 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e );.. pPager->
19aa6 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 aSavepoint = aNe
19aa7 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 50 6f 70 w;.... /* Pop
19aa8 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 ulate the PagerS
19aa9 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 avepoint structu
19aaa 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 res just allocat
19aab 65 64 2e 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 ed. */.. for(
19aac 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c ii=nCurrent; ii<
19aad 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b nSavepoint; ii++
19aae 29 7b 0d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 ){.. aNew[i
19aaf 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 i].nOrig = pPage
19ab0 72 2d 3e 64 62 53 69 7a 65 3b 0d 0a 20 20 20 20 r->dbSize;..
19ab1 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 if( isOpen(pPa
19ab2 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 ger->jfd) && pPa
19ab3 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e ger->journalOff>
19ab4 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 4e 0 ){.. aN
19ab5 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d ew[ii].iOffset =
19ab6 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c pPager->journal
19ab7 4f 66 66 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 Off;.. }els
19ab8 65 7b 0d 0a 20 20 20 20 20 20 20 20 61 4e 65 77 e{.. aNew
19ab9 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a [ii].iOffset = J
19aba 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 OURNAL_HDR_SZ(pP
19abb 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d ager);.. }.
19abc 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e . aNew[ii].
19abd 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 iSubRec = pPager
19abe 2d 3e 6e 53 75 62 52 65 63 3b 0d 0a 20 20 20 20 ->nSubRec;..
19abf 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 aNew[ii].pInSa
19ac0 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 vepoint = sqlite
19ac1 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 3BitvecCreate(pP
19ac2 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0d 0a ager->dbSize);..
19ac3 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b if( !aNew[
19ac4 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 ii].pInSavepoint
19ac5 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 ){.. ret
19ac6 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
19ac7 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
19ac8 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 if( pagerUseWa
19ac9 6c 28 70 50 61 67 65 72 29 20 29 7b 0d 0a 20 20 l(pPager) ){..
19aca 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c sqlite3Wal
19acb 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 Savepoint(pPager
19acc 2d 3e 70 57 61 6c 2c 20 61 4e 65 77 5b 69 69 5d ->pWal, aNew[ii]
19acd 2e 61 57 61 6c 44 61 74 61 29 3b 0d 0a 20 20 20 .aWalData);..
19ace 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 50 61 67 }.. pPag
19acf 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d er->nSavepoint =
19ad0 20 69 69 2b 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ii+1;.. }..
19ad1 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 assert( pPage
19ad2 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e r->nSavepoint==n
19ad3 53 61 76 65 70 6f 69 6e 74 20 29 3b 0d 0a 20 20 Savepoint );..
19ad4 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 assertTruncate
19ad5 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 Constraint(pPage
19ad6 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 r);.. }.... re
19ad7 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
19ad8 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 *..** This funct
19ad9 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
19ada 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c rollback or rel
19adb 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 ease (commit) a
19adc 73 61 76 65 70 6f 69 6e 74 2e 0d 0a 2a 2a 20 54 savepoint...** T
19add 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 he savepoint to
19ade 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 release or rollb
19adf 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 ack need not be
19ae0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c the most recentl
19ae1 79 20 0d 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 y ..** created s
19ae2 61 76 65 70 6f 69 6e 74 2e 0d 0a 2a 2a 0d 0a 2a avepoint...**..*
19ae3 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 * Parameter op i
19ae4 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 s always either
19ae5 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
19ae6 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f CK or SAVEPOINT_
19ae7 52 45 4c 45 41 53 45 2e 0d 0a 2a 2a 20 49 66 20 RELEASE...** If
19ae8 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f it is SAVEPOINT_
19ae9 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 RELEASE, then re
19aea 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f lease and destro
19aeb 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 y the savepoint
19aec 77 69 74 68 0d 0a 2a 2a 20 69 6e 64 65 78 20 69 with..** index i
19aed 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 Savepoint. If it
19aee 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f is SAVEPOINT_RO
19aef 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c LLBACK, then rol
19af0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 lback all change
19af1 73 0d 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 s..** that have
19af2 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 occurred since t
19af3 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 he specified sav
19af4 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 epoint was creat
19af5 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ed...**..** The
19af6 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c savepoint to rol
19af7 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 lback or release
19af8 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 is identified b
19af9 79 20 70 61 72 61 6d 65 74 65 72 20 0d 0a 2a 2a y parameter ..**
19afa 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 iSavepoint. A v
19afb 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 alue of 0 means
19afc 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
19afd 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 e outermost save
19afe 70 6f 69 6e 74 0d 0a 2a 2a 20 28 74 68 65 20 66 point..** (the f
19aff 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41 irst created). A
19b00 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72 value of (Pager
19b01 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d .nSavepoint-1) m
19b02 65 61 6e 73 20 6f 70 65 72 61 74 65 0d 0a 2a 2a eans operate..**
19b03 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 on the most rec
19b04 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 ently created sa
19b05 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 vepoint. If iSav
19b06 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 epoint is greate
19b07 72 20 74 68 61 6e 0d 0a 2a 2a 20 28 50 61 67 65 r than..** (Page
19b08 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c r.nSavepoint-1),
19b09 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 then this funct
19b0a 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d ion is a no-op..
19b0b 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 6e 65 67 .**..** If a neg
19b0c 61 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 ative value is p
19b0d 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 assed to this fu
19b0e 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 nction, then the
19b0f 20 63 75 72 72 65 6e 74 0d 0a 2a 2a 20 74 72 61 current..** tra
19b10 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c nsaction is roll
19b11 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 ed back. This is
19b12 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 different to ca
19b13 6c 6c 69 6e 67 20 0d 0a 2a 2a 20 73 71 6c 69 74 lling ..** sqlit
19b14 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 e3PagerRollback(
19b15 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20 66 ) because this f
19b16 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 unction does not
19b17 20 74 65 72 6d 69 6e 61 74 65 0d 0a 2a 2a 20 74 terminate..** t
19b18 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f he transaction o
19b19 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 r unlock the dat
19b1a 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72 abase, it just r
19b1b 65 73 74 6f 72 65 73 20 74 68 65 20 0d 0a 2a 2a estores the ..**
19b1c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 contents of the
19b1d 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 database to its
19b1e 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e original state.
19b1f 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 61 6e 79 ..**..** In any
19b20 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 case, all savep
19b21 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e oints with an in
19b22 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e dex greater than
19b23 20 69 53 61 76 65 70 6f 69 6e 74 20 0d 0a 2a 2a iSavepoint ..**
19b24 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 are destroyed.
19b25 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c If this is a rel
19b26 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 ease operation (
19b27 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 op==SAVEPOINT_RE
19b28 4c 45 41 53 45 29 2c 0d 0a 2a 2a 20 74 68 65 6e LEASE),..** then
19b29 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 savepoint iSave
19b2a 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 point is also de
19b2b 73 74 72 6f 79 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a stroyed...**..**
19b2c 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d This function m
19b2d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ay return SQLITE
19b2e 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f _NOMEM if a memo
19b2f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 ry allocation fa
19b30 69 6c 73 2c 0d 0a 2a 2a 20 6f 72 20 61 6e 20 49 ils,..** or an I
19b31 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 O error code if
19b32 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 an IO error occu
19b33 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 rs while rolling
19b34 20 62 61 63 6b 20 61 20 0d 0a 2a 2a 20 73 61 76 back a ..** sav
19b35 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 epoint. If no er
19b36 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 rors occur, SQLI
19b37 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 TE_OK is returne
19b38 64 2e 0d 0a 2a 2f 20 0d 0a 53 51 4c 49 54 45 5f d...*/ ..SQLITE_
19b39 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
19b3a 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e te3PagerSavepoin
19b3b 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c t(Pager *pPager,
19b3c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 int op, int iSa
19b3d 76 65 70 6f 69 6e 74 29 7b 0d 0a 20 20 69 6e 74 vepoint){.. int
19b3e 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 rc = pPager->er
19b3f 72 43 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 rCode; /*
19b40 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
19b41 0d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d .. assert( op==
19b42 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
19b43 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 E || op==SAVEPOI
19b44 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0d 0a NT_ROLLBACK );..
19b45 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 assert( iSavep
19b46 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 oint>=0 || op==S
19b47 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
19b48 4b 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 72 63 K );.... if( rc
19b49 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 ==SQLITE_OK && i
19b4a 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 Savepoint<pPager
19b4b 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0d ->nSavepoint ){.
19b4c 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 . int ii;
19b4d 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 /* Itera
19b4e 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d tor variable */.
19b4f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 . int nNew;
19b50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
19b51 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 r of remaining s
19b52 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 avepoints after
19b53 74 68 69 73 20 6f 70 2e 20 2a 2f 0d 0a 0d 0a 20 this op. */....
19b54 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 /* Figure out
19b55 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f how many savepo
19b56 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 ints will still
19b57 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20 be active after
19b58 74 68 69 73 0d 0a 20 20 20 20 2a 2a 20 6f 70 65 this.. ** ope
19b59 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 ration. Store th
19b5a 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 is value in nNew
19b5b 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f . Then free reso
19b5c 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 urces associated
19b5d 20 0d 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 .. ** with a
19b5e 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 ny savepoints th
19b5f 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 at are destroyed
19b60 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 by this operati
19b61 6f 6e 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 on... */..
19b62 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 nNew = iSavepoi
19b63 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 nt + (( op==SAVE
19b64 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 POINT_RELEASE )
19b65 3f 20 30 20 3a 20 31 29 3b 0d 0a 20 20 20 20 66 ? 0 : 1);.. f
19b66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 or(ii=nNew; ii<p
19b67 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e Pager->nSavepoin
19b68 74 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 t; ii++){..
19b69 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 sqlite3BitvecDe
19b6a 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 stroy(pPager->aS
19b6b 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e avepoint[ii].pIn
19b6c 53 61 76 65 70 6f 69 6e 74 29 3b 0d 0a 20 20 20 Savepoint);..
19b6d 20 7d 0d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e }.. pPager->
19b6e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 nSavepoint = nNe
19b6f 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 20 w;.... /* If
19b70 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 this is a releas
19b71 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f e of the outermo
19b72 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 st savepoint, tr
19b73 75 6e 63 61 74 65 20 0d 0a 20 20 20 20 2a 2a 20 uncate .. **
19b74 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 the sub-journal
19b75 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e to zero bytes in
19b76 20 73 69 7a 65 2e 20 2a 2f 0d 0a 20 20 20 20 69 size. */.. i
19b77 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 f( op==SAVEPOINT
19b78 5f 52 45 4c 45 41 53 45 20 29 7b 0d 0a 20 20 20 _RELEASE ){..
19b79 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 if( nNew==0 &
19b7a 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d & isOpen(pPager-
19b7b 3e 73 6a 66 64 29 20 29 7b 0d 0a 20 20 20 20 20 >sjfd) ){..
19b7c 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 /* Only trunc
19b7d 61 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 ate if it is an
19b7e 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f in-memory sub-jo
19b7f 75 72 6e 61 6c 2e 20 2a 2f 0d 0a 20 20 20 20 20 urnal. */..
19b80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 if( sqlite3Is
19b81 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 MemJournal(pPage
19b82 72 2d 3e 73 6a 66 64 29 20 29 7b 0d 0a 20 20 20 r->sjfd) ){..
19b83 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
19b84 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 te3OsTruncate(pP
19b85 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0d ager->sjfd, 0);.
19b86 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 . asser
19b87 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b t( rc==SQLITE_OK
19b88 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a );.. }..
19b89 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e pPager->
19b8a 6e 53 75 62 52 65 63 20 3d 20 30 3b 0d 0a 20 20 nSubRec = 0;..
19b8b 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 }.. }..
19b8c 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73 20 69 /* Else this i
19b8d 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 s a rollback ope
19b8e 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b ration, playback
19b8f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 the specified s
19b90 61 76 65 70 6f 69 6e 74 2e 0d 0a 20 20 20 20 2a avepoint... *
19b91 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 * If this is a t
19b92 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 emp-file, it is
19b93 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 possible that th
19b94 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 e journal file h
19b95 61 73 0d 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 as.. ** not y
19b96 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 et been opened.
19b97 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 In this case the
19b98 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 re have been no
19b99 63 68 61 6e 67 65 73 20 74 6f 0d 0a 20 20 20 20 changes to..
19b9a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ** the database
19b9b 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 file, so the pla
19b9c 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 yback operation
19b9d 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0d can be skipped..
19b9e 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 65 6c 73 . */.. els
19b9f 65 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 e if( pagerUseWa
19ba0 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f l(pPager) || isO
19ba1 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 pen(pPager->jfd)
19ba2 20 29 7b 0d 0a 20 20 20 20 20 20 50 61 67 65 72 ){.. Pager
19ba3 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 Savepoint *pSave
19ba4 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 point = (nNew==0
19ba5 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 )?0:&pPager->aSa
19ba6 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b vepoint[nNew-1];
19ba7 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 .. rc = pag
19ba8 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f erPlaybackSavepo
19ba9 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 int(pPager, pSav
19baa 65 70 6f 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 epoint);..
19bab 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 assert(rc!=SQLIT
19bac 45 5f 44 4f 4e 45 29 3b 0d 0a 20 20 20 20 7d 0d E_DONE);.. }.
19bad 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e . }.... return
19bae 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc;..}..../*..*
19baf 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c * Return the ful
19bb0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 l pathname of th
19bb1 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e e database file.
19bb2 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
19bb3 56 41 54 45 20 63 6f 6e 73 74 20 63 68 61 72 20 VATE const char
19bb4 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c *sqlite3PagerFil
19bb5 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 ename(Pager *pPa
19bb6 67 65 72 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 ger){.. return
19bb7 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d pPager->zFilenam
19bb8 65 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 e;..}..../*..**
19bb9 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 Return the VFS s
19bba 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 tructure for the
19bbb 20 70 61 67 65 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c pager...*/..SQL
19bbc 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 ITE_PRIVATE cons
19bbd 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 t sqlite3_vfs *s
19bbe 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 qlite3PagerVfs(P
19bbf 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a ager *pPager){..
19bc0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d return pPager-
19bc1 3e 70 56 66 73 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d >pVfs;..}..../*.
19bc2 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 .** Return the f
19bc3 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 ile handle for t
19bc4 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
19bc5 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 2a 2a 20 associated..**
19bc6 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 with the pager.
19bc7 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 This might retu
19bc8 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 rn NULL if the f
19bc9 69 6c 65 20 68 61 73 0d 0a 2a 2a 20 6e 6f 74 20 ile has..** not
19bca 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e yet been opened.
19bcb 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
19bcc 56 41 54 45 20 73 71 6c 69 74 65 33 5f 66 69 6c VATE sqlite3_fil
19bcd 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 e *sqlite3PagerF
19bce 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 ile(Pager *pPage
19bcf 72 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 50 r){.. return pP
19bd0 61 67 65 72 2d 3e 66 64 3b 0d 0a 7d 0d 0a 0d 0a ager->fd;..}....
19bd1 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 /*..** Return th
19bd2 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 e full pathname
19bd3 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 of the journal f
19bd4 69 6c 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ile...*/..SQLITE
19bd5 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 63 _PRIVATE const c
19bd6 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 har *sqlite3Page
19bd7 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 rJournalname(Pag
19bd8 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 er *pPager){..
19bd9 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a return pPager->z
19bda 4a 6f 75 72 6e 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 2f Journal;..}..../
19bdb 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 *..** Return tru
19bdc 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c e if fsync() cal
19bdd 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 ls are disabled
19bde 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 for this pager.
19bdf 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0d 0a 2a Return FALSE..*
19be0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 * if fsync()s ar
19be1 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 e executed norma
19be2 6c 6c 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 lly...*/..SQLITE
19be3 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
19be4 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 ite3PagerNosync(
19be5 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d Pager *pPager){.
19be6 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 . return pPager
19be7 2d 3e 6e 6f 53 79 6e 63 3b 0d 0a 7d 0d 0a 0d 0a ->noSync;..}....
19be8 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 #ifdef SQLITE_HA
19be9 53 5f 43 4f 44 45 43 0d 0a 2f 2a 0d 0a 2a 2a 20 S_CODEC../*..**
19bea 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 Set or retrieve
19beb 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 the codec for th
19bec 69 73 20 70 61 67 65 72 0d 0a 2a 2f 0d 0a 53 51 is pager..*/..SQ
19bed 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 LITE_PRIVATE voi
19bee 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 d sqlite3PagerSe
19bef 74 43 6f 64 65 63 28 0d 0a 20 20 50 61 67 65 72 tCodec(.. Pager
19bf0 20 2a 70 50 61 67 65 72 2c 0d 0a 20 20 76 6f 69 *pPager,.. voi
19bf1 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 d *(*xCodec)(voi
19bf2 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e d*,void*,Pgno,in
19bf3 74 29 2c 0d 0a 20 20 76 6f 69 64 20 28 2a 78 43 t),.. void (*xC
19bf4 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f odecSizeChng)(vo
19bf5 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0d 0a 20 id*,int,int),..
19bf6 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 void (*xCodecFr
19bf7 65 65 29 28 76 6f 69 64 2a 29 2c 0d 0a 20 20 76 ee)(void*),.. v
19bf8 6f 69 64 20 2a 70 43 6f 64 65 63 0d 0a 29 7b 0d oid *pCodec..){.
19bf9 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 . if( pPager->x
19bfa 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 CodecFree ) pPag
19bfb 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 er->xCodecFree(p
19bfc 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0d Pager->pCodec);.
19bfd 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 . pPager->xCode
19bfe 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 c = pPager->memD
19bff 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0d b ? 0 : xCodec;.
19c00 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 . pPager->xCode
19c01 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 cSizeChng = xCod
19c02 65 63 53 69 7a 65 43 68 6e 67 3b 0d 0a 20 20 70 ecSizeChng;.. p
19c03 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 Pager->xCodecFre
19c04 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0d e = xCodecFree;.
19c05 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 . pPager->pCode
19c06 63 20 3d 20 70 43 6f 64 65 63 3b 0d 0a 20 20 70 c = pCodec;.. p
19c07 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 agerReportSize(p
19c08 50 61 67 65 72 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 Pager);..}..SQLI
19c09 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
19c0a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 *sqlite3PagerGet
19c0b 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 Codec(Pager *pPa
19c0c 67 65 72 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 ger){.. return
19c0d 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0d pPager->pCodec;.
19c0e 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 .}..#endif....#i
19c0f 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
19c10 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 2f 2a T_AUTOVACUUM../*
19c11 0d 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 ..** Move the pa
19c12 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 ge pPg to locati
19c13 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 on pgno in the f
19c14 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ile...**..** The
19c15 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 re must be no re
19c16 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 ferences to the
19c17 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 page previously
19c18 6c 6f 63 61 74 65 64 20 61 74 0d 0a 2a 2a 20 70 located at..** p
19c19 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 gno (which we ca
19c1a 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 ll pPgOld) thoug
19c1b 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 h that page is a
19c1c 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0d 0a 2a 2a llowed to be..**
19c1d 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 in cache. If t
19c1e 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 he page previous
19c1f 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 ly located at pg
19c20 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 no is not alread
19c21 79 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c y..** in the rol
19c22 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 lback journal, i
19c23 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 t is not put the
19c24 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f re by by this ro
19c25 75 74 69 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 utine...**..** R
19c26 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 eferences to the
19c27 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e page pPg remain
19c28 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 valid. Updating
19c29 20 61 6e 79 0d 0a 2a 2a 20 6d 65 74 61 2d 64 61 any..** meta-da
19c2a 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ta associated wi
19c2b 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 th pPg (i.e. dat
19c2c 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 a stored in the
19c2d 6e 45 78 74 72 61 20 62 79 74 65 73 0d 0a 2a 2a nExtra bytes..**
19c2e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 allocated along
19c2f 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 with the page)
19c30 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 is the responsib
19c31 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c ility of the cal
19c32 6c 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 74 ler...**..** A t
19c33 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 ransaction must
19c34 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 be active when t
19c35 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
19c36 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 alled. It used t
19c37 6f 20 62 65 0d 0a 2a 2a 20 72 65 71 75 69 72 65 o be..** require
19c38 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 d that a stateme
19c39 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 nt transaction w
19c3a 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 as not active, b
19c3b 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 ut this restrict
19c3c 69 6f 6e 0d 0a 2a 2a 20 68 61 73 20 62 65 65 6e ion..** has been
19c3d 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 removed (CREATE
19c3e 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 INDEX needs to
19c3f 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e move a page when
19c40 20 61 20 73 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a a statement..**
19c41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 transaction is
19c42 61 63 74 69 76 65 29 2e 0d 0a 2a 2a 0d 0a 2a 2a active)...**..**
19c43 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 If the fourth a
19c44 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 rgument, isCommi
19c45 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 t, is non-zero,
19c46 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 then this page i
19c47 73 20 62 65 69 6e 67 0d 0a 2a 2a 20 6d 6f 76 65 s being..** move
19c48 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 d as part of a d
19c49 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 atabase reorgani
19c4a 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f zation just befo
19c4b 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 re the transacti
19c4c 6f 6e 20 0d 0a 2a 2a 20 69 73 20 62 65 69 6e 67 on ..** is being
19c4d 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 committed. In t
19c4e 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 his case, it is
19c4f 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 guaranteed that
19c50 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 the database pag
19c51 65 20 0d 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 e ..** pPg refer
19c52 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 s to will not be
19c53 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 written to agai
19c54 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 n within this tr
19c55 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a ansaction...**..
19c56 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
19c57 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 may return SQLI
19c58 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 TE_NOMEM or an I
19c59 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 O error code if
19c5a 61 6e 20 65 72 72 6f 72 0d 0a 2a 2a 20 6f 63 63 an error..** occ
19c5b 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 urs. Otherwise,
19c5c 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 it returns SQLIT
19c5d 45 5f 4f 4b 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 E_OK...*/..SQLIT
19c5e 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
19c5f 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 lite3PagerMovepa
19c60 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 ge(Pager *pPager
19c61 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 , DbPage *pPg, P
19c62 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 gno pgno, int is
19c63 43 6f 6d 6d 69 74 29 7b 0d 0a 20 20 50 67 48 64 Commit){.. PgHd
19c64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 r *pPgOld;
19c65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
19c66 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 page being overw
19c67 72 69 74 74 65 6e 2e 20 2a 2f 0d 0a 20 20 50 67 ritten. */.. Pg
19c68 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 no needSyncPgno
19c69 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c = 0; /* Ol
19c6a 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e d value of pPg->
19c6b 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 pgno, if sync is
19c6c 20 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20 required */..
19c6d 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
19c6e 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
19c6f 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
19c70 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b Pgno origPgno;
19c71 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
19c72 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 * The original p
19c73 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 0d age number */...
19c74 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e . assert( pPg->
19c75 6e 52 65 66 3e 30 20 29 3b 0d 0a 20 20 61 73 73 nRef>0 );.. ass
19c76 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 ert( pPager->eSt
19c77 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 ate==PAGER_WRITE
19c78 52 5f 43 41 43 48 45 4d 4f 44 0d 0a 20 20 20 20 R_CACHEMOD..
19c79 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 || pPager->eS
19c7a 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 tate==PAGER_WRIT
19c7b 45 52 5f 44 42 4d 4f 44 0d 0a 20 20 29 3b 0d 0a ER_DBMOD.. );..
19c7c 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 assert( assert
19c7d 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 _pager_state(pPa
19c7e 67 65 72 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 ger) );.... /*
19c7f 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 In order to be a
19c80 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c ble to rollback,
19c81 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 an in-memory da
19c82 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 tabase must jour
19c83 6e 61 6c 0d 0a 20 20 2a 2a 20 74 68 65 20 70 61 nal.. ** the pa
19c84 67 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 ge we are moving
19c85 20 66 72 6f 6d 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 from... */..
19c86 69 66 28 20 4d 45 4d 44 42 20 29 7b 0d 0a 20 20 if( MEMDB ){..
19c87 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
19c88 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0d 0a gerWrite(pPg);..
19c89 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 if( rc ) ret
19c8a 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a urn rc;.. }....
19c8b 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 /* If the page
19c8c 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 being moved is
19c8d 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f dirty and has no
19c8e 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 t been saved by
19c8f 74 68 65 20 6c 61 74 65 73 74 0d 0a 20 20 2a 2a the latest.. **
19c90 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e savepoint, then
19c91 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e save the curren
19c92 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 t contents of th
19c93 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 e page into the
19c94 0d 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e .. ** sub-journ
19c95 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 al now. This is
19c96 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 required to hand
19c97 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 le the following
19c98 20 73 63 65 6e 61 72 69 6f 3a 0d 0a 20 20 2a 2a scenario:.. **
19c99 0d 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0d .. ** BEGIN;.
19c9a 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e . ** <journ
19c9b 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 al page X, then
19c9c 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d modify it in mem
19c9d 6f 72 79 3e 0d 0a 20 20 2a 2a 20 20 20 20 20 53 ory>.. ** S
19c9e 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0d 0a 20 AVEPOINT one;..
19c9f 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 ** <Move
19ca0 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 page X to locati
19ca1 6f 6e 20 59 3e 0d 0a 20 20 2a 2a 20 20 20 20 20 on Y>.. **
19ca2 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b ROLLBACK TO one;
19ca3 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 49 66 20 .. **.. ** If
19ca4 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 page X were not
19ca5 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 written to the s
19ca6 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c ub-journal here,
19ca7 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0d 0a 20 it would not..
19ca8 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 ** be possible
19ca9 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 to restore its c
19caa 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 ontents when the
19cab 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e "ROLLBACK TO on
19cac 65 22 0d 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 e".. ** stateme
19cad 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 nt were is proce
19cae 73 73 65 64 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a ssed... **.. *
19caf 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 * subjournalPage
19cb0 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 () may need to a
19cb1 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f llocate space to
19cb2 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f store pPg->pgno
19cb3 20 69 6e 74 6f 0d 0a 20 20 2a 2a 20 6f 6e 65 20 into.. ** one
19cb4 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e or more savepoin
19cb5 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 t bitvecs. This
19cb6 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 is the reason th
19cb7 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 20 20 2a is function.. *
19cb8 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c * may return SQL
19cb9 49 54 45 5f 4e 4f 4d 45 4d 2e 0d 0a 20 20 2a 2f ITE_NOMEM... */
19cba 0d 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 .. if( pPg->fla
19cbb 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 0d 0a gs&PGHDR_DIRTY..
19cbc 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 && subjRequir
19cbd 65 73 50 61 67 65 28 70 50 67 29 0d 0a 20 20 20 esPage(pPg)..
19cbe 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 && SQLITE_OK!=(r
19cbf 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 c = subjournalPa
19cc0 67 65 28 70 50 67 29 29 0d 0a 20 20 29 7b 0d 0a ge(pPg)).. ){..
19cc1 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
19cc2 20 20 7d 0d 0a 0d 0a 20 20 50 41 47 45 52 54 52 }.... PAGERTR
19cc3 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 ACE(("MOVE %d pa
19cc4 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d ge %d (needSync=
19cc5 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c %d) moves to %d\
19cc6 6e 22 2c 20 0d 0a 20 20 20 20 20 20 50 41 47 45 n", .. PAGE
19cc7 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 RID(pPager), pPg
19cc8 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c ->pgno, (pPg->fl
19cc9 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 ags&PGHDR_NEED_S
19cca 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 YNC)?1:0, pgno))
19ccb 3b 0d 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d ;.. IOTRACE(("M
19ccc 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c OVE %p %d %d\n",
19ccd 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 pPager, pPg->pg
19cce 6e 6f 2c 20 70 67 6e 6f 29 29 0d 0a 0d 0a 20 20 no, pgno))....
19ccf 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 /* If the journa
19cd0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 l needs to be sy
19cd1 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 nc()ed before pa
19cd2 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e ge pPg->pgno can
19cd3 0d 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 .. ** be writte
19cd4 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d n to, store pPg-
19cd5 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 >pgno in local v
19cd6 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 ariable needSync
19cd7 50 67 6e 6f 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a Pgno... **.. *
19cd8 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 * If the isCommi
19cd9 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 t flag is set, t
19cda 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 here is no need
19cdb 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 to remember that
19cdc 0d 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e .. ** the journ
19cdd 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 al needs to be s
19cde 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 ync()ed before d
19cdf 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67 atabase page pPg
19ce0 2d 3e 70 67 6e 6f 20 0d 0a 20 20 2a 2a 20 63 61 ->pgno .. ** ca
19ce1 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e n be written to.
19ce2 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 The caller has
19ce3 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 already promised
19ce4 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f not to write to
19ce5 20 69 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 it... */.. if
19ce6 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 ( (pPg->flags&PG
19ce7 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 HDR_NEED_SYNC) &
19ce8 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0d 0a & !isCommit ){..
19ce9 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f needSyncPgno
19cea 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0d 0a 20 = pPg->pgno;..
19ceb 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 assert( pageI
19cec 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c nJournal(pPg) ||
19ced 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 pPg->pgno>pPage
19cee 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b r->dbOrigSize );
19cef 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 .. assert( pP
19cf0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 g->flags&PGHDR_D
19cf1 49 52 54 59 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a IRTY );.. }....
19cf2 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 /* If the cach
19cf3 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 e contains a pag
19cf4 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 e with page-numb
19cf5 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 er pgno, remove
19cf6 69 74 0d 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 it.. ** from it
19cf7 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c s hash chain. Al
19cf8 73 6f 2c 20 69 66 20 74 68 65 20 50 47 48 44 52 so, if the PGHDR
19cf9 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 _NEED_SYNC flag
19cfa 77 61 73 20 73 65 74 20 66 6f 72 20 0d 0a 20 20 was set for ..
19cfb 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 ** page pgno bef
19cfc 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f ore the 'move' o
19cfd 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 peration, it nee
19cfe 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 ds to be retaine
19cff 64 20 0d 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 d .. ** for the
19d00 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 page moved ther
19d01 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 70 50 67 2d e... */.. pPg-
19d02 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 >flags &= ~PGHDR
19d03 5f 4e 45 45 44 5f 53 59 4e 43 3b 0d 0a 20 20 70 _NEED_SYNC;.. p
19d04 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f PgOld = pager_lo
19d05 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e okup(pPager, pgn
19d06 6f 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 21 o);.. assert( !
19d07 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 pPgOld || pPgOld
19d08 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0d 0a 20 20 ->nRef==1 );..
19d09 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0d 0a 20 if( pPgOld ){..
19d0a 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d pPg->flags |=
19d0b 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 (pPgOld->flags&
19d0c 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 PGHDR_NEED_SYNC)
19d0d 3b 0d 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 ;.. if( MEMDB
19d0e 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 44 6f ){.. /* Do
19d0f 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61 67 not discard pag
19d10 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 es from an in-me
19d11 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 69 mory database si
19d12 6e 63 65 20 77 65 20 6d 69 67 68 74 0d 0a 20 20 nce we might..
19d13 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72 ** need to r
19d14 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20 ollback later.
19d15 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61 Just move the pa
19d16 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 ge out of the wa
19d17 79 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 73 71 6c y. */.. sql
19d18 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 ite3PcacheMove(p
19d19 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 PgOld, pPager->d
19d1a 62 53 69 7a 65 2b 31 29 3b 0d 0a 20 20 20 20 7d bSize+1);.. }
19d1b 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 73 71 6c else{.. sql
19d1c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 ite3PcacheDrop(p
19d1d 50 67 4f 6c 64 29 3b 0d 0a 20 20 20 20 7d 0d 0a PgOld);.. }..
19d1e 20 20 7d 0d 0a 0d 0a 20 20 6f 72 69 67 50 67 6e }.... origPgn
19d1f 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0d 0a o = pPg->pgno;..
19d20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d sqlite3PcacheM
19d21 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0d ove(pPg, pgno);.
19d22 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 . sqlite3Pcache
19d23 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0d MakeDirty(pPg);.
19d24 0a 0d 0a 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 ... /* For an i
19d25 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 n-memory databas
19d26 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 e, make sure the
19d27 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 original page c
19d28 6f 6e 74 69 6e 75 65 73 0d 0a 20 20 2a 2a 20 74 ontinues.. ** t
19d29 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 o exist, in case
19d2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
19d2b 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 needs to roll b
19d2c 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 ack. Use pPgOld
19d2d 0d 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72 .. ** as the or
19d2e 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63 iginal page sinc
19d2f 65 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 e it has already
19d30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e been allocated.
19d31 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 4d 45 .. */.. if( ME
19d32 4d 44 42 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 MDB ){.. asse
19d33 72 74 28 20 70 50 67 4f 6c 64 20 29 3b 0d 0a 20 rt( pPgOld );..
19d34 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 sqlite3Pcache
19d35 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 Move(pPgOld, ori
19d36 67 50 67 6e 6f 29 3b 0d 0a 20 20 20 20 73 71 6c gPgno);.. sql
19d37 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 ite3PagerUnref(p
19d38 50 67 4f 6c 64 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a PgOld);.. }....
19d39 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 if( needSyncPg
19d3a 6e 6f 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 no ){.. /* If
19d3b 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 needSyncPgno is
19d3c 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 non-zero, then
19d3d 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 the journal file
19d3e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0d 0a 20 needs to be ..
19d3f 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 ** sync()ed b
19d40 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 efore any data i
19d41 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 s written to dat
19d42 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 abase file page
19d43 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0d 0a 20 needSyncPgno...
19d44 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c ** Currently,
19d45 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 no such page ex
19d46 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 ists in the page
19d47 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0d -cache and the .
19d48 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 . ** "is jour
19d49 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c naled" bitvec fl
19d4a 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e ag has been set.
19d4b 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 This needs to b
19d4c 65 20 72 65 6d 65 64 69 65 64 20 62 79 0d 0a 20 e remedied by..
19d4d 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 ** loading th
19d4e 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 e page into the
19d4f 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 pager-cache and
19d50 73 65 74 74 69 6e 67 20 74 68 65 20 50 47 48 44 setting the PGHD
19d51 52 5f 4e 45 45 44 5f 53 59 4e 43 0d 0a 20 20 20 R_NEED_SYNC..
19d52 20 2a 2a 20 66 6c 61 67 2e 0d 0a 20 20 20 20 2a ** flag... *
19d53 2a 0d 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 *.. ** If the
19d54 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 attempt to load
19d55 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 the page into t
19d56 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 he page-cache fa
19d57 69 6c 73 2c 20 28 64 75 65 0d 0a 20 20 20 20 2a ils, (due.. *
19d58 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 * to a malloc()
19d59 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 or IO failure),
19d5a 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e clear the bit in
19d5b 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b the pInJournal[
19d5c 5d 0d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e ].. ** array.
19d5d 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 Otherwise, if t
19d5e 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 he page is loade
19d5f 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 d and written ag
19d60 61 69 6e 20 69 6e 0d 0a 20 20 20 20 2a 2a 20 74 ain in.. ** t
19d61 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c his transaction,
19d62 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 it may be writt
19d63 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 en to the databa
19d64 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0d 0a se file before..
19d65 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e ** it is syn
19d66 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 ced into the jou
19d67 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 rnal file. This
19d68 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 way, it may end
19d69 75 70 20 69 6e 0d 0a 20 20 20 20 2a 2a 20 74 68 up in.. ** th
19d6a 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 e journal file t
19d6b 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 wice, but that i
19d6c 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e s not a problem.
19d6d 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 50 67 .. */.. Pg
19d6e 48 64 72 20 2a 70 50 67 48 64 72 3b 0d 0a 20 20 Hdr *pPgHdr;..
19d6f 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
19d70 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e gerGet(pPager, n
19d71 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 eedSyncPgno, &pP
19d72 67 48 64 72 29 3b 0d 0a 20 20 20 20 69 66 28 20 gHdr);.. if(
19d73 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
19d74 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 .. if( need
19d75 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 SyncPgno<=pPager
19d76 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0d ->dbOrigSize ){.
19d77 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
19d78 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 pPager->pTmpSpa
19d79 63 65 21 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 ce!=0 );..
19d7a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 sqlite3BitvecC
19d7b 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e lear(pPager->pIn
19d7c 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e Journal, needSyn
19d7d 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 cPgno, pPager->p
19d7e 54 6d 70 53 70 61 63 65 29 3b 0d 0a 20 20 20 20 TmpSpace);..
19d7f 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 }.. retur
19d80 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 n rc;.. }..
19d81 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 pPgHdr->flags
19d82 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 |= PGHDR_NEED_SY
19d83 4e 43 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 NC;.. sqlite3
19d84 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 PcacheMakeDirty(
19d85 70 50 67 48 64 72 29 3b 0d 0a 20 20 20 20 73 71 pPgHdr);.. sq
19d86 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 lite3PagerUnref(
19d87 70 50 67 48 64 72 29 3b 0d 0a 20 20 7d 0d 0a 0d pPgHdr);.. }...
19d88 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
19d89 5f 4f 4b 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d _OK;..}..#endif.
19d8a 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e .../*..** Return
19d8b 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
19d8c 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 e data for the s
19d8d 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0d 0a pecified page...
19d8e 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
19d8f 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 TE void *sqlite3
19d90 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 PagerGetData(DbP
19d91 61 67 65 20 2a 70 50 67 29 7b 0d 0a 20 20 61 73 age *pPg){.. as
19d92 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e sert( pPg->nRef>
19d93 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 0 || pPg->pPager
19d94 2d 3e 6d 65 6d 44 62 20 29 3b 0d 0a 20 20 72 65 ->memDb );.. re
19d95 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b turn pPg->pData;
19d96 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
19d97 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 turn a pointer t
19d98 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 o the Pager.nExt
19d99 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 ra bytes of "ext
19d9a 72 61 22 20 73 70 61 63 65 20 0d 0a 2a 2a 20 61 ra" space ..** a
19d9b 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 llocated along w
19d9c 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 ith the specifie
19d9d 64 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c d page...*/..SQL
19d9e 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
19d9f 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 *sqlite3PagerGe
19da0 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 tExtra(DbPage *p
19da1 50 67 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 Pg){.. return p
19da2 50 67 2d 3e 70 45 78 74 72 61 3b 0d 0a 7d 0d 0a Pg->pExtra;..}..
19da3 0d 0a 2f 2a 0d 0a 2a 2a 20 47 65 74 2f 73 65 74 ../*..** Get/set
19da4 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 the locking-mod
19da5 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 e for this pager
19da6 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 . Parameter eMod
19da7 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0d 0a 2a e must be one..*
19da8 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 * of PAGER_LOCKI
19da9 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 NGMODE_QUERY, PA
19daa 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f GER_LOCKINGMODE_
19dab 4e 4f 52 4d 41 4c 20 6f 72 20 0d 0a 2a 2a 20 50 NORMAL or ..** P
19dac 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 AGER_LOCKINGMODE
19dad 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 _EXCLUSIVE. If t
19dae 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 he parameter is
19daf 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e not _QUERY, then
19db0 0d 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 ..** the locking
19db1 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 -mode is set to
19db2 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 the value specif
19db3 69 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ied...**..** The
19db4 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 returned value
19db5 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f is either PAGER_
19db6 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d LOCKINGMODE_NORM
19db7 41 4c 20 6f 72 0d 0a 2a 2a 20 50 41 47 45 52 5f AL or..** PAGER_
19db8 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c LOCKINGMODE_EXCL
19db9 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e USIVE, indicatin
19dba 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 g the current (p
19dbb 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 ossibly updated)
19dbc 0d 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 ..** locking-mod
19dbd 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 e...*/..SQLITE_P
19dbe 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
19dbf 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f e3PagerLockingMo
19dc0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 de(Pager *pPager
19dc1 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0d 0a 20 , int eMode){..
19dc2 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d assert( eMode==
19dc3 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 PAGER_LOCKINGMOD
19dc4 45 5f 51 55 45 52 59 0d 0a 20 20 20 20 20 20 20 E_QUERY..
19dc5 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 || eMode==P
19dc6 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 AGER_LOCKINGMODE
19dc7 5f 4e 4f 52 4d 41 4c 0d 0a 20 20 20 20 20 20 20 _NORMAL..
19dc8 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 || eMode==P
19dc9 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 AGER_LOCKINGMODE
19dca 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0d 0a 20 _EXCLUSIVE );..
19dcb 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c assert( PAGER_L
19dcc 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 OCKINGMODE_QUERY
19dcd 3c 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 <0 );.. assert(
19dce 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f PAGER_LOCKINGMO
19dcf 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 DE_NORMAL>=0 &&
19dd0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 PAGER_LOCKINGMOD
19dd1 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 E_EXCLUSIVE>=0 )
19dd2 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
19dd3 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f ger->exclusiveMo
19dd4 64 65 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 de || 0==sqlite3
19dd5 57 61 6c 48 65 61 70 4d 65 6d 6f 72 79 28 70 50 WalHeapMemory(pP
19dd6 61 67 65 72 2d 3e 70 57 61 6c 29 20 29 3b 0d 0a ager->pWal) );..
19dd7 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 if( eMode>=0 &
19dd8 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 & !pPager->tempF
19dd9 69 6c 65 20 26 26 20 21 73 71 6c 69 74 65 33 57 ile && !sqlite3W
19dda 61 6c 48 65 61 70 4d 65 6d 6f 72 79 28 70 50 61 alHeapMemory(pPa
19ddb 67 65 72 2d 3e 70 57 61 6c 29 20 29 7b 0d 0a 20 ger->pWal) ){..
19ddc 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 pPager->exclu
19ddd 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 siveMode = (u8)e
19dde 4d 6f 64 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 Mode;.. }.. re
19ddf 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 turn (int)pPager
19de0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b ->exclusiveMode;
19de1 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 ..}..../*..** Se
19de2 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f t the journal-mo
19de3 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 de for this page
19de4 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f r. Parameter eMo
19de5 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f de must be one o
19de6 66 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 50 41 f:..**..** PA
19de7 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
19de8 44 45 4c 45 54 45 0d 0a 2a 2a 20 20 20 20 50 41 DELETE..** PA
19de9 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
19dea 54 52 55 4e 43 41 54 45 0d 0a 2a 2a 20 20 20 20 TRUNCATE..**
19deb 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
19dec 45 5f 50 45 52 53 49 53 54 0d 0a 2a 2a 20 20 20 E_PERSIST..**
19ded 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f PAGER_JOURNALMO
19dee 44 45 5f 4f 46 46 0d 0a 2a 2a 20 20 20 20 50 41 DE_OFF..** PA
19def 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
19df0 4d 45 4d 4f 52 59 0d 0a 2a 2a 20 20 20 20 50 41 MEMORY..** PA
19df1 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
19df2 57 41 4c 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 WAL..**..** The
19df3 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73 20 73 journalmode is s
19df4 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 et to the value
19df5 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65 specified if the
19df6 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 change is allow
19df7 65 64 2e 0d 0a 2a 2a 20 54 68 65 20 63 68 61 6e ed...** The chan
19df8 67 65 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c ge may be disall
19df9 6f 77 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c owed for the fol
19dfa 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0d lowing reasons:.
19dfb 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 .**..** * An
19dfc 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 in-memory databa
19dfd 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 se can only have
19dfe 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 its journal_mod
19dff 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0d 0a 2a e set to _OFF..*
19e00 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 * or _MEMOR
19e01 59 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2a 20 20 Y...**..** *
19e02 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 Temporary databa
19e03 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 ses cannot have
19e04 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 _WAL journalmode
19e05 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 72 65 ...**..** The re
19e06 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 turned indicate
19e07 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 the current (pos
19e08 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a sibly updated) j
19e09 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0d 0a 2a 2f ournal-mode...*/
19e0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
19e0b 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
19e0c 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 rSetJournalMode(
19e0d 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 Pager *pPager, i
19e0e 6e 74 20 65 4d 6f 64 65 29 7b 0d 0a 20 20 75 38 nt eMode){.. u8
19e0f 20 65 4f 6c 64 20 3d 20 70 50 61 67 65 72 2d 3e eOld = pPager->
19e10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 journalMode;
19e11 2f 2a 20 50 72 69 6f 72 20 6a 6f 75 72 6e 61 6c /* Prior journal
19e12 6d 6f 64 65 20 2a 2f 0d 0a 0d 0a 23 69 66 64 65 mode */....#ifde
19e13 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a f SQLITE_DEBUG..
19e14 20 20 2f 2a 20 54 68 65 20 70 72 69 6e 74 5f 70 /* The print_p
19e15 61 67 65 72 5f 73 74 61 74 65 28 29 20 72 6f 75 ager_state() rou
19e16 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 tine is intended
19e17 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 to be used by t
19e18 68 65 20 64 65 62 75 67 67 65 72 0d 0a 20 20 2a he debugger.. *
19e19 2a 20 6f 6e 6c 79 2e 20 20 57 65 20 69 6e 76 6f * only. We invo
19e1a 6b 65 20 69 74 20 6f 6e 63 65 20 68 65 72 65 20 ke it once here
19e1b 74 6f 20 73 75 70 70 72 65 73 73 20 61 20 63 6f to suppress a co
19e1c 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 mpiler warning.
19e1d 2a 2f 0d 0a 20 20 70 72 69 6e 74 5f 70 61 67 65 */.. print_page
19e1e 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 3b r_state(pPager);
19e1f 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 20 20 ..#endif......
19e20 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20 70 61 72 /* The eMode par
19e21 61 6d 65 74 65 72 20 69 73 20 61 6c 77 61 79 73 ameter is always
19e22 20 76 61 6c 69 64 20 2a 2f 0d 0a 20 20 61 73 73 valid */.. ass
19e23 65 72 74 28 20 20 20 20 20 20 65 4d 6f 64 65 3d ert( eMode=
19e24 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
19e25 44 45 5f 44 45 4c 45 54 45 0d 0a 20 20 20 20 20 DE_DELETE..
19e26 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d || eMode=
19e27 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
19e28 44 45 5f 54 52 55 4e 43 41 54 45 0d 0a 20 20 20 DE_TRUNCATE..
19e29 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 || eMod
19e2a 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c e==PAGER_JOURNAL
19e2b 4d 4f 44 45 5f 50 45 52 53 49 53 54 0d 0a 20 20 MODE_PERSIST..
19e2c 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f || eMo
19e2d 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 de==PAGER_JOURNA
19e2e 4c 4d 4f 44 45 5f 4f 46 46 20 0d 0a 20 20 20 20 LMODE_OFF ..
19e2f 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 || eMode
19e30 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d ==PAGER_JOURNALM
19e31 4f 44 45 5f 57 41 4c 20 0d 0a 20 20 20 20 20 20 ODE_WAL ..
19e32 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d || eMode==
19e33 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
19e34 45 5f 4d 45 4d 4f 52 59 20 29 3b 0d 0a 0d 0a 20 E_MEMORY );....
19e35 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 /* This routine
19e36 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 is only called
19e37 66 72 6f 6d 20 74 68 65 20 4f 50 5f 4a 6f 75 72 from the OP_Jour
19e38 6e 61 6c 4d 6f 64 65 20 6f 70 63 6f 64 65 2c 20 nalMode opcode,
19e39 61 6e 64 0d 0a 20 20 2a 2a 20 74 68 65 20 6c 6f and.. ** the lo
19e3a 67 69 63 20 74 68 65 72 65 20 77 69 6c 6c 20 6e gic there will n
19e3b 65 76 65 72 20 61 6c 6c 6f 77 20 61 20 74 65 6d ever allow a tem
19e3c 70 6f 72 61 72 79 20 66 69 6c 65 20 74 6f 20 62 porary file to b
19e3d 65 20 63 68 61 6e 67 65 64 0d 0a 20 20 2a 2a 20 e changed.. **
19e3e 74 6f 20 57 41 4c 20 6d 6f 64 65 2e 0d 0a 20 20 to WAL mode...
19e3f 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 */.. assert( pP
19e40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d ager->tempFile==
19e41 30 20 7c 7c 20 65 4d 6f 64 65 21 3d 50 41 47 45 0 || eMode!=PAGE
19e42 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 R_JOURNALMODE_WA
19e43 4c 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 44 6f 20 L );.... /* Do
19e44 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 allow the journa
19e45 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d 6d lmode of an in-m
19e46 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 emory database t
19e47 6f 20 62 65 20 73 65 74 20 74 6f 0d 0a 20 20 2a o be set to.. *
19e48 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 * anything other
19e49 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72 20 than MEMORY or
19e4a 4f 46 46 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 OFF.. */.. if(
19e4b 20 4d 45 4d 44 42 20 29 7b 0d 0a 20 20 20 20 61 MEMDB ){.. a
19e4c 73 73 65 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 ssert( eOld==PAG
19e4d 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d ER_JOURNALMODE_M
19e4e 45 4d 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 EMORY || eOld==P
19e4f 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 AGER_JOURNALMODE
19e50 5f 4f 46 46 20 29 3b 0d 0a 20 20 20 20 69 66 28 _OFF );.. if(
19e51 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f eMode!=PAGER_JO
19e52 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 URNALMODE_MEMORY
19e53 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 && eMode!=PAGER
19e54 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 _JOURNALMODE_OFF
19e55 20 29 7b 0d 0a 20 20 20 20 20 20 65 4d 6f 64 65 ){.. eMode
19e56 20 3d 20 65 4f 6c 64 3b 0d 0a 20 20 20 20 7d 0d = eOld;.. }.
19e57 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 65 4d . }.... if( eM
19e58 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0d 0a 0d 0a ode!=eOld ){....
19e59 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 /* Change th
19e5a 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 e journal mode.
19e5b 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 */.. assert(
19e5c 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d pPager->eState!=
19e5d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0d 0a PAGER_ERROR );..
19e5e 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 pPager->jour
19e5f 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d nalMode = (u8)eM
19e60 6f 64 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 57 ode;.... /* W
19e61 68 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e 69 hen transistioni
19e62 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54 45 ng from TRUNCATE
19e63 20 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20 61 or PERSIST to a
19e64 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c ny other journal
19e65 0d 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65 78 .. ** mode ex
19e66 63 65 70 74 20 57 41 4c 2c 20 75 6e 6c 65 73 73 cept WAL, unless
19e67 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e the pager is in
19e68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 locking_mode=ex
19e69 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 0d 0a 20 clusive mode,..
19e6a 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 ** delete the
19e6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0d 0a journal file...
19e6c 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 */.. asse
19e6d 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e rt( (PAGER_JOURN
19e6e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 ALMODE_TRUNCATE
19e6f 26 20 35 29 3d 3d 31 20 29 3b 0d 0a 20 20 20 20 & 5)==1 );..
19e70 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a assert( (PAGER_J
19e71 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 OURNALMODE_PERSI
19e72 53 54 20 26 20 35 29 3d 3d 31 20 29 3b 0d 0a 20 ST & 5)==1 );..
19e73 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 assert( (PAGE
19e74 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 R_JOURNALMODE_DE
19e75 4c 45 54 45 20 26 20 35 29 3d 3d 30 20 29 3b 0d LETE & 5)==0 );.
19e76 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 . assert( (PA
19e77 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
19e78 4d 45 4d 4f 52 59 20 26 20 35 29 3d 3d 34 20 29 MEMORY & 5)==4 )
19e79 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 ;.. assert( (
19e7a 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
19e7b 45 5f 4f 46 46 20 26 20 35 29 3d 3d 30 20 29 3b E_OFF & 5)==0 );
19e7c 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 .. assert( (P
19e7d 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 AGER_JOURNALMODE
19e7e 5f 57 41 4c 20 26 20 35 29 3d 3d 35 20 29 3b 0d _WAL & 5)==5 );.
19e7f 0a 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 ... assert( i
19e80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 sOpen(pPager->fd
19e81 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 ) || pPager->exc
19e82 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0d 0a 20 lusiveMode );..
19e83 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e if( !pPager->
19e84 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 exclusiveMode &&
19e85 20 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20 26 (eOld & 5)==1 &
19e86 26 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 & (eMode & 1)==0
19e87 20 29 7b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 ){.... /*
19e88 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 In this case we
19e89 77 6f 75 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65 would like to de
19e8a 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c lete the journal
19e8b 20 66 69 6c 65 2e 20 49 66 20 69 74 20 69 73 0d file. If it is.
19e8c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 70 6f . ** not po
19e8d 73 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68 61 ssible, then tha
19e8e 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c t is not a probl
19e8f 65 6d 2e 20 44 65 6c 65 74 69 6e 67 20 74 68 65 em. Deleting the
19e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0d 0a 20 journal file..
19e91 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69 73 20 ** here is
19e92 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 an optimization
19e93 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d only... **.
19e94 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 . ** Before
19e95 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f deleting the jo
19e96 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74 61 urnal file, obta
19e97 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f in a RESERVED lo
19e98 63 6b 20 6f 6e 20 74 68 65 0d 0a 20 20 20 20 20 ck on the..
19e99 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c ** database fil
19e9a 65 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 e. This ensures
19e9b 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c that the journal
19e9c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c file is not del
19e9d 65 74 65 64 0d 0a 20 20 20 20 20 20 2a 2a 20 77 eted.. ** w
19e9e 68 69 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 hile it is in us
19e9f 65 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 e by some other
19ea0 63 6c 69 65 6e 74 2e 0d 0a 20 20 20 20 20 20 2a client... *
19ea1 2f 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 /.. sqlite3
19ea2 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e OsClose(pPager->
19ea3 6a 66 64 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 jfd);.. if(
19ea4 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d pPager->eLock>=
19ea5 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b RESERVED_LOCK ){
19ea6 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 .. sqlite
19ea7 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 3OsDelete(pPager
19ea8 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e ->pVfs, pPager->
19ea9 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0d 0a 20 zJournal, 0);..
19eaa 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
19eab 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 int rc = SQ
19eac 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 LITE_OK;..
19ead 20 20 69 6e 74 20 73 74 61 74 65 20 3d 20 70 50 int state = pP
19eae 61 67 65 72 2d 3e 65 53 74 61 74 65 3b 0d 0a 20 ager->eState;..
19eaf 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 assert( s
19eb0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e tate==PAGER_OPEN
19eb1 20 7c 7c 20 73 74 61 74 65 3d 3d 50 41 47 45 52 || state==PAGER
19eb2 5f 52 45 41 44 45 52 20 29 3b 0d 0a 20 20 20 20 _READER );..
19eb3 20 20 20 20 69 66 28 20 73 74 61 74 65 3d 3d 50 if( state==P
19eb4 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0d 0a 20 20 AGER_OPEN ){..
19eb5 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
19eb6 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c ite3PagerSharedL
19eb7 6f 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 ock(pPager);..
19eb8 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
19eb9 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 if( pPager->eSt
19eba 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 ate==PAGER_READE
19ebb 52 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 R ){..
19ebc 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 assert( rc==SQLI
19ebd 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 20 20 TE_OK );..
19ebe 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f rc = pagerLo
19ebf 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 ckDb(pPager, RES
19ec0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 ERVED_LOCK);..
19ec1 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
19ec2 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
19ec3 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 OK ){..
19ec4 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 sqlite3OsDelete
19ec5 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 (pPager->pVfs, p
19ec6 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c Pager->zJournal,
19ec7 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0);.. }.
19ec8 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d . if( rc=
19ec9 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 =SQLITE_OK && st
19eca 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 ate==PAGER_READE
19ecb 52 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 R ){..
19ecc 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 pagerUnlockDb(pP
19ecd 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 ager, SHARED_LOC
19ece 4b 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c K);.. }el
19ecf 73 65 20 69 66 28 20 73 74 61 74 65 3d 3d 50 41 se if( state==PA
19ed0 47 45 52 5f 4f 50 45 4e 20 29 7b 0d 0a 20 20 20 GER_OPEN ){..
19ed1 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c pager_unl
19ed2 6f 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 ock(pPager);..
19ed3 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
19ed4 20 61 73 73 65 72 74 28 20 73 74 61 74 65 3d 3d assert( state==
19ed5 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 29 pPager->eState )
19ed6 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
19ed7 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 52 }.. }.... /* R
19ed8 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f eturn the new jo
19ed9 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0d 0a 20 urnal mode */..
19eda 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 return (int)pPa
19edb 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 ger->journalMode
19edc 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ;..}..../*..** R
19edd 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e eturn the curren
19ede 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0d t journal mode..
19edf 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
19ee0 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 50 ATE int sqlite3P
19ee1 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f agerGetJournalMo
19ee2 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 de(Pager *pPager
19ee3 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e ){.. return (in
19ee4 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 t)pPager->journa
19ee5 6c 4d 6f 64 65 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d lMode;..}..../*.
19ee6 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 .** Return TRUE
19ee7 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 if the pager is
19ee8 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 in a state where
19ee9 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 63 68 61 it is OK to cha
19eea 6e 67 65 20 74 68 65 0d 0a 2a 2a 20 6a 6f 75 72 nge the..** jour
19eeb 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75 72 6e 61 nalmode. Journa
19eec 6c 6d 6f 64 65 20 63 68 61 6e 67 65 73 20 63 61 lmode changes ca
19eed 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 68 n only happen wh
19eee 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0d en the database.
19eef 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 .** is unmodifie
19ef0 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 d...*/..SQLITE_P
19ef1 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
19ef2 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 e3PagerOkToChang
19ef3 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 eJournalMode(Pag
19ef4 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 er *pPager){..
19ef5 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 assert( assert_p
19ef6 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 ager_state(pPage
19ef7 72 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 50 61 r) );.. if( pPa
19ef8 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 ger->eState>=PAG
19ef9 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d ER_WRITER_CACHEM
19efa 4f 44 20 29 20 72 65 74 75 72 6e 20 30 3b 0d 0a OD ) return 0;..
19efb 20 20 69 66 28 20 4e 45 56 45 52 28 69 73 4f 70 if( NEVER(isOp
19efc 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 en(pPager->jfd)
19efd 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e && pPager->journ
19efe 61 6c 4f 66 66 3e 30 29 20 29 20 72 65 74 75 72 alOff>0) ) retur
19eff 6e 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 31 n 0;.. return 1
19f00 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 ;..}..../*..** G
19f01 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d et/set the size-
19f02 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 limit used for p
19f03 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 ersistent journa
19f04 6c 20 66 69 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a l files...**..**
19f05 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a Setting the siz
19f06 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 e limit to -1 me
19f07 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 ans no limit is
19f08 65 6e 66 6f 72 63 65 64 2e 0d 0a 2a 2a 20 41 6e enforced...** An
19f09 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 attempt to set
19f0a 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 a limit smaller
19f0b 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d than -1 is a no-
19f0c 6f 70 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f op...*/..SQLITE_
19f0d 50 52 49 56 41 54 45 20 69 36 34 20 73 71 6c 69 PRIVATE i64 sqli
19f0e 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 te3PagerJournalS
19f0f 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a izeLimit(Pager *
19f10 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d pPager, i64 iLim
19f11 69 74 29 7b 0d 0a 20 20 69 66 28 20 69 4c 69 6d it){.. if( iLim
19f12 69 74 3e 3d 2d 31 20 29 7b 0d 0a 20 20 20 20 70 it>=-1 ){.. p
19f13 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 Pager->journalSi
19f14 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 zeLimit = iLimit
19f15 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 ;.. sqlite3Wa
19f16 6c 4c 69 6d 69 74 28 70 50 61 67 65 72 2d 3e 70 lLimit(pPager->p
19f17 57 61 6c 2c 20 69 4c 69 6d 69 74 29 3b 0d 0a 20 Wal, iLimit);..
19f18 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 }.. return pPa
19f19 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 ger->journalSize
19f1a 4c 69 6d 69 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d Limit;..}..../*.
19f1b 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 .** Return a poi
19f1c 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 nter to the pPag
19f1d 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 er->pBackup vari
19f1e 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 able. The backup
19f1f 20 6d 6f 64 75 6c 65 0d 0a 2a 2a 20 69 6e 20 62 module..** in b
19f20 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e ackup.c maintain
19f21 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 s the content of
19f22 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 this variable.
19f23 54 68 69 73 20 6d 6f 64 75 6c 65 0d 0a 2a 2a 20 This module..**
19f24 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 uses it opaquely
19f25 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 as an argument
19f26 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 to sqlite3Backup
19f27 52 65 73 74 61 72 74 28 29 20 61 6e 64 0d 0a 2a Restart() and..*
19f28 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 * sqlite3BackupU
19f29 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0d 0a 2a pdate() only...*
19f2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
19f2b 45 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 E sqlite3_backup
19f2c 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 **sqlite3PagerB
19f2d 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a ackupPtr(Pager *
19f2e 70 50 61 67 65 72 29 7b 0d 0a 20 20 72 65 74 75 pPager){.. retu
19f2f 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 rn &pPager->pBac
19f30 6b 75 70 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 kup;..}....#ifnd
19f31 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ef SQLITE_OMIT_V
19f32 41 43 55 55 4d 0d 0a 2f 2a 0d 0a 2a 2a 20 55 6e ACUUM../*..** Un
19f33 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 6e 20 less this is an
19f34 69 6e 2d 6d 65 6d 6f 72 79 20 6f 72 20 74 65 6d in-memory or tem
19f35 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2c porary database,
19f36 20 63 6c 65 61 72 20 74 68 65 20 70 61 67 65 72 clear the pager
19f37 20 63 61 63 68 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c cache...*/..SQL
19f38 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 ITE_PRIVATE void
19f39 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 65 sqlite3PagerCle
19f3a 61 72 43 61 63 68 65 28 50 61 67 65 72 20 2a 70 arCache(Pager *p
19f3b 50 61 67 65 72 29 7b 0d 0a 20 20 69 66 28 20 21 Pager){.. if( !
19f3c 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d MEMDB && pPager-
19f3d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 70 >tempFile==0 ) p
19f3e 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 ager_reset(pPage
19f3f 72 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a r);..}..#endif..
19f40 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
19f41 5f 4f 4d 49 54 5f 57 41 4c 0d 0a 2f 2a 0d 0a 2a _OMIT_WAL../*..*
19f42 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
19f43 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 is called when t
19f44 68 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 he user invokes
19f45 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 "PRAGMA wal_chec
19f46 6b 70 6f 69 6e 74 22 2c 0d 0a 2a 2a 20 22 50 52 kpoint",..** "PR
19f47 41 47 4d 41 20 77 61 6c 5f 62 6c 6f 63 6b 69 6e AGMA wal_blockin
19f48 67 5f 63 68 65 63 6b 70 6f 69 6e 74 22 20 6f 72 g_checkpoint" or
19f49 20 63 61 6c 6c 73 20 74 68 65 20 73 71 6c 69 74 calls the sqlit
19f4a 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e e3_wal_checkpoin
19f4b 74 28 29 0d 0a 2a 2a 20 6f 72 20 77 61 6c 5f 62 t()..** or wal_b
19f4c 6c 6f 63 6b 69 6e 67 5f 63 68 65 63 6b 70 6f 69 locking_checkpoi
19f4d 6e 74 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f nt() API functio
19f4e 6e 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 61 72 61 ns...**..** Para
19f4f 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f meter eMode is o
19f50 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 ne of SQLITE_CHE
19f51 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c CKPOINT_PASSIVE,
19f52 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 FULL or RESTART
19f53 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
19f54 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
19f55 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e 74 3PagerCheckpoint
19f56 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 (Pager *pPager,
19f57 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a int eMode, int *
19f58 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b pnLog, int *pnCk
19f59 70 74 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d pt){.. int rc =
19f5a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 SQLITE_OK;.. i
19f5b 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 f( pPager->pWal
19f5c 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c ){.. rc = sql
19f5d 69 74 65 33 57 61 6c 43 68 65 63 6b 70 6f 69 6e ite3WalCheckpoin
19f5e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 t(pPager->pWal,
19f5f 65 4d 6f 64 65 2c 0d 0a 20 20 20 20 20 20 20 20 eMode,..
19f60 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e pPager->xBusyHan
19f61 64 6c 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 42 dler, pPager->pB
19f62 75 73 79 48 61 6e 64 6c 65 72 41 72 67 2c 0d 0a usyHandlerArg,..
19f63 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e pPager->
19f64 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 ckptSyncFlags, p
19f65 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c Pager->pageSize,
19f66 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 (u8 *)pPager->p
19f67 54 6d 70 53 70 61 63 65 2c 0d 0a 20 20 20 20 20 TmpSpace,..
19f68 20 20 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 pnLog, pnCkpt
19f69 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 7d 0d 0a 20 .. );.. }..
19f6a 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
19f6b 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
19f6c 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 int sqlite3Page
19f6d 72 57 61 6c 43 61 6c 6c 62 61 63 6b 28 50 61 67 rWalCallback(Pag
19f6e 65 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 er *pPager){..
19f6f 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 57 61 return sqlite3Wa
19f70 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 lCallback(pPager
19f71 2d 3e 70 57 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 2f ->pWal);..}..../
19f72 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 *..** Return tru
19f73 65 20 69 66 20 74 68 65 20 75 6e 64 65 72 6c 79 e if the underly
19f74 69 6e 67 20 56 46 53 20 66 6f 72 20 74 68 65 20 ing VFS for the
19f75 67 69 76 65 6e 20 70 61 67 65 72 20 73 75 70 70 given pager supp
19f76 6f 72 74 73 20 74 68 65 0d 0a 2a 2a 20 70 72 69 orts the..** pri
19f77 6d 69 74 69 76 65 73 20 6e 65 63 65 73 73 61 72 mitives necessar
19f78 79 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 y for write-ahea
19f79 64 20 6c 6f 67 67 69 6e 67 2e 0d 0a 2a 2f 0d 0a d logging...*/..
19f7a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
19f7b 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 nt sqlite3PagerW
19f7c 61 6c 53 75 70 70 6f 72 74 65 64 28 50 61 67 65 alSupported(Page
19f7d 72 20 2a 70 50 61 67 65 72 29 7b 0d 0a 20 20 63 r *pPager){.. c
19f7e 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f onst sqlite3_io_
19f7f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 methods *pMethod
19f80 73 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e s = pPager->fd->
19f81 70 4d 65 74 68 6f 64 73 3b 0d 0a 20 20 72 65 74 pMethods;.. ret
19f82 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 78 63 6c urn pPager->excl
19f83 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 28 70 4d usiveMode || (pM
19f84 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e ethods->iVersion
19f85 3e 3d 32 20 26 26 20 70 4d 65 74 68 6f 64 73 2d >=2 && pMethods-
19f86 3e 78 53 68 6d 4d 61 70 29 3b 0d 0a 7d 0d 0a 0d >xShmMap);..}...
19f87 0a 2f 2a 0d 0a 2a 2a 20 41 74 74 65 6d 70 74 20 ./*..** Attempt
19f88 74 6f 20 74 61 6b 65 20 61 6e 20 65 78 63 6c 75 to take an exclu
19f89 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 sive lock on the
19f8a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 database file.
19f8b 49 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 If a PENDING loc
19f8c 6b 0d 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 k..** is obtaine
19f8d 64 20 69 6e 73 74 65 61 64 2c 20 69 6d 6d 65 64 d instead, immed
19f8e 69 61 74 65 6c 79 20 72 65 6c 65 61 73 65 20 69 iately release i
19f8f 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 t...*/..static i
19f90 6e 74 20 70 61 67 65 72 45 78 63 6c 75 73 69 76 nt pagerExclusiv
19f91 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 eLock(Pager *pPa
19f92 67 65 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b ger){.. int rc;
19f93 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19f94 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
19f95 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 rn code */....
19f96 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
19f97 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f eLock==SHARED_LO
19f98 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c CK || pPager->eL
19f99 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c ock==EXCLUSIVE_L
19f9a 4f 43 4b 20 29 3b 0d 0a 20 20 72 63 20 3d 20 70 OCK );.. rc = p
19f9b 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 agerLockDb(pPage
19f9c 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 r, EXCLUSIVE_LOC
19f9d 4b 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 K);.. if( rc!=S
19f9e 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
19f9f 20 2f 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d /* If the attem
19fa0 70 74 20 74 6f 20 67 72 61 62 20 74 68 65 20 65 pt to grab the e
19fa1 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 66 61 xclusive lock fa
19fa2 69 6c 65 64 2c 20 72 65 6c 65 61 73 65 20 74 68 iled, release th
19fa3 65 20 0d 0a 20 20 20 20 2a 2a 20 70 65 6e 64 69 e .. ** pendi
19fa4 6e 67 20 6c 6f 63 6b 20 74 68 61 74 20 6d 61 79 ng lock that may
19fa5 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 have been obtai
19fa6 6e 65 64 20 69 6e 73 74 65 61 64 2e 20 20 2a 2f ned instead. */
19fa7 0d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 .. pagerUnloc
19fa8 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 kDb(pPager, SHAR
19fa9 45 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 7d 0d 0a ED_LOCK);.. }..
19faa 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
19fab 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c }..../*..** Call
19fac 20 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 sqlite3WalOpen(
19fad 29 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 57 41 ) to open the WA
19fae 4c 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 L handle. If the
19faf 20 70 61 67 65 72 20 69 73 20 69 6e 20 0d 0a 2a pager is in ..*
19fb0 2a 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b * exclusive-lock
19fb1 69 6e 67 20 6d 6f 64 65 20 77 68 65 6e 20 74 68 ing mode when th
19fb2 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
19fb3 61 6c 6c 65 64 2c 20 74 61 6b 65 20 61 6e 20 45 alled, take an E
19fb4 58 43 4c 55 53 49 56 45 0d 0a 2a 2a 20 6c 6f 63 XCLUSIVE..** loc
19fb5 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 k on the databas
19fb6 65 20 66 69 6c 65 20 61 6e 64 20 75 73 65 20 68 e file and use h
19fb7 65 61 70 2d 6d 65 6d 6f 72 79 20 74 6f 20 73 74 eap-memory to st
19fb8 6f 72 65 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 ore the wal-inde
19fb9 78 0d 0a 2a 2a 20 69 6e 2e 20 4f 74 68 65 72 77 x..** in. Otherw
19fba 69 73 65 2c 20 75 73 65 20 74 68 65 20 6e 6f 72 ise, use the nor
19fbb 6d 61 6c 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 mal shared-memor
19fbc 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 y...*/..static i
19fbd 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 28 nt pagerOpenWal(
19fbe 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0d Pager *pPager){.
19fbf 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
19fc0 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 TE_OK;.... asse
19fc1 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c rt( pPager->pWal
19fc2 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 74 ==0 && pPager->t
19fc3 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0d 0a 20 empFile==0 );..
19fc4 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d assert( pPager-
19fc5 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c >eLock==SHARED_L
19fc6 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 OCK || pPager->e
19fc7 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f Lock==EXCLUSIVE_
19fc8 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e LOCK || pPager->
19fc9 6e 6f 52 65 61 64 6c 6f 63 6b 29 3b 0d 0a 0d 0a noReadlock);....
19fca 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 /* If the page
19fcb 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 r is already in
19fcc 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 exclusive-mode,
19fcd 74 68 65 20 57 41 4c 20 6d 6f 64 75 6c 65 20 77 the WAL module w
19fce 69 6c 6c 20 75 73 65 20 0d 0a 20 20 2a 2a 20 68 ill use .. ** h
19fcf 65 61 70 2d 6d 65 6d 6f 72 79 20 66 6f 72 20 74 eap-memory for t
19fd0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 69 6e 73 he wal-index ins
19fd1 74 65 61 64 20 6f 66 20 74 68 65 20 56 46 53 20 tead of the VFS
19fd2 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 0d 0a shared-memory ..
19fd3 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 ** implementat
19fd4 69 6f 6e 2e 20 54 61 6b 65 20 74 68 65 20 65 78 ion. Take the ex
19fd5 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6e 6f 77 clusive lock now
19fd6 2c 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 , before opening
19fd7 20 74 68 65 20 57 41 4c 0d 0a 20 20 2a 2a 20 66 the WAL.. ** f
19fd8 69 6c 65 2c 20 74 6f 20 6d 61 6b 65 20 73 75 72 ile, to make sur
19fd9 65 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0d e this is safe..
19fda 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 50 61 . */.. if( pPa
19fdb 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f ger->exclusiveMo
19fdc 64 65 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 de ){.. rc =
19fdd 70 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f pagerExclusiveLo
19fde 63 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 7d ck(pPager);.. }
19fdf 0d 0a 0d 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 .... /* Open th
19fe0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 e connection to
19fe1 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 the log file. If
19fe2 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 this operation
19fe3 66 61 69 6c 73 2c 20 0d 0a 20 20 2a 2a 20 28 65 fails, .. ** (e
19fe4 2e 67 2e 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f .g. due to mallo
19fe5 63 28 29 20 66 61 69 6c 75 72 65 29 2c 20 72 65 c() failure), re
19fe6 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f turn an error co
19fe7 64 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 de... */.. if(
19fe8 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
19fe9 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 {.. rc = sqli
19fea 74 65 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65 te3WalOpen(pPage
19feb 72 2d 3e 70 56 66 73 2c 20 0d 0a 20 20 20 20 20 r->pVfs, ..
19fec 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 pPager->fd, p
19fed 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 70 50 61 Pager->zWal, pPa
19fee 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f ger->exclusiveMo
19fef 64 65 2c 0d 0a 20 20 20 20 20 20 20 20 70 50 61 de,.. pPa
19ff0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 ger->journalSize
19ff1 4c 69 6d 69 74 2c 20 26 70 50 61 67 65 72 2d 3e Limit, &pPager->
19ff2 70 57 61 6c 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 pWal.. );..
19ff3 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.... return rc
19ff4 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a ;..}....../*..**
19ff5 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 The caller must
19ff6 20 62 65 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 be holding a SH
19ff7 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 ARED lock on the
19ff8 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 database file t
19ff9 6f 20 63 61 6c 6c 0d 0a 2a 2a 20 74 68 69 73 20 o call..** this
19ffa 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a function...**..*
19ffb 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 70 * If the pager p
19ffc 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 assed as the fir
19ffd 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f st argument is o
19ffe 70 65 6e 20 6f 6e 20 61 20 72 65 61 6c 20 64 61 pen on a real da
19fff 74 61 62 61 73 65 0d 0a 2a 2a 20 66 69 6c 65 20 tabase..** file
1a000 28 6e 6f 74 20 61 20 74 65 6d 70 20 66 69 6c 65 (not a temp file
1a001 20 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 or an in-memory
1a002 20 64 61 74 61 62 61 73 65 29 2c 20 61 6e 64 20 database), and
1a003 74 68 65 20 57 41 4c 20 66 69 6c 65 0d 0a 2a 2a the WAL file..**
1a004 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 is not already
1a005 6f 70 65 6e 2c 20 6d 61 6b 65 20 61 6e 20 61 74 open, make an at
1a006 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 69 74 tempt to open it
1a007 20 6e 6f 77 2e 20 49 66 20 73 75 63 63 65 73 73 now. If success
1a008 66 75 6c 2c 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 ful,..** return
1a009 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e SQLITE_OK. If an
1a00a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 72 error occurs or
1a00b 20 74 68 65 20 56 46 53 20 75 73 65 64 20 62 79 the VFS used by
1a00c 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 the pager does
1a00d 0d 0a 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 ..** not support
1a00e 20 74 68 65 20 78 53 68 6d 58 58 58 28 29 20 6d the xShmXXX() m
1a00f 65 74 68 6f 64 73 2c 20 72 65 74 75 72 6e 20 61 ethods, return a
1a010 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 70 n error code. *p
1a011 62 4f 70 65 6e 20 69 73 0d 0a 2a 2a 20 6e 6f 74 bOpen is..** not
1a012 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 65 69 74 modified in eit
1a013 68 65 72 20 63 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a her case...**..*
1a014 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 * If the pager i
1a015 73 20 6f 70 65 6e 20 6f 6e 20 61 20 74 65 6d 70 s open on a temp
1a016 2d 66 69 6c 65 20 28 6f 72 20 69 6e 2d 6d 65 6d -file (or in-mem
1a017 6f 72 79 20 64 61 74 61 62 61 73 65 29 2c 20 6f ory database), o
1a018 72 20 69 66 0d 0a 2a 2a 20 74 68 65 20 57 41 4c r if..** the WAL
1a019 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 file is already
1a01a 20 6f 70 65 6e 2c 20 73 65 74 20 2a 70 62 4f 70 open, set *pbOp
1a01b 65 6e 20 74 6f 20 31 20 61 6e 64 20 72 65 74 75 en to 1 and retu
1a01c 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a rn SQLITE_OK..**
1a01d 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 without doing a
1a01e 6e 79 74 68 69 6e 67 2e 0d 0a 2a 2f 0d 0a 53 51 nything...*/..SQ
1a01f 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
1a020 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 sqlite3PagerOpe
1a021 6e 57 61 6c 28 0d 0a 20 20 50 61 67 65 72 20 2a nWal(.. Pager *
1a022 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 pPager,
1a023 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 /* Page
1a024 72 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 r object */.. i
1a025 6e 74 20 2a 70 62 4f 70 65 6e 20 20 20 20 20 20 nt *pbOpen
1a026 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1a027 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 * OUT: Set to tr
1a028 75 65 20 69 66 20 63 61 6c 6c 20 69 73 20 61 20 ue if call is a
1a029 6e 6f 2d 6f 70 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 no-op */..){..
1a02a 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
1a02b 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 OK;
1a02c 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a /* Return code *
1a02d 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 61 /.... assert( a
1a02e 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 ssert_pager_stat
1a02f 65 28 70 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 e(pPager) );..
1a030 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e assert( pPager->
1a031 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 eState==PAGER_OP
1a032 45 4e 20 20 20 7c 7c 20 70 62 4f 70 65 6e 20 29 EN || pbOpen )
1a033 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
1a034 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 ger->eState==PAG
1a035 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 21 70 62 ER_READER || !pb
1a036 4f 70 65 6e 20 29 3b 0d 0a 20 20 61 73 73 65 72 Open );.. asser
1a037 74 28 20 70 62 4f 70 65 6e 3d 3d 30 20 7c 7c 20 t( pbOpen==0 ||
1a038 2a 70 62 4f 70 65 6e 3d 3d 30 20 29 3b 0d 0a 20 *pbOpen==0 );..
1a039 20 61 73 73 65 72 74 28 20 70 62 4f 70 65 6e 21 assert( pbOpen!
1a03a 3d 30 20 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e =0 || (!pPager->
1a03b 74 65 6d 70 46 69 6c 65 20 26 26 20 21 70 50 61 tempFile && !pPa
1a03c 67 65 72 2d 3e 70 57 61 6c 29 20 29 3b 0d 0a 0d ger->pWal) );...
1a03d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e . if( !pPager->
1a03e 74 65 6d 70 46 69 6c 65 20 26 26 20 21 70 50 61 tempFile && !pPa
1a03f 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0d 0a 20 20 ger->pWal ){..
1a040 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 if( !sqlite3Pa
1a041 67 65 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28 gerWalSupported(
1a042 70 50 61 67 65 72 29 20 29 20 72 65 74 75 72 6e pPager) ) return
1a043 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e SQLITE_CANTOPEN
1a044 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 ;.... /* Clos
1a045 65 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 20 6a e any rollback j
1a046 6f 75 72 6e 61 6c 20 70 72 65 76 69 6f 75 73 6c ournal previousl
1a047 79 20 6f 70 65 6e 20 2a 2f 0d 0a 20 20 20 20 73 y open */.. s
1a048 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 qlite3OsClose(pP
1a049 61 67 65 72 2d 3e 6a 66 64 29 3b 0d 0a 0d 0a 20 ager->jfd);....
1a04a 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 rc = pagerOpe
1a04b 6e 57 61 6c 28 70 50 61 67 65 72 29 3b 0d 0a 20 nWal(pPager);..
1a04c 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
1a04d 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 70 E_OK ){.. p
1a04e 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f Pager->journalMo
1a04f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e de = PAGER_JOURN
1a050 41 4c 4d 4f 44 45 5f 57 41 4c 3b 0d 0a 20 20 20 ALMODE_WAL;..
1a051 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 pPager->eStat
1a052 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0d e = PAGER_OPEN;.
1a053 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b . }.. }else{
1a054 0d 0a 20 20 20 20 2a 70 62 4f 70 65 6e 20 3d 20 .. *pbOpen =
1a055 31 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 1;.. }.... ret
1a056 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1a057 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
1a058 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 on is called to
1a059 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 close the connec
1a05a 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 tion to the log
1a05b 66 69 6c 65 20 70 72 69 6f 72 0d 0a 2a 2a 20 74 file prior..** t
1a05c 6f 20 73 77 69 74 63 68 69 6e 67 20 66 72 6f 6d o switching from
1a05d 20 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61 63 6b WAL to rollback
1a05e 20 6d 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 42 mode...**..** B
1a05f 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74 68 efore closing th
1a060 65 20 6c 6f 67 20 66 69 6c 65 2c 20 74 68 69 73 e log file, this
1a061 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 function attemp
1a062 74 73 20 74 6f 20 74 61 6b 65 20 61 6e 20 0d 0a ts to take an ..
1a063 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 ** EXCLUSIVE loc
1a064 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 k on the databas
1a065 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 e file. If this
1a066 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e cannot be obtain
1a067 65 64 2c 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f 72 ed, an..** error
1a068 20 28 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69 (SQLITE_BUSY) i
1a069 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 s returned and t
1a06a 68 65 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f he log connectio
1a06b 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 2e n is not closed.
1a06c 0d 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 ..** If successf
1a06d 75 6c 2c 20 74 68 65 20 45 58 43 4c 55 53 49 56 ul, the EXCLUSIV
1a06e 45 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 E lock is not re
1a06f 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 72 65 leased before re
1a070 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 53 51 turning...*/..SQ
1a071 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
1a072 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f sqlite3PagerClo
1a073 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 seWal(Pager *pPa
1a074 67 65 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 ger){.. int rc
1a075 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a = SQLITE_OK;....
1a076 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 assert( pPager
1a077 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 ->journalMode==P
1a078 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 AGER_JOURNALMODE
1a079 5f 57 41 4c 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 _WAL );.... /*
1a07a 49 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 If the log file
1a07b 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f is not already o
1a07c 70 65 6e 2c 20 62 75 74 20 64 6f 65 73 20 65 78 pen, but does ex
1a07d 69 73 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d ist in the file-
1a07e 73 79 73 74 65 6d 2c 0d 0a 20 20 2a 2a 20 69 74 system,.. ** it
1a07f 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 may need to be
1a080 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 62 65 66 checkpointed bef
1a081 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 ore the connecti
1a082 6f 6e 20 63 61 6e 20 73 77 69 74 63 68 20 74 6f on can switch to
1a083 0d 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 .. ** rollback
1a084 6d 6f 64 65 2e 20 4f 70 65 6e 20 69 74 20 6e 6f mode. Open it no
1a085 77 20 73 6f 20 74 68 69 73 20 63 61 6e 20 68 61 w so this can ha
1a086 70 70 65 6e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 ppen... */.. i
1a087 66 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61 6c f( !pPager->pWal
1a088 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6c 6f 67 ){.. int log
1a089 65 78 69 73 74 73 20 3d 20 30 3b 0d 0a 20 20 20 exists = 0;..
1a08a 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 rc = pagerLockD
1a08b 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 b(pPager, SHARED
1a08c 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 69 66 28 _LOCK);.. if(
1a08d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1a08e 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 {.. rc = sq
1a08f 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0d 0a lite3OsAccess(..
1a090 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 pPager
1a091 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e ->pVfs, pPager->
1a092 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 zWal, SQLITE_ACC
1a093 45 53 53 5f 45 58 49 53 54 53 2c 20 26 6c 6f 67 ESS_EXISTS, &log
1a094 65 78 69 73 74 73 0d 0a 20 20 20 20 20 20 29 3b exists.. );
1a095 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
1a096 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
1a097 26 20 6c 6f 67 65 78 69 73 74 73 20 29 7b 0d 0a & logexists ){..
1a098 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 rc = pager
1a099 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 29 3b OpenWal(pPager);
1a09a 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 .. }.. }..
1a09b 20 20 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 70 6f .. /* Checkpo
1a09c 69 6e 74 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 int and close th
1a09d 65 20 6c 6f 67 2e 20 42 65 63 61 75 73 65 20 61 e log. Because a
1a09e 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b n EXCLUSIVE lock
1a09f 20 69 73 20 68 65 6c 64 20 6f 6e 0d 0a 20 20 2a is held on.. *
1a0a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 * the database f
1a0a1 69 6c 65 2c 20 74 68 65 20 6c 6f 67 20 61 6e 64 ile, the log and
1a0a2 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c log-summary fil
1a0a3 65 73 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 es will be delet
1a0a4 65 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 ed... */.. if(
1a0a5 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
1a0a6 26 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 & pPager->pWal )
1a0a7 7b 0d 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 {.. rc = page
1a0a8 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 rExclusiveLock(p
1a0a9 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 69 66 28 Pager);.. if(
1a0aa 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1a0ab 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 {.. rc = sq
1a0ac 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 lite3WalClose(pP
1a0ad 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 ager->pWal, pPag
1a0ae 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 er->ckptSyncFlag
1a0af 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 s,..
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 p
1a0b1 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c Pager->pageSize,
1a0b2 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 (u8*)pPager->pT
1a0b3 6d 70 53 70 61 63 65 29 3b 0d 0a 20 20 20 20 20 mpSpace);..
1a0b4 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 pPager->pWal =
1a0b5 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0;.. }.. }..
1a0b6 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
1a0b7 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
1a0b8 5f 48 41 53 5f 43 4f 44 45 43 0d 0a 2f 2a 0d 0a _HAS_CODEC../*..
1a0b9 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
1a0ba 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 is called by th
1a0bb 65 20 77 61 6c 20 6d 6f 64 75 6c 65 20 77 68 65 e wal module whe
1a0bc 6e 20 77 72 69 74 69 6e 67 20 70 61 67 65 20 63 n writing page c
1a0bd 6f 6e 74 65 6e 74 0d 0a 2a 2a 20 69 6e 74 6f 20 ontent..** into
1a0be 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 2a the log file...*
1a0bf 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 *..** This funct
1a0c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f ion returns a po
1a0c1 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 inter to a buffe
1a0c2 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 r containing the
1a0c3 20 65 6e 63 72 79 70 74 65 64 0d 0a 2a 2a 20 70 encrypted..** p
1a0c4 61 67 65 20 63 6f 6e 74 65 6e 74 2e 20 49 66 20 age content. If
1a0c5 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 a malloc fails,
1a0c6 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 this function ma
1a0c7 79 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0d 0a y return NULL...
1a0c8 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1a0c9 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 TE void *sqlite3
1a0ca 50 61 67 65 72 43 6f 64 65 63 28 50 67 48 64 72 PagerCodec(PgHdr
1a0cb 20 2a 70 50 67 29 7b 0d 0a 20 20 76 6f 69 64 20 *pPg){.. void
1a0cc 2a 61 44 61 74 61 20 3d 20 30 3b 0d 0a 20 20 43 *aData = 0;.. C
1a0cd 4f 44 45 43 32 28 70 50 67 2d 3e 70 50 61 67 65 ODEC2(pPg->pPage
1a0ce 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 r, pPg->pData, p
1a0cf 50 67 2d 3e 70 67 6e 6f 2c 20 36 2c 20 72 65 74 Pg->pgno, 6, ret
1a0d0 75 72 6e 20 30 2c 20 61 44 61 74 61 29 3b 0d 0a urn 0, aData);..
1a0d1 20 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0d return aData;.
1a0d2 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 .}..#endif /* SQ
1a0d3 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 2a LITE_HAS_CODEC *
1a0d4 2f 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 /....#endif /* !
1a0d5 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 SQLITE_OMIT_WAL
1a0d6 2a 2f 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 */....#endif /*
1a0d7 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b SQLITE_OMIT_DISK
1a0d8 49 4f 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a IO */..../******
1a0d9 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 ******** End of
1a0da 70 61 67 65 72 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a pager.c ********
1a0db 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0dc 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0dd 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a *******/../*****
1a0de 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 ********* Begin
1a0df 66 69 6c 65 20 77 61 6c 2e 63 20 2a 2a 2a 2a 2a file wal.c *****
1a0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0e1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0e2 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a ********/../*..*
1a0e3 2a 20 32 30 31 30 20 46 65 62 72 75 61 72 79 20 * 2010 February
1a0e4 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 1..**..** The au
1a0e5 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
1a0e6 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
1a0e7 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
1a0e8 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 n place of..** a
1a0e9 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
1a0ea 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
1a0eb 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 g:..**..** Ma
1a0ec 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
1a0ed 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 d not evil...**
1a0ee 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
1a0ef 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
1a0f0 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
1a0f1 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a give others...**
1a0f2 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 May you shar
1a0f3 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 e freely, never
1a0f4 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e taking more than
1a0f5 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a you give...**..
1a0f6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0f7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0f8 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0f9 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a0fa 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a *********..**..*
1a0fb 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
1a0fc 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 ains the impleme
1a0fd 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 77 72 69 ntation of a wri
1a0fe 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 28 57 41 te-ahead log (WA
1a0ff 4c 29 20 75 73 65 64 20 69 6e 20 0d 0a 2a 2a 20 L) used in ..**
1a100 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 "journal_mode=WA
1a101 4c 22 20 6d 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a L" mode...**..**
1a102 20 57 52 49 54 45 2d 41 48 45 41 44 20 4c 4f 47 WRITE-AHEAD LOG
1a103 20 28 57 41 4c 29 20 46 49 4c 45 20 46 4f 52 4d (WAL) FILE FORM
1a104 41 54 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 57 41 4c AT..**..** A WAL
1a105 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f file consists o
1a106 66 20 61 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f f a header follo
1a107 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d wed by zero or m
1a108 6f 72 65 20 22 66 72 61 6d 65 73 22 2e 0d 0a 2a ore "frames"...*
1a109 2a 20 45 61 63 68 20 66 72 61 6d 65 20 72 65 63 * Each frame rec
1a10a 6f 72 64 73 20 74 68 65 20 72 65 76 69 73 65 64 ords the revised
1a10b 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 content of a si
1a10c 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 ngle page from t
1a10d 68 65 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 he..** database
1a10e 66 69 6c 65 2e 20 20 41 6c 6c 20 63 68 61 6e 67 file. All chang
1a10f 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 es to the databa
1a110 73 65 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 se are recorded
1a111 62 79 20 77 72 69 74 69 6e 67 0d 0a 2a 2a 20 66 by writing..** f
1a112 72 61 6d 65 73 20 69 6e 74 6f 20 74 68 65 20 57 rames into the W
1a113 41 4c 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e AL. Transaction
1a114 73 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 s commit when a
1a115 66 72 61 6d 65 20 69 73 20 77 72 69 74 74 65 6e frame is written
1a116 20 74 68 61 74 0d 0a 2a 2a 20 63 6f 6e 74 61 69 that..** contai
1a117 6e 73 20 61 20 63 6f 6d 6d 69 74 20 6d 61 72 6b ns a commit mark
1a118 65 72 2e 20 20 41 20 73 69 6e 67 6c 65 20 57 41 er. A single WA
1a119 4c 20 63 61 6e 20 61 6e 64 20 75 73 75 61 6c 6c L can and usuall
1a11a 79 20 64 6f 65 73 20 72 65 63 6f 72 64 20 0d 0a y does record ..
1a11b 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 74 72 61 6e ** multiple tran
1a11c 73 61 63 74 69 6f 6e 73 2e 20 20 50 65 72 69 6f sactions. Perio
1a11d 64 69 63 61 6c 6c 79 2c 20 74 68 65 20 63 6f 6e dically, the con
1a11e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 20 tent of the WAL
1a11f 69 73 0d 0a 2a 2a 20 74 72 61 6e 73 66 65 72 72 is..** transferr
1a120 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 ed back into the
1a121 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
1a122 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 63 n an operation c
1a123 61 6c 6c 65 64 20 61 0d 0a 2a 2a 20 22 63 68 65 alled a..** "che
1a124 63 6b 70 6f 69 6e 74 22 2e 0d 0a 2a 2a 0d 0a 2a ckpoint"...**..*
1a125 2a 20 41 20 73 69 6e 67 6c 65 20 57 41 4c 20 66 * A single WAL f
1a126 69 6c 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 ile can be used
1a127 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 20 multiple times.
1a128 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c In other words,
1a129 20 74 68 65 0d 0a 2a 2a 20 57 41 4c 20 63 61 6e the..** WAL can
1a12a 20 66 69 6c 6c 20 75 70 20 77 69 74 68 20 66 72 fill up with fr
1a12b 61 6d 65 73 20 61 6e 64 20 74 68 65 6e 20 62 65 ames and then be
1a12c 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 6e checkpointed an
1a12d 64 20 74 68 65 6e 20 6e 65 77 0d 0a 2a 2a 20 66 d then new..** f
1a12e 72 61 6d 65 73 20 63 61 6e 20 6f 76 65 72 77 72 rames can overwr
1a12f 69 74 65 20 74 68 65 20 6f 6c 64 20 6f 6e 65 73 ite the old ones
1a130 2e 20 20 41 20 57 41 4c 20 61 6c 77 61 79 73 20 . A WAL always
1a131 67 72 6f 77 73 20 66 72 6f 6d 20 62 65 67 69 6e grows from begin
1a132 6e 69 6e 67 0d 0a 2a 2a 20 74 6f 77 61 72 64 20 ning..** toward
1a133 74 68 65 20 65 6e 64 2e 20 20 43 68 65 63 6b 73 the end. Checks
1a134 75 6d 73 20 61 6e 64 20 63 6f 75 6e 74 65 72 73 ums and counters
1a135 20 61 74 74 61 63 68 65 64 20 74 6f 20 65 61 63 attached to eac
1a136 68 20 66 72 61 6d 65 20 61 72 65 0d 0a 2a 2a 20 h frame are..**
1a137 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e used to determin
1a138 65 20 77 68 69 63 68 20 66 72 61 6d 65 73 20 77 e which frames w
1a139 69 74 68 69 6e 20 74 68 65 20 57 41 4c 20 61 72 ithin the WAL ar
1a13a 65 20 76 61 6c 69 64 20 61 6e 64 20 77 68 69 63 e valid and whic
1a13b 68 0d 0a 2a 2a 20 61 72 65 20 6c 65 66 74 6f 76 h..** are leftov
1a13c 65 72 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 63 ers from prior c
1a13d 68 65 63 6b 70 6f 69 6e 74 73 2e 0d 0a 2a 2a 0d heckpoints...**.
1a13e 0a 2a 2a 20 54 68 65 20 57 41 4c 20 68 65 61 64 .** The WAL head
1a13f 65 72 20 69 73 20 33 32 20 62 79 74 65 73 20 69 er is 32 bytes i
1a140 6e 20 73 69 7a 65 20 61 6e 64 20 63 6f 6e 73 69 n size and consi
1a141 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f sts of the follo
1a142 77 69 6e 67 20 65 69 67 68 74 0d 0a 2a 2a 20 62 wing eight..** b
1a143 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 ig-endian 32-bit
1a144 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 unsigned intege
1a145 72 20 76 61 6c 75 65 73 3a 0d 0a 2a 2a 0d 0a 2a r values:..**..*
1a146 2a 20 20 20 20 20 30 3a 20 4d 61 67 69 63 20 6e * 0: Magic n
1a147 75 6d 62 65 72 2e 20 20 30 78 33 37 37 66 30 36 umber. 0x377f06
1a148 38 32 20 6f 72 20 30 78 33 37 37 66 30 36 38 33 82 or 0x377f0683
1a149 0d 0a 2a 2a 20 20 20 20 20 34 3a 20 46 69 6c 65 ..** 4: File
1a14a 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 2e format version.
1a14b 20 20 43 75 72 72 65 6e 74 6c 79 20 33 30 30 37 Currently 3007
1a14c 30 30 30 0d 0a 2a 2a 20 20 20 20 20 38 3a 20 44 000..** 8: D
1a14d 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a atabase page siz
1a14e 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 31 30 32 e. Example: 102
1a14f 34 0d 0a 2a 2a 20 20 20 20 31 32 3a 20 43 68 65 4..** 12: Che
1a150 63 6b 70 6f 69 6e 74 20 73 65 71 75 65 6e 63 65 ckpoint sequence
1a151 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20 20 20 20 31 number..** 1
1a152 36 3a 20 53 61 6c 74 2d 31 2c 20 72 61 6e 64 6f 6: Salt-1, rando
1a153 6d 20 69 6e 74 65 67 65 72 20 69 6e 63 72 65 6d m integer increm
1a154 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 ented with each
1a155 63 68 65 63 6b 70 6f 69 6e 74 0d 0a 2a 2a 20 20 checkpoint..**
1a156 20 20 32 30 3a 20 53 61 6c 74 2d 32 2c 20 61 20 20: Salt-2, a
1a157 64 69 66 66 65 72 65 6e 74 20 72 61 6e 64 6f 6d different random
1a158 20 69 6e 74 65 67 65 72 20 63 68 61 6e 67 69 6e integer changin
1a159 67 20 77 69 74 68 20 65 61 63 68 20 63 6b 70 74 g with each ckpt
1a15a 0d 0a 2a 2a 20 20 20 20 32 34 3a 20 43 68 65 63 ..** 24: Chec
1a15b 6b 73 75 6d 2d 31 20 28 66 69 72 73 74 20 70 61 ksum-1 (first pa
1a15c 72 74 20 6f 66 20 63 68 65 63 6b 73 75 6d 20 66 rt of checksum f
1a15d 6f 72 20 66 69 72 73 74 20 32 34 20 62 79 74 65 or first 24 byte
1a15e 73 20 6f 66 20 68 65 61 64 65 72 29 2e 0d 0a 2a s of header)...*
1a15f 2a 20 20 20 20 32 38 3a 20 43 68 65 63 6b 73 75 * 28: Checksu
1a160 6d 2d 32 20 28 73 65 63 6f 6e 64 20 70 61 72 74 m-2 (second part
1a161 20 6f 66 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 of checksum for
1a162 20 66 69 72 73 74 20 32 34 20 62 79 74 65 73 20 first 24 bytes
1a163 6f 66 20 68 65 61 64 65 72 29 2e 0d 0a 2a 2a 0d of header)...**.
1a164 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 .** Immediately
1a165 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 77 61 following the wa
1a166 6c 2d 68 65 61 64 65 72 20 61 72 65 20 7a 65 72 l-header are zer
1a167 6f 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 o or more frames
1a168 2e 20 45 61 63 68 0d 0a 2a 2a 20 66 72 61 6d 65 . Each..** frame
1a169 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 consists of a 2
1a16a 34 2d 62 79 74 65 20 66 72 61 6d 65 2d 68 65 61 4-byte frame-hea
1a16b 64 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 der followed by
1a16c 61 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 a <page-size> by
1a16d 74 65 73 0d 0a 2a 2a 20 6f 66 20 70 61 67 65 20 tes..** of page
1a16e 64 61 74 61 2e 20 54 68 65 20 66 72 61 6d 65 2d data. The frame-
1a16f 68 65 61 64 65 72 20 69 73 20 73 69 78 20 62 69 header is six bi
1a170 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 g-endian 32-bit
1a171 75 6e 73 69 67 6e 65 64 20 0d 0a 2a 2a 20 69 6e unsigned ..** in
1a172 74 65 67 65 72 20 76 61 6c 75 65 73 2c 20 61 73 teger values, as
1a173 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a follows:..**..*
1a174 2a 20 20 20 20 20 30 3a 20 50 61 67 65 20 6e 75 * 0: Page nu
1a175 6d 62 65 72 2e 0d 0a 2a 2a 20 20 20 20 20 34 3a mber...** 4:
1a176 20 46 6f 72 20 63 6f 6d 6d 69 74 20 72 65 63 6f For commit reco
1a177 72 64 73 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 rds, the size of
1a178 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d the database im
1a179 61 67 65 20 69 6e 20 70 61 67 65 73 20 0d 0a 2a age in pages ..*
1a17a 2a 20 20 20 20 20 20 20 20 61 66 74 65 72 20 74 * after t
1a17b 68 65 20 63 6f 6d 6d 69 74 2e 20 46 6f 72 20 61 he commit. For a
1a17c 6c 6c 20 6f 74 68 65 72 20 72 65 63 6f 72 64 73 ll other records
1a17d 2c 20 7a 65 72 6f 2e 0d 0a 2a 2a 20 20 20 20 20 , zero...**
1a17e 38 3a 20 53 61 6c 74 2d 31 20 28 63 6f 70 69 65 8: Salt-1 (copie
1a17f 64 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 d from the heade
1a180 72 29 0d 0a 2a 2a 20 20 20 20 31 32 3a 20 53 61 r)..** 12: Sa
1a181 6c 74 2d 32 20 28 63 6f 70 69 65 64 20 66 72 6f lt-2 (copied fro
1a182 6d 20 74 68 65 20 68 65 61 64 65 72 29 0d 0a 2a m the header)..*
1a183 2a 20 20 20 20 31 36 3a 20 43 68 65 63 6b 73 75 * 16: Checksu
1a184 6d 2d 31 2e 0d 0a 2a 2a 20 20 20 20 32 30 3a 20 m-1...** 20:
1a185 43 68 65 63 6b 73 75 6d 2d 32 2e 0d 0a 2a 2a 0d Checksum-2...**.
1a186 0a 2a 2a 20 41 20 66 72 61 6d 65 20 69 73 20 63 .** A frame is c
1a187 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 onsidered valid
1a188 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 if and only if t
1a189 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e he following con
1a18a 64 69 74 69 6f 6e 73 20 61 72 65 0d 0a 2a 2a 20 ditions are..**
1a18b 74 72 75 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 true:..**..**
1a18c 20 28 31 29 20 54 68 65 20 73 61 6c 74 2d 31 20 (1) The salt-1
1a18d 61 6e 64 20 73 61 6c 74 2d 32 20 76 61 6c 75 65 and salt-2 value
1a18e 73 20 69 6e 20 74 68 65 20 66 72 61 6d 65 2d 68 s in the frame-h
1a18f 65 61 64 65 72 20 6d 61 74 63 68 0d 0a 2a 2a 20 eader match..**
1a190 20 20 20 20 20 20 20 73 61 6c 74 20 76 61 6c 75 salt valu
1a191 65 73 20 69 6e 20 74 68 65 20 77 61 6c 2d 68 65 es in the wal-he
1a192 61 64 65 72 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 ader..**..**
1a193 28 32 29 20 54 68 65 20 63 68 65 63 6b 73 75 6d (2) The checksum
1a194 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 66 values in the f
1a195 69 6e 61 6c 20 38 20 62 79 74 65 73 20 6f 66 20 inal 8 bytes of
1a196 74 68 65 20 66 72 61 6d 65 2d 68 65 61 64 65 72 the frame-header
1a197 0d 0a 2a 2a 20 20 20 20 20 20 20 20 65 78 61 63 ..** exac
1a198 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20 63 68 tly match the ch
1a199 65 63 6b 73 75 6d 20 63 6f 6d 70 75 74 65 64 20 ecksum computed
1a19a 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 20 6f 6e consecutively on
1a19b 20 74 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 the..**
1a19c 57 41 4c 20 68 65 61 64 65 72 20 61 6e 64 20 74 WAL header and t
1a19d 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 he first 8 bytes
1a19e 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 and the content
1a19f 20 6f 66 20 61 6c 6c 20 66 72 61 6d 65 73 0d 0a of all frames..
1a1a0 2a 2a 20 20 20 20 20 20 20 20 75 70 20 74 6f 20 ** up to
1a1a1 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 and including th
1a1a2 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e e current frame.
1a1a3 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 68 65 ..**..** The che
1a1a4 63 6b 73 75 6d 20 69 73 20 63 6f 6d 70 75 74 65 cksum is compute
1a1a5 64 20 75 73 69 6e 67 20 33 32 2d 62 69 74 20 62 d using 32-bit b
1a1a6 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 ig-endian intege
1a1a7 72 73 20 69 66 20 74 68 65 0d 0a 2a 2a 20 6d 61 rs if the..** ma
1a1a8 67 69 63 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 gic number in th
1a1a9 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 e first 4 bytes
1a1aa 6f 66 20 74 68 65 20 57 41 4c 20 69 73 20 30 78 of the WAL is 0x
1a1ab 33 37 37 66 30 36 38 33 20 61 6e 64 20 69 74 0d 377f0683 and it.
1a1ac 0a 2a 2a 20 69 73 20 63 6f 6d 70 75 74 65 64 20 .** is computed
1a1ad 75 73 69 6e 67 20 6c 69 74 74 6c 65 2d 65 6e 64 using little-end
1a1ae 69 61 6e 20 69 66 20 74 68 65 20 6d 61 67 69 63 ian if the magic
1a1af 20 6e 75 6d 62 65 72 20 69 73 20 30 78 33 37 37 number is 0x377
1a1b0 66 30 36 38 32 2e 0d 0a 2a 2a 20 54 68 65 20 63 f0682...** The c
1a1b1 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 73 20 61 hecksum values a
1a1b2 72 65 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 re always stored
1a1b3 20 69 6e 20 74 68 65 20 66 72 61 6d 65 20 68 65 in the frame he
1a1b4 61 64 65 72 20 69 6e 20 61 0d 0a 2a 2a 20 62 69 ader in a..** bi
1a1b5 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 g-endian format
1a1b6 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 regardless of wh
1a1b7 69 63 68 20 62 79 74 65 20 6f 72 64 65 72 20 69 ich byte order i
1a1b8 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 s used to comput
1a1b9 65 0d 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 e..** the checks
1a1ba 75 6d 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 um. The checksu
1a1bb 6d 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 m is computed by
1a1bc 20 69 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68 interpreting th
1a1bd 65 20 69 6e 70 75 74 20 61 73 0d 0a 2a 2a 20 61 e input as..** a
1a1be 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 n even number of
1a1bf 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 unsigned 32-bit
1a1c0 20 69 6e 74 65 67 65 72 73 3a 20 78 5b 30 5d 20 integers: x[0]
1a1c1 74 68 72 6f 75 67 68 20 78 5b 4e 5d 2e 20 20 54 through x[N]. T
1a1c2 68 65 0d 0a 2a 2a 20 61 6c 67 6f 72 69 74 68 6d he..** algorithm
1a1c3 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 68 used for the ch
1a1c4 65 63 6b 73 75 6d 20 69 73 20 61 73 20 66 6f 6c ecksum is as fol
1a1c5 6c 6f 77 73 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 lows:..** ..**
1a1c6 20 66 6f 72 20 69 20 66 72 6f 6d 20 30 20 74 6f for i from 0 to
1a1c7 20 6e 2d 31 20 73 74 65 70 20 32 3a 0d 0a 2a 2a n-1 step 2:..**
1a1c8 20 20 20 20 20 73 30 20 2b 3d 20 78 5b 69 5d 20 s0 += x[i]
1a1c9 2b 20 73 31 3b 0d 0a 2a 2a 20 20 20 20 20 73 31 + s1;..** s1
1a1ca 20 2b 3d 20 78 5b 69 2b 31 5d 20 2b 20 73 30 3b += x[i+1] + s0;
1a1cb 0d 0a 2a 2a 20 20 20 65 6e 64 66 6f 72 0d 0a 2a ..** endfor..*
1a1cc 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 *..** Note that
1a1cd 73 30 20 61 6e 64 20 73 31 20 61 72 65 20 62 6f s0 and s1 are bo
1a1ce 74 68 20 77 65 69 67 68 74 65 64 20 63 68 65 63 th weighted chec
1a1cf 6b 73 75 6d 73 20 75 73 69 6e 67 20 66 69 62 6f ksums using fibo
1a1d0 6e 61 63 63 69 20 77 65 69 67 68 74 73 0d 0a 2a nacci weights..*
1a1d1 2a 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 * in reverse ord
1a1d2 65 72 20 28 74 68 65 20 6c 61 72 67 65 73 74 20 er (the largest
1a1d3 66 69 62 6f 6e 61 63 63 69 20 77 65 69 67 68 74 fibonacci weight
1a1d4 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 66 occurs on the f
1a1d5 69 72 73 74 20 65 6c 65 6d 65 6e 74 0d 0a 2a 2a irst element..**
1a1d6 20 6f 66 20 74 68 65 20 73 65 71 75 65 6e 63 65 of the sequence
1a1d7 20 62 65 69 6e 67 20 73 75 6d 6d 65 64 2e 29 20 being summed.)
1a1d8 20 54 68 65 20 73 31 20 76 61 6c 75 65 20 73 70 The s1 value sp
1a1d9 61 6e 73 20 61 6c 6c 20 33 32 2d 62 69 74 20 0d ans all 32-bit .
1a1da 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 .** terms of the
1a1db 20 73 65 71 75 65 6e 63 65 20 77 68 65 72 65 61 sequence wherea
1a1dc 73 20 73 30 20 6f 6d 69 74 73 20 74 68 65 20 66 s s0 omits the f
1a1dd 69 6e 61 6c 20 74 65 72 6d 2e 0d 0a 2a 2a 0d 0a inal term...**..
1a1de 2a 2a 20 4f 6e 20 61 20 63 68 65 63 6b 70 6f 69 ** On a checkpoi
1a1df 6e 74 2c 20 74 68 65 20 57 41 4c 20 69 73 20 66 nt, the WAL is f
1a1e0 69 72 73 74 20 56 46 53 2e 78 53 79 6e 63 2d 65 irst VFS.xSync-e
1a1e1 64 2c 20 74 68 65 6e 20 76 61 6c 69 64 20 63 6f d, then valid co
1a1e2 6e 74 65 6e 74 20 6f 66 20 74 68 65 0d 0a 2a 2a ntent of the..**
1a1e3 20 57 41 4c 20 69 73 20 74 72 61 6e 73 66 65 72 WAL is transfer
1a1e4 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 red into the dat
1a1e5 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 abase, then the
1a1e6 64 61 74 61 62 61 73 65 20 69 73 20 56 46 53 2e database is VFS.
1a1e7 78 53 79 6e 63 2d 65 64 2e 0d 0a 2a 2a 20 54 68 xSync-ed...** Th
1a1e8 65 20 56 46 53 2e 78 53 79 6e 63 20 6f 70 65 72 e VFS.xSync oper
1a1e9 61 74 69 6f 6e 73 20 73 65 72 76 65 20 61 73 20 ations serve as
1a1ea 77 72 69 74 65 20 62 61 72 72 69 65 72 73 20 2d write barriers -
1a1eb 20 61 6c 6c 20 77 72 69 74 65 73 20 6c 61 75 6e all writes laun
1a1ec 63 68 65 64 0d 0a 2a 2a 20 62 65 66 6f 72 65 20 ched..** before
1a1ed 74 68 65 20 78 53 79 6e 63 20 6d 75 73 74 20 63 the xSync must c
1a1ee 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 20 61 omplete before a
1a1ef 6e 79 20 77 72 69 74 65 20 74 68 61 74 20 6c 61 ny write that la
1a1f0 75 6e 63 68 65 73 20 61 66 74 65 72 20 74 68 65 unches after the
1a1f1 0d 0a 2a 2a 20 78 53 79 6e 63 20 62 65 67 69 6e ..** xSync begin
1a1f2 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66 74 65 72 s...**..** After
1a1f3 20 65 61 63 68 20 63 68 65 63 6b 70 6f 69 6e 74 each checkpoint
1a1f4 2c 20 74 68 65 20 73 61 6c 74 2d 31 20 76 61 6c , the salt-1 val
1a1f5 75 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 ue is incremente
1a1f6 64 20 61 6e 64 20 74 68 65 20 73 61 6c 74 2d 32 d and the salt-2
1a1f7 0d 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 72 61 ..** value is ra
1a1f8 6e 64 6f 6d 69 7a 65 64 2e 20 20 54 68 69 73 20 ndomized. This
1a1f9 70 72 65 76 65 6e 74 73 20 6f 6c 64 20 61 6e 64 prevents old and
1a1fa 20 6e 65 77 20 66 72 61 6d 65 73 20 69 6e 20 74 new frames in t
1a1fb 68 65 20 57 41 4c 20 66 72 6f 6d 0d 0a 2a 2a 20 he WAL from..**
1a1fc 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 being considered
1a1fd 20 76 61 6c 69 64 20 61 74 20 74 68 65 20 73 61 valid at the sa
1a1fe 6d 65 20 74 69 6d 65 20 61 6e 64 20 62 65 69 6e me time and bein
1a1ff 67 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 g checkpointing
1a200 74 6f 67 65 74 68 65 72 0d 0a 2a 2a 20 66 6f 6c together..** fol
1a201 6c 6f 77 69 6e 67 20 61 20 63 72 61 73 68 2e 0d lowing a crash..
1a202 0a 2a 2a 0d 0a 2a 2a 20 52 45 41 44 45 52 20 41 .**..** READER A
1a203 4c 47 4f 52 49 54 48 4d 0d 0a 2a 2a 0d 0a 2a 2a LGORITHM..**..**
1a204 20 54 6f 20 72 65 61 64 20 61 20 70 61 67 65 20 To read a page
1a205 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
1a206 65 20 28 63 61 6c 6c 20 69 74 20 70 61 67 65 20 e (call it page
1a207 6e 75 6d 62 65 72 20 50 29 2c 20 61 20 72 65 61 number P), a rea
1a208 64 65 72 0d 0a 2a 2a 20 66 69 72 73 74 20 63 68 der..** first ch
1a209 65 63 6b 73 20 74 68 65 20 57 41 4c 20 74 6f 20 ecks the WAL to
1a20a 73 65 65 20 69 66 20 69 74 20 63 6f 6e 74 61 69 see if it contai
1a20b 6e 73 20 70 61 67 65 20 50 2e 20 20 49 66 20 73 ns page P. If s
1a20c 6f 2c 20 74 68 65 6e 20 74 68 65 0d 0a 2a 2a 20 o, then the..**
1a20d 6c 61 73 74 20 76 61 6c 69 64 20 69 6e 73 74 61 last valid insta
1a20e 6e 63 65 20 6f 66 20 70 61 67 65 20 50 20 74 68 nce of page P th
1a20f 61 74 20 69 73 20 61 20 66 6f 6c 6c 6f 77 65 64 at is a followed
1a210 20 62 79 20 61 20 63 6f 6d 6d 69 74 20 66 72 61 by a commit fra
1a211 6d 65 0d 0a 2a 2a 20 6f 72 20 69 73 20 61 20 63 me..** or is a c
1a212 6f 6d 6d 69 74 20 66 72 61 6d 65 20 69 74 73 65 ommit frame itse
1a213 6c 66 20 62 65 63 6f 6d 65 73 20 74 68 65 20 76 lf becomes the v
1a214 61 6c 75 65 20 72 65 61 64 2e 20 20 49 66 20 74 alue read. If t
1a215 68 65 20 57 41 4c 0d 0a 2a 2a 20 63 6f 6e 74 61 he WAL..** conta
1a216 69 6e 73 20 6e 6f 20 63 6f 70 69 65 73 20 6f 66 ins no copies of
1a217 20 70 61 67 65 20 50 20 74 68 61 74 20 61 72 65 page P that are
1a218 20 76 61 6c 69 64 20 61 6e 64 20 77 68 69 63 68 valid and which
1a219 20 61 72 65 20 61 20 63 6f 6d 6d 69 74 0d 0a 2a are a commit..*
1a21a 2a 20 66 72 61 6d 65 20 6f 72 20 61 72 65 20 66 * frame or are f
1a21b 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6d ollowed by a com
1a21c 6d 69 74 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 mit frame, then
1a21d 70 61 67 65 20 50 20 69 73 20 72 65 61 64 20 66 page P is read f
1a21e 72 6f 6d 0d 0a 2a 2a 20 74 68 65 20 64 61 74 61 rom..** the data
1a21f 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a base file...**..
1a220 2a 2a 20 54 6f 20 73 74 61 72 74 20 61 20 72 65 ** To start a re
1a221 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 ad transaction,
1a222 74 68 65 20 72 65 61 64 65 72 20 72 65 63 6f 72 the reader recor
1a223 64 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 ds the index of
1a224 74 68 65 20 6c 61 73 74 0d 0a 2a 2a 20 76 61 6c the last..** val
1a225 69 64 20 66 72 61 6d 65 20 69 6e 20 74 68 65 20 id frame in the
1a226 57 41 4c 2e 20 20 54 68 65 20 72 65 61 64 65 72 WAL. The reader
1a227 20 75 73 65 73 20 74 68 69 73 20 72 65 63 6f 72 uses this recor
1a228 64 65 64 20 22 6d 78 46 72 61 6d 65 22 20 76 61 ded "mxFrame" va
1a229 6c 75 65 0d 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 lue..** for all
1a22a 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64 20 subsequent read
1a22b 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 4e 65 77 operations. New
1a22c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 63 61 transactions ca
1a22d 6e 20 62 65 20 61 70 70 65 6e 64 65 64 0d 0a 2a n be appended..*
1a22e 2a 20 74 6f 20 74 68 65 20 57 41 4c 2c 20 62 75 * to the WAL, bu
1a22f 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 t as long as the
1a230 20 72 65 61 64 65 72 20 75 73 65 73 20 69 74 73 reader uses its
1a231 20 6f 72 69 67 69 6e 61 6c 20 6d 78 46 72 61 6d original mxFram
1a232 65 20 76 61 6c 75 65 0d 0a 2a 2a 20 61 6e 64 20 e value..** and
1a233 69 67 6e 6f 72 65 73 20 74 68 65 20 6e 65 77 6c ignores the newl
1a234 79 20 61 70 70 65 6e 64 65 64 20 63 6f 6e 74 65 y appended conte
1a235 6e 74 2c 20 69 74 20 77 69 6c 6c 20 73 65 65 20 nt, it will see
1a236 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 6e 61 a consistent sna
1a237 70 73 68 6f 74 0d 0a 2a 2a 20 6f 66 20 74 68 65 pshot..** of the
1a238 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 61 database from a
1a239 20 73 69 6e 67 6c 65 20 70 6f 69 6e 74 20 69 6e single point in
1a23a 20 74 69 6d 65 2e 20 20 54 68 69 73 20 74 65 63 time. This tec
1a23b 68 6e 69 71 75 65 20 61 6c 6c 6f 77 73 0d 0a 2a hnique allows..*
1a23c 2a 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 63 75 * multiple concu
1a23d 72 72 65 6e 74 20 72 65 61 64 65 72 73 20 74 6f rrent readers to
1a23e 20 76 69 65 77 20 64 69 66 66 65 72 65 6e 74 20 view different
1a23f 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 versions of the
1a240 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 6f 6e database..** con
1a241 74 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 tent simultaneou
1a242 73 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 sly...**..** The
1a243 20 72 65 61 64 65 72 20 61 6c 67 6f 72 69 74 68 reader algorith
1a244 6d 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 m in the previou
1a245 73 20 70 61 72 61 67 72 61 70 68 73 20 77 6f 72 s paragraphs wor
1a246 6b 73 20 63 6f 72 72 65 63 74 6c 79 2c 20 62 75 ks correctly, bu
1a247 74 20 0d 0a 2a 2a 20 62 65 63 61 75 73 65 20 66 t ..** because f
1a248 72 61 6d 65 73 20 66 6f 72 20 70 61 67 65 20 50 rames for page P
1a249 20 63 61 6e 20 61 70 70 65 61 72 20 61 6e 79 77 can appear anyw
1a24a 68 65 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 here within the
1a24b 57 41 4c 2c 20 74 68 65 0d 0a 2a 2a 20 72 65 61 WAL, the..** rea
1a24c 64 65 72 20 68 61 73 20 74 6f 20 73 63 61 6e 20 der has to scan
1a24d 74 68 65 20 65 6e 74 69 72 65 20 57 41 4c 20 6c the entire WAL l
1a24e 6f 6f 6b 69 6e 67 20 66 6f 72 20 70 61 67 65 20 ooking for page
1a24f 50 20 66 72 61 6d 65 73 2e 20 20 49 66 20 74 68 P frames. If th
1a250 65 0d 0a 2a 2a 20 57 41 4c 20 69 73 20 6c 61 72 e..** WAL is lar
1a251 67 65 20 28 6d 75 6c 74 69 70 6c 65 20 6d 65 67 ge (multiple meg
1a252 61 62 79 74 65 73 20 69 73 20 74 79 70 69 63 61 abytes is typica
1a253 6c 29 20 74 68 61 74 20 73 63 61 6e 20 63 61 6e l) that scan can
1a254 20 62 65 20 73 6c 6f 77 2c 0d 0a 2a 2a 20 61 6e be slow,..** an
1a255 64 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e d read performan
1a256 63 65 20 73 75 66 66 65 72 73 2e 20 20 54 6f 20 ce suffers. To
1a257 6f 76 65 72 63 6f 6d 65 20 74 68 69 73 20 70 72 overcome this pr
1a258 6f 62 6c 65 6d 2c 20 61 20 73 65 70 61 72 61 74 oblem, a separat
1a259 65 0d 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 e..** data struc
1a25a 74 75 72 65 20 63 61 6c 6c 65 64 20 74 68 65 20 ture called the
1a25b 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6d 61 69 wal-index is mai
1a25c 6e 74 61 69 6e 65 64 20 74 6f 20 65 78 70 65 64 ntained to exped
1a25d 69 74 65 20 74 68 65 0d 0a 2a 2a 20 73 65 61 72 ite the..** sear
1a25e 63 68 20 66 6f 72 20 66 72 61 6d 65 73 20 6f 66 ch for frames of
1a25f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 61 a particular pa
1a260 67 65 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 57 41 4c ge...** ..** WAL
1a261 2d 49 4e 44 45 58 20 46 4f 52 4d 41 54 0d 0a 2a -INDEX FORMAT..*
1a262 2a 0d 0a 2a 2a 20 43 6f 6e 63 65 70 74 75 61 6c *..** Conceptual
1a263 6c 79 2c 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 ly, the wal-inde
1a264 78 20 69 73 20 73 68 61 72 65 64 20 6d 65 6d 6f x is shared memo
1a265 72 79 2c 20 74 68 6f 75 67 68 20 56 46 53 20 69 ry, though VFS i
1a266 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0d 0a mplementations..
1a267 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 ** might choose
1a268 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 to implement the
1a269 20 77 61 6c 2d 69 6e 64 65 78 20 75 73 69 6e 67 wal-index using
1a26a 20 61 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 2e a mmapped file.
1a26b 20 20 42 65 63 61 75 73 65 0d 0a 2a 2a 20 74 68 Because..** th
1a26c 65 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 73 e wal-index is s
1a26d 68 61 72 65 64 20 6d 65 6d 6f 72 79 2c 20 53 51 hared memory, SQ
1a26e 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 Lite does not su
1a26f 70 70 6f 72 74 20 6a 6f 75 72 6e 61 6c 5f 6d 6f pport journal_mo
1a270 64 65 3d 57 41 4c 20 0d 0a 2a 2a 20 6f 6e 20 61 de=WAL ..** on a
1a271 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 network filesys
1a272 74 65 6d 2e 20 20 41 6c 6c 20 75 73 65 72 73 20 tem. All users
1a273 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
1a274 6d 75 73 74 20 62 65 20 61 62 6c 65 20 74 6f 0d must be able to.
1a275 0a 2a 2a 20 73 68 61 72 65 20 6d 65 6d 6f 72 79 .** share memory
1a276 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 77 61 ...**..** The wa
1a277 6c 2d 69 6e 64 65 78 20 69 73 20 74 72 61 6e 73 l-index is trans
1a278 69 65 6e 74 2e 20 20 41 66 74 65 72 20 61 20 63 ient. After a c
1a279 72 61 73 68 2c 20 74 68 65 20 77 61 6c 2d 69 6e rash, the wal-in
1a27a 64 65 78 20 63 61 6e 20 28 61 6e 64 20 73 68 6f dex can (and sho
1a27b 75 6c 64 0d 0a 2a 2a 20 62 65 29 20 72 65 63 6f uld..** be) reco
1a27c 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 74 nstructed from t
1a27d 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 41 4c 20 he original WAL
1a27e 66 69 6c 65 2e 20 20 49 6e 20 66 61 63 74 2c 20 file. In fact,
1a27f 74 68 65 20 56 46 53 20 69 73 20 72 65 71 75 69 the VFS is requi
1a280 72 65 64 0d 0a 2a 2a 20 74 6f 20 65 69 74 68 65 red..** to eithe
1a281 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 r truncate or ze
1a282 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 ro the header of
1a283 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 77 the wal-index w
1a284 68 65 6e 20 74 68 65 20 6c 61 73 74 0d 0a 2a 2a hen the last..**
1a285 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 69 connection to i
1a286 74 20 63 6c 6f 73 65 73 2e 20 20 42 65 63 61 75 t closes. Becau
1a287 73 65 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 se the wal-index
1a288 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 69 is transient, i
1a289 74 20 63 61 6e 0d 0a 2a 2a 20 75 73 65 20 61 6e t can..** use an
1a28a 20 61 72 63 68 69 74 65 63 74 75 72 65 2d 73 70 architecture-sp
1a28b 65 63 69 66 69 63 20 66 6f 72 6d 61 74 3b 20 69 ecific format; i
1a28c 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 t does not have
1a28d 74 6f 20 62 65 20 63 72 6f 73 73 2d 70 6c 61 74 to be cross-plat
1a28e 66 6f 72 6d 2e 0d 0a 2a 2a 20 48 65 6e 63 65 2c form...** Hence,
1a28f 20 75 6e 6c 69 6b 65 20 74 68 65 20 64 61 74 61 unlike the data
1a290 62 61 73 65 20 61 6e 64 20 57 41 4c 20 66 69 6c base and WAL fil
1a291 65 20 66 6f 72 6d 61 74 73 20 77 68 69 63 68 20 e formats which
1a292 73 74 6f 72 65 20 61 6c 6c 20 76 61 6c 75 65 73 store all values
1a293 0d 0a 2a 2a 20 61 73 20 62 69 67 20 65 6e 64 69 ..** as big endi
1a294 61 6e 2c 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 an, the wal-inde
1a295 78 20 63 61 6e 20 73 74 6f 72 65 20 6d 75 6c 74 x can store mult
1a296 69 2d 62 79 74 65 20 76 61 6c 75 65 73 20 69 6e i-byte values in
1a297 20 74 68 65 20 6e 61 74 69 76 65 0d 0a 2a 2a 20 the native..**
1a298 62 79 74 65 20 6f 72 64 65 72 20 6f 66 20 74 68 byte order of th
1a299 65 20 68 6f 73 74 20 63 6f 6d 70 75 74 65 72 2e e host computer.
1a29a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 75 72 ..**..** The pur
1a29b 70 6f 73 65 20 6f 66 20 74 68 65 20 77 61 6c 2d pose of the wal-
1a29c 69 6e 64 65 78 20 69 73 20 74 6f 20 61 6e 73 77 index is to answ
1a29d 65 72 20 74 68 69 73 20 71 75 65 73 74 69 6f 6e er this question
1a29e 20 71 75 69 63 6b 6c 79 3a 20 20 47 69 76 65 6e quickly: Given
1a29f 0d 0a 2a 2a 20 61 20 70 61 67 65 20 6e 75 6d 62 ..** a page numb
1a2a0 65 72 20 50 2c 20 72 65 74 75 72 6e 20 74 68 65 er P, return the
1a2a1 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6c 61 index of the la
1a2a2 73 74 20 66 72 61 6d 65 20 66 6f 72 20 70 61 67 st frame for pag
1a2a3 65 20 50 20 69 6e 20 74 68 65 20 57 41 4c 2c 0d e P in the WAL,.
1a2a4 0a 2a 2a 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 .** or return NU
1a2a5 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 LL if there are
1a2a6 6e 6f 20 66 72 61 6d 65 73 20 66 6f 72 20 70 61 no frames for pa
1a2a7 67 65 20 50 20 69 6e 20 74 68 65 20 57 41 4c 2e ge P in the WAL.
1a2a8 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 77 61 6c ..**..** The wal
1a2a9 2d 69 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 -index consists
1a2aa 6f 66 20 61 20 68 65 61 64 65 72 20 72 65 67 69 of a header regi
1a2ab 6f 6e 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 on, followed by
1a2ac 61 6e 20 6f 6e 65 20 6f 72 0d 0a 2a 2a 20 6d 6f an one or..** mo
1a2ad 72 65 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 2e re index blocks.
1a2ae 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 77 ..**..** The w
1a2af 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 al-index header
1a2b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 74 contains the tot
1a2b1 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 al number of fra
1a2b2 6d 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 57 mes within the W
1a2b3 41 4c 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 74 68 AL..** in the th
1a2b4 65 20 6d 78 46 72 61 6d 65 20 66 69 65 6c 64 2e e mxFrame field.
1a2b5 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 45 61 63 68 20 ..**..** Each
1a2b6 69 6e 64 65 78 20 62 6c 6f 63 6b 20 65 78 63 65 index block exce
1a2b7 70 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 pt for the first
1a2b8 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d contains inform
1a2b9 61 74 69 6f 6e 20 6f 6e 20 0d 0a 2a 2a 20 48 41 ation on ..** HA
1a2ba 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 20 66 72 SHTABLE_NPAGE fr
1a2bb 61 6d 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 ames. The first
1a2bc 69 6e 64 65 78 20 62 6c 6f 63 6b 20 63 6f 6e 74 index block cont
1a2bd 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ains information
1a2be 20 6f 6e 0d 0a 2a 2a 20 48 41 53 48 54 41 42 4c on..** HASHTABL
1a2bf 45 5f 4e 50 41 47 45 5f 4f 4e 45 20 66 72 61 6d E_NPAGE_ONE fram
1a2c0 65 73 2e 20 54 68 65 20 76 61 6c 75 65 73 20 6f es. The values o
1a2c1 66 20 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 f HASHTABLE_NPAG
1a2c2 45 5f 4f 4e 45 20 61 6e 64 20 0d 0a 2a 2a 20 48 E_ONE and ..** H
1a2c3 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 20 61 ASHTABLE_NPAGE a
1a2c4 72 65 20 73 65 6c 65 63 74 65 64 20 73 6f 20 74 re selected so t
1a2c5 68 61 74 20 74 6f 67 65 74 68 65 72 20 74 68 65 hat together the
1a2c6 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 wal-index heade
1a2c7 72 20 61 6e 64 0d 0a 2a 2a 20 66 69 72 73 74 20 r and..** first
1a2c8 69 6e 64 65 78 20 62 6c 6f 63 6b 20 61 72 65 20 index block are
1a2c9 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 the same size as
1a2ca 20 61 6c 6c 20 6f 74 68 65 72 20 69 6e 64 65 78 all other index
1a2cb 20 62 6c 6f 63 6b 73 20 69 6e 20 74 68 65 0d 0a blocks in the..
1a2cc 2a 2a 20 77 61 6c 2d 69 6e 64 65 78 2e 0d 0a 2a ** wal-index...*
1a2cd 2a 0d 0a 2a 2a 20 45 61 63 68 20 69 6e 64 65 78 *..** Each index
1a2ce 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 block contains
1a2cf 74 77 6f 20 73 65 63 74 69 6f 6e 73 2c 20 61 20 two sections, a
1a2d0 70 61 67 65 2d 6d 61 70 70 69 6e 67 20 74 68 61 page-mapping tha
1a2d1 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a t contains the..
1a2d2 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 ** database page
1a2d3 20 6e 75 6d 62 65 72 20 61 73 73 6f 63 69 61 74 number associat
1a2d4 65 64 20 77 69 74 68 20 65 61 63 68 20 77 61 6c ed with each wal
1a2d5 20 66 72 61 6d 65 2c 20 61 6e 64 20 61 20 68 61 frame, and a ha
1a2d6 73 68 2d 74 61 62 6c 65 20 0d 0a 2a 2a 20 74 68 sh-table ..** th
1a2d7 61 74 20 61 6c 6c 6f 77 73 20 72 65 61 64 65 72 at allows reader
1a2d8 73 20 74 6f 20 71 75 65 72 79 20 61 6e 20 69 6e s to query an in
1a2d9 64 65 78 20 62 6c 6f 63 6b 20 66 6f 72 20 61 20 dex block for a
1a2da 73 70 65 63 69 66 69 63 20 70 61 67 65 20 6e 75 specific page nu
1a2db 6d 62 65 72 2e 0d 0a 2a 2a 20 54 68 65 20 70 61 mber...** The pa
1a2dc 67 65 2d 6d 61 70 70 69 6e 67 20 69 73 20 61 6e ge-mapping is an
1a2dd 20 61 72 72 61 79 20 6f 66 20 48 41 53 48 54 41 array of HASHTA
1a2de 42 4c 45 5f 4e 50 41 47 45 20 28 6f 72 20 48 41 BLE_NPAGE (or HA
1a2df 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f 4e SHTABLE_NPAGE_ON
1a2e0 45 0d 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 E..** for the fi
1a2e1 72 73 74 20 69 6e 64 65 78 20 62 6c 6f 63 6b 29 rst index block)
1a2e2 20 33 32 2d 62 69 74 20 70 61 67 65 20 6e 75 6d 32-bit page num
1a2e3 62 65 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 bers. The first
1a2e4 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0d 0a 2a entry in the ..*
1a2e5 2a 20 66 69 72 73 74 20 69 6e 64 65 78 2d 62 6c * first index-bl
1a2e6 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 ock contains the
1a2e7 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6e database page n
1a2e8 75 6d 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 umber correspond
1a2e9 69 6e 67 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 66 ing to the..** f
1a2ea 69 72 73 74 20 66 72 61 6d 65 20 69 6e 20 74 68 irst frame in th
1a2eb 65 20 57 41 4c 20 66 69 6c 65 2e 20 54 68 65 20 e WAL file. The
1a2ec 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 first entry in t
1a2ed 68 65 20 73 65 63 6f 6e 64 20 69 6e 64 65 78 20 he second index
1a2ee 62 6c 6f 63 6b 0d 0a 2a 2a 20 69 6e 20 74 68 65 block..** in the
1a2ef 20 57 41 4c 20 66 69 6c 65 20 63 6f 72 72 65 73 WAL file corres
1a2f0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 28 48 41 ponds to the (HA
1a2f1 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f 4e SHTABLE_NPAGE_ON
1a2f2 45 2b 31 29 74 68 20 66 72 61 6d 65 20 69 6e 0d E+1)th frame in.
1a2f3 0a 2a 2a 20 74 68 65 20 6c 6f 67 2c 20 61 6e 64 .** the log, and
1a2f4 20 73 6f 20 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 so on...**..**
1a2f5 54 68 65 20 6c 61 73 74 20 69 6e 64 65 78 20 62 The last index b
1a2f6 6c 6f 63 6b 20 69 6e 20 61 20 77 61 6c 2d 69 6e lock in a wal-in
1a2f7 64 65 78 20 75 73 75 61 6c 6c 79 20 63 6f 6e 74 dex usually cont
1a2f8 61 69 6e 73 20 6c 65 73 73 20 74 68 61 6e 20 74 ains less than t
1a2f9 68 65 20 66 75 6c 6c 0d 0a 2a 2a 20 63 6f 6d 70 he full..** comp
1a2fa 6c 65 6d 65 6e 74 20 6f 66 20 48 41 53 48 54 41 lement of HASHTA
1a2fb 42 4c 45 5f 4e 50 41 47 45 20 28 6f 72 20 48 41 BLE_NPAGE (or HA
1a2fc 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f 4e SHTABLE_NPAGE_ON
1a2fd 45 29 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 2c E) page-numbers,
1a2fe 0d 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f ..** depending o
1a2ff 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f n the contents o
1a300 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 20 f the WAL file.
1a301 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 This does not ch
1a302 61 6e 67 65 20 74 68 65 0d 0a 2a 2a 20 61 6c 6c ange the..** all
1a303 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 74 ocated size of t
1a304 68 65 20 70 61 67 65 2d 6d 61 70 70 69 6e 67 20 he page-mapping
1a305 61 72 72 61 79 20 2d 20 74 68 65 20 70 61 67 65 array - the page
1a306 2d 6d 61 70 70 69 6e 67 20 61 72 72 61 79 20 6d -mapping array m
1a307 65 72 65 6c 79 0d 0a 2a 2a 20 63 6f 6e 74 61 69 erely..** contai
1a308 6e 73 20 75 6e 75 73 65 64 20 65 6e 74 72 69 65 ns unused entrie
1a309 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 76 65 6e 20 s...**..** Even
1a30a 77 69 74 68 6f 75 74 20 75 73 69 6e 67 20 74 68 without using th
1a30b 65 20 68 61 73 68 20 74 61 62 6c 65 2c 20 74 68 e hash table, th
1a30c 65 20 6c 61 73 74 20 66 72 61 6d 65 20 66 6f 72 e last frame for
1a30d 20 70 61 67 65 20 50 0d 0a 2a 2a 20 63 61 6e 20 page P..** can
1a30e 62 65 20 66 6f 75 6e 64 20 62 79 20 73 63 61 6e be found by scan
1a30f 6e 69 6e 67 20 74 68 65 20 70 61 67 65 2d 6d 61 ning the page-ma
1a310 70 70 69 6e 67 20 73 65 63 74 69 6f 6e 73 20 6f pping sections o
1a311 66 20 65 61 63 68 20 69 6e 64 65 78 20 62 6c 6f f each index blo
1a312 63 6b 0d 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 ck..** starting
1a313 77 69 74 68 20 74 68 65 20 6c 61 73 74 20 69 6e with the last in
1a314 64 65 78 20 62 6c 6f 63 6b 20 61 6e 64 20 6d 6f dex block and mo
1a315 76 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 ving toward the
1a316 66 69 72 73 74 2c 20 61 6e 64 0d 0a 2a 2a 20 77 first, and..** w
1a317 69 74 68 69 6e 20 65 61 63 68 20 69 6e 64 65 78 ithin each index
1a318 20 62 6c 6f 63 6b 2c 20 73 74 61 72 74 69 6e 67 block, starting
1a319 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e 64 20 at the end and
1a31a 6d 6f 76 69 6e 67 20 74 6f 77 61 72 64 20 74 68 moving toward th
1a31b 65 0d 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 2e e..** beginning.
1a31c 20 20 54 68 65 20 66 69 72 73 74 20 65 6e 74 72 The first entr
1a31d 79 20 74 68 61 74 20 65 71 75 61 6c 73 20 50 20 y that equals P
1a31e 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 corresponds to t
1a31f 68 65 20 66 72 61 6d 65 0d 0a 2a 2a 20 68 6f 6c he frame..** hol
1a320 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 ding the content
1a321 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0d for that page..
1a322 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 68 61 73 68 .**..** The hash
1a323 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 table consists
1a324 6f 66 20 48 41 53 48 54 41 42 4c 45 5f 4e 53 4c of HASHTABLE_NSL
1a325 4f 54 20 31 36 2d 62 69 74 20 75 6e 73 69 67 6e OT 16-bit unsign
1a326 65 64 20 69 6e 74 65 67 65 72 73 2e 0d 0a 2a 2a ed integers...**
1a327 20 48 41 53 48 54 41 42 4c 45 5f 4e 53 4c 4f 54 HASHTABLE_NSLOT
1a328 20 3d 20 32 2a 48 41 53 48 54 41 42 4c 45 5f 4e = 2*HASHTABLE_N
1a329 50 41 47 45 2c 20 61 6e 64 20 74 68 65 72 65 20 PAGE, and there
1a32a 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 is one entry in
1a32b 74 68 65 0d 0a 2a 2a 20 68 61 73 68 20 74 61 62 the..** hash tab
1a32c 6c 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 le for each page
1a32d 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 6d number in the m
1a32e 61 70 70 69 6e 67 20 73 65 63 74 69 6f 6e 2c 20 apping section,
1a32f 73 6f 20 74 68 65 20 68 61 73 68 20 0d 0a 2a 2a so the hash ..**
1a330 20 74 61 62 6c 65 20 69 73 20 6e 65 76 65 72 20 table is never
1a331 6d 6f 72 65 20 74 68 61 6e 20 68 61 6c 66 20 66 more than half f
1a332 75 6c 6c 2e 20 20 54 68 65 20 65 78 70 65 63 74 ull. The expect
1a333 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c ed number of col
1a334 6c 69 73 69 6f 6e 73 20 0d 0a 2a 2a 20 70 72 69 lisions ..** pri
1a335 6f 72 20 74 6f 20 66 69 6e 64 69 6e 67 20 61 20 or to finding a
1a336 6d 61 74 63 68 20 69 73 20 31 2e 20 20 45 61 63 match is 1. Eac
1a337 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 68 h entry of the h
1a338 61 73 68 20 74 61 62 6c 65 20 69 73 20 61 6e 0d ash table is an.
1a339 0a 2a 2a 20 31 2d 62 61 73 65 64 20 69 6e 64 65 .** 1-based inde
1a33a 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 20 69 6e x of an entry in
1a33b 20 74 68 65 20 6d 61 70 70 69 6e 67 20 73 65 63 the mapping sec
1a33c 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 tion of the same
1a33d 0d 0a 2a 2a 20 69 6e 64 65 78 20 62 6c 6f 63 6b ..** index block
1a33e 2e 20 20 20 4c 65 74 20 4b 20 62 65 20 74 68 65 . Let K be the
1a33f 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f 1-based index o
1a340 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e f the largest en
1a341 74 72 79 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 6d try in..** the m
1a342 61 70 70 69 6e 67 20 73 65 63 74 69 6f 6e 2e 20 apping section.
1a343 20 28 46 6f 72 20 69 6e 64 65 78 20 62 6c 6f 63 (For index bloc
1a344 6b 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 ks other than th
1a345 65 20 6c 61 73 74 2c 20 4b 20 77 69 6c 6c 0d 0a e last, K will..
1a346 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 65 78 61 ** always be exa
1a347 63 74 6c 79 20 48 41 53 48 54 41 42 4c 45 5f 4e ctly HASHTABLE_N
1a348 50 41 47 45 20 28 34 30 39 36 29 20 61 6e 64 20 PAGE (4096) and
1a349 66 6f 72 20 74 68 65 20 6c 61 73 74 20 69 6e 64 for the last ind
1a34a 65 78 20 62 6c 6f 63 6b 0d 0a 2a 2a 20 4b 20 77 ex block..** K w
1a34b 69 6c 6c 20 62 65 20 28 6d 78 46 72 61 6d 65 25 ill be (mxFrame%
1a34c 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 29 HASHTABLE_NPAGE)
1a34d 2e 29 20 20 55 6e 75 73 65 64 20 73 6c 6f 74 73 .) Unused slots
1a34e 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 of the hash tab
1a34f 6c 65 0d 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 le..** contain a
1a350 20 76 61 6c 75 65 20 6f 66 20 30 2e 0d 0a 2a 2a value of 0...**
1a351 0d 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 66 6f 72 ..** To look for
1a352 20 70 61 67 65 20 50 20 69 6e 20 74 68 65 20 68 page P in the h
1a353 61 73 68 20 74 61 62 6c 65 2c 20 66 69 72 73 74 ash table, first
1a354 20 63 6f 6d 70 75 74 65 20 61 20 68 61 73 68 20 compute a hash
1a355 69 4b 65 79 20 6f 6e 0d 0a 2a 2a 20 50 20 61 73 iKey on..** P as
1a356 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a follows:..**..*
1a357 2a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 50 * iKey = (P
1a358 20 2a 20 33 38 33 29 20 25 20 48 41 53 48 54 41 * 383) % HASHTA
1a359 42 4c 45 5f 4e 53 4c 4f 54 0d 0a 2a 2a 0d 0a 2a BLE_NSLOT..**..*
1a35a 2a 20 54 68 65 6e 20 73 74 61 72 74 20 73 63 61 * Then start sca
1a35b 6e 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 6f 66 nning entries of
1a35c 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c the hash table,
1a35d 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 starting with i
1a35e 4b 65 79 0d 0a 2a 2a 20 28 77 72 61 70 70 69 6e Key..** (wrappin
1a35f 67 20 61 72 6f 75 6e 64 20 74 6f 20 74 68 65 20 g around to the
1a360 62 65 67 69 6e 6e 69 6e 67 20 77 68 65 6e 20 74 beginning when t
1a361 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 68 61 he end of the ha
1a362 73 68 20 74 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 sh table is..**
1a363 72 65 61 63 68 65 64 29 20 75 6e 74 69 6c 20 61 reached) until a
1a364 6e 20 75 6e 75 73 65 64 20 68 61 73 68 20 73 6c n unused hash sl
1a365 6f 74 20 69 73 20 66 6f 75 6e 64 2e 20 4c 65 74 ot is found. Let
1a366 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 the first unuse
1a367 64 20 73 6c 6f 74 0d 0a 2a 2a 20 62 65 20 61 74 d slot..** be at
1a368 20 69 6e 64 65 78 20 69 55 6e 75 73 65 64 2e 20 index iUnused.
1a369 20 28 69 55 6e 75 73 65 64 20 6d 69 67 68 74 20 (iUnused might
1a36a 62 65 20 6c 65 73 73 20 74 68 61 6e 20 69 4b 65 be less than iKe
1a36b 79 20 69 66 20 74 68 65 72 65 20 77 61 73 0d 0a y if there was..
1a36c 2a 2a 20 77 72 61 70 2d 61 72 6f 75 6e 64 2e 29 ** wrap-around.)
1a36d 20 42 65 63 61 75 73 65 20 74 68 65 20 68 61 73 Because the has
1a36e 68 20 74 61 62 6c 65 20 69 73 20 6e 65 76 65 72 h table is never
1a36f 20 6d 6f 72 65 20 74 68 61 6e 20 68 61 6c 66 20 more than half
1a370 66 75 6c 6c 2c 0d 0a 2a 2a 20 74 68 65 20 73 65 full,..** the se
1a371 61 72 63 68 20 69 73 20 67 75 61 72 61 6e 74 65 arch is guarante
1a372 65 64 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 ed to eventually
1a373 20 68 69 74 20 61 6e 20 75 6e 75 73 65 64 20 65 hit an unused e
1a374 6e 74 72 79 2e 20 20 4c 65 74 20 0d 0a 2a 2a 20 ntry. Let ..**
1a375 69 4d 61 78 20 62 65 20 74 68 65 20 76 61 6c 75 iMax be the valu
1a376 65 20 62 65 74 77 65 65 6e 20 69 4b 65 79 20 61 e between iKey a
1a377 6e 64 20 69 55 6e 75 73 65 64 2c 20 63 6c 6f 73 nd iUnused, clos
1a378 65 73 74 20 74 6f 20 69 55 6e 75 73 65 64 2c 0d est to iUnused,.
1a379 0a 2a 2a 20 77 68 65 72 65 20 61 48 61 73 68 5b .** where aHash[
1a37a 69 4d 61 78 5d 3d 3d 50 2e 20 20 49 66 20 74 68 iMax]==P. If th
1a37b 65 72 65 20 69 73 20 6e 6f 20 69 4d 61 78 20 65 ere is no iMax e
1a37c 6e 74 72 79 20 28 69 66 20 74 68 65 72 65 20 65 ntry (if there e
1a37d 78 69 73 74 73 0d 0a 2a 2a 20 6e 6f 20 68 61 73 xists..** no has
1a37e 68 20 73 6c 6f 74 20 73 75 63 68 20 74 68 61 74 h slot such that
1a37f 20 61 48 61 73 68 5b 69 5d 3d 3d 70 29 20 74 68 aHash[i]==p) th
1a380 65 6e 20 70 61 67 65 20 50 20 69 73 20 6e 6f 74 en page P is not
1a381 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 63 75 72 72 in the..** curr
1a382 65 6e 74 20 69 6e 64 65 78 20 62 6c 6f 63 6b 2e ent index block.
1a383 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 Otherwise the
1a384 69 4d 61 78 2d 74 68 20 6d 61 70 70 69 6e 67 20 iMax-th mapping
1a385 65 6e 74 72 79 20 6f 66 20 74 68 65 0d 0a 2a 2a entry of the..**
1a386 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 20 62 current index b
1a387 6c 6f 63 6b 20 63 6f 72 72 65 73 70 6f 6e 64 73 lock corresponds
1a388 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 to the last ent
1a389 72 79 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 ry that referenc
1a38a 65 73 20 0d 0a 2a 2a 20 70 61 67 65 20 50 2e 0d es ..** page P..
1a38b 0a 2a 2a 0d 0a 2a 2a 20 41 20 68 61 73 68 20 73 .**..** A hash s
1a38c 65 61 72 63 68 20 62 65 67 69 6e 73 20 77 69 74 earch begins wit
1a38d 68 20 74 68 65 20 6c 61 73 74 20 69 6e 64 65 78 h the last index
1a38e 20 62 6c 6f 63 6b 20 61 6e 64 20 6d 6f 76 65 73 block and moves
1a38f 20 74 6f 77 61 72 64 20 74 68 65 0d 0a 2a 2a 20 toward the..**
1a390 66 69 72 73 74 20 69 6e 64 65 78 20 62 6c 6f 63 first index bloc
1a391 6b 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 65 k, looking for e
1a392 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e ntries correspon
1a393 64 69 6e 67 20 74 6f 20 70 61 67 65 20 50 2e 20 ding to page P.
1a394 20 4f 6e 0d 0a 2a 2a 20 61 76 65 72 61 67 65 2c On..** average,
1a395 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 74 68 72 only two or thr
1a396 65 65 20 73 6c 6f 74 73 20 69 6e 20 65 61 63 68 ee slots in each
1a397 20 69 6e 64 65 78 20 62 6c 6f 63 6b 20 6e 65 65 index block nee
1a398 64 20 74 6f 20 62 65 0d 0a 2a 2a 20 65 78 61 6d d to be..** exam
1a399 69 6e 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f ined in order to
1a39a 20 65 69 74 68 65 72 20 66 69 6e 64 20 74 68 65 either find the
1a39b 20 6c 61 73 74 20 65 6e 74 72 79 20 66 6f 72 20 last entry for
1a39c 70 61 67 65 20 50 2c 20 6f 72 20 74 6f 0d 0a 2a page P, or to..*
1a39d 2a 20 65 73 74 61 62 6c 69 73 68 20 74 68 61 74 * establish that
1a39e 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79 20 65 no such entry e
1a39f 78 69 73 74 73 20 69 6e 20 74 68 65 20 62 6c 6f xists in the blo
1a3a0 63 6b 2e 20 20 45 61 63 68 20 69 6e 64 65 78 20 ck. Each index
1a3a1 62 6c 6f 63 6b 0d 0a 2a 2a 20 68 6f 6c 64 73 20 block..** holds
1a3a2 6f 76 65 72 20 34 30 30 30 20 65 6e 74 72 69 65 over 4000 entrie
1a3a3 73 2e 20 20 53 6f 20 74 77 6f 20 6f 72 20 74 68 s. So two or th
1a3a4 72 65 65 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 ree index blocks
1a3a5 20 61 72 65 20 73 75 66 66 69 63 69 65 6e 74 0d are sufficient.
1a3a6 0a 2a 2a 20 74 6f 20 63 6f 76 65 72 20 61 20 74 .** to cover a t
1a3a7 79 70 69 63 61 6c 20 31 30 20 6d 65 67 61 62 79 ypical 10 megaby
1a3a8 74 65 20 57 41 4c 20 66 69 6c 65 2c 20 61 73 73 te WAL file, ass
1a3a9 75 6d 69 6e 67 20 31 4b 20 70 61 67 65 73 2e 20 uming 1K pages.
1a3aa 20 38 20 6f 72 20 31 30 0d 0a 2a 2a 20 63 6f 6d 8 or 10..** com
1a3ab 70 61 72 69 73 6f 6e 73 20 28 6f 6e 20 61 76 65 parisons (on ave
1a3ac 72 61 67 65 29 20 73 75 66 66 69 63 65 20 74 6f rage) suffice to
1a3ad 20 65 69 74 68 65 72 20 6c 6f 63 61 74 65 20 61 either locate a
1a3ae 20 66 72 61 6d 65 20 69 6e 20 74 68 65 0d 0a 2a frame in the..*
1a3af 2a 20 57 41 4c 20 6f 72 20 74 6f 20 65 73 74 61 * WAL or to esta
1a3b0 62 6c 69 73 68 20 74 68 61 74 20 74 68 65 20 66 blish that the f
1a3b1 72 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 rame does not ex
1a3b2 69 73 74 20 69 6e 20 74 68 65 20 57 41 4c 2e 20 ist in the WAL.
1a3b3 20 54 68 69 73 0d 0a 2a 2a 20 69 73 20 6d 75 63 This..** is muc
1a3b4 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 63 h faster than sc
1a3b5 61 6e 6e 69 6e 67 20 74 68 65 20 65 6e 74 69 72 anning the entir
1a3b6 65 20 31 30 4d 42 20 57 41 4c 2e 0d 0a 2a 2a 0d e 10MB WAL...**.
1a3b7 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 6e .** Note that en
1a3b8 74 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20 tries are added
1a3b9 69 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 in order of incr
1a3ba 65 61 73 69 6e 67 20 4b 2e 20 20 48 65 6e 63 65 easing K. Hence
1a3bb 2c 20 6f 6e 65 0d 0a 2a 2a 20 72 65 61 64 65 72 , one..** reader
1a3bc 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 might be using
1a3bd 73 6f 6d 65 20 76 61 6c 75 65 20 4b 30 20 61 6e some value K0 an
1a3be 64 20 61 20 73 65 63 6f 6e 64 20 72 65 61 64 65 d a second reade
1a3bf 72 20 74 68 61 74 20 73 74 61 72 74 65 64 0d 0a r that started..
1a3c0 2a 2a 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 ** at a later ti
1a3c1 6d 65 20 28 61 66 74 65 72 20 61 64 64 69 74 69 me (after additi
1a3c2 6f 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e onal transaction
1a3c3 73 20 77 65 72 65 20 61 64 64 65 64 20 74 6f 20 s were added to
1a3c4 74 68 65 20 57 41 4c 0d 0a 2a 2a 20 61 6e 64 20 the WAL..** and
1a3c5 74 6f 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 to the wal-index
1a3c6 29 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 ) might be using
1a3c7 20 61 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c a different val
1a3c8 75 65 20 4b 31 2c 20 77 68 65 72 65 20 4b 31 3e ue K1, where K1>
1a3c9 4b 30 2e 0d 0a 2a 2a 20 42 6f 74 68 20 72 65 61 K0...** Both rea
1a3ca 64 65 72 73 20 63 61 6e 20 75 73 65 20 74 68 65 ders can use the
1a3cb 20 73 61 6d 65 20 68 61 73 68 20 74 61 62 6c 65 same hash table
1a3cc 20 61 6e 64 20 6d 61 70 70 69 6e 67 20 73 65 63 and mapping sec
1a3cd 74 69 6f 6e 20 74 6f 20 67 65 74 0d 0a 2a 2a 20 tion to get..**
1a3ce 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 the correct resu
1a3cf 6c 74 2e 20 20 54 68 65 72 65 20 6d 61 79 20 62 lt. There may b
1a3d0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 e entries in the
1a3d1 20 68 61 73 68 20 74 61 62 6c 65 20 77 69 74 68 hash table with
1a3d2 0d 0a 2a 2a 20 4b 3e 4b 30 20 62 75 74 20 74 6f ..** K>K0 but to
1a3d3 20 74 68 65 20 66 69 72 73 74 20 72 65 61 64 65 the first reade
1a3d4 72 2c 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 r, those entries
1a3d5 20 77 69 6c 6c 20 61 70 70 65 61 72 20 74 6f 20 will appear to
1a3d6 62 65 20 75 6e 75 73 65 64 0d 0a 2a 2a 20 73 6c be unused..** sl
1a3d7 6f 74 73 20 69 6e 20 74 68 65 20 68 61 73 68 20 ots in the hash
1a3d8 74 61 62 6c 65 20 61 6e 64 20 73 6f 20 74 68 65 table and so the
1a3d9 20 66 69 72 73 74 20 72 65 61 64 65 72 20 77 69 first reader wi
1a3da 6c 6c 20 67 65 74 20 61 6e 20 61 6e 73 77 65 72 ll get an answer
1a3db 20 61 73 0d 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 as..** if no va
1a3dc 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 lues greater tha
1a3dd 6e 20 4b 30 20 68 61 64 20 65 76 65 72 20 62 65 n K0 had ever be
1a3de 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f en inserted into
1a3df 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0d the hash table.
1a3e0 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 72 73 74 .** in the first
1a3e1 20 70 6c 61 63 65 20 2d 20 77 68 69 63 68 20 69 place - which i
1a3e2 73 20 77 68 61 74 20 72 65 61 64 65 72 20 6f 6e s what reader on
1a3e3 65 20 77 61 6e 74 73 2e 20 20 4d 65 61 6e 77 68 e wants. Meanwh
1a3e4 69 6c 65 2c 20 74 68 65 0d 0a 2a 2a 20 73 65 63 ile, the..** sec
1a3e5 6f 6e 64 20 72 65 61 64 65 72 20 75 73 69 6e 67 ond reader using
1a3e6 20 4b 31 20 77 69 6c 6c 20 73 65 65 20 61 64 64 K1 will see add
1a3e7 69 74 69 6f 6e 61 6c 20 76 61 6c 75 65 73 20 74 itional values t
1a3e8 68 61 74 20 77 65 72 65 20 69 6e 73 65 72 74 65 hat were inserte
1a3e9 64 0d 0a 2a 2a 20 6c 61 74 65 72 2c 20 77 68 69 d..** later, whi
1a3ea 63 68 20 69 73 20 65 78 61 63 74 6c 79 20 77 68 ch is exactly wh
1a3eb 61 74 20 72 65 61 64 65 72 20 74 77 6f 20 77 61 at reader two wa
1a3ec 6e 74 73 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 57 nts. ..**..** W
1a3ed 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f hen a rollback o
1a3ee 63 63 75 72 73 2c 20 74 68 65 20 76 61 6c 75 65 ccurs, the value
1a3ef 20 6f 66 20 4b 20 69 73 20 64 65 63 72 65 61 73 of K is decreas
1a3f0 65 64 2e 20 48 61 73 68 20 74 61 62 6c 65 20 65 ed. Hash table e
1a3f1 6e 74 72 69 65 73 0d 0a 2a 2a 20 74 68 61 74 20 ntries..** that
1a3f2 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 72 correspond to fr
1a3f3 61 6d 65 73 20 67 72 65 61 74 65 72 20 74 68 61 ames greater tha
1a3f4 6e 20 74 68 65 20 6e 65 77 20 4b 20 76 61 6c 75 n the new K valu
1a3f5 65 20 61 72 65 20 72 65 6d 6f 76 65 64 0d 0a 2a e are removed..*
1a3f6 2a 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 * from the hash
1a3f7 74 61 62 6c 65 20 61 74 20 74 68 69 73 20 70 6f table at this po
1a3f8 69 6e 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 int...*/..#ifnde
1a3f9 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 f SQLITE_OMIT_WA
1a3fa 4c 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 L....../*..** Tr
1a3fb 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63 72 6f ace output macro
1a3fc 73 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69 6e s..*/..#if defin
1a3fd 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 ed(SQLITE_TEST)
1a3fe 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
1a3ff 45 5f 44 45 42 55 47 29 0d 0a 53 51 4c 49 54 45 E_DEBUG)..SQLITE
1a400 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
1a401 69 74 65 33 57 61 6c 54 72 61 63 65 20 3d 20 30 ite3WalTrace = 0
1a402 3b 0d 0a 23 20 64 65 66 69 6e 65 20 57 41 4c 54 ;..# define WALT
1a403 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c 69 RACE(X) if(sqli
1a404 74 65 33 57 61 6c 54 72 61 63 65 29 20 73 71 6c te3WalTrace) sql
1a405 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 ite3DebugPrintf
1a406 58 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 X..#else..# defi
1a407 6e 65 20 57 41 4c 54 52 41 43 45 28 58 29 0d 0a ne WALTRACE(X)..
1a408 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
1a409 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 28 61 6e The maximum (an
1a40a 64 20 6f 6e 6c 79 29 20 76 65 72 73 69 6f 6e 73 d only) versions
1a40b 20 6f 66 20 74 68 65 20 77 61 6c 20 61 6e 64 20 of the wal and
1a40c 77 61 6c 2d 69 6e 64 65 78 20 66 6f 72 6d 61 74 wal-index format
1a40d 73 0d 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 s..** that may b
1a40e 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 62 79 e interpreted by
1a40f 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 this version of
1a410 20 53 51 4c 69 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a SQLite...**..**
1a411 20 49 66 20 61 20 63 6c 69 65 6e 74 20 62 65 67 If a client beg
1a412 69 6e 73 20 72 65 63 6f 76 65 72 69 6e 67 20 61 ins recovering a
1a413 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 66 69 WAL file and fi
1a414 6e 64 73 20 74 68 61 74 20 28 61 29 20 74 68 65 nds that (a) the
1a415 20 63 68 65 63 6b 73 75 6d 0d 0a 2a 2a 20 76 61 checksum..** va
1a416 6c 75 65 73 20 69 6e 20 74 68 65 20 77 61 6c 2d lues in the wal-
1a417 68 65 61 64 65 72 20 61 72 65 20 63 6f 72 72 65 header are corre
1a418 63 74 20 61 6e 64 20 28 62 29 20 74 68 65 20 76 ct and (b) the v
1a419 65 72 73 69 6f 6e 20 66 69 65 6c 64 20 69 73 20 ersion field is
1a41a 6e 6f 74 0d 0a 2a 2a 20 57 41 4c 5f 4d 41 58 5f not..** WAL_MAX_
1a41b 56 45 52 53 49 4f 4e 2c 20 72 65 63 6f 76 65 72 VERSION, recover
1a41c 79 20 66 61 69 6c 73 20 61 6e 64 20 53 51 4c 69 y fails and SQLi
1a41d 74 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 te returns SQLIT
1a41e 45 5f 43 41 4e 54 4f 50 45 4e 2e 0d 0a 2a 2a 0d E_CANTOPEN...**.
1a41f 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 .** Similarly, i
1a420 66 20 61 20 63 6c 69 65 6e 74 20 73 75 63 63 65 f a client succe
1a421 73 73 66 75 6c 6c 79 20 72 65 61 64 73 20 61 20 ssfully reads a
1a422 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 wal-index header
1a423 20 28 69 2e 65 2e 20 74 68 65 20 0d 0a 2a 2a 20 (i.e. the ..**
1a424 63 68 65 63 6b 73 75 6d 20 74 65 73 74 20 69 73 checksum test is
1a425 20 73 75 63 63 65 73 73 66 75 6c 29 20 61 6e 64 successful) and
1a426 20 66 69 6e 64 73 20 74 68 61 74 20 74 68 65 20 finds that the
1a427 76 65 72 73 69 6f 6e 20 66 69 65 6c 64 20 69 73 version field is
1a428 20 6e 6f 74 0d 0a 2a 2a 20 57 41 4c 49 4e 44 45 not..** WALINDE
1a429 58 5f 4d 41 58 5f 56 45 52 53 49 4f 4e 2c 20 74 X_MAX_VERSION, t
1a42a 68 65 6e 20 6e 6f 20 72 65 61 64 2d 74 72 61 6e hen no read-tran
1a42b 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 saction is opene
1a42c 64 20 61 6e 64 20 53 51 4c 69 74 65 0d 0a 2a 2a d and SQLite..**
1a42d 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f returns SQLITE_
1a42e 43 41 4e 54 4f 50 45 4e 2e 0d 0a 2a 2f 0d 0a 23 CANTOPEN...*/..#
1a42f 64 65 66 69 6e 65 20 57 41 4c 5f 4d 41 58 5f 56 define WAL_MAX_V
1a430 45 52 53 49 4f 4e 20 20 20 20 20 20 33 30 30 37 ERSION 3007
1a431 30 30 30 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 000..#define WAL
1a432 49 4e 44 45 58 5f 4d 41 58 5f 56 45 52 53 49 4f INDEX_MAX_VERSIO
1a433 4e 20 33 30 30 37 30 30 30 0d 0a 0d 0a 2f 2a 0d N 3007000..../*.
1a434 0a 2a 2a 20 49 6e 64 69 63 65 73 20 6f 66 20 76 .** Indices of v
1a435 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 62 arious locking b
1a436 79 74 65 73 2e 20 20 20 57 41 4c 5f 4e 52 45 41 ytes. WAL_NREA
1a437 44 45 52 20 69 73 20 74 68 65 20 6e 75 6d 62 65 DER is the numbe
1a438 72 0d 0a 2a 2a 20 6f 66 20 61 76 61 69 6c 61 62 r..** of availab
1a439 6c 65 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 le reader locks
1a43a 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 61 74 and should be at
1a43b 20 6c 65 61 73 74 20 33 2e 0d 0a 2a 2f 0d 0a 23 least 3...*/..#
1a43c 64 65 66 69 6e 65 20 57 41 4c 5f 57 52 49 54 45 define WAL_WRITE
1a43d 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 30 0d _LOCK 0.
1a43e 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 41 4c 4c .#define WAL_ALL
1a43f 5f 42 55 54 5f 57 52 49 54 45 20 20 20 20 20 20 _BUT_WRITE
1a440 31 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 43 1..#define WAL_C
1a441 4b 50 54 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 KPT_LOCK
1a442 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 1..#define WAL
1a443 5f 52 45 43 4f 56 45 52 5f 4c 4f 43 4b 20 20 20 _RECOVER_LOCK
1a444 20 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 57 2..#define W
1a445 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 49 29 20 AL_READ_LOCK(I)
1a446 20 20 20 20 20 20 28 33 2b 28 49 29 29 0d 0a 23 (3+(I))..#
1a447 64 65 66 69 6e 65 20 57 41 4c 5f 4e 52 45 41 44 define WAL_NREAD
1a448 45 52 20 20 20 20 20 20 20 20 20 20 20 20 28 53 ER (S
1a449 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d QLITE_SHM_NLOCK-
1a44a 33 29 0d 0a 0d 0a 0d 0a 2f 2a 20 4f 62 6a 65 63 3)....../* Objec
1a44b 74 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a t declarations *
1a44c 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
1a44d 74 20 57 61 6c 49 6e 64 65 78 48 64 72 20 57 61 t WalIndexHdr Wa
1a44e 6c 49 6e 64 65 78 48 64 72 3b 0d 0a 74 79 70 65 lIndexHdr;..type
1a44f 64 65 66 20 73 74 72 75 63 74 20 57 61 6c 49 74 def struct WalIt
1a450 65 72 61 74 6f 72 20 57 61 6c 49 74 65 72 61 74 erator WalIterat
1a451 6f 72 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 or;..typedef str
1a452 75 63 74 20 57 61 6c 43 6b 70 74 49 6e 66 6f 20 uct WalCkptInfo
1a453 57 61 6c 43 6b 70 74 49 6e 66 6f 3b 0d 0a 0d 0a WalCkptInfo;....
1a454 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c ../*..** The fol
1a455 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 68 6f lowing object ho
1a456 6c 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 lds a copy of th
1a457 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 e wal-index head
1a458 65 72 20 63 6f 6e 74 65 6e 74 2e 0d 0a 2a 2a 0d er content...**.
1a459 0a 2a 2a 20 54 68 65 20 61 63 74 75 61 6c 20 68 .** The actual h
1a45a 65 61 64 65 72 20 69 6e 20 74 68 65 20 77 61 6c eader in the wal
1a45b 2d 69 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 -index consists
1a45c 6f 66 20 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 of two copies of
1a45d 20 74 68 69 73 0d 0a 2a 2a 20 6f 62 6a 65 63 74 this..** object
1a45e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 73 7a ...**..** The sz
1a45f 50 61 67 65 20 76 61 6c 75 65 20 63 61 6e 20 62 Page value can b
1a460 65 20 61 6e 79 20 70 6f 77 65 72 20 6f 66 20 32 e any power of 2
1a461 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 between 512 and
1a462 20 33 32 37 36 38 2c 20 69 6e 63 6c 75 73 69 76 32768, inclusiv
1a463 65 2e 0d 0a 2a 2a 20 4f 72 20 69 74 20 63 61 6e e...** Or it can
1a464 20 62 65 20 31 20 74 6f 20 72 65 70 72 65 73 65 be 1 to represe
1a465 6e 74 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 nt a 65536-byte
1a466 70 61 67 65 2e 20 20 54 68 65 20 6c 61 74 74 65 page. The latte
1a467 72 20 63 61 73 65 20 77 61 73 0d 0a 2a 2a 20 61 r case was..** a
1a468 64 64 65 64 20 69 6e 20 33 2e 37 2e 31 20 77 68 dded in 3.7.1 wh
1a469 65 6e 20 73 75 70 70 6f 72 74 20 66 6f 72 20 36 en support for 6
1a46a 34 4b 20 70 61 67 65 73 20 77 61 73 20 61 64 64 4K pages was add
1a46b 65 64 2e 20 20 0d 0a 2a 2f 0d 0a 73 74 72 75 63 ed. ..*/..struc
1a46c 74 20 57 61 6c 49 6e 64 65 78 48 64 72 20 7b 0d t WalIndexHdr {.
1a46d 0a 20 20 75 33 32 20 69 56 65 72 73 69 6f 6e 3b . u32 iVersion;
1a46e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a46f 20 20 20 2f 2a 20 57 61 6c 2d 69 6e 64 65 78 20 /* Wal-index
1a470 76 65 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 75 33 version */.. u3
1a471 32 20 75 6e 75 73 65 64 3b 20 20 20 20 20 20 20 2 unused;
1a472 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a473 20 55 6e 75 73 65 64 20 28 70 61 64 64 69 6e 67 Unused (padding
1a474 29 20 66 69 65 6c 64 20 2a 2f 0d 0a 20 20 75 33 ) field */.. u3
1a475 32 20 69 43 68 61 6e 67 65 3b 20 20 20 20 20 20 2 iChange;
1a476 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a477 20 43 6f 75 6e 74 65 72 20 69 6e 63 72 65 6d 65 Counter increme
1a478 6e 74 65 64 20 65 61 63 68 20 74 72 61 6e 73 61 nted each transa
1a479 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 75 38 20 69 ction */.. u8 i
1a47a 73 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 sInit;
1a47b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 /* 1
1a47c 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 when initialize
1a47d 64 20 2a 2f 0d 0a 20 20 75 38 20 62 69 67 45 6e d */.. u8 bigEn
1a47e 64 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 dCksum;
1a47f 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
1a480 69 66 20 63 68 65 63 6b 73 75 6d 73 20 69 6e 20 if checksums in
1a481 57 41 4c 20 61 72 65 20 62 69 67 2d 65 6e 64 69 WAL are big-endi
1a482 61 6e 20 2a 2f 0d 0a 20 20 75 31 36 20 73 7a 50 an */.. u16 szP
1a483 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 age;
1a484 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 /* Data
1a485 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 base page size i
1a486 6e 20 62 79 74 65 73 2e 20 31 3d 3d 36 34 4b 20 n bytes. 1==64K
1a487 2a 2f 0d 0a 20 20 75 33 32 20 6d 78 46 72 61 6d */.. u32 mxFram
1a488 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1a489 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f /* Index o
1a48a 66 20 6c 61 73 74 20 76 61 6c 69 64 20 66 72 61 f last valid fra
1a48b 6d 65 20 69 6e 20 74 68 65 20 57 41 4c 20 2a 2f me in the WAL */
1a48c 0d 0a 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 .. u32 nPage;
1a48d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a48e 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 /* Size of d
1a48f 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 atabase in pages
1a490 20 2a 2f 0d 0a 20 20 75 33 32 20 61 46 72 61 6d */.. u32 aFram
1a491 65 43 6b 73 75 6d 5b 32 5d 3b 20 20 20 20 20 20 eCksum[2];
1a492 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 /* Checks
1a493 75 6d 20 6f 66 20 6c 61 73 74 20 66 72 61 6d 65 um of last frame
1a494 20 69 6e 20 6c 6f 67 20 2a 2f 0d 0a 20 20 75 33 in log */.. u3
1a495 32 20 61 53 61 6c 74 5b 32 5d 3b 20 20 20 20 20 2 aSalt[2];
1a496 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a497 20 54 77 6f 20 73 61 6c 74 20 76 61 6c 75 65 73 Two salt values
1a498 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 57 41 4c copied from WAL
1a499 20 68 65 61 64 65 72 20 2a 2f 0d 0a 20 20 75 33 header */.. u3
1a49a 32 20 61 43 6b 73 75 6d 5b 32 5d 3b 20 20 20 20 2 aCksum[2];
1a49b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a49c 20 43 68 65 63 6b 73 75 6d 20 6f 76 65 72 20 61 Checksum over a
1a49d 6c 6c 20 70 72 69 6f 72 20 66 69 65 6c 64 73 20 ll prior fields
1a49e 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
1a49f 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 A copy of the f
1a4a0 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 ollowing object
1a4a1 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 77 61 occurs in the wa
1a4a2 6c 2d 69 6e 64 65 78 20 69 6d 6d 65 64 69 61 74 l-index immediat
1a4a3 65 6c 79 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e ely..** followin
1a4a4 67 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 70 g the second cop
1a4a5 79 20 6f 66 20 74 68 65 20 57 61 6c 49 6e 64 65 y of the WalInde
1a4a6 78 48 64 72 2e 20 20 54 68 69 73 20 6f 62 6a 65 xHdr. This obje
1a4a7 63 74 20 73 74 6f 72 65 73 0d 0a 2a 2a 20 69 6e ct stores..** in
1a4a8 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 formation used b
1a4a9 79 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0d 0a 2a y checkpoint...*
1a4aa 2a 0d 0a 2a 2a 20 6e 42 61 63 6b 66 69 6c 6c 20 *..** nBackfill
1a4ab 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
1a4ac 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 57 frames in the W
1a4ad 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65 AL that have bee
1a4ae 6e 20 77 72 69 74 74 65 6e 0d 0a 2a 2a 20 62 61 n written..** ba
1a4af 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 ck into the data
1a4b0 62 61 73 65 2e 20 28 57 65 20 63 61 6c 6c 20 74 base. (We call t
1a4b1 68 65 20 61 63 74 20 6f 66 20 6d 6f 76 69 6e 67 he act of moving
1a4b2 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 57 41 content from WA
1a4b3 4c 20 74 6f 0d 0a 2a 2a 20 64 61 74 61 62 61 73 L to..** databas
1a4b4 65 20 22 62 61 63 6b 66 69 6c 6c 69 6e 67 22 2e e "backfilling".
1a4b5 29 20 20 54 68 65 20 6e 42 61 63 6b 66 69 6c 6c ) The nBackfill
1a4b6 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76 65 72 number is never
1a4b7 20 67 72 65 61 74 65 72 20 74 68 61 6e 0d 0a 2a greater than..*
1a4b8 2a 20 57 61 6c 49 6e 64 65 78 48 64 72 2e 6d 78 * WalIndexHdr.mx
1a4b9 46 72 61 6d 65 2e 20 20 6e 42 61 63 6b 66 69 6c Frame. nBackfil
1a4ba 6c 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 69 6e l can only be in
1a4bb 63 72 65 61 73 65 64 20 62 79 20 74 68 72 65 61 creased by threa
1a4bc 64 73 0d 0a 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 ds..** holding t
1a4bd 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b he WAL_CKPT_LOCK
1a4be 20 6c 6f 63 6b 20 28 77 68 69 63 68 20 69 6e 63 lock (which inc
1a4bf 6c 75 64 65 73 20 61 20 72 65 63 6f 76 65 72 79 ludes a recovery
1a4c0 20 74 68 72 65 61 64 29 2e 0d 0a 2a 2a 20 48 6f thread)...** Ho
1a4c1 77 65 76 65 72 2c 20 61 20 57 41 4c 5f 57 52 49 wever, a WAL_WRI
1a4c2 54 45 5f 4c 4f 43 4b 20 74 68 72 65 61 64 20 63 TE_LOCK thread c
1a4c3 61 6e 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 an move the valu
1a4c4 65 20 6f 66 20 6e 42 61 63 6b 66 69 6c 6c 20 66 e of nBackfill f
1a4c5 72 6f 6d 0d 0a 2a 2a 20 6d 78 46 72 61 6d 65 20 rom..** mxFrame
1a4c6 62 61 63 6b 20 74 6f 20 7a 65 72 6f 20 77 68 65 back to zero whe
1a4c7 6e 20 74 68 65 20 57 41 4c 20 69 73 20 72 65 73 n the WAL is res
1a4c8 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 et...**..** Ther
1a4c9 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 e is one entry i
1a4ca 6e 20 61 52 65 61 64 4d 61 72 6b 5b 5d 20 66 6f n aReadMark[] fo
1a4cb 72 20 65 61 63 68 20 72 65 61 64 65 72 20 6c 6f r each reader lo
1a4cc 63 6b 2e 20 20 49 66 20 61 20 72 65 61 64 65 72 ck. If a reader
1a4cd 0d 0a 2a 2a 20 68 6f 6c 64 73 20 72 65 61 64 2d ..** holds read-
1a4ce 6c 6f 63 6b 20 4b 2c 20 74 68 65 6e 20 74 68 65 lock K, then the
1a4cf 20 76 61 6c 75 65 20 69 6e 20 61 52 65 61 64 4d value in aReadM
1a4d0 61 72 6b 5b 4b 5d 20 69 73 20 6e 6f 20 67 72 65 ark[K] is no gre
1a4d1 61 74 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 74 68 ater than..** th
1a4d2 65 20 6d 78 46 72 61 6d 65 20 66 6f 72 20 74 68 e mxFrame for th
1a4d3 61 74 20 72 65 61 64 65 72 2e 20 20 54 68 65 20 at reader. The
1a4d4 76 61 6c 75 65 20 52 45 41 44 4d 41 52 4b 5f 4e value READMARK_N
1a4d5 4f 54 5f 55 53 45 44 20 28 30 78 66 66 66 66 66 OT_USED (0xfffff
1a4d6 66 66 66 29 0d 0a 2a 2a 20 66 6f 72 20 61 6e 79 fff)..** for any
1a4d7 20 61 52 65 61 64 4d 61 72 6b 5b 5d 20 6d 65 61 aReadMark[] mea
1a4d8 6e 73 20 74 68 61 74 20 65 6e 74 72 79 20 69 73 ns that entry is
1a4d9 20 75 6e 75 73 65 64 2e 20 20 61 52 65 61 64 4d unused. aReadM
1a4da 61 72 6b 5b 30 5d 20 69 73 20 0d 0a 2a 2a 20 61 ark[0] is ..** a
1a4db 20 73 70 65 63 69 61 6c 20 63 61 73 65 3b 20 69 special case; i
1a4dc 74 73 20 76 61 6c 75 65 20 69 73 20 6e 65 76 65 ts value is neve
1a4dd 72 20 75 73 65 64 20 61 6e 64 20 69 74 20 65 78 r used and it ex
1a4de 69 73 74 73 20 61 73 20 61 20 70 6c 61 63 65 2d ists as a place-
1a4df 68 6f 6c 64 65 72 0d 0a 2a 2a 20 74 6f 20 61 76 holder..** to av
1a4e0 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6f 66 oid having to of
1a4e1 66 73 65 74 20 61 52 65 61 64 4d 61 72 6b 5b 5d fset aReadMark[]
1a4e2 20 69 6e 64 65 78 73 20 62 79 20 6f 6e 65 2e 20 indexs by one.
1a4e3 20 52 65 61 64 65 72 73 20 68 6f 6c 64 69 6e 67 Readers holding
1a4e4 0d 0a 2a 2a 20 57 41 4c 5f 52 45 41 44 5f 4c 4f ..** WAL_READ_LO
1a4e5 43 4b 28 30 29 20 61 6c 77 61 79 73 20 69 67 6e CK(0) always ign
1a4e6 6f 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 57 ore the entire W
1a4e7 41 4c 20 61 6e 64 20 72 65 61 64 20 61 6c 6c 20 AL and read all
1a4e8 63 6f 6e 74 65 6e 74 0d 0a 2a 2a 20 64 69 72 65 content..** dire
1a4e9 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 ctly from the da
1a4ea 74 61 62 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 tabase...**..**
1a4eb 54 68 65 20 76 61 6c 75 65 20 6f 66 20 61 52 65 The value of aRe
1a4ec 61 64 4d 61 72 6b 5b 4b 5d 20 6d 61 79 20 6f 6e adMark[K] may on
1a4ed 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 62 79 ly be changed by
1a4ee 20 61 20 74 68 72 65 61 64 20 74 68 61 74 0d 0a a thread that..
1a4ef 2a 2a 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e ** is holding an
1a4f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 exclusive lock
1a4f1 6f 6e 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b on WAL_READ_LOCK
1a4f2 28 4b 29 2e 20 20 54 68 75 73 2c 20 74 68 65 20 (K). Thus, the
1a4f3 76 61 6c 75 65 20 6f 66 0d 0a 2a 2a 20 61 52 65 value of..** aRe
1a4f4 61 64 4d 61 72 6b 5b 4b 5d 20 63 61 6e 6e 6f 74 adMark[K] cannot
1a4f5 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 74 changed while t
1a4f6 68 65 72 65 20 69 73 20 61 20 72 65 61 64 65 72 here is a reader
1a4f7 20 69 73 20 75 73 69 6e 67 20 74 68 61 74 20 6d is using that m
1a4f8 61 72 6b 0d 0a 2a 2a 20 73 69 6e 63 65 20 74 68 ark..** since th
1a4f9 65 20 72 65 61 64 65 72 20 77 69 6c 6c 20 62 65 e reader will be
1a4fa 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 holding a share
1a4fb 64 20 6c 6f 63 6b 20 6f 6e 20 57 41 4c 5f 52 45 d lock on WAL_RE
1a4fc 41 44 5f 4c 4f 43 4b 28 4b 29 2e 0d 0a 2a 2a 0d AD_LOCK(K)...**.
1a4fd 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 70 6f 69 .** The checkpoi
1a4fe 6e 74 65 72 20 6d 61 79 20 6f 6e 6c 79 20 74 72 nter may only tr
1a4ff 61 6e 73 66 65 72 20 66 72 61 6d 65 73 20 66 72 ansfer frames fr
1a500 6f 6d 20 57 41 4c 20 74 6f 20 64 61 74 61 62 61 om WAL to databa
1a501 73 65 20 77 68 65 72 65 0d 0a 2a 2a 20 74 68 65 se where..** the
1a502 20 66 72 61 6d 65 20 6e 75 6d 62 65 72 73 20 61 frame numbers a
1a503 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 re less than or
1a504 65 71 75 61 6c 20 74 6f 20 65 76 65 72 79 20 61 equal to every a
1a505 52 65 61 64 4d 61 72 6b 5b 5d 20 74 68 61 74 20 ReadMark[] that
1a506 69 73 0d 0a 2a 2a 20 69 6e 20 75 73 65 20 28 74 is..** in use (t
1a507 68 61 74 20 69 73 2c 20 65 76 65 72 79 20 61 52 hat is, every aR
1a508 65 61 64 4d 61 72 6b 5b 6a 5d 20 66 6f 72 20 77 eadMark[j] for w
1a509 68 69 63 68 20 74 68 65 72 65 20 69 73 20 61 20 hich there is a
1a50a 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0d 0a 2a corresponding..*
1a50b 2a 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 * WAL_READ_LOCK(
1a50c 6a 29 29 2e 20 20 4e 65 77 20 72 65 61 64 65 72 j)). New reader
1a50d 73 20 28 75 73 75 61 6c 6c 79 29 20 70 69 63 6b s (usually) pick
1a50e 20 74 68 65 20 61 52 65 61 64 4d 61 72 6b 5b 5d the aReadMark[]
1a50f 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 6c 61 with the..** la
1a510 72 67 65 73 74 20 76 61 6c 75 65 20 61 6e 64 20 rgest value and
1a511 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 6e will increase an
1a512 20 75 6e 75 73 65 64 20 61 52 65 61 64 4d 61 72 unused aReadMar
1a513 6b 5b 5d 20 74 6f 20 6d 78 46 72 61 6d 65 20 69 k[] to mxFrame i
1a514 66 20 74 68 65 72 65 0d 0a 2a 2a 20 69 73 20 6e f there..** is n
1a515 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 20 61 52 ot already an aR
1a516 65 61 64 4d 61 72 6b 5b 5d 20 65 71 75 61 6c 20 eadMark[] equal
1a517 74 6f 20 6d 78 46 72 61 6d 65 2e 20 20 54 68 65 to mxFrame. The
1a518 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 exception to th
1a519 65 0d 0a 2a 2a 20 70 72 65 76 69 6f 75 73 20 73 e..** previous s
1a51a 65 6e 74 65 6e 63 65 20 69 73 20 77 68 65 6e 20 entence is when
1a51b 6e 42 61 63 6b 66 69 6c 6c 20 65 71 75 61 6c 73 nBackfill equals
1a51c 20 6d 78 46 72 61 6d 65 20 28 6d 65 61 6e 69 6e mxFrame (meanin
1a51d 67 20 74 68 61 74 20 65 76 65 72 79 74 68 69 6e g that everythin
1a51e 67 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c g..** in the WAL
1a51f 20 68 61 73 20 62 65 65 6e 20 62 61 63 6b 66 69 has been backfi
1a520 6c 6c 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 lled into the da
1a521 74 61 62 61 73 65 29 20 74 68 65 6e 20 6e 65 77 tabase) then new
1a522 20 72 65 61 64 65 72 73 0d 0a 2a 2a 20 77 69 6c readers..** wil
1a523 6c 20 63 68 6f 6f 73 65 20 61 52 65 61 64 4d 61 l choose aReadMa
1a524 72 6b 5b 30 5d 20 77 68 69 63 68 20 68 61 73 20 rk[0] which has
1a525 76 61 6c 75 65 20 30 20 61 6e 64 20 68 65 6e 63 value 0 and henc
1a526 65 20 73 75 63 68 20 72 65 61 64 65 72 20 77 69 e such reader wi
1a527 6c 6c 0d 0a 2a 2a 20 67 65 74 20 61 6c 6c 20 74 ll..** get all t
1a528 68 65 69 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 heir all content
1a529 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 directly from t
1a52a 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1a52b 20 61 6e 64 20 69 67 6e 6f 72 65 20 0d 0a 2a 2a and ignore ..**
1a52c 20 74 68 65 20 57 41 4c 2e 0d 0a 2a 2a 0d 0a 2a the WAL...**..*
1a52d 2a 20 57 72 69 74 65 72 73 20 6e 6f 72 6d 61 6c * Writers normal
1a52e 6c 79 20 61 70 70 65 6e 64 20 6e 65 77 20 66 72 ly append new fr
1a52f 61 6d 65 73 20 74 6f 20 74 68 65 20 65 6e 64 20 ames to the end
1a530 6f 66 20 74 68 65 20 57 41 4c 2e 20 20 48 6f 77 of the WAL. How
1a531 65 76 65 72 2c 0d 0a 2a 2a 20 69 66 20 6e 42 61 ever,..** if nBa
1a532 63 6b 66 69 6c 6c 20 65 71 75 61 6c 73 20 6d 78 ckfill equals mx
1a533 46 72 61 6d 65 20 28 6d 65 61 6e 69 6e 67 20 74 Frame (meaning t
1a534 68 61 74 20 61 6c 6c 20 57 41 4c 20 63 6f 6e 74 hat all WAL cont
1a535 65 6e 74 20 68 61 73 20 62 65 65 6e 0d 0a 2a 2a ent has been..**
1a536 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e written back in
1a537 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 29 to the database)
1a538 20 61 6e 64 20 69 66 20 6e 6f 20 72 65 61 64 65 and if no reade
1a539 72 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 rs are using the
1a53a 20 57 41 4c 0d 0a 2a 2a 20 28 69 6e 20 6f 74 68 WAL..** (in oth
1a53b 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 er words, if the
1a53c 72 65 20 61 72 65 20 6e 6f 20 57 41 4c 5f 52 45 re are no WAL_RE
1a53d 41 44 5f 4c 4f 43 4b 28 69 29 20 77 68 65 72 65 AD_LOCK(i) where
1a53e 20 69 3e 30 29 20 74 68 65 6e 0d 0a 2a 2a 20 74 i>0) then..** t
1a53f 68 65 20 77 72 69 74 65 72 20 77 69 6c 6c 20 66 he writer will f
1a540 69 72 73 74 20 22 72 65 73 65 74 22 20 74 68 65 irst "reset" the
1a541 20 57 41 4c 20 62 61 63 6b 20 74 6f 20 74 68 65 WAL back to the
1a542 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 73 beginning and s
1a543 74 61 72 74 0d 0a 2a 2a 20 77 72 69 74 69 6e 67 tart..** writing
1a544 20 6e 65 77 20 63 6f 6e 74 65 6e 74 20 62 65 67 new content beg
1a545 69 6e 6e 69 6e 67 20 61 74 20 66 72 61 6d 65 20 inning at frame
1a546 31 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 65 20 61 73 1...**..** We as
1a547 73 75 6d 65 20 74 68 61 74 20 33 32 2d 62 69 74 sume that 32-bit
1a548 20 6c 6f 61 64 73 20 61 72 65 20 61 74 6f 6d 69 loads are atomi
1a549 63 20 61 6e 64 20 73 6f 20 6e 6f 20 6c 6f 63 6b c and so no lock
1a54a 73 20 61 72 65 20 6e 65 65 64 65 64 20 69 6e 0d s are needed in.
1a54b 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 72 65 61 .** order to rea
1a54c 64 20 66 72 6f 6d 20 61 6e 79 20 61 52 65 61 64 d from any aRead
1a54d 4d 61 72 6b 5b 5d 20 65 6e 74 72 69 65 73 2e 0d Mark[] entries..
1a54e 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 57 61 6c 43 .*/..struct WalC
1a54f 6b 70 74 49 6e 66 6f 20 7b 0d 0a 20 20 75 33 32 kptInfo {.. u32
1a550 20 6e 42 61 63 6b 66 69 6c 6c 3b 20 20 20 20 20 nBackfill;
1a551 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a552 4e 75 6d 62 65 72 20 6f 66 20 57 41 4c 20 66 72 Number of WAL fr
1a553 61 6d 65 73 20 62 61 63 6b 66 69 6c 6c 65 64 20 ames backfilled
1a554 69 6e 74 6f 20 44 42 20 2a 2f 0d 0a 20 20 75 33 into DB */.. u3
1a555 32 20 61 52 65 61 64 4d 61 72 6b 5b 57 41 4c 5f 2 aReadMark[WAL_
1a556 4e 52 45 41 44 45 52 5d 3b 20 20 20 20 20 2f 2a NREADER]; /*
1a557 20 52 65 61 64 65 72 20 6d 61 72 6b 73 20 2a 2f Reader marks */
1a558 0d 0a 7d 3b 0d 0a 23 64 65 66 69 6e 65 20 52 45 ..};..#define RE
1a559 41 44 4d 41 52 4b 5f 4e 4f 54 5f 55 53 45 44 20 ADMARK_NOT_USED
1a55a 20 30 78 66 66 66 66 66 66 66 66 0d 0a 0d 0a 0d 0xffffffff.....
1a55b 0a 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 57 ./* A block of W
1a55c 41 4c 49 4e 44 45 58 5f 4c 4f 43 4b 5f 52 45 53 ALINDEX_LOCK_RES
1a55d 45 52 56 45 44 20 62 79 74 65 73 20 62 65 67 69 ERVED bytes begi
1a55e 6e 6e 69 6e 67 20 61 74 0d 0a 2a 2a 20 57 41 4c nning at..** WAL
1a55f 49 4e 44 45 58 5f 4c 4f 43 4b 5f 4f 46 46 53 45 INDEX_LOCK_OFFSE
1a560 54 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f T is reserved fo
1a561 72 20 6c 6f 63 6b 73 2e 20 53 69 6e 63 65 20 73 r locks. Since s
1a562 6f 6d 65 20 73 79 73 74 65 6d 73 0d 0a 2a 2a 20 ome systems..**
1a563 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6d 61 6e only support man
1a564 64 61 74 6f 72 79 20 66 69 6c 65 2d 6c 6f 63 6b datory file-lock
1a565 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 s, we do not rea
1a566 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 0d d or write data.
1a567 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 72 65 67 .** from the reg
1a568 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 ion of the file
1a569 6f 6e 20 77 68 69 63 68 20 6c 6f 63 6b 73 20 61 on which locks a
1a56a 72 65 20 61 70 70 6c 69 65 64 2e 0d 0a 2a 2f 0d re applied...*/.
1a56b 0a 23 64 65 66 69 6e 65 20 57 41 4c 49 4e 44 45 .#define WALINDE
1a56c 58 5f 4c 4f 43 4b 5f 4f 46 46 53 45 54 20 20 20 X_LOCK_OFFSET
1a56d 28 73 69 7a 65 6f 66 28 57 61 6c 49 6e 64 65 78 (sizeof(WalIndex
1a56e 48 64 72 29 2a 32 20 2b 20 73 69 7a 65 6f 66 28 Hdr)*2 + sizeof(
1a56f 57 61 6c 43 6b 70 74 49 6e 66 6f 29 29 0d 0a 23 WalCkptInfo))..#
1a570 64 65 66 69 6e 65 20 57 41 4c 49 4e 44 45 58 5f define WALINDEX_
1a571 4c 4f 43 4b 5f 52 45 53 45 52 56 45 44 20 31 36 LOCK_RESERVED 16
1a572 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 49 4e 44 ..#define WALIND
1a573 45 58 5f 48 44 52 5f 53 49 5a 45 20 20 20 20 20 EX_HDR_SIZE
1a574 20 28 57 41 4c 49 4e 44 45 58 5f 4c 4f 43 4b 5f (WALINDEX_LOCK_
1a575 4f 46 46 53 45 54 2b 57 41 4c 49 4e 44 45 58 5f OFFSET+WALINDEX_
1a576 4c 4f 43 4b 5f 52 45 53 45 52 56 45 44 29 0d 0a LOCK_RESERVED)..
1a577 0d 0a 2f 2a 20 53 69 7a 65 20 6f 66 20 68 65 61 ../* Size of hea
1a578 64 65 72 20 62 65 66 6f 72 65 20 65 61 63 68 20 der before each
1a579 66 72 61 6d 65 20 69 6e 20 77 61 6c 20 2a 2f 0d frame in wal */.
1a57a 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 46 52 41 .#define WAL_FRA
1a57b 4d 45 5f 48 44 52 53 49 5a 45 20 32 34 0d 0a 0d ME_HDRSIZE 24...
1a57c 0a 2f 2a 20 53 69 7a 65 20 6f 66 20 77 72 69 74 ./* Size of writ
1a57d 65 20 61 68 65 61 64 20 6c 6f 67 20 68 65 61 64 e ahead log head
1a57e 65 72 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 68 er, including ch
1a57f 65 63 6b 73 75 6d 2e 20 2a 2f 0d 0a 2f 2a 20 23 ecksum. */../* #
1a580 64 65 66 69 6e 65 20 57 41 4c 5f 48 44 52 53 49 define WAL_HDRSI
1a581 5a 45 20 32 34 20 2a 2f 0d 0a 23 64 65 66 69 6e ZE 24 */..#defin
1a582 65 20 57 41 4c 5f 48 44 52 53 49 5a 45 20 33 32 e WAL_HDRSIZE 32
1a583 0d 0a 0d 0a 2f 2a 20 57 41 4c 20 6d 61 67 69 63 ..../* WAL magic
1a584 20 76 61 6c 75 65 2e 20 45 69 74 68 65 72 20 74 value. Either t
1a585 68 69 73 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 his value, or th
1a586 65 20 73 61 6d 65 20 76 61 6c 75 65 20 77 69 74 e same value wit
1a587 68 20 74 68 65 20 6c 65 61 73 74 0d 0a 2a 2a 20 h the least..**
1a588 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 significant bit
1a589 61 6c 73 6f 20 73 65 74 20 28 57 41 4c 5f 4d 41 also set (WAL_MA
1a58a 47 49 43 20 7c 20 30 78 30 30 30 30 30 30 30 31 GIC | 0x00000001
1a58b 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 33 ) is stored in 3
1a58c 32 2d 62 69 74 0d 0a 2a 2a 20 62 69 67 2d 65 6e 2-bit..** big-en
1a58d 64 69 61 6e 20 66 6f 72 6d 61 74 20 69 6e 20 74 dian format in t
1a58e 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 he first 4 bytes
1a58f 20 6f 66 20 61 20 57 41 4c 20 66 69 6c 65 2e 0d of a WAL file..
1a590 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 4c .**..** If the L
1a591 53 42 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 SB is set, then
1a592 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 66 6f the checksums fo
1a593 72 20 65 61 63 68 20 66 72 61 6d 65 20 77 69 74 r each frame wit
1a594 68 69 6e 20 74 68 65 20 57 41 4c 0d 0a 2a 2a 20 hin the WAL..**
1a595 66 69 6c 65 20 61 72 65 20 63 61 6c 63 75 6c 61 file are calcula
1a596 74 65 64 20 62 79 20 74 72 65 61 74 69 6e 67 20 ted by treating
1a597 61 6c 6c 20 64 61 74 61 20 61 73 20 61 6e 20 61 all data as an a
1a598 72 72 61 79 20 6f 66 20 33 32 2d 62 69 74 20 0d rray of 32-bit .
1a599 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 77 .** big-endian w
1a59a 6f 72 64 73 2e 20 4f 74 68 65 72 77 69 73 65 2c ords. Otherwise,
1a59b 20 74 68 65 79 20 61 72 65 20 63 61 6c 63 75 6c they are calcul
1a59c 61 74 65 64 20 62 79 20 69 6e 74 65 72 70 72 65 ated by interpre
1a59d 74 69 6e 67 20 0d 0a 2a 2a 20 61 6c 6c 20 64 61 ting ..** all da
1a59e 74 61 20 61 73 20 33 32 2d 62 69 74 20 6c 69 74 ta as 32-bit lit
1a59f 74 6c 65 2d 65 6e 64 69 61 6e 20 77 6f 72 64 73 tle-endian words
1a5a0 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 ...*/..#define W
1a5a1 41 4c 5f 4d 41 47 49 43 20 30 78 33 37 37 66 30 AL_MAGIC 0x377f0
1a5a2 36 38 32 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 682..../*..** Re
1a5a3 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 turn the offset
1a5a4 6f 66 20 66 72 61 6d 65 20 69 46 72 61 6d 65 20 of frame iFrame
1a5a5 69 6e 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 in the write-ahe
1a5a6 61 64 20 6c 6f 67 20 66 69 6c 65 2c 20 0d 0a 2a ad log file, ..*
1a5a7 2a 20 61 73 73 75 6d 69 6e 67 20 61 20 64 61 74 * assuming a dat
1a5a8 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 abase page size
1a5a9 6f 66 20 73 7a 50 61 67 65 20 62 79 74 65 73 2e of szPage bytes.
1a5aa 20 54 68 65 20 6f 66 66 73 65 74 20 72 65 74 75 The offset retu
1a5ab 72 6e 65 64 0d 0a 2a 2a 20 69 73 20 74 6f 20 74 rned..** is to t
1a5ac 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 he start of the
1a5ad 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 write-ahead log
1a5ae 66 72 61 6d 65 2d 68 65 61 64 65 72 2e 0d 0a 2a frame-header...*
1a5af 2f 0d 0a 23 64 65 66 69 6e 65 20 77 61 6c 46 72 /..#define walFr
1a5b0 61 6d 65 4f 66 66 73 65 74 28 69 46 72 61 6d 65 ameOffset(iFrame
1a5b1 2c 20 73 7a 50 61 67 65 29 20 28 20 20 20 20 20 , szPage) (
1a5b2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a5b3 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 57 \.. W
1a5b4 41 4c 5f 48 44 52 53 49 5a 45 20 2b 20 28 28 69 AL_HDRSIZE + ((i
1a5b5 46 72 61 6d 65 29 2d 31 29 2a 28 69 36 34 29 28 Frame)-1)*(i64)(
1a5b6 28 73 7a 50 61 67 65 29 2b 57 41 4c 5f 46 52 41 (szPage)+WAL_FRA
1a5b7 4d 45 5f 48 44 52 53 49 5a 45 29 20 20 20 20 20 ME_HDRSIZE)
1a5b8 20 20 20 20 5c 0d 0a 29 0d 0a 0d 0a 2f 2a 0d 0a \..)..../*..
1a5b9 2a 2a 20 41 6e 20 6f 70 65 6e 20 77 72 69 74 65 ** An open write
1a5ba 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65 20 -ahead log file
1a5bb 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 is represented b
1a5bc 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 y an instance of
1a5bd 20 74 68 65 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 the..** followi
1a5be 6e 67 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a ng object...*/..
1a5bf 73 74 72 75 63 74 20 57 61 6c 20 7b 0d 0a 20 20 struct Wal {..
1a5c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
1a5c1 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 s; /* Th
1a5c2 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 63 72 e VFS used to cr
1a5c3 65 61 74 65 20 70 44 62 46 64 20 2a 2f 0d 0a 20 eate pDbFd */..
1a5c4 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 sqlite3_file *p
1a5c5 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 46 DbFd; /* F
1a5c6 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 ile handle for t
1a5c7 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1a5c8 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 */.. sqlite3_f
1a5c9 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20 20 20 ile *pWalFd;
1a5ca 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 /* File handle
1a5cb 20 66 6f 72 20 57 41 4c 20 66 69 6c 65 20 2a 2f for WAL file */
1a5cc 0d 0a 20 20 75 33 32 20 69 43 61 6c 6c 62 61 63 .. u32 iCallbac
1a5cd 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f k; /
1a5ce 2a 20 56 61 6c 75 65 20 74 6f 20 70 61 73 73 20 * Value to pass
1a5cf 74 6f 20 6c 6f 67 20 63 61 6c 6c 62 61 63 6b 20 to log callback
1a5d0 28 6f 72 20 30 29 20 2a 2f 0d 0a 20 20 69 36 34 (or 0) */.. i64
1a5d1 20 6d 78 57 61 6c 53 69 7a 65 3b 20 20 20 20 20 mxWalSize;
1a5d2 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 6e 63 /* Trunc
1a5d3 61 74 65 20 57 41 4c 20 74 6f 20 74 68 69 73 20 ate WAL to this
1a5d4 73 69 7a 65 20 75 70 6f 6e 20 72 65 73 65 74 20 size upon reset
1a5d5 2a 2f 0d 0a 20 20 69 6e 74 20 6e 57 69 44 61 74 */.. int nWiDat
1a5d6 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 a;
1a5d7 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 /* Size of arra
1a5d8 79 20 61 70 57 69 44 61 74 61 20 2a 2f 0d 0a 20 y apWiData */..
1a5d9 20 69 6e 74 20 73 7a 46 69 72 73 74 42 6c 6f 63 int szFirstBloc
1a5da 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 k; /* S
1a5db 69 7a 65 20 6f 66 20 66 69 72 73 74 20 62 6c 6f ize of first blo
1a5dc 63 6b 20 77 72 69 74 74 65 6e 20 74 6f 20 57 41 ck written to WA
1a5dd 4c 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 76 6f 6c L file */.. vol
1a5de 61 74 69 6c 65 20 75 33 32 20 2a 2a 61 70 57 69 atile u32 **apWi
1a5df 44 61 74 61 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 Data; /* Point
1a5e0 65 72 20 74 6f 20 77 61 6c 2d 69 6e 64 65 78 20 er to wal-index
1a5e1 63 6f 6e 74 65 6e 74 20 69 6e 20 6d 65 6d 6f 72 content in memor
1a5e2 79 20 2a 2f 0d 0a 20 20 75 33 32 20 73 7a 50 61 y */.. u32 szPa
1a5e3 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ge;
1a5e4 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 /* Database p
1a5e5 61 67 65 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 69 age size */.. i
1a5e6 31 36 20 72 65 61 64 4c 6f 63 6b 3b 20 20 20 20 16 readLock;
1a5e7 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 /* Whi
1a5e8 63 68 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 ch read lock is
1a5e9 62 65 69 6e 67 20 68 65 6c 64 2e 20 20 2d 31 20 being held. -1
1a5ea 66 6f 72 20 6e 6f 6e 65 20 2a 2f 0d 0a 20 20 75 for none */.. u
1a5eb 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 8 syncFlags;
1a5ec 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 /* Fla
1a5ed 67 73 20 74 6f 20 75 73 65 20 74 6f 20 73 79 6e gs to use to syn
1a5ee 63 20 68 65 61 64 65 72 20 77 72 69 74 65 73 20 c header writes
1a5ef 2a 2f 0d 0a 20 20 75 38 20 65 78 63 6c 75 73 69 */.. u8 exclusi
1a5f0 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 veMode;
1a5f1 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 /* Non-zero if
1a5f2 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e connection is in
1a5f3 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 exclusive mode
1a5f4 2a 2f 0d 0a 20 20 75 38 20 77 72 69 74 65 4c 6f */.. u8 writeLo
1a5f5 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ck;
1a5f6 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 /* True if in a
1a5f7 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 write transacti
1a5f8 6f 6e 20 2a 2f 0d 0a 20 20 75 38 20 63 6b 70 74 on */.. u8 ckpt
1a5f9 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 Lock;
1a5fa 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 /* True if h
1a5fb 6f 6c 64 69 6e 67 20 61 20 63 68 65 63 6b 70 6f olding a checkpo
1a5fc 69 6e 74 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 75 int lock */.. u
1a5fd 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 8 readOnly;
1a5fe 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c /* WAL
1a5ff 5f 52 44 57 52 2c 20 57 41 4c 5f 52 44 4f 4e 4c _RDWR, WAL_RDONL
1a600 59 2c 20 6f 72 20 57 41 4c 5f 53 48 4d 5f 52 44 Y, or WAL_SHM_RD
1a601 4f 4e 4c 59 20 2a 2f 0d 0a 20 20 75 38 20 74 72 ONLY */.. u8 tr
1a602 75 6e 63 61 74 65 4f 6e 43 6f 6d 6d 69 74 3b 20 uncateOnCommit;
1a603 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f /* True to
1a604 20 74 72 75 6e 63 61 74 65 20 57 41 4c 20 66 69 truncate WAL fi
1a605 6c 65 20 6f 6e 20 63 6f 6d 6d 69 74 20 2a 2f 0d le on commit */.
1a606 0a 20 20 75 38 20 73 79 6e 63 48 65 61 64 65 72 . u8 syncHeader
1a607 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
1a608 20 46 73 79 6e 63 20 74 68 65 20 57 41 4c 20 68 Fsync the WAL h
1a609 65 61 64 65 72 20 69 66 20 74 72 75 65 20 2a 2f eader if true */
1a60a 0d 0a 20 20 75 38 20 70 61 64 54 6f 53 65 63 74 .. u8 padToSect
1a60b 6f 72 42 6f 75 6e 64 61 72 79 3b 20 20 20 20 2f orBoundary; /
1a60c 2a 20 50 61 64 20 74 72 61 6e 73 61 63 74 69 6f * Pad transactio
1a60d 6e 73 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 ns out to the ne
1a60e 78 74 20 73 65 63 74 6f 72 20 2a 2f 0d 0a 20 20 xt sector */..
1a60f 57 61 6c 49 6e 64 65 78 48 64 72 20 68 64 72 3b WalIndexHdr hdr;
1a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 /* Wa
1a611 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 66 l-index header f
1a612 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 or current trans
1a613 61 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 63 6f 6e action */.. con
1a614 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 4e 61 6d st char *zWalNam
1a615 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 e; /* Name
1a616 6f 66 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0d 0a of WAL file */..
1a617 20 20 75 33 32 20 6e 43 6b 70 74 3b 20 20 20 20 u32 nCkpt;
1a618 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a619 43 68 65 63 6b 70 6f 69 6e 74 20 73 65 71 75 65 Checkpoint seque
1a61a 6e 63 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 nce counter in t
1a61b 68 65 20 77 61 6c 2d 68 65 61 64 65 72 20 2a 2f he wal-header */
1a61c 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
1a61d 44 45 42 55 47 0d 0a 20 20 75 38 20 6c 6f 63 6b DEBUG.. u8 lock
1a61e 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 Error;
1a61f 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 /* True if a
1a620 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 68 locking error h
1a621 61 73 20 6f 63 63 75 72 72 65 64 20 2a 2f 0d 0a as occurred */..
1a622 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a #endif..};..../*
1a623 0d 0a 2a 2a 20 43 61 6e 64 69 64 61 74 65 20 76 ..** Candidate v
1a624 61 6c 75 65 73 20 66 6f 72 20 57 61 6c 2e 65 78 alues for Wal.ex
1a625 63 6c 75 73 69 76 65 4d 6f 64 65 2e 0d 0a 2a 2f clusiveMode...*/
1a626 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4e 4f ..#define WAL_NO
1a627 52 4d 41 4c 5f 4d 4f 44 45 20 20 20 20 20 30 0d RMAL_MODE 0.
1a628 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 45 58 43 .#define WAL_EXC
1a629 4c 55 53 49 56 45 5f 4d 4f 44 45 20 20 31 20 20 LUSIVE_MODE 1
1a62a 20 20 20 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c ..#define WAL
1a62b 5f 48 45 41 50 4d 45 4d 4f 52 59 5f 4d 4f 44 45 _HEAPMEMORY_MODE
1a62c 20 32 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 6f 73 2..../*..** Pos
1a62d 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 sible values for
1a62e 20 57 41 4c 2e 72 65 61 64 4f 6e 6c 79 0d 0a 2a WAL.readOnly..*
1a62f 2f 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 52 /..#define WAL_R
1a630 44 57 52 20 20 20 20 20 20 20 20 30 20 20 20 20 DWR 0
1a631 2f 2a 20 4e 6f 72 6d 61 6c 20 72 65 61 64 2f 77 /* Normal read/w
1a632 72 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 rite connection
1a633 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f */..#define WAL_
1a634 52 44 4f 4e 4c 59 20 20 20 20 20 20 31 20 20 20 RDONLY 1
1a635 20 2f 2a 20 54 68 65 20 57 41 4c 20 66 69 6c 65 /* The WAL file
1a636 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0d is readonly */.
1a637 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 53 48 4d .#define WAL_SHM
1a638 5f 52 44 4f 4e 4c 59 20 20 32 20 20 20 20 2f 2a _RDONLY 2 /*
1a639 20 54 68 65 20 53 48 4d 20 66 69 6c 65 20 69 73 The SHM file is
1a63a 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0d 0a 0d 0a readonly */....
1a63b 2f 2a 0d 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 /*..** Each page
1a63c 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 of the wal-inde
1a63d 78 20 6d 61 70 70 69 6e 67 20 63 6f 6e 74 61 69 x mapping contai
1a63e 6e 73 20 61 20 68 61 73 68 2d 74 61 62 6c 65 20 ns a hash-table
1a63f 6d 61 64 65 20 75 70 20 6f 66 0d 0a 2a 2a 20 61 made up of..** a
1a640 6e 20 61 72 72 61 79 20 6f 66 20 48 41 53 48 54 n array of HASHT
1a641 41 42 4c 45 5f 4e 53 4c 4f 54 20 65 6c 65 6d 65 ABLE_NSLOT eleme
1a642 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nts of the follo
1a643 77 69 6e 67 20 74 79 70 65 2e 0d 0a 2a 2f 0d 0a wing type...*/..
1a644 74 79 70 65 64 65 66 20 75 31 36 20 68 74 5f 73 typedef u16 ht_s
1a645 6c 6f 74 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 lot;..../*..** T
1a646 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 his structure is
1a647 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 used to impleme
1a648 6e 74 20 61 6e 20 69 74 65 72 61 74 6f 72 20 74 nt an iterator t
1a649 68 61 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 hat loops throug
1a64a 68 0d 0a 2a 2a 20 61 6c 6c 20 66 72 61 6d 65 73 h..** all frames
1a64b 20 69 6e 20 74 68 65 20 57 41 4c 20 69 6e 20 64 in the WAL in d
1a64c 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 64 atabase page ord
1a64d 65 72 2e 20 57 68 65 72 65 20 74 77 6f 20 6f 72 er. Where two or
1a64e 20 6d 6f 72 65 20 66 72 61 6d 65 73 0d 0a 2a 2a more frames..**
1a64f 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 correspond to t
1a650 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 he same database
1a651 20 70 61 67 65 2c 20 74 68 65 20 69 74 65 72 61 page, the itera
1a652 74 6f 72 20 76 69 73 69 74 73 20 6f 6e 6c 79 20 tor visits only
1a653 74 68 65 20 0d 0a 2a 2a 20 66 72 61 6d 65 20 6d the ..** frame m
1a654 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 ost recently wri
1a655 74 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 tten to the WAL
1a656 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c (in other words,
1a657 20 74 68 65 20 66 72 61 6d 65 20 77 69 74 68 0d the frame with.
1a658 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 .** the largest
1a659 69 6e 64 65 78 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 index)...**..**
1a65a 54 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f 66 The internals of
1a65b 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 this structure
1a65c 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73 73 65 are only accesse
1a65d 64 20 62 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 d by:..**..**
1a65e 77 61 6c 49 74 65 72 61 74 6f 72 49 6e 69 74 28 walIteratorInit(
1a65f 29 20 2d 20 43 72 65 61 74 65 20 61 20 6e 65 77 ) - Create a new
1a660 20 69 74 65 72 61 74 6f 72 2c 0d 0a 2a 2a 20 20 iterator,..**
1a661 20 77 61 6c 49 74 65 72 61 74 6f 72 4e 65 78 74 walIteratorNext
1a662 28 29 20 2d 20 53 74 65 70 20 61 6e 20 69 74 65 () - Step an ite
1a663 72 61 74 6f 72 2c 0d 0a 2a 2a 20 20 20 77 61 6c rator,..** wal
1a664 49 74 65 72 61 74 6f 72 46 72 65 65 28 29 20 2d IteratorFree() -
1a665 20 46 72 65 65 20 61 6e 20 69 74 65 72 61 74 6f Free an iterato
1a666 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 r...**..** This
1a667 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 69 73 functionality is
1a668 20 75 73 65 64 20 62 79 20 74 68 65 20 63 68 65 used by the che
1a669 63 6b 70 6f 69 6e 74 20 63 6f 64 65 20 28 73 65 ckpoint code (se
1a66a 65 20 77 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 e walCheckpoint(
1a66b 29 29 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 ))...*/..struct
1a66c 57 61 6c 49 74 65 72 61 74 6f 72 20 7b 0d 0a 20 WalIterator {..
1a66d 20 69 6e 74 20 69 50 72 69 6f 72 3b 20 20 20 20 int iPrior;
1a66e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a66f 20 2f 2a 20 4c 61 73 74 20 72 65 73 75 6c 74 20 /* Last result
1a670 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 returned from th
1a671 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 e iterator */..
1a672 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20 int nSegment;
1a673 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a674 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e /* Number of en
1a675 74 72 69 65 73 20 69 6e 20 61 53 65 67 6d 65 6e tries in aSegmen
1a676 74 5b 5d 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 t[] */.. struct
1a677 20 57 61 6c 53 65 67 6d 65 6e 74 20 7b 0d 0a 20 WalSegment {..
1a678 20 20 20 69 6e 74 20 69 4e 65 78 74 3b 20 20 20 int iNext;
1a679 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a67a 20 2f 2a 20 4e 65 78 74 20 73 6c 6f 74 20 69 6e /* Next slot in
1a67b 20 61 49 6e 64 65 78 5b 5d 20 6e 6f 74 20 79 65 aIndex[] not ye
1a67c 74 20 72 65 74 75 72 6e 65 64 20 2a 2f 0d 0a 20 t returned */..
1a67d 20 20 20 68 74 5f 73 6c 6f 74 20 2a 61 49 6e 64 ht_slot *aInd
1a67e 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ex;
1a67f 20 2f 2a 20 69 30 2c 20 69 31 2c 20 69 32 2e 2e /* i0, i1, i2..
1a680 2e 20 73 75 63 68 20 74 68 61 74 20 61 50 67 6e . such that aPgn
1a681 6f 5b 69 4e 5d 20 61 73 63 65 6e 64 20 2a 2f 0d o[iN] ascend */.
1a682 0a 20 20 20 20 75 33 32 20 2a 61 50 67 6e 6f 3b . u32 *aPgno;
1a683 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a684 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 /* Array of p
1a685 61 67 65 20 6e 75 6d 62 65 72 73 2e 20 2a 2f 0d age numbers. */.
1a686 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b . int nEntry;
1a687 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a688 20 20 20 2f 2a 20 4e 72 2e 20 6f 66 20 65 6e 74 /* Nr. of ent
1a689 72 69 65 73 20 69 6e 20 61 50 67 6e 6f 5b 5d 20 ries in aPgno[]
1a68a 61 6e 64 20 61 49 6e 64 65 78 5b 5d 20 2a 2f 0d and aIndex[] */.
1a68b 0a 20 20 20 20 69 6e 74 20 69 5a 65 72 6f 3b 20 . int iZero;
1a68c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a68d 20 20 20 2f 2a 20 46 72 61 6d 65 20 6e 75 6d 62 /* Frame numb
1a68e 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 er associated wi
1a68f 74 68 20 61 50 67 6e 6f 5b 30 5d 20 2a 2f 0d 0a th aPgno[0] */..
1a690 20 20 7d 20 61 53 65 67 6d 65 6e 74 5b 31 5d 3b } aSegment[1];
1a691 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a692 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65 76 65 /* One for eve
1a693 72 79 20 33 32 4b 42 20 70 61 67 65 20 69 6e 20 ry 32KB page in
1a694 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 2a 2f the wal-index */
1a695 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 ..};..../*..** D
1a696 65 66 69 6e 65 20 74 68 65 20 70 61 72 61 6d 65 efine the parame
1a697 74 65 72 73 20 6f 66 20 74 68 65 20 68 61 73 68 ters of the hash
1a698 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 77 tables in the w
1a699 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 2e 20 54 al-index file. T
1a69a 68 65 72 65 0d 0a 2a 2a 20 69 73 20 61 20 68 61 here..** is a ha
1a69b 73 68 2d 74 61 62 6c 65 20 66 6f 6c 6c 6f 77 69 sh-table followi
1a69c 6e 67 20 65 76 65 72 79 20 48 41 53 48 54 41 42 ng every HASHTAB
1a69d 4c 45 5f 4e 50 41 47 45 20 70 61 67 65 20 6e 75 LE_NPAGE page nu
1a69e 6d 62 65 72 73 20 69 6e 20 74 68 65 0d 0a 2a 2a mbers in the..**
1a69f 20 77 61 6c 2d 69 6e 64 65 78 2e 0d 0a 2a 2a 0d wal-index...**.
1a6a0 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 61 6e 79 .** Changing any
1a6a1 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 73 74 61 of these consta
1a6a2 6e 74 73 20 77 69 6c 6c 20 61 6c 74 65 72 20 74 nts will alter t
1a6a3 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 6f 72 he wal-index for
1a6a4 6d 61 74 20 61 6e 64 0d 0a 2a 2a 20 63 72 65 61 mat and..** crea
1a6a5 74 65 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 te incompatibili
1a6a6 74 69 65 73 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 ties...*/..#defi
1a6a7 6e 65 20 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 ne HASHTABLE_NPA
1a6a8 47 45 20 20 20 20 20 20 34 30 39 36 20 20 20 20 GE 4096
1a6a9 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a6aa 4d 75 73 74 20 62 65 20 70 6f 77 65 72 20 6f 66 Must be power of
1a6ab 20 32 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 48 2 */..#define H
1a6ac 41 53 48 54 41 42 4c 45 5f 48 41 53 48 5f 31 20 ASHTABLE_HASH_1
1a6ad 20 20 20 20 33 38 33 20 20 20 20 20 20 20 20 20 383
1a6ae 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 75 /* Shou
1a6af 6c 64 20 62 65 20 70 72 69 6d 65 20 2a 2f 0d 0a ld be prime */..
1a6b0 23 64 65 66 69 6e 65 20 48 41 53 48 54 41 42 4c #define HASHTABL
1a6b1 45 5f 4e 53 4c 4f 54 20 20 20 20 20 20 28 48 41 E_NSLOT (HA
1a6b2 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 2a 32 29 SHTABLE_NPAGE*2)
1a6b3 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 70 /* Must be a p
1a6b4 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0d 0a 0d 0a ower of 2 */....
1a6b5 2f 2a 20 0d 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 /* ..** The bloc
1a6b6 6b 20 6f 66 20 70 61 67 65 20 6e 75 6d 62 65 72 k of page number
1a6b7 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
1a6b8 68 20 74 68 65 20 66 69 72 73 74 20 68 61 73 68 h the first hash
1a6b9 2d 74 61 62 6c 65 20 69 6e 20 61 0d 0a 2a 2a 20 -table in a..**
1a6ba 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 73 6d 61 wal-index is sma
1a6bb 6c 6c 65 72 20 74 68 61 6e 20 75 73 75 61 6c 2e ller than usual.
1a6bc 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 This is so that
1a6bd 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6d 70 there is a comp
1a6be 6c 65 74 65 0d 0a 2a 2a 20 68 61 73 68 2d 74 61 lete..** hash-ta
1a6bf 62 6c 65 20 6f 6e 20 65 61 63 68 20 61 6c 69 67 ble on each alig
1a6c0 6e 65 64 20 33 32 4b 42 20 70 61 67 65 20 6f 66 ned 32KB page of
1a6c1 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2e 0d the wal-index..
1a6c2 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 48 41 53 .*/..#define HAS
1a6c3 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f 4e 45 HTABLE_NPAGE_ONE
1a6c4 20 20 28 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 (HASHTABLE_NPA
1a6c5 47 45 20 2d 20 28 57 41 4c 49 4e 44 45 58 5f 48 GE - (WALINDEX_H
1a6c6 44 52 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 75 DR_SIZE/sizeof(u
1a6c7 33 32 29 29 29 0d 0a 0d 0a 2f 2a 20 54 68 65 20 32)))..../* The
1a6c8 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 64 69 76 wal-index is div
1a6c9 69 64 65 64 20 69 6e 74 6f 20 70 61 67 65 73 20 ided into pages
1a6ca 6f 66 20 57 41 4c 49 4e 44 45 58 5f 50 47 53 5a of WALINDEX_PGSZ
1a6cb 20 62 79 74 65 73 20 65 61 63 68 2e 20 2a 2f 0d bytes each. */.
1a6cc 0a 23 64 65 66 69 6e 65 20 57 41 4c 49 4e 44 45 .#define WALINDE
1a6cd 58 5f 50 47 53 5a 20 20 20 28 20 20 20 20 20 20 X_PGSZ (
1a6ce 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a6cf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a6d0 20 20 20 5c 0d 0a 20 20 20 20 73 69 7a 65 6f 66 \.. sizeof
1a6d1 28 68 74 5f 73 6c 6f 74 29 2a 48 41 53 48 54 41 (ht_slot)*HASHTA
1a6d2 42 4c 45 5f 4e 53 4c 4f 54 20 2b 20 48 41 53 48 BLE_NSLOT + HASH
1a6d3 54 41 42 4c 45 5f 4e 50 41 47 45 2a 73 69 7a 65 TABLE_NPAGE*size
1a6d4 6f 66 28 75 33 32 29 20 5c 0d 0a 29 0d 0a 0d 0a of(u32) \..)....
1a6d5 2f 2a 0d 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 /*..** Obtain a
1a6d6 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 pointer to the i
1a6d7 50 61 67 65 27 74 68 20 70 61 67 65 20 6f 66 20 Page'th page of
1a6d8 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2e 20 54 the wal-index. T
1a6d9 68 65 20 77 61 6c 2d 69 6e 64 65 78 0d 0a 2a 2a he wal-index..**
1a6da 20 69 73 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 is broken into
1a6db 70 61 67 65 73 20 6f 66 20 57 41 4c 49 4e 44 45 pages of WALINDE
1a6dc 58 5f 50 47 53 5a 20 62 79 74 65 73 2e 20 57 61 X_PGSZ bytes. Wa
1a6dd 6c 2d 69 6e 64 65 78 20 70 61 67 65 73 20 61 72 l-index pages ar
1a6de 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 65 64 20 66 e..** numbered f
1a6df 72 6f 6d 20 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a rom zero...**..*
1a6e0 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c 20 69 * If this call i
1a6e1 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 s successful, *p
1a6e2 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 pPage is set to
1a6e3 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 77 61 6c point to the wal
1a6e4 2d 69 6e 64 65 78 0d 0a 2a 2a 20 70 61 67 65 20 -index..** page
1a6e5 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 and SQLITE_OK is
1a6e6 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e returned. If an
1a6e7 20 65 72 72 6f 72 20 28 61 6e 20 4f 4f 4d 20 6f error (an OOM o
1a6e8 72 20 56 46 53 20 65 72 72 6f 72 29 20 6f 63 63 r VFS error) occ
1a6e9 75 72 73 2c 0d 0a 2a 2a 20 74 68 65 6e 20 61 6e urs,..** then an
1a6ea 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f SQLite error co
1a6eb 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 de is returned a
1a6ec 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 nd *ppPage is se
1a6ed 74 20 74 6f 20 30 2e 0d 0a 2a 2f 0d 0a 73 74 61 t to 0...*/..sta
1a6ee 74 69 63 20 69 6e 74 20 77 61 6c 49 6e 64 65 78 tic int walIndex
1a6ef 50 61 67 65 28 57 61 6c 20 2a 70 57 61 6c 2c 20 Page(Wal *pWal,
1a6f0 69 6e 74 20 69 50 61 67 65 2c 20 76 6f 6c 61 74 int iPage, volat
1a6f1 69 6c 65 20 75 33 32 20 2a 2a 70 70 50 61 67 65 ile u32 **ppPage
1a6f2 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 ){.. int rc = S
1a6f3 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 2f QLITE_OK;.... /
1a6f4 2a 20 45 6e 6c 61 72 67 65 20 74 68 65 20 70 57 * Enlarge the pW
1a6f5 61 6c 2d 3e 61 70 57 69 44 61 74 61 5b 5d 20 61 al->apWiData[] a
1a6f6 72 72 61 79 20 69 66 20 72 65 71 75 69 72 65 64 rray if required
1a6f7 20 2a 2f 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d */.. if( pWal-
1a6f8 3e 6e 57 69 44 61 74 61 3c 3d 69 50 61 67 65 20 >nWiData<=iPage
1a6f9 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 ){.. int nByt
1a6fa 65 20 3d 20 73 69 7a 65 6f 66 28 75 33 32 2a 29 e = sizeof(u32*)
1a6fb 2a 28 69 50 61 67 65 2b 31 29 3b 0d 0a 20 20 20 *(iPage+1);..
1a6fc 20 76 6f 6c 61 74 69 6c 65 20 75 33 32 20 2a 2a volatile u32 **
1a6fd 61 70 4e 65 77 3b 0d 0a 20 20 20 20 61 70 4e 65 apNew;.. apNe
1a6fe 77 20 3d 20 28 76 6f 6c 61 74 69 6c 65 20 75 33 w = (volatile u3
1a6ff 32 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 2 **)sqlite3_rea
1a700 6c 6c 6f 63 28 28 76 6f 69 64 20 2a 29 70 57 61 lloc((void *)pWa
1a701 6c 2d 3e 61 70 57 69 44 61 74 61 2c 20 6e 42 79 l->apWiData, nBy
1a702 74 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 21 61 te);.. if( !a
1a703 70 4e 65 77 20 29 7b 0d 0a 20 20 20 20 20 20 2a pNew ){.. *
1a704 70 70 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 20 ppPage = 0;..
1a705 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1a706 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a _NOMEM;.. }..
1a707 20 20 20 20 6d 65 6d 73 65 74 28 28 76 6f 69 64 memset((void
1a708 2a 29 26 61 70 4e 65 77 5b 70 57 61 6c 2d 3e 6e *)&apNew[pWal->n
1a709 57 69 44 61 74 61 5d 2c 20 30 2c 0d 0a 20 20 20 WiData], 0,..
1a70a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 sizeof(u
1a70b 33 32 2a 29 2a 28 69 50 61 67 65 2b 31 2d 70 57 32*)*(iPage+1-pW
1a70c 61 6c 2d 3e 6e 57 69 44 61 74 61 29 29 3b 0d 0a al->nWiData));..
1a70d 20 20 20 20 70 57 61 6c 2d 3e 61 70 57 69 44 61 pWal->apWiDa
1a70e 74 61 20 3d 20 61 70 4e 65 77 3b 0d 0a 20 20 20 ta = apNew;..
1a70f 20 70 57 61 6c 2d 3e 6e 57 69 44 61 74 61 20 3d pWal->nWiData =
1a710 20 69 50 61 67 65 2b 31 3b 0d 0a 20 20 7d 0d 0a iPage+1;.. }..
1a711 0d 0a 20 20 2f 2a 20 52 65 71 75 65 73 74 20 61 .. /* Request a
1a712 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
1a713 72 65 71 75 69 72 65 64 20 70 61 67 65 20 66 72 required page fr
1a714 6f 6d 20 74 68 65 20 56 46 53 20 2a 2f 0d 0a 20 om the VFS */..
1a715 20 69 66 28 20 70 57 61 6c 2d 3e 61 70 57 69 44 if( pWal->apWiD
1a716 61 74 61 5b 69 50 61 67 65 5d 3d 3d 30 20 29 7b ata[iPage]==0 ){
1a717 0d 0a 20 20 20 20 69 66 28 20 70 57 61 6c 2d 3e .. if( pWal->
1a718 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3d 3d 57 exclusiveMode==W
1a719 41 4c 5f 48 45 41 50 4d 45 4d 4f 52 59 5f 4d 4f AL_HEAPMEMORY_MO
1a71a 44 45 20 29 7b 0d 0a 20 20 20 20 20 20 70 57 61 DE ){.. pWa
1a71b 6c 2d 3e 61 70 57 69 44 61 74 61 5b 69 50 61 67 l->apWiData[iPag
1a71c 65 5d 20 3d 20 28 75 33 32 20 76 6f 6c 61 74 69 e] = (u32 volati
1a71d 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c le *)sqlite3Mall
1a71e 6f 63 5a 65 72 6f 28 57 41 4c 49 4e 44 45 58 5f ocZero(WALINDEX_
1a71f 50 47 53 5a 29 3b 0d 0a 20 20 20 20 20 20 69 66 PGSZ);.. if
1a720 28 20 21 70 57 61 6c 2d 3e 61 70 57 69 44 61 74 ( !pWal->apWiDat
1a721 61 5b 69 50 61 67 65 5d 20 29 20 72 63 20 3d 20 a[iPage] ) rc =
1a722 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 SQLITE_NOMEM;..
1a723 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1a724 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 rc = sqlite3OsS
1a725 68 6d 4d 61 70 28 70 57 61 6c 2d 3e 70 44 62 46 hmMap(pWal->pDbF
1a726 64 2c 20 69 50 61 67 65 2c 20 57 41 4c 49 4e 44 d, iPage, WALIND
1a727 45 58 5f 50 47 53 5a 2c 20 0d 0a 20 20 20 20 20 EX_PGSZ, ..
1a728 20 20 20 20 20 70 57 61 6c 2d 3e 77 72 69 74 65 pWal->write
1a729 4c 6f 63 6b 2c 20 28 76 6f 69 64 20 76 6f 6c 61 Lock, (void vola
1a72a 74 69 6c 65 20 2a 2a 29 26 70 57 61 6c 2d 3e 61 tile **)&pWal->a
1a72b 70 57 69 44 61 74 61 5b 69 50 61 67 65 5d 0d 0a pWiData[iPage]..
1a72c 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 );..
1a72d 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 if( rc==SQLITE_R
1a72e 45 41 44 4f 4e 4c 59 20 29 7b 0d 0a 20 20 20 20 EADONLY ){..
1a72f 20 20 20 20 70 57 61 6c 2d 3e 72 65 61 64 4f 6e pWal->readOn
1a730 6c 79 20 7c 3d 20 57 41 4c 5f 53 48 4d 5f 52 44 ly |= WAL_SHM_RD
1a731 4f 4e 4c 59 3b 0d 0a 20 20 20 20 20 20 20 20 72 ONLY;.. r
1a732 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
1a733 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
1a734 20 20 7d 0d 0a 0d 0a 20 20 2a 70 70 50 61 67 65 }.... *ppPage
1a735 20 3d 20 70 57 61 6c 2d 3e 61 70 57 69 44 61 74 = pWal->apWiDat
1a736 61 5b 69 50 61 67 65 5d 3b 0d 0a 20 20 61 73 73 a[iPage];.. ass
1a737 65 72 74 28 20 69 50 61 67 65 3d 3d 30 20 7c 7c ert( iPage==0 ||
1a738 20 2a 70 70 50 61 67 65 20 7c 7c 20 72 63 21 3d *ppPage || rc!=
1a739 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 SQLITE_OK );..
1a73a 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
1a73b 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ./*..** Return a
1a73c 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
1a73d 57 61 6c 43 6b 70 74 49 6e 66 6f 20 73 74 72 75 WalCkptInfo stru
1a73e 63 74 75 72 65 20 69 6e 20 74 68 65 20 77 61 6c cture in the wal
1a73f 2d 69 6e 64 65 78 2e 0d 0a 2a 2f 0d 0a 73 74 61 -index...*/..sta
1a740 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 57 61 6c tic volatile Wal
1a741 43 6b 70 74 49 6e 66 6f 20 2a 77 61 6c 43 6b 70 CkptInfo *walCkp
1a742 74 49 6e 66 6f 28 57 61 6c 20 2a 70 57 61 6c 29 tInfo(Wal *pWal)
1a743 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 57 61 {.. assert( pWa
1a744 6c 2d 3e 6e 57 69 44 61 74 61 3e 30 20 26 26 20 l->nWiData>0 &&
1a745 70 57 61 6c 2d 3e 61 70 57 69 44 61 74 61 5b 30 pWal->apWiData[0
1a746 5d 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 ] );.. return (
1a747 76 6f 6c 61 74 69 6c 65 20 57 61 6c 43 6b 70 74 volatile WalCkpt
1a748 49 6e 66 6f 2a 29 26 28 70 57 61 6c 2d 3e 61 70 Info*)&(pWal->ap
1a749 57 69 44 61 74 61 5b 30 5d 5b 73 69 7a 65 6f 66 WiData[0][sizeof
1a74a 28 57 61 6c 49 6e 64 65 78 48 64 72 29 2f 32 5d (WalIndexHdr)/2]
1a74b 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 );..}..../*..**
1a74c 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 Return a pointer
1a74d 20 74 6f 20 74 68 65 20 57 61 6c 49 6e 64 65 78 to the WalIndex
1a74e 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69 6e Hdr structure in
1a74f 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2e 0d the wal-index..
1a750 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 6c 61 .*/..static vola
1a751 74 69 6c 65 20 57 61 6c 49 6e 64 65 78 48 64 72 tile WalIndexHdr
1a752 20 2a 77 61 6c 49 6e 64 65 78 48 64 72 28 57 61 *walIndexHdr(Wa
1a753 6c 20 2a 70 57 61 6c 29 7b 0d 0a 20 20 61 73 73 l *pWal){.. ass
1a754 65 72 74 28 20 70 57 61 6c 2d 3e 6e 57 69 44 61 ert( pWal->nWiDa
1a755 74 61 3e 30 20 26 26 20 70 57 61 6c 2d 3e 61 70 ta>0 && pWal->ap
1a756 57 69 44 61 74 61 5b 30 5d 20 29 3b 0d 0a 20 20 WiData[0] );..
1a757 72 65 74 75 72 6e 20 28 76 6f 6c 61 74 69 6c 65 return (volatile
1a758 20 57 61 6c 49 6e 64 65 78 48 64 72 2a 29 70 57 WalIndexHdr*)pW
1a759 61 6c 2d 3e 61 70 57 69 44 61 74 61 5b 30 5d 3b al->apWiData[0];
1a75a 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
1a75b 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 e argument to th
1a75c 69 73 20 6d 61 63 72 6f 20 6d 75 73 74 20 62 65 is macro must be
1a75d 20 6f 66 20 74 79 70 65 20 75 33 32 2e 20 4f 6e of type u32. On
1a75e 20 61 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e a little-endian
1a75f 0d 0a 2a 2a 20 61 72 63 68 69 74 65 63 74 75 72 ..** architectur
1a760 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 74 68 e, it returns th
1a761 65 20 75 33 32 20 76 61 6c 75 65 20 74 68 61 74 e u32 value that
1a762 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 69 6e results from in
1a763 74 65 72 70 72 65 74 69 6e 67 0d 0a 2a 2a 20 74 terpreting..** t
1a764 68 65 20 34 20 62 79 74 65 73 20 61 73 20 61 20 he 4 bytes as a
1a765 62 69 67 2d 65 6e 64 69 61 6e 20 76 61 6c 75 65 big-endian value
1a766 2e 20 4f 6e 20 61 20 62 69 67 2d 65 6e 64 69 61 . On a big-endia
1a767 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 2c 20 n architecture,
1a768 69 74 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 it..** returns t
1a769 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f he value that wo
1a76a 75 6c 64 20 62 65 20 70 72 6f 64 75 63 65 64 20 uld be produced
1a76b 62 79 20 69 6e 74 65 70 72 65 74 69 6e 67 20 74 by intepreting t
1a76c 68 65 20 34 20 62 79 74 65 73 0d 0a 2a 2a 20 6f he 4 bytes..** o
1a76d 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 f the input valu
1a76e 65 20 61 73 20 61 20 6c 69 74 74 6c 65 2d 65 6e e as a little-en
1a76f 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 0d 0a 2a dian integer...*
1a770 2f 0d 0a 23 64 65 66 69 6e 65 20 42 59 54 45 53 /..#define BYTES
1a771 57 41 50 33 32 28 78 29 20 28 20 5c 0d 0a 20 20 WAP32(x) ( \..
1a772 20 20 28 28 28 78 29 26 30 78 30 30 30 30 30 30 (((x)&0x000000
1a773 46 46 29 3c 3c 32 34 29 20 2b 20 28 28 28 78 29 FF)<<24) + (((x)
1a774 26 30 78 30 30 30 30 46 46 30 30 29 3c 3c 38 29 &0x0000FF00)<<8)
1a775 20 20 5c 0d 0a 20 20 2b 20 28 28 28 78 29 26 30 \.. + (((x)&0
1a776 78 30 30 46 46 30 30 30 30 29 3e 3e 38 29 20 20 x00FF0000)>>8)
1a777 2b 20 28 28 28 78 29 26 30 78 46 46 30 30 30 30 + (((x)&0xFF0000
1a778 30 30 29 3e 3e 32 34 29 20 5c 0d 0a 29 0d 0a 0d 00)>>24) \..)...
1a779 0a 2f 2a 0d 0a 2a 2a 20 47 65 6e 65 72 61 74 65 ./*..** Generate
1a77a 20 6f 72 20 65 78 74 65 6e 64 20 61 6e 20 38 20 or extend an 8
1a77b 62 79 74 65 20 63 68 65 63 6b 73 75 6d 20 62 61 byte checksum ba
1a77c 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 20 sed on the data
1a77d 69 6e 20 0d 0a 2a 2a 20 61 72 72 61 79 20 61 42 in ..** array aB
1a77e 79 74 65 5b 5d 20 61 6e 64 20 74 68 65 20 69 6e yte[] and the in
1a77f 69 74 69 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 itial values of
1a780 61 49 6e 5b 30 5d 20 61 6e 64 20 61 49 6e 5b 31 aIn[0] and aIn[1
1a781 5d 20 28 6f 72 0d 0a 2a 2a 20 69 6e 69 74 69 61 ] (or..** initia
1a782 6c 20 76 61 6c 75 65 73 20 6f 66 20 30 20 61 6e l values of 0 an
1a783 64 20 30 20 69 66 20 61 49 6e 3d 3d 4e 55 4c 4c d 0 if aIn==NULL
1a784 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 )...**..** The c
1a785 68 65 63 6b 73 75 6d 20 69 73 20 77 72 69 74 74 hecksum is writt
1a786 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 61 4f 75 en back into aOu
1a787 74 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 t[] before retur
1a788 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 6e 42 ning...**..** nB
1a789 79 74 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f yte must be a po
1a78a 73 69 74 69 76 65 20 6d 75 6c 74 69 70 6c 65 20 sitive multiple
1a78b 6f 66 20 38 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 of 8...*/..stati
1a78c 63 20 76 6f 69 64 20 77 61 6c 43 68 65 63 6b 73 c void walChecks
1a78d 75 6d 42 79 74 65 73 28 0d 0a 20 20 69 6e 74 20 umBytes(.. int
1a78e 6e 61 74 69 76 65 43 6b 73 75 6d 2c 20 2f 2a 20 nativeCksum, /*
1a78f 54 72 75 65 20 66 6f 72 20 6e 61 74 69 76 65 20 True for native
1a790 62 79 74 65 2d 6f 72 64 65 72 2c 20 66 61 6c 73 byte-order, fals
1a791 65 20 66 6f 72 20 6e 6f 6e 2d 6e 61 74 69 76 65 e for non-native
1a792 20 2a 2f 0d 0a 20 20 75 38 20 2a 61 2c 20 20 20 */.. u8 *a,
1a793 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 /* Conte
1a794 6e 74 20 74 6f 20 62 65 20 63 68 65 63 6b 73 75 nt to be checksu
1a795 6d 6d 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e mmed */.. int n
1a796 42 79 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 42 Byte, /* B
1a797 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 ytes of content
1a798 69 6e 20 61 5b 5d 2e 20 20 4d 75 73 74 20 62 65 in a[]. Must be
1a799 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 a multiple of 8
1a79a 2e 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 75 33 . */.. const u3
1a79b 32 20 2a 61 49 6e 2c 20 20 2f 2a 20 49 6e 69 74 2 *aIn, /* Init
1a79c 69 61 6c 20 63 68 65 63 6b 73 75 6d 20 76 61 6c ial checksum val
1a79d 75 65 20 69 6e 70 75 74 20 2a 2f 0d 0a 20 20 75 ue input */.. u
1a79e 33 32 20 2a 61 4f 75 74 20 20 20 20 20 20 20 20 32 *aOut
1a79f 2f 2a 20 4f 55 54 3a 20 46 69 6e 61 6c 20 63 68 /* OUT: Final ch
1a7a0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 6f 75 74 ecksum value out
1a7a1 70 75 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 33 put */..){.. u3
1a7a2 32 20 73 31 2c 20 73 32 3b 0d 0a 20 20 75 33 32 2 s1, s2;.. u32
1a7a3 20 2a 61 44 61 74 61 20 3d 20 28 75 33 32 20 2a *aData = (u32 *
1a7a4 29 61 3b 0d 0a 20 20 75 33 32 20 2a 61 45 6e 64 )a;.. u32 *aEnd
1a7a5 20 3d 20 28 75 33 32 20 2a 29 26 61 5b 6e 42 79 = (u32 *)&a[nBy
1a7a6 74 65 5d 3b 0d 0a 0d 0a 20 20 69 66 28 20 61 49 te];.... if( aI
1a7a7 6e 20 29 7b 0d 0a 20 20 20 20 73 31 20 3d 20 61 n ){.. s1 = a
1a7a8 49 6e 5b 30 5d 3b 0d 0a 20 20 20 20 73 32 20 3d In[0];.. s2 =
1a7a9 20 61 49 6e 5b 31 5d 3b 0d 0a 20 20 7d 65 6c 73 aIn[1];.. }els
1a7aa 65 7b 0d 0a 20 20 20 20 73 31 20 3d 20 73 32 20 e{.. s1 = s2
1a7ab 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 = 0;.. }.... a
1a7ac 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 38 20 ssert( nByte>=8
1a7ad 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 6e );.. assert( (n
1a7ae 42 79 74 65 26 30 78 30 30 30 30 30 30 30 37 29 Byte&0x00000007)
1a7af 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 ==0 );.... if(
1a7b0 6e 61 74 69 76 65 43 6b 73 75 6d 20 29 7b 0d 0a nativeCksum ){..
1a7b1 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 do {..
1a7b2 73 31 20 2b 3d 20 2a 61 44 61 74 61 2b 2b 20 2b s1 += *aData++ +
1a7b3 20 73 32 3b 0d 0a 20 20 20 20 20 20 73 32 20 2b s2;.. s2 +
1a7b4 3d 20 2a 61 44 61 74 61 2b 2b 20 2b 20 73 31 3b = *aData++ + s1;
1a7b5 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 61 44 .. }while( aD
1a7b6 61 74 61 3c 61 45 6e 64 20 29 3b 0d 0a 20 20 7d ata<aEnd );.. }
1a7b7 65 6c 73 65 7b 0d 0a 20 20 20 20 64 6f 20 7b 0d else{.. do {.
1a7b8 0a 20 20 20 20 20 20 73 31 20 2b 3d 20 42 59 54 . s1 += BYT
1a7b9 45 53 57 41 50 33 32 28 61 44 61 74 61 5b 30 5d ESWAP32(aData[0]
1a7ba 29 20 2b 20 73 32 3b 0d 0a 20 20 20 20 20 20 73 ) + s2;.. s
1a7bb 32 20 2b 3d 20 42 59 54 45 53 57 41 50 33 32 28 2 += BYTESWAP32(
1a7bc 61 44 61 74 61 5b 31 5d 29 20 2b 20 73 31 3b 0d aData[1]) + s1;.
1a7bd 0a 20 20 20 20 20 20 61 44 61 74 61 20 2b 3d 20 . aData +=
1a7be 32 3b 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2;.. }while(
1a7bf 61 44 61 74 61 3c 61 45 6e 64 20 29 3b 0d 0a 20 aData<aEnd );..
1a7c0 20 7d 0d 0a 0d 0a 20 20 61 4f 75 74 5b 30 5d 20 }.... aOut[0]
1a7c1 3d 20 73 31 3b 0d 0a 20 20 61 4f 75 74 5b 31 5d = s1;.. aOut[1]
1a7c2 20 3d 20 73 32 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 = s2;..}....sta
1a7c3 74 69 63 20 76 6f 69 64 20 77 61 6c 53 68 6d 42 tic void walShmB
1a7c4 61 72 72 69 65 72 28 57 61 6c 20 2a 70 57 61 6c arrier(Wal *pWal
1a7c5 29 7b 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d 3e ){.. if( pWal->
1a7c6 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 57 exclusiveMode!=W
1a7c7 41 4c 5f 48 45 41 50 4d 45 4d 4f 52 59 5f 4d 4f AL_HEAPMEMORY_MO
1a7c8 44 45 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 DE ){.. sqlit
1a7c9 65 33 4f 73 53 68 6d 42 61 72 72 69 65 72 28 70 e3OsShmBarrier(p
1a7ca 57 61 6c 2d 3e 70 44 62 46 64 29 3b 0d 0a 20 20 Wal->pDbFd);..
1a7cb 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 }..}..../*..** W
1a7cc 72 69 74 65 20 74 68 65 20 68 65 61 64 65 72 20 rite the header
1a7cd 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 70 information in p
1a7ce 57 61 6c 2d 3e 68 64 72 20 69 6e 74 6f 20 74 68 Wal->hdr into th
1a7cf 65 20 77 61 6c 2d 69 6e 64 65 78 2e 0d 0a 2a 2a e wal-index...**
1a7d0 0d 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 ..** The checksu
1a7d1 6d 20 6f 6e 20 70 57 61 6c 2d 3e 68 64 72 20 69 m on pWal->hdr i
1a7d2 73 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 s updated before
1a7d3 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0d it is written..
1a7d4 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
1a7d5 20 77 61 6c 49 6e 64 65 78 57 72 69 74 65 48 64 walIndexWriteHd
1a7d6 72 28 57 61 6c 20 2a 70 57 61 6c 29 7b 0d 0a 20 r(Wal *pWal){..
1a7d7 20 76 6f 6c 61 74 69 6c 65 20 57 61 6c 49 6e 64 volatile WalInd
1a7d8 65 78 48 64 72 20 2a 61 48 64 72 20 3d 20 77 61 exHdr *aHdr = wa
1a7d9 6c 49 6e 64 65 78 48 64 72 28 70 57 61 6c 29 3b lIndexHdr(pWal);
1a7da 0d 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 .. const int nC
1a7db 6b 73 75 6d 20 3d 20 6f 66 66 73 65 74 6f 66 28 ksum = offsetof(
1a7dc 57 61 6c 49 6e 64 65 78 48 64 72 2c 20 61 43 6b WalIndexHdr, aCk
1a7dd 73 75 6d 29 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 sum);.... asser
1a7de 74 28 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f t( pWal->writeLo
1a7df 63 6b 20 29 3b 0d 0a 20 20 70 57 61 6c 2d 3e 68 ck );.. pWal->h
1a7e0 64 72 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0d 0a dr.isInit = 1;..
1a7e1 20 20 70 57 61 6c 2d 3e 68 64 72 2e 69 56 65 72 pWal->hdr.iVer
1a7e2 73 69 6f 6e 20 3d 20 57 41 4c 49 4e 44 45 58 5f sion = WALINDEX_
1a7e3 4d 41 58 5f 56 45 52 53 49 4f 4e 3b 0d 0a 20 20 MAX_VERSION;..
1a7e4 77 61 6c 43 68 65 63 6b 73 75 6d 42 79 74 65 73 walChecksumBytes
1a7e5 28 31 2c 20 28 75 38 2a 29 26 70 57 61 6c 2d 3e (1, (u8*)&pWal->
1a7e6 68 64 72 2c 20 6e 43 6b 73 75 6d 2c 20 30 2c 20 hdr, nCksum, 0,
1a7e7 70 57 61 6c 2d 3e 68 64 72 2e 61 43 6b 73 75 6d pWal->hdr.aCksum
1a7e8 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 28 76 6f );.. memcpy((vo
1a7e9 69 64 20 2a 29 26 61 48 64 72 5b 31 5d 2c 20 28 id *)&aHdr[1], (
1a7ea 76 6f 69 64 20 2a 29 26 70 57 61 6c 2d 3e 68 64 void *)&pWal->hd
1a7eb 72 2c 20 73 69 7a 65 6f 66 28 57 61 6c 49 6e 64 r, sizeof(WalInd
1a7ec 65 78 48 64 72 29 29 3b 0d 0a 20 20 77 61 6c 53 exHdr));.. walS
1a7ed 68 6d 42 61 72 72 69 65 72 28 70 57 61 6c 29 3b hmBarrier(pWal);
1a7ee 0d 0a 20 20 6d 65 6d 63 70 79 28 28 76 6f 69 64 .. memcpy((void
1a7ef 20 2a 29 26 61 48 64 72 5b 30 5d 2c 20 28 76 6f *)&aHdr[0], (vo
1a7f0 69 64 20 2a 29 26 70 57 61 6c 2d 3e 68 64 72 2c id *)&pWal->hdr,
1a7f1 20 73 69 7a 65 6f 66 28 57 61 6c 49 6e 64 65 78 sizeof(WalIndex
1a7f2 48 64 72 29 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d Hdr));..}..../*.
1a7f3 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1a7f4 6e 20 65 6e 63 6f 64 65 73 20 61 20 73 69 6e 67 n encodes a sing
1a7f5 6c 65 20 66 72 61 6d 65 20 68 65 61 64 65 72 20 le frame header
1a7f6 61 6e 64 20 77 72 69 74 65 73 20 69 74 20 74 6f and writes it to
1a7f7 20 61 20 62 75 66 66 65 72 0d 0a 2a 2a 20 73 75 a buffer..** su
1a7f8 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 pplied by the ca
1a7f9 6c 6c 65 72 2e 20 41 20 66 72 61 6d 65 2d 68 65 ller. A frame-he
1a7fa 61 64 65 72 20 69 73 20 6d 61 64 65 20 75 70 20 ader is made up
1a7fb 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 0d of a series of .
1a7fc 0a 2a 2a 20 34 2d 62 79 74 65 20 62 69 67 2d 65 .** 4-byte big-e
1a7fd 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 73 2c 20 ndian integers,
1a7fe 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d as follows:..**.
1a7ff 0a 2a 2a 20 20 20 20 20 30 3a 20 50 61 67 65 20 .** 0: Page
1a800 6e 75 6d 62 65 72 2e 0d 0a 2a 2a 20 20 20 20 20 number...**
1a801 34 3a 20 46 6f 72 20 63 6f 6d 6d 69 74 20 72 65 4: For commit re
1a802 63 6f 72 64 73 2c 20 74 68 65 20 73 69 7a 65 20 cords, the size
1a803 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
1a804 69 6d 61 67 65 20 69 6e 20 70 61 67 65 73 20 0d image in pages .
1a805 0a 2a 2a 20 20 20 20 20 20 20 20 61 66 74 65 72 .** after
1a806 20 74 68 65 20 63 6f 6d 6d 69 74 2e 20 46 6f 72 the commit. For
1a807 20 61 6c 6c 20 6f 74 68 65 72 20 72 65 63 6f 72 all other recor
1a808 64 73 2c 20 7a 65 72 6f 2e 0d 0a 2a 2a 20 20 20 ds, zero...**
1a809 20 20 38 3a 20 53 61 6c 74 2d 31 20 28 63 6f 70 8: Salt-1 (cop
1a80a 69 65 64 20 66 72 6f 6d 20 74 68 65 20 77 61 6c ied from the wal
1a80b 2d 68 65 61 64 65 72 29 0d 0a 2a 2a 20 20 20 20 -header)..**
1a80c 31 32 3a 20 53 61 6c 74 2d 32 20 28 63 6f 70 69 12: Salt-2 (copi
1a80d 65 64 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 2d ed from the wal-
1a80e 68 65 61 64 65 72 29 0d 0a 2a 2a 20 20 20 20 31 header)..** 1
1a80f 36 3a 20 43 68 65 63 6b 73 75 6d 2d 31 2e 0d 0a 6: Checksum-1...
1a810 2a 2a 20 20 20 20 32 30 3a 20 43 68 65 63 6b 73 ** 20: Checks
1a811 75 6d 2d 32 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 um-2...*/..stati
1a812 63 20 76 6f 69 64 20 77 61 6c 45 6e 63 6f 64 65 c void walEncode
1a813 46 72 61 6d 65 28 0d 0a 20 20 57 61 6c 20 2a 70 Frame(.. Wal *p
1a814 57 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 Wal,
1a815 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1a816 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 write-ahead log
1a817 20 2a 2f 0d 0a 20 20 75 33 32 20 69 50 61 67 65 */.. u32 iPage
1a818 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1a819 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
1a81a 73 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 se page number f
1a81b 6f 72 20 66 72 61 6d 65 20 2a 2f 0d 0a 20 20 75 or frame */.. u
1a81c 33 32 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 32 nTruncate,
1a81d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1a81e 2a 20 4e 65 77 20 64 62 20 73 69 7a 65 20 28 6f * New db size (o
1a81f 72 20 30 20 66 6f 72 20 6e 6f 6e 2d 63 6f 6d 6d r 0 for non-comm
1a820 69 74 20 66 72 61 6d 65 73 29 20 2a 2f 0d 0a 20 it frames) */..
1a821 20 75 38 20 2a 61 44 61 74 61 2c 20 20 20 20 20 u8 *aData,
1a822 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a823 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 /* Pointer to p
1a824 61 67 65 20 64 61 74 61 20 2a 2f 0d 0a 20 20 75 age data */.. u
1a825 38 20 2a 61 46 72 61 6d 65 20 20 20 20 20 20 20 8 *aFrame
1a826 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1a827 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 65 6e 63 * OUT: Write enc
1a828 6f 64 65 64 20 66 72 61 6d 65 20 68 65 72 65 20 oded frame here
1a829 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 6e 61 */..){.. int na
1a82a 74 69 76 65 43 6b 73 75 6d 3b 20 20 20 20 20 20 tiveCksum;
1a82b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 /* Tru
1a82c 65 20 66 6f 72 20 6e 61 74 69 76 65 20 62 79 74 e for native byt
1a82d 65 2d 6f 72 64 65 72 20 63 68 65 63 6b 73 75 6d e-order checksum
1a82e 73 20 2a 2f 0d 0a 20 20 75 33 32 20 2a 61 43 6b s */.. u32 *aCk
1a82f 73 75 6d 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e sum = pWal->hdr.
1a830 61 46 72 61 6d 65 43 6b 73 75 6d 3b 0d 0a 20 20 aFrameCksum;..
1a831 61 73 73 65 72 74 28 20 57 41 4c 5f 46 52 41 4d assert( WAL_FRAM
1a832 45 5f 48 44 52 53 49 5a 45 3d 3d 32 34 20 29 3b E_HDRSIZE==24 );
1a833 0d 0a 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 .. sqlite3Put4b
1a834 79 74 65 28 26 61 46 72 61 6d 65 5b 30 5d 2c 20 yte(&aFrame[0],
1a835 69 50 61 67 65 29 3b 0d 0a 20 20 73 71 6c 69 74 iPage);.. sqlit
1a836 65 33 50 75 74 34 62 79 74 65 28 26 61 46 72 61 e3Put4byte(&aFra
1a837 6d 65 5b 34 5d 2c 20 6e 54 72 75 6e 63 61 74 65 me[4], nTruncate
1a838 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 26 61 46 );.. memcpy(&aF
1a839 72 61 6d 65 5b 38 5d 2c 20 70 57 61 6c 2d 3e 68 rame[8], pWal->h
1a83a 64 72 2e 61 53 61 6c 74 2c 20 38 29 3b 0d 0a 0d dr.aSalt, 8);...
1a83b 0a 20 20 6e 61 74 69 76 65 43 6b 73 75 6d 20 3d . nativeCksum =
1a83c 20 28 70 57 61 6c 2d 3e 68 64 72 2e 62 69 67 45 (pWal->hdr.bigE
1a83d 6e 64 43 6b 73 75 6d 3d 3d 53 51 4c 49 54 45 5f ndCksum==SQLITE_
1a83e 42 49 47 45 4e 44 49 41 4e 29 3b 0d 0a 20 20 77 BIGENDIAN);.. w
1a83f 61 6c 43 68 65 63 6b 73 75 6d 42 79 74 65 73 28 alChecksumBytes(
1a840 6e 61 74 69 76 65 43 6b 73 75 6d 2c 20 61 46 72 nativeCksum, aFr
1a841 61 6d 65 2c 20 38 2c 20 61 43 6b 73 75 6d 2c 20 ame, 8, aCksum,
1a842 61 43 6b 73 75 6d 29 3b 0d 0a 20 20 77 61 6c 43 aCksum);.. walC
1a843 68 65 63 6b 73 75 6d 42 79 74 65 73 28 6e 61 74 hecksumBytes(nat
1a844 69 76 65 43 6b 73 75 6d 2c 20 61 44 61 74 61 2c iveCksum, aData,
1a845 20 70 57 61 6c 2d 3e 73 7a 50 61 67 65 2c 20 61 pWal->szPage, a
1a846 43 6b 73 75 6d 2c 20 61 43 6b 73 75 6d 29 3b 0d Cksum, aCksum);.
1a847 0a 0d 0a 20 20 73 71 6c 69 74 65 33 50 75 74 34 ... sqlite3Put4
1a848 62 79 74 65 28 26 61 46 72 61 6d 65 5b 31 36 5d byte(&aFrame[16]
1a849 2c 20 61 43 6b 73 75 6d 5b 30 5d 29 3b 0d 0a 20 , aCksum[0]);..
1a84a 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 sqlite3Put4byte
1a84b 28 26 61 46 72 61 6d 65 5b 32 30 5d 2c 20 61 43 (&aFrame[20], aC
1a84c 6b 73 75 6d 5b 31 5d 29 3b 0d 0a 7d 0d 0a 0d 0a ksum[1]);..}....
1a84d 2f 2a 0d 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 /*..** Check to
1a84e 73 65 65 20 69 66 20 74 68 65 20 66 72 61 6d 65 see if the frame
1a84f 20 77 69 74 68 20 68 65 61 64 65 72 20 69 6e 20 with header in
1a850 61 46 72 61 6d 65 5b 5d 20 61 6e 64 20 63 6f 6e aFrame[] and con
1a851 74 65 6e 74 0d 0a 2a 2a 20 69 6e 20 61 44 61 74 tent..** in aDat
1a852 61 5b 5d 20 69 73 20 76 61 6c 69 64 2e 20 20 49 a[] is valid. I
1a853 66 20 69 74 20 69 73 20 61 20 76 61 6c 69 64 20 f it is a valid
1a854 66 72 61 6d 65 2c 20 66 69 6c 6c 20 2a 70 69 50 frame, fill *piP
1a855 61 67 65 20 61 6e 64 0d 0a 2a 2a 20 2a 70 6e 54 age and..** *pnT
1a856 72 75 6e 63 61 74 65 20 61 6e 64 20 72 65 74 75 runcate and retu
1a857 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e rn true. Return
1a858 20 69 66 20 74 68 65 20 66 72 61 6d 65 20 69 73 if the frame is
1a859 20 6e 6f 74 20 76 61 6c 69 64 2e 0d 0a 2a 2f 0d not valid...*/.
1a85a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 44 .static int walD
1a85b 65 63 6f 64 65 46 72 61 6d 65 28 0d 0a 20 20 57 ecodeFrame(.. W
1a85c 61 6c 20 2a 70 57 61 6c 2c 20 20 20 20 20 20 20 al *pWal,
1a85d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1a85e 2a 20 54 68 65 20 77 72 69 74 65 2d 61 68 65 61 * The write-ahea
1a85f 64 20 6c 6f 67 20 2a 2f 0d 0a 20 20 75 33 32 20 d log */.. u32
1a860 2a 70 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 *piPage,
1a861 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
1a862 55 54 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 UT: Database pag
1a863 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 72 61 e number for fra
1a864 6d 65 20 2a 2f 0d 0a 20 20 75 33 32 20 2a 70 6e me */.. u32 *pn
1a865 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 Truncate,
1a866 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
1a867 20 4e 65 77 20 64 62 20 73 69 7a 65 20 28 6f 72 New db size (or
1a868 20 30 20 69 66 20 6e 6f 74 20 63 6f 6d 6d 69 74 0 if not commit
1a869 29 20 2a 2f 0d 0a 20 20 75 38 20 2a 61 44 61 74 ) */.. u8 *aDat
1a86a 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 a,
1a86b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
1a86c 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 er to page data
1a86d 28 66 6f 72 20 63 68 65 63 6b 73 75 6d 29 20 2a (for checksum) *
1a86e 2f 0d 0a 20 20 75 38 20 2a 61 46 72 61 6d 65 20 /.. u8 *aFrame
1a86f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a870 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 64 61 /* Frame da
1a871 74 61 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 ta */..){.. int
1a872 20 6e 61 74 69 76 65 43 6b 73 75 6d 3b 20 20 20 nativeCksum;
1a873 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a874 54 72 75 65 20 66 6f 72 20 6e 61 74 69 76 65 20 True for native
1a875 62 79 74 65 2d 6f 72 64 65 72 20 63 68 65 63 6b byte-order check
1a876 73 75 6d 73 20 2a 2f 0d 0a 20 20 75 33 32 20 2a sums */.. u32 *
1a877 61 43 6b 73 75 6d 20 3d 20 70 57 61 6c 2d 3e 68 aCksum = pWal->h
1a878 64 72 2e 61 46 72 61 6d 65 43 6b 73 75 6d 3b 0d dr.aFrameCksum;.
1a879 0a 20 20 75 33 32 20 70 67 6e 6f 3b 20 20 20 20 . u32 pgno;
1a87a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a87b 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 /* Page numbe
1a87c 72 20 6f 66 20 74 68 65 20 66 72 61 6d 65 20 2a r of the frame *
1a87d 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 57 41 4c /.. assert( WAL
1a87e 5f 46 52 41 4d 45 5f 48 44 52 53 49 5a 45 3d 3d _FRAME_HDRSIZE==
1a87f 32 34 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 20 24 );.... /* A
1a880 66 72 61 6d 65 20 69 73 20 6f 6e 6c 79 20 76 61 frame is only va
1a881 6c 69 64 20 69 66 20 74 68 65 20 73 61 6c 74 20 lid if the salt
1a882 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 66 72 values in the fr
1a883 61 6d 65 2d 68 65 61 64 65 72 0d 0a 20 20 2a 2a ame-header.. **
1a884 20 6d 61 74 63 68 20 74 68 65 20 73 61 6c 74 20 match the salt
1a885 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 77 61 values in the wa
1a886 6c 2d 68 65 61 64 65 72 2e 20 0d 0a 20 20 2a 2f l-header. .. */
1a887 0d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 .. if( memcmp(&
1a888 70 57 61 6c 2d 3e 68 64 72 2e 61 53 61 6c 74 2c pWal->hdr.aSalt,
1a889 20 26 61 46 72 61 6d 65 5b 38 5d 2c 20 38 29 21 &aFrame[8], 8)!
1a88a 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 =0 ){.. retur
1a88b 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f n 0;.. }.... /
1a88c 2a 20 41 20 66 72 61 6d 65 20 69 73 20 6f 6e 6c * A frame is onl
1a88d 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 70 y valid if the p
1a88e 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 63 72 age number is cr
1a88f 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e eater than zero.
1a890 0d 0a 20 20 2a 2f 0d 0a 20 20 70 67 6e 6f 20 3d .. */.. pgno =
1a891 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 sqlite3Get4byte
1a892 28 26 61 46 72 61 6d 65 5b 30 5d 29 3b 0d 0a 20 (&aFrame[0]);..
1a893 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0d if( pgno==0 ){.
1a894 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a . return 0;..
1a895 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 41 20 66 72 }.... /* A fr
1a896 61 6d 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 ame is only vali
1a897 64 20 69 66 20 61 20 63 68 65 63 6b 73 75 6d 20 d if a checksum
1a898 6f 66 20 74 68 65 20 57 41 4c 20 68 65 61 64 65 of the WAL heade
1a899 72 2c 0d 0a 20 20 2a 2a 20 61 6c 6c 20 70 72 69 r,.. ** all pri
1a89a 6f 72 20 66 72 61 6d 73 2c 20 74 68 65 20 66 69 or frams, the fi
1a89b 72 73 74 20 31 36 20 62 79 74 65 73 20 6f 66 20 rst 16 bytes of
1a89c 74 68 69 73 20 66 72 61 6d 65 2d 68 65 61 64 65 this frame-heade
1a89d 72 2c 20 0d 0a 20 20 2a 2a 20 61 6e 64 20 74 68 r, .. ** and th
1a89e 65 20 66 72 61 6d 65 2d 64 61 74 61 20 6d 61 74 e frame-data mat
1a89f 63 68 65 73 20 74 68 65 20 63 68 65 63 6b 73 75 ches the checksu
1a8a0 6d 20 69 6e 20 74 68 65 20 6c 61 73 74 20 38 20 m in the last 8
1a8a1 0d 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 .. ** bytes of
1a8a2 74 68 69 73 20 66 72 61 6d 65 2d 68 65 61 64 65 this frame-heade
1a8a3 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 6e 61 74 69 r... */.. nati
1a8a4 76 65 43 6b 73 75 6d 20 3d 20 28 70 57 61 6c 2d veCksum = (pWal-
1a8a5 3e 68 64 72 2e 62 69 67 45 6e 64 43 6b 73 75 6d >hdr.bigEndCksum
1a8a6 3d 3d 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 ==SQLITE_BIGENDI
1a8a7 41 4e 29 3b 0d 0a 20 20 77 61 6c 43 68 65 63 6b AN);.. walCheck
1a8a8 73 75 6d 42 79 74 65 73 28 6e 61 74 69 76 65 43 sumBytes(nativeC
1a8a9 6b 73 75 6d 2c 20 61 46 72 61 6d 65 2c 20 38 2c ksum, aFrame, 8,
1a8aa 20 61 43 6b 73 75 6d 2c 20 61 43 6b 73 75 6d 29 aCksum, aCksum)
1a8ab 3b 0d 0a 20 20 77 61 6c 43 68 65 63 6b 73 75 6d ;.. walChecksum
1a8ac 42 79 74 65 73 28 6e 61 74 69 76 65 43 6b 73 75 Bytes(nativeCksu
1a8ad 6d 2c 20 61 44 61 74 61 2c 20 70 57 61 6c 2d 3e m, aData, pWal->
1a8ae 73 7a 50 61 67 65 2c 20 61 43 6b 73 75 6d 2c 20 szPage, aCksum,
1a8af 61 43 6b 73 75 6d 29 3b 0d 0a 20 20 69 66 28 20 aCksum);.. if(
1a8b0 61 43 6b 73 75 6d 5b 30 5d 21 3d 73 71 6c 69 74 aCksum[0]!=sqlit
1a8b1 65 33 47 65 74 34 62 79 74 65 28 26 61 46 72 61 e3Get4byte(&aFra
1a8b2 6d 65 5b 31 36 5d 29 20 0d 0a 20 20 20 7c 7c 20 me[16]) .. ||
1a8b3 61 43 6b 73 75 6d 5b 31 5d 21 3d 73 71 6c 69 74 aCksum[1]!=sqlit
1a8b4 65 33 47 65 74 34 62 79 74 65 28 26 61 46 72 61 e3Get4byte(&aFra
1a8b5 6d 65 5b 32 30 5d 29 20 0d 0a 20 20 29 7b 0d 0a me[20]) .. ){..
1a8b6 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 /* Checksum
1a8b7 66 61 69 6c 65 64 2e 20 2a 2f 0d 0a 20 20 20 20 failed. */..
1a8b8 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a return 0;.. }..
1a8b9 0d 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 .. /* If we rea
1a8ba 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 ch this point, t
1a8bb 68 65 20 66 72 61 6d 65 20 69 73 20 76 61 6c 69 he frame is vali
1a8bc 64 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 70 d. Return the p
1a8bd 61 67 65 20 6e 75 6d 62 65 72 0d 0a 20 20 2a 2a age number.. **
1a8be 20 61 6e 64 20 74 68 65 20 6e 65 77 20 64 61 74 and the new dat
1a8bf 61 62 61 73 65 20 73 69 7a 65 2e 0d 0a 20 20 2a abase size... *
1a8c0 2f 0d 0a 20 20 2a 70 69 50 61 67 65 20 3d 20 70 /.. *piPage = p
1a8c1 67 6e 6f 3b 0d 0a 20 20 2a 70 6e 54 72 75 6e 63 gno;.. *pnTrunc
1a8c2 61 74 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 ate = sqlite3Get
1a8c3 34 62 79 74 65 28 26 61 46 72 61 6d 65 5b 34 5d 4byte(&aFrame[4]
1a8c4 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0d );.. return 1;.
1a8c5 0a 7d 0d 0a 0d 0a 0d 0a 23 69 66 20 64 65 66 69 .}......#if defi
1a8c6 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 ned(SQLITE_TEST)
1a8c7 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
1a8c8 54 45 5f 44 45 42 55 47 29 0d 0a 2f 2a 0d 0a 2a TE_DEBUG)../*..*
1a8c9 2a 20 4e 61 6d 65 73 20 6f 66 20 6c 6f 63 6b 73 * Names of locks
1a8ca 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 . This routine
1a8cb 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 is used to provi
1a8cc 64 65 20 64 65 62 75 67 67 69 6e 67 20 6f 75 74 de debugging out
1a8cd 70 75 74 20 61 6e 64 20 69 73 20 6e 6f 74 0d 0a put and is not..
1a8ce 2a 2a 20 61 20 70 61 72 74 20 6f 66 20 61 6e 20 ** a part of an
1a8cf 6f 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0d ordinary build..
1a8d0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 .*/..static cons
1a8d1 74 20 63 68 61 72 20 2a 77 61 6c 4c 6f 63 6b 4e t char *walLockN
1a8d2 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 49 64 78 29 ame(int lockIdx)
1a8d3 7b 0d 0a 20 20 69 66 28 20 6c 6f 63 6b 49 64 78 {.. if( lockIdx
1a8d4 3d 3d 57 41 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b ==WAL_WRITE_LOCK
1a8d5 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
1a8d6 22 57 52 49 54 45 2d 4c 4f 43 4b 22 3b 0d 0a 20 "WRITE-LOCK";..
1a8d7 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 49 }else if( lockI
1a8d8 64 78 3d 3d 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 dx==WAL_CKPT_LOC
1a8d9 4b 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e K ){.. return
1a8da 20 22 43 4b 50 54 2d 4c 4f 43 4b 22 3b 0d 0a 20 "CKPT-LOCK";..
1a8db 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 49 }else if( lockI
1a8dc 64 78 3d 3d 57 41 4c 5f 52 45 43 4f 56 45 52 5f dx==WAL_RECOVER_
1a8dd 4c 4f 43 4b 20 29 7b 0d 0a 20 20 20 20 72 65 74 LOCK ){.. ret
1a8de 75 72 6e 20 22 52 45 43 4f 56 45 52 2d 4c 4f 43 urn "RECOVER-LOC
1a8df 4b 22 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 K";.. }else{..
1a8e0 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a static char z
1a8e1 4e 61 6d 65 5b 31 35 5d 3b 0d 0a 20 20 20 20 73 Name[15];.. s
1a8e2 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
1a8e3 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a sizeof(zName), z
1a8e4 4e 61 6d 65 2c 20 22 52 45 41 44 2d 4c 4f 43 4b Name, "READ-LOCK
1a8e5 5b 25 64 5d 22 2c 0d 0a 20 20 20 20 20 20 20 20 [%d]",..
1a8e6 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 loc
1a8e7 6b 49 64 78 2d 57 41 4c 5f 52 45 41 44 5f 4c 4f kIdx-WAL_READ_LO
1a8e8 43 4b 28 30 29 29 3b 0d 0a 20 20 20 20 72 65 74 CK(0));.. ret
1a8e9 75 72 6e 20 7a 4e 61 6d 65 3b 0d 0a 20 20 7d 0d urn zName;.. }.
1a8ea 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 64 65 66 .}..#endif /*def
1a8eb 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 ined(SQLITE_TEST
1a8ec 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c ) || defined(SQL
1a8ed 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0d 0a 20 ITE_DEBUG) */..
1a8ee 20 20 20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 ..../*..** Se
1a8ef 74 20 6f 72 20 72 65 6c 65 61 73 65 20 6c 6f 63 t or release loc
1a8f0 6b 73 20 6f 6e 20 74 68 65 20 57 41 4c 2e 20 20 ks on the WAL.
1a8f1 4c 6f 63 6b 73 20 61 72 65 20 65 69 74 68 65 72 Locks are either
1a8f2 20 73 68 61 72 65 64 20 6f 72 20 65 78 63 6c 75 shared or exclu
1a8f3 73 69 76 65 2e 0d 0a 2a 2a 20 41 20 6c 6f 63 6b sive...** A lock
1a8f4 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 cannot be moved
1a8f5 20 64 69 72 65 63 74 6c 79 20 62 65 74 77 65 65 directly betwee
1a8f6 6e 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 n shared and exc
1a8f7 6c 75 73 69 76 65 20 2d 20 69 74 20 6d 75 73 74 lusive - it must
1a8f8 20 67 6f 0d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 go..** through
1a8f9 74 68 65 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 the unlocked sta
1a8fa 74 65 20 66 69 72 73 74 2e 0d 0a 2a 2a 0d 0a 2a te first...**..*
1a8fb 2a 20 49 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 * In locking_mod
1a8fc 65 3d 45 58 43 4c 55 53 49 56 45 2c 20 61 6c 6c e=EXCLUSIVE, all
1a8fd 20 6f 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e of these routin
1a8fe 65 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 es become no-ops
1a8ff 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
1a900 74 20 77 61 6c 4c 6f 63 6b 53 68 61 72 65 64 28 t walLockShared(
1a901 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e 74 20 6c Wal *pWal, int l
1a902 6f 63 6b 49 64 78 29 7b 0d 0a 20 20 69 6e 74 20 ockIdx){.. int
1a903 72 63 3b 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d rc;.. if( pWal-
1a904 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 >exclusiveMode )
1a905 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1a906 4b 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 K;.. rc = sqlit
1a907 65 33 4f 73 53 68 6d 4c 6f 63 6b 28 70 57 61 6c e3OsShmLock(pWal
1a908 2d 3e 70 44 62 46 64 2c 20 6c 6f 63 6b 49 64 78 ->pDbFd, lockIdx
1a909 2c 20 31 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 , 1,..
1a90a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 SQ
1a90b 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 LITE_SHM_LOCK |
1a90c 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 SQLITE_SHM_SHARE
1a90d 44 29 3b 0d 0a 20 20 57 41 4c 54 52 41 43 45 28 D);.. WALTRACE(
1a90e 28 22 57 41 4c 25 70 3a 20 61 63 71 75 69 72 65 ("WAL%p: acquire
1a90f 20 53 48 41 52 45 44 2d 25 73 20 25 73 5c 6e 22 SHARED-%s %s\n"
1a910 2c 20 70 57 61 6c 2c 0d 0a 20 20 20 20 20 20 20 , pWal,..
1a911 20 20 20 20 20 77 61 6c 4c 6f 63 6b 4e 61 6d 65 walLockName
1a912 28 6c 6f 63 6b 49 64 78 29 2c 20 72 63 20 3f 20 (lockIdx), rc ?
1a913 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 "failed" : "ok")
1a914 29 3b 0d 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 );.. VVA_ONLY(
1a915 70 57 61 6c 2d 3e 6c 6f 63 6b 45 72 72 6f 72 20 pWal->lockError
1a916 3d 20 28 75 38 29 28 72 63 21 3d 53 51 4c 49 54 = (u8)(rc!=SQLIT
1a917 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 E_OK && rc!=SQLI
1a918 54 45 5f 42 55 53 59 29 3b 20 29 0d 0a 20 20 72 TE_BUSY); ).. r
1a919 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 73 74 eturn rc;..}..st
1a91a 61 74 69 63 20 76 6f 69 64 20 77 61 6c 55 6e 6c atic void walUnl
1a91b 6f 63 6b 53 68 61 72 65 64 28 57 61 6c 20 2a 70 ockShared(Wal *p
1a91c 57 61 6c 2c 20 69 6e 74 20 6c 6f 63 6b 49 64 78 Wal, int lockIdx
1a91d 29 7b 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d 3e ){.. if( pWal->
1a91e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 exclusiveMode )
1a91f 72 65 74 75 72 6e 3b 0d 0a 20 20 28 76 6f 69 64 return;.. (void
1a920 29 73 71 6c 69 74 65 33 4f 73 53 68 6d 4c 6f 63 )sqlite3OsShmLoc
1a921 6b 28 70 57 61 6c 2d 3e 70 44 62 46 64 2c 20 6c k(pWal->pDbFd, l
1a922 6f 63 6b 49 64 78 2c 20 31 2c 0d 0a 20 20 20 20 ockIdx, 1,..
1a923 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a924 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f SQLITE_SHM_
1a925 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f UNLOCK | SQLITE_
1a926 53 48 4d 5f 53 48 41 52 45 44 29 3b 0d 0a 20 20 SHM_SHARED);..
1a927 57 41 4c 54 52 41 43 45 28 28 22 57 41 4c 25 70 WALTRACE(("WAL%p
1a928 3a 20 72 65 6c 65 61 73 65 20 53 48 41 52 45 44 : release SHARED
1a929 2d 25 73 5c 6e 22 2c 20 70 57 61 6c 2c 20 77 61 -%s\n", pWal, wa
1a92a 6c 4c 6f 63 6b 4e 61 6d 65 28 6c 6f 63 6b 49 64 lLockName(lockId
1a92b 78 29 29 29 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 x)));..}..static
1a92c 20 69 6e 74 20 77 61 6c 4c 6f 63 6b 45 78 63 6c int walLockExcl
1a92d 75 73 69 76 65 28 57 61 6c 20 2a 70 57 61 6c 2c usive(Wal *pWal,
1a92e 20 69 6e 74 20 6c 6f 63 6b 49 64 78 2c 20 69 6e int lockIdx, in
1a92f 74 20 6e 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b t n){.. int rc;
1a930 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d 3e 65 78 .. if( pWal->ex
1a931 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 72 65 clusiveMode ) re
1a932 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
1a933 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f . rc = sqlite3O
1a934 73 53 68 6d 4c 6f 63 6b 28 70 57 61 6c 2d 3e 70 sShmLock(pWal->p
1a935 44 62 46 64 2c 20 6c 6f 63 6b 49 64 78 2c 20 6e DbFd, lockIdx, n
1a936 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
1a937 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 SQLIT
1a938 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c E_SHM_LOCK | SQL
1a939 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 ITE_SHM_EXCLUSIV
1a93a 45 29 3b 0d 0a 20 20 57 41 4c 54 52 41 43 45 28 E);.. WALTRACE(
1a93b 28 22 57 41 4c 25 70 3a 20 61 63 71 75 69 72 65 ("WAL%p: acquire
1a93c 20 45 58 43 4c 55 53 49 56 45 2d 25 73 20 63 6e EXCLUSIVE-%s cn
1a93d 74 3d 25 64 20 25 73 5c 6e 22 2c 20 70 57 61 6c t=%d %s\n", pWal
1a93e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 ,.. w
1a93f 61 6c 4c 6f 63 6b 4e 61 6d 65 28 6c 6f 63 6b 49 alLockName(lockI
1a940 64 78 29 2c 20 6e 2c 20 72 63 20 3f 20 22 66 61 dx), n, rc ? "fa
1a941 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0d iled" : "ok"));.
1a942 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 57 61 . VVA_ONLY( pWa
1a943 6c 2d 3e 6c 6f 63 6b 45 72 72 6f 72 20 3d 20 28 l->lockError = (
1a944 75 38 29 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f u8)(rc!=SQLITE_O
1a945 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f K && rc!=SQLITE_
1a946 42 55 53 59 29 3b 20 29 0d 0a 20 20 72 65 74 75 BUSY); ).. retu
1a947 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 73 74 61 74 69 rn rc;..}..stati
1a948 63 20 76 6f 69 64 20 77 61 6c 55 6e 6c 6f 63 6b c void walUnlock
1a949 45 78 63 6c 75 73 69 76 65 28 57 61 6c 20 2a 70 Exclusive(Wal *p
1a94a 57 61 6c 2c 20 69 6e 74 20 6c 6f 63 6b 49 64 78 Wal, int lockIdx
1a94b 2c 20 69 6e 74 20 6e 29 7b 0d 0a 20 20 69 66 28 , int n){.. if(
1a94c 20 70 57 61 6c 2d 3e 65 78 63 6c 75 73 69 76 65 pWal->exclusive
1a94d 4d 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0d 0a Mode ) return;..
1a94e 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 4f (void)sqlite3O
1a94f 73 53 68 6d 4c 6f 63 6b 28 70 57 61 6c 2d 3e 70 sShmLock(pWal->p
1a950 44 62 46 64 2c 20 6c 6f 63 6b 49 64 78 2c 20 6e DbFd, lockIdx, n
1a951 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
1a952 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 SQLI
1a953 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 TE_SHM_UNLOCK |
1a954 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 SQLITE_SHM_EXCLU
1a955 53 49 56 45 29 3b 0d 0a 20 20 57 41 4c 54 52 41 SIVE);.. WALTRA
1a956 43 45 28 28 22 57 41 4c 25 70 3a 20 72 65 6c 65 CE(("WAL%p: rele
1a957 61 73 65 20 45 58 43 4c 55 53 49 56 45 2d 25 73 ase EXCLUSIVE-%s
1a958 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 70 57 61 6c cnt=%d\n", pWal
1a959 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
1a95a 77 61 6c 4c 6f 63 6b 4e 61 6d 65 28 6c 6f 63 6b walLockName(lock
1a95b 49 64 78 29 2c 20 6e 29 29 3b 0d 0a 7d 0d 0a 0d Idx), n));..}...
1a95c 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 ./*..** Compute
1a95d 61 20 68 61 73 68 20 6f 6e 20 61 20 70 61 67 65 a hash on a page
1a95e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 72 65 number. The re
1a95f 73 75 6c 74 69 6e 67 20 68 61 73 68 20 76 61 6c sulting hash val
1a960 75 65 20 6d 75 73 74 20 6c 61 6e 64 0d 0a 2a 2a ue must land..**
1a961 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 28 between 0 and (
1a962 48 41 53 48 54 41 42 4c 45 5f 4e 53 4c 4f 54 2d HASHTABLE_NSLOT-
1a963 31 29 2e 20 20 54 68 65 20 77 61 6c 48 61 73 68 1). The walHash
1a964 4e 65 78 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 Next() function
1a965 61 64 76 61 6e 63 65 73 0d 0a 2a 2a 20 74 68 65 advances..** the
1a966 20 68 61 73 68 20 74 6f 20 74 68 65 20 6e 65 78 hash to the nex
1a967 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 65 t value in the e
1a968 76 65 6e 74 20 6f 66 20 61 20 63 6f 6c 6c 69 73 vent of a collis
1a969 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ion...*/..static
1a96a 20 69 6e 74 20 77 61 6c 48 61 73 68 28 75 33 32 int walHash(u32
1a96b 20 69 50 61 67 65 29 7b 0d 0a 20 20 61 73 73 65 iPage){.. asse
1a96c 72 74 28 20 69 50 61 67 65 3e 30 20 29 3b 0d 0a rt( iPage>0 );..
1a96d 20 20 61 73 73 65 72 74 28 20 28 48 41 53 48 54 assert( (HASHT
1a96e 41 42 4c 45 5f 4e 53 4c 4f 54 20 26 20 28 48 41 ABLE_NSLOT & (HA
1a96f 53 48 54 41 42 4c 45 5f 4e 53 4c 4f 54 2d 31 29 SHTABLE_NSLOT-1)
1a970 29 3d 3d 30 20 29 3b 0d 0a 20 20 72 65 74 75 72 )==0 );.. retur
1a971 6e 20 28 69 50 61 67 65 2a 48 41 53 48 54 41 42 n (iPage*HASHTAB
1a972 4c 45 5f 48 41 53 48 5f 31 29 20 26 20 28 48 41 LE_HASH_1) & (HA
1a973 53 48 54 41 42 4c 45 5f 4e 53 4c 4f 54 2d 31 29 SHTABLE_NSLOT-1)
1a974 3b 0d 0a 7d 0d 0a 73 74 61 74 69 63 20 69 6e 74 ;..}..static int
1a975 20 77 61 6c 4e 65 78 74 48 61 73 68 28 69 6e 74 walNextHash(int
1a976 20 69 50 72 69 6f 72 48 61 73 68 29 7b 0d 0a 20 iPriorHash){..
1a977 20 72 65 74 75 72 6e 20 28 69 50 72 69 6f 72 48 return (iPriorH
1a978 61 73 68 2b 31 29 26 28 48 41 53 48 54 41 42 4c ash+1)&(HASHTABL
1a979 45 5f 4e 53 4c 4f 54 2d 31 29 3b 0d 0a 7d 0d 0a E_NSLOT-1);..}..
1a97a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 52 65 74 75 72 6e ../* ..** Return
1a97b 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 pointers to the
1a97c 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 hash table and
1a97d 70 61 67 65 20 6e 75 6d 62 65 72 20 61 72 72 61 page number arra
1a97e 79 20 73 74 6f 72 65 64 20 6f 6e 0d 0a 2a 2a 20 y stored on..**
1a97f 70 61 67 65 20 69 48 61 73 68 20 6f 66 20 74 68 page iHash of th
1a980 65 20 77 61 6c 2d 69 6e 64 65 78 2e 20 54 68 65 e wal-index. The
1a981 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 62 72 wal-index is br
1a982 6f 6b 65 6e 20 69 6e 74 6f 20 33 32 4b 42 20 70 oken into 32KB p
1a983 61 67 65 73 0d 0a 2a 2a 20 6e 75 6d 62 65 72 65 ages..** numbere
1a984 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 d starting from
1a985 30 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 74 20 6f 0...**..** Set o
1a986 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a utput variable *
1a987 70 61 48 61 73 68 20 74 6f 20 70 6f 69 6e 74 20 paHash to point
1a988 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 to the start of
1a989 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0d 0a the hash table..
1a98a 2a 2a 20 69 6e 20 74 68 65 20 77 61 6c 2d 69 6e ** in the wal-in
1a98b 64 65 78 20 66 69 6c 65 2e 20 53 65 74 20 2a 70 dex file. Set *p
1a98c 69 5a 65 72 6f 20 74 6f 20 6f 6e 65 20 6c 65 73 iZero to one les
1a98d 73 20 74 68 61 6e 20 74 68 65 20 66 72 61 6d 65 s than the frame
1a98e 20 0d 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 ..** number of
1a98f 74 68 65 20 66 69 72 73 74 20 66 72 61 6d 65 20 the first frame
1a990 69 6e 64 65 78 65 64 20 62 79 20 74 68 69 73 20 indexed by this
1a991 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 61 hash table. If a
1a992 0d 0a 2a 2a 20 73 6c 6f 74 20 69 6e 20 74 68 65 ..** slot in the
1a993 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 73 hash table is s
1a994 65 74 20 74 6f 20 4e 2c 20 69 74 20 72 65 66 65 et to N, it refe
1a995 72 73 20 74 6f 20 66 72 61 6d 65 20 6e 75 6d 62 rs to frame numb
1a996 65 72 20 0d 0a 2a 2a 20 28 2a 70 69 5a 65 72 6f er ..** (*piZero
1a997 2b 4e 29 20 69 6e 20 74 68 65 20 6c 6f 67 2e 0d +N) in the log..
1a998 0a 2a 2a 0d 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c .**..** Finally,
1a999 20 73 65 74 20 2a 70 61 50 67 6e 6f 20 73 6f 20 set *paPgno so
1a99a 74 68 61 74 20 2a 70 61 50 67 6e 6f 5b 31 5d 20 that *paPgno[1]
1a99b 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 is the page numb
1a99c 65 72 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 66 69 er of the..** fi
1a99d 72 73 74 20 66 72 61 6d 65 20 69 6e 64 65 78 65 rst frame indexe
1a99e 64 20 62 79 20 74 68 65 20 68 61 73 68 20 74 61 d by the hash ta
1a99f 62 6c 65 2c 20 66 72 61 6d 65 20 28 2a 70 69 5a ble, frame (*piZ
1a9a0 65 72 6f 2b 31 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 ero+1)...*/..sta
1a9a1 74 69 63 20 69 6e 74 20 77 61 6c 48 61 73 68 47 tic int walHashG
1a9a2 65 74 28 0d 0a 20 20 57 61 6c 20 2a 70 57 61 6c et(.. Wal *pWal
1a9a3 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1a9a4 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 68 61 /* WAL ha
1a9a5 6e 64 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 ndle */.. int i
1a9a6 48 61 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 Hash,
1a9a7 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
1a9a8 6e 64 20 74 68 65 20 69 48 61 73 68 27 74 68 20 nd the iHash'th
1a9a9 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 76 6f 6c 61 table */.. vola
1a9aa 74 69 6c 65 20 68 74 5f 73 6c 6f 74 20 2a 2a 70 tile ht_slot **p
1a9ab 61 48 61 73 68 2c 20 20 20 20 20 20 2f 2a 20 4f aHash, /* O
1a9ac 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 68 UT: Pointer to h
1a9ad 61 73 68 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 ash index */..
1a9ae 76 6f 6c 61 74 69 6c 65 20 75 33 32 20 2a 2a 70 volatile u32 **p
1a9af 61 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 aPgno,
1a9b0 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 /* OUT: Pointer
1a9b1 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 to page number a
1a9b2 72 72 61 79 20 2a 2f 0d 0a 20 20 75 33 32 20 2a rray */.. u32 *
1a9b3 70 69 5a 65 72 6f 20 20 20 20 20 20 20 20 20 20 piZero
1a9b4 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 /* OU
1a9b5 54 3a 20 46 72 61 6d 65 20 61 73 73 6f 63 69 61 T: Frame associa
1a9b6 74 65 64 20 77 69 74 68 20 2a 70 61 50 67 6e 6f ted with *paPgno
1a9b7 5b 30 5d 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e [0] */..){.. in
1a9b8 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 t rc;
1a9b9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a9ba 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d Return code */.
1a9bb 0a 20 20 76 6f 6c 61 74 69 6c 65 20 75 33 32 20 . volatile u32
1a9bc 2a 61 50 67 6e 6f 3b 0d 0a 0d 0a 20 20 72 63 20 *aPgno;.... rc
1a9bd 3d 20 77 61 6c 49 6e 64 65 78 50 61 67 65 28 70 = walIndexPage(p
1a9be 57 61 6c 2c 20 69 48 61 73 68 2c 20 26 61 50 67 Wal, iHash, &aPg
1a9bf 6e 6f 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 no);.. assert(
1a9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c rc==SQLITE_OK ||
1a9c1 20 69 48 61 73 68 3e 30 20 29 3b 0d 0a 0d 0a 20 iHash>0 );....
1a9c2 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
1a9c3 4f 4b 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 69 OK ){.. u32 i
1a9c4 5a 65 72 6f 3b 0d 0a 20 20 20 20 76 6f 6c 61 74 Zero;.. volat
1a9c5 69 6c 65 20 68 74 5f 73 6c 6f 74 20 2a 61 48 61 ile ht_slot *aHa
1a9c6 73 68 3b 0d 0a 0d 0a 20 20 20 20 61 48 61 73 68 sh;.... aHash
1a9c7 20 3d 20 28 76 6f 6c 61 74 69 6c 65 20 68 74 5f = (volatile ht_
1a9c8 73 6c 6f 74 20 2a 29 26 61 50 67 6e 6f 5b 48 41 slot *)&aPgno[HA
1a9c9 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5d 3b 0d SHTABLE_NPAGE];.
1a9ca 0a 20 20 20 20 69 66 28 20 69 48 61 73 68 3d 3d . if( iHash==
1a9cb 30 20 29 7b 0d 0a 20 20 20 20 20 20 61 50 67 6e 0 ){.. aPgn
1a9cc 6f 20 3d 20 26 61 50 67 6e 6f 5b 57 41 4c 49 4e o = &aPgno[WALIN
1a9cd 44 45 58 5f 48 44 52 5f 53 49 5a 45 2f 73 69 7a DEX_HDR_SIZE/siz
1a9ce 65 6f 66 28 75 33 32 29 5d 3b 0d 0a 20 20 20 20 eof(u32)];..
1a9cf 20 20 69 5a 65 72 6f 20 3d 20 30 3b 0d 0a 20 20 iZero = 0;..
1a9d0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
1a9d1 69 5a 65 72 6f 20 3d 20 48 41 53 48 54 41 42 4c iZero = HASHTABL
1a9d2 45 5f 4e 50 41 47 45 5f 4f 4e 45 20 2b 20 28 69 E_NPAGE_ONE + (i
1a9d3 48 61 73 68 2d 31 29 2a 48 41 53 48 54 41 42 4c Hash-1)*HASHTABL
1a9d4 45 5f 4e 50 41 47 45 3b 0d 0a 20 20 20 20 7d 0d E_NPAGE;.. }.
1a9d5 0a 20 20 0d 0a 20 20 20 20 2a 70 61 50 67 6e 6f . .. *paPgno
1a9d6 20 3d 20 26 61 50 67 6e 6f 5b 2d 31 5d 3b 0d 0a = &aPgno[-1];..
1a9d7 20 20 20 20 2a 70 61 48 61 73 68 20 3d 20 61 48 *paHash = aH
1a9d8 61 73 68 3b 0d 0a 20 20 20 20 2a 70 69 5a 65 72 ash;.. *piZer
1a9d9 6f 20 3d 20 69 5a 65 72 6f 3b 0d 0a 20 20 7d 0d o = iZero;.. }.
1a9da 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
1a9db 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 ..../*..** Retur
1a9dc 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
1a9dd 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 70 61 the wal-index pa
1a9de 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 ge that contains
1a9df 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 0d the hash-table.
1a9e0 0a 2a 2a 20 61 6e 64 20 70 61 67 65 2d 6e 75 6d .** and page-num
1a9e1 62 65 72 20 61 72 72 61 79 20 74 68 61 74 20 63 ber array that c
1a9e2 6f 6e 74 61 69 6e 20 65 6e 74 72 69 65 73 20 63 ontain entries c
1a9e3 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 orresponding to
1a9e4 57 41 4c 20 66 72 61 6d 65 0d 0a 2a 2a 20 69 46 WAL frame..** iF
1a9e5 72 61 6d 65 2e 20 54 68 65 20 77 61 6c 2d 69 6e rame. The wal-in
1a9e6 64 65 78 20 69 73 20 62 72 6f 6b 65 6e 20 75 70 dex is broken up
1a9e7 20 69 6e 74 6f 20 33 32 4b 42 20 70 61 67 65 73 into 32KB pages
1a9e8 2e 20 57 61 6c 2d 69 6e 64 65 78 20 70 61 67 65 . Wal-index page
1a9e9 73 20 0d 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 s ..** are numbe
1a9ea 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f red starting fro
1a9eb 6d 20 30 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 m 0...*/..static
1a9ec 20 69 6e 74 20 77 61 6c 46 72 61 6d 65 50 61 67 int walFramePag
1a9ed 65 28 75 33 32 20 69 46 72 61 6d 65 29 7b 0d 0a e(u32 iFrame){..
1a9ee 20 20 69 6e 74 20 69 48 61 73 68 20 3d 20 28 69 int iHash = (i
1a9ef 46 72 61 6d 65 2b 48 41 53 48 54 41 42 4c 45 5f Frame+HASHTABLE_
1a9f0 4e 50 41 47 45 2d 48 41 53 48 54 41 42 4c 45 5f NPAGE-HASHTABLE_
1a9f1 4e 50 41 47 45 5f 4f 4e 45 2d 31 29 20 2f 20 48 NPAGE_ONE-1) / H
1a9f2 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 3b 0d ASHTABLE_NPAGE;.
1a9f3 0a 20 20 61 73 73 65 72 74 28 20 28 69 48 61 73 . assert( (iHas
1a9f4 68 3d 3d 30 20 7c 7c 20 69 46 72 61 6d 65 3e 48 h==0 || iFrame>H
1a9f5 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f ASHTABLE_NPAGE_O
1a9f6 4e 45 29 0d 0a 20 20 20 20 20 20 20 26 26 20 28 NE).. && (
1a9f7 69 48 61 73 68 3e 3d 31 20 7c 7c 20 69 46 72 61 iHash>=1 || iFra
1a9f8 6d 65 3c 3d 48 41 53 48 54 41 42 4c 45 5f 4e 50 me<=HASHTABLE_NP
1a9f9 41 47 45 5f 4f 4e 45 29 0d 0a 20 20 20 20 20 20 AGE_ONE)..
1a9fa 20 26 26 20 28 69 48 61 73 68 3c 3d 31 20 7c 7c && (iHash<=1 ||
1a9fb 20 69 46 72 61 6d 65 3e 28 48 41 53 48 54 41 42 iFrame>(HASHTAB
1a9fc 4c 45 5f 4e 50 41 47 45 5f 4f 4e 45 2b 48 41 53 LE_NPAGE_ONE+HAS
1a9fd 48 54 41 42 4c 45 5f 4e 50 41 47 45 29 29 0d 0a HTABLE_NPAGE))..
1a9fe 20 20 20 20 20 20 20 26 26 20 28 69 48 61 73 68 && (iHash
1a9ff 3e 3d 32 20 7c 7c 20 69 46 72 61 6d 65 3c 3d 48 >=2 || iFrame<=H
1aa00 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f ASHTABLE_NPAGE_O
1aa01 4e 45 2b 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 NE+HASHTABLE_NPA
1aa02 47 45 29 0d 0a 20 20 20 20 20 20 20 26 26 20 28 GE).. && (
1aa03 69 48 61 73 68 3c 3d 32 20 7c 7c 20 69 46 72 61 iHash<=2 || iFra
1aa04 6d 65 3e 28 48 41 53 48 54 41 42 4c 45 5f 4e 50 me>(HASHTABLE_NP
1aa05 41 47 45 5f 4f 4e 45 2b 32 2a 48 41 53 48 54 41 AGE_ONE+2*HASHTA
1aa06 42 4c 45 5f 4e 50 41 47 45 29 29 0d 0a 20 20 29 BLE_NPAGE)).. )
1aa07 3b 0d 0a 20 20 72 65 74 75 72 6e 20 69 48 61 73 ;.. return iHas
1aa08 68 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 h;..}..../*..**
1aa09 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 Return the page
1aa0a 6e 75 6d 62 65 72 20 61 73 73 6f 63 69 61 74 65 number associate
1aa0b 64 20 77 69 74 68 20 66 72 61 6d 65 20 69 46 72 d with frame iFr
1aa0c 61 6d 65 20 69 6e 20 74 68 69 73 20 57 41 4c 2e ame in this WAL.
1aa0d 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 75 33 32 ..*/..static u32
1aa0e 20 77 61 6c 46 72 61 6d 65 50 67 6e 6f 28 57 61 walFramePgno(Wa
1aa0f 6c 20 2a 70 57 61 6c 2c 20 75 33 32 20 69 46 72 l *pWal, u32 iFr
1aa10 61 6d 65 29 7b 0d 0a 20 20 69 6e 74 20 69 48 61 ame){.. int iHa
1aa11 73 68 20 3d 20 77 61 6c 46 72 61 6d 65 50 61 67 sh = walFramePag
1aa12 65 28 69 46 72 61 6d 65 29 3b 0d 0a 20 20 69 66 e(iFrame);.. if
1aa13 28 20 69 48 61 73 68 3d 3d 30 20 29 7b 0d 0a 20 ( iHash==0 ){..
1aa14 20 20 20 72 65 74 75 72 6e 20 70 57 61 6c 2d 3e return pWal->
1aa15 61 70 57 69 44 61 74 61 5b 30 5d 5b 57 41 4c 49 apWiData[0][WALI
1aa16 4e 44 45 58 5f 48 44 52 5f 53 49 5a 45 2f 73 69 NDEX_HDR_SIZE/si
1aa17 7a 65 6f 66 28 75 33 32 29 20 2b 20 69 46 72 61 zeof(u32) + iFra
1aa18 6d 65 20 2d 20 31 5d 3b 0d 0a 20 20 7d 0d 0a 20 me - 1];.. }..
1aa19 20 72 65 74 75 72 6e 20 70 57 61 6c 2d 3e 61 70 return pWal->ap
1aa1a 57 69 44 61 74 61 5b 69 48 61 73 68 5d 5b 28 69 WiData[iHash][(i
1aa1b 46 72 61 6d 65 2d 31 2d 48 41 53 48 54 41 42 4c Frame-1-HASHTABL
1aa1c 45 5f 4e 50 41 47 45 5f 4f 4e 45 29 25 48 41 53 E_NPAGE_ONE)%HAS
1aa1d 48 54 41 42 4c 45 5f 4e 50 41 47 45 5d 3b 0d 0a HTABLE_NPAGE];..
1aa1e 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 6d 6f }..../*..** Remo
1aa1f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 ve entries from
1aa20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 the hash table t
1aa21 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 57 41 4c hat point to WAL
1aa22 20 73 6c 6f 74 73 20 67 72 65 61 74 65 72 0d 0a slots greater..
1aa23 2a 2a 20 74 68 61 6e 20 70 57 61 6c 2d 3e 68 64 ** than pWal->hd
1aa24 72 2e 6d 78 46 72 61 6d 65 2e 0d 0a 2a 2a 0d 0a r.mxFrame...**..
1aa25 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
1aa26 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 is called whene
1aa27 76 65 72 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 ver pWal->hdr.mx
1aa28 46 72 61 6d 65 20 69 73 20 64 65 63 72 65 61 73 Frame is decreas
1aa29 65 64 20 64 75 65 0d 0a 2a 2a 20 74 6f 20 61 20 ed due..** to a
1aa2a 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 73 61 76 65 rollback or save
1aa2b 70 6f 69 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 point...**..** A
1aa2c 74 20 6d 6f 73 74 20 6f 6e 6c 79 20 74 68 65 20 t most only the
1aa2d 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 hash table conta
1aa2e 69 6e 69 6e 67 20 70 57 61 6c 2d 3e 68 64 72 2e ining pWal->hdr.
1aa2f 6d 78 46 72 61 6d 65 20 6e 65 65 64 73 20 74 6f mxFrame needs to
1aa30 20 62 65 0d 0a 2a 2a 20 75 70 64 61 74 65 64 2e be..** updated.
1aa31 20 20 41 6e 79 20 6c 61 74 65 72 20 68 61 73 68 Any later hash
1aa32 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 tables will be
1aa33 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c automatically cl
1aa34 65 61 72 65 64 20 77 68 65 6e 0d 0a 2a 2a 20 70 eared when..** p
1aa35 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 Wal->hdr.mxFrame
1aa36 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 advances to the
1aa37 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 6f point where tho
1aa38 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 se hash tables a
1aa39 72 65 0d 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 re..** actually
1aa3a 6e 65 65 64 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 needed...*/..sta
1aa3b 74 69 63 20 76 6f 69 64 20 77 61 6c 43 6c 65 61 tic void walClea
1aa3c 6e 75 70 48 61 73 68 28 57 61 6c 20 2a 70 57 61 nupHash(Wal *pWa
1aa3d 6c 29 7b 0d 0a 20 20 76 6f 6c 61 74 69 6c 65 20 l){.. volatile
1aa3e 68 74 5f 73 6c 6f 74 20 2a 61 48 61 73 68 20 3d ht_slot *aHash =
1aa3f 20 30 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 0; /* Pointe
1aa40 72 20 74 6f 20 68 61 73 68 20 74 61 62 6c 65 20 r to hash table
1aa41 74 6f 20 63 6c 65 61 72 20 2a 2f 0d 0a 20 20 76 to clear */.. v
1aa42 6f 6c 61 74 69 6c 65 20 75 33 32 20 2a 61 50 67 olatile u32 *aPg
1aa43 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f no = 0; /
1aa44 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 61 72 * Page number ar
1aa45 72 61 79 20 66 6f 72 20 68 61 73 68 20 74 61 62 ray for hash tab
1aa46 6c 65 20 2a 2f 0d 0a 20 20 75 33 32 20 69 5a 65 le */.. u32 iZe
1aa47 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ro = 0;
1aa48 20 20 20 20 20 20 20 20 20 2f 2a 20 66 72 61 6d /* fram
1aa49 65 20 3d 3d 20 28 61 48 61 73 68 5b 78 5d 2b 69 e == (aHash[x]+i
1aa4a 5a 65 72 6f 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 Zero) */.. int
1aa4b 69 4c 69 6d 69 74 20 3d 20 30 3b 20 20 20 20 20 iLimit = 0;
1aa4c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a /* Z
1aa4d 65 72 6f 20 76 61 6c 75 65 73 20 67 72 65 61 74 ero values great
1aa4e 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0d er than this */.
1aa4f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 . int nByte;
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aa51 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
1aa52 62 79 74 65 73 20 74 6f 20 7a 65 72 6f 20 69 6e bytes to zero in
1aa53 20 61 50 67 6e 6f 5b 5d 20 2a 2f 0d 0a 20 20 69 aPgno[] */.. i
1aa54 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
1aa55 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1aa56 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 * Used to iterat
1aa57 65 20 74 68 72 6f 75 67 68 20 61 48 61 73 68 5b e through aHash[
1aa58 5d 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 ] */.... assert
1aa59 28 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 ( pWal->writeLoc
1aa5a 6b 20 29 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 k );.. testcase
1aa5b 28 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 ( pWal->hdr.mxFr
1aa5c 61 6d 65 3d 3d 48 41 53 48 54 41 42 4c 45 5f 4e ame==HASHTABLE_N
1aa5d 50 41 47 45 5f 4f 4e 45 2d 31 20 29 3b 0d 0a 20 PAGE_ONE-1 );..
1aa5e 20 74 65 73 74 63 61 73 65 28 20 70 57 61 6c 2d testcase( pWal-
1aa5f 3e 68 64 72 2e 6d 78 46 72 61 6d 65 3d 3d 48 41 >hdr.mxFrame==HA
1aa60 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 5f 4f 4e SHTABLE_NPAGE_ON
1aa61 45 20 29 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 E );.. testcase
1aa62 28 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 ( pWal->hdr.mxFr
1aa63 61 6d 65 3d 3d 48 41 53 48 54 41 42 4c 45 5f 4e ame==HASHTABLE_N
1aa64 50 41 47 45 5f 4f 4e 45 2b 31 20 29 3b 0d 0a 0d PAGE_ONE+1 );...
1aa65 0a 20 20 69 66 28 20 70 57 61 6c 2d 3e 68 64 72 . if( pWal->hdr
1aa66 2e 6d 78 46 72 61 6d 65 3d 3d 30 20 29 20 72 65 .mxFrame==0 ) re
1aa67 74 75 72 6e 3b 0d 0a 0d 0a 20 20 2f 2a 20 4f 62 turn;.... /* Ob
1aa68 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f tain pointers to
1aa69 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 the hash-table
1aa6a 61 6e 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 and page-number
1aa6b 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 array containing
1aa6c 20 0d 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 .. ** the entr
1aa6d 79 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e y that correspon
1aa6e 64 73 20 74 6f 20 66 72 61 6d 65 20 70 57 61 6c ds to frame pWal
1aa6f 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 2e 20 49 ->hdr.mxFrame. I
1aa70 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0d t is guaranteed.
1aa71 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 70 . ** that the p
1aa72 61 67 65 20 73 61 69 64 20 68 61 73 68 2d 74 61 age said hash-ta
1aa73 62 6c 65 20 61 6e 64 20 61 72 72 61 79 20 72 65 ble and array re
1aa74 73 69 64 65 20 6f 6e 20 69 73 20 61 6c 72 65 61 side on is alrea
1aa75 64 79 20 6d 61 70 70 65 64 2e 0d 0a 20 20 2a 2f dy mapped... */
1aa76 0d 0a 20 20 61 73 73 65 72 74 28 20 70 57 61 6c .. assert( pWal
1aa77 2d 3e 6e 57 69 44 61 74 61 3e 77 61 6c 46 72 61 ->nWiData>walFra
1aa78 6d 65 50 61 67 65 28 70 57 61 6c 2d 3e 68 64 72 mePage(pWal->hdr
1aa79 2e 6d 78 46 72 61 6d 65 29 20 29 3b 0d 0a 20 20 .mxFrame) );..
1aa7a 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 61 70 assert( pWal->ap
1aa7b 57 69 44 61 74 61 5b 77 61 6c 46 72 61 6d 65 50 WiData[walFrameP
1aa7c 61 67 65 28 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 age(pWal->hdr.mx
1aa7d 46 72 61 6d 65 29 5d 20 29 3b 0d 0a 20 20 77 61 Frame)] );.. wa
1aa7e 6c 48 61 73 68 47 65 74 28 70 57 61 6c 2c 20 77 lHashGet(pWal, w
1aa7f 61 6c 46 72 61 6d 65 50 61 67 65 28 70 57 61 6c alFramePage(pWal
1aa80 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 29 2c 20 ->hdr.mxFrame),
1aa81 26 61 48 61 73 68 2c 20 26 61 50 67 6e 6f 2c 20 &aHash, &aPgno,
1aa82 26 69 5a 65 72 6f 29 3b 0d 0a 0d 0a 20 20 2f 2a &iZero);.... /*
1aa83 20 5a 65 72 6f 20 61 6c 6c 20 68 61 73 68 2d 74 Zero all hash-t
1aa84 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 able entries tha
1aa85 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 t correspond to
1aa86 66 72 61 6d 65 20 6e 75 6d 62 65 72 73 20 67 72 frame numbers gr
1aa87 65 61 74 65 72 0d 0a 20 20 2a 2a 20 74 68 61 6e eater.. ** than
1aa88 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 pWal->hdr.mxFra
1aa89 6d 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 4c 69 me... */.. iLi
1aa8a 6d 69 74 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e mit = pWal->hdr.
1aa8b 6d 78 46 72 61 6d 65 20 2d 20 69 5a 65 72 6f 3b mxFrame - iZero;
1aa8c 0d 0a 20 20 61 73 73 65 72 74 28 20 69 4c 69 6d .. assert( iLim
1aa8d 69 74 3e 30 20 29 3b 0d 0a 20 20 66 6f 72 28 69 it>0 );.. for(i
1aa8e 3d 30 3b 20 69 3c 48 41 53 48 54 41 42 4c 45 5f =0; i<HASHTABLE_
1aa8f 4e 53 4c 4f 54 3b 20 69 2b 2b 29 7b 0d 0a 20 20 NSLOT; i++){..
1aa90 20 20 69 66 28 20 61 48 61 73 68 5b 69 5d 3e 69 if( aHash[i]>i
1aa91 4c 69 6d 69 74 20 29 7b 0d 0a 20 20 20 20 20 20 Limit ){..
1aa92 61 48 61 73 68 5b 69 5d 20 3d 20 30 3b 0d 0a 20 aHash[i] = 0;..
1aa93 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 }.. }.. ..
1aa94 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 65 6e 74 /* Zero the ent
1aa95 72 69 65 73 20 69 6e 20 74 68 65 20 61 50 67 6e ries in the aPgn
1aa96 6f 20 61 72 72 61 79 20 74 68 61 74 20 63 6f 72 o array that cor
1aa97 72 65 73 70 6f 6e 64 20 74 6f 20 66 72 61 6d 65 respond to frame
1aa98 73 20 77 69 74 68 0d 0a 20 20 2a 2a 20 66 72 61 s with.. ** fra
1aa99 6d 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 me numbers great
1aa9a 65 72 20 74 68 61 6e 20 70 57 61 6c 2d 3e 68 64 er than pWal->hd
1aa9b 72 2e 6d 78 46 72 61 6d 65 2e 20 0d 0a 20 20 2a r.mxFrame. .. *
1aa9c 2f 0d 0a 20 20 6e 42 79 74 65 20 3d 20 28 69 6e /.. nByte = (in
1aa9d 74 29 28 28 63 68 61 72 20 2a 29 61 48 61 73 68 t)((char *)aHash
1aa9e 20 2d 20 28 63 68 61 72 20 2a 29 26 61 50 67 6e - (char *)&aPgn
1aa9f 6f 5b 69 4c 69 6d 69 74 2b 31 5d 29 3b 0d 0a 20 o[iLimit+1]);..
1aaa0 20 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 memset((void *)
1aaa1 26 61 50 67 6e 6f 5b 69 4c 69 6d 69 74 2b 31 5d &aPgno[iLimit+1]
1aaa2 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0d 0a 0d 0a , 0, nByte);....
1aaa3 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
1aaa4 41 42 4c 45 5f 45 58 50 45 4e 53 49 56 45 5f 41 ABLE_EXPENSIVE_A
1aaa5 53 53 45 52 54 0d 0a 20 20 2f 2a 20 56 65 72 69 SSERT.. /* Veri
1aaa6 66 79 20 74 68 61 74 20 74 68 65 20 65 76 65 72 fy that the ever
1aaa7 79 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d y entry in the m
1aaa8 61 70 70 69 6e 67 20 72 65 67 69 6f 6e 20 69 73 apping region is
1aaa9 20 73 74 69 6c 6c 20 72 65 61 63 68 61 62 6c 65 still reachable
1aaaa 0d 0a 20 20 2a 2a 20 76 69 61 20 74 68 65 20 68 .. ** via the h
1aaab 61 73 68 20 74 61 62 6c 65 20 65 76 65 6e 20 61 ash table even a
1aaac 66 74 65 72 20 74 68 65 20 63 6c 65 61 6e 75 70 fter the cleanup
1aaad 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 69 ... */.. if( i
1aaae 4c 69 6d 69 74 20 29 7b 0d 0a 20 20 20 20 69 6e Limit ){.. in
1aaaf 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f t i; /
1aab0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
1aab1 2f 0d 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 3b /.. int iKey;
1aab2 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 /* Hash
1aab3 6b 65 79 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 key */.. for(
1aab4 69 3d 31 3b 20 69 3c 3d 69 4c 69 6d 69 74 3b 20 i=1; i<=iLimit;
1aab5 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 66 6f 72 i++){.. for
1aab6 28 69 4b 65 79 3d 77 61 6c 48 61 73 68 28 61 50 (iKey=walHash(aP
1aab7 67 6e 6f 5b 69 5d 29 3b 20 61 48 61 73 68 5b 69 gno[i]); aHash[i
1aab8 4b 65 79 5d 3b 20 69 4b 65 79 3d 77 61 6c 4e 65 Key]; iKey=walNe
1aab9 78 74 48 61 73 68 28 69 4b 65 79 29 29 7b 0d 0a xtHash(iKey)){..
1aaba 20 20 20 20 20 20 20 20 69 66 28 20 61 48 61 73 if( aHas
1aabb 68 5b 69 4b 65 79 5d 3d 3d 69 20 29 20 62 72 65 h[iKey]==i ) bre
1aabc 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 ak;.. }..
1aabd 20 20 20 20 61 73 73 65 72 74 28 20 61 48 61 73 assert( aHas
1aabe 68 5b 69 4b 65 79 5d 3d 3d 69 20 29 3b 0d 0a 20 h[iKey]==i );..
1aabf 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 }.. }..#endi
1aac0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 f /* SQLITE_ENAB
1aac1 4c 45 5f 45 58 50 45 4e 53 49 56 45 5f 41 53 53 LE_EXPENSIVE_ASS
1aac2 45 52 54 20 2a 2f 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f ERT */..}....../
1aac3 2a 0d 0a 2a 2a 20 53 65 74 20 61 6e 20 65 6e 74 *..** Set an ent
1aac4 72 79 20 69 6e 20 74 68 65 20 77 61 6c 2d 69 6e ry in the wal-in
1aac5 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 dex that will ma
1aac6 70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 p database page
1aac7 6e 75 6d 62 65 72 0d 0a 2a 2a 20 70 50 61 67 65 number..** pPage
1aac8 20 69 6e 74 6f 20 57 41 4c 20 66 72 61 6d 65 20 into WAL frame
1aac9 69 46 72 61 6d 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 iFrame...*/..sta
1aaca 74 69 63 20 69 6e 74 20 77 61 6c 49 6e 64 65 78 tic int walIndex
1aacb 41 70 70 65 6e 64 28 57 61 6c 20 2a 70 57 61 6c Append(Wal *pWal
1aacc 2c 20 75 33 32 20 69 46 72 61 6d 65 2c 20 75 33 , u32 iFrame, u3
1aacd 32 20 69 50 61 67 65 29 7b 0d 0a 20 20 69 6e 74 2 iPage){.. int
1aace 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
1aacf 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1aad0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a Return code */..
1aad1 20 20 75 33 32 20 69 5a 65 72 6f 20 3d 20 30 3b u32 iZero = 0;
1aad2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aad3 20 20 2f 2a 20 4f 6e 65 20 6c 65 73 73 20 74 68 /* One less th
1aad4 61 6e 20 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 an frame number
1aad5 6f 66 20 61 50 67 6e 6f 5b 31 5d 20 2a 2f 0d 0a of aPgno[1] */..
1aad6 20 20 76 6f 6c 61 74 69 6c 65 20 75 33 32 20 2a volatile u32 *
1aad7 61 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 aPgno = 0;
1aad8 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 /* Page number
1aad9 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 76 6f 6c array */.. vol
1aada 61 74 69 6c 65 20 68 74 5f 73 6c 6f 74 20 2a 61 atile ht_slot *a
1aadb 48 61 73 68 20 3d 20 30 3b 20 20 20 20 2f 2a 20 Hash = 0; /*
1aadc 48 61 73 68 20 74 61 62 6c 65 20 2a 2f 0d 0a 0d Hash table */...
1aadd 0a 20 20 72 63 20 3d 20 77 61 6c 48 61 73 68 47 . rc = walHashG
1aade 65 74 28 70 57 61 6c 2c 20 77 61 6c 46 72 61 6d et(pWal, walFram
1aadf 65 50 61 67 65 28 69 46 72 61 6d 65 29 2c 20 26 ePage(iFrame), &
1aae0 61 48 61 73 68 2c 20 26 61 50 67 6e 6f 2c 20 26 aHash, &aPgno, &
1aae1 69 5a 65 72 6f 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 iZero);.... /*
1aae2 41 73 73 75 6d 69 6e 67 20 74 68 65 20 77 61 6c Assuming the wal
1aae3 2d 69 6e 64 65 78 20 66 69 6c 65 20 77 61 73 20 -index file was
1aae4 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6d 61 70 successfully map
1aae5 70 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 ped, populate th
1aae6 65 0d 0a 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d e.. ** page num
1aae7 62 65 72 20 61 72 72 61 79 20 61 6e 64 20 68 61 ber array and ha
1aae8 73 68 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0d sh table entry..
1aae9 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d . */.. if( rc=
1aaea 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
1aaeb 20 20 20 69 6e 74 20 69 4b 65 79 3b 20 20 20 20 int iKey;
1aaec 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aaed 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6b /* Hash table k
1aaee 65 79 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 ey */.. int i
1aaef 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dx;
1aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 /* Valu
1aaf1 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 68 61 e to write to ha
1aaf2 73 68 2d 74 61 62 6c 65 20 73 6c 6f 74 20 2a 2f sh-table slot */
1aaf3 0d 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 69 .. int nColli
1aaf4 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 de;
1aaf5 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1aaf6 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 hash collisions
1aaf7 20 2a 2f 0d 0a 0d 0a 20 20 20 20 69 64 78 20 3d */.... idx =
1aaf8 20 69 46 72 61 6d 65 20 2d 20 69 5a 65 72 6f 3b iFrame - iZero;
1aaf9 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 .. assert( id
1aafa 78 20 3c 3d 20 48 41 53 48 54 41 42 4c 45 5f 4e x <= HASHTABLE_N
1aafb 53 4c 4f 54 2f 32 20 2b 20 31 20 29 3b 0d 0a 20 SLOT/2 + 1 );..
1aafc 20 20 20 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 .. /* If t
1aafd 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 his is the first
1aafe 20 65 6e 74 72 79 20 74 6f 20 62 65 20 61 64 64 entry to be add
1aaff 65 64 20 74 6f 20 74 68 69 73 20 68 61 73 68 2d ed to this hash-
1ab00 74 61 62 6c 65 2c 20 7a 65 72 6f 20 74 68 65 0d table, zero the.
1ab01 0a 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20 68 . ** entire h
1ab02 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 61 50 ash table and aP
1ab03 67 6e 6f 5b 5d 20 61 72 72 61 79 20 62 65 66 6f gno[] array befo
1ab04 72 65 20 70 72 6f 63 65 64 69 6e 67 2e 20 0d 0a re proceding. ..
1ab05 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 */.. if(
1ab06 69 64 78 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 idx==1 ){..
1ab07 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 6e int nByte = (in
1ab08 74 29 28 28 75 38 20 2a 29 26 61 48 61 73 68 5b t)((u8 *)&aHash[
1ab09 48 41 53 48 54 41 42 4c 45 5f 4e 53 4c 4f 54 5d HASHTABLE_NSLOT]
1ab0a 20 2d 20 28 75 38 20 2a 29 26 61 50 67 6e 6f 5b - (u8 *)&aPgno[
1ab0b 31 5d 29 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 73 1]);.. mems
1ab0c 65 74 28 28 76 6f 69 64 2a 29 26 61 50 67 6e 6f et((void*)&aPgno
1ab0d 5b 31 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0d [1], 0, nByte);.
1ab0e 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a . }.... /*
1ab0f 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e If the entry in
1ab10 20 61 50 67 6e 6f 5b 5d 20 69 73 20 61 6c 72 65 aPgno[] is alre
1ab11 61 64 79 20 73 65 74 2c 20 74 68 65 6e 20 74 68 ady set, then th
1ab12 65 20 70 72 65 76 69 6f 75 73 20 77 72 69 74 65 e previous write
1ab13 72 0d 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 r.. ** must h
1ab14 61 76 65 20 65 78 69 74 65 64 20 75 6e 65 78 70 ave exited unexp
1ab15 65 63 74 65 64 6c 79 20 69 6e 20 74 68 65 20 6d ectedly in the m
1ab16 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 iddle of a trans
1ab17 61 63 74 69 6f 6e 20 28 61 66 74 65 72 0d 0a 20 action (after..
1ab18 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 6f 6e ** writing on
1ab19 65 20 6f 72 20 6d 6f 72 65 20 64 69 72 74 79 20 e or more dirty
1ab1a 70 61 67 65 73 20 74 6f 20 74 68 65 20 57 41 4c pages to the WAL
1ab1b 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f to free up memo
1ab1c 72 79 29 2e 20 0d 0a 20 20 20 20 2a 2a 20 52 65 ry). .. ** Re
1ab1d 6d 6f 76 65 20 74 68 65 20 72 65 6d 6e 61 6e 74 move the remnant
1ab1e 73 20 6f 66 20 74 68 61 74 20 77 72 69 74 65 72 s of that writer
1ab1f 73 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 s uncommitted tr
1ab20 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 0d ansaction from .
1ab21 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 61 73 68 . ** the hash
1ab22 2d 74 61 62 6c 65 20 62 65 66 6f 72 65 20 77 72 -table before wr
1ab23 69 74 69 6e 67 20 61 6e 79 20 6e 65 77 20 65 6e iting any new en
1ab24 74 72 69 65 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a tries... */..
1ab25 20 20 20 20 69 66 28 20 61 50 67 6e 6f 5b 69 64 if( aPgno[id
1ab26 78 5d 20 29 7b 0d 0a 20 20 20 20 20 20 77 61 6c x] ){.. wal
1ab27 43 6c 65 61 6e 75 70 48 61 73 68 28 70 57 61 6c CleanupHash(pWal
1ab28 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 );.. assert
1ab29 28 20 21 61 50 67 6e 6f 5b 69 64 78 5d 20 29 3b ( !aPgno[idx] );
1ab2a 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f .. }.... /
1ab2b 2a 20 57 72 69 74 65 20 74 68 65 20 61 50 67 6e * Write the aPgn
1ab2c 6f 5b 5d 20 61 72 72 61 79 20 65 6e 74 72 79 20 o[] array entry
1ab2d 61 6e 64 20 74 68 65 20 68 61 73 68 2d 74 61 62 and the hash-tab
1ab2e 6c 65 20 73 6c 6f 74 2e 20 2a 2f 0d 0a 20 20 20 le slot. */..
1ab2f 20 6e 43 6f 6c 6c 69 64 65 20 3d 20 69 64 78 3b nCollide = idx;
1ab30 0d 0a 20 20 20 20 66 6f 72 28 69 4b 65 79 3d 77 .. for(iKey=w
1ab31 61 6c 48 61 73 68 28 69 50 61 67 65 29 3b 20 61 alHash(iPage); a
1ab32 48 61 73 68 5b 69 4b 65 79 5d 3b 20 69 4b 65 79 Hash[iKey]; iKey
1ab33 3d 77 61 6c 4e 65 78 74 48 61 73 68 28 69 4b 65 =walNextHash(iKe
1ab34 79 29 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 y)){.. if(
1ab35 28 6e 43 6f 6c 6c 69 64 65 2d 2d 29 3d 3d 30 20 (nCollide--)==0
1ab36 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
1ab37 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 CORRUPT_BKPT;..
1ab38 20 20 20 7d 0d 0a 20 20 20 20 61 50 67 6e 6f 5b }.. aPgno[
1ab39 69 64 78 5d 20 3d 20 69 50 61 67 65 3b 0d 0a 20 idx] = iPage;..
1ab3a 20 20 20 61 48 61 73 68 5b 69 4b 65 79 5d 20 3d aHash[iKey] =
1ab3b 20 28 68 74 5f 73 6c 6f 74 29 69 64 78 3b 0d 0a (ht_slot)idx;..
1ab3c 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
1ab3d 45 4e 41 42 4c 45 5f 45 58 50 45 4e 53 49 56 45 ENABLE_EXPENSIVE
1ab3e 5f 41 53 53 45 52 54 0d 0a 20 20 20 20 2f 2a 20 _ASSERT.. /*
1ab3f 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 Verify that the
1ab40 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 number of entrie
1ab41 73 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 s in the hash ta
1ab42 62 6c 65 20 65 78 61 63 74 6c 79 20 65 71 75 61 ble exactly equa
1ab43 6c 73 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e ls.. ** the n
1ab44 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
1ab45 20 69 6e 20 74 68 65 20 6d 61 70 70 69 6e 67 20 in the mapping
1ab46 72 65 67 69 6f 6e 2e 0d 0a 20 20 20 20 2a 2f 0d region... */.
1ab47 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e . {.. in
1ab48 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f t i; /
1ab49 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
1ab4a 2f 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 6e /.. int nEn
1ab4b 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d try = 0; /* Num
1ab4c 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 ber of entries i
1ab4d 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 n the hash table
1ab4e 20 2a 2f 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 */.. for(i
1ab4f 3d 30 3b 20 69 3c 48 41 53 48 54 41 42 4c 45 5f =0; i<HASHTABLE_
1ab50 4e 53 4c 4f 54 3b 20 69 2b 2b 29 7b 20 69 66 28 NSLOT; i++){ if(
1ab51 20 61 48 61 73 68 5b 69 5d 20 29 20 6e 45 6e 74 aHash[i] ) nEnt
1ab52 72 79 2b 2b 3b 20 7d 0d 0a 20 20 20 20 20 20 61 ry++; }.. a
1ab53 73 73 65 72 74 28 20 6e 45 6e 74 72 79 3d 3d 69 ssert( nEntry==i
1ab54 64 78 20 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a dx );.. }....
1ab55 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
1ab56 61 74 20 74 68 65 20 65 76 65 72 79 20 65 6e 74 at the every ent
1ab57 72 79 20 69 6e 20 74 68 65 20 6d 61 70 70 69 6e ry in the mappin
1ab58 67 20 72 65 67 69 6f 6e 20 69 73 20 72 65 61 63 g region is reac
1ab59 68 61 62 6c 65 0d 0a 20 20 20 20 2a 2a 20 76 69 hable.. ** vi
1ab5a 61 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 a the hash table
1ab5b 2e 20 20 54 68 69 73 20 74 75 72 6e 73 20 6f 75 . This turns ou
1ab5c 74 20 74 6f 20 62 65 20 61 20 72 65 61 6c 6c 79 t to be a really
1ab5d 2c 20 72 65 61 6c 6c 79 20 65 78 70 65 6e 73 69 , really expensi
1ab5e 76 65 0d 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 ve.. ** thing
1ab5f 20 74 6f 20 63 68 65 63 6b 2c 20 73 6f 20 6f 6e to check, so on
1ab60 6c 79 20 64 6f 20 74 68 69 73 20 6f 63 63 61 73 ly do this occas
1ab61 69 6f 6e 61 6c 6c 79 20 2d 20 6e 6f 74 20 6f 6e ionally - not on
1ab62 20 65 76 65 72 79 0d 0a 20 20 20 20 2a 2a 20 69 every.. ** i
1ab63 74 65 72 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 2a teration... *
1ab64 2f 0d 0a 20 20 20 20 69 66 28 20 28 69 64 78 26 /.. if( (idx&
1ab65 30 78 33 66 66 29 3d 3d 30 20 29 7b 0d 0a 20 20 0x3ff)==0 ){..
1ab66 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 int i;
1ab67 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 /* Loop cou
1ab68 6e 74 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20 66 nter */.. f
1ab69 6f 72 28 69 3d 31 3b 20 69 3c 3d 69 64 78 3b 20 or(i=1; i<=idx;
1ab6a 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 i++){.. f
1ab6b 6f 72 28 69 4b 65 79 3d 77 61 6c 48 61 73 68 28 or(iKey=walHash(
1ab6c 61 50 67 6e 6f 5b 69 5d 29 3b 20 61 48 61 73 68 aPgno[i]); aHash
1ab6d 5b 69 4b 65 79 5d 3b 20 69 4b 65 79 3d 77 61 6c [iKey]; iKey=wal
1ab6e 4e 65 78 74 48 61 73 68 28 69 4b 65 79 29 29 7b NextHash(iKey)){
1ab6f 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 .. if(
1ab70 61 48 61 73 68 5b 69 4b 65 79 5d 3d 3d 69 20 29 aHash[iKey]==i )
1ab71 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 break;..
1ab72 20 7d 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 }.. asse
1ab73 72 74 28 20 61 48 61 73 68 5b 69 4b 65 79 5d 3d rt( aHash[iKey]=
1ab74 3d 69 20 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a =i );.. }..
1ab75 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a }..#endif /*
1ab76 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 SQLITE_ENABLE_E
1ab77 58 50 45 4e 53 49 56 45 5f 41 53 53 45 52 54 20 XPENSIVE_ASSERT
1ab78 2a 2f 0d 0a 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 72 */.. }...... r
1ab79 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1ab7a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 63 6f 76 65 72 ../*..** Recover
1ab7b 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 62 the wal-index b
1ab7c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 77 72 y reading the wr
1ab7d 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 ite-ahead log fi
1ab7e 6c 65 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 le. ..**..** Thi
1ab7f 73 20 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 s routine first
1ab80 74 72 69 65 73 20 74 6f 20 65 73 74 61 62 6c 69 tries to establi
1ab81 73 68 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 sh an exclusive
1ab82 6c 6f 63 6b 20 6f 6e 20 74 68 65 0d 0a 2a 2a 20 lock on the..**
1ab83 77 61 6c 2d 69 6e 64 65 78 20 74 6f 20 70 72 65 wal-index to pre
1ab84 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61 vent other threa
1ab85 64 73 2f 70 72 6f 63 65 73 73 65 73 20 66 72 6f ds/processes fro
1ab86 6d 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 m doing anything
1ab87 0d 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 57 41 ..** with the WA
1ab88 4c 20 6f 72 20 77 61 6c 2d 69 6e 64 65 78 20 77 L or wal-index w
1ab89 68 69 6c 65 20 72 65 63 6f 76 65 72 79 20 69 73 hile recovery is
1ab8a 20 72 75 6e 6e 69 6e 67 2e 20 20 54 68 65 0d 0a running. The..
1ab8b 2a 2a 20 57 41 4c 5f 52 45 43 4f 56 45 52 5f 4c ** WAL_RECOVER_L
1ab8c 4f 43 4b 20 69 73 20 61 6c 73 6f 20 68 65 6c 64 OCK is also held
1ab8d 20 73 6f 20 74 68 61 74 20 6f 74 68 65 72 20 74 so that other t
1ab8e 68 72 65 61 64 73 20 77 69 6c 6c 20 6b 6e 6f 77 hreads will know
1ab8f 0d 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 74 ..** that this t
1ab90 68 72 65 61 64 20 69 73 20 72 75 6e 6e 69 6e 67 hread is running
1ab91 20 72 65 63 6f 76 65 72 79 2e 20 20 49 66 20 75 recovery. If u
1ab92 6e 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69 nable to establi
1ab93 73 68 0d 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 sh..** the neces
1ab94 73 61 72 79 20 6c 6f 63 6b 73 2c 20 74 68 69 73 sary locks, this
1ab95 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
1ab96 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0d 0a 2a SQLITE_BUSY...*
1ab97 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 /..static int wa
1ab98 6c 49 6e 64 65 78 52 65 63 6f 76 65 72 28 57 61 lIndexRecover(Wa
1ab99 6c 20 2a 70 57 61 6c 29 7b 0d 0a 20 20 69 6e 74 l *pWal){.. int
1ab9a 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
1ab9b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ab9c 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0d 0a Return Code */..
1ab9d 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 i64 nSize;
1ab9e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab9f 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6c 6f 67 /* Size of log
1aba0 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 75 33 32 20 file */.. u32
1aba1 61 46 72 61 6d 65 43 6b 73 75 6d 5b 32 5d 20 3d aFrameCksum[2] =
1aba2 20 7b 30 2c 20 30 7d 3b 0d 0a 20 20 69 6e 74 20 {0, 0};.. int
1aba3 69 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 iLock;
1aba4 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
1aba5 6f 63 6b 20 6f 66 66 73 65 74 20 74 6f 20 6c 6f ock offset to lo
1aba6 63 6b 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e ck for checkpoin
1aba7 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 4c 6f 63 t */.. int nLoc
1aba8 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 k;
1aba9 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1abaa 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 68 6f r of locks to ho
1abab 6c 64 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 4f 62 ld */.... /* Ob
1abac 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 tain an exclusiv
1abad 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 62 79 e lock on all by
1abae 74 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e te in the lockin
1abaf 67 20 72 61 6e 67 65 20 6e 6f 74 20 61 6c 72 65 g range not alre
1abb0 61 64 79 0d 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 ady.. ** locked
1abb1 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 by the caller.
1abb2 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 67 75 The caller is gu
1abb3 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 aranteed to have
1abb4 20 6c 6f 63 6b 65 64 20 74 68 65 0d 0a 20 20 2a locked the.. *
1abb5 2a 20 57 41 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b * WAL_WRITE_LOCK
1abb6 20 62 79 74 65 2c 20 61 6e 64 20 6d 61 79 20 68 byte, and may h
1abb7 61 76 65 20 61 6c 73 6f 20 6c 6f 63 6b 65 64 20 ave also locked
1abb8 74 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 the WAL_CKPT_LOC
1abb9 4b 20 62 79 74 65 2e 0d 0a 20 20 2a 2a 20 49 66 K byte... ** If
1abba 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 successful, the
1abbb 20 73 61 6d 65 20 62 79 74 65 73 20 74 68 61 74 same bytes that
1abbc 20 61 72 65 20 6c 6f 63 6b 65 64 20 68 65 72 65 are locked here
1abbd 20 61 72 65 20 75 6e 6c 6f 63 6b 65 64 20 62 65 are unlocked be
1abbe 66 6f 72 65 0d 0a 20 20 2a 2a 20 74 68 69 73 20 fore.. ** this
1abbf 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 function returns
1abc0 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 ... */.. asser
1abc1 74 28 20 70 57 61 6c 2d 3e 63 6b 70 74 4c 6f 63 t( pWal->ckptLoc
1abc2 6b 3d 3d 31 20 7c 7c 20 70 57 61 6c 2d 3e 63 6b k==1 || pWal->ck
1abc3 70 74 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a 20 20 ptLock==0 );..
1abc4 61 73 73 65 72 74 28 20 57 41 4c 5f 41 4c 4c 5f assert( WAL_ALL_
1abc5 42 55 54 5f 57 52 49 54 45 3d 3d 57 41 4c 5f 57 BUT_WRITE==WAL_W
1abc6 52 49 54 45 5f 4c 4f 43 4b 2b 31 20 29 3b 0d 0a RITE_LOCK+1 );..
1abc7 20 20 61 73 73 65 72 74 28 20 57 41 4c 5f 43 4b assert( WAL_CK
1abc8 50 54 5f 4c 4f 43 4b 3d 3d 57 41 4c 5f 41 4c 4c PT_LOCK==WAL_ALL
1abc9 5f 42 55 54 5f 57 52 49 54 45 20 29 3b 0d 0a 20 _BUT_WRITE );..
1abca 20 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 77 assert( pWal->w
1abcb 72 69 74 65 4c 6f 63 6b 20 29 3b 0d 0a 20 20 69 riteLock );.. i
1abcc 4c 6f 63 6b 20 3d 20 57 41 4c 5f 41 4c 4c 5f 42 Lock = WAL_ALL_B
1abcd 55 54 5f 57 52 49 54 45 20 2b 20 70 57 61 6c 2d UT_WRITE + pWal-
1abce 3e 63 6b 70 74 4c 6f 63 6b 3b 0d 0a 20 20 6e 4c >ckptLock;.. nL
1abcf 6f 63 6b 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d ock = SQLITE_SHM
1abd0 5f 4e 4c 4f 43 4b 20 2d 20 69 4c 6f 63 6b 3b 0d _NLOCK - iLock;.
1abd1 0a 20 20 72 63 20 3d 20 77 61 6c 4c 6f 63 6b 45 . rc = walLockE
1abd2 78 63 6c 75 73 69 76 65 28 70 57 61 6c 2c 20 69 xclusive(pWal, i
1abd3 4c 6f 63 6b 2c 20 6e 4c 6f 63 6b 29 3b 0d 0a 20 Lock, nLock);..
1abd4 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 if( rc ){..
1abd5 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d return rc;.. }.
1abd6 0a 20 20 57 41 4c 54 52 41 43 45 28 28 22 57 41 . WALTRACE(("WA
1abd7 4c 25 70 3a 20 72 65 63 6f 76 65 72 79 20 62 65 L%p: recovery be
1abd8 67 69 6e 2e 2e 2e 5c 6e 22 2c 20 70 57 61 6c 29 gin...\n", pWal)
1abd9 29 3b 0d 0a 0d 0a 20 20 6d 65 6d 73 65 74 28 26 );.... memset(&
1abda 70 57 61 6c 2d 3e 68 64 72 2c 20 30 2c 20 73 69 pWal->hdr, 0, si
1abdb 7a 65 6f 66 28 57 61 6c 49 6e 64 65 78 48 64 72 zeof(WalIndexHdr
1abdc 29 29 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 73 71 ));.... rc = sq
1abdd 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 lite3OsFileSize(
1abde 70 57 61 6c 2d 3e 70 57 61 6c 46 64 2c 20 26 6e pWal->pWalFd, &n
1abdf 53 69 7a 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 Size);.. if( rc
1abe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
1abe1 20 20 20 20 67 6f 74 6f 20 72 65 63 6f 76 65 72 goto recover
1abe2 79 5f 65 72 72 6f 72 3b 0d 0a 20 20 7d 0d 0a 0d y_error;.. }...
1abe3 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 57 41 4c . if( nSize>WAL
1abe4 5f 48 44 52 53 49 5a 45 20 29 7b 0d 0a 20 20 20 _HDRSIZE ){..
1abe5 20 75 38 20 61 42 75 66 5b 57 41 4c 5f 48 44 52 u8 aBuf[WAL_HDR
1abe6 53 49 5a 45 5d 3b 20 20 20 20 20 20 20 20 20 2f SIZE]; /
1abe7 2a 20 42 75 66 66 65 72 20 74 6f 20 6c 6f 61 64 * Buffer to load
1abe8 20 57 41 4c 20 68 65 61 64 65 72 20 69 6e 74 6f WAL header into
1abe9 20 2a 2f 0d 0a 20 20 20 20 75 38 20 2a 61 46 72 */.. u8 *aFr
1abea 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 ame = 0;
1abeb 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 /* Malloc
1abec 27 64 20 62 75 66 66 65 72 20 74 6f 20 6c 6f 61 'd buffer to loa
1abed 64 20 65 6e 74 69 72 65 20 66 72 61 6d 65 20 2a d entire frame *
1abee 2f 0d 0a 20 20 20 20 69 6e 74 20 73 7a 46 72 61 /.. int szFra
1abef 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 me;
1abf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1abf1 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 f bytes in buffe
1abf2 72 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0d 0a 20 r aFrame[] */..
1abf3 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 u8 *aData;
1abf4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1abf5 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 /* Pointer to d
1abf6 61 74 61 20 70 61 72 74 20 6f 66 20 61 46 72 61 ata part of aFra
1abf7 6d 65 20 62 75 66 66 65 72 20 2a 2f 0d 0a 20 20 me buffer */..
1abf8 20 20 69 6e 74 20 69 46 72 61 6d 65 3b 20 20 20 int iFrame;
1abf9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1abfa 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 61 73 74 /* Index of last
1abfb 20 66 72 61 6d 65 20 72 65 61 64 20 2a 2f 0d 0a frame read */..
1abfc 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b i64 iOffset;
1abfd 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1abfe 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 /* Next offset
1abff 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 6c 6f to read from lo
1ac00 67 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 69 g file */.. i
1ac01 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 nt szPage;
1ac02 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ac03 50 61 67 65 20 73 69 7a 65 20 61 63 63 6f 72 64 Page size accord
1ac04 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 67 20 2a ing to the log *
1ac05 2f 0d 0a 20 20 20 20 75 33 32 20 6d 61 67 69 63 /.. u32 magic
1ac06 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1ac07 20 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 76 61 /* Magic va
1ac08 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 57 41 lue read from WA
1ac09 4c 20 68 65 61 64 65 72 20 2a 2f 0d 0a 20 20 20 L header */..
1ac0a 20 75 33 32 20 76 65 72 73 69 6f 6e 3b 20 20 20 u32 version;
1ac0b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1ac0c 2a 20 4d 61 67 69 63 20 76 61 6c 75 65 20 72 65 * Magic value re
1ac0d 61 64 20 66 72 6f 6d 20 57 41 4c 20 68 65 61 64 ad from WAL head
1ac0e 65 72 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 69 er */.. int i
1ac0f 73 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 sValid;
1ac10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
1ac11 20 69 66 20 74 68 69 73 20 66 72 61 6d 65 20 69 if this frame i
1ac12 73 20 76 61 6c 69 64 20 2a 2f 0d 0a 0d 0a 20 20 s valid */....
1ac13 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 /* Read in the
1ac14 20 57 41 4c 20 68 65 61 64 65 72 2e 20 2a 2f 0d WAL header. */.
1ac15 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1ac16 33 4f 73 52 65 61 64 28 70 57 61 6c 2d 3e 70 57 3OsRead(pWal->pW
1ac17 61 6c 46 64 2c 20 61 42 75 66 2c 20 57 41 4c 5f alFd, aBuf, WAL_
1ac18 48 44 52 53 49 5a 45 2c 20 30 29 3b 0d 0a 20 20 HDRSIZE, 0);..
1ac19 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
1ac1a 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f _OK ){.. go
1ac1b 74 6f 20 72 65 63 6f 76 65 72 79 5f 65 72 72 6f to recovery_erro
1ac1c 72 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 r;.. }....
1ac1d 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 /* If the datab
1ac1e 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 ase page size is
1ac1f 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f 66 20 not a power of
1ac20 74 77 6f 2c 20 6f 72 20 69 73 20 67 72 65 61 74 two, or is great
1ac21 65 72 20 74 68 61 6e 0d 0a 20 20 20 20 2a 2a 20 er than.. **
1ac22 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f SQLITE_MAX_PAGE_
1ac23 53 49 5a 45 2c 20 63 6f 6e 63 6c 75 64 65 20 74 SIZE, conclude t
1ac24 68 61 74 20 74 68 65 20 57 41 4c 20 66 69 6c 65 hat the WAL file
1ac25 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c contains no val
1ac26 69 64 20 0d 0a 20 20 20 20 2a 2a 20 64 61 74 61 id .. ** data
1ac27 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 . Similarly, if
1ac28 74 68 65 20 27 6d 61 67 69 63 27 20 76 61 6c 75 the 'magic' valu
1ac29 65 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 69 67 e is invalid, ig
1ac2a 6e 6f 72 65 20 74 68 65 20 77 68 6f 6c 65 0d 0a nore the whole..
1ac2b 20 20 20 20 2a 2a 20 57 41 4c 20 66 69 6c 65 2e ** WAL file.
1ac2c 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 6d 61 .. */.. ma
1ac2d 67 69 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 gic = sqlite3Get
1ac2e 34 62 79 74 65 28 26 61 42 75 66 5b 30 5d 29 3b 4byte(&aBuf[0]);
1ac2f 0d 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 73 .. szPage = s
1ac30 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 26 qlite3Get4byte(&
1ac31 61 42 75 66 5b 38 5d 29 3b 0d 0a 20 20 20 20 69 aBuf[8]);.. i
1ac32 66 28 20 28 6d 61 67 69 63 26 30 78 46 46 46 46 f( (magic&0xFFFF
1ac33 46 46 46 45 29 21 3d 57 41 4c 5f 4d 41 47 49 43 FFFE)!=WAL_MAGIC
1ac34 20 0d 0a 20 20 20 20 20 7c 7c 20 73 7a 50 61 67 .. || szPag
1ac35 65 26 28 73 7a 50 61 67 65 2d 31 29 20 0d 0a 20 e&(szPage-1) ..
1ac36 20 20 20 20 7c 7c 20 73 7a 50 61 67 65 3e 53 51 || szPage>SQ
1ac37 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 LITE_MAX_PAGE_SI
1ac38 5a 45 20 0d 0a 20 20 20 20 20 7c 7c 20 73 7a 50 ZE .. || szP
1ac39 61 67 65 3c 35 31 32 20 0d 0a 20 20 20 20 29 7b age<512 .. ){
1ac3a 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e .. goto fin
1ac3b 69 73 68 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ished;.. }..
1ac3c 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 62 69 67 pWal->hdr.big
1ac3d 45 6e 64 43 6b 73 75 6d 20 3d 20 28 75 38 29 28 EndCksum = (u8)(
1ac3e 6d 61 67 69 63 26 30 78 30 30 30 30 30 30 30 31 magic&0x00000001
1ac3f 29 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e 73 7a );.. pWal->sz
1ac40 50 61 67 65 20 3d 20 73 7a 50 61 67 65 3b 0d 0a Page = szPage;..
1ac41 20 20 20 20 70 57 61 6c 2d 3e 6e 43 6b 70 74 20 pWal->nCkpt
1ac42 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 = sqlite3Get4byt
1ac43 65 28 26 61 42 75 66 5b 31 32 5d 29 3b 0d 0a 20 e(&aBuf[12]);..
1ac44 20 20 20 6d 65 6d 63 70 79 28 26 70 57 61 6c 2d memcpy(&pWal-
1ac45 3e 68 64 72 2e 61 53 61 6c 74 2c 20 26 61 42 75 >hdr.aSalt, &aBu
1ac46 66 5b 31 36 5d 2c 20 38 29 3b 0d 0a 0d 0a 20 20 f[16], 8);....
1ac47 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 /* Verify that
1ac48 20 74 68 65 20 57 41 4c 20 68 65 61 64 65 72 20 the WAL header
1ac49 63 68 65 63 6b 73 75 6d 20 69 73 20 63 6f 72 72 checksum is corr
1ac4a 65 63 74 20 2a 2f 0d 0a 20 20 20 20 77 61 6c 43 ect */.. walC
1ac4b 68 65 63 6b 73 75 6d 42 79 74 65 73 28 70 57 61 hecksumBytes(pWa
1ac4c 6c 2d 3e 68 64 72 2e 62 69 67 45 6e 64 43 6b 73 l->hdr.bigEndCks
1ac4d 75 6d 3d 3d 53 51 4c 49 54 45 5f 42 49 47 45 4e um==SQLITE_BIGEN
1ac4e 44 49 41 4e 2c 20 0d 0a 20 20 20 20 20 20 20 20 DIAN, ..
1ac4f 61 42 75 66 2c 20 57 41 4c 5f 48 44 52 53 49 5a aBuf, WAL_HDRSIZ
1ac50 45 2d 32 2a 34 2c 20 30 2c 20 70 57 61 6c 2d 3e E-2*4, 0, pWal->
1ac51 68 64 72 2e 61 46 72 61 6d 65 43 6b 73 75 6d 0d hdr.aFrameCksum.
1ac52 0a 20 20 20 20 29 3b 0d 0a 20 20 20 20 69 66 28 . );.. if(
1ac53 20 70 57 61 6c 2d 3e 68 64 72 2e 61 46 72 61 6d pWal->hdr.aFram
1ac54 65 43 6b 73 75 6d 5b 30 5d 21 3d 73 71 6c 69 74 eCksum[0]!=sqlit
1ac55 65 33 47 65 74 34 62 79 74 65 28 26 61 42 75 66 e3Get4byte(&aBuf
1ac56 5b 32 34 5d 29 0d 0a 20 20 20 20 20 7c 7c 20 70 [24]).. || p
1ac57 57 61 6c 2d 3e 68 64 72 2e 61 46 72 61 6d 65 43 Wal->hdr.aFrameC
1ac58 6b 73 75 6d 5b 31 5d 21 3d 73 71 6c 69 74 65 33 ksum[1]!=sqlite3
1ac59 47 65 74 34 62 79 74 65 28 26 61 42 75 66 5b 32 Get4byte(&aBuf[2
1ac5a 38 5d 29 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 20 8]).. ){..
1ac5b 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 goto finished
1ac5c 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 ;.. }....
1ac5d 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 /* Verify that t
1ac5e 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 he version numbe
1ac5f 72 20 6f 6e 20 74 68 65 20 57 41 4c 20 66 6f 72 r on the WAL for
1ac60 6d 61 74 20 69 73 20 6f 6e 65 20 74 68 61 74 0d mat is one that.
1ac61 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 62 6c 65 . ** are able
1ac62 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 2a to understand *
1ac63 2f 0d 0a 20 20 20 20 76 65 72 73 69 6f 6e 20 3d /.. version =
1ac64 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 sqlite3Get4byte
1ac65 28 26 61 42 75 66 5b 34 5d 29 3b 0d 0a 20 20 20 (&aBuf[4]);..
1ac66 20 69 66 28 20 76 65 72 73 69 6f 6e 21 3d 57 41 if( version!=WA
1ac67 4c 5f 4d 41 58 5f 56 45 52 53 49 4f 4e 20 29 7b L_MAX_VERSION ){
1ac68 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c .. rc = SQL
1ac69 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 ITE_CANTOPEN_BKP
1ac6a 54 3b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 T;.. goto f
1ac6b 69 6e 69 73 68 65 64 3b 0d 0a 20 20 20 20 7d 0d inished;.. }.
1ac6c 0a 0d 0a 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 ... /* Malloc
1ac6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 72 65 61 a buffer to rea
1ac6e 64 20 66 72 61 6d 65 73 20 69 6e 74 6f 2e 20 2a d frames into. *
1ac6f 2f 0d 0a 20 20 20 20 73 7a 46 72 61 6d 65 20 3d /.. szFrame =
1ac70 20 73 7a 50 61 67 65 20 2b 20 57 41 4c 5f 46 52 szPage + WAL_FR
1ac71 41 4d 45 5f 48 44 52 53 49 5a 45 3b 0d 0a 20 20 AME_HDRSIZE;..
1ac72 20 20 61 46 72 61 6d 65 20 3d 20 28 75 38 20 2a aFrame = (u8 *
1ac73 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 )sqlite3_malloc(
1ac74 73 7a 46 72 61 6d 65 29 3b 0d 0a 20 20 20 20 69 szFrame);.. i
1ac75 66 28 20 21 61 46 72 61 6d 65 20 29 7b 0d 0a 20 f( !aFrame ){..
1ac76 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
1ac77 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 67 _NOMEM;.. g
1ac78 6f 74 6f 20 72 65 63 6f 76 65 72 79 5f 65 72 72 oto recovery_err
1ac79 6f 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 or;.. }..
1ac7a 61 44 61 74 61 20 3d 20 26 61 46 72 61 6d 65 5b aData = &aFrame[
1ac7b 57 41 4c 5f 46 52 41 4d 45 5f 48 44 52 53 49 5a WAL_FRAME_HDRSIZ
1ac7c 45 5d 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 52 65 E];.... /* Re
1ac7d 61 64 20 61 6c 6c 20 66 72 61 6d 65 73 20 66 72 ad all frames fr
1ac7e 6f 6d 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e om the log file.
1ac7f 20 2a 2f 0d 0a 20 20 20 20 69 46 72 61 6d 65 20 */.. iFrame
1ac80 3d 20 30 3b 0d 0a 20 20 20 20 66 6f 72 28 69 4f = 0;.. for(iO
1ac81 66 66 73 65 74 3d 57 41 4c 5f 48 44 52 53 49 5a ffset=WAL_HDRSIZ
1ac82 45 3b 20 28 69 4f 66 66 73 65 74 2b 73 7a 46 72 E; (iOffset+szFr
1ac83 61 6d 65 29 3c 3d 6e 53 69 7a 65 3b 20 69 4f 66 ame)<=nSize; iOf
1ac84 66 73 65 74 2b 3d 73 7a 46 72 61 6d 65 29 7b 0d fset+=szFrame){.
1ac85 0a 20 20 20 20 20 20 75 33 32 20 70 67 6e 6f 3b . u32 pgno;
1ac86 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac87 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 /* Database p
1ac88 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 age number for f
1ac89 72 61 6d 65 20 2a 2f 0d 0a 20 20 20 20 20 20 75 rame */.. u
1ac8a 33 32 20 6e 54 72 75 6e 63 61 74 65 3b 20 20 20 32 nTruncate;
1ac8b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 /* db
1ac8c 73 69 7a 65 20 66 69 65 6c 64 20 66 72 6f 6d 20 size field from
1ac8d 66 72 61 6d 65 20 68 65 61 64 65 72 20 2a 2f 0d frame header */.
1ac8e 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 ... /* Read
1ac8f 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20 and decode the
1ac90 6e 65 78 74 20 6c 6f 67 20 66 72 61 6d 65 2e 20 next log frame.
1ac91 2a 2f 0d 0a 20 20 20 20 20 20 69 46 72 61 6d 65 */.. iFrame
1ac92 2b 2b 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 ++;.. rc =
1ac93 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 57 sqlite3OsRead(pW
1ac94 61 6c 2d 3e 70 57 61 6c 46 64 2c 20 61 46 72 61 al->pWalFd, aFra
1ac95 6d 65 2c 20 73 7a 46 72 61 6d 65 2c 20 69 4f 66 me, szFrame, iOf
1ac96 66 73 65 74 29 3b 0d 0a 20 20 20 20 20 20 69 66 fset);.. if
1ac97 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1ac98 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 ) break;..
1ac99 69 73 56 61 6c 69 64 20 3d 20 77 61 6c 44 65 63 isValid = walDec
1ac9a 6f 64 65 46 72 61 6d 65 28 70 57 61 6c 2c 20 26 odeFrame(pWal, &
1ac9b 70 67 6e 6f 2c 20 26 6e 54 72 75 6e 63 61 74 65 pgno, &nTruncate
1ac9c 2c 20 61 44 61 74 61 2c 20 61 46 72 61 6d 65 29 , aData, aFrame)
1ac9d 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 ;.. if( !is
1ac9e 56 61 6c 69 64 20 29 20 62 72 65 61 6b 3b 0d 0a Valid ) break;..
1ac9f 20 20 20 20 20 20 72 63 20 3d 20 77 61 6c 49 6e rc = walIn
1aca0 64 65 78 41 70 70 65 6e 64 28 70 57 61 6c 2c 20 dexAppend(pWal,
1aca1 69 46 72 61 6d 65 2c 20 70 67 6e 6f 29 3b 0d 0a iFrame, pgno);..
1aca2 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
1aca3 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b LITE_OK ) break;
1aca4 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 .... /* If
1aca5 6e 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e nTruncate is non
1aca6 2d 7a 65 72 6f 2c 20 74 68 69 73 20 69 73 20 61 -zero, this is a
1aca7 20 63 6f 6d 6d 69 74 20 72 65 63 6f 72 64 2e 20 commit record.
1aca8 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 */.. if( nT
1aca9 72 75 6e 63 61 74 65 20 29 7b 0d 0a 20 20 20 20 runcate ){..
1acaa 20 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 pWal->hdr.mx
1acab 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0d Frame = iFrame;.
1acac 0a 20 20 20 20 20 20 20 20 70 57 61 6c 2d 3e 68 . pWal->h
1acad 64 72 2e 6e 50 61 67 65 20 3d 20 6e 54 72 75 6e dr.nPage = nTrun
1acae 63 61 74 65 3b 0d 0a 20 20 20 20 20 20 20 20 70 cate;.. p
1acaf 57 61 6c 2d 3e 68 64 72 2e 73 7a 50 61 67 65 20 Wal->hdr.szPage
1acb0 3d 20 28 75 31 36 29 28 28 73 7a 50 61 67 65 26 = (u16)((szPage&
1acb1 30 78 66 66 30 30 29 20 7c 20 28 73 7a 50 61 67 0xff00) | (szPag
1acb2 65 3e 3e 31 36 29 29 3b 0d 0a 20 20 20 20 20 20 e>>16));..
1acb3 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 50 61 testcase( szPa
1acb4 67 65 3c 3d 33 32 37 36 38 20 29 3b 0d 0a 20 20 ge<=32768 );..
1acb5 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1acb6 73 7a 50 61 67 65 3e 3d 36 35 35 33 36 20 29 3b szPage>=65536 );
1acb7 0d 0a 20 20 20 20 20 20 20 20 61 46 72 61 6d 65 .. aFrame
1acb8 43 6b 73 75 6d 5b 30 5d 20 3d 20 70 57 61 6c 2d Cksum[0] = pWal-
1acb9 3e 68 64 72 2e 61 46 72 61 6d 65 43 6b 73 75 6d >hdr.aFrameCksum
1acba 5b 30 5d 3b 0d 0a 20 20 20 20 20 20 20 20 61 46 [0];.. aF
1acbb 72 61 6d 65 43 6b 73 75 6d 5b 31 5d 20 3d 20 70 rameCksum[1] = p
1acbc 57 61 6c 2d 3e 68 64 72 2e 61 46 72 61 6d 65 43 Wal->hdr.aFrameC
1acbd 6b 73 75 6d 5b 31 5d 3b 0d 0a 20 20 20 20 20 20 ksum[1];..
1acbe 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 }.. }....
1acbf 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 72 sqlite3_free(aFr
1acc0 61 6d 65 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 66 69 ame);.. }....fi
1acc1 6e 69 73 68 65 64 3a 0d 0a 20 20 69 66 28 20 72 nished:.. if( r
1acc2 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c==SQLITE_OK ){.
1acc3 0a 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 57 61 . volatile Wa
1acc4 6c 43 6b 70 74 49 6e 66 6f 20 2a 70 49 6e 66 6f lCkptInfo *pInfo
1acc5 3b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 ;.. int i;..
1acc6 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 61 46 72 pWal->hdr.aFr
1acc7 61 6d 65 43 6b 73 75 6d 5b 30 5d 20 3d 20 61 46 ameCksum[0] = aF
1acc8 72 61 6d 65 43 6b 73 75 6d 5b 30 5d 3b 0d 0a 20 rameCksum[0];..
1acc9 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 61 46 72 pWal->hdr.aFr
1acca 61 6d 65 43 6b 73 75 6d 5b 31 5d 20 3d 20 61 46 ameCksum[1] = aF
1accb 72 61 6d 65 43 6b 73 75 6d 5b 31 5d 3b 0d 0a 20 rameCksum[1];..
1accc 20 20 20 77 61 6c 49 6e 64 65 78 57 72 69 74 65 walIndexWrite
1accd 48 64 72 28 70 57 61 6c 29 3b 0d 0a 0d 0a 20 20 Hdr(pWal);....
1acce 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63 /* Reset the c
1accf 68 65 63 6b 70 6f 69 6e 74 2d 68 65 61 64 65 72 heckpoint-header
1acd0 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 . This is safe b
1acd1 65 63 61 75 73 65 20 74 68 69 73 20 74 68 72 65 ecause this thre
1acd2 61 64 20 69 73 20 0d 0a 20 20 20 20 2a 2a 20 63 ad is .. ** c
1acd3 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 urrently holding
1acd4 20 6c 6f 63 6b 73 20 74 68 61 74 20 65 78 63 6c locks that excl
1acd5 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 72 65 ude all other re
1acd6 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61 aders, writers a
1acd7 6e 64 0d 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b nd.. ** check
1acd8 70 6f 69 6e 74 65 72 73 2e 0d 0a 20 20 20 20 2a pointers... *
1acd9 2f 0d 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 77 /.. pInfo = w
1acda 61 6c 43 6b 70 74 49 6e 66 6f 28 70 57 61 6c 29 alCkptInfo(pWal)
1acdb 3b 0d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 42 ;.. pInfo->nB
1acdc 61 63 6b 66 69 6c 6c 20 3d 20 30 3b 0d 0a 20 20 ackfill = 0;..
1acdd 20 20 70 49 6e 66 6f 2d 3e 61 52 65 61 64 4d 61 pInfo->aReadMa
1acde 72 6b 5b 30 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 rk[0] = 0;..
1acdf 66 6f 72 28 69 3d 31 3b 20 69 3c 57 41 4c 5f 4e for(i=1; i<WAL_N
1ace0 52 45 41 44 45 52 3b 20 69 2b 2b 29 20 70 49 6e READER; i++) pIn
1ace1 66 6f 2d 3e 61 52 65 61 64 4d 61 72 6b 5b 69 5d fo->aReadMark[i]
1ace2 20 3d 20 52 45 41 44 4d 41 52 4b 5f 4e 4f 54 5f = READMARK_NOT_
1ace3 55 53 45 44 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 USED;.... /*
1ace4 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 If more than one
1ace5 20 66 72 61 6d 65 20 77 61 73 20 72 65 63 6f 76 frame was recov
1ace6 65 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6c 6f ered from the lo
1ace7 67 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 61 g file, report a
1ace8 6e 0d 0a 20 20 20 20 2a 2a 20 65 76 65 6e 74 20 n.. ** event
1ace9 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 via sqlite3_log(
1acea 29 2e 20 54 68 69 73 20 69 73 20 74 6f 20 68 65 ). This is to he
1aceb 6c 70 20 77 69 74 68 20 69 64 65 6e 74 69 66 79 lp with identify
1acec 69 6e 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 0d ing performance.
1aced 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 . ** problems
1acee 20 63 61 75 73 65 64 20 62 79 20 61 70 70 6c 69 caused by appli
1acef 63 61 74 69 6f 6e 73 20 72 6f 75 74 69 6e 65 6c cations routinel
1acf0 79 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 y shutting down
1acf1 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 2a 2a 20 without.. **
1acf2 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 checkpointing th
1acf3 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 e log file...
1acf4 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 70 57 61 */.. if( pWa
1acf5 6c 2d 3e 68 64 72 2e 6e 50 61 67 65 20 29 7b 0d l->hdr.nPage ){.
1acf6 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c . sqlite3_l
1acf7 6f 67 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 22 52 og(SQLITE_OK, "R
1acf8 65 63 6f 76 65 72 65 64 20 25 64 20 66 72 61 6d ecovered %d fram
1acf9 65 73 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 es from WAL file
1acfa 20 25 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 %s",..
1acfb 20 70 57 61 6c 2d 3e 68 64 72 2e 6e 50 61 67 65 pWal->hdr.nPage
1acfc 2c 20 70 57 61 6c 2d 3e 7a 57 61 6c 4e 61 6d 65 , pWal->zWalName
1acfd 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 .. );..
1acfe 7d 0d 0a 20 20 7d 0d 0a 0d 0a 72 65 63 6f 76 65 }.. }....recove
1acff 72 79 5f 65 72 72 6f 72 3a 0d 0a 20 20 57 41 4c ry_error:.. WAL
1ad00 54 52 41 43 45 28 28 22 57 41 4c 25 70 3a 20 72 TRACE(("WAL%p: r
1ad01 65 63 6f 76 65 72 79 20 25 73 5c 6e 22 2c 20 70 ecovery %s\n", p
1ad02 57 61 6c 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 Wal, rc ? "faile
1ad03 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0d 0a 20 20 d" : "ok"));..
1ad04 77 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 69 walUnlockExclusi
1ad05 76 65 28 70 57 61 6c 2c 20 69 4c 6f 63 6b 2c 20 ve(pWal, iLock,
1ad06 6e 4c 6f 63 6b 29 3b 0d 0a 20 20 72 65 74 75 72 nLock);.. retur
1ad07 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
1ad08 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e ** Close an open
1ad09 20 77 61 6c 2d 69 6e 64 65 78 2e 0d 0a 2a 2f 0d wal-index...*/.
1ad0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 61 6c .static void wal
1ad0b 49 6e 64 65 78 43 6c 6f 73 65 28 57 61 6c 20 2a IndexClose(Wal *
1ad0c 70 57 61 6c 2c 20 69 6e 74 20 69 73 44 65 6c 65 pWal, int isDele
1ad0d 74 65 29 7b 0d 0a 20 20 69 66 28 20 70 57 61 6c te){.. if( pWal
1ad0e 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3d ->exclusiveMode=
1ad0f 3d 57 41 4c 5f 48 45 41 50 4d 45 4d 4f 52 59 5f =WAL_HEAPMEMORY_
1ad10 4d 4f 44 45 20 29 7b 0d 0a 20 20 20 20 69 6e 74 MODE ){.. int
1ad11 20 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 i;.. for(i=0
1ad12 3b 20 69 3c 70 57 61 6c 2d 3e 6e 57 69 44 61 74 ; i<pWal->nWiDat
1ad13 61 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 a; i++){..
1ad14 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f sqlite3_free((vo
1ad15 69 64 20 2a 29 70 57 61 6c 2d 3e 61 70 57 69 44 id *)pWal->apWiD
1ad16 61 74 61 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 ata[i]);..
1ad17 70 57 61 6c 2d 3e 61 70 57 69 44 61 74 61 5b 69 pWal->apWiData[i
1ad18 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ] = 0;.. }..
1ad19 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71 6c }else{.. sql
1ad1a 69 74 65 33 4f 73 53 68 6d 55 6e 6d 61 70 28 70 ite3OsShmUnmap(p
1ad1b 57 61 6c 2d 3e 70 44 62 46 64 2c 20 69 73 44 65 Wal->pDbFd, isDe
1ad1c 6c 65 74 65 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a lete);.. }..}..
1ad1d 0d 0a 2f 2a 20 0d 0a 2a 2a 20 4f 70 65 6e 20 61 ../* ..** Open a
1ad1e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 connection to t
1ad1f 68 65 20 57 41 4c 20 66 69 6c 65 20 7a 57 61 6c he WAL file zWal
1ad20 4e 61 6d 65 2e 20 54 68 65 20 64 61 74 61 62 61 Name. The databa
1ad21 73 65 20 66 69 6c 65 20 6d 75 73 74 20 0d 0a 2a se file must ..*
1ad22 2a 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 * already be ope
1ad23 6e 65 64 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f ned on connectio
1ad24 6e 20 70 44 62 46 64 2e 20 54 68 65 20 62 75 66 n pDbFd. The buf
1ad25 66 65 72 20 74 68 61 74 20 7a 57 61 6c 4e 61 6d fer that zWalNam
1ad26 65 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 e points..** to
1ad27 6d 75 73 74 20 72 65 6d 61 69 6e 20 76 61 6c 69 must remain vali
1ad28 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 d for the lifeti
1ad29 6d 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e me of the return
1ad2a 65 64 20 57 61 6c 2a 20 68 61 6e 64 6c 65 2e 0d ed Wal* handle..
1ad2b 0a 2a 2a 0d 0a 2a 2a 20 41 20 53 48 41 52 45 44 .**..** A SHARED
1ad2c 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 lock should be
1ad2d 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 held on the data
1ad2e 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 base file when t
1ad2f 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a his function..**
1ad30 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 is called. The
1ad31 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 purpose of this
1ad32 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 74 SHARED lock is t
1ad33 6f 20 70 72 65 76 65 6e 74 20 61 6e 79 20 6f 74 o prevent any ot
1ad34 68 65 72 0d 0a 2a 2a 20 63 6c 69 65 6e 74 20 66 her..** client f
1ad35 72 6f 6d 20 75 6e 6c 69 6e 6b 69 6e 67 20 74 68 rom unlinking th
1ad36 65 20 57 41 4c 20 6f 72 20 77 61 6c 2d 69 6e 64 e WAL or wal-ind
1ad37 65 78 20 66 69 6c 65 2e 20 49 66 20 61 6e 6f 74 ex file. If anot
1ad38 68 65 72 20 70 72 6f 63 65 73 73 0d 0a 2a 2a 20 her process..**
1ad39 77 65 72 65 20 74 6f 20 64 6f 20 74 68 69 73 20 were to do this
1ad3a 6a 75 73 74 20 61 66 74 65 72 20 74 68 69 73 20 just after this
1ad3b 63 6c 69 65 6e 74 20 6f 70 65 6e 65 64 20 6f 6e client opened on
1ad3c 65 20 6f 66 20 74 68 65 73 65 20 66 69 6c 65 73 e of these files
1ad3d 2c 20 74 68 65 0d 0a 2a 2a 20 73 79 73 74 65 6d , the..** system
1ad3e 20 77 6f 75 6c 64 20 62 65 20 62 61 64 6c 79 20 would be badly
1ad3f 62 72 6f 6b 65 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 broken...**..**
1ad40 49 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 If the log file
1ad41 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 is successfully
1ad42 6f 70 65 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f opened, SQLITE_O
1ad43 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e K is returned an
1ad44 64 20 0d 0a 2a 2a 20 2a 70 70 57 61 6c 20 69 73 d ..** *ppWal is
1ad45 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f set to point to
1ad46 20 61 20 6e 65 77 20 57 41 4c 20 68 61 6e 64 6c a new WAL handl
1ad47 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f e. If an error o
1ad48 63 63 75 72 73 2c 0d 0a 2a 2a 20 61 6e 20 53 51 ccurs,..** an SQ
1ad49 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
1ad4a 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 is returned and
1ad4b 2a 70 70 57 61 6c 20 69 73 20 6c 65 66 74 20 75 *ppWal is left u
1ad4c 6e 6d 6f 64 69 66 69 65 64 2e 0d 0a 2a 2f 0d 0a nmodified...*/..
1ad4d 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
1ad4e 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 nt sqlite3WalOpe
1ad4f 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 n(.. sqlite3_vf
1ad50 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 s *pVfs,
1ad51 20 20 20 20 20 20 2f 2a 20 76 66 73 20 6d 6f 64 /* vfs mod
1ad52 75 6c 65 20 74 6f 20 6f 70 65 6e 20 77 61 6c 20 ule to open wal
1ad53 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 20 2a 2f and wal-index */
1ad54 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 .. sqlite3_file
1ad55 20 2a 70 44 62 46 64 2c 20 20 20 20 20 20 20 20 *pDbFd,
1ad56 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 /* The open
1ad57 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f database file */
1ad58 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a .. const char *
1ad59 7a 57 61 6c 4e 61 6d 65 2c 20 20 20 20 20 20 20 zWalName,
1ad5a 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 /* Name of t
1ad5b 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0d 0a he WAL file */..
1ad5c 20 20 69 6e 74 20 62 4e 6f 53 68 6d 2c 20 20 20 int bNoShm,
1ad5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ad5e 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e /* True to run
1ad5f 20 69 6e 20 68 65 61 70 2d 6d 65 6d 6f 72 79 20 in heap-memory
1ad60 6d 6f 64 65 20 2a 2f 0d 0a 20 20 69 36 34 20 6d mode */.. i64 m
1ad61 78 57 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 xWalSize,
1ad62 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
1ad63 75 6e 63 61 74 65 20 57 41 4c 20 74 6f 20 74 68 uncate WAL to th
1ad64 69 73 20 73 69 7a 65 20 6f 6e 20 72 65 73 65 74 is size on reset
1ad65 20 2a 2f 0d 0a 20 20 57 61 6c 20 2a 2a 70 70 57 */.. Wal **ppW
1ad66 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 al
1ad67 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 /* OUT: A
1ad68 6c 6c 6f 63 61 74 65 64 20 57 61 6c 20 68 61 6e llocated Wal han
1ad69 64 6c 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e dle */..){.. in
1ad6a 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 t rc;
1ad6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1ad6c 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0d Return Code */.
1ad6d 0a 20 20 57 61 6c 20 2a 70 52 65 74 3b 20 20 20 . Wal *pRet;
1ad6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ad6f 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 /* Object to
1ad70 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 allocate and ret
1ad71 75 72 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c urn */.. int fl
1ad72 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 ags;
1ad73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 /* Fla
1ad74 67 73 20 70 61 73 73 65 64 20 74 6f 20 4f 73 4f gs passed to OsO
1ad75 70 65 6e 28 29 20 2a 2f 0d 0a 0d 0a 20 20 61 73 pen() */.... as
1ad76 73 65 72 74 28 20 7a 57 61 6c 4e 61 6d 65 20 26 sert( zWalName &
1ad77 26 20 7a 57 61 6c 4e 61 6d 65 5b 30 5d 20 29 3b & zWalName[0] );
1ad78 0d 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 .. assert( pDbF
1ad79 64 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 20 d );.... /* In
1ad7a 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e the amalgamation
1ad7b 2c 20 74 68 65 20 6f 73 5f 75 6e 69 78 2e 63 20 , the os_unix.c
1ad7c 61 6e 64 20 6f 73 5f 77 69 6e 2e 63 20 73 6f 75 and os_win.c sou
1ad7d 72 63 65 20 66 69 6c 65 73 20 63 6f 6d 65 20 62 rce files come b
1ad7e 65 66 6f 72 65 0d 0a 20 20 2a 2a 20 74 68 69 73 efore.. ** this
1ad7f 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 20 20 56 source file. V
1ad80 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 23 erify that the #
1ad81 64 65 66 69 6e 65 73 20 6f 66 20 74 68 65 20 6c defines of the l
1ad82 6f 63 6b 69 6e 67 20 62 79 74 65 20 6f 66 66 73 ocking byte offs
1ad83 65 74 73 0d 0a 20 20 2a 2a 20 69 6e 20 6f 73 5f ets.. ** in os_
1ad84 75 6e 69 78 2e 63 20 61 6e 64 20 6f 73 5f 77 69 unix.c and os_wi
1ad85 6e 2e 63 20 61 67 72 65 65 20 77 69 74 68 20 74 n.c agree with t
1ad86 68 65 20 57 41 4c 49 4e 44 45 58 5f 4c 4f 43 4b he WALINDEX_LOCK
1ad87 5f 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 0d 0a _OFFSET value...
1ad88 20 20 2a 2f 0d 0a 23 69 66 64 65 66 20 57 49 4e */..#ifdef WIN
1ad89 5f 53 48 4d 5f 42 41 53 45 0d 0a 20 20 61 73 73 _SHM_BASE.. ass
1ad8a 65 72 74 28 20 57 49 4e 5f 53 48 4d 5f 42 41 53 ert( WIN_SHM_BAS
1ad8b 45 3d 3d 57 41 4c 49 4e 44 45 58 5f 4c 4f 43 4b E==WALINDEX_LOCK
1ad8c 5f 4f 46 46 53 45 54 20 29 3b 0d 0a 23 65 6e 64 _OFFSET );..#end
1ad8d 69 66 0d 0a 23 69 66 64 65 66 20 55 4e 49 58 5f if..#ifdef UNIX_
1ad8e 53 48 4d 5f 42 41 53 45 0d 0a 20 20 61 73 73 65 SHM_BASE.. asse
1ad8f 72 74 28 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 rt( UNIX_SHM_BAS
1ad90 45 3d 3d 57 41 4c 49 4e 44 45 58 5f 4c 4f 43 4b E==WALINDEX_LOCK
1ad91 5f 4f 46 46 53 45 54 20 29 3b 0d 0a 23 65 6e 64 _OFFSET );..#end
1ad92 69 66 0d 0a 0d 0a 0d 0a 20 20 2f 2a 20 41 6c 6c if...... /* All
1ad93 6f 63 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 ocate an instanc
1ad94 65 20 6f 66 20 73 74 72 75 63 74 20 57 61 6c 20 e of struct Wal
1ad95 74 6f 20 72 65 74 75 72 6e 2e 20 2a 2f 0d 0a 20 to return. */..
1ad96 20 2a 70 70 57 61 6c 20 3d 20 30 3b 0d 0a 20 20 *ppWal = 0;..
1ad97 70 52 65 74 20 3d 20 28 57 61 6c 2a 29 73 71 6c pRet = (Wal*)sql
1ad98 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 ite3MallocZero(s
1ad99 69 7a 65 6f 66 28 57 61 6c 29 20 2b 20 70 56 66 izeof(Wal) + pVf
1ad9a 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0d 0a 20 s->szOsFile);..
1ad9b 20 69 66 28 20 21 70 52 65 74 20 29 7b 0d 0a 20 if( !pRet ){..
1ad9c 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1ad9d 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 0d 0a _NOMEM;.. }....
1ad9e 20 20 70 52 65 74 2d 3e 70 56 66 73 20 3d 20 70 pRet->pVfs = p
1ad9f 56 66 73 3b 0d 0a 20 20 70 52 65 74 2d 3e 70 57 Vfs;.. pRet->pW
1ada0 61 6c 46 64 20 3d 20 28 73 71 6c 69 74 65 33 5f alFd = (sqlite3_
1ada1 66 69 6c 65 20 2a 29 26 70 52 65 74 5b 31 5d 3b file *)&pRet[1];
1ada2 0d 0a 20 20 70 52 65 74 2d 3e 70 44 62 46 64 20 .. pRet->pDbFd
1ada3 3d 20 70 44 62 46 64 3b 0d 0a 20 20 70 52 65 74 = pDbFd;.. pRet
1ada4 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 2d 31 3b ->readLock = -1;
1ada5 0d 0a 20 20 70 52 65 74 2d 3e 6d 78 57 61 6c 53 .. pRet->mxWalS
1ada6 69 7a 65 20 3d 20 6d 78 57 61 6c 53 69 7a 65 3b ize = mxWalSize;
1ada7 0d 0a 20 20 70 52 65 74 2d 3e 7a 57 61 6c 4e 61 .. pRet->zWalNa
1ada8 6d 65 20 3d 20 7a 57 61 6c 4e 61 6d 65 3b 0d 0a me = zWalName;..
1ada9 20 20 70 52 65 74 2d 3e 73 79 6e 63 48 65 61 64 pRet->syncHead
1adaa 65 72 20 3d 20 31 3b 0d 0a 20 20 70 52 65 74 2d er = 1;.. pRet-
1adab 3e 70 61 64 54 6f 53 65 63 74 6f 72 42 6f 75 6e >padToSectorBoun
1adac 64 61 72 79 20 3d 20 31 3b 0d 0a 20 20 70 52 65 dary = 1;.. pRe
1adad 74 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 t->exclusiveMode
1adae 20 3d 20 28 62 4e 6f 53 68 6d 20 3f 20 57 41 4c = (bNoShm ? WAL
1adaf 5f 48 45 41 50 4d 45 4d 4f 52 59 5f 4d 4f 44 45 _HEAPMEMORY_MODE
1adb0 3a 20 57 41 4c 5f 4e 4f 52 4d 41 4c 5f 4d 4f 44 : WAL_NORMAL_MOD
1adb1 45 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 4f 70 65 6e E);.... /* Open
1adb2 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 6f 6e 20 file handle on
1adb3 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 the write-ahead
1adb4 6c 6f 67 20 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 log file. */..
1adb5 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f flags = (SQLITE_
1adb6 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 OPEN_READWRITE|S
1adb7 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 QLITE_OPEN_CREAT
1adb8 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 E|SQLITE_OPEN_WA
1adb9 4c 29 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 L);.. rc = sqli
1adba 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 te3OsOpen(pVfs,
1adbb 7a 57 61 6c 4e 61 6d 65 2c 20 70 52 65 74 2d 3e zWalName, pRet->
1adbc 70 57 61 6c 46 64 2c 20 66 6c 61 67 73 2c 20 26 pWalFd, flags, &
1adbd 66 6c 61 67 73 29 3b 0d 0a 20 20 69 66 28 20 72 flags);.. if( r
1adbe 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
1adbf 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 flags&SQLITE_OPE
1adc0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0d 0a 20 N_READONLY ){..
1adc1 20 20 20 70 52 65 74 2d 3e 72 65 61 64 4f 6e 6c pRet->readOnl
1adc2 79 20 3d 20 57 41 4c 5f 52 44 4f 4e 4c 59 3b 0d y = WAL_RDONLY;.
1adc3 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 . }.... if( rc
1adc4 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
1adc5 20 20 20 20 77 61 6c 49 6e 64 65 78 43 6c 6f 73 walIndexClos
1adc6 65 28 70 52 65 74 2c 20 30 29 3b 0d 0a 20 20 20 e(pRet, 0);..
1adc7 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 sqlite3OsClose(
1adc8 70 52 65 74 2d 3e 70 57 61 6c 46 64 29 3b 0d 0a pRet->pWalFd);..
1adc9 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
1adca 28 70 52 65 74 29 3b 0d 0a 20 20 7d 65 6c 73 65 (pRet);.. }else
1adcb 7b 0d 0a 20 20 20 20 69 6e 74 20 69 44 43 20 3d {.. int iDC =
1adcc 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 sqlite3OsDevice
1adcd 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 Characteristics(
1adce 70 52 65 74 2d 3e 70 57 61 6c 46 64 29 3b 0d 0a pRet->pWalFd);..
1adcf 20 20 20 20 69 66 28 20 69 44 43 20 26 20 53 51 if( iDC & SQ
1add0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 LITE_IOCAP_SEQUE
1add1 4e 54 49 41 4c 20 29 7b 20 70 52 65 74 2d 3e 73 NTIAL ){ pRet->s
1add2 79 6e 63 48 65 61 64 65 72 20 3d 20 30 3b 20 7d yncHeader = 0; }
1add3 0d 0a 20 20 20 20 69 66 28 20 69 44 43 20 26 20 .. if( iDC &
1add4 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 SQLITE_IOCAP_POW
1add5 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 ERSAFE_OVERWRITE
1add6 20 29 7b 0d 0a 20 20 20 20 20 20 70 52 65 74 2d ){.. pRet-
1add7 3e 70 61 64 54 6f 53 65 63 74 6f 72 42 6f 75 6e >padToSectorBoun
1add8 64 61 72 79 20 3d 20 30 3b 0d 0a 20 20 20 20 7d dary = 0;.. }
1add9 0d 0a 20 20 20 20 2a 70 70 57 61 6c 20 3d 20 70 .. *ppWal = p
1adda 52 65 74 3b 0d 0a 20 20 20 20 57 41 4c 54 52 41 Ret;.. WALTRA
1addb 43 45 28 28 22 57 41 4c 25 64 3a 20 6f 70 65 6e CE(("WAL%d: open
1addc 65 64 5c 6e 22 2c 20 70 52 65 74 29 29 3b 0d 0a ed\n", pRet));..
1addd 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
1adde 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
1addf 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 74 hange the size t
1ade0 6f 20 77 68 69 63 68 20 74 68 65 20 57 41 4c 20 o which the WAL
1ade1 66 69 6c 65 20 69 73 20 74 72 75 63 61 74 65 64 file is trucated
1ade2 20 6f 6e 20 65 61 63 68 20 72 65 73 65 74 2e 0d on each reset..
1ade3 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1ade4 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
1ade5 57 61 6c 4c 69 6d 69 74 28 57 61 6c 20 2a 70 57 WalLimit(Wal *pW
1ade6 61 6c 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b al, i64 iLimit){
1ade7 0d 0a 20 20 69 66 28 20 70 57 61 6c 20 29 20 70 .. if( pWal ) p
1ade8 57 61 6c 2d 3e 6d 78 57 61 6c 53 69 7a 65 20 3d Wal->mxWalSize =
1ade9 20 69 4c 69 6d 69 74 3b 0d 0a 7d 0d 0a 0d 0a 2f iLimit;..}..../
1adea 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 73 *..** Find the s
1adeb 6d 61 6c 6c 65 73 74 20 70 61 67 65 20 6e 75 6d mallest page num
1adec 62 65 72 20 6f 75 74 20 6f 66 20 61 6c 6c 20 70 ber out of all p
1aded 61 67 65 73 20 68 65 6c 64 20 69 6e 20 74 68 65 ages held in the
1adee 20 57 41 4c 20 74 68 61 74 0d 0a 2a 2a 20 68 61 WAL that..** ha
1adef 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 74 75 72 s not been retur
1adf0 6e 65 64 20 62 79 20 61 6e 79 20 70 72 69 6f 72 ned by any prior
1adf1 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 invocation of t
1adf2 68 69 73 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 his method on th
1adf3 65 0d 0a 2a 2a 20 73 61 6d 65 20 57 61 6c 49 74 e..** same WalIt
1adf4 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 20 20 erator object.
1adf5 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 46 Write into *piF
1adf6 72 61 6d 65 20 74 68 65 20 66 72 61 6d 65 20 69 rame the frame i
1adf7 6e 64 65 78 20 77 68 65 72 65 0d 0a 2a 2a 20 74 ndex where..** t
1adf8 68 61 74 20 70 61 67 65 20 77 61 73 20 6c 61 73 hat page was las
1adf9 74 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 t written into t
1adfa 68 65 20 57 41 4c 2e 20 20 57 72 69 74 65 20 69 he WAL. Write i
1adfb 6e 74 6f 20 2a 70 69 50 61 67 65 20 74 68 65 20 nto *piPage the
1adfc 70 61 67 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 2e page..** number.
1adfd 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 ..**..** Return
1adfe 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 0 on success. I
1adff 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70 f there are no p
1ae00 61 67 65 73 20 69 6e 20 74 68 65 20 57 41 4c 20 ages in the WAL
1ae01 77 69 74 68 20 61 20 70 61 67 65 0d 0a 2a 2a 20 with a page..**
1ae02 6e 75 6d 62 65 72 20 6c 61 72 67 65 72 20 74 68 number larger th
1ae03 61 6e 20 2a 70 69 50 61 67 65 2c 20 74 68 65 6e an *piPage, then
1ae04 20 72 65 74 75 72 6e 20 31 2e 0d 0a 2a 2f 0d 0a return 1...*/..
1ae05 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 49 74 static int walIt
1ae06 65 72 61 74 6f 72 4e 65 78 74 28 0d 0a 20 20 57 eratorNext(.. W
1ae07 61 6c 49 74 65 72 61 74 6f 72 20 2a 70 2c 20 20 alIterator *p,
1ae08 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ae09 49 74 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 75 Iterator */.. u
1ae0a 33 32 20 2a 70 69 50 61 67 65 2c 20 20 20 20 20 32 *piPage,
1ae0b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ae0c 4f 55 54 3a 20 54 68 65 20 70 61 67 65 20 6e 75 OUT: The page nu
1ae0d 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 mber of the next
1ae0e 20 70 61 67 65 20 2a 2f 0d 0a 20 20 75 33 32 20 page */.. u32
1ae0f 2a 70 69 46 72 61 6d 65 20 20 20 20 20 20 20 20 *piFrame
1ae10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 /* OUT
1ae11 3a 20 57 61 6c 20 66 72 61 6d 65 20 69 6e 64 65 : Wal frame inde
1ae12 78 20 6f 66 20 6e 65 78 74 20 70 61 67 65 20 2a x of next page *
1ae13 2f 0d 0a 29 7b 0d 0a 20 20 75 33 32 20 69 4d 69 /..){.. u32 iMi
1ae14 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n;
1ae15 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 /* Result
1ae16 20 70 67 6e 6f 20 6d 75 73 74 20 62 65 20 67 72 pgno must be gr
1ae17 65 61 74 65 72 20 74 68 61 6e 20 69 4d 69 6e 20 eater than iMin
1ae18 2a 2f 0d 0a 20 20 75 33 32 20 69 52 65 74 20 3d */.. u32 iRet =
1ae19 20 30 78 46 46 46 46 46 46 46 46 3b 20 20 20 20 0xFFFFFFFF;
1ae1a 20 20 20 20 2f 2a 20 30 78 66 66 66 66 66 66 66 /* 0xfffffff
1ae1b 66 20 69 73 20 6e 65 76 65 72 20 61 20 76 61 6c f is never a val
1ae1c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a id page number *
1ae1d 2f 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 /.. int i;
1ae1e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ae1f 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e /* For loopin
1ae20 67 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e g through segmen
1ae21 74 73 20 2a 2f 0d 0a 0d 0a 20 20 69 4d 69 6e 20 ts */.... iMin
1ae22 3d 20 70 2d 3e 69 50 72 69 6f 72 3b 0d 0a 20 20 = p->iPrior;..
1ae23 61 73 73 65 72 74 28 20 69 4d 69 6e 3c 30 78 66 assert( iMin<0xf
1ae24 66 66 66 66 66 66 66 20 29 3b 0d 0a 20 20 66 6f fffffff );.. fo
1ae25 72 28 69 3d 70 2d 3e 6e 53 65 67 6d 65 6e 74 2d r(i=p->nSegment-
1ae26 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 1; i>=0; i--){..
1ae27 20 20 20 20 73 74 72 75 63 74 20 57 61 6c 53 65 struct WalSe
1ae28 67 6d 65 6e 74 20 2a 70 53 65 67 6d 65 6e 74 20 gment *pSegment
1ae29 3d 20 26 70 2d 3e 61 53 65 67 6d 65 6e 74 5b 69 = &p->aSegment[i
1ae2a 5d 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 ];.. while( p
1ae2b 53 65 67 6d 65 6e 74 2d 3e 69 4e 65 78 74 3c 70 Segment->iNext<p
1ae2c 53 65 67 6d 65 6e 74 2d 3e 6e 45 6e 74 72 79 20 Segment->nEntry
1ae2d 29 7b 0d 0a 20 20 20 20 20 20 75 33 32 20 69 50 ){.. u32 iP
1ae2e 67 20 3d 20 70 53 65 67 6d 65 6e 74 2d 3e 61 50 g = pSegment->aP
1ae2f 67 6e 6f 5b 70 53 65 67 6d 65 6e 74 2d 3e 61 49 gno[pSegment->aI
1ae30 6e 64 65 78 5b 70 53 65 67 6d 65 6e 74 2d 3e 69 ndex[pSegment->i
1ae31 4e 65 78 74 5d 5d 3b 0d 0a 20 20 20 20 20 20 69 Next]];.. i
1ae32 66 28 20 69 50 67 3e 69 4d 69 6e 20 29 7b 0d 0a f( iPg>iMin ){..
1ae33 20 20 20 20 20 20 20 20 69 66 28 20 69 50 67 3c if( iPg<
1ae34 69 52 65 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 iRet ){..
1ae35 20 20 20 69 52 65 74 20 3d 20 69 50 67 3b 0d 0a iRet = iPg;..
1ae36 20 20 20 20 20 20 20 20 20 20 2a 70 69 46 72 61 *piFra
1ae37 6d 65 20 3d 20 70 53 65 67 6d 65 6e 74 2d 3e 69 me = pSegment->i
1ae38 5a 65 72 6f 20 2b 20 70 53 65 67 6d 65 6e 74 2d Zero + pSegment-
1ae39 3e 61 49 6e 64 65 78 5b 70 53 65 67 6d 65 6e 74 >aIndex[pSegment
1ae3a 2d 3e 69 4e 65 78 74 5d 3b 0d 0a 20 20 20 20 20 ->iNext];..
1ae3b 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 62 72 }.. br
1ae3c 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 eak;.. }..
1ae3d 20 20 20 20 20 70 53 65 67 6d 65 6e 74 2d 3e 69 pSegment->i
1ae3e 4e 65 78 74 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a Next++;.. }..
1ae3f 20 20 7d 0d 0a 0d 0a 20 20 2a 70 69 50 61 67 65 }.... *piPage
1ae40 20 3d 20 70 2d 3e 69 50 72 69 6f 72 20 3d 20 69 = p->iPrior = i
1ae41 52 65 74 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 Ret;.. return (
1ae42 69 52 65 74 3d 3d 30 78 46 46 46 46 46 46 46 46 iRet==0xFFFFFFFF
1ae43 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 );..}..../*..**
1ae44 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 This function me
1ae45 72 67 65 73 20 74 77 6f 20 73 6f 72 74 65 64 20 rges two sorted
1ae46 6c 69 73 74 73 20 69 6e 74 6f 20 61 20 73 69 6e lists into a sin
1ae47 67 6c 65 20 73 6f 72 74 65 64 20 6c 69 73 74 2e gle sorted list.
1ae48 0d 0a 2a 2a 0d 0a 2a 2a 20 61 4c 65 66 74 5b 5d ..**..** aLeft[]
1ae49 20 61 6e 64 20 61 52 69 67 68 74 5b 5d 20 61 72 and aRight[] ar
1ae4a 65 20 61 72 72 61 79 73 20 6f 66 20 69 6e 64 69 e arrays of indi
1ae4b 63 65 73 2e 20 20 54 68 65 20 73 6f 72 74 20 6b ces. The sort k
1ae4c 65 79 20 69 73 0d 0a 2a 2a 20 61 43 6f 6e 74 65 ey is..** aConte
1ae4d 6e 74 5b 61 4c 65 66 74 5b 5d 5d 20 61 6e 64 20 nt[aLeft[]] and
1ae4e 61 43 6f 6e 74 65 6e 74 5b 61 52 69 67 68 74 5b aContent[aRight[
1ae4f 5d 5d 2e 20 20 55 70 6f 6e 20 65 6e 74 72 79 2c ]]. Upon entry,
1ae50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a the following..
1ae51 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 ** is guaranteed
1ae52 20 66 6f 72 20 61 6c 6c 20 4a 3c 4b 3a 0d 0a 2a for all J<K:..*
1ae53 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 61 43 6f *..** aCo
1ae54 6e 74 65 6e 74 5b 61 4c 65 66 74 5b 4a 5d 5d 20 ntent[aLeft[J]]
1ae55 3c 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 65 66 74 < aContent[aLeft
1ae56 5b 4b 5d 5d 0d 0a 2a 2a 20 20 20 20 20 20 20 20 [K]]..**
1ae57 61 43 6f 6e 74 65 6e 74 5b 61 52 69 67 68 74 5b aContent[aRight[
1ae58 4a 5d 5d 20 3c 20 61 43 6f 6e 74 65 6e 74 5b 61 J]] < aContent[a
1ae59 52 69 67 68 74 5b 4b 5d 5d 0d 0a 2a 2a 0d 0a 2a Right[K]]..**..*
1ae5a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f * This routine o
1ae5b 76 65 72 77 72 69 74 65 73 20 61 52 69 67 68 74 verwrites aRight
1ae5c 5b 5d 20 77 69 74 68 20 61 20 6e 65 77 20 28 70 [] with a new (p
1ae5d 72 6f 62 61 62 6c 79 20 6c 6f 6e 67 65 72 29 20 robably longer)
1ae5e 73 65 71 75 65 6e 63 65 0d 0a 2a 2a 20 6f 66 20 sequence..** of
1ae5f 69 6e 64 69 63 65 73 20 73 75 63 68 20 74 68 61 indices such tha
1ae60 74 20 74 68 65 20 61 52 69 67 68 74 5b 5d 20 63 t the aRight[] c
1ae61 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 69 6e ontains every in
1ae62 64 65 78 20 74 68 61 74 20 61 70 70 65 61 72 73 dex that appears
1ae63 20 69 6e 0d 0a 2a 2a 20 65 69 74 68 65 72 20 61 in..** either a
1ae64 4c 65 66 74 5b 5d 20 6f 72 20 74 68 65 20 6f 6c Left[] or the ol
1ae65 64 20 61 52 69 67 68 74 5b 5d 20 61 6e 64 20 73 d aRight[] and s
1ae66 75 63 68 20 74 68 61 74 20 74 68 65 20 73 65 63 uch that the sec
1ae67 6f 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 0d 0a 2a ond condition..*
1ae68 2a 20 61 62 6f 76 65 20 69 73 20 73 74 69 6c 6c * above is still
1ae69 20 6d 65 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 met...**..** Th
1ae6a 65 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 65 66 74 e aContent[aLeft
1ae6b 5b 58 5d 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c [X]] values will
1ae6c 20 62 65 20 75 6e 69 71 75 65 20 66 6f 72 20 61 be unique for a
1ae6d 6c 6c 20 58 2e 20 20 41 6e 64 20 74 68 65 0d 0a ll X. And the..
1ae6e 2a 2a 20 61 43 6f 6e 74 65 6e 74 5b 61 52 69 67 ** aContent[aRig
1ae6f 68 74 5b 58 5d 5d 20 76 61 6c 75 65 73 20 77 69 ht[X]] values wi
1ae70 6c 6c 20 62 65 20 75 6e 69 71 75 65 20 74 6f 6f ll be unique too
1ae71 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 . But there mig
1ae72 68 74 20 62 65 0d 0a 2a 2a 20 6f 6e 65 20 6f 72 ht be..** one or
1ae73 20 6d 6f 72 65 20 63 6f 6d 62 69 6e 61 74 69 6f more combinatio
1ae74 6e 73 20 6f 66 20 58 20 61 6e 64 20 59 20 73 75 ns of X and Y su
1ae75 63 68 20 74 68 61 74 0d 0a 2a 2a 0d 0a 2a 2a 20 ch that..**..**
1ae76 20 20 20 20 20 61 4c 65 66 74 5b 58 5d 21 3d 61 aLeft[X]!=a
1ae77 52 69 67 68 74 5b 59 5d 20 20 26 26 20 20 61 43 Right[Y] && aC
1ae78 6f 6e 74 65 6e 74 5b 61 4c 65 66 74 5b 58 5d 5d ontent[aLeft[X]]
1ae79 20 3d 3d 20 61 43 6f 6e 74 65 6e 74 5b 61 52 69 == aContent[aRi
1ae7a 67 68 74 5b 59 5d 5d 0d 0a 2a 2a 0d 0a 2a 2a 20 ght[Y]]..**..**
1ae7b 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e When that happen
1ae7c 73 2c 20 6f 6d 69 74 20 74 68 65 20 61 4c 65 66 s, omit the aLef
1ae7d 74 5b 58 5d 20 61 6e 64 20 75 73 65 20 74 68 65 t[X] and use the
1ae7e 20 61 52 69 67 68 74 5b 59 5d 20 69 6e 64 65 78 aRight[Y] index
1ae7f 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f ...*/..static vo
1ae80 69 64 20 77 61 6c 4d 65 72 67 65 28 0d 0a 20 20 id walMerge(..
1ae81 63 6f 6e 73 74 20 75 33 32 20 2a 61 43 6f 6e 74 const u32 *aCont
1ae82 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 ent,
1ae83 2f 2a 20 50 61 67 65 73 20 69 6e 20 77 61 6c 20 /* Pages in wal
1ae84 2d 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 73 - keys for the s
1ae85 6f 72 74 20 2a 2f 0d 0a 20 20 68 74 5f 73 6c 6f ort */.. ht_slo
1ae86 74 20 2a 61 4c 65 66 74 2c 20 20 20 20 20 20 20 t *aLeft,
1ae87 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a /* IN:
1ae88 20 4c 65 66 74 20 68 61 6e 64 20 69 6e 70 75 74 Left hand input
1ae89 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 list */.. int
1ae8a 6e 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 nLeft,
1ae8b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
1ae8c 4e 3a 20 45 6c 65 6d 65 6e 74 73 20 69 6e 20 61 N: Elements in a
1ae8d 72 72 61 79 20 2a 70 61 4c 65 66 74 20 2a 2f 0d rray *paLeft */.
1ae8e 0a 20 20 68 74 5f 73 6c 6f 74 20 2a 2a 70 61 52 . ht_slot **paR
1ae8f 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 ight,
1ae90 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 /* IN/OUT: Ri
1ae91 67 68 74 20 68 61 6e 64 20 69 6e 70 75 74 20 6c ght hand input l
1ae92 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 ist */.. int *p
1ae93 6e 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 nRight,
1ae94 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f /* IN/
1ae95 4f 55 54 3a 20 45 6c 65 6d 65 6e 74 73 20 69 6e OUT: Elements in
1ae96 20 2a 70 61 52 69 67 68 74 20 2a 2f 0d 0a 20 20 *paRight */..
1ae97 68 74 5f 73 6c 6f 74 20 2a 61 54 6d 70 20 20 20 ht_slot *aTmp
1ae98 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ae99 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66 /* Temporary buf
1ae9a 66 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e fer */..){.. in
1ae9b 74 20 69 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 t iLeft = 0;
1ae9c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1ae9d 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 Current index i
1ae9e 6e 20 61 4c 65 66 74 20 2a 2f 0d 0a 20 20 69 6e n aLeft */.. in
1ae9f 74 20 69 52 69 67 68 74 20 3d 20 30 3b 20 20 20 t iRight = 0;
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1aea1 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 Current index i
1aea2 6e 20 61 52 69 67 68 74 20 2a 2f 0d 0a 20 20 69 n aRight */.. i
1aea3 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 nt iOut = 0;
1aea4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1aea5 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 * Current index
1aea6 69 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 in output buffer
1aea7 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 52 69 67 68 */.. int nRigh
1aea8 74 20 3d 20 2a 70 6e 52 69 67 68 74 3b 0d 0a 20 t = *pnRight;..
1aea9 20 68 74 5f 73 6c 6f 74 20 2a 61 52 69 67 68 74 ht_slot *aRight
1aeaa 20 3d 20 2a 70 61 52 69 67 68 74 3b 0d 0a 0d 0a = *paRight;....
1aeab 20 20 61 73 73 65 72 74 28 20 6e 4c 65 66 74 3e assert( nLeft>
1aeac 30 20 26 26 20 6e 52 69 67 68 74 3e 30 20 29 3b 0 && nRight>0 );
1aead 0d 0a 20 20 77 68 69 6c 65 28 20 69 52 69 67 68 .. while( iRigh
1aeae 74 3c 6e 52 69 67 68 74 20 7c 7c 20 69 4c 65 66 t<nRight || iLef
1aeaf 74 3c 6e 4c 65 66 74 20 29 7b 0d 0a 20 20 20 20 t<nLeft ){..
1aeb0 68 74 5f 73 6c 6f 74 20 6c 6f 67 70 61 67 65 3b ht_slot logpage;
1aeb1 0d 0a 20 20 20 20 50 67 6e 6f 20 64 62 70 61 67 .. Pgno dbpag
1aeb2 65 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 28 69 e;.... if( (i
1aeb3 4c 65 66 74 3c 6e 4c 65 66 74 29 20 0d 0a 20 20 Left<nLeft) ..
1aeb4 20 20 20 26 26 20 28 69 52 69 67 68 74 3e 3d 6e && (iRight>=n
1aeb5 52 69 67 68 74 20 7c 7c 20 61 43 6f 6e 74 65 6e Right || aConten
1aeb6 74 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 3c t[aLeft[iLeft]]<
1aeb7 61 43 6f 6e 74 65 6e 74 5b 61 52 69 67 68 74 5b aContent[aRight[
1aeb8 69 52 69 67 68 74 5d 5d 29 0d 0a 20 20 20 20 29 iRight]]).. )
1aeb9 7b 0d 0a 20 20 20 20 20 20 6c 6f 67 70 61 67 65 {.. logpage
1aeba 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 2b 2b = aLeft[iLeft++
1aebb 5d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a ];.. }else{..
1aebc 20 20 20 20 20 20 6c 6f 67 70 61 67 65 20 3d 20 logpage =
1aebd 61 52 69 67 68 74 5b 69 52 69 67 68 74 2b 2b 5d aRight[iRight++]
1aebe 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 64 62 ;.. }.. db
1aebf 70 61 67 65 20 3d 20 61 43 6f 6e 74 65 6e 74 5b page = aContent[
1aec0 6c 6f 67 70 61 67 65 5d 3b 0d 0a 0d 0a 20 20 20 logpage];....
1aec1 20 61 54 6d 70 5b 69 4f 75 74 2b 2b 5d 20 3d 20 aTmp[iOut++] =
1aec2 6c 6f 67 70 61 67 65 3b 0d 0a 20 20 20 20 69 66 logpage;.. if
1aec3 28 20 69 4c 65 66 74 3c 6e 4c 65 66 74 20 26 26 ( iLeft<nLeft &&
1aec4 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 65 66 74 5b aContent[aLeft[
1aec5 69 4c 65 66 74 5d 5d 3d 3d 64 62 70 61 67 65 20 iLeft]]==dbpage
1aec6 29 20 69 4c 65 66 74 2b 2b 3b 0d 0a 0d 0a 20 20 ) iLeft++;....
1aec7 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3e assert( iLeft>
1aec8 3d 6e 4c 65 66 74 20 7c 7c 20 61 43 6f 6e 74 65 =nLeft || aConte
1aec9 6e 74 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d nt[aLeft[iLeft]]
1aeca 3e 64 62 70 61 67 65 20 29 3b 0d 0a 20 20 20 20 >dbpage );..
1aecb 61 73 73 65 72 74 28 20 69 52 69 67 68 74 3e 3d assert( iRight>=
1aecc 6e 52 69 67 68 74 20 7c 7c 20 61 43 6f 6e 74 65 nRight || aConte
1aecd 6e 74 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74 nt[aRight[iRight
1aece 5d 5d 3e 64 62 70 61 67 65 20 29 3b 0d 0a 20 20 ]]>dbpage );..
1aecf 7d 0d 0a 0d 0a 20 20 2a 70 61 52 69 67 68 74 20 }.... *paRight
1aed0 3d 20 61 4c 65 66 74 3b 0d 0a 20 20 2a 70 6e 52 = aLeft;.. *pnR
1aed1 69 67 68 74 20 3d 20 69 4f 75 74 3b 0d 0a 20 20 ight = iOut;..
1aed2 6d 65 6d 63 70 79 28 61 4c 65 66 74 2c 20 61 54 memcpy(aLeft, aT
1aed3 6d 70 2c 20 73 69 7a 65 6f 66 28 61 54 6d 70 5b mp, sizeof(aTmp[
1aed4 30 5d 29 2a 69 4f 75 74 29 3b 0d 0a 7d 0d 0a 0d 0])*iOut);..}...
1aed5 0a 2f 2a 0d 0a 2a 2a 20 53 6f 72 74 20 74 68 65 ./*..** Sort the
1aed6 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 elements in lis
1aed7 74 20 61 4c 69 73 74 20 75 73 69 6e 67 20 61 43 t aList using aC
1aed8 6f 6e 74 65 6e 74 5b 5d 20 61 73 20 74 68 65 20 ontent[] as the
1aed9 73 6f 72 74 20 6b 65 79 2e 0d 0a 2a 2a 20 52 65 sort key...** Re
1aeda 6d 6f 76 65 20 65 6c 65 6d 65 6e 74 73 20 77 69 move elements wi
1aedb 74 68 20 64 75 70 6c 69 63 61 74 65 20 6b 65 79 th duplicate key
1aedc 73 2c 20 70 72 65 66 65 72 72 69 6e 67 20 74 6f s, preferring to
1aedd 20 6b 65 65 70 20 74 68 65 0d 0a 2a 2a 20 6c 61 keep the..** la
1aede 72 67 65 72 20 61 4c 69 73 74 5b 5d 20 76 61 6c rger aList[] val
1aedf 75 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ues...**..** The
1aee0 20 61 4c 69 73 74 5b 5d 20 65 6e 74 72 69 65 73 aList[] entries
1aee1 20 61 72 65 20 69 6e 64 69 63 65 73 20 69 6e 74 are indices int
1aee2 6f 20 61 43 6f 6e 74 65 6e 74 5b 5d 2e 20 20 54 o aContent[]. T
1aee3 68 65 20 76 61 6c 75 65 73 20 69 6e 0d 0a 2a 2a he values in..**
1aee4 20 61 4c 69 73 74 5b 5d 20 61 72 65 20 74 6f 20 aList[] are to
1aee5 62 65 20 73 6f 72 74 65 64 20 73 6f 20 74 68 61 be sorted so tha
1aee6 74 20 66 6f 72 20 61 6c 6c 20 4a 3c 4b 3a 0d 0a t for all J<K:..
1aee7 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 61 43 6f 6e **..** aCon
1aee8 74 65 6e 74 5b 61 4c 69 73 74 5b 4a 5d 5d 20 3c tent[aList[J]] <
1aee9 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 69 73 74 5b aContent[aList[
1aeea 4b 5d 5d 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 K]]..**..** For
1aeeb 61 6e 79 20 58 20 61 6e 64 20 59 20 73 75 63 68 any X and Y such
1aeec 20 74 68 61 74 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 that..**..**
1aeed 20 20 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 69 73 aContent[aLis
1aeee 74 5b 58 5d 5d 20 3d 3d 20 61 43 6f 6e 74 65 6e t[X]] == aConten
1aeef 74 5b 61 4c 69 73 74 5b 59 5d 5d 0d 0a 2a 2a 0d t[aList[Y]]..**.
1aef0 0a 2a 2a 20 4b 65 65 70 20 74 68 65 20 6c 61 72 .** Keep the lar
1aef1 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 76 ger of the two v
1aef2 61 6c 75 65 73 20 61 4c 69 73 74 5b 58 5d 20 61 alues aList[X] a
1aef3 6e 64 20 61 4c 69 73 74 5b 59 5d 20 61 6e 64 20 nd aList[Y] and
1aef4 64 69 73 63 61 72 64 0d 0a 2a 2a 20 74 68 65 20 discard..** the
1aef5 73 6d 61 6c 6c 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 smaller...*/..st
1aef6 61 74 69 63 20 76 6f 69 64 20 77 61 6c 4d 65 72 atic void walMer
1aef7 67 65 73 6f 72 74 28 0d 0a 20 20 63 6f 6e 73 74 gesort(.. const
1aef8 20 75 33 32 20 2a 61 43 6f 6e 74 65 6e 74 2c 20 u32 *aContent,
1aef9 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
1aefa 67 65 73 20 69 6e 20 77 61 6c 20 2a 2f 0d 0a 20 ges in wal */..
1aefb 20 68 74 5f 73 6c 6f 74 20 2a 61 42 75 66 66 65 ht_slot *aBuffe
1aefc 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r,
1aefd 20 2f 2a 20 42 75 66 66 65 72 20 6f 66 20 61 74 /* Buffer of at
1aefe 20 6c 65 61 73 74 20 2a 70 6e 4c 69 73 74 20 69 least *pnList i
1aeff 74 65 6d 73 20 74 6f 20 75 73 65 20 2a 2f 0d 0a tems to use */..
1af00 20 20 68 74 5f 73 6c 6f 74 20 2a 61 4c 69 73 74 ht_slot *aList
1af01 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1af02 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 69 73 /* IN/OUT: Lis
1af03 74 20 74 6f 20 73 6f 72 74 20 2a 2f 0d 0a 20 20 t to sort */..
1af04 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 int *pnList
1af05 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af06 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 /* IN/OUT: Numbe
1af07 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e r of elements in
1af08 20 61 4c 69 73 74 5b 5d 20 2a 2f 0d 0a 29 7b 0d aList[] */..){.
1af09 0a 20 20 73 74 72 75 63 74 20 53 75 62 6c 69 73 . struct Sublis
1af0a 74 20 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 4c 69 t {.. int nLi
1af0b 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 st;
1af0c 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
1af0d 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 of elements in
1af0e 61 4c 69 73 74 20 2a 2f 0d 0a 20 20 20 20 68 74 aList */.. ht
1af0f 5f 73 6c 6f 74 20 2a 61 4c 69 73 74 3b 20 20 20 _slot *aList;
1af10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
1af11 6f 69 6e 74 65 72 20 74 6f 20 73 75 62 2d 6c 69 ointer to sub-li
1af12 73 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0d 0a 20 st content */..
1af13 20 7d 3b 0d 0a 0d 0a 20 20 63 6f 6e 73 74 20 69 };.... const i
1af14 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 nt nList = *pnLi
1af15 73 74 3b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 st; /* Size
1af16 20 6f 66 20 69 6e 70 75 74 20 6c 69 73 74 20 2a of input list *
1af17 2f 0d 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 /.. int nMerge
1af18 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
1af19 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1af1a 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 f elements in li
1af1b 73 74 20 61 4d 65 72 67 65 20 2a 2f 0d 0a 20 20 st aMerge */..
1af1c 68 74 5f 73 6c 6f 74 20 2a 61 4d 65 72 67 65 20 ht_slot *aMerge
1af1d 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
1af1e 2f 2a 20 4c 69 73 74 20 74 6f 20 62 65 20 6d 65 /* List to be me
1af1f 72 67 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 rged */.. int i
1af20 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 List;
1af21 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e /* In
1af22 64 65 78 20 69 6e 74 6f 20 69 6e 70 75 74 20 6c dex into input l
1af23 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53 ist */.. int iS
1af24 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ub = 0;
1af25 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind
1af26 65 78 20 69 6e 74 6f 20 61 53 75 62 20 61 72 72 ex into aSub arr
1af27 61 79 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 ay */.. struct
1af28 53 75 62 6c 69 73 74 20 61 53 75 62 5b 31 33 5d Sublist aSub[13]
1af29 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 ; /* Arra
1af2a 79 20 6f 66 20 73 75 62 2d 6c 69 73 74 73 20 2a y of sub-lists *
1af2b 2f 0d 0a 0d 0a 20 20 6d 65 6d 73 65 74 28 61 53 /.... memset(aS
1af2c 75 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 ub, 0, sizeof(aS
1af2d 75 62 29 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ub));.. assert(
1af2e 20 6e 4c 69 73 74 3c 3d 48 41 53 48 54 41 42 4c nList<=HASHTABL
1af2f 45 5f 4e 50 41 47 45 20 26 26 20 6e 4c 69 73 74 E_NPAGE && nList
1af30 3e 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 >0 );.. assert(
1af31 20 48 41 53 48 54 41 42 4c 45 5f 4e 50 41 47 45 HASHTABLE_NPAGE
1af32 3d 3d 28 31 3c 3c 28 41 72 72 61 79 53 69 7a 65 ==(1<<(ArraySize
1af33 28 61 53 75 62 29 2d 31 29 29 20 29 3b 0d 0a 0d (aSub)-1)) );...
1af34 0a 20 20 66 6f 72 28 69 4c 69 73 74 3d 30 3b 20 . for(iList=0;
1af35 69 4c 69 73 74 3c 6e 4c 69 73 74 3b 20 69 4c 69 iList<nList; iLi
1af36 73 74 2b 2b 29 7b 0d 0a 20 20 20 20 6e 4d 65 72 st++){.. nMer
1af37 67 65 20 3d 20 31 3b 0d 0a 20 20 20 20 61 4d 65 ge = 1;.. aMe
1af38 72 67 65 20 3d 20 26 61 4c 69 73 74 5b 69 4c 69 rge = &aList[iLi
1af39 73 74 5d 3b 0d 0a 20 20 20 20 66 6f 72 28 69 53 st];.. for(iS
1af3a 75 62 3d 30 3b 20 69 4c 69 73 74 20 26 20 28 31 ub=0; iList & (1
1af3b 3c 3c 69 53 75 62 29 3b 20 69 53 75 62 2b 2b 29 <<iSub); iSub++)
1af3c 7b 0d 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 {.. struct
1af3d 53 75 62 6c 69 73 74 20 2a 70 20 3d 20 26 61 53 Sublist *p = &aS
1af3e 75 62 5b 69 53 75 62 5d 3b 0d 0a 20 20 20 20 20 ub[iSub];..
1af3f 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c 69 73 assert( p->aLis
1af40 74 20 26 26 20 70 2d 3e 6e 4c 69 73 74 3c 3d 28 t && p->nList<=(
1af41 31 3c 3c 69 53 75 62 29 20 29 3b 0d 0a 20 20 20 1<<iSub) );..
1af42 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c assert( p->aL
1af43 69 73 74 3d 3d 26 61 4c 69 73 74 5b 69 4c 69 73 ist==&aList[iLis
1af44 74 26 7e 28 28 32 3c 3c 69 53 75 62 29 2d 31 29 t&~((2<<iSub)-1)
1af45 5d 20 29 3b 0d 0a 20 20 20 20 20 20 77 61 6c 4d ] );.. walM
1af46 65 72 67 65 28 61 43 6f 6e 74 65 6e 74 2c 20 70 erge(aContent, p
1af47 2d 3e 61 4c 69 73 74 2c 20 70 2d 3e 6e 4c 69 73 ->aList, p->nLis
1af48 74 2c 20 26 61 4d 65 72 67 65 2c 20 26 6e 4d 65 t, &aMerge, &nMe
1af49 72 67 65 2c 20 61 42 75 66 66 65 72 29 3b 0d 0a rge, aBuffer);..
1af4a 20 20 20 20 7d 0d 0a 20 20 20 20 61 53 75 62 5b }.. aSub[
1af4b 69 53 75 62 5d 2e 61 4c 69 73 74 20 3d 20 61 4d iSub].aList = aM
1af4c 65 72 67 65 3b 0d 0a 20 20 20 20 61 53 75 62 5b erge;.. aSub[
1af4d 69 53 75 62 5d 2e 6e 4c 69 73 74 20 3d 20 6e 4d iSub].nList = nM
1af4e 65 72 67 65 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 erge;.. }....
1af4f 66 6f 72 28 69 53 75 62 2b 2b 3b 20 69 53 75 62 for(iSub++; iSub
1af50 3c 41 72 72 61 79 53 69 7a 65 28 61 53 75 62 29 <ArraySize(aSub)
1af51 3b 20 69 53 75 62 2b 2b 29 7b 0d 0a 20 20 20 20 ; iSub++){..
1af52 69 66 28 20 6e 4c 69 73 74 20 26 20 28 31 3c 3c if( nList & (1<<
1af53 69 53 75 62 29 20 29 7b 0d 0a 20 20 20 20 20 20 iSub) ){..
1af54 73 74 72 75 63 74 20 53 75 62 6c 69 73 74 20 2a struct Sublist *
1af55 70 20 3d 20 26 61 53 75 62 5b 69 53 75 62 5d 3b p = &aSub[iSub];
1af56 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
1af57 70 2d 3e 6e 4c 69 73 74 3c 3d 28 31 3c 3c 69 53 p->nList<=(1<<iS
1af58 75 62 29 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 ub) );.. as
1af59 73 65 72 74 28 20 70 2d 3e 61 4c 69 73 74 3d 3d sert( p->aList==
1af5a 26 61 4c 69 73 74 5b 6e 4c 69 73 74 26 7e 28 28 &aList[nList&~((
1af5b 32 3c 3c 69 53 75 62 29 2d 31 29 5d 20 29 3b 0d 2<<iSub)-1)] );.
1af5c 0a 20 20 20 20 20 20 77 61 6c 4d 65 72 67 65 28 . walMerge(
1af5d 61 43 6f 6e 74 65 6e 74 2c 20 70 2d 3e 61 4c 69 aContent, p->aLi
1af5e 73 74 2c 20 70 2d 3e 6e 4c 69 73 74 2c 20 26 61 st, p->nList, &a
1af5f 4d 65 72 67 65 2c 20 26 6e 4d 65 72 67 65 2c 20 Merge, &nMerge,
1af60 61 42 75 66 66 65 72 29 3b 0d 0a 20 20 20 20 7d aBuffer);.. }
1af61 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
1af62 20 61 4d 65 72 67 65 3d 3d 61 4c 69 73 74 20 29 aMerge==aList )
1af63 3b 0d 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20 6e ;.. *pnList = n
1af64 4d 65 72 67 65 3b 0d 0a 0d 0a 23 69 66 64 65 66 Merge;....#ifdef
1af65 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 SQLITE_DEBUG..
1af66 20 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a {.. int i;..
1af67 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 2a for(i=1; i<*
1af68 70 6e 4c 69 73 74 3b 20 69 2b 2b 29 7b 0d 0a 20 pnList; i++){..
1af69 20 20 20 20 20 61 73 73 65 72 74 28 20 61 43 6f assert( aCo
1af6a 6e 74 65 6e 74 5b 61 4c 69 73 74 5b 69 5d 5d 20 ntent[aList[i]]
1af6b 3e 20 61 43 6f 6e 74 65 6e 74 5b 61 4c 69 73 74 > aContent[aList
1af6c 5b 69 2d 31 5d 5d 20 29 3b 0d 0a 20 20 20 20 7d [i-1]] );.. }
1af6d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 7d .. }..#endif..}
1af6e 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 46 72 65 65 ..../* ..** Free
1af6f 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 6c 6c an iterator all
1af70 6f 63 61 74 65 64 20 62 79 20 77 61 6c 49 74 65 ocated by walIte
1af71 72 61 74 6f 72 49 6e 69 74 28 29 2e 0d 0a 2a 2f ratorInit()...*/
1af72 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 61 ..static void wa
1af73 6c 49 74 65 72 61 74 6f 72 46 72 65 65 28 57 61 lIteratorFree(Wa
1af74 6c 49 74 65 72 61 74 6f 72 20 2a 70 29 7b 0d 0a lIterator *p){..
1af75 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 sqlite3Scratch
1af76 46 72 65 65 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f Free(p);..}..../
1af77 2a 0d 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 *..** Construct
1af78 61 20 57 61 6c 49 6e 74 65 72 61 74 6f 72 20 6f a WalInterator o
1af79 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 20 62 bject that can b
1af7a 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f e used to loop o
1af7b 76 65 72 20 61 6c 6c 20 0d 0a 2a 2a 20 70 61 67 ver all ..** pag
1af7c 65 73 20 69 6e 20 74 68 65 20 57 41 4c 20 69 6e es in the WAL in
1af7d 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 ascending order
1af7e 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 . The caller mus
1af7f 74 20 68 6f 6c 64 20 74 68 65 20 63 68 65 63 6b t hold the check
1af80 70 6f 69 6e 74 0d 0a 2a 2a 20 6c 6f 63 6b 2e 0d point..** lock..
1af81 0a 2a 2a 0d 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 .**..** On succe
1af82 73 73 2c 20 6d 61 6b 65 20 2a 70 70 20 70 6f 69 ss, make *pp poi
1af83 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 nt to the newly
1af84 61 6c 6c 6f 63 61 74 65 64 20 57 61 6c 49 6e 74 allocated WalInt
1af85 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 0d 0a 2a erator object..*
1af86 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f * return SQLITE_
1af87 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 OK. Otherwise, r
1af88 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 eturn an error c
1af89 6f 64 65 2e 20 49 66 20 74 68 69 73 20 72 6f 75 ode. If this rou
1af8a 74 69 6e 65 0d 0a 2a 2a 20 72 65 74 75 72 6e 73 tine..** returns
1af8b 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 65 20 76 an error, the v
1af8c 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 alue of *pp is u
1af8d 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a ndefined...**..*
1af8e 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f * The calling ro
1af8f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6e 76 utine should inv
1af90 6f 6b 65 20 77 61 6c 49 74 65 72 61 74 6f 72 46 oke walIteratorF
1af91 72 65 65 28 29 20 74 6f 20 64 65 73 74 72 6f 79 ree() to destroy
1af92 20 74 68 65 0d 0a 2a 2a 20 57 61 6c 49 74 65 72 the..** WalIter
1af93 61 74 6f 72 20 6f 62 6a 65 63 74 20 77 68 65 6e ator object when
1af94 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 it has finished
1af95 20 77 69 74 68 20 69 74 2e 0d 0a 2a 2f 0d 0a 73 with it...*/..s
1af96 74 61 74 69 63 20 69 6e 74 20 77 61 6c 49 74 65 tatic int walIte
1af97 72 61 74 6f 72 49 6e 69 74 28 57 61 6c 20 2a 70 ratorInit(Wal *p
1af98 57 61 6c 2c 20 57 61 6c 49 74 65 72 61 74 6f 72 Wal, WalIterator
1af99 20 2a 2a 70 70 29 7b 0d 0a 20 20 57 61 6c 49 74 **pp){.. WalIt
1af9a 65 72 61 74 6f 72 20 2a 70 3b 20 20 20 20 20 20 erator *p;
1af9b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
1af9c 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0d 0a 20 turn value */..
1af9d 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20 int nSegment;
1af9e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af9f 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 /* Number of se
1afa0 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 gments to merge
1afa1 2a 2f 0d 0a 20 20 75 33 32 20 69 4c 61 73 74 3b */.. u32 iLast;
1afa2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1afa3 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 /* Last fr
1afa4 61 6d 65 20 69 6e 20 6c 6f 67 20 2a 2f 0d 0a 20 ame in log */..
1afa5 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 int nByte;
1afa6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1afa7 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
1afa8 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 tes to allocate
1afa9 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 */.. int i;
1afaa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1afab 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f /* Iterato
1afac 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 r variable */..
1afad 20 68 74 5f 73 6c 6f 74 20 2a 61 54 6d 70 3b 20 ht_slot *aTmp;
1afae 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1afaf 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 75 /* Temp space u
1afb0 73 65 64 20 62 79 20 6d 65 72 67 65 2d 73 6f 72 sed by merge-sor
1afb1 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 20 3d t */.. int rc =
1afb2 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 SQLITE_OK;
1afb3 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
1afb4 6e 20 43 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 2f n Code */.... /
1afb5 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f * This routine o
1afb6 6e 6c 79 20 72 75 6e 73 20 77 68 69 6c 65 20 68 nly runs while h
1afb7 6f 6c 64 69 6e 67 20 74 68 65 20 63 68 65 63 6b olding the check
1afb8 70 6f 69 6e 74 20 6c 6f 63 6b 2e 20 41 6e 64 0d point lock. And.
1afb9 0a 20 20 2a 2a 20 69 74 20 6f 6e 6c 79 20 72 75 . ** it only ru
1afba 6e 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 ns if there is a
1afbb 63 74 75 61 6c 6c 79 20 63 6f 6e 74 65 6e 74 20 ctually content
1afbc 69 6e 20 74 68 65 20 6c 6f 67 20 28 6d 78 46 72 in the log (mxFr
1afbd 61 6d 65 3e 30 29 2e 0d 0a 20 20 2a 2f 0d 0a 20 ame>0)... */..
1afbe 20 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 63 assert( pWal->c
1afbf 6b 70 74 4c 6f 63 6b 20 26 26 20 70 57 61 6c 2d kptLock && pWal-
1afc0 3e 68 64 72 2e 6d 78 46 72 61 6d 65 3e 30 20 29 >hdr.mxFrame>0 )
1afc1 3b 0d 0a 20 20 69 4c 61 73 74 20 3d 20 70 57 61 ;.. iLast = pWa
1afc2 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 3b 0d l->hdr.mxFrame;.
1afc3 0a 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 ... /* Allocate
1afc4 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 57 space for the W
1afc5 61 6c 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 alIterator objec
1afc6 74 2e 20 2a 2f 0d 0a 20 20 6e 53 65 67 6d 65 6e t. */.. nSegmen
1afc7 74 20 3d 20 77 61 6c 46 72 61 6d 65 50 61 67 65 t = walFramePage
1afc8 28 69 4c 61 73 74 29 20 2b 20 31 3b 0d 0a 20 20 (iLast) + 1;..
1afc9 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 57 nByte = sizeof(W
1afca 61 6c 49 74 65 72 61 74 6f 72 29 20 0d 0a 20 20 alIterator) ..
1afcb 20 20 20 20 20 20 2b 20 28 6e 53 65 67 6d 65 6e + (nSegmen
1afcc 74 2d 31 29 2a 73 69 7a 65 6f 66 28 73 74 72 75 t-1)*sizeof(stru
1afcd 63 74 20 57 61 6c 53 65 67 6d 65 6e 74 29 0d 0a ct WalSegment)..
1afce 20 20 20 20 20 20 20 20 2b 20 69 4c 61 73 74 2a + iLast*
1afcf 73 69 7a 65 6f 66 28 68 74 5f 73 6c 6f 74 29 3b sizeof(ht_slot);
1afd0 0d 0a 20 20 70 20 3d 20 28 57 61 6c 49 74 65 72 .. p = (WalIter
1afd1 61 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 53 63 ator *)sqlite3Sc
1afd2 72 61 74 63 68 4d 61 6c 6c 6f 63 28 6e 42 79 74 ratchMalloc(nByt
1afd3 65 29 3b 0d 0a 20 20 69 66 28 20 21 70 20 29 7b e);.. if( !p ){
1afd4 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c .. return SQL
1afd5 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d ITE_NOMEM;.. }.
1afd6 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 . memset(p, 0,
1afd7 6e 42 79 74 65 29 3b 0d 0a 20 20 70 2d 3e 6e 53 nByte);.. p->nS
1afd8 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e egment = nSegmen
1afd9 74 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 t;.... /* Alloc
1afda 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 73 70 ate temporary sp
1afdb 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 ace used by the
1afdc 6d 65 72 67 65 2d 73 6f 72 74 20 72 6f 75 74 69 merge-sort routi
1afdd 6e 65 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0d 0a ne. This block..
1afde 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 77 ** of memory w
1afdf 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 65 66 ill be freed bef
1afe0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f ore this functio
1afe1 6e 20 72 65 74 75 72 6e 73 2e 0d 0a 20 20 2a 2f n returns... */
1afe2 0d 0a 20 20 61 54 6d 70 20 3d 20 28 68 74 5f 73 .. aTmp = (ht_s
1afe3 6c 6f 74 20 2a 29 73 71 6c 69 74 65 33 53 63 72 lot *)sqlite3Scr
1afe4 61 74 63 68 4d 61 6c 6c 6f 63 28 0d 0a 20 20 20 atchMalloc(..
1afe5 20 20 20 73 69 7a 65 6f 66 28 68 74 5f 73 6c 6f sizeof(ht_slo
1afe6 74 29 20 2a 20 28 69 4c 61 73 74 3e 48 41 53 48 t) * (iLast>HASH
1afe7 54 41 42 4c 45 5f 4e 50 41 47 45 3f 48 41 53 48 TABLE_NPAGE?HASH
1afe8 54 41 42 4c 45 5f 4e 50 41 47 45 3a 69 4c 61 73 TABLE_NPAGE:iLas
1afe9 74 29 0d 0a 20 20 29 3b 0d 0a 20 20 69 66 28 20 t).. );.. if(
1afea 21 61 54 6d 70 20 29 7b 0d 0a 20 20 20 20 72 63 !aTmp ){.. rc
1afeb 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
1afec 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 6f 72 28 69 .. }.... for(i
1afed 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f =0; rc==SQLITE_O
1afee 4b 20 26 26 20 69 3c 6e 53 65 67 6d 65 6e 74 3b K && i<nSegment;
1afef 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 76 6f 6c 61 i++){.. vola
1aff0 74 69 6c 65 20 68 74 5f 73 6c 6f 74 20 2a 61 48 tile ht_slot *aH
1aff1 61 73 68 3b 0d 0a 20 20 20 20 75 33 32 20 69 5a ash;.. u32 iZ
1aff2 65 72 6f 3b 0d 0a 20 20 20 20 76 6f 6c 61 74 69 ero;.. volati
1aff3 6c 65 20 75 33 32 20 2a 61 50 67 6e 6f 3b 0d 0a le u32 *aPgno;..
1aff4 0d 0a 20 20 20 20 72 63 20 3d 20 77 61 6c 48 61 .. rc = walHa
1aff5 73 68 47 65 74 28 70 57 61 6c 2c 20 69 2c 20 26 shGet(pWal, i, &
1aff6 61 48 61 73 68 2c 20 26 61 50 67 6e 6f 2c 20 26 aHash, &aPgno, &
1aff7 69 5a 65 72 6f 29 3b 0d 0a 20 20 20 20 69 66 28 iZero);.. if(
1aff8 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1aff9 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 20 {.. int j;
1affa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1affb 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 /* Counter
1affc 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 variable */..
1affd 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 int nEntry;
1affe 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1afff 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 * Number of entr
1b000 69 65 73 20 69 6e 20 74 68 69 73 20 73 65 67 6d ies in this segm
1b001 65 6e 74 20 2a 2f 0d 0a 20 20 20 20 20 20 68 74 ent */.. ht
1b002 5f 73 6c 6f 74 20 2a 61 49 6e 64 65 78 3b 20 20 _slot *aIndex;
1b003 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 /* Sor
1b004 74 65 64 20 69 6e 64 65 78 20 66 6f 72 20 74 68 ted index for th
1b005 69 73 20 73 65 67 6d 65 6e 74 20 2a 2f 0d 0a 0d is segment */...
1b006 0a 20 20 20 20 20 20 61 50 67 6e 6f 2b 2b 3b 0d . aPgno++;.
1b007 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 31 29 . if( (i+1)
1b008 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 7b 0d 0a 20 ==nSegment ){..
1b009 20 20 20 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 nEntry =
1b00a 28 69 6e 74 29 28 69 4c 61 73 74 20 2d 20 69 5a (int)(iLast - iZ
1b00b 65 72 6f 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c ero);.. }el
1b00c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 6e 45 6e se{.. nEn
1b00d 74 72 79 20 3d 20 28 69 6e 74 29 28 28 75 33 32 try = (int)((u32
1b00e 2a 29 61 48 61 73 68 20 2d 20 28 75 33 32 2a 29 *)aHash - (u32*)
1b00f 61 50 67 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 7d aPgno);.. }
1b010 0d 0a 20 20 20 20 20 20 61 49 6e 64 65 78 20 3d .. aIndex =
1b011 20 26 28 28 68 74 5f 73 6c 6f 74 20 2a 29 26 70 &((ht_slot *)&p
1b012 2d 3e 61 53 65 67 6d 65 6e 74 5b 70 2d 3e 6e 53 ->aSegment[p->nS
1b013 65 67 6d 65 6e 74 5d 29 5b 69 5a 65 72 6f 5d 3b egment])[iZero];
1b014 0d 0a 20 20 20 20 20 20 69 5a 65 72 6f 2b 2b 3b .. iZero++;
1b015 0d 0a 20 20 0d 0a 20 20 20 20 20 20 66 6f 72 28 .. .. for(
1b016 6a 3d 30 3b 20 6a 3c 6e 45 6e 74 72 79 3b 20 6a j=0; j<nEntry; j
1b017 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 49 ++){.. aI
1b018 6e 64 65 78 5b 6a 5d 20 3d 20 28 68 74 5f 73 6c ndex[j] = (ht_sl
1b019 6f 74 29 6a 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a ot)j;.. }..
1b01a 20 20 20 20 20 20 77 61 6c 4d 65 72 67 65 73 6f walMergeso
1b01b 72 74 28 28 75 33 32 20 2a 29 61 50 67 6e 6f 2c rt((u32 *)aPgno,
1b01c 20 61 54 6d 70 2c 20 61 49 6e 64 65 78 2c 20 26 aTmp, aIndex, &
1b01d 6e 45 6e 74 72 79 29 3b 0d 0a 20 20 20 20 20 20 nEntry);..
1b01e 70 2d 3e 61 53 65 67 6d 65 6e 74 5b 69 5d 2e 69 p->aSegment[i].i
1b01f 5a 65 72 6f 20 3d 20 69 5a 65 72 6f 3b 0d 0a 20 Zero = iZero;..
1b020 20 20 20 20 20 70 2d 3e 61 53 65 67 6d 65 6e 74 p->aSegment
1b021 5b 69 5d 2e 6e 45 6e 74 72 79 20 3d 20 6e 45 6e [i].nEntry = nEn
1b022 74 72 79 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 61 try;.. p->a
1b023 53 65 67 6d 65 6e 74 5b 69 5d 2e 61 49 6e 64 65 Segment[i].aInde
1b024 78 20 3d 20 61 49 6e 64 65 78 3b 0d 0a 20 20 20 x = aIndex;..
1b025 20 20 20 70 2d 3e 61 53 65 67 6d 65 6e 74 5b 69 p->aSegment[i
1b026 5d 2e 61 50 67 6e 6f 20 3d 20 28 75 33 32 20 2a ].aPgno = (u32 *
1b027 29 61 50 67 6e 6f 3b 0d 0a 20 20 20 20 7d 0d 0a )aPgno;.. }..
1b028 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 53 63 }.. sqlite3Sc
1b029 72 61 74 63 68 46 72 65 65 28 61 54 6d 70 29 3b ratchFree(aTmp);
1b02a 0d 0a 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 .... if( rc!=SQ
1b02b 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1b02c 77 61 6c 49 74 65 72 61 74 6f 72 46 72 65 65 28 walIteratorFree(
1b02d 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 70 20 p);.. }.. *pp
1b02e 3d 20 70 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 = p;.. return r
1b02f 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1b030 41 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 Attempt to obtai
1b031 6e 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 n the exclusive
1b032 57 41 4c 20 6c 6f 63 6b 20 64 65 66 69 6e 65 64 WAL lock defined
1b033 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 20 6c by parameters l
1b034 6f 63 6b 49 64 78 20 61 6e 64 0d 0a 2a 2a 20 6e ockIdx and..** n
1b035 2e 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 . If the attempt
1b036 20 66 61 69 6c 73 20 61 6e 64 20 70 61 72 61 6d fails and param
1b037 65 74 65 72 20 78 42 75 73 79 20 69 73 20 6e 6f eter xBusy is no
1b038 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 t NULL, then it
1b039 69 73 20 61 0d 0a 2a 2a 20 62 75 73 79 2d 68 61 is a..** busy-ha
1b03a 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 ndler function.
1b03b 49 6e 76 6f 6b 65 20 69 74 20 61 6e 64 20 72 65 Invoke it and re
1b03c 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 75 6e 74 try the lock unt
1b03d 69 6c 20 65 69 74 68 65 72 20 74 68 65 0d 0a 2a il either the..*
1b03e 2a 20 6c 6f 63 6b 20 69 73 20 73 75 63 63 65 73 * lock is succes
1b03f 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 20 sfully obtained
1b040 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 or the busy-hand
1b041 6c 65 72 20 72 65 74 75 72 6e 73 20 30 2e 0d 0a ler returns 0...
1b042 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 */..static int w
1b043 61 6c 42 75 73 79 4c 6f 63 6b 28 0d 0a 20 20 57 alBusyLock(.. W
1b044 61 6c 20 2a 70 57 61 6c 2c 20 20 20 20 20 20 20 al *pWal,
1b045 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b046 2a 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e * WAL connection
1b047 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 42 75 */.. int (*xBu
1b048 73 79 29 28 76 6f 69 64 2a 29 2c 20 20 20 20 20 sy)(void*),
1b049 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 /* Functi
1b04a 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 on to call when
1b04b 62 75 73 79 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 busy */.. void
1b04c 2a 70 42 75 73 79 41 72 67 2c 20 20 20 20 20 20 *pBusyArg,
1b04d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1b04e 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 ntext argument f
1b04f 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 or xBusyHandler
1b050 2a 2f 0d 0a 20 20 69 6e 74 20 6c 6f 63 6b 49 64 */.. int lockId
1b051 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 x,
1b052 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 /* Offset
1b053 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 74 6f of first byte to
1b054 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 lock */.. int
1b055 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
1b056 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
1b057 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 umber of bytes t
1b058 6f 20 6c 6f 63 6b 20 2a 2f 0d 0a 29 7b 0d 0a 20 o lock */..){..
1b059 20 69 6e 74 20 72 63 3b 0d 0a 20 20 64 6f 20 7b int rc;.. do {
1b05a 0d 0a 20 20 20 20 72 63 20 3d 20 77 61 6c 4c 6f .. rc = walLo
1b05b 63 6b 45 78 63 6c 75 73 69 76 65 28 70 57 61 6c ckExclusive(pWal
1b05c 2c 20 6c 6f 63 6b 49 64 78 2c 20 6e 29 3b 0d 0a , lockIdx, n);..
1b05d 20 20 7d 77 68 69 6c 65 28 20 78 42 75 73 79 20 }while( xBusy
1b05e 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 && rc==SQLITE_BU
1b05f 53 59 20 26 26 20 78 42 75 73 79 28 70 42 75 73 SY && xBusy(pBus
1b060 79 41 72 67 29 20 29 3b 0d 0a 20 20 72 65 74 75 yArg) );.. retu
1b061 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
1b062 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 6f 66 .** The cache of
1b063 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 the wal-index h
1b064 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 76 61 eader must be va
1b065 6c 69 64 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 lid to call this
1b066 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 20 52 function...** R
1b067 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 2d 73 eturn the page-s
1b068 69 7a 65 20 69 6e 20 62 79 74 65 73 20 75 73 65 ize in bytes use
1b069 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 d by the databas
1b06a 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 e...*/..static i
1b06b 6e 74 20 77 61 6c 50 61 67 65 73 69 7a 65 28 57 nt walPagesize(W
1b06c 61 6c 20 2a 70 57 61 6c 29 7b 0d 0a 20 20 72 65 al *pWal){.. re
1b06d 74 75 72 6e 20 28 70 57 61 6c 2d 3e 68 64 72 2e turn (pWal->hdr.
1b06e 73 7a 50 61 67 65 26 30 78 66 65 30 30 29 20 2b szPage&0xfe00) +
1b06f 20 28 28 70 57 61 6c 2d 3e 68 64 72 2e 73 7a 50 ((pWal->hdr.szP
1b070 61 67 65 26 30 78 30 30 30 31 29 3c 3c 31 36 29 age&0x0001)<<16)
1b071 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
1b072 6f 70 79 20 61 73 20 6d 75 63 68 20 63 6f 6e 74 opy as much cont
1b073 65 6e 74 20 61 73 20 77 65 20 63 61 6e 20 66 72 ent as we can fr
1b074 6f 6d 20 74 68 65 20 57 41 4c 20 62 61 63 6b 20 om the WAL back
1b075 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 into the databas
1b076 65 20 66 69 6c 65 0d 0a 2a 2a 20 69 6e 20 72 65 e file..** in re
1b077 73 70 6f 6e 73 65 20 74 6f 20 61 6e 20 73 71 6c sponse to an sql
1b078 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f ite3_wal_checkpo
1b079 69 6e 74 28 29 20 72 65 71 75 65 73 74 20 6f 72 int() request or
1b07a 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e the equivalent.
1b07b 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 6d 6f ..**..** The amo
1b07c 75 6e 74 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 unt of informati
1b07d 6f 6e 20 63 6f 70 69 65 73 20 66 72 6f 6d 20 57 on copies from W
1b07e 41 4c 20 74 6f 20 64 61 74 61 62 61 73 65 20 6d AL to database m
1b07f 69 67 68 74 20 62 65 20 6c 69 6d 69 74 65 64 0d ight be limited.
1b080 0a 2a 2a 20 62 79 20 61 63 74 69 76 65 20 72 65 .** by active re
1b081 61 64 65 72 73 2e 20 20 54 68 69 73 20 72 6f 75 aders. This rou
1b082 74 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 tine will never
1b083 6f 76 65 72 77 72 69 74 65 20 61 20 64 61 74 61 overwrite a data
1b084 62 61 73 65 20 70 61 67 65 0d 0a 2a 2a 20 74 68 base page..** th
1b085 61 74 20 61 20 63 6f 6e 63 75 72 72 65 6e 74 20 at a concurrent
1b086 72 65 61 64 65 72 20 6d 69 67 68 74 20 62 65 20 reader might be
1b087 75 73 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 using...**..** A
1b088 6c 6c 20 49 2f 4f 20 62 61 72 72 69 65 72 20 6f ll I/O barrier o
1b089 70 65 72 61 74 69 6f 6e 73 20 28 61 2e 6b 2e 61 perations (a.k.a
1b08a 20 66 73 79 6e 63 73 29 20 6f 63 63 75 72 20 69 fsyncs) occur i
1b08b 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 n this routine w
1b08c 68 65 6e 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 69 hen..** SQLite i
1b08d 73 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 20 69 6e s in WAL-mode in
1b08e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 synchronous=NOR
1b08f 4d 41 4c 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 MAL. That means
1b090 20 74 68 61 74 20 69 66 20 0d 0a 2a 2a 20 63 68 that if ..** ch
1b091 65 63 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 6c eckpoints are al
1b092 77 61 79 73 20 72 75 6e 20 62 79 20 61 20 62 61 ways run by a ba
1b093 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 ckground thread
1b094 6f 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 0d 0a or background ..
1b095 2a 2a 20 70 72 6f 63 65 73 73 2c 20 66 6f 72 65 ** process, fore
1b096 67 72 6f 75 6e 64 20 74 68 72 65 61 64 73 20 77 ground threads w
1b097 69 6c 6c 20 6e 65 76 65 72 20 62 6c 6f 63 6b 20 ill never block
1b098 6f 6e 20 61 20 6c 65 6e 67 74 68 79 20 66 73 79 on a lengthy fsy
1b099 6e 63 20 63 61 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a nc call...**..**
1b09a 20 46 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 Fsync is called
1b09b 20 6f 6e 20 74 68 65 20 57 41 4c 20 62 65 66 6f on the WAL befo
1b09c 72 65 20 77 72 69 74 69 6e 67 20 63 6f 6e 74 65 re writing conte
1b09d 6e 74 20 6f 75 74 20 6f 66 20 74 68 65 20 57 41 nt out of the WA
1b09e 4c 20 61 6e 64 0d 0a 2a 2a 20 69 6e 74 6f 20 74 L and..** into t
1b09f 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 he database. Th
1b0a0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 is ensures that
1b0a1 69 66 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 if the new conte
1b0a2 6e 74 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 nt is persistent
1b0a3 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c 20 ..** in the WAL
1b0a4 61 6e 64 20 63 61 6e 20 62 65 20 72 65 63 6f 76 and can be recov
1b0a5 65 72 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 ered following a
1b0a6 20 70 6f 77 65 72 2d 6c 6f 73 73 20 6f 72 20 68 power-loss or h
1b0a7 61 72 64 20 72 65 73 65 74 2e 0d 0a 2a 2a 0d 0a ard reset...**..
1b0a8 2a 2a 20 46 73 79 6e 63 20 69 73 20 61 6c 73 6f ** Fsync is also
1b0a9 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 64 called on the d
1b0aa 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 atabase file if
1b0ab 28 61 6e 64 20 6f 6e 6c 79 20 69 66 29 20 74 68 (and only if) th
1b0ac 65 20 65 6e 74 69 72 65 0d 0a 2a 2a 20 57 41 4c e entire..** WAL
1b0ad 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6f 70 69 content is copi
1b0ae 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 ed into the data
1b0af 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 base file. This
1b0b0 20 73 65 63 6f 6e 64 20 66 73 79 6e 63 20 6d 61 second fsync ma
1b0b1 6b 65 73 0d 0a 2a 2a 20 69 74 20 73 61 66 65 20 kes..** it safe
1b0b2 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 57 41 to delete the WA
1b0b3 4c 20 73 69 6e 63 65 20 74 68 65 20 6e 65 77 20 L since the new
1b0b4 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 70 65 72 content will per
1b0b5 73 69 73 74 20 69 6e 20 74 68 65 0d 0a 2a 2a 20 sist in the..**
1b0b6 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a database file...
1b0b7 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
1b0b8 69 6e 65 20 75 73 65 73 20 61 6e 64 20 75 70 64 ine uses and upd
1b0b9 61 74 65 73 20 74 68 65 20 6e 42 61 63 6b 66 69 ates the nBackfi
1b0ba 6c 6c 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 ll field of the
1b0bb 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 wal-index header
1b0bc 2e 0d 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 ...** This is th
1b0bd 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 74 e only routine t
1b0be 68 61 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 ha will increase
1b0bf 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 42 the value of nB
1b0c0 61 63 6b 66 69 6c 6c 2e 20 20 0d 0a 2a 2a 20 28 ackfill. ..** (
1b0c1 41 20 57 41 4c 20 72 65 73 65 74 20 6f 72 20 72 A WAL reset or r
1b0c2 65 63 6f 76 65 72 79 20 77 69 6c 6c 20 72 65 76 ecovery will rev
1b0c3 65 72 74 20 6e 42 61 63 6b 66 69 6c 6c 20 74 6f ert nBackfill to
1b0c4 20 7a 65 72 6f 2c 20 62 75 74 20 6e 6f 74 20 69 zero, but not i
1b0c5 6e 63 72 65 61 73 65 0d 0a 2a 2a 20 69 74 73 20 ncrease..** its
1b0c6 76 61 6c 75 65 2e 29 0d 0a 2a 2a 0d 0a 2a 2a 20 value.)..**..**
1b0c7 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 The caller must
1b0c8 62 65 20 68 6f 6c 64 69 6e 67 20 73 75 66 66 69 be holding suffi
1b0c9 63 69 65 6e 74 20 6c 6f 63 6b 73 20 74 6f 20 65 cient locks to e
1b0ca 6e 73 75 72 65 20 74 68 61 74 20 6e 6f 20 6f 74 nsure that no ot
1b0cb 68 65 72 0d 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 her..** checkpoi
1b0cc 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 20 28 69 nt is running (i
1b0cd 6e 20 61 6e 79 20 6f 74 68 65 72 20 74 68 72 65 n any other thre
1b0ce 61 64 20 6f 72 20 70 72 6f 63 65 73 73 29 20 61 ad or process) a
1b0cf 74 20 74 68 65 20 73 61 6d 65 0d 0a 2a 2a 20 74 t the same..** t
1b0d0 69 6d 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ime...*/..static
1b0d1 20 69 6e 74 20 77 61 6c 43 68 65 63 6b 70 6f 69 int walCheckpoi
1b0d2 6e 74 28 0d 0a 20 20 57 61 6c 20 2a 70 57 61 6c nt(.. Wal *pWal
1b0d3 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1b0d4 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 63 6f /* Wal co
1b0d5 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 nnection */.. i
1b0d6 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 nt eMode,
1b0d7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b0d8 2a 20 4f 6e 65 20 6f 66 20 50 41 53 53 49 56 45 * One of PASSIVE
1b0d9 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 , FULL or RESTAR
1b0da 54 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 42 T */.. int (*xB
1b0db 75 73 79 43 61 6c 6c 29 28 76 6f 69 64 2a 29 2c usyCall)(void*),
1b0dc 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 /* Funct
1b0dd 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e ion to call when
1b0de 20 62 75 73 79 20 2a 2f 0d 0a 20 20 76 6f 69 64 busy */.. void
1b0df 20 2a 70 42 75 73 79 41 72 67 2c 20 20 20 20 20 *pBusyArg,
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
1b0e1 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 ontext argument
1b0e2 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 for xBusyHandler
1b0e3 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 6e 63 5f */.. int sync_
1b0e4 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 flags,
1b0e5 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 /* Flags
1b0e6 66 6f 72 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 for OsSync() (or
1b0e7 20 30 29 20 2a 2f 0d 0a 20 20 75 38 20 2a 7a 42 0) */.. u8 *zB
1b0e8 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 uf
1b0e9 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d /* Tem
1b0ea 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f porary buffer to
1b0eb 20 75 73 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 use */..){.. i
1b0ec 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
1b0ed 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b0ee 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
1b0ef 0d 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 .. int szPage;
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b0f1 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
1b0f2 70 61 67 65 2d 73 69 7a 65 20 2a 2f 0d 0a 20 20 page-size */..
1b0f3 57 61 6c 49 74 65 72 61 74 6f 72 20 2a 70 49 74 WalIterator *pIt
1b0f4 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 er = 0;
1b0f5 2f 2a 20 57 61 6c 20 69 74 65 72 61 74 6f 72 20 /* Wal iterator
1b0f6 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a 20 20 75 33 context */.. u3
1b0f7 32 20 69 44 62 70 61 67 65 20 3d 20 30 3b 20 20 2 iDbpage = 0;
1b0f8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b0f9 20 4e 65 78 74 20 64 61 74 61 62 61 73 65 20 70 Next database p
1b0fa 61 67 65 20 74 6f 20 77 72 69 74 65 20 2a 2f 0d age to write */.
1b0fb 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 . u32 iFrame =
1b0fc 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
1b0fd 20 20 20 2f 2a 20 57 61 6c 20 66 72 61 6d 65 20 /* Wal frame
1b0fe 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20 containing data
1b0ff 66 6f 72 20 69 44 62 70 61 67 65 20 2a 2f 0d 0a for iDbpage */..
1b100 20 20 75 33 32 20 6d 78 53 61 66 65 46 72 61 6d u32 mxSafeFram
1b101 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1b102 20 20 2f 2a 20 4d 61 78 20 66 72 61 6d 65 20 74 /* Max frame t
1b103 68 61 74 20 63 61 6e 20 62 65 20 62 61 63 6b 66 hat can be backf
1b104 69 6c 6c 65 64 20 2a 2f 0d 0a 20 20 75 33 32 20 illed */.. u32
1b105 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 mxPage;
1b106 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
1b107 61 78 20 64 61 74 61 62 61 73 65 20 70 61 67 65 ax database page
1b108 20 74 6f 20 77 72 69 74 65 20 2a 2f 0d 0a 20 20 to write */..
1b109 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 int i;
1b10a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b10b 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 /* Loop counter
1b10c 2a 2f 0d 0a 20 20 76 6f 6c 61 74 69 6c 65 20 57 */.. volatile W
1b10d 61 6c 43 6b 70 74 49 6e 66 6f 20 2a 70 49 6e 66 alCkptInfo *pInf
1b10e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 68 65 o; /* The che
1b10f 63 6b 70 6f 69 6e 74 20 73 74 61 74 75 73 20 69 ckpoint status i
1b110 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0d 0a 20 nformation */..
1b111 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f int (*xBusy)(vo
1b112 69 64 2a 29 20 3d 20 30 3b 20 20 20 20 20 20 20 id*) = 0;
1b113 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 /* Function to
1b114 63 61 6c 6c 20 77 68 65 6e 20 77 61 69 74 69 6e call when waitin
1b115 67 20 66 6f 72 20 6c 6f 63 6b 73 20 2a 2f 0d 0a g for locks */..
1b116 0d 0a 20 20 73 7a 50 61 67 65 20 3d 20 77 61 6c .. szPage = wal
1b117 50 61 67 65 73 69 7a 65 28 70 57 61 6c 29 3b 0d Pagesize(pWal);.
1b118 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 50 . testcase( szP
1b119 61 67 65 3c 3d 33 32 37 36 38 20 29 3b 0d 0a 20 age<=32768 );..
1b11a 20 74 65 73 74 63 61 73 65 28 20 73 7a 50 61 67 testcase( szPag
1b11b 65 3e 3d 36 35 35 33 36 20 29 3b 0d 0a 20 20 70 e>=65536 );.. p
1b11c 49 6e 66 6f 20 3d 20 77 61 6c 43 6b 70 74 49 6e Info = walCkptIn
1b11d 66 6f 28 70 57 61 6c 29 3b 0d 0a 20 20 69 66 28 fo(pWal);.. if(
1b11e 20 70 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 69 6c pInfo->nBackfil
1b11f 6c 3e 3d 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 l>=pWal->hdr.mxF
1b120 72 61 6d 65 20 29 20 72 65 74 75 72 6e 20 53 51 rame ) return SQ
1b121 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 2f 2a LITE_OK;.... /*
1b122 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 74 Allocate the it
1b123 65 72 61 74 6f 72 20 2a 2f 0d 0a 20 20 72 63 20 erator */.. rc
1b124 3d 20 77 61 6c 49 74 65 72 61 74 6f 72 49 6e 69 = walIteratorIni
1b125 74 28 70 57 61 6c 2c 20 26 70 49 74 65 72 29 3b t(pWal, &pIter);
1b126 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 .. if( rc!=SQLI
1b127 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 65 TE_OK ){.. re
1b128 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 20 turn rc;.. }..
1b129 20 61 73 73 65 72 74 28 20 70 49 74 65 72 20 29 assert( pIter )
1b12a 3b 0d 0a 0d 0a 20 20 69 66 28 20 65 4d 6f 64 65 ;.... if( eMode
1b12b 21 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f !=SQLITE_CHECKPO
1b12c 49 4e 54 5f 50 41 53 53 49 56 45 20 29 20 78 42 INT_PASSIVE ) xB
1b12d 75 73 79 20 3d 20 78 42 75 73 79 43 61 6c 6c 3b usy = xBusyCall;
1b12e 0d 0a 0d 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 .... /* Compute
1b12f 20 69 6e 20 6d 78 53 61 66 65 46 72 61 6d 65 20 in mxSafeFrame
1b130 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 the index of the
1b131 20 6c 61 73 74 20 66 72 61 6d 65 20 6f 66 20 74 last frame of t
1b132 68 65 20 57 41 4c 20 74 68 61 74 20 69 73 0d 0a he WAL that is..
1b133 20 20 2a 2a 20 73 61 66 65 20 74 6f 20 77 72 69 ** safe to wri
1b134 74 65 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 te into the data
1b135 62 61 73 65 2e 20 20 46 72 61 6d 65 73 20 62 65 base. Frames be
1b136 79 6f 6e 64 20 6d 78 53 61 66 65 46 72 61 6d 65 yond mxSafeFrame
1b137 20 6d 69 67 68 74 0d 0a 20 20 2a 2a 20 6f 76 65 might.. ** ove
1b138 72 77 72 69 74 65 20 64 61 74 61 62 61 73 65 20 rwrite database
1b139 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 pages that are i
1b13a 6e 20 75 73 65 20 62 79 20 61 63 74 69 76 65 20 n use by active
1b13b 72 65 61 64 65 72 73 20 61 6e 64 20 74 68 75 73 readers and thus
1b13c 0d 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 .. ** cannot be
1b13d 20 62 61 63 6b 66 69 6c 6c 65 64 20 66 72 6f 6d backfilled from
1b13e 20 74 68 65 20 57 41 4c 2e 0d 0a 20 20 2a 2f 0d the WAL... */.
1b13f 0a 20 20 6d 78 53 61 66 65 46 72 61 6d 65 20 3d . mxSafeFrame =
1b140 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 pWal->hdr.mxFra
1b141 6d 65 3b 0d 0a 20 20 6d 78 50 61 67 65 20 3d 20 me;.. mxPage =
1b142 70 57 61 6c 2d 3e 68 64 72 2e 6e 50 61 67 65 3b pWal->hdr.nPage;
1b143 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 57 .. for(i=1; i<W
1b144 41 4c 5f 4e 52 45 41 44 45 52 3b 20 69 2b 2b 29 AL_NREADER; i++)
1b145 7b 0d 0a 20 20 20 20 75 33 32 20 79 20 3d 20 70 {.. u32 y = p
1b146 49 6e 66 6f 2d 3e 61 52 65 61 64 4d 61 72 6b 5b Info->aReadMark[
1b147 69 5d 3b 0d 0a 20 20 20 20 69 66 28 20 6d 78 53 i];.. if( mxS
1b148 61 66 65 46 72 61 6d 65 3e 79 20 29 7b 0d 0a 20 afeFrame>y ){..
1b149 20 20 20 20 20 61 73 73 65 72 74 28 20 79 3c 3d assert( y<=
1b14a 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d pWal->hdr.mxFram
1b14b 65 20 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d e );.. rc =
1b14c 20 77 61 6c 42 75 73 79 4c 6f 63 6b 28 70 57 61 walBusyLock(pWa
1b14d 6c 2c 20 78 42 75 73 79 2c 20 70 42 75 73 79 41 l, xBusy, pBusyA
1b14e 72 67 2c 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 rg, WAL_READ_LOC
1b14f 4b 28 69 29 2c 20 31 29 3b 0d 0a 20 20 20 20 20 K(i), 1);..
1b150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
1b151 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 OK ){.. p
1b152 49 6e 66 6f 2d 3e 61 52 65 61 64 4d 61 72 6b 5b Info->aReadMark[
1b153 69 5d 20 3d 20 52 45 41 44 4d 41 52 4b 5f 4e 4f i] = READMARK_NO
1b154 54 5f 55 53 45 44 3b 0d 0a 20 20 20 20 20 20 20 T_USED;..
1b155 20 77 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 walUnlockExclus
1b156 69 76 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 ive(pWal, WAL_RE
1b157 41 44 5f 4c 4f 43 4b 28 69 29 2c 20 31 29 3b 0d AD_LOCK(i), 1);.
1b158 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
1b159 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 rc==SQLITE_BUSY
1b15a 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 6d 78 53 ){.. mxS
1b15b 61 66 65 46 72 61 6d 65 20 3d 20 79 3b 0d 0a 20 afeFrame = y;..
1b15c 20 20 20 20 20 20 20 78 42 75 73 79 20 3d 20 30 xBusy = 0
1b15d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d ;.. }else{.
1b15e 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 61 . goto wa
1b15f 6c 63 68 65 63 6b 70 6f 69 6e 74 5f 6f 75 74 3b lcheckpoint_out;
1b160 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
1b161 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 .. }.... if( p
1b162 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 69 6c 6c 3c Info->nBackfill<
1b163 6d 78 53 61 66 65 46 72 61 6d 65 0d 0a 20 20 20 mxSafeFrame..
1b164 26 26 20 28 72 63 20 3d 20 77 61 6c 42 75 73 79 && (rc = walBusy
1b165 4c 6f 63 6b 28 70 57 61 6c 2c 20 78 42 75 73 79 Lock(pWal, xBusy
1b166 2c 20 70 42 75 73 79 41 72 67 2c 20 57 41 4c 5f , pBusyArg, WAL_
1b167 52 45 41 44 5f 4c 4f 43 4b 28 30 29 2c 20 31 29 READ_LOCK(0), 1)
1b168 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0d 0a 20 20 )==SQLITE_OK..
1b169 29 7b 0d 0a 20 20 20 20 69 36 34 20 6e 53 69 7a ){.. i64 nSiz
1b16a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1b16b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 /* Current
1b16c 20 73 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 size of databas
1b16d 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 75 e file */.. u
1b16e 33 32 20 6e 42 61 63 6b 66 69 6c 6c 20 3d 20 70 32 nBackfill = p
1b16f 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 69 6c 6c 3b Info->nBackfill;
1b170 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 .... /* Sync
1b171 74 68 65 20 57 41 4c 20 74 6f 20 64 69 73 6b 20 the WAL to disk
1b172 2a 2f 0d 0a 20 20 20 20 69 66 28 20 73 79 6e 63 */.. if( sync
1b173 5f 66 6c 61 67 73 20 29 7b 0d 0a 20 20 20 20 20 _flags ){..
1b174 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 rc = sqlite3OsS
1b175 79 6e 63 28 70 57 61 6c 2d 3e 70 57 61 6c 46 64 ync(pWal->pWalFd
1b176 2c 20 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0d 0a , sync_flags);..
1b177 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
1b178 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 If the database
1b179 66 69 6c 65 20 6d 61 79 20 67 72 6f 77 20 61 73 file may grow as
1b17a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 a result of thi
1b17b 73 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 68 69 s checkpoint, hi
1b17c 6e 74 0d 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 nt.. ** about
1b17d 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20 73 69 the eventual si
1b17e 7a 65 20 6f 66 20 74 68 65 20 64 62 20 66 69 6c ze of the db fil
1b17f 65 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 e to the VFS lay
1b180 65 72 2e 20 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 er. .. */..
1b181 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1b182 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 69 36 _OK ){.. i6
1b183 34 20 6e 52 65 71 20 3d 20 28 28 69 36 34 29 6d 4 nReq = ((i64)m
1b184 78 50 61 67 65 20 2a 20 73 7a 50 61 67 65 29 3b xPage * szPage);
1b185 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c .. rc = sql
1b186 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 ite3OsFileSize(p
1b187 57 61 6c 2d 3e 70 44 62 46 64 2c 20 26 6e 53 69 Wal->pDbFd, &nSi
1b188 7a 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 ze);.. if(
1b189 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
1b18a 20 6e 53 69 7a 65 3c 6e 52 65 71 20 29 7b 0d 0a nSize<nReq ){..
1b18b 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f sqlite3O
1b18c 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 sFileControlHint
1b18d 28 70 57 61 6c 2d 3e 70 44 62 46 64 2c 20 53 51 (pWal->pDbFd, SQ
1b18e 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f LITE_FCNTL_SIZE_
1b18f 48 49 4e 54 2c 20 26 6e 52 65 71 29 3b 0d 0a 20 HINT, &nReq);..
1b190 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d }.. }...
1b191 0a 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 . /* Iterate
1b192 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 through the cont
1b193 65 6e 74 73 20 6f 66 20 74 68 65 20 57 41 4c 2c ents of the WAL,
1b194 20 63 6f 70 79 69 6e 67 20 64 61 74 61 20 74 6f copying data to
1b195 20 74 68 65 20 64 62 20 66 69 6c 65 2e 20 2a 2f the db file. */
1b196 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d .. while( rc=
1b197 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d =SQLITE_OK && 0=
1b198 3d 77 61 6c 49 74 65 72 61 74 6f 72 4e 65 78 74 =walIteratorNext
1b199 28 70 49 74 65 72 2c 20 26 69 44 62 70 61 67 65 (pIter, &iDbpage
1b19a 2c 20 26 69 46 72 61 6d 65 29 20 29 7b 0d 0a 20 , &iFrame) ){..
1b19b 20 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 i64 iOffset
1b19c 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ;.. assert(
1b19d 20 77 61 6c 46 72 61 6d 65 50 67 6e 6f 28 70 57 walFramePgno(pW
1b19e 61 6c 2c 20 69 46 72 61 6d 65 29 3d 3d 69 44 62 al, iFrame)==iDb
1b19f 70 61 67 65 20 29 3b 0d 0a 20 20 20 20 20 20 69 page );.. i
1b1a0 66 28 20 69 46 72 61 6d 65 3c 3d 6e 42 61 63 6b f( iFrame<=nBack
1b1a1 66 69 6c 6c 20 7c 7c 20 69 46 72 61 6d 65 3e 6d fill || iFrame>m
1b1a2 78 53 61 66 65 46 72 61 6d 65 20 7c 7c 20 69 44 xSafeFrame || iD
1b1a3 62 70 61 67 65 3e 6d 78 50 61 67 65 20 29 20 63 bpage>mxPage ) c
1b1a4 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 ontinue;..
1b1a5 69 4f 66 66 73 65 74 20 3d 20 77 61 6c 46 72 61 iOffset = walFra
1b1a6 6d 65 4f 66 66 73 65 74 28 69 46 72 61 6d 65 2c meOffset(iFrame,
1b1a7 20 73 7a 50 61 67 65 29 20 2b 20 57 41 4c 5f 46 szPage) + WAL_F
1b1a8 52 41 4d 45 5f 48 44 52 53 49 5a 45 3b 0d 0a 20 RAME_HDRSIZE;..
1b1a9 20 20 20 20 20 2f 2a 20 74 65 73 74 63 61 73 65 /* testcase
1b1aa 28 20 49 53 5f 42 49 47 5f 49 4e 54 28 69 4f 66 ( IS_BIG_INT(iOf
1b1ab 66 73 65 74 29 20 29 3b 20 2f 2f 20 72 65 71 75 fset) ); // requ
1b1ac 69 72 65 73 20 61 20 34 47 69 42 20 57 41 4c 20 ires a 4GiB WAL
1b1ad 66 69 6c 65 20 2a 2f 0d 0a 20 20 20 20 20 20 72 file */.. r
1b1ae 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 c = sqlite3OsRea
1b1af 64 28 70 57 61 6c 2d 3e 70 57 61 6c 46 64 2c 20 d(pWal->pWalFd,
1b1b0 7a 42 75 66 2c 20 73 7a 50 61 67 65 2c 20 69 4f zBuf, szPage, iO
1b1b1 66 66 73 65 74 29 3b 0d 0a 20 20 20 20 20 20 69 ffset);.. i
1b1b2 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
1b1b3 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 ) break;..
1b1b4 20 69 4f 66 66 73 65 74 20 3d 20 28 69 44 62 70 iOffset = (iDbp
1b1b5 61 67 65 2d 31 29 2a 28 69 36 34 29 73 7a 50 61 age-1)*(i64)szPa
1b1b6 67 65 3b 0d 0a 20 20 20 20 20 20 74 65 73 74 63 ge;.. testc
1b1b7 61 73 65 28 20 49 53 5f 42 49 47 5f 49 4e 54 28 ase( IS_BIG_INT(
1b1b8 69 4f 66 66 73 65 74 29 20 29 3b 0d 0a 20 20 20 iOffset) );..
1b1b9 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f rc = sqlite3O
1b1ba 73 57 72 69 74 65 28 70 57 61 6c 2d 3e 70 44 62 sWrite(pWal->pDb
1b1bb 46 64 2c 20 7a 42 75 66 2c 20 73 7a 50 61 67 65 Fd, zBuf, szPage
1b1bc 2c 20 69 4f 66 66 73 65 74 29 3b 0d 0a 20 20 20 , iOffset);..
1b1bd 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1b1be 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20 E_OK ) break;..
1b1bf 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 }.... /* I
1b1c0 66 20 77 6f 72 6b 20 77 61 73 20 61 63 74 75 61 f work was actua
1b1c1 6c 6c 79 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 lly accomplished
1b1c2 2e 2e 2e 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 ... */.. if(
1b1c3 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1b1c4 0d 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 61 .. if( mxSa
1b1c5 66 65 46 72 61 6d 65 3d 3d 77 61 6c 49 6e 64 65 feFrame==walInde
1b1c6 78 48 64 72 28 70 57 61 6c 29 2d 3e 6d 78 46 72 xHdr(pWal)->mxFr
1b1c7 61 6d 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ame ){..
1b1c8 69 36 34 20 73 7a 44 62 20 3d 20 70 57 61 6c 2d i64 szDb = pWal-
1b1c9 3e 68 64 72 2e 6e 50 61 67 65 2a 28 69 36 34 29 >hdr.nPage*(i64)
1b1ca 73 7a 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 szPage;..
1b1cb 20 74 65 73 74 63 61 73 65 28 20 49 53 5f 42 49 testcase( IS_BI
1b1cc 47 5f 49 4e 54 28 73 7a 44 62 29 20 29 3b 0d 0a G_INT(szDb) );..
1b1cd 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
1b1ce 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 ite3OsTruncate(p
1b1cf 57 61 6c 2d 3e 70 44 62 46 64 2c 20 73 7a 44 62 Wal->pDbFd, szDb
1b1d0 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 );.. if(
1b1d1 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
1b1d2 20 73 79 6e 63 5f 66 6c 61 67 73 20 29 7b 0d 0a sync_flags ){..
1b1d3 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 rc = s
1b1d4 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 57 61 qlite3OsSync(pWa
1b1d5 6c 2d 3e 70 44 62 46 64 2c 20 73 79 6e 63 5f 66 l->pDbFd, sync_f
1b1d6 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 lags);..
1b1d7 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
1b1d8 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1b1d9 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
1b1da 70 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 69 6c 6c pInfo->nBackfill
1b1db 20 3d 20 6d 78 53 61 66 65 46 72 61 6d 65 3b 0d = mxSafeFrame;.
1b1dc 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
1b1dd 0a 0d 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 ... /* Releas
1b1de 65 20 74 68 65 20 72 65 61 64 65 72 20 6c 6f 63 e the reader loc
1b1df 6b 20 68 65 6c 64 20 77 68 69 6c 65 20 62 61 63 k held while bac
1b1e0 6b 66 69 6c 6c 69 6e 67 20 2a 2f 0d 0a 20 20 20 kfilling */..
1b1e1 20 77 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 walUnlockExclus
1b1e2 69 76 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 ive(pWal, WAL_RE
1b1e3 41 44 5f 4c 4f 43 4b 28 30 29 2c 20 31 29 3b 0d AD_LOCK(0), 1);.
1b1e4 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 . }.... if( rc
1b1e5 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b ==SQLITE_BUSY ){
1b1e6 0d 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 .. /* Reset t
1b1e7 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 73 he return code s
1b1e8 6f 20 61 73 20 6e 6f 74 20 74 6f 20 72 65 70 6f o as not to repo
1b1e9 72 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 rt a checkpoint
1b1ea 66 61 69 6c 75 72 65 0d 0a 20 20 20 20 2a 2a 20 failure.. **
1b1eb 6a 75 73 74 20 62 65 63 61 75 73 65 20 74 68 65 just because the
1b1ec 72 65 20 61 72 65 20 61 63 74 69 76 65 20 72 65 re are active re
1b1ed 61 64 65 72 73 2e 20 20 2a 2f 0d 0a 20 20 20 20 aders. */..
1b1ee 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d rc = SQLITE_OK;.
1b1ef 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 . }.... /* If
1b1f0 74 68 69 73 20 69 73 20 61 6e 20 53 51 4c 49 54 this is an SQLIT
1b1f1 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 E_CHECKPOINT_RES
1b1f2 54 41 52 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 TART operation,
1b1f3 61 6e 64 20 74 68 65 20 65 6e 74 69 72 65 20 77 and the entire w
1b1f4 61 6c 0d 0a 20 20 2a 2a 20 66 69 6c 65 20 68 61 al.. ** file ha
1b1f5 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 69 6e s been copied in
1b1f6 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 to the database
1b1f7 66 69 6c 65 2c 20 74 68 65 6e 20 62 6c 6f 63 6b file, then block
1b1f8 20 75 6e 74 69 6c 20 61 6c 6c 0d 0a 20 20 2a 2a until all.. **
1b1f9 20 72 65 61 64 65 72 73 20 68 61 76 65 20 66 69 readers have fi
1b1fa 6e 69 73 68 65 64 20 75 73 69 6e 67 20 74 68 65 nished using the
1b1fb 20 77 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 wal file. This
1b1fc 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 ensures that the
1b1fd 20 6e 65 78 74 0d 0a 20 20 2a 2a 20 70 72 6f 63 next.. ** proc
1b1fe 65 73 73 20 74 6f 20 77 72 69 74 65 20 74 6f 20 ess to write to
1b1ff 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 the database res
1b200 74 61 72 74 73 20 74 68 65 20 77 61 6c 20 66 69 tarts the wal fi
1b201 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 le... */.. if(
1b202 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
1b203 26 20 65 4d 6f 64 65 21 3d 53 51 4c 49 54 45 5f & eMode!=SQLITE_
1b204 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 CHECKPOINT_PASSI
1b205 56 45 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 VE ){.. asser
1b206 74 28 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f t( pWal->writeLo
1b207 63 6b 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 ck );.. if( p
1b208 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 69 6c 6c 3c Info->nBackfill<
1b209 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d pWal->hdr.mxFram
1b20a 65 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d e ){.. rc =
1b20b 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0d 0a 20 SQLITE_BUSY;..
1b20c 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f }else if( eMo
1b20d 64 65 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b de==SQLITE_CHECK
1b20e 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b POINT_RESTART ){
1b20f 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
1b210 6d 78 53 61 66 65 46 72 61 6d 65 3d 3d 70 57 61 mxSafeFrame==pWa
1b211 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 29 l->hdr.mxFrame )
1b212 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 61 ;.. rc = wa
1b213 6c 42 75 73 79 4c 6f 63 6b 28 70 57 61 6c 2c 20 lBusyLock(pWal,
1b214 78 42 75 73 79 2c 20 70 42 75 73 79 41 72 67 2c xBusy, pBusyArg,
1b215 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 31 WAL_READ_LOCK(1
1b216 29 2c 20 57 41 4c 5f 4e 52 45 41 44 45 52 2d 31 ), WAL_NREADER-1
1b217 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 );.. if( rc
1b218 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1b219 20 20 20 20 20 20 20 20 77 61 6c 55 6e 6c 6f 63 walUnloc
1b21a 6b 45 78 63 6c 75 73 69 76 65 28 70 57 61 6c 2c kExclusive(pWal,
1b21b 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 31 WAL_READ_LOCK(1
1b21c 29 2c 20 57 41 4c 5f 4e 52 45 41 44 45 52 2d 31 ), WAL_NREADER-1
1b21d 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 );.. }..
1b21e 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 77 61 6c 63 }.. }.... walc
1b21f 68 65 63 6b 70 6f 69 6e 74 5f 6f 75 74 3a 0d 0a heckpoint_out:..
1b220 20 20 77 61 6c 49 74 65 72 61 74 6f 72 46 72 65 walIteratorFre
1b221 65 28 70 49 74 65 72 29 3b 0d 0a 20 20 72 65 74 e(pIter);.. ret
1b222 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1b223 0d 0a 2a 2a 20 49 66 20 74 68 65 20 57 41 4c 20 ..** If the WAL
1b224 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c file is currentl
1b225 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 4d y larger than nM
1b226 61 78 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 ax bytes in size
1b227 2c 20 74 72 75 6e 63 61 74 65 0d 0a 2a 2a 20 69 , truncate..** i
1b228 74 20 74 6f 20 65 78 61 63 74 6c 79 20 6e 4d 61 t to exactly nMa
1b229 78 20 62 79 74 65 73 2e 20 49 66 20 61 6e 20 65 x bytes. If an e
1b22a 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c rror occurs whil
1b22b 65 20 64 6f 69 6e 67 20 73 6f 2c 20 69 67 6e 6f e doing so, igno
1b22c 72 65 20 69 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 re it...*/..stat
1b22d 69 63 20 76 6f 69 64 20 77 61 6c 4c 69 6d 69 74 ic void walLimit
1b22e 53 69 7a 65 28 57 61 6c 20 2a 70 57 61 6c 2c 20 Size(Wal *pWal,
1b22f 69 36 34 20 6e 4d 61 78 29 7b 0d 0a 20 20 69 36 i64 nMax){.. i6
1b230 34 20 73 7a 3b 0d 0a 20 20 69 6e 74 20 72 78 3b 4 sz;.. int rx;
1b231 0d 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e .. sqlite3Begin
1b232 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0d BenignMalloc();.
1b233 0a 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33 4f . rx = sqlite3O
1b234 73 46 69 6c 65 53 69 7a 65 28 70 57 61 6c 2d 3e sFileSize(pWal->
1b235 70 57 61 6c 46 64 2c 20 26 73 7a 29 3b 0d 0a 20 pWalFd, &sz);..
1b236 20 69 66 28 20 72 78 3d 3d 53 51 4c 49 54 45 5f if( rx==SQLITE_
1b237 4f 4b 20 26 26 20 28 73 7a 20 3e 20 6e 4d 61 78 OK && (sz > nMax
1b238 20 29 20 29 7b 0d 0a 20 20 20 20 72 78 20 3d 20 ) ){.. rx =
1b239 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 sqlite3OsTruncat
1b23a 65 28 70 57 61 6c 2d 3e 70 57 61 6c 46 64 2c 20 e(pWal->pWalFd,
1b23b 6e 4d 61 78 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 nMax);.. }.. s
1b23c 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d qlite3EndBenignM
1b23d 61 6c 6c 6f 63 28 29 3b 0d 0a 20 20 69 66 28 20 alloc();.. if(
1b23e 72 78 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 rx ){.. sqlit
1b23f 65 33 5f 6c 6f 67 28 72 78 2c 20 22 63 61 6e 6e e3_log(rx, "cann
1b240 6f 74 20 6c 69 6d 69 74 20 57 41 4c 20 73 69 7a ot limit WAL siz
1b241 65 3a 20 25 73 22 2c 20 70 57 61 6c 2d 3e 7a 57 e: %s", pWal->zW
1b242 61 6c 4e 61 6d 65 29 3b 0d 0a 20 20 7d 0d 0a 7d alName);.. }..}
1b243 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 ..../*..** Close
1b244 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f a connection to
1b245 20 61 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 2a 2f a log file...*/
1b246 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1b247 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 43 int sqlite3WalC
1b248 6c 6f 73 65 28 0d 0a 20 20 57 61 6c 20 2a 70 57 lose(.. Wal *pW
1b249 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 al,
1b24a 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 /* Wal
1b24b 74 6f 20 63 6c 6f 73 65 20 2a 2f 0d 0a 20 20 69 to close */.. i
1b24c 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73 2c 20 20 nt sync_flags,
1b24d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b24e 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 * Flags to pass
1b24f 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 to OsSync() (or
1b250 30 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 75 0) */.. int nBu
1b251 66 2c 0d 0a 20 20 75 38 20 2a 7a 42 75 66 20 20 f,.. u8 *zBuf
1b252 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b253 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 /* Buffer
1b254 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 42 75 66 of at least nBuf
1b255 20 62 79 74 65 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 bytes */..){..
1b256 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
1b257 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 70 57 61 6c _OK;.. if( pWal
1b258 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 73 44 ){.. int isD
1b259 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 elete = 0;
1b25a 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 /* True t
1b25b 6f 20 75 6e 6c 69 6e 6b 20 77 61 6c 20 61 6e 64 o unlink wal and
1b25c 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 73 wal-index files
1b25d 20 2a 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 */.... /* If
1b25e 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f an EXCLUSIVE lo
1b25f 63 6b 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e ck can be obtain
1b260 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 ed on the databa
1b261 73 65 20 66 69 6c 65 20 28 75 73 69 6e 67 20 74 se file (using t
1b262 68 65 0d 0a 20 20 20 20 2a 2a 20 6f 72 64 69 6e he.. ** ordin
1b263 61 72 79 2c 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f ary, rollback-mo
1b264 64 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f de locking metho
1b265 64 73 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 ds, this guarant
1b266 65 65 73 20 74 68 61 74 20 74 68 65 0d 0a 20 20 ees that the..
1b267 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 ** connection
1b268 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
1b269 74 68 69 73 20 6c 6f 67 20 66 69 6c 65 20 69 73 this log file is
1b26a 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6e 6e 65 63 the only connec
1b26b 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 2a 2a 20 tion to.. **
1b26c 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e the database. In
1b26d 20 74 68 69 73 20 63 61 73 65 20 63 68 65 63 6b this case check
1b26e 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 point the databa
1b26f 73 65 20 61 6e 64 20 75 6e 6c 69 6e 6b 20 62 6f se and unlink bo
1b270 74 68 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 th.. ** the w
1b271 61 6c 20 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 al and wal-index
1b272 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 2a 2a 0d files... **.
1b273 0a 20 20 20 20 2a 2a 20 54 68 65 20 45 58 43 4c . ** The EXCL
1b274 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6e 6f USIVE lock is no
1b275 74 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 t released befor
1b276 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 20 20 e returning...
1b277 20 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 73 */.. rc = s
1b278 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 57 61 qlite3OsLock(pWa
1b279 6c 2d 3e 70 44 62 46 64 2c 20 53 51 4c 49 54 45 l->pDbFd, SQLITE
1b27a 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 _LOCK_EXCLUSIVE)
1b27b 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 ;.. if( rc==S
1b27c 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1b27d 20 20 20 69 66 28 20 70 57 61 6c 2d 3e 65 78 63 if( pWal->exc
1b27e 6c 75 73 69 76 65 4d 6f 64 65 3d 3d 57 41 4c 5f lusiveMode==WAL_
1b27f 4e 4f 52 4d 41 4c 5f 4d 4f 44 45 20 29 7b 0d 0a NORMAL_MODE ){..
1b280 20 20 20 20 20 20 20 20 70 57 61 6c 2d 3e 65 78 pWal->ex
1b281 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 57 41 clusiveMode = WA
1b282 4c 5f 45 58 43 4c 55 53 49 56 45 5f 4d 4f 44 45 L_EXCLUSIVE_MODE
1b283 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1b284 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 rc = sqlite3Wa
1b285 6c 43 68 65 63 6b 70 6f 69 6e 74 28 0d 0a 20 20 lCheckpoint(..
1b286 20 20 20 20 20 20 20 20 70 57 61 6c 2c 20 53 51 pWal, SQ
1b287 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f LITE_CHECKPOINT_
1b288 50 41 53 53 49 56 45 2c 20 30 2c 20 30 2c 20 73 PASSIVE, 0, 0, s
1b289 79 6e 63 5f 66 6c 61 67 73 2c 20 6e 42 75 66 2c ync_flags, nBuf,
1b28a 20 7a 42 75 66 2c 20 30 2c 20 30 0d 0a 20 20 20 zBuf, 0, 0..
1b28b 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 );.. if(
1b28c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1b28d 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 {.. int b
1b28e 50 65 72 73 69 73 74 20 3d 20 2d 31 3b 0d 0a 20 Persist = -1;..
1b28f 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 sqlite3Os
1b290 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 FileControlHint(
1b291 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57 .. pW
1b292 61 6c 2d 3e 70 44 62 46 64 2c 20 53 51 4c 49 54 al->pDbFd, SQLIT
1b293 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f E_FCNTL_PERSIST_
1b294 57 41 4c 2c 20 26 62 50 65 72 73 69 73 74 0d 0a WAL, &bPersist..
1b295 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 );..
1b296 20 20 20 20 69 66 28 20 62 50 65 72 73 69 73 74 if( bPersist
1b297 21 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 !=1 ){..
1b298 20 20 2f 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 /* Try to dele
1b299 74 65 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 te the WAL file
1b29a 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e if the checkpoin
1b29b 74 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64 0d t completed and.
1b29c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 73 . ** fs
1b29d 79 6e 65 64 20 28 72 63 3d 3d 53 51 4c 49 54 45 yned (rc==SQLITE
1b29e 5f 4f 4b 29 20 61 6e 64 20 69 66 20 77 65 20 61 _OK) and if we a
1b29f 72 65 20 6e 6f 74 20 69 6e 20 70 65 72 73 69 73 re not in persis
1b2a0 74 65 6e 74 2d 77 61 6c 0d 0a 20 20 20 20 20 20 tent-wal..
1b2a1 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 21 62 50 ** mode (!bP
1b2a2 65 72 73 69 73 74 29 20 2a 2f 0d 0a 20 20 20 20 ersist) */..
1b2a3 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d isDelete =
1b2a4 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 1;.. }el
1b2a5 73 65 20 69 66 28 20 70 57 61 6c 2d 3e 6d 78 57 se if( pWal->mxW
1b2a6 61 6c 53 69 7a 65 3e 3d 30 20 29 7b 0d 0a 20 20 alSize>=0 ){..
1b2a7 20 20 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 /* Try t
1b2a8 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 57 o truncate the W
1b2a9 41 4c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 AL file to zero
1b2aa 62 79 74 65 73 20 69 66 20 74 68 65 20 63 68 65 bytes if the che
1b2ab 63 6b 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 ckpoint..
1b2ac 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 64 20 ** completed
1b2ad 61 6e 64 20 66 73 79 6e 63 65 64 20 28 72 63 3d and fsynced (rc=
1b2ae 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 61 6e 64 20 =SQLITE_OK) and
1b2af 77 65 20 61 72 65 20 69 6e 20 70 65 72 73 69 73 we are in persis
1b2b0 74 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 tent..
1b2b1 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 28 62 50 65 ** WAL mode (bPe
1b2b2 72 73 69 73 74 29 20 61 6e 64 20 69 66 20 74 68 rsist) and if th
1b2b3 65 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c e PRAGMA journal
1b2b4 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 69 73 20 61 _size_limit is a
1b2b5 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e .. ** n
1b2b6 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 on-negative valu
1b2b7 65 20 28 70 57 61 6c 2d 3e 6d 78 57 61 6c 53 69 e (pWal->mxWalSi
1b2b8 7a 65 3e 3d 30 29 2e 20 20 4e 6f 74 65 20 74 68 ze>=0). Note th
1b2b9 61 74 20 77 65 20 74 72 75 6e 63 61 74 65 0d 0a at we truncate..
1b2ba 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 ** to
1b2bb 7a 65 72 6f 20 62 79 74 65 73 20 61 73 20 74 72 zero bytes as tr
1b2bc 75 6e 63 61 74 69 6e 67 20 74 6f 20 74 68 65 20 uncating to the
1b2bd 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d journal_size_lim
1b2be 69 74 20 6d 69 67 68 74 0d 0a 20 20 20 20 20 20 it might..
1b2bf 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 61 20 63 ** leave a c
1b2c0 6f 72 72 75 70 74 20 57 41 4c 20 66 69 6c 65 20 orrupt WAL file
1b2c1 6f 6e 20 64 69 73 6b 2e 20 2a 2f 0d 0a 20 20 20 on disk. */..
1b2c2 20 20 20 20 20 20 20 77 61 6c 4c 69 6d 69 74 53 walLimitS
1b2c3 69 7a 65 28 70 57 61 6c 2c 20 30 29 3b 0d 0a 20 ize(pWal, 0);..
1b2c4 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
1b2c5 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 }.. }....
1b2c6 77 61 6c 49 6e 64 65 78 43 6c 6f 73 65 28 70 57 walIndexClose(pW
1b2c7 61 6c 2c 20 69 73 44 65 6c 65 74 65 29 3b 0d 0a al, isDelete);..
1b2c8 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f sqlite3OsClo
1b2c9 73 65 28 70 57 61 6c 2d 3e 70 57 61 6c 46 64 29 se(pWal->pWalFd)
1b2ca 3b 0d 0a 20 20 20 20 69 66 28 20 69 73 44 65 6c ;.. if( isDel
1b2cb 65 74 65 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 ete ){.. sq
1b2cc 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e lite3BeginBenign
1b2cd 4d 61 6c 6c 6f 63 28 29 3b 0d 0a 20 20 20 20 20 Malloc();..
1b2ce 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 sqlite3OsDelete
1b2cf 28 70 57 61 6c 2d 3e 70 56 66 73 2c 20 70 57 61 (pWal->pVfs, pWa
1b2d0 6c 2d 3e 7a 57 61 6c 4e 61 6d 65 2c 20 30 29 3b l->zWalName, 0);
1b2d1 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 .. sqlite3E
1b2d2 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 ndBenignMalloc()
1b2d3 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 57 41 ;.. }.. WA
1b2d4 4c 54 52 41 43 45 28 28 22 57 41 4c 25 70 3a 20 LTRACE(("WAL%p:
1b2d5 63 6c 6f 73 65 64 5c 6e 22 2c 20 70 57 61 6c 29 closed\n", pWal)
1b2d6 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f );.. sqlite3_
1b2d7 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 57 61 free((void *)pWa
1b2d8 6c 2d 3e 61 70 57 69 44 61 74 61 29 3b 0d 0a 20 l->apWiData);..
1b2d9 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
1b2da 70 57 61 6c 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 pWal);.. }.. r
1b2db 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1b2dc 2f 2a 0d 0a 2a 2a 20 54 72 79 20 74 6f 20 72 65 /*..** Try to re
1b2dd 61 64 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 ad the wal-index
1b2de 20 68 65 61 64 65 72 2e 20 20 52 65 74 75 72 6e header. Return
1b2df 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 0 on success an
1b2e0 64 20 31 20 69 66 0d 0a 2a 2a 20 74 68 65 72 65 d 1 if..** there
1b2e1 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2e 0d 0a is a problem...
1b2e2 2a 2a 0d 0a 2a 2a 20 54 68 65 20 77 61 6c 2d 69 **..** The wal-i
1b2e3 6e 64 65 78 20 69 73 20 69 6e 20 73 68 61 72 65 ndex is in share
1b2e4 64 20 6d 65 6d 6f 72 79 2e 20 20 41 6e 6f 74 68 d memory. Anoth
1b2e5 65 72 20 74 68 72 65 61 64 20 6f 72 20 70 72 6f er thread or pro
1b2e6 63 65 73 73 20 6d 69 67 68 74 0d 0a 2a 2a 20 62 cess might..** b
1b2e7 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 68 65 e writing the he
1b2e8 61 64 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 ader at the same
1b2e9 20 74 69 6d 65 20 74 68 69 73 20 70 72 6f 63 65 time this proce
1b2ea 64 75 72 65 20 69 73 20 74 72 79 69 6e 67 20 74 dure is trying t
1b2eb 6f 0d 0a 2a 2a 20 72 65 61 64 20 69 74 2c 20 77 o..** read it, w
1b2ec 68 69 63 68 20 6d 69 67 68 74 20 72 65 73 75 6c hich might resul
1b2ed 74 20 69 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e t in inconsisten
1b2ee 63 79 2e 20 20 41 20 64 69 72 74 79 20 72 65 61 cy. A dirty rea
1b2ef 64 20 69 73 20 64 65 74 65 63 74 65 64 0d 0a 2a d is detected..*
1b2f0 2a 20 62 79 20 76 65 72 69 66 79 69 6e 67 20 74 * by verifying t
1b2f1 68 61 74 20 62 6f 74 68 20 63 6f 70 69 65 73 20 hat both copies
1b2f2 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 72 of the header ar
1b2f3 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20 61 e the same and a
1b2f4 6c 73 6f 20 62 79 0d 0a 2a 2a 20 61 20 63 68 65 lso by..** a che
1b2f5 63 6b 73 75 6d 20 6f 6e 20 74 68 65 20 68 65 61 cksum on the hea
1b2f6 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 der...**..** If
1b2f7 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 and only if the
1b2f8 72 65 61 64 20 69 73 20 63 6f 6e 73 69 73 74 65 read is consiste
1b2f9 6e 74 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 nt and the heade
1b2fa 72 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 r is different f
1b2fb 72 6f 6d 0d 0a 2a 2a 20 70 57 61 6c 2d 3e 68 64 rom..** pWal->hd
1b2fc 72 2c 20 74 68 65 6e 20 70 57 61 6c 2d 3e 68 64 r, then pWal->hd
1b2fd 72 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 r is updated to
1b2fe 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 the content of t
1b2ff 68 65 20 6e 65 77 20 68 65 61 64 65 72 0d 0a 2a he new header..*
1b300 2a 20 61 6e 64 20 2a 70 43 68 61 6e 67 65 64 20 * and *pChanged
1b301 69 73 20 73 65 74 20 74 6f 20 31 2e 0d 0a 2a 2a is set to 1...**
1b302 0d 0a 2a 2a 20 49 66 20 74 68 65 20 63 68 65 63 ..** If the chec
1b303 6b 73 75 6d 20 63 61 6e 6e 6f 74 20 62 65 20 76 ksum cannot be v
1b304 65 72 69 66 69 65 64 20 72 65 74 75 72 6e 20 6e erified return n
1b305 6f 6e 2d 7a 65 72 6f 2e 20 49 66 20 74 68 65 20 on-zero. If the
1b306 68 65 61 64 65 72 0d 0a 2a 2a 20 69 73 20 72 65 header..** is re
1b307 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 ad successfully
1b308 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d and the checksum
1b309 20 76 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 verified, retur
1b30a 6e 20 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74 61 n zero...*/..sta
1b30b 74 69 63 20 69 6e 74 20 77 61 6c 49 6e 64 65 78 tic int walIndex
1b30c 54 72 79 48 64 72 28 57 61 6c 20 2a 70 57 61 6c TryHdr(Wal *pWal
1b30d 2c 20 69 6e 74 20 2a 70 43 68 61 6e 67 65 64 29 , int *pChanged)
1b30e 7b 0d 0a 20 20 75 33 32 20 61 43 6b 73 75 6d 5b {.. u32 aCksum[
1b30f 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2];
1b310 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d /* Checksum
1b311 20 6f 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 on the header c
1b312 6f 6e 74 65 6e 74 20 2a 2f 0d 0a 20 20 57 61 6c ontent */.. Wal
1b313 49 6e 64 65 78 48 64 72 20 68 31 2c 20 68 32 3b IndexHdr h1, h2;
1b314 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1b315 54 77 6f 20 63 6f 70 69 65 73 20 6f 66 20 74 68 Two copies of th
1b316 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 e header content
1b317 20 2a 2f 0d 0a 20 20 57 61 6c 49 6e 64 65 78 48 */.. WalIndexH
1b318 64 72 20 76 6f 6c 61 74 69 6c 65 20 2a 61 48 64 dr volatile *aHd
1b319 72 3b 20 20 20 20 20 2f 2a 20 48 65 61 64 65 72 r; /* Header
1b31a 20 69 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 in shared memor
1b31b 79 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 y */.... /* The
1b31c 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 first page of t
1b31d 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 6d 75 73 he wal-index mus
1b31e 74 20 62 65 20 6d 61 70 70 65 64 20 61 74 20 74 t be mapped at t
1b31f 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0d 0a 20 his point. */..
1b320 20 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 6e assert( pWal->n
1b321 57 69 44 61 74 61 3e 30 20 26 26 20 70 57 61 6c WiData>0 && pWal
1b322 2d 3e 61 70 57 69 44 61 74 61 5b 30 5d 20 29 3b ->apWiData[0] );
1b323 0d 0a 0d 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 .... /* Read th
1b324 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 20 6d e header. This m
1b325 69 67 68 74 20 68 61 70 70 65 6e 20 63 6f 6e 63 ight happen conc
1b326 75 72 72 65 6e 74 6c 79 20 77 69 74 68 20 61 20 urrently with a
1b327 77 72 69 74 65 20 74 6f 20 74 68 65 0d 0a 20 20 write to the..
1b328 2a 2a 20 73 61 6d 65 20 61 72 65 61 20 6f 66 20 ** same area of
1b329 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e shared memory on
1b32a 20 61 20 64 69 66 66 65 72 65 6e 74 20 43 50 55 a different CPU
1b32b 20 69 6e 20 61 20 53 4d 50 2c 0d 0a 20 20 2a 2a in a SMP,.. **
1b32c 20 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 70 meaning it is p
1b32d 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e 20 ossible that an
1b32e 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 6e 61 inconsistent sna
1b32f 70 73 68 6f 74 20 69 73 20 72 65 61 64 0d 0a 20 pshot is read..
1b330 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c ** from the fil
1b331 65 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 e. If this happe
1b332 6e 73 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a ns, return non-z
1b333 65 72 6f 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a ero... **.. **
1b334 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 63 There are two c
1b335 6f 70 69 65 73 20 6f 66 20 74 68 65 20 68 65 61 opies of the hea
1b336 64 65 72 20 61 74 20 74 68 65 20 62 65 67 69 6e der at the begin
1b337 6e 69 6e 67 20 6f 66 20 74 68 65 20 77 61 6c 2d ning of the wal-
1b338 69 6e 64 65 78 2e 0d 0a 20 20 2a 2a 20 57 68 65 index... ** Whe
1b339 6e 20 72 65 61 64 69 6e 67 2c 20 72 65 61 64 20 n reading, read
1b33a 5b 30 5d 20 66 69 72 73 74 20 74 68 65 6e 20 5b [0] first then [
1b33b 31 5d 2e 20 20 57 72 69 74 65 73 20 61 72 65 20 1]. Writes are
1b33c 69 6e 20 74 68 65 20 72 65 76 65 72 73 65 20 6f in the reverse o
1b33d 72 64 65 72 2e 0d 0a 20 20 2a 2a 20 4d 65 6d 6f rder... ** Memo
1b33e 72 79 20 62 61 72 72 69 65 72 73 20 61 72 65 20 ry barriers are
1b33f 75 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 used to prevent
1b340 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 72 20 the compiler or
1b341 74 68 65 20 68 61 72 64 77 61 72 65 20 66 72 6f the hardware fro
1b342 6d 0d 0a 20 20 2a 2a 20 72 65 6f 72 64 65 72 69 m.. ** reorderi
1b343 6e 67 20 74 68 65 20 72 65 61 64 73 20 61 6e 64 ng the reads and
1b344 20 77 72 69 74 65 73 2e 0d 0a 20 20 2a 2f 0d 0a writes... */..
1b345 20 20 61 48 64 72 20 3d 20 77 61 6c 49 6e 64 65 aHdr = walInde
1b346 78 48 64 72 28 70 57 61 6c 29 3b 0d 0a 20 20 6d xHdr(pWal);.. m
1b347 65 6d 63 70 79 28 26 68 31 2c 20 28 76 6f 69 64 emcpy(&h1, (void
1b348 20 2a 29 26 61 48 64 72 5b 30 5d 2c 20 73 69 7a *)&aHdr[0], siz
1b349 65 6f 66 28 68 31 29 29 3b 0d 0a 20 20 77 61 6c eof(h1));.. wal
1b34a 53 68 6d 42 61 72 72 69 65 72 28 70 57 61 6c 29 ShmBarrier(pWal)
1b34b 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 26 68 32 2c ;.. memcpy(&h2,
1b34c 20 28 76 6f 69 64 20 2a 29 26 61 48 64 72 5b 31 (void *)&aHdr[1
1b34d 5d 2c 20 73 69 7a 65 6f 66 28 68 32 29 29 3b 0d ], sizeof(h2));.
1b34e 0a 0d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 ... if( memcmp(
1b34f 26 68 31 2c 20 26 68 32 2c 20 73 69 7a 65 6f 66 &h1, &h2, sizeof
1b350 28 68 31 29 29 21 3d 30 20 29 7b 0d 0a 20 20 20 (h1))!=0 ){..
1b351 20 72 65 74 75 72 6e 20 31 3b 20 20 20 2f 2a 20 return 1; /*
1b352 44 69 72 74 79 20 72 65 61 64 20 2a 2f 0d 0a 20 Dirty read */..
1b353 20 7d 20 20 0d 0a 20 20 69 66 28 20 68 31 2e 69 } .. if( h1.i
1b354 73 49 6e 69 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 sInit==0 ){..
1b355 20 72 65 74 75 72 6e 20 31 3b 20 20 20 2f 2a 20 return 1; /*
1b356 4d 61 6c 66 6f 72 6d 65 64 20 68 65 61 64 65 72 Malformed header
1b357 20 2d 20 70 72 6f 62 61 62 6c 79 20 61 6c 6c 20 - probably all
1b358 7a 65 72 6f 73 20 2a 2f 0d 0a 20 20 7d 0d 0a 20 zeros */.. }..
1b359 20 77 61 6c 43 68 65 63 6b 73 75 6d 42 79 74 65 walChecksumByte
1b35a 73 28 31 2c 20 28 75 38 2a 29 26 68 31 2c 20 73 s(1, (u8*)&h1, s
1b35b 69 7a 65 6f 66 28 68 31 29 2d 73 69 7a 65 6f 66 izeof(h1)-sizeof
1b35c 28 68 31 2e 61 43 6b 73 75 6d 29 2c 20 30 2c 20 (h1.aCksum), 0,
1b35d 61 43 6b 73 75 6d 29 3b 0d 0a 20 20 69 66 28 20 aCksum);.. if(
1b35e 61 43 6b 73 75 6d 5b 30 5d 21 3d 68 31 2e 61 43 aCksum[0]!=h1.aC
1b35f 6b 73 75 6d 5b 30 5d 20 7c 7c 20 61 43 6b 73 75 ksum[0] || aCksu
1b360 6d 5b 31 5d 21 3d 68 31 2e 61 43 6b 73 75 6d 5b m[1]!=h1.aCksum[
1b361 31 5d 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 1] ){.. retur
1b362 6e 20 31 3b 20 20 20 2f 2a 20 43 68 65 63 6b 73 n 1; /* Checks
1b363 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 um does not matc
1b364 68 20 2a 2f 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 h */.. }.... i
1b365 66 28 20 6d 65 6d 63 6d 70 28 26 70 57 61 6c 2d f( memcmp(&pWal-
1b366 3e 68 64 72 2c 20 26 68 31 2c 20 73 69 7a 65 6f >hdr, &h1, sizeo
1b367 66 28 57 61 6c 49 6e 64 65 78 48 64 72 29 29 20 f(WalIndexHdr))
1b368 29 7b 0d 0a 20 20 20 20 2a 70 43 68 61 6e 67 65 ){.. *pChange
1b369 64 20 3d 20 31 3b 0d 0a 20 20 20 20 6d 65 6d 63 d = 1;.. memc
1b36a 70 79 28 26 70 57 61 6c 2d 3e 68 64 72 2c 20 26 py(&pWal->hdr, &
1b36b 68 31 2c 20 73 69 7a 65 6f 66 28 57 61 6c 49 6e h1, sizeof(WalIn
1b36c 64 65 78 48 64 72 29 29 3b 0d 0a 20 20 20 20 70 dexHdr));.. p
1b36d 57 61 6c 2d 3e 73 7a 50 61 67 65 20 3d 20 28 70 Wal->szPage = (p
1b36e 57 61 6c 2d 3e 68 64 72 2e 73 7a 50 61 67 65 26 Wal->hdr.szPage&
1b36f 30 78 66 65 30 30 29 20 2b 20 28 28 70 57 61 6c 0xfe00) + ((pWal
1b370 2d 3e 68 64 72 2e 73 7a 50 61 67 65 26 30 78 30 ->hdr.szPage&0x0
1b371 30 30 31 29 3c 3c 31 36 29 3b 0d 0a 20 20 20 20 001)<<16);..
1b372 74 65 73 74 63 61 73 65 28 20 70 57 61 6c 2d 3e testcase( pWal->
1b373 73 7a 50 61 67 65 3c 3d 33 32 37 36 38 20 29 3b szPage<=32768 );
1b374 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 .. testcase(
1b375 70 57 61 6c 2d 3e 73 7a 50 61 67 65 3e 3d 36 35 pWal->szPage>=65
1b376 35 33 36 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 536 );.. }....
1b377 20 2f 2a 20 54 68 65 20 68 65 61 64 65 72 20 77 /* The header w
1b378 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 as successfully
1b379 72 65 61 64 2e 20 52 65 74 75 72 6e 20 7a 65 72 read. Return zer
1b37a 6f 2e 20 2a 2f 0d 0a 20 20 72 65 74 75 72 6e 20 o. */.. return
1b37b 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0;..}..../*..**
1b37c 52 65 61 64 20 74 68 65 20 77 61 6c 2d 69 6e 64 Read the wal-ind
1b37d 65 78 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 ex header from t
1b37e 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 61 6e 64 he wal-index and
1b37f 20 69 6e 74 6f 20 70 57 61 6c 2d 3e 68 64 72 2e into pWal->hdr.
1b380 0d 0a 2a 2a 20 49 66 20 74 68 65 20 77 61 6c 2d ..** If the wal-
1b381 68 65 61 64 65 72 20 61 70 70 65 61 72 73 20 74 header appears t
1b382 6f 20 62 65 20 63 6f 72 72 75 70 74 2c 20 74 72 o be corrupt, tr
1b383 79 20 74 6f 20 72 65 63 6f 6e 73 74 72 75 63 74 y to reconstruct
1b384 20 74 68 65 0d 0a 2a 2a 20 77 61 6c 2d 69 6e 64 the..** wal-ind
1b385 65 78 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 ex from the WAL
1b386 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 before returning
1b387 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 65 74 20 2a 70 ...**..** Set *p
1b388 43 68 61 6e 67 65 64 20 74 6f 20 31 20 69 66 20 Changed to 1 if
1b389 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 the wal-index he
1b38a 61 64 65 72 20 76 61 6c 75 65 20 69 6e 20 70 57 ader value in pW
1b38b 61 6c 2d 3e 68 64 72 20 69 73 0d 0a 2a 2a 20 63 al->hdr is..** c
1b38c 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 6f hanged by this o
1b38d 70 65 72 74 69 6f 6e 2e 20 20 49 66 20 70 57 61 pertion. If pWa
1b38e 6c 2d 3e 68 64 72 20 69 73 20 75 6e 63 68 61 6e l->hdr is unchan
1b38f 67 65 64 2c 20 73 65 74 20 2a 70 43 68 61 6e 67 ged, set *pChang
1b390 65 64 0d 0a 2a 2a 20 74 6f 20 30 2e 0d 0a 2a 2a ed..** to 0...**
1b391 0d 0a 2a 2a 20 49 66 20 74 68 65 20 77 61 6c 2d ..** If the wal-
1b392 69 6e 64 65 78 20 68 65 61 64 65 72 20 69 73 20 index header is
1b393 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 successfully rea
1b394 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 d, return SQLITE
1b395 5f 4f 4b 2e 20 0d 0a 2a 2a 20 4f 74 68 65 72 77 _OK. ..** Otherw
1b396 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 ise an SQLite er
1b397 72 6f 72 20 63 6f 64 65 2e 0d 0a 2a 2f 0d 0a 73 ror code...*/..s
1b398 74 61 74 69 63 20 69 6e 74 20 77 61 6c 49 6e 64 tatic int walInd
1b399 65 78 52 65 61 64 48 64 72 28 57 61 6c 20 2a 70 exReadHdr(Wal *p
1b39a 57 61 6c 2c 20 69 6e 74 20 2a 70 43 68 61 6e 67 Wal, int *pChang
1b39b 65 64 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 ed){.. int rc;
1b39c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b39d 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
1b39e 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 n code */.. int
1b39f 20 62 61 64 48 64 72 3b 20 20 20 20 20 20 20 20 badHdr;
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1b3a1 54 72 75 65 20 69 66 20 61 20 68 65 61 64 65 72 True if a header
1b3a2 20 72 65 61 64 20 66 61 69 6c 65 64 20 2a 2f 0d read failed */.
1b3a3 0a 20 20 76 6f 6c 61 74 69 6c 65 20 75 33 32 20 . volatile u32
1b3a4 2a 70 61 67 65 30 3b 20 20 20 20 20 20 20 20 20 *page0;
1b3a5 20 20 20 2f 2a 20 43 68 75 6e 6b 20 6f 66 20 77 /* Chunk of w
1b3a6 61 6c 2d 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e al-index contain
1b3a7 69 6e 67 20 68 65 61 64 65 72 20 2a 2f 0d 0a 0d ing header */...
1b3a8 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 . /* Ensure tha
1b3a9 74 20 70 61 67 65 20 30 20 6f 66 20 74 68 65 20 t page 0 of the
1b3aa 77 61 6c 2d 69 6e 64 65 78 20 28 74 68 65 20 70 wal-index (the p
1b3ab 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e age that contain
1b3ac 73 20 74 68 65 20 0d 0a 20 20 2a 2a 20 77 61 6c s the .. ** wal
1b3ad 2d 69 6e 64 65 78 20 68 65 61 64 65 72 29 20 69 -index header) i
1b3ae 73 20 6d 61 70 70 65 64 2e 20 52 65 74 75 72 6e s mapped. Return
1b3af 20 65 61 72 6c 79 20 69 66 20 61 6e 20 65 72 72 early if an err
1b3b0 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2e 0d or occurs here..
1b3b1 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 . */.. assert(
1b3b2 20 70 43 68 61 6e 67 65 64 20 29 3b 0d 0a 20 20 pChanged );..
1b3b3 72 63 20 3d 20 77 61 6c 49 6e 64 65 78 50 61 67 rc = walIndexPag
1b3b4 65 28 70 57 61 6c 2c 20 30 2c 20 26 70 61 67 65 e(pWal, 0, &page
1b3b5 30 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 0);.. if( rc!=S
1b3b6 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1b3b7 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d return rc;.. }
1b3b8 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 ;.. assert( pag
1b3b9 65 30 20 7c 7c 20 70 57 61 6c 2d 3e 77 72 69 74 e0 || pWal->writ
1b3ba 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 eLock==0 );....
1b3bb 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 /* If the first
1b3bc 20 70 61 67 65 20 6f 66 20 74 68 65 20 77 61 6c page of the wal
1b3bd 2d 69 6e 64 65 78 20 68 61 73 20 62 65 65 6e 20 -index has been
1b3be 6d 61 70 70 65 64 2c 20 74 72 79 20 74 6f 20 72 mapped, try to r
1b3bf 65 61 64 20 74 68 65 0d 0a 20 20 2a 2a 20 77 61 ead the.. ** wa
1b3c0 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 69 l-index header i
1b3c1 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 mmediately, with
1b3c2 6f 75 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 out holding any
1b3c3 6c 6f 63 6b 2e 20 54 68 69 73 20 75 73 75 61 6c lock. This usual
1b3c4 6c 79 0d 0a 20 20 2a 2a 20 77 6f 72 6b 73 2c 20 ly.. ** works,
1b3c5 62 75 74 20 6d 61 79 20 66 61 69 6c 20 69 66 20 but may fail if
1b3c6 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 the wal-index he
1b3c7 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 20 ader is corrupt
1b3c8 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 0d 0a 20 or currently ..
1b3c9 20 2a 2a 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 ** being modifi
1b3ca 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 ed by another th
1b3cb 72 65 61 64 20 6f 72 20 70 72 6f 63 65 73 73 2e read or process.
1b3cc 0d 0a 20 20 2a 2f 0d 0a 20 20 62 61 64 48 64 72 .. */.. badHdr
1b3cd 20 3d 20 28 70 61 67 65 30 20 3f 20 77 61 6c 49 = (page0 ? walI
1b3ce 6e 64 65 78 54 72 79 48 64 72 28 70 57 61 6c 2c ndexTryHdr(pWal,
1b3cf 20 70 43 68 61 6e 67 65 64 29 20 3a 20 31 29 3b pChanged) : 1);
1b3d0 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 .... /* If the
1b3d1 66 69 72 73 74 20 61 74 74 65 6d 70 74 20 66 61 first attempt fa
1b3d2 69 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 68 iled, it might h
1b3d3 61 76 65 20 62 65 65 6e 20 64 75 65 20 74 6f 20 ave been due to
1b3d4 61 20 72 61 63 65 0d 0a 20 20 2a 2a 20 77 69 74 a race.. ** wit
1b3d5 68 20 61 20 77 72 69 74 65 72 2e 20 20 53 6f 20 h a writer. So
1b3d6 67 65 74 20 61 20 57 52 49 54 45 20 6c 6f 63 6b get a WRITE lock
1b3d7 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 0d and try again..
1b3d8 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 . */.. assert(
1b3d9 20 62 61 64 48 64 72 3d 3d 30 20 7c 7c 20 70 57 badHdr==0 || pW
1b3da 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 3d 3d 30 al->writeLock==0
1b3db 20 29 3b 0d 0a 20 20 69 66 28 20 62 61 64 48 64 );.. if( badHd
1b3dc 72 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 57 r ){.. if( pW
1b3dd 61 6c 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 20 57 al->readOnly & W
1b3de 41 4c 5f 53 48 4d 5f 52 44 4f 4e 4c 59 20 29 7b AL_SHM_RDONLY ){
1b3df 0d 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 .. if( SQLI
1b3e0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 77 61 6c TE_OK==(rc = wal
1b3e1 4c 6f 63 6b 53 68 61 72 65 64 28 70 57 61 6c 2c LockShared(pWal,
1b3e2 20 57 41 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b 29 WAL_WRITE_LOCK)
1b3e3 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 77 61 ) ){.. wa
1b3e4 6c 55 6e 6c 6f 63 6b 53 68 61 72 65 64 28 70 57 lUnlockShared(pW
1b3e5 61 6c 2c 20 57 41 4c 5f 57 52 49 54 45 5f 4c 4f al, WAL_WRITE_LO
1b3e6 43 4b 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 CK);.. rc
1b3e7 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e = SQLITE_READON
1b3e8 4c 59 5f 52 45 43 4f 56 45 52 59 3b 0d 0a 20 20 LY_RECOVERY;..
1b3e9 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 }.. }else
1b3ea 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d if( SQLITE_OK==
1b3eb 28 72 63 20 3d 20 77 61 6c 4c 6f 63 6b 45 78 63 (rc = walLockExc
1b3ec 6c 75 73 69 76 65 28 70 57 61 6c 2c 20 57 41 4c lusive(pWal, WAL
1b3ed 5f 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 31 29 29 _WRITE_LOCK, 1))
1b3ee 20 29 7b 0d 0a 20 20 20 20 20 20 70 57 61 6c 2d ){.. pWal-
1b3ef 3e 77 72 69 74 65 4c 6f 63 6b 20 3d 20 31 3b 0d >writeLock = 1;.
1b3f0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 . if( SQLIT
1b3f1 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 77 61 6c 49 E_OK==(rc = walI
1b3f2 6e 64 65 78 50 61 67 65 28 70 57 61 6c 2c 20 30 ndexPage(pWal, 0
1b3f3 2c 20 26 70 61 67 65 30 29 29 20 29 7b 0d 0a 20 , &page0)) ){..
1b3f4 20 20 20 20 20 20 20 62 61 64 48 64 72 20 3d 20 badHdr =
1b3f5 77 61 6c 49 6e 64 65 78 54 72 79 48 64 72 28 70 walIndexTryHdr(p
1b3f6 57 61 6c 2c 20 70 43 68 61 6e 67 65 64 29 3b 0d Wal, pChanged);.
1b3f7 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 61 64 . if( bad
1b3f8 48 64 72 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 Hdr ){..
1b3f9 20 20 2f 2a 20 49 66 20 74 68 65 20 77 61 6c 2d /* If the wal-
1b3fa 69 6e 64 65 78 20 68 65 61 64 65 72 20 69 73 20 index header is
1b3fb 73 74 69 6c 6c 20 6d 61 6c 66 6f 72 6d 65 64 20 still malformed
1b3fc 65 76 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64 69 even while holdi
1b3fd 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a ng.. **
1b3fe 20 61 20 57 52 49 54 45 20 6c 6f 63 6b 2c 20 69 a WRITE lock, i
1b3ff 74 20 63 61 6e 20 6f 6e 6c 79 20 6d 65 61 6e 20 t can only mean
1b400 74 68 61 74 20 74 68 65 20 68 65 61 64 65 72 20 that the header
1b401 69 73 20 63 6f 72 72 75 70 74 65 64 20 61 6e 64 is corrupted and
1b402 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e .. ** n
1b403 65 65 64 73 20 74 6f 20 62 65 20 72 65 63 6f 6e eeds to be recon
1b404 73 74 72 75 63 74 65 64 2e 20 20 53 6f 20 72 75 structed. So ru
1b405 6e 20 72 65 63 6f 76 65 72 79 20 74 6f 20 64 6f n recovery to do
1b406 20 65 78 61 63 74 6c 79 20 74 68 61 74 2e 0d 0a exactly that...
1b407 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 */..
1b408 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 61 6c rc = wal
1b409 49 6e 64 65 78 52 65 63 6f 76 65 72 28 70 57 61 IndexRecover(pWa
1b40a 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2a l);.. *
1b40b 70 43 68 61 6e 67 65 64 20 3d 20 31 3b 0d 0a 20 pChanged = 1;..
1b40c 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
1b40d 7d 0d 0a 20 20 20 20 20 20 70 57 61 6c 2d 3e 77 }.. pWal->w
1b40e 72 69 74 65 4c 6f 63 6b 20 3d 20 30 3b 0d 0a 20 riteLock = 0;..
1b40f 20 20 20 20 20 77 61 6c 55 6e 6c 6f 63 6b 45 78 walUnlockEx
1b410 63 6c 75 73 69 76 65 28 70 57 61 6c 2c 20 57 41 clusive(pWal, WA
1b411 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 31 29 L_WRITE_LOCK, 1)
1b412 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d ;.. }.. }...
1b413 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 . /* If the hea
1b414 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 der is read succ
1b415 65 73 73 66 75 6c 6c 79 2c 20 63 68 65 63 6b 20 essfully, check
1b416 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 the version numb
1b417 65 72 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 2a 2a er to make.. **
1b418 20 73 75 72 65 20 74 68 65 20 77 61 6c 2d 69 6e sure the wal-in
1b419 64 65 78 20 77 61 73 20 6e 6f 74 20 63 6f 6e 73 dex was not cons
1b41a 74 72 75 63 74 65 64 20 77 69 74 68 20 73 6f 6d tructed with som
1b41b 65 20 66 75 74 75 72 65 20 66 6f 72 6d 61 74 20 e future format
1b41c 74 68 61 74 0d 0a 20 20 2a 2a 20 74 68 69 73 20 that.. ** this
1b41d 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 version of SQLit
1b41e 65 20 63 61 6e 6e 6f 74 20 75 6e 64 65 72 73 74 e cannot underst
1b41f 61 6e 64 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 and... */.. if
1b420 28 20 62 61 64 48 64 72 3d 3d 30 20 26 26 20 70 ( badHdr==0 && p
1b421 57 61 6c 2d 3e 68 64 72 2e 69 56 65 72 73 69 6f Wal->hdr.iVersio
1b422 6e 21 3d 57 41 4c 49 4e 44 45 58 5f 4d 41 58 5f n!=WALINDEX_MAX_
1b423 56 45 52 53 49 4f 4e 20 29 7b 0d 0a 20 20 20 20 VERSION ){..
1b424 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 rc = SQLITE_CANT
1b425 4f 50 45 4e 5f 42 4b 50 54 3b 0d 0a 20 20 7d 0d OPEN_BKPT;.. }.
1b426 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ... return rc;.
1b427 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 .}..../*..** Thi
1b428 73 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 74 s is the value t
1b429 68 61 74 20 77 61 6c 54 72 79 42 65 67 69 6e 52 hat walTryBeginR
1b42a 65 61 64 20 72 65 74 75 72 6e 73 20 77 68 65 6e ead returns when
1b42b 20 69 74 20 6e 65 65 64 73 20 74 6f 0d 0a 2a 2a it needs to..**
1b42c 20 62 65 20 72 65 74 72 69 65 64 2e 0d 0a 2a 2f be retried...*/
1b42d 0d 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 52 45 ..#define WAL_RE
1b42e 54 52 59 20 20 28 2d 31 29 0d 0a 0d 0a 2f 2a 0d TRY (-1)..../*.
1b42f 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 .** Attempt to s
1b430 74 61 72 74 20 61 20 72 65 61 64 20 74 72 61 6e tart a read tran
1b431 73 61 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 6d saction. This m
1b432 69 67 68 74 20 66 61 69 6c 20 64 75 65 20 74 6f ight fail due to
1b433 20 61 20 72 61 63 65 20 6f 72 0d 0a 2a 2a 20 6f a race or..** o
1b434 74 68 65 72 20 74 72 61 6e 73 69 65 6e 74 20 63 ther transient c
1b435 6f 6e 64 69 74 69 6f 6e 2e 20 20 57 68 65 6e 20 ondition. When
1b436 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 69 74 that happens, it
1b437 20 72 65 74 75 72 6e 73 20 57 41 4c 5f 52 45 54 returns WAL_RET
1b438 52 59 20 74 6f 0d 0a 2a 2a 20 69 6e 64 69 63 61 RY to..** indica
1b439 74 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 te to the caller
1b43a 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 that it is safe
1b43b 20 74 6f 20 72 65 74 72 79 20 69 6d 6d 65 64 69 to retry immedi
1b43c 61 74 65 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f ately...**..** O
1b43d 6e 20 73 75 63 63 65 73 73 20 72 65 74 75 72 6e n success return
1b43e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 4f 6e 20 SQLITE_OK. On
1b43f 61 20 70 65 72 6d 61 6e 65 6e 74 20 66 61 69 6c a permanent fail
1b440 75 72 65 20 28 73 75 63 68 20 61 6e 0d 0a 2a 2a ure (such an..**
1b441 20 49 2f 4f 20 65 72 72 6f 72 20 6f 72 20 61 6e I/O error or an
1b442 20 53 51 4c 49 54 45 5f 42 55 53 59 20 62 65 63 SQLITE_BUSY bec
1b443 61 75 73 65 20 61 6e 6f 74 68 65 72 20 70 72 6f ause another pro
1b444 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 0d cess is running.
1b445 0a 2a 2a 20 72 65 63 6f 76 65 72 79 29 20 72 65 .** recovery) re
1b446 74 75 72 6e 20 61 20 70 6f 73 69 74 69 76 65 20 turn a positive
1b447 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a 2a 2a 0d error code...**.
1b448 0a 2a 2a 20 54 68 65 20 75 73 65 57 61 6c 20 70 .** The useWal p
1b449 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 arameter is true
1b44a 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 to force the us
1b44b 65 20 6f 66 20 74 68 65 20 57 41 4c 20 61 6e 64 e of the WAL and
1b44c 20 64 69 73 61 62 6c 65 0d 0a 2a 2a 20 74 68 65 disable..** the
1b44d 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 case where the
1b44e 57 41 4c 20 69 73 20 62 79 70 61 73 73 65 64 20 WAL is bypassed
1b44f 62 65 63 61 75 73 65 20 69 74 20 68 61 73 20 62 because it has b
1b450 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0d 0a een completely..
1b451 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e ** checkpointed.
1b452 20 20 49 66 20 75 73 65 57 61 6c 3d 3d 30 20 74 If useWal==0 t
1b453 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 hen this routine
1b454 20 63 61 6c 6c 73 20 77 61 6c 49 6e 64 65 78 52 calls walIndexR
1b455 65 61 64 48 64 72 28 29 20 0d 0a 2a 2a 20 74 6f eadHdr() ..** to
1b456 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 make a copy of
1b457 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 the wal-index he
1b458 61 64 65 72 20 69 6e 74 6f 20 70 57 61 6c 2d 3e ader into pWal->
1b459 68 64 72 2e 20 20 49 66 20 74 68 65 20 0d 0a 2a hdr. If the ..*
1b45a 2a 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 * wal-index head
1b45b 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 er has changed,
1b45c 2a 70 43 68 61 6e 67 65 64 20 69 73 20 73 65 74 *pChanged is set
1b45d 20 74 6f 20 31 20 28 61 73 20 61 6e 20 69 6e 64 to 1 (as an ind
1b45e 69 63 61 74 69 6f 6e 20 0d 0a 2a 2a 20 74 6f 20 ication ..** to
1b45f 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 the caller that
1b460 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 74 20 the local paget
1b461 63 61 63 68 65 20 69 73 20 6f 62 73 6f 6c 65 74 cache is obsolet
1b462 65 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 e and needs to b
1b463 65 20 0d 0a 2a 2a 20 66 6c 75 73 68 65 64 2e 29 e ..** flushed.)
1b464 20 20 57 68 65 6e 20 75 73 65 57 61 6c 3d 3d 31 When useWal==1
1b465 2c 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 , the wal-index
1b466 68 65 61 64 65 72 20 69 73 20 61 73 73 75 6d 65 header is assume
1b467 64 20 74 6f 20 61 6c 72 65 61 64 79 0d 0a 2a 2a d to already..**
1b468 20 62 65 20 6c 6f 61 64 65 64 20 61 6e 64 20 74 be loaded and t
1b469 68 65 20 70 43 68 61 6e 67 65 64 20 70 61 72 61 he pChanged para
1b46a 6d 65 74 65 72 20 69 73 20 75 6e 75 73 65 64 2e meter is unused.
1b46b 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 6c ..**..** The cal
1b46c 6c 65 72 20 6d 75 73 74 20 73 65 74 20 74 68 65 ler must set the
1b46d 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 74 cnt parameter t
1b46e 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 o the number of
1b46f 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 0d 0a prior calls to..
1b470 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ** this routine
1b471 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 during the curre
1b472 6e 74 20 72 65 61 64 20 61 74 74 65 6d 70 74 20 nt read attempt
1b473 74 68 61 74 20 72 65 74 75 72 6e 65 64 20 57 41 that returned WA
1b474 4c 5f 52 45 54 52 59 2e 0d 0a 2a 2a 20 54 68 69 L_RETRY...** Thi
1b475 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 73 s routine will s
1b476 74 61 72 74 20 74 61 6b 69 6e 67 20 6d 6f 72 65 tart taking more
1b477 20 61 67 67 72 65 73 73 69 76 65 20 6d 65 61 73 aggressive meas
1b478 75 72 65 73 20 74 6f 20 63 6c 65 61 72 20 74 68 ures to clear th
1b479 65 0d 0a 2a 2a 20 72 61 63 65 20 63 6f 6e 64 69 e..** race condi
1b47a 74 69 6f 6e 73 20 61 66 74 65 72 20 6d 75 6c 74 tions after mult
1b47b 69 70 6c 65 20 57 41 4c 5f 52 45 54 52 59 20 72 iple WAL_RETRY r
1b47c 65 74 75 72 6e 73 2c 20 61 6e 64 20 61 66 74 65 eturns, and afte
1b47d 72 20 61 6e 20 65 78 63 65 73 73 69 76 65 0d 0a r an excessive..
1b47e 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 ** number of err
1b47f 6f 72 73 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 ors will ultimat
1b480 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ely return SQLIT
1b481 45 5f 50 52 4f 54 4f 43 4f 4c 2e 20 20 54 68 65 E_PROTOCOL. The
1b482 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 ..** SQLITE_PROT
1b483 4f 43 4f 4c 20 72 65 74 75 72 6e 20 69 6e 64 69 OCOL return indi
1b484 63 61 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 cates that some
1b485 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 61 other process ha
1b486 73 20 67 6f 6e 65 20 72 6f 67 75 65 0d 0a 2a 2a s gone rogue..**
1b487 20 61 6e 64 20 69 73 20 6e 6f 74 20 68 6f 6e 6f and is not hono
1b488 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 ring the locking
1b489 20 70 72 6f 74 6f 63 6f 6c 2e 20 20 54 68 65 72 protocol. Ther
1b48a 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 e is a vanishing
1b48b 6c 79 20 73 6d 61 6c 6c 0d 0a 2a 2a 20 63 68 61 ly small..** cha
1b48c 6e 63 65 20 74 68 61 74 20 53 51 4c 49 54 45 5f nce that SQLITE_
1b48d 50 52 4f 54 4f 43 4f 4c 20 63 6f 75 6c 64 20 62 PROTOCOL could b
1b48e 65 20 72 65 74 75 72 6e 65 64 20 62 65 63 61 75 e returned becau
1b48f 73 65 20 6f 66 20 61 20 72 75 6e 20 6f 66 20 72 se of a run of r
1b490 65 61 6c 6c 79 0d 0a 2a 2a 20 62 61 64 20 6c 75 eally..** bad lu
1b491 63 6b 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 ck when there is
1b492 20 6c 6f 74 73 20 6f 66 20 63 6f 6e 74 65 6e 74 lots of content
1b493 69 6f 6e 20 66 6f 72 20 74 68 65 20 77 61 6c 2d ion for the wal-
1b494 69 6e 64 65 78 2c 20 62 75 74 20 74 68 61 74 0d index, but that.
1b495 0a 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 .** possibility
1b496 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 is so small that
1b497 20 69 74 20 63 61 6e 20 62 65 20 73 61 66 65 6c it can be safel
1b498 79 20 6e 65 67 6c 65 63 74 65 64 2c 20 77 65 20 y neglected, we
1b499 62 65 6c 69 65 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a believe...**..**
1b49a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 69 On success, thi
1b49b 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e s routine obtain
1b49c 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e s a read lock on
1b49d 20 0d 0a 2a 2a 20 57 41 4c 5f 52 45 41 44 5f 4c ..** WAL_READ_L
1b49e 4f 43 4b 28 70 57 61 6c 2d 3e 72 65 61 64 4c 6f OCK(pWal->readLo
1b49f 63 6b 29 2e 20 20 54 68 65 20 70 57 61 6c 2d 3e ck). The pWal->
1b4a0 72 65 61 64 4c 6f 63 6b 20 69 6e 74 65 67 65 72 readLock integer
1b4a1 20 69 73 0d 0a 2a 2a 20 69 6e 20 74 68 65 20 72 is..** in the r
1b4a2 61 6e 67 65 20 30 20 3c 3d 20 70 57 61 6c 2d 3e ange 0 <= pWal->
1b4a3 72 65 61 64 4c 6f 63 6b 20 3c 20 57 41 4c 5f 4e readLock < WAL_N
1b4a4 52 45 41 44 45 52 2e 20 20 49 66 20 70 57 61 6c READER. If pWal
1b4a5 2d 3e 72 65 61 64 4c 6f 63 6b 3d 3d 28 2d 31 29 ->readLock==(-1)
1b4a6 0d 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 ..** that means
1b4a7 74 68 65 20 57 61 6c 20 64 6f 65 73 20 6e 6f 74 the Wal does not
1b4a8 20 68 6f 6c 64 20 61 6e 79 20 72 65 61 64 20 6c hold any read l
1b4a9 6f 63 6b 2e 20 20 54 68 65 20 72 65 61 64 65 72 ock. The reader
1b4aa 20 6d 75 73 74 20 6e 6f 74 0d 0a 2a 2a 20 61 63 must not..** ac
1b4ab 63 65 73 73 20 61 6e 79 20 64 61 74 61 62 61 73 cess any databas
1b4ac 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 6d e page that is m
1b4ad 6f 64 69 66 69 65 64 20 62 79 20 61 20 57 41 4c odified by a WAL
1b4ae 20 66 72 61 6d 65 20 75 70 20 74 6f 20 61 6e 64 frame up to and
1b4af 0d 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 66 ..** including f
1b4b0 72 61 6d 65 20 6e 75 6d 62 65 72 20 61 52 65 61 rame number aRea
1b4b1 64 4d 61 72 6b 5b 70 57 61 6c 2d 3e 72 65 61 64 dMark[pWal->read
1b4b2 4c 6f 63 6b 5d 2e 20 20 54 68 65 20 72 65 61 64 Lock]. The read
1b4b3 65 72 20 77 69 6c 6c 0d 0a 2a 2a 20 75 73 65 20 er will..** use
1b4b4 57 41 4c 20 66 72 61 6d 65 73 20 75 70 20 74 6f WAL frames up to
1b4b5 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 70 and including p
1b4b6 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 Wal->hdr.mxFrame
1b4b7 20 69 66 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f if pWal->readLo
1b4b8 63 6b 3e 30 0d 0a 2a 2a 20 4f 72 20 69 66 20 70 ck>0..** Or if p
1b4b9 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b 3d 3d 30 Wal->readLock==0
1b4ba 2c 20 74 68 65 6e 20 74 68 65 20 72 65 61 64 65 , then the reade
1b4bb 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 r will ignore th
1b4bc 65 20 57 41 4c 0d 0a 2a 2a 20 63 6f 6d 70 6c 65 e WAL..** comple
1b4bd 74 65 6c 79 20 61 6e 64 20 67 65 74 20 61 6c 6c tely and get all
1b4be 20 63 6f 6e 74 65 6e 74 20 64 69 72 65 63 74 6c content directl
1b4bf 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 y from the datab
1b4c0 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 49 66 ase file...** If
1b4c1 20 74 68 65 20 75 73 65 57 61 6c 20 70 61 72 61 the useWal para
1b4c2 6d 65 74 65 72 20 69 73 20 31 20 74 68 65 6e 20 meter is 1 then
1b4c3 74 68 65 20 57 41 4c 20 77 69 6c 6c 20 6e 65 76 the WAL will nev
1b4c4 65 72 20 62 65 20 69 67 6e 6f 72 65 64 20 61 6e er be ignored an
1b4c5 64 0d 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 d..** this routi
1b4c6 6e 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 ne will always s
1b4c7 65 74 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 et pWal->readLoc
1b4c8 6b 3e 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0d k>0 on success..
1b4c9 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 72 65 61 .** When the rea
1b4ca 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 d transaction is
1b4cb 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 20 completed, the
1b4cc 63 61 6c 6c 65 72 20 6d 75 73 74 20 72 65 6c 65 caller must rele
1b4cd 61 73 65 20 74 68 65 0d 0a 2a 2a 20 6c 6f 63 6b ase the..** lock
1b4ce 20 6f 6e 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 on WAL_READ_LOC
1b4cf 4b 28 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b K(pWal->readLock
1b4d0 29 20 61 6e 64 20 73 65 74 20 70 57 61 6c 2d 3e ) and set pWal->
1b4d1 72 65 61 64 4c 6f 63 6b 20 74 6f 20 2d 31 2e 0d readLock to -1..
1b4d2 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 .**..** This rou
1b4d3 74 69 6e 65 20 75 73 65 73 20 74 68 65 20 6e 42 tine uses the nB
1b4d4 61 63 6b 66 69 6c 6c 20 61 6e 64 20 61 52 65 61 ackfill and aRea
1b4d5 64 4d 61 72 6b 5b 5d 20 66 69 65 6c 64 73 20 6f dMark[] fields o
1b4d6 66 20 74 68 65 20 68 65 61 64 65 72 0d 0a 2a 2a f the header..**
1b4d7 20 74 6f 20 73 65 6c 65 63 74 20 61 20 70 61 72 to select a par
1b4d8 74 69 63 75 6c 61 72 20 57 41 4c 5f 52 45 41 44 ticular WAL_READ
1b4d9 5f 4c 4f 43 4b 28 29 20 74 68 61 74 20 73 74 72 _LOCK() that str
1b4da 69 76 65 73 20 74 6f 20 6c 65 74 20 74 68 65 0d ives to let the.
1b4db 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 70 .** checkpoint p
1b4dc 72 6f 63 65 73 73 20 64 6f 20 61 73 20 6d 75 63 rocess do as muc
1b4dd 68 20 77 6f 72 6b 20 61 73 20 70 6f 73 73 69 62 h work as possib
1b4de 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e le. This routin
1b4df 65 20 6d 69 67 68 74 0d 0a 2a 2a 20 75 70 64 61 e might..** upda
1b4e0 74 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 te values of the
1b4e1 20 61 52 65 61 64 4d 61 72 6b 5b 5d 20 61 72 72 aReadMark[] arr
1b4e2 61 79 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 ay in the header
1b4e3 2c 20 62 75 74 20 69 66 20 69 74 20 64 6f 65 73 , but if it does
1b4e4 0d 0a 2a 2a 20 73 6f 20 69 74 20 74 61 6b 65 73 ..** so it takes
1b4e5 20 63 61 72 65 20 74 6f 20 68 6f 6c 64 20 61 6e care to hold an
1b4e6 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 exclusive lock
1b4e7 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e on the correspon
1b4e8 64 69 6e 67 0d 0a 2a 2a 20 57 41 4c 5f 52 45 41 ding..** WAL_REA
1b4e9 44 5f 4c 4f 43 4b 28 29 20 77 68 69 6c 65 20 63 D_LOCK() while c
1b4ea 68 61 6e 67 69 6e 67 20 76 61 6c 75 65 73 2e 0d hanging values..
1b4eb 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
1b4ec 77 61 6c 54 72 79 42 65 67 69 6e 52 65 61 64 28 walTryBeginRead(
1b4ed 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e 74 20 2a Wal *pWal, int *
1b4ee 70 43 68 61 6e 67 65 64 2c 20 69 6e 74 20 75 73 pChanged, int us
1b4ef 65 57 61 6c 2c 20 69 6e 74 20 63 6e 74 29 7b 0d eWal, int cnt){.
1b4f0 0a 20 20 76 6f 6c 61 74 69 6c 65 20 57 61 6c 43 . volatile WalC
1b4f1 6b 70 74 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 20 kptInfo *pInfo;
1b4f2 20 20 20 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 /* Checkpoint
1b4f3 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 information in
1b4f4 77 61 6c 2d 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 wal-index */..
1b4f5 75 33 32 20 6d 78 52 65 61 64 4d 61 72 6b 3b 20 u32 mxReadMark;
1b4f6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b4f7 2f 2a 20 4c 61 72 67 65 73 74 20 61 52 65 61 64 /* Largest aRead
1b4f8 4d 61 72 6b 5b 5d 20 76 61 6c 75 65 20 2a 2f 0d Mark[] value */.
1b4f9 0a 20 20 69 6e 74 20 6d 78 49 3b 20 20 20 20 20 . int mxI;
1b4fa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b4fb 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c /* Index of l
1b4fc 61 72 67 65 73 74 20 61 52 65 61 64 4d 61 72 6b argest aReadMark
1b4fd 5b 5d 20 76 61 6c 75 65 20 2a 2f 0d 0a 20 20 69 [] value */.. i
1b4fe 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
1b4ff 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b500 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
1b501 2f 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 /.. int rc = SQ
1b502 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
1b503 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 /* Return c
1b504 6f 64 65 20 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 ode */.... ass
1b505 65 72 74 28 20 70 57 61 6c 2d 3e 72 65 61 64 4c ert( pWal->readL
1b506 6f 63 6b 3c 30 20 29 3b 20 20 20 20 20 2f 2a 20 ock<0 ); /*
1b507 4e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6c 6f Not currently lo
1b508 63 6b 65 64 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 cked */.... /*
1b509 54 61 6b 65 20 73 74 65 70 73 20 74 6f 20 61 76 Take steps to av
1b50a 6f 69 64 20 73 70 69 6e 6e 69 6e 67 20 66 6f 72 oid spinning for
1b50b 65 76 65 72 20 69 66 20 74 68 65 72 65 20 69 73 ever if there is
1b50c 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f a protocol erro
1b50d 72 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 43 r... **.. ** C
1b50e 69 72 63 75 6d 73 74 61 6e 63 65 73 20 74 68 61 ircumstances tha
1b50f 74 20 63 61 75 73 65 20 61 20 52 45 54 52 59 20 t cause a RETRY
1b510 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 6c 61 73 74 should only last
1b511 20 66 6f 72 20 74 68 65 20 62 72 69 65 66 65 73 for the briefes
1b512 74 0d 0a 20 20 2a 2a 20 69 6e 73 74 61 6e 63 65 t.. ** instance
1b513 73 20 6f 66 20 74 69 6d 65 2e 20 20 4e 6f 20 49 s of time. No I
1b514 2f 4f 20 6f 72 20 6f 74 68 65 72 20 73 79 73 74 /O or other syst
1b515 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 64 6f 6e em calls are don
1b516 65 20 77 68 69 6c 65 20 74 68 65 0d 0a 20 20 2a e while the.. *
1b517 2a 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 * locks are held
1b518 2c 20 73 6f 20 74 68 65 20 6c 6f 63 6b 73 20 73 , so the locks s
1b519 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 68 65 6c hould not be hel
1b51a 64 20 66 6f 72 20 76 65 72 79 20 6c 6f 6e 67 2e d for very long.
1b51b 20 42 75 74 20 0d 0a 20 20 2a 2a 20 69 66 20 77 But .. ** if w
1b51c 65 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 61 e are unlucky, a
1b51d 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 74 nother process t
1b51e 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 hat is holding a
1b51f 20 6c 6f 63 6b 20 6d 69 67 68 74 20 67 65 74 0d lock might get.
1b520 0a 20 20 2a 2a 20 70 61 67 65 64 20 6f 75 74 20 . ** paged out
1b521 6f 72 20 74 61 6b 65 20 61 20 70 61 67 65 2d 66 or take a page-f
1b522 61 75 6c 74 20 74 68 61 74 20 69 73 20 74 69 6d ault that is tim
1b523 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 74 6f 20 72 e-consuming to r
1b524 65 73 6f 6c 76 65 2c 20 0d 0a 20 20 2a 2a 20 64 esolve, .. ** d
1b525 75 72 69 6e 67 20 74 68 65 20 66 65 77 20 6e 61 uring the few na
1b526 6e 6f 73 65 63 6f 6e 64 73 20 74 68 61 74 20 69 noseconds that i
1b527 74 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 t is holding the
1b528 20 6c 6f 63 6b 2e 20 20 49 6e 20 74 68 61 74 20 lock. In that
1b529 63 61 73 65 2c 0d 0a 20 20 2a 2a 20 69 74 20 6d case,.. ** it m
1b52a 69 67 68 74 20 74 61 6b 65 20 6c 6f 6e 67 65 72 ight take longer
1b52b 20 74 68 61 6e 20 6e 6f 72 6d 61 6c 20 66 6f 72 than normal for
1b52c 20 74 68 65 20 6c 6f 63 6b 20 74 6f 20 66 72 65 the lock to fre
1b52d 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 41 e... **.. ** A
1b52e 66 74 65 72 20 35 20 52 45 54 52 59 73 2c 20 77 fter 5 RETRYs, w
1b52f 65 20 62 65 67 69 6e 20 63 61 6c 6c 69 6e 67 20 e begin calling
1b530 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 29 sqlite3OsSleep()
1b531 2e 20 20 54 68 65 20 66 69 72 73 74 20 66 65 77 . The first few
1b532 0d 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 .. ** calls to
1b533 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 29 sqlite3OsSleep()
1b534 20 68 61 76 65 20 61 20 64 65 6c 61 79 20 6f 66 have a delay of
1b535 20 31 20 6d 69 63 72 6f 73 65 63 6f 6e 64 2e 20 1 microsecond.
1b536 20 52 65 61 6c 6c 79 20 74 68 69 73 0d 0a 20 20 Really this..
1b537 2a 2a 20 69 73 20 6d 6f 72 65 20 6f 66 20 61 20 ** is more of a
1b538 73 63 68 65 64 75 6c 65 72 20 79 69 65 6c 64 20 scheduler yield
1b539 74 68 61 6e 20 61 6e 20 61 63 74 75 61 6c 20 64 than an actual d
1b53a 65 6c 61 79 2e 20 20 42 75 74 20 6f 6e 20 74 68 elay. But on th
1b53b 65 20 31 30 74 68 0d 0a 20 20 2a 2a 20 61 6e 20 e 10th.. ** an
1b53c 73 75 62 73 65 71 75 65 6e 74 20 72 65 74 72 69 subsequent retri
1b53d 65 73 2c 20 74 68 65 20 64 65 6c 61 79 73 20 73 es, the delays s
1b53e 74 61 72 74 20 62 65 63 6f 6d 69 6e 67 20 6c 6f tart becoming lo
1b53f 6e 67 65 72 20 61 6e 64 20 6c 6f 6e 67 65 72 2c nger and longer,
1b540 20 0d 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 .. ** so that
1b541 6f 6e 20 74 68 65 20 31 30 30 74 68 20 28 61 6e on the 100th (an
1b542 64 20 6c 61 73 74 29 20 52 45 54 52 59 20 77 65 d last) RETRY we
1b543 20 64 65 6c 61 79 20 66 6f 72 20 32 31 20 6d 69 delay for 21 mi
1b544 6c 6c 69 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 2a lliseconds... *
1b545 2a 20 54 68 65 20 74 6f 74 61 6c 20 64 65 6c 61 * The total dela
1b546 79 20 74 69 6d 65 20 62 65 66 6f 72 65 20 67 69 y time before gi
1b547 76 69 6e 67 20 75 70 20 69 73 20 6c 65 73 73 20 ving up is less
1b548 74 68 61 6e 20 31 20 73 65 63 6f 6e 64 2e 0d 0a than 1 second...
1b549 20 20 2a 2f 0d 0a 20 20 69 66 28 20 63 6e 74 3e */.. if( cnt>
1b54a 35 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 44 5 ){.. int nD
1b54b 65 6c 61 79 20 3d 20 31 3b 20 20 20 20 20 20 20 elay = 1;
1b54c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b54d 2a 20 50 61 75 73 65 20 74 69 6d 65 20 69 6e 20 * Pause time in
1b54e 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2a 2f 0d microseconds */.
1b54f 0a 20 20 20 20 69 66 28 20 63 6e 74 3e 31 30 30 . if( cnt>100
1b550 20 29 7b 0d 0a 20 20 20 20 20 20 56 56 41 5f 4f ){.. VVA_O
1b551 4e 4c 59 28 20 70 57 61 6c 2d 3e 6c 6f 63 6b 45 NLY( pWal->lockE
1b552 72 72 6f 72 20 3d 20 31 3b 20 29 0d 0a 20 20 20 rror = 1; )..
1b553 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1b554 5f 50 52 4f 54 4f 43 4f 4c 3b 0d 0a 20 20 20 20 _PROTOCOL;..
1b555 7d 0d 0a 20 20 20 20 69 66 28 20 63 6e 74 3e 3d }.. if( cnt>=
1b556 31 30 20 29 20 6e 44 65 6c 61 79 20 3d 20 28 63 10 ) nDelay = (c
1b557 6e 74 2d 39 29 2a 32 33 38 3b 20 20 2f 2a 20 4d nt-9)*238; /* M
1b558 61 78 20 64 65 6c 61 79 20 32 31 6d 73 2e 20 54 ax delay 21ms. T
1b559 6f 74 61 6c 20 64 65 6c 61 79 20 39 39 36 6d 73 otal delay 996ms
1b55a 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 */.. sqlite3
1b55b 4f 73 53 6c 65 65 70 28 70 57 61 6c 2d 3e 70 56 OsSleep(pWal->pV
1b55c 66 73 2c 20 6e 44 65 6c 61 79 29 3b 0d 0a 20 20 fs, nDelay);..
1b55d 7d 0d 0a 0d 0a 20 20 69 66 28 20 21 75 73 65 57 }.... if( !useW
1b55e 61 6c 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 al ){.. rc =
1b55f 77 61 6c 49 6e 64 65 78 52 65 61 64 48 64 72 28 walIndexReadHdr(
1b560 70 57 61 6c 2c 20 70 43 68 61 6e 67 65 64 29 3b pWal, pChanged);
1b561 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
1b562 4c 49 54 45 5f 42 55 53 59 20 29 7b 0d 0a 20 20 LITE_BUSY ){..
1b563 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 /* If there
1b564 69 73 20 6e 6f 74 20 61 20 72 65 63 6f 76 65 72 is not a recover
1b565 79 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 6e 6f y running in ano
1b566 74 68 65 72 20 74 68 72 65 61 64 20 6f 72 20 70 ther thread or p
1b567 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 2a 2a rocess.. **
1b568 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 42 55 then convert BU
1b569 53 59 20 65 72 72 6f 72 73 20 74 6f 20 57 41 4c SY errors to WAL
1b56a 5f 52 45 54 52 59 2e 20 20 49 66 20 72 65 63 6f _RETRY. If reco
1b56b 76 65 72 79 20 69 73 20 6b 6e 6f 77 6e 20 74 6f very is known to
1b56c 0d 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 72 75 .. ** be ru
1b56d 6e 6e 69 6e 67 2c 20 63 6f 6e 76 65 72 74 20 42 nning, convert B
1b56e 55 53 59 20 74 6f 20 42 55 53 59 5f 52 45 43 4f USY to BUSY_RECO
1b56f 56 45 52 59 2e 20 20 54 68 65 72 65 20 69 73 20 VERY. There is
1b570 61 20 72 61 63 65 20 68 65 72 65 0d 0a 20 20 20 a race here..
1b571 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 69 67 68 ** which migh
1b572 74 20 63 61 75 73 65 20 57 41 4c 5f 52 45 54 52 t cause WAL_RETR
1b573 59 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 Y to be returned
1b574 20 65 76 65 6e 20 69 66 20 42 55 53 59 5f 52 45 even if BUSY_RE
1b575 43 4f 56 45 52 59 0d 0a 20 20 20 20 20 20 2a 2a COVERY.. **
1b576 20 77 6f 75 6c 64 20 62 65 20 74 65 63 68 6e 69 would be techni
1b577 63 61 6c 6c 79 20 63 6f 72 72 65 63 74 2e 20 20 cally correct.
1b578 42 75 74 20 74 68 65 20 72 61 63 65 20 69 73 20 But the race is
1b579 62 65 6e 69 67 6e 20 73 69 6e 63 65 20 77 69 74 benign since wit
1b57a 68 0d 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 5f h.. ** WAL_
1b57b 52 45 54 52 59 20 74 68 69 73 20 72 6f 75 74 69 RETRY this routi
1b57c 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 ne will be calle
1b57d 64 20 61 67 61 69 6e 20 61 6e 64 20 77 69 6c 6c d again and will
1b57e 20 70 72 6f 62 61 62 6c 79 20 62 65 0d 0a 20 20 probably be..
1b57f 20 20 20 20 2a 2a 20 72 69 67 68 74 20 6f 6e 20 ** right on
1b580 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 the second itera
1b581 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d tion... */.
1b582 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 2d . if( pWal-
1b583 3e 61 70 57 69 44 61 74 61 5b 30 5d 3d 3d 30 20 >apWiData[0]==0
1b584 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 ){.. /* T
1b585 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 his branch is ta
1b586 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 78 53 68 ken when the xSh
1b587 6d 4d 61 70 28 29 20 6d 65 74 68 6f 64 20 72 65 mMap() method re
1b588 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 turns SQLITE_BUS
1b589 59 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 Y... ** W
1b58a 65 20 61 73 73 75 6d 65 20 74 68 69 73 20 69 73 e assume this is
1b58b 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 6e a transient con
1b58c 64 69 74 69 6f 6e 2c 20 73 6f 20 72 65 74 75 72 dition, so retur
1b58d 6e 20 57 41 4c 5f 52 45 54 52 59 2e 20 54 68 65 n WAL_RETRY. The
1b58e 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 78 53 68 .. ** xSh
1b58f 6d 4d 61 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74 mMap() implement
1b590 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 ation used by th
1b591 65 20 64 65 66 61 75 6c 74 20 75 6e 69 78 20 61 e default unix a
1b592 6e 64 20 77 69 6e 33 32 20 56 46 53 20 0d 0a 20 nd win32 VFS ..
1b593 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 ** module
1b594 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c s may return SQL
1b595 49 54 45 5f 42 55 53 59 20 64 75 65 20 74 6f 20 ITE_BUSY due to
1b596 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e a race condition
1b597 20 69 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20 in the ..
1b598 20 20 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 64 ** code that d
1b599 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 etermines whethe
1b59a 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 68 61 r or not the sha
1b59b 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f red-memory regio
1b59c 6e 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d n .. ** m
1b59d 75 73 74 20 62 65 20 7a 65 72 6f 65 64 20 62 65 ust be zeroed be
1b59e 66 6f 72 65 20 74 68 65 20 72 65 71 75 65 73 74 fore the request
1b59f 65 64 20 70 61 67 65 20 69 73 20 72 65 74 75 72 ed page is retur
1b5a0 6e 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f ned... */
1b5a1 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 57 .. rc = W
1b5a2 41 4c 5f 52 45 54 52 59 3b 0d 0a 20 20 20 20 20 AL_RETRY;..
1b5a3 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 }else if( SQLIT
1b5a4 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 77 61 6c 4c E_OK==(rc = walL
1b5a5 6f 63 6b 53 68 61 72 65 64 28 70 57 61 6c 2c 20 ockShared(pWal,
1b5a6 57 41 4c 5f 52 45 43 4f 56 45 52 5f 4c 4f 43 4b WAL_RECOVER_LOCK
1b5a7 29 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 77 )) ){.. w
1b5a8 61 6c 55 6e 6c 6f 63 6b 53 68 61 72 65 64 28 70 alUnlockShared(p
1b5a9 57 61 6c 2c 20 57 41 4c 5f 52 45 43 4f 56 45 52 Wal, WAL_RECOVER
1b5aa 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 20 20 20 _LOCK);..
1b5ab 20 72 63 20 3d 20 57 41 4c 5f 52 45 54 52 59 3b rc = WAL_RETRY;
1b5ac 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 .. }else if
1b5ad 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 ( rc==SQLITE_BUS
1b5ae 59 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 Y ){.. rc
1b5af 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 = SQLITE_BUSY_R
1b5b0 45 43 4f 56 45 52 59 3b 0d 0a 20 20 20 20 20 20 ECOVERY;..
1b5b1 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 }.. }.. if
1b5b2 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1b5b3 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
1b5b4 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d rc;.. }.. }
1b5b5 0d 0a 0d 0a 20 20 70 49 6e 66 6f 20 3d 20 77 61 .... pInfo = wa
1b5b6 6c 43 6b 70 74 49 6e 66 6f 28 70 57 61 6c 29 3b lCkptInfo(pWal);
1b5b7 0d 0a 20 20 69 66 28 20 21 75 73 65 57 61 6c 20 .. if( !useWal
1b5b8 26 26 20 70 49 6e 66 6f 2d 3e 6e 42 61 63 6b 66 && pInfo->nBackf
1b5b9 69 6c 6c 3d 3d 70 57 61 6c 2d 3e 68 64 72 2e 6d ill==pWal->hdr.m
1b5ba 78 46 72 61 6d 65 20 29 7b 0d 0a 20 20 20 20 2f xFrame ){.. /
1b5bb 2a 20 54 68 65 20 57 41 4c 20 68 61 73 20 62 65 * The WAL has be
1b5bc 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 61 en completely ba
1b5bd 63 6b 66 69 6c 6c 65 64 20 28 6f 72 20 69 74 20 ckfilled (or it
1b5be 69 73 20 65 6d 70 74 79 29 2e 0d 0a 20 20 20 20 is empty)...
1b5bf 2a 2a 20 61 6e 64 20 63 61 6e 20 62 65 20 73 61 ** and can be sa
1b5c0 66 65 6c 79 20 69 67 6e 6f 72 65 64 2e 0d 0a 20 fely ignored...
1b5c1 20 20 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 */.. rc =
1b5c2 77 61 6c 4c 6f 63 6b 53 68 61 72 65 64 28 70 57 walLockShared(pW
1b5c3 61 6c 2c 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 al, WAL_READ_LOC
1b5c4 4b 28 30 29 29 3b 0d 0a 20 20 20 20 77 61 6c 53 K(0));.. walS
1b5c5 68 6d 42 61 72 72 69 65 72 28 70 57 61 6c 29 3b hmBarrier(pWal);
1b5c6 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
1b5c7 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1b5c8 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 28 76 6f if( memcmp((vo
1b5c9 69 64 20 2a 29 77 61 6c 49 6e 64 65 78 48 64 72 id *)walIndexHdr
1b5ca 28 70 57 61 6c 29 2c 20 26 70 57 61 6c 2d 3e 68 (pWal), &pWal->h
1b5cb 64 72 2c 20 73 69 7a 65 6f 66 28 57 61 6c 49 6e dr, sizeof(WalIn
1b5cc 64 65 78 48 64 72 29 29 20 29 7b 0d 0a 20 20 20 dexHdr)) ){..
1b5cd 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f /* It is no
1b5ce 74 20 73 61 66 65 20 74 6f 20 61 6c 6c 6f 77 20 t safe to allow
1b5cf 74 68 65 20 72 65 61 64 65 72 20 74 6f 20 63 6f the reader to co
1b5d0 6e 74 69 6e 75 65 20 68 65 72 65 20 69 66 20 66 ntinue here if f
1b5d1 72 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 2a rames.. *
1b5d2 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 * may have been
1b5d3 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 appended to the
1b5d4 6c 6f 67 20 62 65 66 6f 72 65 20 52 45 41 44 5f log before READ_
1b5d5 4c 4f 43 4b 28 30 29 20 77 61 73 20 6f 62 74 61 LOCK(0) was obta
1b5d6 69 6e 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2a ined... *
1b5d7 2a 20 57 68 65 6e 20 68 6f 6c 64 69 6e 67 20 52 * When holding R
1b5d8 45 41 44 5f 4c 4f 43 4b 28 30 29 2c 20 74 68 65 EAD_LOCK(0), the
1b5d9 20 72 65 61 64 65 72 20 69 67 6e 6f 72 65 73 20 reader ignores
1b5da 74 68 65 20 65 6e 74 69 72 65 20 6c 6f 67 20 66 the entire log f
1b5db 69 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 2a 2a ile,.. **
1b5dc 20 77 68 69 63 68 20 69 6d 70 6c 69 65 73 20 74 which implies t
1b5dd 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 hat the database
1b5de 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 file contains a
1b5df 20 74 72 75 73 74 77 6f 72 74 68 79 0d 0a 20 20 trustworthy..
1b5e0 20 20 20 20 20 20 2a 2a 20 73 6e 61 70 73 68 6f ** snapsho
1b5e1 54 2e 20 53 69 6e 63 65 20 68 6f 6c 64 69 6e 67 T. Since holding
1b5e2 20 52 45 41 44 5f 4c 4f 43 4b 28 30 29 20 70 72 READ_LOCK(0) pr
1b5e3 65 76 65 6e 74 73 20 61 20 63 68 65 63 6b 70 6f events a checkpo
1b5e4 69 6e 74 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 int from..
1b5e5 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 ** happening,
1b5e6 74 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 this is usually
1b5e7 63 6f 72 72 65 63 74 2e 0d 0a 20 20 20 20 20 20 correct...
1b5e8 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a **.. **
1b5e9 20 48 6f 77 65 76 65 72 2c 20 69 66 20 66 72 61 However, if fra
1b5ea 6d 65 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 mes have been ap
1b5eb 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6c 6f pended to the lo
1b5ec 67 20 28 6f 72 20 69 66 20 74 68 65 20 6c 6f 67 g (or if the log
1b5ed 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 .. ** is
1b5ee 20 77 72 61 70 70 65 64 20 61 6e 64 20 77 72 69 wrapped and wri
1b5ef 74 74 65 6e 20 66 6f 72 20 74 68 61 74 20 6d 61 tten for that ma
1b5f0 74 74 65 72 29 20 62 65 66 6f 72 65 20 74 68 65 tter) before the
1b5f1 20 52 45 41 44 5f 4c 4f 43 4b 28 30 29 0d 0a 20 READ_LOCK(0)..
1b5f2 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 ** is obt
1b5f3 61 69 6e 65 64 2c 20 74 68 61 74 20 69 73 20 6e ained, that is n
1b5f4 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 ot necessarily t
1b5f5 72 75 65 2e 20 41 20 63 68 65 63 6b 70 6f 69 6e rue. A checkpoin
1b5f6 74 65 72 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 ter may..
1b5f7 20 2a 2a 20 68 61 76 65 20 73 74 61 72 74 65 64 ** have started
1b5f8 20 74 6f 20 62 61 63 6b 66 69 6c 6c 20 74 68 65 to backfill the
1b5f9 20 61 70 70 65 6e 64 65 64 20 66 72 61 6d 65 73 appended frames
1b5fa 20 62 75 74 20 63 72 61 73 68 65 64 20 62 65 66 but crashed bef
1b5fb 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 ore.. **
1b5fc 69 74 20 66 69 6e 69 73 68 65 64 2e 20 4c 65 61 it finished. Lea
1b5fd 76 69 6e 67 20 61 20 63 6f 72 72 75 70 74 20 69 ving a corrupt i
1b5fe 6d 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 mage in the data
1b5ff 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 base file...
1b600 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
1b601 77 61 6c 55 6e 6c 6f 63 6b 53 68 61 72 65 64 28 walUnlockShared(
1b602 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 44 5f 4c pWal, WAL_READ_L
1b603 4f 43 4b 28 30 29 29 3b 0d 0a 20 20 20 20 20 20 OCK(0));..
1b604 20 20 72 65 74 75 72 6e 20 57 41 4c 5f 52 45 54 return WAL_RET
1b605 52 59 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 RY;.. }..
1b606 20 20 20 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f pWal->readLo
1b607 63 6b 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 72 ck = 0;.. r
1b608 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1b609 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 .. }else if(
1b60a 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc!=SQLITE_BUSY
1b60b 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
1b60c 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d rc;.. }.. }
1b60d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 .... /* If we g
1b60e 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 et this far, it
1b60f 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 means that the r
1b610 65 61 64 65 72 20 77 69 6c 6c 20 77 61 6e 74 20 eader will want
1b611 74 6f 20 75 73 65 0d 0a 20 20 2a 2a 20 74 68 65 to use.. ** the
1b612 20 57 41 4c 20 74 6f 20 67 65 74 20 61 74 20 63 WAL to get at c
1b613 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 63 65 ontent from rece
1b614 6e 74 20 63 6f 6d 6d 69 74 73 2e 20 20 54 68 65 nt commits. The
1b615 20 6a 6f 62 20 6e 6f 77 20 69 73 0d 0a 20 20 2a job now is.. *
1b616 2a 20 74 6f 20 73 65 6c 65 63 74 20 6f 6e 65 20 * to select one
1b617 6f 66 20 74 68 65 20 61 52 65 61 64 4d 61 72 6b of the aReadMark
1b618 5b 5d 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 [] entries that
1b619 69 73 20 63 6c 6f 73 65 73 74 20 74 6f 0d 0a 20 is closest to..
1b61a 20 2a 2a 20 62 75 74 20 6e 6f 74 20 65 78 63 65 ** but not exce
1b61b 65 64 69 6e 67 20 70 57 61 6c 2d 3e 68 64 72 2e eding pWal->hdr.
1b61c 6d 78 46 72 61 6d 65 20 61 6e 64 20 6c 6f 63 6b mxFrame and lock
1b61d 20 74 68 61 74 20 65 6e 74 72 79 2e 0d 0a 20 20 that entry...
1b61e 2a 2f 0d 0a 20 20 6d 78 52 65 61 64 4d 61 72 6b */.. mxReadMark
1b61f 20 3d 20 30 3b 0d 0a 20 20 6d 78 49 20 3d 20 30 = 0;.. mxI = 0
1b620 3b 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c ;.. for(i=1; i<
1b621 57 41 4c 5f 4e 52 45 41 44 45 52 3b 20 69 2b 2b WAL_NREADER; i++
1b622 29 7b 0d 0a 20 20 20 20 75 33 32 20 74 68 69 73 ){.. u32 this
1b623 4d 61 72 6b 20 3d 20 70 49 6e 66 6f 2d 3e 61 52 Mark = pInfo->aR
1b624 65 61 64 4d 61 72 6b 5b 69 5d 3b 0d 0a 20 20 20 eadMark[i];..
1b625 20 69 66 28 20 6d 78 52 65 61 64 4d 61 72 6b 3c if( mxReadMark<
1b626 3d 74 68 69 73 4d 61 72 6b 20 26 26 20 74 68 69 =thisMark && thi
1b627 73 4d 61 72 6b 3c 3d 70 57 61 6c 2d 3e 68 64 72 sMark<=pWal->hdr
1b628 2e 6d 78 46 72 61 6d 65 20 29 7b 0d 0a 20 20 20 .mxFrame ){..
1b629 20 20 20 61 73 73 65 72 74 28 20 74 68 69 73 4d assert( thisM
1b62a 61 72 6b 21 3d 52 45 41 44 4d 41 52 4b 5f 4e 4f ark!=READMARK_NO
1b62b 54 5f 55 53 45 44 20 29 3b 0d 0a 20 20 20 20 20 T_USED );..
1b62c 20 6d 78 52 65 61 64 4d 61 72 6b 20 3d 20 74 68 mxReadMark = th
1b62d 69 73 4d 61 72 6b 3b 0d 0a 20 20 20 20 20 20 6d isMark;.. m
1b62e 78 49 20 3d 20 69 3b 0d 0a 20 20 20 20 7d 0d 0a xI = i;.. }..
1b62f 20 20 7d 0d 0a 20 20 2f 2a 20 54 68 65 72 65 20 }.. /* There
1b630 77 61 73 20 6f 6e 63 65 20 61 6e 20 22 69 66 22 was once an "if"
1b631 20 68 65 72 65 2e 20 54 68 65 20 65 78 74 72 61 here. The extra
1b632 20 22 7b 22 20 69 73 20 74 6f 20 70 72 65 73 65 "{" is to prese
1b633 72 76 65 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e rve indentation.
1b634 20 2a 2f 0d 0a 20 20 7b 0d 0a 20 20 20 20 69 66 */.. {.. if
1b635 28 20 28 70 57 61 6c 2d 3e 72 65 61 64 4f 6e 6c ( (pWal->readOnl
1b636 79 20 26 20 57 41 4c 5f 53 48 4d 5f 52 44 4f 4e y & WAL_SHM_RDON
1b637 4c 59 29 3d 3d 30 0d 0a 20 20 20 20 20 26 26 20 LY)==0.. &&
1b638 28 6d 78 52 65 61 64 4d 61 72 6b 3c 70 57 61 6c (mxReadMark<pWal
1b639 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 7c 7c ->hdr.mxFrame ||
1b63a 20 6d 78 49 3d 3d 30 29 0d 0a 20 20 20 20 29 7b mxI==0).. ){
1b63b 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b .. for(i=1;
1b63c 20 69 3c 57 41 4c 5f 4e 52 45 41 44 45 52 3b 20 i<WAL_NREADER;
1b63d 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 i++){.. r
1b63e 63 20 3d 20 77 61 6c 4c 6f 63 6b 45 78 63 6c 75 c = walLockExclu
1b63f 73 69 76 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 sive(pWal, WAL_R
1b640 45 41 44 5f 4c 4f 43 4b 28 69 29 2c 20 31 29 3b EAD_LOCK(i), 1);
1b641 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 .. if( rc
1b642 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1b643 20 20 20 20 20 20 20 20 20 20 6d 78 52 65 61 64 mxRead
1b644 4d 61 72 6b 20 3d 20 70 49 6e 66 6f 2d 3e 61 52 Mark = pInfo->aR
1b645 65 61 64 4d 61 72 6b 5b 69 5d 20 3d 20 70 57 61 eadMark[i] = pWa
1b646 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 3b 0d l->hdr.mxFrame;.
1b647 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d . mxI =
1b648 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 77 i;.. w
1b649 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 69 76 alUnlockExclusiv
1b64a 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 44 e(pWal, WAL_READ
1b64b 5f 4c 4f 43 4b 28 69 29 2c 20 31 29 3b 0d 0a 20 _LOCK(i), 1);..
1b64c 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d break;.
1b64d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
1b64e 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 f( rc!=SQLITE_BU
1b64f 53 59 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 SY ){..
1b650 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1b651 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d }.. }.
1b652 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
1b653 6d 78 49 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 mxI==0 ){..
1b654 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
1b655 49 54 45 5f 42 55 53 59 20 7c 7c 20 28 70 57 61 ITE_BUSY || (pWa
1b656 6c 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 20 57 41 l->readOnly & WA
1b657 4c 5f 53 48 4d 5f 52 44 4f 4e 4c 59 29 21 3d 30 L_SHM_RDONLY)!=0
1b658 20 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 );.. retur
1b659 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 n rc==SQLITE_BUS
1b65a 59 20 3f 20 57 41 4c 5f 52 45 54 52 59 20 3a 20 Y ? WAL_RETRY :
1b65b 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f SQLITE_READONLY_
1b65c 43 41 4e 54 4c 4f 43 4b 3b 0d 0a 20 20 20 20 7d CANTLOCK;.. }
1b65d 0d 0a 0d 0a 20 20 20 20 72 63 20 3d 20 77 61 6c .... rc = wal
1b65e 4c 6f 63 6b 53 68 61 72 65 64 28 70 57 61 6c 2c LockShared(pWal,
1b65f 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 6d WAL_READ_LOCK(m
1b660 78 49 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 xI));.. if( r
1b661 63 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 c ){.. retu
1b662 72 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 rn rc==SQLITE_BU
1b663 53 59 20 3f 20 57 41 4c 5f 52 45 54 52 59 20 3a SY ? WAL_RETRY :
1b664 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 rc;.. }..
1b665 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 74 68 65 /* Now that the
1b666 20 72 65 61 64 2d 6c 6f 63 6b 20 68 61 73 20 62 read-lock has b
1b667 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 63 68 een obtained, ch
1b668 65 63 6b 20 74 68 61 74 20 6e 65 69 74 68 65 72 eck that neither
1b669 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 76 61 6c the.. ** val
1b66a 75 65 20 69 6e 20 74 68 65 20 61 52 65 61 64 4d ue in the aReadM
1b66b 61 72 6b 5b 5d 20 61 72 72 61 79 20 6f 72 20 74 ark[] array or t
1b66c 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 he contents of t
1b66d 68 65 20 77 61 6c 2d 69 6e 64 65 78 0d 0a 20 20 he wal-index..
1b66e 20 20 2a 2a 20 68 65 61 64 65 72 20 68 61 76 65 ** header have
1b66f 20 63 68 61 6e 67 65 64 2e 0d 0a 20 20 20 20 2a changed... *
1b670 2a 0d 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 *.. ** It is
1b671 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 necessary to che
1b672 63 6b 20 74 68 61 74 20 74 68 65 20 77 61 6c 2d ck that the wal-
1b673 69 6e 64 65 78 20 68 65 61 64 65 72 20 64 69 64 index header did
1b674 20 6e 6f 74 20 63 68 61 6e 67 65 0d 0a 20 20 20 not change..
1b675 20 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 ** between the
1b676 74 69 6d 65 20 69 74 20 77 61 73 20 72 65 61 64 time it was read
1b677 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 73 68 and when the sh
1b678 61 72 65 64 2d 6c 6f 63 6b 20 77 61 73 20 6f 62 ared-lock was ob
1b679 74 61 69 6e 65 64 0d 0a 20 20 20 20 2a 2a 20 6f tained.. ** o
1b67a 6e 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 n WAL_READ_LOCK(
1b67b 6d 78 49 29 20 77 61 73 20 6f 62 74 61 69 6e 65 mxI) was obtaine
1b67c 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 d to account for
1b67d 20 74 68 65 20 70 6f 73 73 69 62 69 6c 69 74 79 the possibility
1b67e 0d 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 .. ** that th
1b67f 65 20 6c 6f 67 20 66 69 6c 65 20 6d 61 79 20 68 e log file may h
1b680 61 76 65 20 62 65 65 6e 20 77 72 61 70 70 65 64 ave been wrapped
1b681 20 62 79 20 61 20 77 72 69 74 65 72 2c 20 6f 72 by a writer, or
1b682 20 74 68 61 74 20 66 72 61 6d 65 73 0d 0a 20 20 that frames..
1b683 20 20 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20 ** that occur
1b684 6c 61 74 65 72 20 69 6e 20 74 68 65 20 6c 6f 67 later in the log
1b685 20 74 68 61 6e 20 70 57 61 6c 2d 3e 68 64 72 2e than pWal->hdr.
1b686 6d 78 46 72 61 6d 65 20 6d 61 79 20 68 61 76 65 mxFrame may have
1b687 20 62 65 65 6e 0d 0a 20 20 20 20 2a 2a 20 63 6f been.. ** co
1b688 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 pied into the da
1b689 74 61 62 61 73 65 20 62 79 20 61 20 63 68 65 63 tabase by a chec
1b68a 6b 70 6f 69 6e 74 65 72 2e 20 49 66 20 65 69 74 kpointer. If eit
1b68b 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 68 69 her of these thi
1b68c 6e 67 73 0d 0a 20 20 20 20 2a 2a 20 68 61 70 70 ngs.. ** happ
1b68d 65 6e 65 64 2c 20 74 68 65 6e 20 72 65 61 64 69 ened, then readi
1b68e 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ng the database
1b68f 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 with the current
1b690 20 76 61 6c 75 65 20 6f 66 0d 0a 20 20 20 20 2a value of.. *
1b691 2a 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 * pWal->hdr.mxFr
1b692 61 6d 65 20 72 69 73 6b 73 20 72 65 61 64 69 6e ame risks readin
1b693 67 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 6e g a corrupted sn
1b694 61 70 73 68 6f 74 2e 20 53 6f 2c 20 72 65 74 72 apshot. So, retr
1b695 79 0d 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 y.. ** instea
1b696 64 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 d... **..
1b697 2a 2a 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 ** This does not
1b698 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 guarantee that
1b699 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 the copy of the
1b69a 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 wal-index header
1b69b 20 69 73 20 75 70 20 74 6f 0d 0a 20 20 20 20 2a is up to.. *
1b69c 2a 20 64 61 74 65 20 62 65 66 6f 72 65 20 70 72 * date before pr
1b69d 6f 63 65 65 64 69 6e 67 2e 20 54 68 61 74 20 77 oceeding. That w
1b69e 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 ould not be poss
1b69f 69 62 6c 65 20 77 69 74 68 6f 75 74 20 73 6f 6d ible without som
1b6a0 65 68 6f 77 0d 0a 20 20 20 20 2a 2a 20 62 6c 6f ehow.. ** blo
1b6a1 63 6b 69 6e 67 20 77 72 69 74 65 72 73 2e 20 49 cking writers. I
1b6a2 74 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 t only guarantee
1b6a3 73 20 74 68 61 74 20 61 20 64 61 6e 67 65 72 6f s that a dangero
1b6a4 75 73 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 72 us checkpoint or
1b6a5 20 0d 0a 20 20 20 20 2a 2a 20 6c 6f 67 2d 77 72 .. ** log-wr
1b6a6 61 70 20 28 65 69 74 68 65 72 20 6f 66 20 77 68 ap (either of wh
1b6a7 69 63 68 20 77 6f 75 6c 64 20 72 65 71 75 69 72 ich would requir
1b6a8 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c e an exclusive l
1b6a9 6f 63 6b 20 6f 6e 0d 0a 20 20 20 20 2a 2a 20 57 ock on.. ** W
1b6aa 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 6d 78 49 AL_READ_LOCK(mxI
1b6ab 29 29 20 68 61 73 20 6e 6f 74 20 6f 63 63 75 72 )) has not occur
1b6ac 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 6e red since the sn
1b6ad 61 70 73 68 6f 74 20 77 61 73 20 76 61 6c 69 64 apshot was valid
1b6ae 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 77 ... */.. w
1b6af 61 6c 53 68 6d 42 61 72 72 69 65 72 28 70 57 61 alShmBarrier(pWa
1b6b0 6c 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 49 6e l);.. if( pIn
1b6b1 66 6f 2d 3e 61 52 65 61 64 4d 61 72 6b 5b 6d 78 fo->aReadMark[mx
1b6b2 49 5d 21 3d 6d 78 52 65 61 64 4d 61 72 6b 0d 0a I]!=mxReadMark..
1b6b3 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 28 || memcmp((
1b6b4 76 6f 69 64 20 2a 29 77 61 6c 49 6e 64 65 78 48 void *)walIndexH
1b6b5 64 72 28 70 57 61 6c 29 2c 20 26 70 57 61 6c 2d dr(pWal), &pWal-
1b6b6 3e 68 64 72 2c 20 73 69 7a 65 6f 66 28 57 61 6c >hdr, sizeof(Wal
1b6b7 49 6e 64 65 78 48 64 72 29 29 0d 0a 20 20 20 20 IndexHdr))..
1b6b8 29 7b 0d 0a 20 20 20 20 20 20 77 61 6c 55 6e 6c ){.. walUnl
1b6b9 6f 63 6b 53 68 61 72 65 64 28 70 57 61 6c 2c 20 ockShared(pWal,
1b6ba 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b 28 6d 78 WAL_READ_LOCK(mx
1b6bb 49 29 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 I));.. retu
1b6bc 72 6e 20 57 41 4c 5f 52 45 54 52 59 3b 0d 0a 20 rn WAL_RETRY;..
1b6bd 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1b6be 20 61 73 73 65 72 74 28 20 6d 78 52 65 61 64 4d assert( mxReadM
1b6bf 61 72 6b 3c 3d 70 57 61 6c 2d 3e 68 64 72 2e 6d ark<=pWal->hdr.m
1b6c0 78 46 72 61 6d 65 20 29 3b 0d 0a 20 20 20 20 20 xFrame );..
1b6c1 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b 20 pWal->readLock
1b6c2 3d 20 28 69 31 36 29 6d 78 49 3b 0d 0a 20 20 20 = (i16)mxI;..
1b6c3 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 }.. }.. retur
1b6c4 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
1b6c5 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 ** Begin a read
1b6c6 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 transaction on t
1b6c7 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2a he database...**
1b6c8 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
1b6c9 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c e used to be cal
1b6ca 6c 65 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 53 led sqlite3OpenS
1b6cb 6e 61 70 73 68 6f 74 28 29 20 61 6e 64 20 77 69 napshot() and wi
1b6cc 74 68 20 67 6f 6f 64 20 72 65 61 73 6f 6e 3a 0d th good reason:.
1b6cd 0a 2a 2a 20 69 74 20 74 61 6b 65 73 20 61 20 73 .** it takes a s
1b6ce 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 73 napshot of the s
1b6cf 74 61 74 65 20 6f 66 20 74 68 65 20 57 41 4c 20 tate of the WAL
1b6d0 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 20 66 6f and wal-index fo
1b6d1 72 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 2a r the current..*
1b6d2 2a 20 69 6e 73 74 61 6e 74 20 69 6e 20 74 69 6d * instant in tim
1b6d3 65 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 e. The current
1b6d4 74 68 72 65 61 64 20 77 69 6c 6c 20 63 6f 6e 74 thread will cont
1b6d5 69 6e 75 65 20 74 6f 20 75 73 65 20 74 68 69 73 inue to use this
1b6d6 20 73 6e 61 70 73 68 6f 74 2e 0d 0a 2a 2a 20 4f snapshot...** O
1b6d7 74 68 65 72 20 74 68 72 65 61 64 73 20 6d 69 67 ther threads mig
1b6d8 68 74 20 61 70 70 65 6e 64 20 6e 65 77 20 63 6f ht append new co
1b6d9 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 57 41 4c ntent to the WAL
1b6da 20 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 20 62 and wal-index b
1b6db 75 74 0d 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 ut..** that extr
1b6dc 61 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 67 6e a content is ign
1b6dd 6f 72 65 64 20 62 79 20 74 68 65 20 63 75 72 72 ored by the curr
1b6de 65 6e 74 20 74 68 72 65 61 64 2e 0d 0a 2a 2a 0d ent thread...**.
1b6df 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 .** If the datab
1b6e0 61 73 65 20 63 6f 6e 74 65 6e 74 73 20 68 61 76 ase contents hav
1b6e1 65 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 e changes since
1b6e2 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 61 the previous rea
1b6e3 64 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f d..** transactio
1b6e4 6e 2c 20 74 68 65 6e 20 2a 70 43 68 61 6e 67 65 n, then *pChange
1b6e5 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 62 65 d is set to 1 be
1b6e6 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 fore returning.
1b6e7 20 54 68 65 0d 0a 2a 2a 20 50 61 67 65 72 20 6c The..** Pager l
1b6e8 61 79 65 72 20 77 69 6c 6c 20 75 73 65 20 74 68 ayer will use th
1b6e9 69 73 20 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 is to know that
1b6ea 69 73 20 63 61 63 68 65 20 69 73 20 73 74 61 6c is cache is stal
1b6eb 65 20 61 6e 64 0d 0a 2a 2a 20 6e 65 65 64 73 20 e and..** needs
1b6ec 74 6f 20 62 65 20 66 6c 75 73 68 65 64 2e 0d 0a to be flushed...
1b6ed 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1b6ee 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 TE int sqlite3Wa
1b6ef 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 lBeginReadTransa
1b6f0 63 74 69 6f 6e 28 57 61 6c 20 2a 70 57 61 6c 2c ction(Wal *pWal,
1b6f1 20 69 6e 74 20 2a 70 43 68 61 6e 67 65 64 29 7b int *pChanged){
1b6f2 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 .. int rc;
1b6f3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b6f4 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f /* Return co
1b6f5 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 6e 74 de */.. int cnt
1b6f6 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
1b6f7 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
1b6f8 65 72 20 6f 66 20 54 72 79 42 65 67 69 6e 52 65 er of TryBeginRe
1b6f9 61 64 20 61 74 74 65 6d 70 74 73 20 2a 2f 0d 0a ad attempts */..
1b6fa 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20 20 72 63 20 .. do{.. rc
1b6fb 3d 20 77 61 6c 54 72 79 42 65 67 69 6e 52 65 61 = walTryBeginRea
1b6fc 64 28 70 57 61 6c 2c 20 70 43 68 61 6e 67 65 64 d(pWal, pChanged
1b6fd 2c 20 30 2c 20 2b 2b 63 6e 74 29 3b 0d 0a 20 20 , 0, ++cnt);..
1b6fe 7d 77 68 69 6c 65 28 20 72 63 3d 3d 57 41 4c 5f }while( rc==WAL_
1b6ff 52 45 54 52 59 20 29 3b 0d 0a 20 20 74 65 73 74 RETRY );.. test
1b700 63 61 73 65 28 20 28 72 63 26 30 78 66 66 29 3d case( (rc&0xff)=
1b701 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0d =SQLITE_BUSY );.
1b702 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 72 63 . testcase( (rc
1b703 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 &0xff)==SQLITE_I
1b704 4f 45 52 52 20 29 3b 0d 0a 20 20 74 65 73 74 63 OERR );.. testc
1b705 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f ase( rc==SQLITE_
1b706 50 52 4f 54 4f 43 4f 4c 20 29 3b 0d 0a 20 20 74 PROTOCOL );.. t
1b707 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c estcase( rc==SQL
1b708 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 72 65 74 ITE_OK );.. ret
1b709 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1b70a 0d 0a 2a 2a 20 46 69 6e 69 73 68 20 77 69 74 68 ..** Finish with
1b70b 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 a read transact
1b70c 69 6f 6e 2e 20 20 41 6c 6c 20 74 68 69 73 20 64 ion. All this d
1b70d 6f 65 73 20 69 73 20 72 65 6c 65 61 73 65 20 74 oes is release t
1b70e 68 65 0d 0a 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b he..** read-lock
1b70f 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
1b710 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
1b711 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e e3WalEndReadTran
1b712 73 61 63 74 69 6f 6e 28 57 61 6c 20 2a 70 57 61 saction(Wal *pWa
1b713 6c 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 57 61 l){.. sqlite3Wa
1b714 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 lEndWriteTransac
1b715 74 69 6f 6e 28 70 57 61 6c 29 3b 0d 0a 20 20 69 tion(pWal);.. i
1b716 66 28 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 f( pWal->readLoc
1b717 6b 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 77 61 6c k>=0 ){.. wal
1b718 55 6e 6c 6f 63 6b 53 68 61 72 65 64 28 70 57 61 UnlockShared(pWa
1b719 6c 2c 20 57 41 4c 5f 52 45 41 44 5f 4c 4f 43 4b l, WAL_READ_LOCK
1b71a 28 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b 29 (pWal->readLock)
1b71b 29 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e 72 65 );.. pWal->re
1b71c 61 64 4c 6f 63 6b 20 3d 20 2d 31 3b 0d 0a 20 20 adLock = -1;..
1b71d 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 }..}..../*..** R
1b71e 65 61 64 20 61 20 70 61 67 65 20 66 72 6f 6d 20 ead a page from
1b71f 74 68 65 20 57 41 4c 2c 20 69 66 20 69 74 20 69 the WAL, if it i
1b720 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 s present in the
1b721 20 57 41 4c 20 61 6e 64 20 69 66 20 74 68 65 20 WAL and if the
1b722 0d 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72 65 61 ..** current rea
1b723 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 d transaction is
1b724 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 configured to u
1b725 73 65 20 74 68 65 20 57 41 4c 2e 20 20 0d 0a 2a se the WAL. ..*
1b726 2a 0d 0a 2a 2a 20 54 68 65 20 2a 70 49 6e 57 61 *..** The *pInWa
1b727 6c 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 l is set to 1 if
1b728 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 the requested p
1b729 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 57 41 age is in the WA
1b72a 4c 20 61 6e 64 0d 0a 2a 2a 20 68 61 73 20 62 65 L and..** has be
1b72b 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4f 72 20 2a en loaded. Or *
1b72c 70 49 6e 57 61 6c 20 69 73 20 73 65 74 20 74 6f pInWal is set to
1b72d 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 77 0 if the page w
1b72e 61 73 20 6e 6f 74 20 69 6e 20 0d 0a 2a 2a 20 74 as not in ..** t
1b72f 68 65 20 57 41 4c 20 61 6e 64 20 6e 65 65 64 73 he WAL and needs
1b730 20 74 6f 20 62 65 20 72 65 61 64 20 6f 75 74 20 to be read out
1b731 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e of the database.
1b732 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1b733 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1b734 57 61 6c 52 65 61 64 28 0d 0a 20 20 57 61 6c 20 WalRead(.. Wal
1b735 2a 70 57 61 6c 2c 20 20 20 20 20 20 20 20 20 20 *pWal,
1b736 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 /* W
1b737 41 4c 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 AL handle */..
1b738 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 Pgno pgno,
1b739 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b73a 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 /* Database page
1b73b 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 number to read
1b73c 64 61 74 61 20 66 6f 72 20 2a 2f 0d 0a 20 20 69 data for */.. i
1b73d 6e 74 20 2a 70 49 6e 57 61 6c 2c 20 20 20 20 20 nt *pInWal,
1b73e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b73f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 64 * OUT: True if d
1b740 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d ata is read from
1b741 20 57 41 4c 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e WAL */.. int n
1b742 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 Out,
1b743 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
1b744 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 4f 75 ze of buffer pOu
1b745 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 t in bytes */..
1b746 20 75 38 20 2a 70 4f 75 74 20 20 20 20 20 20 20 u8 *pOut
1b747 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b748 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 /* Buffer to wr
1b749 69 74 65 20 70 61 67 65 20 64 61 74 61 20 74 6f ite page data to
1b74a 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 75 33 32 20 69 */..){.. u32 i
1b74b 52 65 61 64 20 3d 20 30 3b 20 20 20 20 20 20 20 Read = 0;
1b74c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 /* If
1b74d 20 21 3d 30 2c 20 57 41 4c 20 66 72 61 6d 65 20 !=0, WAL frame
1b74e 74 6f 20 72 65 74 75 72 6e 20 64 61 74 61 20 66 to return data f
1b74f 72 6f 6d 20 2a 2f 0d 0a 20 20 75 33 32 20 69 4c rom */.. u32 iL
1b750 61 73 74 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e ast = pWal->hdr.
1b751 6d 78 46 72 61 6d 65 3b 20 20 2f 2a 20 4c 61 73 mxFrame; /* Las
1b752 74 20 70 61 67 65 20 69 6e 20 57 41 4c 20 66 6f t page in WAL fo
1b753 72 20 74 68 69 73 20 72 65 61 64 65 72 20 2a 2f r this reader */
1b754 0d 0a 20 20 69 6e 74 20 69 48 61 73 68 3b 20 20 .. int iHash;
1b755 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b756 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6c /* Used to l
1b757 6f 6f 70 20 74 68 72 6f 75 67 68 20 4e 20 68 61 oop through N ha
1b758 73 68 20 74 61 62 6c 65 73 20 2a 2f 0d 0a 0d 0a sh tables */....
1b759 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e /* This routin
1b75a 65 20 69 73 20 6f 6e 6c 79 20 62 65 20 63 61 6c e is only be cal
1b75b 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 led from within
1b75c 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 a read transacti
1b75d 6f 6e 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 on. */.. assert
1b75e 28 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b ( pWal->readLock
1b75f 3e 3d 30 20 7c 7c 20 70 57 61 6c 2d 3e 6c 6f 63 >=0 || pWal->loc
1b760 6b 45 72 72 6f 72 20 29 3b 0d 0a 0d 0a 20 20 2f kError );.... /
1b761 2a 20 49 66 20 74 68 65 20 22 6c 61 73 74 20 70 * If the "last p
1b762 61 67 65 22 20 66 69 65 6c 64 20 6f 66 20 74 68 age" field of th
1b763 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 e wal-index head
1b764 65 72 20 73 6e 61 70 73 68 6f 74 20 69 73 20 30 er snapshot is 0
1b765 2c 20 74 68 65 6e 0d 0a 20 20 2a 2a 20 6e 6f 20 , then.. ** no
1b766 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 61 data will be rea
1b767 64 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 75 d from the wal u
1b768 6e 64 65 72 20 61 6e 79 20 63 69 72 63 75 6d 73 nder any circums
1b769 74 61 6e 63 65 73 2e 20 52 65 74 75 72 6e 20 65 tances. Return e
1b76a 61 72 6c 79 0d 0a 20 20 2a 2a 20 69 6e 20 74 68 arly.. ** in th
1b76b 69 73 20 63 61 73 65 20 61 73 20 61 6e 20 6f 70 is case as an op
1b76c 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4c 69 6b timization. Lik
1b76d 65 77 69 73 65 2c 20 69 66 20 70 57 61 6c 2d 3e ewise, if pWal->
1b76e 72 65 61 64 4c 6f 63 6b 3d 3d 30 2c 20 0d 0a 20 readLock==0, ..
1b76f 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 57 41 4c ** then the WAL
1b770 20 69 73 20 69 67 6e 6f 72 65 64 20 62 79 20 74 is ignored by t
1b771 68 65 20 72 65 61 64 65 72 20 73 6f 20 72 65 74 he reader so ret
1b772 75 72 6e 20 65 61 72 6c 79 2c 20 61 73 20 69 66 urn early, as if
1b773 20 74 68 65 20 0d 0a 20 20 2a 2a 20 57 41 4c 20 the .. ** WAL
1b774 77 65 72 65 20 65 6d 70 74 79 2e 0d 0a 20 20 2a were empty... *
1b775 2f 0d 0a 20 20 69 66 28 20 69 4c 61 73 74 3d 3d /.. if( iLast==
1b776 30 20 7c 7c 20 70 57 61 6c 2d 3e 72 65 61 64 4c 0 || pWal->readL
1b777 6f 63 6b 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 2a ock==0 ){.. *
1b778 70 49 6e 57 61 6c 20 3d 20 30 3b 0d 0a 20 20 20 pInWal = 0;..
1b779 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1b77a 4b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 K;.. }.... /*
1b77b 53 65 61 72 63 68 20 74 68 65 20 68 61 73 68 20 Search the hash
1b77c 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65 73 20 table or tables
1b77d 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 6d 61 74 for an entry mat
1b77e 63 68 69 6e 67 20 70 61 67 65 20 6e 75 6d 62 65 ching page numbe
1b77f 72 0d 0a 20 20 2a 2a 20 70 67 6e 6f 2e 20 45 61 r.. ** pgno. Ea
1b780 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 ch iteration of
1b781 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f the following fo
1b782 72 28 29 20 6c 6f 6f 70 20 73 65 61 72 63 68 65 r() loop searche
1b783 73 20 6f 6e 65 0d 0a 20 20 2a 2a 20 68 61 73 68 s one.. ** hash
1b784 20 74 61 62 6c 65 20 28 65 61 63 68 20 68 61 73 table (each has
1b785 68 20 74 61 62 6c 65 20 69 6e 64 65 78 65 73 20 h table indexes
1b786 75 70 20 74 6f 20 48 41 53 48 54 41 42 4c 45 5f up to HASHTABLE_
1b787 4e 50 41 47 45 20 66 72 61 6d 65 73 29 2e 0d 0a NPAGE frames)...
1b788 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 69 73 20 **.. ** This
1b789 63 6f 64 65 20 6d 69 67 68 74 20 72 75 6e 20 63 code might run c
1b78a 6f 6e 63 75 72 72 65 6e 74 6c 79 20 74 6f 20 74 oncurrently to t
1b78b 68 65 20 63 6f 64 65 20 69 6e 20 77 61 6c 49 6e he code in walIn
1b78c 64 65 78 41 70 70 65 6e 64 28 29 0d 0a 20 20 2a dexAppend().. *
1b78d 2a 20 74 68 61 74 20 61 64 64 73 20 65 6e 74 72 * that adds entr
1b78e 69 65 73 20 74 6f 20 74 68 65 20 77 61 6c 2d 69 ies to the wal-i
1b78f 6e 64 65 78 20 28 61 6e 64 20 70 6f 73 73 69 62 ndex (and possib
1b790 6c 79 20 74 6f 20 74 68 69 73 20 68 61 73 68 20 ly to this hash
1b791 0d 0a 20 20 2a 2a 20 74 61 62 6c 65 29 2e 20 54 .. ** table). T
1b792 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 76 61 his means the va
1b793 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 lue just read fr
1b794 6f 6d 20 74 68 65 20 68 61 73 68 20 0d 0a 20 20 om the hash ..
1b795 2a 2a 20 73 6c 6f 74 20 28 61 48 61 73 68 5b 69 ** slot (aHash[i
1b796 4b 65 79 5d 29 20 6d 61 79 20 68 61 76 65 20 62 Key]) may have b
1b797 65 65 6e 20 61 64 64 65 64 20 62 65 66 6f 72 65 een added before
1b798 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 0d 0a or after the ..
1b799 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 65 61 ** current rea
1b79a 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 d transaction wa
1b79b 73 20 6f 70 65 6e 65 64 2e 20 56 61 6c 75 65 73 s opened. Values
1b79c 20 61 64 64 65 64 20 61 66 74 65 72 20 74 68 65 added after the
1b79d 0d 0a 20 20 2a 2a 20 72 65 61 64 20 74 72 61 6e .. ** read tran
1b79e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e saction was open
1b79f 65 64 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e ed may have been
1b7a0 20 77 72 69 74 74 65 6e 20 69 6e 63 6f 72 72 65 written incorre
1b7a1 63 74 6c 79 20 2d 0d 0a 20 20 2a 2a 20 69 2e 65 ctly -.. ** i.e
1b7a2 2e 20 74 68 65 73 65 20 73 6c 6f 74 73 20 6d 61 . these slots ma
1b7a3 79 20 63 6f 6e 74 61 69 6e 20 67 61 72 62 61 67 y contain garbag
1b7a4 65 20 64 61 74 61 2e 20 48 6f 77 65 76 65 72 2c e data. However,
1b7a5 20 77 65 20 61 73 73 75 6d 65 0d 0a 20 20 2a 2a we assume.. **
1b7a6 20 74 68 61 74 20 61 6e 79 20 73 6c 6f 74 73 20 that any slots
1b7a7 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 written before t
1b7a8 68 65 20 63 75 72 72 65 6e 74 20 72 65 61 64 20 he current read
1b7a9 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0d transaction was.
1b7aa 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 72 65 6d . ** opened rem
1b7ab 61 69 6e 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0d ain unmodified..
1b7ac 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 46 6f 72 20 . **.. ** For
1b7ad 74 68 65 20 72 65 61 73 6f 6e 73 20 61 62 6f 76 the reasons abov
1b7ae 65 2c 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 e, the if(...) c
1b7af 6f 6e 64 69 74 69 6f 6e 20 66 65 61 74 75 72 65 ondition feature
1b7b0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0d 0a d in the inner..
1b7b1 20 20 2a 2a 20 6c 6f 6f 70 20 6f 66 20 74 68 65 ** loop of the
1b7b2 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b following block
1b7b3 20 69 73 20 6d 6f 72 65 20 73 74 72 69 6e 67 65 is more stringe
1b7b4 6e 74 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 nt that would be
1b7b5 20 72 65 71 75 69 72 65 64 20 0d 0a 20 20 2a 2a required .. **
1b7b6 20 69 66 20 77 65 20 68 61 64 20 65 78 63 6c 75 if we had exclu
1b7b7 73 69 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 sive access to t
1b7b8 68 65 20 68 61 73 68 2d 74 61 62 6c 65 3a 0d 0a he hash-table:..
1b7b9 20 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 28 61 50 **.. ** (aP
1b7ba 67 6e 6f 5b 69 46 72 61 6d 65 5d 3d 3d 70 67 6e gno[iFrame]==pgn
1b7bb 6f 29 3a 20 0d 0a 20 20 2a 2a 20 20 20 20 20 54 o): .. ** T
1b7bc 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 66 69 his condition fi
1b7bd 6c 74 65 72 73 20 6f 75 74 20 6e 6f 72 6d 61 6c lters out normal
1b7be 20 68 61 73 68 2d 74 61 62 6c 65 20 63 6f 6c 6c hash-table coll
1b7bf 69 73 69 6f 6e 73 2e 0d 0a 20 20 2a 2a 0d 0a 20 isions... **..
1b7c0 20 2a 2a 20 20 20 28 69 46 72 61 6d 65 3c 3d 69 ** (iFrame<=i
1b7c1 4c 61 73 74 29 3a 20 0d 0a 20 20 2a 2a 20 20 20 Last): .. **
1b7c2 20 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e This condition
1b7c3 20 66 69 6c 74 65 72 73 20 6f 75 74 20 65 6e 74 filters out ent
1b7c4 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 ries that were a
1b7c5 64 64 65 64 20 74 6f 20 74 68 65 20 68 61 73 68 dded to the hash
1b7c6 0d 0a 20 20 2a 2a 20 20 20 20 20 74 61 62 6c 65 .. ** table
1b7c7 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 after the curre
1b7c8 6e 74 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 nt read-transact
1b7c9 69 6f 6e 20 68 61 64 20 73 74 61 72 74 65 64 2e ion had started.
1b7ca 0d 0a 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 48 .. */.. for(iH
1b7cb 61 73 68 3d 77 61 6c 46 72 61 6d 65 50 61 67 65 ash=walFramePage
1b7cc 28 69 4c 61 73 74 29 3b 20 69 48 61 73 68 3e 3d (iLast); iHash>=
1b7cd 30 20 26 26 20 69 52 65 61 64 3d 3d 30 3b 20 69 0 && iRead==0; i
1b7ce 48 61 73 68 2d 2d 29 7b 0d 0a 20 20 20 20 76 6f Hash--){.. vo
1b7cf 6c 61 74 69 6c 65 20 68 74 5f 73 6c 6f 74 20 2a latile ht_slot *
1b7d0 61 48 61 73 68 3b 20 20 20 20 20 20 2f 2a 20 50 aHash; /* P
1b7d1 6f 69 6e 74 65 72 20 74 6f 20 68 61 73 68 20 74 ointer to hash t
1b7d2 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 76 6f 6c able */.. vol
1b7d3 61 74 69 6c 65 20 75 33 32 20 2a 61 50 67 6e 6f atile u32 *aPgno
1b7d4 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f ; /* Po
1b7d5 69 6e 74 65 72 20 74 6f 20 61 72 72 61 79 20 6f inter to array o
1b7d6 66 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 2a f page numbers *
1b7d7 2f 0d 0a 20 20 20 20 75 33 32 20 69 5a 65 72 6f /.. u32 iZero
1b7d8 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1b7d9 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 6e 75 /* Frame nu
1b7da 6d 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 mber correspondi
1b7db 6e 67 20 74 6f 20 61 50 67 6e 6f 5b 30 5d 20 2a ng to aPgno[0] *
1b7dc 2f 0d 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 3b /.. int iKey;
1b7dd 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b7de 20 20 20 20 20 2f 2a 20 48 61 73 68 20 73 6c 6f /* Hash slo
1b7df 74 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 20 20 t index */..
1b7e0 69 6e 74 20 6e 43 6f 6c 6c 69 64 65 3b 20 20 20 int nCollide;
1b7e1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b7e2 20 4e 75 6d 62 65 72 20 6f 66 20 68 61 73 68 20 Number of hash
1b7e3 63 6f 6c 6c 69 73 69 6f 6e 73 20 72 65 6d 61 69 collisions remai
1b7e4 6e 69 6e 67 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 ning */.. int
1b7e5 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
1b7e6 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 /* Er
1b7e7 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 ror code */....
1b7e8 20 20 20 72 63 20 3d 20 77 61 6c 48 61 73 68 47 rc = walHashG
1b7e9 65 74 28 70 57 61 6c 2c 20 69 48 61 73 68 2c 20 et(pWal, iHash,
1b7ea 26 61 48 61 73 68 2c 20 26 61 50 67 6e 6f 2c 20 &aHash, &aPgno,
1b7eb 26 69 5a 65 72 6f 29 3b 0d 0a 20 20 20 20 69 66 &iZero);.. if
1b7ec 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1b7ed 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
1b7ee 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 rc;.. }..
1b7ef 20 6e 43 6f 6c 6c 69 64 65 20 3d 20 48 41 53 48 nCollide = HASH
1b7f0 54 41 42 4c 45 5f 4e 53 4c 4f 54 3b 0d 0a 20 20 TABLE_NSLOT;..
1b7f1 20 20 66 6f 72 28 69 4b 65 79 3d 77 61 6c 48 61 for(iKey=walHa
1b7f2 73 68 28 70 67 6e 6f 29 3b 20 61 48 61 73 68 5b sh(pgno); aHash[
1b7f3 69 4b 65 79 5d 3b 20 69 4b 65 79 3d 77 61 6c 4e iKey]; iKey=walN
1b7f4 65 78 74 48 61 73 68 28 69 4b 65 79 29 29 7b 0d extHash(iKey)){.
1b7f5 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d . u32 iFram
1b7f6 65 20 3d 20 61 48 61 73 68 5b 69 4b 65 79 5d 20 e = aHash[iKey]
1b7f7 2b 20 69 5a 65 72 6f 3b 0d 0a 20 20 20 20 20 20 + iZero;..
1b7f8 69 66 28 20 69 46 72 61 6d 65 3c 3d 69 4c 61 73 if( iFrame<=iLas
1b7f9 74 20 26 26 20 61 50 67 6e 6f 5b 61 48 61 73 68 t && aPgno[aHash
1b7fa 5b 69 4b 65 79 5d 5d 3d 3d 70 67 6e 6f 20 29 7b [iKey]]==pgno ){
1b7fb 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 .. /* ass
1b7fc 65 72 74 28 20 69 46 72 61 6d 65 3e 69 52 65 61 ert( iFrame>iRea
1b7fd 64 20 29 3b 20 2d 2d 20 6e 6f 74 20 74 72 75 65 d ); -- not true
1b7fe 20 69 66 20 74 68 65 72 65 20 69 73 20 63 6f 72 if there is cor
1b7ff 72 75 70 74 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 ruption */..
1b800 20 20 20 20 69 52 65 61 64 20 3d 20 69 46 72 61 iRead = iFra
1b801 6d 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 me;.. }..
1b802 20 20 20 20 69 66 28 20 28 6e 43 6f 6c 6c 69 64 if( (nCollid
1b803 65 2d 2d 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 e--)==0 ){..
1b804 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1b805 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d E_CORRUPT_BKPT;.
1b806 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
1b807 0a 20 20 7d 0d 0a 0d 0a 23 69 66 64 65 66 20 53 . }....#ifdef S
1b808 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 QLITE_ENABLE_EXP
1b809 45 4e 53 49 56 45 5f 41 53 53 45 52 54 0d 0a 20 ENSIVE_ASSERT..
1b80a 20 2f 2a 20 49 66 20 65 78 70 65 6e 73 69 76 65 /* If expensive
1b80b 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d assert() statem
1b80c 65 6e 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 ents are availab
1b80d 6c 65 2c 20 64 6f 20 61 20 6c 69 6e 65 61 72 20 le, do a linear
1b80e 73 65 61 72 63 68 0d 0a 20 20 2a 2a 20 6f 66 20 search.. ** of
1b80f 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 the wal-index fi
1b810 6c 65 20 63 6f 6e 74 65 6e 74 2e 20 4d 61 6b 65 le content. Make
1b811 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 sure the result
1b812 73 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 s agree with the
1b813 0d 0a 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 62 .. ** result ob
1b814 74 61 69 6e 65 64 20 75 73 69 6e 67 20 74 68 65 tained using the
1b815 20 68 61 73 68 20 69 6e 64 65 78 65 73 20 61 62 hash indexes ab
1b816 6f 76 65 2e 20 20 2a 2f 0d 0a 20 20 7b 0d 0a 20 ove. */.. {..
1b817 20 20 20 75 33 32 20 69 52 65 61 64 32 20 3d 20 u32 iRead2 =
1b818 30 3b 0d 0a 20 20 20 20 75 33 32 20 69 54 65 73 0;.. u32 iTes
1b819 74 3b 0d 0a 20 20 20 20 66 6f 72 28 69 54 65 73 t;.. for(iTes
1b81a 74 3d 69 4c 61 73 74 3b 20 69 54 65 73 74 3e 30 t=iLast; iTest>0
1b81b 3b 20 69 54 65 73 74 2d 2d 29 7b 0d 0a 20 20 20 ; iTest--){..
1b81c 20 20 20 69 66 28 20 77 61 6c 46 72 61 6d 65 50 if( walFrameP
1b81d 67 6e 6f 28 70 57 61 6c 2c 20 69 54 65 73 74 29 gno(pWal, iTest)
1b81e 3d 3d 70 67 6e 6f 20 29 7b 0d 0a 20 20 20 20 20 ==pgno ){..
1b81f 20 20 20 69 52 65 61 64 32 20 3d 20 69 54 65 73 iRead2 = iTes
1b820 74 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 t;.. brea
1b821 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 k;.. }..
1b822 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 }.. assert(
1b823 69 52 65 61 64 3d 3d 69 52 65 61 64 32 20 29 3b iRead==iRead2 );
1b824 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d .. }..#endif...
1b825 0a 20 20 2f 2a 20 49 66 20 69 52 65 61 64 20 69 . /* If iRead i
1b826 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e s non-zero, then
1b827 20 69 74 20 69 73 20 74 68 65 20 6c 6f 67 20 66 it is the log f
1b828 72 61 6d 65 20 6e 75 6d 62 65 72 20 74 68 61 74 rame number that
1b829 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 contains the..
1b82a 20 2a 2a 20 72 65 71 75 69 72 65 64 20 70 61 67 ** required pag
1b82b 65 2e 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 e. Read and retu
1b82c 72 6e 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 rn data from the
1b82d 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 2a 2f log file... */
1b82e 0d 0a 20 20 69 66 28 20 69 52 65 61 64 20 29 7b .. if( iRead ){
1b82f 0d 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0d 0a 20 .. int sz;..
1b830 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 0d i64 iOffset;.
1b831 0a 20 20 20 20 73 7a 20 3d 20 70 57 61 6c 2d 3e . sz = pWal->
1b832 68 64 72 2e 73 7a 50 61 67 65 3b 0d 0a 20 20 20 hdr.szPage;..
1b833 20 73 7a 20 3d 20 28 73 7a 26 30 78 66 65 30 30 sz = (sz&0xfe00
1b834 29 20 2b 20 28 28 73 7a 26 30 78 30 30 30 31 29 ) + ((sz&0x0001)
1b835 3c 3c 31 36 29 3b 0d 0a 20 20 20 20 74 65 73 74 <<16);.. test
1b836 63 61 73 65 28 20 73 7a 3c 3d 33 32 37 36 38 20 case( sz<=32768
1b837 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 );.. testcase
1b838 28 20 73 7a 3e 3d 36 35 35 33 36 20 29 3b 0d 0a ( sz>=65536 );..
1b839 20 20 20 20 69 4f 66 66 73 65 74 20 3d 20 77 61 iOffset = wa
1b83a 6c 46 72 61 6d 65 4f 66 66 73 65 74 28 69 52 65 lFrameOffset(iRe
1b83b 61 64 2c 20 73 7a 29 20 2b 20 57 41 4c 5f 46 52 ad, sz) + WAL_FR
1b83c 41 4d 45 5f 48 44 52 53 49 5a 45 3b 0d 0a 20 20 AME_HDRSIZE;..
1b83d 20 20 2a 70 49 6e 57 61 6c 20 3d 20 31 3b 0d 0a *pInWal = 1;..
1b83e 20 20 20 20 2f 2a 20 74 65 73 74 63 61 73 65 28 /* testcase(
1b83f 20 49 53 5f 42 49 47 5f 49 4e 54 28 69 4f 66 66 IS_BIG_INT(iOff
1b840 73 65 74 29 20 29 3b 20 2f 2f 20 72 65 71 75 69 set) ); // requi
1b841 72 65 73 20 61 20 34 47 69 42 20 57 41 4c 20 2a res a 4GiB WAL *
1b842 2f 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 /.. return sq
1b843 6c 69 74 65 33 4f 73 52 65 61 64 28 70 57 61 6c lite3OsRead(pWal
1b844 2d 3e 70 57 61 6c 46 64 2c 20 70 4f 75 74 2c 20 ->pWalFd, pOut,
1b845 6e 4f 75 74 2c 20 69 4f 66 66 73 65 74 29 3b 0d nOut, iOffset);.
1b846 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 49 6e 57 61 . }.... *pInWa
1b847 6c 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e l = 0;.. return
1b848 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a SQLITE_OK;..}..
1b849 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 52 65 74 75 ..../* ..** Retu
1b84a 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 rn the size of t
1b84b 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 he database in p
1b84c 61 67 65 73 20 28 6f 72 20 7a 65 72 6f 2c 20 69 ages (or zero, i
1b84d 66 20 75 6e 6b 6e 6f 77 6e 29 2e 0d 0a 2a 2f 0d f unknown)...*/.
1b84e 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
1b84f 50 67 6e 6f 20 73 71 6c 69 74 65 33 57 61 6c 44 Pgno sqlite3WalD
1b850 62 73 69 7a 65 28 57 61 6c 20 2a 70 57 61 6c 29 bsize(Wal *pWal)
1b851 7b 0d 0a 20 20 69 66 28 20 70 57 61 6c 20 26 26 {.. if( pWal &&
1b852 20 41 4c 57 41 59 53 28 70 57 61 6c 2d 3e 72 65 ALWAYS(pWal->re
1b853 61 64 4c 6f 63 6b 3e 3d 30 29 20 29 7b 0d 0a 20 adLock>=0) ){..
1b854 20 20 20 72 65 74 75 72 6e 20 70 57 61 6c 2d 3e return pWal->
1b855 68 64 72 2e 6e 50 61 67 65 3b 0d 0a 20 20 7d 0d hdr.nPage;.. }.
1b856 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d . return 0;..}.
1b857 0a 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 54 68 69 ...../* ..** Thi
1b858 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 61 72 74 s function start
1b859 73 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 s a write transa
1b85a 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c ction on the WAL
1b85b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 72 65 61 64 ...**..** A read
1b85c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 transaction mus
1b85d 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 t have already b
1b85e 65 65 6e 20 73 74 61 72 74 65 64 20 62 79 20 61 een started by a
1b85f 20 70 72 69 6f 72 20 63 61 6c 6c 0d 0a 2a 2a 20 prior call..**
1b860 74 6f 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 to sqlite3WalBeg
1b861 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f inReadTransactio
1b862 6e 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 n()...**..** If
1b863 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 6f another thread o
1b864 72 20 70 72 6f 63 65 73 73 20 68 61 73 20 77 72 r process has wr
1b865 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 itten into the d
1b866 61 74 61 62 61 73 65 20 73 69 6e 63 65 0d 0a 2a atabase since..*
1b867 2a 20 74 68 65 20 72 65 61 64 20 74 72 61 6e 73 * the read trans
1b868 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 action was start
1b869 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e ed, then it is n
1b86a 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 ot possible for
1b86b 74 68 69 73 0d 0a 2a 2a 20 74 68 72 65 61 64 20 this..** thread
1b86c 74 6f 20 77 72 69 74 65 20 61 73 20 64 6f 69 6e to write as doin
1b86d 67 20 73 6f 20 77 6f 75 6c 64 20 63 61 75 73 65 g so would cause
1b86e 20 61 20 66 6f 72 6b 2e 20 20 53 6f 20 74 68 69 a fork. So thi
1b86f 73 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 72 65 s routine..** re
1b870 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 turns SQLITE_BUS
1b871 59 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 Y in that case a
1b872 6e 64 20 6e 6f 20 77 72 69 74 65 20 74 72 61 6e nd no write tran
1b873 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 saction is start
1b874 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 ed...**..** Ther
1b875 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 61 20 e can only be a
1b876 73 69 6e 67 6c 65 20 77 72 69 74 65 72 20 61 63 single writer ac
1b877 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 0d tive at a time..
1b878 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1b879 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 ATE int sqlite3W
1b87a 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e alBeginWriteTran
1b87b 73 61 63 74 69 6f 6e 28 57 61 6c 20 2a 70 57 61 saction(Wal *pWa
1b87c 6c 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a l){.. int rc;..
1b87d 0d 0a 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 73 74 .. /* Cannot st
1b87e 61 72 74 20 61 20 77 72 69 74 65 20 74 72 61 6e art a write tran
1b87f 73 61 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 saction without
1b880 66 69 72 73 74 20 68 6f 6c 64 69 6e 67 20 61 20 first holding a
1b881 72 65 61 64 0d 0a 20 20 2a 2a 20 74 72 61 6e 73 read.. ** trans
1b882 61 63 74 69 6f 6e 2e 20 2a 2f 0d 0a 20 20 61 73 action. */.. as
1b883 73 65 72 74 28 20 70 57 61 6c 2d 3e 72 65 61 64 sert( pWal->read
1b884 4c 6f 63 6b 3e 3d 30 20 29 3b 0d 0a 0d 0a 20 20 Lock>=0 );....
1b885 69 66 28 20 70 57 61 6c 2d 3e 72 65 61 64 4f 6e if( pWal->readOn
1b886 6c 79 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 ly ){.. retur
1b887 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c n SQLITE_READONL
1b888 59 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 Y;.. }.... /*
1b889 4f 6e 6c 79 20 6f 6e 65 20 77 72 69 74 65 72 20 Only one writer
1b88a 61 6c 6c 6f 77 65 64 20 61 74 20 61 20 74 69 6d allowed at a tim
1b88b 65 2e 20 20 47 65 74 20 74 68 65 20 77 72 69 74 e. Get the writ
1b88c 65 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 0d e lock. Return.
1b88d 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 . ** SQLITE_BUS
1b88e 59 20 69 66 20 75 6e 61 62 6c 65 2e 0d 0a 20 20 Y if unable...
1b88f 2a 2f 0d 0a 20 20 72 63 20 3d 20 77 61 6c 4c 6f */.. rc = walLo
1b890 63 6b 45 78 63 6c 75 73 69 76 65 28 70 57 61 6c ckExclusive(pWal
1b891 2c 20 57 41 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b , WAL_WRITE_LOCK
1b892 2c 20 31 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 , 1);.. if( rc
1b893 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 ){.. return r
1b894 63 3b 0d 0a 20 20 7d 0d 0a 20 20 70 57 61 6c 2d c;.. }.. pWal-
1b895 3e 77 72 69 74 65 4c 6f 63 6b 20 3d 20 31 3b 0d >writeLock = 1;.
1b896 0a 0d 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 ... /* If anoth
1b897 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 er connection ha
1b898 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 s written to the
1b899 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 database file s
1b89a 69 6e 63 65 20 74 68 65 0d 0a 20 20 2a 2a 20 74 ince the.. ** t
1b89b 69 6d 65 20 74 68 65 20 72 65 61 64 20 74 72 61 ime the read tra
1b89c 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 nsaction on this
1b89d 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 connection was
1b89e 73 74 61 72 74 65 64 2c 20 74 68 65 6e 0d 0a 20 started, then..
1b89f 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 69 73 ** the write is
1b8a0 20 64 69 73 61 6c 6c 6f 77 65 64 2e 0d 0a 20 20 disallowed...
1b8a1 2a 2f 0d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 */.. if( memcmp
1b8a2 28 26 70 57 61 6c 2d 3e 68 64 72 2c 20 28 76 6f (&pWal->hdr, (vo
1b8a3 69 64 20 2a 29 77 61 6c 49 6e 64 65 78 48 64 72 id *)walIndexHdr
1b8a4 28 70 57 61 6c 29 2c 20 73 69 7a 65 6f 66 28 57 (pWal), sizeof(W
1b8a5 61 6c 49 6e 64 65 78 48 64 72 29 29 21 3d 30 20 alIndexHdr))!=0
1b8a6 29 7b 0d 0a 20 20 20 20 77 61 6c 55 6e 6c 6f 63 ){.. walUnloc
1b8a7 6b 45 78 63 6c 75 73 69 76 65 28 70 57 61 6c 2c kExclusive(pWal,
1b8a8 20 57 41 4c 5f 57 52 49 54 45 5f 4c 4f 43 4b 2c WAL_WRITE_LOCK,
1b8a9 20 31 29 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e 1);.. pWal->
1b8aa 77 72 69 74 65 4c 6f 63 6b 20 3d 20 30 3b 0d 0a writeLock = 0;..
1b8ab 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
1b8ac 42 55 53 59 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 BUSY;.. }....
1b8ad 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
1b8ae 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 61 20 77 72 ./*..** End a wr
1b8af 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e ite transaction.
1b8b0 20 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 61 73 The commit has
1b8b1 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 6f already been do
1b8b2 6e 65 2e 20 20 54 68 69 73 0d 0a 2a 2a 20 72 6f ne. This..** ro
1b8b3 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 72 65 6c utine merely rel
1b8b4 65 61 73 65 73 20 74 68 65 20 6c 6f 63 6b 2e 0d eases the lock..
1b8b5 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1b8b6 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 ATE int sqlite3W
1b8b7 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 alEndWriteTransa
1b8b8 63 74 69 6f 6e 28 57 61 6c 20 2a 70 57 61 6c 29 ction(Wal *pWal)
1b8b9 7b 0d 0a 20 20 69 66 28 20 70 57 61 6c 2d 3e 77 {.. if( pWal->w
1b8ba 72 69 74 65 4c 6f 63 6b 20 29 7b 0d 0a 20 20 20 riteLock ){..
1b8bb 20 77 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 walUnlockExclus
1b8bc 69 76 65 28 70 57 61 6c 2c 20 57 41 4c 5f 57 52 ive(pWal, WAL_WR
1b8bd 49 54 45 5f 4c 4f 43 4b 2c 20 31 29 3b 0d 0a 20 ITE_LOCK, 1);..
1b8be 20 20 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f pWal->writeLo
1b8bf 63 6b 20 3d 20 30 3b 0d 0a 20 20 20 20 70 57 61 ck = 0;.. pWa
1b8c0 6c 2d 3e 74 72 75 6e 63 61 74 65 4f 6e 43 6f 6d l->truncateOnCom
1b8c1 6d 69 74 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 mit = 0;.. }..
1b8c2 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1b8c3 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 K;..}..../*..**
1b8c4 49 66 20 61 6e 79 20 64 61 74 61 20 68 61 73 20 If any data has
1b8c5 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 been written (bu
1b8c6 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 t not committed)
1b8c7 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 to the log file
1b8c8 2c 20 74 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74 , this..** funct
1b8c9 69 6f 6e 20 6d 6f 76 65 73 20 74 68 65 20 77 72 ion moves the wr
1b8ca 69 74 65 2d 70 6f 69 6e 74 65 72 20 62 61 63 6b ite-pointer back
1b8cb 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 to the start of
1b8cc 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
1b8cd 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 64 64 69 74 69 ...**..** Additi
1b8ce 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 63 61 6c 6c onally, the call
1b8cf 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 69 73 back function is
1b8d0 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63 invoked for eac
1b8d1 68 20 66 72 61 6d 65 20 77 72 69 74 74 65 6e 0d h frame written.
1b8d2 0a 2a 2a 20 74 6f 20 74 68 65 20 57 41 4c 20 73 .** to the WAL s
1b8d3 69 6e 63 65 20 74 68 65 20 73 74 61 72 74 20 6f ince the start o
1b8d4 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f f the transactio
1b8d5 6e 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 n. If the callba
1b8d6 63 6b 20 72 65 74 75 72 6e 73 0d 0a 2a 2a 20 6f ck returns..** o
1b8d7 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 ther than SQLITE
1b8d8 5f 4f 4b 2c 20 69 74 20 69 73 20 6e 6f 74 20 69 _OK, it is not i
1b8d9 6e 76 6f 6b 65 64 20 61 67 61 69 6e 20 61 6e 64 nvoked again and
1b8da 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 the error code
1b8db 69 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 is..** returned
1b8dc 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a to the caller...
1b8dd 2a 2a 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 **..** Otherwise
1b8de 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 62 61 63 , if the callbac
1b8df 6b 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 k function does
1b8e0 6e 6f 74 20 72 65 74 75 72 6e 20 61 6e 20 65 72 not return an er
1b8e1 72 6f 72 2c 20 74 68 69 73 0d 0a 2a 2a 20 66 75 ror, this..** fu
1b8e2 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 nction returns S
1b8e3 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2f 0d 0a 53 QLITE_OK...*/..S
1b8e4 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1b8e5 74 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f t sqlite3WalUndo
1b8e6 28 57 61 6c 20 2a 70 57 61 6c 2c 20 69 6e 74 20 (Wal *pWal, int
1b8e7 28 2a 78 55 6e 64 6f 29 28 76 6f 69 64 20 2a 2c (*xUndo)(void *,
1b8e8 20 50 67 6e 6f 29 2c 20 76 6f 69 64 20 2a 70 55 Pgno), void *pU
1b8e9 6e 64 6f 43 74 78 29 7b 0d 0a 20 20 69 6e 74 20 ndoCtx){.. int
1b8ea 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d rc = SQLITE_OK;.
1b8eb 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 . if( ALWAYS(pW
1b8ec 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 29 20 29 al->writeLock) )
1b8ed 7b 0d 0a 20 20 20 20 50 67 6e 6f 20 69 4d 61 78 {.. Pgno iMax
1b8ee 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 = pWal->hdr.mxF
1b8ef 72 61 6d 65 3b 0d 0a 20 20 20 20 50 67 6e 6f 20 rame;.. Pgno
1b8f0 69 46 72 61 6d 65 3b 0d 0a 20 20 0d 0a 20 20 20 iFrame;.. ..
1b8f1 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 /* Restore the
1b8f2 63 6c 69 65 6e 74 73 20 63 61 63 68 65 20 6f 66 clients cache of
1b8f3 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 the wal-index h
1b8f4 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 eader to the sta
1b8f5 74 65 20 69 74 0d 0a 20 20 20 20 2a 2a 20 77 61 te it.. ** wa
1b8f6 73 20 69 6e 20 62 65 66 6f 72 65 20 74 68 65 20 s in before the
1b8f7 63 6c 69 65 6e 74 20 62 65 67 61 6e 20 77 72 69 client began wri
1b8f8 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 ting to the data
1b8f9 62 61 73 65 2e 20 0d 0a 20 20 20 20 2a 2f 0d 0a base. .. */..
1b8fa 20 20 20 20 6d 65 6d 63 70 79 28 26 70 57 61 6c memcpy(&pWal
1b8fb 2d 3e 68 64 72 2c 20 28 76 6f 69 64 20 2a 29 77 ->hdr, (void *)w
1b8fc 61 6c 49 6e 64 65 78 48 64 72 28 70 57 61 6c 29 alIndexHdr(pWal)
1b8fd 2c 20 73 69 7a 65 6f 66 28 57 61 6c 49 6e 64 65 , sizeof(WalInde
1b8fe 78 48 64 72 29 29 3b 0d 0a 0d 0a 20 20 20 20 66 xHdr));.... f
1b8ff 6f 72 28 69 46 72 61 6d 65 3d 70 57 61 6c 2d 3e or(iFrame=pWal->
1b900 68 64 72 2e 6d 78 46 72 61 6d 65 2b 31 3b 20 0d hdr.mxFrame+1; .
1b901 0a 20 20 20 20 20 20 20 20 41 4c 57 41 59 53 28 . ALWAYS(
1b902 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 rc==SQLITE_OK) &
1b903 26 20 69 46 72 61 6d 65 3c 3d 69 4d 61 78 3b 20 & iFrame<=iMax;
1b904 0d 0a 20 20 20 20 20 20 20 20 69 46 72 61 6d 65 .. iFrame
1b905 2b 2b 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 20 20 ++.. ){..
1b906 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 63 /* This call c
1b907 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 55 6e 6c 65 annot fail. Unle
1b908 73 73 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 ss the page for
1b909 77 68 69 63 68 20 74 68 65 20 70 61 67 65 20 6e which the page n
1b90a 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 2a 2a 20 umber.. **
1b90b 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 is passed as the
1b90c 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 second argument
1b90d 20 69 73 20 28 61 29 20 69 6e 20 74 68 65 20 63 is (a) in the c
1b90e 61 63 68 65 20 61 6e 64 20 0d 0a 20 20 20 20 20 ache and ..
1b90f 20 2a 2a 20 28 62 29 20 68 61 73 20 61 6e 20 6f ** (b) has an o
1b910 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 utstanding refer
1b911 65 6e 63 65 2c 20 74 68 65 6e 20 78 55 6e 64 6f ence, then xUndo
1b912 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d is either a no-
1b913 6f 70 0d 0a 20 20 20 20 20 20 2a 2a 20 28 69 66 op.. ** (if
1b914 20 28 61 29 20 69 73 20 66 61 6c 73 65 29 20 6f (a) is false) o
1b915 72 20 73 69 6d 70 6c 79 20 65 78 70 65 6c 73 20 r simply expels
1b916 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 the page from th
1b917 65 20 63 61 63 68 65 20 28 69 66 20 28 62 29 0d e cache (if (b).
1b918 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 66 61 6c . ** is fal
1b919 73 65 29 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a se)... **..
1b91a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 ** If the
1b91b 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 64 upper layer is d
1b91c 6f 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c oing a rollback,
1b91d 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 it is guarantee
1b91e 64 20 74 68 61 74 20 74 68 65 72 65 0d 0a 20 20 d that there..
1b91f 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 6f 75 ** are no ou
1b920 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 tstanding refere
1b921 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 nces to any page
1b922 20 6f 74 68 65 72 20 74 68 61 6e 20 70 61 67 65 other than page
1b923 20 31 2e 20 41 6e 64 0d 0a 20 20 20 20 20 20 2a 1. And.. *
1b924 2a 20 70 61 67 65 20 31 20 69 73 20 6e 65 76 65 * page 1 is neve
1b925 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 r written to the
1b926 20 6c 6f 67 20 75 6e 74 69 6c 20 74 68 65 20 74 log until the t
1b927 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0d 0a 20 ransaction is..
1b928 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 ** committe
1b929 64 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 d. As a result,
1b92a 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 64 the call to xUnd
1b92b 6f 20 6d 61 79 20 6e 6f 74 20 66 61 69 6c 2e 0d o may not fail..
1b92c 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 . */..
1b92d 20 61 73 73 65 72 74 28 20 77 61 6c 46 72 61 6d assert( walFram
1b92e 65 50 67 6e 6f 28 70 57 61 6c 2c 20 69 46 72 61 ePgno(pWal, iFra
1b92f 6d 65 29 21 3d 31 20 29 3b 0d 0a 20 20 20 20 20 me)!=1 );..
1b930 20 72 63 20 3d 20 78 55 6e 64 6f 28 70 55 6e 64 rc = xUndo(pUnd
1b931 6f 43 74 78 2c 20 77 61 6c 46 72 61 6d 65 50 67 oCtx, walFramePg
1b932 6e 6f 28 70 57 61 6c 2c 20 69 46 72 61 6d 65 29 no(pWal, iFrame)
1b933 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 77 );.. }.. w
1b934 61 6c 43 6c 65 61 6e 75 70 48 61 73 68 28 70 57 alCleanupHash(pW
1b935 61 6c 29 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 al);.. }.. ass
1b936 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f ert( rc==SQLITE_
1b937 4f 4b 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 OK );.. return
1b938 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d 0a 2a rc;..}..../* ..*
1b939 2a 20 41 72 67 75 6d 65 6e 74 20 61 57 61 6c 44 * Argument aWalD
1b93a 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 ata must point t
1b93b 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 57 41 o an array of WA
1b93c 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41 54 L_SAVEPOINT_NDAT
1b93d 41 20 75 33 32 20 0d 0a 2a 2a 20 76 61 6c 75 65 A u32 ..** value
1b93e 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e s. This function
1b93f 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 61 populates the a
1b940 72 72 61 79 20 77 69 74 68 20 76 61 6c 75 65 73 rray with values
1b941 20 72 65 71 75 69 72 65 64 20 74 6f 20 0d 0a 2a required to ..*
1b942 2a 20 22 72 6f 6c 6c 62 61 63 6b 22 20 74 68 65 * "rollback" the
1b943 20 77 72 69 74 65 20 70 6f 73 69 74 69 6f 6e 20 write position
1b944 6f 66 20 74 68 65 20 57 41 4c 20 68 61 6e 64 6c of the WAL handl
1b945 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 75 e back to the cu
1b946 72 72 65 6e 74 20 0d 0a 2a 2a 20 70 6f 69 6e 74 rrent ..** point
1b947 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 in the event of
1b948 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c a savepoint rol
1b949 6c 62 61 63 6b 20 28 76 69 61 20 57 61 6c 53 61 lback (via WalSa
1b94a 76 65 70 6f 69 6e 74 55 6e 64 6f 28 29 29 2e 0d vepointUndo())..
1b94b 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1b94c 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 ATE void sqlite3
1b94d 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 57 61 6c WalSavepoint(Wal
1b94e 20 2a 70 57 61 6c 2c 20 75 33 32 20 2a 61 57 61 *pWal, u32 *aWa
1b94f 6c 44 61 74 61 29 7b 0d 0a 20 20 61 73 73 65 72 lData){.. asser
1b950 74 28 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f t( pWal->writeLo
1b951 63 6b 20 29 3b 0d 0a 20 20 61 57 61 6c 44 61 74 ck );.. aWalDat
1b952 61 5b 30 5d 20 3d 20 70 57 61 6c 2d 3e 68 64 72 a[0] = pWal->hdr
1b953 2e 6d 78 46 72 61 6d 65 3b 0d 0a 20 20 61 57 61 .mxFrame;.. aWa
1b954 6c 44 61 74 61 5b 31 5d 20 3d 20 70 57 61 6c 2d lData[1] = pWal-
1b955 3e 68 64 72 2e 61 46 72 61 6d 65 43 6b 73 75 6d >hdr.aFrameCksum
1b956 5b 30 5d 3b 0d 0a 20 20 61 57 61 6c 44 61 74 61 [0];.. aWalData
1b957 5b 32 5d 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e [2] = pWal->hdr.
1b958 61 46 72 61 6d 65 43 6b 73 75 6d 5b 31 5d 3b 0d aFrameCksum[1];.
1b959 0a 20 20 61 57 61 6c 44 61 74 61 5b 33 5d 20 3d . aWalData[3] =
1b95a 20 70 57 61 6c 2d 3e 6e 43 6b 70 74 3b 0d 0a 7d pWal->nCkpt;..}
1b95b 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 4d 6f 76 65 ..../* ..** Move
1b95c 20 74 68 65 20 77 72 69 74 65 20 70 6f 73 69 74 the write posit
1b95d 69 6f 6e 20 6f 66 20 74 68 65 20 57 41 4c 20 62 ion of the WAL b
1b95e 61 63 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 ack to the point
1b95f 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0d 0a identified by..
1b960 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e ** the values in
1b961 20 74 68 65 20 61 57 61 6c 44 61 74 61 5b 5d 20 the aWalData[]
1b962 61 72 72 61 79 2e 20 61 57 61 6c 44 61 74 61 20 array. aWalData
1b963 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e must point to an
1b964 20 61 72 72 61 79 0d 0a 2a 2a 20 6f 66 20 57 41 array..** of WA
1b965 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41 54 L_SAVEPOINT_NDAT
1b966 41 20 75 33 32 20 76 61 6c 75 65 73 20 74 68 61 A u32 values tha
1b967 74 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 t has been previ
1b968 6f 75 73 6c 79 20 70 6f 70 75 6c 61 74 65 64 0d ously populated.
1b969 0a 2a 2a 20 62 79 20 61 20 63 61 6c 6c 20 74 6f .** by a call to
1b96a 20 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 29 2e WalSavepoint().
1b96b 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1b96c 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1b96d 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f WalSavepointUndo
1b96e 28 57 61 6c 20 2a 70 57 61 6c 2c 20 75 33 32 20 (Wal *pWal, u32
1b96f 2a 61 57 61 6c 44 61 74 61 29 7b 0d 0a 20 20 69 *aWalData){.. i
1b970 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
1b971 4b 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 K;.... assert(
1b972 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 20 pWal->writeLock
1b973 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 61 57 );.. assert( aW
1b974 61 6c 44 61 74 61 5b 33 5d 21 3d 70 57 61 6c 2d alData[3]!=pWal-
1b975 3e 6e 43 6b 70 74 20 7c 7c 20 61 57 61 6c 44 61 >nCkpt || aWalDa
1b976 74 61 5b 30 5d 3c 3d 70 57 61 6c 2d 3e 68 64 72 ta[0]<=pWal->hdr
1b977 2e 6d 78 46 72 61 6d 65 20 29 3b 0d 0a 0d 0a 20 .mxFrame );....
1b978 20 69 66 28 20 61 57 61 6c 44 61 74 61 5b 33 5d if( aWalData[3]
1b979 21 3d 70 57 61 6c 2d 3e 6e 43 6b 70 74 20 29 7b !=pWal->nCkpt ){
1b97a 0d 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 61 .. /* This sa
1b97b 76 65 70 6f 69 6e 74 20 77 61 73 20 6f 70 65 6e vepoint was open
1b97c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 ed immediately a
1b97d 66 74 65 72 20 74 68 65 20 77 72 69 74 65 2d 74 fter the write-t
1b97e 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 ransaction..
1b97f 2a 2a 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 ** was started.
1b980 52 69 67 68 74 20 61 66 74 65 72 20 74 68 61 74 Right after that
1b981 2c 20 74 68 65 20 77 72 69 74 65 72 20 64 65 63 , the writer dec
1b982 69 64 65 64 20 74 6f 20 77 72 61 70 20 61 72 6f ided to wrap aro
1b983 75 6e 64 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 74 und.. ** to t
1b984 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 he start of the
1b985 6c 6f 67 2e 20 55 70 64 61 74 65 20 74 68 65 20 log. Update the
1b986 73 61 76 65 70 6f 69 6e 74 20 76 61 6c 75 65 73 savepoint values
1b987 20 74 6f 20 6d 61 74 63 68 2e 0d 0a 20 20 20 20 to match...
1b988 2a 2f 0d 0a 20 20 20 20 61 57 61 6c 44 61 74 61 */.. aWalData
1b989 5b 30 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 61 57 [0] = 0;.. aW
1b98a 61 6c 44 61 74 61 5b 33 5d 20 3d 20 70 57 61 6c alData[3] = pWal
1b98b 2d 3e 6e 43 6b 70 74 3b 0d 0a 20 20 7d 0d 0a 0d ->nCkpt;.. }...
1b98c 0a 20 20 69 66 28 20 61 57 61 6c 44 61 74 61 5b . if( aWalData[
1b98d 30 5d 3c 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 0]<pWal->hdr.mxF
1b98e 72 61 6d 65 20 29 7b 0d 0a 20 20 20 20 70 57 61 rame ){.. pWa
1b98f 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 3d l->hdr.mxFrame =
1b990 20 61 57 61 6c 44 61 74 61 5b 30 5d 3b 0d 0a 20 aWalData[0];..
1b991 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 61 46 72 pWal->hdr.aFr
1b992 61 6d 65 43 6b 73 75 6d 5b 30 5d 20 3d 20 61 57 ameCksum[0] = aW
1b993 61 6c 44 61 74 61 5b 31 5d 3b 0d 0a 20 20 20 20 alData[1];..
1b994 70 57 61 6c 2d 3e 68 64 72 2e 61 46 72 61 6d 65 pWal->hdr.aFrame
1b995 43 6b 73 75 6d 5b 31 5d 20 3d 20 61 57 61 6c 44 Cksum[1] = aWalD
1b996 61 74 61 5b 32 5d 3b 0d 0a 20 20 20 20 77 61 6c ata[2];.. wal
1b997 43 6c 65 61 6e 75 70 48 61 73 68 28 70 57 61 6c CleanupHash(pWal
1b998 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 );.. }.... ret
1b999 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a urn rc;..}......
1b99a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 /*..** This func
1b99b 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a tion is called j
1b99c 75 73 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 ust before writi
1b99d 6e 67 20 61 20 73 65 74 20 6f 66 20 66 72 61 6d ng a set of fram
1b99e 65 73 20 74 6f 20 74 68 65 20 6c 6f 67 0d 0a 2a es to the log..*
1b99f 2a 20 66 69 6c 65 20 28 73 65 65 20 73 71 6c 69 * file (see sqli
1b9a0 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 29 2e te3WalFrames()).
1b9a1 20 49 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 It checks to se
1b9a2 65 20 69 66 2c 20 69 6e 73 74 65 61 64 20 6f 66 e if, instead of
1b9a3 20 61 70 70 65 6e 64 69 6e 67 0d 0a 2a 2a 20 74 appending..** t
1b9a4 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f o the current lo
1b9a5 67 20 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f g file, it is po
1b9a6 73 73 69 62 6c 65 20 74 6f 20 6f 76 65 72 77 72 ssible to overwr
1b9a7 69 74 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 ite the start of
1b9a8 20 74 68 65 0d 0a 2a 2a 20 65 78 69 73 74 69 6e the..** existin
1b9a9 67 20 6c 6f 67 20 66 69 6c 65 20 77 69 74 68 20 g log file with
1b9aa 74 68 65 20 6e 65 77 20 66 72 61 6d 65 73 20 28 the new frames (
1b9ab 69 2e 65 2e 20 22 72 65 73 65 74 22 20 74 68 65 i.e. "reset" the
1b9ac 20 6c 6f 67 29 2e 20 49 66 20 73 6f 2c 0d 0a 2a log). If so,..*
1b9ad 2a 20 69 74 20 73 65 74 73 20 70 57 61 6c 2d 3e * it sets pWal->
1b9ae 68 64 72 2e 6d 78 46 72 61 6d 65 20 74 6f 20 30 hdr.mxFrame to 0
1b9af 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 57 61 . Otherwise, pWa
1b9b0 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 69 l->hdr.mxFrame i
1b9b1 73 20 6c 65 66 74 0d 0a 2a 2a 20 75 6e 63 68 61 s left..** uncha
1b9b2 6e 67 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 nged...**..** SQ
1b9b3 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 LITE_OK is retur
1b9b4 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 ned if no error
1b9b5 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 is encountered (
1b9b6 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 regardless of wh
1b9b7 65 74 68 65 72 0d 0a 2a 2a 20 6f 72 20 6e 6f 74 ether..** or not
1b9b8 20 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 pWal->hdr.mxFra
1b9b9 6d 65 20 69 73 20 6d 6f 64 69 66 69 65 64 29 2e me is modified).
1b9ba 20 41 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 An SQLite error
1b9bb 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 code is returne
1b9bc 64 0d 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f d..** if an erro
1b9bd 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 r occurs...*/..s
1b9be 74 61 74 69 63 20 69 6e 74 20 77 61 6c 52 65 73 tatic int walRes
1b9bf 74 61 72 74 4c 6f 67 28 57 61 6c 20 2a 70 57 61 tartLog(Wal *pWa
1b9c0 6c 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 l){.. int rc =
1b9c1 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e SQLITE_OK;.. in
1b9c2 74 20 63 6e 74 3b 0d 0a 0d 0a 20 20 69 66 28 20 t cnt;.... if(
1b9c3 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b 3d 3d pWal->readLock==
1b9c4 30 20 29 7b 0d 0a 20 20 20 20 76 6f 6c 61 74 69 0 ){.. volati
1b9c5 6c 65 20 57 61 6c 43 6b 70 74 49 6e 66 6f 20 2a le WalCkptInfo *
1b9c6 70 49 6e 66 6f 20 3d 20 77 61 6c 43 6b 70 74 49 pInfo = walCkptI
1b9c7 6e 66 6f 28 70 57 61 6c 29 3b 0d 0a 20 20 20 20 nfo(pWal);..
1b9c8 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e assert( pInfo->n
1b9c9 42 61 63 6b 66 69 6c 6c 3d 3d 70 57 61 6c 2d 3e Backfill==pWal->
1b9ca 68 64 72 2e 6d 78 46 72 61 6d 65 20 29 3b 0d 0a hdr.mxFrame );..
1b9cb 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e if( pInfo->n
1b9cc 42 61 63 6b 66 69 6c 6c 3e 30 20 29 7b 0d 0a 20 Backfill>0 ){..
1b9cd 20 20 20 20 20 75 33 32 20 73 61 6c 74 31 3b 0d u32 salt1;.
1b9ce 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 . sqlite3_r
1b9cf 61 6e 64 6f 6d 6e 65 73 73 28 34 2c 20 26 73 61 andomness(4, &sa
1b9d0 6c 74 31 29 3b 0d 0a 20 20 20 20 20 20 72 63 20 lt1);.. rc
1b9d1 3d 20 77 61 6c 4c 6f 63 6b 45 78 63 6c 75 73 69 = walLockExclusi
1b9d2 76 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 ve(pWal, WAL_REA
1b9d3 44 5f 4c 4f 43 4b 28 31 29 2c 20 57 41 4c 5f 4e D_LOCK(1), WAL_N
1b9d4 52 45 41 44 45 52 2d 31 29 3b 0d 0a 20 20 20 20 READER-1);..
1b9d5 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1b9d6 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
1b9d7 2f 2a 20 49 66 20 61 6c 6c 20 72 65 61 64 65 72 /* If all reader
1b9d8 73 20 61 72 65 20 75 73 69 6e 67 20 57 41 4c 5f s are using WAL_
1b9d9 52 45 41 44 5f 4c 4f 43 4b 28 30 29 20 28 69 6e READ_LOCK(0) (in
1b9da 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 other words if
1b9db 6e 6f 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 no.. ** r
1b9dc 65 61 64 65 72 73 20 61 72 65 20 63 75 72 72 65 eaders are curre
1b9dd 6e 74 6c 79 20 75 73 69 6e 67 20 74 68 65 20 57 ntly using the W
1b9de 41 4c 29 2c 20 74 68 65 6e 20 74 68 65 20 74 72 AL), then the tr
1b9df 61 6e 73 61 63 74 69 6f 6e 73 0d 0a 20 20 20 20 ansactions..
1b9e0 20 20 20 20 2a 2a 20 66 72 61 6d 65 73 20 77 69 ** frames wi
1b9e1 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 ll overwrite the
1b9e2 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 65 78 start of the ex
1b9e3 69 73 74 69 6e 67 20 6c 6f 67 2e 20 55 70 64 61 isting log. Upda
1b9e4 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 te the..
1b9e5 2a 2a 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 ** wal-index hea
1b9e6 64 65 72 20 74 6f 20 72 65 66 6c 65 63 74 20 74 der to reflect t
1b9e7 68 69 73 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2a his... **
1b9e8 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 .. ** In
1b9e9 74 68 65 6f 72 79 20 69 74 20 77 6f 75 6c 64 20 theory it would
1b9ea 62 65 20 4f 6b 20 74 6f 20 75 70 64 61 74 65 20 be Ok to update
1b9eb 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65 the cache of the
1b9ec 20 68 65 61 64 65 72 20 6f 6e 6c 79 0d 0a 20 20 header only..
1b9ed 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 69 73 ** at this
1b9ee 20 70 6f 69 6e 74 2e 20 42 75 74 20 75 70 64 61 point. But upda
1b9ef 74 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c 20 ting the actual
1b9f0 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 wal-index header
1b9f1 20 69 73 20 61 6c 73 6f 0d 0a 20 20 20 20 20 20 is also..
1b9f2 20 20 2a 2a 20 73 61 66 65 20 61 6e 64 20 6d 65 ** safe and me
1b9f3 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 ans there is no
1b9f4 73 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 special case for
1b9f5 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 sqlite3WalUndo(
1b9f6 29 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f ).. ** to
1b9f7 20 68 61 6e 64 6c 65 20 69 66 20 74 68 69 73 20 handle if this
1b9f8 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 transaction is r
1b9f9 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a 20 20 20 olled back...
1b9fa 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 */..
1b9fb 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 int i;
1b9fc 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
1b9fd 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 op counter */..
1b9fe 20 20 20 20 20 20 20 75 33 32 20 2a 61 53 61 6c u32 *aSal
1b9ff 74 20 3d 20 70 57 61 6c 2d 3e 68 64 72 2e 61 53 t = pWal->hdr.aS
1ba00 61 6c 74 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 alt; /* Bi
1ba01 67 2d 65 6e 64 69 61 6e 20 73 61 6c 74 20 76 61 g-endian salt va
1ba02 6c 75 65 73 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 lues */....
1ba03 20 20 20 70 57 61 6c 2d 3e 6e 43 6b 70 74 2b 2b pWal->nCkpt++
1ba04 3b 0d 0a 20 20 20 20 20 20 20 20 70 57 61 6c 2d ;.. pWal-
1ba05 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 3d 20 30 >hdr.mxFrame = 0
1ba06 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ;.. sqlit
1ba07 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 e3Put4byte((u8*)
1ba08 26 61 53 61 6c 74 5b 30 5d 2c 20 31 20 2b 20 73 &aSalt[0], 1 + s
1ba09 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 qlite3Get4byte((
1ba0a 75 38 2a 29 26 61 53 61 6c 74 5b 30 5d 29 29 3b u8*)&aSalt[0]));
1ba0b 0d 0a 20 20 20 20 20 20 20 20 61 53 61 6c 74 5b .. aSalt[
1ba0c 31 5d 20 3d 20 73 61 6c 74 31 3b 0d 0a 20 20 20 1] = salt1;..
1ba0d 20 20 20 20 20 77 61 6c 49 6e 64 65 78 57 72 69 walIndexWri
1ba0e 74 65 48 64 72 28 70 57 61 6c 29 3b 0d 0a 20 20 teHdr(pWal);..
1ba0f 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 42 61 pInfo->nBa
1ba10 63 6b 66 69 6c 6c 20 3d 20 30 3b 0d 0a 20 20 20 ckfill = 0;..
1ba11 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c for(i=1; i<
1ba12 57 41 4c 5f 4e 52 45 41 44 45 52 3b 20 69 2b 2b WAL_NREADER; i++
1ba13 29 20 70 49 6e 66 6f 2d 3e 61 52 65 61 64 4d 61 ) pInfo->aReadMa
1ba14 72 6b 5b 69 5d 20 3d 20 52 45 41 44 4d 41 52 4b rk[i] = READMARK
1ba15 5f 4e 4f 54 5f 55 53 45 44 3b 0d 0a 20 20 20 20 _NOT_USED;..
1ba16 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 assert( pInf
1ba17 6f 2d 3e 61 52 65 61 64 4d 61 72 6b 5b 30 5d 3d o->aReadMark[0]=
1ba18 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 77 =0 );.. w
1ba19 61 6c 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 69 76 alUnlockExclusiv
1ba1a 65 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 44 e(pWal, WAL_READ
1ba1b 5f 4c 4f 43 4b 28 31 29 2c 20 57 41 4c 5f 4e 52 _LOCK(1), WAL_NR
1ba1c 45 41 44 45 52 2d 31 29 3b 0d 0a 20 20 20 20 20 EADER-1);..
1ba1d 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 }else if( rc!=S
1ba1e 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0d 0a 20 QLITE_BUSY ){..
1ba1f 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 return rc
1ba20 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1ba21 7d 0d 0a 20 20 20 20 77 61 6c 55 6e 6c 6f 63 6b }.. walUnlock
1ba22 53 68 61 72 65 64 28 70 57 61 6c 2c 20 57 41 4c Shared(pWal, WAL
1ba23 5f 52 45 41 44 5f 4c 4f 43 4b 28 30 29 29 3b 0d _READ_LOCK(0));.
1ba24 0a 20 20 20 20 70 57 61 6c 2d 3e 72 65 61 64 4c . pWal->readL
1ba25 6f 63 6b 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 63 ock = -1;.. c
1ba26 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20 64 6f 7b nt = 0;.. do{
1ba27 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 55 .. int notU
1ba28 73 65 64 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d sed;.. rc =
1ba29 20 77 61 6c 54 72 79 42 65 67 69 6e 52 65 61 64 walTryBeginRead
1ba2a 28 70 57 61 6c 2c 20 26 6e 6f 74 55 73 65 64 2c (pWal, ¬Used,
1ba2b 20 31 2c 20 2b 2b 63 6e 74 29 3b 0d 0a 20 20 20 1, ++cnt);..
1ba2c 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 57 41 4c }while( rc==WAL
1ba2d 5f 52 45 54 52 59 20 29 3b 0d 0a 20 20 20 20 61 _RETRY );.. a
1ba2e 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 ssert( (rc&0xff)
1ba2f 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b !=SQLITE_BUSY );
1ba30 20 2f 2a 20 42 55 53 59 20 6e 6f 74 20 70 6f 73 /* BUSY not pos
1ba31 73 69 62 6c 65 20 77 68 65 6e 20 75 73 65 57 61 sible when useWa
1ba32 6c 3d 3d 31 20 2a 2f 0d 0a 20 20 20 20 74 65 73 l==1 */.. tes
1ba33 74 63 61 73 65 28 20 28 72 63 26 30 78 66 66 29 tcase( (rc&0xff)
1ba34 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 ==SQLITE_IOERR )
1ba35 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 ;.. testcase(
1ba36 20 72 63 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54 rc==SQLITE_PROT
1ba37 4f 43 4f 4c 20 29 3b 0d 0a 20 20 20 20 74 65 73 OCOL );.. tes
1ba38 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 tcase( rc==SQLIT
1ba39 45 5f 4f 4b 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 E_OK );.. }..
1ba3a 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
1ba3b 0a 2f 2a 0d 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 ./*..** Informat
1ba3c 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 ion about the cu
1ba3d 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 rrent state of t
1ba3e 68 65 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 he WAL file and
1ba3f 77 68 65 72 65 0d 0a 2a 2a 20 74 68 65 20 6e 65 where..** the ne
1ba40 78 74 20 66 73 79 6e 63 20 73 68 6f 75 6c 64 20 xt fsync should
1ba41 6f 63 63 75 72 20 2d 20 70 61 73 73 65 64 20 66 occur - passed f
1ba42 72 6f 6d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 rom sqlite3WalFr
1ba43 61 6d 65 73 28 29 20 69 6e 74 6f 0d 0a 2a 2a 20 ames() into..**
1ba44 77 61 6c 57 72 69 74 65 54 6f 4c 6f 67 28 29 2e walWriteToLog().
1ba45 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 ..*/..typedef st
1ba46 72 75 63 74 20 57 61 6c 57 72 69 74 65 72 20 7b ruct WalWriter {
1ba47 0d 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 .. Wal *pWal;
1ba48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ba49 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 /* The complete
1ba4a 20 57 41 4c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e WAL information
1ba4b 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 */.. sqlite3_f
1ba4c 69 6c 65 20 2a 70 46 64 3b 20 20 20 20 20 20 20 ile *pFd;
1ba4d 20 20 20 20 2f 2a 20 54 68 65 20 57 41 4c 20 66 /* The WAL f
1ba4e 69 6c 65 20 74 6f 20 77 68 69 63 68 20 77 65 20 ile to which we
1ba4f 77 72 69 74 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 write */.. sqli
1ba50 74 65 33 5f 69 6e 74 36 34 20 69 53 79 6e 63 50 te3_int64 iSyncP
1ba51 6f 69 6e 74 3b 20 20 20 20 2f 2a 20 46 73 79 6e oint; /* Fsyn
1ba52 63 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 c at this offset
1ba53 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 6e 63 46 */.. int syncF
1ba54 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 lags;
1ba55 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 /* Flags for
1ba56 20 74 68 65 20 66 73 79 6e 63 20 2a 2f 0d 0a 20 the fsync */..
1ba57 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 int szPage;
1ba58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1ba59 20 53 69 7a 65 20 6f 66 20 6f 6e 65 20 70 61 67 Size of one pag
1ba5a 65 20 2a 2f 0d 0a 7d 20 57 61 6c 57 72 69 74 65 e */..} WalWrite
1ba5b 72 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 r;..../*..** Wri
1ba5c 74 65 20 69 41 6d 74 20 62 79 74 65 73 20 6f 66 te iAmt bytes of
1ba5d 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 content into th
1ba5e 65 20 57 41 4c 20 66 69 6c 65 20 62 65 67 69 6e e WAL file begin
1ba5f 6e 69 6e 67 20 61 74 20 69 4f 66 66 73 65 74 2e ning at iOffset.
1ba60 0d 0a 2a 2a 20 44 6f 20 61 20 73 79 6e 63 20 77 ..** Do a sync w
1ba61 68 65 6e 20 63 72 6f 73 73 69 6e 67 20 74 68 65 hen crossing the
1ba62 20 70 2d 3e 69 53 79 6e 63 50 6f 69 6e 74 20 62 p->iSyncPoint b
1ba63 6f 75 6e 64 61 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a oundary...**..**
1ba64 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c In other words,
1ba65 20 69 66 20 69 53 79 6e 63 50 6f 69 6e 74 20 69 if iSyncPoint i
1ba66 73 20 69 6e 20 62 65 74 77 65 65 6e 20 69 4f 66 s in between iOf
1ba67 66 73 65 74 20 61 6e 64 20 69 4f 66 66 73 65 74 fset and iOffset
1ba68 2b 69 41 6d 74 2c 0d 0a 2a 2a 20 66 69 72 73 74 +iAmt,..** first
1ba69 20 77 72 69 74 65 20 74 68 65 20 70 61 72 74 20 write the part
1ba6a 62 65 66 6f 72 65 20 69 53 79 6e 63 50 6f 69 6e before iSyncPoin
1ba6b 74 2c 20 74 68 65 6e 20 73 79 6e 63 2c 20 74 68 t, then sync, th
1ba6c 65 6e 20 77 72 69 74 65 20 74 68 65 0d 0a 2a 2a en write the..**
1ba6d 20 72 65 73 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 rest...*/..stat
1ba6e 69 63 20 69 6e 74 20 77 61 6c 57 72 69 74 65 54 ic int walWriteT
1ba6f 6f 4c 6f 67 28 0d 0a 20 20 57 61 6c 57 72 69 74 oLog(.. WalWrit
1ba70 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 er *p,
1ba71 20 20 20 20 2f 2a 20 57 41 4c 20 74 6f 20 77 72 /* WAL to wr
1ba72 69 74 65 20 74 6f 20 2a 2f 0d 0a 20 20 76 6f 69 ite to */.. voi
1ba73 64 20 2a 70 43 6f 6e 74 65 6e 74 2c 20 20 20 20 d *pContent,
1ba74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 /* Conte
1ba75 6e 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e nt to be written
1ba76 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 41 6d 74 2c */.. int iAmt,
1ba77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ba78 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
1ba79 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f ytes to write */
1ba7a 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 .. sqlite3_int6
1ba7b 34 20 69 4f 66 66 73 65 74 20 20 20 20 20 20 2f 4 iOffset /
1ba7c 2a 20 53 74 61 72 74 20 77 72 69 74 69 6e 67 20 * Start writing
1ba7d 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a at this offset *
1ba7e 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b /..){.. int rc;
1ba7f 0d 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3c .. if( iOffset<
1ba80 70 2d 3e 69 53 79 6e 63 50 6f 69 6e 74 20 26 26 p->iSyncPoint &&
1ba81 20 69 4f 66 66 73 65 74 2b 69 41 6d 74 3e 3d 70 iOffset+iAmt>=p
1ba82 2d 3e 69 53 79 6e 63 50 6f 69 6e 74 20 29 7b 0d ->iSyncPoint ){.
1ba83 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 41 . int iFirstA
1ba84 6d 74 20 3d 20 28 69 6e 74 29 28 70 2d 3e 69 53 mt = (int)(p->iS
1ba85 79 6e 63 50 6f 69 6e 74 20 2d 20 69 4f 66 66 73 yncPoint - iOffs
1ba86 65 74 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 et);.. rc = s
1ba87 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d qlite3OsWrite(p-
1ba88 3e 70 46 64 2c 20 70 43 6f 6e 74 65 6e 74 2c 20 >pFd, pContent,
1ba89 69 46 69 72 73 74 41 6d 74 2c 20 69 4f 66 66 73 iFirstAmt, iOffs
1ba8a 65 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 et);.. if( rc
1ba8b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 ) return rc;..
1ba8c 20 20 20 69 4f 66 66 73 65 74 20 2b 3d 20 69 46 iOffset += iF
1ba8d 69 72 73 74 41 6d 74 3b 0d 0a 20 20 20 20 69 41 irstAmt;.. iA
1ba8e 6d 74 20 2d 3d 20 69 46 69 72 73 74 41 6d 74 3b mt -= iFirstAmt;
1ba8f 0d 0a 20 20 20 20 70 43 6f 6e 74 65 6e 74 20 3d .. pContent =
1ba90 20 28 76 6f 69 64 2a 29 28 69 46 69 72 73 74 41 (void*)(iFirstA
1ba91 6d 74 20 2b 20 28 63 68 61 72 2a 29 70 43 6f 6e mt + (char*)pCon
1ba92 74 65 6e 74 29 3b 0d 0a 20 20 20 20 61 73 73 65 tent);.. asse
1ba93 72 74 28 20 70 2d 3e 73 79 6e 63 46 6c 61 67 73 rt( p->syncFlags
1ba94 20 26 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f & (SQLITE_SYNC_
1ba95 4e 4f 52 4d 41 4c 7c 53 51 4c 49 54 45 5f 53 59 NORMAL|SQLITE_SY
1ba96 4e 43 5f 46 55 4c 4c 29 20 29 3b 0d 0a 20 20 20 NC_FULL) );..
1ba97 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 rc = sqlite3OsS
1ba98 79 6e 63 28 70 2d 3e 70 46 64 2c 20 70 2d 3e 73 ync(p->pFd, p->s
1ba99 79 6e 63 46 6c 61 67 73 29 3b 0d 0a 20 20 20 20 yncFlags);..
1ba9a 69 66 28 20 69 41 6d 74 3d 3d 30 20 7c 7c 20 72 if( iAmt==0 || r
1ba9b 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a c ) return rc;..
1ba9c 20 20 7d 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 }.. rc = sqli
1ba9d 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 46 te3OsWrite(p->pF
1ba9e 64 2c 20 70 43 6f 6e 74 65 6e 74 2c 20 69 41 6d d, pContent, iAm
1ba9f 74 2c 20 69 4f 66 66 73 65 74 29 3b 0d 0a 20 20 t, iOffset);..
1baa0 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
1baa1 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 6f 75 ./*..** Write ou
1baa2 74 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 t a single frame
1baa3 20 6f 66 20 74 68 65 20 57 41 4c 0d 0a 2a 2f 0d of the WAL..*/.
1baa4 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 57 .static int walW
1baa5 72 69 74 65 4f 6e 65 46 72 61 6d 65 28 0d 0a 20 riteOneFrame(..
1baa6 20 57 61 6c 57 72 69 74 65 72 20 2a 70 2c 20 20 WalWriter *p,
1baa7 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1baa8 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 Where to write t
1baa9 68 65 20 66 72 61 6d 65 20 2a 2f 0d 0a 20 20 50 he frame */.. P
1baaa 67 48 64 72 20 2a 70 50 61 67 65 2c 20 20 20 20 gHdr *pPage,
1baab 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1baac 65 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 e page of the fr
1baad 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 ame to be writte
1baae 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 72 75 n */.. int nTru
1baaf 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 ncate,
1bab0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 /* The commi
1bab1 74 20 66 6c 61 67 2e 20 20 55 73 75 61 6c 6c 79 t flag. Usually
1bab2 20 30 2e 20 20 3e 30 20 66 6f 72 20 63 6f 6d 6d 0. >0 for comm
1bab3 69 74 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 it */.. sqlite3
1bab4 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 20 20 _int64 iOffset
1bab5 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 /* Byte off
1bab6 73 65 74 20 61 74 20 77 68 69 63 68 20 74 6f 20 set at which to
1bab7 77 72 69 74 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 write */..){..
1bab8 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
1bab9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1baba 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 /* Result code f
1babb 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 rom subfunctions
1babc 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 44 61 */.. void *pDa
1babd 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ta;
1babe 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 61 /* Data a
1babf 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 ctually written
1bac0 2a 2f 0d 0a 20 20 75 38 20 61 46 72 61 6d 65 5b */.. u8 aFrame[
1bac1 57 41 4c 5f 46 52 41 4d 45 5f 48 44 52 53 49 5a WAL_FRAME_HDRSIZ
1bac2 45 5d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 E]; /* Buffer
1bac3 74 6f 20 61 73 73 65 6d 62 6c 65 20 66 72 61 6d to assemble fram
1bac4 65 2d 68 65 61 64 65 72 20 69 6e 20 2a 2f 0d 0a e-header in */..
1bac5 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
1bac6 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0d 0a 20 TE_HAS_CODEC)..
1bac7 20 69 66 28 20 28 70 44 61 74 61 20 3d 20 73 71 if( (pData = sq
1bac8 6c 69 74 65 33 50 61 67 65 72 43 6f 64 65 63 28 lite3PagerCodec(
1bac9 70 50 61 67 65 29 29 3d 3d 30 20 29 20 72 65 74 pPage))==0 ) ret
1baca 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
1bacb 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 70 44 61 74 ;..#else.. pDat
1bacc 61 20 3d 20 70 50 61 67 65 2d 3e 70 44 61 74 61 a = pPage->pData
1bacd 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 77 61 6c ;..#endif.. wal
1bace 45 6e 63 6f 64 65 46 72 61 6d 65 28 70 2d 3e 70 EncodeFrame(p->p
1bacf 57 61 6c 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f Wal, pPage->pgno
1bad0 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 70 44 61 , nTruncate, pDa
1bad1 74 61 2c 20 61 46 72 61 6d 65 29 3b 0d 0a 20 20 ta, aFrame);..
1bad2 72 63 20 3d 20 77 61 6c 57 72 69 74 65 54 6f 4c rc = walWriteToL
1bad3 6f 67 28 70 2c 20 61 46 72 61 6d 65 2c 20 73 69 og(p, aFrame, si
1bad4 7a 65 6f 66 28 61 46 72 61 6d 65 29 2c 20 69 4f zeof(aFrame), iO
1bad5 66 66 73 65 74 29 3b 0d 0a 20 20 69 66 28 20 72 ffset);.. if( r
1bad6 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a c ) return rc;..
1bad7 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 /* Write the p
1bad8 61 67 65 20 64 61 74 61 20 2a 2f 0d 0a 20 20 72 age data */.. r
1bad9 63 20 3d 20 77 61 6c 57 72 69 74 65 54 6f 4c 6f c = walWriteToLo
1bada 67 28 70 2c 20 70 44 61 74 61 2c 20 70 2d 3e 73 g(p, pData, p->s
1badb 7a 50 61 67 65 2c 20 69 4f 66 66 73 65 74 2b 73 zPage, iOffset+s
1badc 69 7a 65 6f 66 28 61 46 72 61 6d 65 29 29 3b 0d izeof(aFrame));.
1badd 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
1bade 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 57 72 69 74 ..../* ..** Writ
1badf 65 20 61 20 73 65 74 20 6f 66 20 66 72 61 6d 65 e a set of frame
1bae0 73 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 54 68 s to the log. Th
1bae1 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f e caller must ho
1bae2 6c 64 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 ld the write-loc
1bae3 6b 0d 0a 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 67 k..** on the log
1bae4 20 66 69 6c 65 20 28 6f 62 74 61 69 6e 65 64 20 file (obtained
1bae5 75 73 69 6e 67 20 73 71 6c 69 74 65 33 57 61 6c using sqlite3Wal
1bae6 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 BeginWriteTransa
1bae7 63 74 69 6f 6e 28 29 29 2e 0d 0a 2a 2f 0d 0a 53 ction())...*/..S
1bae8 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1bae9 74 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d t sqlite3WalFram
1baea 65 73 28 0d 0a 20 20 57 61 6c 20 2a 70 57 61 6c es(.. Wal *pWal
1baeb 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1baec 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 68 61 /* Wal ha
1baed 6e 64 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f ndle to write to
1baee 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 50 61 67 */.. int szPag
1baef 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
1baf0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
1baf1 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 se page-size in
1baf2 62 79 74 65 73 20 2a 2f 0d 0a 20 20 50 67 48 64 bytes */.. PgHd
1baf3 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 r *pList,
1baf4 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
1baf5 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 ist of dirty pag
1baf6 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0d 0a es to write */..
1baf7 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 Pgno nTruncate
1baf8 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1baf9 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 /* Database si
1bafa 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f ze after this co
1bafb 6d 6d 69 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 mmit */.. int i
1bafc 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 sCommit,
1bafd 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
1bafe 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 ue if this is a
1baff 63 6f 6d 6d 69 74 20 2a 2f 0d 0a 20 20 69 6e 74 commit */.. int
1bb00 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 sync_flags
1bb01 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1bb02 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f Flags to pass to
1bb03 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 OsSync() (or 0)
1bb04 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 */..){.. int r
1bb05 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c;
1bb06 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 /* Us
1bb07 65 64 20 74 6f 20 63 61 74 63 68 20 72 65 74 75 ed to catch retu
1bb08 72 6e 20 63 6f 64 65 73 20 2a 2f 0d 0a 20 20 75 rn codes */.. u
1bb09 33 32 20 69 46 72 61 6d 65 3b 20 20 20 20 20 20 32 iFrame;
1bb0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1bb0b 2a 20 4e 65 78 74 20 66 72 61 6d 65 20 61 64 64 * Next frame add
1bb0c 72 65 73 73 20 2a 2f 0d 0a 20 20 50 67 48 64 72 ress */.. PgHdr
1bb0d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 *p;
1bb0e 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 /* It
1bb0f 65 72 61 74 6f 72 20 74 6f 20 72 75 6e 20 74 68 erator to run th
1bb10 72 6f 75 67 68 20 70 4c 69 73 74 20 77 69 74 68 rough pList with
1bb11 2e 20 2a 2f 0d 0a 20 20 50 67 48 64 72 20 2a 70 . */.. PgHdr *p
1bb12 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 Last = 0;
1bb13 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 /* Last
1bb14 66 72 61 6d 65 20 69 6e 20 6c 69 73 74 20 2a 2f frame in list */
1bb15 0d 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d .. int nExtra =
1bb16 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
1bb17 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1bb18 20 65 78 74 72 61 20 63 6f 70 69 65 73 20 6f 66 extra copies of
1bb19 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0d 0a 20 last page */..
1bb1a 20 69 6e 74 20 73 7a 46 72 61 6d 65 3b 20 20 20 int szFrame;
1bb1b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bb1c 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 /* The size of
1bb1d 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 2a a single frame *
1bb1e 2f 0d 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 /.. i64 iOffset
1bb1f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1bb20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 62 79 74 /* Next byt
1bb21 65 20 74 6f 20 77 72 69 74 65 20 69 6e 20 57 41 e to write in WA
1bb22 4c 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 57 61 6c L file */.. Wal
1bb23 57 72 69 74 65 72 20 77 3b 20 20 20 20 20 20 20 Writer w;
1bb24 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1bb25 54 68 65 20 77 72 69 74 65 72 20 2a 2f 0d 0a 0d The writer */...
1bb26 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 . assert( pList
1bb27 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
1bb28 57 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 20 29 Wal->writeLock )
1bb29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 ;.... /* If thi
1bb2a 73 20 66 72 61 6d 65 20 73 65 74 20 63 6f 6d 70 s frame set comp
1bb2b 6c 65 74 65 73 20 61 20 74 72 61 6e 73 61 63 74 letes a transact
1bb2c 69 6f 6e 2c 20 74 68 65 6e 20 6e 54 72 75 6e 63 ion, then nTrunc
1bb2d 61 74 65 3e 30 2e 20 20 49 66 0d 0a 20 20 2a 2a ate>0. If.. **
1bb2e 20 6e 54 72 75 6e 63 61 74 65 3d 3d 30 20 74 68 nTruncate==0 th
1bb2f 65 6e 20 74 68 69 73 20 66 72 61 6d 65 20 73 65 en this frame se
1bb30 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 70 6c t does not compl
1bb31 65 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 ete the transact
1bb32 69 6f 6e 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 72 ion. */.. asser
1bb33 74 28 20 28 69 73 43 6f 6d 6d 69 74 21 3d 30 29 t( (isCommit!=0)
1bb34 3d 3d 28 6e 54 72 75 6e 63 61 74 65 21 3d 30 29 ==(nTruncate!=0)
1bb35 20 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e );....#if defin
1bb36 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 ed(SQLITE_TEST)
1bb37 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
1bb38 45 5f 44 45 42 55 47 29 0d 0a 20 20 7b 20 69 6e E_DEBUG).. { in
1bb39 74 20 63 6e 74 3b 20 66 6f 72 28 63 6e 74 3d 30 t cnt; for(cnt=0
1bb3a 2c 20 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d , p=pList; p; p=
1bb3b 70 2d 3e 70 44 69 72 74 79 2c 20 63 6e 74 2b 2b p->pDirty, cnt++
1bb3c 29 7b 7d 0d 0a 20 20 20 20 57 41 4c 54 52 41 43 ){}.. WALTRAC
1bb3d 45 28 28 22 57 41 4c 25 70 3a 20 66 72 61 6d 65 E(("WAL%p: frame
1bb3e 20 77 72 69 74 65 20 62 65 67 69 6e 2e 20 25 64 write begin. %d
1bb3f 20 66 72 61 6d 65 73 2e 20 6d 78 46 72 61 6d 65 frames. mxFrame
1bb40 3d 25 64 2e 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 =%d. %s\n",..
1bb41 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 2c pWal,
1bb42 20 63 6e 74 2c 20 70 57 61 6c 2d 3e 68 64 72 2e cnt, pWal->hdr.
1bb43 6d 78 46 72 61 6d 65 2c 20 69 73 43 6f 6d 6d 69 mxFrame, isCommi
1bb44 74 20 3f 20 22 43 6f 6d 6d 69 74 22 20 3a 20 22 t ? "Commit" : "
1bb45 53 70 69 6c 6c 22 29 29 3b 0d 0a 20 20 7d 0d 0a Spill"));.. }..
1bb46 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a 20 53 #endif.... /* S
1bb47 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 ee if it is poss
1bb48 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 68 ible to write th
1bb49 65 73 65 20 66 72 61 6d 65 73 20 69 6e 74 6f 20 ese frames into
1bb4a 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 the start of the
1bb4b 0d 0a 20 20 2a 2a 20 6c 6f 67 20 66 69 6c 65 2c .. ** log file,
1bb4c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 70 70 65 instead of appe
1bb4d 6e 64 69 6e 67 20 74 6f 20 69 74 20 61 74 20 70 nding to it at p
1bb4e 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 Wal->hdr.mxFrame
1bb4f 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 53 ... */.. if( S
1bb50 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 QLITE_OK!=(rc =
1bb51 77 61 6c 52 65 73 74 61 72 74 4c 6f 67 28 70 57 walRestartLog(pW
1bb52 61 6c 29 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 al)) ){.. ret
1bb53 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a urn rc;.. }....
1bb54 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 /* If this is
1bb55 74 68 65 20 66 69 72 73 74 20 66 72 61 6d 65 20 the first frame
1bb56 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 written into the
1bb57 20 6c 6f 67 2c 20 77 72 69 74 65 20 74 68 65 20 log, write the
1bb58 57 41 4c 0d 0a 20 20 2a 2a 20 68 65 61 64 65 72 WAL.. ** header
1bb59 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 to the start of
1bb5a 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 20 53 the WAL file. S
1bb5b 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 74 20 74 ee comments at t
1bb5c 68 65 20 74 6f 70 20 6f 66 0d 0a 20 20 2a 2a 20 he top of.. **
1bb5d 74 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65 this source file
1bb5e 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 for a descripti
1bb5f 6f 6e 20 6f 66 20 74 68 65 20 57 41 4c 20 68 65 on of the WAL he
1bb60 61 64 65 72 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 ader format...
1bb61 2a 2f 0d 0a 20 20 69 46 72 61 6d 65 20 3d 20 70 */.. iFrame = p
1bb62 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 Wal->hdr.mxFrame
1bb63 3b 0d 0a 20 20 69 66 28 20 69 46 72 61 6d 65 3d ;.. if( iFrame=
1bb64 3d 30 20 29 7b 0d 0a 20 20 20 20 75 38 20 61 57 =0 ){.. u8 aW
1bb65 61 6c 48 64 72 5b 57 41 4c 5f 48 44 52 53 49 5a alHdr[WAL_HDRSIZ
1bb66 45 5d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 E]; /* Buff
1bb67 65 72 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 77 er to assemble w
1bb68 61 6c 2d 68 65 61 64 65 72 20 69 6e 20 2a 2f 0d al-header in */.
1bb69 0a 20 20 20 20 75 33 32 20 61 43 6b 73 75 6d 5b . u32 aCksum[
1bb6a 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2];
1bb6b 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 66 /* Checksum f
1bb6c 6f 72 20 77 61 6c 2d 68 65 61 64 65 72 20 2a 2f or wal-header */
1bb6d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 .... sqlite3P
1bb6e 75 74 34 62 79 74 65 28 26 61 57 61 6c 48 64 72 ut4byte(&aWalHdr
1bb6f 5b 30 5d 2c 20 28 57 41 4c 5f 4d 41 47 49 43 20 [0], (WAL_MAGIC
1bb70 7c 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 | SQLITE_BIGENDI
1bb71 41 4e 29 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 AN));.. sqlit
1bb72 65 33 50 75 74 34 62 79 74 65 28 26 61 57 61 6c e3Put4byte(&aWal
1bb73 48 64 72 5b 34 5d 2c 20 57 41 4c 5f 4d 41 58 5f Hdr[4], WAL_MAX_
1bb74 56 45 52 53 49 4f 4e 29 3b 0d 0a 20 20 20 20 73 VERSION);.. s
1bb75 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 26 qlite3Put4byte(&
1bb76 61 57 61 6c 48 64 72 5b 38 5d 2c 20 73 7a 50 61 aWalHdr[8], szPa
1bb77 67 65 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 ge);.. sqlite
1bb78 33 50 75 74 34 62 79 74 65 28 26 61 57 61 6c 48 3Put4byte(&aWalH
1bb79 64 72 5b 31 32 5d 2c 20 70 57 61 6c 2d 3e 6e 43 dr[12], pWal->nC
1bb7a 6b 70 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 kpt);.. if( p
1bb7b 57 61 6c 2d 3e 6e 43 6b 70 74 3d 3d 30 20 29 20 Wal->nCkpt==0 )
1bb7c 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 sqlite3_randomne
1bb7d 73 73 28 38 2c 20 70 57 61 6c 2d 3e 68 64 72 2e ss(8, pWal->hdr.
1bb7e 61 53 61 6c 74 29 3b 0d 0a 20 20 20 20 6d 65 6d aSalt);.. mem
1bb7f 63 70 79 28 26 61 57 61 6c 48 64 72 5b 31 36 5d cpy(&aWalHdr[16]
1bb80 2c 20 70 57 61 6c 2d 3e 68 64 72 2e 61 53 61 6c , pWal->hdr.aSal
1bb81 74 2c 20 38 29 3b 0d 0a 20 20 20 20 77 61 6c 43 t, 8);.. walC
1bb82 68 65 63 6b 73 75 6d 42 79 74 65 73 28 31 2c 20 hecksumBytes(1,
1bb83 61 57 61 6c 48 64 72 2c 20 57 41 4c 5f 48 44 52 aWalHdr, WAL_HDR
1bb84 53 49 5a 45 2d 32 2a 34 2c 20 30 2c 20 61 43 6b SIZE-2*4, 0, aCk
1bb85 73 75 6d 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 sum);.. sqlit
1bb86 65 33 50 75 74 34 62 79 74 65 28 26 61 57 61 6c e3Put4byte(&aWal
1bb87 48 64 72 5b 32 34 5d 2c 20 61 43 6b 73 75 6d 5b Hdr[24], aCksum[
1bb88 30 5d 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 0]);.. sqlite
1bb89 33 50 75 74 34 62 79 74 65 28 26 61 57 61 6c 48 3Put4byte(&aWalH
1bb8a 64 72 5b 32 38 5d 2c 20 61 43 6b 73 75 6d 5b 31 dr[28], aCksum[1
1bb8b 5d 29 3b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 70 ]);.. .. p
1bb8c 57 61 6c 2d 3e 73 7a 50 61 67 65 20 3d 20 73 7a Wal->szPage = sz
1bb8d 50 61 67 65 3b 0d 0a 20 20 20 20 70 57 61 6c 2d Page;.. pWal-
1bb8e 3e 68 64 72 2e 62 69 67 45 6e 64 43 6b 73 75 6d >hdr.bigEndCksum
1bb8f 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 = SQLITE_BIGEND
1bb90 49 41 4e 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e IAN;.. pWal->
1bb91 68 64 72 2e 61 46 72 61 6d 65 43 6b 73 75 6d 5b hdr.aFrameCksum[
1bb92 30 5d 20 3d 20 61 43 6b 73 75 6d 5b 30 5d 3b 0d 0] = aCksum[0];.
1bb93 0a 20 20 20 20 70 57 61 6c 2d 3e 68 64 72 2e 61 . pWal->hdr.a
1bb94 46 72 61 6d 65 43 6b 73 75 6d 5b 31 5d 20 3d 20 FrameCksum[1] =
1bb95 61 43 6b 73 75 6d 5b 31 5d 3b 0d 0a 20 20 20 20 aCksum[1];..
1bb96 70 57 61 6c 2d 3e 74 72 75 6e 63 61 74 65 4f 6e pWal->truncateOn
1bb97 43 6f 6d 6d 69 74 20 3d 20 31 3b 0d 0a 0d 0a 20 Commit = 1;....
1bb98 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f rc = sqlite3O
1bb99 73 57 72 69 74 65 28 70 57 61 6c 2d 3e 70 57 61 sWrite(pWal->pWa
1bb9a 6c 46 64 2c 20 61 57 61 6c 48 64 72 2c 20 73 69 lFd, aWalHdr, si
1bb9b 7a 65 6f 66 28 61 57 61 6c 48 64 72 29 2c 20 30 zeof(aWalHdr), 0
1bb9c 29 3b 0d 0a 20 20 20 20 57 41 4c 54 52 41 43 45 );.. WALTRACE
1bb9d 28 28 22 57 41 4c 25 70 3a 20 77 61 6c 2d 68 65 (("WAL%p: wal-he
1bb9e 61 64 65 72 20 77 72 69 74 65 20 25 73 5c 6e 22 ader write %s\n"
1bb9f 2c 20 70 57 61 6c 2c 20 72 63 20 3f 20 22 66 61 , pWal, rc ? "fa
1bba0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0d iled" : "ok"));.
1bba1 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
1bba2 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1bba3 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1bba4 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53 79 6e }.... /* Syn
1bba5 63 20 74 68 65 20 68 65 61 64 65 72 20 28 75 6e c the header (un
1bba6 6c 65 73 73 20 53 51 4c 49 54 45 5f 49 4f 43 41 less SQLITE_IOCA
1bba7 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 69 73 20 P_SEQUENTIAL is
1bba8 74 72 75 65 20 6f 72 20 75 6e 6c 65 73 73 0d 0a true or unless..
1bba9 20 20 20 20 2a 2a 20 61 6c 6c 20 73 79 6e 63 69 ** all synci
1bbaa 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 ng is turned off
1bbab 20 62 79 20 50 52 41 47 4d 41 20 73 79 6e 63 68 by PRAGMA synch
1bbac 72 6f 6e 6f 75 73 3d 4f 46 46 29 2e 20 20 4f 74 ronous=OFF). Ot
1bbad 68 65 72 77 69 73 65 0d 0a 20 20 20 20 2a 2a 20 herwise.. **
1bbae 61 6e 20 6f 75 74 2d 6f 66 2d 6f 72 64 65 72 20 an out-of-order
1bbaf 77 72 69 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 write following
1bbb0 61 20 57 41 4c 20 72 65 73 74 61 72 74 20 63 6f a WAL restart co
1bbb1 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 0d 0a 20 uld result in..
1bbb2 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 ** database c
1bbb3 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 65 20 orruption. See
1bbb4 74 68 65 20 74 69 63 6b 65 74 3a 0d 0a 20 20 20 the ticket:..
1bbb5 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 **.. **
1bbb6 68 74 74 70 3a 2f 2f 6c 6f 63 61 6c 68 6f 73 74 http://localhost
1bbb7 3a 35 39 31 2f 73 71 6c 69 74 65 2f 69 6e 66 6f :591/sqlite/info
1bbb8 2f 66 66 35 62 65 37 33 64 65 65 0d 0a 20 20 20 /ff5be73dee..
1bbb9 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 70 57 61 */.. if( pWa
1bbba 6c 2d 3e 73 79 6e 63 48 65 61 64 65 72 20 26 26 l->syncHeader &&
1bbbb 20 73 79 6e 63 5f 66 6c 61 67 73 20 29 7b 0d 0a sync_flags ){..
1bbbc 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
1bbbd 65 33 4f 73 53 79 6e 63 28 70 57 61 6c 2d 3e 70 e3OsSync(pWal->p
1bbbe 57 61 6c 46 64 2c 20 73 79 6e 63 5f 66 6c 61 67 WalFd, sync_flag
1bbbf 73 20 26 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f s & SQLITE_SYNC_
1bbc0 4d 41 53 4b 29 3b 0d 0a 20 20 20 20 20 20 69 66 MASK);.. if
1bbc1 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 ( rc ) return rc
1bbc2 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 ;.. }.. }..
1bbc3 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 70 57 assert( (int)pW
1bbc4 61 6c 2d 3e 73 7a 50 61 67 65 3d 3d 73 7a 50 61 al->szPage==szPa
1bbc5 67 65 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 65 ge );.... /* Se
1bbc6 74 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 tup information
1bbc7 6e 65 65 64 65 64 20 74 6f 20 77 72 69 74 65 20 needed to write
1bbc8 66 72 61 6d 65 73 20 69 6e 74 6f 20 74 68 65 20 frames into the
1bbc9 57 41 4c 20 2a 2f 0d 0a 20 20 77 2e 70 57 61 6c WAL */.. w.pWal
1bbca 20 3d 20 70 57 61 6c 3b 0d 0a 20 20 77 2e 70 46 = pWal;.. w.pF
1bbcb 64 20 3d 20 70 57 61 6c 2d 3e 70 57 61 6c 46 64 d = pWal->pWalFd
1bbcc 3b 0d 0a 20 20 77 2e 69 53 79 6e 63 50 6f 69 6e ;.. w.iSyncPoin
1bbcd 74 20 3d 20 30 3b 0d 0a 20 20 77 2e 73 79 6e 63 t = 0;.. w.sync
1bbce 46 6c 61 67 73 20 3d 20 73 79 6e 63 5f 66 6c 61 Flags = sync_fla
1bbcf 67 73 3b 0d 0a 20 20 77 2e 73 7a 50 61 67 65 20 gs;.. w.szPage
1bbd0 3d 20 73 7a 50 61 67 65 3b 0d 0a 20 20 69 4f 66 = szPage;.. iOf
1bbd1 66 73 65 74 20 3d 20 77 61 6c 46 72 61 6d 65 4f fset = walFrameO
1bbd2 66 66 73 65 74 28 69 46 72 61 6d 65 2b 31 2c 20 ffset(iFrame+1,
1bbd3 73 7a 50 61 67 65 29 3b 0d 0a 20 20 73 7a 46 72 szPage);.. szFr
1bbd4 61 6d 65 20 3d 20 73 7a 50 61 67 65 20 2b 20 57 ame = szPage + W
1bbd5 41 4c 5f 46 52 41 4d 45 5f 48 44 52 53 49 5a 45 AL_FRAME_HDRSIZE
1bbd6 3b 0d 0a 0d 0a 20 20 2f 2a 20 57 72 69 74 65 20 ;.... /* Write
1bbd7 61 6c 6c 20 66 72 61 6d 65 73 20 69 6e 74 6f 20 all frames into
1bbd8 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 65 78 61 the log file exa
1bbd9 63 74 6c 79 20 6f 6e 63 65 20 2a 2f 0d 0a 20 20 ctly once */..
1bbda 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 for(p=pList; p;
1bbdb 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0d 0a 20 p=p->pDirty){..
1bbdc 20 20 20 69 6e 74 20 6e 44 62 53 69 7a 65 3b 20 int nDbSize;
1bbdd 20 20 2f 2a 20 30 20 6e 6f 72 6d 61 6c 6c 79 2e /* 0 normally.
1bbde 20 20 50 6f 73 69 74 69 76 65 20 3d 3d 20 63 6f Positive == co
1bbdf 6d 6d 69 74 20 66 6c 61 67 20 2a 2f 0d 0a 20 20 mmit flag */..
1bbe0 20 20 69 46 72 61 6d 65 2b 2b 3b 0d 0a 20 20 20 iFrame++;..
1bbe1 20 61 73 73 65 72 74 28 20 69 4f 66 66 73 65 74 assert( iOffset
1bbe2 3d 3d 77 61 6c 46 72 61 6d 65 4f 66 66 73 65 74 ==walFrameOffset
1bbe3 28 69 46 72 61 6d 65 2c 20 73 7a 50 61 67 65 29 (iFrame, szPage)
1bbe4 20 29 3b 0d 0a 20 20 20 20 6e 44 62 53 69 7a 65 );.. nDbSize
1bbe5 20 3d 20 28 69 73 43 6f 6d 6d 69 74 20 26 26 20 = (isCommit &&
1bbe6 70 2d 3e 70 44 69 72 74 79 3d 3d 30 29 20 3f 20 p->pDirty==0) ?
1bbe7 6e 54 72 75 6e 63 61 74 65 20 3a 20 30 3b 0d 0a nTruncate : 0;..
1bbe8 20 20 20 20 72 63 20 3d 20 77 61 6c 57 72 69 74 rc = walWrit
1bbe9 65 4f 6e 65 46 72 61 6d 65 28 26 77 2c 20 70 2c eOneFrame(&w, p,
1bbea 20 6e 44 62 53 69 7a 65 2c 20 69 4f 66 66 73 65 nDbSize, iOffse
1bbeb 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 t);.. if( rc
1bbec 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 ) return rc;..
1bbed 20 20 70 4c 61 73 74 20 3d 20 70 3b 0d 0a 20 20 pLast = p;..
1bbee 20 20 69 4f 66 66 73 65 74 20 2b 3d 20 73 7a 46 iOffset += szF
1bbef 72 61 6d 65 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 rame;.. }....
1bbf0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 /* If this is th
1bbf1 65 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e 73 e end of a trans
1bbf2 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 action, then we
1bbf3 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 70 61 might need to pa
1bbf4 64 0d 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e d.. ** the tran
1bbf5 73 61 63 74 69 6f 6e 20 61 6e 64 2f 6f 72 20 73 saction and/or s
1bbf6 79 6e 63 20 74 68 65 20 57 41 4c 20 66 69 6c 65 ync the WAL file
1bbf7 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 50 61 ... **.. ** Pa
1bbf8 64 64 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e dding and syncin
1bbf9 67 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 g only occur if
1bbfa 74 68 69 73 20 73 65 74 20 6f 66 20 66 72 61 6d this set of fram
1bbfb 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 0d 0a 20 es complete a..
1bbfc 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ** transaction
1bbfd 61 6e 64 20 69 66 20 50 52 41 47 4d 41 20 73 79 and if PRAGMA sy
1bbfe 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 2e 20 nchronous=FULL.
1bbff 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d If synchronous=
1bc00 3d 4e 4f 52 4d 41 4c 0d 0a 20 20 2a 2a 20 6f 72 =NORMAL.. ** or
1bc01 20 73 79 6e 63 68 6f 6e 6f 75 73 3d 3d 4f 46 46 synchonous==OFF
1bc02 2c 20 74 68 65 6e 20 6e 6f 20 70 61 64 64 69 6e , then no paddin
1bc03 67 20 6f 72 20 73 79 6e 63 69 6e 67 20 61 72 65 g or syncing are
1bc04 20 6e 65 65 64 65 64 2e 0d 0a 20 20 2a 2a 0d 0a needed... **..
1bc05 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 49 ** If SQLITE_I
1bc06 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f OCAP_POWERSAFE_O
1bc07 56 45 52 57 52 49 54 45 20 69 73 20 64 65 66 69 VERWRITE is defi
1bc08 6e 65 64 2c 20 74 68 65 6e 20 70 61 64 64 69 6e ned, then paddin
1bc09 67 20 69 73 20 6e 6f 74 0d 0a 20 20 2a 2a 20 6e g is not.. ** n
1bc0a 65 65 64 65 64 20 61 6e 64 20 6f 6e 6c 79 20 74 eeded and only t
1bc0b 68 65 20 73 79 6e 63 20 69 73 20 64 6f 6e 65 2e he sync is done.
1bc0c 20 20 49 66 20 70 61 64 64 69 6e 67 20 69 73 20 If padding is
1bc0d 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 74 68 65 needed, then the
1bc0e 0d 0a 20 20 2a 2a 20 66 69 6e 61 6c 20 66 72 61 .. ** final fra
1bc0f 6d 65 20 69 73 20 72 65 70 65 61 74 65 64 20 28 me is repeated (
1bc10 77 69 74 68 20 69 74 73 20 63 6f 6d 6d 69 74 20 with its commit
1bc11 6d 61 72 6b 29 20 75 6e 74 69 6c 20 74 68 65 20 mark) until the
1bc12 6e 65 78 74 20 73 65 63 74 6f 72 0d 0a 20 20 2a next sector.. *
1bc13 2a 20 62 6f 75 6e 64 61 72 79 20 69 73 20 63 72 * boundary is cr
1bc14 6f 73 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 ossed. Only the
1bc15 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 41 4c part of the WAL
1bc16 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 6c 61 prior to the la
1bc17 73 74 0d 0a 20 20 2a 2a 20 73 65 63 74 6f 72 20 st.. ** sector
1bc18 62 6f 75 6e 64 61 72 79 20 69 73 20 73 79 6e 63 boundary is sync
1bc19 65 64 3b 20 74 68 65 20 70 61 72 74 20 6f 66 20 ed; the part of
1bc1a 74 68 65 20 6c 61 73 74 20 66 72 61 6d 65 20 74 the last frame t
1bc1b 68 61 74 20 65 78 74 65 6e 64 73 0d 0a 20 20 2a hat extends.. *
1bc1c 2a 20 70 61 73 74 20 74 68 65 20 73 65 63 74 6f * past the secto
1bc1d 72 20 62 6f 75 6e 64 61 72 79 20 69 73 20 77 72 r boundary is wr
1bc1e 69 74 74 65 6e 20 61 66 74 65 72 20 74 68 65 20 itten after the
1bc1f 73 79 6e 63 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 sync... */.. i
1bc20 66 28 20 69 73 43 6f 6d 6d 69 74 20 26 26 20 28 f( isCommit && (
1bc21 73 79 6e 63 5f 66 6c 61 67 73 20 26 20 57 41 4c sync_flags & WAL
1bc22 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f _SYNC_TRANSACTIO
1bc23 4e 53 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 69 NS)!=0 ){.. i
1bc24 66 28 20 70 57 61 6c 2d 3e 70 61 64 54 6f 53 65 f( pWal->padToSe
1bc25 63 74 6f 72 42 6f 75 6e 64 61 72 79 20 29 7b 0d ctorBoundary ){.
1bc26 0a 20 20 20 20 20 20 69 6e 74 20 73 65 63 74 6f . int secto
1bc27 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f rSize = sqlite3O
1bc28 73 53 65 63 74 6f 72 53 69 7a 65 28 70 57 61 6c sSectorSize(pWal
1bc29 2d 3e 70 57 61 6c 46 64 29 3b 0d 0a 20 20 20 20 ->pWalFd);..
1bc2a 20 20 77 2e 69 53 79 6e 63 50 6f 69 6e 74 20 3d w.iSyncPoint =
1bc2b 20 28 28 69 4f 66 66 73 65 74 2b 73 65 63 74 6f ((iOffset+secto
1bc2c 72 53 69 7a 65 2d 31 29 2f 73 65 63 74 6f 72 53 rSize-1)/sectorS
1bc2d 69 7a 65 29 2a 73 65 63 74 6f 72 53 69 7a 65 3b ize)*sectorSize;
1bc2e 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 .. while( i
1bc2f 4f 66 66 73 65 74 3c 77 2e 69 53 79 6e 63 50 6f Offset<w.iSyncPo
1bc30 69 6e 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 int ){..
1bc31 72 63 20 3d 20 77 61 6c 57 72 69 74 65 4f 6e 65 rc = walWriteOne
1bc32 46 72 61 6d 65 28 26 77 2c 20 70 4c 61 73 74 2c Frame(&w, pLast,
1bc33 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 4f 66 66 nTruncate, iOff
1bc34 73 65 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 set);.. i
1bc35 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 f( rc ) return r
1bc36 63 3b 0d 0a 20 20 20 20 20 20 20 20 69 4f 66 66 c;.. iOff
1bc37 73 65 74 20 2b 3d 20 73 7a 46 72 61 6d 65 3b 0d set += szFrame;.
1bc38 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72 61 2b . nExtra+
1bc39 2b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 +;.. }..
1bc3a 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 }else{.. r
1bc3b 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e c = sqlite3OsSyn
1bc3c 63 28 77 2e 70 46 64 2c 20 73 79 6e 63 5f 66 6c c(w.pFd, sync_fl
1bc3d 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59 4e ags & SQLITE_SYN
1bc3e 43 5f 4d 41 53 4b 29 3b 0d 0a 20 20 20 20 7d 0d C_MASK);.. }.
1bc3f 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 . }.... /* If
1bc40 74 68 69 73 20 66 72 61 6d 65 20 73 65 74 20 63 this frame set c
1bc41 6f 6d 70 6c 65 74 65 73 20 74 68 65 20 66 69 72 ompletes the fir
1bc42 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 st transaction i
1bc43 6e 20 74 68 65 20 57 41 4c 20 61 6e 64 0d 0a 20 n the WAL and..
1bc44 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 6a 6f ** if PRAGMA jo
1bc45 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 urnal_size_limit
1bc46 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 72 is set, then tr
1bc47 75 6e 63 61 74 65 20 74 68 65 20 57 41 4c 20 74 uncate the WAL t
1bc48 6f 20 74 68 65 0d 0a 20 20 2a 2a 20 6a 6f 75 72 o the.. ** jour
1bc49 6e 61 6c 20 73 69 7a 65 20 6c 69 6d 69 74 2c 20 nal size limit,
1bc4a 69 66 20 70 6f 73 73 69 62 6c 65 2e 0d 0a 20 20 if possible...
1bc4b 2a 2f 0d 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d */.. if( isComm
1bc4c 69 74 20 26 26 20 70 57 61 6c 2d 3e 74 72 75 6e it && pWal->trun
1bc4d 63 61 74 65 4f 6e 43 6f 6d 6d 69 74 20 26 26 20 cateOnCommit &&
1bc4e 70 57 61 6c 2d 3e 6d 78 57 61 6c 53 69 7a 65 3e pWal->mxWalSize>
1bc4f 3d 30 20 29 7b 0d 0a 20 20 20 20 69 36 34 20 73 =0 ){.. i64 s
1bc50 7a 20 3d 20 70 57 61 6c 2d 3e 6d 78 57 61 6c 53 z = pWal->mxWalS
1bc51 69 7a 65 3b 0d 0a 20 20 20 20 69 66 28 20 77 61 ize;.. if( wa
1bc52 6c 46 72 61 6d 65 4f 66 66 73 65 74 28 69 46 72 lFrameOffset(iFr
1bc53 61 6d 65 2b 6e 45 78 74 72 61 2b 31 2c 20 73 7a ame+nExtra+1, sz
1bc54 50 61 67 65 29 3e 70 57 61 6c 2d 3e 6d 78 57 61 Page)>pWal->mxWa
1bc55 6c 53 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 lSize ){..
1bc56 73 7a 20 3d 20 77 61 6c 46 72 61 6d 65 4f 66 66 sz = walFrameOff
1bc57 73 65 74 28 69 46 72 61 6d 65 2b 6e 45 78 74 72 set(iFrame+nExtr
1bc58 61 2b 31 2c 20 73 7a 50 61 67 65 29 3b 0d 0a 20 a+1, szPage);..
1bc59 20 20 20 7d 0d 0a 20 20 20 20 77 61 6c 4c 69 6d }.. walLim
1bc5a 69 74 53 69 7a 65 28 70 57 61 6c 2c 20 73 7a 29 itSize(pWal, sz)
1bc5b 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e 74 72 75 ;.. pWal->tru
1bc5c 6e 63 61 74 65 4f 6e 43 6f 6d 6d 69 74 20 3d 20 ncateOnCommit =
1bc5d 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 0;.. }.... /*
1bc5e 41 70 70 65 6e 64 20 64 61 74 61 20 74 6f 20 74 Append data to t
1bc5f 68 65 20 77 61 6c 2d 69 6e 64 65 78 2e 20 49 74 he wal-index. It
1bc60 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 is not necessar
1bc61 79 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 0d 0a y to lock the ..
1bc62 20 20 2a 2a 20 77 61 6c 2d 69 6e 64 65 78 20 74 ** wal-index t
1bc63 6f 20 64 6f 20 74 68 69 73 20 61 73 20 74 68 65 o do this as the
1bc64 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 SQLITE_SHM_WRIT
1bc65 45 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 E lock held on t
1bc66 68 65 20 77 61 6c 2d 69 6e 64 65 78 0d 0a 20 20 he wal-index..
1bc67 2a 2a 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 ** guarantees th
1bc68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 at there are no
1bc69 6f 74 68 65 72 20 77 72 69 74 65 72 73 2c 20 61 other writers, a
1bc6a 6e 64 20 6e 6f 20 64 61 74 61 20 74 68 61 74 20 nd no data that
1bc6b 6d 61 79 0d 0a 20 20 2a 2a 20 62 65 20 69 6e 20 may.. ** be in
1bc6c 75 73 65 20 62 79 20 65 78 69 73 74 69 6e 67 20 use by existing
1bc6d 72 65 61 64 65 72 73 20 69 73 20 62 65 69 6e 67 readers is being
1bc6e 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0d 0a 20 overwritten...
1bc6f 20 2a 2f 0d 0a 20 20 69 46 72 61 6d 65 20 3d 20 */.. iFrame =
1bc70 70 57 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d pWal->hdr.mxFram
1bc71 65 3b 0d 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 e;.. for(p=pLis
1bc72 74 3b 20 70 20 26 26 20 72 63 3d 3d 53 51 4c 49 t; p && rc==SQLI
1bc73 54 45 5f 4f 4b 3b 20 70 3d 70 2d 3e 70 44 69 72 TE_OK; p=p->pDir
1bc74 74 79 29 7b 0d 0a 20 20 20 20 69 46 72 61 6d 65 ty){.. iFrame
1bc75 2b 2b 3b 0d 0a 20 20 20 20 72 63 20 3d 20 77 61 ++;.. rc = wa
1bc76 6c 49 6e 64 65 78 41 70 70 65 6e 64 28 70 57 61 lIndexAppend(pWa
1bc77 6c 2c 20 69 46 72 61 6d 65 2c 20 70 2d 3e 70 67 l, iFrame, p->pg
1bc78 6e 6f 29 3b 0d 0a 20 20 7d 0d 0a 20 20 77 68 69 no);.. }.. whi
1bc79 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f le( rc==SQLITE_O
1bc7a 4b 20 26 26 20 6e 45 78 74 72 61 3e 30 20 29 7b K && nExtra>0 ){
1bc7b 0d 0a 20 20 20 20 69 46 72 61 6d 65 2b 2b 3b 0d .. iFrame++;.
1bc7c 0a 20 20 20 20 6e 45 78 74 72 61 2d 2d 3b 0d 0a . nExtra--;..
1bc7d 20 20 20 20 72 63 20 3d 20 77 61 6c 49 6e 64 65 rc = walInde
1bc7e 78 41 70 70 65 6e 64 28 70 57 61 6c 2c 20 69 46 xAppend(pWal, iF
1bc7f 72 61 6d 65 2c 20 70 4c 61 73 74 2d 3e 70 67 6e rame, pLast->pgn
1bc80 6f 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 o);.. }.... if
1bc81 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1bc82 29 7b 0d 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 ){.. /* Updat
1bc83 65 20 74 68 65 20 70 72 69 76 61 74 65 20 63 6f e the private co
1bc84 70 79 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 py of the header
1bc85 2e 20 2a 2f 0d 0a 20 20 20 20 70 57 61 6c 2d 3e . */.. pWal->
1bc86 68 64 72 2e 73 7a 50 61 67 65 20 3d 20 28 75 31 hdr.szPage = (u1
1bc87 36 29 28 28 73 7a 50 61 67 65 26 30 78 66 66 30 6)((szPage&0xff0
1bc88 30 29 20 7c 20 28 73 7a 50 61 67 65 3e 3e 31 36 0) | (szPage>>16
1bc89 29 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 ));.. testcas
1bc8a 65 28 20 73 7a 50 61 67 65 3c 3d 33 32 37 36 38 e( szPage<=32768
1bc8b 20 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 73 );.. testcas
1bc8c 65 28 20 73 7a 50 61 67 65 3e 3d 36 35 35 33 36 e( szPage>=65536
1bc8d 20 29 3b 0d 0a 20 20 20 20 70 57 61 6c 2d 3e 68 );.. pWal->h
1bc8e 64 72 2e 6d 78 46 72 61 6d 65 20 3d 20 69 46 72 dr.mxFrame = iFr
1bc8f 61 6d 65 3b 0d 0a 20 20 20 20 69 66 28 20 69 73 ame;.. if( is
1bc90 43 6f 6d 6d 69 74 20 29 7b 0d 0a 20 20 20 20 20 Commit ){..
1bc91 20 70 57 61 6c 2d 3e 68 64 72 2e 69 43 68 61 6e pWal->hdr.iChan
1bc92 67 65 2b 2b 3b 0d 0a 20 20 20 20 20 20 70 57 61 ge++;.. pWa
1bc93 6c 2d 3e 68 64 72 2e 6e 50 61 67 65 20 3d 20 6e l->hdr.nPage = n
1bc94 54 72 75 6e 63 61 74 65 3b 0d 0a 20 20 20 20 7d Truncate;.. }
1bc95 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 .. /* If this
1bc96 20 69 73 20 61 20 63 6f 6d 6d 69 74 2c 20 75 70 is a commit, up
1bc97 64 61 74 65 20 74 68 65 20 77 61 6c 2d 69 6e 64 date the wal-ind
1bc98 65 78 20 68 65 61 64 65 72 20 74 6f 6f 2e 20 2a ex header too. *
1bc99 2f 0d 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d /.. if( isCom
1bc9a 6d 69 74 20 29 7b 0d 0a 20 20 20 20 20 20 77 61 mit ){.. wa
1bc9b 6c 49 6e 64 65 78 57 72 69 74 65 48 64 72 28 70 lIndexWriteHdr(p
1bc9c 57 61 6c 29 3b 0d 0a 20 20 20 20 20 20 70 57 61 Wal);.. pWa
1bc9d 6c 2d 3e 69 43 61 6c 6c 62 61 63 6b 20 3d 20 69 l->iCallback = i
1bc9e 46 72 61 6d 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 Frame;.. }..
1bc9f 20 7d 0d 0a 0d 0a 20 20 57 41 4c 54 52 41 43 45 }.... WALTRACE
1bca0 28 28 22 57 41 4c 25 70 3a 20 66 72 61 6d 65 20 (("WAL%p: frame
1bca1 77 72 69 74 65 20 25 73 5c 6e 22 2c 20 70 57 61 write %s\n", pWa
1bca2 6c 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 l, rc ? "failed"
1bca3 20 3a 20 22 6f 6b 22 29 29 3b 0d 0a 20 20 72 65 : "ok"));.. re
1bca4 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
1bca5 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 * ..** This rout
1bca6 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ine is called to
1bca7 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 implement sqlit
1bca8 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e e3_wal_checkpoin
1bca9 74 28 29 20 61 6e 64 0d 0a 2a 2a 20 72 65 6c 61 t() and..** rela
1bcaa 74 65 64 20 69 6e 74 65 72 66 61 63 65 73 2e 0d ted interfaces..
1bcab 0a 2a 2a 0d 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 .**..** Obtain a
1bcac 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63 6b CHECKPOINT lock
1bcad 20 61 6e 64 20 74 68 65 6e 20 62 61 63 6b 66 69 and then backfi
1bcae 6c 6c 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72 ll as much infor
1bcaf 6d 61 74 69 6f 6e 20 61 73 0d 0a 2a 2a 20 77 65 mation as..** we
1bcb0 20 63 61 6e 20 66 72 6f 6d 20 57 41 4c 20 69 6e can from WAL in
1bcb1 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e to the database.
1bcb2 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 61 72 61 ..**..** If para
1bcb3 6d 65 74 65 72 20 78 42 75 73 79 20 69 73 20 6e meter xBusy is n
1bcb4 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 61 ot NULL, it is a
1bcb5 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 pointer to a bu
1bcb6 73 79 2d 68 61 6e 64 6c 65 72 0d 0a 2a 2a 20 63 sy-handler..** c
1bcb7 61 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 allback. In this
1bcb8 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 case this funct
1bcb9 69 6f 6e 20 72 75 6e 73 20 61 20 62 6c 6f 63 6b ion runs a block
1bcba 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0d ing checkpoint..
1bcbb 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1bcbc 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 57 ATE int sqlite3W
1bcbd 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 0d 0a 20 alCheckpoint(..
1bcbe 20 57 61 6c 20 2a 70 57 61 6c 2c 20 20 20 20 20 Wal *pWal,
1bcbf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bcc0 20 2f 2a 20 57 61 6c 20 63 6f 6e 6e 65 63 74 69 /* Wal connecti
1bcc1 6f 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 4d 6f on */.. int eMo
1bcc2 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 de,
1bcc3 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 53 53 /* PASS
1bcc4 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 IVE, FULL or RES
1bcc5 54 41 52 54 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 TART */.. int (
1bcc6 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 29 2c 20 *xBusy)(void*),
1bcc7 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 /* Fu
1bcc8 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 nction to call w
1bcc9 68 65 6e 20 62 75 73 79 20 2a 2f 0d 0a 20 20 76 hen busy */.. v
1bcca 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20 20 oid *pBusyArg,
1bccb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1bccc 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 * Context argume
1bccd 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 nt for xBusyHand
1bcce 6c 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 79 ler */.. int sy
1bccf 6e 63 5f 66 6c 61 67 73 2c 20 20 20 20 20 20 20 nc_flags,
1bcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 /* Fla
1bcd1 67 73 20 74 6f 20 73 79 6e 63 20 64 62 20 66 69 gs to sync db fi
1bcd2 6c 65 20 77 69 74 68 20 28 6f 72 20 30 29 20 2a le with (or 0) *
1bcd3 2f 0d 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 /.. int nBuf,
1bcd4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bcd5 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
1bcd6 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 temporary buffer
1bcd7 20 2a 2f 0d 0a 20 20 75 38 20 2a 7a 42 75 66 2c */.. u8 *zBuf,
1bcd8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bcd9 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 /* Tempor
1bcda 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 75 73 ary buffer to us
1bcdb 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 4c e */.. int *pnL
1bcdc 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 og,
1bcdd 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
1bcde 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 Number of frames
1bcdf 20 69 6e 20 57 41 4c 20 2a 2f 0d 0a 20 20 69 6e in WAL */.. in
1bce0 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 t *pnCkpt
1bce1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1bce2 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 OUT: Number of
1bce3 62 61 63 6b 66 69 6c 6c 65 64 20 66 72 61 6d 65 backfilled frame
1bce4 73 20 69 6e 20 57 41 4c 20 2a 2f 0d 0a 29 7b 0d s in WAL */..){.
1bce5 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
1bce6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bce7 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 /* Return cod
1bce8 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 73 43 68 e */.. int isCh
1bce9 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 anged = 0;
1bcea 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
1bceb 69 66 20 61 20 6e 65 77 20 77 61 6c 2d 69 6e 64 if a new wal-ind
1bcec 65 78 20 68 65 61 64 65 72 20 69 73 20 6c 6f 61 ex header is loa
1bced 64 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 4d ded */.. int eM
1bcee 6f 64 65 32 20 3d 20 65 4d 6f 64 65 3b 20 20 20 ode2 = eMode;
1bcef 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 /* Mod
1bcf0 65 20 74 6f 20 70 61 73 73 20 74 6f 20 77 61 6c e to pass to wal
1bcf1 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 2a 2f 0d Checkpoint() */.
1bcf2 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 57 61 ... assert( pWa
1bcf3 6c 2d 3e 63 6b 70 74 4c 6f 63 6b 3d 3d 30 20 29 l->ckptLock==0 )
1bcf4 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 57 61 ;.. assert( pWa
1bcf5 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 l->writeLock==0
1bcf6 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 57 61 6c );.... if( pWal
1bcf7 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 72 65 74 ->readOnly ) ret
1bcf8 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f urn SQLITE_READO
1bcf9 4e 4c 59 3b 0d 0a 20 20 57 41 4c 54 52 41 43 45 NLY;.. WALTRACE
1bcfa 28 28 22 57 41 4c 25 70 3a 20 63 68 65 63 6b 70 (("WAL%p: checkp
1bcfb 6f 69 6e 74 20 62 65 67 69 6e 73 5c 6e 22 2c 20 oint begins\n",
1bcfc 70 57 61 6c 29 29 3b 0d 0a 20 20 72 63 20 3d 20 pWal));.. rc =
1bcfd 77 61 6c 4c 6f 63 6b 45 78 63 6c 75 73 69 76 65 walLockExclusive
1bcfe 28 70 57 61 6c 2c 20 57 41 4c 5f 43 4b 50 54 5f (pWal, WAL_CKPT_
1bcff 4c 4f 43 4b 2c 20 31 29 3b 0d 0a 20 20 69 66 28 LOCK, 1);.. if(
1bd00 20 72 63 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 55 rc ){.. /* U
1bd01 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 53 sually this is S
1bd02 51 4c 49 54 45 5f 42 55 53 59 20 6d 65 61 6e 69 QLITE_BUSY meani
1bd03 6e 67 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 ng that another
1bd04 74 68 72 65 61 64 20 6f 72 20 70 72 6f 63 65 73 thread or proces
1bd05 73 0d 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 s.. ** is alr
1bd06 65 61 64 79 20 72 75 6e 6e 69 6e 67 20 61 20 63 eady running a c
1bd07 68 65 63 6b 70 6f 69 6e 74 2c 20 6f 72 20 6d 61 heckpoint, or ma
1bd08 79 62 65 20 61 20 72 65 63 6f 76 65 72 79 2e 20 ybe a recovery.
1bd09 20 42 75 74 20 69 74 20 6d 69 67 68 74 0d 0a 20 But it might..
1bd0a 20 20 20 2a 2a 20 61 6c 73 6f 20 62 65 20 53 51 ** also be SQ
1bd0b 4c 49 54 45 5f 49 4f 45 52 52 2e 20 2a 2f 0d 0a LITE_IOERR. */..
1bd0c 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
1bd0d 20 20 7d 0d 0a 20 20 70 57 61 6c 2d 3e 63 6b 70 }.. pWal->ckp
1bd0e 74 4c 6f 63 6b 20 3d 20 31 3b 0d 0a 0d 0a 20 20 tLock = 1;....
1bd0f 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 /* If this is a
1bd10 62 6c 6f 63 6b 69 6e 67 2d 63 68 65 63 6b 70 6f blocking-checkpo
1bd11 69 6e 74 2c 20 74 68 65 6e 20 6f 62 74 61 69 6e int, then obtain
1bd12 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 the write-lock
1bd13 61 73 20 77 65 6c 6c 0d 0a 20 20 2a 2a 20 74 6f as well.. ** to
1bd14 20 70 72 65 76 65 6e 74 20 61 6e 79 20 77 72 69 prevent any wri
1bd15 74 65 72 73 20 66 72 6f 6d 20 72 75 6e 6e 69 6e ters from runnin
1bd16 67 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 g while the chec
1bd17 6b 70 6f 69 6e 74 20 69 73 20 75 6e 64 65 72 77 kpoint is underw
1bd18 61 79 2e 0d 0a 20 20 2a 2a 20 54 68 69 73 20 68 ay... ** This h
1bd19 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 20 62 65 as to be done be
1bd1a 66 6f 72 65 20 74 68 65 20 63 61 6c 6c 20 74 6f fore the call to
1bd1b 20 77 61 6c 49 6e 64 65 78 52 65 61 64 48 64 72 walIndexReadHdr
1bd1c 28 29 20 62 65 6c 6f 77 2e 0d 0a 20 20 2a 2a 0d () below... **.
1bd1d 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 77 72 69 . ** If the wri
1bd1e 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 ter lock cannot
1bd1f 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 be obtained, the
1bd20 6e 20 61 20 70 61 73 73 69 76 65 20 63 68 65 63 n a passive chec
1bd21 6b 70 6f 69 6e 74 20 69 73 0d 0a 20 20 2a 2a 20 kpoint is.. **
1bd22 72 75 6e 20 69 6e 73 74 65 61 64 2e 20 53 69 6e run instead. Sin
1bd23 63 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e ce the checkpoin
1bd24 74 65 72 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 ter is not holdi
1bd25 6e 67 20 74 68 65 20 77 72 69 74 65 72 20 6c 6f ng the writer lo
1bd26 63 6b 2c 0d 0a 20 20 2a 2a 20 74 68 65 72 65 20 ck,.. ** there
1bd27 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62 is no point in b
1bd28 6c 6f 63 6b 69 6e 67 20 77 61 69 74 69 6e 67 20 locking waiting
1bd29 66 6f 72 20 61 6e 79 20 72 65 61 64 65 72 73 2e for any readers.
1bd2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 0d 0a 20 Assuming no ..
1bd2b 20 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 ** other error
1bd2c 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e occurs, this fun
1bd2d 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 ction will retur
1bd2e 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 74 6f n SQLITE_BUSY to
1bd2f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 the caller...
1bd30 2a 2f 0d 0a 20 20 69 66 28 20 65 4d 6f 64 65 21 */.. if( eMode!
1bd31 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 =SQLITE_CHECKPOI
1bd32 4e 54 5f 50 41 53 53 49 56 45 20 29 7b 0d 0a 20 NT_PASSIVE ){..
1bd33 20 20 20 72 63 20 3d 20 77 61 6c 42 75 73 79 4c rc = walBusyL
1bd34 6f 63 6b 28 70 57 61 6c 2c 20 78 42 75 73 79 2c ock(pWal, xBusy,
1bd35 20 70 42 75 73 79 41 72 67 2c 20 57 41 4c 5f 57 pBusyArg, WAL_W
1bd36 52 49 54 45 5f 4c 4f 43 4b 2c 20 31 29 3b 0d 0a RITE_LOCK, 1);..
1bd37 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
1bd38 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
1bd39 70 57 61 6c 2d 3e 77 72 69 74 65 4c 6f 63 6b 20 pWal->writeLock
1bd3a 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 = 1;.. }else
1bd3b 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 if( rc==SQLITE_B
1bd3c 55 53 59 20 29 7b 0d 0a 20 20 20 20 20 20 65 4d USY ){.. eM
1bd3d 6f 64 65 32 20 3d 20 53 51 4c 49 54 45 5f 43 48 ode2 = SQLITE_CH
1bd3e 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 ECKPOINT_PASSIVE
1bd3f 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 ;.. rc = SQ
1bd40 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d LITE_OK;.. }.
1bd41 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 52 65 61 . }.... /* Rea
1bd42 64 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 d the wal-index
1bd43 68 65 61 64 65 72 2e 20 2a 2f 0d 0a 20 20 69 66 header. */.. if
1bd44 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1bd45 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 77 61 6c ){.. rc = wal
1bd46 49 6e 64 65 78 52 65 61 64 48 64 72 28 70 57 61 IndexReadHdr(pWa
1bd47 6c 2c 20 26 69 73 43 68 61 6e 67 65 64 29 3b 0d l, &isChanged);.
1bd48 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 6f 70 . }.... /* Cop
1bd49 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 y data from the
1bd4a 6c 6f 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 log to the datab
1bd4b 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0d 0a 20 20 ase file. */..
1bd4c 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1bd4d 4b 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 57 K ){.. if( pW
1bd4e 61 6c 2d 3e 68 64 72 2e 6d 78 46 72 61 6d 65 20 al->hdr.mxFrame
1bd4f 26 26 20 77 61 6c 50 61 67 65 73 69 7a 65 28 70 && walPagesize(p
1bd50 57 61 6c 29 21 3d 6e 42 75 66 20 29 7b 0d 0a 20 Wal)!=nBuf ){..
1bd51 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
1bd52 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a _CORRUPT_BKPT;..
1bd53 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1bd54 20 20 72 63 20 3d 20 77 61 6c 43 68 65 63 6b 70 rc = walCheckp
1bd55 6f 69 6e 74 28 70 57 61 6c 2c 20 65 4d 6f 64 65 oint(pWal, eMode
1bd56 32 2c 20 78 42 75 73 79 2c 20 70 42 75 73 79 41 2, xBusy, pBusyA
1bd57 72 67 2c 20 73 79 6e 63 5f 66 6c 61 67 73 2c 20 rg, sync_flags,
1bd58 7a 42 75 66 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d zBuf);.. }...
1bd59 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 . /* If no er
1bd5a 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 73 65 ror occurred, se
1bd5b 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 t the output var
1bd5c 69 61 62 6c 65 73 2e 20 2a 2f 0d 0a 20 20 20 20 iables. */..
1bd5d 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1bd5e 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f K || rc==SQLITE_
1bd5f 42 55 53 59 20 29 7b 0d 0a 20 20 20 20 20 20 69 BUSY ){.. i
1bd60 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f f( pnLog ) *pnLo
1bd61 67 20 3d 20 28 69 6e 74 29 70 57 61 6c 2d 3e 68 g = (int)pWal->h
1bd62 64 72 2e 6d 78 46 72 61 6d 65 3b 0d 0a 20 20 20 dr.mxFrame;..
1bd63 20 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 if( pnCkpt )
1bd64 2a 70 6e 43 6b 70 74 20 3d 20 28 69 6e 74 29 28 *pnCkpt = (int)(
1bd65 77 61 6c 43 6b 70 74 49 6e 66 6f 28 70 57 61 6c walCkptInfo(pWal
1bd66 29 2d 3e 6e 42 61 63 6b 66 69 6c 6c 29 3b 0d 0a )->nBackfill);..
1bd67 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
1bd68 69 66 28 20 69 73 43 68 61 6e 67 65 64 20 29 7b if( isChanged ){
1bd69 0d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 65 .. /* If a ne
1bd6a 77 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 w wal-index head
1bd6b 65 72 20 77 61 73 20 6c 6f 61 64 65 64 20 62 65 er was loaded be
1bd6c 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 70 6f fore the checkpo
1bd6d 69 6e 74 20 77 61 73 20 0d 0a 20 20 20 20 2a 2a int was .. **
1bd6e 20 70 65 72 66 6f 72 6d 65 64 2c 20 74 68 65 6e performed, then
1bd6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 the pager-cache
1bd70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
1bd71 20 70 57 61 6c 20 69 73 20 6e 6f 77 0d 0a 20 20 pWal is now..
1bd72 20 20 2a 2a 20 6f 75 74 20 6f 66 20 64 61 74 65 ** out of date
1bd73 2e 20 53 6f 20 7a 65 72 6f 20 74 68 65 20 63 61 . So zero the ca
1bd74 63 68 65 64 20 77 61 6c 2d 69 6e 64 65 78 20 68 ched wal-index h
1bd75 65 61 64 65 72 20 74 6f 20 65 6e 73 75 72 65 20 eader to ensure
1bd76 74 68 61 74 0d 0a 20 20 20 20 2a 2a 20 6e 65 78 that.. ** nex
1bd77 74 20 74 69 6d 65 20 74 68 65 20 70 61 67 65 72 t time the pager
1bd78 20 6f 70 65 6e 73 20 61 20 73 6e 61 70 73 68 6f opens a snapsho
1bd79 74 20 6f 6e 20 74 68 69 73 20 64 61 74 61 62 61 t on this databa
1bd7a 73 65 20 69 74 20 6b 6e 6f 77 73 20 74 68 61 74 se it knows that
1bd7b 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 .. ** the cac
1bd7c 68 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 he needs to be r
1bd7d 65 73 65 74 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 eset... */..
1bd7e 20 20 20 6d 65 6d 73 65 74 28 26 70 57 61 6c 2d memset(&pWal-
1bd7f 3e 68 64 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 >hdr, 0, sizeof(
1bd80 57 61 6c 49 6e 64 65 78 48 64 72 29 29 3b 0d 0a WalIndexHdr));..
1bd81 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 52 65 6c 65 }.... /* Rele
1bd82 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 2e 20 2a ase the locks. *
1bd83 2f 0d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 /.. sqlite3WalE
1bd84 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 ndWriteTransacti
1bd85 6f 6e 28 70 57 61 6c 29 3b 0d 0a 20 20 77 61 6c on(pWal);.. wal
1bd86 55 6e 6c 6f 63 6b 45 78 63 6c 75 73 69 76 65 28 UnlockExclusive(
1bd87 70 57 61 6c 2c 20 57 41 4c 5f 43 4b 50 54 5f 4c pWal, WAL_CKPT_L
1bd88 4f 43 4b 2c 20 31 29 3b 0d 0a 20 20 70 57 61 6c OCK, 1);.. pWal
1bd89 2d 3e 63 6b 70 74 4c 6f 63 6b 20 3d 20 30 3b 0d ->ckptLock = 0;.
1bd8a 0a 20 20 57 41 4c 54 52 41 43 45 28 28 22 57 41 . WALTRACE(("WA
1bd8b 4c 25 70 3a 20 63 68 65 63 6b 70 6f 69 6e 74 20 L%p: checkpoint
1bd8c 25 73 5c 6e 22 2c 20 70 57 61 6c 2c 20 72 63 20 %s\n", pWal, rc
1bd8d 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b ? "failed" : "ok
1bd8e 22 29 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 "));.. return (
1bd8f 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
1bd90 20 65 4d 6f 64 65 21 3d 65 4d 6f 64 65 32 20 3f eMode!=eMode2 ?
1bd91 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 SQLITE_BUSY : r
1bd92 63 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 52 65 74 c);..}..../* Ret
1bd93 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 74 6f urn the value to
1bd94 20 70 61 73 73 20 74 6f 20 61 20 73 71 6c 69 74 pass to a sqlit
1bd95 65 33 5f 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c e3_wal_hook call
1bd96 62 61 63 6b 2c 20 74 68 65 0d 0a 2a 2a 20 6e 75 back, the..** nu
1bd97 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 mber of frames i
1bd98 6e 20 74 68 65 20 57 41 4c 20 61 74 20 74 68 65 n the WAL at the
1bd99 20 70 6f 69 6e 74 20 6f 66 20 74 68 65 20 6c 61 point of the la
1bd9a 73 74 20 63 6f 6d 6d 69 74 20 73 69 6e 63 65 0d st commit since.
1bd9b 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 43 61 .** sqlite3WalCa
1bd9c 6c 6c 62 61 63 6b 28 29 20 77 61 73 20 63 61 6c llback() was cal
1bd9d 6c 65 64 2e 20 20 49 66 20 6e 6f 20 63 6f 6d 6d led. If no comm
1bd9e 69 74 73 20 68 61 76 65 20 6f 63 63 75 72 72 65 its have occurre
1bd9f 64 20 73 69 6e 63 65 0d 0a 2a 2a 20 74 68 65 20 d since..** the
1bda0 6c 61 73 74 20 63 61 6c 6c 2c 20 74 68 65 6e 20 last call, then
1bda1 72 65 74 75 72 6e 20 30 2e 0d 0a 2a 2f 0d 0a 53 return 0...*/..S
1bda2 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1bda3 74 20 73 71 6c 69 74 65 33 57 61 6c 43 61 6c 6c t sqlite3WalCall
1bda4 62 61 63 6b 28 57 61 6c 20 2a 70 57 61 6c 29 7b back(Wal *pWal){
1bda5 0d 0a 20 20 75 33 32 20 72 65 74 20 3d 20 30 3b .. u32 ret = 0;
1bda6 0d 0a 20 20 69 66 28 20 70 57 61 6c 20 29 7b 0d .. if( pWal ){.
1bda7 0a 20 20 20 20 72 65 74 20 3d 20 70 57 61 6c 2d . ret = pWal-
1bda8 3e 69 43 61 6c 6c 62 61 63 6b 3b 0d 0a 20 20 20 >iCallback;..
1bda9 20 70 57 61 6c 2d 3e 69 43 61 6c 6c 62 61 63 6b pWal->iCallback
1bdaa 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 = 0;.. }.. re
1bdab 74 75 72 6e 20 28 69 6e 74 29 72 65 74 3b 0d 0a turn (int)ret;..
1bdac 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 }..../*..** This
1bdad 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c function is cal
1bdae 6c 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 led to change th
1bdaf 65 20 57 41 4c 20 73 75 62 73 79 73 74 65 6d 20 e WAL subsystem
1bdb0 69 6e 74 6f 20 6f 72 20 6f 75 74 0d 0a 2a 2a 20 into or out..**
1bdb1 6f 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d of locking_mode=
1bdb2 45 58 43 4c 55 53 49 56 45 2e 0d 0a 2a 2a 0d 0a EXCLUSIVE...**..
1bdb3 2a 2a 20 49 66 20 6f 70 20 69 73 20 7a 65 72 6f ** If op is zero
1bdb4 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 , then attempt t
1bdb5 6f 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6c 6f o change from lo
1bdb6 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 cking_mode=EXCLU
1bdb7 53 49 56 45 0d 0a 2a 2a 20 69 6e 74 6f 20 6c 6f SIVE..** into lo
1bdb8 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 cking_mode=NORMA
1bdb9 4c 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 L. This means t
1bdba 68 61 74 20 77 65 20 6d 75 73 74 20 61 63 71 75 hat we must acqu
1bdbb 69 72 65 20 61 20 6c 6f 63 6b 0d 0a 2a 2a 20 6f ire a lock..** o
1bdbc 6e 20 74 68 65 20 70 57 61 6c 2d 3e 72 65 61 64 n the pWal->read
1bdbd 4c 6f 63 6b 20 62 79 74 65 2e 20 20 49 66 20 74 Lock byte. If t
1bdbe 68 65 20 57 41 4c 20 69 73 20 61 6c 72 65 61 64 he WAL is alread
1bdbf 79 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 y in locking_mod
1bdc0 65 3d 4e 4f 52 4d 41 4c 0d 0a 2a 2a 20 6f 72 20 e=NORMAL..** or
1bdc1 69 66 20 74 68 65 20 61 63 71 75 69 73 69 74 69 if the acquisiti
1bdc2 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 66 on of the lock f
1bdc3 61 69 6c 73 2c 20 74 68 65 6e 20 72 65 74 75 72 ails, then retur
1bdc4 6e 20 30 2e 20 20 49 66 20 74 68 65 0d 0a 2a 2a n 0. If the..**
1bdc5 20 74 72 61 6e 73 69 74 69 6f 6e 20 6f 75 74 20 transition out
1bdc6 6f 66 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 of exclusive-mod
1bdc7 65 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c e is successful,
1bdc8 20 72 65 74 75 72 6e 20 31 2e 20 20 54 68 69 73 return 1. This
1bdc9 0d 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6d ..** operation m
1bdca 75 73 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 ust occur while
1bdcb 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 the pager is sti
1bdcc 6c 6c 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 65 ll holding the e
1bdcd 78 63 6c 75 73 69 76 65 0d 0a 2a 2a 20 6c 6f 63 xclusive..** loc
1bdce 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 k on the main da
1bdcf 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a tabase file...**
1bdd0 0d 0a 2a 2a 20 49 66 20 6f 70 20 69 73 20 6f 6e ..** If op is on
1bdd1 65 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 66 e, then change f
1bdd2 72 6f 6d 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 rom locking_mode
1bdd3 3d 4e 4f 52 4d 41 4c 20 69 6e 74 6f 20 0d 0a 2a =NORMAL into ..*
1bdd4 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 * locking_mode=E
1bdd5 58 43 4c 55 53 49 56 45 2e 20 20 54 68 69 73 20 XCLUSIVE. This
1bdd6 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 means that the p
1bdd7 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 6b 20 6d 75 Wal->readLock mu
1bdd8 73 74 0d 0a 2a 2a 20 62 65 20 72 65 6c 65 61 73 st..** be releas
1bdd9 65 64 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 ed. Return 1 if
1bdda 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 the transition
1bddb 69 73 20 6d 61 64 65 20 61 6e 64 20 30 20 69 66 is made and 0 if
1bddc 20 74 68 65 0d 0a 2a 2a 20 57 41 4c 20 69 73 20 the..** WAL is
1bddd 61 6c 72 65 61 64 79 20 69 6e 20 65 78 63 6c 75 already in exclu
1bdde 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 sive-locking mod
1bddf 65 20 2d 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 e - meaning that
1bde0 20 74 68 69 73 0d 0a 2a 2a 20 72 6f 75 74 69 6e this..** routin
1bde1 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 e is a no-op. T
1bde2 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 61 6c he pager must al
1bde3 72 65 61 64 79 20 68 6f 6c 64 20 74 68 65 20 65 ready hold the e
1bde4 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0d 0a 2a xclusive lock..*
1bde5 2a 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 * on the main da
1bde6 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f tabase file befo
1bde7 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 re invoking this
1bde8 20 6f 70 65 72 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d operation...**.
1bde9 0a 2a 2a 20 49 66 20 6f 70 20 69 73 20 6e 65 67 .** If op is neg
1bdea 61 74 69 76 65 2c 20 74 68 65 6e 20 64 6f 20 61 ative, then do a
1bdeb 20 64 72 79 2d 72 75 6e 20 6f 66 20 74 68 65 20 dry-run of the
1bdec 6f 70 3d 3d 31 20 63 61 73 65 20 62 75 74 20 64 op==1 case but d
1bded 6f 0d 0a 2a 2a 20 6e 6f 74 20 61 63 74 75 61 6c o..** not actual
1bdee 6c 79 20 63 68 61 6e 67 65 20 61 6e 79 74 68 69 ly change anythi
1bdef 6e 67 2e 20 54 68 65 20 70 61 67 65 72 20 75 73 ng. The pager us
1bdf0 65 73 20 74 68 69 73 20 74 6f 20 73 65 65 20 69 es this to see i
1bdf1 66 20 69 74 0d 0a 2a 2a 20 73 68 6f 75 6c 64 20 f it..** should
1bdf2 61 63 71 75 69 72 65 20 74 68 65 20 64 61 74 61 acquire the data
1bdf3 62 61 73 65 20 65 78 63 6c 75 73 69 76 65 20 6c base exclusive l
1bdf4 6f 63 6b 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 ock prior to inv
1bdf5 6f 6b 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 6f 70 oking..** the op
1bdf6 3d 3d 31 20 63 61 73 65 2e 0d 0a 2a 2f 0d 0a 53 ==1 case...*/..S
1bdf7 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1bdf8 74 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c t sqlite3WalExcl
1bdf9 75 73 69 76 65 4d 6f 64 65 28 57 61 6c 20 2a 70 usiveMode(Wal *p
1bdfa 57 61 6c 2c 20 69 6e 74 20 6f 70 29 7b 0d 0a 20 Wal, int op){..
1bdfb 20 69 6e 74 20 72 63 3b 0d 0a 20 20 61 73 73 65 int rc;.. asse
1bdfc 72 74 28 20 70 57 61 6c 2d 3e 77 72 69 74 65 4c rt( pWal->writeL
1bdfd 6f 63 6b 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 ock==0 );.. ass
1bdfe 65 72 74 28 20 70 57 61 6c 2d 3e 65 78 63 6c 75 ert( pWal->exclu
1bdff 73 69 76 65 4d 6f 64 65 21 3d 57 41 4c 5f 48 45 siveMode!=WAL_HE
1be00 41 50 4d 45 4d 4f 52 59 5f 4d 4f 44 45 20 7c 7c APMEMORY_MODE ||
1be01 20 6f 70 3d 3d 2d 31 20 29 3b 0d 0a 0d 0a 20 20 op==-1 );....
1be02 2f 2a 20 70 57 61 6c 2d 3e 72 65 61 64 4c 6f 63 /* pWal->readLoc
1be03 6b 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74 k is usually set
1be04 2c 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 2d , but might be -
1be05 31 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 1 if there was a
1be06 20 0d 0a 20 20 2a 2a 20 70 72 69 6f 72 20 65 72 .. ** prior er
1be07 72 6f 72 20 77 68 69 6c 65 20 61 74 74 65 6d 70 ror while attemp
1be08 74 69 6e 67 20 74 6f 20 61 63 71 75 69 72 65 20 ting to acquire
1be09 61 72 65 20 72 65 61 64 2d 6c 6f 63 6b 2e 20 54 are read-lock. T
1be0a 68 69 73 20 63 61 6e 6e 6f 74 20 0d 0a 20 20 2a his cannot .. *
1be0b 2a 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 * happen if the
1be0c 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 63 connection is ac
1be0d 74 75 61 6c 6c 79 20 69 6e 20 65 78 63 6c 75 73 tually in exclus
1be0e 69 76 65 20 6d 6f 64 65 20 28 61 73 20 6e 6f 20 ive mode (as no
1be0f 78 53 68 6d 4c 6f 63 6b 0d 0a 20 20 2a 2a 20 6c xShmLock.. ** l
1be10 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20 69 ocks are taken i
1be11 6e 20 74 68 69 73 20 63 61 73 65 29 2e 20 4e 6f n this case). No
1be12 72 20 73 68 6f 75 6c 64 20 74 68 65 20 70 61 67 r should the pag
1be13 65 72 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 er attempt to..
1be14 20 2a 2a 20 75 70 67 72 61 64 65 20 74 6f 20 65 ** upgrade to e
1be15 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 66 6f xclusive-mode fo
1be16 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 llowing such an
1be17 65 72 72 6f 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 error... */..
1be18 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 72 65 assert( pWal->re
1be19 61 64 4c 6f 63 6b 3e 3d 30 20 7c 7c 20 70 57 61 adLock>=0 || pWa
1be1a 6c 2d 3e 6c 6f 63 6b 45 72 72 6f 72 20 29 3b 0d l->lockError );.
1be1b 0a 20 20 61 73 73 65 72 74 28 20 70 57 61 6c 2d . assert( pWal-
1be1c 3e 72 65 61 64 4c 6f 63 6b 3e 3d 30 20 7c 7c 20 >readLock>=0 ||
1be1d 28 6f 70 3c 3d 30 20 26 26 20 70 57 61 6c 2d 3e (op<=0 && pWal->
1be1e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3d 3d 30 exclusiveMode==0
1be1f 29 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 6f 70 ) );.... if( op
1be20 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 ==0 ){.. if(
1be21 70 57 61 6c 2d 3e 65 78 63 6c 75 73 69 76 65 4d pWal->exclusiveM
1be22 6f 64 65 20 29 7b 0d 0a 20 20 20 20 20 20 70 57 ode ){.. pW
1be23 61 6c 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 al->exclusiveMod
1be24 65 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 69 66 e = 0;.. if
1be25 28 20 77 61 6c 4c 6f 63 6b 53 68 61 72 65 64 28 ( walLockShared(
1be26 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 44 5f 4c pWal, WAL_READ_L
1be27 4f 43 4b 28 70 57 61 6c 2d 3e 72 65 61 64 4c 6f OCK(pWal->readLo
1be28 63 6b 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ck))!=SQLITE_OK
1be29 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 57 61 6c ){.. pWal
1be2a 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 ->exclusiveMode
1be2b 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 = 1;.. }..
1be2c 20 20 20 20 20 72 63 20 3d 20 70 57 61 6c 2d 3e rc = pWal->
1be2d 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3d 3d 30 exclusiveMode==0
1be2e 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
1be2f 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 /* Already
1be30 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d in locking_mode=
1be31 4e 4f 52 4d 41 4c 20 2a 2f 0d 0a 20 20 20 20 20 NORMAL */..
1be32 20 72 63 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d rc = 0;.. }.
1be33 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3e . }else if( op>
1be34 30 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 0 ){.. assert
1be35 28 20 70 57 61 6c 2d 3e 65 78 63 6c 75 73 69 76 ( pWal->exclusiv
1be36 65 4d 6f 64 65 3d 3d 30 20 29 3b 0d 0a 20 20 20 eMode==0 );..
1be37 20 61 73 73 65 72 74 28 20 70 57 61 6c 2d 3e 72 assert( pWal->r
1be38 65 61 64 4c 6f 63 6b 3e 3d 30 20 29 3b 0d 0a 20 eadLock>=0 );..
1be39 20 20 20 77 61 6c 55 6e 6c 6f 63 6b 53 68 61 72 walUnlockShar
1be3a 65 64 28 70 57 61 6c 2c 20 57 41 4c 5f 52 45 41 ed(pWal, WAL_REA
1be3b 44 5f 4c 4f 43 4b 28 70 57 61 6c 2d 3e 72 65 61 D_LOCK(pWal->rea
1be3c 64 4c 6f 63 6b 29 29 3b 0d 0a 20 20 20 20 70 57 dLock));.. pW
1be3d 61 6c 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 al->exclusiveMod
1be3e 65 20 3d 20 31 3b 0d 0a 20 20 20 20 72 63 20 3d e = 1;.. rc =
1be3f 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 1;.. }else{..
1be40 20 20 20 72 63 20 3d 20 70 57 61 6c 2d 3e 65 78 rc = pWal->ex
1be41 63 6c 75 73 69 76 65 4d 6f 64 65 3d 3d 30 3b 0d clusiveMode==0;.
1be42 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
1be43 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a c;..}..../* ..**
1be44 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 Return true if
1be45 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 the argument is
1be46 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 74 68 65 non-NULL and the
1be47 20 57 41 4c 20 6d 6f 64 75 6c 65 20 69 73 20 75 WAL module is u
1be48 73 69 6e 67 0d 0a 2a 2a 20 68 65 61 70 2d 6d 65 sing..** heap-me
1be49 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 77 61 6c mory for the wal
1be4a 2d 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 -index. Otherwis
1be4b 65 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 e, if the argume
1be4c 6e 74 20 69 73 20 4e 55 4c 4c 20 6f 72 20 74 68 nt is NULL or th
1be4d 65 0d 0a 2a 2a 20 57 41 4c 20 6d 6f 64 75 6c 65 e..** WAL module
1be4e 20 69 73 20 75 73 69 6e 67 20 73 68 61 72 65 64 is using shared
1be4f 2d 6d 65 6d 6f 72 79 2c 20 72 65 74 75 72 6e 20 -memory, return
1be50 66 61 6c 73 65 2e 20 0d 0a 2a 2f 0d 0a 53 51 4c false. ..*/..SQL
1be51 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
1be52 73 71 6c 69 74 65 33 57 61 6c 48 65 61 70 4d 65 sqlite3WalHeapMe
1be53 6d 6f 72 79 28 57 61 6c 20 2a 70 57 61 6c 29 7b mory(Wal *pWal){
1be54 0d 0a 20 20 72 65 74 75 72 6e 20 28 70 57 61 6c .. return (pWal
1be55 20 26 26 20 70 57 61 6c 2d 3e 65 78 63 6c 75 73 && pWal->exclus
1be56 69 76 65 4d 6f 64 65 3d 3d 57 41 4c 5f 48 45 41 iveMode==WAL_HEA
1be57 50 4d 45 4d 4f 52 59 5f 4d 4f 44 45 20 29 3b 0d PMEMORY_MODE );.
1be58 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 .}....#endif /*
1be59 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
1be5a 4d 49 54 5f 57 41 4c 20 2a 2f 0d 0a 0d 0a 2f 2a MIT_WAL */..../*
1be5b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e ************* En
1be5c 64 20 6f 66 20 77 61 6c 2e 63 20 2a 2a 2a 2a 2a d of wal.c *****
1be5d 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be5e 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be5f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f ************/../
1be60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 ************** B
1be61 65 67 69 6e 20 66 69 6c 65 20 62 74 6d 75 74 65 egin file btmute
1be62 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a x.c ************
1be63 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be64 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
1be65 2f 2a 0d 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 /*..** 2007 Augu
1be66 73 74 20 32 37 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 st 27..**..** Th
1be67 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
1be68 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
1be69 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
1be6a 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a . In place of..
1be6b 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 ** a legal notic
1be6c 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 e, here is a ble
1be6d 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 ssing:..**..**
1be6e 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f May you do goo
1be6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d d and not evil..
1be70 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 .** May you f
1be71 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
1be72 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
1be73 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
1be74 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 ..** May you
1be75 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
1be76 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
1be77 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a than you give...
1be78 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **..************
1be79 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be7a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be7b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be7c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a *************..*
1be7d 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 *..** This file
1be7e 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 contains code us
1be7f 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 ed to implement
1be80 6d 75 74 65 78 65 73 20 6f 6e 20 42 74 72 65 65 mutexes on Btree
1be81 20 6f 62 6a 65 63 74 73 2e 0d 0a 2a 2a 20 54 68 objects...** Th
1be82 69 73 20 63 6f 64 65 20 72 65 61 6c 6c 79 20 62 is code really b
1be83 65 6c 6f 6e 67 73 20 69 6e 20 62 74 72 65 65 2e elongs in btree.
1be84 63 2e 20 20 42 75 74 20 62 74 72 65 65 2e 63 20 c. But btree.c
1be85 69 73 20 67 65 74 74 69 6e 67 20 74 6f 6f 0d 0a is getting too..
1be86 2a 2a 20 62 69 67 20 61 6e 64 20 77 65 20 77 61 ** big and we wa
1be87 6e 74 20 74 6f 20 62 72 65 61 6b 20 69 74 20 64 nt to break it d
1be88 6f 77 6e 20 73 6f 6d 65 2e 20 20 54 68 69 73 20 own some. This
1be89 70 61 63 6b 61 67 65 64 20 73 65 65 6d 65 64 20 packaged seemed
1be8a 6c 69 6b 65 0d 0a 2a 2a 20 61 20 67 6f 6f 64 20 like..** a good
1be8b 62 72 65 61 6b 6f 75 74 2e 0d 0a 2a 2f 0d 0a 2f breakout...*/../
1be8c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 ************** I
1be8d 6e 63 6c 75 64 65 20 62 74 72 65 65 49 6e 74 2e nclude btreeInt.
1be8e 68 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 h in the middle
1be8f 6f 66 20 62 74 6d 75 74 65 78 2e 63 20 2a 2a 2a of btmutex.c ***
1be90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a *************/..
1be91 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 /**************
1be92 42 65 67 69 6e 20 66 69 6c 65 20 62 74 72 65 65 Begin file btree
1be93 49 6e 74 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a Int.h **********
1be94 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1be95 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d **************/.
1be96 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 34 20 41 70 72 ./*..** 2004 Apr
1be97 69 6c 20 36 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 il 6..**..** The
1be98 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
1be99 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
1be9a 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
1be9b 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a In place of..*
1be9c 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
1be9d 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
1be9e 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 sing:..**..**
1be9f 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
1bea0 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a and not evil...
1bea1 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 ** May you fi
1bea2 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
1bea3 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
1bea4 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d forgive others..
1bea5 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 .** May you s
1bea6 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 hare freely, nev
1bea7 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 er taking more t
1bea8 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a han you give...*
1bea9 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
1beaa 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1beab 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1beac 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1bead 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
1beae 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 This file imple
1beaf 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61 6c ments a external
1beb0 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64 61 (disk-based) da
1beb1 74 61 62 61 73 65 20 75 73 69 6e 67 20 42 54 72 tabase using BTr
1beb2 65 65 73 2e 0d 0a 2a 2a 20 46 6f 72 20 61 20 64 ees...** For a d
1beb3 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73 69 etailed discussi
1beb4 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72 65 on of BTrees, re
1beb5 66 65 72 20 74 6f 0d 0a 2a 2a 0d 0a 2a 2a 20 20 fer to..**..**
1beb6 20 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 Donald E. Knu
1beb7 74 68 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 th, THE ART OF C
1beb8 4f 4d 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d OMPUTER PROGRAMM
1beb9 49 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0d 0a ING, Volume 3:..
1beba 2a 2a 20 20 20 20 20 22 53 6f 72 74 69 6e 67 20 ** "Sorting
1bebb 41 6e 64 20 53 65 61 72 63 68 69 6e 67 22 2c 20 And Searching",
1bebc 70 61 67 65 73 20 34 37 33 2d 34 38 30 2e 20 41 pages 473-480. A
1bebd 64 64 69 73 6f 6e 2d 57 65 73 6c 65 79 0d 0a 2a ddison-Wesley..*
1bebe 2a 20 20 20 20 20 50 75 62 6c 69 73 68 69 6e 67 * Publishing
1bebf 20 43 6f 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e Company, Readin
1bec0 67 2c 20 4d 61 73 73 61 63 68 75 73 65 74 74 73 g, Massachusetts
1bec1 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 62 61 ...**..** The ba
1bec2 73 69 63 20 69 64 65 61 20 69 73 20 74 68 61 74 sic idea is that
1bec3 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 each page of th
1bec4 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 e file contains
1bec5 4e 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 65 N database..** e
1bec6 6e 74 72 69 65 73 20 61 6e 64 20 4e 2b 31 20 70 ntries and N+1 p
1bec7 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 70 61 ointers to subpa
1bec8 67 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2d ges...**..** -
1bec9 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1beca 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1becb 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1becc 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d ---------------.
1becd 0a 2a 2a 20 20 20 7c 20 20 50 74 72 28 30 29 20 .** | Ptr(0)
1bece 7c 20 4b 65 79 28 30 29 20 7c 20 50 74 72 28 31 | Key(0) | Ptr(1
1becf 29 20 7c 20 4b 65 79 28 31 29 20 7c 20 2e 2e 2e ) | Key(1) | ...
1bed0 20 7c 20 4b 65 79 28 4e 2d 31 29 20 7c 20 50 74 | Key(N-1) | Pt
1bed1 72 28 4e 29 20 7c 0d 0a 2a 2a 20 20 20 2d 2d 2d r(N) |..** ---
1bed2 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bed3 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bed4 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bed5 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2a -------------..*
1bed6 2a 0d 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 *..** All of the
1bed7 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 70 61 67 keys on the pag
1bed8 65 20 74 68 61 74 20 50 74 72 28 30 29 20 70 6f e that Ptr(0) po
1bed9 69 6e 74 73 20 74 6f 20 68 61 76 65 20 76 61 6c ints to have val
1beda 75 65 73 20 6c 65 73 73 0d 0a 2a 2a 20 74 68 61 ues less..** tha
1bedb 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c 6c 20 6f n Key(0). All o
1bedc 66 20 74 68 65 20 6b 65 79 73 20 6f 6e 20 70 61 f the keys on pa
1bedd 67 65 20 50 74 72 28 31 29 20 61 6e 64 20 69 74 ge Ptr(1) and it
1bede 73 20 73 75 62 70 61 67 65 73 20 68 61 76 65 0d s subpages have.
1bedf 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65 61 74 .** values great
1bee0 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29 20 61 er than Key(0) a
1bee1 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b 65 79 nd less than Key
1bee2 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 (1). All of the
1bee3 20 6b 65 79 73 0d 0a 2a 2a 20 6f 6e 20 50 74 72 keys..** on Ptr
1bee4 28 4e 29 20 61 6e 64 20 69 74 73 20 73 75 62 70 (N) and its subp
1bee5 61 67 65 73 20 68 61 76 65 20 76 61 6c 75 65 73 ages have values
1bee6 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4b 65 greater than Ke
1bee7 79 28 4e 2d 31 29 2e 20 20 41 6e 64 0d 0a 2a 2a y(N-1). And..**
1bee8 20 73 6f 20 66 6f 72 74 68 2e 0d 0a 2a 2a 0d 0a so forth...**..
1bee9 2a 2a 20 46 69 6e 64 69 6e 67 20 61 20 70 61 72 ** Finding a par
1beea 74 69 63 75 6c 61 72 20 6b 65 79 20 72 65 71 75 ticular key requ
1beeb 69 72 65 73 20 72 65 61 64 69 6e 67 20 4f 28 6c ires reading O(l
1beec 6f 67 28 4d 29 29 20 70 61 67 65 73 20 66 72 6f og(M)) pages fro
1beed 6d 20 74 68 65 20 0d 0a 2a 2a 20 64 69 73 6b 20 m the ..** disk
1beee 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e where M is the n
1beef 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
1bef0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0d 0a 2a in the tree...*
1bef1 2a 0d 0a 2a 2a 20 49 6e 20 74 68 69 73 20 69 6d *..** In this im
1bef2 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 plementation, a
1bef3 73 69 6e 67 6c 65 20 66 69 6c 65 20 63 61 6e 20 single file can
1bef4 68 6f 6c 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 hold one or more
1bef5 20 73 65 70 61 72 61 74 65 20 0d 0a 2a 2a 20 42 separate ..** B
1bef6 54 72 65 65 73 2e 20 20 45 61 63 68 20 42 54 72 Trees. Each BTr
1bef7 65 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 ee is identified
1bef8 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 6f 66 by the index of
1bef9 20 69 74 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 its root page.
1befa 20 54 68 65 0d 0a 2a 2a 20 6b 65 79 20 61 6e 64 The..** key and
1befb 20 64 61 74 61 20 66 6f 72 20 61 6e 79 20 65 6e data for any en
1befc 74 72 79 20 61 72 65 20 63 6f 6d 62 69 6e 65 64 try are combined
1befd 20 74 6f 20 66 6f 72 6d 20 74 68 65 20 22 70 61 to form the "pa
1befe 79 6c 6f 61 64 22 2e 20 20 41 0d 0a 2a 2a 20 66 yload". A..** f
1beff 69 78 65 64 20 61 6d 6f 75 6e 74 20 6f 66 20 70 ixed amount of p
1bf00 61 79 6c 6f 61 64 20 63 61 6e 20 62 65 20 63 61 ayload can be ca
1bf01 72 72 69 65 64 20 64 69 72 65 63 74 6c 79 20 6f rried directly o
1bf02 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0d 0a n the database..
1bf03 2a 2a 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 ** page. If the
1bf04 20 70 61 79 6c 6f 61 64 20 69 73 20 6c 61 72 67 payload is larg
1bf05 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 73 er than the pres
1bf06 65 74 20 61 6d 6f 75 6e 74 20 74 68 65 6e 20 73 et amount then s
1bf07 75 72 70 6c 75 73 0d 0a 2a 2a 20 62 79 74 65 73 urplus..** bytes
1bf08 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 6f are stored on o
1bf09 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 verflow pages.
1bf0a 54 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 The payload for
1bf0b 61 6e 20 65 6e 74 72 79 0d 0a 2a 2a 20 61 6e 64 an entry..** and
1bf0c 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 70 the preceding p
1bf0d 6f 69 6e 74 65 72 20 61 72 65 20 63 6f 6d 62 69 ointer are combi
1bf0e 6e 65 64 20 74 6f 20 66 6f 72 6d 20 61 20 22 43 ned to form a "C
1bf0f 65 6c 6c 22 2e 20 20 45 61 63 68 20 0d 0a 2a 2a ell". Each ..**
1bf10 20 70 61 67 65 20 68 61 73 20 61 20 73 6d 61 6c page has a smal
1bf11 6c 20 68 65 61 64 65 72 20 77 68 69 63 68 20 63 l header which c
1bf12 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 74 72 28 ontains the Ptr(
1bf13 4e 29 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 6f N) pointer and o
1bf14 74 68 65 72 0d 0a 2a 2a 20 69 6e 66 6f 72 6d 61 ther..** informa
1bf15 74 69 6f 6e 20 73 75 63 68 20 61 73 20 74 68 65 tion such as the
1bf16 20 73 69 7a 65 20 6f 66 20 6b 65 79 20 61 6e 64 size of key and
1bf17 20 64 61 74 61 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 data...**..** F
1bf18 4f 52 4d 41 54 20 44 45 54 41 49 4c 53 0d 0a 2a ORMAT DETAILS..*
1bf19 2a 0d 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 69 *..** The file i
1bf1a 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 70 s divided into p
1bf1b 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73 74 ages. The first
1bf1c 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64 20 page is called
1bf1d 70 61 67 65 20 31 2c 0d 0a 2a 2a 20 74 68 65 20 page 1,..** the
1bf1e 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32 second is page 2
1bf1f 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 , and so forth.
1bf20 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f A page number o
1bf21 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73 f zero indicates
1bf22 0d 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 ..** "no such pa
1bf23 67 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 ge". The page s
1bf24 69 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 20 70 ize can be any p
1bf25 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 ower of 2 betwee
1bf26 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e n 512 and 65536.
1bf27 0d 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 20 63 ..** Each page c
1bf28 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 62 an be either a b
1bf29 74 72 65 65 20 70 61 67 65 2c 20 61 20 66 72 65 tree page, a fre
1bf2a 65 6c 69 73 74 20 70 61 67 65 2c 20 61 6e 20 6f elist page, an o
1bf2b 76 65 72 66 6c 6f 77 0d 0a 2a 2a 20 70 61 67 65 verflow..** page
1bf2c 2c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d , or a pointer-m
1bf2d 61 70 20 70 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a ap page...**..**
1bf2e 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20 The first page
1bf2f 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65 is always a btre
1bf30 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 e page. The fir
1bf31 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20 st 100 bytes of
1bf32 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 70 61 the first..** pa
1bf33 67 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 ge contain a spe
1bf34 63 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 cial header (the
1bf35 20 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 "file header")
1bf36 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 that describes t
1bf37 68 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 54 68 65 he file...** The
1bf38 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 format of the f
1bf39 69 6c 65 20 68 65 61 64 65 72 20 69 73 20 61 73 ile header is as
1bf3a 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a follows:..**..*
1bf3b 2a 20 20 20 4f 46 46 53 45 54 20 20 20 53 49 5a * OFFSET SIZ
1bf3c 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e E DESCRIPTION
1bf3d 0d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 ..** 0
1bf3e 20 31 36 20 20 20 20 20 48 65 61 64 65 72 20 73 16 Header s
1bf3f 74 72 69 6e 67 3a 20 22 53 51 4c 69 74 65 20 66 tring: "SQLite f
1bf40 6f 72 6d 61 74 20 33 5c 30 30 30 22 0d 0a 2a 2a ormat 3\000"..**
1bf41 20 20 20 20 20 31 36 20 20 20 20 20 20 20 32 20 16 2
1bf42 20 20 20 20 50 61 67 65 20 73 69 7a 65 20 69 6e Page size in
1bf43 20 62 79 74 65 73 2e 20 20 0d 0a 2a 2a 20 20 20 bytes. ..**
1bf44 20 20 31 38 20 20 20 20 20 20 20 31 20 20 20 20 18 1
1bf45 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 77 72 69 File format wri
1bf46 74 65 20 76 65 72 73 69 6f 6e 0d 0a 2a 2a 20 20 te version..**
1bf47 20 20 20 31 39 20 20 20 20 20 20 20 31 20 20 20 19 1
1bf48 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 72 65 File format re
1bf49 61 64 20 76 65 72 73 69 6f 6e 0d 0a 2a 2a 20 20 ad version..**
1bf4a 20 20 20 32 30 20 20 20 20 20 20 20 31 20 20 20 20 1
1bf4b 20 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 Bytes of unuse
1bf4c 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 d space at the e
1bf4d 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 0d nd of each page.
1bf4e 0a 2a 2a 20 20 20 20 20 32 31 20 20 20 20 20 20 .** 21
1bf4f 20 31 20 20 20 20 20 4d 61 78 20 65 6d 62 65 64 1 Max embed
1bf50 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 ded payload frac
1bf51 74 69 6f 6e 0d 0a 2a 2a 20 20 20 20 20 32 32 20 tion..** 22
1bf52 20 20 20 20 20 20 31 20 20 20 20 20 4d 69 6e 20 1 Min
1bf53 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 embedded payload
1bf54 20 66 72 61 63 74 69 6f 6e 0d 0a 2a 2a 20 20 20 fraction..**
1bf55 20 20 32 33 20 20 20 20 20 20 20 31 20 20 20 20 23 1
1bf56 20 4d 69 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 Min leaf payloa
1bf57 64 20 66 72 61 63 74 69 6f 6e 0d 0a 2a 2a 20 20 d fraction..**
1bf58 20 20 20 32 34 20 20 20 20 20 20 20 34 20 20 20 24 4
1bf59 20 20 46 69 6c 65 20 63 68 61 6e 67 65 20 63 6f File change co
1bf5a 75 6e 74 65 72 0d 0a 2a 2a 20 20 20 20 20 32 38 unter..** 28
1bf5b 20 20 20 20 20 20 20 34 20 20 20 20 20 52 65 73 4 Res
1bf5c 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 erved for future
1bf5d 20 75 73 65 0d 0a 2a 2a 20 20 20 20 20 33 32 20 use..** 32
1bf5e 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72 73 4 Firs
1bf5f 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 0d t freelist page.
1bf60 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20 .** 36
1bf61 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 4 Number of
1bf62 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20 freelist pages
1bf63 69 6e 20 74 68 65 20 66 69 6c 65 0d 0a 2a 2a 20 in the file..**
1bf64 20 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20 40 60
1bf65 20 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 15 4-byte met
1bf66 61 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 a values passed
1bf67 74 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 to higher layers
1bf68 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 34 30 20 ..**..** 40
1bf69 20 20 20 20 20 20 34 20 20 20 20 20 53 63 68 65 4 Sche
1bf6a 6d 61 20 63 6f 6f 6b 69 65 0d 0a 2a 2a 20 20 20 ma cookie..**
1bf6b 20 20 34 34 20 20 20 20 20 20 20 34 20 20 20 20 44 4
1bf6c 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 6f 66 20 File format of
1bf6d 73 63 68 65 6d 61 20 6c 61 79 65 72 0d 0a 2a 2a schema layer..**
1bf6e 20 20 20 20 20 34 38 20 20 20 20 20 20 20 34 20 48 4
1bf6f 20 20 20 20 53 69 7a 65 20 6f 66 20 70 61 67 65 Size of page
1bf70 20 63 61 63 68 65 0d 0a 2a 2a 20 20 20 20 20 35 cache..** 5
1bf71 32 20 20 20 20 20 20 20 34 20 20 20 20 20 4c 61 2 4 La
1bf72 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 rgest root-page
1bf73 28 61 75 74 6f 2f 69 6e 63 72 5f 76 61 63 75 75 (auto/incr_vacuu
1bf74 6d 29 0d 0a 2a 2a 20 20 20 20 20 35 36 20 20 20 m)..** 56
1bf75 20 20 20 20 34 20 20 20 20 20 31 3d 55 54 46 2d 4 1=UTF-
1bf76 38 20 32 3d 55 54 46 31 36 6c 65 20 33 3d 55 54 8 2=UTF16le 3=UT
1bf77 46 31 36 62 65 0d 0a 2a 2a 20 20 20 20 20 36 30 F16be..** 60
1bf78 20 20 20 20 20 20 20 34 20 20 20 20 20 55 73 65 4 Use
1bf79 72 20 76 65 72 73 69 6f 6e 0d 0a 2a 2a 20 20 20 r version..**
1bf7a 20 20 36 34 20 20 20 20 20 20 20 34 20 20 20 20 64 4
1bf7b 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 Incremental vac
1bf7c 75 75 6d 20 6d 6f 64 65 0d 0a 2a 2a 20 20 20 20 uum mode..**
1bf7d 20 36 38 20 20 20 20 20 20 20 34 20 20 20 20 20 68 4
1bf7e 75 6e 75 73 65 64 0d 0a 2a 2a 20 20 20 20 20 37 unused..** 7
1bf7f 32 20 20 20 20 20 20 20 34 20 20 20 20 20 75 6e 2 4 un
1bf80 75 73 65 64 0d 0a 2a 2a 20 20 20 20 20 37 36 20 used..** 76
1bf81 20 20 20 20 20 20 34 20 20 20 20 20 75 6e 75 73 4 unus
1bf82 65 64 0d 0a 2a 2a 0d 0a 2a 2a 20 41 6c 6c 20 6f ed..**..** All o
1bf83 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 f the integer va
1bf84 6c 75 65 73 20 61 72 65 20 62 69 67 2d 65 6e 64 lues are big-end
1bf85 69 61 6e 20 28 6d 6f 73 74 20 73 69 67 6e 69 66 ian (most signif
1bf86 69 63 61 6e 74 20 62 79 74 65 20 66 69 72 73 74 icant byte first
1bf87 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 )...**..** The f
1bf88 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 ile change count
1bf89 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 er is incremente
1bf8a 64 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 d when the datab
1bf8b 61 73 65 20 69 73 20 63 68 61 6e 67 65 64 0d 0a ase is changed..
1bf8c 2a 2a 20 54 68 69 73 20 63 6f 75 6e 74 65 72 20 ** This counter
1bf8d 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f allows other pro
1bf8e 63 65 73 73 65 73 20 74 6f 20 6b 6e 6f 77 20 77 cesses to know w
1bf8f 68 65 6e 20 74 68 65 20 66 69 6c 65 20 68 61 73 hen the file has
1bf90 20 63 68 61 6e 67 65 64 0d 0a 2a 2a 20 61 6e 64 changed..** and
1bf91 20 74 68 75 73 20 77 68 65 6e 20 74 68 65 79 20 thus when they
1bf92 6e 65 65 64 20 74 6f 20 66 6c 75 73 68 20 74 68 need to flush th
1bf93 65 69 72 20 63 61 63 68 65 2e 0d 0a 2a 2a 0d 0a eir cache...**..
1bf94 2a 2a 20 54 68 65 20 6d 61 78 20 65 6d 62 65 64 ** The max embed
1bf95 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 ded payload frac
1bf96 74 69 6f 6e 20 69 73 20 74 68 65 20 61 6d 6f 75 tion is the amou
1bf97 6e 74 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 nt of the total
1bf98 75 73 61 62 6c 65 0d 0a 2a 2a 20 73 70 61 63 65 usable..** space
1bf99 20 69 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 in a page that
1bf9a 63 61 6e 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 can be consumed
1bf9b 62 79 20 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c by a single cell
1bf9c 20 66 6f 72 20 73 74 61 6e 64 61 72 64 0d 0a 2a for standard..*
1bf9d 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e 2d 4c 45 * B-tree (non-LE
1bf9e 41 46 44 41 54 41 29 20 74 61 62 6c 65 73 2e 20 AFDATA) tables.
1bf9f 20 41 20 76 61 6c 75 65 20 6f 66 20 32 35 35 20 A value of 255
1bfa0 6d 65 61 6e 73 20 31 30 30 25 2e 20 20 54 68 65 means 100%. The
1bfa1 20 64 65 66 61 75 6c 74 0d 0a 2a 2a 20 69 73 20 default..** is
1bfa2 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d 61 78 to limit the max
1bfa3 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 73 imum cell size s
1bfa4 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 o that at least
1bfa5 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 4 cells will fit
1bfa6 0d 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67 65 ..** on one page
1bfa7 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66 61 . Thus the defa
1bfa8 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65 64 ult max embedded
1bfa9 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f payload fractio
1bfaa 6e 20 69 73 20 36 34 2e 0d 0a 2a 2a 0d 0a 2a 2a n is 64...**..**
1bfab 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 If the payload
1bfac 66 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 for a cell is la
1bfad 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 rger than the ma
1bfae 78 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 x payload, then
1bfaf 65 78 74 72 61 0d 0a 2a 2a 20 70 61 79 6c 6f 61 extra..** payloa
1bfb0 64 20 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 d is spilled to
1bfb1 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 overflow pages.
1bfb2 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f Once an overflo
1bfb3 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 w page is alloca
1bfb4 74 65 64 2c 0d 0a 2a 2a 20 61 73 20 6d 61 6e 79 ted,..** as many
1bfb5 20 62 79 74 65 73 20 61 73 20 70 6f 73 73 69 62 bytes as possib
1bfb6 6c 65 20 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 le are moved int
1bfb7 6f 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 o the overflow p
1bfb8 61 67 65 73 20 77 69 74 68 6f 75 74 20 6c 65 74 ages without let
1bfb9 74 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 63 65 6c ting..** the cel
1bfba 6c 20 73 69 7a 65 20 64 72 6f 70 20 62 65 6c 6f l size drop belo
1bfbb 77 20 74 68 65 20 6d 69 6e 20 65 6d 62 65 64 64 w the min embedd
1bfbc 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 ed payload fract
1bfbd 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ion...**..** The
1bfbe 20 6d 69 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 min leaf payloa
1bfbf 64 20 66 72 61 63 74 69 6f 6e 20 69 73 20 6c 69 d fraction is li
1bfc0 6b 65 20 74 68 65 20 6d 69 6e 20 65 6d 62 65 64 ke the min embed
1bfc1 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 ded payload frac
1bfc2 74 69 6f 6e 0d 0a 2a 2a 20 65 78 63 65 70 74 20 tion..** except
1bfc3 74 68 61 74 20 69 74 20 61 70 70 6c 69 65 73 20 that it applies
1bfc4 74 6f 20 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e to leaf nodes in
1bfc5 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 a LEAFDATA tree
1bfc6 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 0d 0a . The maximum..
1bfc7 2a 2a 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 ** payload fract
1bfc8 69 6f 6e 20 66 6f 72 20 61 20 4c 45 41 46 44 41 ion for a LEAFDA
1bfc9 54 41 20 74 72 65 65 20 69 73 20 61 6c 77 61 79 TA tree is alway
1bfca 73 20 31 30 30 25 20 28 6f 72 20 32 35 35 29 20 s 100% (or 255)
1bfcb 61 6e 64 20 69 74 0d 0a 2a 2a 20 6e 6f 74 20 73 and it..** not s
1bfcc 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 pecified in the
1bfcd 68 65 61 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 header...**..**
1bfce 45 61 63 68 20 62 74 72 65 65 20 70 61 67 65 73 Each btree pages
1bfcf 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f is divided into
1bfd0 20 74 68 72 65 65 20 73 65 63 74 69 6f 6e 73 3a three sections:
1bfd1 20 20 54 68 65 20 68 65 61 64 65 72 2c 20 74 68 The header, th
1bfd2 65 0d 0a 2a 2a 20 63 65 6c 6c 20 70 6f 69 6e 74 e..** cell point
1bfd3 65 72 20 61 72 72 61 79 2c 20 61 6e 64 20 74 68 er array, and th
1bfd4 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 e cell content a
1bfd5 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c 73 rea. Page 1 als
1bfd6 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74 65 o has a 100-byte
1bfd7 0d 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 ..** file header
1bfd8 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66 that occurs bef
1bfd9 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61 ore the page hea
1bfda 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 der...**..**
1bfdb 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d |-------------
1bfdc 2d 2d 2d 7c 0d 0a 2a 2a 20 20 20 20 20 20 7c 20 ---|..** |
1bfdd 66 69 6c 65 20 68 65 61 64 65 72 20 20 20 20 7c file header |
1bfde 20 20 20 31 30 30 20 62 79 74 65 73 2e 20 20 50 100 bytes. P
1bfdf 61 67 65 20 31 20 6f 6e 6c 79 2e 0d 0a 2a 2a 20 age 1 only...**
1bfe0 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d |----------
1bfe1 2d 2d 2d 2d 2d 2d 7c 0d 0a 2a 2a 20 20 20 20 20 ------|..**
1bfe2 20 7c 20 70 61 67 65 20 68 65 61 64 65 72 20 20 | page header
1bfe3 20 20 7c 20 20 20 38 20 62 79 74 65 73 20 66 6f | 8 bytes fo
1bfe4 72 20 6c 65 61 76 65 73 2e 20 20 31 32 20 62 79 r leaves. 12 by
1bfe5 74 65 73 20 66 6f 72 20 69 6e 74 65 72 69 6f 72 tes for interior
1bfe6 20 6e 6f 64 65 73 0d 0a 2a 2a 20 20 20 20 20 20 nodes..**
1bfe7 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d |---------------
1bfe8 2d 7c 0d 0a 2a 2a 20 20 20 20 20 20 7c 20 63 65 -|..** | ce
1bfe9 6c 6c 20 70 6f 69 6e 74 65 72 20 20 20 7c 20 20 ll pointer |
1bfea 20 7c 20 20 32 20 62 79 74 65 73 20 70 65 72 20 | 2 bytes per
1bfeb 63 65 6c 6c 2e 20 20 53 6f 72 74 65 64 20 6f 72 cell. Sorted or
1bfec 64 65 72 2e 0d 0a 2a 2a 20 20 20 20 20 20 7c 20 der...** |
1bfed 61 72 72 61 79 20 20 20 20 20 20 20 20 20 20 7c array |
1bfee 20 20 20 7c 20 20 47 72 6f 77 73 20 64 6f 77 6e | Grows down
1bfef 77 61 72 64 0d 0a 2a 2a 20 20 20 20 20 20 7c 20 ward..** |
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c |
1bff1 20 20 20 76 0d 0a 2a 2a 20 20 20 20 20 20 7c 2d v..** |-
1bff2 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c ---------------|
1bff3 0d 0a 2a 2a 20 20 20 20 20 20 7c 20 75 6e 61 6c ..** | unal
1bff4 6c 6f 63 61 74 65 64 20 20 20 20 7c 0d 0a 2a 2a located |..**
1bff5 20 20 20 20 20 20 7c 20 73 70 61 63 65 20 20 20 | space
1bff6 20 20 20 20 20 20 20 7c 0d 0a 2a 2a 20 20 20 20 |..**
1bff7 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d |-------------
1bff8 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f 77 73 20 ---| ^ Grows
1bff9 75 70 77 61 72 64 73 0d 0a 2a 2a 20 20 20 20 20 upwards..**
1bffa 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 | cell content
1bffb 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74 72 61 | | Arbitra
1bffc 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72 73 70 ry order intersp
1bffd 65 72 73 65 64 20 77 69 74 68 20 66 72 65 65 62 ersed with freeb
1bffe 6c 6f 63 6b 73 2e 0d 0a 2a 2a 20 20 20 20 20 20 locks...**
1bfff 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20 20 | area
1c000 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65 65 | | and free
1c001 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74 73 space fragments
1c002 2e 0d 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d ...** |----
1c003 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0d 0a 2a ------------|..*
1c004 2a 0d 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 *..** The page h
1c005 65 61 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b eaders looks lik
1c006 65 20 74 68 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 e this:..**..**
1c007 20 20 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 OFFSET SIZE
1c008 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0d DESCRIPTION.
1c009 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 .** 0
1c00a 20 31 20 20 20 20 20 20 46 6c 61 67 73 2e 20 31 1 Flags. 1
1c00b 3a 20 69 6e 74 6b 65 79 2c 20 32 3a 20 7a 65 72 : intkey, 2: zer
1c00c 6f 64 61 74 61 2c 20 34 3a 20 6c 65 61 66 64 61 odata, 4: leafda
1c00d 74 61 2c 20 38 3a 20 6c 65 61 66 0d 0a 2a 2a 20 ta, 8: leaf..**
1c00e 20 20 20 20 20 31 20 20 20 20 20 20 20 32 20 20 1 2
1c00f 20 20 20 20 62 79 74 65 20 6f 66 66 73 65 74 20 byte offset
1c010 74 6f 20 74 68 65 20 66 69 72 73 74 20 66 72 65 to the first fre
1c011 65 62 6c 6f 63 6b 0d 0a 2a 2a 20 20 20 20 20 20 eblock..**
1c012 33 20 20 20 20 20 20 20 32 20 20 20 20 20 20 6e 3 2 n
1c013 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f umber of cells o
1c014 6e 20 74 68 69 73 20 70 61 67 65 0d 0a 2a 2a 20 n this page..**
1c015 20 20 20 20 20 35 20 20 20 20 20 20 20 32 20 20 5 2
1c016 20 20 20 20 66 69 72 73 74 20 62 79 74 65 20 6f first byte o
1c017 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 f the cell conte
1c018 6e 74 20 61 72 65 61 0d 0a 2a 2a 20 20 20 20 20 nt area..**
1c019 20 37 20 20 20 20 20 20 20 31 20 20 20 20 20 20 7 1
1c01a 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 number of fragme
1c01b 6e 74 65 64 20 66 72 65 65 20 62 79 74 65 73 0d nted free bytes.
1c01c 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 .** 8
1c01d 20 34 20 20 20 20 20 20 52 69 67 68 74 20 63 68 4 Right ch
1c01e 69 6c 64 20 28 74 68 65 20 50 74 72 28 4e 29 20 ild (the Ptr(N)
1c01f 76 61 6c 75 65 29 2e 20 20 4f 6d 69 74 74 65 64 value). Omitted
1c020 20 6f 6e 20 6c 65 61 76 65 73 2e 0d 0a 2a 2a 0d on leaves...**.
1c021 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 64 65 .** The flags de
1c022 66 69 6e 65 20 74 68 65 20 66 6f 72 6d 61 74 20 fine the format
1c023 6f 66 20 74 68 69 73 20 62 74 72 65 65 20 70 61 of this btree pa
1c024 67 65 2e 20 20 54 68 65 20 6c 65 61 66 20 66 6c ge. The leaf fl
1c025 61 67 20 6d 65 61 6e 73 20 74 68 61 74 0d 0a 2a ag means that..*
1c026 2a 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 * this page has
1c027 6e 6f 20 63 68 69 6c 64 72 65 6e 2e 20 20 54 68 no children. Th
1c028 65 20 7a 65 72 6f 64 61 74 61 20 66 6c 61 67 20 e zerodata flag
1c029 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 means that this
1c02a 70 61 67 65 20 63 61 72 72 69 65 73 0d 0a 2a 2a page carries..**
1c02b 20 6f 6e 6c 79 20 6b 65 79 73 20 61 6e 64 20 6e only keys and n
1c02c 6f 20 64 61 74 61 2e 20 20 54 68 65 20 69 6e 74 o data. The int
1c02d 6b 65 79 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 key flag means t
1c02e 68 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 61 hat the key is a
1c02f 20 69 6e 74 65 67 65 72 0d 0a 2a 2a 20 77 68 69 integer..** whi
1c030 63 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 ch is stored in
1c031 74 68 65 20 6b 65 79 20 73 69 7a 65 20 65 6e 74 the key size ent
1c032 72 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 68 ry of the cell h
1c033 65 61 64 65 72 20 72 61 74 68 65 72 20 74 68 61 eader rather tha
1c034 6e 20 69 6e 0d 0a 2a 2a 20 74 68 65 20 70 61 79 n in..** the pay
1c035 6c 6f 61 64 20 61 72 65 61 2e 0d 0a 2a 2a 0d 0a load area...**..
1c036 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e ** The cell poin
1c037 74 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73 ter array begins
1c038 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79 on the first by
1c039 74 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67 te after the pag
1c03a 65 20 68 65 61 64 65 72 2e 0d 0a 2a 2a 20 54 68 e header...** Th
1c03b 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 e cell pointer a
1c03c 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 rray contains ze
1c03d 72 6f 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 ro or more 2-byt
1c03e 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 e numbers which
1c03f 61 72 65 0d 0a 2a 2a 20 6f 66 66 73 65 74 73 20 are..** offsets
1c040 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 from the beginni
1c041 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 ng of the page t
1c042 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 o the cell conte
1c043 6e 74 20 69 6e 20 74 68 65 20 63 65 6c 6c 0d 0a nt in the cell..
1c044 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e ** content area.
1c045 20 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 The cell point
1c046 65 72 73 20 6f 63 63 75 72 20 69 6e 20 73 6f 72 ers occur in sor
1c047 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 65 20 ted order. The
1c048 73 79 73 74 65 6d 20 73 74 72 69 76 65 73 0d 0a system strives..
1c049 2a 2a 20 74 6f 20 6b 65 65 70 20 66 72 65 65 20 ** to keep free
1c04a 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 space after the
1c04b 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 last cell pointe
1c04c 72 20 73 6f 20 74 68 61 74 20 6e 65 77 20 63 65 r so that new ce
1c04d 6c 6c 73 20 63 61 6e 0d 0a 2a 2a 20 62 65 20 65 lls can..** be e
1c04e 61 73 69 6c 79 20 61 64 64 65 64 20 77 69 74 68 asily added with
1c04f 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 65 out having to de
1c050 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 fragment the pag
1c051 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 65 6c 6c 20 e...**..** Cell
1c052 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65 content is store
1c053 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e d at the very en
1c054 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e d of the page an
1c055 64 20 67 72 6f 77 73 20 74 6f 77 61 72 64 20 74 d grows toward t
1c056 68 65 0d 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 he..** beginning
1c057 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0d 0a 2a of the page...*
1c058 2a 0d 0a 2a 2a 20 55 6e 75 73 65 64 20 73 70 61 *..** Unused spa
1c059 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 63 65 ce within the ce
1c05a 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 ll content area
1c05b 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 is collected int
1c05c 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 o a linked list
1c05d 6f 66 0d 0a 2a 2a 20 66 72 65 65 62 6c 6f 63 6b of..** freeblock
1c05e 73 2e 20 20 45 61 63 68 20 66 72 65 65 62 6c 6f s. Each freeblo
1c05f 63 6b 20 69 73 20 61 74 20 6c 65 61 73 74 20 34 ck is at least 4
1c060 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 bytes in size.
1c061 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 The byte offset
1c062 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 ..** to the firs
1c063 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 67 t freeblock is g
1c064 69 76 65 6e 20 69 6e 20 74 68 65 20 68 65 61 64 iven in the head
1c065 65 72 2e 20 20 46 72 65 65 62 6c 6f 63 6b 73 20 er. Freeblocks
1c066 6f 63 63 75 72 20 69 6e 0d 0a 2a 2a 20 69 6e 63 occur in..** inc
1c067 72 65 61 73 69 6e 67 20 6f 72 64 65 72 2e 20 20 reasing order.
1c068 42 65 63 61 75 73 65 20 61 20 66 72 65 65 62 6c Because a freebl
1c069 6f 63 6b 20 6d 75 73 74 20 62 65 20 61 74 20 6c ock must be at l
1c06a 65 61 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 east 4 bytes in
1c06b 73 69 7a 65 2c 0d 0a 2a 2a 20 61 6e 79 20 67 72 size,..** any gr
1c06c 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65 77 65 oup of 3 or fewe
1c06d 72 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 69 r unused bytes i
1c06e 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 n the cell conte
1c06f 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74 0d 0a nt area cannot..
1c070 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 ** exist on the
1c071 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e 2e freeblock chain.
1c072 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20 6f A group of 3 o
1c073 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79 74 r fewer free byt
1c074 65 73 20 69 73 20 63 61 6c 6c 65 64 0d 0a 2a 2a es is called..**
1c075 20 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68 a fragment. Th
1c076 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f e total number o
1c077 66 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66 f bytes in all f
1c078 72 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f ragments is reco
1c079 72 64 65 64 2e 0d 0a 2a 2a 20 69 6e 20 74 68 65 rded...** in the
1c07a 20 70 61 67 65 20 68 65 61 64 65 72 20 61 74 20 page header at
1c07b 6f 66 66 73 65 74 20 37 2e 0d 0a 2a 2a 0d 0a 2a offset 7...**..*
1c07c 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53 * SIZE DES
1c07d 43 52 49 50 54 49 4f 4e 0d 0a 2a 2a 20 20 20 20 CRIPTION..**
1c07e 20 20 32 20 20 20 20 20 42 79 74 65 20 6f 66 66 2 Byte off
1c07f 73 65 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 set of the next
1c080 66 72 65 65 62 6c 6f 63 6b 0d 0a 2a 2a 20 20 20 freeblock..**
1c081 20 20 20 32 20 20 20 20 20 42 79 74 65 73 20 69 2 Bytes i
1c082 6e 20 74 68 69 73 20 66 72 65 65 62 6c 6f 63 6b n this freeblock
1c083 0d 0a 2a 2a 0d 0a 2a 2a 20 43 65 6c 6c 73 20 61 ..**..** Cells a
1c084 72 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20 6c re of variable l
1c085 65 6e 67 74 68 2e 20 20 43 65 6c 6c 73 20 61 72 ength. Cells ar
1c086 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 e stored in the
1c087 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 cell content are
1c088 61 20 61 74 0d 0a 2a 2a 20 74 68 65 20 65 6e 64 a at..** the end
1c089 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 50 of the page. P
1c08a 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 63 ointers to the c
1c08b 65 6c 6c 73 20 61 72 65 20 69 6e 20 74 68 65 20 ells are in the
1c08c 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 cell pointer arr
1c08d 61 79 0d 0a 2a 2a 20 74 68 61 74 20 69 6d 6d 65 ay..** that imme
1c08e 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 diately follows
1c08f 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e the page header.
1c090 20 20 43 65 6c 6c 73 20 69 73 20 6e 6f 74 20 6e Cells is not n
1c091 65 63 65 73 73 61 72 69 6c 79 0d 0a 2a 2a 20 63 ecessarily..** c
1c092 6f 6e 74 69 67 75 6f 75 73 20 6f 72 20 69 6e 20 ontiguous or in
1c093 6f 72 64 65 72 2c 20 62 75 74 20 63 65 6c 6c 20 order, but cell
1c094 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e pointers are con
1c095 74 69 67 75 6f 75 73 20 61 6e 64 20 69 6e 20 6f tiguous and in o
1c096 72 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 65 rder...**..** Ce
1c097 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 6b 65 73 ll content makes
1c098 20 75 73 65 20 6f 66 20 76 61 72 69 61 62 6c 65 use of variable
1c099 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 length integers
1c09a 2e 20 20 41 20 76 61 72 69 61 62 6c 65 0d 0a 2a . A variable..*
1c09b 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 * length integer
1c09c 20 69 73 20 31 20 74 6f 20 39 20 62 79 74 65 73 is 1 to 9 bytes
1c09d 20 77 68 65 72 65 20 74 68 65 20 6c 6f 77 65 72 where the lower
1c09e 20 37 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 7 bits of each
1c09f 0d 0a 2a 2a 20 62 79 74 65 20 61 72 65 20 75 73 ..** byte are us
1c0a0 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 ed. The integer
1c0a1 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c consists of all
1c0a2 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76 65 bytes that have
1c0a3 20 62 69 74 20 38 20 73 65 74 20 61 6e 64 0d 0a bit 8 set and..
1c0a4 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 ** the first byt
1c0a5 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c 65 e with bit 8 cle
1c0a6 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73 69 ar. The most si
1c0a7 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 6f gnificant byte o
1c0a8 66 20 74 68 65 20 69 6e 74 65 67 65 72 0d 0a 2a f the integer..*
1c0a9 2a 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e * appears first.
1c0aa 20 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e A variable-len
1c0ab 67 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20 gth integer may
1c0ac 6e 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e not be more than
1c0ad 20 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0d 0a 9 bytes long...
1c0ae 2a 2a 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 ** As a special
1c0af 63 61 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 case, all 8 byte
1c0b0 73 20 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 s of the 9th byt
1c0b1 65 20 61 72 65 20 75 73 65 64 20 61 73 20 64 61 e are used as da
1c0b2 74 61 2e 20 20 54 68 69 73 0d 0a 2a 2a 20 61 6c ta. This..** al
1c0b3 6c 6f 77 73 20 61 20 36 34 2d 62 69 74 20 69 6e lows a 64-bit in
1c0b4 74 65 67 65 72 20 74 6f 20 62 65 20 65 6e 63 6f teger to be enco
1c0b5 64 65 64 20 69 6e 20 39 20 62 79 74 65 73 2e 0d ded in 9 bytes..
1c0b6 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 30 78 30 30 20 .**..** 0x00
1c0b7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c0b8 20 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 becomes 0x
1c0b9 30 30 30 30 30 30 30 30 0d 0a 2a 2a 20 20 20 20 00000000..**
1c0ba 30 78 37 66 20 20 20 20 20 20 20 20 20 20 20 20 0x7f
1c0bb 20 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 become
1c0bc 73 20 20 30 78 30 30 30 30 30 30 37 66 0d 0a 2a s 0x0000007f..*
1c0bd 2a 20 20 20 20 30 78 38 31 20 30 78 30 30 20 20 * 0x81 0x00
1c0be 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 b
1c0bf 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30 30 ecomes 0x000000
1c0c0 38 30 0d 0a 2a 2a 20 20 20 20 30 78 38 32 20 30 80..** 0x82 0
1c0c1 78 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 x00
1c0c2 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30 becomes 0x0
1c0c3 30 30 30 30 31 30 30 0d 0a 2a 2a 20 20 20 20 30 0000100..** 0
1c0c4 78 38 30 20 30 78 37 66 20 20 20 20 20 20 20 20 x80 0x7f
1c0c5 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 becomes
1c0c6 20 20 30 78 30 30 30 30 30 30 37 66 0d 0a 2a 2a 0x0000007f..**
1c0c7 20 20 20 20 30 78 38 61 20 30 78 39 31 20 30 78 0x8a 0x91 0x
1c0c8 64 31 20 30 78 61 63 20 30 78 37 38 20 20 62 65 d1 0xac 0x78 be
1c0c9 63 6f 6d 65 73 20 20 30 78 31 32 33 34 35 36 37 comes 0x1234567
1c0ca 38 0d 0a 2a 2a 20 20 20 20 30 78 38 31 20 30 78 8..** 0x81 0x
1c0cb 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78 30 81 0x81 0x81 0x0
1c0cc 31 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31 30 1 becomes 0x10
1c0cd 32 30 34 30 38 31 0d 0a 2a 2a 0d 0a 2a 2a 20 56 204081..**..** V
1c0ce 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 ariable length i
1c0cf 6e 74 65 67 65 72 73 20 61 72 65 20 75 73 65 64 ntegers are used
1c0d0 20 66 6f 72 20 72 6f 77 69 64 73 20 61 6e 64 20 for rowids and
1c0d1 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 to hold the numb
1c0d2 65 72 20 6f 66 0d 0a 2a 2a 20 62 79 74 65 73 20 er of..** bytes
1c0d3 6f 66 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 of key and data
1c0d4 69 6e 20 61 20 62 74 72 65 65 20 63 65 6c 6c 2e in a btree cell.
1c0d5 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 6f 6e ..**..** The con
1c0d6 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20 6c tent of a cell l
1c0d7 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0d ooks like this:.
1c0d8 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 53 49 5a 45 20 .**..** SIZE
1c0d9 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0d 0a DESCRIPTION..
1c0da 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 50 61 ** 4 Pa
1c0db 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 ge number of the
1c0dc 20 6c 65 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 left child. Omi
1c0dd 74 74 65 64 20 69 66 20 6c 65 61 66 20 66 6c 61 tted if leaf fla
1c0de 67 20 69 73 20 73 65 74 2e 0d 0a 2a 2a 20 20 20 g is set...**
1c0df 20 20 76 61 72 20 20 20 20 4e 75 6d 62 65 72 20 var Number
1c0e0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 of bytes of data
1c0e1 2e 20 4f 6d 69 74 74 65 64 20 69 66 20 74 68 65 . Omitted if the
1c0e2 20 7a 65 72 6f 64 61 74 61 20 66 6c 61 67 20 69 zerodata flag i
1c0e3 73 20 73 65 74 2e 0d 0a 2a 2a 20 20 20 20 20 76 s set...** v
1c0e4 61 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 ar Number of
1c0e5 62 79 74 65 73 20 6f 66 20 6b 65 79 2e 20 4f 72 bytes of key. Or
1c0e6 20 74 68 65 20 6b 65 79 20 69 74 73 65 6c 66 20 the key itself
1c0e7 69 66 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 69 if intkey flag i
1c0e8 73 20 73 65 74 2e 0d 0a 2a 2a 20 20 20 20 20 20 s set...**
1c0e9 2a 20 20 20 20 20 50 61 79 6c 6f 61 64 0d 0a 2a * Payload..*
1c0ea 2a 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72 * 4 Fir
1c0eb 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6f st page of the o
1c0ec 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 20 verflow chain.
1c0ed 4f 6d 69 74 74 65 64 20 69 66 20 6e 6f 20 6f 76 Omitted if no ov
1c0ee 65 72 66 6c 6f 77 0d 0a 2a 2a 0d 0a 2a 2a 20 4f erflow..**..** O
1c0ef 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 66 6f verflow pages fo
1c0f0 72 6d 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 rm a linked list
1c0f1 2e 20 20 45 61 63 68 20 70 61 67 65 20 65 78 63 . Each page exc
1c0f2 65 70 74 20 74 68 65 20 6c 61 73 74 20 69 73 20 ept the last is
1c0f3 63 6f 6d 70 6c 65 74 65 6c 79 0d 0a 2a 2a 20 66 completely..** f
1c0f4 69 6c 6c 65 64 20 77 69 74 68 20 64 61 74 61 20 illed with data
1c0f5 28 70 61 67 65 73 69 7a 65 20 2d 20 34 20 62 79 (pagesize - 4 by
1c0f6 74 65 73 29 2e 20 20 54 68 65 20 6c 61 73 74 20 tes). The last
1c0f7 70 61 67 65 20 63 61 6e 20 68 61 76 65 20 61 73 page can have as
1c0f8 20 6c 69 74 74 6c 65 0d 0a 2a 2a 20 61 73 20 31 little..** as 1
1c0f9 20 62 79 74 65 20 6f 66 20 64 61 74 61 2e 0d 0a byte of data...
1c0fa 2a 2a 0d 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 **..** SIZE
1c0fb 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0d 0a 2a DESCRIPTION..*
1c0fc 2a 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 * 4 Pag
1c0fd 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 e number of next
1c0fe 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0d 0a overflow page..
1c0ff 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20 44 61 ** * Da
1c100 74 61 0d 0a 2a 2a 0d 0a 2a 2a 20 46 72 65 65 6c ta..**..** Freel
1c101 69 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69 ist pages come i
1c102 6e 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20 n two subtypes:
1c103 74 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20 trunk pages and
1c104 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 leaf pages. The
1c105 0d 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 ..** file header
1c106 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 points to the f
1c107 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 irst in a linked
1c108 20 6c 69 73 74 20 6f 66 20 74 72 75 6e 6b 20 70 list of trunk p
1c109 61 67 65 2e 20 20 45 61 63 68 20 74 72 75 6e 6b age. Each trunk
1c10a 0d 0a 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 73 ..** page points
1c10b 20 74 6f 20 6d 75 6c 74 69 70 6c 65 20 6c 65 61 to multiple lea
1c10c 66 20 70 61 67 65 73 2e 20 20 54 68 65 20 63 6f f pages. The co
1c10d 6e 74 65 6e 74 20 6f 66 20 61 20 6c 65 61 66 20 ntent of a leaf
1c10e 70 61 67 65 20 69 73 0d 0a 2a 2a 20 75 6e 73 70 page is..** unsp
1c10f 65 63 69 66 69 65 64 2e 20 20 41 20 74 72 75 6e ecified. A trun
1c110 6b 20 70 61 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b k page looks lik
1c111 65 20 74 68 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 e this:..**..**
1c112 20 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 SIZE DESCR
1c113 49 50 54 49 4f 4e 0d 0a 2a 2a 20 20 20 20 20 20 IPTION..**
1c114 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62 65 4 Page numbe
1c115 72 20 6f 66 20 6e 65 78 74 20 74 72 75 6e 6b 20 r of next trunk
1c116 70 61 67 65 0d 0a 2a 2a 20 20 20 20 20 20 34 20 page..** 4
1c117 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 Number of le
1c118 61 66 20 70 6f 69 6e 74 65 72 73 20 6f 6e 20 74 af pointers on t
1c119 68 69 73 20 70 61 67 65 0d 0a 2a 2a 20 20 20 20 his page..**
1c11a 20 20 2a 20 20 20 20 20 7a 65 72 6f 20 6f 72 20 * zero or
1c11b 6d 6f 72 65 20 70 61 67 65 73 20 6e 75 6d 62 65 more pages numbe
1c11c 72 73 20 6f 66 20 6c 65 61 76 65 73 0d 0a 2a 2f rs of leaves..*/
1c11d 0d 0a 0d 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c ....../* The fol
1c11e 6c 6f 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 lowing value is
1c11f 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c the maximum cell
1c120 20 73 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 size assuming a
1c121 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 0d 0a 2a maximum page..*
1c122 2a 20 73 69 7a 65 20 67 69 76 65 20 61 62 6f 76 * size give abov
1c123 65 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 e...*/..#define
1c124 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 MX_CELL_SIZE(pBt
1c125 29 20 20 28 28 69 6e 74 29 28 70 42 74 2d 3e 70 ) ((int)(pBt->p
1c126 61 67 65 53 69 7a 65 2d 38 29 29 0d 0a 0d 0a 2f ageSize-8))..../
1c127 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 * The maximum nu
1c128 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e mber of cells on
1c129 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f a single page o
1c12a 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 f the database.
1c12b 20 54 68 69 73 0d 0a 2a 2a 20 61 73 73 75 6d 65 This..** assume
1c12c 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65 6c 6c s a minimum cell
1c12d 20 73 69 7a 65 20 6f 66 20 36 20 62 79 74 65 73 size of 6 bytes
1c12e 20 20 28 34 20 62 79 74 65 73 20 66 6f 72 20 74 (4 bytes for t
1c12f 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 0d 0a he cell itself..
1c130 2a 2a 20 70 6c 75 73 20 32 20 62 79 74 65 73 20 ** plus 2 bytes
1c131 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 6f for the index to
1c132 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 the cell in the
1c133 20 70 61 67 65 20 68 65 61 64 65 72 29 2e 20 20 page header).
1c134 53 75 63 68 0d 0a 2a 2a 20 73 6d 61 6c 6c 20 63 Such..** small c
1c135 65 6c 6c 73 20 77 69 6c 6c 20 62 65 20 72 61 72 ells will be rar
1c136 65 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20 e, but they are
1c137 70 6f 73 73 69 62 6c 65 2e 0d 0a 2a 2f 0d 0a 23 possible...*/..#
1c138 64 65 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 define MX_CELL(p
1c139 42 74 29 20 28 28 70 42 74 2d 3e 70 61 67 65 53 Bt) ((pBt->pageS
1c13a 69 7a 65 2d 38 29 2f 36 29 0d 0a 0d 0a 2f 2a 20 ize-8)/6)..../*
1c13b 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 Forward declarat
1c13c 69 6f 6e 73 20 2a 2f 0d 0a 74 79 70 65 64 65 66 ions */..typedef
1c13d 20 73 74 72 75 63 74 20 4d 65 6d 50 61 67 65 20 struct MemPage
1c13e 4d 65 6d 50 61 67 65 3b 0d 0a 74 79 70 65 64 65 MemPage;..typede
1c13f 66 20 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 f struct BtLock
1c140 42 74 4c 6f 63 6b 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a BtLock;..../*..*
1c141 2a 20 54 68 69 73 20 69 73 20 61 20 6d 61 67 69 * This is a magi
1c142 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70 c string that ap
1c143 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67 pears at the beg
1c144 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0d inning of every.
1c145 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 .** SQLite datab
1c146 61 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 ase in order to
1c147 69 64 65 6e 74 69 66 79 20 74 68 65 20 66 69 6c identify the fil
1c148 65 20 61 73 20 61 20 72 65 61 6c 20 64 61 74 61 e as a real data
1c149 62 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 59 6f base...**..** Yo
1c14a 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 69 u can change thi
1c14b 73 20 76 61 6c 75 65 20 61 74 20 63 6f 6d 70 69 s value at compi
1c14c 6c 65 2d 74 69 6d 65 20 62 79 20 73 70 65 63 69 le-time by speci
1c14d 66 79 69 6e 67 20 61 0d 0a 2a 2a 20 2d 44 53 51 fying a..** -DSQ
1c14e 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 LITE_FILE_HEADER
1c14f 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65 20 63 6f ="..." on the co
1c150 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 2d 6c mpiler command-l
1c151 69 6e 65 2e 20 20 54 68 65 0d 0a 2a 2a 20 68 65 ine. The..** he
1c152 61 64 65 72 20 6d 75 73 74 20 62 65 20 65 78 61 ader must be exa
1c153 63 74 6c 79 20 31 36 20 62 79 74 65 73 20 69 6e ctly 16 bytes in
1c154 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65 72 6f cluding the zero
1c155 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f 0d 0a -terminator so..
1c156 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 74 ** the string it
1c157 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20 31 self should be 1
1c158 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 5 characters lon
1c159 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e 67 g. If you chang
1c15a 65 0d 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 e..** the header
1c15b 2c 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74 , then your cust
1c15c 6f 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 om library will
1c15d 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72 not be able to r
1c15e 65 61 64 20 0d 0a 2a 2a 20 64 61 74 61 62 61 73 ead ..** databas
1c15f 65 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 es generated by
1c160 74 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f the standard too
1c161 6c 73 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 ls and the stand
1c162 61 72 64 20 74 6f 6f 6c 73 0d 0a 2a 2a 20 77 69 ard tools..** wi
1c163 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 ll not be able t
1c164 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 73 o read databases
1c165 20 63 72 65 61 74 65 64 20 62 79 20 79 6f 75 72 created by your
1c166 20 63 75 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e custom library.
1c167 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 ..*/..#ifndef SQ
1c168 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 LITE_FILE_HEADER
1c169 20 2f 2a 20 31 32 33 34 35 36 37 38 39 20 31 32 /* 123456789 12
1c16a 33 34 35 36 20 2a 2f 0d 0a 23 20 20 64 65 66 69 3456 */..# defi
1c16b 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 ne SQLITE_FILE_H
1c16c 45 41 44 45 52 20 22 53 51 4c 69 74 65 20 66 6f EADER "SQLite fo
1c16d 72 6d 61 74 20 33 22 0d 0a 23 65 6e 64 69 66 0d rmat 3"..#endif.
1c16e 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 67 65 20 74 .../*..** Page t
1c16f 79 70 65 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f ype flags. An O
1c170 52 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 Red combination
1c171 6f 66 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 of these flags a
1c172 70 70 65 61 72 20 61 73 20 74 68 65 0d 0a 2a 2a ppear as the..**
1c173 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 6f first byte of o
1c174 6e 2d 64 69 73 6b 20 69 6d 61 67 65 20 6f 66 20 n-disk image of
1c175 65 76 65 72 79 20 42 54 72 65 65 20 70 61 67 65 every BTree page
1c176 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 50 ...*/..#define P
1c177 54 46 5f 49 4e 54 4b 45 59 20 20 20 20 30 78 30 TF_INTKEY 0x0
1c178 31 0d 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 5a 1..#define PTF_Z
1c179 45 52 4f 44 41 54 41 20 20 30 78 30 32 0d 0a 23 ERODATA 0x02..#
1c17a 64 65 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 44 define PTF_LEAFD
1c17b 41 54 41 20 20 30 78 30 34 0d 0a 23 64 65 66 69 ATA 0x04..#defi
1c17c 6e 65 20 50 54 46 5f 4c 45 41 46 20 20 20 20 20 ne PTF_LEAF
1c17d 20 30 78 30 38 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 0x08..../*..**
1c17e 41 73 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 As each page of
1c17f 74 68 65 20 66 69 6c 65 20 69 73 20 6c 6f 61 64 the file is load
1c180 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 ed into memory,
1c181 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 an instance of t
1c182 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a he following..**
1c183 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 structure is ap
1c184 70 65 6e 64 65 64 20 61 6e 64 20 69 6e 69 74 69 pended and initi
1c185 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 alized to zero.
1c186 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 This structure
1c187 73 74 6f 72 65 73 0d 0a 2a 2a 20 69 6e 66 6f 72 stores..** infor
1c188 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 mation about the
1c189 20 70 61 67 65 20 74 68 61 74 20 69 73 20 64 65 page that is de
1c18a 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65 20 72 coded from the r
1c18b 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0d 0a 2a aw file page...*
1c18c 2a 0d 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e *..** The pParen
1c18d 74 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62 t field points b
1c18e 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e ack to the paren
1c18f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c t page. This al
1c190 6c 6f 77 73 20 75 73 20 74 6f 0d 0a 2a 2a 20 77 lows us to..** w
1c191 61 6c 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 alk up the BTree
1c192 20 66 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 from any leaf t
1c193 6f 20 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 o the root. Car
1c194 65 20 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 e must be taken
1c195 74 6f 0d 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 to..** unref() t
1c196 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 70 he parent page p
1c197 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 69 73 ointer when this
1c198 20 70 61 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 page is no long
1c199 65 72 20 72 65 66 65 72 65 6e 63 65 64 2e 0d 0a er referenced...
1c19a 2a 2a 20 54 68 65 20 70 61 67 65 44 65 73 74 72 ** The pageDestr
1c19b 75 63 74 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 uctor() routine
1c19c 68 61 6e 64 6c 65 73 20 74 68 61 74 20 63 68 6f handles that cho
1c19d 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 63 63 65 re...**..** Acce
1c19e 73 73 20 74 6f 20 61 6c 6c 20 66 69 65 6c 64 73 ss to all fields
1c19f 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 of this structu
1c1a0 72 65 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 re is controlled
1c1a1 20 62 79 20 74 68 65 20 6d 75 74 65 78 0d 0a 2a by the mutex..*
1c1a2 2a 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 * stored in MemP
1c1a3 61 67 65 2e 70 42 74 2d 3e 6d 75 74 65 78 2e 0d age.pBt->mutex..
1c1a4 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 4d 65 6d 50 .*/..struct MemP
1c1a5 61 67 65 20 7b 0d 0a 20 20 75 38 20 69 73 49 6e age {.. u8 isIn
1c1a6 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a it; /*
1c1a7 20 54 72 75 65 20 69 66 20 70 72 65 76 69 6f 75 True if previou
1c1a8 73 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e sly initialized.
1c1a9 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 21 20 MUST BE FIRST!
1c1aa 2a 2f 0d 0a 20 20 75 38 20 6e 4f 76 65 72 66 6c */.. u8 nOverfl
1c1ab 6f 77 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 ow; /* Nu
1c1ac 6d 62 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 mber of overflow
1c1ad 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 69 6e 20 cell bodies in
1c1ae 61 43 65 6c 6c 5b 5d 20 2a 2f 0d 0a 20 20 75 38 aCell[] */.. u8
1c1af 20 69 6e 74 4b 65 79 3b 20 20 20 20 20 20 20 20 intKey;
1c1b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e /* True if in
1c1b1 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65 74 tkey flag is set
1c1b2 20 2a 2f 0d 0a 20 20 75 38 20 6c 65 61 66 3b 20 */.. u8 leaf;
1c1b3 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1c1b4 72 75 65 20 69 66 20 6c 65 61 66 20 66 6c 61 67 rue if leaf flag
1c1b5 20 69 73 20 73 65 74 20 2a 2f 0d 0a 20 20 75 38 is set */.. u8
1c1b6 20 68 61 73 44 61 74 61 3b 20 20 20 20 20 20 20 hasData;
1c1b7 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 /* True if th
1c1b8 69 73 20 70 61 67 65 20 73 74 6f 72 65 73 20 64 is page stores d
1c1b9 61 74 61 20 2a 2f 0d 0a 20 20 75 38 20 68 64 72 ata */.. u8 hdr
1c1ba 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f Offset; /
1c1bb 2a 20 31 30 30 20 66 6f 72 20 70 61 67 65 20 31 * 100 for page 1
1c1bc 2e 20 20 30 20 6f 74 68 65 72 77 69 73 65 20 2a . 0 otherwise *
1c1bd 2f 0d 0a 20 20 75 38 20 63 68 69 6c 64 50 74 72 /.. u8 childPtr
1c1be 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 30 20 69 Size; /* 0 i
1c1bf 66 20 6c 65 61 66 3d 3d 31 2e 20 20 34 20 69 66 f leaf==1. 4 if
1c1c0 20 6c 65 61 66 3d 3d 30 20 2a 2f 0d 0a 20 20 75 leaf==0 */.. u
1c1c1 38 20 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 8 max1bytePayloa
1c1c2 64 3b 20 20 2f 2a 20 6d 69 6e 28 6d 61 78 4c 6f d; /* min(maxLo
1c1c3 63 61 6c 2c 31 32 37 29 20 2a 2f 0d 0a 20 20 75 cal,127) */.. u
1c1c4 31 36 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20 16 maxLocal;
1c1c5 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 /* Copy of B
1c1c6 74 53 68 61 72 65 64 2e 6d 61 78 4c 6f 63 61 6c tShared.maxLocal
1c1c7 20 6f 72 20 42 74 53 68 61 72 65 64 2e 6d 61 78 or BtShared.max
1c1c8 4c 65 61 66 20 2a 2f 0d 0a 20 20 75 31 36 20 6d Leaf */.. u16 m
1c1c9 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 inLocal;
1c1ca 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 53 68 61 /* Copy of BtSha
1c1cb 72 65 64 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 red.minLocal or
1c1cc 42 74 53 68 61 72 65 64 2e 6d 69 6e 4c 65 61 66 BtShared.minLeaf
1c1cd 20 2a 2f 0d 0a 20 20 75 31 36 20 63 65 6c 6c 4f */.. u16 cellO
1c1ce 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 49 ffset; /* I
1c1cf 6e 64 65 78 20 69 6e 20 61 44 61 74 61 20 6f 66 ndex in aData of
1c1d0 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e first cell poin
1c1d1 74 65 72 20 2a 2f 0d 0a 20 20 75 31 36 20 6e 46 ter */.. u16 nF
1c1d2 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f ree; /
1c1d3 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 * Number of free
1c1d4 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 bytes on the pa
1c1d5 67 65 20 2a 2f 0d 0a 20 20 75 31 36 20 6e 43 65 ge */.. u16 nCe
1c1d6 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a ll; /*
1c1d7 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 Number of cells
1c1d8 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 6c on this page, l
1c1d9 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c 20 2a 2f ocal and ovfl */
1c1da 0d 0a 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 .. u16 maskPage
1c1db 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b ; /* Mask
1c1dc 20 66 6f 72 20 70 61 67 65 20 6f 66 66 73 65 74 for page offset
1c1dd 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 5f 4f */.. struct _O
1c1de 76 66 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 vflCell { /* C
1c1df 65 6c 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e ells that will n
1c1e0 6f 74 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b ot fit on aData[
1c1e1 5d 20 2a 2f 0d 0a 20 20 20 20 75 38 20 2a 70 43 ] */.. u8 *pC
1c1e2 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a ell; /*
1c1e3 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 Pointers to the
1c1e4 20 62 6f 64 79 20 6f 66 20 74 68 65 20 6f 76 65 body of the ove
1c1e5 72 66 6c 6f 77 20 63 65 6c 6c 20 2a 2f 0d 0a 20 rflow cell */..
1c1e6 20 20 20 75 31 36 20 69 64 78 3b 20 20 20 20 20 u16 idx;
1c1e7 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 /* Insert
1c1e8 20 74 68 69 73 20 63 65 6c 6c 20 62 65 66 6f 72 this cell befor
1c1e9 65 20 69 64 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 e idx-th non-ove
1c1ea 72 66 6c 6f 77 20 63 65 6c 6c 20 2a 2f 0d 0a 20 rflow cell */..
1c1eb 20 7d 20 61 4f 76 66 6c 5b 35 5d 3b 0d 0a 20 20 } aOvfl[5];..
1c1ec 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 BtShared *pBt;
1c1ed 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 /* Pointer
1c1ee 74 6f 20 42 74 53 68 61 72 65 64 20 74 68 61 74 to BtShared that
1c1ef 20 74 68 69 73 20 70 61 67 65 20 69 73 20 70 61 this page is pa
1c1f0 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 75 38 20 2a rt of */.. u8 *
1c1f1 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 aData;
1c1f2 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 /* Pointer to d
1c1f3 69 73 6b 20 69 6d 61 67 65 20 6f 66 20 74 68 65 isk image of the
1c1f4 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0d 0a 20 page data */..
1c1f5 20 75 38 20 2a 61 44 61 74 61 45 6e 64 3b 20 20 u8 *aDataEnd;
1c1f6 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 /* One byt
1c1f7 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f e past the end o
1c1f8 66 20 75 73 61 62 6c 65 20 64 61 74 61 20 2a 2f f usable data */
1c1f9 0d 0a 20 20 75 38 20 2a 61 43 65 6c 6c 49 64 78 .. u8 *aCellIdx
1c1fa 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ; /* The
1c1fb 63 65 6c 6c 20 69 6e 64 65 78 20 61 72 65 61 20 cell index area
1c1fc 2a 2f 0d 0a 20 20 44 62 50 61 67 65 20 2a 70 44 */.. DbPage *pD
1c1fd 62 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 61 bPage; /* Pa
1c1fe 67 65 72 20 70 61 67 65 20 68 61 6e 64 6c 65 20 ger page handle
1c1ff 2a 2f 0d 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b */.. Pgno pgno;
1c200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
1c201 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 ge number for th
1c202 69 73 20 70 61 67 65 20 2a 2f 0d 0a 7d 3b 0d 0a is page */..};..
1c203 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 2d ../*..** The in-
1c204 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 memory image of
1c205 61 20 64 69 73 6b 20 70 61 67 65 20 68 61 73 20 a disk page has
1c206 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e the auxiliary in
1c207 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70 65 6e 64 formation append
1c208 65 64 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6e ed..** to the en
1c209 64 2e 20 20 45 58 54 52 41 5f 53 49 5a 45 20 69 d. EXTRA_SIZE i
1c20a 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
1c20b 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e bytes of space n
1c20c 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 0d 0a 2a eeded to hold..*
1c20d 2a 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 * that extra inf
1c20e 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 ormation...*/..#
1c20f 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53 49 5a define EXTRA_SIZ
1c210 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 E sizeof(MemPage
1c211 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 6c 69 )..../*..** A li
1c212 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68 65 nked list of the
1c213 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 following struc
1c214 74 75 72 65 73 20 69 73 20 73 74 6f 72 65 64 20 tures is stored
1c215 61 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 at BtShared.pLoc
1c216 6b 2e 0d 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65 k...** Locks are
1c217 20 61 64 64 65 64 20 28 6f 72 20 75 70 67 72 61 added (or upgra
1c218 64 65 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f ded from READ_LO
1c219 43 4b 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b CK to WRITE_LOCK
1c21a 29 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 ) when a cursor
1c21b 0d 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f ..** is opened o
1c21c 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 n the table with
1c21d 20 72 6f 6f 74 20 70 61 67 65 20 42 74 53 68 61 root page BtSha
1c21e 72 65 64 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b red.iTable. Lock
1c21f 73 20 61 72 65 20 72 65 6d 6f 76 65 64 0d 0a 2a s are removed..*
1c220 2a 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 * from this list
1c221 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 when a transact
1c222 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 ion is committed
1c223 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c or rolled back,
1c224 20 6f 72 20 77 68 65 6e 0d 0a 2a 2a 20 61 20 62 or when..** a b
1c225 74 72 65 65 20 68 61 6e 64 6c 65 20 69 73 20 63 tree handle is c
1c226 6c 6f 73 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 losed...*/..stru
1c227 63 74 20 42 74 4c 6f 63 6b 20 7b 0d 0a 20 20 42 ct BtLock {.. B
1c228 74 72 65 65 20 2a 70 42 74 72 65 65 3b 20 20 20 tree *pBtree;
1c229 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 68 61 /* Btree ha
1c22a 6e 64 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 69 ndle holding thi
1c22b 73 20 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 50 67 6e s lock */.. Pgn
1c22c 6f 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 o iTable;
1c22d 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 /* Root page
1c22e 6f 66 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 75 of table */.. u
1c22f 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 8 eLock;
1c230 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c 4f 43 /* READ_LOC
1c231 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 20 K or WRITE_LOCK
1c232 2a 2f 0d 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4e */.. BtLock *pN
1c233 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e ext; /* N
1c234 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e ext in BtShared.
1c235 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0d 0a 7d pLock list */..}
1c236 3b 0d 0a 0d 0a 2f 2a 20 43 61 6e 64 69 64 61 74 ;..../* Candidat
1c237 65 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c e values for BtL
1c238 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0d 0a 23 64 ock.eLock */..#d
1c239 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 efine READ_LOCK
1c23a 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65 20 57 1..#define W
1c23b 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32 0d 0a RITE_LOCK 2..
1c23c 0d 0a 2f 2a 20 41 20 42 74 72 65 65 20 68 61 6e ../* A Btree han
1c23d 64 6c 65 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 64 61 dle..**..** A da
1c23e 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
1c23f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 n contains a poi
1c240 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 nter to an insta
1c241 6e 63 65 20 6f 66 0d 0a 2a 2a 20 74 68 69 73 20 nce of..** this
1c242 6f 62 6a 65 63 74 20 66 6f 72 20 65 76 65 72 79 object for every
1c243 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 database file t
1c244 68 61 74 20 69 74 20 68 61 73 20 6f 70 65 6e 2e hat it has open.
1c245 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 This structure
1c246 0d 0a 2a 2a 20 69 73 20 6f 70 61 71 75 65 20 74 ..** is opaque t
1c247 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 o the database c
1c248 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 onnection. The
1c249 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
1c24a 69 6f 6e 20 63 61 6e 6e 6f 74 0d 0a 2a 2a 20 73 ion cannot..** s
1c24b 65 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 ee the internals
1c24c 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 of this structu
1c24d 72 65 20 61 6e 64 20 6f 6e 6c 79 20 64 65 61 6c re and only deal
1c24e 73 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 s with pointers
1c24f 74 6f 0d 0a 2a 2a 20 74 68 69 73 20 73 74 72 75 to..** this stru
1c250 63 74 75 72 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 cture...**..** F
1c251 6f 72 20 73 6f 6d 65 20 64 61 74 61 62 61 73 65 or some database
1c252 20 66 69 6c 65 73 2c 20 74 68 65 20 73 61 6d 65 files, the same
1c253 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 underlying data
1c254 62 61 73 65 20 63 61 63 68 65 20 6d 69 67 68 74 base cache might
1c255 20 62 65 20 0d 0a 2a 2a 20 73 68 61 72 65 64 20 be ..** shared
1c256 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70 6c 65 between multiple
1c257 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 49 connections. I
1c258 6e 20 74 68 61 74 20 63 61 73 65 2c 20 65 61 63 n that case, eac
1c259 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a h connection..**
1c25a 20 68 61 73 20 69 74 20 6f 77 6e 20 69 6e 73 74 has it own inst
1c25b 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a ance of this obj
1c25c 65 63 74 2e 20 20 42 75 74 20 65 61 63 68 20 69 ect. But each i
1c25d 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 nstance of this
1c25e 6f 62 6a 65 63 74 0d 0a 2a 2a 20 70 6f 69 6e 74 object..** point
1c25f 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 42 74 s to the same Bt
1c260 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 20 20 Shared object.
1c261 54 68 65 20 64 61 74 61 62 61 73 65 20 63 61 63 The database cac
1c262 68 65 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 73 he and the..** s
1c263 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 chema associated
1c264 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 with the databa
1c265 73 65 20 66 69 6c 65 20 61 72 65 20 61 6c 6c 20 se file are all
1c266 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e contained within
1c267 0d 0a 2a 2a 20 74 68 65 20 42 74 53 68 61 72 65 ..** the BtShare
1c268 64 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a d object...**..*
1c269 2a 20 41 6c 6c 20 66 69 65 6c 64 73 20 69 6e 20 * All fields in
1c26a 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 this structure a
1c26b 72 65 20 61 63 63 65 73 73 65 64 20 75 6e 64 65 re accessed unde
1c26c 72 20 73 71 6c 69 74 65 33 2e 6d 75 74 65 78 2e r sqlite3.mutex.
1c26d 0d 0a 2a 2a 20 54 68 65 20 70 42 74 20 70 6f 69 ..** The pBt poi
1c26e 6e 74 65 72 20 69 74 73 65 6c 66 20 6d 61 79 20 nter itself may
1c26f 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77 not be changed w
1c270 68 69 6c 65 20 74 68 65 72 65 20 65 78 69 73 74 hile there exist
1c271 73 20 63 75 72 73 6f 72 73 20 0d 0a 2a 2a 20 69 s cursors ..** i
1c272 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 n the referenced
1c273 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 BtShared that p
1c274 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 74 68 69 oint back to thi
1c275 73 20 42 74 72 65 65 20 73 69 6e 63 65 20 74 68 s Btree since th
1c276 6f 73 65 0d 0a 2a 2a 20 63 75 72 73 6f 72 73 20 ose..** cursors
1c277 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 have to go throu
1c278 67 68 20 74 68 69 73 20 42 74 72 65 65 20 74 6f gh this Btree to
1c279 20 66 69 6e 64 20 74 68 65 69 72 20 42 74 53 68 find their BtSh
1c27a 61 72 65 64 20 61 6e 64 0d 0a 2a 2a 20 74 68 65 ared and..** the
1c27b 79 20 6f 66 74 65 6e 20 64 6f 20 73 6f 20 77 69 y often do so wi
1c27c 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20 73 71 thout holding sq
1c27d 6c 69 74 65 33 2e 6d 75 74 65 78 2e 0d 0a 2a 2f lite3.mutex...*/
1c27e 0d 0a 73 74 72 75 63 74 20 42 74 72 65 65 20 7b ..struct Btree {
1c27f 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b .. sqlite3 *db;
1c280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 /* The da
1c281 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
1c282 6e 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20 62 n holding this b
1c283 74 72 65 65 20 2a 2f 0d 0a 20 20 42 74 53 68 61 tree */.. BtSha
1c284 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a red *pBt; /*
1c285 20 53 68 61 72 61 62 6c 65 20 63 6f 6e 74 65 6e Sharable conten
1c286 74 20 6f 66 20 74 68 69 73 20 62 74 72 65 65 20 t of this btree
1c287 2a 2f 0d 0a 20 20 75 38 20 69 6e 54 72 61 6e 73 */.. u8 inTrans
1c288 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 52 41 4e ; /* TRAN
1c289 53 5f 4e 4f 4e 45 2c 20 54 52 41 4e 53 5f 52 45 S_NONE, TRANS_RE
1c28a 41 44 20 6f 72 20 54 52 41 4e 53 5f 57 52 49 54 AD or TRANS_WRIT
1c28b 45 20 2a 2f 0d 0a 20 20 75 38 20 73 68 61 72 61 E */.. u8 shara
1c28c 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 ble; /* Tr
1c28d 75 65 20 69 66 20 77 65 20 63 61 6e 20 73 68 61 ue if we can sha
1c28e 72 65 20 70 42 74 20 77 69 74 68 20 61 6e 6f 74 re pBt with anot
1c28f 68 65 72 20 64 62 20 2a 2f 0d 0a 20 20 75 38 20 her db */.. u8
1c290 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 locked;
1c291 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 63 75 /* True if db cu
1c292 72 72 65 6e 74 6c 79 20 68 61 73 20 70 42 74 20 rrently has pBt
1c293 6c 6f 63 6b 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 locked */.. int
1c294 20 77 61 6e 74 54 6f 4c 6f 63 6b 3b 20 20 20 20 wantToLock;
1c295 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 /* Number of nes
1c296 74 65 64 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c ted calls to sql
1c297 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 ite3BtreeEnter()
1c298 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 42 61 63 6b */.. int nBack
1c299 75 70 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d up; /* Num
1c29a 62 65 72 20 6f 66 20 62 61 63 6b 75 70 20 6f 70 ber of backup op
1c29b 65 72 61 74 69 6f 6e 73 20 72 65 61 64 69 6e 67 erations reading
1c29c 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0d 0a this btree */..
1c29d 20 20 42 74 72 65 65 20 2a 70 4e 65 78 74 3b 20 Btree *pNext;
1c29e 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 /* List of
1c29f 6f 74 68 65 72 20 73 68 61 72 61 62 6c 65 20 42 other sharable B
1c2a0 74 72 65 65 73 20 66 72 6f 6d 20 74 68 65 20 73 trees from the s
1c2a1 61 6d 65 20 64 62 20 2a 2f 0d 0a 20 20 42 74 72 ame db */.. Btr
1c2a2 65 65 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 ee *pPrev;
1c2a3 2f 2a 20 42 61 63 6b 20 70 6f 69 6e 74 65 72 20 /* Back pointer
1c2a4 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 73 74 of the same list
1c2a5 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c */..#ifndef SQL
1c2a6 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f ITE_OMIT_SHARED_
1c2a7 43 41 43 48 45 0d 0a 20 20 42 74 4c 6f 63 6b 20 CACHE.. BtLock
1c2a8 6c 6f 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 4f lock; /* O
1c2a9 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 6c 6f bject used to lo
1c2aa 63 6b 20 70 61 67 65 20 31 20 2a 2f 0d 0a 23 65 ck page 1 */..#e
1c2ab 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a ndif..};..../*..
1c2ac 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72 61 6e 73 ** Btree.inTrans
1c2ad 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65 20 6f 66 may take one of
1c2ae 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 the following v
1c2af 61 6c 75 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 alues...**..** I
1c2b0 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 f the shared-dat
1c2b1 61 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 65 a extension is e
1c2b2 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 6d 61 nabled, there ma
1c2b3 79 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 75 73 y be multiple us
1c2b4 65 72 73 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 42 ers..** of the B
1c2b5 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 tree structure.
1c2b6 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 66 20 74 At most one of t
1c2b7 68 65 73 65 20 6d 61 79 20 6f 70 65 6e 20 61 20 hese may open a
1c2b8 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f write transactio
1c2b9 6e 2c 0d 0a 2a 2a 20 62 75 74 20 61 6e 79 20 6e n,..** but any n
1c2ba 75 6d 62 65 72 20 6d 61 79 20 68 61 76 65 20 61 umber may have a
1c2bb 63 74 69 76 65 20 72 65 61 64 20 74 72 61 6e 73 ctive read trans
1c2bc 61 63 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d 0a 23 64 actions...*/..#d
1c2bd 65 66 69 6e 65 20 54 52 41 4e 53 5f 4e 4f 4e 45 efine TRANS_NONE
1c2be 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 54 52 41 0..#define TRA
1c2bf 4e 53 5f 52 45 41 44 20 20 31 0d 0a 23 64 65 66 NS_READ 1..#def
1c2c0 69 6e 65 20 54 52 41 4e 53 5f 57 52 49 54 45 20 ine TRANS_WRITE
1c2c1 32 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 2..../*..** An i
1c2c2 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 nstance of this
1c2c3 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 object represent
1c2c4 73 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 s a single datab
1c2c5 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 20 0d 0a ase file...** ..
1c2c6 2a 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 ** A single data
1c2c7 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62 65 base file can be
1c2c8 20 69 6e 20 75 73 65 20 61 74 20 74 68 65 20 73 in use at the s
1c2c9 61 6d 65 20 74 69 6d 65 20 62 79 20 74 77 6f 0d ame time by two.
1c2ca 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 .** or more data
1c2cb 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 base connections
1c2cc 2e 20 20 57 68 65 6e 20 74 77 6f 20 6f 72 20 6d . When two or m
1c2cd 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 ore connections
1c2ce 61 72 65 0d 0a 2a 2a 20 73 68 61 72 69 6e 67 20 are..** sharing
1c2cf 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 the same databas
1c2d0 65 20 66 69 6c 65 2c 20 65 61 63 68 20 63 6f 6e e file, each con
1c2d1 6e 65 63 74 69 6f 6e 20 68 61 73 20 69 74 20 6f nection has it o
1c2d2 77 6e 0d 0a 2a 2a 20 70 72 69 76 61 74 65 20 42 wn..** private B
1c2d3 74 72 65 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 tree object for
1c2d4 74 68 65 20 66 69 6c 65 20 61 6e 64 20 65 61 63 the file and eac
1c2d5 68 20 6f 66 20 74 68 6f 73 65 20 42 74 72 65 65 h of those Btree
1c2d6 73 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 s points..** to
1c2d7 74 68 69 73 20 6f 6e 65 20 42 74 53 68 61 72 65 this one BtShare
1c2d8 64 20 6f 62 6a 65 63 74 2e 20 20 42 74 53 68 61 d object. BtSha
1c2d9 72 65 64 2e 6e 52 65 66 20 69 73 20 74 68 65 20 red.nRef is the
1c2da 6e 75 6d 62 65 72 20 6f 66 0d 0a 2a 2a 20 63 6f number of..** co
1c2db 6e 6e 65 63 74 69 6f 6e 73 20 63 75 72 72 65 6e nnections curren
1c2dc 74 6c 79 20 73 68 61 72 69 6e 67 20 74 68 69 73 tly sharing this
1c2dd 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d database file..
1c2de 0a 2a 2a 0d 0a 2a 2a 20 46 69 65 6c 64 73 20 69 .**..** Fields i
1c2df 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 n this structure
1c2e0 20 61 72 65 20 61 63 63 65 73 73 65 64 20 75 6e are accessed un
1c2e1 64 65 72 20 74 68 65 20 42 74 53 68 61 72 65 64 der the BtShared
1c2e2 2e 6d 75 74 65 78 0d 0a 2a 2a 20 6d 75 74 65 78 .mutex..** mutex
1c2e3 2c 20 65 78 63 65 70 74 20 66 6f 72 20 6e 52 65 , except for nRe
1c2e4 66 20 61 6e 64 20 70 4e 65 78 74 20 77 68 69 63 f and pNext whic
1c2e5 68 20 61 72 65 20 61 63 63 65 73 73 65 64 20 75 h are accessed u
1c2e6 6e 64 65 72 20 74 68 65 0d 0a 2a 2a 20 67 6c 6f nder the..** glo
1c2e7 62 61 6c 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 bal SQLITE_MUTEX
1c2e8 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d _STATIC_MASTER m
1c2e9 75 74 65 78 2e 20 20 54 68 65 20 70 50 61 67 65 utex. The pPage
1c2ea 72 20 66 69 65 6c 64 0d 0a 2a 2a 20 6d 61 79 20 r field..** may
1c2eb 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 not be modified
1c2ec 6f 6e 63 65 20 69 74 20 69 73 20 69 6e 69 74 69 once it is initi
1c2ed 61 6c 6c 79 20 73 65 74 20 61 73 20 6c 6f 6e 67 ally set as long
1c2ee 20 61 73 20 6e 52 65 66 3e 30 2e 0d 0a 2a 2a 20 as nRef>0...**
1c2ef 54 68 65 20 70 53 63 68 65 6d 61 20 66 69 65 6c The pSchema fiel
1c2f0 64 20 6d 61 79 20 62 65 20 73 65 74 20 6f 6e 63 d may be set onc
1c2f1 65 20 75 6e 64 65 72 20 42 74 53 68 61 72 65 64 e under BtShared
1c2f2 2e 6d 75 74 65 78 20 61 6e 64 0d 0a 2a 2a 20 74 .mutex and..** t
1c2f3 68 65 72 65 61 66 74 65 72 20 69 73 20 75 6e 63 hereafter is unc
1c2f4 68 61 6e 67 65 64 20 61 73 20 6c 6f 6e 67 20 61 hanged as long a
1c2f5 73 20 6e 52 65 66 3e 30 2e 0d 0a 2a 2a 0d 0a 2a s nRef>0...**..*
1c2f6 2a 20 69 73 50 65 6e 64 69 6e 67 3a 0d 0a 2a 2a * isPending:..**
1c2f7 0d 0a 2a 2a 20 20 20 49 66 20 61 20 42 74 53 68 ..** If a BtSh
1c2f8 61 72 65 64 20 63 6c 69 65 6e 74 20 66 61 69 6c ared client fail
1c2f9 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 77 72 s to obtain a wr
1c2fa 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 64 61 ite-lock on a da
1c2fb 74 61 62 61 73 65 0d 0a 2a 2a 20 20 20 74 61 62 tabase..** tab
1c2fc 6c 65 20 28 62 65 63 61 75 73 65 20 74 68 65 72 le (because ther
1c2fd 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 e exists one or
1c2fe 6d 6f 72 65 20 72 65 61 64 2d 6c 6f 63 6b 73 20 more read-locks
1c2ff 6f 6e 20 74 68 65 20 74 61 62 6c 65 29 2c 0d 0a on the table),..
1c300 2a 2a 20 20 20 74 68 65 20 73 68 61 72 65 64 2d ** the shared-
1c301 63 61 63 68 65 20 65 6e 74 65 72 73 20 27 70 65 cache enters 'pe
1c302 6e 64 69 6e 67 2d 6c 6f 63 6b 27 20 73 74 61 74 nding-lock' stat
1c303 65 20 61 6e 64 20 69 73 50 65 6e 64 69 6e 67 20 e and isPending
1c304 69 73 0d 0a 2a 2a 20 20 20 73 65 74 20 74 6f 20 is..** set to
1c305 74 72 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 true...**..**
1c306 54 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 The shared-cache
1c307 20 6c 65 61 76 65 73 20 74 68 65 20 27 70 65 6e leaves the 'pen
1c308 64 69 6e 67 20 6c 6f 63 6b 27 20 73 74 61 74 65 ding lock' state
1c309 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66 0d when either of.
1c30a 0a 2a 2a 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 .** the follow
1c30b 69 6e 67 20 6f 63 63 75 72 3a 0d 0a 2a 2a 0d 0a ing occur:..**..
1c30c 2a 2a 20 20 20 20 20 31 29 20 54 68 65 20 63 75 ** 1) The cu
1c30d 72 72 65 6e 74 20 77 72 69 74 65 72 20 28 42 74 rrent writer (Bt
1c30e 53 68 61 72 65 64 2e 70 57 72 69 74 65 72 29 20 Shared.pWriter)
1c30f 63 6f 6e 63 6c 75 64 65 73 20 69 74 73 20 74 72 concludes its tr
1c310 61 6e 73 61 63 74 69 6f 6e 2c 20 4f 52 0d 0a 2a ansaction, OR..*
1c311 2a 20 20 20 20 20 32 29 20 54 68 65 20 6e 75 6d * 2) The num
1c312 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c ber of locks hel
1c313 64 20 62 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 d by other conne
1c314 63 74 69 6f 6e 73 20 64 72 6f 70 73 20 74 6f 20 ctions drops to
1c315 7a 65 72 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 zero...**..**
1c316 77 68 69 6c 65 20 69 6e 20 74 68 65 20 27 70 65 while in the 'pe
1c317 6e 64 69 6e 67 2d 6c 6f 63 6b 27 20 73 74 61 74 nding-lock' stat
1c318 65 2c 20 6e 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e e, no connection
1c319 20 6d 61 79 20 73 74 61 72 74 20 61 20 6e 65 77 may start a new
1c31a 0d 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74 69 ..** transacti
1c31b 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 on...**..** Th
1c31c 69 73 20 66 65 61 74 75 72 65 20 69 73 20 69 6e is feature is in
1c31d 63 6c 75 64 65 64 20 74 6f 20 68 65 6c 70 20 70 cluded to help p
1c31e 72 65 76 65 6e 74 20 77 72 69 74 65 72 2d 73 74 revent writer-st
1c31f 61 72 76 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 arvation...*/..s
1c320 74 72 75 63 74 20 42 74 53 68 61 72 65 64 20 7b truct BtShared {
1c321 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 .. Pager *pPage
1c322 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 r; /* The
1c323 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0d 0a page cache */..
1c324 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 sqlite3 *db;
1c325 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 /* Datab
1c326 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 ase connection c
1c327 75 72 72 65 6e 74 6c 79 20 75 73 69 6e 67 20 74 urrently using t
1c328 68 69 73 20 42 74 72 65 65 20 2a 2f 0d 0a 20 20 his Btree */..
1c329 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f BtCursor *pCurso
1c32a 72 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 r; /* A list
1c32b 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72 73 of all open curs
1c32c 6f 72 73 20 2a 2f 0d 0a 20 20 4d 65 6d 50 61 67 ors */.. MemPag
1c32d 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 20 e *pPage1;
1c32e 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 /* First page of
1c32f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f the database */
1c330 0d 0a 20 20 75 38 20 6f 70 65 6e 46 6c 61 67 73 .. u8 openFlags
1c331 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 ; /* Fla
1c332 67 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 gs to sqlite3Btr
1c333 65 65 4f 70 65 6e 28 29 20 2a 2f 0d 0a 23 69 66 eeOpen() */..#if
1c334 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
1c335 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 75 _AUTOVACUUM.. u
1c336 38 20 61 75 74 6f 56 61 63 75 75 6d 3b 20 20 20 8 autoVacuum;
1c337 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
1c338 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 65 auto-vacuum is e
1c339 6e 61 62 6c 65 64 20 2a 2f 0d 0a 20 20 75 38 20 nabled */.. u8
1c33a 69 6e 63 72 56 61 63 75 75 6d 3b 20 20 20 20 20 incrVacuum;
1c33b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e /* True if in
1c33c 63 72 2d 76 61 63 75 75 6d 20 69 73 20 65 6e 61 cr-vacuum is ena
1c33d 62 6c 65 64 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d bled */..#endif.
1c33e 0a 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 . u8 inTransact
1c33f 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 54 72 61 6e ion; /* Tran
1c340 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f saction state */
1c341 0d 0a 20 20 75 38 20 6d 61 78 31 62 79 74 65 50 .. u8 max1byteP
1c342 61 79 6c 6f 61 64 3b 20 20 20 2f 2a 20 4d 61 78 ayload; /* Max
1c343 69 6d 75 6d 20 66 69 72 73 74 20 62 79 74 65 20 imum first byte
1c344 6f 66 20 63 65 6c 6c 20 66 6f 72 20 61 20 31 2d of cell for a 1-
1c345 62 79 74 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0d byte payload */.
1c346 0a 20 20 75 31 36 20 62 74 73 46 6c 61 67 73 3b . u16 btsFlags;
1c347 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c /* Bool
1c348 65 61 6e 20 70 61 72 61 6d 65 74 65 72 73 2e 20 ean parameters.
1c349 20 53 65 65 20 42 54 53 5f 2a 20 6d 61 63 72 6f See BTS_* macro
1c34a 73 20 62 65 6c 6f 77 20 2a 2f 0d 0a 20 20 75 31 s below */.. u1
1c34b 36 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20 20 6 maxLocal;
1c34c 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c /* Maximum l
1c34d 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 ocal payload in
1c34e 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74 61 62 non-LEAFDATA tab
1c34f 6c 65 73 20 2a 2f 0d 0a 20 20 75 31 36 20 6d 69 les */.. u16 mi
1c350 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 20 nLocal;
1c351 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c /* Minimum local
1c352 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d payload in non-
1c353 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73 20 LEAFDATA tables
1c354 2a 2f 0d 0a 20 20 75 31 36 20 6d 61 78 4c 65 61 */.. u16 maxLea
1c355 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d f; /* M
1c356 61 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 aximum local pay
1c357 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46 44 41 load in a LEAFDA
1c358 54 41 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 75 TA table */.. u
1c359 31 36 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20 20 16 minLeaf;
1c35a 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 /* Minimum
1c35b 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e local payload in
1c35c 20 61 20 4c 45 41 46 44 41 54 41 20 74 61 62 6c a LEAFDATA tabl
1c35d 65 20 2a 2f 0d 0a 20 20 75 33 32 20 70 61 67 65 e */.. u32 page
1c35e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a Size; /*
1c35f 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 Total number of
1c360 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 bytes on a page
1c361 20 2a 2f 0d 0a 20 20 75 33 32 20 75 73 61 62 6c */.. u32 usabl
1c362 65 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 eSize; /*
1c363 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 Number of usable
1c364 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70 bytes on each p
1c365 61 67 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 age */.. int nT
1c366 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 ransaction;
1c367 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 65 /* Number of ope
1c368 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 28 n transactions (
1c369 72 65 61 64 20 2b 20 77 72 69 74 65 29 20 2a 2f read + write) */
1c36a 0d 0a 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 .. u32 nPage;
1c36b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1c36c 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 ber of pages in
1c36d 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0d the database */.
1c36e 0a 20 20 76 6f 69 64 20 2a 70 53 63 68 65 6d 61 . void *pSchema
1c36f 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e ; /* Poin
1c370 74 65 72 20 74 6f 20 73 70 61 63 65 20 61 6c 6c ter to space all
1c371 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 ocated by sqlite
1c372 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 20 2a 3BtreeSchema() *
1c373 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65 /.. void (*xFre
1c374 65 53 63 68 65 6d 61 29 28 76 6f 69 64 2a 29 3b eSchema)(void*);
1c375 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 /* Destructor
1c376 66 6f 72 20 42 74 53 68 61 72 65 64 2e 70 53 63 for BtShared.pSc
1c377 68 65 6d 61 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 hema */.. sqlit
1c378 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b e3_mutex *mutex;
1c379 20 2f 2a 20 4e 6f 6e 2d 72 65 63 75 72 73 69 76 /* Non-recursiv
1c37a 65 20 6d 75 74 65 78 20 72 65 71 75 69 72 65 64 e mutex required
1c37b 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 to access this
1c37c 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 42 69 74 object */.. Bit
1c37d 76 65 63 20 2a 70 48 61 73 43 6f 6e 74 65 6e 74 vec *pHasContent
1c37e 3b 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61 67 ; /* Set of pag
1c37f 65 73 20 6d 6f 76 65 64 20 74 6f 20 66 72 65 65 es moved to free
1c380 2d 6c 69 73 74 20 74 68 69 73 20 74 72 61 6e 73 -list this trans
1c381 61 63 74 69 6f 6e 20 2a 2f 0d 0a 23 69 66 6e 64 action */..#ifnd
1c382 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 ef SQLITE_OMIT_S
1c383 48 41 52 45 44 5f 43 41 43 48 45 0d 0a 20 20 69 HARED_CACHE.. i
1c384 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 nt nRef;
1c385 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1c386 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 f references to
1c387 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a this structure *
1c388 2f 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 /.. BtShared *p
1c389 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 Next; /* Ne
1c38a 78 74 20 6f 6e 20 61 20 6c 69 73 74 20 6f 66 20 xt on a list of
1c38b 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 sharable BtShare
1c38c 64 20 73 74 72 75 63 74 73 20 2a 2f 0d 0a 20 20 d structs */..
1c38d 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 20 20 BtLock *pLock;
1c38e 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 /* List of
1c38f 20 6c 6f 63 6b 73 20 68 65 6c 64 20 6f 6e 20 74 locks held on t
1c390 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 his shared-btree
1c391 20 73 74 72 75 63 74 20 2a 2f 0d 0a 20 20 42 74 struct */.. Bt
1c392 72 65 65 20 2a 70 57 72 69 74 65 72 3b 20 20 20 ree *pWriter;
1c393 20 20 20 20 2f 2a 20 42 74 72 65 65 20 77 69 74 /* Btree wit
1c394 68 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e h currently open
1c395 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 write transacti
1c396 6f 6e 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 on */..#endif..
1c397 20 75 38 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 u8 *pTmpSpace;
1c398 20 20 20 20 20 20 20 2f 2a 20 42 74 53 68 61 72 /* BtShar
1c399 65 64 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 ed.pageSize byte
1c39a 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 s of space for t
1c39b 6d 70 20 75 73 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d mp use */..};...
1c39c 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 ./*..** Allowed
1c39d 76 61 6c 75 65 73 20 66 6f 72 20 42 74 53 68 61 values for BtSha
1c39e 72 65 64 2e 62 74 73 46 6c 61 67 73 0d 0a 2a 2f red.btsFlags..*/
1c39f 0d 0a 23 64 65 66 69 6e 65 20 42 54 53 5f 52 45 ..#define BTS_RE
1c3a0 41 44 5f 4f 4e 4c 59 20 20 20 20 20 20 20 20 30 AD_ONLY 0
1c3a1 78 30 30 30 31 20 20 20 2f 2a 20 55 6e 64 65 72 x0001 /* Under
1c3a2 6c 79 69 6e 67 20 66 69 6c 65 20 69 73 20 72 65 lying file is re
1c3a3 61 64 6f 6e 6c 79 20 2a 2f 0d 0a 23 64 65 66 69 adonly */..#defi
1c3a4 6e 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f ne BTS_PAGESIZE_
1c3a5 46 49 58 45 44 20 20 20 30 78 30 30 30 32 20 20 FIXED 0x0002
1c3a6 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 63 61 /* Page size ca
1c3a7 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 n no longer be c
1c3a8 68 61 6e 67 65 64 20 2a 2f 0d 0a 23 64 65 66 69 hanged */..#defi
1c3a9 6e 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 ne BTS_SECURE_DE
1c3aa 4c 45 54 45 20 20 20 20 30 78 30 30 30 34 20 20 LETE 0x0004
1c3ab 20 2f 2a 20 50 52 41 47 4d 41 20 73 65 63 75 72 /* PRAGMA secur
1c3ac 65 5f 64 65 6c 65 74 65 20 69 73 20 65 6e 61 62 e_delete is enab
1c3ad 6c 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 led */..#define
1c3ae 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d BTS_INITIALLY_EM
1c3af 50 54 59 20 20 30 78 30 30 30 38 20 20 20 2f 2a PTY 0x0008 /*
1c3b0 20 44 61 74 61 62 61 73 65 20 77 61 73 20 65 6d Database was em
1c3b1 70 74 79 20 61 74 20 74 72 61 6e 73 20 73 74 61 pty at trans sta
1c3b2 72 74 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 rt */..#define B
1c3b3 54 53 5f 4e 4f 5f 57 41 4c 20 20 20 20 20 20 20 TS_NO_WAL
1c3b4 20 20 20 20 30 78 30 30 31 30 20 20 20 2f 2a 20 0x0010 /*
1c3b5 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 77 72 69 74 Do not open writ
1c3b6 65 2d 61 68 65 61 64 2d 6c 6f 67 20 66 69 6c 65 e-ahead-log file
1c3b7 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 54 s */..#define BT
1c3b8 53 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 S_EXCLUSIVE
1c3b9 20 20 20 30 78 30 30 32 30 20 20 20 2f 2a 20 70 0x0020 /* p
1c3ba 57 72 69 74 65 72 20 68 61 73 20 61 6e 20 65 78 Writer has an ex
1c3bb 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0d clusive lock */.
1c3bc 0a 23 64 65 66 69 6e 65 20 42 54 53 5f 50 45 4e .#define BTS_PEN
1c3bd 44 49 4e 47 20 20 20 20 20 20 20 20 20 20 30 78 DING 0x
1c3be 30 30 34 30 20 20 20 2f 2a 20 57 61 69 74 69 6e 0040 /* Waitin
1c3bf 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 g for read-locks
1c3c0 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0d 0a 0d 0a to clear */....
1c3c1 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e /*..** An instan
1c3c2 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ce of the follow
1c3c3 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 ing structure is
1c3c4 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 6e used to hold in
1c3c5 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a 20 61 62 formation..** ab
1c3c6 6f 75 74 20 61 20 63 65 6c 6c 2e 20 20 54 68 65 out a cell. The
1c3c7 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 parseCellPtr()
1c3c8 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 73 20 69 function fills i
1c3c9 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 n this structure
1c3ca 0d 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 69 6e ..** based on in
1c3cb 66 6f 72 6d 61 74 69 6f 6e 20 65 78 74 72 61 63 formation extrac
1c3cc 74 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20 64 t from the raw d
1c3cd 69 73 6b 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 74 isk page...*/..t
1c3ce 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 ypedef struct Ce
1c3cf 6c 6c 49 6e 66 6f 20 43 65 6c 6c 49 6e 66 6f 3b llInfo CellInfo;
1c3d0 0d 0a 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 ..struct CellInf
1c3d1 6f 20 7b 0d 0a 20 20 69 36 34 20 6e 4b 65 79 3b o {.. i64 nKey;
1c3d2 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 /* The key
1c3d3 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c for INTKEY tabl
1c3d4 65 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 es, or number of
1c3d5 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f bytes in key */
1c3d6 0d 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 .. u8 *pCell;
1c3d7 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f /* Pointer to
1c3d8 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 65 the start of ce
1c3d9 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0d 0a 20 ll content */..
1c3da 20 75 33 32 20 6e 44 61 74 61 3b 20 20 20 20 20 u32 nData;
1c3db 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
1c3dc 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0d 0a 20 es of data */..
1c3dd 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 u32 nPayload;
1c3de 2f 2a 20 54 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 /* Total amount
1c3df 6f 66 20 70 61 79 6c 6f 61 64 20 2a 2f 0d 0a 20 of payload */..
1c3e0 20 75 31 36 20 6e 48 65 61 64 65 72 3b 20 20 20 u16 nHeader;
1c3e1 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63 /* Size of the c
1c3e2 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 ell content head
1c3e3 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a er in bytes */..
1c3e4 20 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20 20 20 u16 nLocal;
1c3e5 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 70 61 /* Amount of pa
1c3e6 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c yload held local
1c3e7 6c 79 20 2a 2f 0d 0a 20 20 75 31 36 20 69 4f 76 ly */.. u16 iOv
1c3e8 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73 65 erflow; /* Offse
1c3e9 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 t to overflow pa
1c3ea 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72 6f ge number. Zero
1c3eb 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 if no overflow
1c3ec 2a 2f 0d 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b */.. u16 nSize;
1c3ed 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
1c3ee 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 the cell content
1c3ef 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 on the main b-t
1c3f0 72 65 65 20 70 61 67 65 20 2a 2f 0d 0a 7d 3b 0d ree page */..};.
1c3f1 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 78 69 6d 75 .../*..** Maximu
1c3f2 6d 20 64 65 70 74 68 20 6f 66 20 61 6e 20 53 51 m depth of an SQ
1c3f3 4c 69 74 65 20 42 2d 54 72 65 65 20 73 74 72 75 Lite B-Tree stru
1c3f4 63 74 75 72 65 2e 20 41 6e 79 20 42 2d 54 72 65 cture. Any B-Tre
1c3f5 65 20 64 65 65 70 65 72 20 74 68 61 6e 0d 0a 2a e deeper than..*
1c3f6 2a 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 64 * this will be d
1c3f7 65 63 6c 61 72 65 64 20 63 6f 72 72 75 70 74 2e eclared corrupt.
1c3f8 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 63 This value is c
1c3f9 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 alculated based
1c3fa 6f 6e 20 61 0d 0a 2a 2a 20 6d 61 78 69 6d 75 6d on a..** maximum
1c3fb 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 6f database size o
1c3fc 66 20 32 5e 33 31 20 70 61 67 65 73 20 61 20 6d f 2^31 pages a m
1c3fd 69 6e 69 6d 75 6d 20 66 61 6e 6f 75 74 20 6f 66 inimum fanout of
1c3fe 20 32 20 66 6f 72 20 61 0d 0a 2a 2a 20 72 6f 6f 2 for a..** roo
1c3ff 74 2d 6e 6f 64 65 20 61 6e 64 20 33 20 66 6f 72 t-node and 3 for
1c400 20 61 6c 6c 20 6f 74 68 65 72 20 69 6e 74 65 72 all other inter
1c401 6e 61 6c 20 6e 6f 64 65 73 2e 0d 0a 2a 2a 0d 0a nal nodes...**..
1c402 2a 2a 20 49 66 20 61 20 74 72 65 65 20 74 68 61 ** If a tree tha
1c403 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 t appears to be
1c404 74 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 taller than this
1c405 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c is encountered,
1c406 20 69 74 20 69 73 0d 0a 2a 2a 20 61 73 73 75 6d it is..** assum
1c407 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 ed that the data
1c408 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 2e base is corrupt.
1c409 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 42 54 ..*/..#define BT
1c40a 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 CURSOR_MAX_DEPTH
1c40b 20 32 30 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 20..../*..** A
1c40c 63 75 72 73 6f 72 20 69 73 20 61 20 70 6f 69 6e cursor is a poin
1c40d 74 65 72 20 74 6f 20 61 20 70 61 72 74 69 63 75 ter to a particu
1c40e 6c 61 72 20 65 6e 74 72 79 20 77 69 74 68 69 6e lar entry within
1c40f 20 61 20 70 61 72 74 69 63 75 6c 61 72 0d 0a 2a a particular..*
1c410 2a 20 62 2d 74 72 65 65 20 77 69 74 68 69 6e 20 * b-tree within
1c411 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e a database file.
1c412 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 65 6e 74 ..**..** The ent
1c413 72 79 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 ry is identified
1c414 20 62 79 20 69 74 73 20 4d 65 6d 50 61 67 65 20 by its MemPage
1c415 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e and the index in
1c416 0d 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 43 65 ..** MemPage.aCe
1c417 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e 74 72 ll[] of the entr
1c418 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 73 69 6e y...**..** A sin
1c419 67 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c gle database fil
1c41a 65 20 63 61 6e 20 62 65 20 73 68 61 72 65 64 20 e can be shared
1c41b 62 79 20 74 77 6f 20 6d 6f 72 65 20 64 61 74 61 by two more data
1c41c 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 base connections
1c41d 2c 0d 0a 2a 2a 20 62 75 74 20 63 75 72 73 6f 72 ,..** but cursor
1c41e 73 20 63 61 6e 6e 6f 74 20 62 65 20 73 68 61 72 s cannot be shar
1c41f 65 64 2e 20 20 45 61 63 68 20 63 75 72 73 6f 72 ed. Each cursor
1c420 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 is associated w
1c421 69 74 68 20 61 0d 0a 2a 2a 20 70 61 72 74 69 63 ith a..** partic
1c422 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 63 6f ular database co
1c423 6e 6e 65 63 74 69 6f 6e 20 69 64 65 6e 74 69 66 nnection identif
1c424 69 65 64 20 42 74 43 75 72 73 6f 72 2e 70 42 74 ied BtCursor.pBt
1c425 72 65 65 2e 64 62 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 ree.db...**..**
1c426 46 69 65 6c 64 73 20 69 6e 20 74 68 69 73 20 73 Fields in this s
1c427 74 72 75 63 74 75 72 65 20 61 72 65 20 61 63 63 tructure are acc
1c428 65 73 73 65 64 20 75 6e 64 65 72 20 74 68 65 20 essed under the
1c429 42 74 53 68 61 72 65 64 2e 6d 75 74 65 78 0d 0a BtShared.mutex..
1c42a 2a 2a 20 66 6f 75 6e 64 20 61 74 20 73 65 6c 66 ** found at self
1c42b 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 2e 20 0d 0a ->pBt->mutex. ..
1c42c 2a 2f 0d 0a 73 74 72 75 63 74 20 42 74 43 75 72 */..struct BtCur
1c42d 73 6f 72 20 7b 0d 0a 20 20 42 74 72 65 65 20 2a sor {.. Btree *
1c42e 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 20 pBtree;
1c42f 20 20 20 2f 2a 20 54 68 65 20 42 74 72 65 65 20 /* The Btree
1c430 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 63 75 to which this cu
1c431 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a 2f 0d rsor belongs */.
1c432 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 . BtShared *pBt
1c433 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
1c434 54 68 65 20 42 74 53 68 61 72 65 64 20 74 68 69 The BtShared thi
1c435 73 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 s cursor points
1c436 74 6f 20 2a 2f 0d 0a 20 20 42 74 43 75 72 73 6f to */.. BtCurso
1c437 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 r *pNext, *pPrev
1c438 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61 20 6c 69 ; /* Forms a li
1c439 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c nked list of all
1c43a 20 63 75 72 73 6f 72 73 20 2a 2f 0d 0a 20 20 73 cursors */.. s
1c43b 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 truct KeyInfo *p
1c43c 4b 65 79 49 6e 66 6f 3b 20 2f 2a 20 41 72 67 75 KeyInfo; /* Argu
1c43d 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 63 ment passed to c
1c43e 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 omparison functi
1c43f 6f 6e 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 70 67 on */.. Pgno pg
1c440 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 noRoot;
1c441 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 /* The root p
1c442 61 67 65 20 6f 66 20 74 68 69 73 20 74 72 65 65 age of this tree
1c443 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 */.. sqlite3_i
1c444 6e 74 36 34 20 63 61 63 68 65 64 52 6f 77 69 64 nt64 cachedRowid
1c445 3b 20 2f 2a 20 4e 65 78 74 20 72 6f 77 69 64 20 ; /* Next rowid
1c446 63 61 63 68 65 2e 20 20 30 20 6d 65 61 6e 73 20 cache. 0 means
1c447 6e 6f 74 20 76 61 6c 69 64 20 2a 2f 0d 0a 20 20 not valid */..
1c448 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 CellInfo info;
1c449 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 /* A p
1c44a 61 72 73 65 20 6f 66 20 74 68 65 20 63 65 6c 6c arse of the cell
1c44b 20 77 65 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 we are pointing
1c44c 20 61 74 20 2a 2f 0d 0a 20 20 69 36 34 20 6e 4b at */.. i64 nK
1c44d 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 ey; /* Si
1c44e 7a 65 20 6f 66 20 70 4b 65 79 2c 20 6f 72 20 6c ze of pKey, or l
1c44f 61 73 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 ast integer key
1c450 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 */.. void *pKey
1c451 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 ; /* Saved
1c452 6b 65 79 20 74 68 61 74 20 77 61 73 20 63 75 72 key that was cur
1c453 73 6f 72 27 73 20 6c 61 73 74 20 6b 6e 6f 77 6e sor's last known
1c454 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0d 0a 20 20 position */..
1c455 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 20 20 20 int skipNext;
1c456 20 2f 2a 20 50 72 65 76 28 29 20 69 73 20 6e 6f /* Prev() is no
1c457 6f 70 20 69 66 20 6e 65 67 61 74 69 76 65 2e 20 op if negative.
1c458 4e 65 78 74 28 29 20 69 73 20 6e 6f 6f 70 20 69 Next() is noop i
1c459 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0d 0a 20 f positive */..
1c45a 20 75 38 20 77 72 46 6c 61 67 3b 20 20 20 20 20 u8 wrFlag;
1c45b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
1c45c 75 65 20 69 66 20 77 72 69 74 61 62 6c 65 20 2a ue if writable *
1c45d 2f 0d 0a 20 20 75 38 20 61 74 4c 61 73 74 3b 20 /.. u8 atLast;
1c45e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c45f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e * Cursor pointin
1c460 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e g to the last en
1c461 74 72 79 20 2a 2f 0d 0a 20 20 75 38 20 76 61 6c try */.. u8 val
1c462 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 idNKey;
1c463 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 /* True if i
1c464 6e 66 6f 2e 6e 4b 65 79 20 69 73 20 76 61 6c 69 nfo.nKey is vali
1c465 64 20 2a 2f 0d 0a 20 20 75 38 20 65 53 74 61 74 d */.. u8 eStat
1c466 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1c467 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 /* One of the
1c468 43 55 52 53 4f 52 5f 58 58 58 20 63 6f 6e 73 74 CURSOR_XXX const
1c469 61 6e 74 73 20 28 73 65 65 20 62 65 6c 6f 77 29 ants (see below)
1c46a 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c */..#ifndef SQL
1c46b 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f ITE_OMIT_INCRBLO
1c46c 42 0d 0a 20 20 50 67 6e 6f 20 2a 61 4f 76 65 72 B.. Pgno *aOver
1c46d 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f flow; /
1c46e 2a 20 43 61 63 68 65 20 6f 66 20 6f 76 65 72 66 * Cache of overf
1c46f 6c 6f 77 20 70 61 67 65 20 6c 6f 63 61 74 69 6f low page locatio
1c470 6e 73 20 2a 2f 0d 0a 20 20 75 38 20 69 73 49 6e ns */.. u8 isIn
1c471 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3b 20 20 20 crblobHandle;
1c472 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 /* True if th
1c473 69 73 20 63 75 72 73 6f 72 20 69 73 20 61 6e 20 is cursor is an
1c474 69 6e 63 72 2e 20 69 6f 20 68 61 6e 64 6c 65 20 incr. io handle
1c475 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 31 */..#endif.. i1
1c476 36 20 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 6 iPage;
1c477 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c478 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 /* Index of
1c479 63 75 72 72 65 6e 74 20 70 61 67 65 20 69 6e 20 current page in
1c47a 61 70 50 61 67 65 20 2a 2f 0d 0a 20 20 75 31 36 apPage */.. u16
1c47b 20 61 69 49 64 78 5b 42 54 43 55 52 53 4f 52 5f aiIdx[BTCURSOR_
1c47c 4d 41 58 5f 44 45 50 54 48 5d 3b 20 20 20 20 20 MAX_DEPTH];
1c47d 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e /* Current in
1c47e 64 65 78 20 69 6e 20 61 70 50 61 67 65 5b 69 5d dex in apPage[i]
1c47f 20 2a 2f 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a */.. MemPage *
1c480 61 70 50 61 67 65 5b 42 54 43 55 52 53 4f 52 5f apPage[BTCURSOR_
1c481 4d 41 58 5f 44 45 50 54 48 5d 3b 20 20 2f 2a 20 MAX_DEPTH]; /*
1c482 50 61 67 65 73 20 66 72 6f 6d 20 72 6f 6f 74 20 Pages from root
1c483 74 6f 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 to current page
1c484 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a */..};..../*..**
1c485 20 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75 65 Potential value
1c486 73 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e 65 s for BtCursor.e
1c487 53 74 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 State...**..** C
1c488 55 52 53 4f 52 5f 56 41 4c 49 44 3a 0d 0a 2a 2a URSOR_VALID:..**
1c489 20 20 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 Cursor points
1c48a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 to a valid entr
1c48b 79 2e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 y. getPayload()
1c48c 65 74 63 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c etc. may be call
1c48d 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 55 52 53 ed...**..** CURS
1c48e 4f 52 5f 49 4e 56 41 4c 49 44 3a 0d 0a 2a 2a 20 OR_INVALID:..**
1c48f 20 20 43 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f Cursor does no
1c490 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c t point to a val
1c491 69 64 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 id entry. This c
1c492 61 6e 20 68 61 70 70 65 6e 20 28 66 6f 72 20 65 an happen (for e
1c493 78 61 6d 70 6c 65 29 20 0d 0a 2a 2a 20 20 20 62 xample) ..** b
1c494 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 ecause the table
1c495 20 69 73 20 65 6d 70 74 79 20 6f 72 20 62 65 63 is empty or bec
1c496 61 75 73 65 20 42 74 72 65 65 43 75 72 73 6f 72 ause BtreeCursor
1c497 46 69 72 73 74 28 29 20 68 61 73 20 6e 6f 74 20 First() has not
1c498 62 65 65 6e 0d 0a 2a 2a 20 20 20 63 61 6c 6c 65 been..** calle
1c499 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 55 52 53 4f d...**..** CURSO
1c49a 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3a 0d 0a R_REQUIRESEEK:..
1c49b 2a 2a 20 20 20 54 68 65 20 74 61 62 6c 65 20 74 ** The table t
1c49c 68 61 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 hat this cursor
1c49d 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 73 74 was opened on st
1c49e 69 6c 6c 20 65 78 69 73 74 73 2c 20 62 75 74 20 ill exists, but
1c49f 68 61 73 20 62 65 65 6e 20 0d 0a 2a 2a 20 20 20 has been ..**
1c4a0 6d 6f 64 69 66 69 65 64 20 73 69 6e 63 65 20 74 modified since t
1c4a1 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6c 61 he cursor was la
1c4a2 73 74 20 75 73 65 64 2e 20 54 68 65 20 63 75 72 st used. The cur
1c4a3 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 sor position is
1c4a4 73 61 76 65 64 0d 0a 2a 2a 20 20 20 69 6e 20 76 saved..** in v
1c4a5 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f ariables BtCurso
1c4a6 72 2e 70 4b 65 79 20 61 6e 64 20 42 74 43 75 72 r.pKey and BtCur
1c4a7 73 6f 72 2e 6e 4b 65 79 2e 20 57 68 65 6e 20 61 sor.nKey. When a
1c4a8 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 0d 0a cursor is in ..
1c4a9 2a 2a 20 20 20 74 68 69 73 20 73 74 61 74 65 2c ** this state,
1c4aa 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f restoreCursorPo
1c4ab 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62 65 20 sition() can be
1c4ac 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65 6d 70 called to attemp
1c4ad 74 20 74 6f 0d 0a 2a 2a 20 20 20 73 65 65 6b 20 t to..** seek
1c4ae 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 the cursor to th
1c4af 65 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e e saved position
1c4b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 43 55 52 53 4f 52 ...**..** CURSOR
1c4b1 5f 46 41 55 4c 54 3a 0d 0a 2a 2a 20 20 20 41 20 _FAULT:..** A
1c4b2 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 65 72 unrecoverable er
1c4b3 72 6f 72 20 28 61 6e 20 49 2f 4f 20 65 72 72 6f ror (an I/O erro
1c4b4 72 20 6f 72 20 61 20 6d 61 6c 6c 6f 63 20 66 61 r or a malloc fa
1c4b5 69 6c 75 72 65 29 20 68 61 73 20 6f 63 63 75 72 ilure) has occur
1c4b6 72 65 64 0d 0a 2a 2a 20 20 20 6f 6e 20 61 20 64 red..** on a d
1c4b7 69 66 66 65 72 65 6e 74 20 63 6f 6e 6e 65 63 74 ifferent connect
1c4b8 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 ion that shares
1c4b9 74 68 65 20 42 74 53 68 61 72 65 64 20 63 61 63 the BtShared cac
1c4ba 68 65 20 77 69 74 68 20 74 68 69 73 0d 0a 2a 2a he with this..**
1c4bb 20 20 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 cursor. The
1c4bc 65 72 72 6f 72 20 68 61 73 20 6c 65 66 74 20 74 error has left t
1c4bd 68 65 20 63 61 63 68 65 20 69 6e 20 61 6e 20 69 he cache in an i
1c4be 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 nconsistent stat
1c4bf 65 2e 0d 0a 2a 2a 20 20 20 44 6f 20 6e 6f 74 68 e...** Do noth
1c4c0 69 6e 67 20 65 6c 73 65 20 77 69 74 68 20 74 68 ing else with th
1c4c1 69 73 20 63 75 72 73 6f 72 2e 20 20 41 6e 79 20 is cursor. Any
1c4c2 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 attempt to use t
1c4c3 68 65 20 63 75 72 73 6f 72 0d 0a 2a 2a 20 20 20 he cursor..**
1c4c4 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 should return th
1c4c5 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 74 6f e error code sto
1c4c6 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e red in BtCursor.
1c4c7 73 6b 69 70 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e skip..*/..#defin
1c4c8 65 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 e CURSOR_INVALID
1c4c9 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 23 64 0..#d
1c4ca 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 56 41 4c efine CURSOR_VAL
1c4cb 49 44 20 20 20 20 20 20 20 20 20 20 20 20 20 31 ID 1
1c4cc 0d 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 ..#define CURSOR
1c4cd 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20 20 20 _REQUIRESEEK
1c4ce 20 20 20 32 0d 0a 23 64 65 66 69 6e 65 20 43 55 2..#define CU
1c4cf 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 20 20 20 RSOR_FAULT
1c4d0 20 20 20 20 20 20 20 33 0d 0a 0d 0a 2f 2a 20 0d 3..../* .
1c4d1 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 .** The database
1c4d2 20 70 61 67 65 20 74 68 65 20 50 45 4e 44 49 4e page the PENDIN
1c4d3 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65 73 2e G_BYTE occupies.
1c4d4 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 This page is ne
1c4d5 76 65 72 20 75 73 65 64 2e 0d 0a 2a 2f 0d 0a 23 ver used...*/..#
1c4d6 20 64 65 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f define PENDING_
1c4d7 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 50 BYTE_PAGE(pBt) P
1c4d8 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 42 74 AGER_MJ_PGNO(pBt
1c4d9 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 73 )..../*..** Thes
1c4da 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 e macros define
1c4db 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 the location of
1c4dc 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 the pointer-map
1c4dd 65 6e 74 72 79 20 66 6f 72 20 61 20 0d 0a 2a 2a entry for a ..**
1c4de 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 database page.
1c4df 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 The first argume
1c4e0 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 nt to each is th
1c4e1 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 e number of usab
1c4e2 6c 65 0d 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 le..** bytes on
1c4e3 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 each page of the
1c4e4 20 64 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e database (often
1c4e5 20 31 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 1024). The seco
1c4e6 6e 64 20 69 73 20 74 68 65 0d 0a 2a 2a 20 70 61 nd is the..** pa
1c4e7 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f ge number to loo
1c4e8 6b 20 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e k up in the poin
1c4e9 74 65 72 20 6d 61 70 2e 0d 0a 2a 2a 0d 0a 2a 2a ter map...**..**
1c4ea 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 72 PTRMAP_PAGENO r
1c4eb 65 74 75 72 6e 73 20 74 68 65 20 64 61 74 61 62 eturns the datab
1c4ec 61 73 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 ase page number
1c4ed 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d of the pointer-m
1c4ee 61 70 0d 0a 2a 2a 20 70 61 67 65 20 74 68 61 74 ap..** page that
1c4ef 20 73 74 6f 72 65 73 20 74 68 65 20 72 65 71 75 stores the requ
1c4f0 69 72 65 64 20 70 6f 69 6e 74 65 72 2e 20 50 54 ired pointer. PT
1c4f1 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 20 72 RMAP_PTROFFSET r
1c4f2 65 74 75 72 6e 73 0d 0a 2a 2a 20 74 68 65 20 6f eturns..** the o
1c4f3 66 66 73 65 74 20 6f 66 20 74 68 65 20 72 65 71 ffset of the req
1c4f4 75 65 73 74 65 64 20 6d 61 70 20 65 6e 74 72 79 uested map entry
1c4f5 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
1c4f6 20 70 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 70 pgno argument p
1c4f7 61 73 73 65 64 20 74 6f 20 50 54 52 4d 41 50 5f assed to PTRMAP_
1c4f8 50 41 47 45 4e 4f 20 69 73 20 61 20 70 6f 69 6e PAGENO is a poin
1c4f9 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 0d 0a 2a ter-map page,..*
1c4fa 2a 20 74 68 65 6e 20 70 67 6e 6f 20 69 73 20 72 * then pgno is r
1c4fb 65 74 75 72 6e 65 64 2e 20 53 6f 20 28 70 67 6e eturned. So (pgn
1c4fc 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f o==PTRMAP_PAGENO
1c4fd 28 70 67 73 7a 2c 20 70 67 6e 6f 29 29 20 63 61 (pgsz, pgno)) ca
1c4fe 6e 20 62 65 0d 0a 2a 2a 20 75 73 65 64 20 74 6f n be..** used to
1c4ff 20 74 65 73 74 20 69 66 20 70 67 6e 6f 20 69 73 test if pgno is
1c500 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 a pointer-map p
1c501 61 67 65 2e 20 50 54 52 4d 41 50 5f 49 53 50 41 age. PTRMAP_ISPA
1c502 47 45 20 69 6d 70 6c 65 6d 65 6e 74 73 0d 0a 2a GE implements..*
1c503 2a 20 74 68 69 73 20 74 65 73 74 2e 0d 0a 2a 2f * this test...*/
1c504 0d 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 ..#define PTRMAP
1c505 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e _PAGENO(pBt, pgn
1c506 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 o) ptrmapPageno(
1c507 70 42 74 2c 20 70 67 6e 6f 29 0d 0a 23 64 65 66 pBt, pgno)..#def
1c508 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 ine PTRMAP_PTROF
1c509 46 53 45 54 28 70 67 70 74 72 6d 61 70 2c 20 70 FSET(pgptrmap, p
1c50a 67 6e 6f 29 20 28 35 2a 28 70 67 6e 6f 2d 70 67 gno) (5*(pgno-pg
1c50b 70 74 72 6d 61 70 2d 31 29 29 0d 0a 23 64 65 66 ptrmap-1))..#def
1c50c 69 6e 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47 ine PTRMAP_ISPAG
1c50d 45 28 70 42 74 2c 20 70 67 6e 6f 29 20 28 50 54 E(pBt, pgno) (PT
1c50e 52 4d 41 50 5f 50 41 47 45 4e 4f 28 28 70 42 74 RMAP_PAGENO((pBt
1c50f 29 2c 28 70 67 6e 6f 29 29 3d 3d 28 70 67 6e 6f ),(pgno))==(pgno
1c510 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 ))..../*..** The
1c511 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 pointer map is
1c512 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 74 a lookup table t
1c513 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 hat identifies t
1c514 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 66 he parent page f
1c515 6f 72 0d 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c or..** each chil
1c516 64 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 d page in the da
1c517 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 tabase file. Th
1c518 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 e parent page is
1c519 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0d 0a the page that..
1c51a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f ** contains a po
1c51b 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 inter to the chi
1c51c 6c 64 2e 20 20 45 76 65 72 79 20 70 61 67 65 20 ld. Every page
1c51d 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 in the database
1c51e 63 6f 6e 74 61 69 6e 73 0d 0a 2a 2a 20 30 20 6f contains..** 0 o
1c51f 72 20 31 20 70 61 72 65 6e 74 20 70 61 67 65 73 r 1 parent pages
1c520 2e 20 20 28 49 6e 20 74 68 69 73 20 63 6f 6e 74 . (In this cont
1c521 65 78 74 20 27 64 61 74 61 62 61 73 65 20 70 61 ext 'database pa
1c522 67 65 27 20 72 65 66 65 72 73 0d 0a 2a 2a 20 74 ge' refers..** t
1c523 6f 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 o any page that
1c524 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 74 is not part of t
1c525 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 he pointer map i
1c526 74 73 65 6c 66 2e 29 20 20 45 61 63 68 20 70 6f tself.) Each po
1c527 69 6e 74 65 72 20 6d 61 70 0d 0a 2a 2a 20 65 6e inter map..** en
1c528 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 try consists of
1c529 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 27 74 a single byte 't
1c52a 79 70 65 27 20 61 6e 64 20 61 20 34 20 62 79 74 ype' and a 4 byt
1c52b 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 e parent page nu
1c52c 6d 62 65 72 2e 0d 0a 2a 2a 20 54 68 65 20 50 54 mber...** The PT
1c52d 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74 69 66 RMAP_XXX identif
1c52e 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65 20 74 iers below are t
1c52f 68 65 20 76 61 6c 69 64 20 74 79 70 65 73 2e 0d he valid types..
1c530 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 75 72 70 .**..** The purp
1c531 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 ose of the point
1c532 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63 er map is to fac
1c533 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67 ility moving pag
1c534 65 73 20 66 72 6f 6d 20 6f 6e 65 0d 0a 2a 2a 20 es from one..**
1c535 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 position in the
1c536 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 file to another
1c537 61 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 as part of autov
1c538 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 acuum. When a p
1c539 61 67 65 0d 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 age..** is moved
1c53a 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e , the pointer in
1c53b 20 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 its parent must
1c53c 20 62 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 be updated to p
1c53d 6f 69 6e 74 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 oint to the..**
1c53e 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 new location. T
1c53f 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 he pointer map i
1c540 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 s used to locate
1c541 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 the parent page
1c542 20 71 75 69 63 6b 6c 79 2e 0d 0a 2a 2a 0d 0a 2a quickly...**..*
1c543 2a 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 * PTRMAP_ROOTPAG
1c544 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 E: The database
1c545 70 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d 70 page is a root-p
1c546 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 age. The page-nu
1c547 6d 62 65 72 20 69 73 20 6e 6f 74 0d 0a 2a 2a 20 mber is not..**
1c548 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c549 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 used in this ca
1c54a 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 54 52 4d se...**..** PTRM
1c54b 41 50 5f 46 52 45 45 50 41 47 45 3a 20 54 68 65 AP_FREEPAGE: The
1c54c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 database page i
1c54d 73 20 61 6e 20 75 6e 75 73 65 64 20 28 66 72 65 s an unused (fre
1c54e 65 29 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 e) page. The pag
1c54f 65 2d 6e 75 6d 62 65 72 20 0d 0a 2a 2a 20 20 20 e-number ..**
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
1c551 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74 68 s not used in th
1c552 69 73 20 63 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a is case...**..**
1c553 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 PTRMAP_OVERFLOW
1c554 31 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 1: The database
1c555 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 page is the firs
1c556 74 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74 t page in a list
1c557 20 6f 66 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 of ..**
1c558 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 overf
1c559 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 low pages. The p
1c55a 61 67 65 20 6e 75 6d 62 65 72 20 69 64 65 6e 74 age number ident
1c55b 69 66 69 65 73 20 74 68 65 20 70 61 67 65 20 74 ifies the page t
1c55c 68 61 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 hat..**
1c55d 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69 contai
1c55e 6e 73 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 ns the cell with
1c55f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
1c560 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 is overflow page
1c561 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 50 54 52 4d 41 50 ...**..** PTRMAP
1c562 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65 20 _OVERFLOW2: The
1c563 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 database page is
1c564 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c the second or l
1c565 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20 6c ater page in a l
1c566 69 73 74 20 6f 66 0d 0a 2a 2a 20 20 20 20 20 20 ist of..**
1c567 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 ove
1c568 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 rflow pages. The
1c569 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65 page-number ide
1c56a 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76 ntifies the prev
1c56b 69 6f 75 73 0d 0a 2a 2a 20 20 20 20 20 20 20 20 ious..**
1c56c 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 page
1c56d 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 in the overflow
1c56e 70 61 67 65 20 6c 69 73 74 2e 0d 0a 2a 2a 0d 0a page list...**..
1c56f 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a ** PTRMAP_BTREE:
1c570 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61 The database pa
1c571 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 ge is a non-root
1c572 20 62 74 72 65 65 20 70 61 67 65 2e 20 54 68 65 btree page. The
1c573 20 70 61 67 65 20 6e 75 6d 62 65 72 0d 0a 2a 2a page number..**
1c574 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
1c575 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 dentifies the pa
1c576 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68 65 rent page in the
1c577 20 62 74 72 65 65 2e 0d 0a 2a 2f 0d 0a 23 64 65 btree...*/..#de
1c578 66 69 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54 fine PTRMAP_ROOT
1c579 50 41 47 45 20 31 0d 0a 23 64 65 66 69 6e 65 20 PAGE 1..#define
1c57a 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 PTRMAP_FREEPAGE
1c57b 32 0d 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 2..#define PTRMA
1c57c 50 5f 4f 56 45 52 46 4c 4f 57 31 20 33 0d 0a 23 P_OVERFLOW1 3..#
1c57d 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 define PTRMAP_OV
1c57e 45 52 46 4c 4f 57 32 20 34 0d 0a 23 64 65 66 69 ERFLOW2 4..#defi
1c57f 6e 65 20 50 54 52 4d 41 50 5f 42 54 52 45 45 20 ne PTRMAP_BTREE
1c580 35 0d 0a 0d 0a 2f 2a 20 41 20 62 75 6e 63 68 20 5..../* A bunch
1c581 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 of assert() stat
1c582 65 6d 65 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 ements to check
1c583 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 the transaction
1c584 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 0d state variables.
1c585 0a 2a 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70 20 .** of handle p
1c586 28 74 79 70 65 20 42 74 72 65 65 2a 29 20 61 72 (type Btree*) ar
1c587 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e e internally con
1c588 73 69 73 74 65 6e 74 2e 0d 0a 2a 2f 0d 0a 23 64 sistent...*/..#d
1c589 65 66 69 6e 65 20 62 74 72 65 65 49 6e 74 65 67 efine btreeInteg
1c58a 72 69 74 79 28 70 29 20 5c 0d 0a 20 20 61 73 73 rity(p) \.. ass
1c58b 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 ert( p->pBt->inT
1c58c 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e ransaction!=TRAN
1c58d 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 S_NONE || p->pBt
1c58e 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d ->nTransaction==
1c58f 30 20 29 3b 20 5c 0d 0a 20 20 61 73 73 65 72 74 0 ); \.. assert
1c590 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e ( p->pBt->inTran
1c591 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e 54 72 saction>=p->inTr
1c592 61 6e 73 20 29 3b 20 0d 0a 0d 0a 0d 0a 2f 2a 0d ans ); ....../*.
1c593 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41 .** The ISAUTOVA
1c594 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73 CUUM macro is us
1c595 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63 ed within balanc
1c596 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64 e_nonroot() to d
1c597 65 74 65 72 6d 69 6e 65 0d 0a 2a 2a 20 69 66 20 etermine..** if
1c598 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 the database sup
1c599 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 ports auto-vacuu
1c59a 6d 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 m or not. Becaus
1c59b 65 20 69 74 20 69 73 20 75 73 65 64 0d 0a 2a 2a e it is used..**
1c59c 20 77 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65 within an expre
1c59d 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e ssion that is an
1c59e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f argument to ano
1c59f 74 68 65 72 20 6d 61 63 72 6f 20 0d 0a 2a 2a 20 ther macro ..**
1c5a0 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 (sqliteMallocRaw
1c5a1 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 ), it is not pos
1c5a2 73 69 62 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e sible to use con
1c5a3 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 ditional compila
1c5a4 74 69 6f 6e 2e 0d 0a 2a 2a 20 53 6f 2c 20 74 68 tion...** So, th
1c5a5 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 is macro is defi
1c5a6 6e 65 64 20 69 6e 73 74 65 61 64 2e 0d 0a 2a 2f ned instead...*/
1c5a7 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1c5a8 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d _OMIT_AUTOVACUUM
1c5a9 0d 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f ..#define ISAUTO
1c5aa 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 VACUUM (pBt->aut
1c5ab 6f 56 61 63 75 75 6d 29 0d 0a 23 65 6c 73 65 0d oVacuum)..#else.
1c5ac 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 .#define ISAUTOV
1c5ad 41 43 55 55 4d 20 30 0d 0a 23 65 6e 64 69 66 0d ACUUM 0..#endif.
1c5ae 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 ...../*..** This
1c5af 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61 structure is pa
1c5b0 73 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f ssed around thro
1c5b1 75 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 ugh all the sani
1c5b2 74 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 ty checking rout
1c5b3 69 6e 65 73 0d 0a 2a 2a 20 69 6e 20 6f 72 64 65 ines..** in orde
1c5b4 72 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 r to keep track
1c5b5 6f 66 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 of some global s
1c5b6 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e tate information
1c5b7 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 ...*/..typedef s
1c5b8 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79 43 truct IntegrityC
1c5b9 6b 20 49 6e 74 65 67 72 69 74 79 43 6b 3b 0d 0a k IntegrityCk;..
1c5ba 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79 struct Integrity
1c5bb 43 6b 20 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 Ck {.. BtShared
1c5bc 20 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 *pBt; /* The
1c5bd 20 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 tree being chec
1c5be 6b 65 64 20 6f 75 74 20 2a 2f 0d 0a 20 20 50 61 ked out */.. Pa
1c5bf 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 ger *pPager;
1c5c0 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 /* The associate
1c5c1 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20 61 d pager. Also a
1c5c2 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42 74 ccessible by pBt
1c5c3 2d 3e 70 50 61 67 65 72 20 2a 2f 0d 0a 20 20 50 ->pPager */.. P
1c5c4 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 gno nPage;
1c5c5 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
1c5c6 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 ges in the datab
1c5c7 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 61 ase */.. int *a
1c5c8 6e 52 65 66 3b 20 20 20 20 20 20 20 2f 2a 20 4e nRef; /* N
1c5c9 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 65 umber of times e
1c5ca 61 63 68 20 70 61 67 65 20 69 73 20 72 65 66 65 ach page is refe
1c5cb 72 65 6e 63 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 renced */.. int
1c5cc 20 6d 78 45 72 72 3b 20 20 20 20 20 20 20 20 2f mxErr; /
1c5cd 2a 20 53 74 6f 70 20 61 63 63 75 6d 75 6c 61 74 * Stop accumulat
1c5ce 69 6e 67 20 65 72 72 6f 72 73 20 77 68 65 6e 20 ing errors when
1c5cf 74 68 69 73 20 72 65 61 63 68 65 73 20 7a 65 72 this reaches zer
1c5d0 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 45 72 72 o */.. int nErr
1c5d1 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d ; /* Num
1c5d2 62 65 72 20 6f 66 20 6d 65 73 73 61 67 65 73 20 ber of messages
1c5d3 77 72 69 74 74 65 6e 20 74 6f 20 7a 45 72 72 4d written to zErrM
1c5d4 73 67 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20 sg so far */..
1c5d5 69 6e 74 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 int mallocFailed
1c5d6 3b 20 2f 2a 20 41 20 6d 65 6d 6f 72 79 20 61 6c ; /* A memory al
1c5d7 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 location error h
1c5d8 61 73 20 6f 63 63 75 72 72 65 64 20 2a 2f 0d 0a as occurred */..
1c5d9 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 StrAccum errMs
1c5da 67 3b 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 g; /* Accumulat
1c5db 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 e the error mess
1c5dc 61 67 65 20 74 65 78 74 20 68 65 72 65 20 2a 2f age text here */
1c5dd 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 ..};..../*..** R
1c5de 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64 20 outines to read
1c5df 6f 72 20 77 72 69 74 65 20 61 20 74 77 6f 2d 20 or write a two-
1c5e0 61 6e 64 20 66 6f 75 72 2d 62 79 74 65 20 62 69 and four-byte bi
1c5e1 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 g-endian integer
1c5e2 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f 0d 0a 23 64 values...*/..#d
1c5e3 65 66 69 6e 65 20 67 65 74 32 62 79 74 65 28 78 efine get2byte(x
1c5e4 29 20 20 20 28 28 78 29 5b 30 5d 3c 3c 38 20 7c ) ((x)[0]<<8 |
1c5e5 20 28 78 29 5b 31 5d 29 0d 0a 23 64 65 66 69 6e (x)[1])..#defin
1c5e6 65 20 70 75 74 32 62 79 74 65 28 70 2c 76 29 20 e put2byte(p,v)
1c5e7 28 28 70 29 5b 30 5d 20 3d 20 28 75 38 29 28 28 ((p)[0] = (u8)((
1c5e8 76 29 3e 3e 38 29 2c 20 28 70 29 5b 31 5d 20 3d v)>>8), (p)[1] =
1c5e9 20 28 75 38 29 28 76 29 29 0d 0a 23 64 65 66 69 (u8)(v))..#defi
1c5ea 6e 65 20 67 65 74 34 62 79 74 65 20 73 71 6c 69 ne get4byte sqli
1c5eb 74 65 33 47 65 74 34 62 79 74 65 0d 0a 23 64 65 te3Get4byte..#de
1c5ec 66 69 6e 65 20 70 75 74 34 62 79 74 65 20 73 71 fine put4byte sq
1c5ed 6c 69 74 65 33 50 75 74 34 62 79 74 65 0d 0a 0d lite3Put4byte...
1c5ee 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
1c5ef 20 45 6e 64 20 6f 66 20 62 74 72 65 65 49 6e 74 End of btreeInt
1c5f0 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .h *************
1c5f1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c5f2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
1c5f3 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
1c5f4 2a 20 43 6f 6e 74 69 6e 75 69 6e 67 20 77 68 65 * Continuing whe
1c5f5 72 65 20 77 65 20 6c 65 66 74 20 6f 66 66 20 69 re we left off i
1c5f6 6e 20 62 74 6d 75 74 65 78 2e 63 20 2a 2a 2a 2a n btmutex.c ****
1c5f7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c5f8 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 /..#ifndef SQLIT
1c5f9 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 E_OMIT_SHARED_CA
1c5fa 43 48 45 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f CHE..#if SQLITE_
1c5fb 54 48 52 45 41 44 53 41 46 45 0d 0a 0d 0a 2f 2a THREADSAFE..../*
1c5fc 0d 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 ..** Obtain the
1c5fd 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 20 61 BtShared mutex a
1c5fe 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42 ssociated with B
1c5ff 2d 54 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 -Tree handle p.
1c600 41 6c 73 6f 2c 0d 0a 2a 2a 20 73 65 74 20 42 74 Also,..** set Bt
1c601 53 68 61 72 65 64 2e 64 62 20 74 6f 20 74 68 65 Shared.db to the
1c602 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 database handle
1c603 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
1c604 20 70 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 70 p and the..** p
1c605 2d 3e 6c 6f 63 6b 65 64 20 62 6f 6f 6c 65 61 6e ->locked boolean
1c606 20 74 6f 20 74 72 75 65 2e 0d 0a 2a 2f 0d 0a 73 to true...*/..s
1c607 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 63 6b 42 tatic void lockB
1c608 74 72 65 65 4d 75 74 65 78 28 42 74 72 65 65 20 treeMutex(Btree
1c609 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 *p){.. assert(
1c60a 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0d p->locked==0 );.
1c60b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1c60c 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 e3_mutex_notheld
1c60d 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 (p->pBt->mutex)
1c60e 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 );.. assert( sq
1c60f 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
1c610 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 (p->db->mutex) )
1c611 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d ;.... sqlite3_m
1c612 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 42 utex_enter(p->pB
1c613 74 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 70 2d t->mutex);.. p-
1c614 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 >pBt->db = p->db
1c615 3b 0d 0a 20 20 70 2d 3e 6c 6f 63 6b 65 64 20 3d ;.. p->locked =
1c616 20 31 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 1;..}..../*..**
1c617 20 52 65 6c 65 61 73 65 20 74 68 65 20 42 74 53 Release the BtS
1c618 68 61 72 65 64 20 6d 75 74 65 78 20 61 73 73 6f hared mutex asso
1c619 63 69 61 74 65 64 20 77 69 74 68 20 42 2d 54 72 ciated with B-Tr
1c61a 65 65 20 68 61 6e 64 6c 65 20 70 20 61 6e 64 0d ee handle p and.
1c61b 0a 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 70 2d .** clear the p-
1c61c 3e 6c 6f 63 6b 65 64 20 62 6f 6f 6c 65 61 6e 2e >locked boolean.
1c61d 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
1c61e 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 4d 75 74 d unlockBtreeMut
1c61f 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 ex(Btree *p){..
1c620 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d BtShared *pBt =
1c621 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 61 73 73 65 p->pBt;.. asse
1c622 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 31 rt( p->locked==1
1c623 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
1c624 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1c625 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b d(pBt->mutex) );
1c626 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1c627 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1c628 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d ->db->mutex) );.
1c629 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 . assert( p->db
1c62a 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0d 0a 0d 0a ==pBt->db );....
1c62b 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
1c62c 6c 65 61 76 65 28 70 42 74 2d 3e 6d 75 74 65 78 leave(pBt->mutex
1c62d 29 3b 0d 0a 20 20 70 2d 3e 6c 6f 63 6b 65 64 20 );.. p->locked
1c62e 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a = 0;..}..../*..*
1c62f 2a 20 45 6e 74 65 72 20 61 20 6d 75 74 65 78 20 * Enter a mutex
1c630 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 on the given BTr
1c631 65 65 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a ee object...**..
1c632 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74 ** If the object
1c633 20 69 73 20 6e 6f 74 20 73 68 61 72 61 62 6c 65 is not sharable
1c634 2c 20 74 68 65 6e 20 6e 6f 20 6d 75 74 65 78 20 , then no mutex
1c635 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 is ever required
1c636 0d 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f ..** and this ro
1c637 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 utine is a no-op
1c638 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e . The underlyin
1c639 67 20 6d 75 74 65 78 20 69 73 20 6e 6f 6e 2d 72 g mutex is non-r
1c63a 65 63 75 72 73 69 76 65 2e 0d 0a 2a 2a 20 42 75 ecursive...** Bu
1c63b 74 20 77 65 20 6b 65 65 70 20 61 20 72 65 66 65 t we keep a refe
1c63c 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 6e 20 42 rence count in B
1c63d 74 72 65 65 2e 77 61 6e 74 54 6f 4c 6f 63 6b 20 tree.wantToLock
1c63e 73 6f 20 74 68 65 20 62 65 68 61 76 69 6f 72 0d so the behavior.
1c63f 0a 2a 2a 20 6f 66 20 74 68 69 73 20 69 6e 74 65 .** of this inte
1c640 72 66 61 63 65 20 69 73 20 72 65 63 75 72 73 69 rface is recursi
1c641 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 6f 20 61 ve...**..** To a
1c642 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20 void deadlocks,
1c643 6d 75 6c 74 69 70 6c 65 20 42 74 72 65 65 73 20 multiple Btrees
1c644 61 72 65 20 6c 6f 63 6b 65 64 20 69 6e 20 74 68 are locked in th
1c645 65 20 73 61 6d 65 20 6f 72 64 65 72 0d 0a 2a 2a e same order..**
1c646 20 62 79 20 61 6c 6c 20 64 61 74 61 62 61 73 65 by all database
1c647 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 54 connections. T
1c648 68 65 20 70 2d 3e 70 4e 65 78 74 20 69 73 20 61 he p->pNext is a
1c649 20 6c 69 73 74 20 6f 66 20 6f 74 68 65 72 0d 0a list of other..
1c64a 2a 2a 20 42 74 72 65 65 73 20 62 65 6c 6f 6e 67 ** Btrees belong
1c64b 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 ing to the same
1c64c 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
1c64d 69 6f 6e 20 61 73 20 74 68 65 20 70 20 42 74 72 ion as the p Btr
1c64e 65 65 0d 0a 2a 2a 20 77 68 69 63 68 20 6e 65 65 ee..** which nee
1c64f 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 61 d to be locked a
1c650 66 74 65 72 20 70 2e 20 20 49 66 20 77 65 20 63 fter p. If we c
1c651 61 6e 6e 6f 74 20 67 65 74 20 61 20 6c 6f 63 6b annot get a lock
1c652 20 6f 6e 0d 0a 2a 2a 20 70 2c 20 74 68 65 6e 20 on..** p, then
1c653 66 69 72 73 74 20 75 6e 6c 6f 63 6b 20 61 6c 6c first unlock all
1c654 20 6f 66 20 74 68 65 20 6f 74 68 65 72 73 20 6f of the others o
1c655 6e 20 70 2d 3e 70 4e 65 78 74 2c 20 74 68 65 6e n p->pNext, then
1c656 20 77 61 69 74 0d 0a 2a 2a 20 66 6f 72 20 74 68 wait..** for th
1c657 65 20 6c 6f 63 6b 20 74 6f 20 62 65 63 6f 6d 65 e lock to become
1c658 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 70 2c available on p,
1c659 20 74 68 65 6e 20 72 65 6c 6f 63 6b 20 61 6c 6c then relock all
1c65a 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 73 75 62 73 of the..** subs
1c65b 65 71 75 65 6e 74 20 42 74 72 65 65 73 20 74 68 equent Btrees th
1c65c 61 74 20 64 65 73 69 72 65 20 61 20 6c 6f 63 6b at desire a lock
1c65d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
1c65e 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
1c65f 65 33 42 74 72 65 65 45 6e 74 65 72 28 42 74 72 e3BtreeEnter(Btr
1c660 65 65 20 2a 70 29 7b 0d 0a 20 20 42 74 72 65 65 ee *p){.. Btree
1c661 20 2a 70 4c 61 74 65 72 3b 0d 0a 0d 0a 20 20 2f *pLater;.... /
1c662 2a 20 53 6f 6d 65 20 62 61 73 69 63 20 73 61 6e * Some basic san
1c663 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 ity checking on
1c664 74 68 65 20 42 74 72 65 65 2e 20 20 54 68 65 20 the Btree. The
1c665 6c 69 73 74 20 6f 66 20 42 74 72 65 65 73 0d 0a list of Btrees..
1c666 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 ** connected b
1c667 79 20 70 4e 65 78 74 20 61 6e 64 20 70 50 72 65 y pNext and pPre
1c668 76 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 20 73 v should be in s
1c669 6f 72 74 65 64 20 6f 72 64 65 72 20 62 79 0d 0a orted order by..
1c66a 20 20 2a 2a 20 42 74 72 65 65 2e 70 42 74 20 76 ** Btree.pBt v
1c66b 61 6c 75 65 2e 20 41 6c 6c 20 65 6c 65 6d 65 6e alue. All elemen
1c66c 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 73 ts of the list s
1c66d 68 6f 75 6c 64 20 62 65 6c 6f 6e 67 20 74 6f 0d hould belong to.
1c66e 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 63 . ** the same c
1c66f 6f 6e 6e 65 63 74 69 6f 6e 2e 20 4f 6e 6c 79 20 onnection. Only
1c670 73 68 61 72 65 64 20 42 74 72 65 65 73 20 61 72 shared Btrees ar
1c671 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 2a e on the list. *
1c672 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e /.. assert( p->
1c673 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 pNext==0 || p->p
1c674 4e 65 78 74 2d 3e 70 42 74 3e 70 2d 3e 70 42 74 Next->pBt>p->pBt
1c675 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
1c676 2d 3e 70 50 72 65 76 3d 3d 30 20 7c 7c 20 70 2d ->pPrev==0 || p-
1c677 3e 70 50 72 65 76 2d 3e 70 42 74 3c 70 2d 3e 70 >pPrev->pBt<p->p
1c678 42 74 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 Bt );.. assert(
1c679 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 p->pNext==0 ||
1c67a 70 2d 3e 70 4e 65 78 74 2d 3e 64 62 3d 3d 70 2d p->pNext->db==p-
1c67b 3e 64 62 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 >db );.. assert
1c67c 28 20 70 2d 3e 70 50 72 65 76 3d 3d 30 20 7c 7c ( p->pPrev==0 ||
1c67d 20 70 2d 3e 70 50 72 65 76 2d 3e 64 62 3d 3d 70 p->pPrev->db==p
1c67e 2d 3e 64 62 20 29 3b 0d 0a 20 20 61 73 73 65 72 ->db );.. asser
1c67f 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c t( p->sharable |
1c680 7c 20 28 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 | (p->pNext==0 &
1c681 26 20 70 2d 3e 70 50 72 65 76 3d 3d 30 29 20 29 & p->pPrev==0) )
1c682 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 ;.... /* Check
1c683 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 73 for locking cons
1c684 69 73 74 65 6e 63 79 20 2a 2f 0d 0a 20 20 61 73 istency */.. as
1c685 73 65 72 74 28 20 21 70 2d 3e 6c 6f 63 6b 65 64 sert( !p->locked
1c686 20 7c 7c 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 || p->wantToLoc
1c687 6b 3e 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 k>0 );.. assert
1c688 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c ( p->sharable ||
1c689 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d p->wantToLock==
1c68a 30 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 57 65 20 0 );.... /* We
1c68b 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 should already h
1c68c 6f 6c 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 old a lock on th
1c68d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 e database conne
1c68e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 61 73 73 65 ction */.. asse
1c68f 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
1c690 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 x_held(p->db->mu
1c691 74 65 78 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 tex) );.... /*
1c692 55 6e 6c 65 73 73 20 74 68 65 20 64 61 74 61 62 Unless the datab
1c693 61 73 65 20 69 73 20 73 68 61 72 61 62 6c 65 20 ase is sharable
1c694 61 6e 64 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 and unlocked, th
1c695 65 6e 20 42 74 53 68 61 72 65 64 2e 64 62 0d 0a en BtShared.db..
1c696 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 72 65 ** should alre
1c697 61 64 79 20 62 65 20 73 65 74 20 63 6f 72 72 65 ady be set corre
1c698 63 74 6c 79 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 ctly. */.. asse
1c699 72 74 28 20 28 70 2d 3e 6c 6f 63 6b 65 64 3d 3d rt( (p->locked==
1c69a 30 20 26 26 20 70 2d 3e 73 68 61 72 61 62 6c 65 0 && p->sharable
1c69b 29 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 64 62 3d ) || p->pBt->db=
1c69c 3d 70 2d 3e 64 62 20 29 3b 0d 0a 0d 0a 20 20 69 =p->db );.... i
1c69d 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 f( !p->sharable
1c69e 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 70 2d 3e ) return;.. p->
1c69f 77 61 6e 74 54 6f 4c 6f 63 6b 2b 2b 3b 0d 0a 20 wantToLock++;..
1c6a0 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 65 64 20 29 if( p->locked )
1c6a1 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 2f 2a return;.... /*
1c6a2 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 In most cases,
1c6a3 77 65 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c we should be abl
1c6a4 65 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 e to acquire the
1c6a5 20 6c 6f 63 6b 20 77 65 0d 0a 20 20 2a 2a 20 77 lock we.. ** w
1c6a6 61 6e 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 ant without havi
1c6a7 6e 67 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 ng to go through
1c6a8 74 20 74 68 65 20 61 73 63 65 6e 64 69 6e 67 20 t the ascending
1c6a9 6c 6f 63 6b 0d 0a 20 20 2a 2a 20 70 72 6f 63 65 lock.. ** proce
1c6aa 64 75 72 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 dure that follow
1c6ab 73 2e 20 20 4a 75 73 74 20 62 65 20 73 75 72 65 s. Just be sure
1c6ac 20 6e 6f 74 20 74 6f 20 62 6c 6f 63 6b 2e 0d 0a not to block...
1c6ad 20 20 2a 2f 0d 0a 20 20 69 66 28 20 73 71 6c 69 */.. if( sqli
1c6ae 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 70 2d te3_mutex_try(p-
1c6af 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3d 3d 53 51 >pBt->mutex)==SQ
1c6b0 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1c6b1 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e p->pBt->db = p->
1c6b2 64 62 3b 0d 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b db;.. p->lock
1c6b3 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 72 65 74 ed = 1;.. ret
1c6b4 75 72 6e 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f urn;.. }.... /
1c6b5 2a 20 54 6f 20 61 76 6f 69 64 20 64 65 61 64 6c * To avoid deadl
1c6b6 6f 63 6b 2c 20 66 69 72 73 74 20 72 65 6c 65 61 ock, first relea
1c6b7 73 65 20 61 6c 6c 20 6c 6f 63 6b 73 20 77 69 74 se all locks wit
1c6b8 68 20 61 20 6c 61 72 67 65 72 0d 0a 20 20 2a 2a h a larger.. **
1c6b9 20 42 74 53 68 61 72 65 64 20 61 64 64 72 65 73 BtShared addres
1c6ba 73 2e 20 20 54 68 65 6e 20 61 63 71 75 69 72 65 s. Then acquire
1c6bb 20 6f 75 72 20 6c 6f 63 6b 2e 20 20 54 68 65 6e our lock. Then
1c6bc 20 72 65 61 63 71 75 69 72 65 0d 0a 20 20 2a 2a reacquire.. **
1c6bd 20 74 68 65 20 6f 74 68 65 72 20 42 74 53 68 61 the other BtSha
1c6be 72 65 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 red locks that w
1c6bf 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 e used to hold i
1c6c0 6e 20 61 73 63 65 6e 64 69 6e 67 0d 0a 20 20 2a n ascending.. *
1c6c1 2a 20 6f 72 64 65 72 2e 0d 0a 20 20 2a 2f 0d 0a * order... */..
1c6c2 20 20 66 6f 72 28 70 4c 61 74 65 72 3d 70 2d 3e for(pLater=p->
1c6c3 70 4e 65 78 74 3b 20 70 4c 61 74 65 72 3b 20 70 pNext; pLater; p
1c6c4 4c 61 74 65 72 3d 70 4c 61 74 65 72 2d 3e 70 4e Later=pLater->pN
1c6c5 65 78 74 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 ext){.. asser
1c6c6 74 28 20 70 4c 61 74 65 72 2d 3e 73 68 61 72 61 t( pLater->shara
1c6c7 62 6c 65 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 ble );.. asse
1c6c8 72 74 28 20 70 4c 61 74 65 72 2d 3e 70 4e 65 78 rt( pLater->pNex
1c6c9 74 3d 3d 30 20 7c 7c 20 70 4c 61 74 65 72 2d 3e t==0 || pLater->
1c6ca 70 4e 65 78 74 2d 3e 70 42 74 3e 70 4c 61 74 65 pNext->pBt>pLate
1c6cb 72 2d 3e 70 42 74 20 29 3b 0d 0a 20 20 20 20 61 r->pBt );.. a
1c6cc 73 73 65 72 74 28 20 21 70 4c 61 74 65 72 2d 3e ssert( !pLater->
1c6cd 6c 6f 63 6b 65 64 20 7c 7c 20 70 4c 61 74 65 72 locked || pLater
1c6ce 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3e 30 20 29 ->wantToLock>0 )
1c6cf 3b 0d 0a 20 20 20 20 69 66 28 20 70 4c 61 74 65 ;.. if( pLate
1c6d0 72 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0d 0a 20 20 r->locked ){..
1c6d1 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 4d unlockBtreeM
1c6d2 75 74 65 78 28 70 4c 61 74 65 72 29 3b 0d 0a 20 utex(pLater);..
1c6d3 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 6c 6f 63 }.. }.. loc
1c6d4 6b 42 74 72 65 65 4d 75 74 65 78 28 70 29 3b 0d kBtreeMutex(p);.
1c6d5 0a 20 20 66 6f 72 28 70 4c 61 74 65 72 3d 70 2d . for(pLater=p-
1c6d6 3e 70 4e 65 78 74 3b 20 70 4c 61 74 65 72 3b 20 >pNext; pLater;
1c6d7 70 4c 61 74 65 72 3d 70 4c 61 74 65 72 2d 3e 70 pLater=pLater->p
1c6d8 4e 65 78 74 29 7b 0d 0a 20 20 20 20 69 66 28 20 Next){.. if(
1c6d9 70 4c 61 74 65 72 2d 3e 77 61 6e 74 54 6f 4c 6f pLater->wantToLo
1c6da 63 6b 20 29 7b 0d 0a 20 20 20 20 20 20 6c 6f 63 ck ){.. loc
1c6db 6b 42 74 72 65 65 4d 75 74 65 78 28 70 4c 61 74 kBtreeMutex(pLat
1c6dc 65 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d er);.. }.. }
1c6dd 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 78 ..}..../*..** Ex
1c6de 69 74 20 74 68 65 20 72 65 63 75 72 73 69 76 65 it the recursive
1c6df 20 6d 75 74 65 78 20 6f 6e 20 61 20 42 74 72 65 mutex on a Btre
1c6e0 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 e...*/..SQLITE_P
1c6e1 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
1c6e2 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 42 74 te3BtreeLeave(Bt
1c6e3 72 65 65 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 ree *p){.. if(
1c6e4 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0d 0a p->sharable ){..
1c6e5 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 assert( p->w
1c6e6 61 6e 74 54 6f 4c 6f 63 6b 3e 30 20 29 3b 0d 0a antToLock>0 );..
1c6e7 20 20 20 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 p->wantToLoc
1c6e8 6b 2d 2d 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d k--;.. if( p-
1c6e9 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 >wantToLock==0 )
1c6ea 7b 0d 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 {.. unlockB
1c6eb 74 72 65 65 4d 75 74 65 78 28 70 29 3b 0d 0a 20 treeMutex(p);..
1c6ec 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a }.. }..}....
1c6ed 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a #ifndef NDEBUG..
1c6ee 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 /*..** Return tr
1c6ef 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 ue if the BtShar
1c6f0 65 64 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 ed mutex is held
1c6f1 20 6f 6e 20 74 68 65 20 62 74 72 65 65 2c 20 6f on the btree, o
1c6f2 72 20 69 66 20 74 68 65 0d 0a 2a 2a 20 42 2d 54 r if the..** B-T
1c6f3 72 65 65 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 ree is not marke
1c6f4 64 20 61 73 20 73 68 61 72 61 62 6c 65 2e 0d 0a d as sharable...
1c6f5 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
1c6f6 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 ine is used only
1c6f7 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 from within ass
1c6f8 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 ert() statements
1c6f9 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
1c6fa 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
1c6fb 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 3BtreeHoldsMutex
1c6fc 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 61 (Btree *p){.. a
1c6fd 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 ssert( p->sharab
1c6fe 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 6c 6f 63 6b le==0 || p->lock
1c6ff 65 64 3d 3d 30 20 7c 7c 20 70 2d 3e 77 61 6e 74 ed==0 || p->want
1c700 54 6f 4c 6f 63 6b 3e 30 20 29 3b 0d 0a 20 20 61 ToLock>0 );.. a
1c701 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 ssert( p->sharab
1c702 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 6c 6f 63 6b le==0 || p->lock
1c703 65 64 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d ed==0 || p->db==
1c704 70 2d 3e 70 42 74 2d 3e 64 62 20 29 3b 0d 0a 20 p->pBt->db );..
1c705 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 assert( p->shar
1c706 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 6c 6f able==0 || p->lo
1c707 63 6b 65 64 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 cked==0 || sqlit
1c708 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d e3_mutex_held(p-
1c709 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d >pBt->mutex) );.
1c70a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 . assert( p->sh
1c70b 61 72 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e arable==0 || p->
1c70c 6c 6f 63 6b 65 64 3d 3d 30 20 7c 7c 20 73 71 6c locked==0 || sql
1c70d 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
1c70e 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b p->db->mutex) );
1c70f 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 28 70 2d .... return (p-
1c710 3e 73 68 61 72 61 62 6c 65 3d 3d 30 20 7c 7c 20 >sharable==0 ||
1c711 70 2d 3e 6c 6f 63 6b 65 64 29 3b 0d 0a 7d 0d 0a p->locked);..}..
1c712 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 23 69 66 6e #endif......#ifn
1c713 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
1c714 49 4e 43 52 42 4c 4f 42 0d 0a 2f 2a 0d 0a 2a 2a INCRBLOB../*..**
1c715 20 45 6e 74 65 72 20 61 6e 64 20 6c 65 61 76 65 Enter and leave
1c716 20 61 20 6d 75 74 65 78 20 6f 6e 20 61 20 42 74 a mutex on a Bt
1c717 72 65 65 20 67 69 76 65 6e 20 61 20 63 75 72 73 ree given a curs
1c718 6f 72 20 6f 77 6e 65 64 20 62 79 20 74 68 61 74 or owned by that
1c719 0d 0a 2a 2a 20 42 74 72 65 65 2e 20 20 54 68 65 ..** Btree. The
1c71a 73 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 se entry points
1c71b 61 72 65 20 75 73 65 64 20 62 79 20 69 6e 63 72 are used by incr
1c71c 65 6d 65 6e 74 61 6c 20 49 2f 4f 20 61 6e 64 20 emental I/O and
1c71d 63 61 6e 20 62 65 0d 0a 2a 2a 20 6f 6d 69 74 74 can be..** omitt
1c71e 65 64 20 69 66 20 74 68 61 74 20 6d 6f 64 75 6c ed if that modul
1c71f 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 0d 0a e is not used...
1c720 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1c721 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 TE void sqlite3B
1c722 74 72 65 65 45 6e 74 65 72 43 75 72 73 6f 72 28 treeEnterCursor(
1c723 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b BtCursor *pCur){
1c724 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 .. sqlite3Btree
1c725 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 Enter(pCur->pBtr
1c726 65 65 29 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f ee);..}..SQLITE_
1c727 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
1c728 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 43 75 ite3BtreeLeaveCu
1c729 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 rsor(BtCursor *p
1c72a 43 75 72 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 Cur){.. sqlite3
1c72b 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d BtreeLeave(pCur-
1c72c 3e 70 42 74 72 65 65 29 3b 0d 0a 7d 0d 0a 23 65 >pBtree);..}..#e
1c72d 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
1c72e 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0d MIT_INCRBLOB */.
1c72f 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 74 65 ...../*..** Ente
1c730 72 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 65 r the mutex on e
1c731 76 65 72 79 20 42 74 72 65 65 20 61 73 73 6f 63 very Btree assoc
1c732 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 iated with a dat
1c733 61 62 61 73 65 0d 0a 2a 2a 20 63 6f 6e 6e 65 63 abase..** connec
1c734 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 6e tion. This is n
1c735 65 65 64 65 64 20 28 66 6f 72 20 65 78 61 6d 70 eeded (for examp
1c736 6c 65 29 20 70 72 69 6f 72 20 74 6f 20 70 61 72 le) prior to par
1c737 73 69 6e 67 0d 0a 2a 2a 20 61 20 73 74 61 74 65 sing..** a state
1c738 6d 65 6e 74 20 73 69 6e 63 65 20 77 65 20 77 69 ment since we wi
1c739 6c 6c 20 62 65 20 63 6f 6d 70 61 72 69 6e 67 20 ll be comparing
1c73a 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e table and column
1c73b 20 6e 61 6d 65 73 0d 0a 2a 2a 20 61 67 61 69 6e names..** again
1c73c 73 74 20 61 6c 6c 20 73 63 68 65 6d 61 73 20 61 st all schemas a
1c73d 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e nd we do not wan
1c73e 74 20 74 68 6f 73 65 20 73 63 68 65 6d 61 73 20 t those schemas
1c73f 62 65 69 6e 67 0d 0a 2a 2a 20 72 65 73 65 74 20 being..** reset
1c740 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 out from under u
1c741 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 72 65 s...**..** There
1c742 20 69 73 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 is a correspond
1c743 69 6e 67 20 6c 65 61 76 65 2d 61 6c 6c 20 70 72 ing leave-all pr
1c744 6f 63 65 64 75 72 65 73 2e 0d 0a 2a 2a 0d 0a 2a ocedures...**..*
1c745 2a 20 45 6e 74 65 72 20 74 68 65 20 6d 75 74 65 * Enter the mute
1c746 78 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 xes in accending
1c747 20 6f 72 64 65 72 20 62 79 20 42 74 53 68 61 72 order by BtShar
1c748 65 64 20 70 6f 69 6e 74 65 72 20 61 64 64 72 65 ed pointer addre
1c749 73 73 0d 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 ss..** to avoid
1c74a 74 68 65 20 70 6f 73 73 69 62 69 6c 69 74 79 20 the possibility
1c74b 6f 66 20 64 65 61 64 6c 6f 63 6b 20 77 68 65 6e of deadlock when
1c74c 20 74 77 6f 20 74 68 72 65 61 64 73 20 77 69 74 two threads wit
1c74d 68 0d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 h..** two or mor
1c74e 65 20 62 74 72 65 65 73 20 69 6e 20 63 6f 6d 6d e btrees in comm
1c74f 6f 6e 20 62 6f 74 68 20 74 72 79 20 74 6f 20 6c on both try to l
1c750 6f 63 6b 20 61 6c 6c 20 74 68 65 69 72 20 62 74 ock all their bt
1c751 72 65 65 73 0d 0a 2a 2a 20 61 74 20 74 68 65 20 rees..** at the
1c752 73 61 6d 65 20 69 6e 73 74 61 6e 74 2e 0d 0a 2a same instant...*
1c753 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
1c754 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 E void sqlite3Bt
1c755 72 65 65 45 6e 74 65 72 41 6c 6c 28 73 71 6c 69 reeEnterAll(sqli
1c756 74 65 33 20 2a 64 62 29 7b 0d 0a 20 20 69 6e 74 te3 *db){.. int
1c757 20 69 3b 0d 0a 20 20 42 74 72 65 65 20 2a 70 3b i;.. Btree *p;
1c758 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1c759 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 te3_mutex_held(d
1c75a 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 b->mutex) );..
1c75b 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e for(i=0; i<db->n
1c75c 44 62 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 70 Db; i++){.. p
1c75d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 = db->aDb[i].pB
1c75e 74 3b 0d 0a 20 20 20 20 69 66 28 20 70 20 29 20 t;.. if( p )
1c75f 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 sqlite3BtreeEnte
1c760 72 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 53 r(p);.. }..}..S
1c761 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
1c762 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c id sqlite3BtreeL
1c763 65 61 76 65 41 6c 6c 28 73 71 6c 69 74 65 33 20 eaveAll(sqlite3
1c764 2a 64 62 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d *db){.. int i;.
1c765 0a 20 20 42 74 72 65 65 20 2a 70 3b 0d 0a 20 20 . Btree *p;..
1c766 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1c767 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d mutex_held(db->m
1c768 75 74 65 78 29 20 29 3b 0d 0a 20 20 66 6f 72 28 utex) );.. for(
1c769 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
1c76a 69 2b 2b 29 7b 0d 0a 20 20 20 20 70 20 3d 20 64 i++){.. p = d
1c76b 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0d 0a b->aDb[i].pBt;..
1c76c 20 20 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 if( p ) sqli
1c76d 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 te3BtreeLeave(p)
1c76e 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d ;.. }..}..../*.
1c76f 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
1c770 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 if a particular
1c771 42 74 72 65 65 20 72 65 71 75 69 72 65 73 20 61 Btree requires a
1c772 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 20 46 lock. Return F
1c773 41 4c 53 45 20 69 66 0d 0a 2a 2a 20 6e 6f 20 6c ALSE if..** no l
1c774 6f 63 6b 20 69 73 20 65 76 65 72 20 72 65 71 75 ock is ever requ
1c775 69 72 65 64 20 73 69 6e 63 65 20 69 74 20 69 73 ired since it is
1c776 20 6e 6f 74 20 73 68 61 72 61 62 6c 65 2e 0d 0a not sharable...
1c777 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1c778 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
1c779 72 65 65 53 68 61 72 61 62 6c 65 28 42 74 72 65 reeSharable(Btre
1c77a 65 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e e *p){.. return
1c77b 20 70 2d 3e 73 68 61 72 61 62 6c 65 3b 0d 0a 7d p->sharable;..}
1c77c 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 ....#ifndef NDEB
1c77d 55 47 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 UG../*..** Retur
1c77e 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 n true if the cu
1c77f 72 72 65 6e 74 20 74 68 72 65 61 64 20 68 6f 6c rrent thread hol
1c780 64 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ds the database
1c781 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 2a 2a 20 6d connection..** m
1c782 75 74 65 78 20 61 6e 64 20 61 6c 6c 20 72 65 71 utex and all req
1c783 75 69 72 65 64 20 42 74 53 68 61 72 65 64 20 6d uired BtShared m
1c784 75 74 65 78 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 utexes...**..**
1c785 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
1c786 75 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 used inside asse
1c787 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 rt() statements
1c788 6f 6e 6c 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 only...*/..SQLIT
1c789 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
1c78a 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 lite3BtreeHoldsA
1c78b 6c 6c 4d 75 74 65 78 65 73 28 73 71 6c 69 74 65 llMutexes(sqlite
1c78c 33 20 2a 64 62 29 7b 0d 0a 20 20 69 6e 74 20 69 3 *db){.. int i
1c78d 3b 0d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 ;.. if( !sqlite
1c78e 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3_mutex_held(db-
1c78f 3e 6d 75 74 65 78 29 20 29 7b 0d 0a 20 20 20 20 >mutex) ){..
1c790 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a return 0;.. }..
1c791 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
1c792 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 >nDb; i++){..
1c793 20 42 74 72 65 65 20 2a 70 3b 0d 0a 20 20 20 20 Btree *p;..
1c794 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 p = db->aDb[i].p
1c795 42 74 3b 0d 0a 20 20 20 20 69 66 28 20 70 20 26 Bt;.. if( p &
1c796 26 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 26 26 & p->sharable &&
1c797 0d 0a 20 20 20 20 20 20 20 20 20 28 70 2d 3e 77 .. (p->w
1c798 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 antToLock==0 ||
1c799 21 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 !sqlite3_mutex_h
1c79a 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 eld(p->pBt->mute
1c79b 78 29 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 x)) ){.. re
1c79c 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a turn 0;.. }..
1c79d 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 31 3b }.. return 1;
1c79e 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e ..}..#endif /* N
1c79f 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 23 69 66 6e DEBUG */....#ifn
1c7a0 64 65 66 20 4e 44 45 42 55 47 0d 0a 2f 2a 0d 0a def NDEBUG../*..
1c7a1 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 ** Return true i
1c7a2 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 6d 75 f the correct mu
1c7a3 74 65 78 65 73 20 61 72 65 20 68 65 6c 64 20 66 texes are held f
1c7a4 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 or accessing the
1c7a5 0d 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 69 44 62 ..** db->aDb[iDb
1c7a6 5d 2e 70 53 63 68 65 6d 61 20 73 74 72 75 63 74 ].pSchema struct
1c7a7 75 72 65 2e 20 20 54 68 65 20 6d 75 74 65 78 65 ure. The mutexe
1c7a8 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 s required for s
1c7a9 63 68 65 6d 61 0d 0a 2a 2a 20 61 63 63 65 73 73 chema..** access
1c7aa 20 61 72 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 are:..**..**
1c7ab 28 31 29 20 54 68 65 20 6d 75 74 65 78 20 6f 6e (1) The mutex on
1c7ac 20 64 62 0d 0a 2a 2a 20 20 20 28 32 29 20 69 66 db..** (2) if
1c7ad 20 69 44 62 21 3d 31 2c 20 74 68 65 6e 20 74 68 iDb!=1, then th
1c7ae 65 20 6d 75 74 65 78 20 6f 6e 20 64 62 2d 3e 61 e mutex on db->a
1c7af 44 62 5b 69 44 62 5d 2e 70 42 74 2e 0d 0a 2a 2a Db[iDb].pBt...**
1c7b0 0d 0a 2a 2a 20 49 66 20 70 53 63 68 65 6d 61 20 ..** If pSchema
1c7b1 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 is not NULL, the
1c7b2 6e 20 69 44 62 20 69 73 20 63 6f 6d 70 75 74 65 n iDb is compute
1c7b3 64 20 66 72 6f 6d 20 70 53 63 68 65 6d 61 20 61 d from pSchema a
1c7b4 6e 64 0d 0a 2a 2a 20 64 62 20 75 73 69 6e 67 20 nd..** db using
1c7b5 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 sqlite3SchemaToI
1c7b6 6e 64 65 78 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c ndex()...*/..SQL
1c7b7 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
1c7b8 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 sqlite3SchemaMut
1c7b9 65 78 48 65 6c 64 28 73 71 6c 69 74 65 33 20 2a exHeld(sqlite3 *
1c7ba 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 53 63 68 db, int iDb, Sch
1c7bb 65 6d 61 20 2a 70 53 63 68 65 6d 61 29 7b 0d 0a ema *pSchema){..
1c7bc 20 20 42 74 72 65 65 20 2a 70 3b 0d 0a 20 20 61 Btree *p;.. a
1c7bd 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0d ssert( db!=0 );.
1c7be 0a 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 . if( pSchema )
1c7bf 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 iDb = sqlite3Sc
1c7c0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 hemaToIndex(db,
1c7c1 70 53 63 68 65 6d 61 29 3b 0d 0a 20 20 61 73 73 pSchema);.. ass
1c7c2 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 ert( iDb>=0 && i
1c7c3 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0d 0a 20 Db<db->nDb );..
1c7c4 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 75 if( !sqlite3_mu
1c7c5 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 tex_held(db->mut
1c7c6 65 78 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0d ex) ) return 0;.
1c7c7 0a 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 . if( iDb==1 )
1c7c8 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 70 20 3d return 1;.. p =
1c7c9 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 db->aDb[iDb].pB
1c7ca 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 21 t;.. assert( p!
1c7cb 3d 30 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 =0 );.. return
1c7cc 70 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 20 7c p->sharable==0 |
1c7cd 7c 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 31 3b 0d | p->locked==1;.
1c7ce 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 .}..#endif /* ND
1c7cf 45 42 55 47 20 2a 2f 0d 0a 0d 0a 23 65 6c 73 65 EBUG */....#else
1c7d0 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 /* SQLITE_THREA
1c7d1 44 53 41 46 45 3e 30 20 61 62 6f 76 65 2e 20 20 DSAFE>0 above.
1c7d2 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
1c7d3 45 3d 3d 30 20 62 65 6c 6f 77 20 2a 2f 0d 0a 2f E==0 below */../
1c7d4 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 *..** The follow
1c7d5 69 6e 67 20 61 72 65 20 73 70 65 63 69 61 6c 20 ing are special
1c7d6 63 61 73 65 73 20 66 6f 72 20 6d 75 74 65 78 20 cases for mutex
1c7d7 65 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 66 enter routines f
1c7d8 6f 72 20 75 73 65 0d 0a 2a 2a 20 69 6e 20 73 69 or use..** in si
1c7d9 6e 67 6c 65 20 74 68 72 65 61 64 65 64 20 61 70 ngle threaded ap
1c7da 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20 plications that
1c7db 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 use shared cache
1c7dc 2e 20 20 45 78 63 65 70 74 20 66 6f 72 0d 0a 2a . Except for..*
1c7dd 2a 20 74 68 65 73 65 20 74 77 6f 20 72 6f 75 74 * these two rout
1c7de 69 6e 65 73 2c 20 61 6c 6c 20 6d 75 74 65 78 20 ines, all mutex
1c7df 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 6e operations are n
1c7e0 6f 2d 6f 70 73 20 69 6e 20 74 68 61 74 20 63 61 o-ops in that ca
1c7e1 73 65 20 61 6e 64 0d 0a 2a 2a 20 61 72 65 20 6e se and..** are n
1c7e2 75 6c 6c 20 23 64 65 66 69 6e 65 73 20 69 6e 20 ull #defines in
1c7e3 62 74 72 65 65 2e 68 2e 0d 0a 2a 2a 0d 0a 2a 2a btree.h...**..**
1c7e4 20 49 66 20 73 68 61 72 65 64 20 63 61 63 68 65 If shared cache
1c7e5 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 is disabled, th
1c7e6 65 6e 20 61 6c 6c 20 62 74 72 65 65 20 6d 75 74 en all btree mut
1c7e7 65 78 20 72 6f 75 74 69 6e 65 73 2c 20 69 6e 63 ex routines, inc
1c7e8 6c 75 64 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 6f luding..** the o
1c7e9 6e 65 73 20 62 65 6c 6f 77 2c 20 61 72 65 20 6e nes below, are n
1c7ea 6f 2d 6f 70 73 20 61 6e 64 20 61 72 65 20 6e 75 o-ops and are nu
1c7eb 6c 6c 20 23 64 65 66 69 6e 65 73 20 69 6e 20 62 ll #defines in b
1c7ec 74 72 65 65 2e 68 2e 0d 0a 2a 2f 0d 0a 0d 0a 53 tree.h...*/....S
1c7ed 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f QLITE_PRIVATE vo
1c7ee 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 id sqlite3BtreeE
1c7ef 6e 74 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0d nter(Btree *p){.
1c7f0 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 . p->pBt->db =
1c7f1 70 2d 3e 64 62 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 p->db;..}..SQLIT
1c7f2 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 E_PRIVATE void s
1c7f3 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
1c7f4 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29 All(sqlite3 *db)
1c7f5 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 66 {.. int i;.. f
1c7f6 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 or(i=0; i<db->nD
1c7f7 62 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 42 74 b; i++){.. Bt
1c7f8 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 ree *p = db->aDb
1c7f9 5b 69 5d 2e 70 42 74 3b 0d 0a 20 20 20 20 69 66 [i].pBt;.. if
1c7fa 28 20 70 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d ( p ){.. p-
1c7fb 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 >pBt->db = p->db
1c7fc 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d ;.. }.. }..}
1c7fd 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 20 53 ..#endif /* if S
1c7fe 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 QLITE_THREADSAFE
1c7ff 20 2a 2f 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 */..#endif /* i
1c800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
1c801 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a T_SHARED_CACHE *
1c802 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
1c803 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 62 74 6d 75 **** End of btmu
1c804 74 65 78 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a tex.c **********
1c805 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c806 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c807 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ***/../*********
1c808 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c 65 ***** Begin file
1c809 20 62 74 72 65 65 2e 63 20 2a 2a 2a 2a 2a 2a 2a btree.c *******
1c80a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c80b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c80c 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 ****/../*..** 20
1c80d 30 34 20 41 70 72 69 6c 20 36 0d 0a 2a 2a 0d 0a 04 April 6..**..
1c80e 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 ** The author di
1c80f 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 sclaims copyrigh
1c810 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 t to this source
1c811 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 code. In place
1c812 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 of..** a legal
1c813 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 notice, here is
1c814 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d a blessing:..**.
1c815 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 .** May you d
1c816 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 o good and not e
1c817 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 vil...** May
1c818 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 you find forgive
1c819 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c ness for yoursel
1c81a 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 f and forgive ot
1c81b 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 hers...** May
1c81c 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c you share freel
1c81d 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 y, never taking
1c81e 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 more than you gi
1c81f 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a ve...**..*******
1c820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c821 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c822 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c823 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c824 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 **..** This file
1c825 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 implements a ex
1c826 74 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 ternal (disk-bas
1c827 65 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 ed) database usi
1c828 6e 67 20 42 54 72 65 65 73 2e 0d 0a 2a 2a 20 53 ng BTrees...** S
1c829 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f ee the header co
1c82a 6d 6d 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 mment on "btreeI
1c82b 6e 74 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 nt.h" for additi
1c82c 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e onal information
1c82d 2e 0d 0a 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 ...** Including
1c82e 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 a description of
1c82f 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 file format and
1c830 20 61 6e 20 6f 76 65 72 76 69 65 77 20 6f 66 20 an overview of
1c831 6f 70 65 72 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a operation...*/..
1c832 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 68 65 61 ../*..** The hea
1c833 64 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 der string that
1c834 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 appears at the b
1c835 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 eginning of ever
1c836 79 0d 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 y..** SQLite dat
1c837 61 62 61 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 abase...*/..stat
1c838 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d ic const char zM
1c839 61 67 69 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 agicHeader[] = S
1c83a 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 QLITE_FILE_HEADE
1c83b 52 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 R;..../*..** Set
1c83c 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 this global var
1c83d 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65 6e iable to 1 to en
1c83e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73 69 able tracing usi
1c83f 6e 67 20 74 68 65 20 54 52 41 43 45 0d 0a 2a 2a ng the TRACE..**
1c840 20 6d 61 63 72 6f 2e 0d 0a 2a 2f 0d 0a 23 69 66 macro...*/..#if
1c841 20 30 0d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 0..int sqlite3B
1c842 74 72 65 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a treeTrace=1; /*
1c843 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 True to enable
1c844 74 72 61 63 69 6e 67 20 2a 2f 0d 0a 23 20 64 65 tracing */..# de
1c845 66 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 69 fine TRACE(X) i
1c846 66 28 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 f(sqlite3BtreeTr
1c847 61 63 65 29 7b 70 72 69 6e 74 66 20 58 3b 66 66 ace){printf X;ff
1c848 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 7d 0d 0a lush(stdout);}..
1c849 23 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 #else..# define
1c84a 54 52 41 43 45 28 58 29 0d 0a 23 65 6e 64 69 66 TRACE(X)..#endif
1c84b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 78 74 72 61 ..../*..** Extra
1c84c 63 74 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d ct a 2-byte big-
1c84d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 endian integer f
1c84e 72 6f 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 rom an array of
1c84f 75 6e 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0d unsigned bytes..
1c850 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 76 .** But if the v
1c851 61 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 alue is zero, ma
1c852 6b 65 20 69 74 20 36 35 35 33 36 2e 0d 0a 2a 2a ke it 65536...**
1c853 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
1c854 65 20 69 73 20 75 73 65 64 20 74 6f 20 65 78 74 e is used to ext
1c855 72 61 63 74 20 74 68 65 20 22 6f 66 66 73 65 74 ract the "offset
1c856 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 to cell content
1c857 20 61 72 65 61 22 20 76 61 6c 75 65 0d 0a 2a 2a area" value..**
1c858 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72 from the header
1c859 20 6f 66 20 61 20 62 74 72 65 65 20 70 61 67 65 of a btree page
1c85a 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 73 . If the page s
1c85b 69 7a 65 20 69 73 20 36 35 35 33 36 20 61 6e 64 ize is 65536 and
1c85c 20 74 68 65 20 70 61 67 65 0d 0a 2a 2a 20 69 73 the page..** is
1c85d 20 65 6d 70 74 79 2c 20 74 68 65 20 6f 66 66 73 empty, the offs
1c85e 65 74 20 73 68 6f 75 6c 64 20 62 65 20 36 35 35 et should be 655
1c85f 33 36 2c 20 62 75 74 20 74 68 65 20 32 2d 62 79 36, but the 2-by
1c860 74 65 20 76 61 6c 75 65 20 73 74 6f 72 65 73 20 te value stores
1c861 7a 65 72 6f 2e 0d 0a 2a 2a 20 54 68 69 73 20 72 zero...** This r
1c862 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 outine makes the
1c863 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 necessary adjus
1c864 74 6d 65 6e 74 20 74 6f 20 36 35 35 33 36 2e 0d tment to 65536..
1c865 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 67 65 74 .*/..#define get
1c866 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 58 29 20 2byteNotZero(X)
1c867 20 28 28 28 28 28 69 6e 74 29 67 65 74 32 62 79 (((((int)get2by
1c868 74 65 28 58 29 29 2d 31 29 26 30 78 66 66 66 66 te(X))-1)&0xffff
1c869 29 2b 31 29 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 )+1)....#ifndef
1c86a 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 SQLITE_OMIT_SHAR
1c86b 45 44 5f 43 41 43 48 45 0d 0a 2f 2a 0d 0a 2a 2a ED_CACHE../*..**
1c86c 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 A list of BtSha
1c86d 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 red objects that
1c86e 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f are eligible fo
1c86f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0d r participation.
1c870 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 .** in shared ca
1c871 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61 che. This varia
1c872 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f ble has file sco
1c873 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c pe during normal
1c874 20 62 75 69 6c 64 73 2c 0d 0a 2a 2a 20 62 75 74 builds,..** but
1c875 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 the test harnes
1c876 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 s needs to acces
1c877 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 s it so we make
1c878 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0d 0a it global for ..
1c879 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0d ** test builds..
1c87a 0a 2a 2a 0d 0a 2a 2a 20 41 63 63 65 73 73 20 74 .**..** Access t
1c87b 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 o this variable
1c87c 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 is protected by
1c87d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
1c87e 54 49 43 5f 4d 41 53 54 45 52 2e 0d 0a 2a 2f 0d TIC_MASTER...*/.
1c87f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
1c880 45 53 54 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 EST..SQLITE_PRIV
1c881 41 54 45 20 42 74 53 68 61 72 65 64 20 2a 53 51 ATE BtShared *SQ
1c882 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33 LITE_WSD sqlite3
1c883 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 SharedCacheList
1c884 3d 20 30 3b 0d 0a 23 65 6c 73 65 0d 0a 73 74 61 = 0;..#else..sta
1c885 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51 tic BtShared *SQ
1c886 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33 LITE_WSD sqlite3
1c887 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 SharedCacheList
1c888 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 0d 0a 23 65 = 0;..#endif..#e
1c889 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
1c88a 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
1c88b 20 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 */....#ifndef S
1c88c 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 QLITE_OMIT_SHARE
1c88d 44 5f 43 41 43 48 45 0d 0a 2f 2a 0d 0a 2a 2a 20 D_CACHE../*..**
1c88e 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c Enable or disabl
1c88f 65 20 74 68 65 20 73 68 61 72 65 64 20 70 61 67 e the shared pag
1c890 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20 66 65 er and schema fe
1c891 61 74 75 72 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 atures...**..**
1c892 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 This routine has
1c893 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78 no effect on ex
1c894 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 isting database
1c895 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0d 0a 2a 2a connections...**
1c896 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 The shared cach
1c897 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 e setting effect
1c898 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 s only future ca
1c899 6c 6c 73 20 74 6f 0d 0a 2a 2a 20 73 71 6c 69 74 lls to..** sqlit
1c89a 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 e3_open(), sqlit
1c89b 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 e3_open16(), or
1c89c 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 sqlite3_open_v2(
1c89d 29 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 )...*/..SQLITE_A
1c89e 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 PI int sqlite3_e
1c89f 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 nable_shared_cac
1c8a0 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b 0d he(int enable){.
1c8a1 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c . sqlite3Global
1c8a2 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 Config.sharedCac
1c8a3 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 heEnabled = enab
1c8a4 6c 65 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 le;.. return SQ
1c8a5 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 23 65 6e LITE_OK;..}..#en
1c8a6 64 69 66 0d 0a 0d 0a 0d 0a 0d 0a 23 69 66 64 65 dif........#ifde
1c8a7 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 f SQLITE_OMIT_SH
1c8a8 41 52 45 44 5f 43 41 43 48 45 0d 0a 20 20 2f 2a ARED_CACHE.. /*
1c8a9 0d 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 .. ** The funct
1c8aa 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 ions queryShared
1c8ab 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 CacheTableLock()
1c8ac 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 , setSharedCache
1c8ad 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0d 0a 20 20 TableLock(),..
1c8ae 2a 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 ** and clearAllS
1c8af 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c haredCacheTableL
1c8b0 6f 63 6b 73 28 29 0d 0a 20 20 2a 2a 20 6d 61 6e ocks().. ** man
1c8b1 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 ipulate entries
1c8b2 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e in the BtShared.
1c8b3 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 pLock linked lis
1c8b4 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0d t used to store.
1c8b5 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 . ** shared-cac
1c8b6 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c he table level l
1c8b7 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 ocks. If the lib
1c8b8 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 rary is compiled
1c8b9 20 77 69 74 68 20 74 68 65 0d 0a 20 20 2a 2a 20 with the.. **
1c8ba 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 shared-cache fea
1c8bb 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 ture disabled, t
1c8bc 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c hen there is onl
1c8bd 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0d y ever one user.
1c8be 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 . ** of each Bt
1c8bf 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 Shared structure
1c8c0 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 and so this loc
1c8c1 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 king is not nece
1c8c2 73 73 61 72 79 2e 20 0d 0a 20 20 2a 2a 20 53 6f ssary. .. ** So
1c8c3 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b define the lock
1c8c4 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f related functio
1c8c5 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0d 0a 20 ns as no-ops...
1c8c6 20 2a 2f 0d 0a 20 20 23 64 65 66 69 6e 65 20 71 */.. #define q
1c8c7 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 uerySharedCacheT
1c8c8 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 ableLock(a,b,c)
1c8c9 53 51 4c 49 54 45 5f 4f 4b 0d 0a 20 20 23 64 65 SQLITE_OK.. #de
1c8ca 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 fine setSharedCa
1c8cb 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 cheTableLock(a,b
1c8cc 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 20 ,c) SQLITE_OK..
1c8cd 20 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c #define clearAl
1c8ce 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c lSharedCacheTabl
1c8cf 65 4c 6f 63 6b 73 28 61 29 0d 0a 20 20 23 64 65 eLocks(a).. #de
1c8d0 66 69 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c fine downgradeAl
1c8d1 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c lSharedCacheTabl
1c8d2 65 4c 6f 63 6b 73 28 61 29 0d 0a 20 20 23 64 65 eLocks(a).. #de
1c8d3 66 69 6e 65 20 68 61 73 53 68 61 72 65 64 43 61 fine hasSharedCa
1c8d4 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 cheTableLock(a,b
1c8d5 2c 63 2c 64 29 20 31 0d 0a 20 20 23 64 65 66 69 ,c,d) 1.. #defi
1c8d6 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 ne hasReadConfli
1c8d7 63 74 73 28 61 2c 20 62 29 20 30 0d 0a 23 65 6e cts(a, b) 0..#en
1c8d8 64 69 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 dif....#ifndef S
1c8d9 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 QLITE_OMIT_SHARE
1c8da 44 5f 43 41 43 48 45 0d 0a 0d 0a 23 69 66 64 65 D_CACHE....#ifde
1c8db 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a f SQLITE_DEBUG..
1c8dc 2f 2a 0d 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 /*..**** This fu
1c8dd 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 nction is only u
1c8de 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 sed as part of a
1c8df 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 n assert() state
1c8e0 6d 65 6e 74 2e 20 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a ment. ***..**..*
1c8e1 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 * Check to see i
1c8e2 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 f pBtree holds t
1c8e3 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b he required lock
1c8e4 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 s to read or wri
1c8e5 74 65 20 74 6f 20 74 68 65 20 0d 0a 2a 2a 20 74 te to the ..** t
1c8e6 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 able with root p
1c8e7 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 age iRoot. Ret
1c8e8 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 urn 1 if it does
1c8e9 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0d 0a and 0 if not...
1c8ea 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 **..** For examp
1c8eb 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 le, when writing
1c8ec 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 to a table with
1c8ed 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 root-page iRoot
1c8ee 20 76 69 61 20 0d 0a 2a 2a 20 42 74 72 65 65 20 via ..** Btree
1c8ef 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 connection pBtre
1c8f0 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 61 73 e:..**..** as
1c8f1 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 sert( hasSharedC
1c8f2 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 acheTableLock(pB
1c8f3 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 tree, iRoot, 0,
1c8f4 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0d 0a WRITE_LOCK) );..
1c8f5 2a 2a 0d 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 **..** When writ
1c8f6 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 ing to an index
1c8f7 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 that resides in
1c8f8 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 a sharable datab
1c8f9 61 73 65 2c 20 74 68 65 20 0d 0a 2a 2a 20 63 61 ase, the ..** ca
1c8fa 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 ller should have
1c8fb 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 first obtained
1c8fc 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e a lock specifyin
1c8fd 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 g the root page
1c8fe 6f 66 0d 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 of..** the corre
1c8ff 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 sponding table.
1c900 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 This makes thing
1c901 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d s a bit more com
1c902 70 6c 69 63 61 74 65 64 2c 0d 0a 2a 2a 20 61 73 plicated,..** as
1c903 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 this module tre
1c904 61 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 ats each table a
1c905 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 s a separate str
1c906 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 ucture. To deter
1c907 6d 69 6e 65 0d 0a 2a 2a 20 74 68 65 20 74 61 62 mine..** the tab
1c908 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 le corresponding
1c909 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 to the index be
1c90a 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 ing written, thi
1c90b 73 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 s..** function h
1c90c 61 73 20 74 6f 20 73 65 61 72 63 68 20 74 68 72 as to search thr
1c90d 6f 75 67 68 20 74 68 65 20 64 61 74 61 62 61 73 ough the databas
1c90e 65 20 73 63 68 65 6d 61 2e 0d 0a 2a 2a 0d 0a 2a e schema...**..*
1c90f 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c * Instead of a l
1c910 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 ock on the table
1c911 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 /index rooted at
1c912 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 page iRoot, the
1c913 20 63 61 6c 6c 65 72 20 6d 61 79 0d 0a 2a 2a 20 caller may..**
1c914 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 hold a write-loc
1c915 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 k on the schema
1c916 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 table (root page
1c917 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 1). This is als
1c918 6f 0d 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 o..** acceptable
1c919 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
1c91a 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 t hasSharedCache
1c91b 54 61 62 6c 65 4c 6f 63 6b 28 0d 0a 20 20 42 74 TableLock(.. Bt
1c91c 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 ree *pBtree,
1c91d 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 /* Handle t
1c91e 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f hat must hold lo
1c91f 63 6b 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 69 52 ck */.. Pgno iR
1c920 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 oot,
1c921 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 /* Root page of
1c922 62 2d 74 72 65 65 20 2a 2f 0d 0a 20 20 69 6e 74 b-tree */.. int
1c923 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 isIndex,
1c924 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 /* True if i
1c925 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 Root is the root
1c926 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 of an index b-t
1c927 72 65 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 4c ree */.. int eL
1c928 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20 ockType
1c929 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63 /* Required loc
1c92a 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 k type (READ_LOC
1c92b 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 K or WRITE_LOCK)
1c92c 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 53 63 68 65 6d */..){.. Schem
1c92d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 a *pSchema = (Sc
1c92e 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 hema *)pBtree->p
1c92f 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0d 0a 20 20 Bt->pSchema;..
1c930 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0d 0a Pgno iTab = 0;..
1c931 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b BtLock *pLock;
1c932 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 .... /* If this
1c933 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 database is not
1c934 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 shareable, or i
1c935 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 f the client is
1c936 72 65 61 64 69 6e 67 0d 0a 20 20 2a 2a 20 61 6e reading.. ** an
1c937 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 d has the read-u
1c938 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 ncommitted flag
1c939 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 set, then no loc
1c93a 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 0d k is required. .
1c93b 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 . ** Return tru
1c93c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a e immediately...
1c93d 20 20 2a 2f 0d 0a 20 20 69 66 28 20 28 70 42 74 */.. if( (pBt
1c93e 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 ree->sharable==0
1c93f 29 0d 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 ).. || (eLockT
1c940 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 ype==READ_LOCK &
1c941 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 & (pBtree->db->f
1c942 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 lags & SQLITE_Re
1c943 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0d adUncommitted)).
1c944 0a 20 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 . ){.. retur
1c945 6e 20 31 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f n 1;.. }.... /
1c946 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20 * If the client
1c947 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77 is reading or w
1c948 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 riting an index
1c949 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69 and the schema i
1c94a 73 0d 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 s.. ** not load
1c94b 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 ed, then it is t
1c94c 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 oo difficult to
1c94d 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 actually check t
1c94e 6f 20 73 65 65 20 69 66 0d 0a 20 20 2a 2a 20 74 o see if.. ** t
1c94f 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 he correct locks
1c950 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 are held. So d
1c951 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a o not bother - j
1c952 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e ust return true.
1c953 0d 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 .. ** This case
1c954 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 does not come u
1c955 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 p very often any
1c956 68 6f 77 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 how... */.. if
1c957 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 ( isIndex && (!p
1c958 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 Schema || (pSche
1c959 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 ma->flags&DB_Sch
1c95a 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 emaLoaded)==0) )
1c95b 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b {.. return 1;
1c95c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46 69 .. }.... /* Fi
1c95d 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f gure out the roo
1c95e 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20 t-page that the
1c95f 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 lock should be h
1c960 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c eld on. For tabl
1c961 65 0d 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c e.. ** b-trees,
1c962 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 this is just th
1c963 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 e root page of t
1c964 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 he b-tree being
1c965 72 65 61 64 20 6f 72 0d 0a 20 20 2a 2a 20 77 72 read or.. ** wr
1c966 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 itten. For index
1c967 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 b-trees, it is
1c968 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 the root page of
1c969 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d the associated.
1c96a 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f . ** table. */
1c96b 0d 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 .. if( isIndex
1c96c 29 7b 0d 0a 20 20 20 20 48 61 73 68 45 6c 65 6d ){.. HashElem
1c96d 20 2a 70 3b 0d 0a 20 20 20 20 66 6f 72 28 70 3d *p;.. for(p=
1c96e 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 sqliteHashFirst(
1c96f 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 &pSchema->idxHas
1c970 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 h); p; p=sqliteH
1c971 61 73 68 4e 65 78 74 28 70 29 29 7b 0d 0a 20 20 ashNext(p)){..
1c972 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 Index *pIdx
1c973 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69 74 = (Index *)sqlit
1c974 65 48 61 73 68 44 61 74 61 28 70 29 3b 0d 0a 20 eHashData(p);..
1c975 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 if( pIdx->t
1c976 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20 num==(int)iRoot
1c977 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 54 61 62 ){.. iTab
1c978 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d = pIdx->pTable-
1c979 3e 74 6e 75 6d 3b 0d 0a 20 20 20 20 20 20 7d 0d >tnum;.. }.
1c97a 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b . }.. }else{
1c97b 0d 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f .. iTab = iRo
1c97c 6f 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a ot;.. }.... /*
1c97d 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 Search for the
1c97e 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 required lock. E
1c97f 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f ither a write-lo
1c980 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 ck on root-page
1c981 69 54 61 62 2c 20 61 20 0d 0a 20 20 2a 2a 20 77 iTab, a .. ** w
1c982 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 rite-lock on the
1c983 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f schema table, o
1c984 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 r (if the client
1c985 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0d 0a is reading) a..
1c986 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f ** read-lock o
1c987 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 n iTab will suff
1c988 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 ice. Return 1 if
1c989 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 any of these ar
1c98a 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0d 0a 20 20 e found. */..
1c98b 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 for(pLock=pBtree
1c98c 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c ->pBt->pLock; pL
1c98d 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b ock; pLock=pLock
1c98e 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 69 ->pNext){.. i
1c98f 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 f( pLock->pBtree
1c990 3d 3d 70 42 74 72 65 65 20 0d 0a 20 20 20 20 20 ==pBtree ..
1c991 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c && (pLock->iTabl
1c992 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 e==iTab || (pLoc
1c993 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f k->eLock==WRITE_
1c994 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 LOCK && pLock->i
1c995 54 61 62 6c 65 3d 3d 31 29 29 0d 0a 20 20 20 20 Table==1))..
1c996 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b && pLock->eLock
1c997 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0d 0a 20 20 >=eLockType ..
1c998 20 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 ){.. retu
1c999 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 rn 1;.. }..
1c99a 7d 0d 0a 0d 0a 20 20 2f 2a 20 46 61 69 6c 65 64 }.... /* Failed
1c99b 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 to find the req
1c99c 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0d 0a uired lock. */..
1c99d 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a return 0;..}..
1c99e 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 #endif /* SQLITE
1c99f 5f 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 23 69 66 _DEBUG */....#if
1c9a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
1c9a1 0d 0a 2f 2a 0d 0a 2a 2a 2a 2a 20 54 68 69 73 20 ../*..**** This
1c9a2 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 function may be
1c9a3 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 used as part of
1c9a4 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 assert() stateme
1c9a5 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0d 0a nts only. ****..
1c9a6 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 **..** Return tr
1c9a7 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62 ue if it would b
1c9a8 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 e illegal for pB
1c9a9 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e tree to write in
1c9aa 74 6f 20 74 68 65 0d 0a 2a 2a 20 74 61 62 6c 65 to the..** table
1c9ab 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 or index rooted
1c9ac 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 at iRoot becaus
1c9ad 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 e other shared c
1c9ae 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0d 0a onnections are..
1c9af 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c ** simultaneousl
1c9b0 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 y reading that s
1c9b1 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 ame table or ind
1c9b2 65 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 74 20 69 ex...**..** It i
1c9b3 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 s illegal for pB
1c9b4 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 tree to write if
1c9b5 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 some other Btre
1c9b6 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0d 0a 2a e object that..*
1c9b7 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d * shares the sam
1c9b8 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 e BtShared objec
1c9b9 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 t is currently r
1c9ba 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e eading or writin
1c9bb 67 0d 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 g..** the iRoot
1c9bc 74 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 table. Except,
1c9bd 69 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 if the other Btr
1c9be 65 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 ee object has th
1c9bf 65 0d 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d e..** read-uncom
1c9c0 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c mitted flag set,
1c9c1 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 then it is OK f
1c9c2 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a or the other obj
1c9c3 65 63 74 20 74 6f 0d 0a 2a 2a 20 68 61 76 65 20 ect to..** have
1c9c4 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e 0d 0a a read cursor...
1c9c5 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 **..** For examp
1c9c6 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69 le, before writi
1c9c7 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f ng to any part o
1c9c8 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 f the table or i
1c9c9 6e 64 65 78 0d 0a 2a 2a 20 72 6f 6f 74 65 64 20 ndex..** rooted
1c9ca 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f at page iRoot, o
1c9cb 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0d ne should call:.
1c9cc 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 61 73 73 65 72 .**..** asser
1c9cd 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c t( !hasReadConfl
1c9ce 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f icts(pBtree, iRo
1c9cf 6f 74 29 20 29 3b 0d 0a 2a 2f 0d 0a 73 74 61 74 ot) );..*/..stat
1c9d0 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f ic int hasReadCo
1c9d1 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 nflicts(Btree *p
1c9d2 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f Btree, Pgno iRoo
1c9d3 74 29 7b 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 t){.. BtCursor
1c9d4 2a 70 3b 0d 0a 20 20 66 6f 72 28 70 3d 70 42 74 *p;.. for(p=pBt
1c9d5 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f ree->pBt->pCurso
1c9d6 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 r; p; p=p->pNext
1c9d7 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 ){.. if( p->p
1c9d8 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0d gnoRoot==iRoot .
1c9d9 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72 . && p->pBtr
1c9da 65 65 21 3d 70 42 74 72 65 65 0d 0a 20 20 20 20 ee!=pBtree..
1c9db 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 && 0==(p->pBtre
1c9dc 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 e->db->flags & S
1c9dd 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d QLITE_ReadUncomm
1c9de 69 74 74 65 64 29 0d 0a 20 20 20 20 29 7b 0d 0a itted).. ){..
1c9df 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d return 1;.
1c9e0 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 . }.. }.. r
1c9e1 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a 23 65 6e eturn 0;..}..#en
1c9e2 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 dif /* #ifdef
1c9e3 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f SQLITE_DEBUG */
1c9e4 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 51 75 65 72 79 ..../*..** Query
1c9e5 20 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 to see if Btree
1c9e6 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 handle p may ob
1c9e7 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 tain a lock of t
1c9e8 79 70 65 20 65 4c 6f 63 6b 20 0d 0a 2a 2a 20 28 ype eLock ..** (
1c9e9 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 READ_LOCK or WRI
1c9ea 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 TE_LOCK) on the
1c9eb 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d table with root-
1c9ec 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 page iTab. Retur
1c9ed 6e 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 n..** SQLITE_OK
1c9ee 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 if the lock may
1c9ef 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 be obtained (by
1c9f0 63 61 6c 6c 69 6e 67 0d 0a 2a 2a 20 73 65 74 53 calling..** setS
1c9f1 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c haredCacheTableL
1c9f2 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 ock()), or SQLIT
1c9f3 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e E_LOCKED if not.
1c9f4 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1c9f5 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 querySharedCach
1c9f6 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 eTableLock(Btree
1c9f7 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 *p, Pgno iTab,
1c9f8 75 38 20 65 4c 6f 63 6b 29 7b 0d 0a 20 20 42 74 u8 eLock){.. Bt
1c9f9 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d Shared *pBt = p-
1c9fa 3e 70 42 74 3b 0d 0a 20 20 42 74 4c 6f 63 6b 20 >pBt;.. BtLock
1c9fb 2a 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 61 73 73 *pIter;.... ass
1c9fc 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 ert( sqlite3Btre
1c9fd 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 eHoldsMutex(p) )
1c9fe 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f ;.. assert( eLo
1c9ff 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c ck==READ_LOCK ||
1ca00 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f eLock==WRITE_LO
1ca01 43 4b 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 CK );.. assert(
1ca02 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0d 0a 20 20 p->db!=0 );..
1ca03 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d assert( !(p->db-
1ca04 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 >flags&SQLITE_Re
1ca05 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c adUncommitted)||
1ca06 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 eLock==WRITE_LOC
1ca07 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0d 0a 20 K||iTab==1 );..
1ca08 20 0d 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 .. /* If reque
1ca09 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f sting a write-lo
1ca0a 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 ck, then the Btr
1ca0b 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 ee must have an
1ca0c 6f 70 65 6e 20 77 72 69 74 65 0d 0a 20 20 2a 2a open write.. **
1ca0d 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 transaction on
1ca0e 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 this file. And,
1ca0f 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 obviously, for t
1ca10 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 his to be so the
1ca11 72 65 20 0d 0a 20 20 2a 2a 20 6d 75 73 74 20 62 re .. ** must b
1ca12 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 e an open write
1ca13 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 transaction on t
1ca14 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0d he file itself..
1ca15 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 . */.. assert(
1ca16 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 eLock==READ_LOC
1ca17 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 K || (p==pBt->pW
1ca18 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 riter && p->inTr
1ca19 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 ans==TRANS_WRITE
1ca1a 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1ca1b 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b eLock==READ_LOCK
1ca1c 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 || pBt->inTrans
1ca1d 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 action==TRANS_WR
1ca1e 49 54 45 20 29 3b 0d 0a 20 20 0d 0a 20 20 2f 2a ITE );.. .. /*
1ca1f 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
1ca20 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 a no-op if the
1ca21 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 shared-cache is
1ca22 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0d 0a not enabled */..
1ca23 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 if( !p->sharab
1ca24 6c 65 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 le ){.. retur
1ca25 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 n SQLITE_OK;..
1ca26 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 73 6f 6d }.... /* If som
1ca27 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 e other connecti
1ca28 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e on is holding an
1ca29 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c exclusive lock,
1ca2a 20 74 68 65 0d 0a 20 20 2a 2a 20 72 65 71 75 65 the.. ** reque
1ca2b 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f sted lock may no
1ca2c 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0d 0a t be obtained...
1ca2d 20 20 2a 2f 0d 0a 20 20 69 66 28 20 70 42 74 2d */.. if( pBt-
1ca2e 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 >pWriter!=p && (
1ca2f 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 pBt->btsFlags &
1ca30 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d BTS_EXCLUSIVE)!=
1ca31 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 0 ){.. sqlite
1ca32 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 3ConnectionBlock
1ca33 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 ed(p->db, pBt->p
1ca34 57 72 69 74 65 72 2d 3e 64 62 29 3b 0d 0a 20 20 Writer->db);..
1ca35 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
1ca36 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 LOCKED_SHAREDCAC
1ca37 48 45 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 6f HE;.. }.... fo
1ca38 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f r(pIter=pBt->pLo
1ca39 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 ck; pIter; pIter
1ca3a 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0d =pIter->pNext){.
1ca3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 . /* The cond
1ca3c 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c ition (pIter->eL
1ca3d 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 ock!=eLock) in t
1ca3e 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 he following if(
1ca3f 2e 2e 2e 29 20 0d 0a 20 20 20 20 2a 2a 20 73 74 ...) .. ** st
1ca40 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d atement is a sim
1ca41 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0d plification of:.
1ca42 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 . **.. **
1ca43 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f (eLock==WRITE_
1ca44 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 LOCK || pIter->e
1ca45 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b Lock==WRITE_LOCK
1ca46 29 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a ).. **.. *
1ca47 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 * since we know
1ca48 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 that if eLock==W
1ca49 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 RITE_LOCK, then
1ca4a 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 no other connect
1ca4b 69 6f 6e 0d 0a 20 20 20 20 2a 2a 20 6d 61 79 20 ion.. ** may
1ca4c 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 hold a WRITE_LOC
1ca4d 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 K on any table i
1ca4e 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e n this file (sin
1ca4f 63 65 20 74 68 65 72 65 20 63 61 6e 0d 0a 20 20 ce there can..
1ca50 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 ** only be a s
1ca51 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0d 0a ingle writer)...
1ca52 20 20 20 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 */.. asse
1ca53 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b rt( pIter->eLock
1ca54 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 ==READ_LOCK || p
1ca55 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 Iter->eLock==WRI
1ca56 54 45 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 20 20 TE_LOCK );..
1ca57 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 assert( eLock==R
1ca58 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 EAD_LOCK || pIte
1ca59 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 r->pBtree==p ||
1ca5a 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 pIter->eLock==RE
1ca5b 41 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 20 20 69 AD_LOCK);.. i
1ca5c 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 f( pIter->pBtree
1ca5d 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 !=p && pIter->iT
1ca5e 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 able==iTab && pI
1ca5f 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 ter->eLock!=eLoc
1ca60 6b 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 k ){.. sqli
1ca61 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f te3ConnectionBlo
1ca62 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 cked(p->db, pIte
1ca63 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0d r->pBtree->db);.
1ca64 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b . if( eLock
1ca65 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0d ==WRITE_LOCK ){.
1ca66 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
1ca67 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 p==pBt->pWriter
1ca68 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 42 74 );.. pBt
1ca69 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 ->btsFlags |= BT
1ca6a 53 5f 50 45 4e 44 49 4e 47 3b 0d 0a 20 20 20 20 S_PENDING;..
1ca6b 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 }.. retur
1ca6c 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f n SQLITE_LOCKED_
1ca6d 53 48 41 52 45 44 43 41 43 48 45 3b 0d 0a 20 20 SHAREDCACHE;..
1ca6e 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 }.. }.. retu
1ca6f 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
1ca70 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c ..#endif /* !SQL
1ca71 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f ITE_OMIT_SHARED_
1ca72 43 41 43 48 45 20 2a 2f 0d 0a 0d 0a 23 69 66 6e CACHE */....#ifn
1ca73 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
1ca74 53 48 41 52 45 44 5f 43 41 43 48 45 0d 0a 2f 2a SHARED_CACHE../*
1ca75 0d 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 ..** Add a lock
1ca76 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 on the table wit
1ca77 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 h root-page iTab
1ca78 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 le to the shared
1ca79 2d 62 74 72 65 65 20 75 73 65 64 0d 0a 2a 2a 20 -btree used..**
1ca7a 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 by Btree handle
1ca7b 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f p. Parameter eLo
1ca7c 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 ck must be eithe
1ca7d 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0d r READ_LOCK or .
1ca7e 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0d .** WRITE_LOCK..
1ca7f 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e .**..** This fun
1ca80 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 ction assumes th
1ca81 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a e following:..**
1ca82 0d 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 ..** (a) The s
1ca83 70 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f pecified Btree o
1ca84 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 bject p is conne
1ca85 63 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 cted to a sharab
1ca86 6c 65 0d 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 le..** dat
1ca87 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 abase (one with
1ca88 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 the BtShared.sha
1ca89 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c rable flag set),
1ca8a 20 61 6e 64 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 and..**..** (
1ca8b 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 b) No other Btre
1ca8c 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 e objects hold a
1ca8d 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c lock that confl
1ca8e 69 63 74 73 0d 0a 2a 2a 20 20 20 20 20 20 20 77 icts..** w
1ca8f 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 ith the requeste
1ca90 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 d lock (i.e. que
1ca91 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 rySharedCacheTab
1ca92 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0d 0a 2a 2a leLock() has..**
1ca93 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 already b
1ca94 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 een called and r
1ca95 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f eturned SQLITE_O
1ca96 4b 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 K)...**..** SQLI
1ca97 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 TE_OK is returne
1ca98 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 d if the lock is
1ca99 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 added successfu
1ca9a 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 lly. SQLITE_NOME
1ca9b 4d 20 0d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e M ..** is return
1ca9c 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 ed if a malloc a
1ca9d 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0d 0a 2a ttempt fails...*
1ca9e 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 /..static int se
1ca9f 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c tSharedCacheTabl
1caa0 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 eLock(Btree *p,
1caa1 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 Pgno iTable, u8
1caa2 65 4c 6f 63 6b 29 7b 0d 0a 20 20 42 74 53 68 61 eLock){.. BtSha
1caa3 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 red *pBt = p->pB
1caa4 74 3b 0d 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c t;.. BtLock *pL
1caa5 6f 63 6b 20 3d 20 30 3b 0d 0a 20 20 42 74 4c 6f ock = 0;.. BtLo
1caa6 63 6b 20 2a 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 ck *pIter;....
1caa7 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 assert( sqlite3B
1caa8 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 treeHoldsMutex(p
1caa9 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1caaa 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b eLock==READ_LOCK
1caab 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 || eLock==WRITE
1caac 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 20 61 73 73 65 _LOCK );.. asse
1caad 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0d rt( p->db!=0 );.
1caae 0a 0d 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 ... /* A connec
1caaf 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 tion with the re
1cab0 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 ad-uncommitted f
1cab1 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 lag set will nev
1cab2 65 72 20 74 72 79 20 74 6f 0d 0a 20 20 2a 2a 20 er try to.. **
1cab3 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f obtain a read-lo
1cab4 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 ck using this fu
1cab5 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 nction. The only
1cab6 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 read-lock obtai
1cab7 6e 65 64 0d 0a 20 20 2a 2a 20 62 79 20 61 20 63 ned.. ** by a c
1cab8 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 onnection in rea
1cab9 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f d-uncommitted mo
1caba 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c de is on the sql
1cabb 69 74 65 5f 6d 61 73 74 65 72 20 0d 0a 20 20 2a ite_master .. *
1cabc 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 * table, and tha
1cabd 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e t lock is obtain
1cabe 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e ed in BtreeBegin
1cabf 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0d 0a 20 20 Trans(). */..
1cac0 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 assert( 0==(p->d
1cac1 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f b->flags&SQLITE_
1cac2 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 ReadUncommitted)
1cac3 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 || eLock==WRITE
1cac4 5f 4c 4f 43 4b 20 29 3b 0d 0a 0d 0a 20 20 2f 2a _LOCK );.... /*
1cac5 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 This function s
1cac6 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 hould only be ca
1cac7 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 lled on a sharab
1cac8 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 le b-tree after
1cac9 69 74 20 0d 0a 20 20 2a 2a 20 68 61 73 20 62 65 it .. ** has be
1caca 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 en determined th
1cacb 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 at no other b-tr
1cacc 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c ee holds a confl
1cacd 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f icting lock. */
1cace 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 .. assert( p->s
1cacf 68 61 72 61 62 6c 65 20 29 3b 0d 0a 20 20 61 73 harable );.. as
1cad0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d sert( SQLITE_OK=
1cad1 3d 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 =querySharedCach
1cad2 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 eTableLock(p, iT
1cad3 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0d able, eLock) );.
1cad4 0a 0d 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 ... /* First se
1cad5 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f arch the list fo
1cad6 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f r an existing lo
1cad7 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 ck on this table
1cad8 2e 20 2a 2f 0d 0a 20 20 66 6f 72 28 70 49 74 65 . */.. for(pIte
1cad9 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 r=pBt->pLock; pI
1cada 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 ter; pIter=pIter
1cadb 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 69 ->pNext){.. i
1cadc 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 f( pIter->iTable
1cadd 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 ==iTable && pIte
1cade 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0d r->pBtree==p ){.
1cadf 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 . pLock = p
1cae0 49 74 65 72 3b 0d 0a 20 20 20 20 20 20 62 72 65 Iter;.. bre
1cae1 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d ak;.. }.. }.
1cae2 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 ... /* If the a
1cae3 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 bove search did
1cae4 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 not find a BtLoc
1cae5 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 k struct associa
1cae6 74 69 6e 67 20 42 74 72 65 65 20 70 0d 0a 20 20 ting Btree p..
1cae7 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 ** with table iT
1cae8 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f able, allocate o
1cae9 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 ne and link it i
1caea 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0d 0a 20 nto the list...
1caeb 20 2a 2f 0d 0a 20 20 69 66 28 20 21 70 4c 6f 63 */.. if( !pLoc
1caec 6b 20 29 7b 0d 0a 20 20 20 20 70 4c 6f 63 6b 20 k ){.. pLock
1caed 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 = (BtLock *)sqli
1caee 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 te3MallocZero(si
1caef 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0d 0a zeof(BtLock));..
1caf0 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 if( !pLock )
1caf1 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 {.. return
1caf2 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 SQLITE_NOMEM;..
1caf3 20 20 20 7d 0d 0a 20 20 20 20 70 4c 6f 63 6b 2d }.. pLock-
1caf4 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 >iTable = iTable
1caf5 3b 0d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 ;.. pLock->pB
1caf6 74 72 65 65 20 3d 20 70 3b 0d 0a 20 20 20 20 70 tree = p;.. p
1caf7 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 Lock->pNext = pB
1caf8 74 2d 3e 70 4c 6f 63 6b 3b 0d 0a 20 20 20 20 70 t->pLock;.. p
1caf9 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 Bt->pLock = pLoc
1cafa 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 k;.. }.... /*
1cafb 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 Set the BtLock.e
1cafc 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f Lock variable to
1cafd 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 the maximum of
1cafe 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b the current lock
1caff 0d 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 .. ** and the r
1cb00 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 equested lock. T
1cb01 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 his means if a w
1cb02 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c rite-lock was al
1cb03 72 65 61 64 79 20 68 65 6c 64 0d 0a 20 20 2a 2a ready held.. **
1cb04 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b and a read-lock
1cb05 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 requested, we d
1cb06 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 on't incorrectly
1cb07 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c downgrade the l
1cb08 6f 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 ock... */.. as
1cb09 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b sert( WRITE_LOCK
1cb0a 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0d 0a 20 >READ_LOCK );..
1cb0b 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b if( eLock>pLock
1cb0c 2d 3e 65 4c 6f 63 6b 20 29 7b 0d 0a 20 20 20 20 ->eLock ){..
1cb0d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 pLock->eLock = e
1cb0e 4c 6f 63 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 Lock;.. }....
1cb0f 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1cb10 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 ;..}..#endif /*
1cb11 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 !SQLITE_OMIT_SHA
1cb12 52 45 44 5f 43 41 43 48 45 20 2a 2f 0d 0a 0d 0a RED_CACHE */....
1cb13 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
1cb14 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
1cb15 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 65 ../*..** Release
1cb16 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c all the table l
1cb17 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 ocks (locks obta
1cb18 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 ined via calls t
1cb19 6f 0d 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 o..** the setSha
1cb1a 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 redCacheTableLoc
1cb1b 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 k() procedure) h
1cb1c 65 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a eld by Btree obj
1cb1d 65 63 74 20 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ect p...**..** T
1cb1e 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 his function ass
1cb1f 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65 20 umes that Btree
1cb20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 p has an open re
1cb21 61 64 20 6f 72 20 77 72 69 74 65 20 0d 0a 2a 2a ad or write ..**
1cb22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 transaction. If
1cb23 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 it does not, th
1cb24 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 en the BTS_PENDI
1cb25 4e 47 20 66 6c 61 67 0d 0a 2a 2a 20 6d 61 79 20 NG flag..** may
1cb26 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 be incorrectly c
1cb27 6c 65 61 72 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 leared...*/..sta
1cb28 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c tic void clearAl
1cb29 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c lSharedCacheTabl
1cb2a 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 eLocks(Btree *p)
1cb2b 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 {.. BtShared *p
1cb2c 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 Bt = p->pBt;..
1cb2d 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 BtLock **ppIter
1cb2e 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0d 0a = &pBt->pLock;..
1cb2f 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1cb30 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 te3BtreeHoldsMut
1cb31 65 78 28 70 29 20 29 3b 0d 0a 20 20 61 73 73 65 ex(p) );.. asse
1cb32 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 rt( p->sharable
1cb33 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b || 0==*ppIter );
1cb34 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 .. assert( p->i
1cb35 6e 54 72 61 6e 73 3e 30 20 29 3b 0d 0a 0d 0a 20 nTrans>0 );....
1cb36 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 while( *ppIter
1cb37 29 7b 0d 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a ){.. BtLock *
1cb38 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b pLock = *ppIter;
1cb39 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 .. assert( (p
1cb3a 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 Bt->btsFlags & B
1cb3b 54 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 TS_EXCLUSIVE)==0
1cb3c 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 || pBt->pWriter
1cb3d 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 ==pLock->pBtree
1cb3e 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
1cb3f 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 pLock->pBtree->i
1cb40 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 nTrans>=pLock->e
1cb41 4c 6f 63 6b 20 29 3b 0d 0a 20 20 20 20 69 66 28 Lock );.. if(
1cb42 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d pLock->pBtree==
1cb43 70 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 70 49 p ){.. *ppI
1cb44 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 ter = pLock->pNe
1cb45 78 74 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 xt;.. asser
1cb46 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 t( pLock->iTable
1cb47 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 !=1 || pLock==&p
1cb48 2d 3e 6c 6f 63 6b 20 29 3b 0d 0a 20 20 20 20 20 ->lock );..
1cb49 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 if( pLock->iTab
1cb4a 6c 65 21 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 le!=1 ){..
1cb4b 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
1cb4c 4c 6f 63 6b 29 3b 0d 0a 20 20 20 20 20 20 7d 0d Lock);.. }.
1cb4d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
1cb4e 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f ppIter = &pLo
1cb4f 63 6b 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 ck->pNext;..
1cb50 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 73 73 65 }.. }.... asse
1cb51 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 rt( (pBt->btsFla
1cb52 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 gs & BTS_PENDING
1cb53 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 )==0 || pBt->pWr
1cb54 69 74 65 72 20 29 3b 0d 0a 20 20 69 66 28 20 70 iter );.. if( p
1cb55 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 Bt->pWriter==p )
1cb56 7b 0d 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 {.. pBt->pWri
1cb57 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 70 42 ter = 0;.. pB
1cb58 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e t->btsFlags &= ~
1cb59 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 (BTS_EXCLUSIVE|B
1cb5a 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0d 0a 20 20 TS_PENDING);..
1cb5b 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e }else if( pBt->n
1cb5c 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 Transaction==2 )
1cb5d 7b 0d 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 {.. /* This f
1cb5e 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
1cb5f 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 d when Btree p i
1cb60 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 s concluding its
1cb61 20 0d 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 .. ** transa
1cb62 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 ction. If there
1cb63 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 currently exists
1cb64 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 a writer, and p
1cb65 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 2a 2a 20 is not.. **
1cb66 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 that writer, the
1cb67 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
1cb68 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f locks held by co
1cb69 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0d nnections other.
1cb6a 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 . ** than the
1cb6b 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 writer must be
1cb6c 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f about to drop to
1cb6d 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 zero. In this c
1cb6e 61 73 65 0d 0a 20 20 20 20 2a 2a 20 73 65 74 20 ase.. ** set
1cb6f 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 the BTS_PENDING
1cb70 66 6c 61 67 20 74 6f 20 30 2e 0d 0a 20 20 20 20 flag to 0...
1cb71 2a 2a 0d 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 **.. ** If th
1cb72 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 ere is not curre
1cb73 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 ntly a writer, t
1cb74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 hen BTS_PENDING
1cb75 6d 75 73 74 0d 0a 20 20 20 20 2a 2a 20 62 65 20 must.. ** be
1cb76 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f zero already. So
1cb77 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 this next line
1cb78 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 is harmless in t
1cb79 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 2a hat case... *
1cb7a 2f 0d 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 /.. pBt->btsF
1cb7b 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e lags &= ~BTS_PEN
1cb7c 44 49 4e 47 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d DING;.. }..}...
1cb7d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e ./*..** This fun
1cb7e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c ction changes al
1cb7f 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 l write-locks he
1cb80 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e ld by Btree p in
1cb81 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0d 0a to read-locks...
1cb82 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
1cb83 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 downgradeAllShar
1cb84 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b edCacheTableLock
1cb85 73 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 s(Btree *p){..
1cb86 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 BtShared *pBt =
1cb87 70 2d 3e 70 42 74 3b 0d 0a 20 20 69 66 28 20 70 p->pBt;.. if( p
1cb88 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 Bt->pWriter==p )
1cb89 7b 0d 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 {.. BtLock *p
1cb8a 4c 6f 63 6b 3b 0d 0a 20 20 20 20 70 42 74 2d 3e Lock;.. pBt->
1cb8b 70 57 72 69 74 65 72 20 3d 20 30 3b 0d 0a 20 20 pWriter = 0;..
1cb8c 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 pBt->btsFlags
1cb8d 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 &= ~(BTS_EXCLUSI
1cb8e 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b VE|BTS_PENDING);
1cb8f 0d 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d .. for(pLock=
1cb90 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 pBt->pLock; pLoc
1cb91 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e k; pLock=pLock->
1cb92 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20 61 pNext){.. a
1cb93 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c ssert( pLock->eL
1cb94 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c ock==READ_LOCK |
1cb95 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d | pLock->pBtree=
1cb96 3d 70 20 29 3b 0d 0a 20 20 20 20 20 20 70 4c 6f =p );.. pLo
1cb97 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 ck->eLock = READ
1cb98 5f 4c 4f 43 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 _LOCK;.. }..
1cb99 20 7d 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 }..}....#endif
1cb9a 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 /* SQLITE_OMIT_S
1cb9b 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0d 0a HARED_CACHE */..
1cb9c 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 ..static void re
1cb9d 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 leasePage(MemPag
1cb9e 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 e *pPage); /* F
1cb9f 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 orward reference
1cba0 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 2a 2a 2a */..../*..*****
1cba1 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
1cba2 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 used inside of
1cba3 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a assert() only **
1cba4 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 56 65 72 69 66 **..**..** Verif
1cba5 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f y that the curso
1cba6 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 r holds the mute
1cba7 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 x on its BtShare
1cba8 64 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 d..*/..#ifdef SQ
1cba9 4c 49 54 45 5f 44 45 42 55 47 0d 0a 73 74 61 74 LITE_DEBUG..stat
1cbaa 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c ic int cursorHol
1cbab 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 dsMutex(BtCursor
1cbac 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 *p){.. return
1cbad 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
1cbae 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 ld(p->pBt->mutex
1cbaf 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d );..}..#endif...
1cbb0 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
1cbb1 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0d E_OMIT_INCRBLOB.
1cbb2 0a 2f 2a 0d 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 ./*..** Invalida
1cbb3 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 te the overflow
1cbb4 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 page-list cache
1cbb5 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c for cursor pCur,
1cbb6 20 69 66 20 61 6e 79 2e 0d 0a 2a 2f 0d 0a 73 74 if any...*/..st
1cbb7 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 atic void invali
1cbb8 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 dateOverflowCach
1cbb9 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 e(BtCursor *pCur
1cbba 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 63 75 ){.. assert( cu
1cbbb 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 rsorHoldsMutex(p
1cbbc 43 75 72 29 20 29 3b 0d 0a 20 20 73 71 6c 69 74 Cur) );.. sqlit
1cbbd 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f e3_free(pCur->aO
1cbbe 76 65 72 66 6c 6f 77 29 3b 0d 0a 20 20 70 43 75 verflow);.. pCu
1cbbf 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 r->aOverflow = 0
1cbc0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ;..}..../*..** I
1cbc1 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 nvalidate the ov
1cbc2 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 erflow page-list
1cbc3 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 cache for all c
1cbc4 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0d 0a 2a ursors opened..*
1cbc5 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 * on the shared
1cbc6 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 btree structure
1cbc7 70 42 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 pBt...*/..static
1cbc8 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 void invalidate
1cbc9 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 AllOverflowCache
1cbca 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b (BtShared *pBt){
1cbcb 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b .. BtCursor *p;
1cbcc 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1cbcd 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1cbce 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 Bt->mutex) );..
1cbcf 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 for(p=pBt->pCur
1cbd0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 sor; p; p=p->pNe
1cbd1 78 74 29 7b 0d 0a 20 20 20 20 69 6e 76 61 6c 69 xt){.. invali
1cbd2 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 dateOverflowCach
1cbd3 65 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d e(p);.. }..}...
1cbd4 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e ./*..** This fun
1cbd5 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 ction is called
1cbd6 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 before modifying
1cbd7 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 the contents of
1cbd8 20 61 20 74 61 62 6c 65 0d 0a 2a 2a 20 74 6f 20 a table..** to
1cbd9 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 invalidate any i
1cbda 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 ncrblob cursors
1cbdb 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e that are open on
1cbdc 20 74 68 65 0d 0a 2a 2a 20 72 6f 77 20 6f 72 20 the..** row or
1cbdd 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 one of the rows
1cbde 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0d being modified..
1cbdf 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 72 67 75 6d .**..** If argum
1cbe0 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 ent isClearTable
1cbe1 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 is true, then t
1cbe2 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e he entire conten
1cbe3 74 73 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 74 61 ts of the..** ta
1cbe4 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 ble is about to
1cbe5 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 be deleted. In t
1cbe6 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 his case invalid
1cbe7 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 ate all incrblob
1cbe8 0d 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 ..** cursors ope
1cbe9 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 n on any row wit
1cbea 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 hin the table wi
1cbeb 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e th root-page pgn
1cbec 6f 52 6f 6f 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f oRoot...**..** O
1cbed 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 therwise, if arg
1cbee 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 ument isClearTab
1cbef 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 le is false, the
1cbf0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0d 0a n the row with..
1cbf1 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 ** rowid iRow is
1cbf2 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 being replaced
1cbf3 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 or deleted. In t
1cbf4 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 his case invalid
1cbf5 61 74 65 0d 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f ate..** only tho
1cbf6 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 se incrblob curs
1cbf7 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 ors open on that
1cbf8 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0d 0a specific row...
1cbf9 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
1cbfa 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c invalidateIncrbl
1cbfb 6f 62 43 75 72 73 6f 72 73 28 0d 0a 20 20 42 74 obCursors(.. Bt
1cbfc 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 ree *pBtree,
1cbfd 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 /* The dat
1cbfe 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 abase file to ch
1cbff 65 63 6b 20 2a 2f 0d 0a 20 20 69 36 34 20 69 52 eck */.. i64 iR
1cc00 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ow,
1cc01 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 /* The rowid t
1cc02 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 hat might be cha
1cc03 6e 67 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 nging */.. int
1cc04 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 isClearTable
1cc05 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 /* True if a
1cc06 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e ll rows are bein
1cc07 67 20 64 65 6c 65 74 65 64 20 2a 2f 0d 0a 29 7b g deleted */..){
1cc08 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b .. BtCursor *p;
1cc09 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 .. BtShared *pB
1cc0a 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b t = pBtree->pBt;
1cc0b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1cc0c 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 te3BtreeHoldsMut
1cc0d 65 78 28 70 42 74 72 65 65 29 20 29 3b 0d 0a 20 ex(pBtree) );..
1cc0e 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 for(p=pBt->pCur
1cc0f 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 sor; p; p=p->pNe
1cc10 78 74 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 2d xt){.. if( p-
1cc11 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c >isIncrblobHandl
1cc12 65 20 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 e && (isClearTab
1cc13 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b le || p->info.nK
1cc14 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0d 0a 20 20 ey==iRow) ){..
1cc15 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 p->eState =
1cc16 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0d CURSOR_INVALID;.
1cc17 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a . }.. }..}..
1cc18 0d 0a 23 65 6c 73 65 0d 0a 20 20 2f 2a 20 53 74 ..#else.. /* St
1cc19 75 62 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 ub functions whe
1cc1a 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d n INCRBLOB is om
1cc1b 69 74 74 65 64 20 2a 2f 0d 0a 20 20 23 64 65 66 itted */.. #def
1cc1c 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 ine invalidateOv
1cc1d 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0d 0a erflowCache(x)..
1cc1e 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 #define invali
1cc1f 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 dateAllOverflowC
1cc20 61 63 68 65 28 78 29 0d 0a 20 20 23 64 65 66 69 ache(x).. #defi
1cc21 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 ne invalidateInc
1cc22 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 rblobCursors(x,y
1cc23 2c 7a 29 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 ,z)..#endif /* S
1cc24 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 QLITE_OMIT_INCRB
1cc25 4c 4f 42 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a LOB */..../*..**
1cc26 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 Set bit pgno of
1cc27 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 the BtShared.pH
1cc28 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 asContent bitvec
1cc29 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 . This is called
1cc2a 20 0d 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 ..** when a pag
1cc2b 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c e that previousl
1cc2c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 y contained data
1cc2d 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d becomes a free-
1cc2e 6c 69 73 74 20 6c 65 61 66 20 0d 0a 2a 2a 20 70 list leaf ..** p
1cc2f 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 age...**..** The
1cc30 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f BtShared.pHasCo
1cc31 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 ntent bitvec exi
1cc32 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 sts to work arou
1cc33 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0d 0a 2a nd an obscure..*
1cc34 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20 * bug caused by
1cc35 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 the interaction
1cc36 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f of two useful IO
1cc37 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 optimizations s
1cc38 75 72 72 6f 75 6e 64 69 6e 67 0d 0a 2a 2a 20 66 urrounding..** f
1cc39 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 ree-list leaf pa
1cc3a 67 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 31 ges:..**..** 1
1cc3b 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 ) When all data
1cc3c 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 is deleted from
1cc3d 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 a page and the p
1cc3e 61 67 65 20 62 65 63 6f 6d 65 73 0d 0a 2a 2a 20 age becomes..**
1cc3f 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 a free-list
1cc40 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 leaf page, the
1cc41 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 page is not writ
1cc42 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 ten to the datab
1cc43 61 73 65 0d 0a 2a 2a 20 20 20 20 20 20 28 61 73 ase..** (as
1cc44 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 free-list leaf
1cc45 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f pages contain no
1cc46 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 meaningful data
1cc47 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0d 0a 2a 2a ). Sometimes..**
1cc48 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 such a pag
1cc49 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f e is not even jo
1cc4a 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 urnalled (as it
1cc4b 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 will not be modi
1cc4c 66 69 65 64 2c 0d 0a 2a 2a 20 20 20 20 20 20 77 fied,..** w
1cc4d 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 hy bother journa
1cc4e 6c 6c 69 6e 67 20 69 74 3f 29 2e 0d 0a 2a 2a 0d lling it?)...**.
1cc4f 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 .** 2) When a
1cc50 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 free-list leaf p
1cc51 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 age is reused, i
1cc52 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f ts content is no
1cc53 74 20 72 65 61 64 0d 0a 2a 2a 20 20 20 20 20 20 t read..**
1cc54 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
1cc55 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 e or written to
1cc56 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 the journal file
1cc57 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0d (why should it.
1cc58 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 .** be, if
1cc59 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c it is not at all
1cc5a 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0d 0a meaningful?)...
1cc5b 2a 2a 0d 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 **..** By themse
1cc5c 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 lves, these opti
1cc5d 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 mizations work f
1cc5e 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 ine and provide
1cc5f 61 20 68 61 6e 64 79 0d 0a 2a 2a 20 70 65 72 66 a handy..** perf
1cc60 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f ormance boost to
1cc61 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 bulk delete or
1cc62 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e insert operation
1cc63 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0d 0a s. However, if..
1cc64 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 ** a page is mov
1cc65 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c ed to the free-l
1cc66 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 ist and then reu
1cc67 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 sed within the s
1cc68 61 6d 65 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 ame..** transact
1cc69 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 ion, a problem c
1cc6a 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 omes up. If the
1cc6b 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 page is not jour
1cc6c 6e 61 6c 6c 65 64 20 77 68 65 6e 0d 0a 2a 2a 20 nalled when..**
1cc6d 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 it is moved to t
1cc6e 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 he free-list and
1cc6f 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 it is also not
1cc70 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 journalled when
1cc71 69 74 0d 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 it..** is extrac
1cc72 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 ted from the fre
1cc73 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 e-list and reuse
1cc74 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 d, then the orig
1cc75 69 6e 61 6c 20 64 61 74 61 0d 0a 2a 2a 20 6d 61 inal data..** ma
1cc76 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 y be lost. In th
1cc77 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c e event of a rol
1cc78 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f lback, it may no
1cc79 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0d 0a 2a t be possible..*
1cc7a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 * to restore the
1cc7b 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 database to its
1cc7c 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 original config
1cc7d 75 72 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a uration...**..**
1cc7e 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 The solution is
1cc7f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 the BtShared.pH
1cc80 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 asContent bitvec
1cc81 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 . Whenever a pag
1cc82 65 20 69 73 20 0d 0a 2a 2a 20 6d 6f 76 65 64 20 e is ..** moved
1cc83 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 to become a free
1cc84 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c -list leaf page,
1cc85 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 the correspondi
1cc86 6e 67 20 62 69 74 20 69 73 0d 0a 2a 2a 20 73 65 ng bit is..** se
1cc87 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e t in the bitvec.
1cc88 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 Whenever a leaf
1cc89 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74 page is extract
1cc8a 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 ed from the free
1cc8b 2d 6c 69 73 74 2c 0d 0a 2a 2a 20 6f 70 74 69 6d -list,..** optim
1cc8c 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 ization 2 above
1cc8d 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 is omitted if th
1cc8e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 e corresponding
1cc8f 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0d 0a bit is already..
1cc90 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 ** set in BtShar
1cc91 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 ed.pHasContent.
1cc92 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 The contents of
1cc93 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 the bitvec are c
1cc94 6c 65 61 72 65 64 0d 0a 2a 2a 20 61 74 20 74 68 leared..** at th
1cc95 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 e end of every t
1cc96 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d ransaction...*/.
1cc97 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 .static int btre
1cc98 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 eSetHasContent(B
1cc99 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 tShared *pBt, Pg
1cc9a 6e 6f 20 70 67 6e 6f 29 7b 0d 0a 20 20 69 6e 74 no pgno){.. int
1cc9b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
1cc9c 0d 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 .. if( !pBt->pH
1cc9d 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0d 0a 20 20 asContent ){..
1cc9e 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d assert( pgno<=
1cc9f 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0d 0a 20 pBt->nPage );..
1cca0 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 pBt->pHasCont
1cca1 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 ent = sqlite3Bit
1cca2 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e vecCreate(pBt->n
1cca3 50 61 67 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 Page);.. if(
1cca4 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e !pBt->pHasConten
1cca5 74 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d t ){.. rc =
1cca6 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a SQLITE_NOMEM;..
1cca7 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 }.. }.. if
1cca8 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1cca9 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 && pgno<=sqlite3
1ccaa 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e BitvecSize(pBt->
1ccab 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0d pHasContent) ){.
1ccac 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1ccad 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 3BitvecSet(pBt->
1ccae 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e pHasContent, pgn
1ccaf 6f 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 o);.. }.. retu
1ccb0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
1ccb1 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 .** Query the Bt
1ccb2 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 Shared.pHasConte
1ccb3 6e 74 20 76 65 63 74 6f 72 2e 0d 0a 2a 2a 0d 0a nt vector...**..
1ccb4 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
1ccb5 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 is called when
1ccb6 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 a free-list leaf
1ccb7 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 page is removed
1ccb8 20 66 72 6f 6d 20 74 68 65 0d 0a 2a 2a 20 66 72 from the..** fr
1ccb9 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 ee-list for reus
1ccba 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 e. It returns fa
1ccbb 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66 lse if it is saf
1ccbc 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 e to retrieve th
1ccbd 65 0d 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 e..** page from
1ccbe 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 the pager layer
1ccbf 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e with the 'no-con
1ccc0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 tent' flag set.
1ccc1 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0d True otherwise..
1ccc2 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
1ccc3 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 btreeGetHasConte
1ccc4 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 nt(BtShared *pBt
1ccc5 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0d 0a 20 , Pgno pgno){..
1ccc6 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 Bitvec *p = pBt
1ccc7 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0d 0a ->pHasContent;..
1ccc8 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 return (p && (
1ccc9 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 pgno>sqlite3Bitv
1ccca 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c ecSize(p) || sql
1cccb 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 ite3BitvecTest(p
1cccc 2c 20 70 67 6e 6f 29 29 29 3b 0d 0a 7d 0d 0a 0d , pgno)));..}...
1cccd 0a 2f 2a 0d 0a 2a 2a 20 43 6c 65 61 72 20 28 64 ./*..** Clear (d
1ccce 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 estroy) the BtSh
1cccf 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 ared.pHasContent
1ccd0 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 bitvec. This sh
1ccd1 6f 75 6c 64 20 62 65 0d 0a 2a 2a 20 69 6e 76 6f ould be..** invo
1ccd2 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c ked at the concl
1ccd3 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 usion of each wr
1ccd4 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e ite-transaction.
1ccd5 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
1ccd6 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 d btreeClearHasC
1ccd7 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 ontent(BtShared
1ccd8 2a 70 42 74 29 7b 0d 0a 20 20 73 71 6c 69 74 65 *pBt){.. sqlite
1ccd9 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 3BitvecDestroy(p
1ccda 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 Bt->pHasContent)
1ccdb 3b 0d 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f ;.. pBt->pHasCo
1ccdc 6e 74 65 6e 74 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d ntent = 0;..}...
1ccdd 0a 2f 2a 0d 0a 2a 2a 20 53 61 76 65 20 74 68 65 ./*..** Save the
1ccde 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 current cursor
1ccdf 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 position in the
1cce0 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 variables BtCurs
1cce1 6f 72 2e 6e 4b 65 79 20 0d 0a 2a 2a 20 61 6e 64 or.nKey ..** and
1cce2 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 BtCursor.pKey.
1cce3 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 The cursor's sta
1cce4 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 te is set to CUR
1cce5 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e SOR_REQUIRESEEK.
1cce6 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 6c ..**..** The cal
1cce7 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 ler must ensure
1cce8 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 that the cursor
1cce9 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 is valid (has eS
1ccea 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c tate==CURSOR_VAL
1cceb 49 44 29 0d 0a 2a 2a 20 70 72 69 6f 72 20 74 6f ID)..** prior to
1ccec 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f calling this ro
1cced 75 74 69 6e 65 2e 20 20 0d 0a 2a 2f 0d 0a 73 74 utine. ..*/..st
1ccee 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 atic int saveCur
1ccef 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 sorPosition(BtCu
1ccf0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d 0a 20 20 rsor *pCur){..
1ccf1 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 61 73 73 int rc;.... ass
1ccf2 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 ert( CURSOR_VALI
1ccf3 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 D==pCur->eState
1ccf4 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 30 3d );.. assert( 0=
1ccf5 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0d 0a =pCur->pKey );..
1ccf6 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 assert( cursor
1ccf7 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 HoldsMutex(pCur)
1ccf8 20 29 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 73 71 );.... rc = sq
1ccf9 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a lite3BtreeKeySiz
1ccfa 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e e(pCur, &pCur->n
1ccfb 4b 65 79 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 Key);.. assert(
1ccfc 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1ccfd 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 ; /* KeySize()
1ccfe 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0d 0a cannot fail */..
1ccff 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 .. /* If this i
1cd00 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c s an intKey tabl
1cd01 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 e, then the abov
1cd02 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b e call to BtreeK
1cd03 65 79 53 69 7a 65 28 29 0d 0a 20 20 2a 2a 20 73 eySize().. ** s
1cd04 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 tores the intege
1cd05 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e r key in pCur->n
1cd06 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 Key. In this cas
1cd07 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0d e this value is.
1cd08 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 . ** all that i
1cd09 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 s required. Othe
1cd0a 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 rwise, if pCur i
1cd0b 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e s not open on an
1cd0c 20 69 6e 74 4b 65 79 0d 0a 20 20 2a 2a 20 74 61 intKey.. ** ta
1cd0d 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 ble, then malloc
1cd0e 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 space for and s
1cd0f 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e tore the pCur->n
1cd10 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 Key bytes of key
1cd11 20 0d 0a 20 20 2a 2a 20 64 61 74 61 2e 0d 0a 20 .. ** data...
1cd12 20 2a 2f 0d 0a 20 20 69 66 28 20 30 3d 3d 70 43 */.. if( 0==pC
1cd13 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 ur->apPage[0]->i
1cd14 6e 74 4b 65 79 20 29 7b 0d 0a 20 20 20 20 76 6f ntKey ){.. vo
1cd15 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 id *pKey = sqlit
1cd16 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 e3Malloc( (int)p
1cd17 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0d 0a 20 20 Cur->nKey );..
1cd18 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0d 0a 20 if( pKey ){..
1cd19 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
1cd1a 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 3BtreeKey(pCur,
1cd1b 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 0, (int)pCur->nK
1cd1c 65 79 2c 20 70 4b 65 79 29 3b 0d 0a 20 20 20 20 ey, pKey);..
1cd1d 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1cd1e 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
1cd1f 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 pCur->pKey = pKe
1cd20 79 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b y;.. }else{
1cd21 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 .. sqlite
1cd22 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0d 0a 20 3_free(pKey);..
1cd23 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 }.. }els
1cd24 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 e{.. rc = S
1cd25 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 QLITE_NOMEM;..
1cd26 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 }.. }.. asse
1cd27 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 rt( !pCur->apPag
1cd28 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 e[0]->intKey ||
1cd29 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0d 0a !pCur->pKey );..
1cd2a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 .. if( rc==SQLI
1cd2b 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 6e TE_OK ){.. in
1cd2c 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d t i;.. for(i=
1cd2d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 0; i<=pCur->iPag
1cd2e 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 e; i++){..
1cd2f 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 releasePage(pCur
1cd30 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0d 0a 20 ->apPage[i]);..
1cd31 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 pCur->apPag
1cd32 65 5b 69 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 7d e[i] = 0;.. }
1cd33 0d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 .. pCur->iPag
1cd34 65 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 70 43 75 e = -1;.. pCu
1cd35 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 r->eState = CURS
1cd36 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0d OR_REQUIRESEEK;.
1cd37 0a 20 20 7d 0d 0a 0d 0a 20 20 69 6e 76 61 6c 69 . }.... invali
1cd38 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 dateOverflowCach
1cd39 65 28 70 43 75 72 29 3b 0d 0a 20 20 72 65 74 75 e(pCur);.. retu
1cd3a 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
1cd3b 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 .** Save the pos
1cd3c 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 itions of all cu
1cd3d 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 rsors (except pE
1cd3e 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 xcept) that are
1cd3f 6f 70 65 6e 20 6f 6e 0d 0a 2a 2a 20 74 68 65 20 open on..** the
1cd40 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f 6f 74 table with root
1cd41 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 -page iRoot. Usu
1cd42 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 ally, this is ca
1cd43 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 lled just before
1cd44 20 63 75 72 73 6f 72 0d 0a 2a 2a 20 70 45 78 63 cursor..** pExc
1cd45 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d ept is used to m
1cd46 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 odify the table
1cd47 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f (BtreeDelete() o
1cd48 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 r BtreeInsert())
1cd49 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e ...*/..static in
1cd4a 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 t saveAllCursors
1cd4b 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 (BtShared *pBt,
1cd4c 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 Pgno iRoot, BtCu
1cd4d 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0d rsor *pExcept){.
1cd4e 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0d . BtCursor *p;.
1cd4f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1cd50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 e3_mutex_held(pB
1cd51 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 t->mutex) );..
1cd52 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d assert( pExcept=
1cd53 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 =0 || pExcept->p
1cd54 42 74 3d 3d 70 42 74 20 29 3b 0d 0a 20 20 66 6f Bt==pBt );.. fo
1cd55 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 r(p=pBt->pCursor
1cd56 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 ; p; p=p->pNext)
1cd57 7b 0d 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 {.. if( p!=pE
1cd58 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f xcept && (0==iRo
1cd59 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f ot || p->pgnoRoo
1cd5a 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0d 0a 20 t==iRoot) && ..
1cd5b 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 p->eState
1cd5c 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 ==CURSOR_VALID )
1cd5d 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 {.. int rc
1cd5e 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 = saveCursorPosi
1cd5f 74 69 6f 6e 28 70 29 3b 0d 0a 20 20 20 20 20 20 tion(p);..
1cd60 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 if( SQLITE_OK!=r
1cd61 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 c ){.. re
1cd62 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 turn rc;..
1cd63 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 }.. }.. }..
1cd64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1cd65 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 K;..}..../*..**
1cd66 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e Clear the curren
1cd67 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f t cursor positio
1cd68 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 n...*/..SQLITE_P
1cd69 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
1cd6a 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 te3BtreeClearCur
1cd6b 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 sor(BtCursor *pC
1cd6c 75 72 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 ur){.. assert(
1cd6d 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 cursorHoldsMutex
1cd6e 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 73 71 6c (pCur) );.. sql
1cd6f 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e ite3_free(pCur->
1cd70 70 4b 65 79 29 3b 0d 0a 20 20 70 43 75 72 2d 3e pKey);.. pCur->
1cd71 70 4b 65 79 20 3d 20 30 3b 0d 0a 20 20 70 43 75 pKey = 0;.. pCu
1cd72 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 r->eState = CURS
1cd73 4f 52 5f 49 4e 56 41 4c 49 44 3b 0d 0a 7d 0d 0a OR_INVALID;..}..
1cd74 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 20 74 68 69 73 ../*..** In this
1cd75 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 version of Btre
1cd76 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 eMoveto, pKey is
1cd77 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 a packed index
1cd78 72 65 63 6f 72 64 0d 0a 2a 2a 20 73 75 63 68 20 record..** such
1cd79 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 as is generated
1cd7a 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 by the OP_MakeRe
1cd7b 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e cord opcode. Un
1cd7c 70 61 63 6b 20 74 68 65 0d 0a 2a 2a 20 72 65 63 pack the..** rec
1cd7d 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c ord and then cal
1cd7e 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 l BtreeMovetoUnp
1cd7f 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 acked() to do th
1cd80 65 20 77 6f 72 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61 e work...*/..sta
1cd81 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 tic int btreeMov
1cd82 65 74 6f 28 0d 0a 20 20 42 74 43 75 72 73 6f 72 eto(.. BtCursor
1cd83 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 *pCur, /* C
1cd84 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 ursor open on th
1cd85 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 e btree to be se
1cd86 61 72 63 68 65 64 20 2a 2f 0d 0a 20 20 63 6f 6e arched */.. con
1cd87 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 st void *pKey,
1cd88 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 /* Packed key i
1cd89 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 f the btree is a
1cd8a 6e 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 69 36 n index */.. i6
1cd8b 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 4 nKey,
1cd8c 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 /* Integer key
1cd8d 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 for tables. Si
1cd8e 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 ze of pKey for i
1cd8f 6e 64 69 63 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 ndices */.. int
1cd90 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 bias,
1cd91 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 /* Bias search
1cd92 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 to the high end
1cd93 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 */.. int *pRes
1cd94 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 /* Wri
1cd95 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 te search result
1cd96 73 20 68 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 s here */..){..
1cd97 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
1cd98 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1cd99 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0d 0a 20 tatus code */..
1cd9a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1cd9b 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 *pIdxKey; /* U
1cd9c 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 npacked index ke
1cd9d 79 20 2a 2f 0d 0a 20 20 63 68 61 72 20 61 53 70 y */.. char aSp
1cd9e 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 ace[150];
1cd9f 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 /* Temp space
1cda0 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 for pIdxKey - t
1cda1 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 o avoid a malloc
1cda2 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 70 46 72 */.. char *pFr
1cda3 65 65 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 ee = 0;.... if(
1cda4 20 70 4b 65 79 20 29 7b 0d 0a 20 20 20 20 61 73 pKey ){.. as
1cda5 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 sert( nKey==(i64
1cda6 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0d 0a 20 )(int)nKey );..
1cda7 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c pIdxKey = sql
1cda8 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 ite3VdbeAllocUnp
1cda9 61 63 6b 65 64 52 65 63 6f 72 64 28 0d 0a 20 20 ackedRecord(..
1cdaa 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 pCur->pKey
1cdab 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 Info, aSpace, si
1cdac 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 zeof(aSpace), &p
1cdad 46 72 65 65 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 Free.. );..
1cdae 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 if( pIdxKey==0
1cdaf 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
1cdb0 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 73 71 6c _NOMEM;.. sql
1cdb1 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e ite3VdbeRecordUn
1cdb2 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 pack(pCur->pKeyI
1cdb3 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 nfo, (int)nKey,
1cdb4 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0d pKey, pIdxKey);.
1cdb5 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
1cdb6 49 64 78 4b 65 79 20 3d 20 30 3b 0d 0a 20 20 7d IdxKey = 0;.. }
1cdb7 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 .. rc = sqlite3
1cdb8 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 BtreeMovetoUnpac
1cdb9 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 ked(pCur, pIdxKe
1cdba 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 y, nKey, bias, p
1cdbb 52 65 73 29 3b 0d 0a 20 20 69 66 28 20 70 46 72 Res);.. if( pFr
1cdbc 65 65 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 ee ){.. sqlit
1cdbd 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 e3DbFree(pCur->p
1cdbe 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 KeyInfo->db, pFr
1cdbf 65 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ee);.. }.. ret
1cdc0 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1cdc1 0d 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 ..** Restore the
1cdc2 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 cursor to the p
1cdc3 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 osition it was i
1cdc4 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 n (or as close t
1cdc5 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0d 0a o as possible)..
1cdc6 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 ** when saveCurs
1cdc7 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 orPosition() was
1cdc8 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 called. Note th
1cdc9 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c at this call del
1cdca 65 74 65 73 20 74 68 65 20 0d 0a 2a 2a 20 73 61 etes the ..** sa
1cdcb 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 ved position inf
1cdcc 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 o stored by save
1cdcd 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 CursorPosition()
1cdce 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 , so there can b
1cdcf 65 0d 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e e..** at most on
1cdd0 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 e effective rest
1cdd1 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f oreCursorPositio
1cdd2 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 n() call after e
1cdd3 61 63 68 20 0d 0a 2a 2a 20 73 61 76 65 43 75 72 ach ..** saveCur
1cdd4 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0d 0a sorPosition()...
1cdd5 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 62 */..static int b
1cdd6 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f treeRestoreCurso
1cdd7 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 rPosition(BtCurs
1cdd8 6f 72 20 2a 70 43 75 72 29 7b 0d 0a 20 20 69 6e or *pCur){.. in
1cdd9 74 20 72 63 3b 0d 0a 20 20 61 73 73 65 72 74 28 t rc;.. assert(
1cdda 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 cursorHoldsMute
1cddb 78 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 61 73 x(pCur) );.. as
1cddc 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 sert( pCur->eSta
1cddd 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 te>=CURSOR_REQUI
1cdde 52 45 53 45 45 4b 20 29 3b 0d 0a 20 20 69 66 28 RESEEK );.. if(
1cddf 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 pCur->eState==C
1cde0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0d 0a URSOR_FAULT ){..
1cde1 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d return pCur-
1cde2 3e 73 6b 69 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d >skipNext;.. }.
1cde3 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 . pCur->eState
1cde4 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 = CURSOR_INVALID
1cde5 3b 0d 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d ;.. rc = btreeM
1cde6 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 oveto(pCur, pCur
1cde7 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b ->pKey, pCur->nK
1cde8 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b ey, 0, &pCur->sk
1cde9 69 70 4e 65 78 74 29 3b 0d 0a 20 20 69 66 28 20 ipNext);.. if(
1cdea 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1cdeb 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 .. sqlite3_fr
1cdec 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0d ee(pCur->pKey);.
1cded 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 . pCur->pKey
1cdee 3d 20 30 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 = 0;.. assert
1cdef 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d ( pCur->eState==
1cdf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 CURSOR_VALID ||
1cdf1 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 pCur->eState==CU
1cdf2 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0d RSOR_INVALID );.
1cdf3 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
1cdf4 63 3b 0d 0a 7d 0d 0a 0d 0a 23 64 65 66 69 6e 65 c;..}....#define
1cdf5 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f restoreCursorPo
1cdf6 73 69 74 69 6f 6e 28 70 29 20 5c 0d 0a 20 20 28 sition(p) \.. (
1cdf7 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f p->eState>=CURSO
1cdf8 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 R_REQUIRESEEK ?
1cdf9 5c 0d 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 \.. btre
1cdfa 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f eRestoreCursorPo
1cdfb 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0d 0a 20 sition(p) : \..
1cdfc 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f SQLITE_O
1cdfd 4b 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 74 K)..../*..** Det
1cdfe 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f ermine whether o
1cdff 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 r not a cursor h
1ce00 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 as moved from th
1ce01 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0d 0a 2a e position it..*
1ce02 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 * was last place
1ce03 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 d at. Cursors c
1ce04 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 an move when the
1ce05 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f row they are po
1ce06 69 6e 74 69 6e 67 0d 0a 2a 2a 20 61 74 20 69 73 inting..** at is
1ce07 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f deleted out fro
1ce08 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0d 0a 2a m under them...*
1ce09 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 *..** This routi
1ce0a 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 ne returns an er
1ce0b 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 ror code if some
1ce0c 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 thing goes wrong
1ce0d 2e 20 20 54 68 65 0d 0a 2a 2a 20 69 6e 74 65 67 . The..** integ
1ce0e 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 er *pHasMoved is
1ce0f 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 set to one if t
1ce10 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f he cursor has mo
1ce11 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 ved and 0 if not
1ce12 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
1ce13 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
1ce14 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 3BtreeCursorHasM
1ce15 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 oved(BtCursor *p
1ce16 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f Cur, int *pHasMo
1ce17 76 65 64 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b ved){.. int rc;
1ce18 0d 0a 0d 0a 20 20 72 63 20 3d 20 72 65 73 74 6f .... rc = resto
1ce19 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e reCursorPosition
1ce1a 28 70 43 75 72 29 3b 0d 0a 20 20 69 66 28 20 72 (pCur);.. if( r
1ce1b 63 20 29 7b 0d 0a 20 20 20 20 2a 70 48 61 73 4d c ){.. *pHasM
1ce1c 6f 76 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 72 oved = 1;.. r
1ce1d 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a eturn rc;.. }..
1ce1e 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 if( pCur->eSta
1ce1f 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 te!=CURSOR_VALID
1ce20 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 || pCur->skipNe
1ce21 78 74 21 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70 xt!=0 ){.. *p
1ce22 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0d 0a 20 HasMoved = 1;..
1ce23 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70 48 }else{.. *pH
1ce24 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0d 0a 20 20 asMoved = 0;..
1ce25 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }.. return SQLI
1ce26 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 TE_OK;..}....#if
1ce27 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
1ce28 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 2f 2a 0d _AUTOVACUUM../*.
1ce29 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 .** Given a page
1ce2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 number of a reg
1ce2b 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 ular database pa
1ce2c 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 ge, return the p
1ce2d 61 67 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 age..** number f
1ce2e 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d or the pointer-m
1ce2f 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e ap page that con
1ce30 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 tains the entry
1ce31 66 6f 72 20 74 68 65 0d 0a 2a 2a 20 69 6e 70 75 for the..** inpu
1ce32 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0d 0a t page number...
1ce33 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 **..** Return 0
1ce34 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 (not a valid pag
1ce35 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 e) for pgno==1 s
1ce36 69 6e 63 65 20 74 68 65 72 65 20 69 73 0d 0a 2a ince there is..*
1ce37 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 * no pointer map
1ce38 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
1ce39 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e page 1. The in
1ce3a 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f tegrity_check lo
1ce3b 67 69 63 0d 0a 2a 2a 20 72 65 71 75 69 72 65 73 gic..** requires
1ce3c 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 that ptrmapPage
1ce3d 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0d 0a 2a 2f 0d no(*,1)!=1...*/.
1ce3e 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 .static Pgno ptr
1ce3f 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 mapPageno(BtShar
1ce40 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 ed *pBt, Pgno pg
1ce41 6e 6f 29 7b 0d 0a 20 20 69 6e 74 20 6e 50 61 67 no){.. int nPag
1ce42 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0d 0a 20 esPerMapPage;..
1ce43 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 Pgno iPtrMap, r
1ce44 65 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 et;.. assert( s
1ce45 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1ce46 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b d(pBt->mutex) );
1ce47 0d 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 .. if( pgno<2 )
1ce48 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 6e 50 return 0;.. nP
1ce49 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d agesPerMapPage =
1ce4a 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a (pBt->usableSiz
1ce4b 65 2f 35 29 2b 31 3b 0d 0a 20 20 69 50 74 72 4d e/5)+1;.. iPtrM
1ce4c 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 ap = (pgno-2)/nP
1ce4d 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0d agesPerMapPage;.
1ce4e 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 . ret = (iPtrMa
1ce4f 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 p*nPagesPerMapPa
1ce50 67 65 29 20 2b 20 32 3b 20 0d 0a 20 20 69 66 28 ge) + 2; .. if(
1ce51 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 ret==PENDING_BY
1ce52 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0d TE_PAGE(pBt) ){.
1ce53 0a 20 20 20 20 72 65 74 2b 2b 3b 0d 0a 20 20 7d . ret++;.. }
1ce54 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d .. return ret;.
1ce55 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69 .}..../*..** Wri
1ce56 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f te an entry into
1ce57 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 the pointer map
1ce58 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 ...**..** This r
1ce59 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 outine updates t
1ce5a 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 he pointer map e
1ce5b 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 ntry for page nu
1ce5c 6d 62 65 72 20 27 6b 65 79 27 0d 0a 2a 2a 20 73 mber 'key'..** s
1ce5d 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 o that it maps t
1ce5e 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 o type 'eType' a
1ce5f 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e nd parent page n
1ce60 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0d 0a 2a umber 'pgno'...*
1ce61 2a 0d 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 *..** If *pRC is
1ce62 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a initially non-z
1ce63 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f ero (non-SQLITE_
1ce64 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f OK) then this ro
1ce65 75 74 69 6e 65 20 69 73 0d 0a 2a 2a 20 61 20 6e utine is..** a n
1ce66 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 o-op. If an err
1ce67 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 or occurs, the a
1ce68 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 ppropriate error
1ce69 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e code is written
1ce6a 0d 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0d ..** into *pRC..
1ce6b 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
1ce6c 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 ptrmapPut(BtSha
1ce6d 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b red *pBt, Pgno k
1ce6e 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 ey, u8 eType, Pg
1ce6f 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a no parent, int *
1ce70 70 52 43 29 7b 0d 0a 20 20 44 62 50 61 67 65 20 pRC){.. DbPage
1ce71 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 *pDbPage; /* Th
1ce72 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 e pointer map pa
1ce73 67 65 20 2a 2f 0d 0a 20 20 75 38 20 2a 70 50 74 ge */.. u8 *pPt
1ce74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 rmap; /* Th
1ce75 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 e pointer map da
1ce76 74 61 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 69 50 ta */.. Pgno iP
1ce77 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 trmap; /* Th
1ce78 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 e pointer map pa
1ce79 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 ge number */..
1ce7a 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 int offset;
1ce7b 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 /* Offset in p
1ce7c 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 ointer map page
1ce7d 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 */.. int rc;
1ce7e 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
1ce7f 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 n code from subf
1ce80 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 0d 0a 20 unctions */....
1ce81 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 if( *pRC ) retu
1ce82 72 6e 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 rn;.... assert(
1ce83 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
1ce84 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 eld(pBt->mutex)
1ce85 29 3b 0d 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 );.. /* The mas
1ce86 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 ter-journal page
1ce87 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 number must nev
1ce88 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 er be used as a
1ce89 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 pointer map page
1ce8a 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 30 */.. assert( 0
1ce8b 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 ==PTRMAP_ISPAGE(
1ce8c 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 pBt, PENDING_BYT
1ce8d 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0d E_PAGE(pBt)) );.
1ce8e 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 ... assert( pBt
1ce8f 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0d ->autoVacuum );.
1ce90 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b . if( key==0 ){
1ce91 0d 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c .. *pRC = SQL
1ce92 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
1ce93 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a ;.. return;..
1ce94 20 20 7d 0d 0a 20 20 69 50 74 72 6d 61 70 20 3d }.. iPtrmap =
1ce95 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 PTRMAP_PAGENO(p
1ce96 42 74 2c 20 6b 65 79 29 3b 0d 0a 20 20 72 63 20 Bt, key);.. rc
1ce97 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 = sqlite3PagerGe
1ce98 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 t(pBt->pPager, i
1ce99 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 Ptrmap, &pDbPage
1ce9a 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 );.. if( rc!=SQ
1ce9b 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1ce9c 2a 70 52 43 20 3d 20 72 63 3b 0d 0a 20 20 20 20 *pRC = rc;..
1ce9d 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 return;.. }..
1ce9e 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f offset = PTRMAP_
1ce9f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 PTROFFSET(iPtrma
1cea0 70 2c 20 6b 65 79 29 3b 0d 0a 20 20 69 66 28 20 p, key);.. if(
1cea1 6f 66 66 73 65 74 3c 30 20 29 7b 0d 0a 20 20 20 offset<0 ){..
1cea2 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 *pRC = SQLITE_C
1cea3 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1cea4 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 goto ptrmap_ex
1cea5 69 74 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 it;.. }.. asse
1cea6 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 rt( offset <= (i
1cea7 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 nt)pBt->usableSi
1cea8 7a 65 2d 35 20 29 3b 0d 0a 20 20 70 50 74 72 6d ze-5 );.. pPtrm
1cea9 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 ap = (u8 *)sqlit
1ceaa 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 e3PagerGetData(p
1ceab 44 62 50 61 67 65 29 3b 0d 0a 0d 0a 20 20 69 66 DbPage);.... if
1ceac 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 ( eType!=pPtrmap
1cead 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 [offset] || get4
1ceae 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 byte(&pPtrmap[of
1ceaf 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 fset+1])!=parent
1ceb0 20 29 7b 0d 0a 20 20 20 20 54 52 41 43 45 28 28 ){.. TRACE((
1ceb1 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 "PTRMAP_UPDATE:
1ceb2 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 %d->(%d,%d)\n",
1ceb3 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 key, eType, pare
1ceb4 6e 74 29 29 3b 0d 0a 20 20 20 20 2a 70 52 43 3d nt));.. *pRC=
1ceb5 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 rc = sqlite3Pag
1ceb6 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 erWrite(pDbPage)
1ceb7 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 ;.. if( rc==S
1ceb8 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1ceb9 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 pPtrmap[offse
1ceba 74 5d 20 3d 20 65 54 79 70 65 3b 0d 0a 20 20 20 t] = eType;..
1cebb 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 put4byte(&pPt
1cebc 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 rmap[offset+1],
1cebd 70 61 72 65 6e 74 29 3b 0d 0a 20 20 20 20 7d 0d parent);.. }.
1cebe 0a 20 20 7d 0d 0a 0d 0a 70 74 72 6d 61 70 5f 65 . }....ptrmap_e
1cebf 78 69 74 3a 0d 0a 20 20 73 71 6c 69 74 65 33 50 xit:.. sqlite3P
1cec0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 agerUnref(pDbPag
1cec1 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a e);..}..../*..**
1cec2 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 Read an entry f
1cec3 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 rom the pointer
1cec4 6d 61 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 map...**..** Thi
1cec5 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 s routine retrie
1cec6 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 ves the pointer
1cec7 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 map entry for pa
1cec8 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e ge 'key', writin
1cec9 67 0d 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 g..** the type a
1ceca 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e nd parent page n
1cecb 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 umber to *pEType
1cecc 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 and *pPgno resp
1cecd 65 63 74 69 76 65 6c 79 2e 0d 0a 2a 2a 20 41 6e ectively...** An
1cece 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 error code is r
1cecf 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 eturned if somet
1ced0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c hing goes wrong,
1ced1 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 otherwise SQLIT
1ced2 45 5f 4f 4b 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 E_OK...*/..stati
1ced3 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 c int ptrmapGet(
1ced4 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 BtShared *pBt, P
1ced5 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 gno key, u8 *pET
1ced6 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f ype, Pgno *pPgno
1ced7 29 7b 0d 0a 20 20 44 62 50 61 67 65 20 2a 70 44 ){.. DbPage *pD
1ced8 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 bPage; /* The
1ced9 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 pointer map page
1ceda 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 50 74 72 6d */.. int iPtrm
1cedb 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 ap; /* Poi
1cedc 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e nter map page in
1cedd 64 65 78 20 2a 2f 0d 0a 20 20 75 38 20 2a 70 50 dex */.. u8 *pP
1cede 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 trmap; /*
1cedf 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 Pointer map page
1cee0 20 64 61 74 61 20 2a 2f 0d 0a 20 20 69 6e 74 20 data */.. int
1cee1 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f offset; /
1cee2 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 * Offset of entr
1cee3 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 y in pointer map
1cee4 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a */.. int rc;..
1cee5 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1cee6 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1cee7 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 0d Bt->mutex) );...
1cee8 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 . iPtrmap = PTR
1cee9 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 MAP_PAGENO(pBt,
1ceea 6b 65 79 29 3b 0d 0a 20 20 72 63 20 3d 20 73 71 key);.. rc = sq
1ceeb 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 lite3PagerGet(pB
1ceec 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d t->pPager, iPtrm
1ceed 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0d 0a ap, &pDbPage);..
1ceee 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0d 0a if( rc!=0 ){..
1ceef 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
1cef0 20 20 7d 0d 0a 20 20 70 50 74 72 6d 61 70 20 3d }.. pPtrmap =
1cef1 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 (u8 *)sqlite3Pa
1cef2 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 gerGetData(pDbPa
1cef3 67 65 29 3b 0d 0a 0d 0a 20 20 6f 66 66 73 65 74 ge);.... offset
1cef4 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 = PTRMAP_PTROFF
1cef5 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 SET(iPtrmap, key
1cef6 29 3b 0d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 );.. if( offset
1cef7 3c 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 <0 ){.. sqlit
1cef8 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 e3PagerUnref(pDb
1cef9 50 61 67 65 29 3b 0d 0a 20 20 20 20 72 65 74 75 Page);.. retu
1cefa 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1cefb 54 5f 42 4b 50 54 3b 0d 0a 20 20 7d 0d 0a 20 20 T_BKPT;.. }..
1cefc 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c assert( offset <
1cefd 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 = (int)pBt->usab
1cefe 6c 65 53 69 7a 65 2d 35 20 29 3b 0d 0a 20 20 61 leSize-5 );.. a
1ceff 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 ssert( pEType!=0
1cf00 20 29 3b 0d 0a 20 20 2a 70 45 54 79 70 65 20 3d );.. *pEType =
1cf01 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d pPtrmap[offset]
1cf02 3b 0d 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 ;.. if( pPgno )
1cf03 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 *pPgno = get4by
1cf04 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 te(&pPtrmap[offs
1cf05 65 74 2b 31 5d 29 3b 0d 0a 0d 0a 20 20 73 71 6c et+1]);.... sql
1cf06 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 ite3PagerUnref(p
1cf07 44 62 50 61 67 65 29 3b 0d 0a 20 20 69 66 28 20 DbPage);.. if(
1cf08 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 *pEType<1 || *pE
1cf09 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 Type>5 ) return
1cf0a 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1cf0b 4b 50 54 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 KPT;.. return S
1cf0c 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a QLITE_OK;..}....
1cf0d 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 #else /* if defi
1cf0e 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned SQLITE_OMIT_
1cf0f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0d 0a 20 AUTOVACUUM */..
1cf10 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 #define ptrmapP
1cf11 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0d 0a ut(w,x,y,z,rc)..
1cf12 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 #define ptrmap
1cf13 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c Get(w,x,y,z) SQL
1cf14 49 54 45 5f 4f 4b 0d 0a 20 20 23 64 65 66 69 6e ITE_OK.. #defin
1cf15 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 e ptrmapPutOvflP
1cf16 74 72 28 78 2c 20 79 2c 20 72 63 29 0d 0a 23 65 tr(x, y, rc)..#e
1cf17 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 ndif..../*..** G
1cf18 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 iven a btree pag
1cf19 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 e and a cell ind
1cf1a 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 ex (0 means the
1cf1b 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0d 0a 2a first cell on..*
1cf1c 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 * the page, 1 me
1cf1d 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 ans the second c
1cf1e 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 ell, and so fort
1cf1f 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e h) return a poin
1cf20 74 65 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 63 ter..** to the c
1cf21 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0d 0a 2a 2a ell content...**
1cf22 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
1cf23 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 e works only for
1cf24 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e pages that do n
1cf25 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 ot contain overf
1cf26 6c 6f 77 20 63 65 6c 6c 73 2e 0d 0a 2a 2f 0d 0a low cells...*/..
1cf27 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c #define findCell
1cf28 28 50 2c 49 29 20 5c 0d 0a 20 20 28 28 50 29 2d (P,I) \.. ((P)-
1cf29 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d >aData + ((P)->m
1cf2a 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 askPage & get2by
1cf2b 74 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 te(&(P)->aCellId
1cf2c 78 5b 32 2a 28 49 29 5d 29 29 29 0d 0a 23 64 65 x[2*(I)])))..#de
1cf2d 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 fine findCellv2(
1cf2e 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 D,M,O,I) (D+(M&g
1cf2f 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 et2byte(D+(O+2*(
1cf30 49 29 29 29 29 29 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a I)))))....../*..
1cf31 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 ** This a more c
1cf32 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f omplex version o
1cf33 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 f findCell() tha
1cf34 74 20 77 6f 72 6b 73 20 66 6f 72 0d 0a 2a 2a 20 t works for..**
1cf35 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f pages that do co
1cf36 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 ntain overflow c
1cf37 65 6c 6c 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 ells...*/..stati
1cf38 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c c u8 *findOverfl
1cf39 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a owCell(MemPage *
1cf3a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c pPage, int iCell
1cf3b 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 ){.. int i;..
1cf3c 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1cf3d 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 mutex_held(pPage
1cf3e 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b ->pBt->mutex) );
1cf3f 0d 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d .. for(i=pPage-
1cf40 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e >nOverflow-1; i>
1cf41 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 20 69 =0; i--){.. i
1cf42 6e 74 20 6b 3b 0d 0a 20 20 20 20 73 74 72 75 63 nt k;.. struc
1cf43 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 t _OvflCell *pOv
1cf44 66 6c 3b 0d 0a 20 20 20 20 70 4f 76 66 6c 20 3d fl;.. pOvfl =
1cf45 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 &pPage->aOvfl[i
1cf46 5d 3b 0d 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 ];.. k = pOvf
1cf47 6c 2d 3e 69 64 78 3b 0d 0a 20 20 20 20 69 66 28 l->idx;.. if(
1cf48 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0d 0a 20 20 k<=iCell ){..
1cf49 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c if( k==iCell
1cf4a 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 ){.. ret
1cf4b 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c urn pOvfl->pCell
1cf4c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1cf4d 20 20 69 43 65 6c 6c 2d 2d 3b 0d 0a 20 20 20 20 iCell--;..
1cf4e 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e }.. }.. return
1cf4f 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c findCell(pPage,
1cf50 20 69 43 65 6c 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 2f iCell);..}..../
1cf51 2a 0d 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 *..** Parse a ce
1cf52 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b ll content block
1cf53 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 and fill in the
1cf54 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 CellInfo struct
1cf55 75 72 65 2e 20 20 54 68 65 72 65 0d 0a 2a 2a 20 ure. There..**
1cf56 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 are two versions
1cf57 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f of this functio
1cf58 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 n. btreeParseCe
1cf59 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0d 0a 2a ll() takes a ..*
1cf5a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 * cell index as
1cf5b 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
1cf5c 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 ent and btreePar
1cf5d 73 65 43 65 6c 6c 50 74 72 28 29 20 0d 0a 2a 2a seCellPtr() ..**
1cf5e 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 takes a pointer
1cf5f 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 to the body of
1cf60 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 the cell as its
1cf61 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e second argument.
1cf62 0d 0a 2a 2a 0d 0a 2a 2a 20 57 69 74 68 69 6e 20 ..**..** Within
1cf63 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 this file, the p
1cf64 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f arseCell() macro
1cf65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 can be called i
1cf66 6e 73 74 65 61 64 20 6f 66 0d 0a 2a 2a 20 62 74 nstead of..** bt
1cf67 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 reeParseCellPtr(
1cf68 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f ). Using some co
1cf69 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 mpilers, this wi
1cf6a 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0d 0a 2a ll be faster...*
1cf6b 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 /..static void b
1cf6c 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 treeParseCellPtr
1cf6d 28 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 (.. MemPage *pP
1cf6e 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 age, /*
1cf6f 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 Page containing
1cf70 74 68 65 20 63 65 6c 6c 20 2a 2f 0d 0a 20 20 75 the cell */.. u
1cf71 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 8 *pCell,
1cf72 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
1cf73 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 r to the cell te
1cf74 78 74 2e 20 2a 2f 0d 0a 20 20 43 65 6c 6c 49 6e xt. */.. CellIn
1cf75 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 fo *pInfo
1cf76 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 /* Fill in thi
1cf77 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a s structure */..
1cf78 29 7b 0d 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 ){.. u16 n;
1cf79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1cf7a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e Number bytes in
1cf7b 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 cell content he
1cf7c 61 64 65 72 20 2a 2f 0d 0a 20 20 75 33 32 20 6e ader */.. u32 n
1cf7d 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 Payload;
1cf7e 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
1cf7f 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 bytes of cell pa
1cf80 79 6c 6f 61 64 20 2a 2f 0d 0a 0d 0a 20 20 61 73 yload */.... as
1cf81 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
1cf82 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e tex_held(pPage->
1cf83 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a pBt->mutex) );..
1cf84 0d 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c .. pInfo->pCell
1cf85 20 3d 20 70 43 65 6c 6c 3b 0d 0a 20 20 61 73 73 = pCell;.. ass
1cf86 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 ert( pPage->leaf
1cf87 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 ==0 || pPage->le
1cf88 61 66 3d 3d 31 20 29 3b 0d 0a 20 20 6e 20 3d 20 af==1 );.. n =
1cf89 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 pPage->childPtrS
1cf8a 69 7a 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ize;.. assert(
1cf8b 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 n==4-4*pPage->le
1cf8c 61 66 20 29 3b 0d 0a 20 20 69 66 28 20 70 50 61 af );.. if( pPa
1cf8d 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 ge->intKey ){..
1cf8e 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 if( pPage->ha
1cf8f 73 44 61 74 61 20 29 7b 0d 0a 20 20 20 20 20 20 sData ){..
1cf90 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 n += getVarint32
1cf91 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 (&pCell[n], nPay
1cf92 6c 6f 61 64 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 load);.. }els
1cf93 65 7b 0d 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f e{.. nPaylo
1cf94 61 64 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a ad = 0;.. }..
1cf95 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 n += getVari
1cf96 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 nt(&pCell[n], (u
1cf97 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 64*)&pInfo->nKey
1cf98 29 3b 0d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e );.. pInfo->n
1cf99 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b Data = nPayload;
1cf9a 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
1cf9b 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 pInfo->nData = 0
1cf9c 3b 0d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 ;.. n += getV
1cf9d 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e arint32(&pCell[n
1cf9e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0d 0a 20 ], nPayload);..
1cf9f 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d pInfo->nKey =
1cfa0 20 6e 50 61 79 6c 6f 61 64 3b 0d 0a 20 20 7d 0d nPayload;.. }.
1cfa1 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f . pInfo->nPaylo
1cfa2 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0d 0a ad = nPayload;..
1cfa3 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 pInfo->nHeader
1cfa4 20 3d 20 6e 3b 0d 0a 20 20 74 65 73 74 63 61 73 = n;.. testcas
1cfa5 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 e( nPayload==pPa
1cfa6 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0d ge->maxLocal );.
1cfa7 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 . testcase( nPa
1cfa8 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 yload==pPage->ma
1cfa9 78 4c 6f 63 61 6c 2b 31 20 29 3b 0d 0a 20 20 69 xLocal+1 );.. i
1cfaa 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f f( likely(nPaylo
1cfab 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f ad<=pPage->maxLo
1cfac 63 61 6c 29 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 cal) ){.. /*
1cfad 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 This is the (eas
1cfae 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 y) common case w
1cfaf 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 here the entire
1cfb0 70 61 79 6c 6f 61 64 20 66 69 74 73 0d 0a 20 20 payload fits..
1cfb1 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 ** on the loca
1cfb2 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 l page. No over
1cfb3 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 flow is required
1cfb4 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 ... */.. i
1cfb5 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 f( (pInfo->nSize
1cfb6 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c = (u16)(n+nPayl
1cfb7 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d oad))<4 ) pInfo-
1cfb8 3e 6e 53 69 7a 65 20 3d 20 34 3b 0d 0a 20 20 20 >nSize = 4;..
1cfb9 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d pInfo->nLocal =
1cfba 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0d (u16)nPayload;.
1cfbb 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 . pInfo->iOve
1cfbc 72 66 6c 6f 77 20 3d 20 30 3b 0d 0a 20 20 7d 65 rflow = 0;.. }e
1cfbd 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 lse{.. /* If
1cfbe 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c the payload will
1cfbf 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 not fit complet
1cfc0 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c ely on the local
1cfc1 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0d 0a page, we have..
1cfc2 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 ** to decide
1cfc3 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f how much to sto
1cfc4 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 re locally and h
1cfc5 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c ow much to spill
1cfc6 20 6f 6e 74 6f 0d 0a 20 20 20 20 2a 2a 20 6f 76 onto.. ** ov
1cfc7 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 erflow pages. T
1cfc8 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 he strategy is t
1cfc9 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 o minimize the a
1cfca 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0d mount of unused.
1cfcb 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e . ** space on
1cfcc 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 overflow pages
1cfcd 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 while keeping th
1cfce 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 e amount of loca
1cfcf 6c 20 73 74 6f 72 61 67 65 0d 0a 20 20 20 20 2a l storage.. *
1cfd0 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e * in between min
1cfd1 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 Local and maxLoc
1cfd2 61 6c 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 al... **..
1cfd3 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 ** Warning: ch
1cfd4 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f anging the way o
1cfd5 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 verflow payload
1cfd6 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 is distributed i
1cfd7 6e 20 61 6e 79 0d 0a 20 20 20 20 2a 2a 20 77 61 n any.. ** wa
1cfd8 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e y will result in
1cfd9 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 an incompatible
1cfda 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 file format...
1cfdb 20 20 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 6d */.. int m
1cfdc 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e inLocal; /* Min
1cfdd 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 imum amount of p
1cfde 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 ayload held loca
1cfdf 6c 6c 79 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 lly */.. int
1cfe0 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 maxLocal; /* Ma
1cfe1 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 ximum amount of
1cfe2 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 payload held loc
1cfe3 61 6c 6c 79 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 ally */.. int
1cfe4 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f surplus; /* O
1cfe5 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 verflow payload
1cfe6 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f available for lo
1cfe7 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0d 0a cal storage */..
1cfe8 0d 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d .. minLocal =
1cfe9 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c pPage->minLocal
1cfea 3b 0d 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 ;.. maxLocal
1cfeb 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 = pPage->maxLoca
1cfec 6c 3b 0d 0a 20 20 20 20 73 75 72 70 6c 75 73 20 l;.. surplus
1cfed 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 = minLocal + (nP
1cfee 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 ayload - minLoca
1cfef 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e l)%(pPage->pBt->
1cff0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b usableSize - 4);
1cff1 0d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 .. testcase(
1cff2 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 surplus==maxLoca
1cff3 6c 20 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 l );.. testca
1cff4 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 se( surplus==max
1cff5 4c 6f 63 61 6c 2b 31 20 29 3b 0d 0a 20 20 20 20 Local+1 );..
1cff6 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d if( surplus <= m
1cff7 61 78 4c 6f 63 61 6c 20 29 7b 0d 0a 20 20 20 20 axLocal ){..
1cff8 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 pInfo->nLocal
1cff9 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0d = (u16)surplus;.
1cffa 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 . }else{..
1cffb 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c pInfo->nLocal
1cffc 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c = (u16)minLocal
1cffd 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 49 ;.. }.. pI
1cffe 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d nfo->iOverflow =
1cfff 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c (u16)(pInfo->nL
1d000 6f 63 61 6c 20 2b 20 6e 29 3b 0d 0a 20 20 20 20 ocal + n);..
1d001 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 pInfo->nSize = p
1d002 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 Info->iOverflow
1d003 2b 20 34 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 64 + 4;.. }..}..#d
1d004 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 efine parseCell(
1d005 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 pPage, iCell, pI
1d006 6e 66 6f 29 20 5c 0d 0a 20 20 62 74 72 65 65 50 nfo) \.. btreeP
1d007 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 arseCellPtr((pPa
1d008 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 ge), findCell((p
1d009 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c Page), (iCell)),
1d00a 20 28 70 49 6e 66 6f 29 29 0d 0a 73 74 61 74 69 (pInfo))..stati
1d00b 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 c void btreePars
1d00c 65 43 65 6c 6c 28 0d 0a 20 20 4d 65 6d 50 61 67 eCell(.. MemPag
1d00d 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 e *pPage,
1d00e 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 /* Page contai
1d00f 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f ning the cell */
1d010 0d 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 .. int iCell,
1d011 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1d012 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 he cell index.
1d013 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 First cell is 0
1d014 2a 2f 0d 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a */.. CellInfo *
1d015 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a pInfo /*
1d016 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 Fill in this st
1d017 72 75 63 74 75 72 65 20 2a 2f 0d 0a 29 7b 0d 0a ructure */..){..
1d018 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 parseCell(pPag
1d019 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 e, iCell, pInfo)
1d01a 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
1d01b 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c ompute the total
1d01c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
1d01d 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 that a Cell nee
1d01e 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0d 0a ds in the cell..
1d01f 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 ** data area of
1d020 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 the btree-page.
1d021 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 The return numb
1d022 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 er includes the
1d023 63 65 6c 6c 0d 0a 2a 2a 20 64 61 74 61 20 68 65 cell..** data he
1d024 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 ader and the loc
1d025 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 al payload, but
1d026 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 not any overflow
1d027 20 70 61 67 65 20 6f 72 0d 0a 2a 2a 20 74 68 65 page or..** the
1d028 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 space used by t
1d029 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e he cell pointer.
1d02a 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 75 31 36 ..*/..static u16
1d02b 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d cellSizePtr(Mem
1d02c 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 Page *pPage, u8
1d02d 2a 70 43 65 6c 6c 29 7b 0d 0a 20 20 75 38 20 2a *pCell){.. u8 *
1d02e 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 pIter = &pCell[p
1d02f 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 Page->childPtrSi
1d030 7a 65 5d 3b 0d 0a 20 20 75 33 32 20 6e 53 69 7a ze];.. u32 nSiz
1d031 65 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c e;....#ifdef SQL
1d032 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 2f 2a 20 ITE_DEBUG.. /*
1d033 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e The value return
1d034 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 ed by this funct
1d035 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 ion should alway
1d036 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 s be the same as
1d037 0d 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c .. ** the (Cell
1d038 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 Info.nSize) valu
1d039 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 e found by doing
1d03a 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 a full parse of
1d03b 20 74 68 65 0d 0a 20 20 2a 2a 20 63 65 6c 6c 2e the.. ** cell.
1d03c 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 If SQLITE_DEBUG
1d03d 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 is defined, an
1d03e 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 assert() at the
1d03f 62 6f 74 74 6f 6d 20 6f 66 0d 0a 20 20 2a 2a 20 bottom of.. **
1d040 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 this function ve
1d041 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 rifies that this
1d042 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f invariant is no
1d043 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0d 0a t violated. */..
1d044 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 CellInfo debug
1d045 69 6e 66 6f 3b 0d 0a 20 20 62 74 72 65 65 50 61 info;.. btreePa
1d046 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 rseCellPtr(pPage
1d047 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 , pCell, &debugi
1d048 6e 66 6f 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d nfo);..#endif...
1d049 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e . if( pPage->in
1d04a 74 4b 65 79 20 29 7b 0d 0a 20 20 20 20 75 38 20 tKey ){.. u8
1d04b 2a 70 45 6e 64 3b 0d 0a 20 20 20 20 69 66 28 20 *pEnd;.. if(
1d04c 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 pPage->hasData )
1d04d 7b 0d 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b {.. pIter +
1d04e 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 = getVarint32(pI
1d04f 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0d 0a 20 20 ter, nSize);..
1d050 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
1d051 6e 53 69 7a 65 20 3d 20 30 3b 0d 0a 20 20 20 20 nSize = 0;..
1d052 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 70 49 74 65 }.... /* pIte
1d053 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 r now points at
1d054 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 the 64-bit integ
1d055 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 er key value, a
1d056 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 variable length
1d057 0d 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 .. ** integer
1d058 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 . The following
1d059 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 block moves pIte
1d05a 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 r to point at th
1d05b 65 20 66 69 72 73 74 20 62 79 74 65 0d 0a 20 20 e first byte..
1d05c 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e ** past the en
1d05d 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c d of the key val
1d05e 75 65 2e 20 2a 2f 0d 0a 20 20 20 20 70 45 6e 64 ue. */.. pEnd
1d05f 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0d 0a 20 = &pIter[9];..
1d060 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 while( (*pIte
1d061 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 r++)&0x80 && pIt
1d062 65 72 3c 70 45 6e 64 20 29 3b 0d 0a 20 20 7d 65 er<pEnd );.. }e
1d063 6c 73 65 7b 0d 0a 20 20 20 20 70 49 74 65 72 20 lse{.. pIter
1d064 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 += getVarint32(p
1d065 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0d 0a 20 Iter, nSize);..
1d066 20 7d 0d 0a 0d 0a 20 20 74 65 73 74 63 61 73 65 }.... testcase
1d067 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e ( nSize==pPage->
1d068 6d 61 78 4c 6f 63 61 6c 20 29 3b 0d 0a 20 20 74 maxLocal );.. t
1d069 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d estcase( nSize==
1d06a 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b pPage->maxLocal+
1d06b 31 20 29 3b 0d 0a 20 20 69 66 28 20 6e 53 69 7a 1 );.. if( nSiz
1d06c 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 e>pPage->maxLoca
1d06d 6c 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6d 69 l ){.. int mi
1d06e 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e nLocal = pPage->
1d06f 6d 69 6e 4c 6f 63 61 6c 3b 0d 0a 20 20 20 20 6e minLocal;.. n
1d070 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 Size = minLocal
1d071 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f + (nSize - minLo
1d072 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 cal) % (pPage->p
1d073 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d Bt->usableSize -
1d074 20 34 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 4);.. testca
1d075 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 se( nSize==pPage
1d076 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0d 0a 20 ->maxLocal );..
1d077 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 testcase( nSi
1d078 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f ze==pPage->maxLo
1d079 63 61 6c 2b 31 20 29 3b 0d 0a 20 20 20 20 69 66 cal+1 );.. if
1d07a 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d ( nSize>pPage->m
1d07b 61 78 4c 6f 63 61 6c 20 29 7b 0d 0a 20 20 20 20 axLocal ){..
1d07c 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 nSize = minLoc
1d07d 61 6c 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 al;.. }..
1d07e 6e 53 69 7a 65 20 2b 3d 20 34 3b 0d 0a 20 20 7d nSize += 4;.. }
1d07f 0d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 .. nSize += (u3
1d080 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 2)(pIter - pCell
1d081 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 6d );.... /* The m
1d082 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 inimum size of a
1d083 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 ny cell is 4 byt
1d084 65 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 6e 53 es. */.. if( nS
1d085 69 7a 65 3c 34 20 29 7b 0d 0a 20 20 20 20 6e 53 ize<4 ){.. nS
1d086 69 7a 65 20 3d 20 34 3b 0d 0a 20 20 7d 0d 0a 0d ize = 4;.. }...
1d087 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 . assert( nSize
1d088 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a ==debuginfo.nSiz
1d089 65 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 28 e );.. return (
1d08a 75 31 36 29 6e 53 69 7a 65 3b 0d 0a 7d 0d 0a 0d u16)nSize;..}...
1d08b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
1d08c 45 42 55 47 0d 0a 2f 2a 20 54 68 69 73 20 76 61 EBUG../* This va
1d08d 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 riation on cellS
1d08e 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 izePtr() is used
1d08f 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 inside of asser
1d090 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0d 0a t() statements..
1d091 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0d 0a 73 74 61 ** only. */..sta
1d092 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 tic u16 cellSize
1d093 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c (MemPage *pPage,
1d094 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0d 0a 20 20 int iCell){..
1d095 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 return cellSizeP
1d096 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 tr(pPage, findCe
1d097 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 ll(pPage, iCell)
1d098 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d );..}..#endif...
1d099 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
1d09a 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d OMIT_AUTOVACUUM.
1d09b 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 63 ./*..** If the c
1d09c 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 ell pCell, part
1d09d 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f of page pPage co
1d09e 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 ntains a pointer
1d09f 0d 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 ..** to an overf
1d0a0 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 low page, insert
1d0a1 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 an entry into t
1d0a2 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0d 0a he pointer-map..
1d0a3 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 ** for the overf
1d0a4 6c 6f 77 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 low page...*/..s
1d0a5 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 tatic void ptrma
1d0a6 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 pPutOvflPtr(MemP
1d0a7 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a age *pPage, u8 *
1d0a8 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 pCell, int *pRC)
1d0a9 7b 0d 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e {.. CellInfo in
1d0aa 66 6f 3b 0d 0a 20 20 69 66 28 20 2a 70 52 43 20 fo;.. if( *pRC
1d0ab 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 61 73 73 ) return;.. ass
1d0ac 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b ert( pCell!=0 );
1d0ad 0d 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 .. btreeParseCe
1d0ae 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 llPtr(pPage, pCe
1d0af 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0d 0a 20 20 61 ll, &info);.. a
1d0b0 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 ssert( (info.nDa
1d0b1 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 ta+(pPage->intKe
1d0b2 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d y?0:info.nKey))=
1d0b3 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 =info.nPayload )
1d0b4 3b 0d 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f ;.. if( info.iO
1d0b5 76 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 20 verflow ){..
1d0b6 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 Pgno ovfl = get4
1d0b7 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f byte(&pCell[info
1d0b8 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0d 0a 20 .iOverflow]);..
1d0b9 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 ptrmapPut(pPa
1d0ba 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 ge->pBt, ovfl, P
1d0bb 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c TRMAP_OVERFLOW1,
1d0bc 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 pPage->pgno, pR
1d0bd 43 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e C);.. }..}..#en
1d0be 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 dif....../*..**
1d0bf 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 Defragment the p
1d0c0 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 age given. All
1d0c1 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 Cells are moved
1d0c2 74 6f 20 74 68 65 0d 0a 2a 2a 20 65 6e 64 20 6f to the..** end o
1d0c3 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 f the page and a
1d0c4 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 ll free space is
1d0c5 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 collected into
1d0c6 6f 6e 65 0d 0a 2a 2a 20 62 69 67 20 46 72 65 65 one..** big Free
1d0c7 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 Blk that occurs
1d0c8 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 in between the h
1d0c9 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0d 0a eader and cell..
1d0ca 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 ** pointer array
1d0cb 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f and the cell co
1d0cc 6e 74 65 6e 74 20 61 72 65 61 2e 0d 0a 2a 2f 0d ntent area...*/.
1d0cd 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 .static int defr
1d0ce 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 agmentPage(MemPa
1d0cf 67 65 20 2a 70 50 61 67 65 29 7b 0d 0a 20 20 69 ge *pPage){.. i
1d0d0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
1d0d1 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f /* Loo
1d0d2 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 p counter */..
1d0d3 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 int pc;
1d0d4 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 /* Ad
1d0d5 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 dress of a i-th
1d0d6 63 65 6c 6c 20 2a 2f 0d 0a 20 20 69 6e 74 20 68 cell */.. int h
1d0d7 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dr;
1d0d8 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 /* Offset
1d0d9 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 to the page head
1d0da 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 69 7a er */.. int siz
1d0db 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
1d0dc 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 /* Size of a
1d0dd 20 63 65 6c 6c 20 2a 2f 0d 0a 20 20 69 6e 74 20 cell */.. int
1d0de 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 usableSize;
1d0df 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
1d0e0 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 of usable bytes
1d0e1 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0d 0a 20 on a page */..
1d0e2 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b int cellOffset;
1d0e3 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
1d0e4 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c ffset to the cel
1d0e5 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 l pointer array
1d0e6 2a 2f 0d 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 */.. int cbrk;
1d0e7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d0e8 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 /* Offset to th
1d0e9 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 e cell content a
1d0ea 72 65 61 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 rea */.. int nC
1d0eb 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 ell;
1d0ec 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1d0ed 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 f cells on the p
1d0ee 61 67 65 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e age */.. unsign
1d0ef 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 ed char *data;
1d0f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 /* The page
1d0f1 20 64 61 74 61 20 2a 2f 0d 0a 20 20 75 6e 73 69 data */.. unsi
1d0f2 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b gned char *temp;
1d0f3 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 /* Temp a
1d0f4 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e rea for cell con
1d0f5 74 65 6e 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 tent */.. int i
1d0f6 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 CellFirst;
1d0f7 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 /* First a
1d0f8 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e llowable cell in
1d0f9 64 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 dex */.. int iC
1d0fa 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 ellLast;
1d0fb 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 /* Last pos
1d0fc 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 sible cell index
1d0fd 20 2a 2f 0d 0a 0d 0a 0d 0a 20 20 61 73 73 65 72 */...... asser
1d0fe 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 t( sqlite3PagerI
1d0ff 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 swriteable(pPage
1d100 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 ->pDbPage) );..
1d101 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e assert( pPage->
1d102 70 42 74 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 pBt!=0 );.. ass
1d103 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d ert( pPage->pBt-
1d104 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 >usableSize <= S
1d105 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 QLITE_MAX_PAGE_S
1d106 49 5a 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 IZE );.. assert
1d107 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c ( pPage->nOverfl
1d108 6f 77 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 ow==0 );.. asse
1d109 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
1d10a 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 x_held(pPage->pB
1d10b 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 t->mutex) );..
1d10c 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 temp = sqlite3Pa
1d10d 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 gerTempSpace(pPa
1d10e 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 ge->pBt->pPager)
1d10f 3b 0d 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 ;.. data = pPag
1d110 65 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 68 64 72 e->aData;.. hdr
1d111 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 = pPage->hdrOff
1d112 73 65 74 3b 0d 0a 20 20 63 65 6c 6c 4f 66 66 73 set;.. cellOffs
1d113 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c et = pPage->cell
1d114 4f 66 66 73 65 74 3b 0d 0a 20 20 6e 43 65 6c 6c Offset;.. nCell
1d115 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b = pPage->nCell;
1d116 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c .. assert( nCel
1d117 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 l==get2byte(&dat
1d118 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0d 0a 20 20 a[hdr+3]) );..
1d119 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 usableSize = pPa
1d11a 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 ge->pBt->usableS
1d11b 69 7a 65 3b 0d 0a 20 20 63 62 72 6b 20 3d 20 67 ize;.. cbrk = g
1d11c 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 et2byte(&data[hd
1d11d 72 2b 35 5d 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 r+5]);.. memcpy
1d11e 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 (&temp[cbrk], &d
1d11f 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c ata[cbrk], usabl
1d120 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0d 0a eSize - cbrk);..
1d121 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 cbrk = usableS
1d122 69 7a 65 3b 0d 0a 20 20 69 43 65 6c 6c 46 69 72 ize;.. iCellFir
1d123 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 st = cellOffset
1d124 2b 20 32 2a 6e 43 65 6c 6c 3b 0d 0a 20 20 69 43 + 2*nCell;.. iC
1d125 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 ellLast = usable
1d126 53 69 7a 65 20 2d 20 34 3b 0d 0a 20 20 66 6f 72 Size - 4;.. for
1d127 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 (i=0; i<nCell; i
1d128 2b 2b 29 7b 0d 0a 20 20 20 20 75 38 20 2a 70 41 ++){.. u8 *pA
1d129 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 ddr; /* The
1d12a 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 i-th cell pointe
1d12b 72 20 2a 2f 0d 0a 20 20 20 20 70 41 64 64 72 20 r */.. pAddr
1d12c 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 = &data[cellOffs
1d12d 65 74 20 2b 20 69 2a 32 5d 3b 0d 0a 20 20 20 20 et + i*2];..
1d12e 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 pc = get2byte(pA
1d12f 64 64 72 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 ddr);.. testc
1d130 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 ase( pc==iCellFi
1d131 72 73 74 20 29 3b 0d 0a 20 20 20 20 74 65 73 74 rst );.. test
1d132 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c case( pc==iCellL
1d133 61 73 74 20 29 3b 0d 0a 23 69 66 20 21 64 65 66 ast );..#if !def
1d134 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 ined(SQLITE_ENAB
1d135 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c LE_OVERSIZE_CELL
1d136 5f 43 48 45 43 4b 29 0d 0a 20 20 20 20 2f 2a 20 _CHECK).. /*
1d137 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 These conditions
1d138 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 have already be
1d139 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 en verified in b
1d13a 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0d 0a treeInitPage()..
1d13b 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 ** if SQLITE
1d13c 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 _ENABLE_OVERSIZE
1d13d 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 _CELL_CHECK is d
1d13e 65 66 69 6e 65 64 20 0d 0a 20 20 20 20 2a 2f 0d efined .. */.
1d13f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c . if( pc<iCel
1d140 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 lFirst || pc>iCe
1d141 6c 6c 4c 61 73 74 20 29 7b 0d 0a 20 20 20 20 20 llLast ){..
1d142 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1d143 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1d144 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 }..#endif..
1d145 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 assert( pc>=iCe
1d146 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 llFirst && pc<=i
1d147 43 65 6c 6c 4c 61 73 74 20 29 3b 0d 0a 20 20 20 CellLast );..
1d148 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 size = cellSize
1d149 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 Ptr(pPage, &temp
1d14a 5b 70 63 5d 29 3b 0d 0a 20 20 20 20 63 62 72 6b [pc]);.. cbrk
1d14b 20 2d 3d 20 73 69 7a 65 3b 0d 0a 23 69 66 20 64 -= size;..#if d
1d14c 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
1d14d 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 ABLE_OVERSIZE_CE
1d14e 4c 4c 5f 43 48 45 43 4b 29 0d 0a 20 20 20 20 69 LL_CHECK).. i
1d14f 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 f( cbrk<iCellFir
1d150 73 74 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 st ){.. ret
1d151 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 urn SQLITE_CORRU
1d152 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d PT_BKPT;.. }.
1d153 0a 23 65 6c 73 65 0d 0a 20 20 20 20 69 66 28 20 .#else.. if(
1d154 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 cbrk<iCellFirst
1d155 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c || pc+size>usabl
1d156 65 53 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 eSize ){..
1d157 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
1d158 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 RRUPT_BKPT;..
1d159 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 }..#endif..
1d15a 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a assert( cbrk+siz
1d15b 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 e<=usableSize &&
1d15c 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 cbrk>=iCellFirs
1d15d 74 20 29 3b 0d 0a 20 20 20 20 74 65 73 74 63 61 t );.. testca
1d15e 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 se( cbrk+size==u
1d15f 73 61 62 6c 65 53 69 7a 65 20 29 3b 0d 0a 20 20 sableSize );..
1d160 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 testcase( pc+s
1d161 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 ize==usableSize
1d162 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 );.. memcpy(&
1d163 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d data[cbrk], &tem
1d164 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0d 0a 20 p[pc], size);..
1d165 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 put2byte(pAdd
1d166 72 2c 20 63 62 72 6b 29 3b 0d 0a 20 20 7d 0d 0a r, cbrk);.. }..
1d167 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d assert( cbrk>=
1d168 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0d 0a 20 iCellFirst );..
1d169 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b put2byte(&data[
1d16a 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0d 0a hdr+5], cbrk);..
1d16b 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 data[hdr+1] =
1d16c 30 3b 0d 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 0;.. data[hdr+2
1d16d 5d 20 3d 20 30 3b 0d 0a 20 20 64 61 74 61 5b 68 ] = 0;.. data[h
1d16e 64 72 2b 37 5d 20 3d 20 30 3b 0d 0a 20 20 6d 65 dr+7] = 0;.. me
1d16f 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c mset(&data[iCell
1d170 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d First], 0, cbrk-
1d171 69 43 65 6c 6c 46 69 72 73 74 29 3b 0d 0a 20 20 iCellFirst);..
1d172 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 assert( sqlite3P
1d173 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 agerIswriteable(
1d174 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 pPage->pDbPage)
1d175 29 3b 0d 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 );.. if( cbrk-i
1d176 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 CellFirst!=pPage
1d177 2d 3e 6e 46 72 65 65 20 29 7b 0d 0a 20 20 20 20 ->nFree ){..
1d178 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
1d179 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 7d RRUPT_BKPT;.. }
1d17a 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
1d17b 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
1d17c 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 ** Allocate nByt
1d17d 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 e bytes of space
1d17e 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 from within the
1d17f 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 B-Tree page pas
1d180 73 65 64 0d 0a 2a 2a 20 61 73 20 74 68 65 20 66 sed..** as the f
1d181 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 irst argument. W
1d182 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 rite into *pIdx
1d183 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 the index into p
1d184 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0d 0a 2a Page->aData[]..*
1d185 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 * of the first b
1d186 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 yte of allocated
1d187 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 space. Return e
1d188 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 ither SQLITE_OK
1d189 6f 72 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 or..** an error
1d18a 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 code (usually SQ
1d18b 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0d 0a LITE_CORRUPT)...
1d18c 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 **..** The calle
1d18d 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 r guarantees tha
1d18e 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 t there is suffi
1d18f 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d cient space to m
1d190 61 6b 65 20 74 68 65 0d 0a 2a 2a 20 61 6c 6c 6f ake the..** allo
1d191 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f cation. This ro
1d192 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 utine might need
1d193 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 to defragment i
1d194 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 n order to bring
1d195 0d 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 ..** all the spa
1d196 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 ce together, how
1d197 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 ever. This rout
1d198 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 ine will avoid u
1d199 73 69 6e 67 0d 0a 2a 2a 20 74 68 65 20 66 69 72 sing..** the fir
1d19a 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 st two bytes pas
1d19b 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 t the cell point
1d19c 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 er area since pr
1d19d 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0d 0a 2a esumably this..*
1d19e 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 * allocation is
1d19f 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 being made in or
1d1a0 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 der to insert a
1d1a1 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 new cell, so we
1d1a2 77 69 6c 6c 0d 0a 2a 2a 20 61 6c 73 6f 20 65 6e will..** also en
1d1a3 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e d up needing a n
1d1a4 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e ew cell pointer.
1d1a5 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1d1a6 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d allocateSpace(M
1d1a7 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 emPage *pPage, i
1d1a8 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 nt nByte, int *p
1d1a9 49 64 78 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 69 Idx){.. const i
1d1aa 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e nt hdr = pPage->
1d1ab 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a hdrOffset; /*
1d1ac 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 Local cache of
1d1ad 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 pPage->hdrOffset
1d1ae 20 2a 2f 0d 0a 20 20 75 38 20 2a 20 63 6f 6e 73 */.. u8 * cons
1d1af 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e t data = pPage->
1d1b0 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c aData; /* L
1d1b1 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 ocal cache of pP
1d1b2 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0d 0a 20 age->aData */..
1d1b3 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 int nFrag;
1d1b4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d1b5 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
1d1b6 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 of fragmented by
1d1b7 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0d tes on pPage */.
1d1b8 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 . int top;
1d1b9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d1ba 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 /* First
1d1bb 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f byte of cell co
1d1bc 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0d 0a 20 ntent area */..
1d1bd 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 int gap;
1d1be 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f /* First byte o
1d1bf 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 f gap between ce
1d1c0 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 ll pointers and
1d1c1 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0d cell content */.
1d1c2 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
1d1c3 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 /* Integer re
1d1c4 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 turn code */..
1d1c5 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 int usableSize;
1d1c6 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f /* Usable size o
1d1c7 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0d 0a 20 f the page */..
1d1c8 20 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c .. assert( sql
1d1c9 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 ite3PagerIswrite
1d1ca 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 able(pPage->pDbP
1d1cb 61 67 65 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 age) );.. asser
1d1cc 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b t( pPage->pBt );
1d1cd 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1d1ce 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1d1cf 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 Page->pBt->mutex
1d1d0 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1d1d1 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 nByte>=0 ); /*
1d1d2 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a Minimum cell siz
1d1d3 65 20 69 73 20 34 20 2a 2f 0d 0a 20 20 61 73 73 e is 4 */.. ass
1d1d4 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 ert( pPage->nFre
1d1d5 65 3e 3d 6e 42 79 74 65 20 29 3b 0d 0a 20 20 61 e>=nByte );.. a
1d1d6 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f ssert( pPage->nO
1d1d7 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0d 0a 20 verflow==0 );..
1d1d8 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 usableSize = pP
1d1d9 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 age->pBt->usable
1d1da 53 69 7a 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 Size;.. assert(
1d1db 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 nByte < usableS
1d1dc 69 7a 65 2d 38 20 29 3b 0d 0a 0d 0a 20 20 6e 46 ize-8 );.... nF
1d1dd 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 rag = data[hdr+7
1d1de 5d 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 ];.. assert( pP
1d1df 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 age->cellOffset
1d1e0 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a == hdr + 12 - 4*
1d1e1 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0d 0a pPage->leaf );..
1d1e2 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 gap = pPage->c
1d1e3 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 ellOffset + 2*pP
1d1e4 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 20 20 74 age->nCell;.. t
1d1e5 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 op = get2byteNot
1d1e6 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 Zero(&data[hdr+5
1d1e7 5d 29 3b 0d 0a 20 20 69 66 28 20 67 61 70 3e 74 ]);.. if( gap>t
1d1e8 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 op ) return SQLI
1d1e9 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1d1ea 0d 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 .. testcase( ga
1d1eb 70 2b 32 3d 3d 74 6f 70 20 29 3b 0d 0a 20 20 74 p+2==top );.. t
1d1ec 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d estcase( gap+1==
1d1ed 74 6f 70 20 29 3b 0d 0a 20 20 74 65 73 74 63 61 top );.. testca
1d1ee 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0d se( gap==top );.
1d1ef 0a 0d 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d ... if( nFrag>=
1d1f0 36 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 41 6c 60 ){.. /* Al
1d1f1 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20 ways defragment
1d1f2 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65 highly fragmente
1d1f3 64 20 70 61 67 65 73 20 2a 2f 0d 0a 20 20 20 20 d pages */..
1d1f4 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 rc = defragmentP
1d1f5 61 67 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 age(pPage);..
1d1f6 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e if( rc ) return
1d1f7 20 72 63 3b 0d 0a 20 20 20 20 74 6f 70 20 3d 20 rc;.. top =
1d1f8 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 get2byteNotZero(
1d1f9 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0d 0a &data[hdr+5]);..
1d1fa 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b }else if( gap+
1d1fb 32 3c 3d 74 6f 70 20 29 7b 0d 0a 20 20 20 20 2f 2<=top ){.. /
1d1fc 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 * Search the fre
1d1fd 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f elist looking fo
1d1fe 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 r a free slot bi
1d1ff 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 g enough to sati
1d200 73 66 79 20 0d 0a 20 20 20 20 2a 2a 20 74 68 65 sfy .. ** the
1d201 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c request. The al
1d202 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 location is made
1d203 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 from the first
1d204 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0d 0a 20 free slot in ..
1d205 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 ** the list t
1d206 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f hat is large eno
1d207 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 ugh to accomadat
1d208 65 20 69 74 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 e it... */..
1d209 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b int pc, addr;
1d20a 0d 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 .. for(addr=h
1d20b 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 dr+1; (pc = get2
1d20c 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d byte(&data[addr]
1d20d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0d ))>0; addr=pc){.
1d20e 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b . int size;
1d20f 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1d210 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 ize of the free
1d211 73 6c 6f 74 20 2a 2f 0d 0a 20 20 20 20 20 20 69 slot */.. i
1d212 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 f( pc>usableSize
1d213 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 -4 || pc<addr+4
1d214 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 ){.. retu
1d215 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1d216 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 7d T_BKPT;.. }
1d217 0d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 .. size = g
1d218 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 et2byte(&data[pc
1d219 2b 32 5d 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 +2]);.. if(
1d21a 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0d size>=nByte ){.
1d21b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d . int x =
1d21c 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0d 0a size - nByte;..
1d21d 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1d21e 28 20 78 3d 3d 34 20 29 3b 0d 0a 20 20 20 20 20 ( x==4 );..
1d21f 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d testcase( x==
1d220 33 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 3 );.. if
1d221 28 20 78 3c 34 20 29 7b 0d 0a 20 20 20 20 20 20 ( x<4 ){..
1d222 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 /* Remove th
1d223 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 e slot from the
1d224 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 free-list. Updat
1d225 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d e the number of.
1d226 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 . ** fr
1d227 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 agmented bytes w
1d228 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 ithin the page.
1d229 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 */.. me
1d22a 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d mcpy(&data[addr]
1d22b 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b , &data[pc], 2);
1d22c 0d 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 .. data
1d22d 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e [hdr+7] = (u8)(n
1d22e 46 72 61 67 20 2b 20 78 29 3b 0d 0a 20 20 20 20 Frag + x);..
1d22f 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 }else if( si
1d230 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 ze+pc > usableSi
1d231 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 ze ){..
1d232 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1d233 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1d234 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
1d235 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 /* The s
1d236 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 lot remains on t
1d237 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 he free-list. Re
1d238 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f duce its size to
1d239 20 61 63 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20 account..
1d23a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 ** for the p
1d23b 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 ortion used by t
1d23c 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f he new allocatio
1d23d 6e 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 n. */..
1d23e 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b put2byte(&data[
1d23f 70 63 2b 32 5d 2c 20 78 29 3b 0d 0a 20 20 20 20 pc+2], x);..
1d240 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 2a }.. *
1d241 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0d 0a pIdx = pc + x;..
1d242 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
1d243 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 QLITE_OK;..
1d244 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a }.. }.. }..
1d245 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 .. /* Check to
1d246 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 make sure there
1d247 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 is enough space
1d248 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61 in the gap to sa
1d249 74 69 73 66 79 0d 0a 20 20 2a 2a 20 74 68 65 20 tisfy.. ** the
1d24a 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 allocation. If
1d24b 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e not, defragment.
1d24c 0d 0a 20 20 2a 2f 0d 0a 20 20 74 65 73 74 63 61 .. */.. testca
1d24d 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d se( gap+2+nByte=
1d24e 3d 74 6f 70 20 29 3b 0d 0a 20 20 69 66 28 20 67 =top );.. if( g
1d24f 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 ap+2+nByte>top )
1d250 7b 0d 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 {.. rc = defr
1d251 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 agmentPage(pPage
1d252 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 );.. if( rc )
1d253 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1d254 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e top = get2byteN
1d255 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 otZero(&data[hdr
1d256 2b 35 5d 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 +5]);.. asser
1d257 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f t( gap+nByte<=to
1d258 70 20 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 0d 0a 20 p );.. }......
1d259 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d /* Allocate mem
1d25a 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 ory from the gap
1d25b 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 in between the
1d25c 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 cell pointer arr
1d25d 61 79 0d 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 ay.. ** and the
1d25e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 cell content ar
1d25f 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e ea. The btreeIn
1d260 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 itPage() call ha
1d261 73 20 61 6c 72 65 61 64 79 0d 0a 20 20 2a 2a 20 s already.. **
1d262 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 validated the fr
1d263 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 eelist. Given t
1d264 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 hat the freelist
1d265 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 is valid, there
1d266 0d 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 .. ** is no way
1d267 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 that the alloca
1d268 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 tion can extend
1d269 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 off the end of t
1d26a 68 65 20 70 61 67 65 2e 0d 0a 20 20 2a 2a 20 54 he page... ** T
1d26b 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f he assert() belo
1d26c 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 w verifies the p
1d26d 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 revious sentence
1d26e 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 74 6f 70 20 2d ... */.. top -
1d26f 3d 20 6e 42 79 74 65 3b 0d 0a 20 20 70 75 74 32 = nByte;.. put2
1d270 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 byte(&data[hdr+5
1d271 5d 2c 20 74 6f 70 29 3b 0d 0a 20 20 61 73 73 65 ], top);.. asse
1d272 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d rt( top+nByte <=
1d273 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 (int)pPage->pBt
1d274 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0d ->usableSize );.
1d275 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0d . *pIdx = top;.
1d276 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
1d277 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a _OK;..}..../*..*
1d278 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 * Return a secti
1d279 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d on of the pPage-
1d27a 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 >aData to the fr
1d27b 65 65 6c 69 73 74 2e 0d 0a 2a 2a 20 54 68 65 20 eelist...** The
1d27c 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 first byte of th
1d27d 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b e new free block
1d27e 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b is pPage->aDisk
1d27f 5b 73 74 61 72 74 5d 0d 0a 2a 2a 20 61 6e 64 20 [start]..** and
1d280 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 the size of the
1d281 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 block is "size"
1d282 62 79 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4d bytes...**..** M
1d283 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 ost of the effor
1d284 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 t here is involv
1d285 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 ed in coalesing
1d286 61 64 6a 61 63 65 6e 74 0d 0a 2a 2a 20 66 72 65 adjacent..** fre
1d287 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 e blocks into a
1d288 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 single big free
1d289 62 6c 6f 63 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 block...*/..stat
1d28a 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 ic int freeSpace
1d28b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c (MemPage *pPage,
1d28c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 int start, int
1d28d 73 69 7a 65 29 7b 0d 0a 20 20 69 6e 74 20 61 64 size){.. int ad
1d28e 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b dr, pbegin, hdr;
1d28f 0d 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 .. int iLast;
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d291 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 /* Largest
1d292 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c possible freebl
1d293 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 20 ock offset */..
1d294 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1d295 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 data = pPage->aD
1d296 61 74 61 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 ata;.... assert
1d297 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 ( pPage->pBt!=0
1d298 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 );.. assert( sq
1d299 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 lite3PagerIswrit
1d29a 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 eable(pPage->pDb
1d29b 50 61 67 65 29 20 29 3b 0d 0a 20 20 61 73 73 65 Page) );.. asse
1d29c 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 rt( start>=pPage
1d29d 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 ->hdrOffset+6+pP
1d29e 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a age->childPtrSiz
1d29f 65 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 e );.. assert(
1d2a0 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 20 3c (start + size) <
1d2a1 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 = (int)pPage->pB
1d2a2 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b t->usableSize );
1d2a3 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1d2a4 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1d2a5 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 Page->pBt->mutex
1d2a6 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1d2a7 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 size>=0 ); /*
1d2a8 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a Minimum cell siz
1d2a9 65 20 69 73 20 34 20 2a 2f 0d 0a 0d 0a 20 20 69 e is 4 */.... i
1d2aa 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 f( pPage->pBt->b
1d2ab 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 tsFlags & BTS_SE
1d2ac 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0d 0a CURE_DELETE ){..
1d2ad 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 /* Overwrite
1d2ae 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 deleted informa
1d2af 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 tion with zeros
1d2b0 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f when the secure_
1d2b1 64 65 6c 65 74 65 0d 0a 20 20 20 20 2a 2a 20 6f delete.. ** o
1d2b2 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 ption is enabled
1d2b3 20 2a 2f 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 */.. memset(
1d2b4 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c &data[start], 0,
1d2b5 20 73 69 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a size);.. }....
1d2b6 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 /* Add the spa
1d2b7 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 ce back into the
1d2b8 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 linked list of
1d2b9 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 freeblocks. Not
1d2ba 65 20 74 68 61 74 0d 0a 20 20 2a 2a 20 65 76 65 e that.. ** eve
1d2bb 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 n though the fre
1d2bc 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 eblock list was
1d2bd 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 checked by btree
1d2be 49 6e 69 74 50 61 67 65 28 29 2c 0d 0a 20 20 2a InitPage(),.. *
1d2bf 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 * btreeInitPage(
1d2c0 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 ) did not detect
1d2c1 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c overlapping cel
1d2c2 6c 73 20 6f 72 0d 0a 20 20 2a 2a 20 66 72 65 65 ls or.. ** free
1d2c3 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 blocks that over
1d2c4 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 lapped cells.
1d2c5 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 Nor does it dete
1d2c6 63 74 20 77 68 65 6e 20 74 68 65 0d 0a 20 20 2a ct when the.. *
1d2c7 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 * cell content a
1d2c8 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20 rea exceeds the
1d2c9 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67 value in the pag
1d2ca 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68 e header. If th
1d2cb 65 73 65 0d 0a 20 20 2a 2a 20 73 69 74 75 61 74 ese.. ** situat
1d2cc 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e ions arise, then
1d2cd 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 subsequent inse
1d2ce 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 rt operations mi
1d2cf 67 68 74 20 63 6f 72 72 75 70 74 0d 0a 20 20 2a ght corrupt.. *
1d2d0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 * the freelist.
1d2d1 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 So we do need t
1d2d2 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 o check for corr
1d2d3 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 uption while sca
1d2d4 6e 6e 69 6e 67 0d 0a 20 20 2a 2a 20 74 68 65 20 nning.. ** the
1d2d5 66 72 65 65 6c 69 73 74 2e 0d 0a 20 20 2a 2f 0d freelist... */.
1d2d6 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e . hdr = pPage->
1d2d7 68 64 72 4f 66 66 73 65 74 3b 0d 0a 20 20 61 64 hdrOffset;.. ad
1d2d8 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0d 0a 20 dr = hdr + 1;..
1d2d9 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e iLast = pPage->
1d2da 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 pBt->usableSize
1d2db 2d 20 34 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 - 4;.. assert(
1d2dc 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0d start<=iLast );.
1d2dd 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 . while( (pbegi
1d2de 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 n = get2byte(&da
1d2df 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 ta[addr]))<start
1d2e0 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0d && pbegin>0 ){.
1d2e1 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c . if( pbegin<
1d2e2 61 64 64 72 2b 34 20 29 7b 0d 0a 20 20 20 20 20 addr+4 ){..
1d2e3 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1d2e4 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1d2e5 20 20 7d 0d 0a 20 20 20 20 61 64 64 72 20 3d 20 }.. addr =
1d2e6 70 62 65 67 69 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 pbegin;.. }..
1d2e7 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 if( pbegin>iLast
1d2e8 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
1d2e9 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1d2ea 4b 50 54 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 KPT;.. }.. ass
1d2eb 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 ert( pbegin>addr
1d2ec 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b || pbegin==0 );
1d2ed 0d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 .. put2byte(&da
1d2ee 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 ta[addr], start)
1d2ef 3b 0d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 ;.. put2byte(&d
1d2f0 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 ata[start], pbeg
1d2f1 69 6e 29 3b 0d 0a 20 20 70 75 74 32 62 79 74 65 in);.. put2byte
1d2f2 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c (&data[start+2],
1d2f3 20 73 69 7a 65 29 3b 0d 0a 20 20 70 50 61 67 65 size);.. pPage
1d2f4 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d ->nFree = pPage-
1d2f5 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 >nFree + (u16)si
1d2f6 7a 65 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 6f 61 6c ze;.... /* Coal
1d2f7 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 esce adjacent fr
1d2f8 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0d 0a 20 20 ee blocks */..
1d2f9 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0d addr = hdr + 1;.
1d2fa 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 . while( (pbegi
1d2fb 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 n = get2byte(&da
1d2fc 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0d ta[addr]))>0 ){.
1d2fd 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 . int pnext,
1d2fe 70 73 69 7a 65 2c 20 78 3b 0d 0a 20 20 20 20 61 psize, x;.. a
1d2ff 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 ssert( pbegin>ad
1d300 64 72 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 dr );.. asser
1d301 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e t( pbegin <= (in
1d302 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 t)pPage->pBt->us
1d303 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0d 0a 20 ableSize-4 );..
1d304 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 pnext = get2b
1d305 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e yte(&data[pbegin
1d306 5d 29 3b 0d 0a 20 20 20 20 70 73 69 7a 65 20 3d ]);.. psize =
1d307 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b get2byte(&data[
1d308 70 62 65 67 69 6e 2b 32 5d 29 3b 0d 0a 20 20 20 pbegin+2]);..
1d309 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 if( pbegin + ps
1d30a 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 ize + 3 >= pnext
1d30b 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0d 0a && pnext>0 ){..
1d30c 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d int frag =
1d30d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e pnext - (pbegin
1d30e 2b 70 73 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20 +psize);..
1d30f 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 if( (frag<0) ||
1d310 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b (frag>(int)data[
1d311 68 64 72 2b 37 5d 29 20 29 7b 0d 0a 20 20 20 20 hdr+7]) ){..
1d312 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1d313 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d E_CORRUPT_BKPT;.
1d314 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1d315 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 data[hdr+7] -= (
1d316 75 38 29 66 72 61 67 3b 0d 0a 20 20 20 20 20 20 u8)frag;..
1d317 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 x = get2byte(&da
1d318 74 61 5b 70 6e 65 78 74 5d 29 3b 0d 0a 20 20 20 ta[pnext]);..
1d319 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 put2byte(&dat
1d31a 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0d 0a a[pbegin], x);..
1d31b 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20 x = pnext
1d31c 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 + get2byte(&data
1d31d 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 [pnext+2]) - pbe
1d31e 67 69 6e 3b 0d 0a 20 20 20 20 20 20 70 75 74 32 gin;.. put2
1d31f 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 byte(&data[pbegi
1d320 6e 2b 32 5d 2c 20 78 29 3b 0d 0a 20 20 20 20 7d n+2], x);.. }
1d321 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 64 64 else{.. add
1d322 72 20 3d 20 70 62 65 67 69 6e 3b 0d 0a 20 20 20 r = pbegin;..
1d323 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 }.. }.... /*
1d324 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 If the cell cont
1d325 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 ent area begins
1d326 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b with a freeblock
1d327 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0d , remove it. */.
1d328 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b . if( data[hdr+
1d329 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 1]==data[hdr+5]
1d32a 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d && data[hdr+2]==
1d32b 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0d 0a data[hdr+6] ){..
1d32c 20 20 20 20 69 6e 74 20 74 6f 70 3b 0d 0a 20 20 int top;..
1d32d 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 pbegin = get2b
1d32e 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d yte(&data[hdr+1]
1d32f 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 );.. memcpy(&
1d330 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 data[hdr+1], &da
1d331 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0d ta[pbegin], 2);.
1d332 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 . top = get2b
1d333 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d yte(&data[hdr+5]
1d334 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 ) + get2byte(&da
1d335 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0d 0a ta[pbegin+2]);..
1d336 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 put2byte(&da
1d337 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b ta[hdr+5], top);
1d338 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
1d339 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 sqlite3PagerIsw
1d33a 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e riteable(pPage->
1d33b 70 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 20 72 pDbPage) );.. r
1d33c 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1d33d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 ..}..../*..** De
1d33e 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 code the flags b
1d33f 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 yte (the first b
1d340 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 yte of the heade
1d341 72 29 20 66 6f 72 20 61 20 70 61 67 65 0d 0a 2a r) for a page..*
1d342 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 * and initialize
1d343 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d fields of the M
1d344 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 emPage structure
1d345 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0d 0a 2a accordingly...*
1d346 2a 0d 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 *..** Only the f
1d347 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 ollowing combina
1d348 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 tions are suppor
1d349 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 ted. Anything d
1d34a 69 66 66 65 72 65 6e 74 0d 0a 2a 2a 20 69 6e 64 ifferent..** ind
1d34b 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 icates a corrupt
1d34c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a database files:
1d34d 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 ..**..**
1d34e 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0d 0a 2a PTF_ZERODATA..*
1d34f 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 * PTF_ZE
1d350 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 RODATA | PTF_LEA
1d351 46 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 F..** PT
1d352 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 F_LEAFDATA | PTF
1d353 5f 49 4e 54 4b 45 59 0d 0a 2a 2a 20 20 20 20 20 _INTKEY..**
1d354 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 PTF_LEAFDATA
1d355 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 | PTF_INTKEY |
1d356 50 54 46 5f 4c 45 41 46 0d 0a 2a 2f 0d 0a 73 74 PTF_LEAF..*/..st
1d357 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 atic int decodeF
1d358 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 lags(MemPage *pP
1d359 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 age, int flagByt
1d35a 65 29 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 20 e){.. BtShared
1d35b 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 *pBt; /* A c
1d35c 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 opy of pPage->pB
1d35d 74 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 t */.... assert
1d35e 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 ( pPage->hdrOffs
1d35f 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f et==(pPage->pgno
1d360 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 ==1 ? 100 : 0) )
1d361 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ;.. assert( sql
1d362 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
1d363 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 pPage->pBt->mute
1d364 78 29 20 29 3b 0d 0a 20 20 70 50 61 67 65 2d 3e x) );.. pPage->
1d365 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 leaf = (u8)(flag
1d366 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 Byte>>3); asser
1d367 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 t( PTF_LEAF == 1
1d368 3c 3c 33 20 29 3b 0d 0a 20 20 66 6c 61 67 42 79 <<3 );.. flagBy
1d369 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b te &= ~PTF_LEAF;
1d36a 0d 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 .. pPage->child
1d36b 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 PtrSize = 4-4*pP
1d36c 61 67 65 2d 3e 6c 65 61 66 3b 0d 0a 20 20 70 42 age->leaf;.. pB
1d36d 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0d t = pPage->pBt;.
1d36e 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d . if( flagByte=
1d36f 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c =(PTF_LEAFDATA |
1d370 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0d PTF_INTKEY) ){.
1d371 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b . pPage->intK
1d372 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 70 50 61 ey = 1;.. pPa
1d373 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 ge->hasData = pP
1d374 61 67 65 2d 3e 6c 65 61 66 3b 0d 0a 20 20 20 20 age->leaf;..
1d375 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 pPage->maxLocal
1d376 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0d = pBt->maxLeaf;.
1d377 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c . pPage->minL
1d378 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c ocal = pBt->minL
1d379 65 61 66 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 eaf;.. }else if
1d37a 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f ( flagByte==PTF_
1d37b 5a 45 52 4f 44 41 54 41 20 29 7b 0d 0a 20 20 20 ZERODATA ){..
1d37c 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d pPage->intKey =
1d37d 20 30 3b 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e 0;.. pPage->
1d37e 68 61 73 44 61 74 61 20 3d 20 30 3b 0d 0a 20 20 hasData = 0;..
1d37f 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 pPage->maxLoca
1d380 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 l = pBt->maxLoca
1d381 6c 3b 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d l;.. pPage->m
1d382 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d inLocal = pBt->m
1d383 69 6e 4c 6f 63 61 6c 3b 0d 0a 20 20 7d 65 6c 73 inLocal;.. }els
1d384 65 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 e{.. return S
1d385 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1d386 50 54 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 67 PT;.. }.. pPag
1d387 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f e->max1bytePaylo
1d388 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 ad = pBt->max1by
1d389 74 65 50 61 79 6c 6f 61 64 3b 0d 0a 20 20 72 65 tePayload;.. re
1d38a 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
1d38b 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 .}..../*..** Ini
1d38c 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 tialize the auxi
1d38d 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f liary informatio
1d38e 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f n for a disk blo
1d38f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 ck...**..** Retu
1d390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 rn SQLITE_OK on
1d391 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 success. If we
1d392 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 see that the pag
1d393 65 20 64 6f 65 73 0d 0a 2a 2a 20 6e 6f 74 20 63 e does..** not c
1d394 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f ontain a well-fo
1d395 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 rmed database pa
1d396 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 ge, then return
1d397 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 ..** SQLITE_CORR
1d398 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 UPT. Note that
1d399 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 a return of SQLI
1d39a 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0d 0a TE_OK does not..
1d39b 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 ** guarantee tha
1d39c 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 t the page is we
1d39d 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f ll-formed. It o
1d39e 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0d 0a nly shows that..
1d39f 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 ** we failed to
1d3a0 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 detect any corru
1d3a1 70 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ption...*/..stat
1d3a2 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 ic int btreeInit
1d3a3 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 Page(MemPage *pP
1d3a4 61 67 65 29 7b 0d 0a 0d 0a 20 20 61 73 73 65 72 age){.... asser
1d3a5 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 t( pPage->pBt!=0
1d3a6 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
1d3a7 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1d3a8 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 d(pPage->pBt->mu
1d3a9 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
1d3aa 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d t( pPage->pgno==
1d3ab 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 sqlite3PagerPage
1d3ac 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 number(pPage->pD
1d3ad 62 50 61 67 65 29 20 29 3b 0d 0a 20 20 61 73 73 bPage) );.. ass
1d3ae 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 ert( pPage == sq
1d3af 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 lite3PagerGetExt
1d3b0 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 ra(pPage->pDbPag
1d3b1 65 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 e) );.. assert(
1d3b2 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d pPage->aData ==
1d3b3 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 sqlite3PagerGet
1d3b4 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 Data(pPage->pDbP
1d3b5 61 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 age) );.... if(
1d3b6 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 !pPage->isInit
1d3b7 29 7b 0d 0a 20 20 20 20 75 31 36 20 70 63 3b 20 ){.. u16 pc;
1d3b8 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 /* Ad
1d3b9 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 dress of a freeb
1d3ba 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 lock within pPag
1d3bb 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0d 0a 20 e->aData[] */..
1d3bc 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 u8 hdr;
1d3bd 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 /* Offset
1d3be 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 to beginning of
1d3bf 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0d 0a page header */..
1d3c0 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 u8 *data;
1d3c1 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 /* Equal
1d3c2 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 to pPage->aData
1d3c3 2a 2f 0d 0a 20 20 20 20 42 74 53 68 61 72 65 64 */.. BtShared
1d3c4 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a *pBt; /*
1d3c5 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 The main btree
1d3c6 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a 20 20 structure */..
1d3c7 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 int usableSize
1d3c8 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f ; /* Amount o
1d3c9 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f f usable space o
1d3ca 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0d 0a n each page */..
1d3cb 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 u16 cellOffs
1d3cc 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 et; /* Offset
1d3cd 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 from start of p
1d3ce 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c age to first cel
1d3cf 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a 20 20 l pointer */..
1d3d0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 int nFree;
1d3d1 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1d3d2 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f f unused bytes o
1d3d3 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0d 0a 20 n the page */..
1d3d4 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 int top;
1d3d5 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 /* First b
1d3d6 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 yte of the cell
1d3d7 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0d content area */.
1d3d8 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 . int iCellFi
1d3d9 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 rst; /* First
1d3da 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 allowable cell
1d3db 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 or freeblock off
1d3dc 73 65 74 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 set */.. int
1d3dd 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f iCellLast; /
1d3de 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 * Last possible
1d3df 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 cell or freebloc
1d3e0 6b 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 0d 0a 20 k offset */....
1d3e1 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e pBt = pPage->
1d3e2 70 42 74 3b 0d 0a 0d 0a 20 20 20 20 68 64 72 20 pBt;.... hdr
1d3e3 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 = pPage->hdrOffs
1d3e4 65 74 3b 0d 0a 20 20 20 20 64 61 74 61 20 3d 20 et;.. data =
1d3e5 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0d 0a 20 pPage->aData;..
1d3e6 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 if( decodeFla
1d3e7 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 gs(pPage, data[h
1d3e8 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 dr]) ) return SQ
1d3e9 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 LITE_CORRUPT_BKP
1d3ea 54 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 T;.. assert(
1d3eb 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 pBt->pageSize>=5
1d3ec 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 12 && pBt->pageS
1d3ed 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0d 0a 20 ize<=65536 );..
1d3ee 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 pPage->maskPa
1d3ef 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e ge = (u16)(pBt->
1d3f0 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0d 0a pageSize - 1);..
1d3f1 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 pPage->nOver
1d3f2 66 6c 6f 77 20 3d 20 30 3b 0d 0a 20 20 20 20 75 flow = 0;.. u
1d3f3 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d sableSize = pBt-
1d3f4 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0d 0a 20 20 >usableSize;..
1d3f5 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 pPage->cellOff
1d3f6 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 set = cellOffset
1d3f7 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a = hdr + 12 - 4*
1d3f8 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0d 0a 20 20 pPage->leaf;..
1d3f9 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e pPage->aDataEn
1d3fa 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 d = &data[usable
1d3fb 53 69 7a 65 5d 3b 0d 0a 20 20 20 20 70 50 61 67 Size];.. pPag
1d3fc 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 e->aCellIdx = &d
1d3fd 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b ata[cellOffset];
1d3fe 0d 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 .. top = get2
1d3ff 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 byteNotZero(&dat
1d400 61 5b 68 64 72 2b 35 5d 29 3b 0d 0a 20 20 20 20 a[hdr+5]);..
1d401 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 pPage->nCell = g
1d402 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 et2byte(&data[hd
1d403 72 2b 33 5d 29 3b 0d 0a 20 20 20 20 69 66 28 20 r+3]);.. if(
1d404 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f pPage->nCell>MX_
1d405 43 45 4c 4c 28 70 42 74 29 20 29 7b 0d 0a 20 20 CELL(pBt) ){..
1d406 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 /* To many c
1d407 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c ells for a singl
1d408 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 e page. The pag
1d409 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 e must be corrup
1d40a 74 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 t */.. retu
1d40b 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1d40c 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a T_BKPT;.. }..
1d40d 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 testcase( pP
1d40e 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 age->nCell==MX_C
1d40f 45 4c 4c 28 70 42 74 29 20 29 3b 0d 0a 0d 0a 20 ELL(pBt) );....
1d410 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 /* A malforme
1d411 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 d database page
1d412 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 might cause us t
1d413 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 o read past the
1d414 65 6e 64 0d 0a 20 20 20 20 2a 2a 20 6f 66 20 70 end.. ** of p
1d415 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 age when parsing
1d416 20 61 20 63 65 6c 6c 2e 20 20 0d 0a 20 20 20 20 a cell. ..
1d417 2a 2a 0d 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 **.. ** The f
1d418 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f ollowing block o
1d419 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 f code checks ea
1d41a 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 rly to see if a
1d41b 63 65 6c 6c 20 65 78 74 65 6e 64 73 0d 0a 20 20 cell extends..
1d41c 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e ** past the en
1d41d 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e d of a page boun
1d41e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 dary and causes
1d41f 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 SQLITE_CORRUPT t
1d420 6f 20 62 65 20 0d 0a 20 20 20 20 2a 2a 20 72 65 o be .. ** re
1d421 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 turned if it doe
1d422 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 s... */..
1d423 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c iCellFirst = cel
1d424 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 lOffset + 2*pPag
1d425 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 20 20 20 20 69 e->nCell;.. i
1d426 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c CellLast = usabl
1d427 65 53 69 7a 65 20 2d 20 34 3b 0d 0a 23 69 66 20 eSize - 4;..#if
1d428 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
1d429 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 NABLE_OVERSIZE_C
1d42a 45 4c 4c 5f 43 48 45 43 4b 29 0d 0a 20 20 20 20 ELL_CHECK)..
1d42b 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 {.. int i;
1d42c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e /* In
1d42d 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c dex into the cel
1d42e 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 l pointer array
1d42f 2a 2f 0d 0a 20 20 20 20 20 20 69 6e 74 20 73 7a */.. int sz
1d430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 ; /* S
1d431 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f ize of a cell */
1d432 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28 20 21 70 .... if( !p
1d433 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 Page->leaf ) iCe
1d434 6c 6c 4c 61 73 74 2d 2d 3b 0d 0a 20 20 20 20 20 llLast--;..
1d435 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 for(i=0; i<pPag
1d436 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0d e->nCell; i++){.
1d437 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 . pc = ge
1d438 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c t2byte(&data[cel
1d439 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0d 0a lOffset+i*2]);..
1d43a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1d43b 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 ( pc==iCellFirst
1d43c 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 74 65 73 );.. tes
1d43d 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c tcase( pc==iCell
1d43e 4c 61 73 74 20 29 3b 0d 0a 20 20 20 20 20 20 20 Last );..
1d43f 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 if( pc<iCellFir
1d440 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 st || pc>iCellLa
1d441 73 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 st ){..
1d442 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1d443 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1d444 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
1d445 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 sz = cellSizePt
1d446 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 r(pPage, &data[p
1d447 63 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 74 65 c]);.. te
1d448 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 stcase( pc+sz==u
1d449 73 61 62 6c 65 53 69 7a 65 20 29 3b 0d 0a 20 20 sableSize );..
1d44a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e if( pc+sz>
1d44b 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0d 0a 20 usableSize ){..
1d44c 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
1d44d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1d44e 4b 50 54 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d KPT;.. }.
1d44f 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1d450 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 if( !pPage->leaf
1d451 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0d ) iCellLast++;.
1d452 0a 20 20 20 20 7d 20 20 0d 0a 23 65 6e 64 69 66 . } ..#endif
1d453 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 .... /* Compu
1d454 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 te the total fre
1d455 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 e space on the p
1d456 61 67 65 20 2a 2f 0d 0a 20 20 20 20 70 63 20 3d age */.. pc =
1d457 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b get2byte(&data[
1d458 68 64 72 2b 31 5d 29 3b 0d 0a 20 20 20 20 6e 46 hdr+1]);.. nF
1d459 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 ree = data[hdr+7
1d45a 5d 20 2b 20 74 6f 70 3b 0d 0a 20 20 20 20 77 68 ] + top;.. wh
1d45b 69 6c 65 28 20 70 63 3e 30 20 29 7b 0d 0a 20 20 ile( pc>0 ){..
1d45c 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 u16 next, si
1d45d 7a 65 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 ze;.. if( p
1d45e 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 c<iCellFirst ||
1d45f 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0d pc>iCellLast ){.
1d460 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 . /* Star
1d461 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 t of free block
1d462 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 is off the page
1d463 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 */.. retu
1d464 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1d465 54 5f 42 4b 50 54 3b 20 0d 0a 20 20 20 20 20 20 T_BKPT; ..
1d466 7d 0d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 }.. next =
1d467 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 get2byte(&data[p
1d468 63 5d 29 3b 0d 0a 20 20 20 20 20 20 73 69 7a 65 c]);.. size
1d469 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 = get2byte(&dat
1d46a 61 5b 70 63 2b 32 5d 29 3b 0d 0a 20 20 20 20 20 a[pc+2]);..
1d46b 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 if( (next>0 &&
1d46c 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 next<=pc+size+3)
1d46d 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 || pc+size>usab
1d46e 6c 65 53 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 leSize ){..
1d46f 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b /* Free block
1d470 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 s must be in asc
1d471 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e ending order. An
1d472 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 d the last byte
1d473 6f 66 0d 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 of...** the free
1d474 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 -block must lie
1d475 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 on the database
1d476 70 61 67 65 2e 20 20 2a 2f 0d 0a 20 20 20 20 20 page. */..
1d477 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1d478 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0d _CORRUPT_BKPT; .
1d479 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1d47a 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 nFree = nFree +
1d47b 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20 70 63 20 size;.. pc
1d47c 3d 20 6e 65 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a = next;.. }..
1d47d 0d 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 .. /* At this
1d47e 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f point, nFree co
1d47f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f ntains the sum o
1d480 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 f the offset to
1d481 74 68 65 20 73 74 61 72 74 0d 0a 20 20 20 20 2a the start.. *
1d482 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f * of the cell-co
1d483 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 ntent area plus
1d484 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 the number of fr
1d485 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0d ee bytes within.
1d486 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c . ** the cell
1d487 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 -content area. I
1d488 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 f this is greate
1d489 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c r than the usabl
1d48a 65 2d 73 69 7a 65 0d 0a 20 20 20 20 2a 2a 20 6f e-size.. ** o
1d48b 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e f the page, then
1d48c 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 the page must b
1d48d 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 e corrupted. Thi
1d48e 73 20 63 68 65 63 6b 20 61 6c 73 6f 0d 0a 20 20 s check also..
1d48f 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 ** serves to v
1d490 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f erify that the o
1d491 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 ffset to the sta
1d492 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 rt of the cell-c
1d493 6f 6e 74 65 6e 74 0d 0a 20 20 20 20 2a 2a 20 61 ontent.. ** a
1d494 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 rea, according t
1d495 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 o the page heade
1d496 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 r, lies within t
1d497 68 65 20 70 61 67 65 2e 0d 0a 20 20 20 20 2a 2f he page... */
1d498 0d 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e .. if( nFree>
1d499 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0d 0a 20 usableSize ){..
1d49a 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
1d49b 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1d49c 20 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 50 .. }.. pP
1d49d 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 age->nFree = (u1
1d49e 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 6)(nFree - iCell
1d49f 46 69 72 73 74 29 3b 0d 0a 20 20 20 20 70 50 61 First);.. pPa
1d4a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0d ge->isInit = 1;.
1d4a1 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 . }.. return S
1d4a2 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a QLITE_OK;..}....
1d4a3 2f 2a 0d 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 /*..** Set up a
1d4a4 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 raw page so that
1d4a5 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 it looks like a
1d4a6 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 database page h
1d4a7 6f 6c 64 69 6e 67 0d 0a 2a 2a 20 6e 6f 20 65 6e olding..** no en
1d4a8 74 72 69 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 tries...*/..stat
1d4a9 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 ic void zeroPage
1d4aa 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c (MemPage *pPage,
1d4ab 20 69 6e 74 20 66 6c 61 67 73 29 7b 0d 0a 20 20 int flags){..
1d4ac 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 unsigned char *d
1d4ad 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 ata = pPage->aDa
1d4ae 74 61 3b 0d 0a 20 20 42 74 53 68 61 72 65 64 20 ta;.. BtShared
1d4af 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 *pBt = pPage->pB
1d4b0 74 3b 0d 0a 20 20 75 38 20 68 64 72 20 3d 20 70 t;.. u8 hdr = p
1d4b1 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b Page->hdrOffset;
1d4b2 0d 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0d 0a .. u16 first;..
1d4b3 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1d4b4 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 te3PagerPagenumb
1d4b5 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 er(pPage->pDbPag
1d4b6 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 e)==pPage->pgno
1d4b7 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 );.. assert( sq
1d4b8 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 lite3PagerGetExt
1d4b9 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 ra(pPage->pDbPag
1d4ba 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 e) == (void*)pPa
1d4bb 67 65 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 ge );.. assert(
1d4bc 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 sqlite3PagerGet
1d4bd 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 Data(pPage->pDbP
1d4be 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0d age) == data );.
1d4bf 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1d4c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 e3PagerIswriteab
1d4c1 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 le(pPage->pDbPag
1d4c2 65 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 e) );.. assert(
1d4c3 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
1d4c4 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 eld(pBt->mutex)
1d4c5 29 3b 0d 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 );.. if( pBt->b
1d4c6 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 tsFlags & BTS_SE
1d4c7 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0d 0a CURE_DELETE ){..
1d4c8 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 memset(&data
1d4c9 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 [hdr], 0, pBt->u
1d4ca 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 sableSize - hdr)
1d4cb 3b 0d 0a 20 20 7d 0d 0a 20 20 64 61 74 61 5b 68 ;.. }.. data[h
1d4cc 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 dr] = (char)flag
1d4cd 73 3b 0d 0a 20 20 66 69 72 73 74 20 3d 20 68 64 s;.. first = hd
1d4ce 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 r + 8 + 4*((flag
1d4cf 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f s&PTF_LEAF)==0 ?
1d4d0 31 3a 30 29 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 1:0);.. memset(
1d4d1 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c &data[hdr+1], 0,
1d4d2 20 34 29 3b 0d 0a 20 20 64 61 74 61 5b 68 64 72 4);.. data[hdr
1d4d3 2b 37 5d 20 3d 20 30 3b 0d 0a 20 20 70 75 74 32 +7] = 0;.. put2
1d4d4 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 byte(&data[hdr+5
1d4d5 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 ], pBt->usableSi
1d4d6 7a 65 29 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 6e ze);.. pPage->n
1d4d7 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 Free = (u16)(pBt
1d4d8 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 ->usableSize - f
1d4d9 69 72 73 74 29 3b 0d 0a 20 20 64 65 63 6f 64 65 irst);.. decode
1d4da 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 Flags(pPage, fla
1d4db 67 73 29 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 68 gs);.. pPage->h
1d4dc 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0d drOffset = hdr;.
1d4dd 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 . pPage->cellOf
1d4de 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0d 0a 20 fset = first;..
1d4df 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 pPage->aDataEnd
1d4e0 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 = &data[pBt->us
1d4e1 61 62 6c 65 53 69 7a 65 5d 3b 0d 0a 20 20 70 50 ableSize];.. pP
1d4e2 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 age->aCellIdx =
1d4e3 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0d 0a 20 &data[first];..
1d4e4 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f pPage->nOverflo
1d4e5 77 20 3d 20 30 3b 0d 0a 20 20 61 73 73 65 72 74 w = 0;.. assert
1d4e6 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e ( pBt->pageSize>
1d4e7 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 =512 && pBt->pag
1d4e8 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0d eSize<=65536 );.
1d4e9 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 . pPage->maskPa
1d4ea 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e ge = (u16)(pBt->
1d4eb 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0d 0a pageSize - 1);..
1d4ec 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d pPage->nCell =
1d4ed 20 30 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 69 73 0;.. pPage->is
1d4ee 49 6e 69 74 20 3d 20 31 3b 0d 0a 7d 0d 0a 0d 0a Init = 1;..}....
1d4ef 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 ../*..** Convert
1d4f0 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e a DbPage obtain
1d4f1 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 ed from the page
1d4f2 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 r into a MemPage
1d4f3 20 75 73 65 64 20 62 79 0d 0a 2a 2a 20 74 68 65 used by..** the
1d4f4 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0d 0a 2a btree layer...*
1d4f5 2f 0d 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 /..static MemPag
1d4f6 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d e *btreePageFrom
1d4f7 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 DbPage(DbPage *p
1d4f8 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e DbPage, Pgno pgn
1d4f9 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 o, BtShared *pBt
1d4fa 29 7b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 ){.. MemPage *p
1d4fb 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a Page = (MemPage*
1d4fc 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 )sqlite3PagerGet
1d4fd 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0d Extra(pDbPage);.
1d4fe 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 . pPage->aData
1d4ff 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 = sqlite3PagerGe
1d500 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0d tData(pDbPage);.
1d501 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 . pPage->pDbPag
1d502 65 20 3d 20 70 44 62 50 61 67 65 3b 0d 0a 20 20 e = pDbPage;..
1d503 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 pPage->pBt = pBt
1d504 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f ;.. pPage->pgno
1d505 20 3d 20 70 67 6e 6f 3b 0d 0a 20 20 70 50 61 67 = pgno;.. pPag
1d506 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 e->hdrOffset = p
1d507 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 Page->pgno==1 ?
1d508 31 30 30 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75 100 : 0;.. retu
1d509 72 6e 20 70 50 61 67 65 3b 20 0d 0a 7d 0d 0a 0d rn pPage; ..}...
1d50a 0a 2f 2a 0d 0a 2a 2a 20 47 65 74 20 61 20 70 61 ./*..** Get a pa
1d50b 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 ge from the page
1d50c 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 r. Initialize t
1d50d 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 he MemPage.pBt a
1d50e 6e 64 0d 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 nd..** MemPage.a
1d50f 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 Data elements if
1d510 20 6e 65 65 64 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a needed...**..**
1d511 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e If the noConten
1d512 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 t flag is set, i
1d513 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 t means that we
1d514 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 do not care abou
1d515 74 0d 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e t..** the conten
1d516 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 t of the page at
1d517 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 this time. So
1d518 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 do not go to the
1d519 20 64 69 73 6b 0d 0a 2a 2a 20 74 6f 20 66 65 74 disk..** to fet
1d51a 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 ch the content.
1d51b 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 Just fill in th
1d51c 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a e content with z
1d51d 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0d 0a 2a eros for now...*
1d51e 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 * If in the futu
1d51f 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 re we call sqlit
1d520 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f e3PagerWrite() o
1d521 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 n this page, tha
1d522 74 0d 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 t..** means we h
1d523 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 ave started to b
1d524 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 e concerned abou
1d525 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 t content and th
1d526 65 20 64 69 73 6b 0d 0a 2a 2a 20 72 65 61 64 20 e disk..** read
1d527 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 should occur at
1d528 74 68 61 74 20 70 6f 69 6e 74 2e 0d 0a 2a 2f 0d that point...*/.
1d529 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 .static int btre
1d52a 65 47 65 74 50 61 67 65 28 0d 0a 20 20 42 74 53 eGetPage(.. BtS
1d52b 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 hared *pBt,
1d52c 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a /* The btree *
1d52d 2f 0d 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 /.. Pgno pgno,
1d52e 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1d52f 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 ber of the page
1d530 74 6f 20 66 65 74 63 68 20 2a 2f 0d 0a 20 20 4d to fetch */.. M
1d531 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c emPage **ppPage,
1d532 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 /* Return th
1d533 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 e page in this p
1d534 61 72 61 6d 65 74 65 72 20 2a 2f 0d 0a 20 20 69 arameter */.. i
1d535 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 nt noContent
1d536 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f /* Do not lo
1d537 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 ad page content
1d538 69 66 20 74 72 75 65 20 2a 2f 0d 0a 29 7b 0d 0a if true */..){..
1d539 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 44 62 50 int rc;.. DbP
1d53a 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0d 0a 0d age *pDbPage;...
1d53b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1d53c 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 e3_mutex_held(pB
1d53d 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 t->mutex) );..
1d53e 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1d53f 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 rAcquire(pBt->pP
1d540 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 ager, pgno, (DbP
1d541 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 age**)&pDbPage,
1d542 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0d 0a 20 20 69 noContent);.. i
1d543 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 f( rc ) return r
1d544 63 3b 0d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 c;.. *ppPage =
1d545 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 btreePageFromDbP
1d546 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e age(pDbPage, pgn
1d547 6f 2c 20 70 42 74 29 3b 0d 0a 20 20 72 65 74 75 o, pBt);.. retu
1d548 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
1d549 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 72 69 ..../*..** Retri
1d54a 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 eve a page from
1d54b 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e the pager cache.
1d54c 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 If the requeste
1d54d 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0d 0a 2a d page is not..*
1d54e 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 * already in the
1d54f 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 pager cache ret
1d550 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 urn NULL. Initia
1d551 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 lize the MemPage
1d552 2e 70 42 74 20 61 6e 64 0d 0a 2a 2a 20 4d 65 6d .pBt and..** Mem
1d553 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 Page.aData eleme
1d554 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0d 0a nts if needed...
1d555 2a 2f 0d 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 */..static MemPa
1d556 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f ge *btreePageLoo
1d557 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 kup(BtShared *pB
1d558 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0d 0a t, Pgno pgno){..
1d559 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 DbPage *pDbPag
1d55a 65 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 e;.. assert( sq
1d55b 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
1d55c 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d (pBt->mutex) );.
1d55d 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c . pDbPage = sql
1d55e 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 ite3PagerLookup(
1d55f 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e pBt->pPager, pgn
1d560 6f 29 3b 0d 0a 20 20 69 66 28 20 70 44 62 50 61 o);.. if( pDbPa
1d561 67 65 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 ge ){.. retur
1d562 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 n btreePageFromD
1d563 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 bPage(pDbPage, p
1d564 67 6e 6f 2c 20 70 42 74 29 3b 0d 0a 20 20 7d 0d gno, pBt);.. }.
1d565 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d . return 0;..}.
1d566 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e .../*..** Return
1d567 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 the size of the
1d568 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
1d569 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 n pages. If ther
1d56a 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 e is any kind of
1d56b 0d 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 ..** error, retu
1d56c 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e rn ((unsigned in
1d56d 74 29 2d 31 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 t)-1)...*/..stat
1d56e 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 ic Pgno btreePag
1d56f 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 ecount(BtShared
1d570 2a 70 42 74 29 7b 0d 0a 20 20 72 65 74 75 72 6e *pBt){.. return
1d571 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0d 0a 7d 0d pBt->nPage;..}.
1d572 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
1d573 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 u32 sqlite3Btree
1d574 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a LastPage(Btree *
1d575 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 p){.. assert( s
1d576 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 qlite3BtreeHolds
1d577 4d 75 74 65 78 28 70 29 20 29 3b 0d 0a 20 20 61 Mutex(p) );.. a
1d578 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d ssert( ((p->pBt-
1d579 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 >nPage)&0x800000
1d57a 30 29 3d 3d 30 20 29 3b 0d 0a 20 20 72 65 74 75 0)==0 );.. retu
1d57b 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 rn (int)btreePag
1d57c 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0d ecount(p->pBt);.
1d57d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 65 74 .}..../*..** Get
1d57e 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 a page from the
1d57f 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 pager and initi
1d580 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 alize it. This
1d581 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 routine is just
1d582 61 0d 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 a..** convenienc
1d583 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 e wrapper around
1d584 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 separate calls
1d585 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 28 to btreeGetPage(
1d586 29 20 61 6e 64 20 0d 0a 2a 2a 20 62 74 72 65 65 ) and ..** btree
1d587 49 6e 69 74 50 61 67 65 28 29 2e 0d 0a 2a 2a 0d InitPage()...**.
1d588 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 .** If an error
1d589 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 occurs, then the
1d58a 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 value *ppPage i
1d58b 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 s set to is unde
1d58c 66 69 6e 65 64 2e 20 49 74 0d 0a 2a 2a 20 6d 61 fined. It..** ma
1d58d 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 y remain unchang
1d58e 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 ed, or it may be
1d58f 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c set to an inval
1d590 69 64 20 76 61 6c 75 65 2e 0d 0a 2a 2f 0d 0a 73 id value...*/..s
1d591 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 tatic int getAnd
1d592 49 6e 69 74 50 61 67 65 28 0d 0a 20 20 42 74 53 InitPage(.. BtS
1d593 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 hared *pBt,
1d594 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 /* The data
1d595 62 61 73 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 base file */..
1d596 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 Pgno pgno,
1d597 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1d598 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 f the page to ge
1d599 74 20 2a 2f 0d 0a 20 20 4d 65 6d 50 61 67 65 20 t */.. MemPage
1d59a 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 **ppPage /*
1d59b 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 Write the page p
1d59c 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0d 0a ointer here */..
1d59d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 ){.. int rc;..
1d59e 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
1d59f 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d _mutex_held(pBt-
1d5a0 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 0d 0a 20 20 >mutex) );....
1d5a1 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 if( pgno>btreePa
1d5a2 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0d gecount(pBt) ){.
1d5a3 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
1d5a4 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a _CORRUPT_BKPT;..
1d5a5 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 72 63 }else{.. rc
1d5a6 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 = btreeGetPage(
1d5a7 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 pBt, pgno, ppPag
1d5a8 65 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 e, 0);.. if(
1d5a9 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1d5aa 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 .. rc = btr
1d5ab 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 eeInitPage(*ppPa
1d5ac 67 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 ge);.. if(
1d5ad 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
1d5ae 0d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 .. releas
1d5af 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0d ePage(*ppPage);.
1d5b0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
1d5b1 0a 20 20 7d 0d 0a 0d 0a 20 20 74 65 73 74 63 61 . }.... testca
1d5b2 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0d 0a se( pgno==0 );..
1d5b3 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d assert( pgno!=
1d5b4 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 0 || rc==SQLITE_
1d5b5 43 4f 52 52 55 50 54 20 29 3b 0d 0a 20 20 72 65 CORRUPT );.. re
1d5b6 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
1d5b7 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 *..** Release a
1d5b8 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 MemPage. This s
1d5b9 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 hould be called
1d5ba 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 once for each pr
1d5bb 69 6f 72 0d 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 ior..** call to
1d5bc 62 74 72 65 65 47 65 74 50 61 67 65 2e 0d 0a 2a btreeGetPage...*
1d5bd 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 /..static void r
1d5be 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 eleasePage(MemPa
1d5bf 67 65 20 2a 70 50 61 67 65 29 7b 0d 0a 20 20 69 ge *pPage){.. i
1d5c0 66 28 20 70 50 61 67 65 20 29 7b 0d 0a 20 20 20 f( pPage ){..
1d5c1 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e assert( pPage->
1d5c2 61 44 61 74 61 20 29 3b 0d 0a 20 20 20 20 61 73 aData );.. as
1d5c3 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 sert( pPage->pBt
1d5c4 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
1d5c5 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 sqlite3PagerGet
1d5c6 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 Extra(pPage->pDb
1d5c7 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 Page) == (void*)
1d5c8 70 50 61 67 65 20 29 3b 0d 0a 20 20 20 20 61 73 pPage );.. as
1d5c9 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 sert( sqlite3Pag
1d5ca 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d erGetData(pPage-
1d5cb 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 >pDbPage)==pPage
1d5cc 2d 3e 61 44 61 74 61 20 29 3b 0d 0a 20 20 20 20 ->aData );..
1d5cd 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1d5ce 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 mutex_held(pPage
1d5cf 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b ->pBt->mutex) );
1d5d0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 .. sqlite3Pag
1d5d1 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 erUnref(pPage->p
1d5d2 44 62 50 61 67 65 29 3b 0d 0a 20 20 7d 0d 0a 7d DbPage);.. }..}
1d5d3 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 75 72 69 6e ..../*..** Durin
1d5d4 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 g a rollback, wh
1d5d5 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c en the pager rel
1d5d6 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e oads information
1d5d7 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0d into the cache.
1d5d8 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 .** so that the
1d5d9 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 cache is restore
1d5da 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 d to its origina
1d5db 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 l state at the s
1d5dc 74 61 72 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 tart of..** the
1d5dd 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 transaction, for
1d5de 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f each page resto
1d5df 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 red this routine
1d5e0 20 69 73 20 63 61 6c 6c 65 64 2e 0d 0a 2a 2a 0d is called...**.
1d5e1 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
1d5e2 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 needs to reset
1d5e3 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 the extra data s
1d5e4 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e ection at the en
1d5e5 64 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 70 61 67 d of the..** pag
1d5e6 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 e to agree with
1d5e7 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 the restored dat
1d5e8 61 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 a...*/..static v
1d5e9 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 oid pageReinit(D
1d5ea 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0d 0a bPage *pData){..
1d5eb 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 MemPage *pPage
1d5ec 3b 0d 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 ;.. pPage = (Me
1d5ed 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 mPage *)sqlite3P
1d5ee 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 agerGetExtra(pDa
1d5ef 74 61 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ta);.. assert(
1d5f0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 sqlite3PagerPage
1d5f1 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e Refcount(pData)>
1d5f2 30 20 29 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 0 );.. if( pPag
1d5f3 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0d 0a 20 20 e->isInit ){..
1d5f4 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1d5f5 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 3_mutex_held(pPa
1d5f6 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 ge->pBt->mutex)
1d5f7 29 3b 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 );.. pPage->i
1d5f8 73 49 6e 69 74 20 3d 20 30 3b 0d 0a 20 20 20 20 sInit = 0;..
1d5f9 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 if( sqlite3Pager
1d5fa 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 PageRefcount(pDa
1d5fb 74 61 29 3e 31 20 29 7b 0d 0a 20 20 20 20 20 20 ta)>1 ){..
1d5fc 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e /* pPage might n
1d5fd 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 ot be a btree pa
1d5fe 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 ge; it might be
1d5ff 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 an overflow pag
1d600 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 e.. ** or p
1d601 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 trmap page or a
1d602 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 free page. In t
1d603 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 hose cases, the
1d604 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 20 20 20 20 20 following..
1d605 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 ** call to btre
1d606 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c eInitPage() will
1d607 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 likely return S
1d608 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0d 0a QLITE_CORRUPT...
1d609 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 ** But no
1d60a 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 harm is done by
1d60b 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 this. And it is
1d60c 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 very important
1d60d 74 68 61 74 0d 0a 20 20 20 20 20 20 2a 2a 20 62 that.. ** b
1d60e 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 treeInitPage() b
1d60f 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 e called on ever
1d610 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 y btree page so
1d611 77 65 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 2a we make.. *
1d612 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 * the call for e
1d613 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 very page that c
1d614 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 omes in for re-i
1d615 6e 69 74 69 6e 67 2e 20 2a 2f 0d 0a 20 20 20 20 niting. */..
1d616 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 btreeInitPage(
1d617 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a pPage);.. }..
1d618 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a }..}..../*..**
1d619 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 Invoke the busy
1d61a 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 handler for a b
1d61b 74 72 65 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 tree...*/..stati
1d61c 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b c int btreeInvok
1d61d 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 eBusyHandler(voi
1d61e 64 20 2a 70 41 72 67 29 7b 0d 0a 20 20 42 74 53 d *pArg){.. BtS
1d61f 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 hared *pBt = (Bt
1d620 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0d 0a 20 Shared*)pArg;..
1d621 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 assert( pBt->db
1d622 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
1d623 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1d624 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 d(pBt->db->mutex
1d625 29 20 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 73 ) );.. return s
1d626 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 qlite3InvokeBusy
1d627 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 Handler(&pBt->db
1d628 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0d ->busyHandler);.
1d629 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 70 65 .}..../*..** Ope
1d62a 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c n a database fil
1d62b 65 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 7a 46 69 6c e...** ..** zFil
1d62c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d ename is the nam
1d62d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 e of the databas
1d62e 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c e file. If zFil
1d62f 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0d 0a 2a ename is NULL..*
1d630 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 * then an epheme
1d631 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 ral database is
1d632 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 created. The ep
1d633 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 hemeral database
1d634 20 6d 69 67 68 74 0d 0a 2a 2a 20 62 65 20 65 78 might..** be ex
1d635 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d clusively in mem
1d636 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 ory, or it might
1d637 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 use a disk-base
1d638 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0d d memory cache..
1d639 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 .** Either way,
1d63a 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 the ephemeral da
1d63b 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 tabase will be a
1d63c 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c utomatically del
1d63d 65 74 65 64 20 0d 0a 2a 2a 20 77 68 65 6e 20 73 eted ..** when s
1d63e 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 qlite3BtreeClose
1d63f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0d 0a 2a () is called...*
1d640 2a 0d 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 *..** If zFilena
1d641 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 me is ":memory:"
1d642 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f then an in-memo
1d643 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 ry database is c
1d644 72 65 61 74 65 64 0d 0a 2a 2a 20 74 68 61 74 20 reated..** that
1d645 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 is automatically
1d646 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 destroyed when
1d647 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a 2a it is closed...*
1d648 2a 0d 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 *..** The "flags
1d649 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 " parameter is a
1d64a 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 bitmask that mi
1d64b 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 ght contain bits
1d64c 0d 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f ..** BTREE_OMIT_
1d64d 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 JOURNAL and/or B
1d64e 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b TREE_NO_READLOCK
1d64f 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f 5f . The BTREE_NO_
1d650 52 45 41 44 4c 4f 43 4b 0d 0a 2a 2a 20 62 69 74 READLOCK..** bit
1d651 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20 is also set if
1d652 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 the SQLITE_NoRea
1d653 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73 dlock flags is s
1d654 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e et in db->flags.
1d655 0d 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 ..** These flags
1d656 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f are passed thro
1d657 75 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 ugh into sqlite3
1d658 50 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 PagerOpen() and
1d659 6d 75 73 74 0d 0a 2a 2a 20 62 65 20 74 68 65 20 must..** be the
1d65a 73 61 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 same values as P
1d65b 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 AGER_OMIT_JOURNA
1d65c 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 L and PAGER_NO_R
1d65d 45 41 44 4c 4f 43 4b 2e 0d 0a 2a 2a 0d 0a 2a 2a EADLOCK...**..**
1d65e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 If the database
1d65f 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e is already open
1d660 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 ed in the same d
1d661 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1d662 6f 6e 0d 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 on..** and we ar
1d663 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 e in shared cach
1d664 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 e mode, then the
1d665 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 open will fail
1d666 77 69 74 68 20 61 6e 0d 0a 2a 2a 20 53 51 4c 49 with an..** SQLI
1d667 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 TE_CONSTRAINT er
1d668 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 ror. We cannot
1d669 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 allow two or mor
1d66a 65 20 42 74 53 68 61 72 65 64 0d 0a 2a 2a 20 6f e BtShared..** o
1d66b 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 bjects in the sa
1d66c 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e me database conn
1d66d 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 ection since doi
1d66e 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0d ng so will lead.
1d66f 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 .** to problems
1d670 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0d 0a 2a with locking...*
1d671 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
1d672 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
1d673 65 65 4f 70 65 6e 28 0d 0a 20 20 73 71 6c 69 74 eeOpen(.. sqlit
1d674 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 e3_vfs *pVfs,
1d675 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 /* VFS to use
1d676 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 for this b-tree
1d677 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 */.. const cha
1d678 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f r *zFilename, /
1d679 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 * Name of the fi
1d67a 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 le containing th
1d67b 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 e BTree database
1d67c 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a */.. sqlite3 *
1d67d 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f db, /
1d67e 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 * Associated dat
1d67f 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0d abase handle */.
1d680 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 . Btree **ppBtr
1d681 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f ee, /* Po
1d682 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 inter to new Btr
1d683 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 ee object writte
1d684 6e 20 68 65 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 n here */.. int
1d685 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 flags,
1d686 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 /* Options
1d687 2a 2f 0d 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 */.. int vfsFla
1d688 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a gs /*
1d689 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 Flags passed th
1d68a 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 rough to sqlite3
1d68b 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0d _vfs.xOpen() */.
1d68c 0a 29 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 20 .){.. BtShared
1d68d 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 *pBt = 0;
1d68e 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 /* Shared
1d68f 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 part of btree st
1d690 72 75 63 74 75 72 65 20 2a 2f 0d 0a 20 20 42 74 ructure */.. Bt
1d691 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 ree *p;
1d692 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1d693 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e Handle to return
1d694 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d */.. sqlite3_m
1d695 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 utex *mutexOpen
1d696 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 = 0; /* Prevent
1d697 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 s a race conditi
1d698 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 on. Ticket #3537
1d699 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 */.. int rc =
1d69a 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 SQLITE_OK;
1d69b 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 /* Result
1d69c 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 code from this f
1d69d 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 75 38 unction */.. u8
1d69e 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 nReserve;
1d69f 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1d6a0 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 Byte of unused s
1d6a1 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 pace on each pag
1d6a2 65 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 e */.. unsigned
1d6a3 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b char zDbHeader[
1d6a4 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 100]; /* Databa
1d6a5 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e se header conten
1d6a6 74 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 54 72 75 t */.... /* Tru
1d6a7 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 e if opening an
1d6a8 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f ephemeral, tempo
1d6a9 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f rary database */
1d6aa 0d 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 .. const int is
1d6ab 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 TempDb = zFilena
1d6ac 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 me==0 || zFilena
1d6ad 6d 65 5b 30 5d 3d 3d 30 3b 0d 0a 0d 0a 20 20 2f me[0]==0;.... /
1d6ae 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 * Set the variab
1d6af 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 le isMemdb to tr
1d6b0 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d ue for an in-mem
1d6b1 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 ory database, or
1d6b2 20 0d 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f .. ** false fo
1d6b3 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 r a file-based d
1d6b4 61 74 61 62 61 73 65 2e 0d 0a 20 20 2a 2f 0d 0a atabase... */..
1d6b5 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
1d6b6 49 54 5f 4d 45 4d 4f 52 59 44 42 0d 0a 20 20 63 IT_MEMORYDB.. c
1d6b7 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 onst int isMemdb
1d6b8 20 3d 20 30 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 = 0;..#else..
1d6b9 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 const int isMemd
1d6ba 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 b = (zFilename &
1d6bb 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 & strcmp(zFilena
1d6bc 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d me, ":memory:")=
1d6bd 3d 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 =0)..
1d6be 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 || (
1d6bf 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 isTempDb && sqli
1d6c0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 te3TempInMemory(
1d6c1 64 62 29 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d db));..#endif...
1d6c2 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 . assert( db!=0
1d6c3 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
1d6c4 56 66 73 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 Vfs!=0 );.. ass
1d6c5 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
1d6c6 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 ex_held(db->mute
1d6c7 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 x) );.. assert(
1d6c8 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 (flags&0xff)==f
1d6c9 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 lags ); /* fla
1d6ca 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 gs fit in 8 bits
1d6cb 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 4f 6e 6c 79 */.... /* Only
1d6cc 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 a BTREE_SINGLE
1d6cd 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 database can be
1d6ce 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 BTREE_UNORDERED
1d6cf 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 28 66 */.. assert( (f
1d6d0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f lags & BTREE_UNO
1d6d1 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 RDERED)==0 || (f
1d6d2 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e lags & BTREE_SIN
1d6d3 47 4c 45 29 21 3d 30 20 29 3b 0d 0a 0d 0a 20 20 GLE)!=0 );....
1d6d4 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c /* A BTREE_SINGL
1d6d5 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c E database is al
1d6d6 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 ways a temporary
1d6d7 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 and/or ephemera
1d6d8 6c 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 l */.. assert(
1d6d9 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 (flags & BTREE_S
1d6da 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 INGLE)==0 || isT
1d6db 65 6d 70 44 62 20 29 3b 0d 0a 0d 0a 20 20 69 66 empDb );.... if
1d6dc 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 ( db->flags & SQ
1d6dd 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 LITE_NoReadlock
1d6de 29 7b 0d 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d ){.. flags |=
1d6df 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f BTREE_NO_READLO
1d6e0 43 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 CK;.. }.. if(
1d6e1 69 73 4d 65 6d 64 62 20 29 7b 0d 0a 20 20 20 20 isMemdb ){..
1d6e2 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d flags |= BTREE_M
1d6e3 45 4d 4f 52 59 3b 0d 0a 20 20 7d 0d 0a 20 20 69 EMORY;.. }.. i
1d6e4 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 f( (vfsFlags & S
1d6e5 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
1d6e6 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d DB)!=0 && (isMem
1d6e7 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 db || isTempDb)
1d6e8 29 7b 0d 0a 20 20 20 20 76 66 73 46 6c 61 67 73 ){.. vfsFlags
1d6e9 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e = (vfsFlags & ~
1d6ea 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e SQLITE_OPEN_MAIN
1d6eb 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 _DB) | SQLITE_OP
1d6ec 45 4e 5f 54 45 4d 50 5f 44 42 3b 0d 0a 20 20 7d EN_TEMP_DB;.. }
1d6ed 0d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d .. p = sqlite3M
1d6ee 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 allocZero(sizeof
1d6ef 28 42 74 72 65 65 29 29 3b 0d 0a 20 20 69 66 28 (Btree));.. if(
1d6f0 20 21 70 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 !p ){.. retu
1d6f1 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
1d6f2 0d 0a 20 20 7d 0d 0a 20 20 70 2d 3e 69 6e 54 72 .. }.. p->inTr
1d6f3 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 ans = TRANS_NONE
1d6f4 3b 0d 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b ;.. p->db = db;
1d6f5 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1d6f6 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 _OMIT_SHARED_CAC
1d6f7 48 45 0d 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 HE.. p->lock.pB
1d6f8 74 72 65 65 20 3d 20 70 3b 0d 0a 20 20 70 2d 3e tree = p;.. p->
1d6f9 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b lock.iTable = 1;
1d6fa 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 ..#endif....#if
1d6fb 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
1d6fc 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 OMIT_SHARED_CACH
1d6fd 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 E) && !defined(S
1d6fe 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 QLITE_OMIT_DISKI
1d6ff 4f 29 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 49 O).. /*.. ** I
1d700 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 f this Btree is
1d701 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 a candidate for
1d702 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 shared cache, tr
1d703 79 20 74 6f 20 66 69 6e 64 20 61 6e 0d 0a 20 20 y to find an..
1d704 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 ** existing BtSh
1d705 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 ared object that
1d706 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 we can share wi
1d707 74 68 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 th.. */.. if(
1d708 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 isMemdb==0 && is
1d709 54 65 6d 70 44 62 3d 3d 30 20 29 7b 0d 0a 20 20 TempDb==0 ){..
1d70a 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 if( vfsFlags &
1d70b 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 SQLITE_OPEN_SHA
1d70c 52 45 44 43 41 43 48 45 20 29 7b 0d 0a 20 20 20 REDCACHE ){..
1d70d 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 int nFullPath
1d70e 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 name = pVfs->mxP
1d70f 61 74 68 6e 61 6d 65 2b 31 3b 0d 0a 20 20 20 20 athname+1;..
1d710 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 char *zFullPat
1d711 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d hname = sqlite3M
1d712 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e alloc(nFullPathn
1d713 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 4d 55 54 ame);.. MUT
1d714 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 EX_LOGIC( sqlite
1d715 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 3_mutex *mutexSh
1d716 61 72 65 64 3b 20 29 0d 0a 20 20 20 20 20 20 70 ared; ).. p
1d717 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0d ->sharable = 1;.
1d718 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c . if( !zFul
1d719 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0d 0a 20 20 lPathname ){..
1d71a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
1d71b 65 65 28 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 ee(p);..
1d71c 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
1d71d 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 MEM;.. }..
1d71e 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
1d71f 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 3OsFullPathname(
1d720 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c pVfs, zFilename,
1d721 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 nFullPathname,
1d722 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0d zFullPathname);.
1d723 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b . if( rc ){
1d724 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 .. sqlite
1d725 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 3_free(zFullPath
1d726 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 name);..
1d727 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b sqlite3_free(p);
1d728 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e .. return
1d729 20 72 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 rc;.. }..#
1d72a 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 if SQLITE_THREAD
1d72b 53 41 46 45 0d 0a 20 20 20 20 20 20 6d 75 74 65 SAFE.. mute
1d72c 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d xOpen = sqlite3M
1d72d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 utexAlloc(SQLITE
1d72e 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 _MUTEX_STATIC_OP
1d72f 45 4e 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 EN);.. sqli
1d730 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 te3_mutex_enter(
1d731 6d 75 74 65 78 4f 70 65 6e 29 3b 0d 0a 20 20 20 mutexOpen);..
1d732 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d mutexShared =
1d733 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c sqlite3MutexAll
1d734 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f oc(SQLITE_MUTEX_
1d735 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0d STATIC_MASTER);.
1d736 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d . sqlite3_m
1d737 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 utex_enter(mutex
1d738 53 68 61 72 65 64 29 3b 0d 0a 23 65 6e 64 69 66 Shared);..#endif
1d739 0d 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d .. for(pBt=
1d73a 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a GLOBAL(BtShared*
1d73b 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 ,sqlite3SharedCa
1d73c 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 cheList); pBt; p
1d73d 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0d Bt=pBt->pNext){.
1d73e 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
1d73f 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0d pBt->nRef>0 );.
1d740 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d . if( 0==
1d741 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 strcmp(zFullPath
1d742 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 name, sqlite3Pag
1d743 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e erFilename(pBt->
1d744 70 50 61 67 65 72 29 29 0d 0a 20 20 20 20 20 20 pPager))..
1d745 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 && sq
1d746 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 lite3PagerVfs(pB
1d747 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 t->pPager)==pVfs
1d748 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 ){.. i
1d749 6e 74 20 69 44 62 3b 0d 0a 20 20 20 20 20 20 20 nt iDb;..
1d74a 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e for(iDb=db->n
1d74b 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 Db-1; iDb>=0; iD
1d74c 62 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 b--){..
1d74d 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 Btree *pExist
1d74e 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 ing = db->aDb[iD
1d74f 62 5d 2e 70 42 74 3b 0d 0a 20 20 20 20 20 20 20 b].pBt;..
1d750 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 if( pExisti
1d751 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d ng && pExisting-
1d752 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0d 0a 20 20 >pBt==pBt ){..
1d753 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 sqli
1d754 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
1d755 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0d 0a 20 mutexShared);..
1d756 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
1d757 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 ite3_mutex_leave
1d758 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0d 0a 20 20 (mutexOpen);..
1d759 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 sqli
1d75a 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 te3_free(zFullPa
1d75b 74 68 6e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 thname);..
1d75c 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
1d75d 66 72 65 65 28 70 29 3b 0d 0a 20 20 20 20 20 20 free(p);..
1d75e 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
1d75f 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
1d760 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d ;.. }
1d761 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 .. }..
1d762 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 p->pBt
1d763 3d 20 70 42 74 3b 0d 0a 20 20 20 20 20 20 20 20 = pBt;..
1d764 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0d 0a pBt->nRef++;..
1d765 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
1d766 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
1d767 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c 69 }.. sqli
1d768 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
1d769 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0d 0a 20 mutexShared);..
1d76a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
1d76b 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 e(zFullPathname)
1d76c 3b 0d 0a 20 20 20 20 7d 0d 0a 23 69 66 64 65 66 ;.. }..#ifdef
1d76d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 SQLITE_DEBUG..
1d76e 20 20 20 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 else{..
1d76f 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 /* In debug mode
1d770 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 , we mark all pe
1d771 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 rsistent databas
1d772 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0d 0a es as sharable..
1d773 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 ** even wh
1d774 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e en they are not.
1d775 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 This exercises
1d776 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 the locking cod
1d777 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 2a 2a 20 e and.. **
1d778 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 gives more oppor
1d779 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 tunity for asser
1d77a 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 ts(sqlite3_mutex
1d77b 5f 68 65 6c 64 28 29 29 0d 0a 20 20 20 20 20 20 _held())..
1d77c 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f ** statements to
1d77d 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 find locking pr
1d77e 6f 62 6c 65 6d 73 2e 0d 0a 20 20 20 20 20 20 2a oblems... *
1d77f 2f 0d 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 /.. p->shar
1d780 61 62 6c 65 20 3d 20 31 3b 0d 0a 20 20 20 20 7d able = 1;.. }
1d781 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 23 ..#endif.. }..#
1d782 65 6e 64 69 66 0d 0a 20 20 69 66 28 20 70 42 74 endif.. if( pBt
1d783 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 0d 0a ==0 ){.. /*..
1d784 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ** The follo
1d785 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b wing asserts mak
1d786 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 e sure that stru
1d787 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 ctures used by t
1d788 68 65 20 62 74 72 65 65 20 61 72 65 0d 0a 20 20 he btree are..
1d789 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 ** the right s
1d78a 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f ize. This is to
1d78b 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 guard against s
1d78c 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 ize changes that
1d78d 20 72 65 73 75 6c 74 0d 0a 20 20 20 20 2a 2a 20 result.. **
1d78e 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f when compiling o
1d78f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 n a different ar
1d790 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 chitecture...
1d791 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 */.. assert(
1d792 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 sizeof(i64)==8
1d793 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d || sizeof(i64)==
1d794 34 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 4 );.. assert
1d795 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 ( sizeof(u64)==8
1d796 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d || sizeof(u64)=
1d797 3d 34 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 =4 );.. asser
1d798 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d t( sizeof(u32)==
1d799 34 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 4 );.. assert
1d79a 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 ( sizeof(u16)==2
1d79b 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
1d79c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 sizeof(Pgno)==4
1d79d 20 29 3b 0d 0a 20 20 0d 0a 20 20 20 20 70 42 74 );.. .. pBt
1d79e 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 = sqlite3Malloc
1d79f 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 Zero( sizeof(*pB
1d7a0 74 29 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 t) );.. if( p
1d7a1 42 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 Bt==0 ){..
1d7a2 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 rc = SQLITE_NOME
1d7a3 4d 3b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 M;.. goto b
1d7a4 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0d 0a tree_open_out;..
1d7a5 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 }.. rc =
1d7a6 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e sqlite3PagerOpen
1d7a7 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 (pVfs, &pBt->pPa
1d7a8 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0d ger, zFilename,.
1d7a9 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1d7aa 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 EXTRA
1d7ab 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 _SIZE, flags, vf
1d7ac 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e sFlags, pageRein
1d7ad 69 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 it);.. if( rc
1d7ae 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1d7af 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
1d7b0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 e3PagerReadFileh
1d7b1 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 eader(pBt->pPage
1d7b2 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 r,sizeof(zDbHead
1d7b3 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0d er),zDbHeader);.
1d7b4 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
1d7b5 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
1d7b6 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 .. goto btr
1d7b7 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0d 0a 20 20 ee_open_out;..
1d7b8 20 20 7d 0d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 }.. pBt->op
1d7b9 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c enFlags = (u8)fl
1d7ba 61 67 73 3b 0d 0a 20 20 20 20 70 42 74 2d 3e 64 ags;.. pBt->d
1d7bb 62 20 3d 20 64 62 3b 0d 0a 20 20 20 20 73 71 6c b = db;.. sql
1d7bc 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 ite3PagerSetBusy
1d7bd 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 handler(pBt->pPa
1d7be 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 ger, btreeInvoke
1d7bf 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 BusyHandler, pBt
1d7c0 29 3b 0d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d );.. p->pBt =
1d7c1 20 70 42 74 3b 0d 0a 20 20 0d 0a 20 20 20 20 70 pBt;.. .. p
1d7c2 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b Bt->pCursor = 0;
1d7c3 0d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 .. pBt->pPage
1d7c4 31 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 1 = 0;.. if(
1d7c5 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 sqlite3PagerIsre
1d7c6 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 adonly(pBt->pPag
1d7c7 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c er) ) pBt->btsFl
1d7c8 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f ags |= BTS_READ_
1d7c9 4f 4e 4c 59 3b 0d 0a 23 69 66 64 65 66 20 53 51 ONLY;..#ifdef SQ
1d7ca 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 LITE_SECURE_DELE
1d7cb 54 45 0d 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 TE.. pBt->bts
1d7cc 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 Flags |= BTS_SEC
1d7cd 55 52 45 5f 44 45 4c 45 54 45 3b 0d 0a 23 65 6e URE_DELETE;..#en
1d7ce 64 69 66 0d 0a 20 20 20 20 70 42 74 2d 3e 70 61 dif.. pBt->pa
1d7cf 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 geSize = (zDbHea
1d7d0 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a der[16]<<8) | (z
1d7d1 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 DbHeader[17]<<16
1d7d2 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 42 74 2d );.. if( pBt-
1d7d3 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c >pageSize<512 ||
1d7d4 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 pBt->pageSize>S
1d7d5 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 QLITE_MAX_PAGE_S
1d7d6 49 5a 45 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c IZE.. ||
1d7d7 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 ((pBt->pageSize
1d7d8 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a -1)&pBt->pageSiz
1d7d9 65 29 21 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 e)!=0 ){..
1d7da 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 pBt->pageSize =
1d7db 30 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 0;..#ifndef SQLI
1d7dc 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 TE_OMIT_AUTOVACU
1d7dd 55 4d 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 UM.. /* If
1d7de 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 the magic name "
1d7df 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 :memory:" will c
1d7e0 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f reate an in-memo
1d7e1 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 ry database, the
1d7e2 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 n.. ** leav
1d7e3 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d e the autoVacuum
1d7e4 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e mode at 0 (do n
1d7e5 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c ot auto-vacuum),
1d7e6 20 65 76 65 6e 20 69 66 0d 0a 20 20 20 20 20 20 even if..
1d7e7 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ** SQLITE_DEFAUL
1d7e8 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 T_AUTOVACUUM is
1d7e9 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 true. On the oth
1d7ea 65 72 20 68 61 6e 64 2c 20 69 66 0d 0a 20 20 20 er hand, if..
1d7eb 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 ** SQLITE_OMI
1d7ec 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 T_MEMORYDB has b
1d7ed 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 een defined, the
1d7ee 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 n ":memory:" is
1d7ef 6a 75 73 74 20 61 0d 0a 20 20 20 20 20 20 2a 2a just a.. **
1d7f0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 regular file-na
1d7f1 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 me. In this case
1d7f2 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d the auto-vacuum
1d7f3 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 applies as per
1d7f4 6e 6f 72 6d 61 6c 2e 0d 0a 20 20 20 20 20 20 2a normal... *
1d7f5 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 /.. if( zFi
1d7f6 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d lename && !isMem
1d7f7 64 62 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 db ){.. p
1d7f8 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d Bt->autoVacuum =
1d7f9 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 (SQLITE_DEFAULT
1d7fa 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 _AUTOVACUUM ? 1
1d7fb 3a 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 : 0);.. p
1d7fc 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d Bt->incrVacuum =
1d7fd 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 (SQLITE_DEFAULT
1d7fe 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f _AUTOVACUUM==2 ?
1d7ff 20 31 20 3a 20 30 29 3b 0d 0a 20 20 20 20 20 20 1 : 0);..
1d800 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 }..#endif..
1d801 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0d 0a nReserve = 0;..
1d802 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1d803 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 nReserve = zDb
1d804 48 65 61 64 65 72 5b 32 30 5d 3b 0d 0a 20 20 20 Header[20];..
1d805 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 pBt->btsFlags
1d806 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 |= BTS_PAGESIZE
1d807 5f 46 49 58 45 44 3b 0d 0a 23 69 66 6e 64 65 66 _FIXED;..#ifndef
1d808 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 SQLITE_OMIT_AUT
1d809 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 20 20 70 OVACUUM.. p
1d80a 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d Bt->autoVacuum =
1d80b 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 (get4byte(&zDbH
1d80c 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 eader[36 + 4*4])
1d80d 3f 31 3a 30 29 3b 0d 0a 20 20 20 20 20 20 70 42 ?1:0);.. pB
1d80e 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 t->incrVacuum =
1d80f 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 (get4byte(&zDbHe
1d810 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f ader[36 + 7*4])?
1d811 31 3a 30 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 1:0);..#endif..
1d812 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 73 }.. rc = s
1d813 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 qlite3PagerSetPa
1d814 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 gesize(pBt->pPag
1d815 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 er, &pBt->pageSi
1d816 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0d 0a ze, nReserve);..
1d817 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 if( rc ) got
1d818 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 o btree_open_out
1d819 3b 0d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 ;.. pBt->usab
1d81a 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 leSize = pBt->pa
1d81b 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 geSize - nReserv
1d81c 65 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 e;.. assert(
1d81d 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 (pBt->pageSize &
1d81e 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 7)==0 ); /* 8-
1d81f 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f byte alignment o
1d820 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0d 0a 20 f pageSize */..
1d821 20 20 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 ..#if !defined
1d822 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 (SQLITE_OMIT_SHA
1d823 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 RED_CACHE) && !d
1d824 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
1d825 49 54 5f 44 49 53 4b 49 4f 29 0d 0a 20 20 20 20 IT_DISKIO)..
1d826 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 /* Add the new B
1d827 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 tShared object t
1d828 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 o the linked lis
1d829 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 t sharable BtSha
1d82a 72 65 64 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 reds... */..
1d82b 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 if( p->sharab
1d82c 6c 65 20 29 7b 0d 0a 20 20 20 20 20 20 4d 55 54 le ){.. MUT
1d82d 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 EX_LOGIC( sqlite
1d82e 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 3_mutex *mutexSh
1d82f 61 72 65 64 3b 20 29 0d 0a 20 20 20 20 20 20 70 ared; ).. p
1d830 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0d 0a 20 Bt->nRef = 1;..
1d831 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 MUTEX_LOGIC
1d832 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 ( mutexShared =
1d833 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f sqlite3MutexAllo
1d834 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 c(SQLITE_MUTEX_S
1d835 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0d TATIC_MASTER);).
1d836 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 . if( SQLIT
1d837 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 E_THREADSAFE &&
1d838 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
1d839 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 fig.bCoreMutex )
1d83a 7b 0d 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e {.. pBt->
1d83b 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d mutex = sqlite3M
1d83c 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 utexAlloc(SQLITE
1d83d 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0d 0a 20 _MUTEX_FAST);..
1d83e 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e if( pBt->
1d83f 6d 75 74 65 78 3d 3d 30 20 29 7b 0d 0a 20 20 20 mutex==0 ){..
1d840 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
1d841 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 TE_NOMEM;..
1d842 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 db->mallocF
1d843 61 69 6c 65 64 20 3d 20 30 3b 0d 0a 20 20 20 20 ailed = 0;..
1d844 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 goto btree
1d845 5f 6f 70 65 6e 5f 6f 75 74 3b 0d 0a 20 20 20 20 _open_out;..
1d846 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a }.. }..
1d847 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 sqlite3_mu
1d848 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 tex_enter(mutexS
1d849 68 61 72 65 64 29 3b 0d 0a 20 20 20 20 20 20 70 hared);.. p
1d84a 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 Bt->pNext = GLOB
1d84b 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c AL(BtShared*,sql
1d84c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c ite3SharedCacheL
1d84d 69 73 74 29 3b 0d 0a 20 20 20 20 20 20 47 4c 4f ist);.. GLO
1d84e 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 BAL(BtShared*,sq
1d84f 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 lite3SharedCache
1d850 4c 69 73 74 29 20 3d 20 70 42 74 3b 0d 0a 20 20 List) = pBt;..
1d851 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 sqlite3_mute
1d852 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 x_leave(mutexSha
1d853 72 65 64 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 red);.. }..#e
1d854 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 23 69 66 ndif.. }....#if
1d855 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
1d856 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 _OMIT_SHARED_CAC
1d857 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 HE) && !defined(
1d858 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b SQLITE_OMIT_DISK
1d859 49 4f 29 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 IO).. /* If the
1d85a 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 new Btree uses
1d85b 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 a sharable pBtSh
1d85c 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 ared, then link
1d85d 74 68 65 20 6e 65 77 0d 0a 20 20 2a 2a 20 42 74 the new.. ** Bt
1d85e 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 ree into the lis
1d85f 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c t of all sharabl
1d860 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 e Btrees for the
1d861 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e same connection
1d862 2e 0d 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 ... ** The list
1d863 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 is kept in asce
1d864 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 nding order by p
1d865 42 74 20 61 64 64 72 65 73 73 2e 0d 0a 20 20 2a Bt address... *
1d866 2f 0d 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 /.. if( p->shar
1d867 61 62 6c 65 20 29 7b 0d 0a 20 20 20 20 69 6e 74 able ){.. int
1d868 20 69 3b 0d 0a 20 20 20 20 42 74 72 65 65 20 2a i;.. Btree *
1d869 70 53 69 62 3b 0d 0a 20 20 20 20 66 6f 72 28 69 pSib;.. for(i
1d86a 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
1d86b 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 ++){.. if(
1d86c 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b (pSib = db->aDb[
1d86d 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 i].pBt)!=0 && pS
1d86e 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0d ib->sharable ){.
1d86f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 . while(
1d870 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 pSib->pPrev ){ p
1d871 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 Sib = pSib->pPre
1d872 76 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 v; }.. if
1d873 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 ( p->pBt<pSib->p
1d874 42 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 Bt ){..
1d875 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 p->pNext = pSib
1d876 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e ;.. p->
1d877 70 50 72 65 76 20 3d 20 30 3b 0d 0a 20 20 20 20 pPrev = 0;..
1d878 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 pSib->pPre
1d879 76 20 3d 20 70 3b 0d 0a 20 20 20 20 20 20 20 20 v = p;..
1d87a 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
1d87b 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 while( pSib->p
1d87c 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e Next && pSib->pN
1d87d 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 ext->pBt<p->pBt
1d87e 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){..
1d87f 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 pSib = pSib->pNe
1d880 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d xt;.. }
1d881 0d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 .. p->p
1d882 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 Next = pSib->pNe
1d883 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 xt;.. p
1d884 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0d ->pPrev = pSib;.
1d885 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 . if( p
1d886 2d 3e 70 4e 65 78 74 20 29 7b 0d 0a 20 20 20 20 ->pNext ){..
1d887 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 p->pNext
1d888 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0d 0a 20 20 ->pPrev = p;..
1d889 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
1d88a 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 pSib->pNext
1d88b 20 3d 20 70 3b 0d 0a 20 20 20 20 20 20 20 20 7d = p;.. }
1d88c 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b .. break;
1d88d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
1d88e 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 .. }..#endif..
1d88f 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0d 0a *ppBtree = p;..
1d890 0d 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 ..btree_open_out
1d891 3a 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c :.. if( rc!=SQL
1d892 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 ITE_OK ){.. i
1d893 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 f( pBt && pBt->p
1d894 50 61 67 65 72 20 29 7b 0d 0a 20 20 20 20 20 20 Pager ){..
1d895 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 sqlite3PagerClos
1d896 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0d e(pBt->pPager);.
1d897 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 . }.. sqli
1d898 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0d 0a te3_free(pBt);..
1d899 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
1d89a 28 70 29 3b 0d 0a 20 20 20 20 2a 70 70 42 74 72 (p);.. *ppBtr
1d89b 65 65 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 ee = 0;.. }else
1d89c 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 {.. /* If the
1d89d 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 B-Tree was succ
1d89e 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c essfully opened,
1d89f 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 set the pager-c
1d8a0 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 ache size to the
1d8a1 0d 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 .. ** default
1d8a2 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 value. Except,
1d8a3 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 when opening on
1d8a4 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 an existing shar
1d8a5 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0d ed pager-cache,.
1d8a6 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 . ** do not c
1d8a7 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d hange the pager-
1d8a8 63 61 63 68 65 20 73 69 7a 65 2e 0d 0a 20 20 20 cache size...
1d8a9 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 73 71 6c */.. if( sql
1d8aa 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 ite3BtreeSchema(
1d8ab 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0d 0a p, 0, 0)==0 ){..
1d8ac 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 sqlite3Pag
1d8ad 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 erSetCachesize(p
1d8ae 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 ->pBt->pPager, S
1d8af 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 QLITE_DEFAULT_CA
1d8b0 43 48 45 5f 53 49 5a 45 29 3b 0d 0a 20 20 20 20 CHE_SIZE);..
1d8b1 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 6d 75 }.. }.. if( mu
1d8b2 74 65 78 4f 70 65 6e 20 29 7b 0d 0a 20 20 20 20 texOpen ){..
1d8b3 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1d8b4 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 mutex_held(mutex
1d8b5 4f 70 65 6e 29 20 29 3b 0d 0a 20 20 20 20 73 71 Open) );.. sq
1d8b6 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 lite3_mutex_leav
1d8b7 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0d 0a 20 e(mutexOpen);..
1d8b8 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
1d8b9 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 ..}..../*..** De
1d8ba 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 crement the BtSh
1d8bb 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 ared.nRef counte
1d8bc 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 r. When it reac
1d8bd 68 65 73 20 7a 65 72 6f 2c 0d 0a 2a 2a 20 72 65 hes zero,..** re
1d8be 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 move the BtShare
1d8bf 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d d structure from
1d8c0 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 the sharing lis
1d8c1 74 2e 20 20 52 65 74 75 72 6e 0d 0a 2a 2a 20 74 t. Return..** t
1d8c2 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 rue if the BtSha
1d8c3 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 red.nRef counter
1d8c4 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e reaches zero an
1d8c5 64 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 66 61 6c d return..** fal
1d8c6 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c se if it is stil
1d8c7 6c 20 70 6f 73 69 74 69 76 65 2e 0d 0a 2a 2f 0d l positive...*/.
1d8c8 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f .static int remo
1d8c9 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 veFromSharingLis
1d8ca 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 t(BtShared *pBt)
1d8cb 7b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 {..#ifndef SQLIT
1d8cc 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 E_OMIT_SHARED_CA
1d8cd 43 48 45 0d 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 CHE.. MUTEX_LOG
1d8ce 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 IC( sqlite3_mute
1d8cf 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0d 0a 20 x *pMaster; )..
1d8d0 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 BtShared *pList
1d8d1 3b 0d 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 ;.. int removed
1d8d2 20 3d 20 30 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 = 0;.... asser
1d8d3 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 t( sqlite3_mutex
1d8d4 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 _notheld(pBt->mu
1d8d5 74 65 78 29 20 29 3b 0d 0a 20 20 4d 55 54 45 58 tex) );.. MUTEX
1d8d6 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 _LOGIC( pMaster
1d8d7 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c = sqlite3MutexAl
1d8d8 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
1d8d9 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b _STATIC_MASTER);
1d8da 20 29 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 ).. sqlite3_mu
1d8db 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 tex_enter(pMaste
1d8dc 72 29 3b 0d 0a 20 20 70 42 74 2d 3e 6e 52 65 66 r);.. pBt->nRef
1d8dd 2d 2d 3b 0d 0a 20 20 69 66 28 20 70 42 74 2d 3e --;.. if( pBt->
1d8de 6e 52 65 66 3c 3d 30 20 29 7b 0d 0a 20 20 20 20 nRef<=0 ){..
1d8df 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 if( GLOBAL(BtSha
1d8e0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 red*,sqlite3Shar
1d8e1 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 edCacheList)==pB
1d8e2 74 20 29 7b 0d 0a 20 20 20 20 20 20 47 4c 4f 42 t ){.. GLOB
1d8e3 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c AL(BtShared*,sql
1d8e4 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c ite3SharedCacheL
1d8e5 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 ist) = pBt->pNex
1d8e6 74 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a t;.. }else{..
1d8e7 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c pList = GL
1d8e8 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 OBAL(BtShared*,s
1d8e9 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 qlite3SharedCach
1d8ea 65 4c 69 73 74 29 3b 0d 0a 20 20 20 20 20 20 77 eList);.. w
1d8eb 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 hile( ALWAYS(pLi
1d8ec 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e st) && pList->pN
1d8ed 65 78 74 21 3d 70 42 74 20 29 7b 0d 0a 20 20 20 ext!=pBt ){..
1d8ee 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 pList=pList
1d8ef 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 ->pNext;..
1d8f0 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 }.. if( ALW
1d8f1 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0d 0a 20 AYS(pList) ){..
1d8f2 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e pList->pN
1d8f3 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 ext = pBt->pNext
1d8f4 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1d8f5 7d 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 }.. if( SQLIT
1d8f6 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0d E_THREADSAFE ){.
1d8f7 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d . sqlite3_m
1d8f8 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d utex_free(pBt->m
1d8f9 75 74 65 78 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 utex);.. }..
1d8fa 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0d removed = 1;.
1d8fb 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f . }.. sqlite3_
1d8fc 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 mutex_leave(pMas
1d8fd 74 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 ter);.. return
1d8fe 72 65 6d 6f 76 65 64 3b 0d 0a 23 65 6c 73 65 0d removed;..#else.
1d8ff 0a 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 23 65 . return 1;..#e
1d900 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a ndif..}..../*..*
1d901 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d * Make sure pBt-
1d902 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 >pTmpSpace point
1d903 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 s to an allocati
1d904 6f 6e 20 6f 66 20 0d 0a 2a 2a 20 4d 58 5f 43 45 on of ..** MX_CE
1d905 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 LL_SIZE(pBt) byt
1d906 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 es...*/..static
1d907 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d void allocateTem
1d908 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 pSpace(BtShared
1d909 2a 70 42 74 29 7b 0d 0a 20 20 69 66 28 20 21 70 *pBt){.. if( !p
1d90a 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b Bt->pTmpSpace ){
1d90b 0d 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 .. pBt->pTmpS
1d90c 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 pace = sqlite3Pa
1d90d 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 geMalloc( pBt->p
1d90e 61 67 65 53 69 7a 65 20 29 3b 0d 0a 20 20 7d 0d ageSize );.. }.
1d90f 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 .}..../*..** Fre
1d910 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 e the pBt->pTmpS
1d911 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0d pace allocation.
1d912 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
1d913 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 freeTempSpace(B
1d914 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0d 0a tShared *pBt){..
1d915 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 sqlite3PageFre
1d916 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 e( pBt->pTmpSpac
1d917 65 29 3b 0d 0a 20 20 70 42 74 2d 3e 70 54 6d 70 e);.. pBt->pTmp
1d918 53 70 61 63 65 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d Space = 0;..}...
1d919 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e ./*..** Close an
1d91a 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 open database a
1d91b 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c nd invalidate al
1d91c 6c 20 63 75 72 73 6f 72 73 2e 0d 0a 2a 2f 0d 0a l cursors...*/..
1d91d 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
1d91e 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 nt sqlite3BtreeC
1d91f 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0d lose(Btree *p){.
1d920 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 . BtShared *pBt
1d921 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 42 74 = p->pBt;.. Bt
1d922 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0d 0a 0d Cursor *pCur;...
1d923 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 . /* Close all
1d924 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 cursors opened v
1d925 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 ia this handle.
1d926 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 73 */.. assert( s
1d927 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1d928 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 d(p->db->mutex)
1d929 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 );.. sqlite3Btr
1d92a 65 65 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 70 eeEnter(p);.. p
1d92b 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 Cur = pBt->pCurs
1d92c 6f 72 3b 0d 0a 20 20 77 68 69 6c 65 28 20 70 43 or;.. while( pC
1d92d 75 72 20 29 7b 0d 0a 20 20 20 20 42 74 43 75 72 ur ){.. BtCur
1d92e 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 sor *pTmp = pCur
1d92f 3b 0d 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 ;.. pCur = pC
1d930 75 72 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 20 ur->pNext;..
1d931 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 if( pTmp->pBtree
1d932 3d 3d 70 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 ==p ){.. sq
1d933 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 lite3BtreeCloseC
1d934 75 72 73 6f 72 28 70 54 6d 70 29 3b 0d 0a 20 20 ursor(pTmp);..
1d935 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a }.. }.... /*
1d936 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 Rollback any ac
1d937 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e tive transaction
1d938 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 and free the ha
1d939 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0d ndle structure..
1d93a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 . ** The call t
1d93b 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f o sqlite3BtreeRo
1d93c 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 llback() drops a
1d93d 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 ny table-locks h
1d93e 65 6c 64 20 62 79 0d 0a 20 20 2a 2a 20 74 68 69 eld by.. ** thi
1d93f 73 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 2a 2f 0d s handle... */.
1d940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 . sqlite3BtreeR
1d941 6f 6c 6c 62 61 63 6b 28 70 29 3b 0d 0a 20 20 73 ollback(p);.. s
1d942 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
1d943 28 70 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 (p);.... /* If
1d944 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 there are still
1d945 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e other outstandin
1d946 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 g references to
1d947 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 the shared-btree
1d948 0d 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 .. ** structure
1d949 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 , return now. Th
1d94a 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 e remainder of t
1d94b 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c his procedure cl
1d94c 65 61 6e 73 20 0d 0a 20 20 2a 2a 20 75 70 20 74 eans .. ** up t
1d94d 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e he shared-btree.
1d94e 0d 0a 20 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 .. */.. assert
1d94f 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d ( p->wantToLock=
1d950 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d =0 && p->locked=
1d951 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 21 70 2d =0 );.. if( !p-
1d952 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d >sharable || rem
1d953 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 oveFromSharingLi
1d954 73 74 28 70 42 74 29 20 29 7b 0d 0a 20 20 20 20 st(pBt) ){..
1d955 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f /* The pBt is no
1d956 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 longer on the s
1d957 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 haring list, so
1d958 77 65 20 63 61 6e 20 61 63 63 65 73 73 0d 0a 20 we can access..
1d959 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 ** it without
1d95a 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 having to hold
1d95b 74 68 65 20 6d 75 74 65 78 2e 0d 0a 20 20 20 20 the mutex...
1d95c 2a 2a 0d 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e **.. ** Clean
1d95d 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 out and delete
1d95e 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a the BtShared obj
1d95f 65 63 74 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 ect... */..
1d960 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e assert( !pBt->
1d961 70 43 75 72 73 6f 72 20 29 3b 0d 0a 20 20 20 20 pCursor );..
1d962 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 sqlite3PagerClos
1d963 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0d e(pBt->pPager);.
1d964 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 . if( pBt->xF
1d965 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 reeSchema && pBt
1d966 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0d 0a 20 20 ->pSchema ){..
1d967 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 pBt->xFreeSc
1d968 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d hema(pBt->pSchem
1d969 61 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 a);.. }..
1d96a 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c sqlite3DbFree(0,
1d96b 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0d pBt->pSchema);.
1d96c 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 . freeTempSpa
1d96d 63 65 28 70 42 74 29 3b 0d 0a 20 20 20 20 73 71 ce(pBt);.. sq
1d96e 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b lite3_free(pBt);
1d96f 0d 0a 20 20 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 .. }....#ifndef
1d970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 SQLITE_OMIT_SHA
1d971 52 45 44 5f 43 41 43 48 45 0d 0a 20 20 61 73 73 RED_CACHE.. ass
1d972 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f ert( p->wantToLo
1d973 63 6b 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 ck==0 );.. asse
1d974 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 rt( p->locked==0
1d975 20 29 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 70 50 );.. if( p->pP
1d976 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e rev ) p->pPrev->
1d977 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 pNext = p->pNext
1d978 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 ;.. if( p->pNex
1d979 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 t ) p->pNext->pP
1d97a 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0d rev = p->pPrev;.
1d97b 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 73 71 6c .#endif.... sql
1d97c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20 ite3_free(p);..
1d97d 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1d97e 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 K;..}..../*..**
1d97f 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 Change the limit
1d980 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f on the number o
1d981 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 f pages allowed
1d982 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0d 0a 2a in the cache...*
1d983 2a 0d 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 *..** The maximu
1d984 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 m number of cach
1d985 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74 e pages is set t
1d986 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0d 0a o the absolute..
1d987 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 ** value of mxPa
1d988 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 ge. If mxPage i
1d989 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 s negative, the
1d98a 70 61 67 65 72 20 77 69 6c 6c 0d 0a 2a 2a 20 6f pager will..** o
1d98b 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e perate asynchron
1d98c 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 ously - it will
1d98d 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 not stop to do f
1d98e 73 79 6e 63 28 29 73 0d 0a 2a 2a 20 74 6f 20 69 sync()s..** to i
1d98f 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 nsure data is wr
1d990 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 itten to the dis
1d991 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 k surface before
1d992 0d 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e ..** continuing.
1d993 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 Transactions s
1d994 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e till work if syn
1d995 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c chronous is off,
1d996 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 ..** and the dat
1d997 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 abase cannot be
1d998 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 corrupted if thi
1d999 73 20 70 72 6f 67 72 61 6d 0d 0a 2a 2a 20 63 72 s program..** cr
1d99a 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 ashes. But if t
1d99b 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 he operating sys
1d99c 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 tem crashes or t
1d99d 68 65 72 65 20 69 73 0d 0a 2a 2a 20 61 6e 20 61 here is..** an a
1d99e 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c brupt power fail
1d99f 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f ure when synchro
1d9a0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 nous is off, the
1d9a1 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 6f database..** co
1d9a2 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 uld be left in a
1d9a3 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 n inconsistent a
1d9a4 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 nd unrecoverable
1d9a5 20 73 74 61 74 65 2e 0d 0a 2a 2a 20 53 79 6e 63 state...** Sync
1d9a6 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 hronous is on by
1d9a7 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 default so data
1d9a8 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 base corruption
1d9a9 69 73 20 6e 6f 74 0d 0a 2a 2a 20 6e 6f 72 6d 61 is not..** norma
1d9aa 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0d 0a 2a 2f lly a worry...*/
1d9ab 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1d9ac 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
1d9ad 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 eSetCacheSize(Bt
1d9ae 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 ree *p, int mxPa
1d9af 67 65 29 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 ge){.. BtShared
1d9b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0d *pBt = p->pBt;.
1d9b1 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1d9b2 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d e3_mutex_held(p-
1d9b3 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a >db->mutex) );..
1d9b4 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e sqlite3BtreeEn
1d9b5 74 65 72 28 70 29 3b 0d 0a 20 20 73 71 6c 69 74 ter(p);.. sqlit
1d9b6 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 e3PagerSetCaches
1d9b7 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c ize(pBt->pPager,
1d9b8 20 6d 78 50 61 67 65 29 3b 0d 0a 20 20 73 71 6c mxPage);.. sql
1d9b9 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 ite3BtreeLeave(p
1d9ba 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c );.. return SQL
1d9bb 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
1d9bc 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 ..** Change the
1d9bd 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 way data is sync
1d9be 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 ed to disk in or
1d9bf 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 der to increase
1d9c0 6f 72 20 64 65 63 72 65 61 73 65 0d 0a 2a 2a 20 or decrease..**
1d9c1 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 how well the dat
1d9c2 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 abase resists da
1d9c3 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 mage due to OS c
1d9c4 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 rashes and power
1d9c5 0d 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 ..** failures.
1d9c6 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 Level 1 is the s
1d9c7 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e ame as asynchron
1d9c8 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 ous (no syncs()
1d9c9 6f 63 63 75 72 20 61 6e 64 0d 0a 2a 2a 20 74 68 occur and..** th
1d9ca 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 ere is a high pr
1d9cb 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d obability of dam
1d9cc 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 age) Level 2 is
1d9cd 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 the default. T
1d9ce 68 65 72 65 0d 0a 2a 2a 20 69 73 20 61 20 76 65 here..** is a ve
1d9cf 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a ry low but non-z
1d9d0 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 ero probability
1d9d1 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 of damage. Leve
1d9d2 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0d l 3 reduces the.
1d9d3 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 .** probability
1d9d4 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 of damage to nea
1d9d5 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 r zero but with
1d9d6 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 a write performa
1d9d7 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0d 0a nce reduction...
1d9d8 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
1d9d9 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 TE_OMIT_PAGER_PR
1d9da 41 47 4d 41 53 0d 0a 53 51 4c 49 54 45 5f 50 52 AGMAS..SQLITE_PR
1d9db 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
1d9dc 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 3BtreeSetSafetyL
1d9dd 65 76 65 6c 28 0d 0a 20 20 42 74 72 65 65 20 2a evel(.. Btree *
1d9de 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
1d9df 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 /* The btree to
1d9e0 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c set the safety l
1d9e1 65 76 65 6c 20 6f 6e 20 2a 2f 0d 0a 20 20 69 6e evel on */.. in
1d9e2 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 t level,
1d9e3 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 /* PRAGMA s
1d9e4 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f ynchronous. 1=O
1d9e5 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d FF, 2=NORMAL, 3=
1d9e6 46 55 4c 4c 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 FULL */.. int f
1d9e7 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20 20 20 20 ullSync,
1d9e8 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c /* PRAGMA full
1d9e9 66 73 79 6e 63 2e 20 2a 2f 0d 0a 20 20 69 6e 74 fsync. */.. int
1d9ea 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20 20 20 ckptFullSync
1d9eb 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68 /* PRAGMA ch
1d9ec 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 79 6e eckpoint_fullfyn
1d9ed 63 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 42 74 53 68 c */..){.. BtSh
1d9ee 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 ared *pBt = p->p
1d9ef 42 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 Bt;.. assert( s
1d9f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1d9f1 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 d(p->db->mutex)
1d9f2 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6c 65 );.. assert( le
1d9f3 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c vel>=1 && level<
1d9f4 3d 33 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 =3 );.. sqlite3
1d9f5 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0d 0a BtreeEnter(p);..
1d9f6 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 sqlite3PagerSe
1d9f7 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 tSafetyLevel(pBt
1d9f8 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c ->pPager, level,
1d9f9 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 fullSync, ckptF
1d9fa 75 6c 6c 53 79 6e 63 29 3b 0d 0a 20 20 73 71 6c ullSync);.. sql
1d9fb 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 ite3BtreeLeave(p
1d9fc 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c );.. return SQL
1d9fd 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 23 65 6e 64 ITE_OK;..}..#end
1d9fe 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 if..../*..** Ret
1d9ff 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 urn TRUE if the
1da00 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 given btree is s
1da01 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 et to safety lev
1da02 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0d el 1. In other.
1da03 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 .** words, retur
1da04 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e n TRUE if no syn
1da05 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 c() occurs on th
1da06 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0d 0a 2a e disk files...*
1da07 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
1da08 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
1da09 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 eeSyncDisabled(B
1da0a 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 42 74 53 tree *p){.. BtS
1da0b 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e hared *pBt = p->
1da0c 70 42 74 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d pBt;.. int rc;.
1da0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1da0e 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d e3_mutex_held(p-
1da0f 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 >db->mutex) );
1da10 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 .. sqlite3Btree
1da11 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 61 73 73 Enter(p);.. ass
1da12 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d ert( pBt && pBt-
1da13 3e 70 50 61 67 65 72 20 29 3b 0d 0a 20 20 72 63 >pPager );.. rc
1da14 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e = sqlite3PagerN
1da15 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 osync(pBt->pPage
1da16 72 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 r);.. sqlite3Bt
1da17 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a 20 20 reeLeave(p);..
1da18 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
1da19 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e 67 65 20 74 ./*..** Change t
1da1a 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 he default pages
1da1b 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 size and the nu
1da1c 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 mber of reserved
1da1d 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e bytes per page.
1da1e 0d 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 ..** Or, if the
1da1f 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c page size has al
1da20 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 ready been fixed
1da21 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
1da22 52 45 41 44 4f 4e 4c 59 20 0d 0a 2a 2a 20 77 69 READONLY ..** wi
1da23 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 thout changing a
1da24 6e 79 74 68 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a nything...**..**
1da25 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d The page size m
1da26 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f ust be a power o
1da27 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 f 2 between 512
1da28 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 and 65536. If t
1da29 68 65 20 70 61 67 65 0d 0a 2a 2a 20 73 69 7a 65 he page..** size
1da2a 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e supplied does n
1da2b 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e ot meet this con
1da2c 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 straint then the
1da2d 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f page size is no
1da2e 74 0d 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0d 0a t..** changed...
1da2f 2a 2a 0d 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 **..** Page size
1da30 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 s are constraine
1da31 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 d to be a power
1da32 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 of two so that t
1da33 68 65 20 72 65 67 69 6f 6e 0d 0a 2a 2a 20 6f 66 he region..** of
1da34 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1da35 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b le used for lock
1da36 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 ing (beginning a
1da37 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0d t PENDING_BYTE,.
1da38 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 .** the first by
1da39 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 te past the 1GB
1da3a 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 boundary, 0x4000
1da3b 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 0000) needs to o
1da3c 63 63 75 72 0d 0a 2a 2a 20 61 74 20 74 68 65 20 ccur..** at the
1da3d 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 beginning of a p
1da3e 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 age...**..** If
1da3f 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 parameter nReser
1da40 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 ve is less than
1da41 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e zero, then the n
1da42 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 umber of reserve
1da43 64 0d 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 d..** bytes per
1da44 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 page is left unc
1da45 68 61 6e 67 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 hanged...**..**
1da46 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 If the iFix!=0 t
1da47 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 hen the BTS_PAGE
1da48 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 SIZE_FIXED flag
1da49 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 is set so that t
1da4a 68 65 20 70 61 67 65 20 73 69 7a 65 0d 0a 2a 2a he page size..**
1da4b 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 and autovacuum
1da4c 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 mode can no long
1da4d 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0d 0a er be changed...
1da4e 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1da4f 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
1da50 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 reeSetPageSize(B
1da51 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 tree *p, int pag
1da52 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 eSize, int nRese
1da53 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0d rve, int iFix){.
1da54 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
1da55 54 45 5f 4f 4b 3b 0d 0a 20 20 42 74 53 68 61 72 TE_OK;.. BtShar
1da56 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 ed *pBt = p->pBt
1da57 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 ;.. assert( nRe
1da58 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 serve>=-1 && nRe
1da59 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0d 0a 20 serve<=255 );..
1da5a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
1da5b 65 72 28 70 29 3b 0d 0a 20 20 69 66 28 20 70 42 er(p);.. if( pB
1da5c 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 t->btsFlags & BT
1da5d 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 S_PAGESIZE_FIXED
1da5e 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 ){.. sqlite3
1da5f 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a BtreeLeave(p);..
1da60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1da61 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d 0a 20 20 7d E_READONLY;.. }
1da62 0d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 .. if( nReserve
1da63 3c 30 20 29 7b 0d 0a 20 20 20 20 6e 52 65 73 65 <0 ){.. nRese
1da64 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 rve = pBt->pageS
1da65 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c ize - pBt->usabl
1da66 65 53 69 7a 65 3b 0d 0a 20 20 7d 0d 0a 20 20 61 eSize;.. }.. a
1da67 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e ssert( nReserve>
1da68 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d =0 && nReserve<=
1da69 32 35 35 20 29 3b 0d 0a 20 20 69 66 28 20 70 61 255 );.. if( pa
1da6a 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 geSize>=512 && p
1da6b 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f ageSize<=SQLITE_
1da6c 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 MAX_PAGE_SIZE &&
1da6d 0d 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 .. ((page
1da6e 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 Size-1)&pageSize
1da6f 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 61 73 73 )==0 ){.. ass
1da70 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 ert( (pageSize &
1da71 20 37 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 61 7)==0 );.. a
1da72 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 ssert( !pBt->pPa
1da73 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 ge1 && !pBt->pCu
1da74 72 73 6f 72 20 29 3b 0d 0a 20 20 20 20 70 42 74 rsor );.. pBt
1da75 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 ->pageSize = (u3
1da76 32 29 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 20 2)pageSize;..
1da77 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 freeTempSpace(p
1da78 42 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 20 Bt);.. }.. rc
1da79 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 = sqlite3PagerSe
1da7a 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 tPagesize(pBt->p
1da7b 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 Pager, &pBt->pag
1da7c 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 eSize, nReserve)
1da7d 3b 0d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 ;.. pBt->usable
1da7e 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 Size = pBt->page
1da7f 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 Size - (u16)nRes
1da80 65 72 76 65 3b 0d 0a 20 20 69 66 28 20 69 46 69 erve;.. if( iFi
1da81 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 x ) pBt->btsFlag
1da82 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a s |= BTS_PAGESIZ
1da83 45 5f 46 49 58 45 44 3b 0d 0a 20 20 73 71 6c 69 E_FIXED;.. sqli
1da84 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 te3BtreeLeave(p)
1da85 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
1da86 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 .}..../*..** Ret
1da87 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c urn the currentl
1da88 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 y defined page s
1da89 69 7a 65 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ize..*/..SQLITE_
1da8a 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
1da8b 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 te3BtreeGetPageS
1da8c 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a ize(Btree *p){..
1da8d 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d return p->pBt-
1da8e 3e 70 61 67 65 53 69 7a 65 3b 0d 0a 7d 0d 0a 0d >pageSize;..}...
1da8f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 .#if !defined(SQ
1da90 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f LITE_OMIT_PAGER_
1da91 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 PRAGMAS) || !def
1da92 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
1da93 5f 56 41 43 55 55 4d 29 0d 0a 2f 2a 0d 0a 2a 2a _VACUUM)../*..**
1da94 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
1da95 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 er of bytes of s
1da96 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 pace at the end
1da97 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 of every page th
1da98 61 74 0d 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e at..** are inten
1da99 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 tually left unus
1da9a 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 ed. This is the
1da9b 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 "reserved" spac
1da9c 65 20 74 68 61 74 20 69 73 0d 0a 2a 2a 20 73 6f e that is..** so
1da9d 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 metimes used by
1da9e 65 78 74 65 6e 73 69 6f 6e 73 2e 0d 0a 2a 2f 0d extensions...*/.
1da9f 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
1daa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
1daa1 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 GetReserve(Btree
1daa2 20 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d *p){.. int n;.
1daa3 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 . sqlite3BtreeE
1daa4 6e 74 65 72 28 70 29 3b 0d 0a 20 20 6e 20 3d 20 nter(p);.. n =
1daa5 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 p->pBt->pageSize
1daa6 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c - p->pBt->usabl
1daa7 65 53 69 7a 65 3b 0d 0a 20 20 73 71 6c 69 74 65 eSize;.. sqlite
1daa8 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 3BtreeLeave(p);.
1daa9 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d . return n;..}.
1daaa 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 .../*..** Set th
1daab 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 e maximum page c
1daac 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 ount for a datab
1daad 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 ase if mxPage is
1daae 20 70 6f 73 69 74 69 76 65 2e 0d 0a 2a 2a 20 4e positive...** N
1daaf 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 o changes are ma
1dab0 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 de if mxPage is
1dab1 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0d 0a 0 or negative...
1dab2 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 ** Regardless of
1dab3 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 the value of mx
1dab4 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 Page, return the
1dab5 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f maximum page co
1dab6 75 6e 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 unt...*/..SQLITE
1dab7 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
1dab8 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 ite3BtreeMaxPage
1dab9 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 Count(Btree *p,
1daba 69 6e 74 20 6d 78 50 61 67 65 29 7b 0d 0a 20 20 int mxPage){..
1dabb 69 6e 74 20 6e 3b 0d 0a 20 20 73 71 6c 69 74 65 int n;.. sqlite
1dabc 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0d 3BtreeEnter(p);.
1dabd 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 . n = sqlite3Pa
1dabe 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 gerMaxPageCount(
1dabf 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 p->pBt->pPager,
1dac0 6d 78 50 61 67 65 29 3b 0d 0a 20 20 73 71 6c 69 mxPage);.. sqli
1dac1 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 te3BtreeLeave(p)
1dac2 3b 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a ;.. return n;..
1dac3 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 }..../*..** Set
1dac4 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 the BTS_SECURE_D
1dac5 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 ELETE flag if ne
1dac6 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e wFlag is 0 or 1.
1dac7 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 If newFlag is
1dac8 2d 31 2c 0d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b -1,..** then mak
1dac9 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 e no changes. A
1daca 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 lways return the
1dacb 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 value of the BT
1dacc 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0d S_SECURE_DELETE.
1dacd 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 .** setting afte
1dace 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0d 0a 2a r the change...*
1dacf 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
1dad0 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
1dad1 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 eeSecureDelete(B
1dad2 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 tree *p, int new
1dad3 46 6c 61 67 29 7b 0d 0a 20 20 69 6e 74 20 62 3b Flag){.. int b;
1dad4 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 .. if( p==0 ) r
1dad5 65 74 75 72 6e 20 30 3b 0d 0a 20 20 73 71 6c 69 eturn 0;.. sqli
1dad6 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 te3BtreeEnter(p)
1dad7 3b 0d 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 ;.. if( newFlag
1dad8 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 70 >=0 ){.. p->p
1dad9 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 Bt->btsFlags &=
1dada 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 ~BTS_SECURE_DELE
1dadb 54 45 3b 0d 0a 20 20 20 20 69 66 28 20 6e 65 77 TE;.. if( new
1dadc 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 Flag ) p->pBt->b
1dadd 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 tsFlags |= BTS_S
1dade 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0d 0a 20 ECURE_DELETE;..
1dadf 20 7d 20 0d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 } .. b = (p->p
1dae0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 Bt->btsFlags & B
1dae1 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 TS_SECURE_DELETE
1dae2 29 21 3d 30 3b 0d 0a 20 20 73 71 6c 69 74 65 33 )!=0;.. sqlite3
1dae3 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a BtreeLeave(p);..
1dae4 20 20 72 65 74 75 72 6e 20 62 3b 0d 0a 7d 0d 0a return b;..}..
1dae5 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e #endif /* !defin
1dae6 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 ed(SQLITE_OMIT_P
1dae7 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c AGER_PRAGMAS) ||
1dae8 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
1dae9 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f _OMIT_VACUUM) */
1daea 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e 67 ..../*..** Chang
1daeb 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 e the 'auto-vacu
1daec 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 um' property of
1daed 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 the database. If
1daee 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d the 'autoVacuum
1daef 27 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 '..** parameter
1daf0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 is non-zero, the
1daf1 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f n auto-vacuum mo
1daf2 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 de is enabled. I
1daf3 66 20 7a 65 72 6f 2c 20 69 74 0d 0a 2a 2a 20 69 f zero, it..** i
1daf4 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 s disabled. The
1daf5 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f default value fo
1daf6 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 r the auto-vacuu
1daf7 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0d 0a m property is ..
1daf8 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 ** determined by
1daf9 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 the SQLITE_DEFA
1dafa 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d ULT_AUTOVACUUM m
1dafb 61 63 72 6f 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 acro...*/..SQLIT
1dafc 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 E_PRIVATE int sq
1dafd 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 lite3BtreeSetAut
1dafe 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 oVacuum(Btree *p
1daff 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d , int autoVacuum
1db00 29 7b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ){..#ifdef SQLIT
1db01 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 E_OMIT_AUTOVACUU
1db02 4d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 M.. return SQLI
1db03 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d 0a 23 65 TE_READONLY;..#e
1db04 6c 73 65 0d 0a 20 20 42 74 53 68 61 72 65 64 20 lse.. BtShared
1db05 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a *pBt = p->pBt;..
1db06 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
1db07 45 5f 4f 4b 3b 0d 0a 20 20 75 38 20 61 76 20 3d E_OK;.. u8 av =
1db08 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b (u8)autoVacuum;
1db09 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 .... sqlite3Btr
1db0a 65 65 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 69 eeEnter(p);.. i
1db0b 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 f( (pBt->btsFlag
1db0c 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 s & BTS_PAGESIZE
1db0d 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 _FIXED)!=0 && (a
1db0e 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 v ?1:0)!=pBt->au
1db0f 74 6f 56 61 63 75 75 6d 20 29 7b 0d 0a 20 20 20 toVacuum ){..
1db10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 rc = SQLITE_REA
1db11 44 4f 4e 4c 59 3b 0d 0a 20 20 7d 65 6c 73 65 7b DONLY;.. }else{
1db12 0d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 .. pBt->autoV
1db13 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b acuum = av ?1:0;
1db14 0d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 .. pBt->incrV
1db15 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 acuum = av==2 ?1
1db16 3a 30 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 :0;.. }.. sqli
1db17 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 te3BtreeLeave(p)
1db18 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
1db19 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a .#endif..}..../*
1db1a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
1db1b 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 value of the 'au
1db1c 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 to-vacuum' prope
1db1d 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 rty. If auto-vac
1db1e 75 75 6d 20 69 73 20 0d 0a 2a 2a 20 65 6e 61 62 uum is ..** enab
1db1f 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 led 1 is returne
1db20 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0d d. Otherwise 0..
1db21 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
1db22 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 ATE int sqlite3B
1db23 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 treeGetAutoVacuu
1db24 6d 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 23 69 m(Btree *p){..#i
1db25 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
1db26 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 72 _AUTOVACUUM.. r
1db27 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f eturn BTREE_AUTO
1db28 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0d 0a 23 65 VACUUM_NONE;..#e
1db29 6c 73 65 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a lse.. int rc;..
1db2a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e sqlite3BtreeEn
1db2b 74 65 72 28 70 29 3b 0d 0a 20 20 72 63 20 3d 20 ter(p);.. rc =
1db2c 28 0d 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d (.. (!p->pBt-
1db2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 >autoVacuum)?BTR
1db2e 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f EE_AUTOVACUUM_NO
1db2f 4e 45 3a 0d 0a 20 20 20 20 28 21 70 2d 3e 70 42 NE:.. (!p->pB
1db30 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 t->incrVacuum)?B
1db31 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f TREE_AUTOVACUUM_
1db32 46 55 4c 4c 3a 0d 0a 20 20 20 20 42 54 52 45 45 FULL:.. BTREE
1db33 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 _AUTOVACUUM_INCR
1db34 0d 0a 20 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 .. );.. sqlite
1db35 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 3BtreeLeave(p);.
1db36 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 23 . return rc;..#
1db37 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a endif..}....../*
1db38 0d 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 ..** Get a refer
1db39 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f ence to pPage1 o
1db3a 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 f the database f
1db3b 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0d ile. This will.
1db3c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 .** also acquire
1db3d 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 a readlock on t
1db3e 68 61 74 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a hat file...**..*
1db3f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 * SQLITE_OK is r
1db40 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 eturned on succe
1db41 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 ss. If the file
1db42 20 69 73 20 6e 6f 74 20 61 0d 0a 2a 2a 20 77 65 is not a..** we
1db43 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 ll-formed databa
1db44 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 se file, then SQ
1db45 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 LITE_CORRUPT is
1db46 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 53 51 returned...** SQ
1db47 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 LITE_BUSY is ret
1db48 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 urned if the dat
1db49 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e abase is locked.
1db4a 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0d 0a SQLITE_NOMEM..
1db4b 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 ** is returned i
1db4c 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 f we run out of
1db4d 6d 65 6d 6f 72 79 2e 20 0d 0a 2a 2f 0d 0a 73 74 memory. ..*/..st
1db4e 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 atic int lockBtr
1db4f 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 ee(BtShared *pBt
1db50 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 ){.. int rc;
1db51 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
1db52 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 sult code from s
1db53 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a ubfunctions */..
1db54 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 MemPage *pPage
1db55 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 1; /* Page 1
1db56 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
1db57 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 file */.. int
1db58 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 nPage;
1db59 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
1db5a 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 ges in the datab
1db5b 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 ase */.. int nP
1db5c 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f ageFile = 0; /
1db5d 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 * Number of page
1db5e 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 s in the databas
1db5f 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 e file */.. int
1db60 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 nPageHeader;
1db61 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 /* Number of p
1db62 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 ages in the data
1db63 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 base according t
1db64 6f 20 68 64 72 20 2a 2f 0d 0a 0d 0a 20 20 61 73 o hdr */.... as
1db65 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
1db66 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 tex_held(pBt->mu
1db67 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
1db68 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d t( pBt->pPage1==
1db69 30 20 29 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 0 );.. rc = sql
1db6a 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c ite3PagerSharedL
1db6b 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 ock(pBt->pPager)
1db6c 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c ;.. if( rc!=SQL
1db6d 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 ITE_OK ) return
1db6e 72 63 3b 0d 0a 20 20 72 63 20 3d 20 62 74 72 65 rc;.. rc = btre
1db6f 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c eGetPage(pBt, 1,
1db70 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0d 0a 20 &pPage1, 0);..
1db71 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1db72 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d OK ) return rc;.
1db73 0a 0d 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 ... /* Do some
1db74 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 checking to help
1db75 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 insure the file
1db76 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c we opened reall
1db77 79 20 69 73 0d 0a 20 20 2a 2a 20 61 20 76 61 6c y is.. ** a val
1db78 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 id database file
1db79 2e 20 0d 0a 20 20 2a 2f 0d 0a 20 20 6e 50 61 67 . .. */.. nPag
1db7a 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 e = nPageHeader
1db7b 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 = get4byte(28+(u
1db7c 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 8*)pPage1->aData
1db7d 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 );.. sqlite3Pag
1db7e 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d erPagecount(pBt-
1db7f 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 >pPager, &nPageF
1db80 69 6c 65 29 3b 0d 0a 20 20 69 66 28 20 6e 50 61 ile);.. if( nPa
1db81 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 ge==0 || memcmp(
1db82 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 24+(u8*)pPage1->
1db83 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 aData, 92+(u8*)p
1db84 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 Page1->aData,4)!
1db85 3d 30 20 29 7b 0d 0a 20 20 20 20 6e 50 61 67 65 =0 ){.. nPage
1db86 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0d 0a 20 = nPageFile;..
1db87 20 7d 0d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e }.. if( nPage>
1db88 30 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 70 61 0 ){.. u32 pa
1db89 67 65 53 69 7a 65 3b 0d 0a 20 20 20 20 75 33 32 geSize;.. u32
1db8a 20 75 73 61 62 6c 65 53 69 7a 65 3b 0d 0a 20 20 usableSize;..
1db8b 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 u8 *page1 = pP
1db8c 61 67 65 31 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 age1->aData;..
1db8d 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f rc = SQLITE_NO
1db8e 54 41 44 42 3b 0d 0a 20 20 20 20 69 66 28 20 6d TADB;.. if( m
1db8f 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 emcmp(page1, zMa
1db90 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d gicHeader, 16)!=
1db91 30 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 0 ){.. goto
1db92 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c page1_init_fail
1db93 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 ed;.. }....#i
1db94 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
1db95 5f 57 41 4c 0d 0a 20 20 20 20 69 66 28 20 70 61 _WAL.. if( pa
1db96 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0d 0a 20 20 ge1[18]>1 ){..
1db97 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 pBt->btsFlag
1db98 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e s |= BTS_READ_ON
1db99 4c 59 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 LY;.. }..
1db9a 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 if( page1[19]>1
1db9b 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 ){.. goto p
1db9c 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 age1_init_failed
1db9d 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6c 73 65 0d ;.. }..#else.
1db9e 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 . if( page1[1
1db9f 38 5d 3e 32 20 29 7b 0d 0a 20 20 20 20 20 20 70 8]>2 ){.. p
1dba0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 Bt->btsFlags |=
1dba1 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0d 0a BTS_READ_ONLY;..
1dba2 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 }.. if( p
1dba3 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0d 0a 20 age1[19]>2 ){..
1dba4 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f goto page1_
1dba5 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0d 0a 20 20 init_failed;..
1dba6 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 }.... /* If
1dba7 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 the write versi
1dba8 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 on is set to 2,
1dba9 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 this database sh
1dbaa 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 ould be accessed
1dbab 0d 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 .. ** in WAL
1dbac 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 mode. If the log
1dbad 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 is not already
1dbae 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f open, open it no
1dbaf 77 2e 20 54 68 65 6e 20 0d 0a 20 20 20 20 2a 2a w. Then .. **
1dbb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1dbb1 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 K and return wit
1dbb2 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 hout populating
1dbb3 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e BtShared.pPage1.
1dbb4 0d 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c .. ** The cal
1dbb5 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 ler detects this
1dbb6 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 and calls this
1dbb7 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 function again.
1dbb8 54 68 69 73 20 69 73 0d 0a 20 20 20 20 2a 2a 20 This is.. **
1dbb9 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 required as the
1dbba 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 version of page
1dbbb 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 1 currently in t
1dbbc 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0d he page1 buffer.
1dbbd 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 . ** may not
1dbbe 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 be the latest ve
1dbbf 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 rsion - there ma
1dbc0 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 y be a newer one
1dbc1 20 69 6e 20 74 68 65 20 6c 6f 67 0d 0a 20 20 20 in the log..
1dbc2 20 2a 2a 20 66 69 6c 65 2e 0d 0a 20 20 20 20 2a ** file... *
1dbc3 2f 0d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 /.. if( page1
1dbc4 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d [19]==2 && (pBt-
1dbc5 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f >btsFlags & BTS_
1dbc6 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0d 0a 20 NO_WAL)==0 ){..
1dbc7 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 int isOpen
1dbc8 3d 20 30 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d = 0;.. rc =
1dbc9 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 sqlite3PagerOpe
1dbca 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 nWal(pBt->pPager
1dbcb 2c 20 26 69 73 4f 70 65 6e 29 3b 0d 0a 20 20 20 , &isOpen);..
1dbcc 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1dbcd 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
1dbce 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 goto page1_init
1dbcf 5f 66 61 69 6c 65 64 3b 0d 0a 20 20 20 20 20 20 _failed;..
1dbd0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e }else if( isOpen
1dbd1 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ==0 ){..
1dbd2 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 releasePage(pPag
1dbd3 65 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 e1);.. re
1dbd4 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
1dbd5 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1dbd6 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 rc = SQLITE_NOTA
1dbd7 44 42 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 DB;.. }..#end
1dbd8 69 66 0d 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 65 if.... /* The
1dbd9 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 maximum embedde
1dbda 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 d fraction must
1dbdb 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 be exactly 25%.
1dbdc 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d And the minimum
1dbdd 0d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 .. ** embedde
1dbde 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 d fraction must
1dbdf 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 be 12.5% for bot
1dbe0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 h leaf-data and
1dbe1 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0d 0a non-leaf-data...
1dbe2 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 ** The origi
1dbe3 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 nal design allow
1dbe4 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 ed these amounts
1dbe5 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 to vary, but as
1dbe6 20 6f 66 0d 0a 20 20 20 20 2a 2a 20 76 65 72 73 of.. ** vers
1dbe7 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 ion 3.6.0, we re
1dbe8 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 quire them to be
1dbe9 20 66 69 78 65 64 2e 0d 0a 20 20 20 20 2a 2f 0d fixed... */.
1dbea 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 . if( memcmp(
1dbeb 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 &page1[21], "\10
1dbec 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 0\040\040",3)!=0
1dbed 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 ){.. goto
1dbee 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 page1_init_faile
1dbef 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 d;.. }.. p
1dbf0 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 ageSize = (page1
1dbf1 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 [16]<<8) | (page
1dbf2 31 5b 31 37 5d 3c 3c 31 36 29 3b 0d 0a 20 20 20 1[17]<<16);..
1dbf3 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d if( ((pageSize-
1dbf4 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0d 1)&pageSize)!=0.
1dbf5 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a . || pageSiz
1dbf6 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 e>SQLITE_MAX_PAG
1dbf7 45 5f 53 49 5a 45 20 0d 0a 20 20 20 20 20 7c 7c E_SIZE .. ||
1dbf8 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0d pageSize<=256 .
1dbf9 0a 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 67 . ){.. g
1dbfa 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 oto page1_init_f
1dbfb 61 69 6c 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 ailed;.. }..
1dbfc 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 assert( (page
1dbfd 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0d Size & 7)==0 );.
1dbfe 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 . usableSize
1dbff 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 = pageSize - pag
1dc00 65 31 5b 32 30 5d 3b 0d 0a 20 20 20 20 69 66 28 e1[20];.. if(
1dc01 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d (u32)pageSize!=
1dc02 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b pBt->pageSize ){
1dc03 0d 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 .. /* After
1dc04 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 reading the fir
1dc05 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 st page of the d
1dc06 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 atabase assuming
1dc07 20 61 20 70 61 67 65 20 73 69 7a 65 0d 0a 20 20 a page size..
1dc08 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 ** of BtShar
1dc09 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 ed.pageSize, we
1dc0a 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 have discovered
1dc0b 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 that the page-si
1dc0c 7a 65 20 69 73 0d 0a 20 20 20 20 20 20 2a 2a 20 ze is.. **
1dc0d 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a actually pageSiz
1dc0e 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 e. Unlock the da
1dc0f 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 tabase, leave pB
1dc10 74 2d 3e 70 50 61 67 65 31 20 61 74 0d 0a 20 20 t->pPage1 at..
1dc11 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 ** zero and
1dc12 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1dc13 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c . The caller wil
1dc14 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 l call this func
1dc15 74 69 6f 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 61 tion.. ** a
1dc16 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f gain with the co
1dc17 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e rrect page-size.
1dc18 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 .. */..
1dc19 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 releasePage(pP
1dc1a 61 67 65 31 29 3b 0d 0a 20 20 20 20 20 20 70 42 age1);.. pB
1dc1b 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 t->usableSize =
1dc1c 75 73 61 62 6c 65 53 69 7a 65 3b 0d 0a 20 20 20 usableSize;..
1dc1d 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 pBt->pageSize
1dc1e 20 3d 20 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 = pageSize;..
1dc1f 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 freeTempSpac
1dc20 65 28 70 42 74 29 3b 0d 0a 20 20 20 20 20 20 72 e(pBt);.. r
1dc21 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 c = sqlite3Pager
1dc22 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d SetPagesize(pBt-
1dc23 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 >pPager, &pBt->p
1dc24 61 67 65 53 69 7a 65 2c 0d 0a 20 20 20 20 20 20 ageSize,..
1dc25 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dc26 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 pag
1dc27 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 eSize-usableSize
1dc28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e );.. return
1dc29 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 rc;.. }..
1dc2a 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 if( (pBt->db->f
1dc2b 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 lags & SQLITE_Re
1dc2c 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 coveryMode)==0 &
1dc2d 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c & nPage>nPageFil
1dc2e 65 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d e ){.. rc =
1dc2f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1dc30 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 67 6f 74 BKPT;.. got
1dc31 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 o page1_init_fai
1dc32 6c 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 led;.. }..
1dc33 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c if( usableSize<
1dc34 34 38 30 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 480 ){.. go
1dc35 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 to page1_init_fa
1dc36 69 6c 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 iled;.. }..
1dc37 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 pBt->pageSize
1dc38 3d 20 70 61 67 65 53 69 7a 65 3b 0d 0a 20 20 20 = pageSize;..
1dc39 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 pBt->usableSize
1dc3a 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0d 0a = usableSize;..
1dc3b 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
1dc3c 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a MIT_AUTOVACUUM..
1dc3d 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 pBt->autoVac
1dc3e 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 uum = (get4byte(
1dc3f 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d &page1[36 + 4*4]
1dc40 29 3f 31 3a 30 29 3b 0d 0a 20 20 20 20 70 42 74 )?1:0);.. pBt
1dc41 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 ->incrVacuum = (
1dc42 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b get4byte(&page1[
1dc43 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 36 + 7*4])?1:0);
1dc44 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d ..#endif.. }...
1dc45 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 . /* maxLocal i
1dc46 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d s the maximum am
1dc47 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 ount of payload
1dc48 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 to store locally
1dc49 20 66 6f 72 0d 0a 20 20 2a 2a 20 61 20 63 65 6c for.. ** a cel
1dc4a 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 l. Make sure it
1dc4b 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 is small enough
1dc4c 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 so that at leas
1dc4d 74 20 6d 69 6e 46 61 6e 6f 75 74 0d 0a 20 20 2a t minFanout.. *
1dc4e 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c * cells can will
1dc4f 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 fit on one page
1dc50 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 . We assume a 1
1dc51 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 0-byte page head
1dc52 65 72 2e 0d 0a 20 20 2a 2a 20 42 65 73 69 64 65 er... ** Beside
1dc53 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 s the payload, t
1dc54 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f he cell must sto
1dc55 72 65 3a 0d 0a 20 20 2a 2a 20 20 20 20 20 32 2d re:.. ** 2-
1dc56 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 byte pointer to
1dc57 74 68 65 20 63 65 6c 6c 0d 0a 20 20 2a 2a 20 20 the cell.. **
1dc58 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 4-byte child
1dc59 70 6f 69 6e 74 65 72 0d 0a 20 20 2a 2a 20 20 20 pointer.. **
1dc5a 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 9-byte nKey va
1dc5b 6c 75 65 0d 0a 20 20 2a 2a 20 20 20 20 20 34 2d lue.. ** 4-
1dc5c 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 byte nData value
1dc5d 0d 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 .. ** 4-byt
1dc5e 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 e overflow page
1dc5f 70 6f 69 6e 74 65 72 0d 0a 20 20 2a 2a 20 53 6f pointer.. ** So
1dc60 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 a cell consists
1dc61 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 of a 2-byte poi
1dc62 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 nter, a header w
1dc63 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 hich is as much
1dc64 61 73 0d 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 as.. ** 17 byte
1dc65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 s long, 0 to N b
1dc66 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c ytes of payload,
1dc67 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c and an optional
1dc68 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 4 byte overflow
1dc69 0d 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e .. ** page poin
1dc6a 74 65 72 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 70 42 ter... */.. pB
1dc6b 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 t->maxLocal = (u
1dc6c 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 16)((pBt->usable
1dc6d 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 Size-12)*64/255
1dc6e 2d 20 32 33 29 3b 0d 0a 20 20 70 42 74 2d 3e 6d - 23);.. pBt->m
1dc6f 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 inLocal = (u16)(
1dc70 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 (pBt->usableSize
1dc71 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 -12)*32/255 - 23
1dc72 29 3b 0d 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 );.. pBt->maxLe
1dc73 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e af = (u16)(pBt->
1dc74 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 usableSize - 35)
1dc75 3b 0d 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 ;.. pBt->minLea
1dc76 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e f = (u16)((pBt->
1dc77 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 usableSize-12)*3
1dc78 32 2f 32 35 35 20 2d 20 32 33 29 3b 0d 0a 20 20 2/255 - 23);..
1dc79 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 if( pBt->maxLoca
1dc7a 6c 3e 31 32 37 20 29 7b 0d 0a 20 20 20 20 70 42 l>127 ){.. pB
1dc7b 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f t->max1bytePaylo
1dc7c 61 64 20 3d 20 31 32 37 3b 0d 0a 20 20 7d 65 6c ad = 127;.. }el
1dc7d 73 65 7b 0d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 se{.. pBt->ma
1dc7e 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 x1bytePayload =
1dc7f 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 (u8)pBt->maxLoca
1dc80 6c 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 l;.. }.. asser
1dc81 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 t( pBt->maxLeaf
1dc82 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f + 23 <= MX_CELL_
1dc83 53 49 5a 45 28 70 42 74 29 20 29 3b 0d 0a 20 20 SIZE(pBt) );..
1dc84 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 pBt->pPage1 = pP
1dc85 61 67 65 31 3b 0d 0a 20 20 70 42 74 2d 3e 6e 50 age1;.. pBt->nP
1dc86 61 67 65 20 3d 20 6e 50 61 67 65 3b 0d 0a 20 20 age = nPage;..
1dc87 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1dc88 3b 0d 0a 0d 0a 70 61 67 65 31 5f 69 6e 69 74 5f ;....page1_init_
1dc89 66 61 69 6c 65 64 3a 0d 0a 20 20 72 65 6c 65 61 failed:.. relea
1dc8a 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0d sePage(pPage1);.
1dc8b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d . pBt->pPage1 =
1dc8c 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 0;.. return rc
1dc8d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 ;..}..../*..** I
1dc8e 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f f there are no o
1dc8f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f utstanding curso
1dc90 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f rs and we are no
1dc91 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0d t in the middle.
1dc92 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 .** of a transac
1dc93 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 tion but there i
1dc94 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e s a read lock on
1dc95 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 the database, t
1dc96 68 65 6e 0d 0a 2a 2a 20 74 68 69 73 20 72 6f 75 hen..** this rou
1dc97 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 tine unrefs the
1dc98 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 first page of th
1dc99 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
1dc9a 77 68 69 63 68 20 0d 0a 2a 2a 20 68 61 73 20 74 which ..** has t
1dc9b 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c he effect of rel
1dc9c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 easing the read
1dc9d 6c 6f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 lock...**..** If
1dc9e 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e there is a tran
1dc9f 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 saction in progr
1dca0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ess, this routin
1dca1 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a e is a no-op...*
1dca2 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 /..static void u
1dca3 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 nlockBtreeIfUnus
1dca4 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 ed(BtShared *pBt
1dca5 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 ){.. assert( sq
1dca6 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
1dca7 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d (pBt->mutex) );.
1dca8 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e . assert( pBt->
1dca9 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 pCursor==0 || pB
1dcaa 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e t->inTransaction
1dcab 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0d 0a >TRANS_NONE );..
1dcac 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 if( pBt->inTra
1dcad 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f nsaction==TRANS_
1dcae 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 NONE && pBt->pPa
1dcaf 67 65 31 21 3d 30 20 29 7b 0d 0a 20 20 20 20 61 ge1!=0 ){.. a
1dcb0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 ssert( pBt->pPag
1dcb1 65 31 2d 3e 61 44 61 74 61 20 29 3b 0d 0a 20 20 e1->aData );..
1dcb2 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1dcb3 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 3PagerRefcount(p
1dcb4 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 Bt->pPager)==1 )
1dcb5 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
1dcb6 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 Bt->pPage1->aDat
1dcb7 61 20 29 3b 0d 0a 20 20 20 20 72 65 6c 65 61 73 a );.. releas
1dcb8 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 ePage(pBt->pPage
1dcb9 31 29 3b 0d 0a 20 20 20 20 70 42 74 2d 3e 70 50 1);.. pBt->pP
1dcba 61 67 65 31 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a age1 = 0;.. }..
1dcbb 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 70 }..../*..** If p
1dcbc 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 Bt points to an
1dcbd 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 empty file then
1dcbe 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 convert that emp
1dcbf 74 79 20 66 69 6c 65 0d 0a 2a 2a 20 69 6e 74 6f ty file..** into
1dcc0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 a new empty dat
1dcc1 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c abase by initial
1dcc2 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 izing the first
1dcc3 70 61 67 65 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 page of..** the
1dcc4 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2f 0d 0a 73 database...*/..s
1dcc5 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 tatic int newDat
1dcc6 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a abase(BtShared *
1dcc7 70 42 74 29 7b 0d 0a 20 20 4d 65 6d 50 61 67 65 pBt){.. MemPage
1dcc8 20 2a 70 50 31 3b 0d 0a 20 20 75 6e 73 69 67 6e *pP1;.. unsign
1dcc9 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0d 0a ed char *data;..
1dcca 20 20 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 61 int rc;.... a
1dccb 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d ssert( sqlite3_m
1dccc 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d utex_held(pBt->m
1dccd 75 74 65 78 29 20 29 3b 0d 0a 20 20 69 66 28 20 utex) );.. if(
1dcce 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0d pBt->nPage>0 ){.
1dccf 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
1dcd0 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 70 TE_OK;.. }.. p
1dcd1 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 P1 = pBt->pPage1
1dcd2 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 ;.. assert( pP1
1dcd3 21 3d 30 20 29 3b 0d 0a 20 20 64 61 74 61 20 3d !=0 );.. data =
1dcd4 20 70 50 31 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 pP1->aData;..
1dcd5 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1dcd6 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 rWrite(pP1->pDbP
1dcd7 61 67 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 age);.. if( rc
1dcd8 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 ) return rc;..
1dcd9 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 memcpy(data, zMa
1dcda 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f gicHeader, sizeo
1dcdb 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 f(zMagicHeader))
1dcdc 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a ;.. assert( siz
1dcdd 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 eof(zMagicHeader
1dcde 29 3d 3d 31 36 20 29 3b 0d 0a 20 20 64 61 74 61 )==16 );.. data
1dcdf 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 [16] = (u8)((pBt
1dce0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 ->pageSize>>8)&0
1dce1 78 66 66 29 3b 0d 0a 20 20 64 61 74 61 5b 31 37 xff);.. data[17
1dce2 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 ] = (u8)((pBt->p
1dce3 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 ageSize>>16)&0xf
1dce4 66 29 3b 0d 0a 20 20 64 61 74 61 5b 31 38 5d 20 f);.. data[18]
1dce5 3d 20 31 3b 0d 0a 20 20 64 61 74 61 5b 31 39 5d = 1;.. data[19]
1dce6 20 3d 20 31 3b 0d 0a 20 20 61 73 73 65 72 74 28 = 1;.. assert(
1dce7 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 pBt->usableSize
1dce8 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 <=pBt->pageSize
1dce9 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 && pBt->usableSi
1dcea 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 ze+255>=pBt->pag
1dceb 65 53 69 7a 65 29 3b 0d 0a 20 20 64 61 74 61 5b eSize);.. data[
1dcec 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 20] = (u8)(pBt->
1dced 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e pageSize - pBt->
1dcee 75 73 61 62 6c 65 53 69 7a 65 29 3b 0d 0a 20 20 usableSize);..
1dcef 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0d 0a data[21] = 64;..
1dcf0 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b data[22] = 32;
1dcf1 0d 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 .. data[23] = 3
1dcf2 32 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 2;.. memset(&da
1dcf3 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 ta[24], 0, 100-2
1dcf4 34 29 3b 0d 0a 20 20 7a 65 72 6f 50 61 67 65 28 4);.. zeroPage(
1dcf5 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c pP1, PTF_INTKEY|
1dcf6 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 PTF_LEAF|PTF_LEA
1dcf7 46 44 41 54 41 20 29 3b 0d 0a 20 20 70 42 74 2d FDATA );.. pBt-
1dcf8 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 >btsFlags |= BTS
1dcf9 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b _PAGESIZE_FIXED;
1dcfa 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1dcfb 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d _OMIT_AUTOVACUUM
1dcfc 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d .. assert( pBt-
1dcfd 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c >autoVacuum==1 |
1dcfe 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 | pBt->autoVacuu
1dcff 6d 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 m==0 );.. asser
1dd00 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 t( pBt->incrVacu
1dd01 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e um==1 || pBt->in
1dd02 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0d 0a crVacuum==0 );..
1dd03 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 put4byte(&data
1dd04 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d [36 + 4*4], pBt-
1dd05 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0d 0a 20 >autoVacuum);..
1dd06 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b put4byte(&data[
1dd07 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 36 + 7*4], pBt->
1dd08 69 6e 63 72 56 61 63 75 75 6d 29 3b 0d 0a 23 65 incrVacuum);..#e
1dd09 6e 64 69 66 0d 0a 20 20 70 42 74 2d 3e 6e 50 61 ndif.. pBt->nPa
1dd0a 67 65 20 3d 20 31 3b 0d 0a 20 20 64 61 74 61 5b ge = 1;.. data[
1dd0b 33 31 5d 20 3d 20 31 3b 0d 0a 20 20 72 65 74 75 31] = 1;.. retu
1dd0c 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
1dd0d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 74 74 65 6d ..../*..** Attem
1dd0e 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 pt to start a ne
1dd0f 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 w transaction. A
1dd10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 write-transacti
1dd11 6f 6e 0d 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 on..** is starte
1dd12 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 d if the second
1dd13 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a argument is nonz
1dd14 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 ero, otherwise a
1dd15 20 72 65 61 64 2d 0d 0a 2a 2a 20 74 72 61 6e 73 read-..** trans
1dd16 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 action. If the
1dd17 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
1dd18 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 is 2 or more and
1dd19 20 65 78 63 6c 75 73 69 76 65 0d 0a 2a 2a 20 74 exclusive..** t
1dd1a 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 ransaction is st
1dd1b 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 arted, meaning t
1dd1c 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f hat no other pro
1dd1d 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0d cess is allowed.
1dd1e 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 .** to access th
1dd1f 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 e database. A p
1dd20 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 reexisting trans
1dd21 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 action may not b
1dd22 65 0d 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 e..** upgraded t
1dd23 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 o exclusive by c
1dd24 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 alling this rout
1dd25 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d ine a second tim
1dd26 65 20 2d 20 74 68 65 0d 0a 2a 2a 20 65 78 63 6c e - the..** excl
1dd27 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c usivity flag onl
1dd28 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 y works for a ne
1dd29 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a w transaction...
1dd2a 2a 2a 0d 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 **..** A write-t
1dd2b 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 ransaction must
1dd2c 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 be started befor
1dd2d 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 e attempting any
1dd2e 20 0d 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f ..** changes to
1dd2f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 the database.
1dd30 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c None of the foll
1dd31 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0d owing routines .
1dd32 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e .** will work un
1dd33 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 less a transacti
1dd34 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 on is started fi
1dd35 72 73 74 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 rst:..**..**
1dd36 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 sqlite3BtreeCr
1dd37 65 61 74 65 54 61 62 6c 65 28 29 0d 0a 2a 2a 20 eateTable()..**
1dd38 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 sqlite3Btre
1dd39 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0d 0a eCreateIndex()..
1dd3a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 ** sqlite3B
1dd3b 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 treeClearTable()
1dd3c 0d 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 ..** sqlite
1dd3d 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 3BtreeDropTable(
1dd3e 29 0d 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 )..** sqlit
1dd3f 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0d e3BtreeInsert().
1dd40 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 .** sqlite3
1dd41 42 74 72 65 65 44 65 6c 65 74 65 28 29 0d 0a 2a BtreeDelete()..*
1dd42 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 * sqlite3Bt
1dd43 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0d reeUpdateMeta().
1dd44 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 69 6e .**..** If an in
1dd45 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f itial attempt to
1dd46 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 acquire the loc
1dd47 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 k fails because
1dd48 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 of lock contenti
1dd49 6f 6e 0d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 on..** and the d
1dd4a 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 atabase was prev
1dd4b 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c iously unlocked,
1dd4c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 then invoke the
1dd4d 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0d 0a 2a busy handler..*
1dd4e 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e * if there is on
1dd4f 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 e. But if there
1dd50 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 was previously
1dd51 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 a read-lock, do
1dd52 6e 6f 74 0d 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 not..** invoke t
1dd53 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 he busy handler
1dd54 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 - just return SQ
1dd55 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 LITE_BUSY. SQLI
1dd56 54 45 5f 42 55 53 59 20 69 73 20 0d 0a 2a 2a 20 TE_BUSY is ..**
1dd57 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 returned when th
1dd58 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 ere is already a
1dd59 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 read-lock in or
1dd5a 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 der to avoid a d
1dd5b 65 61 64 6c 6f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a eadlock...**..**
1dd5c 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 Suppose there a
1dd5d 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 re two processes
1dd5e 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 A and B. A has
1dd5f 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 a read lock and
1dd60 20 42 20 68 61 73 0d 0a 2a 2a 20 61 20 72 65 73 B has..** a res
1dd61 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 erved lock. B t
1dd62 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 ries to promote
1dd63 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 to exclusive but
1dd64 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 is blocked beca
1dd65 75 73 65 0d 0a 2a 2a 20 6f 66 20 41 27 73 20 72 use..** of A's r
1dd66 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 ead lock. A tri
1dd67 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f es to promote to
1dd68 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 reserved but is
1dd69 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0d 0a blocked by B...
1dd6a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 ** One or the ot
1dd6b 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 her of the two p
1dd6c 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 rocesses must gi
1dd6d 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 ve way or there
1dd6e 63 61 6e 20 62 65 0d 0a 2a 2a 20 6e 6f 20 70 72 can be..** no pr
1dd6f 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 ogress. By retu
1dd70 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 rning SQLITE_BUS
1dd71 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 Y and not invoki
1dd72 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c ng the busy call
1dd73 62 61 63 6b 0d 0a 2a 2a 20 77 68 65 6e 20 41 20 back..** when A
1dd74 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 already has a re
1dd75 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f ad lock, we enco
1dd76 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 urage A to give
1dd77 75 70 20 61 6e 64 20 6c 65 74 20 42 0d 0a 2a 2a up and let B..**
1dd78 20 70 72 6f 63 65 65 64 2e 0d 0a 2a 2f 0d 0a 53 proceed...*/..S
1dd79 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1dd7a 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 t sqlite3BtreeBe
1dd7b 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a ginTrans(Btree *
1dd7c 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0d p, int wrflag){.
1dd7d 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f . sqlite3 *pBlo
1dd7e 63 6b 20 3d 20 30 3b 0d 0a 20 20 42 74 53 68 61 ck = 0;.. BtSha
1dd7f 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 red *pBt = p->pB
1dd80 74 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 t;.. int rc = S
1dd81 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 73 QLITE_OK;.... s
1dd82 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
1dd83 28 70 29 3b 0d 0a 20 20 62 74 72 65 65 49 6e 74 (p);.. btreeInt
1dd84 65 67 72 69 74 79 28 70 29 3b 0d 0a 0d 0a 20 20 egrity(p);....
1dd85 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 /* If the btree
1dd86 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 is already in a
1dd87 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f write-transactio
1dd88 6e 2c 20 6f 72 20 69 74 0d 0a 20 20 2a 2a 20 69 n, or it.. ** i
1dd89 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 s already in a r
1dd8a 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 ead-transaction
1dd8b 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 and a read-trans
1dd8c 61 63 74 69 6f 6e 0d 0a 20 20 2a 2a 20 69 73 20 action.. ** is
1dd8d 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 requested, this
1dd8e 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 20 20 2a is a no-op... *
1dd8f 2f 0d 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 /.. if( p->inTr
1dd90 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 ans==TRANS_WRITE
1dd91 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d || (p->inTrans=
1dd92 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 =TRANS_READ && !
1dd93 77 72 66 6c 61 67 29 20 29 7b 0d 0a 20 20 20 20 wrflag) ){..
1dd94 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e goto trans_begun
1dd95 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 57 ;.. }.... /* W
1dd96 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e rite transaction
1dd97 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 s are not possib
1dd98 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c le on a read-onl
1dd99 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0d 0a 20 y database */..
1dd9a 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c if( (pBt->btsFl
1dd9b 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f ags & BTS_READ_O
1dd9c 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 NLY)!=0 && wrfla
1dd9d 67 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 g ){.. rc = S
1dd9e 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d QLITE_READONLY;.
1dd9f 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f . goto trans_
1dda0 62 65 67 75 6e 3b 0d 0a 20 20 7d 0d 0a 0d 0a 23 begun;.. }....#
1dda1 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
1dda2 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0d IT_SHARED_CACHE.
1dda3 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 . /* If another
1dda4 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 database handle
1dda5 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 has already ope
1dda6 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e ned a write tran
1dda7 73 61 63 74 69 6f 6e 20 0d 0a 20 20 2a 2a 20 6f saction .. ** o
1dda8 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 n this shared-bt
1dda9 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e ree structure an
1ddaa 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 d a second write
1ddab 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0d transaction is.
1ddac 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c . ** requested,
1ddad 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c return SQLITE_L
1ddae 4f 43 4b 45 44 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 OCKED... */..
1ddaf 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 if( (wrflag && p
1ddb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f Bt->inTransactio
1ddb1 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0d n==TRANS_WRITE).
1ddb2 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 . || (pBt->bts
1ddb3 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 Flags & BTS_PEND
1ddb4 49 4e 47 29 21 3d 30 0d 0a 20 20 29 7b 0d 0a 20 ING)!=0.. ){..
1ddb5 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d pBlock = pBt-
1ddb6 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0d 0a 20 >pWriter->db;..
1ddb7 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 }else if( wrfla
1ddb8 67 3e 31 20 29 7b 0d 0a 20 20 20 20 42 74 4c 6f g>1 ){.. BtLo
1ddb9 63 6b 20 2a 70 49 74 65 72 3b 0d 0a 20 20 20 20 ck *pIter;..
1ddba 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 for(pIter=pBt->p
1ddbb 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 Lock; pIter; pIt
1ddbc 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 er=pIter->pNext)
1ddbd 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 {.. if( pIt
1ddbe 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b er->pBtree!=p ){
1ddbf 0d 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b .. pBlock
1ddc0 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 = pIter->pBtree
1ddc1 2d 3e 64 62 3b 0d 0a 20 20 20 20 20 20 20 20 62 ->db;.. b
1ddc2 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a reak;.. }..
1ddc3 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 }.. }.. if
1ddc4 28 20 70 42 6c 6f 63 6b 20 29 7b 0d 0a 20 20 20 ( pBlock ){..
1ddc5 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 sqlite3Connecti
1ddc6 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c onBlocked(p->db,
1ddc7 20 70 42 6c 6f 63 6b 29 3b 0d 0a 20 20 20 20 72 pBlock);.. r
1ddc8 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 c = SQLITE_LOCKE
1ddc9 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0d 0a D_SHAREDCACHE;..
1ddca 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 goto trans_b
1ddcb 65 67 75 6e 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 egun;.. }..#end
1ddcc 69 66 0d 0a 0d 0a 20 20 2f 2a 20 41 6e 79 20 72 if.... /* Any r
1ddcd 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 ead-only or read
1ddce 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 -write transacti
1ddcf 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 on implies a rea
1ddd0 64 2d 6c 6f 63 6b 20 6f 6e 20 0d 0a 20 20 2a 2a d-lock on .. **
1ddd1 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 page 1. So if s
1ddd2 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 ome other shared
1ddd3 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c -cache client al
1ddd4 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 ready has a writ
1ddd5 65 2d 6c 6f 63 6b 20 0d 0a 20 20 2a 2a 20 6f 6e e-lock .. ** on
1ddd6 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 page 1, the tra
1ddd7 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 nsaction cannot
1ddd8 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0d 0a 20 be opened. */..
1ddd9 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 rc = queryShare
1ddda 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 dCacheTableLock(
1dddb 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 p, MASTER_ROOT,
1dddc 52 45 41 44 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 69 READ_LOCK);.. i
1dddd 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 f( SQLITE_OK!=rc
1ddde 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 ) goto trans_be
1dddf 67 75 6e 3b 0d 0a 0d 0a 20 20 70 42 74 2d 3e 62 gun;.... pBt->b
1dde0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f tsFlags &= ~BTS_
1dde1 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b INITIALLY_EMPTY;
1dde2 0d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 .. if( pBt->nPa
1dde3 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 ge==0 ) pBt->bts
1dde4 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 Flags |= BTS_INI
1dde5 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0d 0a 20 TIALLY_EMPTY;..
1dde6 20 64 6f 20 7b 0d 0a 20 20 20 20 2f 2a 20 43 61 do {.. /* Ca
1dde7 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 ll lockBtree() u
1dde8 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d ntil either pBt-
1dde9 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c >pPage1 is popul
1ddea 61 74 65 64 20 6f 72 0d 0a 20 20 20 20 2a 2a 20 ated or.. **
1ddeb 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 lockBtree() retu
1ddec 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 rns something ot
1dded 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f her than SQLITE_
1ddee 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0d OK. lockBtree().
1ddef 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 . ** may retu
1ddf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 rn SQLITE_OK but
1ddf1 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 leave pBt->pPag
1ddf2 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 e1 set to 0 if a
1ddf3 66 74 65 72 0d 0a 20 20 20 20 2a 2a 20 72 65 61 fter.. ** rea
1ddf4 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 ding page 1 it d
1ddf5 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 iscovers that th
1ddf6 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 e page-size of t
1ddf7 68 65 20 64 61 74 61 62 61 73 65 20 0d 0a 20 20 he database ..
1ddf8 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 ** file is not
1ddf9 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 pBt->pageSize.
1ddfa 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 In this case loc
1ddfb 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 kBtree() will up
1ddfc 64 61 74 65 0d 0a 20 20 20 20 2a 2a 20 70 42 74 date.. ** pBt
1ddfd 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 ->pageSize to th
1ddfe 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 e page-size of t
1ddff 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e he file on disk.
1de00 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 77 68 .. */.. wh
1de01 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 ile( pBt->pPage1
1de02 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b ==0 && SQLITE_OK
1de03 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 ==(rc = lockBtre
1de04 65 28 70 42 74 29 29 20 29 3b 0d 0a 0d 0a 20 20 e(pBt)) );....
1de05 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1de06 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b _OK && wrflag ){
1de07 0d 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 .. if( (pBt
1de08 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 ->btsFlags & BTS
1de09 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 _READ_ONLY)!=0 )
1de0a 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {.. rc =
1de0b 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b SQLITE_READONLY;
1de0c 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
1de0d 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
1de0e 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 ite3PagerBegin(p
1de0f 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 Bt->pPager,wrfla
1de10 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 g>1,sqlite3TempI
1de11 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b nMemory(p->db));
1de12 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 .. if( rc
1de13 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1de14 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e rc = n
1de15 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b ewDatabase(pBt);
1de16 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
1de17 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 0d }.. }.. .
1de18 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
1de19 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1de1a 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e unlockBtreeIfUn
1de1b 75 73 65 64 28 70 42 74 29 3b 0d 0a 20 20 20 20 used(pBt);..
1de1c 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 }.. }while( (rc
1de1d 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 &0xFF)==SQLITE_B
1de1e 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 USY && pBt->inTr
1de1f 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 ansaction==TRANS
1de20 5f 4e 4f 4e 45 20 26 26 0d 0a 20 20 20 20 20 20 _NONE &&..
1de21 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 btreeInvokeB
1de22 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 usyHandler(pBt)
1de23 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d );.... if( rc==
1de24 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1de25 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 if( p->inTrans
1de26 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0d ==TRANS_NONE ){.
1de27 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 . pBt->nTra
1de28 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0d 0a 23 69 66 nsaction++;..#if
1de29 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
1de2a 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0d 0a 20 _SHARED_CACHE..
1de2b 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 if( p->shar
1de2c 61 62 6c 65 20 29 7b 0d 0a 09 61 73 73 65 72 74 able ){...assert
1de2d 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 ( p->lock.pBtree
1de2e 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 ==p && p->lock.i
1de2f 54 61 62 6c 65 3d 3d 31 20 29 3b 0d 0a 20 20 20 Table==1 );..
1de30 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f p->lock.eLo
1de31 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0d ck = READ_LOCK;.
1de32 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b . p->lock
1de33 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c .pNext = pBt->pL
1de34 6f 63 6b 3b 0d 0a 20 20 20 20 20 20 20 20 70 42 ock;.. pB
1de35 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c t->pLock = &p->l
1de36 6f 63 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 ock;.. }..#
1de37 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 20 20 endif.. }..
1de38 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 p->inTrans = (
1de39 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 wrflag?TRANS_WRI
1de3a 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0d TE:TRANS_READ);.
1de3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 . if( p->inTr
1de3c 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 ans>pBt->inTrans
1de3d 61 63 74 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 20 action ){..
1de3e 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 pBt->inTransact
1de3f 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 ion = p->inTrans
1de40 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 ;.. }.. if
1de41 28 20 77 72 66 6c 61 67 20 29 7b 0d 0a 20 20 20 ( wrflag ){..
1de42 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 MemPage *pPag
1de43 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 e1 = pBt->pPage1
1de44 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ;..#ifndef SQLIT
1de45 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 E_OMIT_SHARED_CA
1de46 43 48 45 0d 0a 20 20 20 20 20 20 61 73 73 65 72 CHE.. asser
1de47 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 t( !pBt->pWriter
1de48 20 29 3b 0d 0a 20 20 20 20 20 20 70 42 74 2d 3e );.. pBt->
1de49 70 57 72 69 74 65 72 20 3d 20 70 3b 0d 0a 20 20 pWriter = p;..
1de4a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 pBt->btsFlag
1de4b 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 s &= ~BTS_EXCLUS
1de4c 49 56 45 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 IVE;.. if(
1de4d 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e wrflag>1 ) pBt->
1de4e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f btsFlags |= BTS_
1de4f 45 58 43 4c 55 53 49 56 45 3b 0d 0a 23 65 6e 64 EXCLUSIVE;..#end
1de50 69 66 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 if.... /* I
1de51 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 f the db-size he
1de52 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e ader field is in
1de53 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d correct (as it m
1de54 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0d ay be if an old.
1de55 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 . ** client
1de56 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e has been writin
1de57 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 g the database f
1de58 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 ile), update it
1de59 6e 6f 77 2e 20 44 6f 69 6e 67 0d 0a 20 20 20 20 now. Doing..
1de5a 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 ** this sooner
1de5b 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 rather than lat
1de5c 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 er means the dat
1de5d 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 abase size can s
1de5e 61 66 65 6c 79 20 0d 0a 20 20 20 20 20 20 2a 2a afely .. **
1de5f 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 re-read the dat
1de60 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 abase size from
1de61 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 page 1 if a save
1de62 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 point or transac
1de63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 72 tion.. ** r
1de64 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 ollback occurs w
1de65 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 ithin the transa
1de66 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2a 2f ction... */
1de67 0d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d .. if( pBt-
1de68 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 >nPage!=get4byte
1de69 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b (&pPage1->aData[
1de6a 32 38 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 28]) ){..
1de6b 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 rc = sqlite3Pag
1de6c 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e erWrite(pPage1->
1de6d 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 pDbPage);..
1de6e 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
1de6f 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
1de70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 put4byte(&pPa
1de71 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 ge1->aData[28],
1de72 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0d 0a 20 20 pBt->nPage);..
1de73 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d }.. }
1de74 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
1de75 0d 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0d 0a ..trans_begun:..
1de76 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1de77 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b _OK && wrflag ){
1de78 0d 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 .. /* This ca
1de79 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 ll makes sure th
1de7a 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 at the pager has
1de7b 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d the correct num
1de7c 62 65 72 20 6f 66 0d 0a 20 20 20 20 2a 2a 20 6f ber of.. ** o
1de7d 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 pen savepoints.
1de7e 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 If the second pa
1de7f 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 rameter is great
1de80 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0d 0a 20 er than 0 and..
1de81 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f ** the sub-jo
1de82 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 urnal is not alr
1de83 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 eady open, then
1de84 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 it will be opene
1de85 64 20 68 65 72 65 2e 0d 0a 20 20 20 20 2a 2f 0d d here... */.
1de86 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
1de87 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 3PagerOpenSavepo
1de88 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c int(pBt->pPager,
1de89 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 p->db->nSavepoi
1de8a 6e 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 62 nt);.. }.... b
1de8b 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 treeIntegrity(p)
1de8c 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 ;.. sqlite3Btre
1de8d 65 4c 65 61 76 65 28 70 29 3b 0d 0a 20 20 72 65 eLeave(p);.. re
1de8e 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 23 turn rc;..}....#
1de8f 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
1de90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 0d IT_AUTOVACUUM...
1de91 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65 20 ./*..** Set the
1de92 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 pointer-map entr
1de93 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c ies for all chil
1de94 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 dren of page pPa
1de95 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0d 0a 2a 2a ge. Also, if..**
1de96 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 pPage contains
1de97 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 cells that point
1de98 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 to overflow pag
1de99 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e es, set the poin
1de9a 74 65 72 0d 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 ter..** map entr
1de9b 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 ies for the over
1de9c 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 flow pages as we
1de9d 6c 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 ll...*/..static
1de9e 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d int setChildPtrm
1de9f 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 aps(MemPage *pPa
1dea0 67 65 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 20 20 ge){.. int i;
1dea1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dea2 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1dea3 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a unter variable *
1dea4 2f 0d 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 /.. int nCell;
1dea5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dea6 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1dea7 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 r of cells in pa
1dea8 67 65 20 70 50 61 67 65 20 2a 2f 0d 0a 20 20 69 ge pPage */.. i
1dea9 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
1deaa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1deab 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 /* Return code
1deac 20 2a 2f 0d 0a 20 20 42 74 53 68 61 72 65 64 20 */.. BtShared
1dead 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 *pBt = pPage->pB
1deae 74 3b 0d 0a 20 20 75 38 20 69 73 49 6e 69 74 4f t;.. u8 isInitO
1deaf 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 rig = pPage->isI
1deb0 6e 69 74 3b 0d 0a 20 20 50 67 6e 6f 20 70 67 6e nit;.. Pgno pgn
1deb1 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b o = pPage->pgno;
1deb2 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 .... assert( sq
1deb3 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
1deb4 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 (pPage->pBt->mut
1deb5 65 78 29 20 29 3b 0d 0a 20 20 72 63 20 3d 20 62 ex) );.. rc = b
1deb6 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 treeInitPage(pPa
1deb7 67 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d ge);.. if( rc!=
1deb8 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1deb9 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 goto set_child
1deba 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0d 0a 20 _ptrmaps_out;..
1debb 20 7d 0d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 }.. nCell = pP
1debc 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 0d 0a 20 age->nCell;....
1debd 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c for(i=0; i<nCel
1debe 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 75 38 l; i++){.. u8
1debf 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 *pCell = findCe
1dec0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0d 0a 0d ll(pPage, i);...
1dec1 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 . ptrmapPutOv
1dec2 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 flPtr(pPage, pCe
1dec3 6c 6c 2c 20 26 72 63 29 3b 0d 0a 0d 0a 20 20 20 ll, &rc);....
1dec4 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 if( !pPage->lea
1dec5 66 20 29 7b 0d 0a 20 20 20 20 20 20 50 67 6e 6f f ){.. Pgno
1dec6 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 childPgno = get
1dec7 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0d 0a 20 4byte(pCell);..
1dec8 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 ptrmapPut(p
1dec9 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 Bt, childPgno, P
1deca 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e TRMAP_BTREE, pgn
1decb 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 7d 0d o, &rc);.. }.
1decc 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 21 70 . }.... if( !p
1decd 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 Page->leaf ){..
1dece 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e Pgno childPgn
1decf 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 o = get4byte(&pP
1ded0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 age->aData[pPage
1ded1 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b ->hdrOffset+8]);
1ded2 0d 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 .. ptrmapPut(
1ded3 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 pBt, childPgno,
1ded4 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 PTRMAP_BTREE, pg
1ded5 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 7d 0d 0a no, &rc);.. }..
1ded6 0d 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d ..set_child_ptrm
1ded7 61 70 73 5f 6f 75 74 3a 0d 0a 20 20 70 50 61 67 aps_out:.. pPag
1ded8 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e e->isInit = isIn
1ded9 69 74 4f 72 69 67 3b 0d 0a 20 20 72 65 74 75 72 itOrig;.. retur
1deda 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
1dedb 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 ** Somewhere on
1dedc 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 pPage is a point
1dedd 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d er to page iFrom
1dede 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 . Modify this p
1dedf 6f 69 6e 74 65 72 20 73 6f 0d 0a 2a 2a 20 74 68 ointer so..** th
1dee0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 at it points to
1dee1 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 iTo. Parameter e
1dee2 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 Type describes t
1dee3 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 he type of point
1dee4 65 72 20 74 6f 0d 0a 2a 2a 20 62 65 20 6d 6f 64 er to..** be mod
1dee5 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f ified, as follo
1dee6 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 50 54 52 4d ws:..**..** PTRM
1dee7 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 AP_BTREE: pP
1dee8 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 age is a btree-p
1dee9 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 age. The pointer
1deea 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 points at a chi
1deeb 6c 64 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 ld ..**
1deec 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f page o
1deed 66 20 70 50 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a f pPage...**..**
1deee 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 PTRMAP_OVERFLOW
1deef 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 1: pPage is a bt
1def0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f ree-page. The po
1def1 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 inter points at
1def2 61 6e 20 6f 76 65 72 66 6c 6f 77 0d 0a 2a 2a 20 an overflow..**
1def3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1def4 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 page pointed t
1def5 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 o by one of the
1def6 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0d cells on pPage..
1def7 0a 2a 2a 0d 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f .**..** PTRMAP_O
1def8 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 VERFLOW2: pPage
1def9 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 is an overflow-p
1defa 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 age. The pointer
1defb 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e points at the n
1defc 65 78 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 ext..**
1defd 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c overfl
1defe 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c ow page in the l
1deff 69 73 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ist...*/..static
1df00 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 int modifyPageP
1df01 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a ointer(MemPage *
1df02 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f pPage, Pgno iFro
1df03 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 m, Pgno iTo, u8
1df04 65 54 79 70 65 29 7b 0d 0a 20 20 61 73 73 65 72 eType){.. asser
1df05 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 t( sqlite3_mutex
1df06 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 _held(pPage->pBt
1df07 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 ->mutex) );.. a
1df08 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 ssert( sqlite3Pa
1df09 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 gerIswriteable(p
1df0a 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 Page->pDbPage) )
1df0b 3b 0d 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d ;.. if( eType==
1df0c 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 PTRMAP_OVERFLOW2
1df0d 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 ){.. /* The
1df0e 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 pointer is alway
1df0f 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 s the first 4 by
1df10 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 tes of the page
1df11 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a in this case. *
1df12 2f 0d 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 /.. if( get4b
1df13 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 yte(pPage->aData
1df14 29 21 3d 69 46 72 6f 6d 20 29 7b 0d 0a 20 20 20 )!=iFrom ){..
1df15 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1df16 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a _CORRUPT_BKPT;..
1df17 20 20 20 20 7d 0d 0a 20 20 20 20 70 75 74 34 62 }.. put4b
1df18 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 yte(pPage->aData
1df19 2c 20 69 54 6f 29 3b 0d 0a 20 20 7d 65 6c 73 65 , iTo);.. }else
1df1a 7b 0d 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 {.. u8 isInit
1df1b 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 Orig = pPage->is
1df1c 49 6e 69 74 3b 0d 0a 20 20 20 20 69 6e 74 20 69 Init;.. int i
1df1d 3b 0d 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c ;.. int nCell
1df1e 3b 0d 0a 0d 0a 20 20 20 20 62 74 72 65 65 49 6e ;.... btreeIn
1df1f 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0d 0a itPage(pPage);..
1df20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 nCell = pPag
1df21 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 0d 0a 20 20 20 e->nCell;....
1df22 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c for(i=0; i<nCel
1df23 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 l; i++){..
1df24 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 u8 *pCell = find
1df25 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0d Cell(pPage, i);.
1df26 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 . if( eType
1df27 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f ==PTRMAP_OVERFLO
1df28 57 31 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 43 W1 ){.. C
1df29 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0d 0a 20 ellInfo info;..
1df2a 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 btreePars
1df2b 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 eCellPtr(pPage,
1df2c 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0d 0a pCell, &info);..
1df2d 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f if( info
1df2e 2e 69 4f 76 65 72 66 6c 6f 77 0d 0a 20 20 20 20 .iOverflow..
1df2f 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e && pCell+in
1df30 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d fo.iOverflow+3<=
1df31 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 pPage->aData+pPa
1df32 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0d 0a 20 20 ge->maskPage..
1df33 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d && iFrom=
1df34 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c =get4byte(&pCell
1df35 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d [info.iOverflow]
1df36 29 0d 0a 20 20 20 20 20 20 20 20 29 7b 0d 0a 20 ).. ){..
1df37 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 put4byt
1df38 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f e(&pCell[info.iO
1df39 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0d verflow], iTo);.
1df3a 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b . break
1df3b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
1df3c 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1df3d 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 if( get4byte
1df3e 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 (pCell)==iFrom )
1df3f 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 {.. put
1df40 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 4byte(pCell, iTo
1df41 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 );.. br
1df42 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d eak;.. }.
1df43 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
1df44 0a 20 20 0d 0a 20 20 20 20 69 66 28 20 69 3d 3d . .. if( i==
1df45 6e 43 65 6c 6c 20 29 7b 0d 0a 20 20 20 20 20 20 nCell ){..
1df46 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 if( eType!=PTRMA
1df47 50 5f 42 54 52 45 45 20 7c 7c 20 0d 0a 20 20 20 P_BTREE || ..
1df48 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 get4byte(
1df49 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 &pPage->aData[pP
1df4a 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 age->hdrOffset+8
1df4b 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0d 0a 20 20 ])!=iFrom ){..
1df4c 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
1df4d 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
1df4e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
1df4f 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 put4byte(&pPag
1df50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e e->aData[pPage->
1df51 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 hdrOffset+8], iT
1df52 6f 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 o);.. }....
1df53 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 pPage->isInit
1df54 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0d 0a 20 = isInitOrig;..
1df55 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c }.. return SQL
1df56 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a ITE_OK;..}......
1df57 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 /*..** Move the
1df58 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 open database pa
1df59 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f ge pDbPage to lo
1df5a 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 cation iFreePage
1df5b 20 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 64 61 74 in the ..** dat
1df5c 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 abase. The pDbPa
1df5d 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d ge reference rem
1df5e 61 69 6e 73 20 76 61 6c 69 64 2e 0d 0a 2a 2a 0d ains valid...**.
1df5f 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 .** The isCommit
1df60 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 flag indicates
1df61 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f that there is no
1df62 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 need to remembe
1df63 72 20 74 68 61 74 0d 0a 2a 2a 20 74 68 65 20 6a r that..** the j
1df64 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 ournal needs to
1df65 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f be sync()ed befo
1df66 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 re database page
1df67 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0d pDbPage->pgno .
1df68 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 .** can be writt
1df69 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 en to. The calle
1df6a 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 r has already pr
1df6b 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 omised not to wr
1df6c 69 74 65 20 74 6f 20 74 68 61 74 0d 0a 2a 2a 20 ite to that..**
1df6d 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 page...*/..stati
1df6e 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 c int relocatePa
1df6f 67 65 28 0d 0a 20 20 42 74 53 68 61 72 65 64 20 ge(.. BtShared
1df70 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 *pBt,
1df71 2f 2a 20 42 74 72 65 65 20 2a 2f 0d 0a 20 20 4d /* Btree */.. M
1df72 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c emPage *pDbPage,
1df73 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 /* Open
1df74 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0d page to move */.
1df75 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 . u8 eType,
1df76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
1df77 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 ointer map 'type
1df78 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 ' entry for pDbP
1df79 61 67 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 69 age */.. Pgno i
1df7a 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 PtrPage,
1df7b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 /* Pointer ma
1df7c 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 p 'page-no' entr
1df7d 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f y for pDbPage */
1df7e 0d 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 .. Pgno iFreePa
1df7f 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ge, /*
1df80 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 The location to
1df81 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 move pDbPage to
1df82 2a 2f 0d 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d */.. int isComm
1df83 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f it /
1df84 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 * isCommit flag
1df85 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 passed to sqlite
1df86 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 3PagerMovepage *
1df87 2f 0d 0a 29 7b 0d 0a 20 20 4d 65 6d 50 61 67 65 /..){.. MemPage
1df88 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a *pPtrPage; /*
1df89 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 The page that c
1df8a 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 ontains a pointe
1df8b 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0d r to pDbPage */.
1df8c 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 . Pgno iDbPage
1df8d 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b = pDbPage->pgno;
1df8e 0d 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 .. Pager *pPage
1df8f 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b r = pBt->pPager;
1df90 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 .. int rc;....
1df91 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d assert( eType==
1df92 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 PTRMAP_OVERFLOW2
1df93 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 || eType==PTRMA
1df94 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0d P_OVERFLOW1 || .
1df95 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 . eType==PT
1df96 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 RMAP_BTREE || eT
1df97 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 ype==PTRMAP_ROOT
1df98 50 41 47 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 PAGE );.. asser
1df99 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 t( sqlite3_mutex
1df9a 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 _held(pBt->mutex
1df9b 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1df9c 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 pDbPage->pBt==pB
1df9d 74 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 4d 6f 76 t );.... /* Mov
1df9e 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 e page iDbPage f
1df9f 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 rom its current
1dfa0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 location to page
1dfa1 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 number iFreePag
1dfa2 65 20 2a 2f 0d 0a 20 20 54 52 41 43 45 28 28 22 e */.. TRACE(("
1dfa3 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 AUTOVACUUM: Movi
1dfa4 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 ng %d to free pa
1dfa5 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 ge %d (ptr page
1dfa6 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 %d type %d)\n",
1dfa7 0d 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c .. iDbPage,
1dfa8 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 iFreePage, iPtr
1dfa9 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0d 0a Page, eType));..
1dfaa 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
1dfab 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 gerMovepage(pPag
1dfac 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 er, pDbPage->pDb
1dfad 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c Page, iFreePage,
1dfae 20 69 73 43 6f 6d 6d 69 74 29 3b 0d 0a 20 20 69 isCommit);.. i
1dfaf 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
1dfb0 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
1dfb1 72 63 3b 0d 0a 20 20 7d 0d 0a 20 20 70 44 62 50 rc;.. }.. pDbP
1dfb2 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 age->pgno = iFre
1dfb3 65 50 61 67 65 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 ePage;.... /* I
1dfb4 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 f pDbPage was a
1dfb5 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e btree-page, then
1dfb6 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 it may have chi
1dfb7 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 ld pages and/or
1dfb8 63 65 6c 6c 73 0d 0a 20 20 2a 2a 20 74 68 61 74 cells.. ** that
1dfb9 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c point to overfl
1dfba 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f ow pages. The po
1dfbb 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 inter map entrie
1dfbc 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0d s for all these.
1dfbd 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 . ** pages need
1dfbe 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0d to be changed..
1dfbf 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 49 66 20 70 . **.. ** If p
1dfc0 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 DbPage is an ove
1dfc1 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e rflow page, then
1dfc2 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 the first 4 byt
1dfc3 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0d 0a es may store a..
1dfc4 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 ** pointer to
1dfc5 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 a subsequent ove
1dfc6 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 rflow page. If t
1dfc7 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c his is the case,
1dfc8 20 74 68 65 6e 0d 0a 20 20 2a 2a 20 74 68 65 20 then.. ** the
1dfc9 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 pointer map need
1dfca 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 s to be updated
1dfcb 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 for the subseque
1dfcc 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 nt overflow page
1dfcd 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 65 ... */.. if( e
1dfce 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 Type==PTRMAP_BTR
1dfcf 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 EE || eType==PTR
1dfd0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0d MAP_ROOTPAGE ){.
1dfd1 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 . rc = setChi
1dfd2 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 ldPtrmaps(pDbPag
1dfd3 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 e);.. if( rc!
1dfd4 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
1dfd5 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d return rc;.
1dfd6 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b . }.. }else{
1dfd7 0d 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f .. Pgno nextO
1dfd8 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 vfl = get4byte(p
1dfd9 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0d DbPage->aData);.
1dfda 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 . if( nextOvf
1dfdb 6c 21 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 l!=0 ){.. p
1dfdc 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 trmapPut(pBt, ne
1dfdd 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f xtOvfl, PTRMAP_O
1dfde 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 VERFLOW2, iFreeP
1dfdf 61 67 65 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 age, &rc);..
1dfe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
1dfe1 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
1dfe2 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 return rc;..
1dfe3 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d }.. }.. }.
1dfe4 0a 0d 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 ... /* Fix the
1dfe5 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 database pointer
1dfe6 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 on page iPtrPag
1dfe7 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 e that pointed a
1dfe8 74 20 69 44 62 50 61 67 65 20 73 6f 0d 0a 20 20 t iDbPage so..
1dfe9 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 ** that it point
1dfea 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 s at iFreePage.
1dfeb 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 Also fix the poi
1dfec 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 nter map entry f
1dfed 6f 72 0d 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 or.. ** iPtrPag
1dfee 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 e... */.. if(
1dfef 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f eType!=PTRMAP_RO
1dff0 4f 54 50 41 47 45 20 29 7b 0d 0a 20 20 20 20 72 OTPAGE ){.. r
1dff1 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 c = btreeGetPage
1dff2 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 (pBt, iPtrPage,
1dff3 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0d 0a &pPtrPage, 0);..
1dff4 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1dff5 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
1dff6 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 return rc;..
1dff7 7d 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 }.. rc = sqli
1dff8 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 te3PagerWrite(pP
1dff9 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 trPage->pDbPage)
1dffa 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 ;.. if( rc!=S
1dffb 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1dffc 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 releasePage(p
1dffd 50 74 72 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 PtrPage);..
1dffe 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1dfff 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 }.. rc = mod
1e000 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 ifyPagePointer(p
1e001 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 PtrPage, iDbPage
1e002 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 , iFreePage, eTy
1e003 70 65 29 3b 0d 0a 20 20 20 20 72 65 6c 65 61 73 pe);.. releas
1e004 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b ePage(pPtrPage);
1e005 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 .. if( rc==SQ
1e006 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1e007 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c ptrmapPut(pBt,
1e008 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 iFreePage, eTyp
1e009 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 e, iPtrPage, &rc
1e00a 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
1e00b 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d return rc;..}.
1e00c 0a 0d 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 .../* Forward de
1e00d 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 claration requir
1e00e 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d ed by incrVacuum
1e00f 53 74 65 70 28 29 2e 20 2a 2f 0d 0a 73 74 61 74 Step(). */..stat
1e010 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 ic int allocateB
1e011 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 treePage(BtShare
1e012 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c d *, MemPage **,
1e013 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 Pgno *, Pgno, u
1e014 38 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 65 8);..../*..** Pe
1e015 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 rform a single s
1e016 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d tep of an increm
1e017 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 ental-vacuum. If
1e018 20 73 75 63 63 65 73 73 66 75 6c 2c 0d 0a 2a 2a successful,..**
1e019 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1e01a 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e K. If there is n
1e01b 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e o work to do (an
1e01c 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0d 0a d therefore no..
1e01d 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c ** point in call
1e01e 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f ing this functio
1e01f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e n again), return
1e020 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0d 0a 2a SQLITE_DONE...*
1e021 2a 0d 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 *..** More speci
1e022 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 ficly, this func
1e023 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f tion attempts to
1e024 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 re-organize the
1e025 20 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 ..** database s
1e026 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 o that the last
1e027 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 page of the file
1e028 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 currently in us
1e029 65 0d 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 e..** is no long
1e02a 65 72 20 69 6e 20 75 73 65 2e 0d 0a 2a 2a 0d 0a er in use...**..
1e02b 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 ** If the nFin p
1e02c 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d arameter is non-
1e02d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 zero, this funct
1e02e 69 6f 6e 20 61 73 73 75 6d 65 73 0d 0a 2a 2a 20 ion assumes..**
1e02f 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 that the caller
1e030 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e will keep callin
1e031 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 g incrVacuumStep
1e032 28 29 20 75 6e 74 69 6c 0d 0a 2a 2a 20 69 74 20 () until..** it
1e033 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 returns SQLITE_D
1e034 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c ONE or an error,
1e035 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 and that nFin i
1e036 73 20 74 68 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 s the..** number
1e037 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 of pages the da
1e038 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c tabase file will
1e039 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 contain after t
1e03a 68 69 73 20 0d 0a 2a 2a 20 70 72 6f 63 65 73 73 his ..** process
1e03b 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 is complete. I
1e03c 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 f nFin is zero,
1e03d 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 it is assumed th
1e03e 61 74 0d 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75 at..** incrVacuu
1e03f 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62 65 20 mStep() will be
1e040 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74 65 20 called a finite
1e041 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73 0d amount of times.
1e042 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f 72 .** which may or
1e043 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20 74 may not empty t
1e044 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41 20 he freelist. A
1e045 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d 0d full autovacuum.
1e046 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20 .** has nFin>0.
1e047 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65 A "PRAGMA incre
1e048 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68 mental_vacuum" h
1e049 61 73 20 6e 46 69 6e 3d 3d 30 2e 0d 0a 2a 2f 0d as nFin==0...*/.
1e04a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 .static int incr
1e04b 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 VacuumStep(BtSha
1e04c 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e red *pBt, Pgno n
1e04d 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 Fin, Pgno iLastP
1e04e 67 29 7b 0d 0a 20 20 50 67 6e 6f 20 6e 46 72 65 g){.. Pgno nFre
1e04f 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 eList;
1e050 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
1e051 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 ges still on the
1e052 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0d 0a 20 free-list */..
1e053 20 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 61 73 int rc;.... as
1e054 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
1e055 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 tex_held(pBt->mu
1e056 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
1e057 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 t( iLastPg>nFin
1e058 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 50 54 52 );.... if( !PTR
1e059 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 MAP_ISPAGE(pBt,
1e05a 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 iLastPg) && iLas
1e05b 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 tPg!=PENDING_BYT
1e05c 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0d 0a E_PAGE(pBt) ){..
1e05d 20 20 20 20 75 38 20 65 54 79 70 65 3b 0d 0a 20 u8 eType;..
1e05e 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 Pgno iPtrPage
1e05f 3b 0d 0a 0d 0a 20 20 20 20 6e 46 72 65 65 4c 69 ;.... nFreeLi
1e060 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 st = get4byte(&p
1e061 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 Bt->pPage1->aDat
1e062 61 5b 33 36 5d 29 3b 0d 0a 20 20 20 20 69 66 28 a[36]);.. if(
1e063 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b nFreeList==0 ){
1e064 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
1e065 51 4c 49 54 45 5f 44 4f 4e 45 3b 0d 0a 20 20 20 QLITE_DONE;..
1e066 20 7d 0d 0a 0d 0a 20 20 20 20 72 63 20 3d 20 70 }.... rc = p
1e067 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c trmapGet(pBt, iL
1e068 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 astPg, &eType, &
1e069 69 50 74 72 50 61 67 65 29 3b 0d 0a 20 20 20 20 iPtrPage);..
1e06a 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
1e06b 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 K ){.. retu
1e06c 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 rn rc;.. }..
1e06d 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 if( eType==PT
1e06e 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b RMAP_ROOTPAGE ){
1e06f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 .. return S
1e070 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1e071 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 PT;.. }....
1e072 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 if( eType==PTR
1e073 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0d MAP_FREEPAGE ){.
1e074 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d . if( nFin=
1e075 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f =0 ){.. /
1e076 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 * Remove the pag
1e077 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 e from the files
1e078 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 free-list. This
1e079 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 is not required
1e07a 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 .. ** if
1e07b 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f nFin is non-zero
1e07c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 . In that case,
1e07d 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 the free-list wi
1e07e 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 20 20 2a ll be.. *
1e07f 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a * truncated to z
1e080 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 ero after this f
1e081 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c unction returns,
1e082 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0d so it doesn't .
1e083 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 . ** matt
1e084 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 er if it still c
1e085 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 ontains some gar
1e086 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0d 0a 20 bage entries...
1e087 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 */..
1e088 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b Pgno iFreePg;
1e089 0d 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 .. MemPag
1e08a 65 20 2a 70 46 72 65 65 50 67 3b 0d 0a 20 20 20 e *pFreePg;..
1e08b 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 rc = alloca
1e08c 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c teBtreePage(pBt,
1e08d 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 &pFreePg, &iFre
1e08e 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 ePg, iLastPg, 1)
1e08f 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 ;.. if( r
1e090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
1e091 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
1e092 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d n rc;.. }
1e093 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 .. assert
1e094 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 ( iFreePg==iLast
1e095 50 67 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 Pg );.. r
1e096 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 eleasePage(pFree
1e097 50 67 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 Pg);.. }..
1e098 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 } else {..
1e099 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b Pgno iFreePg;
1e09a 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1e09b 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 Index of free pa
1e09c 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 ge to move pLast
1e09d 50 67 20 74 6f 20 2a 2f 0d 0a 20 20 20 20 20 20 Pg to */..
1e09e 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 MemPage *pLastPg
1e09f 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 ;.... rc =
1e0a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 btreeGetPage(pBt
1e0a1 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 , iLastPg, &pLas
1e0a2 74 50 67 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 tPg, 0);..
1e0a3 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
1e0a4 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 K ){.. re
1e0a5 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 turn rc;..
1e0a6 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 }.... /* If
1e0a7 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 nFin is zero, t
1e0a8 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 his loop runs ex
1e0a9 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 actly once and p
1e0aa 61 67 65 20 70 4c 61 73 74 50 67 0d 0a 20 20 20 age pLastPg..
1e0ab 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 ** is swapped
1e0ac 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 with the first
1e0ad 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 free page pulled
1e0ae 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 off the free li
1e0af 73 74 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 st... **..
1e0b0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f ** On the o
1e0b1 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 ther hand, if nF
1e0b2 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 in is greater th
1e0b3 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 an zero, then ke
1e0b4 65 70 0d 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f ep.. ** loo
1e0b5 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 ping until a fre
1e0b6 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 e-page located w
1e0b7 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 ithin the first
1e0b8 6e 46 69 6e 20 70 61 67 65 73 0d 0a 20 20 20 20 nFin pages..
1e0b9 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 ** of the file
1e0ba 20 69 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 is found...
1e0bb 20 20 2a 2f 0d 0a 20 20 20 20 20 20 64 6f 20 7b */.. do {
1e0bc 0d 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 .. MemPag
1e0bd 65 20 2a 70 46 72 65 65 50 67 3b 0d 0a 20 20 20 e *pFreePg;..
1e0be 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 rc = alloca
1e0bf 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c teBtreePage(pBt,
1e0c0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 &pFreePg, &iFre
1e0c1 65 50 67 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20 ePg, 0, 0);..
1e0c2 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
1e0c3 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1e0c4 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 releasePage
1e0c5 28 70 4c 61 73 74 50 67 29 3b 0d 0a 20 20 20 20 (pLastPg);..
1e0c6 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b return rc;
1e0c7 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
1e0c8 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 releasePage
1e0c9 28 70 46 72 65 65 50 67 29 3b 0d 0a 20 20 20 20 (pFreePg);..
1e0ca 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d }while( nFin!=
1e0cb 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 0 && iFreePg>nFi
1e0cc 6e 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 n );.. asse
1e0cd 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 rt( iFreePg<iLas
1e0ce 74 50 67 20 29 3b 0d 0a 20 20 20 20 20 20 0d 0a tPg );.. ..
1e0cf 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
1e0d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 e3PagerWrite(pLa
1e0d1 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0d stPg->pDbPage);.
1e0d2 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 . if( rc==S
1e0d3 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1e0d4 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 rc = reloca
1e0d5 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 tePage(pBt, pLas
1e0d6 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 tPg, eType, iPtr
1e0d7 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e Page, iFreePg, n
1e0d8 46 69 6e 21 3d 30 29 3b 0d 0a 20 20 20 20 20 20 Fin!=0);..
1e0d9 7d 0d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 }.. release
1e0da 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0d 0a Page(pLastPg);..
1e0db 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
1e0dc 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1e0dd 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
1e0de 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
1e0df 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 6e 46 69 }.... if( nFi
1e0e0 6e 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 4c 61 n==0 ){.. iLa
1e0e1 73 74 50 67 2d 2d 3b 0d 0a 20 20 20 20 77 68 69 stPg--;.. whi
1e0e2 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e le( iLastPg==PEN
1e0e3 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 DING_BYTE_PAGE(p
1e0e4 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 Bt)||PTRMAP_ISPA
1e0e5 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 GE(pBt, iLastPg)
1e0e6 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 50 ){.. if( P
1e0e7 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 TRMAP_ISPAGE(pBt
1e0e8 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0d 0a 20 , iLastPg) ){..
1e0e9 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a MemPage *
1e0ea 70 50 67 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 pPg;.. rc
1e0eb 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 = btreeGetPage(
1e0ec 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 pBt, iLastPg, &p
1e0ed 50 67 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 Pg, 0);..
1e0ee 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1e0ef 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 OK ){..
1e0f0 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1e0f1 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
1e0f2 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1e0f3 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 rWrite(pPg->pDbP
1e0f4 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 age);.. r
1e0f5 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b eleasePage(pPg);
1e0f6 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 .. if( rc
1e0f7 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
1e0f8 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
1e0f9 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d rc;.. }.
1e0fa 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1e0fb 69 4c 61 73 74 50 67 2d 2d 3b 0d 0a 20 20 20 20 iLastPg--;..
1e0fc 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 }.. sqlite3Pa
1e0fd 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 gerTruncateImage
1e0fe 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c (pBt->pPager, iL
1e0ff 61 73 74 50 67 29 3b 0d 0a 20 20 20 20 70 42 74 astPg);.. pBt
1e100 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 ->nPage = iLastP
1e101 67 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 g;.. }.. retur
1e102 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
1e103 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 77 72 69 74 .../*..** A writ
1e104 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 e-transaction mu
1e105 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 st be opened bef
1e106 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 ore calling this
1e107 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2a 20 49 function...** I
1e108 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e t performs a sin
1e109 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b gle unit of work
1e10a 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 towards an incr
1e10b 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0d emental vacuum..
1e10c 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 69 .**..** If the i
1e10d 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 ncremental vacuu
1e10e 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 m is finished af
1e10f 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f ter this functio
1e110 6e 20 68 61 73 20 72 75 6e 2c 0d 0a 2a 2a 20 53 n has run,..** S
1e111 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 QLITE_DONE is re
1e112 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 turned. If it is
1e113 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 not finished, b
1e114 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 ut no error occu
1e115 72 72 65 64 2c 0d 0a 2a 2a 20 53 51 4c 49 54 45 rred,..** SQLITE
1e116 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e _OK is returned.
1e117 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 Otherwise an SQ
1e118 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e Lite error code.
1e119 20 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ..*/..SQLITE_PR
1e11a 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
1e11b 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 3BtreeIncrVacuum
1e11c 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 69 (Btree *p){.. i
1e11d 6e 74 20 72 63 3b 0d 0a 20 20 42 74 53 68 61 72 nt rc;.. BtShar
1e11e 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 ed *pBt = p->pBt
1e11f 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 ;.... sqlite3Bt
1e120 72 65 65 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 reeEnter(p);..
1e121 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 assert( pBt->inT
1e122 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e ransaction==TRAN
1e123 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e S_WRITE && p->in
1e124 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 Trans==TRANS_WRI
1e125 54 45 20 29 3b 0d 0a 20 20 69 66 28 20 21 70 42 TE );.. if( !pB
1e126 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b t->autoVacuum ){
1e127 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 .. rc = SQLIT
1e128 45 5f 44 4f 4e 45 3b 0d 0a 20 20 7d 65 6c 73 65 E_DONE;.. }else
1e129 7b 0d 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 {.. invalidat
1e12a 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 eAllOverflowCach
1e12b 65 28 70 42 74 29 3b 0d 0a 20 20 20 20 72 63 20 e(pBt);.. rc
1e12c 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 = incrVacuumStep
1e12d 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 (pBt, 0, btreePa
1e12e 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0d 0a gecount(pBt));..
1e12f 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
1e130 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
1e131 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1e132 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 rWrite(pBt->pPag
1e133 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 e1->pDbPage);..
1e134 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 put4byte(&p
1e135 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 Bt->pPage1->aDat
1e136 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 a[28], pBt->nPag
1e137 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d e);.. }.. }.
1e138 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c . sqlite3BtreeL
1e139 65 61 76 65 28 70 29 3b 0d 0a 20 20 72 65 74 75 eave(p);.. retu
1e13a 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
1e13b 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
1e13c 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 is called prior
1e13d 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 to sqlite3Pager
1e13e 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 Commit when a tr
1e13f 61 6e 73 61 63 74 69 6f 6e 0d 0a 2a 2a 20 69 73 ansaction..** is
1e140 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e commited for an
1e141 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 auto-vacuum dat
1e142 61 62 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 abase...**..** I
1e143 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 f SQLITE_OK is r
1e144 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 eturned, then *p
1e145 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f nTrunc is set to
1e146 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 the number of p
1e147 61 67 65 73 0d 0a 2a 2a 20 74 68 65 20 64 61 74 ages..** the dat
1e148 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c abase file shoul
1e149 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 d be truncated t
1e14a 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d o during the com
1e14b 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0d 0a 2a mit process. ..*
1e14c 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 * i.e. the datab
1e14d 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f ase has been reo
1e14e 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 rganized so that
1e14f 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 only the first
1e150 2a 70 6e 54 72 75 6e 63 0d 0a 2a 2a 20 70 61 67 *pnTrunc..** pag
1e151 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0d 0a es are in use...
1e152 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 */..static int a
1e153 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 utoVacuumCommit(
1e154 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0d BtShared *pBt){.
1e155 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
1e156 54 45 5f 4f 4b 3b 0d 0a 20 20 50 61 67 65 72 20 TE_OK;.. Pager
1e157 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 *pPager = pBt->p
1e158 50 61 67 65 72 3b 0d 0a 20 20 56 56 41 5f 4f 4e Pager;.. VVA_ON
1e159 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 LY( int nRef = s
1e15a 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f qlite3PagerRefco
1e15b 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0d 0a unt(pPager) );..
1e15c 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1e15d 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
1e15e 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 Bt->mutex) );..
1e15f 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 invalidateAllOv
1e160 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 erflowCache(pBt)
1e161 3b 0d 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d ;.. assert(pBt-
1e162 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0d 0a 20 >autoVacuum);..
1e163 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 if( !pBt->incrV
1e164 61 63 75 75 6d 20 29 7b 0d 0a 20 20 20 20 50 67 acuum ){.. Pg
1e165 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 no nFin;
1e166 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
1e167 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 ges in database
1e168 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d after autovacuum
1e169 69 6e 67 20 2a 2f 0d 0a 20 20 20 20 50 67 6e 6f ing */.. Pgno
1e16a 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f nFree; /
1e16b 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 * Number of page
1e16c 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 s on the freelis
1e16d 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0d 0a t initially */..
1e16e 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 Pgno nPtrmap
1e16f 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 ; /* Number
1e170 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 of PtrMap pages
1e171 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0d to be freed */.
1e172 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b . Pgno iFree;
1e173 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e /* The n
1e174 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 ext page to be f
1e175 72 65 65 64 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 reed */.. int
1e176 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 nEntry;
1e177 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 /* Number of ent
1e178 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d ries on one ptrm
1e179 61 70 20 70 61 67 65 20 2a 2f 0d 0a 20 20 20 20 ap page */..
1e17a 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 Pgno nOrig;
1e17b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 /* Database s
1e17c 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 ize before freei
1e17d 6e 67 20 2a 2f 0d 0a 0d 0a 20 20 20 20 6e 4f 72 ng */.... nOr
1e17e 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f ig = btreePageco
1e17f 75 6e 74 28 70 42 74 29 3b 0d 0a 20 20 20 20 69 unt(pBt);.. i
1e180 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 f( PTRMAP_ISPAGE
1e181 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 (pBt, nOrig) ||
1e182 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 nOrig==PENDING_B
1e183 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b YTE_PAGE(pBt) ){
1e184 0d 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 .. /* It is
1e185 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f not possible to
1e186 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 create a databa
1e187 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 se for which the
1e188 20 66 69 6e 61 6c 20 70 61 67 65 0d 0a 20 20 20 final page..
1e189 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 ** is either
1e18a 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 a pointer-map pa
1e18b 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e ge or the pendin
1e18c 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 g-byte page. If
1e18d 6f 6e 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69 73 one.. ** is
1e18e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 encountered, th
1e18f 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 is indicates cor
1e190 72 75 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 ruption...
1e191 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e */.. return
1e192 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1e193 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a BKPT;.. }....
1e194 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 nFree = get4
1e195 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 byte(&pBt->pPage
1e196 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0d 0a 1->aData[36]);..
1e197 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 nEntry = pBt
1e198 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0d ->usableSize/5;.
1e199 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 . nPtrmap = (
1e19a 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d nFree-nOrig+PTRM
1e19b 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e AP_PAGENO(pBt, n
1e19c 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 Orig)+nEntry)/nE
1e19d 6e 74 72 79 3b 0d 0a 20 20 20 20 6e 46 69 6e 20 ntry;.. nFin
1e19e 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 = nOrig - nFree
1e19f 2d 20 6e 50 74 72 6d 61 70 3b 0d 0a 20 20 20 20 - nPtrmap;..
1e1a0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e if( nOrig>PENDIN
1e1a1 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 G_BYTE_PAGE(pBt)
1e1a2 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 && nFin<PENDING
1e1a3 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 _BYTE_PAGE(pBt)
1e1a4 29 7b 0d 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d ){.. nFin--
1e1a5 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 77 68 ;.. }.. wh
1e1a6 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 ile( PTRMAP_ISPA
1e1a7 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c GE(pBt, nFin) ||
1e1a8 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 nFin==PENDING_B
1e1a9 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b YTE_PAGE(pBt) ){
1e1aa 0d 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0d .. nFin--;.
1e1ab 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
1e1ac 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 nFin>nOrig ) ret
1e1ad 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 urn SQLITE_CORRU
1e1ae 50 54 5f 42 4b 50 54 3b 0d 0a 0d 0a 20 20 20 20 PT_BKPT;....
1e1af 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b for(iFree=nOrig;
1e1b0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 iFree>nFin && r
1e1b1 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 c==SQLITE_OK; iF
1e1b2 72 65 65 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 72 ree--){.. r
1e1b3 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 c = incrVacuumSt
1e1b4 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 ep(pBt, nFin, iF
1e1b5 72 65 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ree);.. }..
1e1b6 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 if( (rc==SQLIT
1e1b7 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 E_DONE || rc==SQ
1e1b8 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 LITE_OK) && nFre
1e1b9 65 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 e>0 ){.. rc
1e1ba 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 = sqlite3PagerW
1e1bb 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 rite(pBt->pPage1
1e1bc 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 20 ->pDbPage);..
1e1bd 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 put4byte(&pBt
1e1be 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b ->pPage1->aData[
1e1bf 33 32 5d 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 32], 0);..
1e1c0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 put4byte(&pBt->p
1e1c1 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d Page1->aData[36]
1e1c2 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 70 75 74 , 0);.. put
1e1c3 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 4byte(&pBt->pPag
1e1c4 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e e1->aData[28], n
1e1c5 46 69 6e 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c Fin);.. sql
1e1c6 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 ite3PagerTruncat
1e1c7 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 eImage(pBt->pPag
1e1c8 65 72 2c 20 6e 46 69 6e 29 3b 0d 0a 20 20 20 20 er, nFin);..
1e1c9 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e pBt->nPage = n
1e1ca 46 69 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 Fin;.. }..
1e1cb 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1e1cc 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c OK ){.. sql
1e1cd 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 ite3PagerRollbac
1e1ce 6b 28 70 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 k(pPager);..
1e1cf 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 73 73 65 }.. }.... asse
1e1d0 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 rt( nRef==sqlite
1e1d1 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 3PagerRefcount(p
1e1d2 50 61 67 65 72 29 20 29 3b 0d 0a 20 20 72 65 74 Pager) );.. ret
1e1d3 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 23 65 urn rc;..}....#e
1e1d4 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 lse /* ifndef SQ
1e1d5 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
1e1d6 43 55 55 4d 20 2a 2f 0d 0a 23 20 64 65 66 69 6e CUUM */..# defin
1e1d7 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 e setChildPtrmap
1e1d8 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a s(x) SQLITE_OK..
1e1d9 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
1e1da 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f This routine do
1e1db 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 es the first pha
1e1dc 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 se of a two-phas
1e1dd 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 e commit. This
1e1de 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 63 61 75 73 routine..** caus
1e1df 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f es a rollback jo
1e1e0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 urnal to be crea
1e1e1 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 ted (if it does
1e1e2 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 not already exis
1e1e3 74 29 0d 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c t)..** and popul
1e1e4 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 ated with enough
1e1e5 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 information so
1e1e6 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 that if a power
1e1e7 6c 6f 73 73 20 6f 63 63 75 72 73 0d 0a 2a 2a 20 loss occurs..**
1e1e8 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e the database can
1e1e9 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 be restored to
1e1ea 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 its original sta
1e1eb 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 te by playing ba
1e1ec 63 6b 0d 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e ck..** the journ
1e1ed 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f al. Then the co
1e1ee 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f ntents of the jo
1e1ef 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 urnal are flushe
1e1f0 64 20 6f 75 74 20 74 6f 0d 0a 2a 2a 20 74 68 65 d out to..** the
1e1f1 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 disk. After th
1e1f2 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 e journal is saf
1e1f3 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 ely on oxide, th
1e1f4 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 e changes to the
1e1f5 0d 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 ..** database ar
1e1f6 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 e written into t
1e1f7 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1e1f8 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 and flushed to
1e1f9 6f 78 69 64 65 2e 0d 0a 2a 2a 20 41 74 20 74 68 oxide...** At th
1e1fa 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 e end of this ca
1e1fb 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b ll, the rollback
1e1fc 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 journal still e
1e1fd 78 69 73 74 73 20 6f 6e 20 74 68 65 0d 0a 2a 2a xists on the..**
1e1fe 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 disk and we are
1e1ff 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 still holding a
1e200 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 ll locks, so the
1e201 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 transaction has
1e202 20 6e 6f 74 0d 0a 2a 2a 20 63 6f 6d 6d 69 74 74 not..** committ
1e203 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 ed. See sqlite3
1e204 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
1e205 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 Two() for the se
1e206 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 cond phase of th
1e207 65 0d 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f e..** commit pro
1e208 63 65 73 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 cess...**..** Th
1e209 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d is call is a no-
1e20a 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 op if no write-t
1e20b 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 ransaction is cu
1e20c 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f rrently active o
1e20d 6e 20 70 42 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f n pBt...**..** O
1e20e 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 therwise, sync t
1e20f 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1e210 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 for the btree p
1e211 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e Bt. zMaster poin
1e212 74 73 20 74 6f 0d 0a 2a 2a 20 74 68 65 20 6e 61 ts to..** the na
1e213 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a me of a master j
1e214 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 ournal file that
1e215 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 should be writt
1e216 65 6e 20 69 6e 74 6f 20 74 68 65 0d 0a 2a 2a 20 en into the..**
1e217 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e individual journ
1e218 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e al file, or is N
1e219 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 ULL, indicating
1e21a 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 no master journa
1e21b 6c 20 66 69 6c 65 20 0d 0a 2a 2a 20 28 73 69 6e l file ..** (sin
1e21c 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 gle database tra
1e21d 6e 73 61 63 74 69 6f 6e 29 2e 0d 0a 2a 2a 0d 0a nsaction)...**..
1e21e 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 ** When this is
1e21f 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 called, the mast
1e220 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c er journal shoul
1e221 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 d already have b
1e222 65 65 6e 0d 0a 2a 2a 20 63 72 65 61 74 65 64 2c een..** created,
1e223 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 populated with
1e224 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 this journal poi
1e225 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 nter and synced
1e226 74 6f 20 64 69 73 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a to disk...**..**
1e227 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f Once this is ro
1e228 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e utine has return
1e229 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 ed, the only thi
1e22a 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 ng required to c
1e22b 6f 6d 6d 69 74 0d 0a 2a 2a 20 74 68 65 20 77 72 ommit..** the wr
1e22c 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 ite-transaction
1e22d 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 for this databas
1e22e 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c e file is to del
1e22f 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e ete the journal.
1e230 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1e231 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1e232 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
1e233 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f One(Btree *p, co
1e234 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 nst char *zMaste
1e235 72 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 r){.. int rc =
1e236 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 SQLITE_OK;.. if
1e237 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 ( p->inTrans==TR
1e238 41 4e 53 5f 57 52 49 54 45 20 29 7b 0d 0a 20 20 ANS_WRITE ){..
1e239 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 BtShared *pBt
1e23a 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 20 20 73 = p->pBt;.. s
1e23b 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
1e23c 28 70 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 (p);..#ifndef SQ
1e23d 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
1e23e 43 55 55 4d 0d 0a 20 20 20 20 69 66 28 20 70 42 CUUM.. if( pB
1e23f 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b t->autoVacuum ){
1e240 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 .. rc = aut
1e241 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 oVacuumCommit(pB
1e242 74 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 t);.. if( r
1e243 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
1e244 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
1e245 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a BtreeLeave(p);..
1e246 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 return r
1e247 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 c;.. }..
1e248 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 }..#endif..
1e249 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1e24a 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 rCommitPhaseOne(
1e24b 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 pBt->pPager, zMa
1e24c 73 74 65 72 2c 20 30 29 3b 0d 0a 20 20 20 20 73 ster, 0);.. s
1e24d 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
1e24e 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 (p);.. }.. ret
1e24f 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1e250 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
1e251 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f on is called fro
1e252 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d m both BtreeComm
1e253 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 itPhaseTwo() and
1e254 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 BtreeRollback()
1e255 0d 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 ..** at the conc
1e256 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e lusion of a tran
1e257 73 61 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 saction...*/..st
1e258 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 atic void btreeE
1e259 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 ndTransaction(Bt
1e25a 72 65 65 20 2a 70 29 7b 0d 0a 20 20 42 74 53 68 ree *p){.. BtSh
1e25b 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 ared *pBt = p->p
1e25c 42 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 Bt;.. assert( s
1e25d 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 qlite3BtreeHolds
1e25e 4d 75 74 65 78 28 70 29 20 29 3b 0d 0a 0d 0a 20 Mutex(p) );....
1e25f 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f btreeClearHasCo
1e260 6e 74 65 6e 74 28 70 42 74 29 3b 0d 0a 20 20 69 ntent(pBt);.. i
1e261 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 f( p->inTrans>TR
1e262 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 ANS_NONE && p->d
1e263 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 b->activeVdbeCnt
1e264 3e 31 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 >1 ){.. /* If
1e265 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 there are other
1e266 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e active statemen
1e267 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 ts that belong t
1e268 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0d o this database.
1e269 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 . ** handle,
1e26a 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 downgrade to a r
1e26b 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 ead-only transac
1e26c 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 tion. The other
1e26d 73 74 61 74 65 6d 65 6e 74 73 0d 0a 20 20 20 20 statements..
1e26e 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 ** may still be
1e26f 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 reading from the
1e270 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0d 0a database. */..
1e271 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c downgradeAll
1e272 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 SharedCacheTable
1e273 4c 6f 63 6b 73 28 70 29 3b 0d 0a 20 20 20 20 70 Locks(p);.. p
1e274 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e ->inTrans = TRAN
1e275 53 5f 52 45 41 44 3b 0d 0a 20 20 7d 65 6c 73 65 S_READ;.. }else
1e276 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 {.. /* If the
1e277 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 handle had any
1e278 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 kind of transact
1e279 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d ion open, decrem
1e27a 65 6e 74 20 74 68 65 20 0d 0a 20 20 20 20 2a 2a ent the .. **
1e27b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 transaction cou
1e27c 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 nt of the shared
1e27d 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 btree. If the t
1e27e 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 ransaction count
1e27f 20 0d 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 .. ** reache
1e280 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 s 0, set the sha
1e281 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 red state to TRA
1e282 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c NS_NONE. The unl
1e283 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 ockBtreeIfUnused
1e284 28 29 0d 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 ().. ** call
1e285 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 below will unloc
1e286 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f k the pager. */
1e287 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 .. if( p->inT
1e288 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 rans!=TRANS_NONE
1e289 20 29 7b 0d 0a 20 20 20 20 20 20 63 6c 65 61 72 ){.. clear
1e28a 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 AllSharedCacheTa
1e28b 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0d 0a 20 20 bleLocks(p);..
1e28c 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 pBt->nTransa
1e28d 63 74 69 6f 6e 2d 2d 3b 0d 0a 20 20 20 20 20 20 ction--;..
1e28e 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 if( 0==pBt->nTra
1e28f 6e 73 61 63 74 69 6f 6e 20 29 7b 0d 0a 20 20 20 nsaction ){..
1e290 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e pBt->inTran
1e291 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f saction = TRANS_
1e292 4e 4f 4e 45 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a NONE;.. }..
1e293 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
1e294 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 Set the current
1e295 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 transaction stat
1e296 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 e to TRANS_NONE
1e297 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0d and unlock the .
1e298 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 . ** pager if
1e299 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 this call close
1e29a 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 d the only read
1e29b 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 or write transac
1e29c 74 69 6f 6e 2e 20 20 2a 2f 0d 0a 20 20 20 20 70 tion. */.. p
1e29d 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e ->inTrans = TRAN
1e29e 53 5f 4e 4f 4e 45 3b 0d 0a 20 20 20 20 75 6e 6c S_NONE;.. unl
1e29f 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 ockBtreeIfUnused
1e2a0 28 70 42 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 (pBt);.. }....
1e2a1 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 btreeIntegrity(
1e2a2 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a p);..}..../*..**
1e2a3 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e Commit the tran
1e2a4 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c saction currentl
1e2a5 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0d 0a y in progress...
1e2a6 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 **..** This rout
1e2a7 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 ine implements t
1e2a8 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 he second phase
1e2a9 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d of a 2-phase com
1e2aa 6d 69 74 2e 20 20 54 68 65 0d 0a 2a 2a 20 73 71 mit. The..** sq
1e2ab 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
1e2ac 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 PhaseOne() routi
1e2ad 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 ne does the firs
1e2ae 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 t phase and shou
1e2af 6c 64 0d 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 ld..** be invoke
1e2b0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 d prior to calli
1e2b1 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e ng this routine.
1e2b2 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 The sqlite3Btr
1e2b3 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 eeCommitPhaseOne
1e2b4 28 29 0d 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 ()..** routine d
1e2b5 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 id all the work
1e2b6 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 of writing infor
1e2b7 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 mation out to di
1e2b8 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 sk and flushing
1e2b9 74 68 65 0d 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 the..** contents
1e2ba 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 so that they ar
1e2bb 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 e written onto t
1e2bc 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e he disk platter.
1e2bd 20 20 41 6c 6c 20 74 68 69 73 0d 0a 2a 2a 20 72 All this..** r
1e2be 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f outine has to do
1e2bf 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 is delete or tr
1e2c0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 uncate or zero t
1e2c1 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 he header in the
1e2c2 0d 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 ..** the rollbac
1e2c3 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 k journal (which
1e2c4 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e causes the tran
1e2c5 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 saction to commi
1e2c6 74 29 20 61 6e 64 0d 0a 2a 2a 20 64 72 6f 70 20 t) and..** drop
1e2c7 6c 6f 63 6b 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e locks...**..** N
1e2c8 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 ormally, if an e
1e2c9 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c rror occurs whil
1e2ca 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 e the pager laye
1e2cb 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 r is attempting
1e2cc 74 6f 20 0d 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 to ..** finalize
1e2cd 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
1e2ce 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 journal file, th
1e2cf 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
1e2d0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 rns an error and
1e2d1 0d 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c ..** the upper l
1e2d2 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 ayer will attemp
1e2d3 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f t a rollback. Ho
1e2d4 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 wever, if the se
1e2d5 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0d 0a 2a cond argument..*
1e2d6 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 * is non-zero th
1e2d7 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 en this b-tree t
1e2d8 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 ransaction is pa
1e2d9 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 rt of a multi-fi
1e2da 6c 65 20 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 le ..** transact
1e2db 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 ion. In this cas
1e2dc 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 e, the transacti
1e2dd 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 on has already b
1e2de 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0d 0a een committed ..
1e2df 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 ** (by deleting
1e2e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c a master journal
1e2e1 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 file) and the c
1e2e2 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 aller will ignor
1e2e3 65 20 74 68 69 73 20 0d 0a 2a 2a 20 66 75 6e 63 e this ..** func
1e2e4 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 tions return cod
1e2e5 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 e. So, even if a
1e2e6 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 n error occurs i
1e2e7 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 n the pager laye
1e2e8 72 2c 0d 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 r,..** reset the
1e2e9 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 b-tree objects
1e2ea 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 internal state t
1e2eb 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 o indicate that
1e2ec 74 68 65 20 77 72 69 74 65 0d 0a 2a 2a 20 74 72 the write..** tr
1e2ed 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 ansaction has be
1e2ee 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 en closed. This
1e2ef 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 is quite safe, a
1e2f0 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c s the pager will
1e2f1 20 68 61 76 65 0d 0a 2a 2a 20 74 72 61 6e 73 69 have..** transi
1e2f2 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 tioned to the er
1e2f3 72 6f 72 20 73 74 61 74 65 2e 0d 0a 2a 2a 0d 0a ror state...**..
1e2f4 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c ** This will rel
1e2f5 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c ease the write l
1e2f6 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 ock on the datab
1e2f7 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 ase file. If th
1e2f8 65 72 65 0d 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 ere..** are no a
1e2f9 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 ctive cursors, i
1e2fa 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 t also releases
1e2fb 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0d 0a the read lock...
1e2fc 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1e2fd 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
1e2fe 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 reeCommitPhaseTw
1e2ff 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 o(Btree *p, int
1e300 62 43 6c 65 61 6e 75 70 29 7b 0d 0a 0d 0a 20 20 bCleanup){....
1e301 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d if( p->inTrans==
1e302 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 TRANS_NONE ) ret
1e303 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
1e304 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e sqlite3BtreeEn
1e305 74 65 72 28 70 29 3b 0d 0a 20 20 62 74 72 65 65 ter(p);.. btree
1e306 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0d 0a 0d Integrity(p);...
1e307 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e . /* If the han
1e308 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d dle has a write-
1e309 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e transaction open
1e30a 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 , commit the sha
1e30b 72 65 64 2d 62 74 72 65 65 73 20 0d 0a 20 20 2a red-btrees .. *
1e30c 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e * transaction an
1e30d 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 d set the shared
1e30e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f state to TRANS_
1e30f 52 45 41 44 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 READ... */.. i
1e310 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 f( p->inTrans==T
1e311 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0d 0a 20 RANS_WRITE ){..
1e312 20 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 20 int rc;..
1e313 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 BtShared *pBt =
1e314 70 2d 3e 70 42 74 3b 0d 0a 20 20 20 20 61 73 73 p->pBt;.. ass
1e315 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e ert( pBt->inTran
1e316 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 saction==TRANS_W
1e317 52 49 54 45 20 29 3b 0d 0a 20 20 20 20 61 73 73 RITE );.. ass
1e318 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 ert( pBt->nTrans
1e319 61 63 74 69 6f 6e 3e 30 20 29 3b 0d 0a 20 20 20 action>0 );..
1e31a 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 rc = sqlite3Pag
1e31b 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f erCommitPhaseTwo
1e31c 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0d 0a (pBt->pPager);..
1e31d 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1e31e 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 TE_OK && bCleanu
1e31f 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 73 p==0 ){.. s
1e320 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
1e321 28 70 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 (p);.. retu
1e322 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 rn rc;.. }..
1e323 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 pBt->inTransa
1e324 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 ction = TRANS_RE
1e325 41 44 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 62 74 AD;.. }.... bt
1e326 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f reeEndTransactio
1e327 6e 28 70 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 n(p);.. sqlite3
1e328 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a BtreeLeave(p);..
1e329 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
1e32a 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a OK;..}..../*..**
1e32b 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 Do both phases
1e32c 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0d 0a 2a 2f of a commit...*/
1e32d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1e32e 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
1e32f 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 eCommit(Btree *p
1e330 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 ){.. int rc;..
1e331 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
1e332 65 72 28 70 29 3b 0d 0a 20 20 72 63 20 3d 20 73 er(p);.. rc = s
1e333 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 qlite3BtreeCommi
1e334 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b tPhaseOne(p, 0);
1e335 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 .. if( rc==SQLI
1e336 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 TE_OK ){.. rc
1e337 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
1e338 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c ommitPhaseTwo(p,
1e339 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 0);.. }.. sql
1e33a 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 ite3BtreeLeave(p
1e33b 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b );.. return rc;
1e33c 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e ..}....#ifndef N
1e33d 44 45 42 55 47 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 DEBUG../*..** Re
1e33e 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 turn the number
1e33f 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 of write-cursors
1e340 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 open on this ha
1e341 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f ndle. This is fo
1e342 72 20 75 73 65 0d 0a 2a 2a 20 69 6e 20 61 73 73 r use..** in ass
1e343 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e ert() expression
1e344 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 s, so it is only
1e345 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 compiled if NDE
1e346 42 55 47 20 69 73 20 6e 6f 74 0d 0a 2a 2a 20 64 BUG is not..** d
1e347 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 efined...**..**
1e348 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 For the purposes
1e349 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 of this routine
1e34a 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 , a write-cursor
1e34b 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 is any cursor t
1e34c 68 61 74 0d 0a 2a 2a 20 69 73 20 63 61 70 61 62 hat..** is capab
1e34d 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f le of writing to
1e34e 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 the databse. T
1e34f 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 hat means the cu
1e350 72 73 6f 72 20 77 61 73 0d 0a 2a 2a 20 6f 72 69 rsor was..** ori
1e351 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 ginally opened f
1e352 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 or writing and t
1e353 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f he cursor has no
1e354 74 20 62 65 20 64 69 73 61 62 6c 65 64 0d 0a 2a t be disabled..*
1e355 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 * by having its
1e356 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f state changed to
1e357 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0d 0a CURSOR_FAULT...
1e358 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 63 */..static int c
1e359 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 ountWriteCursors
1e35a 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b (BtShared *pBt){
1e35b 0d 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 .. BtCursor *pC
1e35c 75 72 3b 0d 0a 20 20 69 6e 74 20 72 20 3d 20 30 ur;.. int r = 0
1e35d 3b 0d 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 ;.. for(pCur=pB
1e35e 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 t->pCursor; pCur
1e35f 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 ; pCur=pCur->pNe
1e360 78 74 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 43 xt){.. if( pC
1e361 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 ur->wrFlag && pC
1e362 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 ur->eState!=CURS
1e363 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 OR_FAULT ) r++;
1e364 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
1e365 72 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d r;..}..#endif...
1e366 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ./*..** This rou
1e367 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 tine sets the st
1e368 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 ate to CURSOR_FA
1e369 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f ULT and the erro
1e36a 72 0d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 r..** code to er
1e36b 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 rCode for every
1e36c 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 cursor on BtShar
1e36d 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0d 0a ed that pBtree..
1e36e 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a ** references...
1e36f 2a 2a 0d 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 **..** Every cur
1e370 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 sor is tripped,
1e371 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 including cursor
1e372 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0d 0a 2a s that belong..*
1e373 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 * to other datab
1e374 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 ase connections
1e375 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 that happen to b
1e376 65 20 73 68 61 72 69 6e 67 0d 0a 2a 2a 20 74 68 e sharing..** th
1e377 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 e cache with pBt
1e378 72 65 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 ree...**..** Thi
1e379 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 s routine gets c
1e37a 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c alled when a rol
1e37b 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0d 0a 2a lback occurs...*
1e37c 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 * All cursors us
1e37d 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 ing the same cac
1e37e 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 he must be tripp
1e37f 65 64 0d 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e ed..** to preven
1e380 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 t them from tryi
1e381 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 ng to use the bt
1e382 72 65 65 20 61 66 74 65 72 0d 0a 2a 2a 20 74 68 ree after..** th
1e383 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 e rollback. The
1e384 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 rollback may ha
1e385 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 ve deleted table
1e386 73 0d 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 s..** or moved r
1e387 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 oot pages, so it
1e388 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 is not sufficie
1e389 6e 74 20 74 6f 0d 0a 2a 2a 20 73 61 76 65 20 74 nt to..** save t
1e38a 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 he state of the
1e38b 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 cursor. The cur
1e38c 73 6f 72 20 6d 75 73 74 20 62 65 0d 0a 2a 2a 20 sor must be..**
1e38d 69 6e 76 61 6c 69 64 61 74 65 64 2e 0d 0a 2a 2f invalidated...*/
1e38e 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1e38f 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 void sqlite3Btr
1e390 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 eeTripAllCursors
1e391 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 (Btree *pBtree,
1e392 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0d 0a 20 int errCode){..
1e393 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0d 0a 20 BtCursor *p;..
1e394 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
1e395 65 72 28 70 42 74 72 65 65 29 3b 0d 0a 20 20 66 er(pBtree);.. f
1e396 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 or(p=pBtree->pBt
1e397 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d ->pCursor; p; p=
1e398 70 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 p->pNext){..
1e399 69 6e 74 20 69 3b 0d 0a 20 20 20 20 73 71 6c 69 int i;.. sqli
1e39a 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 te3BtreeClearCur
1e39b 73 6f 72 28 70 29 3b 0d 0a 20 20 20 20 70 2d 3e sor(p);.. p->
1e39c 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f eState = CURSOR_
1e39d 46 41 55 4c 54 3b 0d 0a 20 20 20 20 70 2d 3e 73 FAULT;.. p->s
1e39e 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 kipNext = errCod
1e39f 65 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b e;.. for(i=0;
1e3a0 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b i<=p->iPage; i+
1e3a1 2b 29 7b 0d 0a 20 20 20 20 20 20 72 65 6c 65 61 +){.. relea
1e3a2 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 sePage(p->apPage
1e3a3 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 70 2d 3e [i]);.. p->
1e3a4 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0d 0a apPage[i] = 0;..
1e3a5 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 73 71 }.. }.. sq
1e3a6 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 lite3BtreeLeave(
1e3a7 70 42 74 72 65 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f pBtree);..}..../
1e3a8 2a 0d 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 *..** Rollback t
1e3a9 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 he transaction i
1e3aa 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c n progress. All
1e3ab 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 cursors will be
1e3ac 0d 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 ..** invalided b
1e3ad 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e y this operation
1e3ae 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 . Any attempt t
1e3af 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0d 0a o use a cursor..
1e3b0 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e ** that was open
1e3b1 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e at the beginnin
1e3b2 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 g of this operat
1e3b3 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0d ion will result.
1e3b4 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e .** in an error.
1e3b5 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 77 69 ..**..** This wi
1e3b6 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 ll release the w
1e3b7 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 rite lock on the
1e3b8 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 database file.
1e3b9 20 49 66 20 74 68 65 72 65 0d 0a 2a 2a 20 61 72 If there..** ar
1e3ba 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 e no active curs
1e3bb 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c ors, it also rel
1e3bc 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c eases the read l
1e3bd 6f 63 6b 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ock...*/..SQLITE
1e3be 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
1e3bf 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 ite3BtreeRollbac
1e3c0 6b 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 k(Btree *p){..
1e3c1 69 6e 74 20 72 63 3b 0d 0a 20 20 42 74 53 68 61 int rc;.. BtSha
1e3c2 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 red *pBt = p->pB
1e3c3 74 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 t;.. MemPage *p
1e3c4 50 61 67 65 31 3b 0d 0a 0d 0a 20 20 73 71 6c 69 Page1;.... sqli
1e3c5 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 te3BtreeEnter(p)
1e3c6 3b 0d 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c ;.. rc = saveAl
1e3c7 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c lCursors(pBt, 0,
1e3c8 20 30 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 0);..#ifndef SQ
1e3c9 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 LITE_OMIT_SHARED
1e3ca 5f 43 41 43 48 45 0d 0a 20 20 69 66 28 20 72 63 _CACHE.. if( rc
1e3cb 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a !=SQLITE_OK ){..
1e3cc 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 /* This is a
1e3cd 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 horrible situat
1e3ce 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 ion. An IO or ma
1e3cf 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 lloc() error occ
1e3d0 75 72 72 65 64 20 77 68 69 6c 73 74 0d 0a 20 20 urred whilst..
1e3d1 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 ** trying to s
1e3d2 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 ave cursor posit
1e3d3 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 ions. If this is
1e3d4 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f an automatic ro
1e3d5 6c 6c 62 61 63 6b 20 28 61 73 0d 0a 20 20 20 20 llback (as..
1e3d6 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 ** the result of
1e3d7 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d a constraint, m
1e3d8 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 alloc() failure
1e3d9 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 or IO error) the
1e3da 6e 20 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 n .. ** the c
1e3db 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 ache may be inte
1e3dc 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 rnally inconsist
1e3dd 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e ent (not contain
1e3de 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f valid trees) so
1e3df 0d 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e .. ** we cann
1e3e0 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e ot simply return
1e3e1 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 the error to th
1e3e2 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 e caller. Instea
1e3e3 64 2c 20 61 62 6f 72 74 20 0d 0a 20 20 20 20 2a d, abort .. *
1e3e4 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 * all queries th
1e3e5 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 at may be using
1e3e6 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f any of the curso
1e3e7 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 rs that failed t
1e3e8 6f 20 73 61 76 65 2e 0d 0a 20 20 20 20 2a 2f 0d o save... */.
1e3e9 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 . sqlite3Btre
1e3ea 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 eTripAllCursors(
1e3eb 70 2c 20 72 63 29 3b 0d 0a 20 20 7d 0d 0a 23 65 p, rc);.. }..#e
1e3ec 6e 64 69 66 0d 0a 20 20 62 74 72 65 65 49 6e 74 ndif.. btreeInt
1e3ed 65 67 72 69 74 79 28 70 29 3b 0d 0a 0d 0a 20 20 egrity(p);....
1e3ee 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d if( p->inTrans==
1e3ef 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0d 0a TRANS_WRITE ){..
1e3f0 20 20 20 20 69 6e 74 20 72 63 32 3b 0d 0a 0d 0a int rc2;....
1e3f1 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e assert( TRAN
1e3f2 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e S_WRITE==pBt->in
1e3f3 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0d 0a Transaction );..
1e3f4 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 rc2 = sqlite
1e3f5 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 3PagerRollback(p
1e3f6 42 74 2d 3e 70 50 61 67 65 72 29 3b 0d 0a 20 20 Bt->pPager);..
1e3f7 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 if( rc2!=SQLIT
1e3f8 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 E_OK ){.. r
1e3f9 63 20 3d 20 72 63 32 3b 0d 0a 20 20 20 20 7d 0d c = rc2;.. }.
1e3fa 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f ... /* The ro
1e3fb 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 llback may have
1e3fc 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 destroyed the pP
1e3fd 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 age1->aData valu
1e3fe 65 2e 20 20 53 6f 0d 0a 20 20 20 20 2a 2a 20 63 e. So.. ** c
1e3ff 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 all btreeGetPage
1e400 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 () on page 1 aga
1e401 69 6e 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 in to make..
1e402 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e ** sure pPage1->
1e403 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 aData is set cor
1e404 72 65 63 74 6c 79 2e 20 2a 2f 0d 0a 20 20 20 20 rectly. */..
1e405 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 if( btreeGetPage
1e406 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 (pBt, 1, &pPage1
1e407 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 , 0)==SQLITE_OK
1e408 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 ){.. int nP
1e409 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 age = get4byte(2
1e40a 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 8+(u8*)pPage1->a
1e40b 44 61 74 61 29 3b 0d 0a 20 20 20 20 20 20 74 65 Data);.. te
1e40c 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 stcase( nPage==0
1e40d 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 6e );.. if( n
1e40e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 Page==0 ) sqlite
1e40f 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 3PagerPagecount(
1e410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 pBt->pPager, &nP
1e411 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 74 65 73 age);.. tes
1e412 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 tcase( pBt->nPag
1e413 65 21 3d 6e 50 61 67 65 20 29 3b 0d 0a 20 20 20 e!=nPage );..
1e414 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 pBt->nPage =
1e415 6e 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 72 65 nPage;.. re
1e416 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 leasePage(pPage1
1e417 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61 );.. }.. a
1e418 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 ssert( countWrit
1e419 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 eCursors(pBt)==0
1e41a 20 29 3b 0d 0a 20 20 20 20 70 42 74 2d 3e 69 6e );.. pBt->in
1e41b 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 Transaction = TR
1e41c 41 4e 53 5f 52 45 41 44 3b 0d 0a 20 20 7d 0d 0a ANS_READ;.. }..
1e41d 0d 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e .. btreeEndTran
1e41e 73 61 63 74 69 6f 6e 28 70 29 3b 0d 0a 20 20 73 saction(p);.. s
1e41f 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
1e420 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 (p);.. return r
1e421 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1e422 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e Start a statemen
1e423 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e t subtransaction
1e424 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 . The subtransac
1e425 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 tion can can be
1e426 72 6f 6c 6c 65 64 0d 0a 2a 2a 20 62 61 63 6b 20 rolled..** back
1e427 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 independently of
1e428 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 the main transa
1e429 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 ction. You must
1e42a 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 start a transact
1e42b 69 6f 6e 20 0d 0a 2a 2a 20 62 65 66 6f 72 65 20 ion ..** before
1e42c 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 starting a subtr
1e42d 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 ansaction. The s
1e42e 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 ubtransaction is
1e42f 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 ended automatic
1e430 61 6c 6c 79 20 0d 0a 2a 2a 20 69 66 20 74 68 65 ally ..** if the
1e431 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f main transactio
1e432 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c n commits or rol
1e433 6c 73 20 62 61 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a ls back...**..**
1e434 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 Statement subtr
1e435 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 ansactions are u
1e436 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 sed around indiv
1e437 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d idual SQL statem
1e438 65 6e 74 73 0d 0a 2a 2a 20 74 68 61 74 20 61 72 ents..** that ar
1e439 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 e contained with
1e43a 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d in a BEGIN...COM
1e43b 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 MIT block. If a
1e43c 20 63 6f 6e 73 74 72 61 69 6e 74 0d 0a 2a 2a 20 constraint..**
1e43d 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 error occurs wit
1e43e 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e hin the statemen
1e43f 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 t, the effect of
1e440 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d that one statem
1e441 65 6e 74 0d 0a 2a 2a 20 63 61 6e 20 62 65 20 72 ent..** can be r
1e442 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f olled back witho
1e443 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c ut having to rol
1e444 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 lback the entire
1e445 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a transaction...*
1e446 2a 0d 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e *..** A statemen
1e447 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f t sub-transactio
1e448 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 n is implemented
1e449 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 as an anonymous
1e44a 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0d savepoint. The.
1e44b 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 .** value passed
1e44c 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 as the second p
1e44d 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 arameter is the
1e44e 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 total number of
1e44f 73 61 76 65 70 6f 69 6e 74 73 2c 0d 0a 2a 2a 20 savepoints,..**
1e450 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 including the ne
1e451 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 w anonymous save
1e452 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 point, open on t
1e453 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 he B-Tree. i.e.
1e454 69 66 20 74 68 65 72 65 0d 0a 2a 2a 20 61 72 65 if there..** are
1e455 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 no active savep
1e456 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 oints and no oth
1e457 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 er statement-tra
1e458 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0d nsactions open,.
1e459 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 .** iStatement i
1e45a 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d s 1. This anonym
1e45b 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 ous savepoint ca
1e45c 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 n be released or
1e45d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0d 0a 2a 2a rolled back..**
1e45e 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 using the sqlit
1e45f 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 e3BtreeSavepoint
1e460 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f () function...*/
1e461 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1e462 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
1e463 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 eBeginStmt(Btree
1e464 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d *p, int iStatem
1e465 65 6e 74 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b ent){.. int rc;
1e466 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 .. BtShared *pB
1e467 74 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 73 t = p->pBt;.. s
1e468 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
1e469 28 70 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 (p);.. assert(
1e46a 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e p->inTrans==TRAN
1e46b 53 5f 57 52 49 54 45 20 29 3b 0d 0a 20 20 61 73 S_WRITE );.. as
1e46c 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 sert( (pBt->btsF
1e46d 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f lags & BTS_READ_
1e46e 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0d 0a 20 20 61 ONLY)==0 );.. a
1e46f 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e ssert( iStatemen
1e470 74 3e 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 t>0 );.. assert
1e471 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e ( iStatement>p->
1e472 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 db->nSavepoint )
1e473 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 ;.. assert( pBt
1e474 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d ->inTransaction=
1e475 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0d =TRANS_WRITE );.
1e476 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 . /* At the pag
1e477 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 er level, a stat
1e478 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
1e479 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 n is a savepoint
1e47a 20 77 69 74 68 0d 0a 20 20 2a 2a 20 61 6e 20 69 with.. ** an i
1e47b 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 ndex greater tha
1e47c 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 n all savepoints
1e47d 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 created explici
1e47e 74 6c 79 20 75 73 69 6e 67 0d 0a 20 20 2a 2a 20 tly using.. **
1e47f 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 SQL statements.
1e480 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f It is illegal to
1e481 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f open, release o
1e482 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0d 0a r rollback any..
1e483 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f ** such savepo
1e484 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 ints while the s
1e485 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 tatement transac
1e486 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 tion savepoint i
1e487 73 20 61 63 74 69 76 65 2e 0d 0a 20 20 2a 2f 0d s active... */.
1e488 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 . rc = sqlite3P
1e489 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e agerOpenSavepoin
1e48a 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 t(pBt->pPager, i
1e48b 53 74 61 74 65 6d 65 6e 74 29 3b 0d 0a 20 20 73 Statement);.. s
1e48c 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
1e48d 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 (p);.. return r
1e48e 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1e48f 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d The second argum
1e490 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 ent to this func
1e491 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 tion, op, is alw
1e492 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f ays SAVEPOINT_RO
1e493 4c 4c 42 41 43 4b 0d 0a 2a 2a 20 6f 72 20 53 41 LLBACK..** or SA
1e494 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e VEPOINT_RELEASE.
1e495 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 This function e
1e496 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f ither releases o
1e497 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 r rolls back the
1e498 0d 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 ..** savepoint i
1e499 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 dentified by par
1e49a 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e ameter iSavepoin
1e49b 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 t, depending on
1e49c 74 68 65 20 76 61 6c 75 65 20 0d 0a 2a 2a 20 6f the value ..** o
1e49d 66 20 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4e 6f f op...**..** No
1e49e 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 rmally, iSavepoi
1e49f 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 nt is greater th
1e4a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a an or equal to z
1e4a1 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 ero. However, if
1e4a2 20 6f 70 20 69 73 0d 0a 2a 2a 20 53 41 56 45 50 op is..** SAVEP
1e4a3 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 OINT_ROLLBACK, t
1e4a4 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d hen iSavepoint m
1e4a5 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 ay also be -1. I
1e4a6 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 n this case the
1e4a7 0d 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 ..** contents of
1e4a8 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e the entire tran
1e4a9 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c saction are roll
1e4aa 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 ed back. This is
1e4ab 20 64 69 66 66 65 72 65 6e 74 0d 0a 2a 2a 20 66 different..** f
1e4ac 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 rom a normal tra
1e4ad 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 nsaction rollbac
1e4ae 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 k, as no locks a
1e4af 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 re released and
1e4b0 74 68 65 0d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 the..** transact
1e4b1 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e ion remains open
1e4b2 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
1e4b3 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
1e4b4 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 3BtreeSavepoint(
1e4b5 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 Btree *p, int op
1e4b6 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 , int iSavepoint
1e4b7 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 ){.. int rc = S
1e4b8 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 QLITE_OK;.. if(
1e4b9 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 p && p->inTrans
1e4ba 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b ==TRANS_WRITE ){
1e4bb 0d 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a .. BtShared *
1e4bc 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 pBt = p->pBt;..
1e4bd 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 assert( op==S
1e4be 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
1e4bf 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e || op==SAVEPOIN
1e4c0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0d 0a 20 T_ROLLBACK );..
1e4c1 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 assert( iSave
1e4c2 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 point>=0 || (iSa
1e4c3 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f vepoint==-1 && o
1e4c4 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c p==SAVEPOINT_ROL
1e4c5 4c 42 41 43 4b 29 20 29 3b 0d 0a 20 20 20 20 73 LBACK) );.. s
1e4c6 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
1e4c7 28 70 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 (p);.. rc = s
1e4c8 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 qlite3PagerSavep
1e4c9 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 oint(pBt->pPager
1e4ca 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 , op, iSavepoint
1e4cb 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d );.. if( rc==
1e4cc 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1e4cd 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 if( iSavepoi
1e4ce 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 nt<0 && (pBt->bt
1e4cf 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 sFlags & BTS_INI
1e4d0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 TIALLY_EMPTY)!=0
1e4d1 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 42 74 ){.. pBt
1e4d2 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 ->nPage = 0;..
1e4d3 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 63 20 }.. rc
1e4d4 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 = newDatabase(pB
1e4d5 74 29 3b 0d 0a 20 20 20 20 20 20 70 42 74 2d 3e t);.. pBt->
1e4d6 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 nPage = get4byte
1e4d7 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 (28 + pBt->pPage
1e4d8 31 2d 3e 61 44 61 74 61 29 3b 0d 0a 0d 0a 20 20 1->aData);....
1e4d9 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 /* The datab
1e4da 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 ase size was wri
1e4db 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 tten into the of
1e4dc 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 fset 28 of the h
1e4dd 65 61 64 65 72 0d 0a 20 20 20 20 20 20 2a 2a 20 eader.. **
1e4de 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 when the transac
1e4df 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f tion started, so
1e4e0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 we know that th
1e4e1 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 e value at offse
1e4e2 74 0d 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 t.. ** 28 i
1e4e3 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0d 0a 20 s nonzero. */..
1e4e4 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 assert( pBt
1e4e5 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0d 0a 20 20 ->nPage>0 );..
1e4e6 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 }.. sqlite3
1e4e7 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a BtreeLeave(p);..
1e4e8 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
1e4e9 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 ;..}..../*..** C
1e4ea 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 reate a new curs
1e4eb 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 or for the BTree
1e4ec 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f whose root is o
1e4ed 6e 20 74 68 65 20 70 61 67 65 0d 0a 2a 2a 20 69 n the page..** i
1e4ee 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 Table. If a read
1e4ef 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 -only cursor is
1e4f0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 requested, it is
1e4f1 20 61 73 73 75 6d 65 64 20 74 68 61 74 0d 0a 2a assumed that..*
1e4f2 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 * the caller alr
1e4f3 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 eady has at leas
1e4f4 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 t a read-only tr
1e4f5 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0d 0a ansaction open..
1e4f6 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 ** on the databa
1e4f7 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 se already. If a
1e4f8 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 write-cursor is
1e4f9 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e requested, then
1e4fa 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 ..** the caller
1e4fb 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 is assumed to ha
1e4fc 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 ve an open write
1e4fd 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a 2a transaction...*
1e4fe 2a 0d 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d *..** If wrFlag=
1e4ff 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 =0, then the cur
1e500 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 sor can only be
1e501 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 used for reading
1e502 2e 0d 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d ...** If wrFlag=
1e503 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 =1, then the cur
1e504 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 sor can be used
1e505 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 for reading or f
1e506 6f 72 0d 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 or..** writing i
1e507 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f f other conditio
1e508 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 ns for writing a
1e509 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 re also met. Th
1e50a 65 73 65 0d 0a 2a 2a 20 61 72 65 20 74 68 65 20 ese..** are the
1e50b 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 conditions that
1e50c 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f must be met in o
1e50d 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 rder for writing
1e50e 20 74 6f 0d 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 to..** be allow
1e50f 65 64 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 31 3a 20 20 ed:..**..** 1:
1e510 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 The cursor must
1e511 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 have been opened
1e512 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0d with wrFlag==1.
1e513 0a 2a 2a 0d 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 .**..** 2: Othe
1e514 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 r database conne
1e515 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 ctions that shar
1e516 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 e the same pager
1e517 20 63 61 63 68 65 0d 0a 2a 2a 20 20 20 20 20 62 cache..** b
1e518 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 ut which are not
1e519 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 in the READ_UNC
1e51a 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d OMMITTED state m
1e51b 61 79 20 6e 6f 74 20 68 61 76 65 0d 0a 2a 2a 20 ay not have..**
1e51c 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e cursors open
1e51d 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 with wrFlag==0
1e51e 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c on the same tabl
1e51f 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0d 0a 2a e. Otherwise..*
1e520 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 * the change
1e521 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 s made by this w
1e522 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c rite cursor woul
1e523 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0d d be visible to.
1e524 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 .** the read
1e525 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 cursors in the
1e526 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 other database c
1e527 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a onnection...**..
1e528 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 ** 3: The datab
1e529 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 ase must be writ
1e52a 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 able (not on rea
1e52b 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0d 0a 2a d-only media)..*
1e52c 2a 0d 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 *..** 4: There
1e52d 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 must be an activ
1e52e 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0d 0a e transaction...
1e52f 2a 2a 0d 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 **..** No checki
1e530 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 ng is done to ma
1e531 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 ke sure that pag
1e532 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 e iTable really
1e533 69 73 20 74 68 65 0d 0a 2a 2a 20 72 6f 6f 74 20 is the..** root
1e534 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 page of a b-tree
1e535 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c . If it is not,
1e536 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 then the cursor
1e537 20 61 63 71 75 69 72 65 64 0d 0a 2a 2a 20 77 69 acquired..** wi
1e538 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 ll not work corr
1e539 65 63 74 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 ectly...**..** I
1e53a 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 t is assumed tha
1e53b 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 t the sqlite3Btr
1e53c 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 eeCursorZero() h
1e53d 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0d 0a as been called..
1e53e 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e ** on pCur to in
1e53f 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d itialize the mem
1e540 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 ory space prior
1e541 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 to invoking this
1e542 20 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2f 0d 0a 73 routine...*/..s
1e543 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 tatic int btreeC
1e544 75 72 73 6f 72 28 0d 0a 20 20 42 74 72 65 65 20 ursor(.. Btree
1e545 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 *p,
1e546 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e547 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f /* The btree */
1e548 0d 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 .. int iTable,
1e549 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e54a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f /* Ro
1e54b 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 ot page of table
1e54c 20 74 6f 20 6f 70 65 6e 20 2a 2f 0d 0a 20 20 69 to open */.. i
1e54d 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 nt wrFlag,
1e54e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e54f 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 /* 1 to wr
1e550 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 ite. 0 read-only
1e551 20 2a 2f 0d 0a 20 20 73 74 72 75 63 74 20 4b 65 */.. struct Ke
1e552 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c yInfo *pKeyInfo,
1e553 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1e554 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f First arg to co
1e555 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f mparison functio
1e556 6e 20 2a 2f 0d 0a 20 20 42 74 43 75 72 73 6f 72 n */.. BtCursor
1e557 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 *pCur
1e558 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1e559 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 * Space for new
1e55a 63 75 72 73 6f 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 cursor */..){..
1e55b 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d BtShared *pBt =
1e55c 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 p->pBt;
1e55d 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 /* Share
1e55e 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 d b-tree handle
1e55f 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 */.... assert(
1e560 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 sqlite3BtreeHold
1e561 73 4d 75 74 65 78 28 70 29 20 29 3b 0d 0a 20 20 sMutex(p) );..
1e562 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d assert( wrFlag==
1e563 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 0 || wrFlag==1 )
1e564 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65 20 66 6f ;.... /* The fo
1e565 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 llowing assert s
1e566 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 tatements verify
1e567 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 that if this is
1e568 20 61 20 73 68 61 72 61 62 6c 65 20 0d 0a 20 20 a sharable ..
1e569 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 ** b-tree databa
1e56a 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 se, the connecti
1e56b 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 on is holding th
1e56c 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 e required table
1e56d 20 6c 6f 63 6b 73 2c 20 0d 0a 20 20 2a 2a 20 61 locks, .. ** a
1e56e 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 nd that no other
1e56f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 connection has
1e570 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 any open cursor
1e571 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 that conflicts w
1e572 69 74 68 20 0d 0a 20 20 2a 2a 20 74 68 69 73 20 ith .. ** this
1e573 6c 6f 63 6b 2e 20 20 2a 2f 0d 0a 20 20 61 73 73 lock. */.. ass
1e574 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 ert( hasSharedCa
1e575 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 cheTableLock(p,
1e576 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f iTable, pKeyInfo
1e577 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 !=0, wrFlag+1) )
1e578 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 ;.. assert( wrF
1e579 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 lag==0 || !hasRe
1e57a 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 adConflicts(p, i
1e57b 54 61 62 6c 65 29 20 29 3b 0d 0a 0d 0a 20 20 2f Table) );.... /
1e57c 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 * Assert that th
1e57d 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 e caller has ope
1e57e 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 ned the required
1e57f 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f transaction. */
1e580 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 .. assert( p->i
1e581 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e nTrans>TRANS_NON
1e582 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 E );.. assert(
1e583 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e wrFlag==0 || p->
1e584 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 inTrans==TRANS_W
1e585 52 49 54 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 RITE );.. asser
1e586 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 t( pBt->pPage1 &
1e587 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 & pBt->pPage1->a
1e588 44 61 74 61 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 Data );.... if(
1e589 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 NEVER(wrFlag &&
1e58a 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 (pBt->btsFlags
1e58b 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 & BTS_READ_ONLY)
1e58c 21 3d 30 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 !=0) ){.. ret
1e58d 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f urn SQLITE_READO
1e58e 4e 4c 59 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 NLY;.. }.. if(
1e58f 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 iTable==1 && bt
1e590 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 reePagecount(pBt
1e591 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 61 73 73 )==0 ){.. ass
1e592 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 ert( wrFlag==0 )
1e593 3b 0d 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 ;.. iTable =
1e594 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 0;.. }.... /*
1e595 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 Now that no othe
1e596 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 r errors can occ
1e597 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 ur, finish filli
1e598 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 ng in the BtCurs
1e599 6f 72 0d 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c or.. ** variabl
1e59a 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 es and link the
1e59b 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 cursor into the
1e59c 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 BtShared list.
1e59d 2a 2f 0d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f */.. pCur->pgno
1e59e 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 Root = (Pgno)iTa
1e59f 62 6c 65 3b 0d 0a 20 20 70 43 75 72 2d 3e 69 50 ble;.. pCur->iP
1e5a0 61 67 65 20 3d 20 2d 31 3b 0d 0a 20 20 70 43 75 age = -1;.. pCu
1e5a1 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b r->pKeyInfo = pK
1e5a2 65 79 49 6e 66 6f 3b 0d 0a 20 20 70 43 75 72 2d eyInfo;.. pCur-
1e5a3 3e 70 42 74 72 65 65 20 3d 20 70 3b 0d 0a 20 20 >pBtree = p;..
1e5a4 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b pCur->pBt = pBt;
1e5a5 0d 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 .. pCur->wrFlag
1e5a6 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0d 0a = (u8)wrFlag;..
1e5a7 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 pCur->pNext =
1e5a8 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0d 0a 20 pBt->pCursor;..
1e5a9 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 if( pCur->pNext
1e5aa 20 29 7b 0d 0a 20 20 20 20 70 43 75 72 2d 3e 70 ){.. pCur->p
1e5ab 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 Next->pPrev = pC
1e5ac 75 72 3b 0d 0a 20 20 7d 0d 0a 20 20 70 42 74 2d ur;.. }.. pBt-
1e5ad 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b >pCursor = pCur;
1e5ae 0d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 .. pCur->eState
1e5af 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 = CURSOR_INVALI
1e5b0 44 3b 0d 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 D;.. pCur->cach
1e5b1 65 64 52 6f 77 69 64 20 3d 20 30 3b 0d 0a 20 20 edRowid = 0;..
1e5b2 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1e5b3 3b 0d 0a 7d 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ;..}..SQLITE_PRI
1e5b4 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1e5b5 42 74 72 65 65 43 75 72 73 6f 72 28 0d 0a 20 20 BtreeCursor(..
1e5b6 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 Btree *p,
1e5b7 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e5b8 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1e5b9 68 65 20 62 74 72 65 65 20 2a 2f 0d 0a 20 20 69 he btree */.. i
1e5ba 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 nt iTable,
1e5bb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e5bc 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f /* Ro
1e5bd 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 ot page of table
1e5be 20 74 6f 20 6f 70 65 6e 20 2a 2f 0d 0a 20 20 69 to open */.. i
1e5bf 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 nt wrFlag,
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e5c1 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 /* 1
1e5c2 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 to write. 0 read
1e5c3 2d 6f 6e 6c 79 20 2a 2f 0d 0a 20 20 73 74 72 75 -only */.. stru
1e5c4 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 ct KeyInfo *pKey
1e5c5 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 Info,
1e5c6 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 /* First
1e5c7 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 arg to xCompare
1e5c8 28 29 20 2a 2f 0d 0a 20 20 42 74 43 75 72 73 6f () */.. BtCurso
1e5c9 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 r *pCur
1e5ca 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e5cb 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 /* Write ne
1e5cc 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f w cursor here */
1e5cd 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d ..){.. int rc;.
1e5ce 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 . sqlite3BtreeE
1e5cf 6e 74 65 72 28 70 29 3b 0d 0a 20 20 72 63 20 3d nter(p);.. rc =
1e5d0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 btreeCursor(p,
1e5d1 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 iTable, wrFlag,
1e5d2 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b pKeyInfo, pCur);
1e5d3 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 .. sqlite3Btree
1e5d4 4c 65 61 76 65 28 70 29 3b 0d 0a 20 20 72 65 74 Leave(p);.. ret
1e5d5 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1e5d6 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
1e5d7 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 size of a BtCurs
1e5d8 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 or object in byt
1e5d9 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 es...**..** This
1e5da 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e interfaces is n
1e5db 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 eeded so that us
1e5dc 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 ers of cursors c
1e5dd 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0d 0a an preallocate..
1e5de 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 ** sufficient st
1e5df 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 orage to hold a
1e5e0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 cursor. The BtC
1e5e1 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 ursor object is
1e5e2 6f 70 61 71 75 65 0d 0a 2a 2a 20 74 6f 20 75 73 opaque..** to us
1e5e3 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e ers so they cann
1e5e4 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 ot do the sizeof
1e5e5 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 () themselves -
1e5e6 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0d 0a they must call..
1e5e7 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e ** this routine.
1e5e8 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1e5e9 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1e5ea 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 BtreeCursorSize(
1e5eb 76 6f 69 64 29 7b 0d 0a 20 20 72 65 74 75 72 6e void){.. return
1e5ec 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 ROUND8(sizeof(B
1e5ed 74 43 75 72 73 6f 72 29 29 3b 0d 0a 7d 0d 0a 0d tCursor));..}...
1e5ee 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 ./*..** Initiali
1e5ef 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 ze memory that w
1e5f0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 ill be converted
1e5f1 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 into a BtCursor
1e5f2 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a 2a object...**..**
1e5f3 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 The simple appr
1e5f4 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 oach here would
1e5f5 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 be to memset() t
1e5f6 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 he entire object
1e5f7 0d 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 ..** to zero. B
1e5f8 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 ut it turns out
1e5f9 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b that the apPage[
1e5fa 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 ] and aiIdx[] ar
1e5fb 72 61 79 73 0d 0a 2a 2a 20 64 6f 20 6e 6f 74 20 rays..** do not
1e5fc 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 need to be zeroe
1e5fd 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c d and they are l
1e5fe 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 arge, so we can
1e5ff 73 61 76 65 20 61 20 6c 6f 74 0d 0a 2a 2a 20 6f save a lot..** o
1e600 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b f run-time by sk
1e601 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 ipping the initi
1e602 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f alization of tho
1e603 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0d 0a 2a 2f se elements...*/
1e604 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
1e605 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 void sqlite3Btr
1e606 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 eeCursorZero(BtC
1e607 75 72 73 6f 72 20 2a 70 29 7b 0d 0a 20 20 6d 65 ursor *p){.. me
1e608 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 mset(p, 0, offse
1e609 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 tof(BtCursor, iP
1e60a 61 67 65 29 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d age));..}..../*.
1e60b 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 .** Set the cach
1e60c 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f ed rowid value o
1e60d 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 f every cursor i
1e60e 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 n the same datab
1e60f 61 73 65 20 66 69 6c 65 0d 0a 2a 2a 20 61 73 20 ase file..** as
1e610 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 pCur and having
1e611 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 the same root pa
1e612 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 ge number as pCu
1e613 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 r. The value is
1e614 0d 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 ..** set to iRow
1e615 69 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 6e 6c 79 id...**..** Only
1e616 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 positive rowid
1e617 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 values are consi
1e618 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 dered valid for
1e619 74 68 69 73 20 63 61 63 68 65 2e 0d 0a 2a 2a 20 this cache...**
1e61a 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 The cache is ini
1e61b 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f tialized to zero
1e61c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 , indicating an
1e61d 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0d 0a invalid cache...
1e61e 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 ** A btree will
1e61f 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a work fine with z
1e620 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 ero or negative
1e621 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 rowids. We just
1e622 20 63 61 6e 6e 6f 74 0d 0a 2a 2a 20 63 61 63 68 cannot..** cach
1e623 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 e zero or negati
1e624 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 ve rowids, which
1e625 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 means tables th
1e626 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0d 0a at use zero or..
1e627 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 ** negative rowi
1e628 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c ds might run a l
1e629 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 ittle slower. B
1e62a 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 ut in practice,
1e62b 7a 65 72 6f 0d 0a 2a 2a 20 6f 72 20 6e 65 67 61 zero..** or nega
1e62c 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 tive rowids are
1e62d 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f very uncommon so
1e62e 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 this should not
1e62f 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0d 0a be a problem...
1e630 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1e631 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 TE void sqlite3B
1e632 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 treeSetCachedRow
1e633 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 id(BtCursor *pCu
1e634 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 r, sqlite3_int64
1e635 20 69 52 6f 77 69 64 29 7b 0d 0a 20 20 42 74 43 iRowid){.. BtC
1e636 75 72 73 6f 72 20 2a 70 3b 0d 0a 20 20 66 6f 72 ursor *p;.. for
1e637 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 (p=pCur->pBt->pC
1e638 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 ursor; p; p=p->p
1e639 4e 65 78 74 29 7b 0d 0a 20 20 20 20 69 66 28 20 Next){.. if(
1e63a 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 p->pgnoRoot==pCu
1e63b 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d r->pgnoRoot ) p-
1e63c 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 >cachedRowid = i
1e63d 52 6f 77 69 64 3b 0d 0a 20 20 7d 0d 0a 20 20 61 Rowid;.. }.. a
1e63e 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 ssert( pCur->cac
1e63f 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 hedRowid==iRowid
1e640 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a );..}..../*..**
1e641 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 Return the cach
1e642 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 ed rowid for the
1e643 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 given cursor.
1e644 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 A negative or ze
1e645 72 6f 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 ro..** return va
1e646 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 lue indicates th
1e647 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 at the rowid cac
1e648 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e he is invalid an
1e649 64 20 73 68 6f 75 6c 64 20 62 65 0d 0a 2a 2a 20 d should be..**
1e64a 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 ignored. If the
1e64b 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 rowid cache has
1e64c 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 never before be
1e64d 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0d 0a en set, then a..
1e64e 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 ** zero is retur
1e64f 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ned...*/..SQLITE
1e650 5f 50 52 49 56 41 54 45 20 73 71 6c 69 74 65 33 _PRIVATE sqlite3
1e651 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 _int64 sqlite3Bt
1e652 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 reeGetCachedRowi
1e653 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 d(BtCursor *pCur
1e654 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 43 75 ){.. return pCu
1e655 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0d r->cachedRowid;.
1e656 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f .}..../*..** Clo
1e657 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 se a cursor. Th
1e658 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 e read lock on t
1e659 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1e65a 20 69 73 20 72 65 6c 65 61 73 65 64 0d 0a 2a 2a is released..**
1e65b 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 when the last c
1e65c 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e ursor is closed.
1e65d 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1e65e 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1e65f 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 BtreeCloseCursor
1e660 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 (BtCursor *pCur)
1e661 7b 0d 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 {.. Btree *pBtr
1e662 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 ee = pCur->pBtre
1e663 65 3b 0d 0a 20 20 69 66 28 20 70 42 74 72 65 65 e;.. if( pBtree
1e664 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d ){.. int i;.
1e665 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 . BtShared *p
1e666 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0d Bt = pCur->pBt;.
1e667 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 . sqlite3Btre
1e668 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0d eEnter(pBtree);.
1e669 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 . sqlite3Btre
1e66a 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 eClearCursor(pCu
1e66b 72 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 75 r);.. if( pCu
1e66c 72 2d 3e 70 50 72 65 76 20 29 7b 0d 0a 20 20 20 r->pPrev ){..
1e66d 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e pCur->pPrev->
1e66e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e pNext = pCur->pN
1e66f 65 78 74 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b ext;.. }else{
1e670 0d 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 .. pBt->pCu
1e671 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 rsor = pCur->pNe
1e672 78 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 xt;.. }..
1e673 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 if( pCur->pNext
1e674 29 7b 0d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e ){.. pCur->
1e675 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 pNext->pPrev = p
1e676 43 75 72 2d 3e 70 50 72 65 76 3b 0d 0a 20 20 20 Cur->pPrev;..
1e677 20 7d 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b }.. for(i=0;
1e678 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b i<=pCur->iPage;
1e679 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 72 65 i++){.. re
1e67a 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e leasePage(pCur->
1e67b 61 70 50 61 67 65 5b 69 5d 29 3b 0d 0a 20 20 20 apPage[i]);..
1e67c 20 7d 0d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 }.. unlockBt
1e67d 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 reeIfUnused(pBt)
1e67e 3b 0d 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 ;.. invalidat
1e67f 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 eOverflowCache(p
1e680 43 75 72 29 3b 0d 0a 20 20 20 20 2f 2a 20 73 71 Cur);.. /* sq
1e681 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 lite3_free(pCur)
1e682 3b 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 ; */.. sqlite
1e683 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 3BtreeLeave(pBtr
1e684 65 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ee);.. }.. ret
1e685 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
1e686 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 }..../*..** Make
1e687 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 sure the BtCurs
1e688 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 or* given in the
1e689 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 argument has a
1e68a 76 61 6c 69 64 0d 0a 2a 2a 20 42 74 43 75 72 73 valid..** BtCurs
1e68b 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 or.info structur
1e68c 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 e. If it is not
1e68d 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 already valid,
1e68e 63 61 6c 6c 0d 0a 2a 2a 20 62 74 72 65 65 50 61 call..** btreePa
1e68f 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c rseCell() to fil
1e690 6c 20 69 74 20 69 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a l it in...**..**
1e691 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 BtCursor.info i
1e692 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 s a cache of the
1e693 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 information in
1e694 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c the current cell
1e695 2e 0d 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 ...** Using this
1e696 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 cache reduces t
1e697 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c he number of cal
1e698 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 ls to btreeParse
1e699 43 65 6c 6c 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 Cell()...**..**
1e69a 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 2007-06-25: The
1e69b 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 re is a bug in s
1e69c 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 ome versions of
1e69d 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 MSVC that cause
1e69e 74 68 65 0d 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 the..** compiler
1e69f 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 to crash when g
1e6a0 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 etCellInfo() is
1e6a1 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 implemented as a
1e6a2 20 6d 61 63 72 6f 2e 0d 0a 2a 2a 20 42 75 74 20 macro...** But
1e6a3 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 there is a measu
1e6a4 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 reable speed adv
1e6a5 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 antage to using
1e6a6 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 the macro on gcc
1e6a7 0d 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 ..** (when less
1e6a8 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a compiler optimiz
1e6a9 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 ations like -Os
1e6aa 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 or -O0 are used
1e6ab 61 6e 64 20 74 68 65 0d 0a 2a 2a 20 63 6f 6d 70 and the..** comp
1e6ac 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e iler is not doin
1e6ad 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 g agressive inli
1e6ae 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 ning.) So we us
1e6af 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f e a real functio
1e6b0 6e 0d 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 n..** for MSVC a
1e6b1 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 nd a macro for e
1e6b2 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 verything else.
1e6b3 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0d 0a Ticket #2457...
1e6b4 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 */..#ifndef NDEB
1e6b5 55 47 0d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 UG.. static voi
1e6b6 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f d assertCellInfo
1e6b7 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 (BtCursor *pCur)
1e6b8 7b 0d 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 {.. CellInfo
1e6b9 69 6e 66 6f 3b 0d 0a 20 20 20 20 69 6e 74 20 69 info;.. int i
1e6ba 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 Page = pCur->iPa
1e6bb 67 65 3b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 ge;.. memset(
1e6bc 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 &info, 0, sizeof
1e6bd 28 69 6e 66 6f 29 29 3b 0d 0a 20 20 20 20 62 74 (info));.. bt
1e6be 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 reeParseCell(pCu
1e6bf 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d r->apPage[iPage]
1e6c0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 , pCur->aiIdx[iP
1e6c1 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0d 0a 20 age], &info);..
1e6c2 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d assert( memcm
1e6c3 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e p(&info, &pCur->
1e6c4 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 info, sizeof(inf
1e6c5 6f 29 29 3d 3d 30 20 29 3b 0d 0a 20 20 7d 0d 0a o))==0 );.. }..
1e6c6 23 65 6c 73 65 0d 0a 20 20 23 64 65 66 69 6e 65 #else.. #define
1e6c7 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 assertCellInfo(
1e6c8 78 29 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 x)..#endif..#ifd
1e6c9 65 66 20 5f 4d 53 43 5f 56 45 52 0d 0a 20 20 2f ef _MSC_VER.. /
1e6ca 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e * Use a real fun
1e6cb 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f ction in MSVC to
1e6cc 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 work around bug
1e6cd 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c s in that compil
1e6ce 65 72 2e 20 2a 2f 0d 0a 20 20 73 74 61 74 69 63 er. */.. static
1e6cf 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 void getCellInf
1e6d0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 o(BtCursor *pCur
1e6d1 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 43 75 72 ){.. if( pCur
1e6d2 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 ->info.nSize==0
1e6d3 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 50 ){.. int iP
1e6d4 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 age = pCur->iPag
1e6d5 65 3b 0d 0a 20 20 20 20 20 20 62 74 72 65 65 50 e;.. btreeP
1e6d6 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 arseCell(pCur->a
1e6d7 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 pPage[iPage],pCu
1e6d8 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c r->aiIdx[iPage],
1e6d9 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0d 0a 20 &pCur->info);..
1e6da 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 pCur->valid
1e6db 4e 4b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d NKey = 1;.. }
1e6dc 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 73 73 else{.. ass
1e6dd 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 ertCellInfo(pCur
1e6de 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
1e6df 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 #else /* if not
1e6e0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0d 0a 20 20 2f _MSC_VER */.. /
1e6e1 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e * Use a macro in
1e6e2 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 all other compi
1e6e3 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 lers so that the
1e6e4 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c function is inl
1e6e5 69 6e 65 64 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 ined */..#define
1e6e6 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 getCellInfo(pCu
1e6e7 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r)
1e6e8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6e9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6ea 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 69 66 28 \.. if(
1e6eb 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a pCur->info.nSiz
1e6ec 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 e==0 ){
1e6ed 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6ee 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6ef 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 20 \..
1e6f0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 int iPage = pCu
1e6f1 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 r->iPage;
1e6f2 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6f3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6f4 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 \..
1e6f5 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c btreeParseCel
1e6f6 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 l(pCur->apPage[i
1e6f7 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 Page],pCur->aiId
1e6f8 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e x[iPage],&pCur->
1e6f9 69 6e 66 6f 29 3b 20 5c 0d 0a 20 20 20 20 70 43 info); \.. pC
1e6fa 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 ur->validNKey =
1e6fb 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1;
1e6fc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6fd 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e6fe 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 7d 65 \.. }e
1e6ff 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 lse{
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e701 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e702 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e703 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a 20 20 \..
1e704 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f assertCellInfo
1e705 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 (pCur);
1e706 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e707 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e708 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a \..
1e709 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f }..#endif /* _
1e70a 4d 53 43 5f 56 45 52 20 2a 2f 0d 0a 0d 0a 23 69 MSC_VER */....#i
1e70b 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a fndef NDEBUG /*
1e70c 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e The next routin
1e70d 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 e used only with
1e70e 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 in assert() stat
1e70f 65 6d 65 6e 74 73 20 2a 2f 0d 0a 2f 2a 0d 0a 2a ements */../*..*
1e710 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
1e711 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 the given BtCur
1e712 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 sor is valid. A
1e713 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 valid cursor is
1e714 20 6f 6e 65 0d 0a 2a 2a 20 74 68 61 74 20 69 73 one..** that is
1e715 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 currently point
1e716 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 ing to a row in
1e717 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 a (non-empty) ta
1e718 62 6c 65 2e 0d 0a 2a 2a 20 54 68 69 73 20 69 73 ble...** This is
1e719 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 a verification
1e71a 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 routine is used
1e71b 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 only within asse
1e71c 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e rt() statements.
1e71d 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
1e71e 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 VATE int sqlite3
1e71f 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c BtreeCursorIsVal
1e720 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 id(BtCursor *pCu
1e721 72 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 70 43 r){.. return pC
1e722 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 ur && pCur->eSta
1e723 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 te==CURSOR_VALID
1e724 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 ;..}..#endif /*
1e725 4e 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 2f 2a 0d NDEBUG */..../*.
1e726 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 .** Set *pSize t
1e727 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 o the size of th
1e728 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 e buffer needed
1e729 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 to hold the valu
1e72a 65 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 6b 65 79 e of..** the key
1e72b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
1e72c 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 entry. If the
1e72d 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f cursor is not po
1e72e 69 6e 74 69 6e 67 0d 0a 2a 2a 20 74 6f 20 61 20 inting..** to a
1e72f 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 valid entry, *pS
1e730 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e ize is set to 0.
1e731 20 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 61 20 ..**..** For a
1e732 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 table with the I
1e733 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 NTKEY flag set,
1e734 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 this routine ret
1e735 75 72 6e 73 20 74 68 65 20 6b 65 79 0d 0a 2a 2a urns the key..**
1e736 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 itself, not the
1e737 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
1e738 20 69 6e 20 74 68 65 20 6b 65 79 2e 0d 0a 2a 2a in the key...**
1e739 0d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 ..** The caller
1e73a 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 must position th
1e73b 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 e cursor prior t
1e73c 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 o invoking this
1e73d 72 6f 75 74 69 6e 65 2e 0d 0a 2a 2a 20 0d 0a 2a routine...** ..*
1e73e 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 * This routine c
1e73f 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 annot fail. It
1e740 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 always returns S
1e741 51 4c 49 54 45 5f 4f 4b 2e 20 20 0d 0a 2a 2f 0d QLITE_OK. ..*/.
1e742 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
1e743 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
1e744 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 KeySize(BtCursor
1e745 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 *pCur, i64 *pSi
1e746 7a 65 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 ze){.. assert(
1e747 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 cursorHoldsMutex
1e748 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 61 73 73 (pCur) );.. ass
1e749 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 ert( pCur->eStat
1e74a 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 e==CURSOR_INVALI
1e74b 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 D || pCur->eStat
1e74c 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 e==CURSOR_VALID
1e74d 29 3b 0d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e );.. if( pCur->
1e74e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 eState!=CURSOR_V
1e74f 41 4c 49 44 20 29 7b 0d 0a 20 20 20 20 2a 70 53 ALID ){.. *pS
1e750 69 7a 65 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 ize = 0;.. }els
1e751 65 7b 0d 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 e{.. getCellI
1e752 6e 66 6f 28 70 43 75 72 29 3b 0d 0a 20 20 20 20 nfo(pCur);..
1e753 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 *pSize = pCur->i
1e754 6e 66 6f 2e 6e 4b 65 79 3b 0d 0a 20 20 7d 0d 0a nfo.nKey;.. }..
1e755 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
1e756 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a OK;..}..../*..**
1e757 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 Set *pSize to t
1e758 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
1e759 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 es of data in th
1e75a 65 20 65 6e 74 72 79 20 74 68 65 0d 0a 2a 2a 20 e entry the..**
1e75b 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 cursor currently
1e75c 20 70 6f 69 6e 74 73 20 74 6f 2e 0d 0a 2a 2a 0d points to...**.
1e75d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d .** The caller m
1e75e 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 ust guarantee th
1e75f 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 at the cursor is
1e760 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e pointing to a n
1e761 6f 6e 2d 4e 55 4c 4c 0d 0a 2a 2a 20 76 61 6c 69 on-NULL..** vali
1e762 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 d entry. In oth
1e763 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 er words, the ca
1e764 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 lling procedure
1e765 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0d 0a must guarantee..
1e766 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 ** that the curs
1e767 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 or has Cursor.eS
1e768 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c tate==CURSOR_VAL
1e769 49 44 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 61 69 6c ID...**..** Fail
1e76a 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 ure is not possi
1e76b 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 ble. This funct
1e76c 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 ion always retur
1e76d 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a ns SQLITE_OK...*
1e76e 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 * It might just
1e76f 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f as well be a pro
1e770 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e cedure (returnin
1e771 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 g void) but we c
1e772 6f 6e 74 69 6e 75 65 0d 0a 2a 2a 20 74 6f 20 72 ontinue..** to r
1e773 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
1e774 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 result code for
1e775 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 historical reas
1e776 6f 6e 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ons...*/..SQLITE
1e777 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
1e778 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a ite3BtreeDataSiz
1e779 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 e(BtCursor *pCur
1e77a 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0d 0a , u32 *pSize){..
1e77b 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 assert( cursor
1e77c 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 HoldsMutex(pCur)
1e77d 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
1e77e 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 Cur->eState==CUR
1e77f 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 SOR_VALID );..
1e780 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 getCellInfo(pCur
1e781 29 3b 0d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 );.. *pSize = p
1e782 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b Cur->info.nData;
1e783 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
1e784 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
1e785 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 ** Given the pag
1e786 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f e number of an o
1e787 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 verflow page in
1e788 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 the database (pa
1e789 72 61 6d 65 74 65 72 0d 0a 2a 2a 20 6f 76 66 6c rameter..** ovfl
1e78a 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e ), this function
1e78b 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 finds the page
1e78c 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 number of the ne
1e78d 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0d xt page in the .
1e78e 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 .** linked list
1e78f 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 of overflow page
1e790 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 s. If possible,
1e791 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f it uses the auto
1e792 2d 76 61 63 75 75 6d 0d 0a 2a 2a 20 70 6f 69 6e -vacuum..** poin
1e793 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 ter-map data ins
1e794 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 tead of reading
1e795 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 the content of p
1e796 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 age ovfl to do s
1e797 6f 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 o. ..**..** If a
1e798 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 n error occurs a
1e799 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 n SQLite error c
1e79a 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e ode is returned.
1e79b 20 4f 74 68 65 72 77 69 73 65 3a 0d 0a 2a 2a 0d Otherwise:..**.
1e79c 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d .** The page num
1e79d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 ber of the next
1e79e 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e overflow page in
1e79f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 the linked list
1e7a0 20 69 73 20 0d 0a 2a 2a 20 77 72 69 74 74 65 6e is ..** written
1e7a1 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 to *pPgnoNext.
1e7a2 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 If page ovfl is
1e7a3 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e the last page in
1e7a4 20 69 74 73 20 6c 69 6e 6b 65 64 20 0d 0a 2a 2a its linked ..**
1e7a5 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 list, *pPgnoNex
1e7a6 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f t is set to zero
1e7a7 2e 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 70 . ..**..** If pp
1e7a8 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c Page is not NULL
1e7a9 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 , and a referenc
1e7aa 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 e to the MemPage
1e7ab 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f object correspo
1e7ac 6e 64 69 6e 67 0d 0a 2a 2a 20 74 6f 20 70 61 67 nding..** to pag
1e7ad 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 e number pOvfl w
1e7ae 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 as obtained, the
1e7af 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 n *ppPage is set
1e7b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 to point to tha
1e7b1 74 0d 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e t..** reference.
1e7b2 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f It is the respo
1e7b3 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 nsibility of the
1e7b4 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 caller to call
1e7b5 72 65 6c 65 61 73 65 50 61 67 65 28 29 0d 0a 2a releasePage()..*
1e7b6 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 * on *ppPage to
1e7b7 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e free the referen
1e7b8 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 ce. In no refere
1e7b9 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 nce was obtained
1e7ba 20 28 62 65 63 61 75 73 65 0d 0a 2a 2a 20 74 68 (because..** th
1e7bb 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 e pointer-map wa
1e7bc 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e s used to obtain
1e7bd 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a the value for *
1e7be 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e pPgnoNext), then
1e7bf 0d 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 ..** *ppPage is
1e7c0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0d 0a 2a 2f set to zero...*/
1e7c1 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 ..static int get
1e7c2 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0d 0a 20 OverflowPage(..
1e7c3 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 BtShared *pBt,
1e7c4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1e7c5 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 The database fi
1e7c6 6c 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 6f 76 le */.. Pgno ov
1e7c7 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 fl,
1e7c8 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 /* Current
1e7c9 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e overflow page n
1e7ca 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 4d 65 6d 50 umber */.. MemP
1e7cb 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 age **ppPage,
1e7cc 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
1e7cd 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 MemPage handle
1e7ce 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f (may be NULL) */
1e7cf 0d 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e .. Pgno *pPgnoN
1e7d0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 ext
1e7d1 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 /* OUT: Next ov
1e7d2 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 erflow page numb
1e7d3 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 50 67 6e er */..){.. Pgn
1e7d4 6f 20 6e 65 78 74 20 3d 20 30 3b 0d 0a 20 20 4d o next = 0;.. M
1e7d5 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 emPage *pPage =
1e7d6 30 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 0;.. int rc = S
1e7d7 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 61 QLITE_OK;.... a
1e7d8 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d ssert( sqlite3_m
1e7d9 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d utex_held(pBt->m
1e7da 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 utex) );.. asse
1e7db 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0d 0a rt(pPgnoNext);..
1e7dc 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1e7dd 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d _OMIT_AUTOVACUUM
1e7de 0d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 .. /* Try to fi
1e7df 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 nd the next page
1e7e0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 in the overflow
1e7e1 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0d list using the.
1e7e2 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d . ** autovacuum
1e7e3 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 pointer-map pag
1e7e4 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 es. Guess that t
1e7e5 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 he next page in
1e7e6 0d 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 .. ** the overf
1e7e7 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 low list is page
1e7e8 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 number (ovfl+1)
1e7e9 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 . If that guess
1e7ea 74 75 72 6e 73 20 0d 0a 20 20 2a 2a 20 6f 75 74 turns .. ** out
1e7eb 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 to be wrong, fa
1e7ec 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 ll back to loadi
1e7ed 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 ng the data of p
1e7ee 61 67 65 20 0d 0a 20 20 2a 2a 20 6e 75 6d 62 65 age .. ** numbe
1e7ef 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d r ovfl to determ
1e7f0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 ine the next pag
1e7f1 65 20 6e 75 6d 62 65 72 2e 0d 0a 20 20 2a 2f 0d e number... */.
1e7f2 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f . if( pBt->auto
1e7f3 56 61 63 75 75 6d 20 29 7b 0d 0a 20 20 20 20 50 Vacuum ){.. P
1e7f4 67 6e 6f 20 70 67 6e 6f 3b 0d 0a 20 20 20 20 50 gno pgno;.. P
1e7f5 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 gno iGuess = ovf
1e7f6 6c 2b 31 3b 0d 0a 20 20 20 20 75 38 20 65 54 79 l+1;.. u8 eTy
1e7f7 70 65 3b 0d 0a 0d 0a 20 20 20 20 77 68 69 6c 65 pe;.... while
1e7f8 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 ( PTRMAP_ISPAGE(
1e7f9 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 pBt, iGuess) ||
1e7fa 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f iGuess==PENDING_
1e7fb 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 BYTE_PAGE(pBt) )
1e7fc 7b 0d 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b {.. iGuess+
1e7fd 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 +;.. }....
1e7fe 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 if( iGuess<=btr
1e7ff 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 eePagecount(pBt)
1e800 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 ){.. rc =
1e801 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 ptrmapGet(pBt, i
1e802 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 Guess, &eType, &
1e803 70 67 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 69 66 pgno);.. if
1e804 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1e805 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 && eType==PTRMAP
1e806 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 _OVERFLOW2 && pg
1e807 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0d 0a 20 20 20 no==ovfl ){..
1e808 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 next = iGue
1e809 73 73 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 ss;.. rc
1e80a 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0d 0a = SQLITE_DONE;..
1e80b 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a }.. }..
1e80c 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 }..#endif....
1e80d 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 assert( next==0
1e80e 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 || rc==SQLITE_D
1e80f 4f 4e 45 20 29 3b 0d 0a 20 20 69 66 28 20 72 63 ONE );.. if( rc
1e810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1e811 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 rc = btreeGe
1e812 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c tPage(pBt, ovfl,
1e813 20 26 70 50 61 67 65 2c 20 30 29 3b 0d 0a 20 20 &pPage, 0);..
1e814 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 assert( rc==SQ
1e815 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 LITE_OK || pPage
1e816 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 ==0 );.. if(
1e817 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1e818 0d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 .. next = g
1e819 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 et4byte(pPage->a
1e81a 44 61 74 61 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 Data);.. }..
1e81b 20 7d 0d 0a 0d 0a 20 20 2a 70 50 67 6e 6f 4e 65 }.... *pPgnoNe
1e81c 78 74 20 3d 20 6e 65 78 74 3b 0d 0a 20 20 69 66 xt = next;.. if
1e81d 28 20 70 70 50 61 67 65 20 29 7b 0d 0a 20 20 20 ( ppPage ){..
1e81e 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 *ppPage = pPage
1e81f 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
1e820 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 releasePage(pPa
1e821 67 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 ge);.. }.. ret
1e822 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f urn (rc==SQLITE_
1e823 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b DONE ? SQLITE_OK
1e824 20 3a 20 72 63 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a : rc);..}..../*
1e825 0d 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 ..** Copy data f
1e826 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 rom a buffer to
1e827 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 a page, or from
1e828 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 a page to a buff
1e829 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 70 50 61 79 er...**..** pPay
1e82a 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 load is a pointe
1e82b 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 r to data stored
1e82c 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 on database pag
1e82d 65 20 70 44 62 50 61 67 65 2e 0d 0a 2a 2a 20 49 e pDbPage...** I
1e82e 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 f argument eOp i
1e82f 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 s false, then nB
1e830 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 yte bytes of dat
1e831 61 20 61 72 65 20 63 6f 70 69 65 64 0d 0a 2a 2a a are copied..**
1e832 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 from pPayload t
1e833 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 o the buffer poi
1e834 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e nted at by pBuf.
1e835 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c If eOp is true,
1e836 0d 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 ..** then sqlite
1e837 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 3PagerWrite() is
1e838 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 called on pDbPa
1e839 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 ge and nByte byt
1e83a 65 73 0d 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 es..** of data a
1e83b 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 re copied from t
1e83c 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 he buffer pBuf t
1e83d 6f 20 70 50 61 79 6c 6f 61 64 2e 0d 0a 2a 2a 0d o pPayload...**.
1e83e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 .** SQLITE_OK is
1e83f 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 returned on suc
1e840 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 cess, otherwise
1e841 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a an error code...
1e842 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 63 */..static int c
1e843 6f 70 79 50 61 79 6c 6f 61 64 28 0d 0a 20 20 76 opyPayload(.. v
1e844 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 oid *pPayload,
1e845 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e /* Poin
1e846 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 ter to page data
1e847 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70 42 75 */.. void *pBu
1e848 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 f,
1e849 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 /* Pointer to b
1e84a 75 66 66 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 uffer */.. int
1e84b 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 nByte,
1e84c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
1e84d 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 of bytes to copy
1e84e 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 4f 70 2c 20 */.. int eOp,
1e84f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e850 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 /* 0 -> copy fr
1e851 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f om page, 1 -> co
1e852 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0d 0a 20 py to page */..
1e853 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 DbPage *pDbPage
1e854 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
1e855 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 ge containing pP
1e856 61 79 6c 6f 61 64 20 2a 2f 0d 0a 29 7b 0d 0a 20 ayload */..){..
1e857 20 69 66 28 20 65 4f 70 20 29 7b 0d 0a 20 20 20 if( eOp ){..
1e858 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 /* Copy data fr
1e859 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 om buffer to pag
1e85a 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 e (a write opera
1e85b 74 69 6f 6e 29 20 2a 2f 0d 0a 20 20 20 20 69 6e tion) */.. in
1e85c 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 t rc = sqlite3Pa
1e85d 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 gerWrite(pDbPage
1e85e 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d );.. if( rc!=
1e85f 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1e860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
1e861 20 20 20 20 7d 0d 0a 20 20 20 20 6d 65 6d 63 70 }.. memcp
1e862 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 y(pPayload, pBuf
1e863 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d 65 6c , nByte);.. }el
1e864 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 43 6f 70 79 se{.. /* Copy
1e865 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 data from page
1e866 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 to buffer (a rea
1e867 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0d d operation) */.
1e868 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 . memcpy(pBuf
1e869 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 , pPayload, nByt
1e86a 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 e);.. }.. retu
1e86b 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
1e86c 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 ..../*..** This
1e86d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
1e86e 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 to read or over
1e86f 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e write payload in
1e870 66 6f 72 6d 61 74 69 6f 6e 0d 0a 2a 2a 20 66 6f formation..** fo
1e871 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 r the entry that
1e872 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 the pCur cursor
1e873 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e is pointing to.
1e874 20 49 66 20 74 68 65 20 65 4f 70 0d 0a 2a 2a 20 If the eOp..**
1e875 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 parameter is 0,
1e876 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f this is a read o
1e877 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 peration (data c
1e878 6f 70 69 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 62 opied into..** b
1e879 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 uffer pBuf). If
1e87a 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 it is non-zero,
1e87b 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f a write (data co
1e87c 70 69 65 64 20 66 72 6f 6d 0d 0a 2a 2a 20 62 75 pied from..** bu
1e87d 66 66 65 72 20 70 42 75 66 29 2e 0d 0a 2a 2a 0d ffer pBuf)...**.
1e87e 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 .** A total of "
1e87f 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 amt" bytes are r
1e880 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 ead or written b
1e881 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 eginning at "off
1e882 73 65 74 22 2e 0d 0a 2a 2a 20 44 61 74 61 20 69 set"...** Data i
1e883 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f s read to or fro
1e884 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 m the buffer pBu
1e885 66 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 f...**..** The c
1e886 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 ontent being rea
1e887 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 d or written mig
1e888 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 ht appear on the
1e889 20 6d 61 69 6e 20 70 61 67 65 0d 0a 2a 2a 20 6f main page..** o
1e88a 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f r be scattered o
1e88b 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f ut on multiple o
1e88c 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0d 0a verflow pages...
1e88d 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 **..** If the Bt
1e88e 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f Cursor.isIncrblo
1e88f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 bHandle flag is
1e890 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 set, and the cur
1e891 72 65 6e 74 0d 0a 2a 2a 20 63 75 72 73 6f 72 20 rent..** cursor
1e892 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f entry uses one o
1e893 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 r more overflow
1e894 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 pages, this func
1e895 74 69 6f 6e 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 tion..** allocat
1e896 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 es space for and
1e897 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 lazily popluate
1e898 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 s the overflow p
1e899 61 67 65 2d 6c 69 73 74 20 0d 0a 2a 2a 20 63 61 age-list ..** ca
1e89a 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 che array (BtCur
1e89b 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 sor.aOverflow).
1e89c 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 Subsequent calls
1e89d 20 75 73 65 20 74 68 69 73 0d 0a 2a 2a 20 63 61 use this..** ca
1e89e 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b che to make seek
1e89f 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c ing to the suppl
1e8a0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 ied offset more
1e8a1 65 66 66 69 63 69 65 6e 74 2e 0d 0a 2a 2a 0d 0a efficient...**..
1e8a2 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 ** Once an overf
1e8a3 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 low page-list ca
1e8a4 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c che has been all
1e8a5 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 ocated, it may b
1e8a6 65 0d 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 e..** invalidate
1e8a7 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 d if some other
1e8a8 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f cursor writes to
1e8a9 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c the same table,
1e8aa 20 6f 72 20 69 66 0d 0a 2a 2a 20 74 68 65 20 63 or if..** the c
1e8ab 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 ursor is moved t
1e8ac 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f o a different ro
1e8ad 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c w. Additionally,
1e8ae 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0d in auto-vacuum.
1e8af 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f .** mode, the fo
1e8b0 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d llowing events m
1e8b1 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e ay invalidate an
1e8b2 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c overflow page-l
1e8b3 69 73 74 20 63 61 63 68 65 2e 0d 0a 2a 2a 0d 0a ist cache...**..
1e8b4 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d ** * An increm
1e8b5 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0d 0a 2a ental vacuum,..*
1e8b6 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 * * A commit i
1e8b7 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 n auto_vacuum="f
1e8b8 75 6c 6c 22 20 6d 6f 64 65 2c 0d 0a 2a 2a 20 20 ull" mode,..**
1e8b9 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 * Creating a ta
1e8ba 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 ble (may require
1e8bb 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 moving an overf
1e8bc 6c 6f 77 20 70 61 67 65 29 2e 0d 0a 2a 2f 0d 0a low page)...*/..
1e8bd 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 static int acces
1e8be 73 50 61 79 6c 6f 61 64 28 0d 0a 20 20 42 74 43 sPayload(.. BtC
1e8bf 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 ursor *pCur,
1e8c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e /* Cursor poin
1e8c1 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f ting to entry to
1e8c2 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0d 0a 20 read from */..
1e8c3 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 u32 offset,
1e8c4 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 /* Begin r
1e8c5 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 eading this far
1e8c6 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0d into payload */.
1e8c7 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 . u32 amt,
1e8c8 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 /* Read
1e8c9 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 this many bytes
1e8ca 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 */.. unsigned c
1e8cb 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 har *pBuf, /* Wr
1e8cc 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e ite the bytes in
1e8cd 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a to this buffer *
1e8ce 2f 20 0d 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 / .. int eOp
1e8cf 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 /* ze
1e8d0 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d ro to read. non-
1e8d1 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a zero to write. *
1e8d2 2f 0d 0a 29 7b 0d 0a 20 20 75 6e 73 69 67 6e 65 /..){.. unsigne
1e8d3 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 d char *aPayload
1e8d4 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 ;.. int rc = SQ
1e8d5 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 75 33 32 20 LITE_OK;.. u32
1e8d6 6e 4b 65 79 3b 0d 0a 20 20 69 6e 74 20 69 49 64 nKey;.. int iId
1e8d7 78 20 3d 20 30 3b 0d 0a 20 20 4d 65 6d 50 61 67 x = 0;.. MemPag
1e8d8 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d e *pPage = pCur-
1e8d9 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 >apPage[pCur->iP
1e8da 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 age]; /* Btree p
1e8db 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 age of current e
1e8dc 6e 74 72 79 20 2a 2f 0d 0a 20 20 42 74 53 68 61 ntry */.. BtSha
1e8dd 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d red *pBt = pCur-
1e8de 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 >pBt;
1e8df 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 /* Btree
1e8e0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f this cursor belo
1e8e1 6e 67 73 20 74 6f 20 2a 2f 0d 0a 0d 0a 20 20 61 ngs to */.... a
1e8e2 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0d ssert( pPage );.
1e8e3 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d . assert( pCur-
1e8e4 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f >eState==CURSOR_
1e8e5 56 41 4c 49 44 20 29 3b 0d 0a 20 20 61 73 73 65 VALID );.. asse
1e8e6 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b rt( pCur->aiIdx[
1e8e7 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 pCur->iPage]<pPa
1e8e8 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 20 20 ge->nCell );..
1e8e9 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f assert( cursorHo
1e8ea 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 ldsMutex(pCur) )
1e8eb 3b 0d 0a 0d 0a 20 20 67 65 74 43 65 6c 6c 49 6e ;.... getCellIn
1e8ec 66 6f 28 70 43 75 72 29 3b 0d 0a 20 20 61 50 61 fo(pCur);.. aPa
1e8ed 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e yload = pCur->in
1e8ee 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d fo.pCell + pCur-
1e8ef 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0d 0a >info.nHeader;..
1e8f0 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d nKey = (pPage-
1e8f1 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 >intKey ? 0 : (i
1e8f2 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b nt)pCur->info.nK
1e8f3 65 79 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 4e 45 ey);.... if( NE
1e8f4 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e VER(offset+amt >
1e8f5 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f nKey+pCur->info
1e8f6 2e 6e 44 61 74 61 29 20 0d 0a 20 20 20 7c 7c 20 .nData) .. ||
1e8f7 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e &aPayload[pCur->
1e8f8 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 info.nLocal] > &
1e8f9 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 pPage->aData[pBt
1e8fa 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0d 0a 20 ->usableSize]..
1e8fb 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 54 72 79 69 ){.. /* Tryi
1e8fc 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 ng to read or wr
1e8fd 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 ite past the end
1e8fe 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 of the data is
1e8ff 61 6e 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 20 an error */..
1e900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1e901 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 ORRUPT_BKPT;..
1e902 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 }.... /* Check
1e903 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 if data must be
1e904 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f read/written to/
1e905 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 from the btree p
1e906 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0d 0a age itself. */..
1e907 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 if( offset<pCu
1e908 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 r->info.nLocal )
1e909 7b 0d 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 {.. int a = a
1e90a 6d 74 3b 0d 0a 20 20 20 20 69 66 28 20 61 2b 6f mt;.. if( a+o
1e90b 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f ffset>pCur->info
1e90c 2e 6e 4c 6f 63 61 6c 20 29 7b 0d 0a 20 20 20 20 .nLocal ){..
1e90d 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f a = pCur->info
1e90e 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 .nLocal - offset
1e90f 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 ;.. }.. rc
1e910 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 = copyPayload(&
1e911 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d aPayload[offset]
1e912 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 , pBuf, a, eOp,
1e913 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b pPage->pDbPage);
1e914 0d 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 .. offset = 0
1e915 3b 0d 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 ;.. pBuf += a
1e916 3b 0d 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b ;.. amt -= a;
1e917 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
1e918 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e offset -= pCur->
1e919 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0d 0a 20 20 info.nLocal;..
1e91a 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 }.... if( rc==S
1e91b 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e QLITE_OK && amt>
1e91c 30 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 0 ){.. const
1e91d 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 u32 ovflSize = p
1e91e 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d Bt->usableSize -
1e91f 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 4; /* Bytes co
1e920 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 ntent per ovfl p
1e921 61 67 65 20 2a 2f 0d 0a 20 20 20 20 50 67 6e 6f age */.. Pgno
1e922 20 6e 65 78 74 50 61 67 65 3b 0d 0a 0d 0a 20 20 nextPage;....
1e923 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 nextPage = get
1e924 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 4byte(&aPayload[
1e925 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 pCur->info.nLoca
1e926 6c 5d 29 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 l]);....#ifndef
1e927 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 SQLITE_OMIT_INCR
1e928 42 4c 4f 42 0d 0a 20 20 20 20 2f 2a 20 49 66 20 BLOB.. /* If
1e929 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 the isIncrblobHa
1e92a 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 ndle flag is set
1e92b 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f and the BtCurso
1e92c 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0d 0a 20 r.aOverflow[]..
1e92d 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 ** has not be
1e92e 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c en allocated, al
1e92f 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 locate it now. T
1e930 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 he array is size
1e931 64 20 61 74 0d 0a 20 20 20 20 2a 2a 20 6f 6e 65 d at.. ** one
1e932 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 entry for each
1e933 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e overflow page in
1e934 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 the overflow ch
1e935 61 69 6e 2e 20 54 68 65 0d 0a 20 20 20 20 2a 2a ain. The.. **
1e936 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 page number of
1e937 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c the first overfl
1e938 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 ow page is store
1e939 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 d in aOverflow[0
1e93a 5d 2c 0d 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 ],.. ** etc.
1e93b 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 A value of 0 in
1e93c 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 the aOverflow[]
1e93d 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 array means "not
1e93e 20 79 65 74 20 6b 6e 6f 77 6e 22 0d 0a 20 20 20 yet known"..
1e93f 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 ** (the cache i
1e940 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 s lazily populat
1e941 65 64 29 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 ed)... */..
1e942 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e if( pCur->isIn
1e943 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 crblobHandle &&
1e944 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 !pCur->aOverflow
1e945 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e ){.. int n
1e946 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e Ovfl = (pCur->in
1e947 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 fo.nPayload-pCur
1e948 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 ->info.nLocal+ov
1e949 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 flSize-1)/ovflSi
1e94a 7a 65 3b 0d 0a 20 20 20 20 20 20 70 43 75 72 2d ze;.. pCur-
1e94b 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 >aOverflow = (Pg
1e94c 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c no *)sqlite3Mall
1e94d 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 ocZero(sizeof(Pg
1e94e 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0d 0a 20 20 20 no)*nOvfl);..
1e94f 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 /* nOvfl is a
1e950 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 lways positive.
1e951 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f If it were zero
1e952 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 , fetchPayload w
1e953 6f 75 6c 64 20 68 61 76 65 0d 0a 20 20 20 20 20 ould have..
1e954 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e ** been used in
1e955 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f stead of this ro
1e956 75 74 69 6e 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 utine. */..
1e957 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 if( ALWAYS(nOvf
1e958 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 l) && !pCur->aOv
1e959 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 20 20 erflow ){..
1e95a 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e rc = SQLITE_N
1e95b 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a OMEM;.. }..
1e95c 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
1e95d 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 If the overflow
1e95e 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 page-list cache
1e95f 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 has been allocat
1e960 65 64 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 ed and the..
1e961 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 ** entry for the
1e962 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 first required
1e963 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 overflow page is
1e964 20 76 61 6c 69 64 2c 20 73 6b 69 70 0d 0a 20 20 valid, skip..
1e965 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f ** directly to
1e966 20 69 74 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 it... */..
1e967 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 if( pCur->aOve
1e968 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 rflow && pCur->a
1e969 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f Overflow[offset/
1e96a 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0d 0a 20 20 ovflSize] ){..
1e96b 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 iIdx = (offs
1e96c 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0d 0a 20 et/ovflSize);..
1e96d 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 nextPage =
1e96e 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b pCur->aOverflow[
1e96f 69 49 64 78 5d 3b 0d 0a 20 20 20 20 20 20 6f 66 iIdx];.. of
1e970 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f fset = (offset%o
1e971 76 66 6c 53 69 7a 65 29 3b 0d 0a 20 20 20 20 7d vflSize);.. }
1e972 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 ..#endif....
1e973 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 for( ; rc==SQLIT
1e974 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 E_OK && amt>0 &&
1e975 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b nextPage; iIdx+
1e976 2b 29 7b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 +){....#ifndef S
1e977 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 QLITE_OMIT_INCRB
1e978 4c 4f 42 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 LOB.. /* If
1e979 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c required, popul
1e97a 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 ate the overflow
1e97b 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 page-list cache
1e97c 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 . */.. if(
1e97d 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 pCur->aOverflow
1e97e 29 7b 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 ){.. asse
1e97f 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 rt(!pCur->aOverf
1e980 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 low[iIdx] || pCu
1e981 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 r->aOverflow[iId
1e982 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0d 0a x]==nextPage);..
1e983 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f pCur->aO
1e984 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 verflow[iIdx] =
1e985 6e 65 78 74 50 61 67 65 3b 0d 0a 20 20 20 20 20 nextPage;..
1e986 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 }..#endif....
1e987 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d if( offset>=
1e988 6f 76 66 6c 53 69 7a 65 20 29 7b 0d 0a 20 20 20 ovflSize ){..
1e989 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 /* The only
1e98a 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 reason to read
1e98b 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 this page is to
1e98c 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0d obtain the page.
1e98d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 . ** numb
1e98e 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 er for the next
1e98f 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 page in the over
1e990 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 flow chain. The
1e991 70 61 67 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a page.. **
1e992 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 data is not req
1e993 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 uired. So first
1e994 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 try to lookup th
1e995 65 20 6f 76 65 72 66 6c 6f 77 0d 0a 20 20 20 20 e overflow..
1e996 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 ** page-list
1e997 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 cache, if any,
1e998 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 then fall back t
1e999 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f o the getOverflo
1e99a 77 50 61 67 65 28 29 0d 0a 20 20 20 20 20 20 20 wPage()..
1e99b 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 ** function...
1e99c 20 20 20 20 20 20 20 2a 2f 0d 0a 23 69 66 6e 64 */..#ifnd
1e99d 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 ef SQLITE_OMIT_I
1e99e 4e 43 52 42 4c 4f 42 0d 0a 20 20 20 20 20 20 20 NCRBLOB..
1e99f 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 if( pCur->aOver
1e9a0 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f flow && pCur->aO
1e9a1 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 verflow[iIdx+1]
1e9a2 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 65 ){.. ne
1e9a3 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 xtPage = pCur->a
1e9a4 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d Overflow[iIdx+1]
1e9a5 3b 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 ;.. } els
1e9a6 65 20 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 e ..#endif..
1e9a7 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 rc = getOv
1e9a8 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 erflowPage(pBt,
1e9a9 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 nextPage, 0, &ne
1e9aa 78 74 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 xtPage);..
1e9ab 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c offset -= ovfl
1e9ac 53 69 7a 65 3b 0d 0a 20 20 20 20 20 20 7d 65 6c Size;.. }el
1e9ad 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 se{.. /*
1e9ae 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 Need to read thi
1e9af 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e s page properly.
1e9b0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d It contains som
1e9b1 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 e of the..
1e9b2 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 ** range of da
1e9b3 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 ta that is being
1e9b4 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f read (eOp==0) o
1e9b5 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d r written (eOp!=
1e9b6 30 29 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0)... */.
1e9b7 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
1e9b8 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 IRECT_OVERFLOW_R
1e9b9 45 41 44 0d 0a 20 20 20 20 20 20 20 20 73 71 6c EAD.. sql
1e9ba 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0d 0a ite3_file *fd;..
1e9bb 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20 #endif..
1e9bc 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0d 0a 20 20 int a = amt;..
1e9bd 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 if( a + of
1e9be 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 fset > ovflSize
1e9bf 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 20 ){.. a
1e9c0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 = ovflSize - off
1e9c1 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d set;.. }.
1e9c2 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ...#ifdef SQLITE
1e9c3 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 _DIRECT_OVERFLOW
1e9c4 5f 52 45 41 44 0d 0a 20 20 20 20 20 20 20 20 2f _READ.. /
1e9c5 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c * If all the fol
1e9c6 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a lowing are true:
1e9c7 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20 .. **..
1e9c8 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 ** 1) th
1e9c9 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 is is a read ope
1e9ca 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0d 0a 20 20 ration, and ..
1e9cb 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 ** 2) da
1e9cc 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 ta is required f
1e9cd 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 rom the start of
1e9ce 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 this overflow p
1e9cf 61 67 65 2c 20 61 6e 64 0d 0a 20 20 20 20 20 20 age, and..
1e9d0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 ** 3) the da
1e9d1 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 tabase is file-b
1e9d2 61 63 6b 65 64 2c 20 61 6e 64 0d 0a 20 20 20 20 acked, and..
1e9d3 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 ** 4) ther
1e9d4 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 e is no open wri
1e9d5 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 te-transaction,
1e9d6 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 and.. **
1e9d7 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 5) the databas
1e9d8 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 e is not a WAL d
1e9d9 61 74 61 62 61 73 65 2c 0d 0a 20 20 20 20 20 20 atabase,..
1e9da 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a **.. **
1e9db 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 then data can b
1e9dc 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 e read directly
1e9dd 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
1e9de 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0d e file into the.
1e9df 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 . ** outp
1e9e0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 ut buffer, bypas
1e9e1 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 sing the page-ca
1e9e2 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 che altogether.
1e9e3 54 68 69 73 20 73 70 65 65 64 73 0d 0a 20 20 20 This speeds..
1e9e4 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 ** up loadi
1e9e5 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 ng large records
1e9e6 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 that span many
1e9e7 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0d overflow pages..
1e9e8 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 . */..
1e9e9 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 if( eOp==0
1e9ea 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9eb 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9ec 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 /* (
1e9ed 31 29 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 1) */..
1e9ee 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 && offset==0
1e9ef 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9f1 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0d /* (2) */.
1e9f2 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 . && pBt
1e9f3 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d ->inTransaction=
1e9f4 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 =TRANS_READ
1e9f5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9f6 2f 2a 20 28 34 29 20 2a 2f 0d 0a 20 20 20 20 20 /* (4) */..
1e9f7 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c && (fd = sql
1e9f8 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 ite3PagerFile(pB
1e9f9 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 t->pPager))->pMe
1e9fa 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 thods /* (3)
1e9fb 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 26 26 */.. &&
1e9fc 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 pBt->pPage1->aD
1e9fd 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 ata[19]==0x01
1e9fe 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e9ff 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0d 0a 20 /* (5) */..
1ea00 20 20 20 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 ){..
1ea01 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d u8 aSave[4]
1ea02 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 ;.. u8
1ea03 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b *aWrite = &pBuf[
1ea04 2d 34 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 -4];..
1ea05 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 memcpy(aSave, aW
1ea06 72 69 74 65 2c 20 34 29 3b 0d 0a 20 20 20 20 20 rite, 4);..
1ea07 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
1ea08 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 3OsRead(fd, aWri
1ea09 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 te, a+4, (i64)pB
1ea0a 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 t->pageSize*(nex
1ea0b 74 50 61 67 65 2d 31 29 29 3b 0d 0a 20 20 20 20 tPage-1));..
1ea0c 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d nextPage =
1ea0d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 get4byte(aWrite
1ea0e 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 );.. me
1ea0f 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 mcpy(aWrite, aSa
1ea10 76 65 2c 20 34 29 3b 0d 0a 20 20 20 20 20 20 20 ve, 4);..
1ea11 20 7d 65 6c 73 65 0d 0a 23 65 6e 64 69 66 0d 0a }else..#endif..
1ea12 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 .. {..
1ea13 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 DbPage *p
1ea14 44 62 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 DbPage;..
1ea15 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 rc = sqlite3P
1ea16 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 agerGet(pBt->pPa
1ea17 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 ger, nextPage, &
1ea18 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 pDbPage);..
1ea19 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
1ea1a 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
1ea1b 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 aPayload
1ea1c 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 = sqlite3PagerGe
1ea1d 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0d tData(pDbPage);.
1ea1e 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 . nex
1ea1f 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 tPage = get4byte
1ea20 28 61 50 61 79 6c 6f 61 64 29 3b 0d 0a 20 20 20 (aPayload);..
1ea21 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f rc = co
1ea22 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c pyPayload(&aPayl
1ea23 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 oad[offset+4], p
1ea24 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 Buf, a, eOp, pDb
1ea25 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 Page);..
1ea26 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 sqlite3Pager
1ea27 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0d Unref(pDbPage);.
1ea28 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 . off
1ea29 73 65 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 set = 0;..
1ea2a 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d }.. }
1ea2b 0d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d .. amt -=
1ea2c 20 61 3b 0d 0a 20 20 20 20 20 20 20 20 70 42 75 a;.. pBu
1ea2d 66 20 2b 3d 20 61 3b 0d 0a 20 20 20 20 20 20 7d f += a;.. }
1ea2e 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
1ea2f 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1ea30 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0d _OK && amt>0 ){.
1ea31 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
1ea32 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1ea33 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
1ea34 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a rc;..}..../*..**
1ea35 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 Read part of th
1ea36 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
1ea37 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 with cursor pCu
1ea38 72 2e 20 20 45 78 61 63 74 6c 79 0d 0a 2a 2a 20 r. Exactly..**
1ea39 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c "amt" bytes will
1ea3a 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 be transfered i
1ea3b 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 nto pBuf[]. The
1ea3c 20 74 72 61 6e 73 66 65 72 0d 0a 2a 2a 20 62 65 transfer..** be
1ea3d 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 gins at "offset"
1ea3e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 ...**..** The ca
1ea3f 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 ller must ensure
1ea40 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f that pCur is po
1ea41 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 inting to a vali
1ea42 64 20 72 6f 77 0d 0a 2a 2a 20 69 6e 20 74 68 65 d row..** in the
1ea43 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 table...**..**
1ea44 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b Return SQLITE_OK
1ea45 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 on success or a
1ea46 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 n error code if
1ea47 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0d 0a 2a anything goes..*
1ea48 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 * wrong. An err
1ea49 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 or is returned i
1ea4a 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 f "offset+amt" i
1ea4b 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0d 0a 2a s larger than..*
1ea4c 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 * the available
1ea4d 70 61 79 6c 6f 61 64 2e 0d 0a 2a 2f 0d 0a 53 51 payload...*/..SQ
1ea4e 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
1ea4f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 sqlite3BtreeKey
1ea50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c (BtCursor *pCur,
1ea51 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 u32 offset, u32
1ea52 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 amt, void *pBuf
1ea53 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 63 75 ){.. assert( cu
1ea54 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 rsorHoldsMutex(p
1ea55 43 75 72 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 Cur) );.. asser
1ea56 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d t( pCur->eState=
1ea57 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b =CURSOR_VALID );
1ea58 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 .. assert( pCur
1ea59 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 ->iPage>=0 && pC
1ea5a 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d ur->apPage[pCur-
1ea5b 3e 69 50 61 67 65 5d 20 29 3b 0d 0a 20 20 61 73 >iPage] );.. as
1ea5c 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 sert( pCur->aiId
1ea5d 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 x[pCur->iPage]<p
1ea5e 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 Cur->apPage[pCur
1ea5f 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 ->iPage]->nCell
1ea60 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 61 63 63 );.. return acc
1ea61 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c essPayload(pCur,
1ea62 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 offset, amt, (u
1ea63 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 nsigned char*)pB
1ea64 75 66 2c 20 30 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a uf, 0);..}..../*
1ea65 0d 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f ..** Read part o
1ea66 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 f the data assoc
1ea67 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f iated with curso
1ea68 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 r pCur. Exactly
1ea69 0d 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 ..** "amt" bytes
1ea6a 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 will be transfe
1ea6b 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e red into pBuf[].
1ea6c 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0d 0a The transfer..
1ea6d 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 ** begins at "of
1ea6e 66 73 65 74 22 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 fset"...**..** R
1ea6f 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 eturn SQLITE_OK
1ea70 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e on success or an
1ea71 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 error code if a
1ea72 6e 79 74 68 69 6e 67 20 67 6f 65 73 0d 0a 2a 2a nything goes..**
1ea73 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f wrong. An erro
1ea74 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 r is returned if
1ea75 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 "offset+amt" is
1ea76 20 6c 61 72 67 65 72 20 74 68 61 6e 0d 0a 2a 2a larger than..**
1ea77 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 the available p
1ea78 61 79 6c 6f 61 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c ayload...*/..SQL
1ea79 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
1ea7a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 sqlite3BtreeData
1ea7b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c (BtCursor *pCur,
1ea7c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 u32 offset, u32
1ea7d 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 amt, void *pBuf
1ea7e 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 0d ){.. int rc;...
1ea7f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
1ea80 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0d 0a 20 OMIT_INCRBLOB..
1ea81 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 if ( pCur->eSta
1ea82 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c te==CURSOR_INVAL
1ea83 49 44 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 ID ){.. retur
1ea84 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0d n SQLITE_ABORT;.
1ea85 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a . }..#endif....
1ea86 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 assert( cursor
1ea87 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 HoldsMutex(pCur)
1ea88 20 29 3b 0d 0a 20 20 72 63 20 3d 20 72 65 73 74 );.. rc = rest
1ea89 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f oreCursorPositio
1ea8a 6e 28 70 43 75 72 29 3b 0d 0a 20 20 69 66 28 20 n(pCur);.. if(
1ea8b 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1ea8c 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 .. assert( pC
1ea8d 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 ur->eState==CURS
1ea8e 4f 52 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 20 OR_VALID );..
1ea8f 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 assert( pCur->i
1ea90 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d Page>=0 && pCur-
1ea91 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 >apPage[pCur->iP
1ea92 61 67 65 5d 20 29 3b 0d 0a 20 20 20 20 61 73 73 age] );.. ass
1ea93 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 ert( pCur->aiIdx
1ea94 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 [pCur->iPage]<pC
1ea95 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d ur->apPage[pCur-
1ea96 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 >iPage]->nCell )
1ea97 3b 0d 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 ;.. rc = acce
1ea98 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 ssPayload(pCur,
1ea99 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 offset, amt, pBu
1ea9a 66 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 f, 0);.. }.. r
1ea9b 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
1ea9c 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 /*..** Return a
1ea9d 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f pointer to paylo
1ea9e 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 ad information f
1ea9f 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 rom the entry th
1eaa0 61 74 20 74 68 65 20 0d 0a 2a 2a 20 70 43 75 72 at the ..** pCur
1eaa1 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 cursor is point
1eaa2 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 ing to. The poi
1eaa3 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 nter is to the b
1eaa4 65 67 69 6e 6e 69 6e 67 20 6f 66 0d 0a 2a 2a 20 eginning of..**
1eaa5 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b the key if skipK
1eaa6 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 ey==0 and it poi
1eaa7 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e nts to the begin
1eaa8 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0d ning of data if.
1eaa9 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 .** skipKey==1.
1eaaa 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 The number of b
1eaab 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c ytes of availabl
1eaac 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 e key/data is wr
1eaad 69 74 74 65 6e 0d 0a 2a 2a 20 69 6e 74 6f 20 2a itten..** into *
1eaae 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d pAmt. If *pAmt=
1eaaf 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c =0, then the val
1eab0 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c ue returned will
1eab1 20 6e 6f 74 20 62 65 0d 0a 2a 2a 20 61 20 76 61 not be..** a va
1eab2 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2a lid pointer...**
1eab3 0d 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
1eab4 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 e is an optimiza
1eab5 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d tion. It is com
1eab6 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 mon for the enti
1eab7 72 65 20 6b 65 79 0d 0a 2a 2a 20 61 6e 64 20 64 re key..** and d
1eab8 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 ata to fit on th
1eab9 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 e local page and
1eaba 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 for there to be
1eabb 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0d 0a 2a 2a no overflow..**
1eabc 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 pages. When th
1eabd 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 at is so, this r
1eabe 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 outine can be us
1eabf 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 ed to access the
1eac0 0d 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 ..** key and dat
1eac1 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 a without making
1eac2 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 a copy. If the
1eac3 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 key and/or data
1eac4 20 73 70 69 6c 6c 73 0d 0a 2a 2a 20 6f 6e 74 6f spills..** onto
1eac5 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c overflow pages,
1eac6 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c then accessPayl
1eac7 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 oad() must be us
1eac8 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 ed to reassemble
1eac9 0d 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 ..** the key/dat
1eaca 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e a and copy it in
1eacb 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 to a preallocate
1eacc 64 20 62 75 66 66 65 72 2e 0d 0a 2a 2a 0d 0a 2a d buffer...**..*
1eacd 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 * The pointer re
1eace 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 turned by this r
1eacf 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 outine looks dir
1ead0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 ectly into the c
1ead1 61 63 68 65 64 0d 0a 2a 2a 20 70 61 67 65 20 6f ached..** page o
1ead2 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 f the database.
1ead3 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 The data might
1ead4 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 change or move t
1ead5 68 65 20 6e 65 78 74 20 74 69 6d 65 0d 0a 2a 2a he next time..**
1ead6 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 any btree routi
1ead7 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0d 0a 2a ne is called...*
1ead8 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 /..static const
1ead9 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 unsigned char *f
1eada 65 74 63 68 50 61 79 6c 6f 61 64 28 0d 0a 20 20 etchPayload(..
1eadb 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 BtCursor *pCur,
1eadc 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 /* Cursor p
1eadd 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 ointing to entry
1eade 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f to read from */
1eadf 0d 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 .. int *pAmt,
1eae0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
1eae1 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 e the number of
1eae2 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 available bytes
1eae3 68 65 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 here */.. int s
1eae4 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 kipKey
1eae5 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e /* read beginnin
1eae6 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 g at data if thi
1eae7 73 20 69 73 20 74 72 75 65 20 2a 2f 0d 0a 29 7b s is true */..){
1eae8 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 .. unsigned cha
1eae9 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0d 0a 20 20 r *aPayload;..
1eaea 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0d MemPage *pPage;.
1eaeb 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0d 0a 20 20 . u32 nKey;..
1eaec 75 33 32 20 6e 4c 6f 63 61 6c 3b 0d 0a 0d 0a 20 u32 nLocal;....
1eaed 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 assert( pCur!=0
1eaee 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e && pCur->iPage>
1eaef 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 =0 && pCur->apPa
1eaf0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 ge[pCur->iPage])
1eaf1 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 ;.. assert( pCu
1eaf2 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f r->eState==CURSO
1eaf3 52 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 61 73 R_VALID );.. as
1eaf4 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 sert( cursorHold
1eaf5 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0d sMutex(pCur) );.
1eaf6 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d . pPage = pCur-
1eaf7 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 >apPage[pCur->iP
1eaf8 61 67 65 5d 3b 0d 0a 20 20 61 73 73 65 72 74 28 age];.. assert(
1eaf9 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 pCur->aiIdx[pCu
1eafa 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d r->iPage]<pPage-
1eafb 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 20 20 69 66 28 >nCell );.. if(
1eafc 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 NEVER(pCur->inf
1eafd 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0d 0a o.nSize==0) ){..
1eafe 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 btreeParseCe
1eaff 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b ll(pCur->apPage[
1eb00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 pCur->iPage], pC
1eb01 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
1eb02 69 50 61 67 65 5d 2c 0d 0a 20 20 20 20 20 20 20 iPage],..
1eb03 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75 &pCu
1eb04 72 2d 3e 69 6e 66 6f 29 3b 0d 0a 20 20 7d 0d 0a r->info);.. }..
1eb05 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 aPayload = pCu
1eb06 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0d 0a r->info.pCell;..
1eb07 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 aPayload += pC
1eb08 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 ur->info.nHeader
1eb09 3b 0d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e ;.. if( pPage->
1eb0a 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 20 20 20 6e intKey ){.. n
1eb0b 4b 65 79 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 Key = 0;.. }els
1eb0c 65 7b 0d 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 e{.. nKey = (
1eb0d 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e int)pCur->info.n
1eb0e 4b 65 79 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 Key;.. }.. if(
1eb0f 20 73 6b 69 70 4b 65 79 20 29 7b 0d 0a 20 20 20 skipKey ){..
1eb10 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 aPayload += nKe
1eb11 79 3b 0d 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d y;.. nLocal =
1eb12 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 pCur->info.nLoc
1eb13 61 6c 20 2d 20 6e 4b 65 79 3b 0d 0a 20 20 7d 65 al - nKey;.. }e
1eb14 6c 73 65 7b 0d 0a 20 20 20 20 6e 4c 6f 63 61 6c lse{.. nLocal
1eb15 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c = pCur->info.nL
1eb16 6f 63 61 6c 3b 0d 0a 20 20 20 20 61 73 73 65 72 ocal;.. asser
1eb17 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 t( nLocal<=nKey
1eb18 29 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 41 6d 74 );.. }.. *pAmt
1eb19 20 3d 20 6e 4c 6f 63 61 6c 3b 0d 0a 20 20 72 65 = nLocal;.. re
1eb1a 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0d 0a turn aPayload;..
1eb1b 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 6f }....../*..** Fo
1eb1c 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 r the entry that
1eb1d 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 cursor pCur is
1eb1e 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e point to, return
1eb1f 20 61 73 0d 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 as..** many byt
1eb20 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 es of the key or
1eb21 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 data as are ava
1eb22 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f ilable on the lo
1eb23 63 61 6c 0d 0a 2a 2a 20 62 2d 74 72 65 65 20 70 cal..** b-tree p
1eb24 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 age. Write the
1eb25 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 number of availa
1eb26 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a ble bytes into *
1eb27 70 41 6d 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 pAmt...**..** Th
1eb28 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e e pointer return
1eb29 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e ed is ephemeral.
1eb2a 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d The key/data m
1eb2b 61 79 20 6d 6f 76 65 0d 0a 2a 2a 20 6f 72 20 62 ay move..** or b
1eb2c 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 e destroyed on t
1eb2d 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 he next call to
1eb2e 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e any Btree routin
1eb2f 65 2c 0d 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 e,..** including
1eb30 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 calls from othe
1eb31 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 r threads agains
1eb32 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 t the same cache
1eb33 2e 0d 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d ...** Hence, a m
1eb34 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 utex on the BtSh
1eb35 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 ared should be h
1eb36 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c eld prior to cal
1eb37 6c 69 6e 67 0d 0a 2a 2a 20 74 68 69 73 20 72 6f ling..** this ro
1eb38 75 74 69 6e 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 utine...**..** T
1eb39 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 hese routines is
1eb3a 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 used to get qui
1eb3b 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 ck access to key
1eb3c 20 61 6e 64 20 64 61 74 61 0d 0a 2a 2a 20 69 6e and data..** in
1eb3d 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 the common case
1eb3e 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c where no overfl
1eb3f 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 ow pages are use
1eb40 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 d...*/..SQLITE_P
1eb41 52 49 56 41 54 45 20 63 6f 6e 73 74 20 76 6f 69 RIVATE const voi
1eb42 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b d *sqlite3BtreeK
1eb43 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 eyFetch(BtCursor
1eb44 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d *pCur, int *pAm
1eb45 74 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 t){.. const voi
1eb46 64 20 2a 70 20 3d 20 30 3b 0d 0a 20 20 61 73 73 d *p = 0;.. ass
1eb47 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
1eb48 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 ex_held(pCur->pB
1eb49 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 tree->db->mutex)
1eb4a 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 63 );.. assert( c
1eb4b 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 ursorHoldsMutex(
1eb4c 70 43 75 72 29 20 29 3b 0d 0a 20 20 69 66 28 20 pCur) );.. if(
1eb4d 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 ALWAYS(pCur->eSt
1eb4e 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 ate==CURSOR_VALI
1eb4f 44 29 20 29 7b 0d 0a 20 20 20 20 70 20 3d 20 28 D) ){.. p = (
1eb50 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 const void*)fetc
1eb51 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 hPayload(pCur, p
1eb52 41 6d 74 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 Amt, 0);.. }..
1eb53 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 53 return p;..}..S
1eb54 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 63 6f QLITE_PRIVATE co
1eb55 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 nst void *sqlite
1eb56 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 3BtreeDataFetch(
1eb57 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 BtCursor *pCur,
1eb58 69 6e 74 20 2a 70 41 6d 74 29 7b 0d 0a 20 20 63 int *pAmt){.. c
1eb59 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 onst void *p = 0
1eb5a 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ;.. assert( sql
1eb5b 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
1eb5c 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 pCur->pBtree->db
1eb5d 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 ->mutex) );.. a
1eb5e 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c ssert( cursorHol
1eb5f 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b dsMutex(pCur) );
1eb60 0d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 .. if( ALWAYS(p
1eb61 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 Cur->eState==CUR
1eb62 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0d 0a 20 SOR_VALID) ){..
1eb63 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f p = (const vo
1eb64 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 id*)fetchPayload
1eb65 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b (pCur, pAmt, 1);
1eb66 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
1eb67 70 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a p;..}....../*..*
1eb68 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f * Move the curso
1eb69 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 r down to a new
1eb6a 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 child page. The
1eb6b 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e newPgno argumen
1eb6c 74 20 69 73 20 74 68 65 0d 0a 2a 2a 20 70 61 67 t is the..** pag
1eb6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 e number of the
1eb6e 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f child page to mo
1eb6f 76 65 20 74 6f 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 ve to...**..** T
1eb70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 his function ret
1eb71 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 urns SQLITE_CORR
1eb72 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d UPT if the page-
1eb73 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 header flags fie
1eb74 6c 64 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 6e 65 ld of..** the ne
1eb75 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 w child page doe
1eb76 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 s not match the
1eb77 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 flags field of t
1eb78 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0d he parent (i.e..
1eb79 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 .** if an intkey
1eb7a 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f page appears to
1eb7b 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f be the parent o
1eb7c 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 f a non-intkey p
1eb7d 61 67 65 2c 20 6f 72 0d 0a 2a 2a 20 76 69 63 65 age, or..** vice
1eb7e 2d 76 65 72 73 61 29 2e 0d 0a 2a 2f 0d 0a 73 74 -versa)...*/..st
1eb7f 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 atic int moveToC
1eb80 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 hild(BtCursor *p
1eb81 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f Cur, u32 newPgno
1eb82 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 ){.. int rc;..
1eb83 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 int i = pCur->i
1eb84 50 61 67 65 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 Page;.. MemPage
1eb85 20 2a 70 4e 65 77 50 61 67 65 3b 0d 0a 20 20 42 *pNewPage;.. B
1eb86 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 tShared *pBt = p
1eb87 43 75 72 2d 3e 70 42 74 3b 0d 0a 0d 0a 20 20 61 Cur->pBt;.... a
1eb88 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c ssert( cursorHol
1eb89 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b dsMutex(pCur) );
1eb8a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 .. assert( pCur
1eb8b 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 ->eState==CURSOR
1eb8c 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 61 73 73 _VALID );.. ass
1eb8d 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 ert( pCur->iPage
1eb8e 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 <BTCURSOR_MAX_DE
1eb8f 50 54 48 20 29 3b 0d 0a 20 20 69 66 28 20 70 43 PTH );.. if( pC
1eb90 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 ur->iPage>=(BTCU
1eb91 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 RSOR_MAX_DEPTH-1
1eb92 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e ) ){.. return
1eb93 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1eb94 42 4b 50 54 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 BKPT;.. }.. rc
1eb95 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 = getAndInitPag
1eb96 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 e(pBt, newPgno,
1eb97 26 70 4e 65 77 50 61 67 65 29 3b 0d 0a 20 20 69 &pNewPage);.. i
1eb98 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 f( rc ) return r
1eb99 63 3b 0d 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 c;.. pCur->apPa
1eb9a 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 ge[i+1] = pNewPa
1eb9b 67 65 3b 0d 0a 20 20 70 43 75 72 2d 3e 61 69 49 ge;.. pCur->aiI
1eb9c 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0d 0a 20 20 dx[i+1] = 0;..
1eb9d 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0d 0a pCur->iPage++;..
1eb9e 0d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e .. pCur->info.n
1eb9f 53 69 7a 65 20 3d 20 30 3b 0d 0a 20 20 70 43 75 Size = 0;.. pCu
1eba0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 r->validNKey = 0
1eba1 3b 0d 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 ;.. if( pNewPag
1eba2 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e e->nCell<1 || pN
1eba3 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d ewPage->intKey!=
1eba4 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d pCur->apPage[i]-
1eba5 3e 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 20 20 20 >intKey ){..
1eba6 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
1eba7 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 7d RRUPT_BKPT;.. }
1eba8 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
1eba9 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 20 E_OK;..}....#if
1ebaa 30 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 67 65 20 70 0../*..** Page p
1ebab 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 Parent is an int
1ebac 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 ernal (non-leaf)
1ebad 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 tree page. This
1ebae 20 66 75 6e 63 74 69 6f 6e 20 0d 0a 2a 2a 20 61 function ..** a
1ebaf 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 sserts that page
1ebb0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 number iChild i
1ebb1 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 s the left-child
1ebb2 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0d if the iIdx'th.
1ebb3 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 .** cell in page
1ebb4 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 pParent. Or, if
1ebb5 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 iIdx is equal t
1ebb6 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 o the total numb
1ebb7 65 72 20 6f 66 0d 0a 2a 2a 20 63 65 6c 6c 73 20 er of..** cells
1ebb8 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 in pParent, that
1ebb9 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 page number iCh
1ebba 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 ild is the right
1ebbb 2d 63 68 69 6c 64 20 6f 66 0d 0a 2a 2a 20 74 68 -child of..** th
1ebbc 65 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 e page...*/..sta
1ebbd 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 tic void assertP
1ebbe 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 arentIndex(MemPa
1ebbf 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 ge *pParent, int
1ebc0 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 iIdx, Pgno iChi
1ebc1 6c 64 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 ld){.. assert(
1ebc2 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e iIdx<=pParent->n
1ebc3 43 65 6c 6c 20 29 3b 0d 0a 20 20 69 66 28 20 69 Cell );.. if( i
1ebc4 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 Idx==pParent->nC
1ebc5 65 6c 6c 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 ell ){.. asse
1ebc6 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 rt( get4byte(&pP
1ebc7 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 arent->aData[pPa
1ebc8 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b rent->hdrOffset+
1ebc9 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0d 0a 8])==iChild );..
1ebca 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 61 73 }else{.. as
1ebcb 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 sert( get4byte(f
1ebcc 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c indCell(pParent,
1ebcd 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 iIdx))==iChild
1ebce 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6c 73 );.. }..}..#els
1ebcf 65 0d 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 e..# define ass
1ebd0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 ertParentIndex(x
1ebd1 2c 79 2c 7a 29 20 0d 0a 23 65 6e 64 69 66 0d 0a ,y,z) ..#endif..
1ebd2 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 74 68 ../*..** Move th
1ebd3 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 e cursor up to t
1ebd4 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0d he parent page..
1ebd5 0a 2a 2a 0d 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 .**..** pCur->id
1ebd6 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 x is set to the
1ebd7 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 cell index that
1ebd8 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 contains the poi
1ebd9 6e 74 65 72 0d 0a 2a 2a 20 74 6f 20 74 68 65 20 nter..** to the
1ebda 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 page we are comi
1ebdb 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 ng from. If we
1ebdc 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 are coming from
1ebdd 74 68 65 0d 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f the..** right-mo
1ebde 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 st child page th
1ebdf 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 en pCur->idx is
1ebe0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 set to one more
1ebe1 74 68 61 6e 0d 0a 2a 2a 20 74 68 65 20 6c 61 72 than..** the lar
1ebe2 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e gest cell index.
1ebe3 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 ..*/..static voi
1ebe4 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 d moveToParent(B
1ebe5 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d tCursor *pCur){.
1ebe6 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f . assert( curso
1ebe7 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 rHoldsMutex(pCur
1ebe8 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
1ebe9 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 pCur->eState==CU
1ebea 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 RSOR_VALID );..
1ebeb 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 assert( pCur->i
1ebec 50 61 67 65 3e 30 20 29 3b 0d 0a 20 20 61 73 73 Page>0 );.. ass
1ebed 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 ert( pCur->apPag
1ebee 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 e[pCur->iPage] )
1ebef 3b 0d 0a 0d 0a 20 20 2f 2a 20 55 50 44 41 54 45 ;.... /* UPDATE
1ebf0 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 : It is actually
1ebf1 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 possible for th
1ebf2 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 e condition test
1ebf3 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 ed by the assert
1ebf4 0d 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 .. ** below to
1ebf5 62 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 be untrue if the
1ebf6 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
1ebf7 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 s corrupt. This
1ebf8 63 61 6e 20 6f 63 63 75 72 20 69 66 0d 0a 20 20 can occur if..
1ebf9 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 ** one cursor ha
1ebfa 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 s modified page
1ebfb 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 pParent while a
1ebfc 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 reference to it
1ebfd 69 73 20 68 65 6c 64 20 0d 0a 20 20 2a 2a 20 62 is held .. ** b
1ebfe 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f y a second curso
1ebff 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c r. Which can onl
1ec00 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73 69 y happen if a si
1ec01 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e ngle page is lin
1ec02 6b 65 64 0d 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d ked.. ** into m
1ec03 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 ore than one b-t
1ec04 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e ree structure in
1ec05 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 a corrupt datab
1ec06 61 73 65 2e 20 20 2a 2f 0d 0a 23 69 66 20 30 0d ase. */..#if 0.
1ec07 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 . assertParentI
1ec08 6e 64 65 78 28 0d 0a 20 20 20 20 70 43 75 72 2d ndex(.. pCur-
1ec09 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 >apPage[pCur->iP
1ec0a 61 67 65 2d 31 5d 2c 20 0d 0a 20 20 20 20 70 43 age-1], .. pC
1ec0b 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
1ec0c 69 50 61 67 65 2d 31 5d 2c 20 0d 0a 20 20 20 20 iPage-1], ..
1ec0d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 pCur->apPage[pCu
1ec0e 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0d r->iPage]->pgno.
1ec0f 0a 20 20 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 . );..#endif..
1ec10 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d testcase( pCur-
1ec11 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 >aiIdx[pCur->iPa
1ec12 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 ge-1] > pCur->ap
1ec13 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 Page[pCur->iPage
1ec14 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 0d -1]->nCell );...
1ec15 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 . releasePage(p
1ec16 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 Cur->apPage[pCur
1ec17 2d 3e 69 50 61 67 65 5d 29 3b 0d 0a 20 20 70 43 ->iPage]);.. pC
1ec18 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0d 0a 20 20 ur->iPage--;..
1ec19 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 pCur->info.nSize
1ec1a 20 3d 20 30 3b 0d 0a 20 20 70 43 75 72 2d 3e 76 = 0;.. pCur->v
1ec1b 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0d 0a 7d alidNKey = 0;..}
1ec1c 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 ..../*..** Move
1ec1d 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f the cursor to po
1ec1e 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 int to the root
1ec1f 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 page of its b-tr
1ec20 65 65 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 2a ee structure...*
1ec21 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 *..** If the tab
1ec22 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c le has a virtual
1ec23 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e root page, then
1ec24 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d the cursor is m
1ec25 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0d 0a 2a oved to point..*
1ec26 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c * to the virtual
1ec27 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 root page inste
1ec28 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c ad of the actual
1ec29 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 root page. A ta
1ec2a 62 6c 65 20 68 61 73 20 61 0d 0a 2a 2a 20 76 69 ble has a..** vi
1ec2b 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 rtual root page
1ec2c 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 when the actual
1ec2d 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 root page contai
1ec2e 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 ns no cells and
1ec2f 61 20 0d 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 a ..** single ch
1ec30 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 ild page. This c
1ec31 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 an only happen w
1ec32 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f ith the table ro
1ec33 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0d oted at page 1..
1ec34 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 62 .**..** If the b
1ec35 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 -tree structure
1ec36 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 is empty, the cu
1ec37 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 rsor state is se
1ec38 74 20 74 6f 20 0d 0a 2a 2a 20 43 55 52 53 4f 52 t to ..** CURSOR
1ec39 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 _INVALID. Otherw
1ec3a 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 ise, the cursor
1ec3b 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 is set to point
1ec3c 74 6f 20 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a to the first..**
1ec3d 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e cell located on
1ec3e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 the root (or vi
1ec3f 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 rtual root) page
1ec40 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 and the cursor
1ec41 73 74 61 74 65 0d 0a 2a 2a 20 69 73 20 73 65 74 state..** is set
1ec42 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 to CURSOR_VALID
1ec43 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 69 ...**..** If thi
1ec44 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
1ec45 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c ns successfully,
1ec46 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d it may be assum
1ec47 65 64 20 74 68 61 74 20 74 68 65 0d 0a 2a 2a 20 ed that the..**
1ec48 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 page-header flag
1ec49 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 s indicate that
1ec4a 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f the [virtual] ro
1ec4b 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 ot-page is the e
1ec4c 78 70 65 63 74 65 64 20 0d 0a 2a 2a 20 6b 69 6e xpected ..** kin
1ec4d 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 d of b-tree page
1ec4e 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f (i.e. if when o
1ec4f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f pening the curso
1ec50 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 r the caller did
1ec51 20 6e 6f 74 0d 0a 2a 2a 20 73 70 65 63 69 66 79 not..** specify
1ec52 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 a KeyInfo struc
1ec53 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 ture the flags b
1ec54 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 yte is set to 0x
1ec55 30 35 20 6f 72 20 30 78 30 44 2c 0d 0a 2a 2a 20 05 or 0x0D,..**
1ec56 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 indicating a tab
1ec57 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 le b-tree, or if
1ec58 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 the caller did
1ec59 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 specify a KeyInf
1ec5a 6f 20 0d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 o ..** structure
1ec5b 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 the flags byte
1ec5c 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f is set to 0x02 o
1ec5d 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 r 0x0A, indicati
1ec5e 6e 67 20 61 6e 20 69 6e 64 65 78 0d 0a 2a 2a 20 ng an index..**
1ec5f 62 2d 74 72 65 65 29 2e 0d 0a 2a 2f 0d 0a 73 74 b-tree)...*/..st
1ec60 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 atic int moveToR
1ec61 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 oot(BtCursor *pC
1ec62 75 72 29 7b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 ur){.. MemPage
1ec63 2a 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74 20 72 *pRoot;.. int r
1ec64 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
1ec65 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 Btree *p = pCu
1ec66 72 2d 3e 70 42 74 72 65 65 3b 0d 0a 20 20 42 74 r->pBtree;.. Bt
1ec67 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d Shared *pBt = p-
1ec68 3e 70 42 74 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 >pBt;.... asser
1ec69 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 t( cursorHoldsMu
1ec6a 74 65 78 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 tex(pCur) );..
1ec6b 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 assert( CURSOR_I
1ec6c 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f NVALID < CURSOR_
1ec6d 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0d 0a REQUIRESEEK );..
1ec6e 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 assert( CURSOR
1ec6f 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f _VALID < CURSO
1ec70 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b R_REQUIRESEEK );
1ec71 0d 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 .. assert( CURS
1ec72 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 OR_FAULT > CUR
1ec73 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 SOR_REQUIRESEEK
1ec74 29 3b 0d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e );.. if( pCur->
1ec75 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 eState>=CURSOR_R
1ec76 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0d 0a 20 EQUIRESEEK ){..
1ec77 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 if( pCur->eSt
1ec78 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c ate==CURSOR_FAUL
1ec79 54 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 T ){.. asse
1ec7a 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 rt( pCur->skipNe
1ec7b 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b xt!=SQLITE_OK );
1ec7c 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 .. return p
1ec7d 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0d 0a Cur->skipNext;..
1ec7e 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 }.. sqlit
1ec7f 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 e3BtreeClearCurs
1ec80 6f 72 28 70 43 75 72 29 3b 0d 0a 20 20 7d 0d 0a or(pCur);.. }..
1ec81 0d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 .. if( pCur->iP
1ec82 61 67 65 3e 3d 30 20 29 7b 0d 0a 20 20 20 20 69 age>=0 ){.. i
1ec83 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 nt i;.. for(i
1ec84 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 =1; i<=pCur->iPa
1ec85 67 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 ge; i++){..
1ec86 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 releasePage(pCu
1ec87 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0d 0a r->apPage[i]);..
1ec88 20 20 20 20 7d 0d 0a 20 20 20 20 70 43 75 72 2d }.. pCur-
1ec89 3e 69 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 7d >iPage = 0;.. }
1ec8a 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 else if( pCur->p
1ec8b 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0d 0a 20 gnoRoot==0 ){..
1ec8c 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 pCur->eState
1ec8d 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 = CURSOR_INVALID
1ec8e 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ;.. return SQ
1ec8f 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 65 6c 73 LITE_OK;.. }els
1ec90 65 7b 0d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 e{.. rc = get
1ec91 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c AndInitPage(pBt,
1ec92 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c pCur->pgnoRoot,
1ec93 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 &pCur->apPage[0
1ec94 5d 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 ]);.. if( rc!
1ec95 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
1ec96 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 pCur->eStat
1ec97 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c e = CURSOR_INVAL
1ec98 49 44 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 ID;.. retur
1ec99 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 n rc;.. }..
1ec9a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 pCur->iPage =
1ec9b 30 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 20 0;.... /* If
1ec9c 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 pCur->pKeyInfo i
1ec9d 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e s not NULL, then
1ec9e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 the caller that
1ec9f 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 opened this cur
1eca0 73 6f 72 0d 0a 20 20 20 20 2a 2a 20 65 78 70 65 sor.. ** expe
1eca1 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 cted to open it
1eca2 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 on an index b-tr
1eca3 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 ee. Otherwise, i
1eca4 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0d 0a 20 f pKeyInfo is..
1eca5 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 ** NULL, the
1eca6 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 caller expects a
1eca7 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 table b-tree. I
1eca8 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 f this is not th
1eca9 65 20 63 61 73 65 2c 0d 0a 20 20 20 20 2a 2a 20 e case,.. **
1ecaa 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 return an SQLITE
1ecab 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 _CORRUPT error.
1ecac 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 */.. assert(
1ecad 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d pCur->apPage[0]
1ecae 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 ->intKey==1 || p
1ecaf 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e Cur->apPage[0]->
1ecb0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0d 0a 20 20 intKey==0 );..
1ecb1 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 if( (pCur->pKe
1ecb2 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d yInfo==0)!=pCur-
1ecb3 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b >apPage[0]->intK
1ecb4 65 79 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 ey ){.. ret
1ecb5 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 urn SQLITE_CORRU
1ecb6 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d PT_BKPT;.. }.
1ecb7 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 41 73 73 . }.... /* Ass
1ecb8 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f ert that the roo
1ecb9 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 t page is of the
1ecba 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 correct type. T
1ecbb 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0d his must be the.
1ecbc 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 . ** case as th
1ecbd 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 e call to this f
1ecbe 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 unction that loa
1ecbf 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 ded the root-pag
1ecc0 65 20 28 65 69 74 68 65 72 0d 0a 20 20 2a 2a 20 e (either.. **
1ecc1 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 this call or a p
1ecc2 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 revious invocati
1ecc3 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 on) would have d
1ecc4 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 etected corrupti
1ecc5 6f 6e 20 0d 0a 20 20 2a 2a 20 69 66 20 74 68 65 on .. ** if the
1ecc6 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 assumption were
1ecc7 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 not true, and i
1ecc8 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c t is not possibl
1ecc9 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 e for the flags
1ecca 0d 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 .. ** byte to h
1eccb 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 ave been modifie
1eccc 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 d while this cur
1eccd 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 sor is holding a
1ecce 20 72 65 66 65 72 65 6e 63 65 0d 0a 20 20 2a 2a reference.. **
1eccf 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a to the page. *
1ecd0 2f 0d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 /.. pRoot = pCu
1ecd1 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0d 0a 20 r->apPage[0];..
1ecd2 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e assert( pRoot->
1ecd3 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f pgno==pCur->pgno
1ecd4 52 6f 6f 74 20 29 3b 0d 0a 20 20 61 73 73 65 72 Root );.. asser
1ecd5 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 t( pRoot->isInit
1ecd6 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 && (pCur->pKeyI
1ecd7 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e nfo==0)==pRoot->
1ecd8 69 6e 74 4b 65 79 20 29 3b 0d 0a 0d 0a 20 20 70 intKey );.... p
1ecd9 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 Cur->aiIdx[0] =
1ecda 30 3b 0d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 0;.. pCur->info
1ecdb 2e 6e 53 69 7a 65 20 3d 20 30 3b 0d 0a 20 20 70 .nSize = 0;.. p
1ecdc 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b Cur->atLast = 0;
1ecdd 0d 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e .. pCur->validN
1ecde 4b 65 79 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 Key = 0;.... if
1ecdf 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d ( pRoot->nCell==
1ece0 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 0 && !pRoot->lea
1ece1 66 20 29 7b 0d 0a 20 20 20 20 50 67 6e 6f 20 73 f ){.. Pgno s
1ece2 75 62 70 61 67 65 3b 0d 0a 20 20 20 20 69 66 28 ubpage;.. if(
1ece3 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 pRoot->pgno!=1
1ece4 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
1ece5 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 CORRUPT_BKPT;..
1ece6 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 subpage = get
1ece7 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 4byte(&pRoot->aD
1ece8 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 ata[pRoot->hdrOf
1ece9 66 73 65 74 2b 38 5d 29 3b 0d 0a 20 20 20 20 70 fset+8]);.. p
1ecea 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 Cur->eState = CU
1eceb 52 53 4f 52 5f 56 41 4c 49 44 3b 0d 0a 20 20 20 RSOR_VALID;..
1ecec 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c rc = moveToChil
1eced 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 d(pCur, subpage)
1ecee 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
1ecef 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 pCur->eState =
1ecf0 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 ((pRoot->nCell>0
1ecf1 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 )?CURSOR_VALID:C
1ecf2 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0d URSOR_INVALID);.
1ecf3 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
1ecf4 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 c;..}..../*..**
1ecf5 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 Move the cursor
1ecf6 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 down to the left
1ecf7 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 -most leaf entry
1ecf8 20 62 65 6e 65 61 74 68 20 74 68 65 0d 0a 2a 2a beneath the..**
1ecf9 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 entry to which
1ecfa 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 it is currently
1ecfb 70 6f 69 6e 74 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a pointing...**..*
1ecfc 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 * The left-most
1ecfd 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 leaf is the one
1ecfe 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 with the smalles
1ecff 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 t key - the firs
1ed00 74 0d 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 t..** in ascendi
1ed01 6e 67 20 6f 72 64 65 72 2e 0d 0a 2a 2f 0d 0a 73 ng order...*/..s
1ed02 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f tatic int moveTo
1ed03 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f Leftmost(BtCurso
1ed04 72 20 2a 70 43 75 72 29 7b 0d 0a 20 20 50 67 6e r *pCur){.. Pgn
1ed05 6f 20 70 67 6e 6f 3b 0d 0a 20 20 69 6e 74 20 72 o pgno;.. int r
1ed06 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
1ed07 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 MemPage *pPage
1ed08 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 63 ;.... assert( c
1ed09 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 ursorHoldsMutex(
1ed0a 70 43 75 72 29 20 29 3b 0d 0a 20 20 61 73 73 65 pCur) );.. asse
1ed0b 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 rt( pCur->eState
1ed0c 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 ==CURSOR_VALID )
1ed0d 3b 0d 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d ;.. while( rc==
1ed0e 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 SQLITE_OK && !(p
1ed0f 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 Page = pCur->apP
1ed10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d age[pCur->iPage]
1ed11 29 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 20 20 )->leaf ){..
1ed12 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 assert( pCur->ai
1ed13 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d Idx[pCur->iPage]
1ed14 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b <pPage->nCell );
1ed15 0d 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 .. pgno = get
1ed16 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 4byte(findCell(p
1ed17 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 Page, pCur->aiId
1ed18 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 x[pCur->iPage]))
1ed19 3b 0d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 ;.. rc = move
1ed1a 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 ToChild(pCur, pg
1ed1b 6e 6f 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 no);.. }.. ret
1ed1c 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a urn rc;..}..../*
1ed1d 0d 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 ..** Move the cu
1ed1e 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 rsor down to the
1ed1f 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 right-most leaf
1ed20 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 entry beneath t
1ed21 68 65 0d 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 he..** page to w
1ed22 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 hich it is curre
1ed23 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 ntly pointing.
1ed24 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 Notice the diffe
1ed25 72 65 6e 63 65 0d 0a 2a 2a 20 62 65 74 77 65 65 rence..** betwee
1ed26 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 n moveToLeftmost
1ed27 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 () and moveToRig
1ed28 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 htmost(). moveT
1ed29 6f 4c 65 66 74 6d 6f 73 74 28 29 0d 0a 2a 2a 20 oLeftmost()..**
1ed2a 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d finds the left-m
1ed2b 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 ost entry beneat
1ed2c 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 h the *entry* wh
1ed2d 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 ereas moveToRigh
1ed2e 74 6d 6f 73 74 28 29 0d 0a 2a 2a 20 66 69 6e 64 tmost()..** find
1ed2f 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 s the right-most
1ed30 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 entry beneath t
1ed31 68 65 20 2a 70 61 67 65 2a 2e 0d 0a 2a 2a 0d 0a he *page*...**..
1ed32 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 ** The right-mos
1ed33 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f t entry is the o
1ed34 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 ne with the larg
1ed35 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 est key - the la
1ed36 73 74 0d 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 st..** key in as
1ed37 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0d 0a cending order...
1ed38 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 6d */..static int m
1ed39 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 oveToRightmost(B
1ed3a 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d tCursor *pCur){.
1ed3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0d 0a 20 . Pgno pgno;..
1ed3c 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
1ed3d 5f 4f 4b 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 _OK;.. MemPage
1ed3e 2a 70 50 61 67 65 20 3d 20 30 3b 0d 0a 0d 0a 20 *pPage = 0;....
1ed3f 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 assert( cursorH
1ed40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 oldsMutex(pCur)
1ed41 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 );.. assert( pC
1ed42 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 ur->eState==CURS
1ed43 4f 52 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 77 OR_VALID );.. w
1ed44 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 hile( rc==SQLITE
1ed45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d _OK && !(pPage =
1ed46 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 pCur->apPage[pC
1ed47 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 ur->iPage])->lea
1ed48 66 20 29 7b 0d 0a 20 20 20 20 70 67 6e 6f 20 3d f ){.. pgno =
1ed49 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 get4byte(&pPage
1ed4a 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 ->aData[pPage->h
1ed4b 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0d 0a 20 drOffset+8]);..
1ed4c 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 pCur->aiIdx[p
1ed4d 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 Cur->iPage] = pP
1ed4e 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 20 20 20 age->nCell;..
1ed4f 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c rc = moveToChil
1ed50 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0d 0a d(pCur, pgno);..
1ed51 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 }.. if( rc==S
1ed52 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1ed53 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 pCur->aiIdx[pCu
1ed54 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 r->iPage] = pPag
1ed55 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0d 0a 20 20 20 e->nCell-1;..
1ed56 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a pCur->info.nSiz
1ed57 65 20 3d 20 30 3b 0d 0a 20 20 20 20 70 43 75 72 e = 0;.. pCur
1ed58 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b ->validNKey = 0;
1ed59 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 .. }.. return
1ed5a 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 4d 6f 76 rc;..}..../* Mov
1ed5b 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 e the cursor to
1ed5c 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 the first entry
1ed5d 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 in the table. R
1ed5e 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0d eturn SQLITE_OK.
1ed5f 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 .** on success.
1ed60 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 Set *pRes to 0
1ed61 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 if the cursor ac
1ed62 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f tually points to
1ed63 20 73 6f 6d 65 74 68 69 6e 67 0d 0a 2a 2a 20 6f something..** o
1ed64 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 r set *pRes to 1
1ed65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 if the table is
1ed66 20 65 6d 70 74 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c empty...*/..SQL
1ed67 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
1ed68 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 sqlite3BtreeFirs
1ed69 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 t(BtCursor *pCur
1ed6a 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0d 0a 20 , int *pRes){..
1ed6b 20 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 61 73 int rc;.... as
1ed6c 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 sert( cursorHold
1ed6d 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0d sMutex(pCur) );.
1ed6e 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1ed6f 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 e3_mutex_held(pC
1ed70 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e ur->pBtree->db->
1ed71 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 72 63 20 mutex) );.. rc
1ed72 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 = moveToRoot(pCu
1ed73 72 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 r);.. if( rc==S
1ed74 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1ed75 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 if( pCur->eStat
1ed76 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 e==CURSOR_INVALI
1ed77 44 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 D ){.. asse
1ed78 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f rt( pCur->pgnoRo
1ed79 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 ot==0 || pCur->a
1ed7a 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 pPage[pCur->iPag
1ed7b 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0d e]->nCell==0 );.
1ed7c 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 . *pRes = 1
1ed7d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 ;.. }else{..
1ed7e 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 assert( pCu
1ed7f 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e r->apPage[pCur->
1ed80 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 iPage]->nCell>0
1ed81 29 3b 0d 0a 20 20 20 20 20 20 2a 70 52 65 73 20 );.. *pRes
1ed82 3d 20 30 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d = 0;.. rc =
1ed83 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 moveToLeftmost(
1ed84 70 43 75 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 pCur);.. }..
1ed85 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
1ed86 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 4d 6f 76 65 20 74 ..}..../* Move t
1ed87 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 he cursor to the
1ed88 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 last entry in t
1ed89 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 he table. Retur
1ed8a 6e 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a 20 n SQLITE_OK..**
1ed8b 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 on success. Set
1ed8c 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 *pRes to 0 if t
1ed8d 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c he cursor actual
1ed8e 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d ly points to som
1ed8f 65 74 68 69 6e 67 0d 0a 2a 2a 20 6f 72 20 73 65 ething..** or se
1ed90 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 t *pRes to 1 if
1ed91 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 the table is emp
1ed92 74 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ty...*/..SQLITE_
1ed93 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
1ed94 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 te3BtreeLast(BtC
1ed95 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 ursor *pCur, int
1ed96 20 2a 70 52 65 73 29 7b 0d 0a 20 20 69 6e 74 20 *pRes){.. int
1ed97 72 63 3b 0d 0a 20 0d 0a 20 20 61 73 73 65 72 74 rc;.. .. assert
1ed98 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 ( cursorHoldsMut
1ed99 65 78 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 61 ex(pCur) );.. a
1ed9a 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d ssert( sqlite3_m
1ed9b 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e utex_held(pCur->
1ed9c 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 pBtree->db->mute
1ed9d 78 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 x) );.... /* If
1ed9e 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 the cursor alre
1ed9f 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 ady points to th
1eda0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 e last entry, th
1eda1 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a is is a no-op. *
1eda2 2f 0d 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f /.. if( CURSOR_
1eda3 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 VALID==pCur->eSt
1eda4 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c ate && pCur->atL
1eda5 61 73 74 20 29 7b 0d 0a 23 69 66 64 65 66 20 53 ast ){..#ifdef S
1eda6 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 20 QLITE_DEBUG..
1eda7 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 /* This block s
1eda8 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 erves to assert(
1eda9 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f ) that the curso
1edaa 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f r really does po
1edab 69 6e 74 20 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 int .. ** to
1edac 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 the last entry i
1edad 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f n the b-tree. */
1edae 0d 0a 20 20 20 20 69 6e 74 20 69 69 3b 0d 0a 20 .. int ii;..
1edaf 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c for(ii=0; ii<
1edb0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b pCur->iPage; ii+
1edb1 2b 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 +){.. asser
1edb2 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 t( pCur->aiIdx[i
1edb3 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 i]==pCur->apPage
1edb4 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0d 0a [ii]->nCell );..
1edb5 20 20 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 }.. asser
1edb6 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 t( pCur->aiIdx[p
1edb7 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 Cur->iPage]==pCu
1edb8 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e r->apPage[pCur->
1edb9 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 iPage]->nCell-1
1edba 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
1edbb 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 pCur->apPage[pCu
1edbc 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 r->iPage]->leaf
1edbd 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 );..#endif..
1edbe 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1edbf 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 63 20 3d ;.. }.... rc =
1edc0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 moveToRoot(pCur
1edc1 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 );.. if( rc==SQ
1edc2 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1edc3 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c if( CURSOR_INVAL
1edc4 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 ID==pCur->eState
1edc5 20 29 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 ){.. asser
1edc6 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f t( pCur->pgnoRoo
1edc7 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 t==0 || pCur->ap
1edc8 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 Page[pCur->iPage
1edc9 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0d 0a ]->nCell==0 );..
1edca 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b *pRes = 1;
1edcb 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
1edcc 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 assert( pCur
1edcd 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 ->eState==CURSOR
1edce 5f 56 41 4c 49 44 20 29 3b 0d 0a 20 20 20 20 20 _VALID );..
1edcf 20 2a 70 52 65 73 20 3d 20 30 3b 0d 0a 20 20 20 *pRes = 0;..
1edd0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 rc = moveToRi
1edd1 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0d 0a ghtmost(pCur);..
1edd2 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 pCur->atLa
1edd3 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f st = rc==SQLITE_
1edd4 4f 4b 20 3f 31 3a 30 3b 0d 0a 20 20 20 20 7d 0d OK ?1:0;.. }.
1edd5 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
1edd6 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 4d 6f 76 65 c;..}..../* Move
1edd7 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 the cursor so t
1edd8 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f hat it points to
1edd9 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 an entry near t
1edda 68 65 20 6b 65 79 20 0d 0a 2a 2a 20 73 70 65 63 he key ..** spec
1eddb 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 ified by pIdxKey
1eddc 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 or intKey. Re
1eddd 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 turn a success c
1edde 6f 64 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 ode...**..** For
1eddf 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 INTKEY tables,
1ede0 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d the intKey param
1ede1 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 eter is used. p
1ede2 49 64 78 4b 65 79 20 0d 0a 2a 2a 20 6d 75 73 74 IdxKey ..** must
1ede3 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 be NULL. For i
1ede4 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 ndex tables, pId
1ede5 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 xKey is used and
1ede6 20 69 6e 74 4b 65 79 0d 0a 2a 2a 20 69 73 20 69 intKey..** is i
1ede7 67 6e 6f 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 gnored...**..**
1ede8 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 If an exact matc
1ede9 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 h is not found,
1edea 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 then the cursor
1edeb 69 73 20 61 6c 77 61 79 73 0d 0a 2a 2a 20 6c 65 is always..** le
1edec 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 ft pointing at a
1eded 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 leaf page which
1edee 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 would hold the
1edef 65 6e 74 72 79 20 69 66 20 69 74 0d 0a 2a 2a 20 entry if it..**
1edf0 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 were present. T
1edf1 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 he cursor might
1edf2 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 point to an entr
1edf3 79 20 74 68 61 74 20 63 6f 6d 65 73 0d 0a 2a 2a y that comes..**
1edf4 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 before or after
1edf5 20 74 68 65 20 6b 65 79 2e 0d 0a 2a 2a 0d 0a 2a the key...**..*
1edf6 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 * An integer is
1edf7 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 written into *pR
1edf8 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 es which is the
1edf9 72 65 73 75 6c 74 20 6f 66 0d 0a 2a 2a 20 63 6f result of..** co
1edfa 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 mparing the key
1edfb 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 with the entry t
1edfc 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 o which the curs
1edfd 6f 72 20 69 73 20 0d 0a 2a 2a 20 70 6f 69 6e 74 or is ..** point
1edfe 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e ing. The meanin
1edff 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 g of the integer
1ee00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0d 0a 2a written into..*
1ee01 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f * *pRes is as fo
1ee02 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 llows:..**..**
1ee03 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 *pRes<0
1ee04 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 The cursor is le
1ee05 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 ft pointing at a
1ee06 6e 20 65 6e 74 72 79 20 74 68 61 74 0d 0a 2a 2a n entry that..**
1ee07 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ee08 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 is smaller tha
1ee09 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 n intKey/pIdxKey
1ee0a 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 or if the table
1ee0b 20 69 73 20 65 6d 70 74 79 0d 0a 2a 2a 20 20 20 is empty..**
1ee0c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
1ee0d 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 nd the cursor is
1ee0e 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 therefore left
1ee0f 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 point to nothing
1ee10 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 2a 70 ...**..** *p
1ee11 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 Res==0 The c
1ee12 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f ursor is left po
1ee13 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 inting at an ent
1ee14 72 79 20 74 68 61 74 0d 0a 2a 2a 20 20 20 20 20 ry that..**
1ee15 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 exa
1ee16 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 ctly matches int
1ee17 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0d 0a 2a 2a Key/pIdxKey...**
1ee18 0d 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 ..** *pRes>0
1ee19 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 The cursor
1ee1a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e is left pointin
1ee1b 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 g at an entry th
1ee1c 61 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 at..**
1ee1d 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 is large
1ee1e 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 r than intKey/pI
1ee1f 64 78 4b 65 79 2e 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a dxKey...**..*/..
1ee20 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
1ee21 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d nt sqlite3BtreeM
1ee22 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0d 0a ovetoUnpacked(..
1ee23 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 BtCursor *pCur
1ee24 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 , /* Th
1ee25 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d e cursor to be m
1ee26 6f 76 65 64 20 2a 2f 0d 0a 20 20 55 6e 70 61 63 oved */.. Unpac
1ee27 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b kedRecord *pIdxK
1ee28 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 ey, /* Unpacked
1ee29 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0d 0a 20 20 index key */..
1ee2a 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 i64 intKey,
1ee2b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
1ee2c 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0d 0a 20 20 table key */..
1ee2d 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 int biasRight,
1ee2e 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 /* If t
1ee2f 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 rue, bias the se
1ee30 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 arch to the high
1ee31 20 65 6e 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a end */.. int *
1ee32 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 pRes
1ee33 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 /* Write sea
1ee34 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 rch results here
1ee35 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 */..){.. int r
1ee36 63 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 c;.... assert(
1ee37 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 cursorHoldsMutex
1ee38 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 61 73 73 (pCur) );.. ass
1ee39 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
1ee3a 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 ex_held(pCur->pB
1ee3b 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 tree->db->mutex)
1ee3c 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 );.. assert( p
1ee3d 52 65 73 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 Res );.. assert
1ee3e 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d ( (pIdxKey==0)==
1ee3f 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d (pCur->pKeyInfo=
1ee40 3d 30 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 =0) );.... /* I
1ee41 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 f the cursor is
1ee42 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e already position
1ee43 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 ed at the point
1ee44 77 65 20 61 72 65 20 74 72 79 69 6e 67 0d 0a 20 we are trying..
1ee45 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 ** to move to,
1ee46 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e then just return
1ee47 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 without doing a
1ee48 6e 79 20 77 6f 72 6b 20 2a 2f 0d 0a 20 20 69 66 ny work */.. if
1ee49 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d ( pCur->eState==
1ee4a 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 CURSOR_VALID &&
1ee4b 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 pCur->validNKey
1ee4c 0d 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 .. && pCur->ap
1ee4d 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 Page[0]->intKey
1ee4e 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 .. ){.. if(
1ee4f 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d pCur->info.nKey=
1ee50 3d 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 20 20 20 =intKey ){..
1ee51 20 20 2a 70 52 65 73 20 3d 20 30 3b 0d 0a 20 20 *pRes = 0;..
1ee52 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1ee53 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 E_OK;.. }..
1ee54 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 if( pCur->atLa
1ee55 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f st && pCur->info
1ee56 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0d .nKey<intKey ){.
1ee57 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d . *pRes = -
1ee58 31 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 1;.. return
1ee59 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 SQLITE_OK;..
1ee5a 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 63 20 }.. }.... rc
1ee5b 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 = moveToRoot(pCu
1ee5c 72 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 7b r);.. if( rc ){
1ee5d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b .. return rc;
1ee5e 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
1ee5f 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d pCur->pgnoRoot=
1ee60 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 =0 || pCur->apPa
1ee61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 ge[pCur->iPage]
1ee62 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 );.. assert( pC
1ee63 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 ur->pgnoRoot==0
1ee64 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b || pCur->apPage[
1ee65 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 pCur->iPage]->is
1ee66 49 6e 69 74 20 29 3b 0d 0a 20 20 61 73 73 65 72 Init );.. asser
1ee67 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d t( pCur->eState=
1ee68 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 =CURSOR_INVALID
1ee69 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b || pCur->apPage[
1ee6a 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 pCur->iPage]->nC
1ee6b 65 6c 6c 3e 30 20 29 3b 0d 0a 20 20 69 66 28 20 ell>0 );.. if(
1ee6c 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 pCur->eState==CU
1ee6d 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0d RSOR_INVALID ){.
1ee6e 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b . *pRes = -1;
1ee6f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 .. assert( pC
1ee70 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 ur->pgnoRoot==0
1ee71 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b || pCur->apPage[
1ee72 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 pCur->iPage]->nC
1ee73 65 6c 6c 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 72 ell==0 );.. r
1ee74 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1ee75 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
1ee76 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d pCur->apPage[0]
1ee77 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 ->intKey || pIdx
1ee78 4b 65 79 20 29 3b 0d 0a 20 20 66 6f 72 28 3b 3b Key );.. for(;;
1ee79 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c ){.. int lwr,
1ee7a 20 75 70 72 2c 20 69 64 78 3b 0d 0a 20 20 20 20 upr, idx;..
1ee7b 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0d 0a 20 20 Pgno chldPg;..
1ee7c 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 MemPage *pPage
1ee7d 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b = pCur->apPage[
1ee7e 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 pCur->iPage];..
1ee7f 20 20 20 69 6e 74 20 63 3b 0d 0a 0d 0a 20 20 20 int c;....
1ee80 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c /* pPage->nCell
1ee81 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 must be greater
1ee82 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 than zero. If t
1ee83 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d his is the root-
1ee84 70 61 67 65 0d 0a 20 20 20 20 2a 2a 20 74 68 65 page.. ** the
1ee85 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 cursor would ha
1ee86 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 ve been INVALID
1ee87 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 above and this f
1ee88 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0d 0a 20 20 20 or(;;) loop..
1ee89 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 ** not run. If
1ee8a 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 this is not the
1ee8b 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 root-page, then
1ee8c 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 the moveToChild(
1ee8d 29 20 72 6f 75 74 69 6e 65 0d 0a 20 20 20 20 2a ) routine.. *
1ee8e 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 * would have alr
1ee8f 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 eady detected db
1ee90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d corruption. Sim
1ee91 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 ilarly, pPage mu
1ee92 73 74 0d 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 st.. ** be th
1ee93 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e e right kind (in
1ee94 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 dex or table) of
1ee95 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 b-tree page. Ot
1ee96 68 65 72 77 69 73 65 0d 0a 20 20 20 20 2a 2a 20 herwise.. **
1ee97 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 a moveToChild()
1ee98 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 or moveToRoot()
1ee99 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 call would have
1ee9a 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 detected corrupt
1ee9b 69 6f 6e 2e 20 20 2a 2f 0d 0a 20 20 20 20 61 73 ion. */.. as
1ee9c 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 sert( pPage->nCe
1ee9d 6c 6c 3e 30 20 29 3b 0d 0a 20 20 20 20 61 73 73 ll>0 );.. ass
1ee9e 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b ert( pPage->intK
1ee9f 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 ey==(pIdxKey==0)
1eea0 20 29 3b 0d 0a 20 20 20 20 6c 77 72 20 3d 20 30 );.. lwr = 0
1eea1 3b 0d 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 ;.. upr = pPa
1eea2 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0d 0a 20 20 ge->nCell-1;..
1eea3 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20 if( biasRight
1eea4 29 7b 0d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e ){.. pCur->
1eea5 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 aiIdx[pCur->iPag
1eea6 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d e] = (u16)(idx =
1eea7 20 75 70 72 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 upr);.. }els
1eea8 65 7b 0d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e e{.. pCur->
1eea9 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 aiIdx[pCur->iPag
1eeaa 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d e] = (u16)(idx =
1eeab 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0d 0a (upr+lwr)/2);..
1eeac 20 20 20 20 7d 0d 0a 20 20 20 20 66 6f 72 28 3b }.. for(;
1eead 3b 29 7b 0d 0a 20 20 20 20 20 20 75 38 20 2a 70 ;){.. u8 *p
1eeae 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 Cell;
1eeaf 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1eeb0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 * Pointer to cur
1eeb1 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 rent cell in pPa
1eeb2 67 65 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 61 ge */.... a
1eeb3 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 ssert( idx==pCur
1eeb4 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 ->aiIdx[pCur->iP
1eeb5 61 67 65 5d 20 29 3b 0d 0a 20 20 20 20 20 20 70 age] );.. p
1eeb6 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 Cur->info.nSize
1eeb7 3d 20 30 3b 0d 0a 20 20 20 20 20 20 70 43 65 6c = 0;.. pCel
1eeb8 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 l = findCell(pPa
1eeb9 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 ge, idx) + pPage
1eeba 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0d ->childPtrSize;.
1eebb 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 . if( pPage
1eebc 2d 3e 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 20 20 ->intKey ){..
1eebd 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 i64 nCellKe
1eebe 79 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 y;.. if(
1eebf 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 pPage->hasData )
1eec0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 {.. u32
1eec1 20 64 75 6d 6d 79 3b 0d 0a 20 20 20 20 20 20 20 dummy;..
1eec2 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 pCell += getV
1eec3 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 arint32(pCell, d
1eec4 75 6d 6d 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 ummy);..
1eec5 7d 0d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 }.. getVa
1eec6 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 rint(pCell, (u64
1eec7 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0d 0a 20 *)&nCellKey);..
1eec8 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c if( nCell
1eec9 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0d 0a Key==intKey ){..
1eeca 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b c = 0;
1eecb 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 .. }else
1eecc 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 if( nCellKey<int
1eecd 4b 65 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 Key ){..
1eece 20 20 63 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 20 c = -1;..
1eecf 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1eed0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 assert( nCe
1eed1 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0d llKey>intKey );.
1eed2 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b . c = +
1eed3 31 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 1;.. }..
1eed4 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c pCur->val
1eed5 69 64 4e 4b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 idNKey = 1;..
1eed6 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e pCur->info.
1eed7 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b nKey = nCellKey;
1eed8 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
1eed9 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d /* The m
1eeda 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 aximum supported
1eedb 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 page-size is 65
1eedc 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 536 bytes. This
1eedd 6d 65 61 6e 73 20 74 68 61 74 0d 0a 20 20 20 20 means that..
1eede 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d ** the maxim
1eedf 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 um number of rec
1eee0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 ord bytes stored
1eee1 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 on an index B-T
1eee2 72 65 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 ree.. **
1eee3 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 page is less tha
1eee4 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e n 16384 bytes an
1eee5 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 d may be stored
1eee6 61 73 20 61 20 32 2d 62 79 74 65 0d 0a 20 20 20 as a 2-byte..
1eee7 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 ** varint.
1eee8 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e This information
1eee9 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 is used to atte
1eeea 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 mpt to avoid par
1eeeb 73 69 6e 67 20 0d 0a 20 20 20 20 20 20 20 20 2a sing .. *
1eeec 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c * the entire cel
1eeed 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f l by checking fo
1eeee 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 r the cases wher
1eeef 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 e the record is
1eef0 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f .. ** sto
1eef1 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 red entirely wit
1eef2 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 hin the b-tree p
1eef3 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e age by inspectin
1eef4 67 20 74 68 65 20 66 69 72 73 74 20 0d 0a 20 20 g the first ..
1eef5 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 ** 2 bytes
1eef6 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0d 0a 20 of the cell...
1eef7 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 */..
1eef8 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 int nCell = p
1eef9 43 65 6c 6c 5b 30 5d 3b 0d 0a 20 20 20 20 20 20 Cell[0];..
1eefa 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 if( nCell<=pPa
1eefb 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c ge->max1bytePayl
1eefc 6f 61 64 0d 0a 20 20 20 20 20 20 20 20 20 2f 2a oad.. /*
1eefd 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c && (pCell+nCell
1eefe 29 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e )<pPage->aDataEn
1eeff 64 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 29 7b d */.. ){
1ef00 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 .. /* T
1ef01 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 his branch runs
1ef02 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 if the record-si
1ef03 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 ze field of the
1ef04 63 65 6c 6c 20 69 73 20 61 0d 0a 20 20 20 20 20 cell is a..
1ef05 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 ** single b
1ef06 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 yte varint and t
1ef07 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 he record fits e
1ef08 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d ntirely on the m
1ef09 61 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 2a ain.. *
1ef0a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 * b-tree page.
1ef0b 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 74 65 */.. te
1ef0c 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 stcase( pCell+nC
1ef0d 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 ell+1==pPage->aD
1ef0e 61 74 61 45 6e 64 20 29 3b 0d 0a 20 20 20 20 20 ataEnd );..
1ef0f 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 c = sqlite3
1ef10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1ef11 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 e(nCell, (void*)
1ef12 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b &pCell[1], pIdxK
1ef13 65 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 ey);.. }e
1ef14 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b lse if( !(pCell[
1ef15 31 5d 20 26 20 30 78 38 30 29 20 0d 0a 20 20 20 1] & 0x80) ..
1ef16 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c && (nCell
1ef17 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 = ((nCell&0x7f)
1ef18 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 <<7) + pCell[1])
1ef19 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 <=pPage->maxLoca
1ef1a 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 l.. /*
1ef1b 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b && (pCell+nCell+
1ef1c 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2)<=pPage->aData
1ef1d 45 6e 64 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 End */..
1ef1e 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a ){.. /*
1ef1f 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 The record-size
1ef20 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 field is a 2 by
1ef21 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 te varint and th
1ef22 65 20 72 65 63 6f 72 64 20 0d 0a 20 20 20 20 20 e record ..
1ef23 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 ** fits ent
1ef24 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 irely on the mai
1ef25 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 n b-tree page.
1ef26 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 74 65 */.. te
1ef27 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 stcase( pCell+nC
1ef28 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 ell+2==pPage->aD
1ef29 61 74 61 45 6e 64 20 29 3b 0d 0a 20 20 20 20 20 ataEnd );..
1ef2a 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 c = sqlite3
1ef2b 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1ef2c 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 e(nCell, (void*)
1ef2d 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b &pCell[2], pIdxK
1ef2e 65 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 ey);.. }e
1ef2f 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
1ef30 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c /* The record fl
1ef31 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e ows over onto on
1ef32 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c e or more overfl
1ef33 6f 77 20 70 61 67 65 73 2e 20 49 6e 0d 0a 20 20 ow pages. In..
1ef34 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 ** this
1ef35 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 case the whole c
1ef36 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 ell needs to be
1ef37 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 parsed, a buffer
1ef38 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 allocated..
1ef39 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 ** and acc
1ef3a 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 essPayload() use
1ef3b 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 d to retrieve th
1ef3c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 e record into th
1ef3d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 e.. **
1ef3e 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 buffer before Vd
1ef3f 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
1ef40 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e ) can be called.
1ef41 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 76 */.. v
1ef42 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0d 0a oid *pCellKey;..
1ef43 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 u8 * c
1ef44 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d onst pCellBody =
1ef45 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e pCell - pPage->
1ef46 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0d 0a 20 childPtrSize;..
1ef47 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 btreePa
1ef48 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 rseCellPtr(pPage
1ef49 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 , pCellBody, &pC
1ef4a 75 72 2d 3e 69 6e 66 6f 29 3b 0d 0a 20 20 20 20 ur->info);..
1ef4b 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 nCell = (i
1ef4c 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b nt)pCur->info.nK
1ef4d 65 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 ey;.. p
1ef4e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 CellKey = sqlite
1ef4f 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3Malloc( nCell )
1ef50 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ;.. if(
1ef51 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0d pCellKey==0 ){.
1ef52 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 . rc
1ef53 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d = SQLITE_NOMEM;.
1ef54 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 . got
1ef55 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b o moveto_finish;
1ef56 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 .. }..
1ef57 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 rc = ac
1ef58 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 cessPayload(pCur
1ef59 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 , 0, nCell, (uns
1ef5a 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c igned char*)pCel
1ef5b 6c 4b 65 79 2c 20 30 29 3b 0d 0a 20 20 20 20 20 lKey, 0);..
1ef5c 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0d 0a if( rc ){..
1ef5d 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 sqli
1ef5e 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 te3_free(pCellKe
1ef5f 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 y);..
1ef60 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e goto moveto_fin
1ef61 69 73 68 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 ish;..
1ef62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d }.. c =
1ef63 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
1ef64 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c rdCompare(nCell,
1ef65 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b pCellKey, pIdxK
1ef66 65 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 ey);..
1ef67 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 sqlite3_free(pCe
1ef68 6c 6c 4b 65 79 29 3b 0d 0a 20 20 20 20 20 20 20 llKey);..
1ef69 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 }.. }..
1ef6a 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0d 0a if( c==0 ){..
1ef6b 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 if( pPag
1ef6c 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 e->intKey && !pP
1ef6d 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 age->leaf ){..
1ef6e 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 lwr = id
1ef6f 78 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 x;.. br
1ef70 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 eak;.. }e
1ef71 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 lse{..
1ef72 2a 70 52 65 73 20 3d 20 30 3b 0d 0a 20 20 20 20 *pRes = 0;..
1ef73 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
1ef74 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 20 E_OK;..
1ef75 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e goto moveto_fin
1ef76 69 73 68 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d ish;.. }.
1ef77 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1ef78 69 66 28 20 63 3c 30 20 29 7b 0d 0a 20 20 20 20 if( c<0 ){..
1ef79 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b lwr = idx+1;
1ef7a 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
1ef7b 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 upr = id
1ef7c 78 2d 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 x-1;.. }..
1ef7d 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 if( lwr>upr
1ef7e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 ){.. bre
1ef7f 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 ak;.. }..
1ef80 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b pCur->aiIdx[
1ef81 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 pCur->iPage] = (
1ef82 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b u16)(idx = (lwr+
1ef83 75 70 72 29 2f 32 29 3b 0d 0a 20 20 20 20 7d 0d upr)/2);.. }.
1ef84 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 . assert( lwr
1ef85 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 ==upr+1 || (pPag
1ef86 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 e->intKey && !pP
1ef87 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0d 0a 20 age->leaf) );..
1ef88 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 assert( pPage
1ef89 2d 3e 69 73 49 6e 69 74 20 29 3b 0d 0a 20 20 20 ->isInit );..
1ef8a 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 if( pPage->leaf
1ef8b 20 29 7b 0d 0a 20 20 20 20 20 20 63 68 6c 64 50 ){.. chldP
1ef8c 67 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 65 6c 73 g = 0;.. }els
1ef8d 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 e if( lwr>=pPage
1ef8e 2d 3e 6e 43 65 6c 6c 20 29 7b 0d 0a 20 20 20 20 ->nCell ){..
1ef8f 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 chldPg = get4b
1ef90 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 yte(&pPage->aDat
1ef91 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 a[pPage->hdrOffs
1ef92 65 74 2b 38 5d 29 3b 0d 0a 20 20 20 20 7d 65 6c et+8]);.. }el
1ef93 73 65 7b 0d 0a 20 20 20 20 20 20 63 68 6c 64 50 se{.. chldP
1ef94 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e g = get4byte(fin
1ef95 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 dCell(pPage, lwr
1ef96 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ));.. }..
1ef97 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b if( chldPg==0 ){
1ef98 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
1ef99 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 pCur->aiIdx[pCur
1ef9a 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 ->iPage]<pCur->a
1ef9b 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 pPage[pCur->iPag
1ef9c 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 20 20 e]->nCell );..
1ef9d 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0d 0a *pRes = c;..
1ef9e 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
1ef9f 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 67 6f 74 E_OK;.. got
1efa0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b o moveto_finish;
1efa1 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 43 75 .. }.. pCu
1efa2 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 r->aiIdx[pCur->i
1efa3 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 Page] = (u16)lwr
1efa4 3b 0d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 ;.. pCur->inf
1efa5 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0d 0a 20 20 o.nSize = 0;..
1efa6 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 pCur->validNKe
1efa7 79 20 3d 20 30 3b 0d 0a 20 20 20 20 72 63 20 3d y = 0;.. rc =
1efa8 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 moveToChild(pCu
1efa9 72 2c 20 63 68 6c 64 50 67 29 3b 0d 0a 20 20 20 r, chldPg);..
1efaa 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d if( rc ) goto m
1efab 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0d 0a 20 oveto_finish;..
1efac 20 7d 0d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 }..moveto_finis
1efad 68 3a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b h:.. return rc;
1efae 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 ..}....../*..**
1efaf 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 Return TRUE if t
1efb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 he cursor is not
1efb1 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 pointing at an
1efb2 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 entry of the tab
1efb3 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 52 55 45 le...**..** TRUE
1efb4 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 will be returne
1efb5 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 d after a call t
1efb6 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 o sqlite3BtreeNe
1efb7 78 74 28 29 20 6d 6f 76 65 73 0d 0a 2a 2a 20 70 xt() moves..** p
1efb8 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 ast the last ent
1efb9 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 ry in the table
1efba 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 or sqlite3BtreeP
1efbb 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 rev() moves past
1efbc 0d 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 ..** the first e
1efbd 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 ntry. TRUE is a
1efbe 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 lso returned if
1efbf 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 the table is emp
1efc0 74 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ty...*/..SQLITE_
1efc1 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
1efc2 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 te3BtreeEof(BtCu
1efc3 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d 0a 20 20 rsor *pCur){..
1efc4 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 /* TODO: What if
1efc5 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 the cursor is i
1efc6 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 n CURSOR_REQUIRE
1efc7 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 SEEK but all tab
1efc8 6c 65 20 65 6e 74 72 69 65 73 0d 0a 20 20 2a 2a le entries.. **
1efc9 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 have been delet
1efca 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c ed? This API wil
1efcb 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 l need to change
1efcc 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 to return an er
1efcd 72 6f 72 20 63 6f 64 65 0d 0a 20 20 2a 2a 20 61 ror code.. ** a
1efce 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f s well as the bo
1efcf 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c olean result val
1efd0 75 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 72 65 74 ue... */.. ret
1efd1 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 urn (CURSOR_VALI
1efd2 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 D!=pCur->eState)
1efd3 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 ;..}..../*..** A
1efd4 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f dvance the curso
1efd5 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e r to the next en
1efd6 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 try in the datab
1efd7 61 73 65 2e 20 20 49 66 0d 0a 2a 2a 20 73 75 63 ase. If..** suc
1efd8 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 cessful then set
1efd9 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 *pRes=0. If th
1efda 65 20 63 75 72 73 6f 72 0d 0a 2a 2a 20 77 61 73 e cursor..** was
1efdb 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e already pointin
1efdc 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e g to the last en
1efdd 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 try in the datab
1efde 61 73 65 20 62 65 66 6f 72 65 0d 0a 2a 2a 20 74 ase before..** t
1efdf 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 his routine was
1efe0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 called, then set
1efe1 20 2a 70 52 65 73 3d 31 2e 0d 0a 2a 2f 0d 0a 53 *pRes=1...*/..S
1efe2 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
1efe3 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 t sqlite3BtreeNe
1efe4 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 xt(BtCursor *pCu
1efe5 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0d 0a r, int *pRes){..
1efe6 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 int rc;.. int
1efe7 20 69 64 78 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 idx;.. MemPage
1efe8 20 2a 70 50 61 67 65 3b 0d 0a 0d 0a 20 20 61 73 *pPage;.... as
1efe9 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 sert( cursorHold
1efea 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0d sMutex(pCur) );.
1efeb 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 . rc = restoreC
1efec 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 ursorPosition(pC
1efed 75 72 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d ur);.. if( rc!=
1efee 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
1efef 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 return rc;..
1eff0 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 }.. assert( pRe
1eff1 73 21 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 43 s!=0 );.. if( C
1eff2 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 URSOR_INVALID==p
1eff3 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0d 0a Cur->eState ){..
1eff4 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0d 0a *pRes = 1;..
1eff5 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1eff6 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 E_OK;.. }.. if
1eff7 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 ( pCur->skipNext
1eff8 3e 30 20 29 7b 0d 0a 20 20 20 20 70 43 75 72 2d >0 ){.. pCur-
1eff9 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0d 0a >skipNext = 0;..
1effa 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0d 0a *pRes = 0;..
1effb 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1effc 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 70 43 E_OK;.. }.. pC
1effd 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 ur->skipNext = 0
1effe 3b 0d 0a 0d 0a 20 20 70 50 61 67 65 20 3d 20 70 ;.... pPage = p
1efff 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 Cur->apPage[pCur
1f000 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 20 69 64 78 ->iPage];.. idx
1f001 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 = ++pCur->aiIdx
1f002 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a [pCur->iPage];..
1f003 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d assert( pPage-
1f004 3e 69 73 49 6e 69 74 20 29 3b 0d 0a 0d 0a 20 20 >isInit );....
1f005 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 /* If the databa
1f006 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 se file is corru
1f007 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 pt, it is possib
1f008 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 le for the value
1f009 20 6f 66 20 69 64 78 20 0d 0a 20 20 2a 2a 20 74 of idx .. ** t
1f00a 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 o be invalid her
1f00b 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 e. This can only
1f00c 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f occur if a seco
1f00d 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 nd cursor modifi
1f00e 65 73 0d 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 es.. ** the pag
1f00f 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 e while cursor p
1f010 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 Cur is holding a
1f011 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 reference to it
1f012 2e 20 57 68 69 63 68 20 63 61 6e 0d 0a 20 20 2a . Which can.. *
1f013 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 * only happen if
1f014 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 the database is
1f015 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 corrupt in such
1f016 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e a way as to lin
1f017 6b 20 74 68 65 0d 0a 20 20 2a 2a 20 70 61 67 65 k the.. ** page
1f018 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 into more than
1f019 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 one b-tree struc
1f01a 74 75 72 65 2e 20 2a 2f 0d 0a 20 20 74 65 73 74 ture. */.. test
1f01b 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d case( idx>pPage-
1f01c 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 0d 0a 20 20 70 >nCell );.... p
1f01d 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 Cur->info.nSize
1f01e 3d 20 30 3b 0d 0a 20 20 70 43 75 72 2d 3e 76 61 = 0;.. pCur->va
1f01f 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0d 0a 20 20 lidNKey = 0;..
1f020 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e if( idx>=pPage->
1f021 6e 43 65 6c 6c 20 29 7b 0d 0a 20 20 20 20 69 66 nCell ){.. if
1f022 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 ( !pPage->leaf )
1f023 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f {.. rc = mo
1f024 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 veToChild(pCur,
1f025 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d get4byte(&pPage-
1f026 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 >aData[pPage->hd
1f027 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0d 0a 20 rOffset+8]));..
1f028 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 if( rc ) re
1f029 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 turn rc;..
1f02a 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d rc = moveToLeftm
1f02b 6f 73 74 28 70 43 75 72 29 3b 0d 0a 20 20 20 20 ost(pCur);..
1f02c 20 20 2a 70 52 65 73 20 3d 20 30 3b 0d 0a 20 20 *pRes = 0;..
1f02d 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
1f02e 20 20 20 20 7d 0d 0a 20 20 20 20 64 6f 7b 0d 0a }.. do{..
1f02f 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e if( pCur->
1f030 69 50 61 67 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 iPage==0 ){..
1f031 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0d *pRes = 1;.
1f032 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 . pCur->e
1f033 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 State = CURSOR_I
1f034 4e 56 41 4c 49 44 3b 0d 0a 20 20 20 20 20 20 20 NVALID;..
1f035 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1f036 4b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 K;.. }..
1f037 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 moveToParent(
1f038 70 43 75 72 29 3b 0d 0a 20 20 20 20 20 20 70 50 pCur);.. pP
1f039 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 age = pCur->apPa
1f03a 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b ge[pCur->iPage];
1f03b 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 .. }while( pC
1f03c 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
1f03d 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e iPage]>=pPage->n
1f03e 43 65 6c 6c 20 29 3b 0d 0a 20 20 20 20 2a 70 52 Cell );.. *pR
1f03f 65 73 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 es = 0;.. if(
1f040 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 pPage->intKey )
1f041 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 {.. rc = sq
1f042 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 lite3BtreeNext(p
1f043 43 75 72 2c 20 70 52 65 73 29 3b 0d 0a 20 20 20 Cur, pRes);..
1f044 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 }else{.. r
1f045 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a c = SQLITE_OK;..
1f046 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 }.. retur
1f047 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 n rc;.. }.. *p
1f048 52 65 73 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 Res = 0;.. if(
1f049 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a pPage->leaf ){..
1f04a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1f04b 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 E_OK;.. }.. rc
1f04c 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 = moveToLeftmos
1f04d 74 28 70 43 75 72 29 3b 0d 0a 20 20 72 65 74 75 t(pCur);.. retu
1f04e 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f rn rc;..}....../
1f04f 2a 0d 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 *..** Step the c
1f050 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 ursor to the bac
1f051 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 k to the previou
1f052 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 s entry in the d
1f053 61 74 61 62 61 73 65 2e 20 20 49 66 0d 0a 2a 2a atabase. If..**
1f054 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e successful then
1f055 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 set *pRes=0. I
1f056 66 20 74 68 65 20 63 75 72 73 6f 72 0d 0a 2a 2a f the cursor..**
1f057 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 was already poi
1f058 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 nting to the fir
1f059 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 st entry in the
1f05a 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0d database before.
1f05b 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 .** this routine
1f05c 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 was called, the
1f05d 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0d 0a n set *pRes=1...
1f05e 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
1f05f 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
1f060 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 reePrevious(BtCu
1f061 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 rsor *pCur, int
1f062 2a 70 52 65 73 29 7b 0d 0a 20 20 69 6e 74 20 72 *pRes){.. int r
1f063 63 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 c;.. MemPage *p
1f064 50 61 67 65 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 Page;.... asser
1f065 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 t( cursorHoldsMu
1f066 74 65 78 28 70 43 75 72 29 20 29 3b 0d 0a 20 20 tex(pCur) );..
1f067 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 rc = restoreCurs
1f068 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 orPosition(pCur)
1f069 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c ;.. if( rc!=SQL
1f06a 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 ITE_OK ){.. r
1f06b 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a eturn rc;.. }..
1f06c 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d pCur->atLast =
1f06d 20 30 3b 0d 0a 20 20 69 66 28 20 43 55 52 53 4f 0;.. if( CURSO
1f06e 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d R_INVALID==pCur-
1f06f 3e 65 53 74 61 74 65 20 29 7b 0d 0a 20 20 20 20 >eState ){..
1f070 2a 70 52 65 73 20 3d 20 31 3b 0d 0a 20 20 20 20 *pRes = 1;..
1f071 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1f072 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 43 ;.. }.. if( pC
1f073 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 ur->skipNext<0 )
1f074 7b 0d 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 {.. pCur->ski
1f075 70 4e 65 78 74 20 3d 20 30 3b 0d 0a 20 20 20 20 pNext = 0;..
1f076 2a 70 52 65 73 20 3d 20 30 3b 0d 0a 20 20 20 20 *pRes = 0;..
1f077 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1f078 3b 0d 0a 20 20 7d 0d 0a 20 20 70 43 75 72 2d 3e ;.. }.. pCur->
1f079 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0d 0a 0d skipNext = 0;...
1f07a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d . pPage = pCur-
1f07b 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 >apPage[pCur->iP
1f07c 61 67 65 5d 3b 0d 0a 20 20 61 73 73 65 72 74 28 age];.. assert(
1f07d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 pPage->isInit )
1f07e 3b 0d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d ;.. if( !pPage-
1f07f 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 20 20 69 6e >leaf ){.. in
1f080 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 t idx = pCur->ai
1f081 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d Idx[pCur->iPage]
1f082 3b 0d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 ;.. rc = move
1f083 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 ToChild(pCur, ge
1f084 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 t4byte(findCell(
1f085 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0d 0a pPage, idx)));..
1f086 20 20 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 if( rc ){..
1f087 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d return rc;.
1f088 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d . }.. rc =
1f089 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 moveToRightmost
1f08a 28 70 43 75 72 29 3b 0d 0a 20 20 7d 65 6c 73 65 (pCur);.. }else
1f08b 7b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 {.. while( pC
1f08c 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
1f08d 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0d 0a 20 20 iPage]==0 ){..
1f08e 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 if( pCur->iP
1f08f 61 67 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 age==0 ){..
1f090 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 pCur->eState
1f091 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 = CURSOR_INVALID
1f092 3b 0d 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 ;.. *pRes
1f093 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 72 = 1;.. r
1f094 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
1f095 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
1f096 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 moveToParent(pC
1f097 75 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 ur);.. }..
1f098 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a pCur->info.nSiz
1f099 65 20 3d 20 30 3b 0d 0a 20 20 20 20 70 43 75 72 e = 0;.. pCur
1f09a 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b ->validNKey = 0;
1f09b 0d 0a 0d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 .... pCur->ai
1f09c 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d Idx[pCur->iPage]
1f09d 2d 2d 3b 0d 0a 20 20 20 20 70 50 61 67 65 20 3d --;.. pPage =
1f09e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 pCur->apPage[pC
1f09f 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 20 20 ur->iPage];..
1f0a0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b if( pPage->intK
1f0a1 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 ey && !pPage->le
1f0a2 61 66 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 af ){.. rc
1f0a3 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 = sqlite3BtreePr
1f0a4 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 evious(pCur, pRe
1f0a5 73 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d s);.. }else{.
1f0a6 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 . rc = SQLI
1f0a7 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 TE_OK;.. }..
1f0a8 20 7d 0d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b }.. *pRes = 0;
1f0a9 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
1f0aa 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f }..../*..** Allo
1f0ab 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 cate a new page
1f0ac 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
1f0ad 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 e file...**..**
1f0ae 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 The new page is
1f0af 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e marked as dirty.
1f0b0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 (In other word
1f0b1 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 s, sqlite3PagerW
1f0b2 72 69 74 65 28 29 0d 0a 2a 2a 20 68 61 73 20 61 rite()..** has a
1f0b3 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c lready been call
1f0b4 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 ed on the new pa
1f0b5 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 ge.) The new pa
1f0b6 67 65 20 68 61 73 20 61 6c 73 6f 0d 0a 2a 2a 20 ge has also..**
1f0b7 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 been referenced
1f0b8 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 and the calling
1f0b9 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f routine is respo
1f0ba 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 nsible for calli
1f0bb 6e 67 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 ng..** sqlite3Pa
1f0bc 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 gerUnref() on th
1f0bd 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 e new page when
1f0be 69 74 20 69 73 20 64 6f 6e 65 2e 0d 0a 2a 2a 0d it is done...**.
1f0bf 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 .** SQLITE_OK is
1f0c0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 returned on suc
1f0c1 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 cess. Any other
1f0c2 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e return value in
1f0c3 64 69 63 61 74 65 73 0d 0a 2a 2a 20 61 6e 20 65 dicates..** an e
1f0c4 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 rror. *ppPage a
1f0c5 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e nd *pPgno are un
1f0c6 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 defined in the e
1f0c7 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 vent of an error
1f0c8 2e 0d 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 ...** Do not inv
1f0c9 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 oke sqlite3Pager
1f0ca 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 Unref() on *ppPa
1f0cb 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 ge if an error i
1f0cc 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d s returned...**.
1f0cd 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 .** If the "near
1f0ce 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 by" parameter is
1f0cf 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 not 0, then a (
1f0d0 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 feeble) effort i
1f0d1 73 20 6d 61 64 65 20 74 6f 20 0d 0a 2a 2a 20 6c s made to ..** l
1f0d2 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f ocate a page clo
1f0d3 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e se to the page n
1f0d4 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 umber "nearby".
1f0d5 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 This can be use
1f0d6 64 20 69 6e 20 61 6e 0d 0a 2a 2a 20 61 74 74 65 d in an..** atte
1f0d7 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 mpt to keep rela
1f0d8 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 ted pages close
1f0d9 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e to each other in
1f0da 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1f0db 6c 65 2c 0d 0a 2a 2a 20 77 68 69 63 68 20 69 6e le,..** which in
1f0dc 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 turn can make d
1f0dd 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 atabase access f
1f0de 61 73 74 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 aster...**..** I
1f0df 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 f the "exact" pa
1f0e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 rameter is not 0
1f0e1 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e , and the page-n
1f0e2 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 umber nearby exi
1f0e3 73 74 73 20 0d 0a 2a 2a 20 61 6e 79 77 68 65 72 sts ..** anywher
1f0e4 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 e on the free-li
1f0e5 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 st, then it is g
1f0e6 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 uarenteed to be
1f0e7 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0d 0a returned. This..
1f0e8 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 ** is only used
1f0e9 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 by auto-vacuum d
1f0ea 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c atabases when al
1f0eb 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 locating a new t
1f0ec 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 able...*/..stati
1f0ed 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 c int allocateBt
1f0ee 72 65 65 50 61 67 65 28 0d 0a 20 20 42 74 53 68 reePage(.. BtSh
1f0ef 61 72 65 64 20 2a 70 42 74 2c 20 0d 0a 20 20 4d ared *pBt, .. M
1f0f0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c emPage **ppPage,
1f0f1 20 0d 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f .. Pgno *pPgno
1f0f2 2c 20 0d 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 , .. Pgno nearb
1f0f3 79 2c 0d 0a 20 20 75 38 20 65 78 61 63 74 0d 0a y,.. u8 exact..
1f0f4 29 7b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 ){.. MemPage *p
1f0f5 50 61 67 65 31 3b 0d 0a 20 20 69 6e 74 20 72 63 Page1;.. int rc
1f0f6 3b 0d 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 ;.. u32 n;
1f0f7 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 /* Number of pag
1f0f8 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 es on the freeli
1f0f9 73 74 20 2a 2f 0d 0a 20 20 75 33 32 20 6b 3b 20 st */.. u32 k;
1f0fa 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1f0fb 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 leaves on the t
1f0fc 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 runk of the free
1f0fd 6c 69 73 74 20 2a 2f 0d 0a 20 20 4d 65 6d 50 61 list */.. MemPa
1f0fe 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0d ge *pTrunk = 0;.
1f0ff 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 . MemPage *pPre
1f100 76 54 72 75 6e 6b 20 3d 20 30 3b 0d 0a 20 20 50 vTrunk = 0;.. P
1f101 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 gno mxPage;
1f102 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 /* Total size of
1f103 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 the database fi
1f104 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 le */.... asser
1f105 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 t( sqlite3_mutex
1f106 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 _held(pBt->mutex
1f107 29 20 29 3b 0d 0a 20 20 70 50 61 67 65 31 20 3d ) );.. pPage1 =
1f108 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0d 0a 20 pBt->pPage1;..
1f109 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 mxPage = btreeP
1f10a 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0d 0a agecount(pBt);..
1f10b 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 n = get4byte(&
1f10c 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 pPage1->aData[36
1f10d 5d 29 3b 0d 0a 20 20 74 65 73 74 63 61 73 65 28 ]);.. testcase(
1f10e 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0d n==mxPage-1 );.
1f10f 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 . if( n>=mxPage
1f110 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
1f111 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1f112 4b 50 54 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 KPT;.. }.. if(
1f113 20 6e 3e 30 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 n>0 ){.. /*
1f114 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 There are pages
1f115 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e on the freelist.
1f116 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 Reuse one of t
1f117 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0d 0a hose pages. */..
1f118 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b Pgno iTrunk;
1f119 0d 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c .. u8 searchL
1f11a 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 ist = 0; /* If t
1f11b 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 he free-list mus
1f11c 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f t be searched fo
1f11d 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0d 0a 20 r 'nearby' */..
1f11e 20 20 20 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 .. /* If t
1f11f 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d he 'exact' param
1f120 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e eter was true an
1f121 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 d a query of the
1f122 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0d 0a 20 20 pointer-map..
1f123 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 ** shows that
1f124 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 the page 'nearby
1f125 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f ' is somewhere o
1f126 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c n the free-list,
1f127 20 74 68 65 6e 0d 0a 20 20 20 20 2a 2a 20 74 68 then.. ** th
1f128 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 e entire-list wi
1f129 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 ll be searched f
1f12a 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0d 0a 20 or that page...
1f12b 20 20 20 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 53 */..#ifndef S
1f12c 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 QLITE_OMIT_AUTOV
1f12d 41 43 55 55 4d 0d 0a 20 20 20 20 69 66 28 20 65 ACUUM.. if( e
1f12e 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d xact && nearby<=
1f12f 6d 78 50 61 67 65 20 29 7b 0d 0a 20 20 20 20 20 mxPage ){..
1f130 20 75 38 20 65 54 79 70 65 3b 0d 0a 20 20 20 20 u8 eType;..
1f131 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 assert( nearby
1f132 3e 30 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 >0 );.. ass
1f133 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 ert( pBt->autoVa
1f134 63 75 75 6d 20 29 3b 0d 0a 20 20 20 20 20 20 72 cuum );.. r
1f135 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 c = ptrmapGet(pB
1f136 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 t, nearby, &eTyp
1f137 65 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 69 66 e, 0);.. if
1f138 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 ( rc ) return rc
1f139 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 ;.. if( eTy
1f13a 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 pe==PTRMAP_FREEP
1f13b 41 47 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 AGE ){..
1f13c 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0d searchList = 1;.
1f13d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 . }..
1f13e 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b *pPgno = nearby;
1f13f 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d .. }..#endif.
1f140 0a 0d 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d ... /* Decrem
1f141 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 ent the free-lis
1f142 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 t count by 1. Se
1f143 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 t iTrunk to the
1f144 69 6e 64 65 78 20 6f 66 20 74 68 65 0d 0a 20 20 index of the..
1f145 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d ** first free-
1f146 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e list trunk page.
1f147 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 iPrevTrunk is i
1f148 6e 69 74 69 61 6c 6c 79 20 31 2e 0d 0a 20 20 20 nitially 1...
1f149 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 */.. rc = sq
1f14a 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 lite3PagerWrite(
1f14b 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 pPage1->pDbPage)
1f14c 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 ;.. if( rc )
1f14d 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 return rc;..
1f14e 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 put4byte(&pPage1
1f14f 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 ->aData[36], n-1
1f150 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 65 );.... /* The
1f151 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 code within thi
1f152 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e s loop is run on
1f153 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 ly once if the '
1f154 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 searchList' vari
1f155 61 62 6c 65 0d 0a 20 20 20 20 2a 2a 20 69 73 20 able.. ** is
1f156 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 not true. Otherw
1f157 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 ise, it runs onc
1f158 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b e for each trunk
1f159 2d 70 61 67 65 20 6f 6e 20 74 68 65 0d 0a 20 20 -page on the..
1f15a 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 ** free-list u
1f15b 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e ntil the page 'n
1f15c 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 earby' is locate
1f15d 64 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 d... */..
1f15e 64 6f 20 7b 0d 0a 20 20 20 20 20 20 70 50 72 65 do {.. pPre
1f15f 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b vTrunk = pTrunk;
1f160 0d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 .. if( pPre
1f161 76 54 72 75 6e 6b 20 29 7b 0d 0a 20 20 20 20 20 vTrunk ){..
1f162 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 iTrunk = get4
1f163 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b byte(&pPrevTrunk
1f164 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0d 0a 20 20 ->aData[0]);..
1f165 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1f166 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 iTrunk = get
1f167 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 4byte(&pPage1->a
1f168 44 61 74 61 5b 33 32 5d 29 3b 0d 0a 20 20 20 20 Data[32]);..
1f169 20 20 7d 0d 0a 20 20 20 20 20 20 74 65 73 74 63 }.. testc
1f16a 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 ase( iTrunk==mxP
1f16b 61 67 65 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 age );.. if
1f16c 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 ( iTrunk>mxPage
1f16d 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
1f16e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1f16f 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 7d 65 6c BKPT;.. }el
1f170 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 se{.. rc
1f171 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 = btreeGetPage(p
1f172 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 Bt, iTrunk, &pTr
1f173 75 6e 6b 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 unk, 0);..
1f174 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 }.. if( rc
1f175 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 54 72 75 ){.. pTru
1f176 6e 6b 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 nk = 0;..
1f177 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 goto end_alloca
1f178 74 65 5f 70 61 67 65 3b 0d 0a 20 20 20 20 20 20 te_page;..
1f179 7d 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 }.. assert(
1f17a 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0d 0a 20 pTrunk!=0 );..
1f17b 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 assert( pTr
1f17c 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b unk->aData!=0 );
1f17d 0d 0a 0d 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 .... k = ge
1f17e 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e t4byte(&pTrunk->
1f17f 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 aData[4]); /* #
1f180 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 of leaves on thi
1f181 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0d s trunk page */.
1f182 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 . if( k==0
1f183 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 && !searchList )
1f184 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 {.. /* Th
1f185 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c e trunk has no l
1f186 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 eaves and the li
1f187 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 st is not being
1f188 73 65 61 72 63 68 65 64 2e 20 0d 0a 20 20 20 20 searched. ..
1f189 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 ** So extrac
1f18a 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 t the trunk page
1f18b 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 itself and use
1f18c 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 it as the newly
1f18d 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c .. ** all
1f18e 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0d 0a ocated page */..
1f18f 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
1f190 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b pPrevTrunk==0 );
1f191 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 .. rc = s
1f192 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 qlite3PagerWrite
1f193 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 (pTrunk->pDbPage
1f194 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 );.. if(
1f195 72 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 rc ){..
1f196 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 goto end_alloca
1f197 74 65 5f 70 61 67 65 3b 0d 0a 20 20 20 20 20 20 te_page;..
1f198 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 2a 70 50 }.. *pP
1f199 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0d 0a 20 gno = iTrunk;..
1f19a 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 memcpy(&p
1f19b 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d Page1->aData[32]
1f19c 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 , &pTrunk->aData
1f19d 5b 30 5d 2c 20 34 29 3b 0d 0a 20 20 20 20 20 20 [0], 4);..
1f19e 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 *ppPage = pTru
1f19f 6e 6b 3b 0d 0a 20 20 20 20 20 20 20 20 70 54 72 nk;.. pTr
1f1a0 75 6e 6b 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 unk = 0;..
1f1a1 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 TRACE(("ALLOCA
1f1a2 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 TE: %d trunk - %
1f1a3 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 d free pages lef
1f1a4 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d t\n", *pPgno, n-
1f1a5 31 29 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 1));.. }els
1f1a6 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 e if( k>(u32)(pB
1f1a7 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 t->usableSize/4
1f1a8 2d 20 32 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 - 2) ){..
1f1a9 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 /* Value of k i
1f1aa 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 s out of range.
1f1ab 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 Database corrup
1f1ac 74 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 tion */..
1f1ad 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 rc = SQLITE_COR
1f1ae 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 RUPT_BKPT;..
1f1af 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c goto end_all
1f1b0 6f 63 61 74 65 5f 70 61 67 65 3b 0d 0a 23 69 66 ocate_page;..#if
1f1b1 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
1f1b2 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 20 _AUTOVACUUM..
1f1b3 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 }else if( sea
1f1b4 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 rchList && nearb
1f1b5 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0d 0a 20 20 y==iTrunk ){..
1f1b6 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 /* The lis
1f1b7 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 t is being searc
1f1b8 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 hed and this tru
1f1b9 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 nk page is the p
1f1ba 61 67 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 age.. **
1f1bb 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 to allocate, reg
1f1bc 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 ardless of wheth
1f1bd 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 er it has leaves
1f1be 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 ... */..
1f1bf 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a assert( *
1f1c0 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b pPgno==iTrunk );
1f1c1 0d 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 .. *ppPag
1f1c2 65 20 3d 20 70 54 72 75 6e 6b 3b 0d 0a 20 20 20 e = pTrunk;..
1f1c3 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 searchList
1f1c4 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 = 0;.. rc
1f1c5 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 = sqlite3PagerW
1f1c6 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 rite(pTrunk->pDb
1f1c7 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 Page);..
1f1c8 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 20 if( rc ){..
1f1c9 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c goto end_al
1f1ca 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0d 0a 20 20 locate_page;..
1f1cb 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 }..
1f1cc 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0d 0a 20 20 if( k==0 ){..
1f1cd 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 if( !pPr
1f1ce 65 76 54 72 75 6e 6b 20 29 7b 0d 0a 20 20 20 20 evTrunk ){..
1f1cf 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 memcpy(&
1f1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 pPage1->aData[32
1f1d1 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 ], &pTrunk->aDat
1f1d2 61 5b 30 5d 2c 20 34 29 3b 0d 0a 20 20 20 20 20 a[0], 4);..
1f1d3 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 }else{..
1f1d4 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 rc = sq
1f1d5 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 lite3PagerWrite(
1f1d6 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 pPrevTrunk->pDbP
1f1d7 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 age);..
1f1d8 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1f1d9 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
1f1da 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f goto end_
1f1db 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0d 0a allocate_page;..
1f1dc 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 }..
1f1dd 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 memcp
1f1de 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 y(&pPrevTrunk->a
1f1df 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b Data[0], &pTrunk
1f1e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0d ->aData[0], 4);.
1f1e1 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 . }..
1f1e2 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 }else{..
1f1e3 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 /* The t
1f1e4 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 runk page is req
1f1e5 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c uired by the cal
1f1e6 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 ler but it conta
1f1e7 69 6e 73 20 0d 0a 20 20 20 20 20 20 20 20 20 20 ins ..
1f1e8 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 ** pointers to f
1f1e9 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e ree-list leaves.
1f1ea 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 The first leaf
1f1eb 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0d becomes a trunk.
1f1ec 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 . ** pa
1f1ed 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e ge in this case.
1f1ee 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a .. */..
1f1ef 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 MemPag
1f1f0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0d 0a 20 e *pNewTrunk;..
1f1f1 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e Pgno iN
1f1f2 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 ewTrunk = get4by
1f1f3 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 te(&pTrunk->aDat
1f1f4 61 5b 38 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 a[8]);..
1f1f5 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e if( iNewTrunk>
1f1f6 6d 78 50 61 67 65 20 29 7b 20 0d 0a 20 20 20 20 mxPage ){ ..
1f1f7 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c rc = SQL
1f1f8 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
1f1f9 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 ;.. g
1f1fa 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 oto end_allocate
1f1fb 5f 70 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 _page;..
1f1fc 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 74 }.. t
1f1fd 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 estcase( iNewTru
1f1fe 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0d 0a 20 nk==mxPage );..
1f1ff 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 rc = bt
1f200 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 reeGetPage(pBt,
1f201 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 iNewTrunk, &pNew
1f202 54 72 75 6e 6b 2c 20 30 29 3b 0d 0a 20 20 20 20 Trunk, 0);..
1f203 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
1f204 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1f205 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 goto end
1f206 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0d _allocate_page;.
1f207 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 . }..
1f208 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
1f209 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 ite3PagerWrite(p
1f20a 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 NewTrunk->pDbPag
1f20b 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 e);.. i
1f20c 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
1f20d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ){..
1f20e 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 releasePage(pNe
1f20f 77 54 72 75 6e 6b 29 3b 0d 0a 20 20 20 20 20 20 wTrunk);..
1f210 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 goto end_a
1f211 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0d 0a 20 llocate_page;..
1f212 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 }..
1f213 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e memcpy(&pN
1f214 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 ewTrunk->aData[0
1f215 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 ], &pTrunk->aDat
1f216 61 5b 30 5d 2c 20 34 29 3b 0d 0a 20 20 20 20 20 a[0], 4);..
1f217 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 put4byte(&p
1f218 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b NewTrunk->aData[
1f219 34 5d 2c 20 6b 2d 31 29 3b 0d 0a 20 20 20 20 20 4], k-1);..
1f21a 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 memcpy(&pNe
1f21b 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d wTrunk->aData[8]
1f21c 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 , &pTrunk->aData
1f21d 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0d [12], (k-1)*4);.
1f21e 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 . relea
1f21f 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b sePage(pNewTrunk
1f220 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 );.. if
1f221 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b ( !pPrevTrunk ){
1f222 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 .. as
1f223 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 sert( sqlite3Pag
1f224 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 erIswriteable(pP
1f225 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 age1->pDbPage) )
1f226 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 ;.. p
1f227 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d ut4byte(&pPage1-
1f228 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 >aData[32], iNew
1f229 54 72 75 6e 6b 29 3b 0d 0a 20 20 20 20 20 20 20 Trunk);..
1f22a 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1f22b 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
1f22c 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 te3PagerWrite(pP
1f22d 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 revTrunk->pDbPag
1f22e 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 e);..
1f22f 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 if( rc ){..
1f230 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 goto e
1f231 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 nd_allocate_page
1f232 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d ;.. }
1f233 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 .. pu
1f234 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 t4byte(&pPrevTru
1f235 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e nk->aData[0], iN
1f236 65 77 54 72 75 6e 6b 29 3b 0d 0a 20 20 20 20 20 ewTrunk);..
1f237 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
1f238 7d 0d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e }.. pTrun
1f239 6b 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 k = 0;..
1f23a 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 TRACE(("ALLOCATE
1f23b 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 : %d trunk - %d
1f23c 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c free pages left\
1f23d 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 n", *pPgno, n-1)
1f23e 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 );..#endif..
1f23f 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 }else if( k>0
1f240 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 ){.. /* E
1f241 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 xtract a leaf fr
1f242 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0d om the trunk */.
1f243 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f . u32 clo
1f244 73 65 73 74 3b 0d 0a 20 20 20 20 20 20 20 20 50 sest;.. P
1f245 67 6e 6f 20 69 50 61 67 65 3b 0d 0a 20 20 20 20 gno iPage;..
1f246 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
1f247 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e r *aData = pTrun
1f248 6b 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 20 20 20 k->aData;..
1f249 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 if( nearby>0
1f24a 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 33 ){.. u3
1f24b 32 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2 i;..
1f24c 69 6e 74 20 64 69 73 74 3b 0d 0a 20 20 20 20 20 int dist;..
1f24d 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 closest = 0
1f24e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 ;.. dis
1f24f 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e t = sqlite3AbsIn
1f250 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 t32(get4byte(&aD
1f251 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 ata[8]) - nearby
1f252 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f );.. fo
1f253 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 r(i=1; i<k; i++)
1f254 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 {.. i
1f255 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 nt d2 = sqlite3A
1f256 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 bsInt32(get4byte
1f257 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 (&aData[8+i*4])
1f258 2d 20 6e 65 61 72 62 79 29 3b 0d 0a 20 20 20 20 - nearby);..
1f259 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 if( d2<d
1f25a 69 73 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ist ){..
1f25b 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 closest =
1f25c 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 i;..
1f25d 20 20 64 69 73 74 20 3d 20 64 32 3b 0d 0a 20 20 dist = d2;..
1f25e 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 }..
1f25f 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
1f260 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
1f261 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b closest = 0;
1f262 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 .. }....
1f263 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 iPage = g
1f264 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 et4byte(&aData[8
1f265 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0d 0a 20 +closest*4]);..
1f266 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 testcase(
1f267 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 iPage==mxPage )
1f268 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 ;.. if( i
1f269 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0d 0a Page>mxPage ){..
1f26a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 rc = S
1f26b 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1f26c 50 54 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 67 PT;.. g
1f26d 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 oto end_allocate
1f26e 5f 70 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 _page;..
1f26f 7d 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 }.. testc
1f270 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 ase( iPage==mxPa
1f271 67 65 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 ge );.. i
1f272 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c f( !searchList |
1f273 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 | iPage==nearby
1f274 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e ){.. in
1f275 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0d 0a 20 20 t noContent;..
1f276 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d *pPgno =
1f277 20 69 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 iPage;..
1f278 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 TRACE(("ALLOC
1f279 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 ATE: %d was leaf
1f27a 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 %d of %d on tru
1f27b 6e 6b 20 25 64 22 0d 0a 20 20 20 20 20 20 20 20 nk %d"..
1f27c 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d ": %d m
1f27d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e ore free pages\n
1f27e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ",..
1f27f 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f *pPgno, clo
1f280 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e sest+1, k, pTrun
1f281 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0d k->pgno, n-1));.
1f282 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
1f283 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 sqlite3PagerWrit
1f284 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 e(pTrunk->pDbPag
1f285 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 e);.. i
1f286 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 f( rc ) goto end
1f287 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0d _allocate_page;.
1f288 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 . if( c
1f289 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0d 0a 20 losest<k-1 ){..
1f28a 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 memcp
1f28b 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 y(&aData[8+close
1f28c 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b st*4], &aData[4+
1f28d 6b 2a 34 5d 2c 20 34 29 3b 0d 0a 20 20 20 20 20 k*4], 4);..
1f28e 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
1f28f 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 put4byte(&aDat
1f290 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0d 0a 20 20 20 a[4], k-1);..
1f291 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 noContent
1f292 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 = !btreeGetHasC
1f293 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 ontent(pBt, *pPg
1f294 6e 6f 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 no);..
1f295 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 rc = btreeGetPag
1f296 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 e(pBt, *pPgno, p
1f297 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 pPage, noContent
1f298 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 );.. if
1f299 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1f29a 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){..
1f29b 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1f29c 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 rWrite((*ppPage)
1f29d 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 20 ->pDbPage);..
1f29e 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 if( rc!
1f29f 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c rel
1f2a1 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 easePage(*ppPage
1f2a2 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 );..
1f2a3 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a }.. }..
1f2a4 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 search
1f2a5 4c 69 73 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 List = 0;..
1f2a6 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 }.. }..
1f2a7 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 releasePage
1f2a8 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0d 0a 20 (pPrevTrunk);..
1f2a9 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 pPrevTrunk
1f2aa 3d 20 30 3b 0d 0a 20 20 20 20 7d 77 68 69 6c 65 = 0;.. }while
1f2ab 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0d ( searchList );.
1f2ac 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2f . }else{.. /
1f2ad 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 * There are no p
1f2ae 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 ages on the free
1f2af 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 list, so create
1f2b0 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 a new page at th
1f2b1 65 0d 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 e.. ** end of
1f2b2 20 74 68 65 20 66 69 6c 65 20 2a 2f 0d 0a 20 20 the file */..
1f2b3 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
1f2b4 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 gerWrite(pBt->pP
1f2b5 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0d age1->pDbPage);.
1f2b6 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 . if( rc ) re
1f2b7 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 70 42 turn rc;.. pB
1f2b8 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0d 0a 20 20 20 t->nPage++;..
1f2b9 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d if( pBt->nPage=
1f2ba 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 =PENDING_BYTE_PA
1f2bb 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e GE(pBt) ) pBt->n
1f2bc 50 61 67 65 2b 2b 3b 0d 0a 0d 0a 23 69 66 6e 64 Page++;....#ifnd
1f2bd 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 ef SQLITE_OMIT_A
1f2be 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 69 UTOVACUUM.. i
1f2bf 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 f( pBt->autoVacu
1f2c0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 um && PTRMAP_ISP
1f2c1 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 AGE(pBt, pBt->nP
1f2c2 61 67 65 29 20 29 7b 0d 0a 20 20 20 20 20 20 2f age) ){.. /
1f2c3 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 * If *pPgno refe
1f2c4 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d rs to a pointer-
1f2c5 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 map page, alloca
1f2c6 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 te two new pages
1f2c7 0d 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 .. ** at th
1f2c8 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c e end of the fil
1f2c9 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 e instead of one
1f2ca 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f . The first allo
1f2cb 63 61 74 65 64 20 70 61 67 65 0d 0a 20 20 20 20 cated page..
1f2cc 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e ** becomes a n
1f2cd 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 ew pointer-map p
1f2ce 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 age, the second
1f2cf 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 is used by the c
1f2d0 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 2a 2f aller... */
1f2d1 0d 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 .. MemPage
1f2d2 2a 70 50 67 20 3d 20 30 3b 0d 0a 20 20 20 20 20 *pPg = 0;..
1f2d3 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 TRACE(("ALLOCAT
1f2d4 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f E: %d from end o
1f2d5 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d f file (pointer-
1f2d6 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 map page)\n", pB
1f2d7 74 2d 3e 6e 50 61 67 65 29 29 3b 0d 0a 20 20 20 t->nPage));..
1f2d8 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e assert( pBt->
1f2d9 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 nPage!=PENDING_B
1f2da 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b YTE_PAGE(pBt) );
1f2db 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 .. rc = btr
1f2dc 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 eeGetPage(pBt, p
1f2dd 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c Bt->nPage, &pPg,
1f2de 20 31 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 1);.. if(
1f2df 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1f2e0 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 .. rc = s
1f2e1 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 qlite3PagerWrite
1f2e2 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0d (pPg->pDbPage);.
1f2e3 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 . release
1f2e4 50 61 67 65 28 70 50 67 29 3b 0d 0a 20 20 20 20 Page(pPg);..
1f2e5 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20 72 }.. if( r
1f2e6 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a c ) return rc;..
1f2e7 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 pBt->nPage
1f2e8 2b 2b 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 ++;.. if( p
1f2e9 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 Bt->nPage==PENDI
1f2ea 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 NG_BYTE_PAGE(pBt
1f2eb 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b ) ){ pBt->nPage+
1f2ec 2b 3b 20 7d 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e +; }.. }..#en
1f2ed 64 69 66 0d 0a 20 20 20 20 70 75 74 34 62 79 74 dif.. put4byt
1f2ee 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d e(28 + (u8*)pBt-
1f2ef 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 >pPage1->aData,
1f2f0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0d 0a 20 20 pBt->nPage);..
1f2f1 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e *pPgno = pBt->
1f2f2 6e 50 61 67 65 3b 0d 0a 0d 0a 20 20 20 20 61 73 nPage;.... as
1f2f3 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 sert( *pPgno!=PE
1f2f4 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 NDING_BYTE_PAGE(
1f2f5 70 42 74 29 20 29 3b 0d 0a 20 20 20 20 72 63 20 pBt) );.. rc
1f2f6 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 = btreeGetPage(p
1f2f7 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 Bt, *pPgno, ppPa
1f2f8 67 65 2c 20 31 29 3b 0d 0a 20 20 20 20 69 66 28 ge, 1);.. if(
1f2f9 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b rc ) return rc;
1f2fa 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
1f2fb 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 e3PagerWrite((*p
1f2fc 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 pPage)->pDbPage)
1f2fd 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 ;.. if( rc!=S
1f2fe 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1f2ff 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a releasePage(*
1f300 70 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 7d 0d ppPage);.. }.
1f301 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c . TRACE(("ALL
1f302 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 OCATE: %d from e
1f303 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a nd of file\n", *
1f304 70 50 67 6e 6f 29 29 3b 0d 0a 20 20 7d 0d 0a 0d pPgno));.. }...
1f305 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e . assert( *pPgn
1f306 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f o!=PENDING_BYTE_
1f307 50 41 47 45 28 70 42 74 29 20 29 3b 0d 0a 0d 0a PAGE(pBt) );....
1f308 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 end_allocate_pag
1f309 65 3a 0d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 e:.. releasePag
1f30a 65 28 70 54 72 75 6e 6b 29 3b 0d 0a 20 20 72 65 e(pTrunk);.. re
1f30b 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 leasePage(pPrevT
1f30c 72 75 6e 6b 29 3b 0d 0a 20 20 69 66 28 20 72 63 runk);.. if( rc
1f30d 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
1f30e 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 if( sqlite3P
1f30f 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 agerPageRefcount
1f310 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 ((*ppPage)->pDbP
1f311 61 67 65 29 3e 31 20 29 7b 0d 0a 20 20 20 20 20 age)>1 ){..
1f312 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 releasePage(*pp
1f313 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 72 65 Page);.. re
1f314 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 turn SQLITE_CORR
1f315 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d UPT_BKPT;.. }
1f316 0d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d .. (*ppPage)-
1f317 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0d 0a 20 20 >isInit = 0;..
1f318 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70 70 50 }else{.. *ppP
1f319 61 67 65 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 age = 0;.. }..
1f31a 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c assert( rc!=SQL
1f31b 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 ITE_OK || sqlite
1f31c 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 3PagerIswriteabl
1f31d 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 e((*ppPage)->pDb
1f31e 50 61 67 65 29 20 29 3b 0d 0a 20 20 72 65 74 75 Page) );.. retu
1f31f 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
1f320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1f321 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 n is used to add
1f322 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 page iPage to t
1f323 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
1f324 20 66 72 65 65 2d 6c 69 73 74 2e 20 0d 0a 2a 2a free-list. ..**
1f325 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 It is assumed t
1f326 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 hat the page is
1f327 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 not already a pa
1f328 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c rt of the free-l
1f329 69 73 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 ist...**..** The
1f32a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 value passed as
1f32b 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
1f32c 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e ment to this fun
1f32d 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 ction is optiona
1f32e 6c 2e 0d 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 l...** If the ca
1f32f 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 ller happens to
1f330 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 have a pointer t
1f331 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 o the MemPage ob
1f332 6a 65 63 74 20 0d 0a 2a 2a 20 63 6f 72 72 65 73 ject ..** corres
1f333 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 ponding to page
1f334 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 iPage handy, it
1f335 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 may pass it as t
1f336 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e he second value.
1f337 20 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c ..** Otherwise,
1f338 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c it may pass NUL
1f339 4c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 20 L...**..** If a
1f33a 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d pointer to a Mem
1f33b 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 Page object is p
1f33c 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 assed as the sec
1f33d 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0d 0a 2a ond argument,..*
1f33e 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 * its reference
1f33f 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 count is not alt
1f340 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e ered by this fun
1f341 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 ction...*/..stat
1f342 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 ic int freePage2
1f343 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 (BtShared *pBt,
1f344 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 MemPage *pMemPag
1f345 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0d e, Pgno iPage){.
1f346 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 . MemPage *pTru
1f347 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 nk = 0;
1f348 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c /* Free-l
1f349 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a ist trunk page *
1f34a 2f 0d 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b /.. Pgno iTrunk
1f34b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
1f34c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 /* Page
1f34d 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d number of free-
1f34e 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 list trunk page
1f34f 2a 2f 20 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a */ .. MemPage *
1f350 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 pPage1 = pBt->pP
1f351 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f age1; /* Lo
1f352 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f cal reference to
1f353 20 70 61 67 65 20 31 20 2a 2f 0d 0a 20 20 4d 65 page 1 */.. Me
1f354 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 mPage *pPage;
1f355 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f356 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 /* Page being
1f357 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 freed. May be NU
1f358 4c 4c 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 LL. */.. int rc
1f359 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1f35a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1f35b 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0d Return Code */.
1f35c 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 . int nFree;
1f35d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f35e 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 /* Initia
1f35f 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 l number of page
1f360 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a s on free-list *
1f361 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 73 /.... assert( s
1f362 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1f363 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b d(pBt->mutex) );
1f364 0d 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 .. assert( iPag
1f365 65 3e 31 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 e>1 );.. assert
1f366 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 ( !pMemPage || p
1f367 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 MemPage->pgno==i
1f368 50 61 67 65 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 Page );.... if(
1f369 20 70 4d 65 6d 50 61 67 65 20 29 7b 0d 0a 20 20 pMemPage ){..
1f36a 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 pPage = pMemPa
1f36b 67 65 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 ge;.. sqlite3
1f36c 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e PagerRef(pPage->
1f36d 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 7d 65 6c pDbPage);.. }el
1f36e 73 65 7b 0d 0a 20 20 20 20 70 50 61 67 65 20 3d se{.. pPage =
1f36f 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 btreePageLookup
1f370 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0d 0a 20 (pBt, iPage);..
1f371 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 63 72 65 }.... /* Incre
1f372 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 ment the free pa
1f373 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 ge count on pPag
1f374 65 31 20 2a 2f 0d 0a 20 20 72 63 20 3d 20 73 71 e1 */.. rc = sq
1f375 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 lite3PagerWrite(
1f376 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 pPage1->pDbPage)
1f377 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f ;.. if( rc ) go
1f378 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b to freepage_out;
1f379 0d 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 .. nFree = get4
1f37a 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 byte(&pPage1->aD
1f37b 61 74 61 5b 33 36 5d 29 3b 0d 0a 20 20 70 75 74 ata[36]);.. put
1f37c 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 4byte(&pPage1->a
1f37d 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b Data[36], nFree+
1f37e 31 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 42 74 1);.... if( pBt
1f37f 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 ->btsFlags & BTS
1f380 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 _SECURE_DELETE )
1f381 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 {.. /* If the
1f382 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f secure_delete o
1f383 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 ption is enabled
1f384 2c 20 74 68 65 6e 0d 0a 20 20 20 20 2a 2a 20 61 , then.. ** a
1f385 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 lways fully over
1f386 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e write deleted in
1f387 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a formation with z
1f388 65 72 6f 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 eros... */..
1f389 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 if( (!pPage &
1f38a 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 & ((rc = btreeGe
1f38b 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 tPage(pBt, iPage
1f38c 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 , &pPage, 0))!=0
1f38d 29 20 29 0d 0a 20 20 20 20 20 7c 7c 20 20 20 20 ) ).. ||
1f38e 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 ((rc = s
1f38f 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 qlite3PagerWrite
1f390 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 (pPage->pDbPage)
1f391 29 21 3d 30 29 0d 0a 20 20 20 20 29 7b 0d 0a 20 )!=0).. ){..
1f392 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 goto freepa
1f393 67 65 5f 6f 75 74 3b 0d 0a 20 20 20 20 7d 0d 0a ge_out;.. }..
1f394 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 memset(pPage
1f395 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 ->aData, 0, pPag
1f396 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 e->pBt->pageSize
1f397 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 );.. }.... /*
1f398 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 If the database
1f399 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 supports auto-va
1f39a 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 cuum, write an e
1f39b 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e ntry in the poin
1f39c 74 65 72 2d 6d 61 70 0d 0a 20 20 2a 2a 20 74 6f ter-map.. ** to
1f39d 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 indicate that t
1f39e 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e he page is free.
1f39f 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 49 53 .. */.. if( IS
1f3a0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0d 0a 20 AUTOVACUUM ){..
1f3a1 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 ptrmapPut(pBt
1f3a2 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f , iPage, PTRMAP_
1f3a3 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 FREEPAGE, 0, &rc
1f3a4 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 );.. if( rc )
1f3a5 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f goto freepage_o
1f3a6 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a ut;.. }.... /*
1f3a7 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 Now manipulate
1f3a8 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 the actual datab
1f3a9 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 ase free-list st
1f3aa 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 ructure. There a
1f3ab 72 65 20 74 77 6f 0d 0a 20 20 2a 2a 20 70 6f 73 re two.. ** pos
1f3ac 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 sibilities. If t
1f3ad 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 he free-list is
1f3ae 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c currently empty,
1f3af 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 or if the first
1f3b0 0d 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 .. ** trunk pag
1f3b1 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 e in the free-li
1f3b2 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e st is full, then
1f3b3 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 this page will
1f3b4 62 65 63 6f 6d 65 20 61 0d 0a 20 20 2a 2a 20 6e become a.. ** n
1f3b5 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 ew free-list tru
1f3b6 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 nk page. Otherwi
1f3b7 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f se, it will beco
1f3b8 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 me a leaf of the
1f3b9 0d 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 .. ** first tru
1f3ba 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 nk page in the c
1f3bb 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 urrent free-list
1f3bc 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 . This block tes
1f3bd 74 73 20 69 66 20 69 74 0d 0a 20 20 2a 2a 20 69 ts if it.. ** i
1f3be 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 s possible to ad
1f3bf 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 d the page as a
1f3c0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 new free-list le
1f3c1 61 66 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 af... */.. if(
1f3c2 20 6e 46 72 65 65 21 3d 30 20 29 7b 0d 0a 20 20 nFree!=0 ){..
1f3c3 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 u32 nLeaf;
1f3c4 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
1f3c5 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 nitial number of
1f3c6 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 leaf cells on t
1f3c7 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0d 0a 0d 0a runk page */....
1f3c8 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 iTrunk = get
1f3c9 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 4byte(&pPage1->a
1f3ca 44 61 74 61 5b 33 32 5d 29 3b 0d 0a 20 20 20 20 Data[32]);..
1f3cb 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 rc = btreeGetPag
1f3cc 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 e(pBt, iTrunk, &
1f3cd 70 54 72 75 6e 6b 2c 20 30 29 3b 0d 0a 20 20 20 pTrunk, 0);..
1f3ce 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1f3cf 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 OK ){.. got
1f3d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0d o freepage_out;.
1f3d1 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 6e 4c . }.... nL
1f3d2 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 eaf = get4byte(&
1f3d3 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d pTrunk->aData[4]
1f3d4 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 );.. assert(
1f3d5 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e pBt->usableSize>
1f3d6 33 32 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 6e 32 );.. if( n
1f3d7 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d Leaf > (u32)pBt-
1f3d8 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 >usableSize/4 -
1f3d9 32 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 2 ){.. rc =
1f3da 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1f3db 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 67 6f 74 BKPT;.. got
1f3dc 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0d o freepage_out;.
1f3dd 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
1f3de 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 nLeaf < (u32)pBt
1f3df 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d ->usableSize/4 -
1f3e0 20 38 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 8 ){.. /*
1f3e1 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 In this case the
1f3e2 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 re is room on th
1f3e3 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 e trunk page to
1f3e4 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0d insert the page.
1f3e5 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 . ** being
1f3e6 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c freed as a new l
1f3e7 65 61 66 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a eaf... **..
1f3e8 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 ** Note th
1f3e9 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 at the trunk pag
1f3ea 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 e is not really
1f3eb 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f full until it co
1f3ec 6e 74 61 69 6e 73 0d 0a 20 20 20 20 20 20 2a 2a ntains.. **
1f3ed 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 usableSize/4 -
1f3ee 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 2 entries, not u
1f3ef 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 sableSize/4 - 8
1f3f0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 entries as we ha
1f3f1 76 65 0d 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 ve.. ** cod
1f3f2 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 ed. But due to
1f3f3 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 a coding error i
1f3f4 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 n versions of SQ
1f3f5 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0d 0a 20 Lite prior to..
1f3f6 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 ** 3.6.0, d
1f3f7 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 atabases with fr
1f3f8 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 eelist trunk pag
1f3f9 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 es holding more
1f3fa 74 68 61 6e 0d 0a 20 20 20 20 20 20 2a 2a 20 75 than.. ** u
1f3fb 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 sableSize/4 - 8
1f3fc 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 entries will be
1f3fd 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 reported as corr
1f3fe 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0d 0a upt. In order..
1f3ff 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e ** to main
1f400 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 tain backwards c
1f401 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 ompatibility wit
1f402 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 h older versions
1f403 20 6f 66 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 of SQLite,..
1f404 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f ** we will co
1f405 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 ntinue to restri
1f406 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ct the number of
1f407 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 entries to usab
1f408 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0d 0a 20 20 leSize/4 - 8..
1f409 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 ** for now.
1f40a 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 At some point i
1f40b 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e n the future (on
1f40c 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 ce everyone has
1f40d 75 70 67 72 61 64 65 64 0d 0a 20 20 20 20 20 20 upgraded..
1f40e 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c ** to 3.6.0 or l
1f40f 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 ater) we should
1f410 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 consider fixing
1f411 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 the conditional
1f412 61 62 6f 76 65 0d 0a 20 20 20 20 20 20 2a 2a 20 above.. **
1f413 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 to read "usableS
1f414 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 ize/4-2" instead
1f415 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f of "usableSize/
1f416 34 2d 38 22 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 4-8"... */.
1f417 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 . rc = sqli
1f418 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 te3PagerWrite(pT
1f419 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0d runk->pDbPage);.
1f41a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 . if( rc==S
1f41b 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1f41c 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 put4byte(&p
1f41d 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c Trunk->aData[4],
1f41e 20 6e 4c 65 61 66 2b 31 29 3b 0d 0a 20 20 20 20 nLeaf+1);..
1f41f 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 put4byte(&pT
1f420 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c runk->aData[8+nL
1f421 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0d eaf*4], iPage);.
1f422 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 . if( pPa
1f423 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 ge && (pBt->btsF
1f424 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 lags & BTS_SECUR
1f425 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0d E_DELETE)==0 ){.
1f426 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
1f427 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 e3PagerDontWrite
1f428 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 (pPage->pDbPage)
1f429 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
1f42a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 rc = btree
1f42b 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 SetHasContent(pB
1f42c 74 2c 20 69 50 61 67 65 29 3b 0d 0a 20 20 20 20 t, iPage);..
1f42d 20 20 7d 0d 0a 20 20 20 20 20 20 54 52 41 43 45 }.. TRACE
1f42e 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 (("FREE-PAGE: %d
1f42f 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 leaf on trunk p
1f430 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d age %d\n",pPage-
1f431 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 >pgno,pTrunk->pg
1f432 6e 6f 29 29 3b 0d 0a 20 20 20 20 20 20 67 6f 74 no));.. got
1f433 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0d o freepage_out;.
1f434 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 . }.. }....
1f435 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 /* If control f
1f436 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 lows to this poi
1f437 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 nt, then it was
1f438 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 not possible to
1f439 61 64 64 20 74 68 65 0d 0a 20 20 2a 2a 20 74 68 add the.. ** th
1f43a 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 e page being fre
1f43b 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 ed as a leaf pag
1f43c 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 e of the first t
1f43d 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 runk in the free
1f43e 2d 6c 69 73 74 2e 0d 0a 20 20 2a 2a 20 50 6f 73 -list... ** Pos
1f43f 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 sibly because th
1f440 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 e free-list is e
1f441 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c mpty, or possibl
1f442 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0d 0a y because the ..
1f443 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b ** first trunk
1f444 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 in the free-lis
1f445 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 t is full. Eithe
1f446 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 r way, the page
1f447 62 65 69 6e 67 20 66 72 65 65 64 0d 0a 20 20 2a being freed.. *
1f448 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 * will become th
1f449 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e e new first trun
1f44a 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 k page in the fr
1f44b 65 65 2d 6c 69 73 74 2e 0d 0a 20 20 2a 2f 0d 0a ee-list... */..
1f44c 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 if( pPage==0 &
1f44d 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 & SQLITE_OK!=(rc
1f44e 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 = btreeGetPage(
1f44f 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 pBt, iPage, &pPa
1f450 67 65 2c 20 30 29 29 20 29 7b 0d 0a 20 20 20 20 ge, 0)) ){..
1f451 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 goto freepage_ou
1f452 74 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 20 3d 20 t;.. }.. rc =
1f453 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 sqlite3PagerWrit
1f454 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 e(pPage->pDbPage
1f455 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 );.. if( rc!=SQ
1f456 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
1f457 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 goto freepage_ou
1f458 74 3b 0d 0a 20 20 7d 0d 0a 20 20 70 75 74 34 62 t;.. }.. put4b
1f459 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 yte(pPage->aData
1f45a 2c 20 69 54 72 75 6e 6b 29 3b 0d 0a 20 20 70 75 , iTrunk);.. pu
1f45b 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 t4byte(&pPage->a
1f45c 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0d 0a 20 20 Data[4], 0);..
1f45d 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 put4byte(&pPage1
1f45e 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 ->aData[32], iPa
1f45f 67 65 29 3b 0d 0a 20 20 54 52 41 43 45 28 28 22 ge);.. TRACE(("
1f460 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 FREE-PAGE: %d ne
1f461 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 w trunk page rep
1f462 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 lacing %d\n", pP
1f463 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e age->pgno, iTrun
1f464 6b 29 29 3b 0d 0a 0d 0a 66 72 65 65 70 61 67 65 k));....freepage
1f465 5f 6f 75 74 3a 0d 0a 20 20 69 66 28 20 70 50 61 _out:.. if( pPa
1f466 67 65 20 29 7b 0d 0a 20 20 20 20 70 50 61 67 65 ge ){.. pPage
1f467 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0d 0a 20 ->isInit = 0;..
1f468 20 7d 0d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 }.. releasePag
1f469 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 72 65 6c e(pPage);.. rel
1f46a 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 easePage(pTrunk)
1f46b 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d ;.. return rc;.
1f46c 0a 7d 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .}..static void
1f46d 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 freePage(MemPage
1f46e 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 *pPage, int *pR
1f46f 43 29 7b 0d 0a 20 20 69 66 28 20 28 2a 70 52 43 C){.. if( (*pRC
1f470 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d )==SQLITE_OK ){.
1f471 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 . *pRC = free
1f472 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 Page2(pPage->pBt
1f473 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e , pPage, pPage->
1f474 70 67 6e 6f 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a pgno);.. }..}..
1f475 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 61 6e ../*..** Free an
1f476 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 y overflow pages
1f477 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
1f478 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e the given Cell.
1f479 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
1f47a 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 clearCell(MemPa
1f47b 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 ge *pPage, unsig
1f47c 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 ned char *pCell)
1f47d 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 {.. BtShared *p
1f47e 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b Bt = pPage->pBt;
1f47f 0d 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 .. CellInfo inf
1f480 6f 3b 0d 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 o;.. Pgno ovflP
1f481 67 6e 6f 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d gno;.. int rc;.
1f482 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0d 0a 20 . int nOvfl;..
1f483 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a u32 ovflPageSiz
1f484 65 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 e;.... assert(
1f485 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
1f486 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d ld(pPage->pBt->m
1f487 75 74 65 78 29 20 29 3b 0d 0a 20 20 62 74 72 65 utex) );.. btre
1f488 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 eParseCellPtr(pP
1f489 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 age, pCell, &inf
1f48a 6f 29 3b 0d 0a 20 20 69 66 28 20 69 6e 66 6f 2e o);.. if( info.
1f48b 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0d iOverflow==0 ){.
1f48c 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
1f48d 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 TE_OK; /* No ov
1f48e 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 erflow pages. Re
1f48f 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 turn without doi
1f490 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0d 0a ng anything */..
1f491 20 20 7d 0d 0a 20 20 69 66 28 20 70 43 65 6c 6c }.. if( pCell
1f492 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b +info.iOverflow+
1f493 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3 > pPage->aData
1f494 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 +pPage->maskPage
1f495 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
1f496 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 SQLITE_CORRUPT;
1f497 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 /* Cell extends
1f498 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 past end of pag
1f499 65 20 2a 2f 0d 0a 20 20 7d 0d 0a 20 20 6f 76 66 e */.. }.. ovf
1f49a 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 lPgno = get4byte
1f49b 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 (&pCell[info.iOv
1f49c 65 72 66 6c 6f 77 5d 29 3b 0d 0a 20 20 61 73 73 erflow]);.. ass
1f49d 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 ert( pBt->usable
1f49e 53 69 7a 65 20 3e 20 34 20 29 3b 0d 0a 20 20 6f Size > 4 );.. o
1f49f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 vflPageSize = pB
1f4a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 t->usableSize -
1f4a1 34 3b 0d 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 4;.. nOvfl = (i
1f4a2 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 nfo.nPayload - i
1f4a3 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 nfo.nLocal + ovf
1f4a4 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f lPageSize - 1)/o
1f4a5 76 66 6c 50 61 67 65 53 69 7a 65 3b 0d 0a 20 20 vflPageSize;..
1f4a6 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f assert( ovflPgno
1f4a7 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 ==0 || nOvfl>0 )
1f4a8 3b 0d 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 ;.. while( nOvf
1f4a9 6c 2d 2d 20 29 7b 0d 0a 20 20 20 20 50 67 6e 6f l-- ){.. Pgno
1f4aa 20 69 4e 65 78 74 20 3d 20 30 3b 0d 0a 20 20 20 iNext = 0;..
1f4ab 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 MemPage *pOvfl
1f4ac 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 6f 76 = 0;.. if( ov
1f4ad 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c flPgno<2 || ovfl
1f4ae 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f Pgno>btreePageco
1f4af 75 6e 74 28 70 42 74 29 20 29 7b 0d 0a 20 20 20 unt(pBt) ){..
1f4b0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 /* 0 is not a
1f4b1 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 legal page numb
1f4b2 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 er and page 1 ca
1f4b3 6e 6e 6f 74 20 62 65 20 61 6e 20 0d 0a 20 20 20 nnot be an ..
1f4b4 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 ** overflow p
1f4b5 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 age. Therefore i
1f4b6 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 f ovflPgno<2 or
1f4b7 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 past the end of
1f4b8 74 68 65 20 0d 0a 20 20 20 20 20 20 2a 2a 20 66 the .. ** f
1f4b9 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 ile the database
1f4ba 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 must be corrupt
1f4bb 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 . */.. retu
1f4bc 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1f4bd 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a T_BKPT;.. }..
1f4be 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b if( nOvfl ){
1f4bf 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 .. rc = get
1f4c0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 OverflowPage(pBt
1f4c1 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 , ovflPgno, &pOv
1f4c2 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0d 0a 20 20 fl, &iNext);..
1f4c3 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 if( rc ) ret
1f4c4 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a urn rc;.. }..
1f4c5 0d 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 .. if( ( pOvf
1f4c6 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 l || ((pOvfl = b
1f4c7 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 treePageLookup(p
1f4c8 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d Bt, ovflPgno))!=
1f4c9 30 29 20 29 0d 0a 20 20 20 20 20 26 26 20 73 71 0) ).. && sq
1f4ca 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 lite3PagerPageRe
1f4cb 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 fcount(pOvfl->pD
1f4cc 62 50 61 67 65 29 21 3d 31 0d 0a 20 20 20 20 29 bPage)!=1.. )
1f4cd 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 {.. /* Ther
1f4ce 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 e is no reason a
1f4cf 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 ny cursor should
1f4d0 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e have an outstan
1f4d1 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0d ding reference .
1f4d2 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 . ** to an
1f4d3 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 overflow page be
1f4d4 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c longing to a cel
1f4d5 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 l that is being
1f4d6 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e deleted/updated.
1f4d7 0d 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 .. ** So if
1f4d8 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f there exists mo
1f4d9 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 re than one refe
1f4da 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 rence to this pa
1f4db 67 65 2c 20 74 68 65 6e 20 69 74 20 0d 0a 20 20 ge, then it ..
1f4dc 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 ** must not
1f4dd 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 really be an ove
1f4de 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 rflow page and t
1f4df 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 he database must
1f4e0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0d 0a 20 be corrupt. ..
1f4e1 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 ** It is he
1f4e2 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 lpful to detect
1f4e3 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c this before call
1f4e4 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c ing freePage2(),
1f4e5 20 61 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20 66 as .. ** f
1f4e6 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a reePage2() may z
1f4e7 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e ero the page con
1f4e8 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d tents if secure-
1f4e9 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0d 0a delete mode is..
1f4ea 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 ** enabled
1f4eb 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 . If this 'overf
1f4ec 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e low' page happen
1f4ed 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 s to be a page t
1f4ee 68 61 74 20 74 68 65 0d 0a 20 20 20 20 20 20 2a hat the.. *
1f4ef 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 * caller is iter
1f4f0 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 ating through or
1f4f1 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f using in some o
1f4f2 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0d 0a ther way, this..
1f4f3 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 ** can be
1f4f4 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0d 0a 20 20 problematic...
1f4f5 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 72 63 */.. rc
1f4f6 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 = SQLITE_CORRUP
1f4f7 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 65 6c T_BKPT;.. }el
1f4f8 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 se{.. rc =
1f4f9 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 freePage2(pBt, p
1f4fa 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b Ovfl, ovflPgno);
1f4fb 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 .. }.... i
1f4fc 66 28 20 70 4f 76 66 6c 20 29 7b 0d 0a 20 20 20 f( pOvfl ){..
1f4fd 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 sqlite3PagerU
1f4fe 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 nref(pOvfl->pDbP
1f4ff 61 67 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 age);.. }..
1f500 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 if( rc ) retur
1f501 6e 20 72 63 3b 0d 0a 20 20 20 20 6f 76 66 6c 50 n rc;.. ovflP
1f502 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0d 0a 20 20 gno = iNext;..
1f503 7d 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }.. return SQLI
1f504 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d TE_OK;..}..../*.
1f505 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 .** Create the b
1f506 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 yte sequence use
1f507 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 d to represent a
1f508 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 cell on page pP
1f509 61 67 65 0d 0a 2a 2a 20 61 6e 64 20 77 72 69 74 age..** and writ
1f50a 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 e that byte sequ
1f50b 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b ence into pCell[
1f50c 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 ]. Overflow pag
1f50d 65 73 20 61 72 65 0d 0a 2a 2a 20 61 6c 6c 6f 63 es are..** alloc
1f50e 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 ated and filled
1f50f 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e in as necessary.
1f510 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 The calling pr
1f511 6f 63 65 64 75 72 65 0d 0a 2a 2a 20 69 73 20 72 ocedure..** is r
1f512 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d esponsible for m
1f513 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 aking sure suffi
1f514 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 cient space has
1f515 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0d 0a been allocated..
1f516 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0d ** for pCell[]..
1f517 0a 2a 2a 0d 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 .**..** Note tha
1f518 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 t pCell does not
1f519 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 necessary need
1f51a 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 to point to the
1f51b 70 50 61 67 65 2d 3e 61 44 61 74 61 0d 0a 2a 2a pPage->aData..**
1f51c 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 area. pCell mi
1f51d 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d ght point to som
1f51e 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 e temporary stor
1f51f 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 age. The cell w
1f520 69 6c 6c 0d 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 ill..** be const
1f521 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 ructed in this t
1f522 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 emporary area th
1f523 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 en copied into p
1f524 50 61 67 65 2d 3e 61 44 61 74 61 0d 0a 2a 2a 20 Page->aData..**
1f525 6c 61 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 later...*/..stat
1f526 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c ic int fillInCel
1f527 6c 28 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 l(.. MemPage *p
1f528 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 Page,
1f529 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 /* The page
1f52a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 that contains t
1f52b 68 65 20 63 65 6c 6c 20 2a 2f 0d 0a 20 20 75 6e he cell */.. un
1f52c 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 signed char *pCe
1f52d 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ll, /*
1f52e 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 Complete text of
1f52f 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0d 0a 20 20 the cell */..
1f530 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1f531 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f , i64 nKey, /
1f532 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0d 0a 20 20 * The key */..
1f533 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 const void *pDat
1f534 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f a,int nData, /
1f535 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0d 0a 20 * The data */..
1f536 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 int nZero,
1f537 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f538 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 /* Extra zero by
1f539 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f tes to append to
1f53a 20 70 44 61 74 61 20 2a 2f 0d 0a 20 20 69 6e 74 pData */.. int
1f53b 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 *pnSize
1f53c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 /* W
1f53d 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 rite cell size h
1f53e 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e ere */..){.. in
1f53f 74 20 6e 50 61 79 6c 6f 61 64 3b 0d 0a 20 20 63 t nPayload;.. c
1f540 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0d 0a onst u8 *pSrc;..
1f541 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 int nSrc, n, r
1f542 63 3b 0d 0a 20 20 69 6e 74 20 73 70 61 63 65 4c c;.. int spaceL
1f543 65 66 74 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 eft;.. MemPage
1f544 2a 70 4f 76 66 6c 20 3d 20 30 3b 0d 0a 20 20 4d *pOvfl = 0;.. M
1f545 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 emPage *pToRelea
1f546 73 65 20 3d 20 30 3b 0d 0a 20 20 75 6e 73 69 67 se = 0;.. unsig
1f547 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 ned char *pPrior
1f548 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 ;.. unsigned ch
1f549 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0d 0a 20 ar *pPayload;..
1f54a 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d BtShared *pBt =
1f54b 20 70 50 61 67 65 2d 3e 70 42 74 3b 0d 0a 20 20 pPage->pBt;..
1f54c 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 Pgno pgnoOvfl =
1f54d 30 3b 0d 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 0;.. int nHeade
1f54e 72 3b 0d 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 r;.. CellInfo i
1f54f 6e 66 6f 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 nfo;.... assert
1f550 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f ( sqlite3_mutex_
1f551 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d held(pPage->pBt-
1f552 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 0d 0a 20 20 >mutex) );....
1f553 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 /* pPage is not
1f554 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 necessarily writ
1f555 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c eable since pCel
1f556 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c l might be auxil
1f557 69 61 72 79 0d 0a 20 20 2a 2a 20 62 75 66 66 65 iary.. ** buffe
1f558 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 r space that is
1f559 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 separate from th
1f55a 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 e pPage buffer a
1f55b 72 65 61 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 rea */.. assert
1f55c 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 ( pCell<pPage->a
1f55d 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 Data || pCell>=&
1f55e 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 pPage->aData[pBt
1f55f 2d 3e 70 61 67 65 53 69 7a 65 5d 0d 0a 20 20 20 ->pageSize]..
1f560 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 || sqli
1f561 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 te3PagerIswritea
1f562 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 ble(pPage->pDbPa
1f563 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 46 ge) );.... /* F
1f564 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 ill in the heade
1f565 72 2e 20 2a 2f 0d 0a 20 20 6e 48 65 61 64 65 72 r. */.. nHeader
1f566 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 21 70 50 = 0;.. if( !pP
1f567 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 age->leaf ){..
1f568 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0d nHeader += 4;.
1f569 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 50 61 67 . }.. if( pPag
1f56a 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0d 0a 20 e->hasData ){..
1f56b 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 nHeader += pu
1f56c 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e tVarint(&pCell[n
1f56d 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e Header], nData+n
1f56e 5a 65 72 6f 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b Zero);.. }else{
1f56f 0d 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a .. nData = nZ
1f570 65 72 6f 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 ero = 0;.. }..
1f571 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 nHeader += putV
1f572 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 arint(&pCell[nHe
1f573 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e ader], *(u64*)&n
1f574 4b 65 79 29 3b 0d 0a 20 20 62 74 72 65 65 50 61 Key);.. btreePa
1f575 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 rseCellPtr(pPage
1f576 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b , pCell, &info);
1f577 0d 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f .. assert( info
1f578 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 .nHeader==nHeade
1f579 72 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 r );.. assert(
1f57a 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 info.nKey==nKey
1f57b 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 69 6e );.. assert( in
1f57c 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 fo.nData==(u32)(
1f57d 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0d nData+nZero) );.
1f57e 0a 20 20 0d 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 . .. /* Fill i
1f57f 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f n the payload */
1f580 0d 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e .. nPayload = n
1f581 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0d 0a 20 Data + nZero;..
1f582 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b if( pPage->intK
1f583 65 79 20 29 7b 0d 0a 20 20 20 20 70 53 72 63 20 ey ){.. pSrc
1f584 3d 20 70 44 61 74 61 3b 0d 0a 20 20 20 20 6e 53 = pData;.. nS
1f585 72 63 20 3d 20 6e 44 61 74 61 3b 0d 0a 20 20 20 rc = nData;..
1f586 20 6e 44 61 74 61 20 3d 20 30 3b 0d 0a 20 20 7d nData = 0;.. }
1f587 65 6c 73 65 7b 20 0d 0a 20 20 20 20 69 66 28 20 else{ .. if(
1f588 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 NEVER(nKey>0x7ff
1f589 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 fffff || pKey==0
1f58a 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 ) ){.. retu
1f58b 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
1f58c 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 7d 0d 0a T_BKPT;.. }..
1f58d 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 nPayload +=
1f58e 28 69 6e 74 29 6e 4b 65 79 3b 0d 0a 20 20 20 20 (int)nKey;..
1f58f 70 53 72 63 20 3d 20 70 4b 65 79 3b 0d 0a 20 20 pSrc = pKey;..
1f590 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b nSrc = (int)nK
1f591 65 79 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 6e 53 ey;.. }.. *pnS
1f592 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 ize = info.nSize
1f593 3b 0d 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d ;.. spaceLeft =
1f594 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0d 0a 20 info.nLocal;..
1f595 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 pPayload = &pCe
1f596 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0d 0a 20 20 ll[nHeader];..
1f597 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b pPrior = &pCell[
1f598 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b info.iOverflow];
1f599 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 .... while( nPa
1f59a 79 6c 6f 61 64 3e 30 20 29 7b 0d 0a 20 20 20 20 yload>0 ){..
1f59b 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 if( spaceLeft==0
1f59c 20 29 7b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c ){..#ifndef SQL
1f59d 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 ITE_OMIT_AUTOVAC
1f59e 55 55 4d 0d 0a 20 20 20 20 20 20 50 67 6e 6f 20 UUM.. Pgno
1f59f 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e pgnoPtrmap = pgn
1f5a0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c oOvfl; /* Overfl
1f5a1 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d ow page pointer-
1f5a2 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a map entry page *
1f5a3 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 /.. if( pBt
1f5a4 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0d ->autoVacuum ){.
1f5a5 0a 20 20 20 20 20 20 20 20 64 6f 7b 0d 0a 20 20 . do{..
1f5a6 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c pgnoOvfl
1f5a7 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 ++;.. } w
1f5a8 68 69 6c 65 28 20 0d 0a 20 20 20 20 20 20 20 20 hile( ..
1f5a9 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 PTRMAP_ISPAGE(
1f5aa 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c pBt, pgnoOvfl) |
1f5ab 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 | pgnoOvfl==PEND
1f5ac 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 ING_BYTE_PAGE(pB
1f5ad 74 29 20 0d 0a 20 20 20 20 20 20 20 20 29 3b 0d t) .. );.
1f5ae 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 . }..#endif
1f5af 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c .. rc = all
1f5b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 ocateBtreePage(p
1f5b1 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e Bt, &pOvfl, &pgn
1f5b2 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c oOvfl, pgnoOvfl,
1f5b3 20 30 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 0);..#ifndef SQ
1f5b4 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
1f5b5 43 55 55 4d 0d 0a 20 20 20 20 20 20 2f 2a 20 49 CUUM.. /* I
1f5b6 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 f the database s
1f5b7 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 upports auto-vac
1f5b8 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 uum, and the sec
1f5b9 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e ond or subsequen
1f5ba 74 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 t.. ** over
1f5bb 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 flow page is bei
1f5bc 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 ng allocated, ad
1f5bd 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 d an entry to th
1f5be 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0d 0a 20 e pointer-map..
1f5bf 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 ** for that
1f5c0 20 70 61 67 65 20 6e 6f 77 2e 20 0d 0a 20 20 20 page now. ..
1f5c1 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 **.. **
1f5c2 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 If this is the f
1f5c3 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 irst overflow pa
1f5c4 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 ge, then write a
1f5c5 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0d partial entry .
1f5c6 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 . ** to the
1f5c7 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 pointer-map. If
1f5c8 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e we write nothin
1f5c9 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 g to this pointe
1f5ca 72 2d 6d 61 70 20 73 6c 6f 74 2c 0d 0a 20 20 20 r-map slot,..
1f5cb 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f ** then the o
1f5cc 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c ptimistic overfl
1f5cd 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 ow chain process
1f5ce 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c ing in clearCell
1f5cf 28 29 0d 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 ().. ** may
1f5d0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 misinterpret th
1f5d1 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 e uninitialised
1f5d2 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 values and delet
1f5d3 65 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 e the.. **
1f5d4 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d wrong pages from
1f5d5 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a the database...
1f5d6 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 */..
1f5d7 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 if( pBt->autoVac
1f5d8 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 uum && rc==SQLIT
1f5d9 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
1f5da 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e u8 eType = (pgn
1f5db 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f oPtrmap?PTRMAP_O
1f5dc 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f VERFLOW2:PTRMAP_
1f5dd 4f 56 45 52 46 4c 4f 57 31 29 3b 0d 0a 20 20 20 OVERFLOW1);..
1f5de 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 ptrmapPut(p
1f5df 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 Bt, pgnoOvfl, eT
1f5e0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c ype, pgnoPtrmap,
1f5e1 20 26 72 63 29 3b 0d 0a 20 20 20 20 20 20 20 20 &rc);..
1f5e2 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 20 if( rc ){..
1f5e3 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 releasePage
1f5e4 28 70 4f 76 66 6c 29 3b 0d 0a 20 20 20 20 20 20 (pOvfl);..
1f5e5 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 }.. }..#e
1f5e6 6e 64 69 66 0d 0a 20 20 20 20 20 20 69 66 28 20 ndif.. if(
1f5e7 72 63 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 rc ){.. r
1f5e8 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 eleasePage(pToRe
1f5e9 6c 65 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 lease);..
1f5ea 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
1f5eb 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a }.... /*
1f5ec 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 If pToRelease i
1f5ed 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 s not zero than
1f5ee 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e pPrior points in
1f5ef 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 to the data area
1f5f0 0d 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 .. ** of pT
1f5f1 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 oRelease. Make
1f5f2 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 sure pToRelease
1f5f3 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 is still writeab
1f5f4 6c 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 61 73 le. */.. as
1f5f5 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 sert( pToRelease
1f5f6 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 ==0 || sqlite3Pa
1f5f7 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 gerIswriteable(p
1f5f8 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 ToRelease->pDbPa
1f5f9 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 ge) );....
1f5fa 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 /* If pPrior is
1f5fb 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 part of the data
1f5fc 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 area of pPage,
1f5fd 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 then make sure p
1f5fe 50 61 67 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69 Page.. ** i
1f5ff 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c s still writeabl
1f600 65 20 2a 2f 0d 0a 20 20 20 20 20 20 61 73 73 65 e */.. asse
1f601 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 rt( pPrior<pPage
1f602 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f ->aData || pPrio
1f603 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 r>=&pPage->aData
1f604 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0d [pBt->pageSize].
1f605 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 . ||
1f606 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 sqlite3PagerIswr
1f607 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 iteable(pPage->p
1f608 44 62 50 61 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 DbPage) );....
1f609 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 put4byte(pPr
1f60a 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0d ior, pgnoOvfl);.
1f60b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 . releasePa
1f60c 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0d ge(pToRelease);.
1f60d 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 . pToReleas
1f60e 65 20 3d 20 70 4f 76 66 6c 3b 0d 0a 20 20 20 20 e = pOvfl;..
1f60f 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c pPrior = pOvfl
1f610 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 ->aData;..
1f611 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c put4byte(pPrior,
1f612 20 30 29 3b 0d 0a 20 20 20 20 20 20 70 50 61 79 0);.. pPay
1f613 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 load = &pOvfl->a
1f614 44 61 74 61 5b 34 5d 3b 0d 0a 20 20 20 20 20 20 Data[4];..
1f615 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d spaceLeft = pBt-
1f616 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b >usableSize - 4;
1f617 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 6e 20 3d .. }.. n =
1f618 20 6e 50 61 79 6c 6f 61 64 3b 0d 0a 20 20 20 20 nPayload;..
1f619 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 if( n>spaceLeft
1f61a 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b ) n = spaceLeft;
1f61b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 .... /* If pT
1f61c 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 oRelease is not
1f61d 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f zero than pPaylo
1f61e 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 ad points into t
1f61f 68 65 20 64 61 74 61 20 61 72 65 61 0d 0a 20 20 he data area..
1f620 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 ** of pToRelea
1f621 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 se. Make sure p
1f622 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 ToRelease is sti
1f623 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f ll writeable. */
1f624 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 .. assert( pT
1f625 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 oRelease==0 || s
1f626 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 qlite3PagerIswri
1f627 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 teable(pToReleas
1f628 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0d 0a e->pDbPage) );..
1f629 0d 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 .. /* If pPay
1f62a 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 load is part of
1f62b 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 the data area of
1f62c 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b pPage, then mak
1f62d 65 20 73 75 72 65 20 70 50 61 67 65 0d 0a 20 20 e sure pPage..
1f62e 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 ** is still wr
1f62f 69 74 65 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 iteable */..
1f630 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 assert( pPayload
1f631 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c <pPage->aData ||
1f632 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 pPayload>=&pPag
1f633 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 e->aData[pBt->pa
1f634 67 65 53 69 7a 65 5d 0d 0a 20 20 20 20 20 20 20 geSize]..
1f635 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 || sqlite3P
1f636 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 agerIswriteable(
1f637 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 pPage->pDbPage)
1f638 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 6e 53 );.... if( nS
1f639 72 63 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 rc>0 ){.. i
1f63a 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 f( n>nSrc ) n =
1f63b 6e 53 72 63 3b 0d 0a 20 20 20 20 20 20 61 73 73 nSrc;.. ass
1f63c 65 72 74 28 20 70 53 72 63 20 29 3b 0d 0a 20 20 ert( pSrc );..
1f63d 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c memcpy(pPayl
1f63e 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0d 0a oad, pSrc, n);..
1f63f 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
1f640 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 memset(pPayloa
1f641 64 2c 20 30 2c 20 6e 29 3b 0d 0a 20 20 20 20 7d d, 0, n);.. }
1f642 0d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d .. nPayload -
1f643 3d 20 6e 3b 0d 0a 20 20 20 20 70 50 61 79 6c 6f = n;.. pPaylo
1f644 61 64 20 2b 3d 20 6e 3b 0d 0a 20 20 20 20 70 53 ad += n;.. pS
1f645 72 63 20 2b 3d 20 6e 3b 0d 0a 20 20 20 20 6e 53 rc += n;.. nS
1f646 72 63 20 2d 3d 20 6e 3b 0d 0a 20 20 20 20 73 70 rc -= n;.. sp
1f647 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0d 0a 20 aceLeft -= n;..
1f648 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 if( nSrc==0 )
1f649 7b 0d 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 {.. nSrc =
1f64a 6e 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 70 53 nData;.. pS
1f64b 72 63 20 3d 20 70 44 61 74 61 3b 0d 0a 20 20 20 rc = pData;..
1f64c 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 6c 65 61 }.. }.. relea
1f64d 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 sePage(pToReleas
1f64e 65 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 e);.. return SQ
1f64f 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f LITE_OK;..}..../
1f650 2a 0d 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 *..** Remove the
1f651 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 i-th cell from
1f652 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 pPage. This rou
1f653 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 tine effects pPa
1f654 67 65 20 6f 6e 6c 79 2e 0d 0a 2a 2a 20 54 68 65 ge only...** The
1f655 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 cell content is
1f656 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 not freed or de
1f657 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 allocated. It i
1f658 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0d 0a s assumed that..
1f659 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 ** the cell cont
1f65a 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 ent has been cop
1f65b 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c ied someplace el
1f65c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e se. This routin
1f65d 65 20 6a 75 73 74 0d 0a 2a 2a 20 72 65 6d 6f 76 e just..** remov
1f65e 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 es the reference
1f65f 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f to the cell fro
1f660 6d 20 70 50 61 67 65 2e 0d 0a 2a 2a 0d 0a 2a 2a m pPage...**..**
1f661 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 "sz" must be th
1f662 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 e number of byte
1f663 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0d 0a s in the cell...
1f664 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */..static void
1f665 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 dropCell(MemPage
1f666 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 *pPage, int idx
1f667 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 , int sz, int *p
1f668 52 43 29 7b 0d 0a 20 20 75 33 32 20 70 63 3b 20 RC){.. u32 pc;
1f669 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 /* Offse
1f66a 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e t to cell conten
1f66b 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 t of cell being
1f66c 64 65 6c 65 74 65 64 20 2a 2f 0d 0a 20 20 75 38 deleted */.. u8
1f66d 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a *data; /*
1f66e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f pPage->aData */
1f66f 0d 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 .. u8 *ptr;
1f670 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d /* Used to m
1f671 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 ove bytes around
1f672 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a within data[] *
1f673 2f 0d 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b /.. u8 *endPtr;
1f674 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c /* End of l
1f675 6f 6f 70 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 oop */.. int rc
1f676 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 ; /* The
1f677 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d return code */.
1f678 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 . int hdr;
1f679 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 /* Beginning
1f67a 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 of the header.
1f67b 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 0 most pages. 1
1f67c 30 30 20 70 61 67 65 20 31 20 2a 2f 0d 0a 0d 0a 00 page 1 */....
1f67d 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 if( *pRC ) ret
1f67e 75 72 6e 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 urn;.... assert
1f67f 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c ( idx>=0 && idx<
1f680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0d pPage->nCell );.
1f681 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 . assert( sz==c
1f682 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 ellSize(pPage, i
1f683 64 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 dx) );.. assert
1f684 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 ( sqlite3PagerIs
1f685 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d writeable(pPage-
1f686 3e 70 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 20 >pDbPage) );..
1f687 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1f688 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 mutex_held(pPage
1f689 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b ->pBt->mutex) );
1f68a 0d 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 .. data = pPage
1f68b 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 70 74 72 20 ->aData;.. ptr
1f68c 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 = &pPage->aCellI
1f68d 64 78 5b 32 2a 69 64 78 5d 3b 0d 0a 20 20 70 63 dx[2*idx];.. pc
1f68e 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 = get2byte(ptr)
1f68f 3b 0d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 ;.. hdr = pPage
1f690 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0d 0a 20 20 ->hdrOffset;..
1f691 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 testcase( pc==ge
1f692 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 t2byte(&data[hdr
1f693 2b 35 5d 29 20 29 3b 0d 0a 20 20 74 65 73 74 63 +5]) );.. testc
1f694 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 ase( pc+sz==pPag
1f695 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 e->pBt->usableSi
1f696 7a 65 20 29 3b 0d 0a 20 20 69 66 28 20 70 63 20 ze );.. if( pc
1f697 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 < (u32)get2byte(
1f698 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c &data[hdr+5]) ||
1f699 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e pc+sz > pPage->
1f69a 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 pBt->usableSize
1f69b 29 7b 0d 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 ){.. *pRC = S
1f69c 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1f69d 50 54 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 3b PT;.. return;
1f69e 0d 0a 20 20 7d 0d 0a 20 20 72 63 20 3d 20 66 72 .. }.. rc = fr
1f69f 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 eeSpace(pPage, p
1f6a0 63 2c 20 73 7a 29 3b 0d 0a 20 20 69 66 28 20 72 c, sz);.. if( r
1f6a1 63 20 29 7b 0d 0a 20 20 20 20 2a 70 52 43 20 3d c ){.. *pRC =
1f6a2 20 72 63 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e rc;.. return
1f6a3 3b 0d 0a 20 20 7d 0d 0a 20 20 65 6e 64 50 74 72 ;.. }.. endPtr
1f6a4 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c = &pPage->aCell
1f6a5 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 Idx[2*pPage->nCe
1f6a6 6c 6c 20 2d 20 32 5d 3b 0d 0a 20 20 61 73 73 65 ll - 2];.. asse
1f6a7 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f rt( (SQLITE_PTR_
1f6a8 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d TO_INT(ptr)&1)==
1f6a9 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 0 ); /* ptr is
1f6aa 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c always 2-byte al
1f6ab 69 67 6e 65 64 20 2a 2f 0d 0a 20 20 77 68 69 6c igned */.. whil
1f6ac 65 28 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b e( ptr<endPtr ){
1f6ad 0d 0a 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 .. *(u16*)ptr
1f6ae 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 = *(u16*)&ptr[2
1f6af 5d 3b 0d 0a 20 20 20 20 70 74 72 20 2b 3d 20 32 ];.. ptr += 2
1f6b0 3b 0d 0a 20 20 7d 0d 0a 20 20 70 50 61 67 65 2d ;.. }.. pPage-
1f6b1 3e 6e 43 65 6c 6c 2d 2d 3b 0d 0a 20 20 70 75 74 >nCell--;.. put
1f6b2 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 2byte(&data[hdr+
1f6b3 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3], pPage->nCell
1f6b4 29 3b 0d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 );.. pPage->nFr
1f6b5 65 65 20 2b 3d 20 32 3b 0d 0a 7d 0d 0a 0d 0a 2f ee += 2;..}..../
1f6b6 2a 0d 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e *..** Insert a n
1f6b7 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 ew cell on pPage
1f6b8 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 at cell index "
1f6b9 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 i". pCell point
1f6ba 73 20 74 6f 20 74 68 65 0d 0a 2a 2a 20 63 6f 6e s to the..** con
1f6bb 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c tent of the cell
1f6bc 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 ...**..** If the
1f6bd 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 cell content wi
1f6be 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 ll fit on the pa
1f6bf 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 ge, then put it
1f6c0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0d 0a 2a there. If it..*
1f6c1 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 * will not fit,
1f6c2 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 then make a copy
1f6c3 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e of the cell con
1f6c4 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 tent into pTemp
1f6c5 69 66 0d 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 if..** pTemp is
1f6c6 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 not null. Regar
1f6c7 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 dless of pTemp,
1f6c8 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 allocate a new e
1f6c9 6e 74 72 79 0d 0a 2a 2a 20 69 6e 20 70 50 61 67 ntry..** in pPag
1f6ca 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d e->aOvfl[] and m
1f6cb 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 ake it point to
1f6cc 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 the cell content
1f6cd 20 28 65 69 74 68 65 72 0d 0a 2a 2a 20 69 6e 20 (either..** in
1f6ce 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 pTemp or the ori
1f6cf 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 ginal pCell) and
1f6d0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 also record its
1f6d1 20 69 6e 64 65 78 2e 20 0d 0a 2a 2a 20 41 6c 6c index. ..** All
1f6d2 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e ocating a new en
1f6d3 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 try in pPage->aC
1f6d4 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 ell[] implies th
1f6d5 61 74 20 0d 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e at ..** pPage->n
1f6d6 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 Overflow is incr
1f6d7 65 6d 65 6e 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a emented...**..**
1f6d8 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e If nSkip is non
1f6d9 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e -zero, then do n
1f6da 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 ot copy the firs
1f6db 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 t nSkip bytes of
1f6dc 20 74 68 65 0d 0a 2a 2a 20 63 65 6c 6c 2e 20 54 the..** cell. T
1f6dd 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f he caller will o
1f6de 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 verwrite them af
1f6df 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f ter this functio
1f6e0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0d 0a 2a n returns. If..*
1f6e1 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a * nSkip is non-z
1f6e2 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 ero, then pCell
1f6e3 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f may not point to
1f6e4 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f an invalid memo
1f6e5 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0d 0a 2a 2a ry location ..**
1f6e6 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 (but pCell+nSki
1f6e7 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 p is always vali
1f6e8 64 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 d)...*/..static
1f6e9 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 void insertCell(
1f6ea 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 .. MemPage *pPa
1f6eb 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e ge, /* Page in
1f6ec 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 to which we are
1f6ed 63 6f 70 79 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e copying */.. in
1f6ee 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 t i,
1f6ef 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f /* New cell beco
1f6f0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c mes the i-th cel
1f6f1 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f l of the page */
1f6f2 0d 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 .. u8 *pCell,
1f6f3 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 /* Content
1f6f4 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c of the new cell
1f6f5 20 2a 2f 0d 0a 20 20 69 6e 74 20 73 7a 2c 20 20 */.. int sz,
1f6f6 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 /* Byte
1f6f7 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 s of content in
1f6f8 70 43 65 6c 6c 20 2a 2f 0d 0a 20 20 75 38 20 2a pCell */.. u8 *
1f6f9 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a pTemp, /*
1f6fa 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 Temp storage sp
1f6fb 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 ace for pCell, i
1f6fc 66 20 6e 65 65 64 65 64 20 2a 2f 0d 0a 20 20 50 f needed */.. P
1f6fd 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 gno iChild,
1f6fe 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c /* If non-zero,
1f6ff 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 replace first 4
1f700 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 bytes with this
1f701 20 76 61 6c 75 65 20 2a 2f 0d 0a 20 20 69 6e 74 value */.. int
1f702 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f *pRC /
1f703 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 * Read and write
1f704 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f return code fro
1f705 6d 20 68 65 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 m here */..){..
1f706 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 int idx = 0;
1f707 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 /* Where to w
1f708 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f rite new cell co
1f709 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 ntent in data[]
1f70a 2a 2f 0d 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 */.. int j;
1f70b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
1f70c 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 69 6e counter */.. in
1f70d 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 t end;
1f70e 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 /* First byte pa
1f70f 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c st the last cell
1f710 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 pointer in data
1f711 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 6e 73 [] */.. int ins
1f712 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e ; /* In
1f713 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 dex in data[] wh
1f714 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 ere new cell poi
1f715 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 nter is inserted
1f716 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 65 6c 6c 4f */.. int cellO
1f717 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 ffset; /* Addr
1f718 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c ess of first cel
1f719 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 l pointer in dat
1f71a 61 5b 5d 20 2a 2f 0d 0a 20 20 75 38 20 2a 64 61 a[] */.. u8 *da
1f71b 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 ta; /* T
1f71c 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 he content of th
1f71d 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0d e whole page */.
1f71e 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 . u8 *ptr;
1f71f 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 /* Used for
1f720 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 moving informat
1f721 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 ion around in da
1f722 74 61 5b 5d 20 2a 2f 0d 0a 20 20 75 38 20 2a 65 ta[] */.. u8 *e
1f723 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20 ndPtr; /*
1f724 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 End of the loop
1f725 2a 2f 0d 0a 0d 0a 20 20 69 6e 74 20 6e 53 6b 69 */.... int nSki
1f726 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 p = (iChild ? 4
1f727 3a 20 30 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 2a : 0);.... if( *
1f728 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0d 0a 0d pRC ) return;...
1f729 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 . assert( i>=0
1f72a 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 && i<=pPage->nCe
1f72b 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 ll+pPage->nOverf
1f72c 6c 6f 77 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 low );.. assert
1f72d 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d ( pPage->nCell<=
1f72e 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 MX_CELL(pPage->p
1f72f 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 Bt) && MX_CELL(p
1f730 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 Page->pBt)<=1092
1f731 31 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 1 );.. assert(
1f732 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 pPage->nOverflow
1f733 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 <=ArraySize(pPag
1f734 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0d 0a 20 20 e->aOvfl) );..
1f735 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
1f736 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 mutex_held(pPage
1f737 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b ->pBt->mutex) );
1f738 0d 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 .. /* The cell
1f739 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 should normally
1f73a 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 be sized correct
1f73b 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 ly. However, wh
1f73c 65 6e 20 6d 6f 76 69 6e 67 20 61 0d 0a 20 20 2a en moving a.. *
1f73d 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c * malformed cell
1f73e 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 from a leaf pag
1f73f 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 e to an interior
1f740 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 page, if the ce
1f741 6c 6c 20 73 69 7a 65 0d 0a 20 20 2a 2a 20 77 61 ll size.. ** wa
1f742 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 nted to be less
1f743 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 than 4 but got r
1f744 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f ounded up to 4 o
1f745 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e n the leaf, then
1f746 20 73 69 7a 65 0d 0a 20 20 2a 2a 20 6d 69 67 68 size.. ** migh
1f747 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 t be less than 8
1f748 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f (leaf-size + po
1f749 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e inter) on the in
1f74a 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 terior node. He
1f74b 6e 63 65 0d 0a 20 20 2a 2a 20 74 68 65 20 74 65 nce.. ** the te
1f74c 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 rm after the ||
1f74d 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 in the following
1f74e 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0d 0a 20 assert(). */..
1f74f 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c assert( sz==cel
1f750 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 lSizePtr(pPage,
1f751 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 pCell) || (sz==8
1f752 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b && iChild>0) );
1f753 0d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e .. if( pPage->n
1f754 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 Overflow || sz+2
1f755 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b >pPage->nFree ){
1f756 0d 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 .. if( pTemp
1f757 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 ){.. memcpy
1f758 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 (pTemp+nSkip, pC
1f759 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 ell+nSkip, sz-nS
1f75a 6b 69 70 29 3b 0d 0a 20 20 20 20 20 20 70 43 65 kip);.. pCe
1f75b 6c 6c 20 3d 20 70 54 65 6d 70 3b 0d 0a 20 20 20 ll = pTemp;..
1f75c 20 7d 0d 0a 20 20 20 20 69 66 28 20 69 43 68 69 }.. if( iChi
1f75d 6c 64 20 29 7b 0d 0a 20 20 20 20 20 20 70 75 74 ld ){.. put
1f75e 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 4byte(pCell, iCh
1f75f 69 6c 64 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ild);.. }..
1f760 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 j = pPage->nOv
1f761 65 72 66 6c 6f 77 2b 2b 3b 0d 0a 20 20 20 20 61 erflow++;.. a
1f762 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 ssert( j<(int)(s
1f763 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 izeof(pPage->aOv
1f764 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 fl)/sizeof(pPage
1f765 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0d ->aOvfl[0])) );.
1f766 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 . pPage->aOvf
1f767 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 l[j].pCell = pCe
1f768 6c 6c 3b 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e ll;.. pPage->
1f769 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 aOvfl[j].idx = (
1f76a 75 31 36 29 69 3b 0d 0a 20 20 7d 65 6c 73 65 7b u16)i;.. }else{
1f76b 0d 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 .. int rc = s
1f76c 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 qlite3PagerWrite
1f76d 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 (pPage->pDbPage)
1f76e 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 ;.. if( rc!=S
1f76f 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
1f770 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0d 0a 20 *pRC = rc;..
1f771 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 return;..
1f772 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 }.. assert(
1f773 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 sqlite3PagerIsw
1f774 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e riteable(pPage->
1f775 70 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 20 20 pDbPage) );..
1f776 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 data = pPage->a
1f777 44 61 74 61 3b 0d 0a 20 20 20 20 63 65 6c 6c 4f Data;.. cellO
1f778 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 ffset = pPage->c
1f779 65 6c 6c 4f 66 66 73 65 74 3b 0d 0a 20 20 20 20 ellOffset;..
1f77a 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 end = cellOffset
1f77b 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c + 2*pPage->nCel
1f77c 6c 3b 0d 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 l;.. ins = ce
1f77d 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0d llOffset + 2*i;.
1f77e 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 . rc = alloca
1f77f 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 teSpace(pPage, s
1f780 7a 2c 20 26 69 64 78 29 3b 0d 0a 20 20 20 20 69 z, &idx);.. i
1f781 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 f( rc ){ *pRC =
1f782 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0d 0a 20 rc; return; }..
1f783 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 /* The alloca
1f784 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e teSpace() routin
1f785 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 e guarantees the
1f786 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 following two p
1f787 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 2a roperties.. *
1f788 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 * if it returns
1f789 73 75 63 63 65 73 73 20 2a 2f 0d 0a 20 20 20 20 success */..
1f78a 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 assert( idx >= e
1f78b 6e 64 2b 32 20 29 3b 0d 0a 20 20 20 20 61 73 73 nd+2 );.. ass
1f78c 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 ert( idx+sz <= (
1f78d 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e int)pPage->pBt->
1f78e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0d 0a 20 usableSize );..
1f78f 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b pPage->nCell+
1f790 2b 3b 0d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e +;.. pPage->n
1f791 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 Free -= (u16)(2
1f792 2b 20 73 7a 29 3b 0d 0a 20 20 20 20 6d 65 6d 63 + sz);.. memc
1f793 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b py(&data[idx+nSk
1f794 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 ip], pCell+nSkip
1f795 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0d 0a 20 20 , sz-nSkip);..
1f796 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0d if( iChild ){.
1f797 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 . put4byte(
1f798 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 &data[idx], iChi
1f799 6c 64 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 ld);.. }..
1f79a 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 ptr = &data[end
1f79b 5d 3b 0d 0a 20 20 20 20 65 6e 64 50 74 72 20 3d ];.. endPtr =
1f79c 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0d 0a 20 20 &data[ins];..
1f79d 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 assert( (SQLIT
1f79e 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 E_PTR_TO_INT(ptr
1f79f 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 )&1)==0 ); /* p
1f7a0 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 tr is always 2-b
1f7a1 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0d 0a yte aligned */..
1f7a2 20 20 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 while( ptr>e
1f7a3 6e 64 50 74 72 20 29 7b 0d 0a 20 20 20 20 20 20 ndPtr ){..
1f7a4 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 *(u16*)ptr = *(u
1f7a5 31 36 2a 29 26 70 74 72 5b 2d 32 5d 3b 0d 0a 20 16*)&ptr[-2];..
1f7a6 20 20 20 20 20 70 74 72 20 2d 3d 20 32 3b 0d 0a ptr -= 2;..
1f7a7 20 20 20 20 7d 0d 0a 20 20 20 20 70 75 74 32 62 }.. put2b
1f7a8 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 yte(&data[ins],
1f7a9 69 64 78 29 3b 0d 0a 20 20 20 20 70 75 74 32 62 idx);.. put2b
1f7aa 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d yte(&data[pPage-
1f7ab 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 >hdrOffset+3], p
1f7ac 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0d 0a 23 Page->nCell);..#
1f7ad 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
1f7ae 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 IT_AUTOVACUUM..
1f7af 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 if( pPage->pB
1f7b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b t->autoVacuum ){
1f7b1 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 .. /* The c
1f7b2 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 ell may contain
1f7b3 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 a pointer to an
1f7b4 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 overflow page. I
1f7b5 66 20 73 6f 2c 20 77 72 69 74 65 0d 0a 20 20 20 f so, write..
1f7b6 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 ** the entry
1f7b7 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 for the overflow
1f7b8 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 page into the p
1f7b9 6f 69 6e 74 65 72 20 6d 61 70 2e 0d 0a 20 20 20 ointer map...
1f7ba 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 70 74 72 */.. ptr
1f7bb 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 mapPutOvflPtr(pP
1f7bc 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 age, pCell, pRC)
1f7bd 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 ;.. }..#endif
1f7be 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a .. }..}..../*..
1f7bf 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 ** Add a list of
1f7c0 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 cells to a page
1f7c1 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 . The page shou
1f7c2 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 ld be initially
1f7c3 65 6d 70 74 79 2e 0d 0a 2a 2a 20 54 68 65 20 63 empty...** The c
1f7c4 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 ells are guarant
1f7c5 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 eed to fit on th
1f7c6 65 20 70 61 67 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 e page...*/..sta
1f7c7 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c tic void assembl
1f7c8 65 50 61 67 65 28 0d 0a 20 20 4d 65 6d 50 61 67 ePage(.. MemPag
1f7c9 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 e *pPage, /* T
1f7ca 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 he page to be as
1f7cb 73 65 6d 62 6c 69 65 64 20 2a 2f 0d 0a 20 20 69 semblied */.. i
1f7cc 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 nt nCell,
1f7cd 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f /* The number o
1f7ce 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 f cells to add t
1f7cf 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0d 0a o this page */..
1f7d0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 u8 **apCell,
1f7d1 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 /* Pointers
1f7d2 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a to cell bodies *
1f7d3 2f 0d 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 /.. u16 *aSize
1f7d4 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 /* Sizes
1f7d5 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0d of the cells */.
1f7d6 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 .){.. int i;
1f7d7 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 /* Loop
1f7d8 20 63 6f 75 6e 74 65 72 20 2a 2f 0d 0a 20 20 75 counter */.. u
1f7d9 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 8 *pCellptr;
1f7da 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e /* Address of n
1f7db 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 ext cell pointer
1f7dc 20 2a 2f 0d 0a 20 20 69 6e 74 20 63 65 6c 6c 62 */.. int cellb
1f7dd 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 ody; /* Addr
1f7de 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c ess of next cell
1f7df 20 62 6f 64 79 20 2a 2f 0d 0a 20 20 75 38 20 2a body */.. u8 *
1f7e0 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 const data = pP
1f7e1 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 age->aData;
1f7e2 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
1f7e3 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 er to data for p
1f7e4 50 61 67 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 Page */.. const
1f7e5 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 int hdr = pPage
1f7e6 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 ->hdrOffset;
1f7e7 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 /* Offset
1f7e8 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 of header on pP
1f7e9 61 67 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 age */.. const
1f7ea 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 int nUsable = pP
1f7eb 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 age->pBt->usable
1f7ec 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 Size; /* Usable
1f7ed 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0d size of page */.
1f7ee 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ... assert( pPa
1f7ef 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 ge->nOverflow==0
1f7f0 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
1f7f1 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1f7f2 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 d(pPage->pBt->mu
1f7f3 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
1f7f4 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e t( nCell>=0 && n
1f7f5 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 Cell<=(int)MX_CE
1f7f6 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0d 0a LL(pPage->pBt)..
1f7f7 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 && (
1f7f8 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 int)MX_CELL(pPag
1f7f9 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b e->pBt)<=10921);
1f7fa 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
1f7fb 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 te3PagerIswritea
1f7fc 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 ble(pPage->pDbPa
1f7fd 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 ge) );.... /* C
1f7fe 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 heck that the pa
1f7ff 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e ge has just been
1f800 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 zeroed by zeroP
1f801 61 67 65 28 29 20 2a 2f 0d 0a 20 20 61 73 73 65 age() */.. asse
1f802 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c rt( pPage->nCell
1f803 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 ==0 );.. assert
1f804 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 ( get2byteNotZer
1f805 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d o(&data[hdr+5])=
1f806 3d 6e 55 73 61 62 6c 65 20 29 3b 0d 0a 0d 0a 20 =nUsable );....
1f807 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 pCellptr = &pPa
1f808 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 ge->aCellIdx[nCe
1f809 6c 6c 2a 32 5d 3b 0d 0a 20 20 63 65 6c 6c 62 6f ll*2];.. cellbo
1f80a 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0d 0a 20 dy = nUsable;..
1f80b 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 for(i=nCell-1;
1f80c 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 i>=0; i--){..
1f80d 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b u16 sz = aSize[
1f80e 69 5d 3b 0d 0a 20 20 20 20 70 43 65 6c 6c 70 74 i];.. pCellpt
1f80f 72 20 2d 3d 20 32 3b 0d 0a 20 20 20 20 63 65 6c r -= 2;.. cel
1f810 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0d 0a 20 20 lbody -= sz;..
1f811 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c put2byte(pCell
1f812 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0d ptr, cellbody);.
1f813 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 . memcpy(&dat
1f814 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 a[cellbody], apC
1f815 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0d 0a 20 20 ell[i], sz);..
1f816 7d 0d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 }.. put2byte(&d
1f817 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c ata[hdr+3], nCel
1f818 6c 29 3b 0d 0a 20 20 70 75 74 32 62 79 74 65 28 l);.. put2byte(
1f819 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 &data[hdr+5], ce
1f81a 6c 6c 62 6f 64 79 29 3b 0d 0a 20 20 70 50 61 67 llbody);.. pPag
1f81b 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 e->nFree -= (nCe
1f81c 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d ll*2 + nUsable -
1f81d 20 63 65 6c 6c 62 6f 64 79 29 3b 0d 0a 20 20 70 cellbody);.. p
1f81e 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 Page->nCell = (u
1f81f 31 36 29 6e 43 65 6c 6c 3b 0d 0a 7d 0d 0a 0d 0a 16)nCell;..}....
1f820 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f /*..** The follo
1f821 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 wing parameters
1f822 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 determine how ma
1f823 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 ny adjacent page
1f824 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0d 0a s get involved..
1f825 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e ** in a balancin
1f826 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e g operation. NN
1f827 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f is the number o
1f828 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 f neighbors on e
1f829 69 74 68 65 72 20 73 69 64 65 0d 0a 2a 2a 20 6f ither side..** o
1f82a 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 f the page that
1f82b 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 participate in t
1f82c 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 he balancing ope
1f82d 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 ration. NB is t
1f82e 68 65 0d 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d he..** total num
1f82f 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 ber of pages tha
1f830 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 t participate, i
1f831 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 ncluding the tar
1f832 67 65 74 20 70 61 67 65 20 61 6e 64 0d 0a 2a 2a get page and..**
1f833 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e NN neighbors on
1f834 20 65 69 74 68 65 72 20 73 69 64 65 2e 0d 0a 2a either side...*
1f835 2a 0d 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 *..** The minimu
1f836 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 m value of NN is
1f837 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 1 (of course).
1f838 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 Increasing NN a
1f839 62 6f 76 65 20 31 0d 0a 2a 2a 20 28 74 6f 20 32 bove 1..** (to 2
1f83a 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d or 3) gives a m
1f83b 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e odest improvemen
1f83c 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 t in SELECT and
1f83d 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e DELETE performan
1f83e 63 65 0d 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e ce..** in exchan
1f83f 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 ge for a larger
1f840 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 degradation in I
1f841 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 NSERT and UPDATE
1f842 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0d 0a 2a performance...*
1f843 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e * The value of N
1f844 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 N appears to giv
1f845 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c e the best resul
1f846 74 73 20 6f 76 65 72 61 6c 6c 2e 0d 0a 2a 2f 0d ts overall...*/.
1f847 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 .#define NN 1
1f848 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1f849 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 ber of neighbors
1f84a 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 on either side
1f84b 6f 66 20 70 50 61 67 65 20 2a 2f 0d 0a 23 64 65 of pPage */..#de
1f84c 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 fine NB (NN*2+1)
1f84d 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 /* Total p
1f84e 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e ages involved in
1f84f 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0d the balance */.
1f850 0a 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c .....#ifndef SQL
1f851 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 ITE_OMIT_QUICKBA
1f852 4c 41 4e 43 45 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 LANCE../*..** Th
1f853 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 is version of ba
1f854 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 lance() handles
1f855 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 the common speci
1f856 61 6c 20 63 61 73 65 20 77 68 65 72 65 0d 0a 2a al case where..*
1f857 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 * a new entry is
1f858 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 being inserted
1f859 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 on the extreme r
1f85a 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0d ight-end of the.
1f85b 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 .** tree, in oth
1f85c 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 er words, when t
1f85d 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c he new entry wil
1f85e 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 l become the lar
1f85f 67 65 73 74 0d 0a 2a 2a 20 65 6e 74 72 79 20 69 gest..** entry i
1f860 6e 20 74 68 65 20 74 72 65 65 2e 0d 0a 2a 2a 0d n the tree...**.
1f861 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 .** Instead of t
1f862 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 rying to balance
1f863 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 the 3 right-mos
1f864 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 t leaf pages, ju
1f865 73 74 20 61 64 64 0d 0a 2a 2a 20 61 20 6e 65 77 st add..** a new
1f866 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 page to the rig
1f867 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 ht-hand side and
1f868 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 put the one new
1f869 20 65 6e 74 72 79 20 69 6e 0d 0a 2a 2a 20 74 68 entry in..** th
1f86a 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c at page. This l
1f86b 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 eaves the right
1f86c 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 side of the tree
1f86d 20 73 6f 6d 65 77 68 61 74 0d 0a 2a 2a 20 75 6e somewhat..** un
1f86e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f balanced. But o
1f86f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 dds are that we
1f870 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e will be insertin
1f871 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0d 0a 2a g new entries..*
1f872 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f * at the end soo
1f873 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 n afterwards so
1f874 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 the nearly empty
1f875 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b page will quick
1f876 6c 79 0d 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 ly..** fill up.
1f877 20 4f 6e 20 61 76 65 72 61 67 65 2e 0d 0a 2a 2a On average...**
1f878 0d 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 ..** pPage is th
1f879 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 e leaf page whic
1f87a 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d h is the right-m
1f87b 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 ost page in the
1f87c 74 72 65 65 2e 0d 0a 2a 2a 20 70 50 61 72 65 6e tree...** pParen
1f87d 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e t is its parent.
1f87e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 pPage must hav
1f87f 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 e a single overf
1f880 6c 6f 77 20 65 6e 74 72 79 0d 0a 2a 2a 20 77 68 low entry..** wh
1f881 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 ich is also the
1f882 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 right-most entry
1f883 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0d 0a 2a on the page...*
1f884 2a 0d 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 *..** The pSpace
1f885 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 buffer is used
1f886 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f to store a tempo
1f887 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 rary copy of the
1f888 20 64 69 76 69 64 65 72 0d 0a 2a 2a 20 63 65 6c divider..** cel
1f889 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 l that will be i
1f88a 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 nserted into pPa
1f88b 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c rent. Such a cel
1f88c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 l consists of a
1f88d 34 0d 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 4..** byte page
1f88e 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 number followed
1f88f 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 by a variable le
1f890 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e ngth integer. In
1f891 20 6f 74 68 65 72 0d 0a 2a 2a 20 77 6f 72 64 73 other..** words
1f892 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 , at most 13 byt
1f893 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 es. Hence the pS
1f894 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 pace buffer must
1f895 20 62 65 20 61 74 0d 0a 2a 2a 20 6c 65 61 73 74 be at..** least
1f896 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 13 bytes in siz
1f897 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 e...*/..static i
1f898 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b nt balance_quick
1f899 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e (MemPage *pParen
1f89a 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 t, MemPage *pPag
1f89b 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0d e, u8 *pSpace){.
1f89c 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e . BtShared *con
1f89d 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e st pBt = pPage->
1f89e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 pBt; /* B-Tre
1f89f 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0d 0a 20 e Database */..
1f8a0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 MemPage *pNew;
1f8a1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f8a2 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 /* Newly a
1f8a3 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f llocated page */
1f8a4 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 .. int rc;
1f8a5 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f8a6 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
1f8a7 72 6e 20 43 6f 64 65 20 2a 2f 0d 0a 20 20 50 67 rn Code */.. Pg
1f8a8 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 no pgnoNew;
1f8a9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f8aa 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 /* Page numbe
1f8ab 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0d 0a 0d 0a r of pNew */....
1f8ac 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1f8ad 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 3_mutex_held(pPa
1f8ae 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 ge->pBt->mutex)
1f8af 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 );.. assert( sq
1f8b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 lite3PagerIswrit
1f8b1 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 eable(pParent->p
1f8b2 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 20 61 73 DbPage) );.. as
1f8b3 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 sert( pPage->nOv
1f8b4 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0d 0a 0d 0a erflow==1 );....
1f8b5 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 /* This error
1f8b6 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 condition is now
1f8b7 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f caught prior to
1f8b8 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 reaching this f
1f8b9 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 66 unction */.. if
1f8ba 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d ( pPage->nCell<=
1f8bb 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 0 ) return SQLIT
1f8bc 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d E_CORRUPT_BKPT;.
1f8bd 0a 0d 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 ... /* Allocate
1f8be 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 a new page. Thi
1f8bf 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f s page will beco
1f8c0 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 me the right-sib
1f8c1 6c 69 6e 67 20 6f 66 20 0d 0a 20 20 2a 2a 20 70 ling of .. ** p
1f8c2 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 Page. Make the p
1f8c3 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 arent page writa
1f8c4 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 ble, so that the
1f8c5 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c new divider cel
1f8c6 6c 0d 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 l.. ** may be i
1f8c7 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 nserted. If both
1f8c8 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e these operation
1f8c9 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c s are successful
1f8ca 2c 20 70 72 6f 63 65 65 64 2e 0d 0a 20 20 2a 2f , proceed... */
1f8cb 0d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 .. rc = allocat
1f8cc 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 eBtreePage(pBt,
1f8cd 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c &pNew, &pgnoNew,
1f8ce 20 30 2c 20 30 29 3b 0d 0a 0d 0a 20 20 69 66 28 0, 0);.... if(
1f8cf 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1f8d0 7b 0d 0a 0d 0a 20 20 20 20 75 38 20 2a 70 4f 75 {.... u8 *pOu
1f8d1 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0d t = &pSpace[4];.
1f8d2 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d . u8 *pCell =
1f8d3 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d pPage->aOvfl[0]
1f8d4 2e 70 43 65 6c 6c 3b 0d 0a 20 20 20 20 75 31 36 .pCell;.. u16
1f8d5 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 szCell = cellSi
1f8d6 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 zePtr(pPage, pCe
1f8d7 6c 6c 29 3b 0d 0a 20 20 20 20 75 38 20 2a 70 53 ll);.. u8 *pS
1f8d8 74 6f 70 3b 0d 0a 0d 0a 20 20 20 20 61 73 73 65 top;.... asse
1f8d9 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 rt( sqlite3Pager
1f8da 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 Iswriteable(pNew
1f8db 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0d 0a 20 ->pDbPage) );..
1f8dc 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 assert( pPage
1f8dd 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 ->aData[0]==(PTF
1f8de 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 _INTKEY|PTF_LEAF
1f8df 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 DATA|PTF_LEAF) )
1f8e0 3b 0d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 ;.. zeroPage(
1f8e1 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 pNew, PTF_INTKEY
1f8e2 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 |PTF_LEAFDATA|PT
1f8e3 46 5f 4c 45 41 46 29 3b 0d 0a 20 20 20 20 61 73 F_LEAF);.. as
1f8e4 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c semblePage(pNew,
1f8e5 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 1, &pCell, &szC
1f8e6 65 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 ell);.... /*
1f8e7 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 If this is an au
1f8e8 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 to-vacuum databa
1f8e9 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 se, update the p
1f8ea 6f 69 6e 74 65 72 20 6d 61 70 0d 0a 20 20 20 20 ointer map..
1f8eb 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 ** with entries
1f8ec 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 for the new page
1f8ed 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 , and any pointe
1f8ee 72 20 66 72 6f 6d 20 74 68 65 20 0d 0a 20 20 20 r from the ..
1f8ef 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 ** cell on the
1f8f0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 page to an overf
1f8f1 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 low page. If eit
1f8f2 68 65 72 20 6f 66 20 74 68 65 73 65 0d 0a 20 20 her of these..
1f8f3 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 ** operations
1f8f4 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 fails, the retur
1f8f5 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 n code is set, b
1f8f6 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0d ut the contents.
1f8f7 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 . ** of the p
1f8f8 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 arent page are s
1f8f9 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 till manipulated
1f8fa 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c by thh code bel
1f8fb 6f 77 2e 0d 0a 20 20 20 20 2a 2a 20 54 68 61 74 ow... ** That
1f8fc 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 is Ok, at this
1f8fd 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 point the parent
1f8fe 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 page is guarant
1f8ff 65 65 64 20 74 6f 0d 0a 20 20 20 20 2a 2a 20 62 eed to.. ** b
1f900 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 e marked as dirt
1f901 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 y. Returning an
1f902 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 error code will
1f903 63 61 75 73 65 20 61 0d 0a 20 20 20 20 2a 2a 20 cause a.. **
1f904 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e rollback, undoin
1f905 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 g any changes ma
1f906 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 de to the parent
1f907 20 70 61 67 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a page... */..
1f908 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 if( ISAUTOVA
1f909 43 55 55 4d 20 29 7b 0d 0a 20 20 20 20 20 20 70 CUUM ){.. p
1f90a 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 trmapPut(pBt, pg
1f90b 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 noNew, PTRMAP_BT
1f90c 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 REE, pParent->pg
1f90d 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 20 no, &rc);..
1f90e 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 if( szCell>pNew
1f90f 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0d 0a 20 ->minLocal ){..
1f910 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 ptrmapPut
1f911 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 OvflPtr(pNew, pC
1f912 65 6c 6c 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 ell, &rc);..
1f913 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 0d 0a }.. }.. ..
1f914 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 /* Create a
1f915 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 divider cell to
1f916 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 insert into pPar
1f917 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 ent. The divider
1f918 20 63 65 6c 6c 0d 0a 20 20 20 20 2a 2a 20 63 6f cell.. ** co
1f919 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 nsists of a 4-by
1f91a 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 te page number (
1f91b 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 the page number
1f91c 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0d 0a 20 of pPage) and..
1f91d 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 ** a variable
1f91e 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 length key valu
1f91f 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 e (which must be
1f920 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 the same value
1f921 61 73 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 6c as the.. ** l
1f922 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 argest key on pP
1f923 61 67 65 29 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 age)... **..
1f924 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 ** To find th
1f925 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 e largest key va
1f926 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 lue on pPage, fi
1f927 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 rst find the rig
1f928 68 74 2d 6d 6f 73 74 20 0d 0a 20 20 20 20 2a 2a ht-most .. **
1f929 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 cell on pPage.
1f92a 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 The first two fi
1f92b 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c elds of this cel
1f92c 6c 20 61 72 65 20 74 68 65 20 0d 0a 20 20 20 20 l are the ..
1f92d 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 ** record-length
1f92e 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e (a variable len
1f92f 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d gth integer at m
1f930 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 ost 32-bits in s
1f931 69 7a 65 29 0d 0a 20 20 20 20 2a 2a 20 61 6e 64 ize).. ** and
1f932 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 the key value (
1f933 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 a variable lengt
1f934 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 h integer, may h
1f935 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0d ave any value)..
1f936 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 . ** The firs
1f937 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e t of the while(.
1f938 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 ..) loops below
1f939 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 skips over the r
1f93a 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0d 0a 20 20 ecord-length..
1f93b 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 ** field. The
1f93c 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e second while(...
1f93d 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 ) loop copies th
1f93e 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d e key value from
1f93f 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 63 65 6c the.. ** cel
1f940 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 l on pPage into
1f941 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 the pSpace buffe
1f942 72 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 r... */..
1f943 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c pCell = findCell
1f944 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e (pPage, pPage->n
1f945 43 65 6c 6c 2d 31 29 3b 0d 0a 20 20 20 20 70 53 Cell-1);.. pS
1f946 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b top = &pCell[9];
1f947 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 .. while( (*(
1f948 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 pCell++)&0x80) &
1f949 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b & pCell<pStop );
1f94a 0d 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 .. pStop = &p
1f94b 43 65 6c 6c 5b 39 5d 3b 0d 0a 20 20 20 20 77 68 Cell[9];.. wh
1f94c 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 ile( ((*(pOut++)
1f94d 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 = *(pCell++))&0
1f94e 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 x80) && pCell<pS
1f94f 74 6f 70 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a top );.... /*
1f950 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 Insert the new
1f951 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 divider cell int
1f952 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0d 0a 20 o pParent. */..
1f953 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 insertCell(pP
1f954 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e arent, pParent->
1f955 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 nCell, pSpace, (
1f956 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 int)(pOut-pSpace
1f957 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ),..
1f958 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 0, pPage->pgn
1f959 6f 2c 20 26 72 63 29 3b 0d 0a 0d 0a 20 20 20 20 o, &rc);....
1f95a 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 /* Set the right
1f95b 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f -child pointer o
1f95c 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 f pParent to poi
1f95d 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 nt to the new pa
1f95e 67 65 2e 20 2a 2f 0d 0a 20 20 20 20 70 75 74 34 ge. */.. put4
1f95f 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 byte(&pParent->a
1f960 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 Data[pParent->hd
1f961 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f rOffset+8], pgno
1f962 4e 65 77 29 3b 0d 0a 20 20 0d 0a 20 20 20 20 2f New);.. .. /
1f963 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 * Release the re
1f964 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e ference to the n
1f965 65 77 20 70 61 67 65 2e 20 2a 2f 0d 0a 20 20 20 ew page. */..
1f966 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 releasePage(pNe
1f967 77 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 w);.. }.... re
1f968 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 23 65 6e turn rc;..}..#en
1f969 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d dif /* SQLITE_OM
1f96a 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 IT_QUICKBALANCE
1f96b 2a 2f 0d 0a 0d 0a 23 69 66 20 30 0d 0a 2f 2a 0d */....#if 0../*.
1f96c 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1f96d 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 n does not contr
1f96e 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 ibute anything t
1f96f 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 o the operation
1f970 6f 66 20 53 51 4c 69 74 65 2e 0d 0a 2a 2a 20 69 of SQLite...** i
1f971 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 t is sometimes a
1f972 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 ctivated tempora
1f973 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 rily while debug
1f974 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e ging code respon
1f975 73 69 62 6c 65 20 0d 0a 2a 2a 20 66 6f 72 20 73 sible ..** for s
1f976 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d etting pointer-m
1f977 61 70 20 65 6e 74 72 69 65 73 2e 0d 0a 2a 2f 0d ap entries...*/.
1f978 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d .static int ptrm
1f979 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d apCheckPages(Mem
1f97a 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 Page **apPage, i
1f97b 6e 74 20 6e 50 61 67 65 29 7b 0d 0a 20 20 69 6e nt nPage){.. in
1f97c 74 20 69 2c 20 6a 3b 0d 0a 20 20 66 6f 72 28 69 t i, j;.. for(i
1f97d 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b =0; i<nPage; i++
1f97e 29 7b 0d 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0d ){.. Pgno n;.
1f97f 0a 20 20 20 20 75 38 20 65 3b 0d 0a 20 20 20 20 . u8 e;..
1f980 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d MemPage *pPage =
1f981 20 61 70 50 61 67 65 5b 69 5d 3b 0d 0a 20 20 20 apPage[i];..
1f982 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d BtShared *pBt =
1f983 20 70 50 61 67 65 2d 3e 70 42 74 3b 0d 0a 20 20 pPage->pBt;..
1f984 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d assert( pPage-
1f985 3e 69 73 49 6e 69 74 20 29 3b 0d 0a 0d 0a 20 20 >isInit );....
1f986 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 for(j=0; j<pPa
1f987 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b ge->nCell; j++){
1f988 0d 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f .. CellInfo
1f989 20 69 6e 66 6f 3b 0d 0a 20 20 20 20 20 20 75 38 info;.. u8
1f98a 20 2a 7a 3b 0d 0a 20 20 20 20 20 0d 0a 20 20 20 *z;.. ..
1f98b 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 z = findCell(
1f98c 70 50 61 67 65 2c 20 6a 29 3b 0d 0a 20 20 20 20 pPage, j);..
1f98d 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c btreeParseCell
1f98e 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 Ptr(pPage, z, &i
1f98f 6e 66 6f 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 nfo);.. if(
1f990 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 info.iOverflow
1f991 29 7b 0d 0a 20 20 20 20 20 20 20 20 50 67 6e 6f ){.. Pgno
1f992 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 ovfl = get4byte
1f993 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c (&z[info.iOverfl
1f994 6f 77 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 ow]);.. p
1f995 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 trmapGet(pBt, ov
1f996 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0d 0a 20 20 fl, &e, &n);..
1f997 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d assert( n=
1f998 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 =pPage->pgno &&
1f999 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c e==PTRMAP_OVERFL
1f99a 4f 57 31 20 29 3b 0d 0a 20 20 20 20 20 20 7d 0d OW1 );.. }.
1f99b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 . if( !pPag
1f99c 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 20 20 e->leaf ){..
1f99d 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d Pgno child =
1f99e 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0d 0a 20 get4byte(z);..
1f99f 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 ptrmapGet
1f9a0 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c (pBt, child, &e,
1f9a1 20 26 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 &n);.. a
1f9a2 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d ssert( n==pPage-
1f9a3 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d >pgno && e==PTRM
1f9a4 41 50 5f 42 54 52 45 45 20 29 3b 0d 0a 20 20 20 AP_BTREE );..
1f9a5 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 }.. }..
1f9a6 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 if( !pPage->lea
1f9a7 66 20 29 7b 0d 0a 20 20 20 20 20 20 50 67 6e 6f f ){.. Pgno
1f9a8 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 child = get4byt
1f9a9 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b e(&pPage->aData[
1f9aa 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 pPage->hdrOffset
1f9ab 2b 38 5d 29 3b 0d 0a 20 20 20 20 20 20 70 74 72 +8]);.. ptr
1f9ac 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c mapGet(pBt, chil
1f9ad 64 2c 20 26 65 2c 20 26 6e 29 3b 0d 0a 20 20 20 d, &e, &n);..
1f9ae 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 assert( n==pP
1f9af 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d age->pgno && e==
1f9b0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0d PTRMAP_BTREE );.
1f9b1 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 . }.. }.. r
1f9b2 65 74 75 72 6e 20 31 3b 0d 0a 7d 0d 0a 23 65 6e eturn 1;..}..#en
1f9b3 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 dif..../*..** Th
1f9b4 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 is function is u
1f9b5 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 sed to copy the
1f9b6 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
1f9b7 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 b-tree node stor
1f9b8 65 64 20 0d 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 ed ..** on page
1f9b9 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 pFrom to page pT
1f9ba 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d o. If page pFrom
1f9bb 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 was not a leaf
1f9bc 70 61 67 65 2c 20 74 68 65 6e 0d 0a 2a 2a 20 74 page, then..** t
1f9bd 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 he pointer-map e
1f9be 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 ntries for each
1f9bf 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 child page are u
1f9c0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 pdated so that t
1f9c1 68 65 0d 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 he..** parent pa
1f9c2 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 ge stored in the
1f9c3 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 pointer map is
1f9c4 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 page pTo. If pFr
1f9c5 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0d 0a 2a 2a om contained..**
1f9c6 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 any cells with
1f9c7 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f overflow page po
1f9c8 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 inters, then the
1f9c9 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 corresponding p
1f9ca 6f 69 6e 74 65 72 0d 0a 2a 2a 20 6d 61 70 20 65 ointer..** map e
1f9cb 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 ntries are also
1f9cc 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 updated so that
1f9cd 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 the parent page
1f9ce 69 73 20 70 61 67 65 20 70 54 6f 2e 0d 0a 2a 2a is page pTo...**
1f9cf 0d 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 ..** If pFrom is
1f9d0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 currently carry
1f9d1 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 ing any overflow
1f9d2 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 cells (entries
1f9d3 69 6e 20 74 68 65 0d 0a 2a 2a 20 4d 65 6d 50 61 in the..** MemPa
1f9d4 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 ge.aOvfl[] array
1f9d5 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 ), they are not
1f9d6 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0d copied to pTo. .
1f9d7 0a 2a 2a 0d 0a 2a 2a 20 42 65 66 6f 72 65 20 72 .**..** Before r
1f9d8 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 eturning, page p
1f9d9 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 To is reinitiali
1f9da 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 zed using btreeI
1f9db 6e 69 74 50 61 67 65 28 29 2e 0d 0a 2a 2a 0d 0a nitPage()...**..
1f9dc 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e ** The performan
1f9dd 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 ce of this funct
1f9de 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 ion is not criti
1f9df 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 cal. It is only
1f9e0 75 73 65 64 20 62 79 20 0d 0a 2a 2a 20 74 68 65 used by ..** the
1f9e1 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 balance_shallow
1f9e2 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 er() and balance
1f9e3 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 _deeper() proced
1f9e4 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 ures, neither of
1f9e5 0d 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 ..** which are c
1f9e6 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 alled often unde
1f9e7 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 r normal circums
1f9e8 74 61 6e 63 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 tances...*/..sta
1f9e9 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 tic void copyNod
1f9ea 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 eContent(MemPage
1f9eb 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 *pFrom, MemPage
1f9ec 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 *pTo, int *pRC)
1f9ed 7b 0d 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d {.. if( (*pRC)=
1f9ee 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
1f9ef 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f BtShared * co
1f9f0 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d nst pBt = pFrom-
1f9f1 3e 70 42 74 3b 0d 0a 20 20 20 20 75 38 20 2a 20 >pBt;.. u8 *
1f9f2 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 const aFrom = pF
1f9f3 72 6f 6d 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 20 rom->aData;..
1f9f4 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 u8 * const aTo
1f9f5 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0d 0a 20 = pTo->aData;..
1f9f6 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 int const iFr
1f9f7 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 omHdr = pFrom->h
1f9f8 64 72 4f 66 66 73 65 74 3b 0d 0a 20 20 20 20 69 drOffset;.. i
1f9f9 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 nt const iToHdr
1f9fa 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 = ((pTo->pgno==1
1f9fb 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0d 0a 20 ) ? 100 : 0);..
1f9fc 20 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 20 int rc;..
1f9fd 69 6e 74 20 69 44 61 74 61 3b 0d 0a 20 20 0d 0a int iData;.. ..
1f9fe 20 20 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
1f9ff 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b pFrom->isInit );
1fa00 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 .. assert( pF
1fa01 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 rom->nFree>=iToH
1fa02 64 72 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 dr );.. asser
1fa03 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72 t( get2byte(&aFr
1fa04 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 om[iFromHdr+5])
1fa05 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 <= (int)pBt->usa
1fa06 62 6c 65 53 69 7a 65 20 29 3b 0d 0a 20 20 0d 0a bleSize );.. ..
1fa07 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 /* Copy the
1fa08 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 b-tree node cont
1fa09 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 ent from page pF
1fa0a 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e rom to page pTo.
1fa0b 20 2a 2f 0d 0a 20 20 20 20 69 44 61 74 61 20 3d */.. iData =
1fa0c 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d get2byte(&aFrom
1fa0d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0d 0a [iFromHdr+5]);..
1fa0e 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b memcpy(&aTo[
1fa0f 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 iData], &aFrom[i
1fa10 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 Data], pBt->usab
1fa11 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0d 0a leSize-iData);..
1fa12 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b memcpy(&aTo[
1fa13 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b iToHdr], &aFrom[
1fa14 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d iFromHdr], pFrom
1fa15 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 ->cellOffset + 2
1fa16 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0d *pFrom->nCell);.
1fa17 0a 20 20 0d 0a 20 20 20 20 2f 2a 20 52 65 69 6e . .. /* Rein
1fa18 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 itialize page pT
1fa19 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f o so that the co
1fa1a 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 ntents of the Me
1fa1b 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0d mPage structure.
1fa1c 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 . ** match th
1fa1d 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 e new data. The
1fa1e 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f initialization o
1fa1f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c f pTo can actual
1fa20 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0d 0a 20 ly fail under..
1fa21 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 ** fairly obs
1fa22 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 cure circumstanc
1fa23 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 es, even though
1fa24 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 it is a copy of
1fa25 69 6e 69 74 69 61 6c 69 7a 65 64 20 0d 0a 20 20 initialized ..
1fa26 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e ** page pFrom.
1fa27 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 70 54 .. */.. pT
1fa28 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0d 0a o->isInit = 0;..
1fa29 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e rc = btreeIn
1fa2a 69 74 50 61 67 65 28 70 54 6f 29 3b 0d 0a 20 20 itPage(pTo);..
1fa2b 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
1fa2c 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 _OK ){.. *p
1fa2d 52 43 20 3d 20 72 63 3b 0d 0a 20 20 20 20 20 20 RC = rc;..
1fa2e 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 7d 0d 0a return;.. }..
1fa2f 20 20 0d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 .. /* If th
1fa30 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 is is an auto-va
1fa31 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 cuum database, u
1fa32 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 pdate the pointe
1fa33 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0d 0a 20 r-map entries..
1fa34 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d ** for any b-
1fa35 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 tree or overflow
1fa36 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 pages that pTo
1fa37 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 now contains the
1fa38 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0d 0a 20 pointers to...
1fa39 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 49 */.. if( I
1fa3a 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0d 0a SAUTOVACUUM ){..
1fa3b 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 *pRC = set
1fa3c 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f ChildPtrmaps(pTo
1fa3d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a );.. }.. }..
1fa3e 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 }..../*..** This
1fa3f 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 routine redistr
1fa40 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 ibutes cells on
1fa41 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 the iParentIdx't
1fa42 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 h child of pPare
1fa43 6e 74 0d 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 nt..** (hereafte
1fa44 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e r "the page") an
1fa45 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e d up to 2 siblin
1fa46 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 gs so that all p
1fa47 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 ages have about
1fa48 74 68 65 0d 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f the..** same amo
1fa49 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 unt of free spac
1fa4a 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e e. Usually a sin
1fa4b 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 gle sibling on e
1fa4c 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 ither side of th
1fa4d 65 0d 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 e..** page are u
1fa4e 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e sed in the balan
1fa4f 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 cing, though bot
1fa50 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 h siblings might
1fa51 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0d 0a come from one..
1fa52 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 ** side if the p
1fa53 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 age is the first
1fa54 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f or last child o
1fa55 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 f its parent. If
1fa56 20 74 68 65 20 70 61 67 65 20 0d 0a 2a 2a 20 68 the page ..** h
1fa57 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 as fewer than 2
1fa58 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 siblings (someth
1fa59 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e ing which can on
1fa5a 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 ly happen if the
1fa5b 20 70 61 67 65 0d 0a 2a 2a 20 69 73 20 61 20 72 page..** is a r
1fa5c 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 oot page or a ch
1fa5d 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 ild of a root pa
1fa5e 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 ge) then all ava
1fa5f 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0d ilable siblings.
1fa60 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 .** participate
1fa61 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 in the balancing
1fa62 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 6e 75 ...**..** The nu
1fa63 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 mber of siblings
1fa64 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 of the page mig
1fa65 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 ht be increased
1fa66 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 or decreased by
1fa67 0d 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 ..** one or two
1fa68 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 in an effort to
1fa69 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c keep pages nearl
1fa6a 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f y full but not o
1fa6b 76 65 72 20 66 75 6c 6c 2e 20 0d 0a 2a 2a 0d 0a ver full. ..**..
1fa6c 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 ** Note that whe
1fa6d 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 n this routine i
1fa6e 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f s called, some o
1fa6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 f the cells on t
1fa70 68 65 20 70 61 67 65 0d 0a 2a 2a 20 6d 69 67 68 he page..** migh
1fa71 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 t not actually b
1fa72 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 e stored in MemP
1fa73 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 age.aData[]. Thi
1fa74 73 20 63 61 6e 20 68 61 70 70 65 6e 0d 0a 2a 2a s can happen..**
1fa75 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 if the page is
1fa76 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 overfull. This r
1fa77 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 outine ensures t
1fa78 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c hat all cells al
1fa79 6c 6f 63 61 74 65 64 0d 0a 2a 2a 20 74 6f 20 74 located..** to t
1fa7a 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 he page and its
1fa7b 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 siblings fit int
1fa7c 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b o MemPage.aData[
1fa7d 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 ] before returni
1fa7e 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 20 74 ng...**..** In t
1fa7f 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c he course of bal
1fa80 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 ancing the page
1fa81 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 and its siblings
1fa82 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0d 0a , cells may be..
1fa83 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f ** inserted into
1fa84 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d or removed from
1fa85 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 the parent page
1fa86 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e (pParent). Doin
1fa87 67 20 73 6f 0d 0a 2a 2a 20 6d 61 79 20 63 61 75 g so..** may cau
1fa88 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 se the parent pa
1fa89 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 ge to become ove
1fa8a 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 rfull or underfu
1fa8b 6c 6c 2e 20 49 66 20 74 68 69 73 0d 0a 2a 2a 20 ll. If this..**
1fa8c 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 happens, it is t
1fa8d 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 he responsibilit
1fa8e 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 y of the caller
1fa8f 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f to invoke the co
1fa90 72 72 65 63 74 0d 0a 2a 2a 20 62 61 6c 61 6e 63 rrect..** balanc
1fa91 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 ing routine to f
1fa92 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 ix this problem
1fa93 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 (see the balance
1fa94 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0d 0a 2a () routine). ..*
1fa95 2a 0d 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f *..** If this ro
1fa96 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 utine fails for
1fa97 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d any reason, it m
1fa98 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 ight leave the d
1fa99 61 74 61 62 61 73 65 0d 0a 2a 2a 20 69 6e 20 61 atabase..** in a
1fa9a 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 corrupted state
1fa9b 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 . So if this rou
1fa9c 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 tine fails, the
1fa9d 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0d database should.
1fa9e 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 .** be rolled ba
1fa9f 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 ck...**..** The
1faa0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 third argument t
1faa1 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c o this function,
1faa2 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 aOvflSpace, is
1faa3 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0d 0a a pointer to a..
1faa4 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e ** buffer big en
1faa5 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 ough to hold one
1faa6 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 page. If while
1faa7 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 inserting cells
1faa8 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0d into the parent.
1faa9 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e .** page (pParen
1faaa 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 t) the parent pa
1faab 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 ge becomes overf
1faac 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 ull, this buffer
1faad 20 69 73 0d 0a 2a 2a 20 75 73 65 64 20 74 6f 20 is..** used to
1faae 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 store the parent
1faaf 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 's overflow cell
1fab0 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 s. Because this
1fab1 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 function inserts
1fab2 0d 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f ..** a maximum o
1fab3 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 f four divider c
1fab4 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 ells into the pa
1fab5 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 rent page, and t
1fab6 68 65 20 6d 61 78 69 6d 75 6d 0d 0a 2a 2a 20 73 he maximum..** s
1fab7 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 ize of a cell st
1fab8 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 ored within an i
1fab9 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 nternal node is
1faba 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e always less than
1fabb 20 31 2f 34 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 1/4..** of the
1fabc 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 page-size, the a
1fabd 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 OvflSpace[] buff
1fabe 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 er is guaranteed
1fabf 20 74 6f 20 62 65 20 6c 61 72 67 65 0d 0a 2a 2a to be large..**
1fac0 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 enough for all
1fac1 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0d overflow cells..
1fac2 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 4f 76 66 6c .**..** If aOvfl
1fac3 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 Space is set to
1fac4 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 a null pointer,
1fac5 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 this function re
1fac6 74 75 72 6e 73 20 0d 0a 2a 2a 20 53 51 4c 49 54 turns ..** SQLIT
1fac7 45 5f 4e 4f 4d 45 4d 2e 0d 0a 2a 2f 0d 0a 73 74 E_NOMEM...*/..st
1fac8 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 atic int balance
1fac9 5f 6e 6f 6e 72 6f 6f 74 28 0d 0a 20 20 4d 65 6d _nonroot(.. Mem
1faca 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 Page *pParent,
1facb 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1facc 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 Parent page of s
1facd 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 iblings being ba
1face 6c 61 6e 63 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 lanced */.. int
1facf 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 iParentIdx,
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1fad1 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 Index of "the pa
1fad2 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a ge" in pParent *
1fad3 2f 0d 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 /.. u8 *aOvflSp
1fad4 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ace,
1fad5 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a /* page-siz
1fad6 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 e bytes of space
1fad7 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c for parent ovfl
1fad8 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 73 52 6f 6f */.. int isRoo
1fad9 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t
1fada 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
1fadb 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 f pParent is a r
1fadc 6f 6f 74 2d 70 61 67 65 20 2a 2f 0d 0a 29 7b 0d oot-page */..){.
1fadd 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 . BtShared *pBt
1fade 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1fadf 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 /* The whole dat
1fae0 61 62 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 abase */.. int
1fae1 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 nCell = 0;
1fae2 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
1fae3 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 er of cells in a
1fae4 70 43 65 6c 6c 5b 5d 20 2a 2f 0d 0a 20 20 69 6e pCell[] */.. in
1fae5 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b t nMaxCells = 0;
1fae6 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c /* Al
1fae7 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 located size of
1fae8 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 apCell, szCell,
1fae9 61 46 72 6f 6d 2e 20 2a 2f 0d 0a 20 20 69 6e 74 aFrom. */.. int
1faea 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 nNew = 0;
1faeb 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1faec 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 ber of pages in
1faed 61 70 4e 65 77 5b 5d 20 2a 2f 0d 0a 20 20 69 6e apNew[] */.. in
1faee 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 t nOld;
1faef 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
1faf0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e mber of pages in
1faf1 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0d 0a 20 20 69 apOld[] */.. i
1faf2 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 nt i, j, k;
1faf3 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
1faf4 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0d oop counters */.
1faf5 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 . int nxDiv;
1faf6 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1faf7 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 /* Next divider
1faf8 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d slot in pParent-
1faf9 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0d 0a 20 20 69 >aCell[] */.. i
1fafa 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
1fafb 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 K; /* T
1fafc 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a he return code *
1fafd 2f 0d 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 /.. u16 leafCor
1fafe 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 rection;
1faff 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 /* 4 if pPage
1fb00 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 is a leaf. 0 if
1fb01 20 6e 6f 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6c not */.. int l
1fb02 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 eafData;
1fb03 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
1fb04 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 if pPage is a le
1fb05 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 af of a LEAFDATA
1fb06 20 74 72 65 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 tree */.. int
1fb07 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 usableSpace;
1fb08 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 /* Byte
1fb09 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e s in pPage beyon
1fb0a 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0d d the header */.
1fb0b 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 . int pageFlags
1fb0c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1fb0d 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 /* Value of pPag
1fb0e 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0d 0a e->aData[0] */..
1fb0f 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 int subtotal;
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1fb11 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 * Subtotal of by
1fb12 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 tes in cells on
1fb13 6f 6e 65 20 70 61 67 65 20 2a 2f 0d 0a 20 20 69 one page */.. i
1fb14 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 nt iSpace1 = 0;
1fb15 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
1fb16 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 irst unused byte
1fb17 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f of aSpace1[] */
1fb18 0d 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 .. int iOvflSpa
1fb19 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ce = 0;
1fb1a 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 /* First unused
1fb1b 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 byte of aOvflSp
1fb1c 61 63 65 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 ace[] */.. int
1fb1d 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 szScratch;
1fb1e 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
1fb1f 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f of scratch memo
1fb20 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0d ry requested */.
1fb21 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c . MemPage *apOl
1fb22 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 d[NB];
1fb23 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 /* pPage and up
1fb24 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 to two siblings
1fb25 2a 2f 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 */.. MemPage *a
1fb26 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 pCopy[NB];
1fb27 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f /* Private co
1fb28 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 pies of apOld[]
1fb29 70 61 67 65 73 20 2a 2f 0d 0a 20 20 4d 65 6d 50 pages */.. MemP
1fb2a 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d age *apNew[NB+2]
1fb2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 ; /* pPag
1fb2c 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 e and up to NB s
1fb2d 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 iblings after ba
1fb2e 6c 61 6e 63 69 6e 67 20 2a 2f 0d 0a 20 20 75 38 lancing */.. u8
1fb2f 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 *pRight;
1fb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
1fb31 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 cation in parent
1fb32 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e of right-siblin
1fb33 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a 20 20 g pointer */..
1fb34 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b u8 *apDiv[NB-1];
1fb35 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1fb36 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e Divider cells in
1fb37 20 70 50 61 72 65 6e 74 20 2a 2f 0d 0a 20 20 69 pParent */.. i
1fb38 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b nt cntNew[NB+2];
1fb39 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
1fb3a 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 ndex in aCell[]
1fb3b 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d of cell after i-
1fb3c 74 68 20 70 61 67 65 20 2a 2f 0d 0a 20 20 69 6e th page */.. in
1fb3d 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 t szNew[NB+2];
1fb3e 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1fb3f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 mbined size of c
1fb40 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d ells place on i-
1fb41 74 68 20 70 61 67 65 20 2a 2f 0d 0a 20 20 75 38 th page */.. u8
1fb42 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 **apCell = 0;
1fb43 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c /* Al
1fb44 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 l cells begin ba
1fb45 6c 61 6e 63 65 64 20 2a 2f 0d 0a 20 20 75 31 36 lanced */.. u16
1fb46 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 *szCell;
1fb47 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 /* Loc
1fb48 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 al size of all c
1fb49 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d ells in apCell[]
1fb4a 20 2a 2f 0d 0a 20 20 75 38 20 2a 61 53 70 61 63 */.. u8 *aSpac
1fb4b 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 e1;
1fb4c 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 /* Space for
1fb4d 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 copies of divid
1fb4e 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0d 0a 20 20 ers cells */..
1fb4f 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 Pgno pgno;
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1fb51 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 Temp var to stor
1fb52 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 e a page number
1fb53 69 6e 20 2a 2f 0d 0a 0d 0a 20 20 70 42 74 20 3d in */.... pBt =
1fb54 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0d 0a pParent->pBt;..
1fb55 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1fb56 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 3_mutex_held(pBt
1fb57 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 ->mutex) );.. a
1fb58 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 ssert( sqlite3Pa
1fb59 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 gerIswriteable(p
1fb5a 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 Parent->pDbPage)
1fb5b 20 29 3b 0d 0a 0d 0a 23 69 66 20 30 0d 0a 20 20 );....#if 0..
1fb5c 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a TRACE(("BALANCE:
1fb5d 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 begin page %d c
1fb5e 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 hild of %d\n", p
1fb5f 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 Page->pgno, pPar
1fb60 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0d 0a 23 65 ent->pgno));..#e
1fb61 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2a 20 41 74 20 ndif.... /* At
1fb62 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 this point pPare
1fb63 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d nt may have at m
1fb64 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 ost one overflow
1fb65 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0d 0a 20 cell. And if..
1fb66 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f ** this overflo
1fb67 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e w cell is presen
1fb68 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 t, it must be th
1fb69 65 20 63 65 6c 6c 20 77 69 74 68 20 0d 0a 20 20 e cell with ..
1fb6a 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 ** index iParent
1fb6b 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 Idx. This scenar
1fb6c 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 io comes about w
1fb6d 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f hen this functio
1fb6e 6e 0d 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 n.. ** is calle
1fb6f 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 d (indirectly) f
1fb70 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 rom sqlite3Btree
1fb71 44 65 6c 65 74 65 28 29 2e 0d 0a 20 20 2a 2f 0d Delete()... */.
1fb72 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 . assert( pPare
1fb73 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 nt->nOverflow==0
1fb74 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 || pParent->nOv
1fb75 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0d 0a 20 20 erflow==1 );..
1fb76 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d assert( pParent-
1fb77 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c >nOverflow==0 ||
1fb78 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b pParent->aOvfl[
1fb79 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 0].idx==iParentI
1fb7a 64 78 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 21 dx );.... if( !
1fb7b 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0d 0a 20 aOvflSpace ){..
1fb7c 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1fb7d 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 0d 0a _NOMEM;.. }....
1fb7e 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 /* Find the si
1fb7f 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 bling pages to b
1fb80 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 alance. Also loc
1fb81 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e ate the cells in
1fb82 20 70 50 61 72 65 6e 74 20 0d 0a 20 20 2a 2a 20 pParent .. **
1fb83 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 that divide the
1fb84 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 siblings. An att
1fb85 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 empt is made to
1fb86 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 find NN siblings
1fb87 20 6f 6e 20 0d 0a 20 20 2a 2a 20 65 69 74 68 65 on .. ** eithe
1fb88 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e r side of pPage.
1fb89 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 More siblings a
1fb8a 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e re taken from on
1fb8b 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c e side, however,
1fb8c 20 0d 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 .. ** if there
1fb8d 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 are fewer than
1fb8e 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 NN siblings on t
1fb8f 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 he other side. I
1fb90 66 20 70 50 61 72 65 6e 74 0d 0a 20 20 2a 2a 20 f pParent.. **
1fb91 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 has NB or fewer
1fb92 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c children then al
1fb93 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 l children of pP
1fb94 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e arent are taken.
1fb95 20 20 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 .. **.. ** T
1fb96 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 his loop also dr
1fb97 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20 ops the divider
1fb98 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 cells from the p
1fb99 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 arent page. This
1fb9a 0d 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 .. ** way, the
1fb9b 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 remainder of the
1fb9c 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e function does n
1fb9d 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 ot have to deal
1fb9e 77 69 74 68 20 61 6e 79 0d 0a 20 20 2a 2a 20 6f with any.. ** o
1fb9f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e verflow cells in
1fba0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 the parent page
1fba1 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 , since if any e
1fba2 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c xisted they will
1fba3 0d 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 .. ** have alre
1fba4 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 ady been removed
1fba5 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 20 3d 20 70 ... */.. i = p
1fba6 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f Parent->nOverflo
1fba7 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 w + pParent->nCe
1fba8 6c 6c 3b 0d 0a 20 20 69 66 28 20 69 3c 32 20 29 ll;.. if( i<2 )
1fba9 7b 0d 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 {.. nxDiv = 0
1fbaa 3b 0d 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b ;.. nOld = i+
1fbab 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 1;.. }else{..
1fbac 20 20 6e 4f 6c 64 20 3d 20 33 3b 0d 0a 20 20 20 nOld = 3;..
1fbad 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d if( iParentIdx=
1fbae 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 =0 ){
1fbaf 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 6e 78 .. nx
1fbb0 44 69 76 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 65 Div = 0;.. }e
1fbb1 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 lse if( iParentI
1fbb2 64 78 3d 3d 69 20 29 7b 0d 0a 20 20 20 20 20 20 dx==i ){..
1fbb3 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0d 0a 20 20 nxDiv = i-2;..
1fbb4 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 }else{..
1fbb5 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 nxDiv = iParentI
1fbb6 64 78 2d 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 dx-1;.. }..
1fbb7 20 20 69 20 3d 20 32 3b 0d 0a 20 20 7d 0d 0a 20 i = 2;.. }..
1fbb8 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 if( (i+nxDiv-pP
1fbb9 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 arent->nOverflow
1fbba 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c )==pParent->nCel
1fbbb 6c 20 29 7b 0d 0a 20 20 20 20 70 52 69 67 68 74 l ){.. pRight
1fbbc 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 = &pParent->aDa
1fbbd 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f ta[pParent->hdrO
1fbbe 66 66 73 65 74 2b 38 5d 3b 0d 0a 20 20 7d 65 6c ffset+8];.. }el
1fbbf 73 65 7b 0d 0a 20 20 20 20 70 52 69 67 68 74 20 se{.. pRight
1fbc0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 = findCell(pPare
1fbc1 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 nt, i+nxDiv-pPar
1fbc2 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b ent->nOverflow);
1fbc3 0d 0a 20 20 7d 0d 0a 20 20 70 67 6e 6f 20 3d 20 .. }.. pgno =
1fbc4 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 get4byte(pRight)
1fbc5 3b 0d 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b ;.. while( 1 ){
1fbc6 0d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e .. rc = getAn
1fbc7 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 dInitPage(pBt, p
1fbc8 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b gno, &apOld[i]);
1fbc9 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0d .. if( rc ){.
1fbca 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 . memset(ap
1fbcb 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 Old, 0, (i+1)*si
1fbcc 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b zeof(MemPage*));
1fbcd 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c .. goto bal
1fbce 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0d 0a 20 ance_cleanup;..
1fbcf 20 20 20 7d 0d 0a 20 20 20 20 6e 4d 61 78 43 65 }.. nMaxCe
1fbd0 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 lls += 1+apOld[i
1fbd1 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 ]->nCell+apOld[i
1fbd2 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0d 0a 20 ]->nOverflow;..
1fbd3 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 if( (i--)==0
1fbd4 29 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 ) break;....
1fbd5 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 if( i+nxDiv==pPa
1fbd6 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 rent->aOvfl[0].i
1fbd7 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e dx && pParent->n
1fbd8 4f 76 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 Overflow ){..
1fbd9 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 apDiv[i] = pP
1fbda 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e arent->aOvfl[0].
1fbdb 70 43 65 6c 6c 3b 0d 0a 20 20 20 20 20 20 70 67 pCell;.. pg
1fbdc 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 no = get4byte(ap
1fbdd 44 69 76 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 Div[i]);..
1fbde 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 szNew[i] = cellS
1fbdf 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 izePtr(pParent,
1fbe0 61 70 44 69 76 5b 69 5d 29 3b 0d 0a 20 20 20 20 apDiv[i]);..
1fbe1 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 pParent->nOver
1fbe2 66 6c 6f 77 20 3d 20 30 3b 0d 0a 20 20 20 20 7d flow = 0;.. }
1fbe3 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 70 44 else{.. apD
1fbe4 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c iv[i] = findCell
1fbe5 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 (pParent, i+nxDi
1fbe6 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 v-pParent->nOver
1fbe7 66 6c 6f 77 29 3b 0d 0a 20 20 20 20 20 20 70 67 flow);.. pg
1fbe8 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 no = get4byte(ap
1fbe9 44 69 76 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 Div[i]);..
1fbea 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 szNew[i] = cellS
1fbeb 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 izePtr(pParent,
1fbec 61 70 44 69 76 5b 69 5d 29 3b 0d 0a 0d 0a 20 20 apDiv[i]);....
1fbed 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 /* Drop the
1fbee 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 cell from the pa
1fbef 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 rent page. apDiv
1fbf0 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 [i] still points
1fbf1 20 74 6f 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 to.. ** th
1fbf2 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 e cell within th
1fbf3 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 e parent, even t
1fbf4 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 hough it has bee
1fbf5 6e 20 64 72 6f 70 70 65 64 2e 0d 0a 20 20 20 20 n dropped...
1fbf6 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 ** This is saf
1fbf7 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 e because droppi
1fbf8 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f ng a cell only o
1fbf9 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 verwrites the fi
1fbfa 72 73 74 0d 0a 20 20 20 20 20 20 2a 2a 20 66 6f rst.. ** fo
1fbfb 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 ur bytes of it,
1fbfc 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f and this functio
1fbfd 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 n does not need
1fbfe 74 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20 the first..
1fbff 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f ** four bytes o
1fc00 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 f the divider ce
1fc01 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 ll. So the point
1fc02 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 er is safe to us
1fc03 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 e.. ** late
1fc04 72 20 6f 6e 2e 20 20 0d 0a 20 20 20 20 20 20 2a r on. .. *
1fc05 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 *.. ** But
1fc06 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69 6e not if we are in
1fc07 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d secure-delete m
1fc08 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 ode. In secure-d
1fc09 65 6c 65 74 65 20 6d 6f 64 65 2c 0d 0a 20 20 20 elete mode,..
1fc0a 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 ** the dropCe
1fc0b 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c ll() routine wil
1fc0c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 l overwrite the
1fc0d 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 entire cell with
1fc0e 20 7a 65 72 6f 65 73 2e 0d 0a 20 20 20 20 20 20 zeroes...
1fc0f 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c ** In this case,
1fc10 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 temporarily cop
1fc11 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 y the cell into
1fc12 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d the aOvflSpace[]
1fc13 0d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 .. ** buffe
1fc14 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f r. It will be co
1fc15 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 pied out again a
1fc16 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 s soon as the aS
1fc17 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0d 0a 20 pace[] buffer..
1fc18 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 ** is alloc
1fc19 61 74 65 64 2e 20 20 2a 2f 0d 0a 20 20 20 20 20 ated. */..
1fc1a 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 if( pBt->btsFla
1fc1b 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f gs & BTS_SECURE_
1fc1c 44 45 4c 45 54 45 20 29 7b 0d 0a 20 20 20 20 20 DELETE ){..
1fc1d 20 20 20 69 6e 74 20 69 4f 66 66 3b 0d 0a 0d 0a int iOff;....
1fc1e 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 iOff = S
1fc1f 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 QLITE_PTR_TO_INT
1fc20 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c (apDiv[i]) - SQL
1fc21 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 ITE_PTR_TO_INT(p
1fc22 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0d Parent->aData);.
1fc23 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f . if( (iO
1fc24 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e ff+szNew[i])>(in
1fc25 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a t)pBt->usableSiz
1fc26 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 e ){..
1fc27 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 rc = SQLITE_CORR
1fc28 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 20 20 20 UPT_BKPT;..
1fc29 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c memset(apOl
1fc2a 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 d, 0, (i+1)*size
1fc2b 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0d 0a of(MemPage*));..
1fc2c 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 goto b
1fc2d 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0d alance_cleanup;.
1fc2e 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d . }else{.
1fc2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 . memcp
1fc30 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f y(&aOvflSpace[iO
1fc31 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 ff], apDiv[i], s
1fc32 7a 4e 65 77 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 zNew[i]);..
1fc33 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 apDiv[i] =
1fc34 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 &aOvflSpace[apDi
1fc35 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 v[i]-pParent->aD
1fc36 61 74 61 5d 3b 0d 0a 20 20 20 20 20 20 20 20 7d ata];.. }
1fc37 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
1fc38 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e dropCell(pParen
1fc39 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 t, i+nxDiv-pPare
1fc3a 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 nt->nOverflow, s
1fc3b 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0d 0a zNew[i], &rc);..
1fc3c 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
1fc3d 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c /* Make nMaxCell
1fc3e 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 s a multiple of
1fc3f 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 4 in order to pr
1fc40 65 73 65 72 76 65 20 38 2d 62 79 74 65 0d 0a 20 eserve 8-byte..
1fc41 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f ** alignment */
1fc42 0d 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 .. nMaxCells =
1fc43 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 (nMaxCells + 3)&
1fc44 7e 33 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a ~3;.... /*.. *
1fc45 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 * Allocate space
1fc46 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 for memory stru
1fc47 63 74 75 72 65 73 0d 0a 20 20 2a 2f 0d 0a 20 20 ctures.. */..
1fc48 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a k = pBt->pageSiz
1fc49 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f e + ROUND8(sizeo
1fc4a 66 28 4d 65 6d 50 61 67 65 29 29 3b 0d 0a 20 20 f(MemPage));..
1fc4b 73 7a 53 63 72 61 74 63 68 20 3d 0d 0a 20 20 20 szScratch =..
1fc4c 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 nMaxCells*si
1fc4d 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 zeof(u8*)
1fc4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc4f 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0d 0a 20 20 /* apCell */..
1fc50 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 + nMaxCells*s
1fc51 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 izeof(u16)
1fc52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc53 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0d 0a 20 /* szCell */..
1fc54 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 + pBt->pageS
1fc55 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ize
1fc56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc57 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0d /* aSpace1 */.
1fc58 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 . + k*nOld;
1fc59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc5a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc5b 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 /* Page copi
1fc5c 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0d 0a es (apCopy) */..
1fc5d 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 apCell = sqlit
1fc5e 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 e3ScratchMalloc(
1fc5f 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0d 0a szScratch ); ..
1fc60 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 if( apCell==0
1fc61 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c ){.. rc = SQL
1fc62 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 ITE_NOMEM;..
1fc63 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 goto balance_cle
1fc64 61 6e 75 70 3b 0d 0a 20 20 7d 0d 0a 20 20 73 7a anup;.. }.. sz
1fc65 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 Cell = (u16*)&ap
1fc66 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b Cell[nMaxCells];
1fc67 0d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 .. aSpace1 = (u
1fc68 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 8*)&szCell[nMaxC
1fc69 65 6c 6c 73 5d 3b 0d 0a 20 20 61 73 73 65 72 74 ells];.. assert
1fc6a 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 ( EIGHT_BYTE_ALI
1fc6b 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 GNMENT(aSpace1)
1fc6c 29 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a );.... /*.. **
1fc6d 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 Load pointers t
1fc6e 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 o all cells on s
1fc6f 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 ibling pages and
1fc70 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c the divider cel
1fc71 6c 73 0d 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 ls.. ** into th
1fc72 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d e local apCell[]
1fc73 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f array. Make co
1fc74 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 pies of the divi
1fc75 64 65 72 20 63 65 6c 6c 73 0d 0a 20 20 2a 2a 20 der cells.. **
1fc76 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 into space obtai
1fc77 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 ned from aSpace1
1fc78 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 [] and remove th
1fc79 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 e the divider Ce
1fc7a 6c 6c 73 0d 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 lls.. ** from p
1fc7b 50 61 72 65 6e 74 2e 0d 0a 20 20 2a 2a 0d 0a 20 Parent... **..
1fc7c 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 ** If the sibli
1fc7d 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 ngs are on leaf
1fc7e 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 pages, then the
1fc7f 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f child pointers o
1fc80 66 20 74 68 65 0d 0a 20 20 2a 2a 20 64 69 76 69 f the.. ** divi
1fc81 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 der cells are st
1fc82 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 ripped from the
1fc83 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 cells before the
1fc84 79 20 61 72 65 20 63 6f 70 69 65 64 0d 0a 20 20 y are copied..
1fc85 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b ** into aSpace1[
1fc86 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c ]. In this way,
1fc87 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 all cells in ap
1fc88 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f Cell[] are witho
1fc89 75 74 0d 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 ut.. ** child p
1fc8a 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 ointers. If sib
1fc8b 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 lings are not le
1fc8c 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 aves, then all c
1fc8d 65 6c 6c 20 69 6e 0d 0a 20 20 2a 2a 20 61 70 43 ell in.. ** apC
1fc8e 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 ell[] include ch
1fc8f 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 ild pointers. E
1fc90 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 ither way, all c
1fc91 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d ells in apCell[]
1fc92 0d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 .. ** are alike
1fc93 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 6c 65 ... **.. ** le
1fc94 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 afCorrection: 4
1fc95 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c if pPage is a l
1fc96 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 eaf. 0 if pPage
1fc97 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0d is not a leaf..
1fc98 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 . ** leaf
1fc99 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 Data: 1 if pPag
1fc9a 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 e holds key+data
1fc9b 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c and pParent hol
1fc9c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0d 0a 20 ds only keys...
1fc9d 20 2a 2f 0d 0a 20 20 6c 65 61 66 43 6f 72 72 65 */.. leafCorre
1fc9e 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d ction = apOld[0]
1fc9f 2d 3e 6c 65 61 66 2a 34 3b 0d 0a 20 20 6c 65 61 ->leaf*4;.. lea
1fca0 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d fData = apOld[0]
1fca1 2d 3e 68 61 73 44 61 74 61 3b 0d 0a 20 20 66 6f ->hasData;.. fo
1fca2 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 r(i=0; i<nOld; i
1fca3 2b 2b 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6c 69 ++){.. int li
1fca4 6d 69 74 3b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 mit;.. ..
1fca5 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 /* Before doing
1fca6 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 anything else, t
1fca7 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 ake a copy of th
1fca8 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 e i'th original
1fca9 73 69 62 6c 69 6e 67 0d 0a 20 20 20 20 2a 2a 20 sibling.. **
1fcaa 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 The rest of this
1fcab 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 function will u
1fcac 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 se data from the
1fcad 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0d 0a copies rather..
1fcae 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 ** that the
1fcaf 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 original pages s
1fcb0 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 ince the origina
1fcb1 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 l pages will be
1fcb2 69 6e 20 74 68 65 0d 0a 20 20 20 20 2a 2a 20 70 in the.. ** p
1fcb3 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 rocess of being
1fcb4 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f overwritten. */
1fcb5 0d 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 .. MemPage *p
1fcb6 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 Old = apCopy[i]
1fcb7 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 = (MemPage*)&aSp
1fcb8 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 ace1[pBt->pageSi
1fcb9 7a 65 20 2b 20 6b 2a 69 5d 3b 0d 0a 20 20 20 20 ze + k*i];..
1fcba 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f memcpy(pOld, apO
1fcbb 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 ld[i], sizeof(Me
1fcbc 6d 50 61 67 65 29 29 3b 0d 0a 20 20 20 20 70 4f mPage));.. pO
1fcbd 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 ld->aData = (voi
1fcbe 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0d 0a 20 20 d*)&pOld[1];..
1fcbf 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 memcpy(pOld->a
1fcc0 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e Data, apOld[i]->
1fcc1 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 aData, pBt->page
1fcc2 53 69 7a 65 29 3b 0d 0a 0d 0a 20 20 20 20 6c 69 Size);.... li
1fcc3 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c mit = pOld->nCel
1fcc4 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f l+pOld->nOverflo
1fcc5 77 3b 0d 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 w;.. if( pOld
1fcc6 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b ->nOverflow>0 ){
1fcc7 0d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b .. for(j=0;
1fcc8 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0d j<limit; j++){.
1fcc9 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
1fcca 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 nCell<nMaxCells
1fccb 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 70 43 );.. apC
1fccc 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e ell[nCell] = fin
1fccd 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f dOverflowCell(pO
1fcce 6c 64 2c 20 6a 29 3b 0d 0a 20 20 20 20 20 20 20 ld, j);..
1fccf 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d szCell[nCell] =
1fcd0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c cellSizePtr(pOl
1fcd1 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d d, apCell[nCell]
1fcd2 29 3b 0d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c );.. nCel
1fcd3 6c 2b 2b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 l++;.. }..
1fcd4 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
1fcd5 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c u8 *aData = pOl
1fcd6 64 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 20 20 20 d->aData;..
1fcd7 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20 u16 maskPage =
1fcd8 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0d pOld->maskPage;.
1fcd9 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f . u16 cellO
1fcda 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 ffset = pOld->ce
1fcdb 6c 6c 4f 66 66 73 65 74 3b 0d 0a 20 20 20 20 20 llOffset;..
1fcdc 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 for(j=0; j<limi
1fcdd 74 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 t; j++){..
1fcde 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c assert( nCell<
1fcdf 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0d 0a 20 20 nMaxCells );..
1fce0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 apCell[nCe
1fce1 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 ll] = findCellv2
1fce2 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 (aData, maskPage
1fce3 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 , cellOffset, j)
1fce4 3b 0d 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c ;.. szCel
1fce5 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 l[nCell] = cellS
1fce6 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 izePtr(pOld, apC
1fce7 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0d 0a 20 20 ell[nCell]);..
1fce8 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0d 0a nCell++;..
1fce9 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 20 20 }.. }
1fcea 20 20 20 20 20 0d 0a 20 20 20 20 69 66 28 20 69 .. if( i
1fceb 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 <nOld-1 && !leaf
1fcec 44 61 74 61 29 7b 0d 0a 20 20 20 20 20 20 75 31 Data){.. u1
1fced 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 6 sz = (u16)szNe
1fcee 77 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 75 38 20 w[i];.. u8
1fcef 2a 70 54 65 6d 70 3b 0d 0a 20 20 20 20 20 20 61 *pTemp;.. a
1fcf0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 ssert( nCell<nMa
1fcf1 78 43 65 6c 6c 73 20 29 3b 0d 0a 20 20 20 20 20 xCells );..
1fcf2 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d szCell[nCell] =
1fcf3 20 73 7a 3b 0d 0a 20 20 20 20 20 20 70 54 65 6d sz;.. pTem
1fcf4 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 p = &aSpace1[iSp
1fcf5 61 63 65 31 5d 3b 0d 0a 20 20 20 20 20 20 69 53 ace1];.. iS
1fcf6 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0d 0a 20 20 pace1 += sz;..
1fcf7 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d assert( sz<=
1fcf8 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 pBt->maxLocal+23
1fcf9 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 );.. asser
1fcfa 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 t( iSpace1 <= (i
1fcfb 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 nt)pBt->pageSize
1fcfc 20 29 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 );.. memcp
1fcfd 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 y(pTemp, apDiv[i
1fcfe 5d 2c 20 73 7a 29 3b 0d 0a 20 20 20 20 20 20 61 ], sz);.. a
1fcff 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 pCell[nCell] = p
1fd00 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 Temp+leafCorrect
1fd01 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 ion;.. asse
1fd02 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 rt( leafCorrecti
1fd03 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 on==0 || leafCor
1fd04 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0d 0a 20 rection==4 );..
1fd05 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c szCell[nCel
1fd06 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c l] = szCell[nCel
1fd07 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 l] - leafCorrect
1fd08 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 ion;.. if(
1fd09 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0d 0a !pOld->leaf ){..
1fd0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
1fd0b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d leafCorrection==
1fd0c 30 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 73 0 );.. as
1fd0d 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f sert( pOld->hdrO
1fd0e 66 66 73 65 74 3d 3d 30 20 29 3b 0d 0a 20 20 20 ffset==0 );..
1fd0f 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 /* The righ
1fd10 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 t pointer of the
1fd11 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 child page pOld
1fd12 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 becomes the lef
1fd13 74 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f t.. ** po
1fd14 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 inter of the div
1fd15 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0d 0a 20 20 ider cell */..
1fd16 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 memcpy(apC
1fd17 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c ell[nCell], &pOl
1fd18 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b d->aData[8], 4);
1fd19 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
1fd1a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
1fd1b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d leafCorrection==
1fd1c 34 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 4 );.. if
1fd1d 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c ( szCell[nCell]<
1fd1e 34 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 4 ){..
1fd1f 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 /* Do not allow
1fd20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 any cells smalle
1fd21 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 r than 4 bytes.
1fd22 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 73 7a */.. sz
1fd23 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b Cell[nCell] = 4;
1fd24 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
1fd25 20 20 20 7d 0d 0a 20 20 20 20 20 20 6e 43 65 6c }.. nCel
1fd26 6c 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d l++;.. }.. }
1fd27 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 46 .... /*.. ** F
1fd28 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 igure out the nu
1fd29 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 mber of pages ne
1fd2a 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c eded to hold all
1fd2b 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0d 0a 20 nCell cells...
1fd2c 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e ** Store this n
1fd2d 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 umber in "k". A
1fd2e 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 lso compute szNe
1fd2f 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 w[] which is the
1fd30 20 74 6f 74 61 6c 0d 0a 20 20 2a 2a 20 73 69 7a total.. ** siz
1fd31 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f e of all cells o
1fd32 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 n the i-th page
1fd33 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 and cntNew[] whi
1fd34 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0d ch is the index.
1fd35 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b . ** in apCell[
1fd36 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 ] of the cell th
1fd37 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 at divides page
1fd38 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e i from page i+1.
1fd39 20 20 0d 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b .. ** cntNew[
1fd3a 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 k] should equal
1fd3b 6e 43 65 6c 6c 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 nCell... **..
1fd3c 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 ** Values comput
1fd3d 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b ed by this block
1fd3e 3a 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 20 20 :.. **.. **
1fd3f 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 k: The t
1fd40 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 otal number of s
1fd41 69 62 6c 69 6e 67 20 70 61 67 65 73 0d 0a 20 20 ibling pages..
1fd42 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 ** szNew[i]:
1fd43 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 Spaced used on t
1fd44 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 he i-th sibling
1fd45 70 61 67 65 2e 0d 0a 20 20 2a 2a 20 20 20 63 6e page... ** cn
1fd46 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 tNew[i]: Index i
1fd47 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 n apCell[] and s
1fd48 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 zCell[] for the
1fd49 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0d 0a 20 first cell to..
1fd4a 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 **
1fd4b 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 the right of th
1fd4c 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 e i-th sibling p
1fd4d 61 67 65 2e 0d 0a 20 20 2a 2a 20 75 73 61 62 6c age... ** usabl
1fd4e 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f eSpace: Number o
1fd4f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 f bytes of space
1fd50 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 available on ea
1fd51 63 68 20 73 69 62 6c 69 6e 67 2e 0d 0a 20 20 2a ch sibling... *
1fd52 2a 20 0d 0a 20 20 2a 2f 0d 0a 20 20 75 73 61 62 * .. */.. usab
1fd53 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 leSpace = pBt->u
1fd54 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b sableSize - 12 +
1fd55 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b leafCorrection;
1fd56 0d 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c .. for(subtotal
1fd57 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b =k=i=0; i<nCell;
1fd58 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 61 73 73 65 i++){.. asse
1fd59 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 rt( i<nMaxCells
1fd5a 29 3b 0d 0a 20 20 20 20 73 75 62 74 6f 74 61 6c );.. subtotal
1fd5b 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 += szCell[i] +
1fd5c 32 3b 0d 0a 20 20 20 20 69 66 28 20 73 75 62 74 2;.. if( subt
1fd5d 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 otal > usableSpa
1fd5e 63 65 20 29 7b 0d 0a 20 20 20 20 20 20 73 7a 4e ce ){.. szN
1fd5f 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c ew[k] = subtotal
1fd60 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0d 0a 20 - szCell[i];..
1fd61 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d cntNew[k] =
1fd62 20 69 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 6c i;.. if( l
1fd63 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 eafData ){ i--;
1fd64 7d 0d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 }.. subtota
1fd65 6c 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 6b 2b l = 0;.. k+
1fd66 2b 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 6b 3e +;.. if( k>
1fd67 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c NB+1 ){ rc = SQL
1fd68 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
1fd69 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 ; goto balance_c
1fd6a 6c 65 61 6e 75 70 3b 20 7d 0d 0a 20 20 20 20 7d leanup; }.. }
1fd6b 0d 0a 20 20 7d 0d 0a 20 20 73 7a 4e 65 77 5b 6b .. }.. szNew[k
1fd6c 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0d 0a 20 ] = subtotal;..
1fd6d 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 cntNew[k] = nCe
1fd6e 6c 6c 3b 0d 0a 20 20 6b 2b 2b 3b 0d 0a 0d 0a 20 ll;.. k++;....
1fd6f 20 2f 2a 0d 0a 20 20 2a 2a 20 54 68 65 20 70 61 /*.. ** The pa
1fd70 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 cking computed b
1fd71 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 y the previous b
1fd72 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 lock is biased t
1fd73 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e oward the siblin
1fd74 67 73 0d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 gs.. ** on the
1fd75 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 left side. The
1fd76 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 left siblings ar
1fd77 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 e always nearly
1fd78 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0d full, while the.
1fd79 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 . ** right-most
1fd7a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 sibling might b
1fd7b 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 e nearly empty.
1fd7c 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 This block of c
1fd7d 6f 64 65 20 61 74 74 65 6d 70 74 73 0d 0a 20 20 ode attempts..
1fd7e 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 ** to adjust the
1fd7f 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c packing of sibl
1fd80 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 ings to get a be
1fd81 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0d 0a 20 tter balance...
1fd82 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 69 73 20 61 **.. ** This a
1fd83 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 djustment is mor
1fd84 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 e than an optimi
1fd85 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 zation. The pac
1fd86 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 king above might
1fd87 0d 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 .. ** be so out
1fd88 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 of balance as t
1fd89 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 o be illegal. F
1fd8a 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 or example, the
1fd8b 72 69 67 68 74 2d 6d 6f 73 74 0d 0a 20 20 2a 2a right-most.. **
1fd8c 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 sibling might b
1fd8d 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 e completely emp
1fd8e 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 ty. This adjust
1fd8f 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 ment is not opti
1fd90 6f 6e 61 6c 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 66 onal... */.. f
1fd91 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 or(i=k-1; i>0; i
1fd92 2d 2d 29 7b 0d 0a 20 20 20 20 69 6e 74 20 73 7a --){.. int sz
1fd93 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d Right = szNew[i]
1fd94 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 ; /* Size of si
1fd95 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 bling on the rig
1fd96 68 74 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 73 ht */.. int s
1fd97 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d zLeft = szNew[i-
1fd98 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 1]; /* Size of s
1fd99 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 ibling on the le
1fd9a 66 74 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 72 ft */.. int r
1fd9b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
1fd9c 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 * Index of right
1fd9d 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 -most cell in le
1fd9e 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0d 0a 20 ft sibling */..
1fd9f 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 int d;
1fda0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 /* Index
1fda1 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f of first cell to
1fda2 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 the left of rig
1fda3 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0d 0a 0d ht sibling */...
1fda4 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b . r = cntNew[
1fda5 69 2d 31 5d 20 2d 20 31 3b 0d 0a 20 20 20 20 64 i-1] - 1;.. d
1fda6 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 = r + 1 - leafD
1fda7 61 74 61 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 ata;.. assert
1fda8 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b ( d<nMaxCells );
1fda9 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c .. assert( r<
1fdaa 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0d 0a 20 20 nMaxCells );..
1fdab 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 while( szRight
1fdac 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 ==0 || szRight+s
1fdad 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 zCell[d]+2<=szLe
1fdae 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 ft-(szCell[r]+2)
1fdaf 20 29 7b 0d 0a 20 20 20 20 20 20 73 7a 52 69 67 ){.. szRig
1fdb0 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 ht += szCell[d]
1fdb1 2b 20 32 3b 0d 0a 20 20 20 20 20 20 73 7a 4c 65 + 2;.. szLe
1fdb2 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 ft -= szCell[r]
1fdb3 2b 20 32 3b 0d 0a 20 20 20 20 20 20 63 6e 74 4e + 2;.. cntN
1fdb4 65 77 5b 69 2d 31 5d 2d 2d 3b 0d 0a 20 20 20 20 ew[i-1]--;..
1fdb5 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 r = cntNew[i-1
1fdb6 5d 20 2d 20 31 3b 0d 0a 20 20 20 20 20 20 64 20 ] - 1;.. d
1fdb7 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 = r + 1 - leafDa
1fdb8 74 61 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ta;.. }..
1fdb9 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 szNew[i] = szRig
1fdba 68 74 3b 0d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 ht;.. szNew[i
1fdbb 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0d 0a 20 -1] = szLeft;..
1fdbc 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 45 69 74 68 65 }.... /* Eithe
1fdbd 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f r we found one o
1fdbe 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e r more cells (cn
1fdbf 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 tnew[0])>0) or p
1fdc0 50 61 67 65 20 69 73 0d 0a 20 20 2a 2a 20 61 20 Page is.. ** a
1fdc1 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 virtual root pag
1fdc2 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f e. A virtual ro
1fdc3 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 ot page is when
1fdc4 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0d 0a 20 the real root..
1fdc5 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 ** page is page
1fdc6 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 1 and we are th
1fdc7 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 e only child of
1fdc8 74 68 61 74 20 70 61 67 65 2e 0d 0a 20 20 2a 2a that page... **
1fdc9 0d 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 .. ** UPDATE:
1fdca 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c The assert() bel
1fdcb 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 ow is not necess
1fdcc 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 arily true if th
1fdcd 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 2a 2a e database.. **
1fdce 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 file is corrupt
1fdcf 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f . The corruptio
1fdd0 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 n will be detect
1fdd1 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 ed and reported
1fdd2 6c 61 74 65 72 0d 0a 20 20 2a 2a 20 69 6e 20 74 later.. ** in t
1fdd3 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f his procedure so
1fdd4 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 there is no nee
1fdd5 64 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 d to act upon it
1fdd6 20 6e 6f 77 2e 0d 0a 20 20 2a 2f 0d 0a 23 69 66 now... */..#if
1fdd7 20 30 0d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 0.. assert( cn
1fdd8 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 tNew[0]>0 || (pP
1fdd9 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 arent->pgno==1 &
1fdda 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c & pParent->nCell
1fddb 3d 3d 30 29 20 29 3b 0d 0a 23 65 6e 64 69 66 0d ==0) );..#endif.
1fddc 0a 0d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c ... TRACE(("BAL
1fddd 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 ANCE: old: %d %d
1fdde 20 25 64 20 20 22 2c 0d 0a 20 20 20 20 61 70 4f %d ",.. apO
1fddf 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0d 0a 20 ld[0]->pgno, ..
1fde0 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f nOld>=2 ? apO
1fde1 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c ld[1]->pgno : 0,
1fde2 0d 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 .. nOld>=3 ?
1fde3 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a apOld[2]->pgno :
1fde4 20 30 0d 0a 20 20 29 29 3b 0d 0a 0d 0a 20 20 2f 0.. ));.... /
1fde5 2a 0d 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 *.. ** Allocate
1fde6 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 k new pages. R
1fde7 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 euse old pages w
1fde8 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0d 0a here possible...
1fde9 20 20 2a 2f 0d 0a 20 20 69 66 28 20 61 70 4f 6c */.. if( apOl
1fdea 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b d[0]->pgno<=1 ){
1fdeb 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 .. rc = SQLIT
1fdec 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0d E_CORRUPT_BKPT;.
1fded 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 . goto balanc
1fdee 65 5f 63 6c 65 61 6e 75 70 3b 0d 0a 20 20 7d 0d e_cleanup;.. }.
1fdef 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 . pageFlags = a
1fdf0 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 pOld[0]->aData[0
1fdf1 5d 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 ];.. for(i=0; i
1fdf2 3c 6b 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 4d <k; i++){.. M
1fdf3 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0d 0a 20 emPage *pNew;..
1fdf4 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b if( i<nOld ){
1fdf5 0d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 .. pNew = a
1fdf6 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b pNew[i] = apOld[
1fdf7 69 5d 3b 0d 0a 20 20 20 20 20 20 61 70 4f 6c 64 i];.. apOld
1fdf8 5b 69 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 [i] = 0;..
1fdf9 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
1fdfa 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 rWrite(pNew->pDb
1fdfb 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 6e 4e Page);.. nN
1fdfc 65 77 2b 2b 3b 0d 0a 20 20 20 20 20 20 69 66 28 ew++;.. if(
1fdfd 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e rc ) goto balan
1fdfe 63 65 5f 63 6c 65 61 6e 75 70 3b 0d 0a 20 20 20 ce_cleanup;..
1fdff 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 }else{.. a
1fe00 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0d 0a 20 ssert( i>0 );..
1fe01 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 rc = alloca
1fe02 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c teBtreePage(pBt,
1fe03 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 &pNew, &pgno, p
1fe04 67 6e 6f 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 gno, 0);..
1fe05 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 if( rc ) goto ba
1fe06 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0d 0a lance_cleanup;..
1fe07 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d apNew[i] =
1fe08 20 70 4e 65 77 3b 0d 0a 20 20 20 20 20 20 6e 4e pNew;.. nN
1fe09 65 77 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f ew++;.... /
1fe0a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 * Set the pointe
1fe0b 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 r-map entry for
1fe0c 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 the new sibling
1fe0d 70 61 67 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 page. */..
1fe0e 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d if( ISAUTOVACUUM
1fe0f 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 74 72 ){.. ptr
1fe10 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 mapPut(pBt, pNew
1fe11 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 ->pgno, PTRMAP_B
1fe12 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 TREE, pParent->p
1fe13 67 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 gno, &rc);..
1fe14 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1fe15 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
1fe16 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 goto balance
1fe17 5f 63 6c 65 61 6e 75 70 3b 0d 0a 20 20 20 20 20 _cleanup;..
1fe18 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 }.. }..
1fe19 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f }.. }.... /
1fe1a 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 * Free any old p
1fe1b 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e ages that were n
1fe1c 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 ot reused as new
1fe1d 20 70 61 67 65 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 pages... */..
1fe1e 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 while( i<nOld )
1fe1f 7b 0d 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 {.. freePage(
1fe20 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0d apOld[i], &rc);.
1fe21 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f . if( rc ) go
1fe22 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e to balance_clean
1fe23 75 70 3b 0d 0a 20 20 20 20 72 65 6c 65 61 73 65 up;.. release
1fe24 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0d Page(apOld[i]);.
1fe25 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 . apOld[i] =
1fe26 30 3b 0d 0a 20 20 20 20 69 2b 2b 3b 0d 0a 20 20 0;.. i++;..
1fe27 7d 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 }.... /*.. **
1fe28 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 Put the new page
1fe29 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f s in accending o
1fe2a 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 rder. This help
1fe2b 73 20 74 6f 0d 0a 20 20 2a 2a 20 6b 65 65 70 20 s to.. ** keep
1fe2c 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 entries in the d
1fe2d 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 isk file in orde
1fe2e 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e r so that a scan
1fe2f 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 .. ** of the ta
1fe30 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 ble is a linear
1fe31 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 scan through the
1fe32 20 66 69 6c 65 2e 20 20 54 68 61 74 0d 0a 20 20 file. That..
1fe33 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 ** in turn helps
1fe34 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 the operating s
1fe35 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 ystem to deliver
1fe36 20 70 61 67 65 73 0d 0a 20 20 2a 2a 20 66 72 6f pages.. ** fro
1fe37 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 m the disk more
1fe38 72 61 70 69 64 6c 79 2e 0d 0a 20 20 2a 2a 0d 0a rapidly... **..
1fe39 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 ** An O(n^2) i
1fe3a 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c nsertion sort al
1fe3b 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c gorithm is used,
1fe3c 20 62 75 74 20 73 69 6e 63 65 0d 0a 20 20 2a 2a but since.. **
1fe3d 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 n is never more
1fe3e 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c than NB (a smal
1fe3f 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 l constant), tha
1fe40 74 20 73 68 6f 75 6c 64 0d 0a 20 20 2a 2a 20 6e t should.. ** n
1fe41 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e ot be a problem.
1fe42 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 57 68 65 .. **.. ** Whe
1fe43 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e n NB==3, this on
1fe44 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d e optimization m
1fe45 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 akes the databas
1fe46 65 0d 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 e.. ** about 25
1fe47 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 % faster for lar
1fe48 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e ge insertions an
1fe49 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0d 0a 20 20 d deletions...
1fe4a 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 */.. for(i=0; i
1fe4b 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 <k-1; i++){..
1fe4c 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 int minV = apNe
1fe4d 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0d 0a 20 20 20 w[i]->pgno;..
1fe4e 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0d 0a int minI = i;..
1fe4f 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a for(j=i+1; j
1fe50 3c 6b 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 <k; j++){..
1fe51 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 if( apNew[j]->p
1fe52 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 gno<(unsigned)mi
1fe53 6e 56 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 6d nV ){.. m
1fe54 69 6e 49 20 3d 20 6a 3b 0d 0a 20 20 20 20 20 20 inI = j;..
1fe55 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a minV = apNew[j
1fe56 5d 2d 3e 70 67 6e 6f 3b 0d 0a 20 20 20 20 20 20 ]->pgno;..
1fe57 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 }.. }.. if
1fe58 28 20 6d 69 6e 49 3e 69 20 29 7b 0d 0a 20 20 20 ( minI>i ){..
1fe59 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0d MemPage *pT;.
1fe5a 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 . pT = apNe
1fe5b 77 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 61 70 4e w[i];.. apN
1fe5c 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 ew[i] = apNew[mi
1fe5d 6e 49 5d 3b 0d 0a 20 20 20 20 20 20 61 70 4e 65 nI];.. apNe
1fe5e 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0d 0a 20 w[minI] = pT;..
1fe5f 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 54 52 41 }.. }.. TRA
1fe60 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 CE(("new: %d(%d)
1fe61 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 %d(%d) %d(%d) %
1fe62 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c d(%d) %d(%d)\n",
1fe63 0d 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e .. apNew[0]->
1fe64 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0d pgno, szNew[0],.
1fe65 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 . nNew>=2 ? a
1fe66 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 pNew[1]->pgno :
1fe67 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 0, nNew>=2 ? szN
1fe68 65 77 5b 31 5d 20 3a 20 30 2c 0d 0a 20 20 20 20 ew[1] : 0,..
1fe69 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b nNew>=3 ? apNew[
1fe6a 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 2]->pgno : 0, nN
1fe6b 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d ew>=3 ? szNew[2]
1fe6c 20 3a 20 30 2c 0d 0a 20 20 20 20 6e 4e 65 77 3e : 0,.. nNew>
1fe6d 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 =4 ? apNew[3]->p
1fe6e 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 gno : 0, nNew>=4
1fe6f 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c ? szNew[3] : 0,
1fe70 0d 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 .. nNew>=5 ?
1fe71 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a apNew[4]->pgno :
1fe72 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 0, nNew>=5 ? sz
1fe73 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0d 0a 0d New[4] : 0));...
1fe74 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
1fe75 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 e3PagerIswriteab
1fe76 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 le(pParent->pDbP
1fe77 61 67 65 29 20 29 3b 0d 0a 20 20 70 75 74 34 62 age) );.. put4b
1fe78 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 yte(pRight, apNe
1fe79 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 w[nNew-1]->pgno)
1fe7a 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 ;.... /*.. **
1fe7b 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 Evenly distribut
1fe7c 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 e the data in ap
1fe7d 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 Cell[] across th
1fe7e 65 20 6e 65 77 20 70 61 67 65 73 2e 0d 0a 20 20 e new pages...
1fe7f 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 ** Insert divide
1fe80 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 r cells into pPa
1fe81 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 rent as necessar
1fe82 79 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 6a 20 3d 20 y... */.. j =
1fe83 30 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 0;.. for(i=0; i
1fe84 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0d 0a 20 20 <nNew; i++){..
1fe85 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 /* Assemble th
1fe86 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 e new sibling pa
1fe87 67 65 2e 20 2a 2f 0d 0a 20 20 20 20 4d 65 6d 50 ge. */.. MemP
1fe88 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 age *pNew = apNe
1fe89 77 5b 69 5d 3b 0d 0a 20 20 20 20 61 73 73 65 72 w[i];.. asser
1fe8a 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 t( j<nMaxCells )
1fe8b 3b 0d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 ;.. zeroPage(
1fe8c 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 pNew, pageFlags)
1fe8d 3b 0d 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 ;.. assembleP
1fe8e 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 age(pNew, cntNew
1fe8f 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a [i]-j, &apCell[j
1fe90 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0d ], &szCell[j]);.
1fe91 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 . assert( pNe
1fe92 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e w->nCell>0 || (n
1fe93 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 New==1 && cntNew
1fe94 5b 30 5d 3d 3d 30 29 20 29 3b 0d 0a 20 20 20 20 [0]==0) );..
1fe95 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f assert( pNew->nO
1fe96 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0d 0a 0d verflow==0 );...
1fe97 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b . j = cntNew[
1fe98 69 5d 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 49 66 i];.... /* If
1fe99 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 the sibling pag
1fe9a 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 e assembled abov
1fe9b 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 e was not the ri
1fe9c 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 ght-most sibling
1fe9d 2c 0d 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 ,.. ** insert
1fe9e 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 a divider cell
1fe9f 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 into the parent
1fea0 70 61 67 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 page... */..
1fea1 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 assert( i<nNe
1fea2 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 w-1 || j==nCell
1fea3 29 3b 0d 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 );.. if( j<nC
1fea4 65 6c 6c 20 29 7b 0d 0a 20 20 20 20 20 20 75 38 ell ){.. u8
1fea5 20 2a 70 43 65 6c 6c 3b 0d 0a 20 20 20 20 20 20 *pCell;..
1fea6 75 38 20 2a 70 54 65 6d 70 3b 0d 0a 20 20 20 20 u8 *pTemp;..
1fea7 20 20 69 6e 74 20 73 7a 3b 0d 0a 0d 0a 20 20 20 int sz;....
1fea8 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 assert( j<nMa
1fea9 78 43 65 6c 6c 73 20 29 3b 0d 0a 20 20 20 20 20 xCells );..
1feaa 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b pCell = apCell[
1feab 6a 5d 3b 0d 0a 20 20 20 20 20 20 73 7a 20 3d 20 j];.. sz =
1feac 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 szCell[j] + leaf
1fead 43 6f 72 72 65 63 74 69 6f 6e 3b 0d 0a 20 20 20 Correction;..
1feae 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 pTemp = &aOvf
1feaf 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 lSpace[iOvflSpac
1feb0 65 5d 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 21 e];.. if( !
1feb1 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 pNew->leaf ){..
1feb2 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 memcpy(&p
1feb3 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 New->aData[8], p
1feb4 43 65 6c 6c 2c 20 34 29 3b 0d 0a 20 20 20 20 20 Cell, 4);..
1feb5 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 }else if( leafD
1feb6 61 74 61 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 ata ){..
1feb7 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 /* If the tree i
1feb8 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 s a leaf-data tr
1feb9 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c ee, and the sibl
1feba 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c ings are leaves,
1febb 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 .. ** th
1febc 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 en there is no d
1febd 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 ivider cell in a
1febe 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 pCell[]. Instead
1febf 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0d 0a , the divider ..
1fec0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 ** cell
1fec1 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 consists of the
1fec2 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 integer key for
1fec3 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 the right-most c
1fec4 65 6c 6c 20 6f 66 20 0d 0a 20 20 20 20 20 20 20 ell of ..
1fec5 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d ** the sibling-
1fec6 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 page assembled a
1fec7 62 6f 76 65 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20 bove only...
1fec8 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
1fec9 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0d 0a CellInfo info;..
1feca 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0d 0a 20 20 j--;..
1fecb 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 btreeParse
1fecc 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 CellPtr(pNew, ap
1fecd 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b Cell[j], &info);
1fece 0d 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 .. pCell
1fecf 3d 20 70 54 65 6d 70 3b 0d 0a 20 20 20 20 20 20 = pTemp;..
1fed0 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 sz = 4 + putVa
1fed1 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 rint(&pCell[4],
1fed2 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0d 0a 20 20 20 info.nKey);..
1fed3 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0d pTemp = 0;.
1fed4 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 . }else{..
1fed5 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 pCell -=
1fed6 34 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 4;.. /* O
1fed7 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 bscure case for
1fed8 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 non-leaf-data tr
1fed9 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c ees: If the cell
1feda 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0d 0a 20 at pCell was..
1fedb 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f ** previo
1fedc 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 usly stored on a
1fedd 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 leaf node, and
1fede 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a its reported siz
1fedf 65 20 77 61 73 20 34 0d 0a 20 20 20 20 20 20 20 e was 4..
1fee0 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 ** bytes, then
1fee1 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 it may actually
1fee2 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 be smaller than
1fee3 74 68 69 73 20 0d 0a 20 20 20 20 20 20 20 20 2a this .. *
1fee4 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73 * (see btreePars
1fee5 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 eCellPtr(), 4 by
1fee6 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d tes is the minim
1fee7 75 6d 20 73 69 7a 65 20 6f 66 0d 0a 20 20 20 20 um size of..
1fee8 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 ** any cell)
1fee9 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f . But it is impo
1feea 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 rtant to pass th
1feeb 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 e correct size t
1feec 6f 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 o .. ** i
1feed 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 nsertCell(), so
1feee 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c reparse the cell
1feef 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 2a now... *
1fef0 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f *.. ** No
1fef1 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e te that this can
1fef2 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e never happen in
1fef3 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 an SQLite data
1fef4 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0d 0a 20 20 file, as all..
1fef5 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 ** cells a
1fef6 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 re at least 4 by
1fef7 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 tes. It only hap
1fef8 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 pens in b-trees
1fef9 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 2a 2a used.. **
1fefa 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e to evaluate "IN
1fefb 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 (SELECT ...)" a
1fefc 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 nd similar claus
1fefd 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d es... */.
1fefe 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 . if( szC
1feff 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0d 0a 20 20 ell[j]==4 ){..
1ff00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c assert(l
1ff01 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 eafCorrection==4
1ff02 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 7a );.. sz
1ff03 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 = cellSizePtr(p
1ff04 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0d Parent, pCell);.
1ff05 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 . }..
1ff06 20 20 7d 0d 0a 20 20 20 20 20 20 69 4f 76 66 6c }.. iOvfl
1ff07 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0d 0a 20 20 Space += sz;..
1ff08 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d assert( sz<=
1ff09 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 pBt->maxLocal+23
1ff0a 20 29 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 );.. asser
1ff0b 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d t( iOvflSpace <=
1ff0c 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 (int)pBt->pageS
1ff0d 69 7a 65 20 29 3b 0d 0a 20 20 20 20 20 20 69 6e ize );.. in
1ff0e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 sertCell(pParent
1ff0f 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 , nxDiv, pCell,
1ff10 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d sz, pTemp, pNew-
1ff11 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 >pgno, &rc);..
1ff12 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1ff13 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c TE_OK ) goto bal
1ff14 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0d 0a 20 ance_cleanup;..
1ff15 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c assert( sql
1ff16 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 ite3PagerIswrite
1ff17 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 able(pParent->pD
1ff18 62 50 61 67 65 29 20 29 3b 0d 0a 0d 0a 20 20 20 bPage) );....
1ff19 20 20 20 6a 2b 2b 3b 0d 0a 20 20 20 20 20 20 6e j++;.. n
1ff1a 78 44 69 76 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a xDiv++;.. }..
1ff1b 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 6a }.. assert( j
1ff1c 3d 3d 6e 43 65 6c 6c 20 29 3b 0d 0a 20 20 61 73 ==nCell );.. as
1ff1d 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0d sert( nOld>0 );.
1ff1e 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e . assert( nNew>
1ff1f 30 20 29 3b 0d 0a 20 20 69 66 28 20 28 70 61 67 0 );.. if( (pag
1ff20 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 eFlags & PTF_LEA
1ff21 46 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 75 38 F)==0 ){.. u8
1ff22 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f *zChild = &apCo
1ff23 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 py[nOld-1]->aDat
1ff24 61 5b 38 5d 3b 0d 0a 20 20 20 20 6d 65 6d 63 70 a[8];.. memcp
1ff25 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d y(&apNew[nNew-1]
1ff26 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 ->aData[8], zChi
1ff27 6c 64 2c 20 34 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a ld, 4);.. }....
1ff28 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 if( isRoot &&
1ff29 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d pParent->nCell==
1ff2a 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 0 && pParent->hd
1ff2b 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 rOffset<=apNew[0
1ff2c 5d 2d 3e 6e 46 72 65 65 20 29 7b 0d 0a 20 20 20 ]->nFree ){..
1ff2d 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 /* The root pag
1ff2e 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 e of the b-tree
1ff2f 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 now contains no
1ff30 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 cells. The only
1ff31 73 69 62 6c 69 6e 67 0d 0a 20 20 20 20 2a 2a 20 sibling.. **
1ff32 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 page is the righ
1ff33 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 t-child of the p
1ff34 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 arent. Copy the
1ff35 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0d contents of the.
1ff36 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 . ** child pa
1ff37 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 ge into the pare
1ff38 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 nt, decreasing t
1ff39 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 he overall heigh
1ff3a 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 2a 2a t of the.. **
1ff3b 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 b-tree structur
1ff3c 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 e by one. This i
1ff3d 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74 s described as t
1ff3e 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c he "balance-shal
1ff3f 6c 6f 77 65 72 22 0d 0a 20 20 20 20 2a 2a 20 73 lower".. ** s
1ff40 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 ub-algorithm in
1ff41 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 some documentati
1ff42 6f 6e 2e 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 on... **..
1ff43 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 ** If this is a
1ff44 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 n auto-vacuum da
1ff45 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c tabase, the call
1ff46 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 to copyNodeCont
1ff47 65 6e 74 28 29 20 0d 0a 20 20 20 20 2a 2a 20 73 ent() .. ** s
1ff48 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d ets all pointer-
1ff49 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 map entries corr
1ff4a 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 esponding to dat
1ff4b 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 abase image page
1ff4c 73 20 0d 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 s .. ** for w
1ff4d 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 hich the pointer
1ff4e 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 is stored withi
1ff4f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 n the content be
1ff50 69 6e 67 20 63 6f 70 69 65 64 2e 0d 0a 20 20 20 ing copied...
1ff51 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 54 68 65 20 **.. ** The
1ff52 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 second assert be
1ff53 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 low verifies tha
1ff54 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 t the child page
1ff55 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 is defragmented
1ff56 0d 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 .. ** (it mus
1ff57 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 t be, as it was
1ff58 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 just reconstruct
1ff59 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c ed using assembl
1ff5a 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0d 0a ePage()). This..
1ff5b 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 ** is import
1ff5c 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e ant if the paren
1ff5d 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 t page happens t
1ff5e 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 o be page 1 of t
1ff5f 68 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 he database..
1ff60 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0d 0a ** image. */..
1ff61 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 assert( nNew
1ff62 3d 3d 31 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 ==1 );.. asse
1ff63 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 rt( apNew[0]->nF
1ff64 72 65 65 20 3d 3d 20 0d 0a 20 20 20 20 20 20 20 ree == ..
1ff65 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 (get2byte(&apNe
1ff66 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d w[0]->aData[5])-
1ff67 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 apNew[0]->cellOf
1ff68 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e fset-apNew[0]->n
1ff69 43 65 6c 6c 2a 32 29 20 0d 0a 20 20 20 20 29 3b Cell*2) .. );
1ff6a 0d 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f .. copyNodeCo
1ff6b 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 ntent(apNew[0],
1ff6c 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0d 0a pParent, &rc);..
1ff6d 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e freePage(apN
1ff6e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0d 0a 20 20 ew[0], &rc);..
1ff6f 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f }else if( ISAUTO
1ff70 56 41 43 55 55 4d 20 29 7b 0d 0a 20 20 20 20 2f VACUUM ){.. /
1ff71 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 * Fix the pointe
1ff72 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f r-map entries fo
1ff73 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 r all the cells
1ff74 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 that were shifte
1ff75 64 20 61 72 6f 75 6e 64 2e 20 0d 0a 20 20 20 20 d around. ..
1ff76 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 ** There are sev
1ff77 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 eral different t
1ff78 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d ypes of pointer-
1ff79 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 map entries that
1ff7a 20 6e 65 65 64 20 74 6f 0d 0a 20 20 20 20 2a 2a need to.. **
1ff7b 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 be dealt with b
1ff7c 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 y this routine.
1ff7d 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 Some of these ha
1ff7e 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 ve been set alre
1ff7f 61 64 79 2c 20 62 75 74 0d 0a 20 20 20 20 2a 2a ady, but.. **
1ff80 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 many have not.
1ff81 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 The following is
1ff82 20 61 20 73 75 6d 6d 61 72 79 3a 0d 0a 20 20 20 a summary:..
1ff83 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 20 20 31 29 **.. ** 1)
1ff84 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 The entries ass
1ff85 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 ociated with new
1ff86 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 sibling pages t
1ff87 68 61 74 20 77 65 72 65 20 6e 6f 74 0d 0a 20 20 hat were not..
1ff88 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e ** siblin
1ff89 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e gs when this fun
1ff8a 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 ction was called
1ff8b 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 . These have alr
1ff8c 65 61 64 79 0d 0a 20 20 20 20 2a 2a 20 20 20 20 eady.. **
1ff8d 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 been set. We d
1ff8e 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 on't need to wor
1ff8f 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 ry about old sib
1ff90 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0d lings that were.
1ff91 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 . ** mov
1ff92 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c ed to the free-l
1ff93 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 ist - the freePa
1ff94 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 ge() code has ta
1ff95 6b 65 6e 20 63 61 72 65 0d 0a 20 20 20 20 2a 2a ken care.. **
1ff96 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0d of those..
1ff97 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 . **.. **
1ff98 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2) The pointer
1ff99 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 -map entries ass
1ff9a 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
1ff9b 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0d first overflow.
1ff9c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 . ** pag
1ff9d 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f e in any overflo
1ff9e 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 w chains used by
1ff9f 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c new divider cel
1ffa0 6c 73 2e 20 54 68 65 73 65 20 0d 0a 20 20 20 20 ls. These ..
1ffa1 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 ** have als
1ffa2 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 o already been t
1ffa3 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 aken care of by
1ffa4 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 the insertCell()
1ffa5 20 63 6f 64 65 2e 0d 0a 20 20 20 20 2a 2a 0d 0a code... **..
1ffa6 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 ** 3) If t
1ffa7 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 he sibling pages
1ffa8 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c are not leaves,
1ffa9 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 then the child
1ffaa 70 61 67 65 73 20 6f 66 0d 0a 20 20 20 20 2a 2a pages of.. **
1ffab 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 cells stor
1ffac 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e ed on the siblin
1ffad 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 g pages may need
1ffae 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0d to be updated..
1ffaf 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a 20 . **.. **
1ffb0 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 4) If the sibl
1ffb1 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f ing pages are no
1ffb2 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 t internal intke
1ffb3 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e y nodes, then an
1ffb4 79 0d 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f y.. ** o
1ffb5 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 verflow pages us
1ffb6 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c ed by these cell
1ffb7 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 s may need to be
1ffb8 20 75 70 64 61 74 65 64 0d 0a 20 20 20 20 2a 2a updated.. **
1ffb9 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 (internal
1ffba 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 intkey nodes nev
1ffbb 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 er contain point
1ffbc 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 ers to overflow
1ffbd 70 61 67 65 73 29 2e 0d 0a 20 20 20 20 2a 2a 0d pages)... **.
1ffbe 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 . ** 5) If
1ffbf 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 the sibling page
1ffc0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 s are not leaves
1ffc1 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 , then the point
1ffc2 65 72 2d 6d 61 70 0d 0a 20 20 20 20 2a 2a 20 20 er-map.. **
1ffc3 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 entries for
1ffc4 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 the right-child
1ffc5 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 pages of each si
1ffc6 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0d 0a bling may need..
1ffc7 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 ** to b
1ffc8 65 20 75 70 64 61 74 65 64 2e 0d 0a 20 20 20 20 e updated...
1ffc9 2a 2a 0d 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 **.. ** Cases
1ffca 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 1 and 2 are dea
1ffcb 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 lt with above by
1ffcc 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 other code. The
1ffcd 20 6e 65 78 74 0d 0a 20 20 20 20 2a 2a 20 62 6c next.. ** bl
1ffce 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 ock deals with c
1ffcf 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 ases 3 and 4 and
1ffd0 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 the one after t
1ffd1 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e hat, case 5. Sin
1ffd2 63 65 0d 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 ce.. ** setti
1ffd3 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 ng a pointer map
1ffd4 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 entry is a rela
1ffd5 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 tively expensive
1ffd6 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 operation, this
1ffd7 0d 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e .. ** code on
1ffd8 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 ly sets pointer
1ffd9 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 map entries for
1ffda 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f child or overflo
1ffdb 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 w pages that hav
1ffdc 65 0d 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c e.. ** actual
1ffdd 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e ly moved between
1ffde 20 70 61 67 65 73 2e 20 20 2a 2f 0d 0a 20 20 20 pages. */..
1ffdf 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d MemPage *pNew =
1ffe0 20 61 70 4e 65 77 5b 30 5d 3b 0d 0a 20 20 20 20 apNew[0];..
1ffe1 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 MemPage *pOld =
1ffe2 61 70 43 6f 70 79 5b 30 5d 3b 0d 0a 20 20 20 20 apCopy[0];..
1ffe3 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 int nOverflow =
1ffe4 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b pOld->nOverflow;
1ffe5 0d 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f .. int iNextO
1ffe6 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c ld = pOld->nCell
1ffe7 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0d 0a 20 + nOverflow;..
1ffe8 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 int iOverflow
1ffe9 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 = (nOverflow ?
1ffea 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 pOld->aOvfl[0].i
1ffeb 64 78 20 3a 20 2d 31 29 3b 0d 0a 20 20 20 20 6a dx : -1);.. j
1ffec 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
1ffed 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ffee 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c /* Current 'ol
1ffef 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 d' sibling page
1fff0 2a 2f 0d 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 */.. k = 0;
1fff1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fff2 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 /* Cu
1fff3 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c rrent 'new' sibl
1fff4 69 6e 67 20 70 61 67 65 20 2a 2f 0d 0a 20 20 20 ing page */..
1fff5 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c for(i=0; i<nCel
1fff6 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 l; i++){..
1fff7 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 int isDivider =
1fff8 30 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 0;.. while(
1fff9 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0d i==iNextOld ){.
1fffa 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c . /* Cell
1fffb 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 i is the cell i
1fffc 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f mmediately follo
1fffd 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 wing the last ce
1fffe 6c 6c 20 6f 6e 20 6f 6c 64 0d 0a 20 20 20 20 20 ll on old..
1ffff 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 ** sibling pa
20000 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 ge j. If the sib
20001 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 lings are not le
20002 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0d 0a af pages of an..
20003 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 ** intke
20004 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 y b-tree, then c
20005 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 ell i was a divi
20006 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0d 0a 20 20 der cell. */..
20007 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b assert( j+
20008 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 70 1 < ArraySize(ap
20009 43 6f 70 79 29 20 29 3b 0d 0a 20 20 20 20 20 20 Copy) );..
2000a 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b pOld = apCopy[
2000b 2b 2b 6a 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 ++j];.. i
2000c 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c NextOld = i + !l
2000d 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e eafData + pOld->
2000e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f nCell + pOld->nO
2000f 76 65 72 66 6c 6f 77 3b 0d 0a 20 20 20 20 20 20 verflow;..
20010 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 if( pOld->nOve
20011 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 20 20 20 rflow ){..
20012 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 nOverflow =
20013 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b pOld->nOverflow;
20014 0d 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 .. iOve
20015 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 rflow = i + !lea
20016 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f fData + pOld->aO
20017 76 66 6c 5b 30 5d 2e 69 64 78 3b 0d 0a 20 20 20 vfl[0].idx;..
20018 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
20019 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 isDivider = !lea
2001a 66 44 61 74 61 3b 20 20 0d 0a 20 20 20 20 20 20 fData; ..
2001b 7d 0d 0a 0d 0a 20 20 20 20 20 20 61 73 73 65 72 }.... asser
2001c 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c t(nOverflow>0 ||
2001d 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0d iOverflow<i );.
2001e 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f . assert(nO
2001f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c verflow<2 || pOl
20020 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d d->aOvfl[0].idx=
20021 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e =pOld->aOvfl[1].
20022 69 64 78 2d 31 29 3b 0d 0a 20 20 20 20 20 20 61 idx-1);.. a
20023 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c ssert(nOverflow<
20024 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 3 || pOld->aOvfl
20025 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 [1].idx==pOld->a
20026 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0d Ovfl[2].idx-1);.
20027 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f . if( i==iO
20028 76 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 20 verflow ){..
20029 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 isDivider =
2002a 31 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 1;.. if(
2002b 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 (--nOverflow)>0
2002c 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 4f ){.. iO
2002d 76 65 72 66 6c 6f 77 2b 2b 3b 0d 0a 20 20 20 20 verflow++;..
2002e 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a }.. }..
2002f 0d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 .. if( i==c
20030 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0d 0a 20 20 20 ntNew[k] ){..
20031 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 /* Cell i i
20032 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 s the cell immed
20033 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 iately following
20034 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f the last cell o
20035 6e 20 6e 65 77 0d 0a 20 20 20 20 20 20 20 20 2a n new.. *
20036 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b * sibling page k
20037 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 . If the sibling
20038 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 s are not leaf p
20039 61 67 65 73 20 6f 66 20 61 6e 0d 0a 20 20 20 20 ages of an..
2003a 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d ** intkey b-
2003b 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 tree, then cell
2003c 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63 i is a divider c
2003d 65 6c 6c 2e 20 20 2a 2f 0d 0a 20 20 20 20 20 20 ell. */..
2003e 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b pNew = apNew[+
2003f 2b 6b 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 +k];.. if
20040 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f ( !leafData ) co
20041 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 7d ntinue;.. }
20042 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
20043 6a 3c 6e 4f 6c 64 20 29 3b 0d 0a 20 20 20 20 20 j<nOld );..
20044 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 assert( k<nNew
20045 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 );.... /* I
20046 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f f the cell was o
20047 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 riginally divide
20048 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e r cell (and is n
20049 6f 74 20 6e 6f 77 29 20 6f 72 0d 0a 20 20 20 20 ot now) or..
2004a 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 ** an overflow
2004b 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 cell, or if the
2004c 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 cell was locate
2004d 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 d on a different
2004e 20 73 69 62 6c 69 6e 67 0d 0a 20 20 20 20 20 20 sibling..
2004f 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 ** page before t
20050 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 he balancing, th
20051 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d en the pointer m
20052 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 ap entries assoc
20053 69 61 74 65 64 0d 0a 20 20 20 20 20 20 2a 2a 20 iated.. **
20054 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f with any child o
20055 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 r overflow pages
20056 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 need to be upda
20057 74 65 64 2e 20 20 2a 2f 0d 0a 20 20 20 20 20 20 ted. */..
20058 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c if( isDivider ||
20059 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 pOld->pgno!=pNe
2005a 77 2d 3e 70 67 6e 6f 20 29 7b 0d 0a 20 20 20 20 w->pgno ){..
2005b 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 if( !leafCor
2005c 72 65 63 74 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 rection ){..
2005d 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 ptrmapPut(
2005e 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 pBt, get4byte(ap
2005f 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 Cell[i]), PTRMAP
20060 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 _BTREE, pNew->pg
20061 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 20 no, &rc);..
20062 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 }.. if
20063 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 ( szCell[i]>pNew
20064 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0d 0a 20 ->minLocal ){..
20065 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 ptrmapP
20066 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 utOvflPtr(pNew,
20067 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b apCell[i], &rc);
20068 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
20069 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 }.. }....
2006a 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 if( !leafCorr
2006b 65 63 74 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 20 ection ){..
2006c 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 for(i=0; i<nNew
2006d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 ; i++){..
2006e 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 u32 key = get4b
2006f 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 yte(&apNew[i]->a
20070 44 61 74 61 5b 38 5d 29 3b 0d 0a 20 20 20 20 20 Data[8]);..
20071 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 ptrmapPut(pBt
20072 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 , key, PTRMAP_BT
20073 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 REE, apNew[i]->p
20074 67 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 gno, &rc);..
20075 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 }.. }....#i
20076 66 20 30 0d 0a 20 20 20 20 2f 2a 20 54 68 65 20 f 0.. /* The
20077 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 ptrmapCheckPages
20078 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 () contains asse
20079 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 rt() statements
2007a 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74 that verify that
2007b 0d 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 .. ** all poi
2007c 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 nter map pages a
2007d 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 re set correctly
2007e 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 . This is helpfu
2007f 6c 20 77 68 69 6c 65 20 0d 0a 20 20 20 20 2a 2a l while .. **
20080 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 debugging. This
20081 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 is usually disa
20082 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63 bled because a c
20083 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 orrupt database
20084 6d 61 79 0d 0a 20 20 20 20 2a 2a 20 63 61 75 73 may.. ** caus
20085 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 e an assert() st
20086 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e atement to fail.
20087 20 20 2a 2f 0d 0a 20 20 20 20 70 74 72 6d 61 70 */.. ptrmap
20088 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 CheckPages(apNew
20089 2c 20 6e 4e 65 77 29 3b 0d 0a 20 20 20 20 70 74 , nNew);.. pt
2008a 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 rmapCheckPages(&
2008b 70 50 61 72 65 6e 74 2c 20 31 29 3b 0d 0a 23 65 pParent, 1);..#e
2008c 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 ndif.. }.... a
2008d 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e ssert( pParent->
2008e 69 73 49 6e 69 74 20 29 3b 0d 0a 20 20 54 52 41 isInit );.. TRA
2008f 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 CE(("BALANCE: fi
20090 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e nished: old=%d n
20091 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e ew=%d cells=%d\n
20092 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 4f ",.. nO
20093 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 ld, nNew, nCell)
20094 29 3b 0d 0a 0d 0a 20 20 2f 2a 0d 0a 20 20 2a 2a );.... /*.. **
20095 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 Cleanup before
20096 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 20 20 2a 2f returning... */
20097 0d 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 ..balance_cleanu
20098 70 3a 0d 0a 20 20 73 71 6c 69 74 65 33 53 63 72 p:.. sqlite3Scr
20099 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 atchFree(apCell)
2009a 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c ;.. for(i=0; i<
2009b 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 nOld; i++){..
2009c 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f releasePage(apO
2009d 6c 64 5b 69 5d 29 3b 0d 0a 20 20 7d 0d 0a 20 20 ld[i]);.. }..
2009e 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b for(i=0; i<nNew;
2009f 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 72 65 6c 65 i++){.. rele
200a0 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d asePage(apNew[i]
200a1 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 );.. }.... ret
200a2 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a urn rc;..}......
200a3 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 /*..** This func
200a4 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 tion is called w
200a5 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 hen the root pag
200a6 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 e of a b-tree st
200a7 72 75 63 74 75 72 65 20 69 73 0d 0a 2a 2a 20 6f ructure is..** o
200a8 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 verfull (has one
200a9 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f or more overflo
200aa 77 20 70 61 67 65 73 29 2e 0d 0a 2a 2a 0d 0a 2a w pages)...**..*
200ab 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 * A new child pa
200ac 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 ge is allocated
200ad 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 and the contents
200ae 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
200af 72 6f 6f 74 0d 0a 2a 2a 20 70 61 67 65 2c 20 69 root..** page, i
200b0 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f ncluding overflo
200b1 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 w cells, are cop
200b2 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 ied into the chi
200b3 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0d 0a 2a 2a ld. The root..**
200b4 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 page is then ov
200b5 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b erwritten to mak
200b6 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 e it an empty pa
200b7 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68 ge with the righ
200b8 74 2d 63 68 69 6c 64 20 0d 0a 2a 2a 20 70 6f 69 t-child ..** poi
200b9 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f nter pointing to
200ba 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0d 0a the new page...
200bb 2a 2a 0d 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 **..** Before re
200bc 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 turning, all poi
200bd 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 nter-map entries
200be 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 corresponding t
200bf 6f 20 70 61 67 65 73 20 0d 0a 2a 2a 20 74 68 61 o pages ..** tha
200c0 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d t the new child-
200c1 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e page now contain
200c2 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 s pointers to ar
200c3 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0d 0a e updated. The..
200c4 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 ** entry corresp
200c5 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 onding to the ne
200c6 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f w right-child po
200c7 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f inter of the roo
200c8 74 0d 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c t..** page is al
200c9 73 6f 20 75 70 64 61 74 65 64 2e 0d 0a 2a 2a 0d so updated...**.
200ca 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 .** If successfu
200cb 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 l, *ppChild is s
200cc 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 et to contain a
200cd 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 reference to the
200ce 20 63 68 69 6c 64 20 0d 0a 2a 2a 20 70 61 67 65 child ..** page
200cf 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 and SQLITE_OK i
200d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 s returned. In t
200d1 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61 6c his case the cal
200d2 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64 0d ler is required.
200d3 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 .** to call rele
200d4 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 asePage() on *pp
200d5 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e Child exactly on
200d6 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 ce. If an error
200d7 6f 63 63 75 72 73 2c 0d 0a 2a 2a 20 61 6e 20 65 occurs,..** an e
200d8 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 rror code is ret
200d9 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 urned and *ppChi
200da 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0d ld is set to 0..
200db 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
200dc 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d balance_deeper(M
200dd 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d emPage *pRoot, M
200de 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 emPage **ppChild
200df 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 ){.. int rc;
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
200e1 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 /* Return v
200e2 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f alue from subpro
200e3 63 65 64 75 72 65 73 20 2a 2f 0d 0a 20 20 4d 65 cedures */.. Me
200e4 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 mPage *pChild =
200e5 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 0; /*
200e6 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 Pointer to a new
200e7 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0d 0a child page */..
200e8 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 Pgno pgnoChild
200e9 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
200ea 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 /* Page number
200eb 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 of the new child
200ec 20 70 61 67 65 20 2a 2f 0d 0a 20 20 42 74 53 68 page */.. BtSh
200ed 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f ared *pBt = pRoo
200ee 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 t->pBt; /* Th
200ef 65 20 42 54 72 65 65 20 2a 2f 0d 0a 0d 0a 20 20 e BTree */....
200f0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e assert( pRoot->n
200f1 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0d 0a 20 Overflow>0 );..
200f2 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
200f3 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d _mutex_held(pBt-
200f4 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 0d 0a 20 20 >mutex) );....
200f5 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 /* Make pRoot, t
200f6 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 he root page of
200f7 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 the b-tree, writ
200f8 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 able. Allocate a
200f9 20 6e 65 77 20 0d 0a 20 20 2a 2a 20 70 61 67 65 new .. ** page
200fa 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d that will becom
200fb 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d e the new right-
200fc 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 child of pPage.
200fd 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 Copy the content
200fe 73 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e s.. ** of the n
200ff 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 ode stored on pR
20100 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 oot into the new
20101 20 63 68 69 6c 64 20 70 61 67 65 2e 0d 0a 20 20 child page...
20102 2a 2f 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 */.. rc = sqlit
20103 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f e3PagerWrite(pRo
20104 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 ot->pDbPage);..
20105 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
20106 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 OK ){.. rc =
20107 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 allocateBtreePag
20108 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 e(pBt,&pChild,&p
20109 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e gnoChild,pRoot->
2010a 70 67 6e 6f 2c 30 29 3b 0d 0a 20 20 20 20 63 6f pgno,0);.. co
2010b 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 pyNodeContent(pR
2010c 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 oot, pChild, &rc
2010d 29 3b 0d 0a 20 20 20 20 69 66 28 20 49 53 41 55 );.. if( ISAU
2010e 54 4f 56 41 43 55 55 4d 20 29 7b 0d 0a 20 20 20 TOVACUUM ){..
2010f 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 ptrmapPut(pBt
20110 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 , pgnoChild, PTR
20111 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 MAP_BTREE, pRoot
20112 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0d 0a 20 ->pgno, &rc);..
20113 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 }.. }.. if(
20114 20 72 63 20 29 7b 0d 0a 20 20 20 20 2a 70 70 43 rc ){.. *ppC
20115 68 69 6c 64 20 3d 20 30 3b 0d 0a 20 20 20 20 72 hild = 0;.. r
20116 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c eleasePage(pChil
20117 64 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 d);.. return
20118 72 63 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 rc;.. }.. asse
20119 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 rt( sqlite3Pager
2011a 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 Iswriteable(pChi
2011b 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0d ld->pDbPage) );.
2011c 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
2011d 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 e3PagerIswriteab
2011e 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 le(pRoot->pDbPag
2011f 65 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 e) );.. assert(
20120 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d pChild->nCell==
20121 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0d pRoot->nCell );.
20122 0a 0d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c ... TRACE(("BAL
20123 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 ANCE: copy root
20124 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 %d into %d\n", p
20125 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 Root->pgno, pChi
20126 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0d 0a 0d 0a 20 ld->pgno));....
20127 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 /* Copy the ove
20128 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d rflow cells from
20129 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 pRoot to pChild
2012a 20 2a 2f 0d 0a 20 20 6d 65 6d 63 70 79 28 70 43 */.. memcpy(pC
2012b 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f hild->aOvfl, pRo
2012c 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 ot->aOvfl, pRoot
2012d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 ->nOverflow*size
2012e 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b of(pRoot->aOvfl[
2012f 30 5d 29 29 3b 0d 0a 20 20 70 43 68 69 6c 64 2d 0]));.. pChild-
20130 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f >nOverflow = pRo
20131 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0d 0a ot->nOverflow;..
20132 0d 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 .. /* Zero the
20133 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f contents of pRoo
20134 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 t. Then install
20135 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 pChild as the ri
20136 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0d 0a 20 ght-child. */..
20137 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c zeroPage(pRoot,
20138 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 pChild->aData[0
20139 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0d ] & ~PTF_LEAF);.
2013a 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f . put4byte(&pRo
2013b 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d ot->aData[pRoot-
2013c 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 >hdrOffset+8], p
2013d 67 6e 6f 43 68 69 6c 64 29 3b 0d 0a 0d 0a 20 20 gnoChild);....
2013e 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c *ppChild = pChil
2013f 64 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c d;.. return SQL
20140 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a ITE_OK;..}..../*
20141 0d 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 ..** The page th
20142 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c at pCur currentl
20143 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 y points to has
20144 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 just been modifi
20145 65 64 20 69 6e 0d 0a 2a 2a 20 73 6f 6d 65 20 77 ed in..** some w
20146 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f ay. This functio
20147 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 n figures out if
20148 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 this modificati
20149 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0d 0a 2a 2a on means the..**
2014a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 tree needs to b
2014b 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 e balanced, and
2014c 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 if so calls the
2014d 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 appropriate bala
2014e 6e 63 69 6e 67 20 0d 0a 2a 2a 20 72 6f 75 74 69 ncing ..** routi
2014f 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f ne. Balancing ro
20150 75 74 69 6e 65 73 20 61 72 65 3a 0d 0a 2a 2a 0d utines are:..**.
20151 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 .** balance_qu
20152 69 63 6b 28 29 0d 0a 2a 2a 20 20 20 62 61 6c 61 ick()..** bala
20153 6e 63 65 5f 64 65 65 70 65 72 28 29 0d 0a 2a 2a nce_deeper()..**
20154 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f balance_nonro
20155 6f 74 28 29 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 ot()..*/..static
20156 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 int balance(BtC
20157 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d 0a 20 ursor *pCur){..
20158 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
20159 5f 4f 4b 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 6e _OK;.. const in
2015a 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 t nMin = pCur->p
2015b 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a Bt->usableSize *
2015c 20 32 20 2f 20 33 3b 0d 0a 20 20 75 38 20 61 42 2 / 3;.. u8 aB
2015d 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 alanceQuickSpace
2015e 5b 31 33 5d 3b 0d 0a 20 20 75 38 20 2a 70 46 72 [13];.. u8 *pFr
2015f 65 65 20 3d 20 30 3b 0d 0a 0d 0a 20 20 54 45 53 ee = 0;.... TES
20160 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e TONLY( int balan
20161 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 ce_quick_called
20162 3d 20 30 20 29 3b 0d 0a 20 20 54 45 53 54 4f 4e = 0 );.. TESTON
20163 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f LY( int balance_
20164 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 deeper_called =
20165 30 20 29 3b 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 0 );.... do {..
20166 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 int iPage =
20167 70 43 75 72 2d 3e 69 50 61 67 65 3b 0d 0a 20 20 pCur->iPage;..
20168 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 MemPage *pPage
20169 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b = pCur->apPage[
2016a 69 50 61 67 65 5d 3b 0d 0a 0d 0a 20 20 20 20 69 iPage];.... i
2016b 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0d 0a f( iPage==0 ){..
2016c 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d if( pPage-
2016d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 >nOverflow ){..
2016e 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f /* The ro
2016f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 ot page of the b
20170 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c -tree is overful
20171 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 l. In this case
20172 63 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 call the..
20173 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 ** balance_dee
20174 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 per() function t
20175 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 o create a new c
20176 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f hild for the roo
20177 74 2d 70 61 67 65 0d 0a 20 20 20 20 20 20 20 20 t-page..
20178 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 ** and copy the
20179 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 current contents
2017a 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 of the root-pag
2017b 65 20 74 6f 20 69 74 2e 20 54 68 65 0d 0a 20 20 e to it. The..
2017c 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 ** next it
2017d 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 eration of the d
2017e 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 o-loop will bala
2017f 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 nce the child pa
20180 67 65 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 20 ge... */
20181 0d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 .. assert
20182 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 ( (balance_deepe
20183 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 r_called++)==0 )
20184 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ;.. rc =
20185 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 balance_deeper(p
20186 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 Page, &pCur->apP
20187 61 67 65 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20 age[1]);..
20188 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
20189 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 _OK ){..
2018a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 pCur->iPage =
2018b 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 43 1;.. pC
2018c 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 ur->aiIdx[0] = 0
2018d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 ;.. pCu
2018e 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b r->aiIdx[1] = 0;
2018f 0d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 .. asse
20190 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 rt( pCur->apPage
20191 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 [1]->nOverflow )
20192 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 ;.. }..
20193 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
20194 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 break;..
20195 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 }.. }else i
20196 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 f( pPage->nOverf
20197 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d low==0 && pPage-
20198 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0d >nFree<=nMin ){.
20199 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 . break;..
2019a 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
2019b 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 MemPage * const
2019c 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d pParent = pCur-
2019d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d >apPage[iPage-1]
2019e 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e ;.. int con
2019f 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e st iIdx = pCur->
201a0 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0d aiIdx[iPage-1];.
201a1 0a 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 ... rc = sq
201a2 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 lite3PagerWrite(
201a3 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 pParent->pDbPage
201a4 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 );.. if( rc
201a5 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a ==SQLITE_OK ){..
201a6 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
201a7 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 MIT_QUICKBALANCE
201a8 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 .. if( pP
201a9 61 67 65 2d 3e 68 61 73 44 61 74 61 0d 0a 20 20 age->hasData..
201aa 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d && pPage-
201ab 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0d 0a 20 >nOverflow==1..
201ac 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 && pPage
201ad 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d ->aOvfl[0].idx==
201ae 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0d 0a 20 20 pPage->nCell..
201af 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e && pParen
201b0 74 2d 3e 70 67 6e 6f 21 3d 31 0d 0a 20 20 20 20 t->pgno!=1..
201b1 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d && pParent-
201b2 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0d 0a 20 20 >nCell==iIdx..
201b3 20 20 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 ){..
201b4 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 /* Call bala
201b5 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 nce_quick() to c
201b6 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c reate a new sibl
201b7 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 ing of pPage on
201b8 77 68 69 63 68 0d 0a 20 20 20 20 20 20 20 20 20 which..
201b9 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 ** to store the
201ba 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 overflow cell.
201bb 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 balance_quick()
201bc 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 inserts a new ce
201bd 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a ll.. **
201be 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 into pParent, w
201bf 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 hich may cause p
201c0 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e Parent overflow.
201c1 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 If this..
201c2 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 ** happens,
201c3 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 the next interat
201c4 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f ion of the do-lo
201c5 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 op will balance
201c6 70 50 61 72 65 6e 74 20 0d 0a 20 20 20 20 20 20 pParent ..
201c7 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 ** use eithe
201c8 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f r balance_nonroo
201c9 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 t() or balance_d
201ca 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 eeper(). Until t
201cb 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 2a his.. *
201cc 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f * happens, the o
201cd 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 verflow cell is
201ce 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 stored in the aB
201cf 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 alanceQuickSpace
201d0 5b 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a [].. **
201d1 20 62 75 66 66 65 72 2e 20 0d 0a 20 20 20 20 20 buffer. ..
201d2 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 **..
201d3 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 ** The purpos
201d4 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
201d5 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 ng assert() is t
201d6 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c o check that onl
201d7 79 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 2a y a.. *
201d8 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f * single call to
201d9 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 balance_quick()
201da 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 is made for eac
201db 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0d 0a h call to this..
201dc 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e ** fun
201dd 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 ction. If this w
201de 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 ere not verified
201df 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 , a subtle bug i
201e0 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0d 0a nvolving reuse..
201e1 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 ** of
201e2 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 the aBalanceQuic
201e3 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 kSpace[] might s
201e4 6e 65 61 6b 20 69 6e 2e 0d 0a 20 20 20 20 20 20 neak in...
201e5 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
201e6 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e assert( (balan
201e7 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b ce_quick_called+
201e8 2b 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 +)==0 );..
201e9 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 rc = balance
201ea 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 _quick(pParent,
201eb 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 pPage, aBalanceQ
201ec 75 69 63 6b 53 70 61 63 65 29 3b 0d 0a 20 20 20 uickSpace);..
201ed 20 20 20 20 20 7d 65 6c 73 65 0d 0a 23 65 6e 64 }else..#end
201ee 69 66 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 if.. {..
201ef 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 /* In t
201f0 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 his case, call b
201f1 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 alance_nonroot()
201f2 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 to redistribute
201f3 20 63 65 6c 6c 73 0d 0a 20 20 20 20 20 20 20 20 cells..
201f4 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 ** between pPa
201f5 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f ge and up to 2 o
201f6 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 f its sibling pa
201f7 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 ges. This involv
201f8 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a es.. **
201f9 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 modifying the c
201fa 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 ontents of pPare
201fb 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 nt, which may ca
201fc 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0d 0a use pParent to..
201fd 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 ** bec
201fe 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 ome overfull or
201ff 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e underfull. The n
20200 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 ext iteration of
20201 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0d 0a 20 20 the do-loop..
20202 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 ** will
20203 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 balance the pare
20204 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 nt page to corre
20205 63 74 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 ct this...
20206 20 20 20 20 2a 2a 20 0d 0a 20 20 20 20 20 20 20 ** ..
20207 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 ** If the par
20208 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 ent page becomes
20209 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f overfull, the o
2020a 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 verflow cell or
2020b 63 65 6c 6c 73 0d 0a 20 20 20 20 20 20 20 20 20 cells..
2020c 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 ** are stored i
2020d 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 n the pSpace buf
2020e 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d fer allocated im
2020f 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e mediately below.
20210 20 0d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 .. **
20211 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 A subsequent ite
20212 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f ration of the do
20213 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 -loop will deal
20214 77 69 74 68 20 74 68 69 73 20 62 79 0d 0a 20 20 with this by..
20215 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 ** calli
20216 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f ng balance_nonro
20217 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 ot() (balance_de
20218 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 eper() may be ca
20219 6c 6c 65 64 20 66 69 72 73 74 2c 0d 0a 20 20 20 lled first,..
2021a 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 ** but it
2021b 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 doesn't deal wi
2021c 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c th overflow cell
2021d 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 s - just moves t
2021e 68 65 6d 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 hem to a..
2021f 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 ** different
20220 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 page). Once thi
20221 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c s subsequent cal
20222 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e l to balance_non
20223 72 6f 6f 74 28 29 20 0d 0a 20 20 20 20 20 20 20 root() ..
20224 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 ** has comple
20225 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 ted, it is safe
20226 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 to release the p
20227 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 Space buffer use
20228 64 20 62 79 0d 0a 20 20 20 20 20 20 20 20 20 20 d by..
20229 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 ** the previous
2022a 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 call, as the ove
2022b 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 rflow cell data
2022c 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0d will have been .
2022d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f . ** co
2022e 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f pied either into
2022f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 the body of a d
20230 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 atabase page or
20231 69 6e 74 6f 20 74 68 65 20 6e 65 77 0d 0a 20 20 into the new..
20232 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 ** pSpac
20233 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 e buffer passed
20234 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 to the latter ca
20235 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f ll to balance_no
20236 6e 72 6f 6f 74 28 29 2e 0d 0a 20 20 20 20 20 20 nroot()...
20237 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 */..
20238 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 u8 *pSpace = s
20239 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 qlite3PageMalloc
2023a 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 (pCur->pBt->page
2023b 53 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 Size);..
2023c 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e rc = balance_n
2023d 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 onroot(pParent,
2023e 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 iIdx, pSpace, iP
2023f 61 67 65 3d 3d 31 29 3b 0d 0a 20 20 20 20 20 20 age==1);..
20240 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b if( pFree ){
20241 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a .. /*
20242 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 If pFree is not
20243 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 NULL, it points
20244 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 to the pSpace b
20245 75 66 66 65 72 20 75 73 65 64 20 0d 0a 20 20 20 uffer used ..
20246 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 ** by a
20247 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 previous call t
20248 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f o balance_nonroo
20249 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 t(). Its content
2024a 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 s are..
2024b 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 ** now stored
2024c 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 either on real
2024d 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f database pages o
2024e 72 20 77 69 74 68 69 6e 20 74 68 65 20 0d 0a 20 r within the ..
2024f 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 ** ne
20250 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c w pSpace buffer,
20251 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 so it may be sa
20252 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e fely freed here.
20253 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 */..
20254 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 sqlite3PageFree
20255 28 70 46 72 65 65 29 3b 0d 0a 20 20 20 20 20 20 (pFree);..
20256 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 }....
20257 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 /* The pSpace
20258 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 buffer will be
20259 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20 freed after the
2025a 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0d 0a 20 20 next call to..
2025b 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e ** balan
2025c 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 ce_nonroot(), or
2025d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69 just before thi
2025e 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
2025f 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0d 0a 20 ns, whichever..
20260 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 ** come
20261 73 20 66 69 72 73 74 2e 20 2a 2f 0d 0a 20 20 20 s first. */..
20262 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 pFree = p
20263 53 70 61 63 65 3b 0d 0a 20 20 20 20 20 20 20 20 Space;..
20264 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 }.. }....
20265 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 pPage->nOver
20266 66 6c 6f 77 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 flow = 0;....
20267 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 /* The next i
20268 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 teration of the
20269 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 do-loop balances
2026a 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 the parent page
2026b 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 6c 65 . */.. rele
2026c 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0d asePage(pPage);.
2026d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 . pCur->iPa
2026e 67 65 2d 2d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 ge--;.. }..
2026f 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 }while( rc==SQLI
20270 54 45 5f 4f 4b 20 29 3b 0d 0a 0d 0a 20 20 69 66 TE_OK );.... if
20271 28 20 70 46 72 65 65 20 29 7b 0d 0a 20 20 20 20 ( pFree ){..
20272 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 sqlite3PageFree(
20273 70 46 72 65 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 pFree);.. }..
20274 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d return rc;..}...
20275 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 73 65 72 74 .../*..** Insert
20276 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e a new record in
20277 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 to the BTree. T
20278 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 he key is given
20279 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0d 0a by (pKey,nKey)..
2027a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 ** and the data
2027b 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 is given by (pDa
2027c 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 ta,nData). The
2027d 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f cursor is used o
2027e 6e 6c 79 20 74 6f 0d 0a 2a 2a 20 64 65 66 69 6e nly to..** defin
2027f 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 e what table the
20280 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 record should b
20281 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e e inserted into.
20282 20 20 54 68 65 20 63 75 72 73 6f 72 0d 0a 2a 2a The cursor..**
20283 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e is left pointin
20284 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f g at a random lo
20285 63 61 74 69 6f 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 cation...**..**
20286 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 For an INTKEY ta
20287 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b ble, only the nK
20288 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 ey value of the
20289 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b key is used. pK
2028a 65 79 20 69 73 0d 0a 2a 2a 20 69 67 6e 6f 72 65 ey is..** ignore
2028b 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 d. For a ZERODA
2028c 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 TA table, the pD
2028d 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 ata and nData ar
2028e 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0d e both ignored..
2028f 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 73 .**..** If the s
20290 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 eekResult parame
20291 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c ter is non-zero,
20292 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 then a successf
20293 75 6c 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 4d ul call to..** M
20294 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 ovetoUnpacked()
20295 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 to seek cursor p
20296 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b Cur to (pKey, nK
20297 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0d ey) has already.
20298 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d .** been perform
20299 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 ed. seekResult i
2029a 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 s the search res
2029b 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 ult returned (a
2029c 6e 65 67 61 74 69 76 65 0d 0a 2a 2a 20 6e 75 6d negative..** num
2029d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e ber if pCur poin
2029e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 ts at an entry t
2029f 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 hat is smaller t
202a0 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 han (pKey, nKey)
202a1 2c 20 6f 72 0d 0a 2a 2a 20 61 20 70 6f 73 69 74 , or..** a posit
202a2 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 ive value if pCu
202a3 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 r points at an e
202a4 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 try that is larg
202a5 65 72 20 74 68 61 6e 20 0d 0a 2a 2a 20 28 70 4b er than ..** (pK
202a6 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0d 0a 2a 2a ey, nKey)). ..**
202a7 0d 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b ..** If the seek
202a8 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 Result parameter
202a9 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 is non-zero, th
202aa 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67 75 en the caller gu
202ab 61 72 61 6e 74 65 65 73 20 74 68 61 74 0d 0a 2a arantees that..*
202ac 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 * cursor pCur is
202ad 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 pointing at the
202ae 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f existing copy o
202af 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20 f a row that is
202b0 74 6f 20 62 65 0d 0a 2a 2a 20 6f 76 65 72 77 72 to be..** overwr
202b1 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73 itten. If the s
202b2 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 eekResult parame
202b3 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 ter is 0, then c
202b4 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0d 0a ursor pCur may..
202b5 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 ** point to any
202b6 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 entry or to no e
202b7 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 ntry at all and
202b8 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e so this function
202b9 20 68 61 73 20 74 6f 20 73 65 65 6b 0d 0a 2a 2a has to seek..**
202ba 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f the cursor befo
202bb 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 re the new key c
202bc 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0d an be inserted..
202bd 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
202be 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 ATE int sqlite3B
202bf 74 72 65 65 49 6e 73 65 72 74 28 0d 0a 20 20 42 treeInsert(.. B
202c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 tCursor *pCur,
202c1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
202c2 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 Insert data int
202c3 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 o the table of t
202c4 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0d 0a 20 his cursor */..
202c5 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 const void *pKe
202c6 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 y, i64 nKey,
202c7 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 /* The key of th
202c8 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0d e new record */.
202c9 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 . const void *p
202ca 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c Data, int nData,
202cb 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 /* The data of
202cc 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 the new record
202cd 2a 2f 0d 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c */.. int nZero,
202ce 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
202cf 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
202d0 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 f extra 0 bytes
202d1 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 to append to dat
202d2 61 20 2a 2f 0d 0a 20 20 69 6e 74 20 61 70 70 65 a */.. int appe
202d3 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 ndBias,
202d4 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
202d5 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 f this is likely
202d6 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0d 0a 20 an append */..
202d7 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 int seekResult
202d8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
202d9 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 /* Result of pri
202da 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 or MovetoUnpacke
202db 64 28 29 20 63 61 6c 6c 20 2a 2f 0d 0a 29 7b 0d d() call */..){.
202dc 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e . int rc;.. in
202dd 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 t loc = seekResu
202de 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 lt; /*
202df 2d 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72 -1: before desir
202e0 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a ed location +1:
202e1 20 61 66 74 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 after */.. int
202e2 20 73 7a 4e 65 77 20 3d 20 30 3b 0d 0a 20 20 69 szNew = 0;.. i
202e3 6e 74 20 69 64 78 3b 0d 0a 20 20 4d 65 6d 50 61 nt idx;.. MemPa
202e4 67 65 20 2a 70 50 61 67 65 3b 0d 0a 20 20 42 74 ge *pPage;.. Bt
202e5 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 ree *p = pCur->p
202e6 42 74 72 65 65 3b 0d 0a 20 20 42 74 53 68 61 72 Btree;.. BtShar
202e7 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 ed *pBt = p->pBt
202e8 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 ;.. unsigned ch
202e9 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0d 0a 20 20 ar *oldCell;..
202ea 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e unsigned char *n
202eb 65 77 43 65 6c 6c 20 3d 20 30 3b 0d 0a 0d 0a 20 ewCell = 0;....
202ec 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 if( pCur->eStat
202ed 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 e==CURSOR_FAULT
202ee 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){.. assert(
202ef 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d pCur->skipNext!=
202f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 SQLITE_OK );..
202f1 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 return pCur->s
202f2 6b 69 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d 0a 0d kipNext;.. }...
202f3 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f . assert( curso
202f4 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 rHoldsMutex(pCur
202f5 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
202f6 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 pCur->wrFlag &&
202f7 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 pBt->inTransacti
202f8 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 0d on==TRANS_WRITE.
202f9 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 . &
202fa 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 & (pBt->btsFlags
202fb 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 & BTS_READ_ONLY
202fc 29 3d 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 )==0 );.. asser
202fd 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 t( hasSharedCach
202fe 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 eTableLock(p, pC
202ff 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 ur->pgnoRoot, pC
20300 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c ur->pKeyInfo!=0,
20301 20 32 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 41 2) );.... /* A
20302 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 ssert that the c
20303 61 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 aller has been c
20304 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 onsistent. If th
20305 69 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 is cursor was op
20306 65 6e 65 64 0d 0a 20 20 2a 2a 20 65 78 70 65 63 ened.. ** expec
20307 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d ting an index b-
20308 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 tree, then the c
20309 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 aller should be
2030a 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62 0d 0a inserting blob..
2030b 20 20 2a 2a 20 6b 65 79 73 20 77 69 74 68 20 6e ** keys with n
2030c 6f 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 o associated dat
2030d 61 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 a. If the cursor
2030e 20 77 61 73 20 6f 70 65 6e 65 64 20 65 78 70 65 was opened expe
2030f 63 74 69 6e 67 20 61 6e 0d 0a 20 20 2a 2a 20 69 cting an.. ** i
20310 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 ntkey table, the
20311 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 caller should b
20312 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 65 e inserting inte
20313 67 65 72 20 6b 65 79 73 20 77 69 74 68 20 61 0d ger keys with a.
20314 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73 . ** blob of as
20315 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 20 sociated data.
20316 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 28 70 */.. assert( (p
20317 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e Key==0)==(pCur->
20318 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0d pKeyInfo==0) );.
20319 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 ... /* If this
2031a 69 73 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 is an insert int
2031b 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 o a table b-tree
2031c 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 , invalidate any
2031d 20 69 6e 63 72 62 6c 6f 62 20 0d 0a 20 20 2a 2a incrblob .. **
2031e 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e cursors open on
2031f 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 72 the row being r
20320 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d 69 6e eplaced (assumin
20321 67 20 74 68 69 73 20 69 73 20 61 20 72 65 70 6c g this is a repl
20322 61 63 65 0d 0a 20 20 2a 2a 20 6f 70 65 72 61 74 ace.. ** operat
20323 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20 6e ion - if it is n
20324 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e ot, the followin
20325 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 g is a no-op).
20326 2a 2f 0d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e */.. if( pCur->
20327 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0d 0a pKeyInfo==0 ){..
20328 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e invalidateIn
20329 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c crblobCursors(p,
2032a 20 6e 4b 65 79 2c 20 30 29 3b 0d 0a 20 20 7d 0d nKey, 0);.. }.
2032b 0a 0d 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 ... /* Save the
2032c 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e positions of an
2032d 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 y other cursors
2032e 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 open on this tab
2032f 6c 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 le... **.. **
20330 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 In some cases, t
20331 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 he call to btree
20332 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 Moveto() below i
20333 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0d 0a s a no-op. For..
20334 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 ** example, wh
20335 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 en inserting dat
20336 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 a into a table w
20337 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 ith auto-generat
20338 65 64 20 69 6e 74 65 67 65 72 0d 0a 20 20 2a 2a ed integer.. **
20339 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 keys, the VDBE
2033a 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 layer invokes sq
2033b 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 lite3BtreeLast()
2033c 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 to figure out t
2033d 68 65 20 0d 0a 20 20 2a 2a 20 69 6e 74 65 67 65 he .. ** intege
2033e 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 r key to use. It
2033f 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 then calls this
20340 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 function to act
20341 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 ually insert the
20342 20 0d 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 .. ** data int
20343 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 o the intkey B-T
20344 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 ree. In this cas
20345 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 e btreeMoveto()
20346 72 65 63 6f 67 6e 69 7a 65 73 0d 0a 20 20 2a 2a recognizes.. **
20347 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 that the cursor
20348 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 is already wher
20349 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 e it needs to be
2034a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 and returns wit
2034b 68 6f 75 74 0d 0a 20 20 2a 2a 20 64 6f 69 6e 67 hout.. ** doing
2034c 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 any work. To av
2034d 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 oid thwarting th
2034e 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e ese optimization
2034f 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 s, it is importa
20350 6e 74 0d 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 nt.. ** not to
20351 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 clear the cursor
20352 20 68 65 72 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 here... */..
20353 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 rc = saveAllCurs
20354 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 ors(pBt, pCur->p
20355 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0d gnoRoot, pCur);.
20356 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 . if( rc ) retu
20357 72 6e 20 72 63 3b 0d 0a 20 20 69 66 28 20 21 6c rn rc;.. if( !l
20358 6f 63 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 oc ){.. rc =
20359 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 btreeMoveto(pCur
2035a 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 , pKey, nKey, ap
2035b 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b pendBias, &loc);
2035c 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 .. if( rc ) r
2035d 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a eturn rc;.. }..
2035e 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e assert( pCur->
2035f 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 eState==CURSOR_V
20360 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 ALID || (pCur->e
20361 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e State==CURSOR_IN
20362 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b VALID && loc) );
20363 0d 0a 0d 0a 20 20 70 50 61 67 65 20 3d 20 70 43 .... pPage = pC
20364 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d ur->apPage[pCur-
20365 3e 69 50 61 67 65 5d 3b 0d 0a 20 20 61 73 73 65 >iPage];.. asse
20366 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 rt( pPage->intKe
20367 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0d y || nKey>=0 );.
20368 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 . assert( pPage
20369 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 ->leaf || !pPage
2036a 2d 3e 69 6e 74 4b 65 79 20 29 3b 0d 0a 0d 0a 20 ->intKey );....
2036b 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a TRACE(("INSERT:
2036c 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 table=%d nkey=%
2036d 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 lld ndata=%d pag
2036e 65 3d 25 64 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 e=%d %s\n",..
2036f 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e pCur->pgn
20370 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 oRoot, nKey, nDa
20371 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c ta, pPage->pgno,
20372 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d .. loc=
20373 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 =0 ? "overwrite"
20374 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 : "new entry"))
20375 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 ;.. assert( pPa
20376 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0d 0a 20 ge->isInit );..
20377 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 allocateTempSpa
20378 63 65 28 70 42 74 29 3b 0d 0a 20 20 6e 65 77 43 ce(pBt);.. newC
20379 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 ell = pBt->pTmpS
2037a 70 61 63 65 3b 0d 0a 20 20 69 66 28 20 6e 65 77 pace;.. if( new
2037b 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e Cell==0 ) return
2037c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a SQLITE_NOMEM;..
2037d 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c rc = fillInCel
2037e 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c l(pPage, newCell
2037f 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 , pKey, nKey, pD
20380 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 ata, nData, nZer
20381 6f 2c 20 26 73 7a 4e 65 77 29 3b 0d 0a 20 20 69 o, &szNew);.. i
20382 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 f( rc ) goto end
20383 5f 69 6e 73 65 72 74 3b 0d 0a 20 20 61 73 73 65 _insert;.. asse
20384 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 rt( szNew==cellS
20385 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 izePtr(pPage, ne
20386 77 43 65 6c 6c 29 20 29 3b 0d 0a 20 20 61 73 73 wCell) );.. ass
20387 65 72 74 28 20 73 7a 4e 65 77 20 3c 3d 20 4d 58 ert( szNew <= MX
20388 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 _CELL_SIZE(pBt)
20389 29 3b 0d 0a 20 20 69 64 78 20 3d 20 70 43 75 72 );.. idx = pCur
2038a 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 ->aiIdx[pCur->iP
2038b 61 67 65 5d 3b 0d 0a 20 20 69 66 28 20 6c 6f 63 age];.. if( loc
2038c 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 75 31 36 20 ==0 ){.. u16
2038d 73 7a 4f 6c 64 3b 0d 0a 20 20 20 20 61 73 73 65 szOld;.. asse
2038e 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e rt( idx<pPage->n
2038f 43 65 6c 6c 20 29 3b 0d 0a 20 20 20 20 72 63 20 Cell );.. rc
20390 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 = sqlite3PagerWr
20391 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 ite(pPage->pDbPa
20392 67 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 ge);.. if( rc
20393 20 29 7b 0d 0a 20 20 20 20 20 20 67 6f 74 6f 20 ){.. goto
20394 65 6e 64 5f 69 6e 73 65 72 74 3b 0d 0a 20 20 20 end_insert;..
20395 20 7d 0d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 }.. oldCell
20396 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 = findCell(pPage
20397 2c 20 69 64 78 29 3b 0d 0a 20 20 20 20 69 66 28 , idx);.. if(
20398 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b !pPage->leaf ){
20399 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e .. memcpy(n
2039a 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c ewCell, oldCell,
2039b 20 34 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 4);.. }..
2039c 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a szOld = cellSiz
2039d 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 ePtr(pPage, oldC
2039e 65 6c 6c 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 ell);.. rc =
2039f 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c clearCell(pPage,
203a0 20 6f 6c 64 43 65 6c 6c 29 3b 0d 0a 20 20 20 20 oldCell);..
203a1 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 dropCell(pPage,
203a2 69 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 idx, szOld, &rc)
203a3 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 ;.. if( rc )
203a4 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b goto end_insert;
203a5 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f .. }else if( lo
203a6 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 c<0 && pPage->nC
203a7 65 6c 6c 3e 30 20 29 7b 0d 0a 20 20 20 20 61 73 ell>0 ){.. as
203a8 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 sert( pPage->lea
203a9 66 20 29 3b 0d 0a 20 20 20 20 69 64 78 20 3d 20 f );.. idx =
203aa 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 ++pCur->aiIdx[pC
203ab 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 20 7d ur->iPage];.. }
203ac 65 6c 73 65 7b 0d 0a 20 20 20 20 61 73 73 65 72 else{.. asser
203ad 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 t( pPage->leaf )
203ae 3b 0d 0a 20 20 7d 0d 0a 20 20 69 6e 73 65 72 74 ;.. }.. insert
203af 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c Cell(pPage, idx,
203b0 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c newCell, szNew,
203b1 20 30 2c 20 30 2c 20 26 72 63 29 3b 0d 0a 20 20 0, 0, &rc);..
203b2 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 assert( rc!=SQLI
203b3 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e TE_OK || pPage->
203b4 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65 nCell>0 || pPage
203b5 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b ->nOverflow>0 );
203b6 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 .... /* If no e
203b7 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 rror has occured
203b8 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 and pPage has a
203b9 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c n overflow cell,
203ba 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 call balance()
203bb 0d 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 .. ** to redist
203bc 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 ribute the cells
203bd 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 within the tree
203be 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 . Since balance(
203bf 29 20 6d 61 79 20 6d 6f 76 65 0d 0a 20 20 2a 2a ) may move.. **
203c0 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 the cursor, zer
203c1 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 o the BtCursor.i
203c2 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 nfo.nSize and Bt
203c3 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 Cursor.validNKey
203c4 0d 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 .. ** variables
203c5 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 50 72 ... **.. ** Pr
203c6 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 evious versions
203c7 6f 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 of SQLite called
203c8 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f moveToRoot() to
203c9 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 move the cursor
203ca 0d 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 .. ** back to t
203cb 68 65 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 he root page as
203cc 62 61 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 balance() used t
203cd 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 o invalidate the
203ce 20 63 6f 6e 74 65 6e 74 73 0d 0a 20 20 2a 2a 20 contents.. **
203cf 6f 66 20 42 74 43 75 72 73 6f 72 2e 61 70 50 61 of BtCursor.apPa
203d0 67 65 5b 5d 20 61 6e 64 20 42 74 43 75 72 73 6f ge[] and BtCurso
203d1 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 r.aiIdx[]. Inste
203d2 61 64 20 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 ad of doing that
203d3 2c 0d 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 ,.. ** set the
203d4 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20 cursor state to
203d5 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69 73 20 "invalid". This
203d6 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 makes common ins
203d7 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 0d 0a ert operations..
203d8 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66 61 ** slightly fa
203d9 73 74 65 72 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a ster... **.. *
203da 2a 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62 * There is a sub
203db 74 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e tle but importan
203dc 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 t optimization h
203dd 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e ere too. When in
203de 73 65 72 74 69 6e 67 0d 0a 20 20 2a 2a 20 6d 75 serting.. ** mu
203df 6c 74 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 ltiple records i
203e0 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d nto an intkey b-
203e1 74 72 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e tree using a sin
203e2 67 6c 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 gle cursor (as c
203e3 61 6e 0d 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 an.. ** happen
203e4 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 while processing
203e5 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f an "INSERT INTO
203e6 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73 74 61 ... SELECT" sta
203e7 74 65 6d 65 6e 74 29 2c 20 69 74 0d 0a 20 20 2a tement), it.. *
203e8 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f 75 * is advantageou
203e9 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63 s to leave the c
203ea 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 ursor pointing t
203eb 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 o the last entry
203ec 20 69 6e 0d 0a 20 20 2a 2a 20 74 68 65 20 62 2d in.. ** the b-
203ed 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65 tree if possible
203ee 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 . If the cursor
203ef 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 is left pointing
203f0 20 74 6f 20 74 68 65 20 6c 61 73 74 0d 0a 20 20 to the last..
203f1 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 ** entry in the
203f2 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e table, and the n
203f3 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 ext row inserted
203f4 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 has an integer
203f5 6b 65 79 0d 0a 20 20 2a 2a 20 6c 61 72 67 65 72 key.. ** larger
203f6 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 than the larges
203f7 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 t existing key,
203f8 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 it is possible t
203f9 6f 20 69 6e 73 65 72 74 20 74 68 65 0d 0a 20 20 o insert the..
203fa 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 ** row without s
203fb 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f eeking the curso
203fc 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 r. This can be a
203fd 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 big performance
203fe 20 62 6f 6f 73 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 boost... */..
203ff 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a pCur->info.nSiz
20400 65 20 3d 20 30 3b 0d 0a 20 20 70 43 75 72 2d 3e e = 0;.. pCur->
20401 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0d 0a validNKey = 0;..
20402 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
20403 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f _OK && pPage->nO
20404 76 65 72 66 6c 6f 77 20 29 7b 0d 0a 20 20 20 20 verflow ){..
20405 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 rc = balance(pCu
20406 72 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 4d 75 r);.... /* Mu
20407 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 st make sure nOv
20408 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 erflow is reset
20409 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 to zero even if
2040a 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0d 0a 20 the balance()..
2040b 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74 ** fails. Int
2040c 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 ernal data struc
2040d 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 ture corruption
2040e 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 will result othe
2040f 72 77 69 73 65 2e 20 0d 0a 20 20 20 20 2a 2a 20 rwise. .. **
20410 41 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 Also, set the cu
20411 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e rsor state to in
20412 76 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 valid. This stop
20413 73 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 s saveCursorPosi
20414 74 69 6f 6e 28 29 0d 0a 20 20 20 20 2a 2a 20 66 tion().. ** f
20415 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 rom trying to sa
20416 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 ve the current p
20417 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 osition of the c
20418 75 72 73 6f 72 2e 20 20 2a 2f 0d 0a 20 20 20 20 ursor. */..
20419 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 pCur->apPage[pCu
2041a 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 r->iPage]->nOver
2041b 66 6c 6f 77 20 3d 20 30 3b 0d 0a 20 20 20 20 70 flow = 0;.. p
2041c 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 Cur->eState = CU
2041d 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0d 0a 20 RSOR_INVALID;..
2041e 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 }.. assert( pC
2041f 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d ur->apPage[pCur-
20420 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c >iPage]->nOverfl
20421 6f 77 3d 3d 30 20 29 3b 0d 0a 0d 0a 65 6e 64 5f ow==0 );....end_
20422 69 6e 73 65 72 74 3a 0d 0a 20 20 72 65 74 75 72 insert:.. retur
20423 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a n rc;..}..../*..
20424 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e ** Delete the en
20425 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72 try that the cur
20426 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 sor is pointing
20427 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0d to. The cursor.
20428 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e .** is left poin
20429 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 ting at a arbitr
2042a 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a ary location...*
2042b 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
2042c 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
2042d 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f eeDelete(BtCurso
2042e 72 20 2a 70 43 75 72 29 7b 0d 0a 20 20 42 74 72 r *pCur){.. Btr
2042f 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 ee *p = pCur->pB
20430 74 72 65 65 3b 0d 0a 20 20 42 74 53 68 61 72 65 tree;.. BtShare
20431 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b d *pBt = p->pBt;
20432 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a ..
20433 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 int rc;
20434 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20435 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
20436 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 4d 65 6d 50 code */.. MemP
20437 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 age *pPage;
20438 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20439 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c 65 /* Page to dele
2043a 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0d te cell from */.
2043b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 . unsigned char
2043c 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 *pCell;
2043d 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
2043e 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65 er to cell to de
2043f 6c 65 74 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 lete */.. int i
20440 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20 CellIdx;
20441 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20442 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c /* Index of cell
20443 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0d 0a 20 to delete */..
20444 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b int iCellDepth;
20445 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20446 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f /* Depth o
20447 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e f node containin
20448 67 20 70 43 65 6c 6c 20 2a 2f 20 0d 0a 0d 0a 20 g pCell */ ....
20449 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 assert( cursorH
2044a 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 oldsMutex(pCur)
2044b 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 );.. assert( pB
2044c 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e t->inTransaction
2044d 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b ==TRANS_WRITE );
2044e 0d 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 .. assert( (pBt
2044f 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 ->btsFlags & BTS
20450 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 _READ_ONLY)==0 )
20451 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 ;.. assert( pCu
20452 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0d 0a 20 20 r->wrFlag );..
20453 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 assert( hasShare
20454 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 dCacheTableLock(
20455 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f p, pCur->pgnoRoo
20456 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 t, pCur->pKeyInf
20457 6f 21 3d 30 2c 20 32 29 20 29 3b 0d 0a 20 20 61 o!=0, 2) );.. a
20458 73 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 ssert( !hasReadC
20459 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 onflicts(p, pCur
2045a 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0d 0a ->pgnoRoot) );..
2045b 0d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 .. if( NEVER(pC
2045c 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
2045d 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 iPage]>=pCur->ap
2045e 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 Page[pCur->iPage
2045f 5d 2d 3e 6e 43 65 6c 6c 29 20 0d 0a 20 20 20 7c ]->nCell) .. |
20460 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 | NEVER(pCur->eS
20461 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c tate!=CURSOR_VAL
20462 49 44 29 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 ID).. ){.. r
20463 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
20464 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e OR; /* Somethin
20465 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e g has gone awry.
20466 20 2a 2f 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a */.. }.... /*
20467 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65 If this is a de
20468 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 lete operation t
20469 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 o remove a row f
2046a 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72 rom a table b-tr
2046b 65 65 2c 0d 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 ee,.. ** invali
2046c 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f date any incrblo
2046d 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f b cursors open o
2046e 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 n the row being
2046f 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0d 0a 20 20 deleted. */..
20470 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e if( pCur->pKeyIn
20471 66 6f 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 6e fo==0 ){.. in
20472 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 validateIncrblob
20473 43 75 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d Cursors(p, pCur-
20474 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0d >info.nKey, 0);.
20475 0a 20 20 7d 0d 0a 0d 0a 20 20 69 43 65 6c 6c 44 . }.... iCellD
20476 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50 61 epth = pCur->iPa
20477 67 65 3b 0d 0a 20 20 69 43 65 6c 6c 49 64 78 20 ge;.. iCellIdx
20478 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43 = pCur->aiIdx[iC
20479 65 6c 6c 44 65 70 74 68 5d 3b 0d 0a 20 20 70 50 ellDepth];.. pP
2047a 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 age = pCur->apPa
2047b 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0d ge[iCellDepth];.
2047c 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 . pCell = findC
2047d 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c ell(pPage, iCell
2047e 49 64 78 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 Idx);.... /* If
2047f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 the page contai
20480 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74 ning the entry t
20481 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 o delete is not
20482 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76 a leaf page, mov
20483 65 0d 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 e.. ** the curs
20484 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 or to the larges
20485 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 t entry in the t
20486 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c ree that is smal
20487 6c 65 72 20 74 68 61 6e 0d 0a 20 20 2a 2a 20 74 ler than.. ** t
20488 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 he entry being d
20489 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c eleted. This cel
2048a 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 l will replace t
2048b 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 he cell being de
2048c 6c 65 74 65 64 0d 0a 20 20 2a 2a 20 66 72 6f 6d leted.. ** from
2048d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f the internal no
2048e 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 de. The 'previou
2048f 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 s' entry is used
20490 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 for this instea
20491 64 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 d.. ** of the '
20492 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 next' entry, as
20493 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 the previous ent
20494 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 ry is always a p
20495 61 72 74 20 6f 66 20 74 68 65 0d 0a 20 20 2a 2a art of the.. **
20496 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 sub-tree headed
20497 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 by the child pa
20498 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 ge of the cell b
20499 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 eing deleted. Th
2049a 69 73 20 6d 61 6b 65 73 0d 0a 20 20 2a 2a 20 62 is makes.. ** b
2049b 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 alancing the tre
2049c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 e following the
2049d 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e delete operation
2049e 20 65 61 73 69 65 72 2e 20 20 2a 2f 0d 0a 20 20 easier. */..
2049f 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 if( !pPage->leaf
204a0 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 6f 74 ){.. int not
204a1 55 73 65 64 3b 0d 0a 20 20 20 20 72 63 20 3d 20 Used;.. rc =
204a2 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 sqlite3BtreePrev
204a3 69 6f 75 73 28 70 43 75 72 2c 20 26 6e 6f 74 55 ious(pCur, ¬U
204a4 73 65 64 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 sed);.. if( r
204a5 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a c ) return rc;..
204a6 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 53 61 76 65 }.... /* Save
204a7 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f the positions o
204a8 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 f any other curs
204a9 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 ors open on this
204aa 20 74 61 62 6c 65 20 62 65 66 6f 72 65 0d 0a 20 table before..
204ab 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d ** making any m
204ac 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 odifications. Ma
204ad 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 ke the page cont
204ae 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 aining the entry
204af 20 74 6f 20 62 65 20 0d 0a 20 20 2a 2a 20 64 65 to be .. ** de
204b0 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e 20 leted writable.
204b1 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 Then free any ov
204b2 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 erflow pages ass
204b3 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
204b4 20 0d 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e .. ** entry an
204b5 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 d finally remove
204b6 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 the cell itself
204b7 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 from within the
204b8 20 70 61 67 65 2e 20 20 0d 0a 20 20 2a 2f 0d 0a page. .. */..
204b9 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 rc = saveAllCu
204ba 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d rsors(pBt, pCur-
204bb 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 >pgnoRoot, pCur)
204bc 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 ;.. if( rc ) re
204bd 74 75 72 6e 20 72 63 3b 0d 0a 20 20 72 63 20 3d turn rc;.. rc =
204be 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 sqlite3PagerWri
204bf 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 te(pPage->pDbPag
204c0 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 20 29 20 e);.. if( rc )
204c1 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 72 63 return rc;.. rc
204c2 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 = clearCell(pPa
204c3 67 65 2c 20 70 43 65 6c 6c 29 3b 0d 0a 20 20 64 ge, pCell);.. d
204c4 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 ropCell(pPage, i
204c5 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a CellIdx, cellSiz
204c6 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c ePtr(pPage, pCel
204c7 6c 29 2c 20 26 72 63 29 3b 0d 0a 20 20 69 66 28 l), &rc);.. if(
204c8 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b rc ) return rc;
204c9 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 .... /* If the
204ca 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61 73 cell deleted was
204cb 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20 not located on
204cc 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 a leaf page, the
204cd 6e 20 74 68 65 20 63 75 72 73 6f 72 0d 0a 20 20 n the cursor..
204ce 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 ** is currently
204cf 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 pointing to the
204d0 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e largest entry in
204d1 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 the sub-tree he
204d2 61 64 65 64 0d 0a 20 20 2a 2a 20 62 79 20 74 68 aded.. ** by th
204d3 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 e child-page of
204d4 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 the cell that wa
204d5 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 s just deleted f
204d6 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0d rom an internal.
204d7 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 . ** node. The
204d8 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 cell from the le
204d9 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f af node needs to
204da 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 be moved to the
204db 20 69 6e 74 65 72 6e 61 6c 0d 0a 20 20 2a 2a 20 internal.. **
204dc 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 node to replace
204dd 74 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c the deleted cell
204de 2e 20 20 2a 2f 0d 0a 20 20 69 66 28 20 21 70 50 . */.. if( !pP
204df 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 age->leaf ){..
204e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 MemPage *pLeaf
204e1 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b = pCur->apPage[
204e2 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 pCur->iPage];..
204e3 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0d 0a 20 int nCell;..
204e4 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 Pgno n = pCur
204e5 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 ->apPage[iCellDe
204e6 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0d 0a 20 pth+1]->pgno;..
204e7 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
204e8 20 2a 70 54 6d 70 3b 0d 0a 0d 0a 20 20 20 20 70 *pTmp;.... p
204e9 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 Cell = findCell(
204ea 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 pLeaf, pLeaf->nC
204eb 65 6c 6c 2d 31 29 3b 0d 0a 20 20 20 20 6e 43 65 ell-1);.. nCe
204ec 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 ll = cellSizePtr
204ed 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0d (pLeaf, pCell);.
204ee 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f . assert( MX_
204ef 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 3e CELL_SIZE(pBt) >
204f0 3d 20 6e 43 65 6c 6c 20 29 3b 0d 0a 0d 0a 20 20 = nCell );....
204f1 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 allocateTempSp
204f2 61 63 65 28 70 42 74 29 3b 0d 0a 20 20 20 20 70 ace(pBt);.. p
204f3 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 Tmp = pBt->pTmpS
204f4 70 61 63 65 3b 0d 0a 0d 0a 20 20 20 20 72 63 20 pace;.... rc
204f5 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 = sqlite3PagerWr
204f6 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 ite(pLeaf->pDbPa
204f7 67 65 29 3b 0d 0a 20 20 20 20 69 6e 73 65 72 74 ge);.. insert
204f8 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c Cell(pPage, iCel
204f9 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e lIdx, pCell-4, n
204fa 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 2c Cell+4, pTmp, n,
204fb 20 26 72 63 29 3b 0d 0a 20 20 20 20 64 72 6f 70 &rc);.. drop
204fc 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 Cell(pLeaf, pLea
204fd 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c f->nCell-1, nCel
204fe 6c 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 69 66 l, &rc);.. if
204ff 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 ( rc ) return rc
20500 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 42 ;.. }.... /* B
20501 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65 65 2e alance the tree.
20502 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 If the entry de
20503 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61 74 65 leted was locate
20504 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 d on a leaf page
20505 2c 0d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 ,.. ** then the
20506 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f cursor still po
20507 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61 67 ints to that pag
20508 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 e. In this case
20509 74 68 65 20 66 69 72 73 74 0d 0a 20 20 2a 2a 20 the first.. **
2050a 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 call to balance(
2050b 29 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72 ) repairs the tr
2050c 65 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e ee, and the if(.
2050d 2e 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 ..) condition is
2050e 0d 0a 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 .. ** never tru
2050f 65 2e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 4f e... **.. ** O
20510 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 therwise, if the
20511 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 entry deleted w
20512 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 as on an interna
20513 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20 74 68 65 l node page, the
20514 6e 0d 0a 20 20 2a 2a 20 70 43 75 72 20 69 73 20 n.. ** pCur is
20515 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 pointing to the
20516 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 77 leaf page from w
20517 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61 73 20 hich a cell was
20518 72 65 6d 6f 76 65 64 20 74 6f 0d 0a 20 20 2a 2a removed to.. **
20519 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c replace the cel
2051a 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 l deleted from t
2051b 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 he internal node
2051c 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 . This is slight
2051d 6c 79 0d 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20 ly.. ** tricky
2051e 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 as the leaf node
2051f 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c may be underful
20520 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72 l, and the inter
20521 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0d 0a 20 20 nal node may..
20522 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 ** be either und
20523 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 er or overfull.
20524 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e In this case run
20525 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 the balancing a
20526 6c 67 6f 72 69 74 68 6d 0d 0a 20 20 2a 2a 20 6f lgorithm.. ** o
20527 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 n the leaf node
20528 66 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 first. If the ba
20529 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 lance proceeds f
2052a 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 ar enough up the
2052b 0d 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 .. ** tree that
2052c 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 we can be sure
2052d 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d that any problem
2052e 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c in the internal
2052f 20 6e 6f 64 65 20 68 61 73 0d 0a 20 20 2a 2a 20 node has.. **
20530 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 been corrected,
20531 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77 so be it. Otherw
20532 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e ise, after balan
20533 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f cing the leaf no
20534 64 65 2c 0d 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 de,.. ** walk t
20535 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65 he cursor up the
20536 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74 tree to the int
20537 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 ernal node and b
20538 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0d 0a 20 alance it as ..
20539 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0d 0a 20 ** well. */..
2053a 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 rc = balance(pC
2053b 75 72 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d ur);.. if( rc==
2053c 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 SQLITE_OK && pCu
2053d 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 r->iPage>iCellDe
2053e 70 74 68 20 29 7b 0d 0a 20 20 20 20 77 68 69 6c pth ){.. whil
2053f 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 e( pCur->iPage>i
20540 43 65 6c 6c 44 65 70 74 68 20 29 7b 0d 0a 20 20 CellDepth ){..
20541 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 releasePage(
20542 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 pCur->apPage[pCu
20543 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0d 0a 20 r->iPage--]);..
20544 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 62 }.. rc = b
20545 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0d 0a 20 alance(pCur);..
20546 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d }.... if( rc==
20547 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
20548 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 moveToRoot(pCu
20549 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 r);.. }.. retu
2054a 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
2054b 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 .** Create a new
2054c 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 BTree table. W
2054d 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 rite into *piTab
2054e 6c 65 20 74 68 65 20 70 61 67 65 0d 0a 2a 2a 20 le the page..**
2054f 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 number for the r
20550 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 oot page of the
20551 6e 65 77 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a new table...**..
20552 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 ** The type of t
20553 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 ype is determine
20554 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 d by the flags p
20555 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 arameter. Only
20556 74 68 65 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e the..** followin
20557 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 g values of flag
20558 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 s are currently
20559 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 in use. Other v
2055a 61 6c 75 65 73 20 66 6f 72 0d 0a 2a 2a 20 66 6c alues for..** fl
2055b 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f ags might not wo
2055c 72 6b 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 rk:..**..**
2055d 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 BTREE_INTKEY|BTR
2055e 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 EE_LEAFDATA
2055f 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 Used for SQL tab
20560 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b les with rowid k
20561 65 79 73 0d 0a 2a 2a 20 20 20 20 20 42 54 52 45 eys..** BTRE
20562 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 E_ZERODATA
20563 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64 Used
20564 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 for SQL indices
20565 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 ..*/..static int
20566 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c btreeCreateTabl
20567 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 e(Btree *p, int
20568 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 63 72 *piTable, int cr
20569 65 61 74 65 54 61 62 46 6c 61 67 73 29 7b 0d 0a eateTabFlags){..
2056a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 BtShared *pBt
2056b 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 4d 65 6d = p->pBt;.. Mem
2056c 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0d 0a 20 20 Page *pRoot;..
2056d 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0d 0a Pgno pgnoRoot;..
2056e 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 int rc;.. int
2056f 20 70 74 66 46 6c 61 67 73 3b 20 20 20 20 20 20 ptfFlags;
20570 20 20 20 20 2f 2a 20 50 61 67 65 2d 74 79 70 65 /* Page-type
20571 20 66 6c 61 67 65 20 66 6f 72 20 74 68 65 20 72 flage for the r
20572 6f 6f 74 20 70 61 67 65 20 6f 66 20 6e 65 77 20 oot page of new
20573 74 61 62 6c 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 table */.... as
20574 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 sert( sqlite3Btr
20575 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 eeHoldsMutex(p)
20576 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 );.. assert( pB
20577 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e t->inTransaction
20578 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b ==TRANS_WRITE );
20579 0d 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 .. assert( (pBt
2057a 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 ->btsFlags & BTS
2057b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 _READ_ONLY)==0 )
2057c 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 ;....#ifdef SQLI
2057d 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 TE_OMIT_AUTOVACU
2057e 55 4d 0d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 UM.. rc = alloc
2057f 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 ateBtreePage(pBt
20580 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 , &pRoot, &pgnoR
20581 6f 6f 74 2c 20 31 2c 20 30 29 3b 0d 0a 20 20 69 oot, 1, 0);.. i
20582 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 72 65 f( rc ){.. re
20583 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 23 turn rc;.. }..#
20584 65 6c 73 65 0d 0a 20 20 69 66 28 20 70 42 74 2d else.. if( pBt-
20585 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0d 0a >autoVacuum ){..
20586 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 Pgno pgnoMov
20587 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 e; /* Move
20588 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d a page here to m
20589 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 ake room for the
2058a 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0d 0a 20 root-page */..
2058b 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 MemPage *pPag
2058c 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 eMove; /* The pa
2058d 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a ge to move to. *
2058e 2f 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 72 65 61 /.... /* Crea
2058f 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 ting a new table
20590 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 may probably re
20591 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 quire moving an
20592 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 existing databas
20593 65 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b e.. ** to mak
20594 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e e room for the n
20595 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 ew tables root p
20596 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 age. In case thi
20597 73 20 70 61 67 65 20 74 75 72 6e 73 0d 0a 20 20 s page turns..
20598 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 ** out to be a
20599 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c n overflow page,
2059a 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 delete all over
2059b 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 flow page-map ca
2059c 63 68 65 73 0d 0a 20 20 20 20 2a 2a 20 68 65 6c ches.. ** hel
2059d 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 d by open cursor
2059e 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 s... */..
2059f 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 invalidateAllOve
205a0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b rflowCache(pBt);
205a1 0d 0a 0d 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 .... /* Read
205a2 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 the value of met
205a3 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 a[3] from the da
205a4 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d tabase to determ
205a5 69 6e 65 20 77 68 65 72 65 20 74 68 65 0d 0a 20 ine where the..
205a6 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 ** root page
205a7 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 of the new table
205a8 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 should go. meta
205a9 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 [3] is the large
205aa 73 74 20 72 6f 6f 74 2d 70 61 67 65 0d 0a 20 20 st root-page..
205ab 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 ** created so
205ac 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 far, so the new
205ad 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 root-page is (me
205ae 74 61 5b 33 5d 2b 31 29 2e 0d 0a 20 20 20 20 2a ta[3]+1)... *
205af 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 /.. sqlite3Bt
205b0 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42 54 reeGetMeta(p, BT
205b1 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 REE_LARGEST_ROOT
205b2 5f 50 41 47 45 2c 20 26 70 67 6e 6f 52 6f 6f 74 _PAGE, &pgnoRoot
205b3 29 3b 0d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 );.. pgnoRoot
205b4 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 ++;.... /* Th
205b5 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 e new root-page
205b6 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 may not be alloc
205b7 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 ated on a pointe
205b8 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 r-map page, or t
205b9 68 65 0d 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 he.. ** PENDI
205ba 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0d 0a 20 NG_BYTE page...
205bb 20 20 20 2a 2f 0d 0a 20 20 20 20 77 68 69 6c 65 */.. while
205bc 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d ( pgnoRoot==PTRM
205bd 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 AP_PAGENO(pBt, p
205be 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0d 0a 20 20 20 gnoRoot) ||..
205bf 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 pgnoRoot==P
205c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 ENDING_BYTE_PAGE
205c1 28 70 42 74 29 20 29 7b 0d 0a 20 20 20 20 20 20 (pBt) ){..
205c2 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0d 0a 20 20 20 pgnoRoot++;..
205c3 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 }.. assert(
205c4 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0d 0a pgnoRoot>=3 );..
205c5 0d 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 .. /* Allocat
205c6 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 e a page. The pa
205c7 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c ge that currentl
205c8 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e y resides at pgn
205c9 6f 52 6f 6f 74 20 77 69 6c 6c 0d 0a 20 20 20 20 oRoot will..
205ca 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 ** be moved to t
205cb 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 he allocated pag
205cc 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c e (unless the al
205cd 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 located page hap
205ce 70 65 6e 73 0d 0a 20 20 20 20 2a 2a 20 74 6f 20 pens.. ** to
205cf 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f reside at pgnoRo
205d0 6f 74 29 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 ot)... */..
205d1 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 rc = allocateB
205d2 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 treePage(pBt, &p
205d3 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d PageMove, &pgnoM
205d4 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 ove, pgnoRoot, 1
205d5 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d );.. if( rc!=
205d6 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
205d7 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
205d8 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 }.... if(
205d9 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 pgnoMove!=pgnoR
205da 6f 6f 74 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a oot ){.. /*
205db 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 pgnoRoot is the
205dc 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 page that will
205dd 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 be used for the
205de 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0d 0a 20 20 root-page of..
205df 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 ** the new t
205e0 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 able (assuming a
205e1 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 n error did not
205e2 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 occur). But we w
205e3 65 72 65 0d 0a 20 20 20 20 20 20 2a 2a 20 61 6c ere.. ** al
205e4 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 located pgnoMove
205e5 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 . If required (i
205e6 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f .e. if it was no
205e7 74 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 t allocated..
205e8 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 ** by extendi
205e9 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 ng the file), th
205ea 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 e current page a
205eb 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d t position pgnoM
205ec 6f 76 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69 73 ove.. ** is
205ed 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c already journal
205ee 65 64 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 ed... */..
205ef 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 u8 eType =
205f0 30 3b 0d 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 0;.. Pgno i
205f1 50 74 72 50 61 67 65 20 3d 20 30 3b 0d 0a 0d 0a PtrPage = 0;....
205f2 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 releasePag
205f3 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0d 0a 0d e(pPageMove);...
205f4 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 . /* Move t
205f5 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c he page currentl
205f6 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f y at pgnoRoot to
205f7 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0d 0a 20 pgnoMove. */..
205f8 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 rc = btreeG
205f9 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f etPage(pBt, pgno
205fa 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 Root, &pRoot, 0)
205fb 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 ;.. if( rc!
205fc 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
205fd 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 return rc
205fe 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 ;.. }..
205ff 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 rc = ptrmapGet
20600 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 (pBt, pgnoRoot,
20601 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 &eType, &iPtrPag
20602 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 65 e);.. if( e
20603 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f Type==PTRMAP_ROO
20604 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d TPAGE || eType==
20605 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 PTRMAP_FREEPAGE
20606 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){.. rc =
20607 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
20608 42 4b 50 54 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a BKPT;.. }..
20609 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
2060a 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
2060b 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 releasePage(
2060c 70 52 6f 6f 74 29 3b 0d 0a 20 20 20 20 20 20 20 pRoot);..
2060d 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 return rc;..
2060e 20 20 20 7d 0d 0a 20 20 20 20 20 20 61 73 73 65 }.. asse
2060f 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 rt( eType!=PTRMA
20610 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0d 0a 20 P_ROOTPAGE );..
20611 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 assert( eTy
20612 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 pe!=PTRMAP_FREEP
20613 41 47 45 20 29 3b 0d 0a 20 20 20 20 20 20 72 63 AGE );.. rc
20614 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 = relocatePage(
20615 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 pBt, pRoot, eTyp
20616 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e e, iPtrPage, pgn
20617 6f 4d 6f 76 65 2c 20 30 29 3b 0d 0a 20 20 20 20 oMove, 0);..
20618 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 releasePage(pR
20619 6f 6f 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f oot);.... /
2061a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 * Obtain the pag
2061b 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f e at pgnoRoot */
2061c 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d .. if( rc!=
2061d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 SQLITE_OK ){..
2061e 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b return rc;
2061f 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
20620 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 rc = btreeGetPa
20621 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 ge(pBt, pgnoRoot
20622 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0d 0a 20 , &pRoot, 0);..
20623 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
20624 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
20625 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
20626 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 63 }.. rc
20627 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 = sqlite3PagerW
20628 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 rite(pRoot->pDbP
20629 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 age);.. if(
2062a 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
2062b 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 {.. relea
2062c 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0d 0a sePage(pRoot);..
2062d 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 return r
2062e 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 c;.. }..
2062f 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 }else{.. p
20630 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 Root = pPageMove
20631 3b 0d 0a 20 20 20 20 7d 20 0d 0a 0d 0a 20 20 20 ;.. } ....
20632 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 /* Update the p
20633 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d ointer-map and m
20634 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 eta-data with th
20635 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 e new root-page
20636 6e 75 6d 62 65 72 2e 20 2a 2f 0d 0a 20 20 20 20 number. */..
20637 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 ptrmapPut(pBt, p
20638 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f gnoRoot, PTRMAP_
20639 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 26 72 63 ROOTPAGE, 0, &rc
2063a 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 29 );.. if( rc )
2063b 7b 0d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 {.. release
2063c 50 61 67 65 28 70 52 6f 6f 74 29 3b 0d 0a 20 20 Page(pRoot);..
2063d 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a return rc;..
2063e 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 }.... /*
2063f 57 68 65 6e 20 74 68 65 20 6e 65 77 20 72 6f 6f When the new roo
20640 74 20 70 61 67 65 20 77 61 73 20 61 6c 6c 6f 63 t page was alloc
20641 61 74 65 64 2c 20 70 61 67 65 20 31 20 77 61 73 ated, page 1 was
20642 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 69 made writable i
20643 6e 0d 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 n.. ** order
20644 65 69 74 68 65 72 20 74 6f 20 69 6e 63 72 65 61 either to increa
20645 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 se the database
20646 66 69 6c 65 73 69 7a 65 2c 20 6f 72 20 74 6f 20 filesize, or to
20647 64 65 63 72 65 6d 65 6e 74 20 74 68 65 0d 0a 20 decrement the..
20648 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 63 ** freelist c
20649 6f 75 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 ount. Hence, th
2064a 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 e sqlite3BtreeUp
2064b 64 61 74 65 4d 65 74 61 28 29 20 63 61 6c 6c 20 dateMeta() call
2064c 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 0d 0a 20 20 cannot fail...
2064d 20 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 */.. assert
2064e 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 ( sqlite3PagerIs
2064f 77 72 69 74 65 61 62 6c 65 28 70 42 74 2d 3e 70 writeable(pBt->p
20650 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 Page1->pDbPage)
20651 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c );.. rc = sql
20652 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d ite3BtreeUpdateM
20653 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f eta(p, 4, pgnoRo
20654 6f 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 4e 45 ot);.. if( NE
20655 56 45 52 28 72 63 29 20 29 7b 0d 0a 20 20 20 20 VER(rc) ){..
20656 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 releasePage(pR
20657 6f 6f 74 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 oot);.. ret
20658 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a urn rc;.. }..
20659 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 .. }else{..
2065a 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 rc = allocateBtr
2065b 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f eePage(pBt, &pRo
2065c 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 ot, &pgnoRoot, 1
2065d 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 , 0);.. if( r
2065e 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a c ) return rc;..
2065f 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 61 }..#endif.. a
20660 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 ssert( sqlite3Pa
20661 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 gerIswriteable(p
20662 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 Root->pDbPage) )
20663 3b 0d 0a 20 20 69 66 28 20 63 72 65 61 74 65 54 ;.. if( createT
20664 61 62 46 6c 61 67 73 20 26 20 42 54 52 45 45 5f abFlags & BTREE_
20665 49 4e 54 4b 45 59 20 29 7b 0d 0a 20 20 20 20 70 INTKEY ){.. p
20666 74 66 46 6c 61 67 73 20 3d 20 50 54 46 5f 49 4e tfFlags = PTF_IN
20667 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 44 TKEY | PTF_LEAFD
20668 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 3b 0d ATA | PTF_LEAF;.
20669 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
2066a 74 66 46 6c 61 67 73 20 3d 20 50 54 46 5f 5a 45 tfFlags = PTF_ZE
2066b 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 RODATA | PTF_LEA
2066c 46 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 65 72 6f 50 F;.. }.. zeroP
2066d 61 67 65 28 70 52 6f 6f 74 2c 20 70 74 66 46 6c age(pRoot, ptfFl
2066e 61 67 73 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 ags);.. sqlite3
2066f 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 PagerUnref(pRoot
20670 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 61 ->pDbPage);.. a
20671 73 73 65 72 74 28 20 28 70 42 74 2d 3e 6f 70 65 ssert( (pBt->ope
20672 6e 46 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 nFlags & BTREE_S
20673 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 70 67 6e INGLE)==0 || pgn
20674 6f 52 6f 6f 74 3d 3d 32 20 29 3b 0d 0a 20 20 2a oRoot==2 );.. *
20675 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 piTable = (int)p
20676 67 6e 6f 52 6f 6f 74 3b 0d 0a 20 20 72 65 74 75 gnoRoot;.. retu
20677 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d rn SQLITE_OK;..}
20678 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
20679 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
2067a 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 eCreateTable(Btr
2067b 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 ee *p, int *piTa
2067c 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b ble, int flags){
2067d 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 73 .. int rc;.. s
2067e 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
2067f 28 70 29 3b 0d 0a 20 20 72 63 20 3d 20 62 74 72 (p);.. rc = btr
20680 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c eeCreateTable(p,
20681 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 piTable, flags)
20682 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 ;.. sqlite3Btre
20683 65 4c 65 61 76 65 28 70 29 3b 0d 0a 20 20 72 65 eLeave(p);.. re
20684 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
20685 2a 0d 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 *..** Erase the
20686 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 given database p
20687 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 age and all its
20688 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 children. Retur
20689 6e 0d 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 n..** the page t
2068a 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0d o the freelist..
2068b 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 .*/..static int
2068c 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 clearDatabasePag
2068d 65 28 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a e(.. BtShared *
2068e 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f pBt, /
2068f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74 * The BTree that
20690 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 contains the ta
20691 62 6c 65 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 70 ble */.. Pgno p
20692 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 gno,
20693 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 /* Page numbe
20694 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0d 0a 20 r to clear */..
20695 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 int freePageFla
20696 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 g, /* Dea
20697 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 llocate page if
20698 74 72 75 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a true */.. int *
20699 70 6e 43 68 61 6e 67 65 20 20 20 20 20 20 20 20 pnChange
2069a 20 20 20 20 2f 2a 20 41 64 64 20 6e 75 6d 62 65 /* Add numbe
2069b 72 20 6f 66 20 43 65 6c 6c 73 20 66 72 65 65 64 r of Cells freed
2069c 20 74 6f 20 74 68 69 73 20 63 6f 75 6e 74 65 72 to this counter
2069d 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 4d 65 6d 50 61 */..){.. MemPa
2069e 67 65 20 2a 70 50 61 67 65 3b 0d 0a 20 20 69 6e ge *pPage;.. in
2069f 74 20 72 63 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 t rc;.. unsigne
206a0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0d 0a d char *pCell;..
206a1 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 61 73 int i;.... as
206a2 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
206a3 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 tex_held(pBt->mu
206a4 74 65 78 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 tex) );.. if( p
206a5 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 gno>btreePagecou
206a6 6e 74 28 70 42 74 29 20 29 7b 0d 0a 20 20 20 20 nt(pBt) ){..
206a7 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
206a8 52 52 55 50 54 5f 42 4b 50 54 3b 0d 0a 20 20 7d RRUPT_BKPT;.. }
206a9 0d 0a 0d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e .... rc = getAn
206aa 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 dInitPage(pBt, p
206ab 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0d 0a 20 gno, &pPage);..
206ac 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e if( rc ) return
206ad 20 72 63 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b rc;.. for(i=0;
206ae 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b i<pPage->nCell;
206af 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 70 43 65 6c i++){.. pCel
206b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 l = findCell(pPa
206b1 67 65 2c 20 69 29 3b 0d 0a 20 20 20 20 69 66 28 ge, i);.. if(
206b2 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b !pPage->leaf ){
206b3 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 .. rc = cle
206b4 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 arDatabasePage(p
206b5 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 Bt, get4byte(pCe
206b6 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 ll), 1, pnChange
206b7 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 );.. if( rc
206b8 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 ) goto cleardat
206b9 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0d 0a abasepage_out;..
206ba 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 }.. rc =
206bb 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c clearCell(pPage,
206bc 20 70 43 65 6c 6c 29 3b 0d 0a 20 20 20 20 69 66 pCell);.. if
206bd 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 ( rc ) goto clea
206be 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 rdatabasepage_ou
206bf 74 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 21 t;.. }.. if( !
206c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a pPage->leaf ){..
206c1 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 rc = clearDa
206c2 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 tabasePage(pBt,
206c3 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d get4byte(&pPage-
206c4 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 >aData[8]), 1, p
206c5 6e 43 68 61 6e 67 65 29 3b 0d 0a 20 20 20 20 69 nChange);.. i
206c6 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 f( rc ) goto cle
206c7 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f ardatabasepage_o
206c8 75 74 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 ut;.. }else if(
206c9 20 70 6e 43 68 61 6e 67 65 20 29 7b 0d 0a 20 20 pnChange ){..
206ca 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d assert( pPage-
206cb 3e 69 6e 74 4b 65 79 20 29 3b 0d 0a 20 20 20 20 >intKey );..
206cc 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 *pnChange += pPa
206cd 67 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 20 20 7d 0d ge->nCell;.. }.
206ce 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 . if( freePageF
206cf 6c 61 67 20 29 7b 0d 0a 20 20 20 20 66 72 65 65 lag ){.. free
206d0 50 61 67 65 28 70 50 61 67 65 2c 20 26 72 63 29 Page(pPage, &rc)
206d1 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 ;.. }else if( (
206d2 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
206d3 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 rWrite(pPage->pD
206d4 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0d 0a 20 bPage))==0 ){..
206d5 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 zeroPage(pPag
206d6 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b e, pPage->aData[
206d7 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0d 0] | PTF_LEAF);.
206d8 0a 20 20 7d 0d 0a 0d 0a 63 6c 65 61 72 64 61 74 . }....cleardat
206d9 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0d 0a abasepage_out:..
206da 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 releasePage(pP
206db 61 67 65 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 age);.. return
206dc 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a rc;..}..../*..**
206dd 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f Delete all info
206de 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 rmation from a s
206df 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 ingle table in t
206e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 he database. iT
206e1 61 62 6c 65 20 69 73 0d 0a 2a 2a 20 74 68 65 20 able is..** the
206e2 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 page number of t
206e3 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 he root of the t
206e4 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 able. After thi
206e5 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e s routine return
206e6 73 2c 0d 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 s,..** the root
206e7 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 page is empty, b
206e8 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e ut still exists.
206e9 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 72 6f ..**..** This ro
206ea 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 utine will fail
206eb 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b with SQLITE_LOCK
206ec 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 ED if there are
206ed 61 6e 79 20 6f 70 65 6e 0d 0a 2a 2a 20 72 65 61 any open..** rea
206ee 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 d cursors on the
206ef 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 table. Open wr
206f0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 ite cursors are
206f1 6d 6f 76 65 64 20 74 6f 20 74 68 65 0d 0a 2a 2a moved to the..**
206f2 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 root of the tab
206f3 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 le...**..** If p
206f4 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e nChange is not N
206f5 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 ULL, then table
206f6 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 iTable must be a
206f7 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 n intkey table.
206f8 54 68 65 0d 0a 2a 2a 20 69 6e 74 65 67 65 72 20 The..** integer
206f9 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f value pointed to
206fa 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 by pnChange is
206fb 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 incremented by t
206fc 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d 0a 2a 2a he number of..**
206fd 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
206fe 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 table...*/..SQLI
206ff 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 TE_PRIVATE int s
20700 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 qlite3BtreeClear
20701 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 Table(Btree *p,
20702 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 int iTable, int
20703 2a 70 6e 43 68 61 6e 67 65 29 7b 0d 0a 20 20 69 *pnChange){.. i
20704 6e 74 20 72 63 3b 0d 0a 20 20 42 74 53 68 61 72 nt rc;.. BtShar
20705 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 ed *pBt = p->pBt
20706 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 ;.. sqlite3Btre
20707 65 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 61 73 eEnter(p);.. as
20708 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 sert( p->inTrans
20709 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b ==TRANS_WRITE );
2070a 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 .... /* Invalid
2070b 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 ate all incrblob
2070c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e cursors open on
2070d 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 28 61 table iTable (a
2070e 73 73 75 6d 69 6e 67 20 69 54 61 62 6c 65 0d 0a ssuming iTable..
2070f 20 20 2a 2a 20 69 73 20 74 68 65 20 72 6f 6f 74 ** is the root
20710 20 6f 66 20 61 20 74 61 62 6c 65 20 62 2d 74 72 of a table b-tr
20711 65 65 20 2d 20 69 66 20 69 74 20 69 73 20 6e 6f ee - if it is no
20712 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 t, the following
20713 20 63 61 6c 6c 20 69 73 0d 0a 20 20 2a 2a 20 61 call is.. ** a
20714 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0d 0a 20 20 no-op). */..
20715 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c invalidateIncrbl
20716 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 30 2c 20 obCursors(p, 0,
20717 31 29 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 73 61 1);.... rc = sa
20718 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 veAllCursors(pBt
20719 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 , (Pgno)iTable,
2071a 30 29 3b 0d 0a 20 20 69 66 28 20 53 51 4c 49 54 0);.. if( SQLIT
2071b 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0d 0a 20 20 20 E_OK==rc ){..
2071c 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 rc = clearDatab
2071d 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 asePage(pBt, (Pg
2071e 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e no)iTable, 0, pn
2071f 43 68 61 6e 67 65 29 3b 0d 0a 20 20 7d 0d 0a 20 Change);.. }..
20720 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 sqlite3BtreeLea
20721 76 65 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 6e ve(p);.. return
20722 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a rc;..}..../*..*
20723 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f * Erase all info
20724 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 rmation in a tab
20725 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 le and add the r
20726 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 oot of the table
20727 20 74 6f 0d 0a 2a 2a 20 74 68 65 20 66 72 65 65 to..** the free
20728 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 list. Except, t
20729 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 he root of the p
2072a 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 rinciple table (
2072b 74 68 65 20 6f 6e 65 20 6f 6e 0d 0a 2a 2a 20 70 the one on..** p
2072c 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 age 1) is never
2072d 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 added to the fre
2072e 65 6c 69 73 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 elist...**..** T
2072f 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c his routine will
20730 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 fail with SQLIT
20731 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 E_LOCKED if ther
20732 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0d 0a e are any open..
20733 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 ** cursors on th
20734 65 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a e table...**..**
20735 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 If AUTOVACUUM i
20736 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 s enabled and th
20737 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 e page at iTable
20738 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 is not the last
20739 0d 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 ..** root page i
2073a 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 n the database f
2073b 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 ile, then the la
2073c 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0d 0a 2a st root page ..*
2073d 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 * in the databas
2073e 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 e file is moved
2073f 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f into the slot fo
20740 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 rmerly occupied
20741 62 79 0d 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e by..** iTable an
20742 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 d that last slot
20743 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 formerly occupi
20744 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 ed by the last r
20745 6f 6f 74 20 70 61 67 65 0d 0a 2a 2a 20 69 73 20 oot page..** is
20746 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 added to the fre
20747 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 elist instead of
20748 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 iTable. In thi
20749 73 20 73 61 79 2c 20 61 6c 6c 0d 0a 2a 2a 20 72 s say, all..** r
2074a 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 oot pages are ke
2074b 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e pt at the beginn
2074c 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 ing of the datab
2074d 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0d ase file, which.
2074e 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 .** is necessary
2074f 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 for AUTOVACUUM
20750 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 to work right.
20751 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 *piMoved is set
20752 74 6f 20 74 68 65 20 0d 0a 2a 2a 20 70 61 67 65 to the ..** page
20753 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 number that use
20754 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 d to be the last
20755 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 root page in th
20756 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0d 0a 2a e file before..*
20757 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 * the move. If
20758 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 no page gets mov
20759 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 ed, *piMoved is
2075a 73 65 74 20 74 6f 20 30 2e 0d 0a 2a 2a 20 54 68 set to 0...** Th
2075b 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 e last root page
2075c 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 is recorded in
2075d 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 meta[3] and the
2075e 76 61 6c 75 65 20 6f 66 0d 0a 2a 2a 20 6d 65 74 value of..** met
2075f 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 a[3] is updated
20760 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 by this procedur
20761 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 e...*/..static i
20762 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c nt btreeDropTabl
20763 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f e(Btree *p, Pgno
20764 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 iTable, int *pi
20765 4d 6f 76 65 64 29 7b 0d 0a 20 20 69 6e 74 20 72 Moved){.. int r
20766 63 3b 0d 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 c;.. MemPage *p
20767 50 61 67 65 20 3d 20 30 3b 0d 0a 20 20 42 74 53 Page = 0;.. BtS
20768 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e hared *pBt = p->
20769 70 42 74 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 pBt;.... assert
2076a 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f ( sqlite3BtreeHo
2076b 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0d 0a ldsMutex(p) );..
2076c 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 assert( p->inT
2076d 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 rans==TRANS_WRIT
2076e 45 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 74 20 E );.... /* It
2076f 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 is illegal to dr
20770 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e op a table if an
20771 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 y cursors are op
20772 65 6e 20 6f 6e 20 74 68 65 0d 0a 20 20 2a 2a 20 en on the.. **
20773 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 database. This i
20774 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 s because in aut
20775 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 o-vacuum mode th
20776 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0d 0a 20 e backend may..
20777 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 ** need to move
20778 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 another root-pa
20779 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 ge to fill a gap
2077a 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c left by the del
2077b 65 74 65 64 0d 0a 20 20 2a 2a 20 72 6f 6f 74 20 eted.. ** root
2077c 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e page. If an open
2077d 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e cursor was usin
2077e 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 g this page a pr
2077f 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0d 0a 20 20 oblem would ..
20780 2a 2a 20 6f 63 63 75 72 2e 0d 0a 20 20 2a 2a 0d ** occur... **.
20781 0a 20 20 2a 2a 20 54 68 69 73 20 65 72 72 6f 72 . ** This error
20782 20 69 73 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 is caught long
20783 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 72 before control r
20784 65 61 63 68 65 73 20 74 68 69 73 20 70 6f 69 6e eaches this poin
20785 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 t... */.. if(
20786 4e 45 56 45 52 28 70 42 74 2d 3e 70 43 75 72 73 NEVER(pBt->pCurs
20787 6f 72 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 or) ){.. sqli
20788 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f te3ConnectionBlo
20789 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d cked(p->db, pBt-
2078a 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 >pCursor->pBtree
2078b 2d 3e 64 62 29 3b 0d 0a 20 20 20 20 72 65 74 75 ->db);.. retu
2078c 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 rn SQLITE_LOCKED
2078d 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0d 0a 20 _SHAREDCACHE;..
2078e 20 7d 0d 0a 0d 0a 20 20 72 63 20 3d 20 62 74 72 }.... rc = btr
2078f 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 eeGetPage(pBt, (
20790 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 Pgno)iTable, &pP
20791 61 67 65 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 age, 0);.. if(
20792 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d rc ) return rc;.
20793 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 . rc = sqlite3B
20794 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 treeClearTable(p
20795 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0d 0a 20 , iTable, 0);..
20796 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 if( rc ){..
20797 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 releasePage(pPag
20798 65 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 e);.. return
20799 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 rc;.. }.... *p
2079a 69 4d 6f 76 65 64 20 3d 20 30 3b 0d 0a 0d 0a 20 iMoved = 0;....
2079b 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b if( iTable>1 ){
2079c 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
2079d 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d OMIT_AUTOVACUUM.
2079e 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 70 50 . freePage(pP
2079f 61 67 65 2c 20 26 72 63 29 3b 0d 0a 20 20 20 20 age, &rc);..
207a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 releasePage(pPag
207a1 65 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 e);..#else..
207a2 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 if( pBt->autoVac
207a3 75 75 6d 20 29 7b 0d 0a 20 20 20 20 20 20 50 67 uum ){.. Pg
207a4 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0d no maxRootPgno;.
207a5 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 . sqlite3Bt
207a6 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42 54 reeGetMeta(p, BT
207a7 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 REE_LARGEST_ROOT
207a8 5f 50 41 47 45 2c 20 26 6d 61 78 52 6f 6f 74 50 _PAGE, &maxRootP
207a9 67 6e 6f 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 gno);.... i
207aa 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f f( iTable==maxRo
207ab 6f 74 50 67 6e 6f 20 29 7b 0d 0a 20 20 20 20 20 otPgno ){..
207ac 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 /* If the tab
207ad 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 le being dropped
207ae 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 is the table wi
207af 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 th the largest r
207b0 6f 6f 74 2d 70 61 67 65 0d 0a 20 20 20 20 20 20 oot-page..
207b1 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 ** number in t
207b2 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 he database, put
207b3 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f the root page o
207b4 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e n the free list.
207b5 20 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 .. */..
207b6 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 freePage(
207b7 70 50 61 67 65 2c 20 26 72 63 29 3b 0d 0a 20 20 pPage, &rc);..
207b8 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 releasePag
207b9 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 e(pPage);..
207ba 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
207bb 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
207bc 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
207bd 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 }..
207be 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
207bf 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 /* The table bei
207c0 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 ng dropped does
207c1 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 not have the lar
207c2 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0d 0a gest root-page..
207c3 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 ** numbe
207c4 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 r in the databas
207c5 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 e. So move the p
207c6 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e age that does in
207c7 74 6f 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20 to the ..
207c8 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 ** gap left by
207c9 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 the deleted root
207ca 2d 70 61 67 65 2e 0d 0a 20 20 20 20 20 20 20 20 -page...
207cb 2a 2f 0d 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 */.. MemP
207cc 61 67 65 20 2a 70 4d 6f 76 65 3b 0d 0a 20 20 20 age *pMove;..
207cd 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 releasePage
207ce 28 70 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 (pPage);..
207cf 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 rc = btreeGetP
207d0 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 age(pBt, maxRoot
207d1 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 Pgno, &pMove, 0)
207d2 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 ;.. if( r
207d3 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
207d4 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
207d5 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d n rc;.. }
207d6 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 .. rc = r
207d7 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c elocatePage(pBt,
207d8 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 pMove, PTRMAP_R
207d9 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 OOTPAGE, 0, iTab
207da 6c 65 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 le, 0);..
207db 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f releasePage(pMo
207dc 76 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 ve);.. if
207dd 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
207de 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 ){.. re
207df 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 turn rc;..
207e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 70 4d 6f }.. pMo
207e1 76 65 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 ve = 0;..
207e2 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 rc = btreeGetPa
207e3 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 ge(pBt, maxRootP
207e4 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b gno, &pMove, 0);
207e5 0d 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61 .. freePa
207e6 67 65 28 70 4d 6f 76 65 2c 20 26 72 63 29 3b 0d ge(pMove, &rc);.
207e7 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 . release
207e8 50 61 67 65 28 70 4d 6f 76 65 29 3b 0d 0a 20 20 Page(pMove);..
207e9 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
207ea 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
207eb 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b return rc;
207ec 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
207ed 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 *piMoved =
207ee 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0d 0a 20 20 maxRootPgno;..
207ef 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f }.... /
207f0 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d * Set the new 'm
207f1 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 ax-root-page' va
207f2 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 lue in the datab
207f3 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 ase header. This
207f4 0d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 .. ** is th
207f5 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 e old value less
207f6 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d one, less one m
207f7 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 ore if that happ
207f8 65 6e 73 20 74 6f 0d 0a 20 20 20 20 20 20 2a 2a ens to.. **
207f9 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 be a root-page
207fa 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 number, less one
207fb 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 again if that i
207fc 73 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 s the.. **
207fd 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 PENDING_BYTE_PAG
207fe 45 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 20 E... */..
207ff 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d maxRootPgno-
20800 2d 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 -;.. while(
20801 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 maxRootPgno==PE
20802 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 NDING_BYTE_PAGE(
20803 70 42 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 pBt)..
20804 20 20 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 || PTRMAP_ISP
20805 41 47 45 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 AGE(pBt, maxRoot
20806 50 67 6e 6f 29 20 29 7b 0d 0a 20 20 20 20 20 20 Pgno) ){..
20807 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b maxRootPgno--;
20808 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 .. }..
20809 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 assert( maxRoot
2080a 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 Pgno!=PENDING_BY
2080b 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0d TE_PAGE(pBt) );.
2080c 0a 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 ... rc = sq
2080d 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 lite3BtreeUpdate
2080e 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f Meta(p, 4, maxRo
2080f 6f 74 50 67 6e 6f 29 3b 0d 0a 20 20 20 20 7d 65 otPgno);.. }e
20810 6c 73 65 7b 0d 0a 20 20 20 20 20 20 66 72 65 65 lse{.. free
20811 50 61 67 65 28 70 50 61 67 65 2c 20 26 72 63 29 Page(pPage, &rc)
20812 3b 0d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 ;.. release
20813 50 61 67 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 Page(pPage);..
20814 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d }..#endif.. }
20815 65 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 49 66 else{.. /* If
20816 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f sqlite3BtreeDro
20817 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 pTable was calle
20818 64 20 6f 6e 20 70 61 67 65 20 31 2e 0d 0a 20 20 d on page 1...
20819 20 20 2a 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 ** This really
2081a 20 6e 65 76 65 72 20 73 68 6f 75 6c 64 20 68 61 never should ha
2081b 70 70 65 6e 20 65 78 63 65 70 74 20 69 6e 20 61 ppen except in a
2081c 20 63 6f 72 72 75 70 74 0d 0a 20 20 20 20 2a 2a corrupt.. **
2081d 20 64 61 74 61 62 61 73 65 2e 20 0d 0a 20 20 20 database. ..
2081e 20 2a 2f 0d 0a 20 20 20 20 7a 65 72 6f 50 61 67 */.. zeroPag
2081f 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 e(pPage, PTF_INT
20820 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0d KEY|PTF_LEAF );.
20821 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 . releasePage
20822 28 70 50 61 67 65 29 3b 0d 0a 20 20 7d 0d 0a 20 (pPage);.. }..
20823 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0d 0a 7d return rc; ..}
20824 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
20825 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
20826 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 eDropTable(Btree
20827 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c *p, int iTable,
20828 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0d int *piMoved){.
20829 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 73 71 . int rc;.. sq
2082a 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 lite3BtreeEnter(
2082b 70 29 3b 0d 0a 20 20 72 63 20 3d 20 62 74 72 65 p);.. rc = btre
2082c 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 eDropTable(p, iT
2082d 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0d able, piMoved);.
2082e 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c . sqlite3BtreeL
2082f 65 61 76 65 28 70 29 3b 0d 0a 20 20 72 65 74 75 eave(p);.. retu
20830 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f rn rc;..}....../
20831 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 *..** This funct
20832 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 ion may only be
20833 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 62 2d called if the b-
20834 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 tree connection
20835 61 6c 72 65 61 64 79 0d 0a 2a 2a 20 68 61 73 20 already..** has
20836 61 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 a read or write
20837 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e transaction open
20838 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 on the database
20839 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 61 64 20 74 ...**..** Read t
2083a 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 he meta-informat
2083b 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 ion out of a dat
2083c 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 abase file. Met
2083d 61 5b 30 5d 0d 0a 2a 2a 20 69 73 20 74 68 65 20 a[0]..** is the
2083e 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 number of free p
2083f 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 ages currently i
20840 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 n the database.
20841 20 4d 65 74 61 5b 31 5d 0d 0a 2a 2a 20 74 68 72 Meta[1]..** thr
20842 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 ough meta[15] ar
20843 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 e available for
20844 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 use by higher la
20845 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0d 0a yers. Meta[0]..
20846 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c ** is read-only,
20847 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 the others are
20848 72 65 61 64 2f 77 72 69 74 65 2e 0d 0a 2a 2a 20 read/write...**
20849 0d 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 ..** The schema
2084a 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 layer numbers me
2084b 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 ta values differ
2084c 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 ently. At the s
2084d 63 68 65 6d 61 0d 0a 2a 2a 20 6c 61 79 65 72 20 chema..** layer
2084e 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b (and the SetCook
2084f 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 ie and ReadCooki
20850 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e e opcodes) the n
20851 75 6d 62 65 72 20 6f 66 0d 0a 2a 2a 20 66 72 65 umber of..** fre
20852 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 e pages is not v
20853 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b isible. So Cook
20854 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d ie[0] is the sam
20855 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0d 0a 2a e as Meta[1]...*
20856 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
20857 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 E void sqlite3Bt
20858 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 reeGetMeta(Btree
20859 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 *p, int idx, u3
2085a 32 20 2a 70 4d 65 74 61 29 7b 0d 0a 20 20 42 74 2 *pMeta){.. Bt
2085b 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d Shared *pBt = p-
2085c 3e 70 42 74 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 >pBt;.... sqlit
2085d 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b e3BtreeEnter(p);
2085e 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 .. assert( p->i
2085f 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e nTrans>TRANS_NON
20860 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 E );.. assert(
20861 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 SQLITE_OK==query
20862 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 SharedCacheTable
20863 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 Lock(p, MASTER_R
20864 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 20 OOT, READ_LOCK)
20865 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 42 );.. assert( pB
20866 74 2d 3e 70 50 61 67 65 31 20 29 3b 0d 0a 20 20 t->pPage1 );..
20867 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 assert( idx>=0 &
20868 26 20 69 64 78 3c 3d 31 35 20 29 3b 0d 0a 0d 0a & idx<=15 );....
20869 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 *pMeta = get4b
2086a 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 yte(&pBt->pPage1
2086b 2d 3e 61 44 61 74 61 5b 33 36 20 2b 20 69 64 78 ->aData[36 + idx
2086c 2a 34 5d 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 *4]);.... /* If
2086d 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 auto-vacuum is
2086e 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 disabled in this
2086f 20 62 75 69 6c 64 20 61 6e 64 20 74 68 69 73 20 build and this
20870 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 is an auto-vacuu
20871 6d 0d 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 m.. ** database
20872 2c 20 6d 61 72 6b 20 74 68 65 20 64 61 74 61 62 , mark the datab
20873 61 73 65 20 61 73 20 72 65 61 64 2d 6f 6e 6c 79 ase as read-only
20874 2e 20 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 . */..#ifdef SQ
20875 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
20876 43 55 55 4d 0d 0a 20 20 69 66 28 20 69 64 78 3d CUUM.. if( idx=
20877 3d 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 =BTREE_LARGEST_R
20878 4f 4f 54 5f 50 41 47 45 20 26 26 20 2a 70 4d 65 OOT_PAGE && *pMe
20879 74 61 3e 30 20 29 7b 0d 0a 20 20 20 20 70 42 74 ta>0 ){.. pBt
2087a 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 ->btsFlags |= BT
2087b 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0d 0a 20 20 S_READ_ONLY;..
2087c 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 73 }..#endif.... s
2087d 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
2087e 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a (p);..}..../*..*
2087f 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 * Write meta-inf
20880 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e ormation back in
20881 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e to the database.
20882 20 20 4d 65 74 61 5b 30 5d 20 69 73 0d 0a 2a 2a Meta[0] is..**
20883 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d read-only and m
20884 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 ay not be writte
20885 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 n...*/..SQLITE_P
20886 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
20887 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 e3BtreeUpdateMet
20888 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 a(Btree *p, int
20889 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b idx, u32 iMeta){
2088a 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 .. BtShared *pB
2088b 74 20 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 75 t = p->pBt;.. u
2088c 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 nsigned char *pP
2088d 31 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 1;.. int rc;..
2088e 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 assert( idx>=1
2088f 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0d 0a 20 && idx<=15 );..
20890 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
20891 65 72 28 70 29 3b 0d 0a 20 20 61 73 73 65 72 74 er(p);.. assert
20892 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 ( p->inTrans==TR
20893 41 4e 53 5f 57 52 49 54 45 20 29 3b 0d 0a 20 20 ANS_WRITE );..
20894 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 assert( pBt->pPa
20895 67 65 31 21 3d 30 20 29 3b 0d 0a 20 20 70 50 31 ge1!=0 );.. pP1
20896 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e = pBt->pPage1->
20897 61 44 61 74 61 3b 0d 0a 20 20 72 63 20 3d 20 73 aData;.. rc = s
20898 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 qlite3PagerWrite
20899 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 (pBt->pPage1->pD
2089a 62 50 61 67 65 29 3b 0d 0a 20 20 69 66 28 20 72 bPage);.. if( r
2089b 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c==SQLITE_OK ){.
2089c 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 . put4byte(&p
2089d 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 P1[36 + idx*4],
2089e 69 4d 65 74 61 29 3b 0d 0a 23 69 66 6e 64 65 66 iMeta);..#ifndef
2089f 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 SQLITE_OMIT_AUT
208a0 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 69 66 28 OVACUUM.. if(
208a1 20 69 64 78 3d 3d 42 54 52 45 45 5f 49 4e 43 52 idx==BTREE_INCR
208a2 5f 56 41 43 55 55 4d 20 29 7b 0d 0a 20 20 20 20 _VACUUM ){..
208a3 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 assert( pBt->a
208a4 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 utoVacuum || iMe
208a5 74 61 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 20 20 ta==0 );..
208a6 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 assert( iMeta==0
208a7 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0d || iMeta==1 );.
208a8 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 . pBt->incr
208a9 56 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d 65 Vacuum = (u8)iMe
208aa 74 61 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 ta;.. }..#end
208ab 69 66 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 if.. }.. sqlit
208ac 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b e3BtreeLeave(p);
208ad 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
208ae 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c }....#ifndef SQL
208af 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f ITE_OMIT_BTREECO
208b0 55 4e 54 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 UNT../*..** The
208b1 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 first argument,
208b2 70 43 75 72 2c 20 69 73 20 61 20 63 75 72 73 6f pCur, is a curso
208b3 72 20 6f 70 65 6e 65 64 20 6f 6e 20 73 6f 6d 65 r opened on some
208b4 20 62 2d 74 72 65 65 2e 20 43 6f 75 6e 74 20 74 b-tree. Count t
208b5 68 65 0d 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 he..** number of
208b6 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
208b7 62 2d 74 72 65 65 20 61 6e 64 20 77 72 69 74 65 b-tree and write
208b8 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 2a the result to *
208b9 70 6e 45 6e 74 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a pnEntry...**..**
208ba 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 SQLITE_OK is re
208bb 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 70 turned if the op
208bc 65 72 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 eration is succe
208bd 73 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 ssfully executed
208be 2e 20 0d 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 . ..** Otherwise
208bf 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 , if an error is
208c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 69 2e encountered (i.
208c1 65 2e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f e. an IO error o
208c2 72 20 64 61 74 61 62 61 73 65 0d 0a 2a 2a 20 63 r database..** c
208c3 6f 72 72 75 70 74 69 6f 6e 29 20 61 6e 20 53 51 orruption) an SQ
208c4 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
208c5 69 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f is returned...*/
208c6 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
208c7 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 int sqlite3Btre
208c8 65 43 6f 75 6e 74 28 42 74 43 75 72 73 6f 72 20 eCount(BtCursor
208c9 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 6e 45 6e *pCur, i64 *pnEn
208ca 74 72 79 29 7b 0d 0a 20 20 69 36 34 20 6e 45 6e try){.. i64 nEn
208cb 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 try = 0;
208cc 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
208cd 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e Value to return
208ce 20 69 6e 20 2a 70 6e 45 6e 74 72 79 20 2a 2f 0d in *pnEntry */.
208cf 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
208d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
208d1 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
208d2 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 69 n code */.... i
208d3 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f f( pCur->pgnoRoo
208d4 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70 6e t==0 ){.. *pn
208d5 45 6e 74 72 79 20 3d 20 30 3b 0d 0a 20 20 20 20 Entry = 0;..
208d6 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
208d7 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63 20 3d 20 6d ;.. }.. rc = m
208d8 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b oveToRoot(pCur);
208d9 0d 0a 0d 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 .... /* Unless
208da 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
208db 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c the following l
208dc 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20 69 74 65 oop runs one ite
208dd 72 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0d ration for each.
208de 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 . ** page in th
208df 65 20 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 e B-Tree structu
208e0 72 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e re (not includin
208e1 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 g overflow pages
208e2 29 2e 20 0d 0a 20 20 2a 2f 0d 0a 20 20 77 68 69 ). .. */.. whi
208e3 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f le( rc==SQLITE_O
208e4 4b 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69 49 K ){.. int iI
208e5 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dx;
208e6 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
208e7 49 6e 64 65 78 20 6f 66 20 63 68 69 6c 64 20 6e Index of child n
208e8 6f 64 65 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f ode in parent */
208e9 0d 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 .. MemPage *p
208ea 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 Page;
208eb 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 /* Curr
208ec 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 ent page of the
208ed 62 2d 74 72 65 65 20 2a 2f 0d 0a 0d 0a 20 20 20 b-tree */....
208ee 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 /* If this is a
208ef 20 6c 65 61 66 20 70 61 67 65 20 6f 72 20 74 68 leaf page or th
208f0 65 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 6e e tree is not an
208f1 20 69 6e 74 2d 6b 65 79 20 74 72 65 65 2c 20 74 int-key tree, t
208f2 68 65 6e 20 0d 0a 20 20 20 20 2a 2a 20 74 68 69 hen .. ** thi
208f3 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 s page contains
208f4 63 6f 75 6e 74 61 62 6c 65 20 65 6e 74 72 69 65 countable entrie
208f5 73 2e 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 s. Increment the
208f6 20 65 6e 74 72 79 20 63 6f 75 6e 74 65 72 0d 0a entry counter..
208f7 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 ** according
208f8 6c 79 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 ly... */..
208f9 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 pPage = pCur->a
208fa 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 pPage[pCur->iPag
208fb 65 5d 3b 0d 0a 20 20 20 20 69 66 28 20 70 50 61 e];.. if( pPa
208fc 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 ge->leaf || !pPa
208fd 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0d 0a 20 ge->intKey ){..
208fe 20 20 20 20 20 6e 45 6e 74 72 79 20 2b 3d 20 70 nEntry += p
208ff 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0d 0a 20 20 Page->nCell;..
20900 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 70 50 }.... /* pP
20901 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6e 6f age is a leaf no
20902 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70 20 6e 61 de. This loop na
20903 76 69 67 61 74 65 73 20 74 68 65 20 63 75 72 73 vigates the curs
20904 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 0d 0a or so that it ..
20905 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f ** points to
20906 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 72 the first inter
20907 69 6f 72 20 63 65 6c 6c 20 74 68 61 74 20 69 74 ior cell that it
20908 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 points to the p
20909 61 72 65 6e 74 20 6f 66 0d 0a 20 20 20 20 2a 2a arent of.. **
2090a 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 the next page i
2090b 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74 20 n the tree that
2090c 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e has not yet been
2090d 20 76 69 73 69 74 65 64 2e 20 54 68 65 0d 0a 20 visited. The..
2090e 20 20 20 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64 ** pCur->aiId
2090f 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 76 x[pCur->iPage] v
20910 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 alue is set to t
20911 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 he index of the
20912 70 61 72 65 6e 74 20 63 65 6c 6c 0d 0a 20 20 20 parent cell..
20913 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c ** of the page,
20914 20 6f 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 or to the numbe
20915 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 r of cells in th
20916 65 20 70 61 67 65 20 69 66 20 74 68 65 20 6e 65 e page if the ne
20917 78 74 20 70 61 67 65 0d 0a 20 20 20 20 2a 2a 20 xt page.. **
20918 74 6f 20 76 69 73 69 74 20 69 73 20 74 68 65 20 to visit is the
20919 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 69 right-child of i
2091a 74 73 20 70 61 72 65 6e 74 2e 0d 0a 20 20 20 20 ts parent...
2091b 2a 2a 0d 0a 20 20 20 20 2a 2a 20 49 66 20 61 6c **.. ** If al
2091c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 74 l pages in the t
2091d 72 65 65 20 68 61 76 65 20 62 65 65 6e 20 76 69 ree have been vi
2091e 73 69 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 sited, return SQ
2091f 4c 49 54 45 5f 4f 4b 20 74 6f 20 74 68 65 0d 0a LITE_OK to the..
20920 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0d 0a ** caller...
20921 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 */.. if(
20922 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0d 0a pPage->leaf ){..
20923 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 do {..
20924 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 if( pCur->iP
20925 61 67 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 age==0 ){..
20926 20 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 /* All page
20927 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 s of the b-tree
20928 68 61 76 65 20 62 65 65 6e 20 76 69 73 69 74 65 have been visite
20929 64 2e 20 52 65 74 75 72 6e 20 73 75 63 63 65 73 d. Return succes
2092a 73 66 75 6c 6c 79 2e 20 2a 2f 0d 0a 20 20 20 20 sfully. */..
2092b 20 20 20 20 20 20 2a 70 6e 45 6e 74 72 79 20 3d *pnEntry =
2092c 20 6e 45 6e 74 72 79 3b 0d 0a 20 20 20 20 20 20 nEntry;..
2092d 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
2092e 45 5f 4f 4b 3b 0d 0a 20 20 20 20 20 20 20 20 7d E_OK;.. }
2092f 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 65 54 6f .. moveTo
20930 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0d 0a 20 Parent(pCur);..
20931 20 20 20 20 20 7d 77 68 69 6c 65 20 28 20 70 43 }while ( pC
20932 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e ur->aiIdx[pCur->
20933 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 iPage]>=pCur->ap
20934 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 Page[pCur->iPage
20935 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0d 0a 0d 0a 20 ]->nCell );....
20936 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 pCur->aiIdx
20937 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2b 2b 3b [pCur->iPage]++;
20938 0d 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 .. pPage =
20939 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 pCur->apPage[pCu
2093a 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a 20 20 20 20 r->iPage];..
2093b 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 44 65 73 63 }.... /* Desc
2093c 65 6e 64 20 74 6f 20 74 68 65 20 63 68 69 6c 64 end to the child
2093d 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 63 65 6c node of the cel
2093e 6c 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f l that the curso
2093f 72 20 63 75 72 72 65 6e 74 6c 79 20 0d 0a 20 20 r currently ..
20940 20 20 2a 2a 20 70 6f 69 6e 74 73 20 61 74 2e 20 ** points at.
20941 54 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 This is the righ
20942 74 2d 63 68 69 6c 64 20 69 66 20 28 69 49 64 78 t-child if (iIdx
20943 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 2e ==pPage->nCell).
20944 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 49 .. */.. iI
20945 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 dx = pCur->aiIdx
20946 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0d 0a [pCur->iPage];..
20947 20 20 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 if( iIdx==pP
20948 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0d 0a 20 age->nCell ){..
20949 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f rc = moveTo
2094a 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 Child(pCur, get4
2094b 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 byte(&pPage->aDa
2094c 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 ta[pPage->hdrOff
2094d 73 65 74 2b 38 5d 29 29 3b 0d 0a 20 20 20 20 7d set+8]));.. }
2094e 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 else{.. rc
2094f 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 = moveToChild(pC
20950 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e ur, get4byte(fin
20951 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 49 64 dCell(pPage, iId
20952 78 29 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 x)));.. }..
20953 7d 0d 0a 0d 0a 20 20 2f 2a 20 41 6e 20 65 72 72 }.... /* An err
20954 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e or has occurred.
20955 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 Return an error
20956 20 63 6f 64 65 2e 20 2a 2f 0d 0a 20 20 72 65 74 code. */.. ret
20957 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 23 65 6e 64 urn rc;..}..#end
20958 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 if..../*..** Ret
20959 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 urn the pager as
2095a 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 sociated with a
2095b 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 BTree. This rou
2095c 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 tine is used for
2095d 0d 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 ..** testing and
2095e 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e debugging only.
2095f 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
20960 56 41 54 45 20 50 61 67 65 72 20 2a 73 71 6c 69 VATE Pager *sqli
20961 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 te3BtreePager(Bt
20962 72 65 65 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 ree *p){.. retu
20963 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 rn p->pBt->pPage
20964 72 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 r;..}....#ifndef
20965 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 SQLITE_OMIT_INT
20966 45 47 52 49 54 59 5f 43 48 45 43 4b 0d 0a 2f 2a EGRITY_CHECK../*
20967 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 ..** Append a me
20968 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 ssage to the err
20969 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e or message strin
2096a 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 g...*/..static v
2096b 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d oid checkAppendM
2096c 73 67 28 0d 0a 20 20 49 6e 74 65 67 72 69 74 79 sg(.. Integrity
2096d 43 6b 20 2a 70 43 68 65 63 6b 2c 0d 0a 20 20 63 Ck *pCheck,.. c
2096e 68 61 72 20 2a 7a 4d 73 67 31 2c 0d 0a 20 20 63 har *zMsg1,.. c
2096f 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
20970 61 74 2c 0d 0a 20 20 2e 2e 2e 0d 0a 29 7b 0d 0a at,.. .....){..
20971 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 va_list ap;..
20972 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 if( !pCheck->mx
20973 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0d 0a 20 Err ) return;..
20974 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d pCheck->mxErr--
20975 3b 0d 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 ;.. pCheck->nEr
20976 72 2b 2b 3b 0d 0a 20 20 76 61 5f 73 74 61 72 74 r++;.. va_start
20977 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0d 0a (ap, zFormat);..
20978 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 if( pCheck->er
20979 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0d 0a 20 rMsg.nChar ){..
2097a 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 sqlite3StrAcc
2097b 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b umAppend(&pCheck
2097c 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 ->errMsg, "\n",
2097d 31 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 1);.. }.. if(
2097e 7a 4d 73 67 31 20 29 7b 0d 0a 20 20 20 20 73 71 zMsg1 ){.. sq
2097f 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 lite3StrAccumApp
20980 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 end(&pCheck->err
20981 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b Msg, zMsg1, -1);
20982 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 .. }.. sqlite3
20983 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b VXPrintf(&pCheck
20984 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f ->errMsg, 1, zFo
20985 72 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 61 rmat, ap);.. va
20986 5f 65 6e 64 28 61 70 29 3b 0d 0a 20 20 69 66 28 _end(ap);.. if(
20987 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e pCheck->errMsg.
20988 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0d mallocFailed ){.
20989 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c . pCheck->mal
2098a 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0d 0a locFailed = 1;..
2098b 20 20 7d 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f }..}..#endif /
2098c 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e * SQLITE_OMIT_IN
2098d 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f TEGRITY_CHECK */
2098e 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 ....#ifndef SQLI
2098f 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 TE_OMIT_INTEGRIT
20990 59 5f 43 48 45 43 4b 0d 0a 2f 2a 0d 0a 2a 2a 20 Y_CHECK../*..**
20991 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 Add 1 to the ref
20992 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 erence count for
20993 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 page iPage. If
20994 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 this is the sec
20995 6f 6e 64 0d 0a 2a 2a 20 72 65 66 65 72 65 6e 63 ond..** referenc
20996 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 e to the page, a
20997 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 dd an error mess
20998 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a age to pCheck->z
20999 45 72 72 4d 73 67 2e 0d 0a 2a 2a 20 52 65 74 75 ErrMsg...** Retu
2099a 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 rn 1 if there ar
2099b 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 e 2 ore more ref
2099c 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 erences to the p
2099d 61 67 65 20 61 6e 64 20 30 20 69 66 0d 0a 2a 2a age and 0 if..**
2099e 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 if this is the
2099f 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 first reference
209a0 74 6f 20 74 68 65 20 70 61 67 65 2e 0d 0a 2a 2a to the page...**
209a1 0d 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 ..** Also check
209a2 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 that the page nu
209a3 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 mber is in bound
209a4 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 s...*/..static i
209a5 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 nt checkRef(Inte
209a6 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c grityCk *pCheck,
209a7 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68 61 Pgno iPage, cha
209a8 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0d 0a 20 r *zContext){..
209a9 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 if( iPage==0 )
209aa 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 69 66 28 return 1;.. if(
209ab 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e iPage>pCheck->n
209ac 50 61 67 65 20 29 7b 0d 0a 20 20 20 20 63 68 65 Page ){.. che
209ad 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 ckAppendMsg(pChe
209ae 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 ck, zContext, "i
209af 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 nvalid page numb
209b0 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0d er %d", iPage);.
209b1 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a . return 1;..
209b2 20 20 7d 0d 0a 20 20 69 66 28 20 70 43 68 65 63 }.. if( pChec
209b3 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d k->anRef[iPage]=
209b4 3d 31 20 29 7b 0d 0a 20 20 20 20 63 68 65 63 6b =1 ){.. check
209b5 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b AppendMsg(pCheck
209b6 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 , zContext, "2nd
209b7 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 reference to pa
209b8 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0d ge %d", iPage);.
209b9 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a . return 1;..
209ba 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 20 28 }.. return (
209bb 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 pCheck->anRef[iP
209bc 61 67 65 5d 2b 2b 29 3e 31 3b 0d 0a 7d 0d 0a 0d age]++)>1;..}...
209bd 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
209be 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d OMIT_AUTOVACUUM.
209bf 0a 2f 2a 0d 0a 2a 2a 20 43 68 65 63 6b 20 74 68 ./*..** Check th
209c0 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 at the entry in
209c1 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 the pointer-map
209c2 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 for page iChild
209c3 6d 61 70 73 20 74 6f 20 0d 0a 2a 2a 20 70 61 67 maps to ..** pag
209c4 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 e iParent, point
209c5 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e er type ptrType.
209c6 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 If not, append
209c7 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
209c8 0d 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0d ..** to pCheck..
209c9 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 .*/..static void
209ca 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0d 0a 20 checkPtrmap(..
209cb 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 IntegrityCk *pC
209cc 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 heck, /* Integ
209cd 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 rity check conte
209ce 78 74 20 2a 2f 0d 0a 20 20 50 67 6e 6f 20 69 43 xt */.. Pgno iC
209cf 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 hild,
209d0 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 /* Child page nu
209d1 6d 62 65 72 20 2a 2f 0d 0a 20 20 75 38 20 65 54 mber */.. u8 eT
209d2 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ype,
209d3 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f /* Expected po
209d4 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a inter map type *
209d5 2f 0d 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e /.. Pgno iParen
209d6 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 t, /* E
209d7 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 xpected pointer
209d8 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 map parent page
209d9 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 63 68 61 number */.. cha
209da 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 r *zContext
209db 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 /* Context d
209dc 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 escription (used
209dd 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 for error msg)
209de 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 */..){.. int rc
209df 3b 0d 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 ;.. u8 ePtrmapT
209e0 79 70 65 3b 0d 0a 20 20 50 67 6e 6f 20 69 50 74 ype;.. Pgno iPt
209e1 72 6d 61 70 50 61 72 65 6e 74 3b 0d 0a 0d 0a 20 rmapParent;....
209e2 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 rc = ptrmapGet(
209e3 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 pCheck->pBt, iCh
209e4 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 ild, &ePtrmapTyp
209e5 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e e, &iPtrmapParen
209e6 74 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 t);.. if( rc!=S
209e7 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 QLITE_OK ){..
209e8 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
209e9 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c NOMEM || rc==SQL
209ea 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 ITE_IOERR_NOMEM
209eb 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 ) pCheck->malloc
209ec 46 61 69 6c 65 64 20 3d 20 31 3b 0d 0a 20 20 20 Failed = 1;..
209ed 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 checkAppendMsg(
209ee 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 pCheck, zContext
209ef 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 , "Failed to rea
209f0 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 d ptrmap key=%d"
209f1 2c 20 69 43 68 69 6c 64 29 3b 0d 0a 20 20 20 20 , iChild);..
209f2 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a 0d 0a return;.. }....
209f3 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 if( ePtrmapTyp
209f4 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 e!=eType || iPtr
209f5 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 mapParent!=iPare
209f6 6e 74 20 29 7b 0d 0a 20 20 20 20 63 68 65 63 6b nt ){.. check
209f7 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b AppendMsg(pCheck
209f8 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0d 0a 20 20 , zContext, ..
209f9 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 "Bad ptr map
209fa 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 entry key=%d ex
209fb 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 pected=(%d,%d) g
209fc 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0d 0a 20 ot=(%d,%d)", ..
209fd 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 iChild, eTy
209fe 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 pe, iParent, ePt
209ff 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 rmapType, iPtrma
20a00 70 50 61 72 65 6e 74 29 3b 0d 0a 20 20 7d 0d 0a pParent);.. }..
20a01 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d }..#endif..../*.
20a02 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e .** Check the in
20a03 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 tegrity of the f
20a04 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e reelist or of an
20a05 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c overflow page l
20a06 69 73 74 2e 0d 0a 2a 2a 20 56 65 72 69 66 79 20 ist...** Verify
20a07 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 that the number
20a08 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 of pages on the
20a09 6c 69 73 74 20 69 73 20 4e 2e 0d 0a 2a 2f 0d 0a list is N...*/..
20a0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 static void chec
20a0b 6b 4c 69 73 74 28 0d 0a 20 20 49 6e 74 65 67 72 kList(.. Integr
20a0c 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 ityCk *pCheck,
20a0d 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 /* Integrity che
20a0e 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f cking context */
20a0f 0d 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 .. int isFreeLi
20a10 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 st, /* Tru
20a11 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 e for a freelist
20a12 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 . False for ove
20a13 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 rflow page list
20a14 2a 2f 0d 0a 20 20 69 6e 74 20 69 50 61 67 65 2c */.. int iPage,
20a15 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
20a16 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 age number for f
20a17 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 irst page in the
20a18 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 list */.. int
20a19 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 N,
20a1a 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 /* Expected nu
20a1b 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e mber of pages in
20a1c 20 74 68 65 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 the list */..
20a1d 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 char *zContext
20a1e 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 /* Context
20a1f 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 for error messa
20a20 67 65 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e ges */..){.. in
20a21 74 20 69 3b 0d 0a 20 20 69 6e 74 20 65 78 70 65 t i;.. int expe
20a22 63 74 65 64 20 3d 20 4e 3b 0d 0a 20 20 69 6e 74 cted = N;.. int
20a23 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b iFirst = iPage;
20a24 0d 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e .. while( N-- >
20a25 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 0 && pCheck->mx
20a26 45 72 72 20 29 7b 0d 0a 20 20 20 20 44 62 50 61 Err ){.. DbPa
20a27 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0d 0a ge *pOvflPage;..
20a28 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
20a29 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0d 0a 20 r *pOvflData;..
20a2a 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 if( iPage<1 )
20a2b 7b 0d 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 {.. checkAp
20a2c 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 pendMsg(pCheck,
20a2d 7a 43 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 zContext,..
20a2e 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 "%d of %d pa
20a2f 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d ges missing from
20a30 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 overflow list s
20a31 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0d tarting at %d",.
20a32 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 . N+1,
20a33 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 expected, iFirst
20a34 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b );.. break;
20a35 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
20a36 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b checkRef(pCheck
20a37 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 , iPage, zContex
20a38 74 29 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 t) ) break;..
20a39 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 if( sqlite3Page
20a3a 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 rGet(pCheck->pPa
20a3b 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 ger, (Pgno)iPage
20a3c 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b , &pOvflPage) ){
20a3d 0d 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 .. checkApp
20a3e 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a endMsg(pCheck, z
20a3f 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 Context, "failed
20a40 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 to get page %d"
20a41 2c 20 69 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 , iPage);..
20a42 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a break;.. }..
20a43 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 pOvflData =
20a44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
20a45 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 )sqlite3PagerGet
20a46 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b Data(pOvflPage);
20a47 0d 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 .. if( isFree
20a48 4c 69 73 74 20 29 7b 0d 0a 20 20 20 20 20 20 69 List ){.. i
20a49 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 nt n = get4byte(
20a4a 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0d &pOvflData[4]);.
20a4b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
20a4c 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d OMIT_AUTOVACUUM.
20a4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 . if( pChec
20a4e 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 k->pBt->autoVacu
20a4f 75 6d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 um ){.. c
20a50 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 heckPtrmap(pChec
20a51 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 k, iPage, PTRMAP
20a52 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 _FREEPAGE, 0, zC
20a53 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 ontext);..
20a54 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 }..#endif..
20a55 20 69 66 28 20 6e 3e 28 69 6e 74 29 70 43 68 65 if( n>(int)pChe
20a56 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 ck->pBt->usableS
20a57 69 7a 65 2f 34 2d 32 20 29 7b 0d 0a 20 20 20 20 ize/4-2 ){..
20a58 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d checkAppendM
20a59 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 sg(pCheck, zCont
20a5a 65 78 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 ext,..
20a5b 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 "freelist leaf
20a5c 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e count too big on
20a5d 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 page %d", iPage
20a5e 29 3b 0d 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b );.. N--;
20a5f 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a .. }else{..
20a60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b for(i=0;
20a61 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 i<n; i++){..
20a62 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 Pgno iFre
20a63 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 ePage = get4byte
20a64 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a (&pOvflData[8+i*
20a65 34 5d 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4]);..#ifndef SQ
20a66 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
20a67 43 55 55 4d 0d 0a 20 20 20 20 20 20 20 20 20 20 CUUM..
20a68 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d if( pCheck->pBt-
20a69 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0d 0a >autoVacuum ){..
20a6a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 chec
20a6b 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 kPtrmap(pCheck,
20a6c 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 iFreePage, PTRMA
20a6d 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a P_FREEPAGE, 0, z
20a6e 43 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 Context);..
20a6f 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a }..#endif..
20a70 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 checkR
20a71 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 ef(pCheck, iFree
20a72 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b Page, zContext);
20a73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
20a74 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0d 0a 20 20 N -= n;..
20a75 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 23 69 }.. }..#i
20a76 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
20a77 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a 20 20 T_AUTOVACUUM..
20a78 20 20 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2f else{.. /
20a79 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 * If this databa
20a7a 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f se supports auto
20a7b 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 -vacuum and iPag
20a7c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 e is not the las
20a7d 74 0d 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 t.. ** page
20a7e 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f in this overflo
20a7f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 w list, check th
20a80 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d at the pointer-m
20a81 61 70 20 65 6e 74 72 79 20 66 6f 72 0d 0a 20 20 ap entry for..
20a82 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f ** the follo
20a83 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 wing page matche
20a84 73 20 69 50 61 67 65 2e 0d 0a 20 20 20 20 20 20 s iPage...
20a85 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 70 43 */.. if( pC
20a86 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 heck->pBt->autoV
20a87 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0d acuum && N>0 ){.
20a88 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 . i = get
20a89 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 4byte(pOvflData)
20a8a 3b 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b ;.. check
20a8b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 Ptrmap(pCheck, i
20a8c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f , PTRMAP_OVERFLO
20a8d 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 W2, iPage, zCont
20a8e 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a ext);.. }..
20a8f 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 }..#endif..
20a90 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 iPage = get4b
20a91 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0d yte(pOvflData);.
20a92 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 . sqlite3Page
20a93 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 rUnref(pOvflPage
20a94 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e 64 );.. }..}..#end
20a95 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 if /* SQLITE_OMI
20a96 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 T_INTEGRITY_CHEC
20a97 4b 20 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 K */....#ifndef
20a98 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 SQLITE_OMIT_INTE
20a99 47 52 49 54 59 5f 43 48 45 43 4b 0d 0a 2f 2a 0d GRITY_CHECK../*.
20a9a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 .** Do various s
20a9b 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 anity checks on
20a9c 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 a single page of
20a9d 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e a tree. Return
20a9e 0d 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 ..** the tree de
20a9f 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 pth. Root pages
20aa0 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 return 0. Pare
20aa1 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 nts of root page
20aa2 73 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 s..** return 1,
20aa3 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0d 0a 2a and so forth...*
20aa4 2a 20 0d 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 * ..** These che
20aa5 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0d 0a 2a cks are done:..*
20aa6 2a 0d 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d *..** 1. M
20aa7 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 ake sure that ce
20aa8 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 lls and freebloc
20aa9 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 ks do not overla
20aaa 70 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 p..** b
20aab 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f ut combine to co
20aac 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 mpletely cover t
20aad 68 65 20 70 61 67 65 2e 0d 0a 2a 2a 20 20 4e 4f he page...** NO
20aae 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 2. Make sure
20aaf 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e cell keys are in
20ab0 20 6f 72 64 65 72 2e 0d 0a 2a 2a 20 20 4e 4f 20 order...** NO
20ab1 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 3. Make sure n
20ab2 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 o key is less th
20ab3 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a an or equal to z
20ab4 4c 6f 77 65 72 42 6f 75 6e 64 2e 0d 0a 2a 2a 20 LowerBound...**
20ab5 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 NO 4. Make su
20ab6 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 re no key is gre
20ab7 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 ater than or equ
20ab8 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e al to zUpperBoun
20ab9 64 2e 0d 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 d...** 5.
20aba 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 Check the integr
20abb 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 ity of overflow
20abc 70 61 67 65 73 2e 0d 0a 2a 2a 20 20 20 20 20 20 pages...**
20abd 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 6. Recursively
20abe 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 call checkTreePa
20abf 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 ge on all childr
20ac0 65 6e 2e 0d 0a 2a 2a 20 20 20 20 20 20 37 2e 20 en...** 7.
20ac1 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 Verify that the
20ac2 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 depth of all ch
20ac3 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 ildren is the sa
20ac4 6d 65 2e 0d 0a 2a 2a 20 20 20 20 20 20 38 2e 20 me...** 8.
20ac5 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 Make sure this
20ac6 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 page is at least
20ac7 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 33% full or els
20ac8 65 20 69 74 20 69 73 0d 0a 2a 2a 20 20 20 20 20 e it is..**
20ac9 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 the root of
20aca 20 74 68 65 20 74 72 65 65 2e 0d 0a 2a 2f 0d 0a the tree...*/..
20acb 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b static int check
20acc 54 72 65 65 50 61 67 65 28 0d 0a 20 20 49 6e 74 TreePage(.. Int
20acd 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b egrityCk *pCheck
20ace 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f , /* Context fo
20acf 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 r the sanity che
20ad0 63 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 50 61 ck */.. int iPa
20ad1 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f ge, /
20ad2 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 * Page number of
20ad3 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 the page to che
20ad4 63 6b 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a ck */.. char *z
20ad5 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 2c 20 2f ParentContext, /
20ad6 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 * Parent context
20ad7 20 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 6e 50 61 */.. i64 *pnPa
20ad8 72 65 6e 74 4d 69 6e 4b 65 79 2c 20 0d 0a 20 20 rentMinKey, ..
20ad9 69 36 34 20 2a 70 6e 50 61 72 65 6e 74 4d 61 78 i64 *pnParentMax
20ada 4b 65 79 0d 0a 29 7b 0d 0a 20 20 4d 65 6d 50 61 Key..){.. MemPa
20adb 67 65 20 2a 70 50 61 67 65 3b 0d 0a 20 20 69 6e ge *pPage;.. in
20adc 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 t i, rc, depth,
20add 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0d 0a d2, pgno, cnt;..
20ade 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 int hdr, cellS
20adf 74 61 72 74 3b 0d 0a 20 20 69 6e 74 20 6e 43 65 tart;.. int nCe
20ae0 6c 6c 3b 0d 0a 20 20 75 38 20 2a 64 61 74 61 3b ll;.. u8 *data;
20ae1 0d 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 .. BtShared *pB
20ae2 74 3b 0d 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 t;.. int usable
20ae3 53 69 7a 65 3b 0d 0a 20 20 63 68 61 72 20 7a 43 Size;.. char zC
20ae4 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0d 0a 20 20 ontext[100];..
20ae5 63 68 61 72 20 2a 68 69 74 20 3d 20 30 3b 0d 0a char *hit = 0;..
20ae6 20 20 69 36 34 20 6e 4d 69 6e 4b 65 79 20 3d 20 i64 nMinKey =
20ae7 30 3b 0d 0a 20 20 69 36 34 20 6e 4d 61 78 4b 65 0;.. i64 nMaxKe
20ae8 79 20 3d 20 30 3b 0d 0a 0d 0a 20 20 73 71 6c 69 y = 0;.... sqli
20ae9 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a te3_snprintf(siz
20aea 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a eof(zContext), z
20aeb 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 Context, "Page %
20aec 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0d 0a 0d d: ", iPage);...
20aed 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 . /* Check that
20aee 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 the page exists
20aef 0d 0a 20 20 2a 2f 0d 0a 20 20 70 42 74 20 3d 20 .. */.. pBt =
20af0 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0d 0a 20 20 pCheck->pBt;..
20af1 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 usableSize = pBt
20af2 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0d 0a 20 ->usableSize;..
20af3 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 if( iPage==0 )
20af4 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 69 66 28 return 0;.. if(
20af5 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b checkRef(pCheck
20af6 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 , iPage, zParent
20af7 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 Context) ) retur
20af8 6e 20 30 3b 0d 0a 20 20 69 66 28 20 28 72 63 20 n 0;.. if( (rc
20af9 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 = btreeGetPage(p
20afa 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c Bt, (Pgno)iPage,
20afb 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 &pPage, 0))!=0
20afc 29 7b 0d 0a 20 20 20 20 63 68 65 63 6b 41 70 70 ){.. checkApp
20afd 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a endMsg(pCheck, z
20afe 43 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 Context,..
20aff 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 "unable to get
20b00 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 the page. error
20b01 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0d 0a code=%d", rc);..
20b02 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 return 0;..
20b03 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 6c 65 61 72 }.... /* Clear
20b04 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 MemPage.isInit
20b05 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 to make sure the
20b06 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 corruption dete
20b07 63 74 69 6f 6e 20 63 6f 64 65 20 69 6e 0d 0a 20 ction code in..
20b08 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 ** btreeInitPag
20b09 65 28 29 20 69 73 20 65 78 65 63 75 74 65 64 2e e() is executed.
20b0a 20 20 2a 2f 0d 0a 20 20 70 50 61 67 65 2d 3e 69 */.. pPage->i
20b0b 73 49 6e 69 74 20 3d 20 30 3b 0d 0a 20 20 69 66 sInit = 0;.. if
20b0c 28 20 28 72 63 20 3d 20 62 74 72 65 65 49 6e 69 ( (rc = btreeIni
20b0d 74 50 61 67 65 28 70 50 61 67 65 29 29 21 3d 30 tPage(pPage))!=0
20b0e 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 ){.. assert(
20b0f 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 rc==SQLITE_CORR
20b10 55 50 54 20 29 3b 20 20 2f 2a 20 54 68 65 20 6f UPT ); /* The o
20b11 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 65 72 72 nly possible err
20b12 6f 72 20 66 72 6f 6d 20 49 6e 69 74 50 61 67 65 or from InitPage
20b13 20 2a 2f 0d 0a 20 20 20 20 63 68 65 63 6b 41 70 */.. checkAp
20b14 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 pendMsg(pCheck,
20b15 7a 43 6f 6e 74 65 78 74 2c 20 0d 0a 20 20 20 20 zContext, ..
20b16 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
20b17 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 btreeInitPage()
20b18 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f returns error co
20b19 64 65 20 25 64 22 2c 20 72 63 29 3b 0d 0a 20 20 de %d", rc);..
20b1a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 releasePage(pP
20b1b 61 67 65 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 age);.. retur
20b1c 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f n 0;.. }.... /
20b1d 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 * Check out all
20b1e 74 68 65 20 63 65 6c 6c 73 2e 0d 0a 20 20 2a 2f the cells... */
20b1f 0d 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0d 0a .. depth = 0;..
20b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 for(i=0; i<pPa
20b21 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 ge->nCell && pCh
20b22 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 eck->mxErr; i++)
20b23 7b 0d 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c {.. u8 *pCell
20b24 3b 0d 0a 20 20 20 20 75 33 32 20 73 7a 3b 0d 0a ;.. u32 sz;..
20b25 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 CellInfo inf
20b26 6f 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 68 65 o;.... /* Che
20b27 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 ck payload overf
20b28 6c 6f 77 20 70 61 67 65 73 0d 0a 20 20 20 20 2a low pages.. *
20b29 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 /.. sqlite3_s
20b2a 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a nprintf(sizeof(z
20b2b 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 Context), zConte
20b2c 78 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 xt,..
20b2d 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 "On tree page
20b2e 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 %d cell %d: ", i
20b2f 50 61 67 65 2c 20 69 29 3b 0d 0a 20 20 20 20 70 Page, i);.. p
20b30 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 Cell = findCell(
20b31 70 50 61 67 65 2c 69 29 3b 0d 0a 20 20 20 20 62 pPage,i);.. b
20b32 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 treeParseCellPtr
20b33 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 (pPage, pCell, &
20b34 69 6e 66 6f 29 3b 0d 0a 20 20 20 20 73 7a 20 3d info);.. sz =
20b35 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0d 0a 20 20 info.nData;..
20b36 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e if( !pPage->in
20b37 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 28 69 6e tKey ) sz += (in
20b38 74 29 69 6e 66 6f 2e 6e 4b 65 79 3b 0d 0a 20 20 t)info.nKey;..
20b39 20 20 2f 2a 20 46 6f 72 20 69 6e 74 4b 65 79 20 /* For intKey
20b3a 70 61 67 65 73 2c 20 63 68 65 63 6b 20 74 68 61 pages, check tha
20b3b 74 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 69 t the keys are i
20b3c 6e 20 6f 72 64 65 72 2e 0d 0a 20 20 20 20 2a 2f n order... */
20b3d 0d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 .. else if( i
20b3e 3d 3d 30 20 29 20 6e 4d 69 6e 4b 65 79 20 3d 20 ==0 ) nMinKey =
20b3f 6e 4d 61 78 4b 65 79 20 3d 20 69 6e 66 6f 2e 6e nMaxKey = info.n
20b40 4b 65 79 3b 0d 0a 20 20 20 20 65 6c 73 65 7b 0d Key;.. else{.
20b41 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e . if( info.
20b42 6e 4b 65 79 20 3c 3d 20 6e 4d 61 78 4b 65 79 20 nKey <= nMaxKey
20b43 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 ){.. chec
20b44 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 kAppendMsg(pChec
20b45 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0d 0a 20 k, zContext, ..
20b46 20 20 20 20 20 20 20 20 20 20 20 22 52 6f 77 69 "Rowi
20b47 64 20 25 6c 6c 64 20 6f 75 74 20 6f 66 20 6f 72 d %lld out of or
20b48 64 65 72 20 28 70 72 65 76 69 6f 75 73 20 77 61 der (previous wa
20b49 73 20 25 6c 6c 64 29 22 2c 20 69 6e 66 6f 2e 6e s %lld)", info.n
20b4a 4b 65 79 2c 20 6e 4d 61 78 4b 65 79 29 3b 0d 0a Key, nMaxKey);..
20b4b 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 6e }.. n
20b4c 4d 61 78 4b 65 79 20 3d 20 69 6e 66 6f 2e 6e 4b MaxKey = info.nK
20b4d 65 79 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ey;.. }..
20b4e 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f assert( sz==info
20b4f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0d 0a 20 20 .nPayload );..
20b50 20 20 69 66 28 20 28 73 7a 3e 69 6e 66 6f 2e 6e if( (sz>info.n
20b51 4c 6f 63 61 6c 29 20 0d 0a 20 20 20 20 20 26 26 Local) .. &&
20b52 20 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f (&pCell[info.iO
20b53 76 65 72 66 6c 6f 77 5d 3c 3d 26 70 50 61 67 65 verflow]<=&pPage
20b54 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 ->aData[pBt->usa
20b55 62 6c 65 53 69 7a 65 5d 29 0d 0a 20 20 20 20 29 bleSize]).. )
20b56 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 {.. int nPa
20b57 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e ge = (sz - info.
20b58 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 nLocal + usableS
20b59 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 ize - 5)/(usable
20b5a 53 69 7a 65 20 2d 20 34 29 3b 0d 0a 20 20 20 20 Size - 4);..
20b5b 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 Pgno pgnoOvfl
20b5c 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c = get4byte(&pCel
20b5d 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 l[info.iOverflow
20b5e 5d 29 3b 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c ]);..#ifndef SQL
20b5f 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 ITE_OMIT_AUTOVAC
20b60 55 55 4d 0d 0a 20 20 20 20 20 20 69 66 28 20 70 UUM.. if( p
20b61 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 Bt->autoVacuum )
20b62 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b {.. check
20b63 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 Ptrmap(pCheck, p
20b64 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f gnoOvfl, PTRMAP_
20b65 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 OVERFLOW1, iPage
20b66 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 , zContext);..
20b67 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 }..#endif..
20b68 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 checkList(p
20b69 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 Check, 0, pgnoOv
20b6a 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 fl, nPage, zCont
20b6b 65 78 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a ext);.. }....
20b6c 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e /* Check san
20b6d 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c ity of left chil
20b6e 64 20 70 61 67 65 2e 0d 0a 20 20 20 20 2a 2f 0d d page... */.
20b6f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d . if( !pPage-
20b70 3e 6c 65 61 66 20 29 7b 0d 0a 20 20 20 20 20 20 >leaf ){..
20b71 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 pgno = get4byte(
20b72 70 43 65 6c 6c 29 3b 0d 0a 23 69 66 6e 64 65 66 pCell);..#ifndef
20b73 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 SQLITE_OMIT_AUT
20b74 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 20 20 69 OVACUUM.. i
20b75 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 f( pBt->autoVacu
20b76 75 6d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 um ){.. c
20b77 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 heckPtrmap(pChec
20b78 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f k, pgno, PTRMAP_
20b79 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 BTREE, iPage, zC
20b7a 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 ontext);..
20b7b 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 }..#endif..
20b7c 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 d2 = checkTreeP
20b7d 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f age(pCheck, pgno
20b7e 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 26 6e 4d 69 , zContext, &nMi
20b7f 6e 4b 65 79 2c 20 69 3d 3d 30 20 3f 20 4e 55 4c nKey, i==0 ? NUL
20b80 4c 20 3a 20 26 6e 4d 61 78 4b 65 79 29 3b 0d 0a L : &nMaxKey);..
20b81 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 if( i>0 &&
20b82 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0d 0a 20 d2!=depth ){..
20b83 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 checkAppe
20b84 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 ndMsg(pCheck, zC
20b85 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 ontext, "Child p
20b86 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 age depth differ
20b87 73 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 s");.. }..
20b88 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b depth = d2;
20b89 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
20b8a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 if( !pPage->le
20b8b 61 66 20 29 7b 0d 0a 20 20 20 20 70 67 6e 6f 20 af ){.. pgno
20b8c 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 = get4byte(&pPag
20b8d 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e e->aData[pPage->
20b8e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0d 0a hdrOffset+8]);..
20b8f 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
20b90 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e intf(sizeof(zCon
20b91 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c text), zContext,
20b92 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
20b93 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65 "On page
20b94 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69 %d at right chi
20b95 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0d 0a ld: ", iPage);..
20b96 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
20b97 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a MIT_AUTOVACUUM..
20b98 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 if( pBt->aut
20b99 6f 56 61 63 75 75 6d 20 29 7b 0d 0a 20 20 20 20 oVacuum ){..
20b9a 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 checkPtrmap(pC
20b9b 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d heck, pgno, PTRM
20b9c 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c AP_BTREE, iPage,
20b9d 20 7a 43 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 zContext);..
20b9e 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 }..#endif..
20b9f 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 checkTreePage(pC
20ba0 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e heck, pgno, zCon
20ba1 74 65 78 74 2c 20 4e 55 4c 4c 2c 20 21 70 50 61 text, NULL, !pPa
20ba2 67 65 2d 3e 6e 43 65 6c 6c 20 3f 20 4e 55 4c 4c ge->nCell ? NULL
20ba3 20 3a 20 26 6e 4d 61 78 4b 65 79 29 3b 0d 0a 20 : &nMaxKey);..
20ba4 20 7d 0d 0a 20 0d 0a 20 20 2f 2a 20 46 6f 72 20 }.. .. /* For
20ba5 69 6e 74 4b 65 79 20 6c 65 61 66 20 70 61 67 65 intKey leaf page
20ba6 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 s, check that th
20ba7 65 20 6d 69 6e 2f 6d 61 78 20 6b 65 79 73 20 61 e min/max keys a
20ba8 72 65 20 69 6e 20 6f 72 64 65 72 0d 0a 20 20 2a re in order.. *
20ba9 2a 20 77 69 74 68 20 61 6e 79 20 6c 65 66 74 2f * with any left/
20baa 70 61 72 65 6e 74 2f 72 69 67 68 74 20 70 61 67 parent/right pag
20bab 65 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 es... */.. if(
20bac 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 pPage->leaf &&
20bad 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b pPage->intKey ){
20bae 0d 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 20 61 .. /* if we a
20baf 72 65 20 61 20 6c 65 66 74 20 63 68 69 6c 64 20 re a left child
20bb0 70 61 67 65 20 2a 2f 0d 0a 20 20 20 20 69 66 28 page */.. if(
20bb1 20 70 6e 50 61 72 65 6e 74 4d 69 6e 4b 65 79 20 pnParentMinKey
20bb2 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 ){.. /* if
20bb3 77 65 20 61 72 65 20 74 68 65 20 6c 65 66 74 20 we are the left
20bb4 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 most child page
20bb5 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 21 70 */.. if( !p
20bb6 6e 50 61 72 65 6e 74 4d 61 78 4b 65 79 20 29 7b nParentMaxKey ){
20bb7 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4d .. if( nM
20bb8 61 78 4b 65 79 20 3e 20 2a 70 6e 50 61 72 65 6e axKey > *pnParen
20bb9 74 4d 69 6e 4b 65 79 20 29 7b 0d 0a 20 20 20 20 tMinKey ){..
20bba 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e checkAppen
20bbb 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f dMsg(pCheck, zCo
20bbc 6e 74 65 78 74 2c 20 0d 0a 20 20 20 20 20 20 20 ntext, ..
20bbd 20 20 20 20 20 20 20 22 52 6f 77 69 64 20 25 6c "Rowid %l
20bbe 6c 64 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 ld out of order
20bbf 28 6d 61 78 20 6c 61 72 67 65 72 20 74 68 61 6e (max larger than
20bc0 20 70 61 72 65 6e 74 20 6d 69 6e 20 6f 66 20 25 parent min of %
20bc1 6c 6c 64 29 22 2c 0d 0a 20 20 20 20 20 20 20 20 lld)",..
20bc2 20 20 20 20 20 20 6e 4d 61 78 4b 65 79 2c 20 2a nMaxKey, *
20bc3 70 6e 50 61 72 65 6e 74 4d 69 6e 4b 65 79 29 3b pnParentMinKey);
20bc4 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
20bc5 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
20bc6 20 20 20 69 66 28 20 6e 4d 69 6e 4b 65 79 20 3c if( nMinKey <
20bc7 3d 20 2a 70 6e 50 61 72 65 6e 74 4d 69 6e 4b 65 = *pnParentMinKe
20bc8 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 y ){..
20bc9 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 checkAppendMsg(p
20bca 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c Check, zContext,
20bcb 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
20bcc 20 22 52 6f 77 69 64 20 25 6c 6c 64 20 6f 75 74 "Rowid %lld out
20bcd 20 6f 66 20 6f 72 64 65 72 20 28 6d 69 6e 20 6c of order (min l
20bce 65 73 73 20 74 68 61 6e 20 70 61 72 65 6e 74 20 ess than parent
20bcf 6d 69 6e 20 6f 66 20 25 6c 6c 64 29 22 2c 0d 0a min of %lld)",..
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4d nM
20bd1 69 6e 4b 65 79 2c 20 2a 70 6e 50 61 72 65 6e 74 inKey, *pnParent
20bd2 4d 69 6e 4b 65 79 29 3b 0d 0a 20 20 20 20 20 20 MinKey);..
20bd3 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 }.. if(
20bd4 20 6e 4d 61 78 4b 65 79 20 3e 20 2a 70 6e 50 61 nMaxKey > *pnPa
20bd5 72 65 6e 74 4d 61 78 4b 65 79 20 29 7b 0d 0a 20 rentMaxKey ){..
20bd6 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 checkAp
20bd7 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 pendMsg(pCheck,
20bd8 7a 43 6f 6e 74 65 78 74 2c 20 0d 0a 20 20 20 20 zContext, ..
20bd9 20 20 20 20 20 20 20 20 20 20 22 52 6f 77 69 64 "Rowid
20bda 20 25 6c 6c 64 20 6f 75 74 20 6f 66 20 6f 72 64 %lld out of ord
20bdb 65 72 20 28 6d 61 78 20 6c 61 72 67 65 72 20 74 er (max larger t
20bdc 68 61 6e 20 70 61 72 65 6e 74 20 6d 61 78 20 6f han parent max o
20bdd 66 20 25 6c 6c 64 29 22 2c 0d 0a 20 20 20 20 20 f %lld)",..
20bde 20 20 20 20 20 20 20 20 20 6e 4d 61 78 4b 65 79 nMaxKey
20bdf 2c 20 2a 70 6e 50 61 72 65 6e 74 4d 61 78 4b 65 , *pnParentMaxKe
20be0 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a y);.. }..
20be1 20 20 20 20 20 20 20 20 2a 70 6e 50 61 72 65 6e *pnParen
20be2 74 4d 69 6e 4b 65 79 20 3d 20 6e 4d 61 78 4b 65 tMinKey = nMaxKe
20be3 79 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 y;.. }..
20be4 20 2f 2a 20 65 6c 73 65 20 69 66 20 77 65 27 72 /* else if we'r
20be5 65 20 61 20 72 69 67 68 74 20 63 68 69 6c 64 20 e a right child
20be6 70 61 67 65 20 2a 2f 0d 0a 20 20 20 20 7d 20 65 page */.. } e
20be7 6c 73 65 20 69 66 28 20 70 6e 50 61 72 65 6e 74 lse if( pnParent
20be8 4d 61 78 4b 65 79 20 29 7b 0d 0a 20 20 20 20 20 MaxKey ){..
20be9 20 69 66 28 20 6e 4d 69 6e 4b 65 79 20 3c 3d 20 if( nMinKey <=
20bea 2a 70 6e 50 61 72 65 6e 74 4d 61 78 4b 65 79 20 *pnParentMaxKey
20beb 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 ){.. chec
20bec 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 kAppendMsg(pChec
20bed 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0d 0a 20 k, zContext, ..
20bee 20 20 20 20 20 20 20 20 20 20 20 22 52 6f 77 69 "Rowi
20bef 64 20 25 6c 6c 64 20 6f 75 74 20 6f 66 20 6f 72 d %lld out of or
20bf0 64 65 72 20 28 6d 69 6e 20 6c 65 73 73 20 74 68 der (min less th
20bf1 61 6e 20 70 61 72 65 6e 74 20 6d 61 78 20 6f 66 an parent max of
20bf2 20 25 6c 6c 64 29 22 2c 0d 0a 20 20 20 20 20 20 %lld)",..
20bf3 20 20 20 20 20 20 6e 4d 69 6e 4b 65 79 2c 20 2a nMinKey, *
20bf4 70 6e 50 61 72 65 6e 74 4d 61 78 4b 65 79 29 3b pnParentMaxKey);
20bf5 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
20bf6 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 68 .. }.... /* Ch
20bf7 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 eck for complete
20bf8 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 coverage of the
20bf9 20 70 61 67 65 0d 0a 20 20 2a 2f 0d 0a 20 20 64 page.. */.. d
20bfa 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 ata = pPage->aDa
20bfb 74 61 3b 0d 0a 20 20 68 64 72 20 3d 20 70 50 61 ta;.. hdr = pPa
20bfc 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0d 0a ge->hdrOffset;..
20bfd 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 hit = sqlite3P
20bfe 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e ageMalloc( pBt->
20bff 70 61 67 65 53 69 7a 65 20 29 3b 0d 0a 20 20 69 pageSize );.. i
20c00 66 28 20 68 69 74 3d 3d 30 20 29 7b 0d 0a 20 20 f( hit==0 ){..
20c01 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 pCheck->malloc
20c02 46 61 69 6c 65 64 20 3d 20 31 3b 0d 0a 20 20 7d Failed = 1;.. }
20c03 65 6c 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20 63 else{.. int c
20c04 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20 3d 20 67 ontentOffset = g
20c05 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 et2byteNotZero(&
20c06 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0d 0a 20 data[hdr+5]);..
20c07 20 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74 65 assert( conte
20c08 6e 74 4f 66 66 73 65 74 3c 3d 75 73 61 62 6c 65 ntOffset<=usable
20c09 53 69 7a 65 20 29 3b 20 20 2f 2a 20 45 6e 66 6f Size ); /* Enfo
20c0a 72 63 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 rced by btreeIni
20c0b 74 50 61 67 65 28 29 20 2a 2f 0d 0a 20 20 20 20 tPage() */..
20c0c 6d 65 6d 73 65 74 28 68 69 74 2b 63 6f 6e 74 65 memset(hit+conte
20c0d 6e 74 4f 66 66 73 65 74 2c 20 30 2c 20 75 73 61 ntOffset, 0, usa
20c0e 62 6c 65 53 69 7a 65 2d 63 6f 6e 74 65 6e 74 4f bleSize-contentO
20c0f 66 66 73 65 74 29 3b 0d 0a 20 20 20 20 6d 65 6d ffset);.. mem
20c10 73 65 74 28 68 69 74 2c 20 31 2c 20 63 6f 6e 74 set(hit, 1, cont
20c11 65 6e 74 4f 66 66 73 65 74 29 3b 0d 0a 20 20 20 entOffset);..
20c12 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 nCell = get2byt
20c13 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b e(&data[hdr+3]);
20c14 0d 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 .. cellStart
20c15 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 = hdr + 12 - 4*p
20c16 50 61 67 65 2d 3e 6c 65 61 66 3b 0d 0a 20 20 20 Page->leaf;..
20c17 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c for(i=0; i<nCel
20c18 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 l; i++){..
20c19 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 int pc = get2byt
20c1a 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 e(&data[cellStar
20c1b 74 2b 69 2a 32 5d 29 3b 0d 0a 20 20 20 20 20 20 t+i*2]);..
20c1c 75 33 32 20 73 69 7a 65 20 3d 20 36 35 35 33 36 u32 size = 65536
20c1d 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0d ;.. int j;.
20c1e 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75 . if( pc<=u
20c1f 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0d 0a sableSize-4 ){..
20c20 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 63 size = c
20c21 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 ellSizePtr(pPage
20c22 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0d 0a 20 , &data[pc]);..
20c23 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 }.. if
20c24 28 20 28 69 6e 74 29 28 70 63 2b 73 69 7a 65 2d ( (int)(pc+size-
20c25 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 1)>=usableSize )
20c26 7b 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b {.. check
20c27 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b AppendMsg(pCheck
20c28 2c 20 30 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 , 0, ..
20c29 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 "Corruption d
20c2a 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 etected in cell
20c2b 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 %d on page %d",i
20c2c 2c 69 50 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 ,iPage);..
20c2d 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
20c2e 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b for(j=pc+size-1;
20c2f 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 j>=pc; j--) hit
20c30 5b 6a 5d 2b 2b 3b 0d 0a 20 20 20 20 20 20 7d 0d [j]++;.. }.
20c31 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 20 3d 20 . }.. i =
20c32 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 get2byte(&data[h
20c33 64 72 2b 31 5d 29 3b 0d 0a 20 20 20 20 77 68 69 dr+1]);.. whi
20c34 6c 65 28 20 69 3e 30 20 29 7b 0d 0a 20 20 20 20 le( i>0 ){..
20c35 20 20 69 6e 74 20 73 69 7a 65 2c 20 6a 3b 0d 0a int size, j;..
20c36 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c assert( i<
20c37 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b =usableSize-4 );
20c38 20 20 20 20 20 2f 2a 20 45 6e 66 6f 72 63 65 64 /* Enforced
20c39 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 by btreeInitPag
20c3a 65 28 29 20 2a 2f 0d 0a 20 20 20 20 20 20 73 69 e() */.. si
20c3b 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 ze = get2byte(&d
20c3c 61 74 61 5b 69 2b 32 5d 29 3b 0d 0a 20 20 20 20 ata[i+2]);..
20c3d 20 20 61 73 73 65 72 74 28 20 69 2b 73 69 7a 65 assert( i+size
20c3e 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 <=usableSize );
20c3f 20 2f 2a 20 45 6e 66 6f 72 63 65 64 20 62 79 20 /* Enforced by
20c40 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 btreeInitPage()
20c41 2a 2f 0d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d */.. for(j=
20c42 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 i+size-1; j>=i;
20c43 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0d 0a j--) hit[j]++;..
20c44 20 20 20 20 20 20 6a 20 3d 20 67 65 74 32 62 79 j = get2by
20c45 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0d 0a 20 te(&data[i]);..
20c46 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d assert( j==
20c47 30 20 7c 7c 20 6a 3e 69 2b 73 69 7a 65 20 29 3b 0 || j>i+size );
20c48 20 20 2f 2a 20 45 6e 66 6f 72 63 65 64 20 62 79 /* Enforced by
20c49 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 btreeInitPage()
20c4a 20 2a 2f 0d 0a 20 20 20 20 20 20 61 73 73 65 72 */.. asser
20c4b 74 28 20 6a 3c 3d 75 73 61 62 6c 65 53 69 7a 65 t( j<=usableSize
20c4c 2d 34 20 29 3b 20 20 20 2f 2a 20 45 6e 66 6f 72 -4 ); /* Enfor
20c4d 63 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 ced by btreeInit
20c4e 50 61 67 65 28 29 20 2a 2f 0d 0a 20 20 20 20 20 Page() */..
20c4f 20 69 20 3d 20 6a 3b 0d 0a 20 20 20 20 7d 0d 0a i = j;.. }..
20c50 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b for(i=cnt=0;
20c51 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 i<usableSize; i
20c52 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 ++){.. if(
20c53 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0d 0a 20 20 hit[i]==0 ){..
20c54 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0d 0a 20 20 cnt++;..
20c55 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 }else if( hi
20c56 74 5b 69 5d 3e 31 20 29 7b 0d 0a 20 20 20 20 20 t[i]>1 ){..
20c57 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 checkAppendMs
20c58 67 28 70 43 68 65 63 6b 2c 20 30 2c 0d 0a 20 20 g(pCheck, 0,..
20c59 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c "Multipl
20c5a 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 e uses for byte
20c5b 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 %d of page %d",
20c5c 69 2c 20 69 50 61 67 65 29 3b 0d 0a 20 20 20 20 i, iPage);..
20c5d 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 break;..
20c5e 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
20c5f 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 if( cnt!=data[hd
20c60 72 2b 37 5d 20 29 7b 0d 0a 20 20 20 20 20 20 63 r+7] ){.. c
20c61 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 heckAppendMsg(pC
20c62 68 65 63 6b 2c 20 30 2c 20 0d 0a 20 20 20 20 20 heck, 0, ..
20c63 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 61 74 "Fragmentat
20c64 69 6f 6e 20 6f 66 20 25 64 20 62 79 74 65 73 20 ion of %d bytes
20c65 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f reported as %d o
20c66 6e 20 70 61 67 65 20 25 64 22 2c 0d 0a 20 20 20 n page %d",..
20c67 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 cnt, data
20c68 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b [hdr+7], iPage);
20c69 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 .. }.. }..
20c6a 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 sqlite3PageFree(
20c6b 68 69 74 29 3b 0d 0a 20 20 72 65 6c 65 61 73 65 hit);.. release
20c6c 50 61 67 65 28 70 50 61 67 65 29 3b 0d 0a 20 20 Page(pPage);..
20c6d 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0d return depth+1;.
20c6e 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 .}..#endif /* SQ
20c6f 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 LITE_OMIT_INTEGR
20c70 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0d 0a 0d 0a ITY_CHECK */....
20c71 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
20c72 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 MIT_INTEGRITY_CH
20c73 45 43 4b 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 ECK../*..** This
20c74 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 routine does a
20c75 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f complete check o
20c76 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65 f the given BTre
20c77 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d e file. aRoot[]
20c78 20 69 73 0d 0a 2a 2a 20 61 6e 20 61 72 72 61 79 is..** an array
20c79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 of pages number
20c7a 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 s were each page
20c7b 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 number is the r
20c7c 6f 6f 74 20 70 61 67 65 20 6f 66 0d 0a 2a 2a 20 oot page of..**
20c7d 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 a table. nRoot
20c7e 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
20c7f 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f entries in aRoo
20c80 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 20 72 65 61 t...**..** A rea
20c81 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 d-only or read-w
20c82 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e rite transaction
20c83 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 must be opened
20c84 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 0d 0a before calling..
20c85 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e ** this function
20c86 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 57 72 69 74 65 20 ...**..** Write
20c87 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 the number of er
20c88 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45 ror seen in *pnE
20c89 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72 20 rr. Except for
20c8a 73 6f 6d 65 20 6d 65 6d 6f 72 79 0d 0a 2a 2a 20 some memory..**
20c8b 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
20c8c 73 2c 20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 s, an error mes
20c8d 73 61 67 65 20 68 65 6c 64 20 69 6e 20 6d 65 6d sage held in mem
20c8e 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f ory obtained fro
20c8f 6d 0d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20 m..** malloc is
20c90 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e 45 returned if *pnE
20c91 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 rr is non-zero.
20c92 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68 If *pnErr==0 th
20c93 65 6e 20 4e 55 4c 4c 20 69 73 0d 0a 2a 2a 20 72 en NULL is..** r
20c94 65 74 75 72 6e 65 64 2e 20 20 49 66 20 61 20 6d eturned. If a m
20c95 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
20c96 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e error occurs, N
20c97 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e ULL is returned.
20c98 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
20c99 56 41 54 45 20 63 68 61 72 20 2a 73 71 6c 69 74 VATE char *sqlit
20c9a 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 e3BtreeIntegrity
20c9b 43 68 65 63 6b 28 0d 0a 20 20 42 74 72 65 65 20 Check(.. Btree
20c9c 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 *p, /* The b
20c9d 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b tree to be check
20c9e 65 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 61 52 ed */.. int *aR
20c9f 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 oot, /* An arr
20ca0 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 ay of root pages
20ca1 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 numbers for ind
20ca2 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f ividual trees */
20ca3 0d 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 .. int nRoot,
20ca4 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 /* Number of e
20ca5 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b ntries in aRoot[
20ca6 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 6d 78 45 72 ] */.. int mxEr
20ca7 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 r, /* Stop re
20ca8 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 porting errors a
20ca9 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a fter this many *
20caa 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 /.. int *pnErr
20cab 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 /* Write numb
20cac 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 er of errors see
20cad 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 n to this variab
20cae 6c 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 50 67 6e le */..){.. Pgn
20caf 6f 20 69 3b 0d 0a 20 20 69 6e 74 20 6e 52 65 66 o i;.. int nRef
20cb0 3b 0d 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b ;.. IntegrityCk
20cb1 20 73 43 68 65 63 6b 3b 0d 0a 20 20 42 74 53 68 sCheck;.. BtSh
20cb2 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 ared *pBt = p->p
20cb3 42 74 3b 0d 0a 20 20 63 68 61 72 20 7a 45 72 72 Bt;.. char zErr
20cb4 5b 31 30 30 5d 3b 0d 0a 0d 0a 20 20 73 71 6c 69 [100];.... sqli
20cb5 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 te3BtreeEnter(p)
20cb6 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e ;.. assert( p->
20cb7 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f inTrans>TRANS_NO
20cb8 4e 45 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 NE && pBt->inTra
20cb9 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e nsaction>TRANS_N
20cba 4f 4e 45 20 29 3b 0d 0a 20 20 6e 52 65 66 20 3d ONE );.. nRef =
20cbb 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 sqlite3PagerRef
20cbc 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 count(pBt->pPage
20cbd 72 29 3b 0d 0a 20 20 73 43 68 65 63 6b 2e 70 42 r);.. sCheck.pB
20cbe 74 20 3d 20 70 42 74 3b 0d 0a 20 20 73 43 68 65 t = pBt;.. sChe
20cbf 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d ck.pPager = pBt-
20cc0 3e 70 50 61 67 65 72 3b 0d 0a 20 20 73 43 68 65 >pPager;.. sChe
20cc1 63 6b 2e 6e 50 61 67 65 20 3d 20 62 74 72 65 65 ck.nPage = btree
20cc2 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b Pagecount(sCheck
20cc3 2e 70 42 74 29 3b 0d 0a 20 20 73 43 68 65 63 6b .pBt);.. sCheck
20cc4 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0d .mxErr = mxErr;.
20cc5 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d . sCheck.nErr =
20cc6 20 30 3b 0d 0a 20 20 73 43 68 65 63 6b 2e 6d 61 0;.. sCheck.ma
20cc7 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0d llocFailed = 0;.
20cc8 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0d 0a . *pnErr = 0;..
20cc9 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 if( sCheck.nPa
20cca 67 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71 ge==0 ){.. sq
20ccb 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 lite3BtreeLeave(
20ccc 70 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 p);.. return
20ccd 30 3b 0d 0a 20 20 7d 0d 0a 20 20 73 43 68 65 63 0;.. }.. sChec
20cce 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 k.anRef = sqlite
20ccf 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 3Malloc( (sCheck
20cd0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 .nPage+1)*sizeof
20cd1 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d (sCheck.anRef[0]
20cd2 29 20 29 3b 0d 0a 20 20 69 66 28 20 21 73 43 68 ) );.. if( !sCh
20cd3 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0d 0a 20 20 eck.anRef ){..
20cd4 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0d 0a 20 *pnErr = 1;..
20cd5 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c sqlite3BtreeL
20cd6 65 61 76 65 28 70 29 3b 0d 0a 20 20 20 20 72 65 eave(p);.. re
20cd7 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 turn 0;.. }..
20cd8 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 for(i=0; i<=sChe
20cd9 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 ck.nPage; i++){
20cda 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 sCheck.anRef[i]
20cdb 3d 20 30 3b 20 7d 0d 0a 20 20 69 20 3d 20 50 45 = 0; }.. i = PE
20cdc 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 NDING_BYTE_PAGE(
20cdd 70 42 74 29 3b 0d 0a 20 20 69 66 28 20 69 3c 3d pBt);.. if( i<=
20cde 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0d sCheck.nPage ){.
20cdf 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 . sCheck.anRe
20ce0 66 5b 69 5d 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a f[i] = 1;.. }..
20ce1 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 sqlite3StrAccu
20ce2 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e 65 72 mInit(&sCheck.er
20ce3 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65 rMsg, zErr, size
20ce4 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30 30 29 of(zErr), 20000)
20ce5 3b 0d 0a 20 20 73 43 68 65 63 6b 2e 65 72 72 4d ;.. sCheck.errM
20ce6 73 67 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32 sg.useMalloc = 2
20ce7 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 6b 20 ;.... /* Check
20ce8 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 the integrity of
20ce9 20 74 68 65 20 66 72 65 65 6c 69 73 74 0d 0a 20 the freelist..
20cea 20 2a 2f 0d 0a 20 20 63 68 65 63 6b 4c 69 73 74 */.. checkList
20ceb 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 (&sCheck, 1, get
20cec 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 4byte(&pBt->pPag
20ced 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0d e1->aData[32]),.
20cee 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 . get
20cef 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 4byte(&pBt->pPag
20cf0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 e1->aData[36]),
20cf1 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 "Main freelist:
20cf2 22 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65 63 ");.... /* Chec
20cf3 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 k all the tables
20cf4 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 ... */.. for(i
20cf5 3d 30 3b 20 28 69 6e 74 29 69 3c 6e 52 6f 6f 74 =0; (int)i<nRoot
20cf6 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 && sCheck.mxErr
20cf7 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 ; i++){.. if(
20cf8 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 aRoot[i]==0 ) c
20cf9 6f 6e 74 69 6e 75 65 3b 0d 0a 23 69 66 6e 64 65 ontinue;..#ifnde
20cfa 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 f SQLITE_OMIT_AU
20cfb 54 4f 56 41 43 55 55 4d 0d 0a 20 20 20 20 69 66 TOVACUUM.. if
20cfc 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 ( pBt->autoVacuu
20cfd 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 m && aRoot[i]>1
20cfe 29 7b 0d 0a 20 20 20 20 20 20 63 68 65 63 6b 50 ){.. checkP
20cff 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 trmap(&sCheck, a
20d00 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f Root[i], PTRMAP_
20d01 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b ROOTPAGE, 0, 0);
20d02 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d .. }..#endif.
20d03 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 . checkTreePa
20d04 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f ge(&sCheck, aRoo
20d05 74 5b 69 5d 2c 20 22 4c 69 73 74 20 6f 66 20 74 t[i], "List of t
20d06 72 65 65 20 72 6f 6f 74 73 3a 20 22 2c 20 4e 55 ree roots: ", NU
20d07 4c 4c 2c 20 4e 55 4c 4c 29 3b 0d 0a 20 20 7d 0d LL, NULL);.. }.
20d08 0a 0d 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 ... /* Make sur
20d09 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 e every page in
20d0a 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 the file is refe
20d0b 72 65 6e 63 65 64 0d 0a 20 20 2a 2f 0d 0a 20 20 renced.. */..
20d0c 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 for(i=1; i<=sChe
20d0d 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65 ck.nPage && sChe
20d0e 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0d ck.mxErr; i++){.
20d0f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
20d10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0d 0a MIT_AUTOVACUUM..
20d11 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 if( sCheck.a
20d12 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0d 0a 20 nRef[i]==0 ){..
20d13 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 checkAppend
20d14 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 Msg(&sCheck, 0,
20d15 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 "Page %d is neve
20d16 72 20 75 73 65 64 22 2c 20 69 29 3b 0d 0a 20 20 r used", i);..
20d17 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 }..#else..
20d18 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 /* If the databa
20d19 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f se supports auto
20d1a 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 -vacuum, make su
20d1b 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e re no tables con
20d1c 74 61 69 6e 0d 0a 20 20 20 20 2a 2a 20 72 65 66 tain.. ** ref
20d1d 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 erences to point
20d1e 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0d 0a 20 er-map pages...
20d1f 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 73 */.. if( s
20d20 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d Check.anRef[i]==
20d21 30 20 26 26 20 0d 0a 20 20 20 20 20 20 20 28 50 0 && .. (P
20d22 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 TRMAP_PAGENO(pBt
20d23 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d , i)!=i || !pBt-
20d24 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0d >autoVacuum) ){.
20d25 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 . checkAppe
20d26 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 ndMsg(&sCheck, 0
20d27 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 , "Page %d is ne
20d28 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0d 0a ver used", i);..
20d29 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 73 }.. if( s
20d2a 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d Check.anRef[i]!=
20d2b 30 20 26 26 20 0d 0a 20 20 20 20 20 20 20 28 50 0 && .. (P
20d2c 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 TRMAP_PAGENO(pBt
20d2d 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e , i)==i && pBt->
20d2e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0d 0a autoVacuum) ){..
20d2f 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e checkAppen
20d30 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c dMsg(&sCheck, 0,
20d31 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 "Pointer map pa
20d32 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65 6e ge %d is referen
20d33 63 65 64 22 2c 20 69 29 3b 0d 0a 20 20 20 20 7d ced", i);.. }
20d34 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d ..#endif.. }...
20d35 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 . /* Make sure
20d36 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 this analysis di
20d37 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 d not leave any
20d38 75 6e 72 65 66 28 29 20 70 61 67 65 73 2e 0d 0a unref() pages...
20d39 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 ** This is an
20d3a 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 internal consist
20d3b 65 6e 63 79 20 63 68 65 63 6b 3b 20 61 6e 20 69 ency check; an i
20d3c 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 0d 0a ntegrity check..
20d3d 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 ** of the inte
20d3e 67 72 69 74 79 20 63 68 65 63 6b 2e 0d 0a 20 20 grity check...
20d3f 2a 2f 0d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 */.. if( NEVER(
20d40 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 nRef != sqlite3P
20d41 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 agerRefcount(pBt
20d42 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0d 0a 20 ->pPager)) ){..
20d43 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 checkAppendMs
20d44 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0d 0a g(&sCheck, 0, ..
20d45 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 "Outstandi
20d46 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f ng page count go
20d47 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 es from %d to %d
20d48 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 during this ana
20d49 6c 79 73 69 73 22 2c 0d 0a 20 20 20 20 20 20 6e lysis",.. n
20d4a 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 Ref, sqlite3Page
20d4b 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 rRefcount(pBt->p
20d4c 50 61 67 65 72 29 0d 0a 20 20 20 20 29 3b 0d 0a Pager).. );..
20d4d 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 6c 65 61 }.... /* Clea
20d4e 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 n up and report
20d4f 20 65 72 72 6f 72 73 2e 0d 0a 20 20 2a 2f 0d 0a errors... */..
20d50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 sqlite3BtreeLe
20d51 61 76 65 28 70 29 3b 0d 0a 20 20 73 71 6c 69 74 ave(p);.. sqlit
20d52 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61 e3_free(sCheck.a
20d53 6e 52 65 66 29 3b 0d 0a 20 20 69 66 28 20 73 43 nRef);.. if( sC
20d54 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 heck.mallocFaile
20d55 64 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 d ){.. sqlite
20d56 33 53 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 3StrAccumReset(&
20d57 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0d sCheck.errMsg);.
20d58 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 . *pnErr = sC
20d59 68 65 63 6b 2e 6e 45 72 72 2b 31 3b 0d 0a 20 20 heck.nErr+1;..
20d5a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d return 0;.. }
20d5b 0d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 .. *pnErr = sCh
20d5c 65 63 6b 2e 6e 45 72 72 3b 0d 0a 20 20 69 66 28 eck.nErr;.. if(
20d5d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20 sCheck.nErr==0
20d5e 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 ) sqlite3StrAccu
20d5f 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 mReset(&sCheck.e
20d60 72 72 4d 73 67 29 3b 0d 0a 20 20 72 65 74 75 72 rrMsg);.. retur
20d61 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 n sqlite3StrAccu
20d62 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e mFinish(&sCheck.
20d63 65 72 72 4d 73 67 29 3b 0d 0a 7d 0d 0a 23 65 6e errMsg);..}..#en
20d64 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d dif /* SQLITE_OM
20d65 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 IT_INTEGRITY_CHE
20d66 43 4b 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 CK */..../*..**
20d67 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 Return the full
20d68 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 pathname of the
20d69 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 underlying datab
20d6a 61 73 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a ase file...**..*
20d6b 2a 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 * The pager file
20d6c 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e name is invarian
20d6d 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 t as long as the
20d6e 20 70 61 67 65 72 20 69 73 0d 0a 2a 2a 20 6f 70 pager is..** op
20d6f 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 en so it is safe
20d70 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f to access witho
20d71 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 ut the BtShared
20d72 6d 75 74 65 78 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 mutex...*/..SQLI
20d73 54 45 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 TE_PRIVATE const
20d74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 char *sqlite3Bt
20d75 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 reeGetFilename(B
20d76 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 61 73 73 tree *p){.. ass
20d77 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 ert( p->pBt->pPa
20d78 67 65 72 21 3d 30 20 29 3b 0d 0a 20 20 72 65 74 ger!=0 );.. ret
20d79 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 urn sqlite3Pager
20d7a 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d Filename(p->pBt-
20d7b 3e 70 50 61 67 65 72 29 3b 0d 0a 7d 0d 0a 0d 0a >pPager);..}....
20d7c 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 /*..** Return th
20d7d 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 e pathname of th
20d7e 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 e journal file f
20d7f 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 or this database
20d80 2e 20 54 68 65 20 72 65 74 75 72 6e 0d 0a 2a 2a . The return..**
20d81 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 value of this r
20d82 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 outine is the sa
20d83 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 me regardless of
20d84 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 whether the jou
20d85 72 6e 61 6c 20 66 69 6c 65 0d 0a 2a 2a 20 68 61 rnal file..** ha
20d86 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f s been created o
20d87 72 20 6e 6f 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 r not...**..** T
20d88 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c he pager journal
20d89 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 filename is inv
20d8a 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 ariant as long a
20d8b 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0d 0a s the pager is..
20d8c 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 ** open so it is
20d8d 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 safe to access
20d8e 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 without the BtSh
20d8f 61 72 65 64 20 6d 75 74 65 78 2e 0d 0a 2a 2f 0d ared mutex...*/.
20d90 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
20d91 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 const char *sqli
20d92 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e te3BtreeGetJourn
20d93 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 alname(Btree *p)
20d94 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e {.. assert( p->
20d95 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 pBt->pPager!=0 )
20d96 3b 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 ;.. return sqli
20d97 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e te3PagerJournaln
20d98 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 ame(p->pBt->pPag
20d99 65 72 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a er);..}..../*..*
20d9a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 * Return non-zer
20d9b 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 o if a transacti
20d9c 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0d 0a 2a on is active...*
20d9d 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
20d9e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 E int sqlite3Btr
20d9f 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 eeIsInTrans(Btre
20da0 65 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 e *p){.. assert
20da1 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 ( p==0 || sqlite
20da2 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 3_mutex_held(p->
20da3 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 db->mutex) );..
20da4 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 return (p && (p
20da5 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 ->inTrans==TRANS
20da6 5f 57 52 49 54 45 29 29 3b 0d 0a 7d 0d 0a 0d 0a _WRITE));..}....
20da7 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
20da8 4d 49 54 5f 57 41 4c 0d 0a 2f 2a 0d 0a 2a 2a 20 MIT_WAL../*..**
20da9 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 Run a checkpoint
20daa 20 6f 6e 20 74 68 65 20 42 74 72 65 65 20 70 61 on the Btree pa
20dab 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 ssed as the firs
20dac 74 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2a 0d t argument...**.
20dad 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 .** Return SQLIT
20dae 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 69 73 E_LOCKED if this
20daf 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 63 6f or any other co
20db0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 nnection has an
20db1 6f 70 65 6e 20 0d 0a 2a 2a 20 74 72 61 6e 73 61 open ..** transa
20db2 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 68 61 ction on the sha
20db3 72 65 64 2d 63 61 63 68 65 20 74 68 65 20 61 72 red-cache the ar
20db4 67 75 6d 65 6e 74 20 42 74 72 65 65 20 69 73 20 gument Btree is
20db5 63 6f 6e 6e 65 63 74 65 64 20 74 6f 2e 0d 0a 2a connected to...*
20db6 2a 0d 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 *..** Parameter
20db7 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 eMode is one of
20db8 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e SQLITE_CHECKPOIN
20db9 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 T_PASSIVE, FULL
20dba 6f 72 20 52 45 53 54 41 52 54 2e 0d 0a 2a 2f 0d or RESTART...*/.
20dbb 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
20dbc 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 int sqlite3Btree
20dbd 43 68 65 63 6b 70 6f 69 6e 74 28 42 74 72 65 65 Checkpoint(Btree
20dbe 20 2a 70 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 *p, int eMode,
20dbf 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 int *pnLog, int
20dc0 2a 70 6e 43 6b 70 74 29 7b 0d 0a 20 20 69 6e 74 *pnCkpt){.. int
20dc1 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
20dc2 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20 .. if( p ){..
20dc3 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 BtShared *pBt
20dc4 3d 20 70 2d 3e 70 42 74 3b 0d 0a 20 20 20 20 73 = p->pBt;.. s
20dc5 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
20dc6 28 70 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 42 (p);.. if( pB
20dc7 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e t->inTransaction
20dc8 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0d !=TRANS_NONE ){.
20dc9 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 . rc = SQLI
20dca 54 45 5f 4c 4f 43 4b 45 44 3b 0d 0a 20 20 20 20 TE_LOCKED;..
20dcb 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 }else{.. rc
20dcc 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 = sqlite3PagerC
20dcd 68 65 63 6b 70 6f 69 6e 74 28 70 42 74 2d 3e 70 heckpoint(pBt->p
20dce 50 61 67 65 72 2c 20 65 4d 6f 64 65 2c 20 70 6e Pager, eMode, pn
20dcf 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0d 0a 20 Log, pnCkpt);..
20dd0 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 }.. sqlite
20dd1 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 3BtreeLeave(p);.
20dd2 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 . }.. return r
20dd3 63 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d c;..}..#endif...
20dd4 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 6e ./*..** Return n
20dd5 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61 on-zero if a rea
20dd6 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72 61 d (or write) tra
20dd7 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 nsaction is acti
20dd8 76 65 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ve...*/..SQLITE_
20dd9 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
20dda 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 te3BtreeIsInRead
20ddb 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b Trans(Btree *p){
20ddc 0d 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b .. assert( p );
20ddd 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
20dde 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
20ddf 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d ->db->mutex) );.
20de0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 6e 54 . return p->inT
20de1 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 rans!=TRANS_NONE
20de2 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 ;..}....SQLITE_P
20de3 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 RIVATE int sqlit
20de4 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 e3BtreeIsInBacku
20de5 70 28 42 74 72 65 65 20 2a 70 29 7b 0d 0a 20 20 p(Btree *p){..
20de6 61 73 73 65 72 74 28 20 70 20 29 3b 0d 0a 20 20 assert( p );..
20de7 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
20de8 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 mutex_held(p->db
20de9 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 72 ->mutex) );.. r
20dea 65 74 75 72 6e 20 70 2d 3e 6e 42 61 63 6b 75 70 eturn p->nBackup
20deb 21 3d 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a !=0;..}..../*..*
20dec 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
20ded 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 returns a pointe
20dee 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d r to a blob of m
20def 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 emory associated
20df0 20 77 69 74 68 0d 0a 2a 2a 20 61 20 73 69 6e 67 with..** a sing
20df1 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e le shared-btree.
20df2 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 The memory is u
20df3 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f sed by client co
20df4 64 65 20 66 6f 72 20 69 74 73 20 6f 77 6e 0d 0a de for its own..
20df5 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 ** purposes (for
20df6 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f example, to sto
20df7 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 re a high-level
20df8 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 schema associate
20df9 64 20 77 69 74 68 20 0d 0a 2a 2a 20 74 68 65 20 d with ..** the
20dfa 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 shared-btree). T
20dfb 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d he btree layer m
20dfc 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 anages reference
20dfd 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 counting issues
20dfe 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 69 ...**..** The fi
20dff 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 rst time this is
20e00 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 called on a sha
20e01 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 red-btree, nByte
20e02 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 s bytes of memor
20e03 79 0d 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 y..** are alloca
20e04 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 ted, zeroed, and
20e05 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 returned to the
20e06 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 caller. For eac
20e07 68 20 73 75 62 73 65 71 75 65 6e 74 20 0d 0a 2a h subsequent ..*
20e08 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 * call the nByte
20e09 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 s parameter is i
20e0a 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 gnored and a poi
20e0b 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 nter to the same
20e0c 20 62 6c 6f 62 0d 0a 2a 2a 20 6f 66 20 6d 65 6d blob..** of mem
20e0d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0d 0a ory returned. ..
20e0e 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42 **..** If the nB
20e0f 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 ytes parameter i
20e10 73 20 30 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 s 0 and the blob
20e11 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e of memory has n
20e12 6f 74 20 79 65 74 20 62 65 65 6e 0d 0a 2a 2a 20 ot yet been..**
20e13 61 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e 75 6c allocated, a nul
20e14 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 l pointer is ret
20e15 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 62 6c urned. If the bl
20e16 6f 62 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 ob has already b
20e17 65 65 6e 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 een..** allocate
20e18 64 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 d, it is returne
20e19 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0d 0a 2a 2a d as normal...**
20e1a 0d 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 ..** Just before
20e1b 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 the shared-btre
20e1c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 e is closed, the
20e1d 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 function passed
20e1e 20 61 73 20 74 68 65 20 0d 0a 2a 2a 20 78 46 72 as the ..** xFr
20e1f 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e ee argument when
20e20 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f the memory allo
20e21 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 cation was made
20e22 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 is invoked on th
20e23 65 20 0d 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 e ..** blob of a
20e24 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e llocated memory.
20e25 20 54 68 65 20 78 46 72 65 65 20 66 75 6e 63 74 The xFree funct
20e26 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 ion should not c
20e27 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 all sqlite3_free
20e28 28 29 0d 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 ()..** on the me
20e29 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 mory, the btree
20e2a 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e layer does that.
20e2b 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
20e2c 56 41 54 45 20 76 6f 69 64 20 2a 73 71 6c 69 74 VATE void *sqlit
20e2d 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 e3BtreeSchema(Bt
20e2e 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 ree *p, int nByt
20e2f 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 es, void(*xFree)
20e30 28 76 6f 69 64 20 2a 29 29 7b 0d 0a 20 20 42 74 (void *)){.. Bt
20e31 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d Shared *pBt = p-
20e32 3e 70 42 74 3b 0d 0a 20 20 73 71 6c 69 74 65 33 >pBt;.. sqlite3
20e33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0d 0a BtreeEnter(p);..
20e34 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 if( !pBt->pSch
20e35 65 6d 61 20 26 26 20 6e 42 79 74 65 73 20 29 7b ema && nBytes ){
20e36 0d 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 .. pBt->pSche
20e37 6d 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 ma = sqlite3DbMa
20e38 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 6e 42 79 74 llocZero(0, nByt
20e39 65 73 29 3b 0d 0a 20 20 20 20 70 42 74 2d 3e 78 es);.. pBt->x
20e3a 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 FreeSchema = xFr
20e3b 65 65 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 ee;.. }.. sqli
20e3c 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 te3BtreeLeave(p)
20e3d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d ;.. return pBt-
20e3e 3e 70 53 63 68 65 6d 61 3b 0d 0a 7d 0d 0a 0d 0a >pSchema;..}....
20e3f 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 /*..** Return SQ
20e40 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 LITE_LOCKED_SHAR
20e41 45 44 43 41 43 48 45 20 69 66 20 61 6e 6f 74 68 EDCACHE if anoth
20e42 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 er user of the s
20e43 61 6d 65 20 73 68 61 72 65 64 20 0d 0a 2a 2a 20 ame shared ..**
20e44 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 btree as the arg
20e45 75 6d 65 6e 74 20 68 61 6e 64 6c 65 20 68 6f 6c ument handle hol
20e46 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 ds an exclusive
20e47 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 0d 0a 2a 2a lock on the ..**
20e48 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 sqlite_master t
20e49 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 20 able. Otherwise
20e4a 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a 2a 2f 0d 0a SQLITE_OK...*/..
20e4b 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
20e4c 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 nt sqlite3BtreeS
20e4d 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 chemaLocked(Btre
20e4e 65 20 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 72 63 e *p){.. int rc
20e4f 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ;.. assert( sql
20e50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
20e51 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b p->db->mutex) );
20e52 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 .. sqlite3Btree
20e53 45 6e 74 65 72 28 70 29 3b 0d 0a 20 20 72 63 20 Enter(p);.. rc
20e54 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 = querySharedCac
20e55 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d heTableLock(p, M
20e56 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 ASTER_ROOT, READ
20e57 5f 4c 4f 43 4b 29 3b 0d 0a 20 20 61 73 73 65 72 _LOCK);.. asser
20e58 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b t( rc==SQLITE_OK
20e59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c || rc==SQLITE_L
20e5a 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 OCKED_SHAREDCACH
20e5b 45 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 42 E );.. sqlite3B
20e5c 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a 20 treeLeave(p);..
20e5d 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
20e5e 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 ....#ifndef SQLI
20e5f 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 TE_OMIT_SHARED_C
20e60 41 43 48 45 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 62 74 ACHE../*..** Obt
20e61 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 ain a lock on th
20e62 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f e table whose ro
20e63 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e ot page is iTab.
20e64 20 20 54 68 65 0d 0a 2a 2a 20 6c 6f 63 6b 20 69 The..** lock i
20e65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 s a write lock i
20e66 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 f isWritelock is
20e67 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 true or a read
20e68 6c 6f 63 6b 0d 0a 2a 2a 20 69 66 20 69 74 20 69 lock..** if it i
20e69 73 20 66 61 6c 73 65 2e 0d 0a 2a 2f 0d 0a 53 51 s false...*/..SQ
20e6a 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
20e6b 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 sqlite3BtreeLoc
20e6c 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c kTable(Btree *p,
20e6d 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 int iTab, u8 is
20e6e 57 72 69 74 65 4c 6f 63 6b 29 7b 0d 0a 20 20 69 WriteLock){.. i
20e6f 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
20e70 4b 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 2d K;.. assert( p-
20e71 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f >inTrans!=TRANS_
20e72 4e 4f 4e 45 20 29 3b 0d 0a 20 20 69 66 28 20 70 NONE );.. if( p
20e73 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0d 0a 20 ->sharable ){..
20e74 20 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d u8 lockType =
20e75 20 52 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73 57 READ_LOCK + isW
20e76 72 69 74 65 4c 6f 63 6b 3b 0d 0a 20 20 20 20 61 riteLock;.. a
20e77 73 73 65 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b ssert( READ_LOCK
20e78 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 +1==WRITE_LOCK )
20e79 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 ;.. assert( i
20e7a 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c sWriteLock==0 ||
20e7b 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 isWriteLock==1
20e7c 29 3b 0d 0a 0d 0a 20 20 20 20 73 71 6c 69 74 65 );.... sqlite
20e7d 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0d 3BtreeEnter(p);.
20e7e 0a 20 20 20 20 72 63 20 3d 20 71 75 65 72 79 53 . rc = queryS
20e7f 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c haredCacheTableL
20e80 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 ock(p, iTab, loc
20e81 6b 54 79 70 65 29 3b 0d 0a 20 20 20 20 69 66 28 kType);.. if(
20e82 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
20e83 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 {.. rc = se
20e84 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c tSharedCacheTabl
20e85 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c eLock(p, iTab, l
20e86 6f 63 6b 54 79 70 65 29 3b 0d 0a 20 20 20 20 7d ockType);.. }
20e87 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 .. sqlite3Btr
20e88 65 65 4c 65 61 76 65 28 70 29 3b 0d 0a 20 20 7d eeLeave(p);.. }
20e89 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
20e8a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 }..#endif....#if
20e8b 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
20e8c 5f 49 4e 43 52 42 4c 4f 42 0d 0a 2f 2a 0d 0a 2a _INCRBLOB../*..*
20e8d 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 * Argument pCsr
20e8e 6d 75 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 must be a cursor
20e8f 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 opened for writ
20e90 69 6e 67 20 6f 6e 20 61 6e 20 0d 0a 2a 2a 20 49 ing on an ..** I
20e91 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72 72 NTKEY table curr
20e92 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 ently pointing a
20e93 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65 20 t a valid table
20e94 65 6e 74 72 79 2e 20 0d 0a 2a 2a 20 54 68 69 73 entry. ..** This
20e95 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 function modifi
20e96 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 es the data stor
20e97 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 ed as part of th
20e98 61 74 20 65 6e 74 72 79 2e 0d 0a 2a 2a 0d 0a 2a at entry...**..*
20e99 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 * Only the data
20e9a 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 content may only
20e9b 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 be modified, it
20e9c 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 is not possible
20e9d 20 74 6f 20 0d 0a 2a 2a 20 63 68 61 6e 67 65 20 to ..** change
20e9e 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 the length of th
20e9f 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 20 49 e data stored. I
20ea0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 f this function
20ea1 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0d 0a is called with..
20ea2 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 ** parameters th
20ea3 61 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 at attempt to wr
20ea4 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 ite past the end
20ea5 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 of the existing
20ea6 20 64 61 74 61 2c 0d 0a 2a 2a 20 6e 6f 20 6d 6f data,..** no mo
20ea7 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20 difications are
20ea8 6d 61 64 65 20 61 6e 64 20 53 51 4c 49 54 45 5f made and SQLITE_
20ea9 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 CORRUPT is retur
20eaa 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ned...*/..SQLITE
20eab 5f 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c _PRIVATE int sql
20eac 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61 ite3BtreePutData
20ead 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c (BtCursor *pCsr,
20eae 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 u32 offset, u32
20eaf 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0d amt, void *z){.
20eb0 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 61 73 . int rc;.. as
20eb1 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 sert( cursorHold
20eb2 73 4d 75 74 65 78 28 70 43 73 72 29 20 29 3b 0d sMutex(pCsr) );.
20eb3 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
20eb4 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 e3_mutex_held(pC
20eb5 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e sr->pBtree->db->
20eb6 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 mutex) );.. ass
20eb7 65 72 74 28 20 70 43 73 72 2d 3e 69 73 49 6e 63 ert( pCsr->isInc
20eb8 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 3b 0d 0a rblobHandle );..
20eb9 0d 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 .. rc = restore
20eba 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 CursorPosition(p
20ebb 43 73 72 29 3b 0d 0a 20 20 69 66 28 20 72 63 21 Csr);.. if( rc!
20ebc 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 =SQLITE_OK ){..
20ebd 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 return rc;..
20ebe 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 70 43 }.. assert( pC
20ebf 73 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 sr->eState!=CURS
20ec0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 OR_REQUIRESEEK )
20ec1 3b 0d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 ;.. if( pCsr->e
20ec2 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 State!=CURSOR_VA
20ec3 4c 49 44 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 LID ){.. retu
20ec4 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b rn SQLITE_ABORT;
20ec5 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 43 68 .. }.... /* Ch
20ec6 65 63 6b 20 73 6f 6d 65 20 61 73 73 75 6d 70 74 eck some assumpt
20ec7 69 6f 6e 73 3a 20 0d 0a 20 20 2a 2a 20 20 20 28 ions: .. ** (
20ec8 61 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 a) the cursor is
20ec9 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e open for writin
20eca 67 2c 0d 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 g,.. ** (b) t
20ecb 68 65 72 65 20 69 73 20 61 20 72 65 61 64 2f 77 here is a read/w
20ecc 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e rite transaction
20ecd 20 6f 70 65 6e 2c 0d 0a 20 20 2a 2a 20 20 20 28 open,.. ** (
20ece 63 29 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f c) the connectio
20ecf 6e 20 68 6f 6c 64 73 20 61 20 77 72 69 74 65 2d n holds a write-
20ed0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c lock on the tabl
20ed1 65 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c e (if required),
20ed2 0d 0a 20 20 2a 2a 20 20 20 28 64 29 20 74 68 65 .. ** (d) the
20ed3 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 re are no confli
20ed4 63 74 69 6e 67 20 72 65 61 64 2d 6c 6f 63 6b 73 cting read-locks
20ed5 2c 20 61 6e 64 0d 0a 20 20 2a 2a 20 20 20 28 65 , and.. ** (e
20ed6 29 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 ) the cursor poi
20ed7 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64 20 72 nts at a valid r
20ed8 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20 ow of an intKey
20ed9 74 61 62 6c 65 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 table... */..
20eda 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61 if( !pCsr->wrFla
20edb 67 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e g ){.. return
20edc 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 SQLITE_READONLY
20edd 3b 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 ;.. }.. assert
20ede 28 20 28 70 43 73 72 2d 3e 70 42 74 2d 3e 62 74 ( (pCsr->pBt->bt
20edf 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 sFlags & BTS_REA
20ee0 44 5f 4f 4e 4c 59 29 3d 3d 30 0d 0a 20 20 20 20 D_ONLY)==0..
20ee1 20 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 && pCs
20ee2 72 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 r->pBt->inTransa
20ee3 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 ction==TRANS_WRI
20ee4 54 45 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 TE );.. assert(
20ee5 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 hasSharedCacheT
20ee6 61 62 6c 65 4c 6f 63 6b 28 70 43 73 72 2d 3e 70 ableLock(pCsr->p
20ee7 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e Btree, pCsr->pgn
20ee8 6f 52 6f 6f 74 2c 20 30 2c 20 32 29 20 29 3b 0d oRoot, 0, 2) );.
20ee9 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 . assert( !hasR
20eea 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 73 eadConflicts(pCs
20eeb 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 73 72 2d r->pBtree, pCsr-
20eec 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0d 0a 20 >pgnoRoot) );..
20eed 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 assert( pCsr->a
20eee 70 50 61 67 65 5b 70 43 73 72 2d 3e 69 50 61 67 pPage[pCsr->iPag
20eef 65 5d 2d 3e 69 6e 74 4b 65 79 20 29 3b 0d 0a 0d e]->intKey );...
20ef0 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 . return access
20ef1 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 Payload(pCsr, of
20ef2 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 fset, amt, (unsi
20ef3 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 31 gned char *)z, 1
20ef4 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a );..}..../* ..**
20ef5 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 Set a flag on t
20ef6 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63 61 his cursor to ca
20ef7 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e che the location
20ef8 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d 20 s of pages from
20ef9 74 68 65 20 0d 0a 2a 2a 20 6f 76 65 72 66 6c 6f the ..** overflo
20efa 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63 w list for the c
20efb 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 urrent row. This
20efc 20 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73 is used by curs
20efd 6f 72 73 20 6f 70 65 6e 65 64 0d 0a 2a 2a 20 66 ors opened..** f
20efe 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 or incremental b
20eff 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0d 0a 2a 2a lob IO only...**
20f00 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
20f01 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f on sets a flag o
20f02 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 nly. The actual
20f03 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 page location ca
20f04 63 68 65 0d 0a 2a 2a 20 28 73 74 6f 72 65 64 20 che..** (stored
20f05 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 in BtCursor.aOve
20f06 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f rflow[]) is allo
20f07 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 cated and used b
20f08 79 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 61 y function..** a
20f09 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 ccessPayload() (
20f0a 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 the worker funct
20f0b 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 ion for sqlite3B
20f0c 74 72 65 65 44 61 74 61 28 29 20 61 6e 64 0d 0a treeData() and..
20f0d 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 ** sqlite3BtreeP
20f0e 75 74 44 61 74 61 28 29 29 2e 0d 0a 2a 2f 0d 0a utData())...*/..
20f0f 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
20f10 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 oid sqlite3Btree
20f11 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 CacheOverflow(Bt
20f12 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0d 0a Cursor *pCur){..
20f13 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 assert( cursor
20f14 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 HoldsMutex(pCur)
20f15 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 73 );.. assert( s
20f16 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
20f17 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e d(pCur->pBtree->
20f18 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 db->mutex) );..
20f19 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 invalidateOverf
20f1a 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0d lowCache(pCur);.
20f1b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 . pCur->isIncrb
20f1c 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0d 0a lobHandle = 1;..
20f1d 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d }..#endif..../*.
20f1e 0a 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 .** Set both the
20f1f 20 22 72 65 61 64 20 76 65 72 73 69 6f 6e 22 20 "read version"
20f20 28 73 69 6e 67 6c 65 20 62 79 74 65 20 61 74 20 (single byte at
20f21 62 79 74 65 20 6f 66 66 73 65 74 20 31 38 29 20 byte offset 18)
20f22 61 6e 64 20 0d 0a 2a 2a 20 22 77 72 69 74 65 20 and ..** "write
20f23 76 65 72 73 69 6f 6e 22 20 28 73 69 6e 67 6c 65 version" (single
20f24 20 62 79 74 65 20 61 74 20 62 79 74 65 20 6f 66 byte at byte of
20f25 66 73 65 74 20 31 39 29 20 66 69 65 6c 64 73 20 fset 19) fields
20f26 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0d in the database.
20f27 0a 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 69 56 .** header to iV
20f28 65 72 73 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c ersion...*/..SQL
20f29 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
20f2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 sqlite3BtreeSetV
20f2b 65 72 73 69 6f 6e 28 42 74 72 65 65 20 2a 70 42 ersion(Btree *pB
20f2c 74 72 65 65 2c 20 69 6e 74 20 69 56 65 72 73 69 tree, int iVersi
20f2d 6f 6e 29 7b 0d 0a 20 20 42 74 53 68 61 72 65 64 on){.. BtShared
20f2e 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e *pBt = pBtree->
20f2f 70 42 74 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 pBt;.. int rc;
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20f31 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
20f32 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 0d 0a 20 20 n code */.. ..
20f33 61 73 73 65 72 74 28 20 69 56 65 72 73 69 6f 6e assert( iVersion
20f34 3d 3d 31 20 7c 7c 20 69 56 65 72 73 69 6f 6e 3d ==1 || iVersion=
20f35 3d 32 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 =2 );.... /* If
20f36 20 73 65 74 74 69 6e 67 20 74 68 65 20 76 65 72 setting the ver
20f37 73 69 6f 6e 20 66 69 65 6c 64 73 20 74 6f 20 31 sion fields to 1
20f38 2c 20 64 6f 20 6e 6f 74 20 61 75 74 6f 6d 61 74 , do not automat
20f39 69 63 61 6c 6c 79 20 6f 70 65 6e 20 74 68 65 0d ically open the.
20f3a 0a 20 20 2a 2a 20 57 41 4c 20 63 6f 6e 6e 65 63 . ** WAL connec
20f3b 74 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 74 68 tion, even if th
20f3c 65 20 76 65 72 73 69 6f 6e 20 66 69 65 6c 64 73 e version fields
20f3d 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 73 are currently s
20f3e 65 74 20 74 6f 20 32 2e 0d 0a 20 20 2a 2f 0d 0a et to 2... */..
20f3f 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 pBt->btsFlags
20f40 26 3d 20 7e 42 54 53 5f 4e 4f 5f 57 41 4c 3b 0d &= ~BTS_NO_WAL;.
20f41 0a 20 20 69 66 28 20 69 56 65 72 73 69 6f 6e 3d . if( iVersion=
20f42 3d 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 =1 ) pBt->btsFla
20f43 67 73 20 7c 3d 20 42 54 53 5f 4e 4f 5f 57 41 4c gs |= BTS_NO_WAL
20f44 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 ;.... rc = sqli
20f45 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 te3BtreeBeginTra
20f46 6e 73 28 70 42 74 72 65 65 2c 20 30 29 3b 0d 0a ns(pBtree, 0);..
20f47 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
20f48 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 75 38 20 2a _OK ){.. u8 *
20f49 61 44 61 74 61 20 3d 20 70 42 74 2d 3e 70 50 61 aData = pBt->pPa
20f4a 67 65 31 2d 3e 61 44 61 74 61 3b 0d 0a 20 20 20 ge1->aData;..
20f4b 20 69 66 28 20 61 44 61 74 61 5b 31 38 5d 21 3d if( aData[18]!=
20f4c 28 75 38 29 69 56 65 72 73 69 6f 6e 20 7c 7c 20 (u8)iVersion ||
20f4d 61 44 61 74 61 5b 31 39 5d 21 3d 28 75 38 29 69 aData[19]!=(u8)i
20f4e 56 65 72 73 69 6f 6e 20 29 7b 0d 0a 20 20 20 20 Version ){..
20f4f 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
20f50 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 reeBeginTrans(pB
20f51 74 72 65 65 2c 20 32 29 3b 0d 0a 20 20 20 20 20 tree, 2);..
20f52 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
20f53 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 OK ){.. r
20f54 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 c = sqlite3Pager
20f55 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 Write(pBt->pPage
20f56 31 2d 3e 70 44 62 50 61 67 65 29 3b 0d 0a 20 20 1->pDbPage);..
20f57 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
20f58 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 LITE_OK ){..
20f59 20 20 20 20 20 20 61 44 61 74 61 5b 31 38 5d 20 aData[18]
20f5a 3d 20 28 75 38 29 69 56 65 72 73 69 6f 6e 3b 0d = (u8)iVersion;.
20f5b 0a 20 20 20 20 20 20 20 20 20 20 61 44 61 74 61 . aData
20f5c 5b 31 39 5d 20 3d 20 28 75 38 29 69 56 65 72 73 [19] = (u8)iVers
20f5d 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d ion;.. }.
20f5e 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d . }.. }.
20f5f 0a 20 20 7d 0d 0a 0d 0a 20 20 70 42 74 2d 3e 62 . }.... pBt->b
20f60 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f tsFlags &= ~BTS_
20f61 4e 4f 5f 57 41 4c 3b 0d 0a 20 20 72 65 74 75 72 NO_WAL;.. retur
20f62 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a n rc;..}..../***
20f63 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 *********** End
20f64 6f 66 20 62 74 72 65 65 2e 63 20 2a 2a 2a 2a 2a of btree.c *****
20f65 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f66 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f67 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a **********/../**
20f68 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 ************ Beg
20f69 69 6e 20 66 69 6c 65 20 62 61 63 6b 75 70 2e 63 in file backup.c
20f6a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ***************
20f6b 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f6c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a ***********/../*
20f6d 0d 0a 2a 2a 20 32 30 30 39 20 4a 61 6e 75 61 72 ..** 2009 Januar
20f6e 79 20 32 38 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 y 28..**..** The
20f6f 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
20f70 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
20f71 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
20f72 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a In place of..*
20f73 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
20f74 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
20f75 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 sing:..**..**
20f76 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
20f77 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a and not evil...
20f78 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 ** May you fi
20f79 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
20f7a 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
20f7b 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d forgive others..
20f7c 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 .** May you s
20f7d 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 hare freely, nev
20f7e 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 er taking more t
20f7f 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a han you give...*
20f80 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *..*************
20f81 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f82 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f83 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20f84 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a ************..**
20f85 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 This file conta
20f86 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e ins the implemen
20f87 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 tation of the sq
20f88 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 58 58 58 lite3_backup_XXX
20f89 28 29 20 0d 0a 2a 2a 20 41 50 49 20 66 75 6e 63 () ..** API func
20f8a 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 72 65 tions and the re
20f8b 6c 61 74 65 64 20 66 65 61 74 75 72 65 73 2e 0d lated features..
20f8c 0a 2a 2f 0d 0a 0d 0a 2f 2a 20 4d 61 63 72 6f 20 .*/..../* Macro
20f8d 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 to find the mini
20f8e 6d 75 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 mum of two numer
20f8f 69 63 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f 0d 0a ic values...*/..
20f90 23 69 66 6e 64 65 66 20 4d 49 4e 0d 0a 23 20 64 #ifndef MIN..# d
20f91 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 efine MIN(x,y) (
20f92 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79 29 29 (x)<(y)?(x):(y))
20f93 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a ..#endif..../*..
20f94 2a 2a 20 53 74 72 75 63 74 75 72 65 20 61 6c 6c ** Structure all
20f95 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 ocated for each
20f96 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e backup operation
20f97 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 73 71 ...*/..struct sq
20f98 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 7b 0d 0a lite3_backup {..
20f99 20 20 73 71 6c 69 74 65 33 2a 20 70 44 65 73 74 sqlite3* pDest
20f9a 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 65 Db; /* De
20f9b 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 stination databa
20f9c 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 se handle */..
20f9d 42 74 72 65 65 20 2a 70 44 65 73 74 3b 20 20 20 Btree *pDest;
20f9e 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 /* Dest
20f9f 69 6e 61 74 69 6f 6e 20 62 2d 74 72 65 65 20 66 ination b-tree f
20fa0 69 6c 65 20 2a 2f 0d 0a 20 20 75 33 32 20 69 44 ile */.. u32 iD
20fa1 65 73 74 53 63 68 65 6d 61 3b 20 20 20 20 20 20 estSchema;
20fa2 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 73 /* Original s
20fa3 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20 chema cookie in
20fa4 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0d 0a destination */..
20fa5 20 20 69 6e 74 20 62 44 65 73 74 4c 6f 63 6b 65 int bDestLocke
20fa6 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 d; /* Tr
20fa7 75 65 20 6f 6e 63 65 20 61 20 77 72 69 74 65 2d ue once a write-
20fa8 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f transaction is o
20fa9 70 65 6e 20 6f 6e 20 70 44 65 73 74 20 2a 2f 0d pen on pDest */.
20faa 0a 0d 0a 20 20 50 67 6e 6f 20 69 4e 65 78 74 3b ... Pgno iNext;
20fab 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
20fac 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 Page number of
20fad 74 68 65 20 6e 65 78 74 20 73 6f 75 72 63 65 20 the next source
20fae 70 61 67 65 20 74 6f 20 63 6f 70 79 20 2a 2f 0d page to copy */.
20faf 0a 20 20 73 71 6c 69 74 65 33 2a 20 70 53 72 63 . sqlite3* pSrc
20fb0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 Db; /* S
20fb1 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 68 ource database h
20fb2 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 42 74 72 65 andle */.. Btre
20fb3 65 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 e *pSrc;
20fb4 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 62 /* Source b
20fb5 2d 74 72 65 65 20 66 69 6c 65 20 2a 2f 0d 0a 0d -tree file */...
20fb6 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
20fb7 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 /* B
20fb8 61 63 6b 75 70 20 70 72 6f 63 65 73 73 20 65 72 ackup process er
20fb9 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 ror code */....
20fba 20 2f 2a 20 54 68 65 73 65 20 74 77 6f 20 76 61 /* These two va
20fbb 72 69 61 62 6c 65 73 20 61 72 65 20 73 65 74 20 riables are set
20fbc 62 79 20 65 76 65 72 79 20 63 61 6c 6c 20 74 6f by every call to
20fbd 20 62 61 63 6b 75 70 5f 73 74 65 70 28 29 2e 20 backup_step().
20fbe 54 68 65 79 20 61 72 65 0d 0a 20 20 2a 2a 20 72 They are.. ** r
20fbf 65 61 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 ead by calls to
20fc0 62 61 63 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67 backup_remaining
20fc1 28 29 20 61 6e 64 20 62 61 63 6b 75 70 5f 70 61 () and backup_pa
20fc2 67 65 63 6f 75 6e 74 28 29 2e 0d 0a 20 20 2a 2f gecount()... */
20fc3 0d 0a 20 20 50 67 6e 6f 20 6e 52 65 6d 61 69 6e .. Pgno nRemain
20fc4 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 ing; /*
20fc5 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 Number of pages
20fc6 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f 0d left to copy */.
20fc7 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 63 6f 75 . Pgno nPagecou
20fc8 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 nt; /* T
20fc9 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 otal number of p
20fca 61 67 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0d ages to copy */.
20fcb 0a 0d 0a 20 20 69 6e 74 20 69 73 41 74 74 61 63 ... int isAttac
20fcc 68 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a hed; /*
20fcd 20 54 72 75 65 20 6f 6e 63 65 20 62 61 63 6b 75 True once backu
20fce 70 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73 p has been regis
20fcf 74 65 72 65 64 20 77 69 74 68 20 70 61 67 65 72 tered with pager
20fd0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 62 */.. sqlite3_b
20fd1 61 63 6b 75 70 20 2a 70 4e 65 78 74 3b 20 20 20 ackup *pNext;
20fd2 2f 2a 20 4e 65 78 74 20 62 61 63 6b 75 70 20 61 /* Next backup a
20fd3 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 ssociated with s
20fd4 6f 75 72 63 65 20 70 61 67 65 72 20 2a 2f 0d 0a ource pager */..
20fd5 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 48 52 };..../*..** THR
20fd6 45 41 44 20 53 41 46 45 54 59 20 4e 4f 54 45 53 EAD SAFETY NOTES
20fd7 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 4f 6e 63 65 :..**..** Once
20fd8 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 it has been cre
20fd9 61 74 65 64 20 75 73 69 6e 67 20 62 61 63 6b 75 ated using backu
20fda 70 5f 69 6e 69 74 28 29 2c 20 61 20 73 69 6e 67 p_init(), a sing
20fdb 6c 65 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 le sqlite3_backu
20fdc 70 0d 0a 2a 2a 20 20 20 73 74 72 75 63 74 75 72 p..** structur
20fdd 65 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 e may be accesse
20fde 64 20 76 69 61 20 74 77 6f 20 67 72 6f 75 70 73 d via two groups
20fdf 20 6f 66 20 74 68 72 65 61 64 2d 73 61 66 65 20 of thread-safe
20fe0 65 6e 74 72 79 20 70 6f 69 6e 74 73 3a 0d 0a 2a entry points:..*
20fe1 2a 0d 0a 2a 2a 20 20 20 20 20 2a 20 56 69 61 20 *..** * Via
20fe2 74 68 65 20 73 71 6c 69 74 65 33 5f 62 61 63 6b the sqlite3_back
20fe3 75 70 5f 58 58 58 28 29 20 41 50 49 20 66 75 6e up_XXX() API fun
20fe4 63 74 69 6f 6e 20 62 61 63 6b 75 70 5f 73 74 65 ction backup_ste
20fe5 70 28 29 20 61 6e 64 20 0d 0a 2a 2a 20 20 20 20 p() and ..**
20fe6 20 20 20 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 backup_finish
20fe7 28 29 2e 20 42 6f 74 68 20 74 68 65 73 65 20 66 (). Both these f
20fe8 75 6e 63 74 69 6f 6e 73 20 6f 62 74 61 69 6e 20 unctions obtain
20fe9 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 the source datab
20fea 61 73 65 0d 0a 2a 2a 20 20 20 20 20 20 20 68 61 ase..** ha
20feb 6e 64 6c 65 20 6d 75 74 65 78 20 61 6e 64 20 74 ndle mutex and t
20fec 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 he mutex associa
20fed 74 65 64 20 77 69 74 68 20 74 68 65 20 73 6f 75 ted with the sou
20fee 72 63 65 20 42 74 53 68 61 72 65 64 20 0d 0a 2a rce BtShared ..*
20fef 2a 20 20 20 20 20 20 20 73 74 72 75 63 74 75 72 * structur
20ff0 65 2c 20 69 6e 20 74 68 61 74 20 6f 72 64 65 72 e, in that order
20ff1 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 2a 20 ...**..** *
20ff2 56 69 61 20 74 68 65 20 42 61 63 6b 75 70 55 70 Via the BackupUp
20ff3 64 61 74 65 28 29 20 61 6e 64 20 42 61 63 6b 75 date() and Backu
20ff4 70 52 65 73 74 61 72 74 28 29 20 66 75 6e 63 74 pRestart() funct
20ff5 69 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0d ions, which are.
20ff6 0a 2a 2a 20 20 20 20 20 20 20 69 6e 76 6f 6b 65 .** invoke
20ff7 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 6c d by the pager l
20ff8 61 79 65 72 20 74 6f 20 72 65 70 6f 72 74 20 76 ayer to report v
20ff9 61 72 69 6f 75 73 20 73 74 61 74 65 20 63 68 61 arious state cha
20ffa 6e 67 65 73 20 69 6e 0d 0a 2a 2a 20 20 20 20 20 nges in..**
20ffb 20 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 the page cache
20ffc 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
20ffd 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 the source data
20ffe 62 61 73 65 2e 20 54 68 65 20 6d 75 74 65 78 0d base. The mutex.
20fff 0a 2a 2a 20 20 20 20 20 20 20 61 73 73 6f 63 69 .** associ
21000 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 6f ated with the so
21001 75 72 63 65 20 64 61 74 61 62 61 73 65 20 42 74 urce database Bt
21002 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 Shared structure
21003 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 0d 0a 2a will always ..*
21004 2a 20 20 20 20 20 20 20 62 65 20 68 65 6c 64 20 * be held
21005 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74 when either of t
21006 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 hese functions a
21007 72 65 20 69 6e 76 6f 6b 65 64 2e 0d 0a 2a 2a 0d re invoked...**.
21008 0a 2a 2a 20 20 20 54 68 65 20 6f 74 68 65 72 20 .** The other
21009 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 58 sqlite3_backup_X
2100a 58 58 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f XX() API functio
2100b 6e 73 2c 20 62 61 63 6b 75 70 5f 72 65 6d 61 69 ns, backup_remai
2100c 6e 69 6e 67 28 29 20 61 6e 64 0d 0a 2a 2a 20 20 ning() and..**
2100d 20 62 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e backup_pagecoun
2100e 74 28 29 20 61 72 65 20 6e 6f 74 20 74 68 72 65 t() are not thre
2100f 61 64 2d 73 61 66 65 20 66 75 6e 63 74 69 6f 6e ad-safe function
21010 73 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 63 s. If they are c
21011 61 6c 6c 65 64 0d 0a 2a 2a 20 20 20 77 68 69 6c alled..** whil
21012 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 68 72 e some other thr
21013 65 61 64 20 69 73 20 63 61 6c 6c 69 6e 67 20 62 ead is calling b
21014 61 63 6b 75 70 5f 73 74 65 70 28 29 20 6f 72 20 ackup_step() or
21015 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 29 2c backup_finish(),
21016 0d 0a 2a 2a 20 20 20 74 68 65 20 76 61 6c 75 65 ..** the value
21017 73 20 72 65 74 75 72 6e 65 64 20 6d 61 79 20 62 s returned may b
21018 65 20 69 6e 76 61 6c 69 64 2e 20 54 68 65 72 65 e invalid. There
21019 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 61 is no way for a
2101a 20 63 61 6c 6c 20 74 6f 0d 0a 2a 2a 20 20 20 42 call to..** B
2101b 61 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 72 ackupUpdate() or
2101c 20 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 BackupRestart()
2101d 20 74 6f 20 69 6e 74 65 72 66 65 72 65 20 77 69 to interfere wi
2101e 74 68 20 62 61 63 6b 75 70 5f 72 65 6d 61 69 6e th backup_remain
2101f 69 6e 67 28 29 0d 0a 2a 2a 20 20 20 6f 72 20 62 ing()..** or b
21020 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28 ackup_pagecount(
21021 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 44 65 70 )...**..** Dep
21022 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 53 51 ending on the SQ
21023 4c 69 74 65 20 63 6f 6e 66 69 67 75 72 61 74 69 Lite configurati
21024 6f 6e 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 on, the database
21025 20 68 61 6e 64 6c 65 73 20 61 6e 64 2f 6f 72 0d handles and/or.
21026 0a 2a 2a 20 20 20 74 68 65 20 42 74 72 65 65 20 .** the Btree
21027 6f 62 6a 65 63 74 73 20 6d 61 79 20 68 61 76 65 objects may have
21028 20 74 68 65 69 72 20 6f 77 6e 20 6d 75 74 65 78 their own mutex
21029 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 es that require
2102a 6c 6f 63 6b 69 6e 67 2e 0d 0a 2a 2a 20 20 20 4e locking...** N
2102b 6f 6e 2d 73 68 61 72 61 62 6c 65 20 42 74 72 65 on-sharable Btre
2102c 65 73 20 28 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 es (in-memory da
2102d 74 61 62 61 73 65 73 20 66 6f 72 20 65 78 61 6d tabases for exam
2102e 70 6c 65 29 2c 20 64 6f 20 6e 6f 74 20 68 61 76 ple), do not hav
2102f 65 0d 0a 2a 2a 20 20 20 61 73 73 6f 63 69 61 74 e..** associat
21030 65 64 20 6d 75 74 65 78 65 73 2e 0d 0a 2a 2f 0d ed mutexes...*/.
21031 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e .../*..** Return
21032 20 61 20 70 6f 69 6e 74 65 72 20 63 6f 72 72 65 a pointer corre
21033 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 sponding to data
21034 62 61 73 65 20 7a 44 62 20 28 69 2e 65 2e 20 22 base zDb (i.e. "
21035 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0d 0a main", "temp")..
21036 2a 2a 20 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e ** in connection
21037 20 68 61 6e 64 6c 65 20 70 44 62 2e 20 49 66 20 handle pDb. If
21038 73 75 63 68 20 61 20 64 61 74 61 62 61 73 65 20 such a database
21039 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c cannot be found,
2103a 20 72 65 74 75 72 6e 0d 0a 2a 2a 20 61 20 4e 55 return..** a NU
2103b 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 77 LL pointer and w
2103c 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 rite an error me
2103d 73 73 61 67 65 20 74 6f 20 70 45 72 72 6f 72 44 ssage to pErrorD
2103e 62 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 b...**..** If th
2103f 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 e "temp" databas
21040 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 e is requested,
21041 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 it may need to b
21042 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 e opened by this
21043 20 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 ..** function.
21044 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 If an error occu
21045 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 rs while doing s
21046 6f 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 o, return 0 and
21047 77 72 69 74 65 20 61 6e 20 0d 0a 2a 2a 20 65 72 write an ..** er
21048 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 ror message to p
21049 45 72 72 6f 72 44 62 2e 0d 0a 2a 2f 0d 0a 73 74 ErrorDb...*/..st
2104a 61 74 69 63 20 42 74 72 65 65 20 2a 66 69 6e 64 atic Btree *find
2104b 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 70 Btree(sqlite3 *p
2104c 45 72 72 6f 72 44 62 2c 20 73 71 6c 69 74 65 33 ErrorDb, sqlite3
2104d 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 *pDb, const cha
2104e 72 20 2a 7a 44 62 29 7b 0d 0a 20 20 69 6e 74 20 r *zDb){.. int
2104f 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 i = sqlite3FindD
21050 62 4e 61 6d 65 28 70 44 62 2c 20 7a 44 62 29 3b bName(pDb, zDb);
21051 0d 0a 0d 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 .... if( i==1 )
21052 7b 0d 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 {.. Parse *pP
21053 61 72 73 65 3b 0d 0a 20 20 20 20 69 6e 74 20 72 arse;.. int r
21054 63 20 3d 20 30 3b 0d 0a 20 20 20 20 70 50 61 72 c = 0;.. pPar
21055 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 se = sqlite3Stac
21056 6b 41 6c 6c 6f 63 5a 65 72 6f 28 70 45 72 72 6f kAllocZero(pErro
21057 72 44 62 2c 20 73 69 7a 65 6f 66 28 2a 70 50 61 rDb, sizeof(*pPa
21058 72 73 65 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 rse));.. if(
21059 70 50 61 72 73 65 3d 3d 30 20 29 7b 0d 0a 20 20 pParse==0 ){..
2105a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 sqlite3Error
2105b 28 70 45 72 72 6f 72 44 62 2c 20 53 51 4c 49 54 (pErrorDb, SQLIT
2105c 45 5f 4e 4f 4d 45 4d 2c 20 22 6f 75 74 20 6f 66 E_NOMEM, "out of
2105d 20 6d 65 6d 6f 72 79 22 29 3b 0d 0a 20 20 20 20 memory");..
2105e 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f rc = SQLITE_NO
2105f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b MEM;.. }else{
21060 0d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e .. pParse->
21061 64 62 20 3d 20 70 44 62 3b 0d 0a 20 20 20 20 20 db = pDb;..
21062 20 69 66 28 20 73 71 6c 69 74 65 33 4f 70 65 6e if( sqlite3Open
21063 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 TempDatabase(pPa
21064 72 73 65 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 rse) ){..
21065 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 45 sqlite3Error(pE
21066 72 72 6f 72 44 62 2c 20 70 50 61 72 73 65 2d 3e rrorDb, pParse->
21067 72 63 2c 20 22 25 73 22 2c 20 70 50 61 72 73 65 rc, "%s", pParse
21068 2d 3e 7a 45 72 72 4d 73 67 29 3b 0d 0a 20 20 20 ->zErrMsg);..
21069 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
2106a 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 7d _ERROR;.. }
2106b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 .. sqlite3D
2106c 62 46 72 65 65 28 70 45 72 72 6f 72 44 62 2c 20 bFree(pErrorDb,
2106d 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 pParse->zErrMsg)
2106e 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ;.. sqlite3
2106f 53 74 61 63 6b 46 72 65 65 28 70 45 72 72 6f 72 StackFree(pError
21070 44 62 2c 20 70 50 61 72 73 65 29 3b 0d 0a 20 20 Db, pParse);..
21071 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72 63 20 }.. if( rc
21072 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
21073 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0;.. }.. }.
21074 0a 0d 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0d ... if( i<0 ){.
21075 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f . sqlite3Erro
21076 72 28 70 45 72 72 6f 72 44 62 2c 20 53 51 4c 49 r(pErrorDb, SQLI
21077 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f TE_ERROR, "unkno
21078 77 6e 20 64 61 74 61 62 61 73 65 20 25 73 22 2c wn database %s",
21079 20 7a 44 62 29 3b 0d 0a 20 20 20 20 72 65 74 75 zDb);.. retu
2107a 72 6e 20 30 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 rn 0;.. }....
2107b 72 65 74 75 72 6e 20 70 44 62 2d 3e 61 44 62 5b return pDb->aDb[
2107c 69 5d 2e 70 42 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a i].pBt;..}..../*
2107d 0d 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 ..** Attempt to
2107e 73 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a set the page siz
2107f 65 20 6f 66 20 74 68 65 20 64 65 73 74 69 6e 61 e of the destina
21080 74 69 6f 6e 20 74 6f 20 6d 61 74 63 68 20 74 68 tion to match th
21081 65 20 70 61 67 65 20 73 69 7a 65 0d 0a 2a 2a 20 e page size..**
21082 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2e 0d 0a of the source...
21083 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 */..static int s
21084 65 74 44 65 73 74 50 67 73 7a 28 73 71 6c 69 74 etDestPgsz(sqlit
21085 65 33 5f 62 61 63 6b 75 70 20 2a 70 29 7b 0d 0a e3_backup *p){..
21086 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 72 63 20 int rc;.. rc
21087 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 = sqlite3BtreeSe
21088 74 50 61 67 65 53 69 7a 65 28 70 2d 3e 70 44 65 tPageSize(p->pDe
21089 73 74 2c 73 71 6c 69 74 65 33 42 74 72 65 65 47 st,sqlite3BtreeG
2108a 65 74 50 61 67 65 53 69 7a 65 28 70 2d 3e 70 53 etPageSize(p->pS
2108b 72 63 29 2c 2d 31 2c 30 29 3b 0d 0a 20 20 72 65 rc),-1,0);.. re
2108c 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
2108d 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 *..** Create an
2108e 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 70 sqlite3_backup p
2108f 72 6f 63 65 73 73 20 74 6f 20 63 6f 70 79 20 74 rocess to copy t
21090 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 7a he contents of z
21091 53 72 63 44 62 20 66 72 6f 6d 0d 0a 2a 2a 20 63 SrcDb from..** c
21092 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 onnection handle
21093 20 70 53 72 63 44 62 20 74 6f 20 7a 44 65 73 74 pSrcDb to zDest
21094 44 62 20 69 6e 20 70 44 65 73 74 44 62 2e 20 49 Db in pDestDb. I
21095 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 f successful, re
21096 74 75 72 6e 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 turn..** a point
21097 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 71 er to the new sq
21098 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a lite3_backup obj
21099 65 63 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 ect...**..** If
2109a 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
2109b 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 NULL is returne
2109c 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 d and an error c
2109d 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 ode and error me
2109e 73 73 61 67 65 0d 0a 2a 2a 20 73 74 6f 72 65 64 ssage..** stored
2109f 20 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e in database han
210a0 64 6c 65 20 70 44 65 73 74 44 62 2e 0d 0a 2a 2f dle pDestDb...*/
210a1 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 73 71 6c ..SQLITE_API sql
210a2 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 73 71 6c ite3_backup *sql
210a3 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 ite3_backup_init
210a4 28 0d 0a 20 20 73 71 6c 69 74 65 33 2a 20 70 44 (.. sqlite3* pD
210a5 65 73 74 44 62 2c 20 20 20 20 20 20 20 20 20 20 estDb,
210a6 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 /* Da
210a7 74 61 62 61 73 65 20 74 6f 20 77 72 69 74 65 20 tabase to write
210a8 74 6f 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 to */.. const c
210a9 68 61 72 20 2a 7a 44 65 73 74 44 62 2c 20 20 20 har *zDestDb,
210aa 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
210ab 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 * Name of databa
210ac 73 65 20 77 69 74 68 69 6e 20 70 44 65 73 74 44 se within pDestD
210ad 62 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 2a b */.. sqlite3*
210ae 20 70 53 72 63 44 62 2c 20 20 20 20 20 20 20 20 pSrcDb,
210af 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
210b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 Database connec
210b1 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 66 72 6f tion to read fro
210b2 6d 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 m */.. const ch
210b3 61 72 20 2a 7a 53 72 63 44 62 20 20 20 20 20 20 ar *zSrcDb
210b4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
210b5 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 Name of databas
210b6 65 20 77 69 74 68 69 6e 20 70 53 72 63 44 62 20 e within pSrcDb
210b7 2a 2f 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 */..){.. sqlite
210b8 33 5f 62 61 63 6b 75 70 20 2a 70 3b 20 20 20 20 3_backup *p;
210b9 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
210ba 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 /* Value to retu
210bb 72 6e 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 4c 6f rn */.... /* Lo
210bc 63 6b 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 ck the source da
210bd 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 tabase handle. T
210be 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 he destination d
210bf 61 74 61 62 61 73 65 0d 0a 20 20 2a 2a 20 68 61 atabase.. ** ha
210c0 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b ndle is not lock
210c1 65 64 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 ed in this routi
210c2 6e 65 2c 20 62 75 74 20 69 74 20 69 73 20 6c 6f ne, but it is lo
210c3 63 6b 65 64 20 69 6e 0d 0a 20 20 2a 2a 20 73 71 cked in.. ** sq
210c4 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 lite3_backup_ste
210c5 70 28 29 2e 20 54 68 65 20 75 73 65 72 20 69 73 p(). The user is
210c6 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 required to ens
210c7 75 72 65 20 74 68 61 74 20 6e 6f 0d 0a 20 20 2a ure that no.. *
210c8 2a 20 6f 74 68 65 72 20 74 68 72 65 61 64 20 61 * other thread a
210c9 63 63 65 73 73 65 73 20 74 68 65 20 64 65 73 74 ccesses the dest
210ca 69 6e 61 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 ination handle f
210cb 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 0d or the duration.
210cc 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 62 61 63 . ** of the bac
210cd 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 kup operation.
210ce 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 Any attempt to u
210cf 73 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 se the destinati
210d0 6f 6e 0d 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 on.. ** databas
210d1 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68 69 e connection whi
210d2 6c 65 20 61 20 62 61 63 6b 75 70 20 69 73 20 69 le a backup is i
210d3 6e 20 70 72 6f 67 72 65 73 73 20 6d 61 79 20 63 n progress may c
210d4 61 75 73 65 0d 0a 20 20 2a 2a 20 61 20 6d 61 6c ause.. ** a mal
210d5 66 75 6e 63 74 69 6f 6e 20 6f 72 20 61 20 64 65 function or a de
210d6 61 64 6c 6f 63 6b 2e 0d 0a 20 20 2a 2f 0d 0a 20 adlock... */..
210d7 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
210d8 6e 74 65 72 28 70 53 72 63 44 62 2d 3e 6d 75 74 nter(pSrcDb->mut
210d9 65 78 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f ex);.. sqlite3_
210da 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 44 65 73 mutex_enter(pDes
210db 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 0d 0a tDb->mutex);....
210dc 20 20 69 66 28 20 70 53 72 63 44 62 3d 3d 70 44 if( pSrcDb==pD
210dd 65 73 74 44 62 20 29 7b 0d 0a 20 20 20 20 73 71 estDb ){.. sq
210de 6c 69 74 65 33 45 72 72 6f 72 28 0d 0a 20 20 20 lite3Error(..
210df 20 20 20 20 20 70 44 65 73 74 44 62 2c 20 53 51 pDestDb, SQ
210e0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 73 6f 75 LITE_ERROR, "sou
210e1 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 rce and destinat
210e2 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 69 73 74 ion must be dist
210e3 69 6e 63 74 22 0d 0a 20 20 20 20 29 3b 0d 0a 20 inct".. );..
210e4 20 20 20 70 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c p = 0;.. }el
210e5 73 65 20 7b 0d 0a 20 20 20 20 2f 2a 20 41 6c 6c se {.. /* All
210e6 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 ocate space for
210e7 61 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 62 61 a new sqlite3_ba
210e8 63 6b 75 70 20 6f 62 6a 65 63 74 2e 2e 2e 0d 0a ckup object.....
210e9 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d ** EVIDENCE-
210ea 4f 46 3a 20 52 2d 36 34 38 35 32 2d 32 31 35 39 OF: R-64852-2159
210eb 31 20 54 68 65 20 73 71 6c 69 74 65 33 5f 62 61 1 The sqlite3_ba
210ec 63 6b 75 70 20 6f 62 6a 65 63 74 20 69 73 20 63 ckup object is c
210ed 72 65 61 74 65 64 20 62 79 20 61 0d 0a 20 20 20 reated by a..
210ee 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 ** call to sqli
210ef 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 te3_backup_init(
210f0 29 20 61 6e 64 20 69 73 20 64 65 73 74 72 6f 79 ) and is destroy
210f1 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0d ed by a call to.
210f2 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f . ** sqlite3_
210f3 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 29 2e backup_finish().
210f4 20 2a 2f 0d 0a 20 20 20 20 70 20 3d 20 28 73 71 */.. p = (sq
210f5 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 29 73 lite3_backup *)s
210f6 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 qlite3_malloc(si
210f7 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 62 61 63 zeof(sqlite3_bac
210f8 6b 75 70 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 kup));.. if(
210f9 21 70 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c !p ){.. sql
210fa 69 74 65 33 45 72 72 6f 72 28 70 44 65 73 74 44 ite3Error(pDestD
210fb 62 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c b, SQLITE_NOMEM,
210fc 20 30 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0);.. }.. }
210fd 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 .... /* If the
210fe 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 allocation succe
210ff 65 64 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 eded, populate t
21100 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 2a he new object. *
21101 2f 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 /.. if( p ){..
21102 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 memset(p, 0,
21103 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 62 sizeof(sqlite3_b
21104 61 63 6b 75 70 29 29 3b 0d 0a 20 20 20 20 70 2d ackup));.. p-
21105 3e 70 53 72 63 20 3d 20 66 69 6e 64 42 74 72 65 >pSrc = findBtre
21106 65 28 70 44 65 73 74 44 62 2c 20 70 53 72 63 44 e(pDestDb, pSrcD
21107 62 2c 20 7a 53 72 63 44 62 29 3b 0d 0a 20 20 20 b, zSrcDb);..
21108 20 70 2d 3e 70 44 65 73 74 20 3d 20 66 69 6e 64 p->pDest = find
21109 42 74 72 65 65 28 70 44 65 73 74 44 62 2c 20 70 Btree(pDestDb, p
2110a 44 65 73 74 44 62 2c 20 7a 44 65 73 74 44 62 29 DestDb, zDestDb)
2110b 3b 0d 0a 20 20 20 20 70 2d 3e 70 44 65 73 74 44 ;.. p->pDestD
2110c 62 20 3d 20 70 44 65 73 74 44 62 3b 0d 0a 20 20 b = pDestDb;..
2110d 20 20 70 2d 3e 70 53 72 63 44 62 20 3d 20 70 53 p->pSrcDb = pS
2110e 72 63 44 62 3b 0d 0a 20 20 20 20 70 2d 3e 69 4e rcDb;.. p->iN
2110f 65 78 74 20 3d 20 31 3b 0d 0a 20 20 20 20 70 2d ext = 1;.. p-
21110 3e 69 73 41 74 74 61 63 68 65 64 20 3d 20 30 3b >isAttached = 0;
21111 0d 0a 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 .... if( 0==p
21112 2d 3e 70 53 72 63 20 7c 7c 20 30 3d 3d 70 2d 3e ->pSrc || 0==p->
21113 70 44 65 73 74 20 7c 7c 20 73 65 74 44 65 73 74 pDest || setDest
21114 50 67 73 7a 28 70 29 3d 3d 53 51 4c 49 54 45 5f Pgsz(p)==SQLITE_
21115 4e 4f 4d 45 4d 20 29 7b 0d 0a 20 20 20 20 20 20 NOMEM ){..
21116 2f 2a 20 4f 6e 65 20 28 6f 72 20 62 6f 74 68 29 /* One (or both)
21117 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 of the named da
21118 74 61 62 61 73 65 73 20 64 69 64 20 6e 6f 74 20 tabases did not
21119 65 78 69 73 74 20 6f 72 20 61 6e 20 4f 4f 4d 0d exist or an OOM.
2111a 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 . ** error
2111b 77 61 73 20 68 69 74 2e 20 20 54 68 65 20 65 72 was hit. The er
2111c 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 ror has already
2111d 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 been written int
2111e 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 o the.. **
2111f 70 44 65 73 74 44 62 20 68 61 6e 64 6c 65 2e 20 pDestDb handle.
21120 20 41 6c 6c 20 74 68 61 74 20 69 73 20 6c 65 66 All that is lef
21121 74 20 74 6f 20 64 6f 20 68 65 72 65 20 69 73 20 t to do here is
21122 66 72 65 65 20 74 68 65 0d 0a 20 20 20 20 20 20 free the..
21123 2a 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 ** sqlite3_backu
21124 70 20 73 74 72 75 63 74 75 72 65 2e 0d 0a 20 20 p structure...
21125 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 73 71 */.. sq
21126 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a lite3_free(p);..
21127 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a 20 20 p = 0;..
21128 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 }.. }.. if(
21129 70 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 70 53 72 p ){.. p->pSr
2112a 63 2d 3e 6e 42 61 63 6b 75 70 2b 2b 3b 0d 0a 20 c->nBackup++;..
2112b 20 7d 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 5f }.... sqlite3_
2112c 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 44 65 73 mutex_leave(pDes
2112d 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 tDb->mutex);..
2112e 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 sqlite3_mutex_le
2112f 61 76 65 28 70 53 72 63 44 62 2d 3e 6d 75 74 65 ave(pSrcDb->mute
21130 78 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b x);.. return p;
21131 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 ..}..../*..** Ar
21132 67 75 6d 65 6e 74 20 72 63 20 69 73 20 61 6e 20 gument rc is an
21133 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 SQLite error cod
21134 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 e. Return true i
21135 66 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 f this error is
21136 0d 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 ..** considered
21137 66 61 74 61 6c 20 69 66 20 65 6e 63 6f 75 6e 74 fatal if encount
21138 65 72 65 64 20 64 75 72 69 6e 67 20 61 20 62 61 ered during a ba
21139 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e 20 ckup operation.
2113a 41 6c 6c 20 65 72 72 6f 72 73 0d 0a 2a 2a 20 61 All errors..** a
2113b 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 66 61 re considered fa
2113c 74 61 6c 20 65 78 63 65 70 74 20 66 6f 72 20 53 tal except for S
2113d 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 53 QLITE_BUSY and S
2113e 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0d 0a 2a QLITE_LOCKED...*
2113f 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 /..static int is
21140 46 61 74 61 6c 45 72 72 6f 72 28 69 6e 74 20 72 FatalError(int r
21141 63 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 28 72 c){.. return (r
21142 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c!=SQLITE_OK &&
21143 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc!=SQLITE_BUSY
21144 26 26 20 41 4c 57 41 59 53 28 72 63 21 3d 53 51 && ALWAYS(rc!=SQ
21145 4c 49 54 45 5f 4c 4f 43 4b 45 44 29 29 3b 0d 0a LITE_LOCKED));..
21146 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 61 }..../*..** Para
21147 6d 65 74 65 72 20 7a 53 72 63 44 61 74 61 20 70 meter zSrcData p
21148 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 oints to a buffe
21149 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 r containing the
2114a 20 64 61 74 61 20 66 6f 72 20 0d 0a 2a 2a 20 70 data for ..** p
2114b 61 67 65 20 69 53 72 63 50 67 20 66 72 6f 6d 20 age iSrcPg from
2114c 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 the source datab
2114d 61 73 65 2e 20 43 6f 70 79 20 74 68 69 73 20 64 ase. Copy this d
2114e 61 74 61 20 69 6e 74 6f 20 74 68 65 20 0d 0a 2a ata into the ..*
2114f 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 * destination da
21150 74 61 62 61 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 tabase...*/..sta
21151 74 69 63 20 69 6e 74 20 62 61 63 6b 75 70 4f 6e tic int backupOn
21152 65 50 61 67 65 28 73 71 6c 69 74 65 33 5f 62 61 ePage(sqlite3_ba
21153 63 6b 75 70 20 2a 70 2c 20 50 67 6e 6f 20 69 53 ckup *p, Pgno iS
21154 72 63 50 67 2c 20 63 6f 6e 73 74 20 75 38 20 2a rcPg, const u8 *
21155 7a 53 72 63 44 61 74 61 29 7b 0d 0a 20 20 50 61 zSrcData){.. Pa
21156 67 65 72 20 2a 20 63 6f 6e 73 74 20 70 44 65 73 ger * const pDes
21157 74 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 tPager = sqlite3
21158 42 74 72 65 65 50 61 67 65 72 28 70 2d 3e 70 44 BtreePager(p->pD
21159 65 73 74 29 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 est);.. const i
2115a 6e 74 20 6e 53 72 63 50 67 73 7a 20 3d 20 73 71 nt nSrcPgsz = sq
2115b 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 lite3BtreeGetPag
2115c 65 53 69 7a 65 28 70 2d 3e 70 53 72 63 29 3b 0d eSize(p->pSrc);.
2115d 0a 20 20 69 6e 74 20 6e 44 65 73 74 50 67 73 7a . int nDestPgsz
2115e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 = sqlite3BtreeG
2115f 65 74 50 61 67 65 53 69 7a 65 28 70 2d 3e 70 44 etPageSize(p->pD
21160 65 73 74 29 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 est);.. const i
21161 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 6e nt nCopy = MIN(n
21162 53 72 63 50 67 73 7a 2c 20 6e 44 65 73 74 50 67 SrcPgsz, nDestPg
21163 73 7a 29 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 36 sz);.. const i6
21164 34 20 69 45 6e 64 20 3d 20 28 69 36 34 29 69 53 4 iEnd = (i64)iS
21165 72 63 50 67 2a 28 69 36 34 29 6e 53 72 63 50 67 rcPg*(i64)nSrcPg
21166 73 7a 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 sz;..#ifdef SQLI
21167 54 45 5f 48 41 53 5f 43 4f 44 45 43 0d 0a 20 20 TE_HAS_CODEC..
21168 69 6e 74 20 6e 53 72 63 52 65 73 65 72 76 65 20 int nSrcReserve
21169 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 = sqlite3BtreeGe
2116a 74 52 65 73 65 72 76 65 28 70 2d 3e 70 53 72 63 tReserve(p->pSrc
2116b 29 3b 0d 0a 20 20 69 6e 74 20 6e 44 65 73 74 52 );.. int nDestR
2116c 65 73 65 72 76 65 20 3d 20 73 71 6c 69 74 65 33 eserve = sqlite3
2116d 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 BtreeGetReserve(
2116e 70 2d 3e 70 44 65 73 74 29 3b 0d 0a 23 65 6e 64 p->pDest);..#end
2116f 69 66 0d 0a 0d 0a 20 20 69 6e 74 20 72 63 20 3d if.... int rc =
21170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 SQLITE_OK;.. i
21171 36 34 20 69 4f 66 66 3b 0d 0a 0d 0a 20 20 61 73 64 iOff;.... as
21172 73 65 72 74 28 20 70 2d 3e 62 44 65 73 74 4c 6f sert( p->bDestLo
21173 63 6b 65 64 20 29 3b 0d 0a 20 20 61 73 73 65 72 cked );.. asser
21174 74 28 20 21 69 73 46 61 74 61 6c 45 72 72 6f 72 t( !isFatalError
21175 28 70 2d 3e 72 63 29 20 29 3b 0d 0a 20 20 61 73 (p->rc) );.. as
21176 73 65 72 74 28 20 69 53 72 63 50 67 21 3d 50 45 sert( iSrcPg!=PE
21177 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 NDING_BYTE_PAGE(
21178 70 2d 3e 70 53 72 63 2d 3e 70 42 74 29 20 29 3b p->pSrc->pBt) );
21179 0d 0a 20 20 61 73 73 65 72 74 28 20 7a 53 72 63 .. assert( zSrc
2117a 44 61 74 61 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 Data );.... /*
2117b 43 61 74 63 68 20 74 68 65 20 63 61 73 65 20 77 Catch the case w
2117c 68 65 72 65 20 74 68 65 20 64 65 73 74 69 6e 61 here the destina
2117d 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d 65 tion is an in-me
2117e 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 61 6e mory database an
2117f 64 20 74 68 65 0d 0a 20 20 2a 2a 20 70 61 67 65 d the.. ** page
21180 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 73 6f sizes of the so
21181 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 urce and destina
21182 74 69 6f 6e 20 64 69 66 66 65 72 2e 20 0d 0a 20 tion differ. ..
21183 20 2a 2f 0d 0a 20 20 69 66 28 20 6e 53 72 63 50 */.. if( nSrcP
21184 67 73 7a 21 3d 6e 44 65 73 74 50 67 73 7a 20 26 gsz!=nDestPgsz &
21185 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 & sqlite3PagerIs
21186 4d 65 6d 64 62 28 70 44 65 73 74 50 61 67 65 72 Memdb(pDestPager
21187 29 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 ) ){.. rc = S
21188 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d QLITE_READONLY;.
21189 0a 20 20 7d 0d 0a 0d 0a 23 69 66 64 65 66 20 53 . }....#ifdef S
2118a 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0d QLITE_HAS_CODEC.
2118b 0a 20 20 2f 2a 20 42 61 63 6b 75 70 20 69 73 20 . /* Backup is
2118c 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66 20 not possible if
2118d 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6f 66 the page size of
2118e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e the destination
2118f 20 69 73 20 63 68 61 6e 67 69 6e 67 0d 0a 20 20 is changing..
21190 2a 2a 20 61 6e 64 20 61 20 63 6f 64 65 63 20 69 ** and a codec i
21191 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 2a 2f 0d s in use... */.
21192 0a 20 20 69 66 28 20 6e 53 72 63 50 67 73 7a 21 . if( nSrcPgsz!
21193 3d 6e 44 65 73 74 50 67 73 7a 20 26 26 20 73 71 =nDestPgsz && sq
21194 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 lite3PagerGetCod
21195 65 63 28 70 44 65 73 74 50 61 67 65 72 29 21 3d ec(pDestPager)!=
21196 30 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 0 ){.. rc = S
21197 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d QLITE_READONLY;.
21198 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 42 61 63 . }.... /* Bac
21199 6b 75 70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 kup is not possi
2119a 62 6c 65 20 69 66 20 74 68 65 20 6e 75 6d 62 65 ble if the numbe
2119b 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 72 65 r of bytes of re
2119c 73 65 72 76 65 20 73 70 61 63 65 20 64 69 66 66 serve space diff
2119d 65 72 0d 0a 20 20 2a 2a 20 62 65 74 77 65 65 6e er.. ** between
2119e 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 source and dest
2119f 69 6e 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 ination. If the
211a0 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e re is a differen
211a1 63 65 2c 20 74 72 79 20 74 6f 0d 0a 20 20 2a 2a ce, try to.. **
211a2 20 66 69 78 20 74 68 65 20 64 65 73 74 69 6e 61 fix the destina
211a3 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 tion to agree wi
211a4 74 68 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 th the source.
211a5 49 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 If that is not p
211a6 6f 73 73 69 62 6c 65 2c 0d 0a 20 20 2a 2a 20 74 ossible,.. ** t
211a7 68 65 6e 20 74 68 65 20 62 61 63 6b 75 70 20 63 hen the backup c
211a8 61 6e 6e 6f 74 20 70 72 6f 63 65 65 64 2e 0d 0a annot proceed...
211a9 20 20 2a 2f 0d 0a 20 20 69 66 28 20 6e 53 72 63 */.. if( nSrc
211aa 52 65 73 65 72 76 65 21 3d 6e 44 65 73 74 52 65 Reserve!=nDestRe
211ab 73 65 72 76 65 20 29 7b 0d 0a 20 20 20 20 75 33 serve ){.. u3
211ac 32 20 6e 65 77 50 67 73 7a 20 3d 20 6e 53 72 63 2 newPgsz = nSrc
211ad 50 67 73 7a 3b 0d 0a 20 20 20 20 72 63 20 3d 20 Pgsz;.. rc =
211ae 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 sqlite3PagerSetP
211af 61 67 65 73 69 7a 65 28 70 44 65 73 74 50 61 67 agesize(pDestPag
211b0 65 72 2c 20 26 6e 65 77 50 67 73 7a 2c 20 6e 53 er, &newPgsz, nS
211b1 72 63 52 65 73 65 72 76 65 29 3b 0d 0a 20 20 20 rcReserve);..
211b2 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
211b3 4f 4b 20 26 26 20 6e 65 77 50 67 73 7a 21 3d 6e OK && newPgsz!=n
211b4 53 72 63 50 67 73 7a 20 29 20 72 63 20 3d 20 53 SrcPgsz ) rc = S
211b5 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d QLITE_READONLY;.
211b6 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a . }..#endif....
211b7 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 72 /* This loop r
211b8 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 uns once for eac
211b9 68 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 h destination pa
211ba 67 65 20 73 70 61 6e 6e 65 64 20 62 79 20 74 68 ge spanned by th
211bb 65 20 73 6f 75 72 63 65 20 0d 0a 20 20 2a 2a 20 e source .. **
211bc 70 61 67 65 2e 20 46 6f 72 20 65 61 63 68 20 69 page. For each i
211bd 74 65 72 61 74 69 6f 6e 2c 20 76 61 72 69 61 62 teration, variab
211be 6c 65 20 69 4f 66 66 20 69 73 20 73 65 74 20 74 le iOff is set t
211bf 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 o the byte offse
211c0 74 0d 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 t.. ** of the d
211c1 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 67 65 2e estination page.
211c2 0d 0a 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 4f .. */.. for(iO
211c3 66 66 3d 69 45 6e 64 2d 28 69 36 34 29 6e 53 72 ff=iEnd-(i64)nSr
211c4 63 50 67 73 7a 3b 20 72 63 3d 3d 53 51 4c 49 54 cPgsz; rc==SQLIT
211c5 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 45 6e E_OK && iOff<iEn
211c6 64 3b 20 69 4f 66 66 2b 3d 6e 44 65 73 74 50 67 d; iOff+=nDestPg
211c7 73 7a 29 7b 0d 0a 20 20 20 20 44 62 50 61 67 65 sz){.. DbPage
211c8 20 2a 70 44 65 73 74 50 67 20 3d 20 30 3b 0d 0a *pDestPg = 0;..
211c9 20 20 20 20 50 67 6e 6f 20 69 44 65 73 74 20 3d Pgno iDest =
211ca 20 28 50 67 6e 6f 29 28 69 4f 66 66 2f 6e 44 65 (Pgno)(iOff/nDe
211cb 73 74 50 67 73 7a 29 2b 31 3b 0d 0a 20 20 20 20 stPgsz)+1;..
211cc 69 66 28 20 69 44 65 73 74 3d 3d 50 45 4e 44 49 if( iDest==PENDI
211cd 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 2d 3e NG_BYTE_PAGE(p->
211ce 70 44 65 73 74 2d 3e 70 42 74 29 20 29 20 63 6f pDest->pBt) ) co
211cf 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69 66 28 ntinue;.. if(
211d0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 SQLITE_OK==(rc
211d1 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 = sqlite3PagerGe
211d2 74 28 70 44 65 73 74 50 61 67 65 72 2c 20 69 44 t(pDestPager, iD
211d3 65 73 74 2c 20 26 70 44 65 73 74 50 67 29 29 0d est, &pDestPg)).
211d4 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f . && SQLITE_
211d5 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 OK==(rc = sqlite
211d6 33 50 61 67 65 72 57 72 69 74 65 28 70 44 65 73 3PagerWrite(pDes
211d7 74 50 67 29 29 0d 0a 20 20 20 20 29 7b 0d 0a 20 tPg)).. ){..
211d8 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a const u8 *z
211d9 49 6e 20 3d 20 26 7a 53 72 63 44 61 74 61 5b 69 In = &zSrcData[i
211da 4f 66 66 25 6e 53 72 63 50 67 73 7a 5d 3b 0d 0a Off%nSrcPgsz];..
211db 20 20 20 20 20 20 75 38 20 2a 7a 44 65 73 74 44 u8 *zDestD
211dc 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 ata = sqlite3Pag
211dd 65 72 47 65 74 44 61 74 61 28 70 44 65 73 74 50 erGetData(pDestP
211de 67 29 3b 0d 0a 20 20 20 20 20 20 75 38 20 2a 7a g);.. u8 *z
211df 4f 75 74 20 3d 20 26 7a 44 65 73 74 44 61 74 61 Out = &zDestData
211e0 5b 69 4f 66 66 25 6e 44 65 73 74 50 67 73 7a 5d [iOff%nDestPgsz]
211e1 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 43 6f ;.... /* Co
211e2 70 79 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d py the data from
211e3 20 74 68 65 20 73 6f 75 72 63 65 20 70 61 67 65 the source page
211e4 20 69 6e 74 6f 20 74 68 65 20 64 65 73 74 69 6e into the destin
211e5 61 74 69 6f 6e 20 70 61 67 65 2e 0d 0a 20 20 20 ation page...
211e6 20 20 20 2a 2a 20 54 68 65 6e 20 63 6c 65 61 72 ** Then clear
211e7 20 74 68 65 20 42 74 72 65 65 20 6c 61 79 65 72 the Btree layer
211e8 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 MemPage.isInit
211e9 66 6c 61 67 2e 20 42 6f 74 68 20 74 68 69 73 20 flag. Both this
211ea 6d 6f 64 75 6c 65 0d 0a 20 20 20 20 20 20 2a 2a module.. **
211eb 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 63 and the pager c
211ec 6f 64 65 20 75 73 65 20 74 68 69 73 20 74 72 69 ode use this tri
211ed 63 6b 20 28 63 6c 65 61 72 69 6e 67 20 74 68 65 ck (clearing the
211ee 20 66 69 72 73 74 20 62 79 74 65 0d 0a 20 20 20 first byte..
211ef 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 ** of the pag
211f0 65 20 27 65 78 74 72 61 27 20 73 70 61 63 65 20 e 'extra' space
211f1 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 to invalidate th
211f2 65 20 42 74 72 65 65 20 6c 61 79 65 72 73 0d 0a e Btree layers..
211f3 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 64 20 ** cached
211f4 70 61 72 73 65 20 6f 66 20 74 68 65 20 70 61 67 parse of the pag
211f5 65 29 2e 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e e). MemPage.isIn
211f6 69 74 20 69 73 20 6d 61 72 6b 65 64 20 0d 0a 20 it is marked ..
211f7 20 20 20 20 20 2a 2a 20 22 4d 55 53 54 20 42 45 ** "MUST BE
211f8 20 46 49 52 53 54 22 20 66 6f 72 20 74 68 69 73 FIRST" for this
211f9 20 70 75 72 70 6f 73 65 2e 0d 0a 20 20 20 20 20 purpose...
211fa 20 2a 2f 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 */.. memcp
211fb 79 28 7a 4f 75 74 2c 20 7a 49 6e 2c 20 6e 43 6f y(zOut, zIn, nCo
211fc 70 79 29 3b 0d 0a 20 20 20 20 20 20 28 28 75 38 py);.. ((u8
211fd 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 *)sqlite3PagerG
211fe 65 74 45 78 74 72 61 28 70 44 65 73 74 50 67 29 etExtra(pDestPg)
211ff 29 5b 30 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 7d )[0] = 0;.. }
21200 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 .. sqlite3Pag
21201 65 72 55 6e 72 65 66 28 70 44 65 73 74 50 67 29 erUnref(pDestPg)
21202 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 ;.. }.... retu
21203 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d rn rc;..}..../*.
21204 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 69 73 20 .** If pFile is
21205 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 currently larger
21206 20 74 68 61 6e 20 69 53 69 7a 65 20 62 79 74 65 than iSize byte
21207 73 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 s, then truncate
21208 20 69 74 20 74 6f 0d 0a 2a 2a 20 65 78 61 63 74 it to..** exact
21209 6c 79 20 69 53 69 7a 65 20 62 79 74 65 73 2e 20 ly iSize bytes.
2120a 49 66 20 70 46 69 6c 65 20 69 73 20 6e 6f 74 20 If pFile is not
2120b 6c 61 72 67 65 72 20 74 68 61 6e 20 69 53 69 7a larger than iSiz
2120c 65 20 62 79 74 65 73 2c 20 74 68 65 6e 0d 0a 2a e bytes, then..*
2120d 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * this function
2120e 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d is a no-op...**.
2120f 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 .** Return SQLIT
21210 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 E_OK if everythi
21211 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c ng is successful
21212 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 , or an SQLite e
21213 72 72 6f 72 20 0d 0a 2a 2a 20 63 6f 64 65 20 69 rror ..** code i
21214 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
21215 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 s...*/..static i
21216 6e 74 20 62 61 63 6b 75 70 54 72 75 6e 63 61 74 nt backupTruncat
21217 65 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 eFile(sqlite3_fi
21218 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 69 le *pFile, i64 i
21219 53 69 7a 65 29 7b 0d 0a 20 20 69 36 34 20 69 43 Size){.. i64 iC
2121a 75 72 72 65 6e 74 3b 0d 0a 20 20 69 6e 74 20 72 urrent;.. int r
2121b 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c c = sqlite3OsFil
2121c 65 53 69 7a 65 28 70 46 69 6c 65 2c 20 26 69 43 eSize(pFile, &iC
2121d 75 72 72 65 6e 74 29 3b 0d 0a 20 20 69 66 28 20 urrent);.. if(
2121e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
2121f 20 69 43 75 72 72 65 6e 74 3e 69 53 69 7a 65 20 iCurrent>iSize
21220 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c ){.. rc = sql
21221 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 ite3OsTruncate(p
21222 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0d 0a 20 File, iSize);..
21223 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
21224 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 ..}..../*..** Re
21225 67 69 73 74 65 72 20 74 68 69 73 20 62 61 63 6b gister this back
21226 75 70 20 6f 62 6a 65 63 74 20 77 69 74 68 20 74 up object with t
21227 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 73 6f he associated so
21228 75 72 63 65 20 70 61 67 65 72 20 66 6f 72 0d 0a urce pager for..
21229 2a 2a 20 63 61 6c 6c 62 61 63 6b 73 20 77 68 65 ** callbacks whe
2122a 6e 20 70 61 67 65 73 20 61 72 65 20 63 68 61 6e n pages are chan
2122b 67 65 64 20 6f 72 20 74 68 65 20 63 61 63 68 65 ged or the cache
2122c 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0d 0a 2a invalidated...*
2122d 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 /..static void a
2122e 74 74 61 63 68 42 61 63 6b 75 70 4f 62 6a 65 63 ttachBackupObjec
2122f 74 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 t(sqlite3_backup
21230 20 2a 70 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 *p){.. sqlite3
21231 5f 62 61 63 6b 75 70 20 2a 2a 70 70 3b 0d 0a 20 _backup **pp;..
21232 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
21233 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 BtreeHoldsMutex(
21234 70 2d 3e 70 53 72 63 29 20 29 3b 0d 0a 20 20 70 p->pSrc) );.. p
21235 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 p = sqlite3Pager
21236 42 61 63 6b 75 70 50 74 72 28 73 71 6c 69 74 65 BackupPtr(sqlite
21237 33 42 74 72 65 65 50 61 67 65 72 28 70 2d 3e 70 3BtreePager(p->p
21238 53 72 63 29 29 3b 0d 0a 20 20 70 2d 3e 70 4e 65 Src));.. p->pNe
21239 78 74 20 3d 20 2a 70 70 3b 0d 0a 20 20 2a 70 70 xt = *pp;.. *pp
2123a 20 3d 20 70 3b 0d 0a 20 20 70 2d 3e 69 73 41 74 = p;.. p->isAt
2123b 74 61 63 68 65 64 20 3d 20 31 3b 0d 0a 7d 0d 0a tached = 1;..}..
2123c 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 70 79 20 6e 50 ../*..** Copy nP
2123d 61 67 65 20 70 61 67 65 73 20 66 72 6f 6d 20 74 age pages from t
2123e 68 65 20 73 6f 75 72 63 65 20 62 2d 74 72 65 65 he source b-tree
2123f 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 to the destinat
21240 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ion...*/..SQLITE
21241 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33 _API int sqlite3
21242 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 73 71 6c _backup_step(sql
21243 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 2c 20 ite3_backup *p,
21244 69 6e 74 20 6e 50 61 67 65 29 7b 0d 0a 20 20 69 int nPage){.. i
21245 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20 64 65 nt rc;.. int de
21246 73 74 4d 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a stMode; /*
21247 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6a 6f 75 Destination jou
21248 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0d 0a 20 20 rnal mode */..
21249 69 6e 74 20 70 67 73 7a 53 72 63 20 3d 20 30 3b int pgszSrc = 0;
2124a 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 70 61 /* Source pa
2124b 67 65 20 73 69 7a 65 20 2a 2f 0d 0a 20 20 69 6e ge size */.. in
2124c 74 20 70 67 73 7a 44 65 73 74 20 3d 20 30 3b 20 t pgszDest = 0;
2124d 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e /* Destination
2124e 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0d 0a 0d page size */...
2124f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
21250 5f 65 6e 74 65 72 28 70 2d 3e 70 53 72 63 44 62 _enter(p->pSrcDb
21251 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 73 71 6c ->mutex);.. sql
21252 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 ite3BtreeEnter(p
21253 2d 3e 70 53 72 63 29 3b 0d 0a 20 20 69 66 28 20 ->pSrc);.. if(
21254 70 2d 3e 70 44 65 73 74 44 62 20 29 7b 0d 0a 20 p->pDestDb ){..
21255 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 sqlite3_mutex
21256 5f 65 6e 74 65 72 28 70 2d 3e 70 44 65 73 74 44 _enter(p->pDestD
21257 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d b->mutex);.. }.
21258 0a 0d 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b ... rc = p->rc;
21259 0d 0a 20 20 69 66 28 20 21 69 73 46 61 74 61 6c .. if( !isFatal
2125a 45 72 72 6f 72 28 72 63 29 20 29 7b 0d 0a 20 20 Error(rc) ){..
2125b 20 20 50 61 67 65 72 20 2a 20 63 6f 6e 73 74 20 Pager * const
2125c 70 53 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69 pSrcPager = sqli
2125d 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 2d te3BtreePager(p-
2125e 3e 70 53 72 63 29 3b 20 20 20 20 20 2f 2a 20 53 >pSrc); /* S
2125f 6f 75 72 63 65 20 70 61 67 65 72 20 2a 2f 0d 0a ource pager */..
21260 20 20 20 20 50 61 67 65 72 20 2a 20 63 6f 6e 73 Pager * cons
21261 74 20 70 44 65 73 74 50 61 67 65 72 20 3d 20 73 t pDestPager = s
21262 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 qlite3BtreePager
21263 28 70 2d 3e 70 44 65 73 74 29 3b 20 20 20 2f 2a (p->pDest); /*
21264 20 44 65 73 74 20 70 61 67 65 72 20 2a 2f 0d 0a Dest pager */..
21265 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 int ii;
21266 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21267 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 /* Iterat
21268 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a or variable */..
21269 20 20 20 20 69 6e 74 20 6e 53 72 63 50 61 67 65 int nSrcPage
2126a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 = -1;
2126b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
2126c 66 20 73 6f 75 72 63 65 20 64 62 20 69 6e 20 70 f source db in p
2126d 61 67 65 73 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 ages */.. int
2126e 20 62 43 6c 6f 73 65 54 72 61 6e 73 20 3d 20 30 bCloseTrans = 0
2126f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
21270 2f 2a 20 54 72 75 65 20 69 66 20 73 72 63 20 64 /* True if src d
21271 62 20 72 65 71 75 69 72 65 73 20 75 6e 6c 6f 63 b requires unloc
21272 6b 69 6e 67 20 2a 2f 0d 0a 0d 0a 20 20 20 20 2f king */.... /
21273 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 20 * If the source
21274 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 pager is current
21275 6c 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 ly in a write-tr
21276 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 ansaction, retur
21277 6e 0d 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 n.. ** SQLITE
21278 5f 42 55 53 59 20 69 6d 6d 65 64 69 61 74 65 6c _BUSY immediatel
21279 79 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 y... */..
2127a 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 26 if( p->pDestDb &
2127b 26 20 70 2d 3e 70 53 72 63 2d 3e 70 42 74 2d 3e & p->pSrc->pBt->
2127c 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 inTransaction==T
2127d 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0d 0a 20 RANS_WRITE ){..
2127e 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
2127f 5f 42 55 53 59 3b 0d 0a 20 20 20 20 7d 65 6c 73 _BUSY;.. }els
21280 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 e{.. rc = S
21281 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d QLITE_OK;.. }
21282 0d 0a 0d 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 .... /* Lock
21283 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 the destination
21284 64 61 74 61 62 61 73 65 2c 20 69 66 20 69 74 20 database, if it
21285 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61 6c is not locked al
21286 72 65 61 64 79 2e 20 2a 2f 0d 0a 20 20 20 20 69 ready. */.. i
21287 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 f( SQLITE_OK==rc
21288 20 26 26 20 70 2d 3e 62 44 65 73 74 4c 6f 63 6b && p->bDestLock
21289 65 64 3d 3d 30 0d 0a 20 20 20 20 20 26 26 20 53 ed==0.. && S
2128a 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 QLITE_OK==(rc =
2128b 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 sqlite3BtreeBegi
2128c 6e 54 72 61 6e 73 28 70 2d 3e 70 44 65 73 74 2c nTrans(p->pDest,
2128d 20 32 29 29 20 0d 0a 20 20 20 20 29 7b 0d 0a 20 2)) .. ){..
2128e 20 20 20 20 20 70 2d 3e 62 44 65 73 74 4c 6f 63 p->bDestLoc
2128f 6b 65 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 ked = 1;..
21290 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d sqlite3BtreeGetM
21291 65 74 61 28 70 2d 3e 70 44 65 73 74 2c 20 42 54 eta(p->pDest, BT
21292 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 REE_SCHEMA_VERSI
21293 4f 4e 2c 20 26 70 2d 3e 69 44 65 73 74 53 63 68 ON, &p->iDestSch
21294 65 6d 61 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a ema);.. }....
21295 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 /* If there
21296 69 73 20 6e 6f 20 6f 70 65 6e 20 72 65 61 64 2d is no open read-
21297 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 transaction on t
21298 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 he source databa
21299 73 65 2c 20 6f 70 65 6e 0d 0a 20 20 20 20 2a 2a se, open.. **
2129a 20 6f 6e 65 20 6e 6f 77 2e 20 49 66 20 61 20 74 one now. If a t
2129b 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 ransaction is op
2129c 65 6e 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20 ened here, then
2129d 69 74 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 it will be close
2129e 64 0d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 d.. ** before
2129f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 this function e
212a0 78 69 74 73 2e 0d 0a 20 20 20 20 2a 2f 0d 0a 20 xits... */..
212a1 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
212a2 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 E_OK && 0==sqlit
212a3 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 e3BtreeIsInReadT
212a4 72 61 6e 73 28 70 2d 3e 70 53 72 63 29 20 29 7b rans(p->pSrc) ){
212a5 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c .. rc = sql
212a6 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 ite3BtreeBeginTr
212a7 61 6e 73 28 70 2d 3e 70 53 72 63 2c 20 30 29 3b ans(p->pSrc, 0);
212a8 0d 0a 20 20 20 20 20 20 62 43 6c 6f 73 65 54 72 .. bCloseTr
212a9 61 6e 73 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d ans = 1;.. }.
212aa 0a 0d 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 ... /* Do not
212ab 20 61 6c 6c 6f 77 20 62 61 63 6b 75 70 20 69 66 allow backup if
212ac 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e the destination
212ad 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 database is in
212ae 57 41 4c 20 6d 6f 64 65 0d 0a 20 20 20 20 2a 2a WAL mode.. **
212af 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 and the page si
212b0 7a 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e zes are differen
212b1 74 20 62 65 74 77 65 65 6e 20 73 6f 75 72 63 65 t between source
212b2 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e and destination
212b3 20 2a 2f 0d 0a 20 20 20 20 70 67 73 7a 53 72 63 */.. pgszSrc
212b4 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 = sqlite3BtreeG
212b5 65 74 50 61 67 65 53 69 7a 65 28 70 2d 3e 70 53 etPageSize(p->pS
212b6 72 63 29 3b 0d 0a 20 20 20 20 70 67 73 7a 44 65 rc);.. pgszDe
212b7 73 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 st = sqlite3Btre
212b8 65 47 65 74 50 61 67 65 53 69 7a 65 28 70 2d 3e eGetPageSize(p->
212b9 70 44 65 73 74 29 3b 0d 0a 20 20 20 20 64 65 73 pDest);.. des
212ba 74 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 tMode = sqlite3P
212bb 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f agerGetJournalMo
212bc 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 de(sqlite3BtreeP
212bd 61 67 65 72 28 70 2d 3e 70 44 65 73 74 29 29 3b ager(p->pDest));
212be 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 .. if( SQLITE
212bf 5f 4f 4b 3d 3d 72 63 20 26 26 20 64 65 73 74 4d _OK==rc && destM
212c0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e ode==PAGER_JOURN
212c1 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 26 20 70 67 ALMODE_WAL && pg
212c2 73 7a 53 72 63 21 3d 70 67 73 7a 44 65 73 74 20 szSrc!=pgszDest
212c3 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 ){.. rc = S
212c4 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0d QLITE_READONLY;.
212c5 0a 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 20 20 20 . }.. ..
212c6 2f 2a 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 /* Now that ther
212c7 65 20 69 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b e is a read-lock
212c8 20 6f 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 on the source d
212c9 61 74 61 62 61 73 65 2c 20 71 75 65 72 79 20 74 atabase, query t
212ca 68 65 0d 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 he.. ** sourc
212cb 65 20 70 61 67 65 72 20 66 6f 72 20 74 68 65 20 e pager for the
212cc 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 number of pages
212cd 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e in the database.
212ce 0d 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 6e 53 .. */.. nS
212cf 72 63 50 61 67 65 20 3d 20 28 69 6e 74 29 73 71 rcPage = (int)sq
212d0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 lite3BtreeLastPa
212d1 67 65 28 70 2d 3e 70 53 72 63 29 3b 0d 0a 20 20 ge(p->pSrc);..
212d2 20 20 61 73 73 65 72 74 28 20 6e 53 72 63 50 61 assert( nSrcPa
212d3 67 65 3e 3d 30 20 29 3b 0d 0a 20 20 20 20 66 6f ge>=0 );.. fo
212d4 72 28 69 69 3d 30 3b 20 28 6e 50 61 67 65 3c 30 r(ii=0; (nPage<0
212d5 20 7c 7c 20 69 69 3c 6e 50 61 67 65 29 20 26 26 || ii<nPage) &&
212d6 20 70 2d 3e 69 4e 65 78 74 3c 3d 28 50 67 6e 6f p->iNext<=(Pgno
212d7 29 6e 53 72 63 50 61 67 65 20 26 26 20 21 72 63 )nSrcPage && !rc
212d8 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 ; ii++){..
212d9 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 72 63 50 const Pgno iSrcP
212da 67 20 3d 20 70 2d 3e 69 4e 65 78 74 3b 20 20 20 g = p->iNext;
212db 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
212dc 20 53 6f 75 72 63 65 20 70 61 67 65 20 6e 75 6d Source page num
212dd 62 65 72 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 ber */.. if
212de 28 20 69 53 72 63 50 67 21 3d 50 45 4e 44 49 4e ( iSrcPg!=PENDIN
212df 47 5f 42 59 54 45 5f 50 41 47 45 28 70 2d 3e 70 G_BYTE_PAGE(p->p
212e0 53 72 63 2d 3e 70 42 74 29 20 29 7b 0d 0a 20 20 Src->pBt) ){..
212e1 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 53 DbPage *pS
212e2 72 63 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 rcPg;
212e3 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
212e4 20 20 2f 2a 20 53 6f 75 72 63 65 20 70 61 67 65 /* Source page
212e5 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 20 20 object */..
212e6 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
212e7 50 61 67 65 72 47 65 74 28 70 53 72 63 50 61 67 PagerGet(pSrcPag
212e8 65 72 2c 20 69 53 72 63 50 67 2c 20 26 70 53 72 er, iSrcPg, &pSr
212e9 63 50 67 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 cPg);.. i
212ea 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
212eb 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 ){.. r
212ec 63 20 3d 20 62 61 63 6b 75 70 4f 6e 65 50 61 67 c = backupOnePag
212ed 65 28 70 2c 20 69 53 72 63 50 67 2c 20 73 71 6c e(p, iSrcPg, sql
212ee 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 ite3PagerGetData
212ef 28 70 53 72 63 50 67 29 29 3b 0d 0a 20 20 20 20 (pSrcPg));..
212f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 sqlite3Pag
212f1 65 72 55 6e 72 65 66 28 70 53 72 63 50 67 29 3b erUnref(pSrcPg);
212f2 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 .. }..
212f3 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 2d 3e 69 }.. p->i
212f4 4e 65 78 74 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a Next++;.. }..
212f5 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
212f6 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
212f7 70 2d 3e 6e 50 61 67 65 63 6f 75 6e 74 20 3d 20 p->nPagecount =
212f8 6e 53 72 63 50 61 67 65 3b 0d 0a 20 20 20 20 20 nSrcPage;..
212f9 20 70 2d 3e 6e 52 65 6d 61 69 6e 69 6e 67 20 3d p->nRemaining =
212fa 20 6e 53 72 63 50 61 67 65 2b 31 2d 70 2d 3e 69 nSrcPage+1-p->i
212fb 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 69 66 28 Next;.. if(
212fc 20 70 2d 3e 69 4e 65 78 74 3e 28 50 67 6e 6f 29 p->iNext>(Pgno)
212fd 6e 53 72 63 50 61 67 65 20 29 7b 0d 0a 20 20 20 nSrcPage ){..
212fe 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
212ff 5f 44 4f 4e 45 3b 0d 0a 20 20 20 20 20 20 7d 65 _DONE;.. }e
21300 6c 73 65 20 69 66 28 20 21 70 2d 3e 69 73 41 74 lse if( !p->isAt
21301 74 61 63 68 65 64 20 29 7b 0d 0a 20 20 20 20 20 tached ){..
21302 20 20 20 61 74 74 61 63 68 42 61 63 6b 75 70 4f attachBackupO
21303 62 6a 65 63 74 28 70 29 3b 0d 0a 20 20 20 20 20 bject(p);..
21304 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 }.. }.. ..
21305 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 /* Update the
21306 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 schema version
21307 66 69 65 6c 64 20 69 6e 20 74 68 65 20 64 65 73 field in the des
21308 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 tination databas
21309 65 2e 20 54 68 69 73 0d 0a 20 20 20 20 2a 2a 20 e. This.. **
2130a 69 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 is to make sure
2130b 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 2d that the schema-
2130c 76 65 72 73 69 6f 6e 20 72 65 61 6c 6c 79 20 64 version really d
2130d 6f 65 73 20 63 68 61 6e 67 65 20 69 6e 0d 0a 20 oes change in..
2130e 20 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 77 ** the case w
2130f 68 65 72 65 20 74 68 65 20 73 6f 75 72 63 65 20 here the source
21310 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 and destination
21311 64 61 74 61 62 61 73 65 73 20 68 61 76 65 20 74 databases have t
21312 68 65 0d 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 he.. ** same
21313 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 0d schema version..
21314 0a 20 20 20 20 2a 2f 0d 0a 20 20 20 20 69 66 28 . */.. if(
21315 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 rc==SQLITE_DONE
21316 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 ){.. rc =
21317 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 sqlite3BtreeUpda
21318 74 65 4d 65 74 61 28 70 2d 3e 70 44 65 73 74 2c teMeta(p->pDest,
21319 31 2c 70 2d 3e 69 44 65 73 74 53 63 68 65 6d 61 1,p->iDestSchema
2131a 2b 31 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 +1);.. if(
2131b 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
2131c 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d .. if( p-
2131d 3e 70 44 65 73 74 44 62 20 29 7b 0d 0a 20 20 20 >pDestDb ){..
2131e 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 sqlite3Re
2131f 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d setInternalSchem
21320 61 28 70 2d 3e 70 44 65 73 74 44 62 2c 20 2d 31 a(p->pDestDb, -1
21321 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
21322 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 4d if( destM
21323 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e ode==PAGER_JOURN
21324 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0d 0a 20 ALMODE_WAL ){..
21325 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 rc = sq
21326 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72 lite3BtreeSetVer
21327 73 69 6f 6e 28 70 2d 3e 70 44 65 73 74 2c 20 32 sion(p->pDest, 2
21328 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
21329 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 }.. if
2132a 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
2132b 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 ){.. int
2132c 6e 44 65 73 74 54 72 75 6e 63 61 74 65 3b 0d 0a nDestTruncate;..
2132d 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e /* Set n
2132e 44 65 73 74 54 72 75 6e 63 61 74 65 20 74 6f 20 DestTruncate to
2132f 74 68 65 20 66 69 6e 61 6c 20 6e 75 6d 62 65 72 the final number
21330 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 of pages in the
21331 20 64 65 73 74 69 6e 61 74 69 6f 6e 0d 0a 20 20 destination..
21332 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 ** databas
21333 65 2e 20 54 68 65 20 63 6f 6d 70 6c 69 63 61 74 e. The complicat
21334 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 ion here is that
21335 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e the destination
21336 20 70 61 67 65 0d 0a 20 20 20 20 20 20 20 20 2a page.. *
21337 2a 20 73 69 7a 65 20 6d 61 79 20 62 65 20 64 69 * size may be di
21338 66 66 65 72 65 6e 74 20 74 6f 20 74 68 65 20 73 fferent to the s
21339 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a 65 2e ource page size.
2133a 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 .. **..
2133b 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 ** If the
2133c 20 73 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a source page siz
2133d 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 e is smaller tha
2133e 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f n the destinatio
2133f 6e 20 70 61 67 65 20 73 69 7a 65 2c 20 0d 0a 20 n page size, ..
21340 20 20 20 20 20 20 20 2a 2a 20 72 6f 75 6e 64 20 ** round
21341 75 70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 up. In this case
21342 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c the call to sql
21343 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 29 ite3OsTruncate()
21344 20 62 65 6c 6f 77 20 77 69 6c 6c 0d 0a 20 20 20 below will..
21345 20 20 20 20 20 2a 2a 20 66 69 78 20 74 68 65 20 ** fix the
21346 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 size of the file
21347 2e 20 48 6f 77 65 76 65 72 20 69 74 20 69 73 20 . However it is
21348 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c important to cal
21349 6c 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71 l.. ** sq
2134a 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 lite3PagerTrunca
2134b 74 65 49 6d 61 67 65 28 29 20 68 65 72 65 20 73 teImage() here s
2134c 6f 20 74 68 61 74 20 61 6e 79 20 70 61 67 65 73 o that any pages
2134d 20 69 6e 20 74 68 65 20 0d 0a 20 20 20 20 20 20 in the ..
2134e 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e ** destination
2134f 20 66 69 6c 65 20 74 68 61 74 20 6c 69 65 20 62 file that lie b
21350 65 79 6f 6e 64 20 74 68 65 20 6e 44 65 73 74 54 eyond the nDestT
21351 72 75 6e 63 61 74 65 20 70 61 67 65 20 6d 61 72 runcate page mar
21352 6b 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 2a k are.. *
21353 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 * journalled by
21354 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 PagerCommitPhase
21355 4f 6e 65 28 29 20 62 65 66 6f 72 65 20 74 68 65 One() before the
21356 79 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 0d y are destroyed.
21357 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74 . ** by t
21358 68 65 20 66 69 6c 65 20 74 72 75 6e 63 61 74 69 he file truncati
21359 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d on... */.
2135a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
2135b 20 70 67 73 7a 53 72 63 3d 3d 73 71 6c 69 74 65 pgszSrc==sqlite
2135c 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 3BtreeGetPageSiz
2135d 65 28 70 2d 3e 70 53 72 63 29 20 29 3b 0d 0a 20 e(p->pSrc) );..
2135e 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
2135f 67 73 7a 44 65 73 74 3d 3d 73 71 6c 69 74 65 33 gszDest==sqlite3
21360 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 BtreeGetPageSize
21361 28 70 2d 3e 70 44 65 73 74 29 20 29 3b 0d 0a 20 (p->pDest) );..
21362 20 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 53 if( pgszS
21363 72 63 3c 70 67 73 7a 44 65 73 74 20 29 7b 0d 0a rc<pgszDest ){..
21364 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 61 int ra
21365 74 69 6f 20 3d 20 70 67 73 7a 44 65 73 74 2f 70 tio = pgszDest/p
21366 67 73 7a 53 72 63 3b 0d 0a 20 20 20 20 20 20 20 gszSrc;..
21367 20 20 20 6e 44 65 73 74 54 72 75 6e 63 61 74 65 nDestTruncate
21368 20 3d 20 28 6e 53 72 63 50 61 67 65 2b 72 61 74 = (nSrcPage+rat
21369 69 6f 2d 31 29 2f 72 61 74 69 6f 3b 0d 0a 20 20 io-1)/ratio;..
2136a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 73 if( nDes
2136b 74 54 72 75 6e 63 61 74 65 3d 3d 28 69 6e 74 29 tTruncate==(int)
2136c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 PENDING_BYTE_PAG
2136d 45 28 70 2d 3e 70 44 65 73 74 2d 3e 70 42 74 29 E(p->pDest->pBt)
2136e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ){..
2136f 20 6e 44 65 73 74 54 72 75 6e 63 61 74 65 2d 2d nDestTruncate--
21370 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a ;.. }..
21371 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a }else{..
21372 20 20 20 20 20 20 20 20 20 20 6e 44 65 73 74 54 nDestT
21373 72 75 6e 63 61 74 65 20 3d 20 6e 53 72 63 50 61 runcate = nSrcPa
21374 67 65 20 2a 20 28 70 67 73 7a 53 72 63 2f 70 67 ge * (pgszSrc/pg
21375 73 7a 44 65 73 74 29 3b 0d 0a 20 20 20 20 20 20 szDest);..
21376 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 73 71 6c }.. sql
21377 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 ite3PagerTruncat
21378 65 49 6d 61 67 65 28 70 44 65 73 74 50 61 67 65 eImage(pDestPage
21379 72 2c 20 6e 44 65 73 74 54 72 75 6e 63 61 74 65 r, nDestTruncate
2137a 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 );.... if
2137b 28 20 70 67 73 7a 53 72 63 3c 70 67 73 7a 44 65 ( pgszSrc<pgszDe
2137c 73 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 st ){..
2137d 20 2f 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 /* If the sourc
2137e 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 73 e page-size is s
2137f 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 maller than the
21380 64 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 67 65 destination page
21381 2d 73 69 7a 65 2c 0d 0a 20 20 20 20 20 20 20 20 -size,..
21382 20 20 2a 2a 20 74 77 6f 20 65 78 74 72 61 20 74 ** two extra t
21383 68 69 6e 67 73 20 6d 61 79 20 6e 65 65 64 20 74 hings may need t
21384 6f 20 68 61 70 70 65 6e 3a 0d 0a 20 20 20 20 20 o happen:..
21385 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 **..
21386 20 20 20 2a 2a 20 20 20 2a 20 54 68 65 20 64 65 ** * The de
21387 73 74 69 6e 61 74 69 6f 6e 20 6d 61 79 20 6e 65 stination may ne
21388 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 ed to be truncat
21389 65 64 2c 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 ed, and..
2138a 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 20 20 **..
2138b 20 2a 2a 20 20 20 2a 20 44 61 74 61 20 73 74 6f ** * Data sto
2138c 72 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 73 red on the pages
2138d 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c immediately fol
2138e 6c 6f 77 69 6e 67 20 74 68 65 20 0d 0a 20 20 20 lowing the ..
2138f 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 70 65 ** pe
21390 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 20 nding-byte page
21391 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 in the source da
21392 74 61 62 61 73 65 20 6d 61 79 20 6e 65 65 64 20 tabase may need
21393 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 20 to be..
21394 20 2a 2a 20 20 20 20 20 63 6f 70 69 65 64 20 69 ** copied i
21395 6e 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 nto the destinat
21396 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 ion database...
21397 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 */..
21398 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 36 34 const i64
21399 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 70 67 iSize = (i64)pg
2139a 73 7a 53 72 63 20 2a 20 28 69 36 34 29 6e 53 72 szSrc * (i64)nSr
2139b 63 50 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 cPage;..
2139c 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
2139d 20 63 6f 6e 73 74 20 70 46 69 6c 65 20 3d 20 73 const pFile = s
2139e 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 qlite3PagerFile(
2139f 70 44 65 73 74 50 61 67 65 72 29 3b 0d 0a 20 20 pDestPager);..
213a0 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 i64 iOff
213a1 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 ;.. i64
213a2 20 69 45 6e 64 3b 0d 0a 0d 0a 20 20 20 20 20 20 iEnd;....
213a3 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c assert( pFil
213a4 65 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 e );..
213a5 61 73 73 65 72 74 28 20 28 69 36 34 29 6e 44 65 assert( (i64)nDe
213a6 73 74 54 72 75 6e 63 61 74 65 2a 28 69 36 34 29 stTruncate*(i64)
213a7 70 67 73 7a 44 65 73 74 20 3e 3d 20 69 53 69 7a pgszDest >= iSiz
213a8 65 20 7c 7c 20 28 0d 0a 20 20 20 20 20 20 20 20 e || (..
213a9 20 20 20 20 20 20 20 20 6e 44 65 73 74 54 72 75 nDestTru
213aa 6e 63 61 74 65 3d 3d 28 69 6e 74 29 28 50 45 4e ncate==(int)(PEN
213ab 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 DING_BYTE_PAGE(p
213ac 2d 3e 70 44 65 73 74 2d 3e 70 42 74 29 2d 31 29 ->pDest->pBt)-1)
213ad 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 .. &
213ae 26 20 69 53 69 7a 65 3e 3d 50 45 4e 44 49 4e 47 & iSize>=PENDING
213af 5f 42 59 54 45 20 26 26 20 69 53 69 7a 65 3c 3d _BYTE && iSize<=
213b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 70 67 73 PENDING_BYTE+pgs
213b1 7a 44 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 zDest..
213b2 20 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 ));....
213b3 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 65 /* This call e
213b4 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 nsures that all
213b5 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f data required to
213b6 20 72 65 63 72 65 61 74 65 20 74 68 65 20 6f 72 recreate the or
213b7 69 67 69 6e 61 6c 0d 0a 20 20 20 20 20 20 20 20 iginal..
213b8 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 ** database ha
213b9 73 20 62 65 65 6e 20 73 74 6f 72 65 64 20 69 6e s been stored in
213ba 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 the journal for
213bb 20 70 44 65 73 74 50 61 67 65 72 20 61 6e 64 20 pDestPager and
213bc 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2a the.. *
213bd 2a 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 * journal synced
213be 20 74 6f 20 64 69 73 6b 2e 20 53 6f 20 61 74 20 to disk. So at
213bf 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6d 61 this point we ma
213c0 79 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 79 0d y safely modify.
213c1 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 . ** th
213c2 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
213c3 69 6e 20 61 6e 79 20 77 61 79 2c 20 6b 6e 6f 77 in any way, know
213c4 69 6e 67 20 74 68 61 74 20 69 66 20 61 20 70 6f ing that if a po
213c5 77 65 72 20 66 61 69 6c 75 72 65 0d 0a 20 20 20 wer failure..
213c6 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 ** occurs
213c7 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 , the original d
213c8 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 atabase will be
213c9 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 reconstructed fr
213ca 6f 6d 20 74 68 65 20 0d 0a 20 20 20 20 20 20 20 om the ..
213cb 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 ** journal fi
213cc 6c 65 2e 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 le. */..
213cd 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 rc = sqlite3P
213ce 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f agerCommitPhaseO
213cf 6e 65 28 70 44 65 73 74 50 61 67 65 72 2c 20 30 ne(pDestPager, 0
213d0 2c 20 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 , 1);....
213d1 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
213d2 65 78 74 72 61 20 70 61 67 65 73 20 61 6e 64 20 extra pages and
213d3 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 truncate the dat
213d4 61 62 61 73 65 20 66 69 6c 65 20 61 73 20 72 65 abase file as re
213d5 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20 20 20 20 quired */..
213d6 20 20 20 20 20 69 45 6e 64 20 3d 20 4d 49 4e 28 iEnd = MIN(
213d7 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 2b 20 70 PENDING_BYTE + p
213d8 67 73 7a 44 65 73 74 2c 20 69 53 69 7a 65 29 3b gszDest, iSize);
213d9 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 .. for(
213da 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f .. iO
213db 66 66 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b ff=PENDING_BYTE+
213dc 70 67 73 7a 53 72 63 3b 20 0d 0a 20 20 20 20 20 pgszSrc; ..
213dd 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 rc==SQLIT
213de 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 45 6e E_OK && iOff<iEn
213df 64 3b 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 d; ..
213e0 20 69 4f 66 66 2b 3d 70 67 73 7a 53 72 63 0d 0a iOff+=pgszSrc..
213e1 20 20 20 20 20 20 20 20 20 20 29 7b 0d 0a 20 20 ){..
213e2 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 PgHdr
213e3 2a 70 53 72 63 50 67 20 3d 20 30 3b 0d 0a 20 20 *pSrcPg = 0;..
213e4 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 const
213e5 50 67 6e 6f 20 69 53 72 63 50 67 20 3d 20 28 50 Pgno iSrcPg = (P
213e6 67 6e 6f 29 28 28 69 4f 66 66 2f 70 67 73 7a 53 gno)((iOff/pgszS
213e7 72 63 29 2b 31 29 3b 0d 0a 20 20 20 20 20 20 20 rc)+1);..
213e8 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
213e9 33 50 61 67 65 72 47 65 74 28 70 53 72 63 50 61 3PagerGet(pSrcPa
213ea 67 65 72 2c 20 69 53 72 63 50 67 2c 20 26 70 53 ger, iSrcPg, &pS
213eb 72 63 50 67 29 3b 0d 0a 20 20 20 20 20 20 20 20 rcPg);..
213ec 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
213ed 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 TE_OK ){..
213ee 20 20 20 20 20 20 20 20 75 38 20 2a 7a 44 61 74 u8 *zDat
213ef 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 a = sqlite3Pager
213f0 47 65 74 44 61 74 61 28 70 53 72 63 50 67 29 3b GetData(pSrcPg);
213f1 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
213f2 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 rc = sqlite3OsWr
213f3 69 74 65 28 70 46 69 6c 65 2c 20 7a 44 61 74 61 ite(pFile, zData
213f4 2c 20 70 67 73 7a 53 72 63 2c 20 69 4f 66 66 29 , pgszSrc, iOff)
213f5 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d ;.. }
213f6 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 .. sq
213f7 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 lite3PagerUnref(
213f8 70 53 72 63 50 67 29 3b 0d 0a 20 20 20 20 20 20 pSrcPg);..
213f9 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 }..
213fa 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
213fb 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 OK ){..
213fc 20 20 20 72 63 20 3d 20 62 61 63 6b 75 70 54 72 rc = backupTr
213fd 75 6e 63 61 74 65 46 69 6c 65 28 70 46 69 6c 65 uncateFile(pFile
213fe 2c 20 69 53 69 7a 65 29 3b 0d 0a 20 20 20 20 20 , iSize);..
213ff 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 }....
21400 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 /* Sync the
21401 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f database file to
21402 20 64 69 73 6b 2e 20 2a 2f 0d 0a 20 20 20 20 20 disk. */..
21403 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
21404 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 ITE_OK ){..
21405 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
21406 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 44 65 te3PagerSync(pDe
21407 73 74 50 61 67 65 72 29 3b 0d 0a 20 20 20 20 20 stPager);..
21408 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 }..
21409 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 }else{..
2140a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 rc = sqlite3Pa
2140b 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e gerCommitPhaseOn
2140c 65 28 70 44 65 73 74 50 61 67 65 72 2c 20 30 2c e(pDestPager, 0,
2140d 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0);.. }.
2140e 0a 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 2f . .. /
2140f 2a 20 46 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74 * Finish committ
21410 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 ing the transact
21411 69 6f 6e 20 74 6f 20 74 68 65 20 64 65 73 74 69 ion to the desti
21412 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 2e nation database.
21413 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 28 */.. if(
21414 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0d 0a SQLITE_OK==rc..
21415 20 20 20 20 20 20 20 20 20 26 26 20 53 51 4c 49 && SQLI
21416 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c TE_OK==(rc = sql
21417 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 ite3BtreeCommitP
21418 68 61 73 65 54 77 6f 28 70 2d 3e 70 44 65 73 74 haseTwo(p->pDest
21419 2c 20 30 29 29 0d 0a 20 20 20 20 20 20 20 20 29 , 0)).. )
2141a 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 {.. rc
2141b 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0d 0a = SQLITE_DONE;..
2141c 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 }..
2141d 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 0d 0a 20 }.. }.. ..
2141e 20 20 20 2f 2a 20 49 66 20 62 43 6c 6f 73 65 54 /* If bCloseT
2141f 72 61 6e 73 20 69 73 20 74 72 75 65 2c 20 74 68 rans is true, th
21420 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e en this function
21421 20 6f 70 65 6e 65 64 20 61 20 72 65 61 64 20 74 opened a read t
21422 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 ransaction..
21423 2a 2a 20 6f 6e 20 74 68 65 20 73 6f 75 72 63 65 ** on the source
21424 20 64 61 74 61 62 61 73 65 2e 20 43 6c 6f 73 65 database. Close
21425 20 74 68 65 20 72 65 61 64 20 74 72 61 6e 73 61 the read transa
21426 63 74 69 6f 6e 20 68 65 72 65 2e 20 54 68 65 72 ction here. Ther
21427 65 20 69 73 0d 0a 20 20 20 20 2a 2a 20 6e 6f 20 e is.. ** no
21428 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 68 need to check th
21429 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 e return values
2142a 6f 66 20 74 68 65 20 62 74 72 65 65 20 6d 65 74 of the btree met
2142b 68 6f 64 73 20 68 65 72 65 2c 20 61 73 0d 0a 20 hods here, as..
2142c 20 20 20 2a 2a 20 22 63 6f 6d 6d 69 74 74 69 6e ** "committin
2142d 67 22 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 g" a read-only t
2142e 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f ransaction canno
2142f 74 20 66 61 69 6c 2e 0d 0a 20 20 20 20 2a 2f 0d t fail... */.
21430 0a 20 20 20 20 69 66 28 20 62 43 6c 6f 73 65 54 . if( bCloseT
21431 72 61 6e 73 20 29 7b 0d 0a 20 20 20 20 20 20 54 rans ){.. T
21432 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 72 63 32 ESTONLY( int rc2
21433 20 29 3b 0d 0a 20 20 20 20 20 20 54 45 53 54 4f );.. TESTO
21434 4e 4c 59 28 20 72 63 32 20 20 3d 20 29 20 73 71 NLY( rc2 = ) sq
21435 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
21436 50 68 61 73 65 4f 6e 65 28 70 2d 3e 70 53 72 63 PhaseOne(p->pSrc
21437 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 54 45 53 , 0);.. TES
21438 54 4f 4e 4c 59 28 20 72 63 32 20 7c 3d 20 29 20 TONLY( rc2 |= )
21439 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
2143a 69 74 50 68 61 73 65 54 77 6f 28 70 2d 3e 70 53 itPhaseTwo(p->pS
2143b 72 63 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 61 rc, 0);.. a
2143c 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 ssert( rc2==SQLI
2143d 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 7d 0d TE_OK );.. }.
2143e 0a 20 20 0d 0a 20 20 20 20 69 66 28 20 72 63 3d . .. if( rc=
2143f 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f =SQLITE_IOERR_NO
21440 4d 45 4d 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 MEM ){.. rc
21441 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
21442 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 2d 3e .. }.. p->
21443 72 63 20 3d 20 72 63 3b 0d 0a 20 20 7d 0d 0a 20 rc = rc;.. }..
21444 20 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 if( p->pDestDb
21445 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){.. sqlite3_
21446 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 mutex_leave(p->p
21447 44 65 73 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0d DestDb->mutex);.
21448 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 42 . }.. sqlite3B
21449 74 72 65 65 4c 65 61 76 65 28 70 2d 3e 70 53 72 treeLeave(p->pSr
2144a 63 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d c);.. sqlite3_m
2144b 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 53 utex_leave(p->pS
2144c 72 63 44 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 rcDb->mutex);..
2144d 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a return rc;..}..
2144e 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 65 ../*..** Release
2144f 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61 all resources a
21450 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 ssociated with a
21451 6e 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 n sqlite3_backup
21452 2a 20 68 61 6e 64 6c 65 2e 0d 0a 2a 2f 0d 0a 53 * handle...*/..S
21453 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 QLITE_API int sq
21454 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e lite3_backup_fin
21455 69 73 68 28 73 71 6c 69 74 65 33 5f 62 61 63 6b ish(sqlite3_back
21456 75 70 20 2a 70 29 7b 0d 0a 20 20 73 71 6c 69 74 up *p){.. sqlit
21457 65 33 5f 62 61 63 6b 75 70 20 2a 2a 70 70 3b 20 e3_backup **pp;
21458 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21459 2f 2a 20 50 74 72 20 74 6f 20 68 65 61 64 20 6f /* Ptr to head o
2145a 66 20 70 61 67 65 72 73 20 62 61 63 6b 75 70 20 f pagers backup
2145b 6c 69 73 74 20 2a 2f 0d 0a 20 20 4d 55 54 45 58 list */.. MUTEX
2145c 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f _LOGIC( sqlite3_
2145d 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 29 20 mutex *mutex; )
2145e 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 /* Mutex to prot
2145f 65 63 74 20 73 6f 75 72 63 65 20 64 61 74 61 62 ect source datab
21460 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 72 63 ase */.. int rc
21461 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
21462 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
21463 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 * Value to retur
21464 6e 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 45 6e 74 n */.... /* Ent
21465 65 72 20 74 68 65 20 6d 75 74 65 78 65 73 20 2a er the mutexes *
21466 2f 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 /.. if( p==0 )
21467 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
21468 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 ;.. sqlite3_mut
21469 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 53 72 63 ex_enter(p->pSrc
2146a 44 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 73 Db->mutex);.. s
2146b 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
2146c 28 70 2d 3e 70 53 72 63 29 3b 0d 0a 20 20 4d 55 (p->pSrc);.. MU
2146d 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 TEX_LOGIC( mutex
2146e 20 3d 20 70 2d 3e 70 53 72 63 44 62 2d 3e 6d 75 = p->pSrcDb->mu
2146f 74 65 78 3b 20 29 0d 0a 20 20 69 66 28 20 70 2d tex; ).. if( p-
21470 3e 70 44 65 73 74 44 62 20 29 7b 0d 0a 20 20 20 >pDestDb ){..
21471 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
21472 6e 74 65 72 28 70 2d 3e 70 44 65 73 74 44 62 2d nter(p->pDestDb-
21473 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a 0d >mutex);.. }...
21474 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 69 . /* Detach thi
21475 73 20 62 61 63 6b 75 70 20 66 72 6f 6d 20 74 68 s backup from th
21476 65 20 73 6f 75 72 63 65 20 70 61 67 65 72 2e 20 e source pager.
21477 2a 2f 0d 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 */.. if( p->pDe
21478 73 74 44 62 20 29 7b 0d 0a 20 20 20 20 70 2d 3e stDb ){.. p->
21479 70 53 72 63 2d 3e 6e 42 61 63 6b 75 70 2d 2d 3b pSrc->nBackup--;
2147a 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 2d 3e .. }.. if( p->
2147b 69 73 41 74 74 61 63 68 65 64 20 29 7b 0d 0a 20 isAttached ){..
2147c 20 20 20 70 70 20 3d 20 73 71 6c 69 74 65 33 50 pp = sqlite3P
2147d 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 73 71 agerBackupPtr(sq
2147e 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 lite3BtreePager(
2147f 70 2d 3e 70 53 72 63 29 29 3b 0d 0a 20 20 20 20 p->pSrc));..
21480 77 68 69 6c 65 28 20 2a 70 70 21 3d 70 20 29 7b while( *pp!=p ){
21481 0d 0a 20 20 20 20 20 20 70 70 20 3d 20 26 28 2a .. pp = &(*
21482 70 70 29 2d 3e 70 4e 65 78 74 3b 0d 0a 20 20 20 pp)->pNext;..
21483 20 7d 0d 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d }.. *pp = p-
21484 3e 70 4e 65 78 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a >pNext;.. }....
21485 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 /* If a transa
21486 63 74 69 6f 6e 20 69 73 20 73 74 69 6c 6c 20 6f ction is still o
21487 70 65 6e 20 6f 6e 20 74 68 65 20 42 74 72 65 65 pen on the Btree
21488 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 , roll it back.
21489 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 */.. sqlite3Btr
2148a 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2d 3e 70 44 eeRollback(p->pD
2148b 65 73 74 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 53 65 est);.... /* Se
2148c 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 t the error code
2148d 20 6f 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 of the destinat
2148e 69 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e ion database han
2148f 64 6c 65 2e 20 2a 2f 0d 0a 20 20 72 63 20 3d 20 dle. */.. rc =
21490 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 (p->rc==SQLITE_D
21491 4f 4e 45 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b ONE) ? SQLITE_OK
21492 20 3a 20 70 2d 3e 72 63 3b 0d 0a 20 20 73 71 6c : p->rc;.. sql
21493 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 70 44 65 ite3Error(p->pDe
21494 73 74 44 62 2c 20 72 63 2c 20 30 29 3b 0d 0a 0d stDb, rc, 0);...
21495 0a 20 20 2f 2a 20 45 78 69 74 20 74 68 65 20 6d . /* Exit the m
21496 75 74 65 78 65 73 20 61 6e 64 20 66 72 65 65 20 utexes and free
21497 74 68 65 20 62 61 63 6b 75 70 20 63 6f 6e 74 65 the backup conte
21498 78 74 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f xt structure. */
21499 0d 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 .. if( p->pDest
2149a 44 62 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 Db ){.. sqlit
2149b 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 e3_mutex_leave(p
2149c 2d 3e 70 44 65 73 74 44 62 2d 3e 6d 75 74 65 78 ->pDestDb->mutex
2149d 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 );.. }.. sqlit
2149e 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 2d 3e e3BtreeLeave(p->
2149f 70 53 72 63 29 3b 0d 0a 20 20 69 66 28 20 70 2d pSrc);.. if( p-
214a0 3e 70 44 65 73 74 44 62 20 29 7b 0d 0a 20 20 20 >pDestDb ){..
214a1 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a /* EVIDENCE-OF:
214a2 20 52 2d 36 34 38 35 32 2d 32 31 35 39 31 20 54 R-64852-21591 T
214a3 68 65 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 he sqlite3_backu
214a4 70 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 p object is crea
214a5 74 65 64 20 62 79 20 61 0d 0a 20 20 20 20 2a 2a ted by a.. **
214a6 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
214a7 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 29 20 61 _backup_init() a
214a8 6e 64 20 69 73 20 64 65 73 74 72 6f 79 65 64 20 nd is destroyed
214a9 62 79 20 61 20 63 61 6c 6c 20 74 6f 0d 0a 20 20 by a call to..
214aa 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 62 61 63 ** sqlite3_bac
214ab 6b 75 70 5f 66 69 6e 69 73 68 28 29 2e 20 2a 2f kup_finish(). */
214ac 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 .. sqlite3_fr
214ad 65 65 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 ee(p);.. }.. s
214ae 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
214af 76 65 28 6d 75 74 65 78 29 3b 0d 0a 20 20 72 65 ve(mutex);.. re
214b0 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f turn rc;..}..../
214b1 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 *..** Return the
214b2 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 number of pages
214b3 20 73 74 69 6c 6c 20 74 6f 20 62 65 20 62 61 63 still to be bac
214b4 6b 65 64 20 75 70 20 61 73 20 6f 66 20 74 68 65 ked up as of the
214b5 20 6d 6f 73 74 20 72 65 63 65 6e 74 0d 0a 2a 2a most recent..**
214b6 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
214b7 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 2e 0d _backup_step()..
214b8 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 .*/..SQLITE_API
214b9 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 61 63 6b int sqlite3_back
214ba 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 73 71 6c up_remaining(sql
214bb 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 29 7b ite3_backup *p){
214bc 0d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 .. return p->nR
214bd 65 6d 61 69 6e 69 6e 67 3b 0d 0a 7d 0d 0a 0d 0a emaining;..}....
214be 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 /*..** Return th
214bf 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f e total number o
214c0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 f pages in the s
214c1 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 61 ource database a
214c2 73 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 0d 0a s of the most ..
214c3 2a 2a 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 ** recent call t
214c4 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 o sqlite3_backup
214c5 5f 73 74 65 70 28 29 2e 0d 0a 2a 2f 0d 0a 53 51 _step()...*/..SQ
214c6 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c LITE_API int sql
214c7 69 74 65 33 5f 62 61 63 6b 75 70 5f 70 61 67 65 ite3_backup_page
214c8 63 6f 75 6e 74 28 73 71 6c 69 74 65 33 5f 62 61 count(sqlite3_ba
214c9 63 6b 75 70 20 2a 70 29 7b 0d 0a 20 20 72 65 74 ckup *p){.. ret
214ca 75 72 6e 20 70 2d 3e 6e 50 61 67 65 63 6f 75 6e urn p->nPagecoun
214cb 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 t;..}..../*..**
214cc 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
214cd 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 called after th
214ce 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 e contents of pa
214cf 67 65 20 69 50 61 67 65 20 6f 66 20 74 68 65 0d ge iPage of the.
214d0 0a 2a 2a 20 73 6f 75 72 63 65 20 64 61 74 61 62 .** source datab
214d1 61 73 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f ase have been mo
214d2 64 69 66 69 65 64 2e 20 49 66 20 70 61 67 65 20 dified. If page
214d3 69 50 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 iPage has alread
214d4 79 20 62 65 65 6e 20 0d 0a 2a 2a 20 63 6f 70 69 y been ..** copi
214d5 65 64 20 69 6e 74 6f 20 74 68 65 20 64 65 73 74 ed into the dest
214d6 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 ination database
214d7 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 , then the data
214d8 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0d 0a written to the..
214d9 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 ** destination i
214da 73 20 6e 6f 77 20 69 6e 76 61 6c 69 64 61 74 65 s now invalidate
214db 64 2e 20 54 68 65 20 64 65 73 74 69 6e 61 74 69 d. The destinati
214dc 6f 6e 20 63 6f 70 79 20 6f 66 20 69 50 61 67 65 on copy of iPage
214dd 20 6e 65 65 64 73 0d 0a 2a 2a 20 74 6f 20 62 65 needs..** to be
214de 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 updated with th
214df 65 20 6e 65 77 20 64 61 74 61 20 62 65 66 6f 72 e new data befor
214e0 65 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 65 e the backup ope
214e1 72 61 74 69 6f 6e 20 69 73 0d 0a 2a 2a 20 63 6f ration is..** co
214e2 6d 70 6c 65 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 mplete...**..**
214e3 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 It is assumed th
214e4 61 74 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 at the mutex ass
214e5 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
214e6 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 BtShared object
214e7 0d 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 ..** correspondi
214e8 6e 67 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 ng to the source
214e9 20 64 61 74 61 62 61 73 65 20 69 73 20 68 65 6c database is hel
214ea 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 d when this func
214eb 74 69 6f 6e 20 69 73 0d 0a 2a 2a 20 63 61 6c 6c tion is..** call
214ec 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ed...*/..SQLITE_
214ed 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c PRIVATE void sql
214ee 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 ite3BackupUpdate
214ef 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 (sqlite3_backup
214f0 2a 70 42 61 63 6b 75 70 2c 20 50 67 6e 6f 20 69 *pBackup, Pgno i
214f1 50 61 67 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a Page, const u8 *
214f2 61 44 61 74 61 29 7b 0d 0a 20 20 73 71 6c 69 74 aData){.. sqlit
214f3 65 33 5f 62 61 63 6b 75 70 20 2a 70 3b 20 20 20 e3_backup *p;
214f4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
214f5 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 /* Iterator vari
214f6 61 62 6c 65 20 2a 2f 0d 0a 20 20 66 6f 72 28 70 able */.. for(p
214f7 3d 70 42 61 63 6b 75 70 3b 20 70 3b 20 70 3d 70 =pBackup; p; p=p
214f8 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 61 ->pNext){.. a
214f9 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d ssert( sqlite3_m
214fa 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 72 utex_held(p->pSr
214fb 63 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 c->pBt->mutex) )
214fc 3b 0d 0a 20 20 20 20 69 66 28 20 21 69 73 46 61 ;.. if( !isFa
214fd 74 61 6c 45 72 72 6f 72 28 70 2d 3e 72 63 29 20 talError(p->rc)
214fe 26 26 20 69 50 61 67 65 3c 70 2d 3e 69 4e 65 78 && iPage<p->iNex
214ff 74 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 t ){.. /* T
21500 68 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 he backup proces
21501 73 20 70 20 68 61 73 20 61 6c 72 65 61 64 79 20 s p has already
21502 63 6f 70 69 65 64 20 70 61 67 65 20 69 50 61 67 copied page iPag
21503 65 2e 20 42 75 74 20 6e 6f 77 20 69 74 0d 0a 20 e. But now it..
21504 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e ** has been
21505 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 20 74 modified by a t
21506 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 ransaction on th
21507 65 20 73 6f 75 72 63 65 20 70 61 67 65 72 2e 20 e source pager.
21508 43 6f 70 79 0d 0a 20 20 20 20 20 20 2a 2a 20 74 Copy.. ** t
21509 68 65 20 6e 65 77 20 64 61 74 61 20 69 6e 74 6f he new data into
2150a 20 74 68 65 20 62 61 63 6b 75 70 2e 0d 0a 20 20 the backup...
2150b 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 6e */.. in
2150c 74 20 72 63 3b 0d 0a 20 20 20 20 20 20 61 73 73 t rc;.. ass
2150d 65 72 74 28 20 70 2d 3e 70 44 65 73 74 44 62 20 ert( p->pDestDb
2150e 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 );.. sqlite
2150f 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3_mutex_enter(p-
21510 3e 70 44 65 73 74 44 62 2d 3e 6d 75 74 65 78 29 >pDestDb->mutex)
21511 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 ;.. rc = ba
21512 63 6b 75 70 4f 6e 65 50 61 67 65 28 70 2c 20 69 ckupOnePage(p, i
21513 50 61 67 65 2c 20 61 44 61 74 61 29 3b 0d 0a 20 Page, aData);..
21514 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 sqlite3_mut
21515 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 44 65 73 ex_leave(p->pDes
21516 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 tDb->mutex);..
21517 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d assert( rc!=
21518 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 72 SQLITE_BUSY && r
21519 63 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 c!=SQLITE_LOCKED
2151a 20 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 );.. if( r
2151b 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
2151c 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d . p->rc =
2151d 20 72 63 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 rc;.. }..
2151e 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a }.. }..}....
2151f 2f 2a 0d 0a 2a 2a 20 52 65 73 74 61 72 74 20 74 /*..** Restart t
21520 68 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 he backup proces
21521 73 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 s. This is calle
21522 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 d when the pager
21523 20 6c 61 79 65 72 0d 0a 2a 2a 20 64 65 74 65 63 layer..** detec
21524 74 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 ts that the data
21525 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f base has been mo
21526 64 69 66 69 65 64 20 62 79 20 61 6e 20 65 78 74 dified by an ext
21527 65 72 6e 61 6c 20 64 61 74 61 62 61 73 65 0d 0a ernal database..
21528 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 ** connection. I
21529 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 n this case ther
2152a 65 20 69 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b e is no way of k
2152b 6e 6f 77 69 6e 67 20 77 68 69 63 68 20 6f 66 20 nowing which of
2152c 74 68 65 0d 0a 2a 2a 20 70 61 67 65 73 20 74 68 the..** pages th
2152d 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 at have been cop
2152e 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 65 73 ied into the des
2152f 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 tination databas
21530 65 20 61 72 65 20 73 74 69 6c 6c 20 0d 0a 2a 2a e are still ..**
21531 20 76 61 6c 69 64 20 61 6e 64 20 77 68 69 63 68 valid and which
21532 20 61 72 65 20 6e 6f 74 2c 20 73 6f 20 74 68 65 are not, so the
21533 20 65 6e 74 69 72 65 20 70 72 6f 63 65 73 73 20 entire process
21534 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 needs to be rest
21535 61 72 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 arted...**..** I
21536 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 t is assumed tha
21537 74 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f t the mutex asso
21538 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
21539 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 0d BtShared object.
2153a 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e .** correspondin
2153b 67 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 g to the source
2153c 64 61 74 61 62 61 73 65 20 69 73 20 68 65 6c 64 database is held
2153d 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 when this funct
2153e 69 6f 6e 20 69 73 0d 0a 2a 2a 20 63 61 6c 6c 65 ion is..** calle
2153f 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 d...*/..SQLITE_P
21540 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
21541 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 te3BackupRestart
21542 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 (sqlite3_backup
21543 2a 70 42 61 63 6b 75 70 29 7b 0d 0a 20 20 73 71 *pBackup){.. sq
21544 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 3b lite3_backup *p;
21545 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21546 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 /* Iterator v
21547 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 66 6f ariable */.. fo
21548 72 28 70 3d 70 42 61 63 6b 75 70 3b 20 70 3b 20 r(p=pBackup; p;
21549 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20 p=p->pNext){..
2154a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
2154b 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 3_mutex_held(p->
2154c 70 53 72 63 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 pSrc->pBt->mutex
2154d 29 20 29 3b 0d 0a 20 20 20 20 70 2d 3e 69 4e 65 ) );.. p->iNe
2154e 78 74 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 7d 0d xt = 1;.. }..}.
2154f 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
21550 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0d 0a 2f E_OMIT_VACUUM../
21551 2a 0d 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 *..** Copy the c
21552 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 omplete content
21553 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 of pBtFrom into
21554 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 pBtTo. A transa
21555 63 74 69 6f 6e 0d 0a 2a 2a 20 6d 75 73 74 20 62 ction..** must b
21556 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 e active for bot
21557 68 20 66 69 6c 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a h files...**..**
21558 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c The size of fil
21559 65 20 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64 e pTo may be red
2155a 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 uced by this ope
2155b 72 61 74 69 6f 6e 2e 20 49 66 20 61 6e 79 74 68 ration. If anyth
2155c 69 6e 67 20 0d 0a 2a 2a 20 67 6f 65 73 20 77 72 ing ..** goes wr
2155d 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 ong, the transac
2155e 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72 tion on pTo is r
2155f 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 73 olled back. If s
21560 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 0d uccessful, the .
21561 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 .** transaction
21562 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 66 is committed bef
21563 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a ore returning...
21564 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
21565 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 TE int sqlite3Bt
21566 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 reeCopyFile(Btre
21567 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 e *pTo, Btree *p
21568 46 72 6f 6d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 From){.. int rc
21569 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c ;.. sqlite3_fil
2156a 65 20 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 e *pFd;
2156b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 /* File des
2156c 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 criptor for data
2156d 62 61 73 65 20 70 54 6f 20 2a 2f 0d 0a 20 20 73 base pTo */.. s
2156e 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 62 3b qlite3_backup b;
2156f 0d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 .. sqlite3Btree
21570 45 6e 74 65 72 28 70 54 6f 29 3b 0d 0a 20 20 73 Enter(pTo);.. s
21571 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
21572 28 70 46 72 6f 6d 29 3b 0d 0a 0d 0a 20 20 61 73 (pFrom);.... as
21573 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 sert( sqlite3Btr
21574 65 65 49 73 49 6e 54 72 61 6e 73 28 70 54 6f 29 eeIsInTrans(pTo)
21575 20 29 3b 0d 0a 20 20 70 46 64 20 3d 20 73 71 6c );.. pFd = sql
21576 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 73 71 ite3PagerFile(sq
21577 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 lite3BtreePager(
21578 70 54 6f 29 29 3b 0d 0a 20 20 69 66 28 20 70 46 pTo));.. if( pF
21579 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0d 0a d->pMethods ){..
2157a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 i64 nByte =
2157b 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 sqlite3BtreeGetP
2157c 61 67 65 53 69 7a 65 28 70 46 72 6f 6d 29 2a 28 ageSize(pFrom)*(
2157d 69 36 34 29 73 71 6c 69 74 65 33 42 74 72 65 65 i64)sqlite3Btree
2157e 4c 61 73 74 50 61 67 65 28 70 46 72 6f 6d 29 3b LastPage(pFrom);
2157f 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
21580 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 e3OsFileControl(
21581 70 46 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 pFd, SQLITE_FCNT
21582 4c 5f 4f 56 45 52 57 52 49 54 45 2c 20 26 6e 42 L_OVERWRITE, &nB
21583 79 74 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 yte);.. if( r
21584 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 c==SQLITE_NOTFOU
21585 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 ND ) rc = SQLITE
21586 5f 4f 4b 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 _OK;.. if( rc
21587 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 66 69 6e ) goto copy_fin
21588 69 73 68 65 64 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 ished;.. }....
21589 20 2f 2a 20 53 65 74 20 75 70 20 61 6e 20 73 71 /* Set up an sq
2158a 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a lite3_backup obj
2158b 65 63 74 2e 20 73 71 6c 69 74 65 33 5f 62 61 63 ect. sqlite3_bac
2158c 6b 75 70 2e 70 44 65 73 74 44 62 20 6d 75 73 74 kup.pDestDb must
2158d 20 62 65 20 73 65 74 0d 0a 20 20 2a 2a 20 74 6f be set.. ** to
2158e 20 30 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0. This is used
2158f 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e by the implemen
21590 74 61 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 tations of sqlit
21591 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 e3_backup_step()
21592 0d 0a 20 20 2a 2a 20 61 6e 64 20 73 71 6c 69 74 .. ** and sqlit
21593 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 e3_backup_finish
21594 28 29 20 74 6f 20 64 65 74 65 63 74 20 74 68 61 () to detect tha
21595 74 20 74 68 65 79 20 61 72 65 20 62 65 69 6e 67 t they are being
21596 20 63 61 6c 6c 65 64 0d 0a 20 20 2a 2a 20 66 72 called.. ** fr
21597 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e om this function
21598 2c 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 62 , not directly b
21599 79 20 74 68 65 20 75 73 65 72 2e 0d 0a 20 20 2a y the user... *
2159a 2f 0d 0a 20 20 6d 65 6d 73 65 74 28 26 62 2c 20 /.. memset(&b,
2159b 30 2c 20 73 69 7a 65 6f 66 28 62 29 29 3b 0d 0a 0, sizeof(b));..
2159c 20 20 62 2e 70 53 72 63 44 62 20 3d 20 70 46 72 b.pSrcDb = pFr
2159d 6f 6d 2d 3e 64 62 3b 0d 0a 20 20 62 2e 70 53 72 om->db;.. b.pSr
2159e 63 20 3d 20 70 46 72 6f 6d 3b 0d 0a 20 20 62 2e c = pFrom;.. b.
2159f 70 44 65 73 74 20 3d 20 70 54 6f 3b 0d 0a 20 20 pDest = pTo;..
215a0 62 2e 69 4e 65 78 74 20 3d 20 31 3b 0d 0a 0d 0a b.iNext = 1;....
215a1 20 20 2f 2a 20 30 78 37 46 46 46 46 46 46 46 20 /* 0x7FFFFFFF
215a2 69 73 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 is the hard limi
215a3 74 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 t for the number
215a4 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 20 64 of pages in a d
215a5 61 74 61 62 61 73 65 0d 0a 20 20 2a 2a 20 66 69 atabase.. ** fi
215a6 6c 65 2e 20 42 79 20 70 61 73 73 69 6e 67 20 74 le. By passing t
215a7 68 69 73 20 61 73 20 74 68 65 20 6e 75 6d 62 65 his as the numbe
215a8 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 63 6f r of pages to co
215a9 70 79 20 74 6f 0d 0a 20 20 2a 2a 20 73 71 6c 69 py to.. ** sqli
215aa 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 te3_backup_step(
215ab 29 2c 20 77 65 20 63 61 6e 20 67 75 61 72 61 6e ), we can guaran
215ac 74 65 65 20 74 68 61 74 20 74 68 65 20 63 6f 70 tee that the cop
215ad 79 20 66 69 6e 69 73 68 65 73 20 0d 0a 20 20 2a y finishes .. *
215ae 2a 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c * within a singl
215af 65 20 63 61 6c 6c 20 28 75 6e 6c 65 73 73 20 61 e call (unless a
215b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 29 2e n error occurs).
215b1 20 54 68 65 20 61 73 73 65 72 74 28 29 20 73 74 The assert() st
215b2 61 74 65 6d 65 6e 74 0d 0a 20 20 2a 2a 20 63 68 atement.. ** ch
215b3 65 63 6b 73 20 74 68 69 73 20 61 73 73 75 6d 70 ecks this assump
215b4 74 69 6f 6e 20 2d 20 28 70 2d 3e 72 63 29 20 73 tion - (p->rc) s
215b5 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 hould be set to
215b6 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 44 4f either SQLITE_DO
215b7 4e 45 20 0d 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 NE .. ** or an
215b8 65 72 72 6f 72 20 63 6f 64 65 2e 0d 0a 20 20 2a error code... *
215b9 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 /.. sqlite3_bac
215ba 6b 75 70 5f 73 74 65 70 28 26 62 2c 20 30 78 37 kup_step(&b, 0x7
215bb 46 46 46 46 46 46 46 29 3b 0d 0a 20 20 61 73 73 FFFFFFF);.. ass
215bc 65 72 74 28 20 62 2e 72 63 21 3d 53 51 4c 49 54 ert( b.rc!=SQLIT
215bd 45 5f 4f 4b 20 29 3b 0d 0a 20 20 72 63 20 3d 20 E_OK );.. rc =
215be 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 sqlite3_backup_f
215bf 69 6e 69 73 68 28 26 62 29 3b 0d 0a 20 20 69 66 inish(&b);.. if
215c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
215c1 29 7b 0d 0a 20 20 20 20 70 54 6f 2d 3e 70 42 74 ){.. pTo->pBt
215c2 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 ->btsFlags &= ~B
215c3 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 TS_PAGESIZE_FIXE
215c4 44 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 D;.. }else{..
215c5 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c sqlite3PagerCl
215c6 65 61 72 43 61 63 68 65 28 73 71 6c 69 74 65 33 earCache(sqlite3
215c7 42 74 72 65 65 50 61 67 65 72 28 62 2e 70 44 65 BtreePager(b.pDe
215c8 73 74 29 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 st));.. }....
215c9 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 assert( sqlite3B
215ca 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 54 treeIsInTrans(pT
215cb 6f 29 3d 3d 30 20 29 3b 0d 0a 63 6f 70 79 5f 66 o)==0 );..copy_f
215cc 69 6e 69 73 68 65 64 3a 0d 0a 20 20 73 71 6c 69 inished:.. sqli
215cd 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 46 te3BtreeLeave(pF
215ce 72 6f 6d 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 rom);.. sqlite3
215cf 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b BtreeLeave(pTo);
215d0 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a .. return rc;..
215d1 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c }..#endif /* SQL
215d2 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 ITE_OMIT_VACUUM
215d3 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */..../*********
215d4 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 62 61 63 ***** End of bac
215d5 6b 75 70 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a kup.c **********
215d6 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215d7 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215d8 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ****/../********
215d9 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 69 6c ****** Begin fil
215da 65 20 76 64 62 65 6d 65 6d 2e 63 20 2a 2a 2a 2a e vdbemem.c ****
215db 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215dc 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215dd 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 0d 0a 2a 2a 20 32 *****/../*..** 2
215de 30 30 34 20 4d 61 79 20 32 36 0d 0a 2a 2a 0d 0a 004 May 26..**..
215df 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 ** The author di
215e0 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 sclaims copyrigh
215e1 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 t to this source
215e2 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 code. In place
215e3 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 of..** a legal
215e4 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 notice, here is
215e5 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d a blessing:..**.
215e6 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 .** May you d
215e7 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 o good and not e
215e8 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 vil...** May
215e9 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 you find forgive
215ea 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c ness for yoursel
215eb 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 f and forgive ot
215ec 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 hers...** May
215ed 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c you share freel
215ee 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 y, never taking
215ef 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 more than you gi
215f0 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a ve...**..*******
215f1 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215f2 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215f3 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215f4 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
215f5 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 **..**..** This
215f6 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f file contains co
215f7 64 65 20 75 73 65 20 74 6f 20 6d 61 6e 69 70 75 de use to manipu
215f8 6c 61 74 65 20 22 4d 65 6d 22 20 73 74 72 75 63 late "Mem" struc
215f9 74 75 72 65 2e 20 20 41 20 22 4d 65 6d 22 0d 0a ture. A "Mem"..
215fa 2a 2a 20 73 74 6f 72 65 73 20 61 20 73 69 6e 67 ** stores a sing
215fb 6c 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 le value in the
215fc 56 44 42 45 2e 20 20 4d 65 6d 20 69 73 20 61 6e VDBE. Mem is an
215fd 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 opaque structur
215fe 65 20 76 69 73 69 62 6c 65 0d 0a 2a 2a 20 6f 6e e visible..** on
215ff 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 56 44 ly within the VD
21600 42 45 2e 20 20 49 6e 74 65 72 66 61 63 65 20 72 BE. Interface r
21601 6f 75 74 69 6e 65 73 20 72 65 66 65 72 20 74 6f outines refer to
21602 20 61 20 4d 65 6d 20 75 73 69 6e 67 20 74 68 65 a Mem using the
21603 0d 0a 2a 2a 20 6e 61 6d 65 20 73 71 6c 69 74 65 ..** name sqlite
21604 5f 76 61 6c 75 65 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a _value..*/..../*
21605 0d 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 ..** If pMem is
21606 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 an object with a
21607 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 valid string re
21608 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 74 68 presentation, th
21609 69 73 20 72 6f 75 74 69 6e 65 0d 0a 2a 2a 20 65 is routine..** e
2160a 6e 73 75 72 65 73 20 74 68 65 20 69 6e 74 65 72 nsures the inter
2160b 6e 61 6c 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 nal encoding for
2160c 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 the string repr
2160d 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 0d 0a 2a esentation is..*
2160e 2a 20 27 64 65 73 69 72 65 64 45 6e 63 27 2c 20 * 'desiredEnc',
2160f 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 one of SQLITE_UT
21610 46 38 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 F8, SQLITE_UTF16
21611 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 LE or SQLITE_UTF
21612 31 36 42 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 16BE...**..** If
21613 20 70 4d 65 6d 20 69 73 20 6e 6f 74 20 61 20 73 pMem is not a s
21614 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 6f 72 tring object, or
21615 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 the encoding of
21616 20 74 68 65 20 73 74 72 69 6e 67 0d 0a 2a 2a 20 the string..**
21617 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 representation i
21618 73 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 s already stored
21619 20 75 73 69 6e 67 20 74 68 65 20 72 65 71 75 65 using the reque
2161a 73 74 65 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74 sted encoding, t
2161b 68 65 6e 20 74 68 69 73 0d 0a 2a 2a 20 72 6f 75 hen this..** rou
2161c 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e tine is a no-op.
2161d 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f ..**..** SQLITE_
2161e 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 OK is returned i
2161f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e f the conversion
21620 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 is successful (
21621 6f 72 20 6e 6f 74 20 72 65 71 75 69 72 65 64 29 or not required)
21622 2e 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d ...** SQLITE_NOM
21623 45 4d 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e EM may be return
21624 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 ed if a malloc()
21625 20 66 61 69 6c 73 20 64 75 72 69 6e 67 20 63 6f fails during co
21626 6e 76 65 72 73 69 6f 6e 0d 0a 2a 2a 20 62 65 74 nversion..** bet
21627 77 65 65 6e 20 66 6f 72 6d 61 74 73 2e 0d 0a 2a ween formats...*
21628 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
21629 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 E int sqlite3Vdb
2162a 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 eChangeEncoding(
2162b 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 64 Mem *pMem, int d
2162c 65 73 69 72 65 64 45 6e 63 29 7b 0d 0a 20 20 69 esiredEnc){.. i
2162d 6e 74 20 72 63 3b 0d 0a 20 20 61 73 73 65 72 74 nt rc;.. assert
2162e 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d ( (pMem->flags&M
2162f 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b EM_RowSet)==0 );
21630 0d 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 .. assert( desi
21631 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 redEnc==SQLITE_U
21632 54 46 38 20 7c 7c 20 64 65 73 69 72 65 64 45 6e TF8 || desiredEn
21633 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c c==SQLITE_UTF16L
21634 45 0d 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c E.. ||
21635 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c desiredEnc==SQL
21636 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0d 0a ITE_UTF16BE );..
21637 20 20 69 66 28 20 21 28 70 4d 65 6d 2d 3e 66 6c if( !(pMem->fl
21638 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 ags&MEM_Str) ||
21639 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 pMem->enc==desir
2163a 65 64 45 6e 63 20 29 7b 0d 0a 20 20 20 20 72 65 edEnc ){.. re
2163b 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
2163c 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
2163d 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 pMem->db==0 || s
2163e 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
2163f 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 d(pMem->db->mute
21640 78 29 20 29 3b 0d 0a 23 69 66 64 65 66 20 53 51 x) );..#ifdef SQ
21641 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0d LITE_OMIT_UTF16.
21642 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
21643 5f 45 52 52 4f 52 3b 0d 0a 23 65 6c 73 65 0d 0a _ERROR;..#else..
21644 0d 0a 20 20 2f 2a 20 4d 65 6d 54 72 61 6e 73 6c .. /* MemTransl
21645 61 74 65 28 29 20 6d 61 79 20 72 65 74 75 72 6e ate() may return
21646 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 SQLITE_OK or SQ
21647 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 66 20 4e LITE_NOMEM. If N
21648 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 OMEM is returned
21649 2c 0d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 ,.. ** then the
2164a 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 encoding of the
2164b 20 76 61 6c 75 65 20 6d 61 79 20 6e 6f 74 20 68 value may not h
2164c 61 76 65 20 63 68 61 6e 67 65 64 2e 0d 0a 20 20 ave changed...
2164d 2a 2f 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 */.. rc = sqlit
2164e 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 e3VdbeMemTransla
2164f 74 65 28 70 4d 65 6d 2c 20 28 75 38 29 64 65 73 te(pMem, (u8)des
21650 69 72 65 64 45 6e 63 29 3b 0d 0a 20 20 61 73 73 iredEnc);.. ass
21651 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f ert(rc==SQLITE_O
21652 4b 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 K || rc==SQLI
21653 54 45 5f 4e 4f 4d 45 4d 29 3b 0d 0a 20 20 61 73 TE_NOMEM);.. as
21654 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f sert(rc==SQLITE_
21655 4f 4b 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 65 OK || pMem->e
21656 6e 63 21 3d 64 65 73 69 72 65 64 45 6e 63 29 3b nc!=desiredEnc);
21657 0d 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 .. assert(rc==S
21658 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 QLITE_NOMEM || p
21659 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 Mem->enc==desire
2165a 64 45 6e 63 29 3b 0d 0a 20 20 72 65 74 75 72 6e dEnc);.. return
2165b 20 72 63 3b 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d rc;..#endif..}.
2165c 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 20 73 .../*..** Make s
2165d 75 72 65 20 70 4d 65 6d 2d 3e 7a 20 70 6f 69 6e ure pMem->z poin
2165e 74 73 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 ts to a writable
2165f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 allocation of a
21660 74 20 6c 65 61 73 74 20 0d 0a 2a 2a 20 6e 20 62 t least ..** n b
21661 79 74 65 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 ytes...**..** If
21662 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c the memory cell
21663 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 currently conta
21664 69 6e 73 20 73 74 72 69 6e 67 20 6f 72 20 62 6c ins string or bl
21665 6f 62 20 64 61 74 61 0d 0a 2a 2a 20 61 6e 64 20 ob data..** and
21666 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 the third argume
21667 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 nt passed to thi
21668 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 72 s function is tr
21669 75 65 2c 20 74 68 65 20 0d 0a 2a 2a 20 63 75 72 ue, the ..** cur
2166a 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 66 20 rent content of
2166b 74 68 65 20 63 65 6c 6c 20 69 73 20 70 72 65 73 the cell is pres
2166c 65 72 76 65 64 2e 20 4f 74 68 65 72 77 69 73 65 erved. Otherwise
2166d 2c 20 69 74 20 6d 61 79 0d 0a 2a 2a 20 62 65 20 , it may..** be
2166e 64 69 73 63 61 72 64 65 64 2e 20 20 0d 0a 2a 2a discarded. ..**
2166f 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 ..** This functi
21670 6f 6e 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f on sets the MEM_
21671 44 79 6e 20 66 6c 61 67 20 61 6e 64 20 63 6c 65 Dyn flag and cle
21672 61 72 73 20 61 6e 79 20 78 44 65 6c 20 63 61 6c ars any xDel cal
21673 6c 62 61 63 6b 2e 0d 0a 2a 2a 20 49 74 20 61 6c lback...** It al
21674 73 6f 20 63 6c 65 61 72 73 20 4d 45 4d 5f 45 70 so clears MEM_Ep
21675 68 65 6d 20 61 6e 64 20 4d 45 4d 5f 53 74 61 74 hem and MEM_Stat
21676 69 63 2e 20 49 66 20 74 68 65 20 70 72 65 73 65 ic. If the prese
21677 72 76 65 20 66 6c 61 67 20 69 73 20 0d 0a 2a 2a rve flag is ..**
21678 20 6e 6f 74 20 73 65 74 2c 20 4d 65 6d 2e 6e 20 not set, Mem.n
21679 69 73 20 7a 65 72 6f 65 64 2e 0d 0a 2a 2f 0d 0a is zeroed...*/..
2167a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
2167b 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 nt sqlite3VdbeMe
2167c 6d 47 72 6f 77 28 4d 65 6d 20 2a 70 4d 65 6d 2c mGrow(Mem *pMem,
2167d 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 72 65 73 int n, int pres
2167e 65 72 76 65 29 7b 0d 0a 20 20 61 73 73 65 72 74 erve){.. assert
2167f 28 20 31 20 3e 3d 0d 0a 20 20 20 20 28 28 70 4d ( 1 >=.. ((pM
21680 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 26 26 20 70 em->zMalloc && p
21681 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4d Mem->zMalloc==pM
21682 65 6d 2d 3e 7a 29 20 3f 20 31 20 3a 20 30 29 20 em->z) ? 1 : 0)
21683 2b 0d 0a 20 20 20 20 28 28 28 70 4d 65 6d 2d 3e +.. (((pMem->
21684 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 26 26 flags&MEM_Dyn)&&
21685 70 4d 65 6d 2d 3e 78 44 65 6c 29 20 3f 20 31 20 pMem->xDel) ? 1
21686 3a 20 30 29 20 2b 20 0d 0a 20 20 20 20 28 28 70 : 0) + .. ((p
21687 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45 Mem->flags&MEM_E
21688 70 68 65 6d 29 20 3f 20 31 20 3a 20 30 29 20 2b phem) ? 1 : 0) +
21689 20 0d 0a 20 20 20 20 28 28 70 4d 65 6d 2d 3e 66 .. ((pMem->f
2168a 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74 69 63 29 lags&MEM_Static)
2168b 20 3f 20 31 20 3a 20 30 29 0d 0a 20 20 29 3b 0d ? 1 : 0).. );.
2168c 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d . assert( (pMem
2168d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 ->flags&MEM_RowS
2168e 65 74 29 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69 et)==0 );.... i
2168f 66 28 20 6e 3c 33 32 20 29 20 6e 20 3d 20 33 32 f( n<32 ) n = 32
21690 3b 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 ;.. if( sqlite3
21691 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 DbMallocSize(pMe
21692 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 m->db, pMem->zMa
21693 6c 6c 6f 63 29 3c 6e 20 29 7b 0d 0a 20 20 20 20 lloc)<n ){..
21694 69 66 28 20 70 72 65 73 65 72 76 65 20 26 26 20 if( preserve &&
21695 70 4d 65 6d 2d 3e 7a 3d 3d 70 4d 65 6d 2d 3e 7a pMem->z==pMem->z
21696 4d 61 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 20 Malloc ){..
21697 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d pMem->z = pMem-
21698 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 >zMalloc = sqlit
21699 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 e3DbReallocOrFre
2169a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d e(pMem->db, pMem
2169b 2d 3e 7a 2c 20 6e 29 3b 0d 0a 20 20 20 20 20 20 ->z, n);..
2169c 70 72 65 73 65 72 76 65 20 3d 20 30 3b 0d 0a 20 preserve = 0;..
2169d 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 }else{..
2169e 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 sqlite3DbFree(p
2169f 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a Mem->db, pMem->z
216a0 4d 61 6c 6c 6f 63 29 3b 0d 0a 20 20 20 20 20 20 Malloc);..
216a1 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 pMem->zMalloc =
216a2 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 sqlite3DbMallocR
216a3 61 77 28 70 4d 65 6d 2d 3e 64 62 2c 20 6e 29 3b aw(pMem->db, n);
216a4 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a .. }.. }....
216a5 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 if( pMem->z &&
216a6 20 70 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 preserve && pMe
216a7 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 26 26 20 70 4d m->zMalloc && pM
216a8 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 4d 61 em->z!=pMem->zMa
216a9 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 6d 65 6d lloc ){.. mem
216aa 63 70 79 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f cpy(pMem->zMallo
216ab 63 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d c, pMem->z, pMem
216ac 2d 3e 6e 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 ->n);.. }.. if
216ad 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 ( pMem->flags&ME
216ae 4d 5f 44 79 6e 20 26 26 20 70 4d 65 6d 2d 3e 78 M_Dyn && pMem->x
216af 44 65 6c 20 29 7b 0d 0a 20 20 20 20 70 4d 65 6d Del ){.. pMem
216b0 2d 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a 29 28 ->xDel((void *)(
216b1 70 4d 65 6d 2d 3e 7a 29 29 3b 0d 0a 20 20 7d 0d pMem->z));.. }.
216b2 0a 0d 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 ... pMem->z = p
216b3 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0d 0a 20 Mem->zMalloc;..
216b4 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 3d 3d 30 20 if( pMem->z==0
216b5 29 7b 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c ){.. pMem->fl
216b6 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0d ags = MEM_Null;.
216b7 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 . }else{.. p
216b8 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Mem->flags &= ~(
216b9 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 MEM_Ephem|MEM_St
216ba 61 74 69 63 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 atic);.. }.. p
216bb 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0d 0a Mem->xDel = 0;..
216bc 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e return (pMem->
216bd 7a 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 z ? SQLITE_OK :
216be 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0d 0a SQLITE_NOMEM);..
216bf 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 }..../*..** Make
216c0 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 20 6f the given Mem o
216c1 62 6a 65 63 74 20 4d 45 4d 5f 44 79 6e 2e 20 20 bject MEM_Dyn.
216c2 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 In other words,
216c3 6d 61 6b 65 20 69 74 20 73 6f 0d 0a 2a 2a 20 74 make it so..** t
216c4 68 61 74 20 61 6e 79 20 54 45 58 54 20 6f 72 20 hat any TEXT or
216c5 42 4c 4f 42 20 63 6f 6e 74 65 6e 74 20 69 73 20 BLOB content is
216c6 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 stored in memory
216c7 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0d 0a obtained from..
216c8 2a 2a 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 6e ** malloc(). In
216c9 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 6b 6e this way, we kn
216ca 6f 77 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f ow that the memo
216cb 72 79 20 69 73 20 73 61 66 65 20 74 6f 20 62 65 ry is safe to be
216cc 0d 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e ..** overwritten
216cd 20 6f 72 20 61 6c 74 65 72 65 64 2e 0d 0a 2a 2a or altered...**
216ce 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 ..** Return SQLI
216cf 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 TE_OK on success
216d0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d or SQLITE_NOMEM
216d1 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 if malloc fails
216d2 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
216d3 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
216d4 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 3VdbeMemMakeWrit
216d5 65 61 62 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 eable(Mem *pMem)
216d6 7b 0d 0a 20 20 69 6e 74 20 66 3b 0d 0a 20 20 61 {.. int f;.. a
216d7 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d ssert( pMem->db=
216d8 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 =0 || sqlite3_mu
216d9 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 tex_held(pMem->d
216da 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 20 20 b->mutex) );..
216db 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 assert( (pMem->f
216dc 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 74 29 lags&MEM_RowSet)
216dd 3d 3d 30 20 29 3b 0d 0a 20 20 45 78 70 61 6e 64 ==0 );.. Expand
216de 42 6c 6f 62 28 70 4d 65 6d 29 3b 0d 0a 20 20 66 Blob(pMem);.. f
216df 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0d = pMem->flags;.
216e0 0a 20 20 69 66 28 20 28 66 26 28 4d 45 4d 5f 53 . if( (f&(MEM_S
216e1 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 20 26 26 tr|MEM_Blob)) &&
216e2 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e pMem->z!=pMem->
216e3 7a 4d 61 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 zMalloc ){..
216e4 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d if( sqlite3VdbeM
216e5 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 70 4d 65 emGrow(pMem, pMe
216e6 6d 2d 3e 6e 20 2b 20 32 2c 20 31 29 20 29 7b 0d m->n + 2, 1) ){.
216e7 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
216e8 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 LITE_NOMEM;..
216e9 20 7d 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b }.. pMem->z[
216ea 70 4d 65 6d 2d 3e 6e 5d 20 3d 20 30 3b 0d 0a 20 pMem->n] = 0;..
216eb 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d pMem->z[pMem-
216ec 3e 6e 2b 31 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 >n+1] = 0;..
216ed 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d pMem->flags |= M
216ee 45 4d 5f 54 65 72 6d 3b 0d 0a 23 69 66 64 65 66 EM_Term;..#ifdef
216ef 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 SQLITE_DEBUG..
216f0 20 20 20 70 4d 65 6d 2d 3e 70 53 63 6f 70 79 46 pMem->pScopyF
216f1 72 6f 6d 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 rom = 0;..#endif
216f2 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 .. }.... retur
216f3 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
216f4 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 65 .../*..** If the
216f5 20 67 69 76 65 6e 20 4d 65 6d 2a 20 68 61 73 20 given Mem* has
216f6 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 a zero-filled ta
216f7 69 6c 2c 20 74 75 72 6e 20 69 74 20 69 6e 74 6f il, turn it into
216f8 20 61 6e 20 6f 72 64 69 6e 61 72 79 0d 0a 2a 2a an ordinary..**
216f9 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 blob stored in
216fa 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f dynamically allo
216fb 63 61 74 65 64 20 73 70 61 63 65 2e 0d 0a 2a 2f cated space...*/
216fc 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
216fd 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0d 0a _OMIT_INCRBLOB..
216fe 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
216ff 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 nt sqlite3VdbeMe
21700 6d 45 78 70 61 6e 64 42 6c 6f 62 28 4d 65 6d 20 mExpandBlob(Mem
21701 2a 70 4d 65 6d 29 7b 0d 0a 20 20 69 66 28 20 70 *pMem){.. if( p
21702 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
21703 5f 5a 65 72 6f 20 29 7b 0d 0a 20 20 20 20 69 6e _Zero ){.. in
21704 74 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 61 73 t nByte;.. as
21705 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 sert( pMem->flag
21706 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0d 0a 20 s&MEM_Blob );..
21707 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d assert( (pMem
21708 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 ->flags&MEM_RowS
21709 65 74 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 61 et)==0 );.. a
2170a 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d ssert( pMem->db=
2170b 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 =0 || sqlite3_mu
2170c 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 tex_held(pMem->d
2170d 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a 0d 0a b->mutex) );....
2170e 20 20 20 20 2f 2a 20 53 65 74 20 6e 42 79 74 65 /* Set nByte
2170f 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f to the number o
21710 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 f bytes required
21711 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 65 78 to store the ex
21712 70 61 6e 64 65 64 20 62 6c 6f 62 2e 20 2a 2f 0d panded blob. */.
21713 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 70 4d 65 . nByte = pMe
21714 6d 2d 3e 6e 20 2b 20 70 4d 65 6d 2d 3e 75 2e 6e m->n + pMem->u.n
21715 5a 65 72 6f 3b 0d 0a 20 20 20 20 69 66 28 20 6e Zero;.. if( n
21716 42 79 74 65 3c 3d 30 20 29 7b 0d 0a 20 20 20 20 Byte<=0 ){..
21717 20 20 6e 42 79 74 65 20 3d 20 31 3b 0d 0a 20 20 nByte = 1;..
21718 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 73 71 6c }.. if( sql
21719 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 ite3VdbeMemGrow(
2171a 70 4d 65 6d 2c 20 6e 42 79 74 65 2c 20 31 29 20 pMem, nByte, 1)
2171b 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){.. return
2171c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a SQLITE_NOMEM;..
2171d 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 6d 65 6d }.... mem
2171e 73 65 74 28 26 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 set(&pMem->z[pMe
2171f 6d 2d 3e 6e 5d 2c 20 30 2c 20 70 4d 65 6d 2d 3e m->n], 0, pMem->
21720 75 2e 6e 5a 65 72 6f 29 3b 0d 0a 20 20 20 20 70 u.nZero);.. p
21721 4d 65 6d 2d 3e 6e 20 2b 3d 20 70 4d 65 6d 2d 3e Mem->n += pMem->
21722 75 2e 6e 5a 65 72 6f 3b 0d 0a 20 20 20 20 70 4d u.nZero;.. pM
21723 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d em->flags &= ~(M
21724 45 4d 5f 5a 65 72 6f 7c 4d 45 4d 5f 54 65 72 6d EM_Zero|MEM_Term
21725 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 );.. }.. retur
21726 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
21727 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a 0d .#endif....../*.
21728 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 .** Make sure th
21729 65 20 67 69 76 65 6e 20 4d 65 6d 20 69 73 20 5c e given Mem is \
2172a 75 30 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 u0000 terminated
2172b 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
2172c 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
2172d 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 3VdbeMemNulTermi
2172e 6e 61 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b nate(Mem *pMem){
2172f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d .. assert( pMem
21730 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 ->db==0 || sqlit
21731 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d e3_mutex_held(pM
21732 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 em->db->mutex) )
21733 3b 0d 0a 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e ;.. if( (pMem->
21734 66 6c 61 67 73 20 26 20 4d 45 4d 5f 54 65 72 6d flags & MEM_Term
21735 29 21 3d 30 20 7c 7c 20 28 70 4d 65 6d 2d 3e 66 )!=0 || (pMem->f
21736 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 29 3d lags & MEM_Str)=
21737 3d 30 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 =0 ){.. retur
21738 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f n SQLITE_OK; /
21739 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 * Nothing to do
2173a 2a 2f 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 73 */.. }.. if( s
2173b 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f qlite3VdbeMemGro
2173c 77 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d 3e 6e 2b w(pMem, pMem->n+
2173d 32 2c 20 31 29 20 29 7b 0d 0a 20 20 20 20 72 65 2, 1) ){.. re
2173e 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 turn SQLITE_NOME
2173f 4d 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4d 65 6d 2d M;.. }.. pMem-
21740 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20 30 3b >z[pMem->n] = 0;
21741 0d 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d .. pMem->z[pMem
21742 2d 3e 6e 2b 31 5d 20 3d 20 30 3b 0d 0a 20 20 70 ->n+1] = 0;.. p
21743 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 Mem->flags |= ME
21744 4d 5f 54 65 72 6d 3b 0d 0a 20 20 72 65 74 75 72 M_Term;.. retur
21745 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d n SQLITE_OK;..}.
21746 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 64 20 4d 45 .../*..** Add ME
21747 4d 5f 53 74 72 20 74 6f 20 74 68 65 20 73 65 74 M_Str to the set
21748 20 6f 66 20 72 65 70 72 65 73 65 6e 74 61 74 69 of representati
21749 6f 6e 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 ons for the give
2174a 6e 20 4d 65 6d 2e 20 20 4e 75 6d 62 65 72 73 0d n Mem. Numbers.
2174b 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 .** are converte
2174c 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f d using sqlite3_
2174d 73 6e 70 72 69 6e 74 66 28 29 2e 20 20 43 6f 6e snprintf(). Con
2174e 76 65 72 74 69 6e 67 20 61 20 42 4c 4f 42 20 74 verting a BLOB t
2174f 6f 20 61 20 73 74 72 69 6e 67 0d 0a 2a 2a 20 69 o a string..** i
21750 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a s a no-op...**..
21751 2a 2a 20 45 78 69 73 74 69 6e 67 20 72 65 70 72 ** Existing repr
21752 65 73 65 6e 74 61 74 69 6f 6e 73 20 4d 45 4d 5f esentations MEM_
21753 49 6e 74 20 61 6e 64 20 4d 45 4d 5f 52 65 61 6c Int and MEM_Real
21754 20 61 72 65 20 2a 6e 6f 74 2a 20 69 6e 76 61 6c are *not* inval
21755 69 64 61 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 idated...**..**
21756 41 20 4d 45 4d 5f 4e 75 6c 6c 20 76 61 6c 75 65 A MEM_Null value
21757 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 will never be p
21758 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 assed to this fu
21759 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e nction. This fun
2175a 63 74 69 6f 6e 20 69 73 0d 0a 2a 2a 20 75 73 65 ction is..** use
2175b 64 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 d for converting
2175c 20 76 61 6c 75 65 73 20 74 6f 20 74 65 78 74 20 values to text
2175d 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 74 6f for returning to
2175e 20 74 68 65 20 75 73 65 72 20 28 69 2e 65 2e 20 the user (i.e.
2175f 76 69 61 0d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f via..** sqlite3_
21760 76 61 6c 75 65 5f 74 65 78 74 28 29 29 2c 20 6f value_text()), o
21761 72 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 r for ensuring t
21762 68 61 74 20 76 61 6c 75 65 73 20 74 6f 20 62 65 hat values to be
21763 20 75 73 65 64 20 61 73 20 62 74 72 65 65 0d 0a used as btree..
21764 2a 2a 20 6b 65 79 73 20 61 72 65 20 73 74 72 69 ** keys are stri
21765 6e 67 73 2e 20 49 6e 20 74 68 65 20 66 6f 72 6d ngs. In the form
21766 65 72 20 63 61 73 65 20 61 20 4e 55 4c 4c 20 70 er case a NULL p
21767 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e ointer is return
21768 65 64 20 74 68 65 0d 0a 2a 2a 20 75 73 65 72 20 ed the..** user
21769 61 6e 64 20 74 68 65 20 6c 61 74 65 72 20 69 73 and the later is
2176a 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 72 6f an internal pro
2176b 67 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 2e 0d gramming error..
2176c 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 .*/..SQLITE_PRIV
2176d 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 ATE int sqlite3V
2176e 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 dbeMemStringify(
2176f 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 65 Mem *pMem, int e
21770 6e 63 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d nc){.. int rc =
21771 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 SQLITE_OK;.. i
21772 6e 74 20 66 67 20 3d 20 70 4d 65 6d 2d 3e 66 6c nt fg = pMem->fl
21773 61 67 73 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 6e ags;.. const in
21774 74 20 6e 42 79 74 65 20 3d 20 33 32 3b 0d 0a 0d t nByte = 32;...
21775 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d . assert( pMem-
21776 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 >db==0 || sqlite
21777 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 3_mutex_held(pMe
21778 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b m->db->mutex) );
21779 0d 0a 20 20 61 73 73 65 72 74 28 20 21 28 66 67 .. assert( !(fg
2177a 26 4d 45 4d 5f 5a 65 72 6f 29 20 29 3b 0d 0a 20 &MEM_Zero) );..
2177b 20 61 73 73 65 72 74 28 20 21 28 66 67 26 28 4d assert( !(fg&(M
2177c 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 EM_Str|MEM_Blob)
2177d 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 ) );.. assert(
2177e 66 67 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f fg&(MEM_Int|MEM_
2177f 52 65 61 6c 29 20 29 3b 0d 0a 20 20 61 73 73 65 Real) );.. asse
21780 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 rt( (pMem->flags
21781 26 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 &MEM_RowSet)==0
21782 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 45 49 );.. assert( EI
21783 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 GHT_BYTE_ALIGNME
21784 4e 54 28 70 4d 65 6d 29 20 29 3b 0d 0a 0d 0a 0d NT(pMem) );.....
21785 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 . if( sqlite3Vd
21786 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 beMemGrow(pMem,
21787 6e 42 79 74 65 2c 20 30 29 20 29 7b 0d 0a 20 20 nByte, 0) ){..
21788 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
21789 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 NOMEM;.. }....
2178a 20 2f 2a 20 46 6f 72 20 61 20 52 65 61 6c 20 6f /* For a Real o
2178b 72 20 49 6e 74 65 67 65 72 2c 20 75 73 65 20 73 r Integer, use s
2178c 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 qlite3_mprintf()
2178d 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 to produce the
2178e 55 54 46 2d 38 0d 0a 20 20 2a 2a 20 73 74 72 69 UTF-8.. ** stri
2178f 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ng representatio
21790 6e 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 n of the value.
21791 54 68 65 6e 2c 20 69 66 20 74 68 65 20 72 65 71 Then, if the req
21792 75 69 72 65 64 20 65 6e 63 6f 64 69 6e 67 0d 0a uired encoding..
21793 20 20 2a 2a 20 69 73 20 55 54 46 2d 31 36 6c 65 ** is UTF-16le
21794 20 6f 72 20 55 54 46 2d 31 36 62 65 20 64 6f 20 or UTF-16be do
21795 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 0d 0a a translation...
21796 20 20 2a 2a 20 0d 0a 20 20 2a 2a 20 46 49 58 20 ** .. ** FIX
21797 4d 45 3a 20 49 74 20 77 6f 75 6c 64 20 62 65 20 ME: It would be
21798 62 65 74 74 65 72 20 69 66 20 73 71 6c 69 74 65 better if sqlite
21799 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 63 6f 75 3_snprintf() cou
2179a 6c 64 20 64 6f 20 55 54 46 2d 31 36 2e 0d 0a 20 ld do UTF-16...
2179b 20 2a 2f 0d 0a 20 20 69 66 28 20 66 67 20 26 20 */.. if( fg &
2179c 4d 45 4d 5f 49 6e 74 20 29 7b 0d 0a 20 20 20 20 MEM_Int ){..
2179d 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
2179e 28 6e 42 79 74 65 2c 20 70 4d 65 6d 2d 3e 7a 2c (nByte, pMem->z,
2179f 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 "%lld", pMem->u
217a0 2e 69 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a .i);.. }else{..
217a1 20 20 20 20 61 73 73 65 72 74 28 20 66 67 20 26 assert( fg &
217a2 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0d 0a 20 20 MEM_Real );..
217a3 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
217a4 74 66 28 6e 42 79 74 65 2c 20 70 4d 65 6d 2d 3e tf(nByte, pMem->
217a5 7a 2c 20 22 25 21 2e 31 35 67 22 2c 20 70 4d 65 z, "%!.15g", pMe
217a6 6d 2d 3e 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 m->r);.. }.. p
217a7 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 Mem->n = sqlite3
217a8 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a Strlen30(pMem->z
217a9 29 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 );.. pMem->enc
217aa 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0d 0a = SQLITE_UTF8;..
217ab 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d pMem->flags |=
217ac 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 MEM_Str|MEM_Ter
217ad 6d 3b 0d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 m;.. sqlite3Vdb
217ae 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 eChangeEncoding(
217af 70 4d 65 6d 2c 20 65 6e 63 29 3b 0d 0a 20 20 72 pMem, enc);.. r
217b0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a eturn rc;..}....
217b1 2f 2a 0d 0a 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 /*..** Memory ce
217b2 6c 6c 20 70 4d 65 6d 20 63 6f 6e 74 61 69 6e 73 ll pMem contains
217b3 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 the context of
217b4 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e an aggregate fun
217b5 63 74 69 6f 6e 2e 0d 0a 2a 2a 20 54 68 69 73 20 ction...** This
217b6 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 routine calls th
217b7 65 20 66 69 6e 61 6c 69 7a 65 20 6d 65 74 68 6f e finalize metho
217b8 64 20 66 6f 72 20 74 68 61 74 20 66 75 6e 63 74 d for that funct
217b9 69 6f 6e 2e 20 20 54 68 65 0d 0a 2a 2a 20 72 65 ion. The..** re
217ba 73 75 6c 74 20 6f 66 20 74 68 65 20 61 67 67 72 sult of the aggr
217bb 65 67 61 74 65 20 69 73 20 73 74 6f 72 65 64 20 egate is stored
217bc 62 61 63 6b 20 69 6e 74 6f 20 70 4d 65 6d 2e 0d back into pMem..
217bd 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 .**..** Return S
217be 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 QLITE_ERROR if t
217bf 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 72 65 70 he finalizer rep
217c0 6f 72 74 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 orts an error.
217c1 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a 20 6f 74 SQLITE_OK..** ot
217c2 68 65 72 77 69 73 65 2e 0d 0a 2a 2f 0d 0a 53 51 herwise...*/..SQ
217c3 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 LITE_PRIVATE int
217c4 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 sqlite3VdbeMemF
217c5 69 6e 61 6c 69 7a 65 28 4d 65 6d 20 2a 70 4d 65 inalize(Mem *pMe
217c6 6d 2c 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e m, FuncDef *pFun
217c7 63 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 c){.. int rc =
217c8 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 SQLITE_OK;.. if
217c9 28 20 41 4c 57 41 59 53 28 70 46 75 6e 63 20 26 ( ALWAYS(pFunc &
217ca 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 & pFunc->xFinali
217cb 7a 65 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 ze) ){.. sqli
217cc 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b te3_context ctx;
217cd 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 .. assert( (p
217ce 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
217cf 5f 4e 75 6c 6c 29 21 3d 30 20 7c 7c 20 70 46 75 _Null)!=0 || pFu
217d0 6e 63 3d 3d 70 4d 65 6d 2d 3e 75 2e 70 44 65 66 nc==pMem->u.pDef
217d1 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 );.. assert(
217d2 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 pMem->db==0 ||
217d3 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
217d4 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 ld(pMem->db->mut
217d5 65 78 29 20 29 3b 0d 0a 20 20 20 20 6d 65 6d 73 ex) );.. mems
217d6 65 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 et(&ctx, 0, size
217d7 6f 66 28 63 74 78 29 29 3b 0d 0a 20 20 20 20 63 of(ctx));.. c
217d8 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d tx.s.flags = MEM
217d9 5f 4e 75 6c 6c 3b 0d 0a 20 20 20 20 63 74 78 2e _Null;.. ctx.
217da 73 2e 64 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b s.db = pMem->db;
217db 0d 0a 20 20 20 20 63 74 78 2e 70 4d 65 6d 20 3d .. ctx.pMem =
217dc 20 70 4d 65 6d 3b 0d 0a 20 20 20 20 63 74 78 2e pMem;.. ctx.
217dd 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0d 0a pFunc = pFunc;..
217de 20 20 20 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 pFunc->xFina
217df 6c 69 7a 65 28 26 63 74 78 29 3b 20 2f 2a 20 49 lize(&ctx); /* I
217e0 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 MP: R-24505-2323
217e1 30 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 0 */.. assert
217e2 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 ( 0==(pMem->flag
217e3 73 26 4d 45 4d 5f 44 79 6e 29 20 26 26 20 21 70 s&MEM_Dyn) && !p
217e4 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0d 0a 20 20 Mem->xDel );..
217e5 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
217e6 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e pMem->db, pMem->
217e7 7a 4d 61 6c 6c 6f 63 29 3b 0d 0a 20 20 20 20 6d zMalloc);.. m
217e8 65 6d 63 70 79 28 70 4d 65 6d 2c 20 26 63 74 78 emcpy(pMem, &ctx
217e9 2e 73 2c 20 73 69 7a 65 6f 66 28 63 74 78 2e 73 .s, sizeof(ctx.s
217ea 29 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 63 74 ));.. rc = ct
217eb 78 2e 69 73 45 72 72 6f 72 3b 0d 0a 20 20 7d 0d x.isError;.. }.
217ec 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
217ed 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 74 68 ..../*..** If th
217ee 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f e memory cell co
217ef 6e 74 61 69 6e 73 20 61 20 73 74 72 69 6e 67 20 ntains a string
217f0 76 61 6c 75 65 20 74 68 61 74 20 6d 75 73 74 20 value that must
217f1 62 65 20 66 72 65 65 64 20 62 79 0d 0a 2a 2a 20 be freed by..**
217f2 69 6e 76 6f 6b 69 6e 67 20 61 6e 20 65 78 74 65 invoking an exte
217f3 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 2c 20 66 rnal callback, f
217f4 72 65 65 20 69 74 20 6e 6f 77 2e 20 43 61 6c 6c ree it now. Call
217f5 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f ing this functio
217f6 6e 0d 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 66 n..** does not f
217f7 72 65 65 20 61 6e 79 20 4d 65 6d 2e 7a 4d 61 6c ree any Mem.zMal
217f8 6c 6f 63 20 62 75 66 66 65 72 2e 0d 0a 2a 2f 0d loc buffer...*/.
217f9 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
217fa 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
217fb 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e MemReleaseExtern
217fc 61 6c 28 4d 65 6d 20 2a 70 29 7b 0d 0a 20 20 61 al(Mem *p){.. a
217fd 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 ssert( p->db==0
217fe 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 || sqlite3_mutex
217ff 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 _held(p->db->mut
21800 65 78 29 20 29 3b 0d 0a 20 20 69 66 28 20 70 2d ex) );.. if( p-
21801 3e 66 6c 61 67 73 26 4d 45 4d 5f 41 67 67 20 29 >flags&MEM_Agg )
21802 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 {.. sqlite3Vd
21803 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 2c beMemFinalize(p,
21804 20 70 2d 3e 75 2e 70 44 65 66 29 3b 0d 0a 20 20 p->u.pDef);..
21805 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c assert( (p->fl
21806 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 29 3d 3d ags & MEM_Agg)==
21807 30 20 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 0 );.. sqlite
21808 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
21809 70 29 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 p);.. }else if(
2180a 20 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 p->flags&MEM_Dy
2180b 6e 20 26 26 20 70 2d 3e 78 44 65 6c 20 29 7b 0d n && p->xDel ){.
2180c 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d . assert( (p-
2180d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 >flags&MEM_RowSe
2180e 74 29 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 70 2d t)==0 );.. p-
2180f 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a 29 70 2d >xDel((void *)p-
21810 3e 7a 29 3b 0d 0a 20 20 20 20 70 2d 3e 78 44 65 >z);.. p->xDe
21811 6c 20 3d 20 30 3b 0d 0a 20 20 7d 65 6c 73 65 20 l = 0;.. }else
21812 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 4d 45 4d if( p->flags&MEM
21813 5f 52 6f 77 53 65 74 20 29 7b 0d 0a 20 20 20 20 _RowSet ){..
21814 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 sqlite3RowSetCle
21815 61 72 28 70 2d 3e 75 2e 70 52 6f 77 53 65 74 29 ar(p->u.pRowSet)
21816 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 ;.. }else if( p
21817 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d ->flags&MEM_Fram
21818 65 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 e ){.. sqlite
21819 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 3VdbeMemSetNull(
2181a 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f p);.. }..}..../
2181b 2a 0d 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e *..** Release an
2181c 79 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 y memory held by
2181d 20 74 68 65 20 4d 65 6d 2e 20 54 68 69 73 20 6d the Mem. This m
2181e 61 79 20 6c 65 61 76 65 20 74 68 65 20 4d 65 6d ay leave the Mem
2181f 20 69 6e 20 61 6e 0d 0a 2a 2a 20 69 6e 63 6f 6e in an..** incon
21820 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 66 sistent state, f
21821 6f 72 20 65 78 61 6d 70 6c 65 20 77 69 74 68 20 or example with
21822 28 4d 65 6d 2e 7a 3d 3d 30 29 20 61 6e 64 0d 0a (Mem.z==0) and..
21823 2a 2a 20 28 4d 65 6d 2e 74 79 70 65 3d 3d 53 51 ** (Mem.type==SQ
21824 4c 49 54 45 5f 54 45 58 54 29 2e 0d 0a 2a 2f 0d LITE_TEXT)...*/.
21825 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 .SQLITE_PRIVATE
21826 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
21827 4d 65 6d 52 65 6c 65 61 73 65 28 4d 65 6d 20 2a MemRelease(Mem *
21828 70 29 7b 0d 0a 20 20 56 64 62 65 4d 65 6d 52 65 p){.. VdbeMemRe
21829 6c 65 61 73 65 28 70 29 3b 0d 0a 20 20 73 71 6c lease(p);.. sql
2182a 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 ite3DbFree(p->db
2182b 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0d 0a , p->zMalloc);..
2182c 20 20 70 2d 3e 7a 20 3d 20 30 3b 0d 0a 20 20 70 p->z = 0;.. p
2182d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d 0a ->zMalloc = 0;..
2182e 20 20 70 2d 3e 78 44 65 6c 20 3d 20 30 3b 0d 0a p->xDel = 0;..
2182f 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 }..../*..** Conv
21830 65 72 74 20 61 20 36 34 2d 62 69 74 20 49 45 45 ert a 64-bit IEE
21831 45 20 64 6f 75 62 6c 65 20 69 6e 74 6f 20 61 20 E double into a
21832 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 64-bit signed in
21833 74 65 67 65 72 2e 0d 0a 2a 2a 20 49 66 20 74 68 teger...** If th
21834 65 20 64 6f 75 62 6c 65 20 69 73 20 74 6f 6f 20 e double is too
21835 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 20 30 78 large, return 0x
21836 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 8000000000000000
21837 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4d 6f 73 74 20 73 ...**..** Most s
21838 79 73 74 65 6d 73 20 61 70 70 65 61 72 20 74 6f ystems appear to
21839 20 64 6f 20 74 68 69 73 20 73 69 6d 70 6c 79 20 do this simply
2183a 62 79 20 61 73 73 69 67 6e 69 6e 67 0d 0a 2a 2a by assigning..**
2183b 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 77 variables and w
2183c 69 74 68 6f 75 74 20 74 68 65 20 65 78 74 72 61 ithout the extra
2183d 20 72 61 6e 67 65 20 74 65 73 74 73 2e 20 20 42 range tests. B
2183e 75 74 0d 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 ut..** there are
2183f 20 72 65 70 6f 72 74 73 20 74 68 61 74 20 77 69 reports that wi
21840 6e 64 6f 77 73 20 74 68 72 6f 77 73 20 61 6e 20 ndows throws an
21841 65 78 70 65 63 74 69 6f 6e 0d 0a 2a 2a 20 69 66 expection..** if
21842 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f the floating po
21843 69 6e 74 20 76 61 6c 75 65 20 69 73 20 6f 75 74 int value is out
21844 20 6f 66 20 72 61 6e 67 65 2e 20 28 53 65 65 20 of range. (See
21845 74 69 63 6b 65 74 20 23 32 38 38 30 2e 29 0d 0a ticket #2880.)..
21846 2a 2a 20 42 65 63 61 75 73 65 20 77 65 20 64 6f ** Because we do
21847 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 not completely
21848 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 70 understand the p
21849 72 6f 62 6c 65 6d 2c 20 77 65 20 77 69 6c 6c 0d roblem, we will.
2184a 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 63 6f 6e .** take the con
2184b 73 65 72 76 61 74 69 76 65 20 61 70 70 72 6f 61 servative approa
2184c 63 68 20 61 6e 64 20 61 6c 77 61 79 73 20 64 6f ch and always do
2184d 20 72 61 6e 67 65 20 74 65 73 74 73 0d 0a 2a 2a range tests..**
2184e 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 before attempti
2184f 6e 67 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f ng the conversio
21850 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 n...*/..static i
21851 36 34 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 64 doubleToInt64
21852 28 64 6f 75 62 6c 65 20 72 29 7b 0d 0a 23 69 66 (double r){..#if
21853 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
21854 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0d 0a FLOATING_POINT..
21855 20 20 2f 2a 20 57 68 65 6e 20 66 6c 6f 61 74 69 /* When floati
21856 6e 67 2d 70 6f 69 6e 74 20 69 73 20 6f 6d 69 74 ng-point is omit
21857 74 65 64 2c 20 64 6f 75 62 6c 65 20 61 6e 64 20 ted, double and
21858 69 6e 74 36 34 20 61 72 65 20 74 68 65 20 73 61 int64 are the sa
21859 6d 65 20 74 68 69 6e 67 20 2a 2f 0d 0a 20 20 72 me thing */.. r
2185a 65 74 75 72 6e 20 72 3b 0d 0a 23 65 6c 73 65 0d eturn r;..#else.
2185b 0a 20 20 2f 2a 0d 0a 20 20 2a 2a 20 4d 61 6e 79 . /*.. ** Many
2185c 20 63 6f 6d 70 69 6c 65 72 73 20 77 65 20 65 6e compilers we en
2185d 63 6f 75 6e 74 65 72 20 64 6f 20 6e 6f 74 20 64 counter do not d
2185e 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 efine constants
2185f 66 6f 72 20 74 68 65 0d 0a 20 20 2a 2a 20 6d 69 for the.. ** mi
21860 6e 69 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 nimum and maximu
21861 6d 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 m 64-bit integer
21862 73 2c 20 6f 72 20 74 68 65 79 20 64 65 66 69 6e s, or they defin
21863 65 20 74 68 65 6d 0d 0a 20 20 2a 2a 20 69 6e 63 e them.. ** inc
21864 6f 6e 73 69 73 74 65 6e 74 6c 79 2e 20 20 41 6e onsistently. An
21865 64 20 6d 61 6e 79 20 64 6f 20 6e 6f 74 20 75 6e d many do not un
21866 64 65 72 73 74 61 6e 64 20 74 68 65 20 22 4c 4c derstand the "LL
21867 22 20 6e 6f 74 61 74 69 6f 6e 2e 0d 0a 20 20 2a " notation... *
21868 2a 20 53 6f 20 77 65 20 64 65 66 69 6e 65 20 6f * So we define o
21869 75 72 20 6f 77 6e 20 73 74 61 74 69 63 20 63 6f ur own static co
2186a 6e 73 74 61 6e 74 73 20 68 65 72 65 20 75 73 69 nstants here usi
2186b 6e 67 20 6e 6f 74 68 69 6e 67 0d 0a 20 20 2a 2a ng nothing.. **
2186c 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 20 33 larger than a 3
2186d 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 63 6f 2-bit integer co
2186e 6e 73 74 61 6e 74 2e 0d 0a 20 20 2a 2f 0d 0a 20 nstant... */..
2186f 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 36 static const i6
21870 34 20 6d 61 78 49 6e 74 20 3d 20 4c 41 52 47 45 4 maxInt = LARGE
21871 53 54 5f 49 4e 54 36 34 3b 0d 0a 20 20 73 74 61 ST_INT64;.. sta
21872 74 69 63 20 63 6f 6e 73 74 20 69 36 34 20 6d 69 tic const i64 mi
21873 6e 49 6e 74 20 3d 20 53 4d 41 4c 4c 45 53 54 5f nInt = SMALLEST_
21874 49 4e 54 36 34 3b 0d 0a 0d 0a 20 20 69 66 28 20 INT64;.... if(
21875 72 3c 28 64 6f 75 62 6c 65 29 6d 69 6e 49 6e 74 r<(double)minInt
21876 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 ){.. return
21877 6d 69 6e 49 6e 74 3b 0d 0a 20 20 7d 65 6c 73 65 minInt;.. }else
21878 20 69 66 28 20 72 3e 28 64 6f 75 62 6c 65 29 6d if( r>(double)m
21879 61 78 49 6e 74 20 29 7b 0d 0a 20 20 20 20 2f 2a axInt ){.. /*
2187a 20 6d 69 6e 49 6e 74 20 69 73 20 63 6f 72 72 65 minInt is corre
2187b 63 74 20 68 65 72 65 20 2d 20 6e 6f 74 20 6d 61 ct here - not ma
2187c 78 49 6e 74 2e 20 20 49 74 20 74 75 72 6e 73 20 xInt. It turns
2187d 6f 75 74 20 74 68 61 74 20 61 73 73 69 67 6e 69 out that assigni
2187e 6e 67 0d 0a 20 20 20 20 2a 2a 20 61 20 76 65 72 ng.. ** a ver
2187f 79 20 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65 y large positive
21880 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 69 6e number to an in
21881 74 65 67 65 72 20 72 65 73 75 6c 74 73 20 69 6e teger results in
21882 20 61 20 76 65 72 79 20 6c 61 72 67 65 0d 0a 20 a very large..
21883 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 20 69 ** negative i
21884 6e 74 65 67 65 72 2e 20 20 54 68 69 73 20 6d 61 nteger. This ma
21885 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2c 20 62 75 kes no sense, bu
21886 74 20 69 74 20 69 73 20 77 68 61 74 20 78 38 36 t it is what x86
21887 20 68 61 72 64 77 61 72 65 0d 0a 20 20 20 20 2a hardware.. *
21888 2a 20 64 6f 65 73 20 73 6f 20 66 6f 72 20 63 6f * does so for co
21889 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 77 mpatibility we w
2188a 69 6c 6c 20 64 6f 20 74 68 65 20 73 61 6d 65 20 ill do the same
2188b 69 6e 20 73 6f 66 74 77 61 72 65 2e 20 2a 2f 0d in software. */.
2188c 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 69 6e 49 . return minI
2188d 6e 74 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 nt;.. }else{..
2188e 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 72 return (i64)r
2188f 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a ;.. }..#endif..
21890 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 }..../*..** Retu
21891 72 6e 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 rn some kind of
21892 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 68 integer value wh
21893 69 63 68 20 69 73 20 74 68 65 20 62 65 73 74 20 ich is the best
21894 77 65 20 63 61 6e 20 64 6f 0d 0a 2a 2a 20 61 74 we can do..** at
21895 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 representing th
21896 65 20 76 61 6c 75 65 20 74 68 61 74 20 2a 70 4d e value that *pM
21897 65 6d 20 64 65 73 63 72 69 62 65 73 20 61 73 20 em describes as
21898 61 6e 20 69 6e 74 65 67 65 72 2e 0d 0a 2a 2a 20 an integer...**
21899 49 66 20 70 4d 65 6d 20 69 73 20 61 6e 20 69 6e If pMem is an in
2189a 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 teger, then the
2189b 76 61 6c 75 65 20 69 73 20 65 78 61 63 74 2e 20 value is exact.
2189c 20 49 66 20 70 4d 65 6d 20 69 73 0d 0a 2a 2a 20 If pMem is..**
2189d 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 a floating-point
2189e 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 then the value
2189f 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 returned is the
218a0 69 6e 74 65 67 65 72 20 70 61 72 74 2e 0d 0a 2a integer part...*
218a1 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61 20 73 * If pMem is a s
218a2 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 tring or blob, t
218a3 68 65 6e 20 77 65 20 6d 61 6b 65 20 61 6e 20 61 hen we make an a
218a4 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 ttempt to conver
218a5 74 0d 0a 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 t..** it into a
218a6 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75 integer and retu
218a7 72 6e 20 74 68 61 74 2e 20 20 49 66 20 70 4d 65 rn that. If pMe
218a8 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 0d m represents an.
218a9 0a 2a 2a 20 61 6e 20 53 51 4c 2d 4e 55 4c 4c 20 .** an SQL-NULL
218aa 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 20 30 2e value, return 0.
218ab 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 70 4d 65 6d ..**..** If pMem
218ac 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 73 74 represents a st
218ad 72 69 6e 67 20 76 61 6c 75 65 2c 20 69 74 73 20 ring value, its
218ae 65 6e 63 6f 64 69 6e 67 20 6d 69 67 68 74 20 62 encoding might b
218af 65 20 63 68 61 6e 67 65 64 2e 0d 0a 2a 2f 0d 0a e changed...*/..
218b0 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 SQLITE_PRIVATE i
218b1 36 34 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 64 sqlite3VdbeIn
218b2 74 56 61 6c 75 65 28 4d 65 6d 20 2a 70 4d 65 6d tValue(Mem *pMem
218b3 29 7b 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b ){.. int flags;
218b4 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d .. assert( pMem
218b5 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 ->db==0 || sqlit
218b6 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d e3_mutex_held(pM
218b7 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 em->db->mutex) )
218b8 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 ;.. assert( EIG
218b9 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
218ba 54 28 70 4d 65 6d 29 20 29 3b 0d 0a 20 20 66 6c T(pMem) );.. fl
218bb 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 ags = pMem->flag
218bc 73 3b 0d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 s;.. if( flags
218bd 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0d 0a 20 20 & MEM_Int ){..
218be 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 75 return pMem->u
218bf 2e 69 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 .i;.. }else if(
218c0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 flags & MEM_Rea
218c1 6c 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72 6e l ){.. return
218c2 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 70 doubleToInt64(p
218c3 4d 65 6d 2d 3e 72 29 3b 0d 0a 20 20 7d 65 6c 73 Mem->r);.. }els
218c4 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 4d e if( flags & (M
218c5 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 EM_Str|MEM_Blob)
218c6 20 29 7b 0d 0a 20 20 20 20 69 36 34 20 76 61 6c ){.. i64 val
218c7 75 65 20 3d 20 30 3b 0d 0a 20 20 20 20 61 73 73 ue = 0;.. ass
218c8 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 20 7c 7c 20 ert( pMem->z ||
218c9 70 4d 65 6d 2d 3e 6e 3d 3d 30 20 29 3b 0d 0a 20 pMem->n==0 );..
218ca 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 testcase( pMe
218cb 6d 2d 3e 7a 3d 3d 30 20 29 3b 0d 0a 20 20 20 20 m->z==0 );..
218cc 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70 4d sqlite3Atoi64(pM
218cd 65 6d 2d 3e 7a 2c 20 26 76 61 6c 75 65 2c 20 70 em->z, &value, p
218ce 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e Mem->n, pMem->en
218cf 63 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 c);.. return
218d0 76 61 6c 75 65 3b 0d 0a 20 20 7d 65 6c 73 65 7b value;.. }else{
218d1 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d .. return 0;.
218d2 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a . }..}..../*..*
218d3 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 65 73 * Return the bes
218d4 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e t representation
218d5 20 6f 66 20 70 4d 65 6d 20 74 68 61 74 20 77 65 of pMem that we
218d6 20 63 61 6e 20 67 65 74 20 69 6e 74 6f 20 61 0d can get into a.
218d7 0a 2a 2a 20 64 6f 75 62 6c 65 2e 20 20 49 66 20 .** double. If
218d8 70 4d 65 6d 20 69 73 20 61 6c 72 65 61 64 79 20 pMem is already
218d9 61 20 64 6f 75 62 6c 65 20 6f 72 20 61 6e 20 69 a double or an i
218da 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 69 nteger, return i
218db 74 73 0d 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 49 ts..** value. I
218dc 66 20 69 74 20 69 73 20 61 20 73 74 72 69 6e 67 f it is a string
218dd 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f or blob, try to
218de 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 convert it to a
218df 20 64 6f 75 62 6c 65 2e 0d 0a 2a 2a 20 49 66 20 double...** If
218e0 69 74 20 69 73 20 61 20 4e 55 4c 4c 2c 20 72 65 it is a NULL, re
218e1 74 75 72 6e 20 30 2e 30 2e 0d 0a 2a 2f 0d 0a 53 turn 0.0...*/..S
218e2 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 64 6f QLITE_PRIVATE do
218e3 75 62 6c 65 20 73 71 6c 69 74 65 33 56 64 62 65 uble sqlite3Vdbe
218e4 52 65 61 6c 56 61 6c 75 65 28 4d 65 6d 20 2a 70 RealValue(Mem *p
218e5 4d 65 6d 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 Mem){.. assert(
218e6 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 pMem->db==0 ||
218e7 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
218e8 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 ld(pMem->db->mut
218e9 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 ex) );.. assert
218ea 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 ( EIGHT_BYTE_ALI
218eb 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0d GNMENT(pMem) );.
218ec 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 . if( pMem->fla
218ed 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b gs & MEM_Real ){
218ee 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 .. return pMe
218ef 6d 2d 3e 72 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 m->r;.. }else i
218f0 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 f( pMem->flags &
218f1 20 4d 45 4d 5f 49 6e 74 20 29 7b 0d 0a 20 20 20 MEM_Int ){..
218f2 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29 return (double)
218f3 70 4d 65 6d 2d 3e 75 2e 69 3b 0d 0a 20 20 7d 65 pMem->u.i;.. }e
218f4 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c lse if( pMem->fl
218f5 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d ags & (MEM_Str|M
218f6 45 4d 5f 42 6c 6f 62 29 20 29 7b 0d 0a 20 20 20 EM_Blob) ){..
218f7 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e /* (double)0 In
218f8 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f case of SQLITE_
218f9 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f OMIT_FLOATING_PO
218fa 49 4e 54 2e 2e 2e 20 2a 2f 0d 0a 20 20 20 20 64 INT... */.. d
218fb 6f 75 62 6c 65 20 76 61 6c 20 3d 20 28 64 6f 75 ouble val = (dou
218fc 62 6c 65 29 30 3b 0d 0a 20 20 20 20 73 71 6c 69 ble)0;.. sqli
218fd 74 65 33 41 74 6f 46 28 70 4d 65 6d 2d 3e 7a 2c te3AtoF(pMem->z,
218fe 20 26 76 61 6c 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 &val, pMem->n,
218ff 70 4d 65 6d 2d 3e 65 6e 63 29 3b 0d 0a 20 20 20 pMem->enc);..
21900 20 72 65 74 75 72 6e 20 76 61 6c 3b 0d 0a 20 20 return val;..
21901 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 28 }else{.. /* (
21902 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 double)0 In case
21903 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f of SQLITE_OMIT_
21904 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e FLOATING_POINT..
21905 2e 20 2a 2f 0d 0a 20 20 20 20 72 65 74 75 72 6e . */.. return
21906 20 28 64 6f 75 62 6c 65 29 30 3b 0d 0a 20 20 7d (double)0;.. }
21907 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 ..}..../*..** Th
21908 65 20 4d 45 4d 20 73 74 72 75 63 74 75 72 65 20 e MEM structure
21909 69 73 20 61 6c 72 65 61 64 79 20 61 20 4d 45 4d is already a MEM
2190a 5f 52 65 61 6c 2e 20 20 54 72 79 20 74 6f 20 61 _Real. Try to a
2190b 6c 73 6f 20 6d 61 6b 65 20 69 74 20 61 0d 0a 2a lso make it a..*
2190c 2a 20 4d 45 4d 5f 49 6e 74 20 69 66 20 77 65 20 * MEM_Int if we
2190d 63 61 6e 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 can...*/..SQLITE
2190e 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 _PRIVATE void sq
2190f 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 lite3VdbeInteger
21910 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 4d Affinity(Mem *pM
21911 65 6d 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20 em){.. assert(
21912 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pMem->flags & ME
21913 4d 5f 52 65 61 6c 20 29 3b 0d 0a 20 20 61 73 73 M_Real );.. ass
21914 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 ert( (pMem->flag
21915 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d s & MEM_RowSet)=
21916 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 =0 );.. assert(
21917 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 pMem->db==0 ||
21918 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
21919 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 ld(pMem->db->mut
2191a 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 ex) );.. assert
2191b 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 ( EIGHT_BYTE_ALI
2191c 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0d GNMENT(pMem) );.
2191d 0a 0d 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d ... pMem->u.i =
2191e 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 70 doubleToInt64(p
2191f 4d 65 6d 2d 3e 72 29 3b 0d 0a 0d 0a 20 20 2f 2a Mem->r);.... /*
21920 20 4f 6e 6c 79 20 6d 61 72 6b 20 74 68 65 20 76 Only mark the v
21921 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 alue as an integ
21922 65 72 20 69 66 0d 0a 20 20 2a 2a 0d 0a 20 20 2a er if.. **.. *
21923 2a 20 20 20 20 28 31 29 20 74 68 65 20 72 6f 75 * (1) the rou
21924 6e 64 2d 74 72 69 70 20 63 6f 6e 76 65 72 73 69 nd-trip conversi
21925 6f 6e 20 72 65 61 6c 2d 3e 69 6e 74 2d 3e 72 65 on real->int->re
21926 61 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 61 al is a no-op, a
21927 6e 64 0d 0a 20 20 2a 2a 20 20 20 20 28 32 29 20 nd.. ** (2)
21928 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 6e The integer is n
21929 65 69 74 68 65 72 20 74 68 65 20 6c 61 72 67 65 either the large
2192a 73 74 20 6e 6f 72 20 74 68 65 20 73 6d 61 6c 6c st nor the small
2192b 65 73 74 0d 0a 20 20 2a 2a 20 20 20 20 20 20 20 est.. **
2192c 20 70 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65 possible intege
2192d 72 20 28 74 69 63 6b 65 74 20 23 33 39 32 32 29 r (ticket #3922)
2192e 0d 0a 20 20 2a 2a 0d 0a 20 20 2a 2a 20 54 68 65 .. **.. ** The
2192f 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 second and thir
21930 64 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 66 d terms in the f
21931 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 ollowing conditi
21932 6f 6e 61 6c 20 65 6e 66 6f 72 63 65 73 0d 0a 20 onal enforces..
21933 20 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 63 ** the second c
21934 6f 6e 64 69 74 69 6f 6e 20 75 6e 64 65 72 20 74 ondition under t
21935 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 he assumption th
21936 61 74 20 61 64 64 69 74 69 6f 6e 20 6f 76 65 72 at addition over
21937 66 6c 6f 77 20 63 61 75 73 65 73 0d 0a 20 20 2a flow causes.. *
21938 2a 20 76 61 6c 75 65 73 20 74 6f 20 77 72 61 70 * values to wrap
21939 20 61 72 6f 75 6e 64 2e 20 20 4f 6e 20 78 38 36 around. On x86
2193a 20 68 61 72 64 77 61 72 65 2c 20 74 68 65 20 74 hardware, the t
2193b 68 69 72 64 20 74 65 72 6d 20 69 73 20 61 6c 77 hird term is alw
2193c 61 79 73 0d 0a 20 20 2a 2a 20 74 72 75 65 20 61 ays.. ** true a
2193d 6e 64 20 63 6f 75 6c 64 20 62 65 20 6f 6d 69 74 nd could be omit
2193e 74 65 64 2e 20 20 42 75 74 20 77 65 20 6c 65 61 ted. But we lea
2193f 76 65 20 69 74 20 69 6e 20 62 65 63 61 75 73 65 ve it in because
21940 20 6f 74 68 65 72 0d 0a 20 20 2a 2a 20 61 72 63 other.. ** arc
21941 68 69 74 65 63 74 75 72 65 73 20 6d 69 67 68 74 hitectures might
21942 20 62 65 68 61 76 65 20 64 69 66 66 65 72 65 6e behave differen
21943 74 6c 79 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 tly... */.. if
21944 28 20 70 4d 65 6d 2d 3e 72 3d 3d 28 64 6f 75 62 ( pMem->r==(doub
21945 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 20 26 26 20 le)pMem->u.i &&
21946 70 4d 65 6d 2d 3e 75 2e 69 3e 53 4d 41 4c 4c 45 pMem->u.i>SMALLE
21947 53 54 5f 49 4e 54 36 34 0d 0a 20 20 20 20 20 20 ST_INT64..
21948 26 26 20 41 4c 57 41 59 53 28 70 4d 65 6d 2d 3e && ALWAYS(pMem->
21949 75 2e 69 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 u.i<LARGEST_INT6
2194a 34 29 20 29 7b 0d 0a 20 20 20 20 70 4d 65 6d 2d 4) ){.. pMem-
2194b 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e >flags |= MEM_In
2194c 74 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a t;.. }..}..../*
2194d 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d 65 ..** Convert pMe
2194e 6d 20 74 6f 20 74 79 70 65 20 69 6e 74 65 67 65 m to type intege
2194f 72 2e 20 20 49 6e 76 61 6c 69 64 61 74 65 20 61 r. Invalidate a
21950 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65 73 65 ny prior represe
21951 6e 74 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d 0a 53 ntations...*/..S
21952 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e QLITE_PRIVATE in
21953 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d t sqlite3VdbeMem
21954 49 6e 74 65 67 65 72 69 66 79 28 4d 65 6d 20 2a Integerify(Mem *
21955 70 4d 65 6d 29 7b 0d 0a 20 20 61 73 73 65 72 74 pMem){.. assert
21956 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c ( pMem->db==0 ||
21957 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
21958 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 eld(pMem->db->mu
21959 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
2195a 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 t( (pMem->flags
2195b 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 & MEM_RowSet)==0
2195c 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 45 );.. assert( E
2195d 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d IGHT_BYTE_ALIGNM
2195e 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0d 0a 0d 0a ENT(pMem) );....
2195f 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 71 pMem->u.i = sq
21960 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 lite3VdbeIntValu
21961 65 28 70 4d 65 6d 29 3b 0d 0a 20 20 4d 65 6d 53 e(pMem);.. MemS
21962 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c etTypeFlag(pMem,
21963 20 4d 45 4d 5f 49 6e 74 29 3b 0d 0a 20 20 72 65 MEM_Int);.. re
21964 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d turn SQLITE_OK;.
21965 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e .}..../*..** Con
21966 76 65 72 74 20 70 4d 65 6d 20 73 6f 20 74 68 61 vert pMem so tha
21967 74 20 69 74 20 69 73 20 6f 66 20 74 79 70 65 20 t it is of type
21968 4d 45 4d 5f 52 65 61 6c 2e 0d 0a 2a 2a 20 49 6e MEM_Real...** In
21969 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 69 validate any pri
2196a 6f 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f or representatio
2196b 6e 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f ns...*/..SQLITE_
2196c 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
2196d 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 te3VdbeMemRealif
2196e 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0d 0a 20 y(Mem *pMem){..
2196f 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 assert( pMem->d
21970 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f b==0 || sqlite3_
21971 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d mutex_held(pMem-
21972 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d 0a >db->mutex) );..
21973 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f assert( EIGHT_
21974 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 BYTE_ALIGNMENT(p
21975 4d 65 6d 29 20 29 3b 0d 0a 0d 0a 20 20 70 4d 65 Mem) );.... pMe
21976 6d 2d 3e 72 20 3d 20 73 71 6c 69 74 65 33 56 64 m->r = sqlite3Vd
21977 62 65 52 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d beRealValue(pMem
21978 29 3b 0d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 );.. MemSetType
21979 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 52 Flag(pMem, MEM_R
2197a 65 61 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 eal);.. return
2197b 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d SQLITE_OK;..}...
2197c 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 ./*..** Convert
2197d 70 4d 65 6d 20 73 6f 20 74 68 61 74 20 69 74 20 pMem so that it
2197e 68 61 73 20 74 79 70 65 73 20 4d 45 4d 5f 52 65 has types MEM_Re
2197f 61 6c 20 6f 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 al or MEM_Int or
21980 20 62 6f 74 68 2e 0d 0a 2a 2a 20 49 6e 76 61 6c both...** Inval
21981 69 64 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 idate any prior
21982 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e representations.
21983 0d 0a 2a 2a 0d 0a 2a 2a 20 45 76 65 72 79 20 65 ..**..** Every e
21984 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f ffort is made to
21985 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6e 76 65 force the conve
21986 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 74 rsion, even if t
21987 68 65 20 69 6e 70 75 74 0d 0a 2a 2a 20 69 73 20 he input..** is
21988 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 6f a string that do
21989 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6f 6d 70 es not look comp
2198a 6c 65 74 65 6c 79 20 6c 69 6b 65 20 61 20 6e 75 letely like a nu
2198b 6d 62 65 72 2e 20 20 43 6f 6e 76 65 72 74 0d 0a mber. Convert..
2198c 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 ** as much of th
2198d 65 20 73 74 72 69 6e 67 20 61 73 20 77 65 20 63 e string as we c
2198e 61 6e 20 61 6e 64 20 69 67 6e 6f 72 65 20 74 68 an and ignore th
2198f 65 20 72 65 73 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c e rest...*/..SQL
21990 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
21991 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 sqlite3VdbeMemNu
21992 6d 65 72 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d merify(Mem *pMem
21993 29 7b 0d 0a 20 20 69 66 28 20 28 70 4d 65 6d 2d ){.. if( (pMem-
21994 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e >flags & (MEM_In
21995 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e t|MEM_Real|MEM_N
21996 75 6c 6c 29 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 ull))==0 ){..
21997 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e assert( (pMem->
21998 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f flags & (MEM_Blo
21999 62 7c 4d 45 4d 5f 53 74 72 29 29 21 3d 30 20 29 b|MEM_Str))!=0 )
2199a 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
2199b 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 Mem->db==0 || sq
2199c 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
2199d 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 (pMem->db->mutex
2199e 29 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 30 3d ) );.. if( 0=
2199f 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70 =sqlite3Atoi64(p
219a0 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 Mem->z, &pMem->u
219a1 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 .i, pMem->n, pMe
219a2 6d 2d 3e 65 6e 63 29 20 29 7b 0d 0a 20 20 20 20 m->enc) ){..
219a3 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 MemSetTypeFlag
219a4 28 70 4d 65 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b (pMem, MEM_Int);
219a5 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
219a6 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 73 71 pMem->r = sq
219a7 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c lite3VdbeRealVal
219a8 75 65 28 70 4d 65 6d 29 3b 0d 0a 20 20 20 20 20 ue(pMem);..
219a9 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 MemSetTypeFlag(
219aa 70 4d 65 6d 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b pMem, MEM_Real);
219ab 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 .. sqlite3V
219ac 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 dbeIntegerAffini
219ad 74 79 28 70 4d 65 6d 29 3b 0d 0a 20 20 20 20 7d ty(pMem);.. }
219ae 0d 0a 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 .. }.. assert(
219af 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 (pMem->flags &
219b0 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 (MEM_Int|MEM_Rea
219b1 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 21 3d 30 20 l|MEM_Null))!=0
219b2 29 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 );.. pMem->flag
219b3 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 72 7c 4d s &= ~(MEM_Str|M
219b4 45 4d 5f 42 6c 6f 62 29 3b 0d 0a 20 20 72 65 74 EM_Blob);.. ret
219b5 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
219b6 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 }..../*..** Dele
219b7 74 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20 te any previous
219b8 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20 74 68 value and set th
219b9 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 e value stored i
219ba 6e 20 2a 70 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e n *pMem to NULL.
219bb 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 ..*/..SQLITE_PRI
219bc 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65 VATE void sqlite
219bd 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 3VdbeMemSetNull(
219be 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0d 0a 20 20 69 Mem *pMem){.. i
219bf 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 f( pMem->flags &
219c0 20 4d 45 4d 5f 46 72 61 6d 65 20 29 7b 0d 0a 20 MEM_Frame ){..
219c1 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 VdbeFrame *pF
219c2 72 61 6d 65 20 3d 20 70 4d 65 6d 2d 3e 75 2e 70 rame = pMem->u.p
219c3 46 72 61 6d 65 3b 0d 0a 20 20 20 20 70 46 72 61 Frame;.. pFra
219c4 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46 me->pParent = pF
219c5 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 rame->v->pDelFra
219c6 6d 65 3b 0d 0a 20 20 20 20 70 46 72 61 6d 65 2d me;.. pFrame-
219c7 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 >v->pDelFrame =
219c8 70 46 72 61 6d 65 3b 0d 0a 20 20 7d 0d 0a 20 20 pFrame;.. }..
219c9 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 if( pMem->flags
219ca 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0d & MEM_RowSet ){.
219cb 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53 . sqlite3RowS
219cc 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d 3e 75 2e etClear(pMem->u.
219cd 70 52 6f 77 53 65 74 29 3b 0d 0a 20 20 7d 0d 0a pRowSet);.. }..
219ce 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 MemSetTypeFlag
219cf 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 (pMem, MEM_Null)
219d0 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 ;.. pMem->type
219d1 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0d 0a = SQLITE_NULL;..
219d2 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 }..../*..** Dele
219d3 74 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20 te any previous
219d4 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20 74 68 value and set th
219d5 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 61 20 e value to be a
219d6 42 4c 4f 42 20 6f 66 20 6c 65 6e 67 74 68 0d 0a BLOB of length..
219d7 2a 2a 20 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ** n containing
219d8 61 6c 6c 20 7a 65 72 6f 73 2e 0d 0a 2a 2f 0d 0a all zeros...*/..
219d9 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 SQLITE_PRIVATE v
219da 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d oid sqlite3VdbeM
219db 65 6d 53 65 74 5a 65 72 6f 42 6c 6f 62 28 4d 65 emSetZeroBlob(Me
219dc 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 6e 29 7b m *pMem, int n){
219dd 0d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d .. sqlite3VdbeM
219de 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b emRelease(pMem);
219df 0d 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 .. pMem->flags
219e0 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a = MEM_Blob|MEM_Z
219e1 65 72 6f 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 74 79 ero;.. pMem->ty
219e2 70 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 pe = SQLITE_BLOB
219e3 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 ;.. pMem->n = 0
219e4 3b 0d 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e ;.. if( n<0 ) n
219e5 20 3d 20 30 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 75 = 0;.. pMem->u
219e6 2e 6e 5a 65 72 6f 20 3d 20 6e 3b 0d 0a 20 20 70 .nZero = n;.. p
219e7 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 Mem->enc = SQLIT
219e8 45 5f 55 54 46 38 3b 0d 0a 0d 0a 23 69 66 64 65 E_UTF8;....#ifde
219e9 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e f SQLITE_OMIT_IN
219ea 43 52 42 4c 4f 42 0d 0a 20 20 73 71 6c 69 74 65 CRBLOB.. sqlite
219eb 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 3VdbeMemGrow(pMe
219ec 6d 2c 20 6e 2c 20 30 29 3b 0d 0a 20 20 69 66 28 m, n, 0);.. if(
219ed 20 70 4d 65 6d 2d 3e 7a 20 29 7b 0d 0a 20 20 20 pMem->z ){..
219ee 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6e 3b 0d 0a 20 pMem->n = n;..
219ef 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2d 3e memset(pMem->
219f0 7a 2c 20 30 2c 20 6e 29 3b 0d 0a 20 20 7d 0d 0a z, 0, n);.. }..
219f1 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d #endif..}..../*.
219f2 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 .** Delete any p
219f3 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e revious value an
219f4 64 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 d set the value
219f5 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 stored in *pMem
219f6 74 6f 20 76 61 6c 2c 0d 0a 2a 2a 20 6d 61 6e 69 to val,..** mani
219f7 66 65 73 74 20 74 79 70 65 20 49 4e 54 45 47 45 fest type INTEGE
219f8 52 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 R...*/..SQLITE_P
219f9 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
219fa 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 te3VdbeMemSetInt
219fb 36 34 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 36 64(Mem *pMem, i6
219fc 34 20 76 61 6c 29 7b 0d 0a 20 20 73 71 6c 69 74 4 val){.. sqlit
219fd 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
219fe 28 70 4d 65 6d 29 3b 0d 0a 20 20 70 4d 65 6d 2d (pMem);.. pMem-
219ff 3e 75 2e 69 20 3d 20 76 61 6c 3b 0d 0a 20 20 70 >u.i = val;.. p
21a00 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
21a01 5f 49 6e 74 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 74 _Int;.. pMem->t
21a02 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 ype = SQLITE_INT
21a03 45 47 45 52 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e EGER;..}....#ifn
21a04 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
21a05 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0d 0a FLOATING_POINT..
21a06 2f 2a 0d 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e /*..** Delete an
21a07 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 y previous value
21a08 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61 6c and set the val
21a09 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d ue stored in *pM
21a0a 65 6d 20 74 6f 20 76 61 6c 2c 0d 0a 2a 2a 20 6d em to val,..** m
21a0b 61 6e 69 66 65 73 74 20 74 79 70 65 20 52 45 41 anifest type REA
21a0c 4c 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 L...*/..SQLITE_P
21a0d 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 RIVATE void sqli
21a0e 74 65 33 56 64 62 65 4d 65 6d 53 65 74 44 6f 75 te3VdbeMemSetDou
21a0f 62 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 64 ble(Mem *pMem, d
21a10 6f 75 62 6c 65 20 76 61 6c 29 7b 0d 0a 20 20 69 ouble val){.. i
21a11 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 f( sqlite3IsNaN(
21a12 76 61 6c 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c val) ){.. sql
21a13 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 ite3VdbeMemSetNu
21a14 6c 6c 28 70 4d 65 6d 29 3b 0d 0a 20 20 7d 65 6c ll(pMem);.. }el
21a15 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 se{.. sqlite3
21a16 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 VdbeMemRelease(p
21a17 4d 65 6d 29 3b 0d 0a 20 20 20 20 70 4d 65 6d 2d Mem);.. pMem-
21a18 3e 72 20 3d 20 76 61 6c 3b 0d 0a 20 20 20 20 70 >r = val;.. p
21a19 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
21a1a 5f 52 65 61 6c 3b 0d 0a 20 20 20 20 70 4d 65 6d _Real;.. pMem
21a1b 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f ->type = SQLITE_
21a1c 46 4c 4f 41 54 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a FLOAT;.. }..}..
21a1d 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a #endif..../*..**
21a1e 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 Delete any prev
21a1f 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 ious value and s
21a20 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 et the value of
21a21 70 4d 65 6d 20 74 6f 20 62 65 20 61 6e 0d 0a 2a pMem to be an..*
21a22 2a 20 65 6d 70 74 79 20 62 6f 6f 6c 65 61 6e 20 * empty boolean
21a23 69 6e 64 65 78 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 index...*/..SQLI
21a24 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 TE_PRIVATE void
21a25 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
21a26 74 52 6f 77 53 65 74 28 4d 65 6d 20 2a 70 4d 65 tRowSet(Mem *pMe
21a27 6d 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a m){.. sqlite3 *
21a28 64 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b 0d 0a db = pMem->db;..
21a29 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 assert( db!=0
21a2a 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 70 );.. assert( (p
21a2b 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
21a2c 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0d 0a _RowSet)==0 );..
21a2d 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
21a2e 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0d 0a Release(pMem);..
21a2f 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 pMem->zMalloc
21a30 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
21a31 63 52 61 77 28 64 62 2c 20 36 34 29 3b 0d 0a 20 cRaw(db, 64);..
21a32 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 if( db->mallocF
21a33 61 69 6c 65 64 20 29 7b 0d 0a 20 20 20 20 70 4d ailed ){.. pM
21a34 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
21a35 4e 75 6c 6c 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d Null;.. }else{.
21a36 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 . assert( pMe
21a37 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0d 0a 20 m->zMalloc );..
21a38 20 20 20 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 pMem->u.pRowS
21a39 65 74 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 et = sqlite3RowS
21a3a 65 74 49 6e 69 74 28 64 62 2c 20 70 4d 65 6d 2d etInit(db, pMem-
21a3b 3e 7a 4d 61 6c 6c 6f 63 2c 20 0d 0a 20 20 20 20 >zMalloc, ..
21a3c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21a3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21a3e 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c sqlite3DbMall
21a3f 6f 63 53 69 7a 65 28 64 62 2c 20 70 4d 65 6d 2d ocSize(db, pMem-
21a40 3e 7a 4d 61 6c 6c 6f 63 29 29 3b 0d 0a 20 20 20 >zMalloc));..
21a41 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 75 assert( pMem->u
21a42 2e 70 52 6f 77 53 65 74 21 3d 30 20 29 3b 0d 0a .pRowSet!=0 );..
21a43 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
21a44 3d 20 4d 45 4d 5f 52 6f 77 53 65 74 3b 0d 0a 20 = MEM_RowSet;..
21a45 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 }..}..../*..**
21a46 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 Return true if t
21a47 68 65 20 4d 65 6d 20 6f 62 6a 65 63 74 20 63 6f he Mem object co
21a48 6e 74 61 69 6e 73 20 61 20 54 45 58 54 20 6f 72 ntains a TEXT or
21a49 20 42 4c 4f 42 20 74 68 61 74 20 69 73 0d 0a 2a BLOB that is..*
21a4a 2a 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20 77 68 * too large - wh
21a4b 6f 73 65 20 73 69 7a 65 20 65 78 63 65 65 64 73 ose size exceeds
21a4c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 SQLITE_MAX_LENG
21a4d 54 48 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f TH...*/..SQLITE_
21a4e 50 52 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 PRIVATE int sqli
21a4f 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 te3VdbeMemTooBig
21a50 28 4d 65 6d 20 2a 70 29 7b 0d 0a 20 20 61 73 73 (Mem *p){.. ass
21a51 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b ert( p->db!=0 );
21a52 0d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 .. if( p->flags
21a53 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f & (MEM_Str|MEM_
21a54 42 6c 6f 62 29 20 29 7b 0d 0a 20 20 20 20 69 6e Blob) ){.. in
21a55 74 20 6e 20 3d 20 70 2d 3e 6e 3b 0d 0a 20 20 20 t n = p->n;..
21a56 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 if( p->flags &
21a57 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0d 0a 20 20 20 MEM_Zero ){..
21a58 20 20 20 6e 20 2b 3d 20 70 2d 3e 75 2e 6e 5a 65 n += p->u.nZe
21a59 72 6f 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 ro;.. }..
21a5a 72 65 74 75 72 6e 20 6e 3e 70 2d 3e 64 62 2d 3e return n>p->db->
21a5b 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 aLimit[SQLITE_LI
21a5c 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0d 0a 20 20 MIT_LENGTH];..
21a5d 7d 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0d }.. return 0; .
21a5e 0a 7d 0d 0a 0d 0a 23 69 66 64 65 66 20 53 51 4c .}....#ifdef SQL
21a5f 49 54 45 5f 44 45 42 55 47 0d 0a 2f 2a 0d 0a 2a ITE_DEBUG../*..*
21a60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 * This routine p
21a61 72 65 70 61 72 65 73 20 61 20 6d 65 6d 6f 72 79 repares a memory
21a62 20 63 65 6c 6c 20 66 6f 72 20 6d 6f 64 69 63 61 cell for modica
21a63 74 69 6f 6e 20 62 79 20 62 72 65 61 6b 69 6e 67 tion by breaking
21a64 0d 0a 2a 2a 20 69 74 73 20 6c 69 6e 6b 20 74 6f ..** its link to
21a65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 a shallow copy
21a66 61 6e 64 20 62 79 20 6d 61 72 6b 69 6e 67 20 61 and by marking a
21a67 6e 79 20 63 75 72 72 65 6e 74 20 73 68 61 6c 6c ny current shall
21a68 6f 77 0d 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 ow..** copies of
21a69 20 74 68 69 73 20 63 65 6c 6c 20 61 73 20 69 6e this cell as in
21a6a 76 61 6c 69 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 valid...**..** T
21a6b 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 his is used for
21a6c 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 testing and debu
21a6d 67 67 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 gging only - to
21a6e 6d 61 6b 65 20 73 75 72 65 20 73 68 61 6c 6c 6f make sure shallo
21a6f 77 0d 0a 2a 2a 20 63 6f 70 69 65 73 20 61 72 65 w..** copies are
21a70 20 6e 6f 74 20 6d 69 73 75 73 65 64 2e 0d 0a 2a not misused...*
21a71 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 /..SQLITE_PRIVAT
21a72 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 E void sqlite3Vd
21a73 62 65 4d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e beMemAboutToChan
21a74 67 65 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 ge(Vdbe *pVdbe,
21a75 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0d 0a 20 20 69 Mem *pMem){.. i
21a76 6e 74 20 69 3b 0d 0a 20 20 4d 65 6d 20 2a 70 58 nt i;.. Mem *pX
21a77 3b 0d 0a 20 20 66 6f 72 28 69 3d 31 2c 20 70 58 ;.. for(i=1, pX
21a78 3d 26 70 56 64 62 65 2d 3e 61 4d 65 6d 5b 31 5d =&pVdbe->aMem[1]
21a79 3b 20 69 3c 3d 70 56 64 62 65 2d 3e 6e 4d 65 6d ; i<=pVdbe->nMem
21a7a 3b 20 69 2b 2b 2c 20 70 58 2b 2b 29 7b 0d 0a 20 ; i++, pX++){..
21a7b 20 20 20 69 66 28 20 70 58 2d 3e 70 53 63 6f 70 if( pX->pScop
21a7c 79 46 72 6f 6d 3d 3d 70 4d 65 6d 20 29 7b 0d 0a yFrom==pMem ){..
21a7d 20 20 20 20 20 20 70 58 2d 3e 66 6c 61 67 73 20 pX->flags
21a7e 7c 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0d |= MEM_Invalid;.
21a7f 0a 20 20 20 20 20 20 70 58 2d 3e 70 53 63 6f 70 . pX->pScop
21a80 79 46 72 6f 6d 20 3d 20 30 3b 0d 0a 20 20 20 20 yFrom = 0;..
21a81 7d 0d 0a 20 20 7d 0d 0a 20 20 70 4d 65 6d 2d 3e }.. }.. pMem->
21a82 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0d pScopyFrom = 0;.
21a83 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 .}..#endif /* SQ
21a84 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0d 0a 0d LITE_DEBUG */...
21a85 0a 2f 2a 0d 0a 2a 2a 20 53 69 7a 65 20 6f 66 20 ./*..** Size of
21a86 73 74 72 75 63 74 20 4d 65 6d 20 6e 6f 74 20 69 struct Mem not i
21a87 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 4d 65 6d ncluding the Mem
21a88 2e 7a 4d 61 6c 6c 6f 63 20 6d 65 6d 62 65 72 2e .zMalloc member.
21a89 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 4d 45 ..*/..#define ME
21a8a 4d 43 45 4c 4c 53 49 5a 45 20 28 73 69 7a 65 5f MCELLSIZE (size_
21a8b 74 29 28 26 28 28 28 4d 65 6d 20 2a 29 30 29 2d t)(&(((Mem *)0)-
21a8c 3e 7a 4d 61 6c 6c 6f 63 29 29 0d 0a 0d 0a 2f 2a >zMalloc))..../*
21a8d 0d 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20 73 68 61 ..** Make an sha
21a8e 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 70 46 72 llow copy of pFr
21a8f 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e 20 20 50 72 om into pTo. Pr
21a90 69 6f 72 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0d ior contents of.
21a91 0a 2a 2a 20 70 54 6f 20 61 72 65 20 66 72 65 65 .** pTo are free
21a92 64 2e 20 20 54 68 65 20 70 46 72 6f 6d 2d 3e 7a d. The pFrom->z
21a93 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 64 75 field is not du
21a94 70 6c 69 63 61 74 65 64 2e 20 20 49 66 0d 0a 2a plicated. If..*
21a95 2a 20 70 46 72 6f 6d 2d 3e 7a 20 69 73 20 75 73 * pFrom->z is us
21a96 65 64 2c 20 74 68 65 6e 20 70 54 6f 2d 3e 7a 20 ed, then pTo->z
21a97 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 points to the sa
21a98 6d 65 20 74 68 69 6e 67 20 61 73 20 70 46 72 6f me thing as pFro
21a99 6d 2d 3e 7a 0d 0a 2a 2a 20 61 6e 64 20 66 6c 61 m->z..** and fla
21a9a 67 73 20 67 65 74 73 20 73 72 63 54 79 70 65 20 gs gets srcType
21a9b 28 65 69 74 68 65 72 20 4d 45 4d 5f 45 70 68 65 (either MEM_Ephe
21a9c 6d 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63 29 m or MEM_Static)
21a9d 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
21a9e 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 IVATE void sqlit
21a9f 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 e3VdbeMemShallow
21aa0 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63 Copy(Mem *pTo, c
21aa1 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 2c onst Mem *pFrom,
21aa2 20 69 6e 74 20 73 72 63 54 79 70 65 29 7b 0d 0a int srcType){..
21aa3 20 20 61 73 73 65 72 74 28 20 28 70 46 72 6f 6d assert( (pFrom
21aa4 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f ->flags & MEM_Ro
21aa5 77 53 65 74 29 3d 3d 30 20 29 3b 0d 0a 20 20 56 wSet)==0 );.. V
21aa6 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 dbeMemRelease(pT
21aa7 6f 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 70 54 o);.. memcpy(pT
21aa8 6f 2c 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 4c o, pFrom, MEMCEL
21aa9 4c 53 49 5a 45 29 3b 0d 0a 20 20 70 54 6f 2d 3e LSIZE);.. pTo->
21aaa 78 44 65 6c 20 3d 20 30 3b 0d 0a 20 20 69 66 28 xDel = 0;.. if(
21aab 20 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d (pFrom->flags&M
21aac 45 4d 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 7b EM_Static)==0 ){
21aad 0d 0a 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 .. pTo->flags
21aae 20 26 3d 20 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45 &= ~(MEM_Dyn|ME
21aaf 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 M_Static|MEM_Eph
21ab0 65 6d 29 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 em);.. assert
21ab1 28 20 73 72 63 54 79 70 65 3d 3d 4d 45 4d 5f 45 ( srcType==MEM_E
21ab2 70 68 65 6d 20 7c 7c 20 73 72 63 54 79 70 65 3d phem || srcType=
21ab3 3d 4d 45 4d 5f 53 74 61 74 69 63 20 29 3b 0d 0a =MEM_Static );..
21ab4 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20 7c pTo->flags |
21ab5 3d 20 73 72 63 54 79 70 65 3b 0d 0a 20 20 7d 0d = srcType;.. }.
21ab6 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b .}..../*..** Mak
21ab7 65 20 61 20 66 75 6c 6c 20 63 6f 70 79 20 6f 66 e a full copy of
21ab8 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e pFrom into pTo.
21ab9 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74 73 Prior contents
21aba 20 6f 66 20 70 54 6f 20 61 72 65 0d 0a 2a 2a 20 of pTo are..**
21abb 66 72 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 freed before the
21abc 20 63 6f 70 79 20 69 73 20 6d 61 64 65 2e 0d 0a copy is made...
21abd 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
21abe 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
21abf 62 65 4d 65 6d 43 6f 70 79 28 4d 65 6d 20 2a 70 beMemCopy(Mem *p
21ac0 54 6f 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 To, const Mem *p
21ac1 46 72 6f 6d 29 7b 0d 0a 20 20 69 6e 74 20 72 63 From){.. int rc
21ac2 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d = SQLITE_OK;...
21ac3 0a 20 20 61 73 73 65 72 74 28 20 28 70 46 72 6f . assert( (pFro
21ac4 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 m->flags & MEM_R
21ac5 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0d 0a 20 20 owSet)==0 );..
21ac6 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 VdbeMemRelease(p
21ac7 54 6f 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 70 To);.. memcpy(p
21ac8 54 6f 2c 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 To, pFrom, MEMCE
21ac9 4c 4c 53 49 5a 45 29 3b 0d 0a 20 20 70 54 6f 2d LLSIZE);.. pTo-
21aca 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 >flags &= ~MEM_D
21acb 79 6e 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 54 6f yn;.... if( pTo
21acc 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 ->flags&(MEM_Str
21acd 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0d 0a 20 |MEM_Blob) ){..
21ace 20 20 20 69 66 28 20 30 3d 3d 28 70 46 72 6f 6d if( 0==(pFrom
21acf 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74 ->flags&MEM_Stat
21ad0 69 63 29 20 29 7b 0d 0a 20 20 20 20 20 20 70 54 ic) ){.. pT
21ad1 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f o->flags |= MEM_
21ad2 45 70 68 65 6d 3b 0d 0a 20 20 20 20 20 20 72 63 Ephem;.. rc
21ad3 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 = sqlite3VdbeMe
21ad4 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 mMakeWriteable(p
21ad5 54 6f 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d To);.. }.. }
21ad6 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b .... return rc;
21ad7 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 ..}..../*..** Tr
21ad8 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 ansfer the conte
21ad9 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 74 6f 20 nts of pFrom to
21ada 70 54 6f 2e 20 41 6e 79 20 65 78 69 73 74 69 6e pTo. Any existin
21adb 67 20 76 61 6c 75 65 20 69 6e 20 70 54 6f 20 69 g value in pTo i
21adc 73 0d 0a 2a 2a 20 66 72 65 65 64 2e 20 49 66 20 s..** freed. If
21add 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 73 20 65 pFrom contains e
21ade 70 68 65 6d 65 72 61 6c 20 64 61 74 61 2c 20 61 phemeral data, a
21adf 20 63 6f 70 79 20 69 73 20 6d 61 64 65 2e 0d 0a copy is made...
21ae0 2a 2a 0d 0a 2a 2a 20 70 46 72 6f 6d 20 63 6f 6e **..** pFrom con
21ae1 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c tains an SQL NUL
21ae2 4c 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 L when this rout
21ae3 69 6e 65 20 72 65 74 75 72 6e 73 2e 0d 0a 2a 2f ine returns...*/
21ae4 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
21ae5 20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 void sqlite3Vdb
21ae6 65 4d 65 6d 4d 6f 76 65 28 4d 65 6d 20 2a 70 54 eMemMove(Mem *pT
21ae7 6f 2c 20 4d 65 6d 20 2a 70 46 72 6f 6d 29 7b 0d o, Mem *pFrom){.
21ae8 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d . assert( pFrom
21ae9 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 ->db==0 || sqlit
21aea 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 e3_mutex_held(pF
21aeb 72 6f 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 rom->db->mutex)
21aec 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 54 );.. assert( pT
21aed 6f 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 o->db==0 || sqli
21aee 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 te3_mutex_held(p
21aef 54 6f 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 To->db->mutex) )
21af0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 ;.. assert( pFr
21af1 6f 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 54 6f om->db==0 || pTo
21af2 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d ->db==0 || pFrom
21af3 2d 3e 64 62 3d 3d 70 54 6f 2d 3e 64 62 20 29 3b ->db==pTo->db );
21af4 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 .... sqlite3Vdb
21af5 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 6f 29 eMemRelease(pTo)
21af6 3b 0d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c ;.. memcpy(pTo,
21af7 20 70 46 72 6f 6d 2c 20 73 69 7a 65 6f 66 28 4d pFrom, sizeof(M
21af8 65 6d 29 29 3b 0d 0a 20 20 70 46 72 6f 6d 2d 3e em));.. pFrom->
21af9 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c flags = MEM_Null
21afa 3b 0d 0a 20 20 70 46 72 6f 6d 2d 3e 78 44 65 6c ;.. pFrom->xDel
21afb 20 3d 20 30 3b 0d 0a 20 20 70 46 72 6f 6d 2d 3e = 0;.. pFrom->
21afc 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d 0a 7d 0d zMalloc = 0;..}.
21afd 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 68 61 6e 67 65 .../*..** Change
21afe 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 the value of a
21aff 4d 65 6d 20 74 6f 20 62 65 20 61 20 73 74 72 69 Mem to be a stri
21b00 6e 67 20 6f 72 20 61 20 42 4c 4f 42 2e 0d 0a 2a ng or a BLOB...*
21b01 2a 0d 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 *..** The memory
21b02 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 management stra
21b03 74 65 67 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 tegy depends on
21b04 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 the value of the
21b05 20 78 44 65 6c 0d 0a 2a 2a 20 70 61 72 61 6d 65 xDel..** parame
21b06 74 65 72 2e 20 49 66 20 74 68 65 20 76 61 6c 75 ter. If the valu
21b07 65 20 70 61 73 73 65 64 20 69 73 20 53 51 4c 49 e passed is SQLI
21b08 54 45 5f 54 52 41 4e 53 49 45 4e 54 2c 20 74 68 TE_TRANSIENT, th
21b09 65 6e 20 74 68 65 20 0d 0a 2a 2a 20 73 74 72 69 en the ..** stri
21b0a 6e 67 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 ng is copied int
21b0b 6f 20 61 20 28 70 6f 73 73 69 62 6c 79 20 65 78 o a (possibly ex
21b0c 69 73 74 69 6e 67 29 20 62 75 66 66 65 72 20 6d isting) buffer m
21b0d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 0d 0a anaged by the ..
21b0e 2a 2a 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 ** Mem structure
21b0f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 . Otherwise, any
21b10 20 65 78 69 73 74 69 6e 67 20 62 75 66 66 65 72 existing buffer
21b11 20 69 73 20 66 72 65 65 64 20 61 6e 64 20 74 68 is freed and th
21b12 65 0d 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 63 6f e..** pointer co
21b13 70 69 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 pied...**..** If
21b14 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 74 the string is t
21b15 6f 6f 20 6c 61 72 67 65 20 28 69 66 20 69 74 20 oo large (if it
21b16 65 78 63 65 65 64 73 20 74 68 65 20 53 51 4c 49 exceeds the SQLI
21b17 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 0d TE_LIMIT_LENGTH.
21b18 0a 2a 2a 20 73 69 7a 65 20 6c 69 6d 69 74 29 20 .** size limit)
21b19 74 68 65 6e 20 6e 6f 20 6d 65 6d 6f 72 79 20 61 then no memory a
21b1a 6c 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75 72 73 llocation occurs
21b1b 2e 20 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 . If the string
21b1c 20 63 61 6e 20 62 65 0d 0a 2a 2a 20 73 74 6f 72 can be..** stor
21b1d 65 64 20 77 69 74 68 6f 75 74 20 61 6c 6c 6f 63 ed without alloc
21b1e 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 74 68 ating memory, th
21b1f 65 6e 20 69 74 20 69 73 2e 20 20 49 66 20 61 20 en it is. If a
21b20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
21b21 6e 0d 0a 2a 2a 20 69 73 20 72 65 71 75 69 72 65 n..** is require
21b22 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 d to store the s
21b23 74 72 69 6e 67 2c 20 74 68 65 6e 20 76 61 6c 75 tring, then valu
21b24 65 20 6f 66 20 70 4d 65 6d 20 69 73 20 75 6e 63 e of pMem is unc
21b25 68 61 6e 67 65 64 2e 20 20 49 6e 0d 0a 2a 2a 20 hanged. In..**
21b26 65 69 74 68 65 72 20 63 61 73 65 2c 20 53 51 4c either case, SQL
21b27 49 54 45 5f 54 4f 4f 42 49 47 20 69 73 20 72 65 ITE_TOOBIG is re
21b28 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 53 51 4c turned...*/..SQL
21b29 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e 74 20 ITE_PRIVATE int
21b2a 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
21b2b 74 53 74 72 28 0d 0a 20 20 4d 65 6d 20 2a 70 4d tStr(.. Mem *pM
21b2c 65 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 em, /*
21b2d 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 Memory cell to s
21b2e 65 74 20 74 6f 20 73 74 72 69 6e 67 20 76 61 6c et to string val
21b2f 75 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 ue */.. const c
21b30 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 2f 2a 20 har *z, /*
21b31 53 74 72 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a String pointer *
21b32 2f 0d 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 /.. int n,
21b33 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 /* Byte
21b34 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6f 72 20 s in string, or
21b35 6e 65 67 61 74 69 76 65 20 2a 2f 0d 0a 20 20 75 negative */.. u
21b36 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20 8 enc,
21b37 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 6f /* Encoding o
21b38 66 20 7a 2e 20 20 30 20 66 6f 72 20 42 4c 4f 42 f z. 0 for BLOB
21b39 73 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 78 s */.. void (*x
21b3a 44 65 6c 29 28 76 6f 69 64 2a 29 20 2f 2a 20 44 Del)(void*) /* D
21b3b 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 estructor functi
21b3c 6f 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 on */..){.. int
21b3d 20 6e 42 79 74 65 20 3d 20 6e 3b 20 20 20 20 20 nByte = n;
21b3e 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f /* New value fo
21b3f 72 20 70 4d 65 6d 2d 3e 6e 20 2a 2f 0d 0a 20 20 r pMem->n */..
21b40 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 int iLimit;
21b41 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 /* Maximum a
21b42 6c 6c 6f 77 65 64 20 73 74 72 69 6e 67 20 6f 72 llowed string or
21b43 20 62 6c 6f 62 20 73 69 7a 65 20 2a 2f 0d 0a 20 blob size */..
21b44 20 75 31 36 20 66 6c 61 67 73 20 3d 20 30 3b 20 u16 flags = 0;
21b45 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 /* New valu
21b46 65 20 66 6f 72 20 70 4d 65 6d 2d 3e 66 6c 61 67 e for pMem->flag
21b47 73 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 s */.... assert
21b48 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c ( pMem->db==0 ||
21b49 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 sqlite3_mutex_h
21b4a 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 eld(pMem->db->mu
21b4b 74 65 78 29 20 29 3b 0d 0a 20 20 61 73 73 65 72 tex) );.. asser
21b4c 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 t( (pMem->flags
21b4d 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 & MEM_RowSet)==0
21b4e 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 7a );.... /* If z
21b4f 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 is a NULL point
21b50 65 72 2c 20 73 65 74 20 70 4d 65 6d 20 74 6f 20 er, set pMem to
21b51 63 6f 6e 74 61 69 6e 20 61 6e 20 53 51 4c 20 4e contain an SQL N
21b52 55 4c 4c 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 21 ULL. */.. if( !
21b53 7a 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 z ){.. sqlite
21b54 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 3VdbeMemSetNull(
21b55 70 4d 65 6d 29 3b 0d 0a 20 20 20 20 72 65 74 75 pMem);.. retu
21b56 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 rn SQLITE_OK;..
21b57 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4d 65 6d }.... if( pMem
21b58 2d 3e 64 62 20 29 7b 0d 0a 20 20 20 20 69 4c 69 ->db ){.. iLi
21b59 6d 69 74 20 3d 20 70 4d 65 6d 2d 3e 64 62 2d 3e mit = pMem->db->
21b5a 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 aLimit[SQLITE_LI
21b5b 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0d 0a 20 20 MIT_LENGTH];..
21b5c 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 4c 69 6d }else{.. iLim
21b5d 69 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f it = SQLITE_MAX_
21b5e 4c 45 4e 47 54 48 3b 0d 0a 20 20 7d 0d 0a 20 20 LENGTH;.. }..
21b5f 66 6c 61 67 73 20 3d 20 28 65 6e 63 3d 3d 30 3f flags = (enc==0?
21b60 4d 45 4d 5f 42 6c 6f 62 3a 4d 45 4d 5f 53 74 72 MEM_Blob:MEM_Str
21b61 29 3b 0d 0a 20 20 69 66 28 20 6e 42 79 74 65 3c );.. if( nByte<
21b62 30 20 29 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 0 ){.. assert
21b63 28 20 65 6e 63 21 3d 30 20 29 3b 0d 0a 20 20 20 ( enc!=0 );..
21b64 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 if( enc==SQLITE
21b65 5f 55 54 46 38 20 29 7b 0d 0a 20 20 20 20 20 20 _UTF8 ){..
21b66 66 6f 72 28 6e 42 79 74 65 3d 30 3b 20 6e 42 79 for(nByte=0; nBy
21b67 74 65 3c 3d 69 4c 69 6d 69 74 20 26 26 20 7a 5b te<=iLimit && z[
21b68 6e 42 79 74 65 5d 3b 20 6e 42 79 74 65 2b 2b 29 nByte]; nByte++)
21b69 7b 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a {}.. }else{..
21b6a 20 20 20 20 20 20 66 6f 72 28 6e 42 79 74 65 3d for(nByte=
21b6b 30 3b 20 6e 42 79 74 65 3c 3d 69 4c 69 6d 69 74 0; nByte<=iLimit
21b6c 20 26 26 20 28 7a 5b 6e 42 79 74 65 5d 20 7c 20 && (z[nByte] |
21b6d 7a 5b 6e 42 79 74 65 2b 31 5d 29 3b 20 6e 42 79 z[nByte+1]); nBy
21b6e 74 65 2b 3d 32 29 7b 7d 0d 0a 20 20 20 20 7d 0d te+=2){}.. }.
21b6f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d 45 . flags |= ME
21b70 4d 5f 54 65 72 6d 3b 0d 0a 20 20 7d 0d 0a 0d 0a M_Term;.. }....
21b71 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 /* The followi
21b72 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73 20 74 68 ng block sets th
21b73 65 20 6e 65 77 20 76 61 6c 75 65 73 20 6f 66 20 e new values of
21b74 4d 65 6d 2e 7a 20 61 6e 64 20 4d 65 6d 2e 78 44 Mem.z and Mem.xD
21b75 65 6c 2e 20 49 74 0d 0a 20 20 2a 2a 20 61 6c 73 el. It.. ** als
21b76 6f 20 73 65 74 73 20 61 20 66 6c 61 67 20 69 6e o sets a flag in
21b77 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 local variable
21b78 22 66 6c 61 67 73 22 20 74 6f 20 69 6e 64 69 63 "flags" to indic
21b79 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 0d 0a ate the memory..
21b7a 20 20 2a 2a 20 6d 61 6e 61 67 65 6d 65 6e 74 20 ** management
21b7b 28 6f 6e 65 20 6f 66 20 4d 45 4d 5f 44 79 6e 20 (one of MEM_Dyn
21b7c 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63 29 2e 0d or MEM_Static)..
21b7d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 78 44 65 . */.. if( xDe
21b7e 6c 3d 3d 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 l==SQLITE_TRANSI
21b7f 45 4e 54 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 ENT ){.. int
21b80 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 3b 0d nAlloc = nByte;.
21b81 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d . if( flags&M
21b82 45 4d 5f 54 65 72 6d 20 29 7b 0d 0a 20 20 20 20 EM_Term ){..
21b83 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 28 65 6e 63 nAlloc += (enc
21b84 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a ==SQLITE_UTF8?1:
21b85 32 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 2);.. }..
21b86 69 66 28 20 6e 42 79 74 65 3e 69 4c 69 6d 69 74 if( nByte>iLimit
21b87 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 ){.. retur
21b88 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b n SQLITE_TOOBIG;
21b89 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 .. }.. if(
21b8a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 sqlite3VdbeMemG
21b8b 72 6f 77 28 70 4d 65 6d 2c 20 6e 41 6c 6c 6f 63 row(pMem, nAlloc
21b8c 2c 20 30 29 20 29 7b 0d 0a 20 20 20 20 20 20 72 , 0) ){.. r
21b8d 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
21b8e 45 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 EM;.. }..
21b8f 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 memcpy(pMem->z,
21b90 7a 2c 20 6e 41 6c 6c 6f 63 29 3b 0d 0a 20 20 7d z, nAlloc);.. }
21b91 65 6c 73 65 20 69 66 28 20 78 44 65 6c 3d 3d 53 else if( xDel==S
21b92 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 7b QLITE_DYNAMIC ){
21b93 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 .. sqlite3Vdb
21b94 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d eMemRelease(pMem
21b95 29 3b 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d );.. pMem->zM
21b96 61 6c 6c 6f 63 20 3d 20 70 4d 65 6d 2d 3e 7a 20 alloc = pMem->z
21b97 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0d 0a 20 20 = (char *)z;..
21b98 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 pMem->xDel = 0
21b99 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 ;.. }else{..
21b9a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
21b9b 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0d 0a 20 elease(pMem);..
21b9c 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 pMem->z = (ch
21b9d 61 72 20 2a 29 7a 3b 0d 0a 20 20 20 20 70 4d 65 ar *)z;.. pMe
21b9e 6d 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0d m->xDel = xDel;.
21b9f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 28 . flags |= ((
21ba0 78 44 65 6c 3d 3d 53 51 4c 49 54 45 5f 53 54 41 xDel==SQLITE_STA
21ba1 54 49 43 29 3f 4d 45 4d 5f 53 74 61 74 69 63 3a TIC)?MEM_Static:
21ba2 4d 45 4d 5f 44 79 6e 29 3b 0d 0a 20 20 7d 0d 0a MEM_Dyn);.. }..
21ba3 0d 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6e 42 .. pMem->n = nB
21ba4 79 74 65 3b 0d 0a 20 20 70 4d 65 6d 2d 3e 66 6c yte;.. pMem->fl
21ba5 61 67 73 20 3d 20 66 6c 61 67 73 3b 0d 0a 20 20 ags = flags;..
21ba6 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 28 65 6e 63 pMem->enc = (enc
21ba7 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 55 54 46 ==0 ? SQLITE_UTF
21ba8 38 20 3a 20 65 6e 63 29 3b 0d 0a 20 20 70 4d 65 8 : enc);.. pMe
21ba9 6d 2d 3e 74 79 70 65 20 3d 20 28 65 6e 63 3d 3d m->type = (enc==
21baa 30 20 3f 20 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0 ? SQLITE_BLOB
21bab 3a 20 53 51 4c 49 54 45 5f 54 45 58 54 29 3b 0d : SQLITE_TEXT);.
21bac 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ...#ifndef SQLIT
21bad 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0d 0a 20 20 E_OMIT_UTF16..
21bae 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53 if( pMem->enc!=S
21baf 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 73 71 QLITE_UTF8 && sq
21bb0 6c 69 74 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 lite3VdbeMemHand
21bb1 6c 65 42 6f 6d 28 70 4d 65 6d 29 20 29 7b 0d 0a leBom(pMem) ){..
21bb2 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
21bb3 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 23 E_NOMEM;.. }..#
21bb4 65 6e 64 69 66 0d 0a 0d 0a 20 20 69 66 28 20 6e endif.... if( n
21bb5 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 7b 0d 0a Byte>iLimit ){..
21bb6 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
21bb7 45 5f 54 4f 4f 42 49 47 3b 0d 0a 20 20 7d 0d 0a E_TOOBIG;.. }..
21bb8 0d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
21bb9 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a E_OK;..}..../*..
21bba 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 ** Compare the v
21bbb 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 alues contained
21bbc 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 by the two memor
21bbd 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 y cells, returni
21bbe 6e 67 0d 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c ng..** negative,
21bbf 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 zero or positiv
21bc0 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 e if pMem1 is le
21bc1 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 ss than, equal t
21bc2 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0d 0a 2a o, or greater..*
21bc3 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f * than pMem2. So
21bc4 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e rting order is N
21bc5 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c ULL's first, fol
21bc6 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 lowed by numbers
21bc7 20 28 69 6e 74 65 67 65 72 73 0d 0a 2a 2a 20 61 (integers..** a
21bc8 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 nd reals) sorted
21bc9 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f numerically, fo
21bca 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f llowed by text o
21bcb 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f rdered by the co
21bcc 6c 6c 61 74 69 6e 67 0d 0a 2a 2a 20 73 65 71 75 llating..** sequ
21bcd 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 ence pColl and f
21bce 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 inally blob's or
21bcf 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 dered by memcmp(
21bd0 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 77 6f 20 4e )...**..** Two N
21bd1 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 ULL values are c
21bd2 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 onsidered equal
21bd3 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e by this function
21bd4 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 ...*/..SQLITE_PR
21bd5 49 56 41 54 45 20 69 6e 74 20 73 71 6c 69 74 65 IVATE int sqlite
21bd6 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 3MemCompare(cons
21bd7 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f t Mem *pMem1, co
21bd8 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 nst Mem *pMem2,
21bd9 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 const CollSeq *p
21bda 43 6f 6c 6c 29 7b 0d 0a 20 20 69 6e 74 20 72 63 Coll){.. int rc
21bdb 3b 0d 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b ;.. int f1, f2;
21bdc 0d 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 .. int combined
21bdd 5f 66 6c 61 67 73 3b 0d 0a 0d 0a 20 20 66 31 20 _flags;.... f1
21bde 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0d = pMem1->flags;.
21bdf 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 . f2 = pMem2->f
21be0 6c 61 67 73 3b 0d 0a 20 20 63 6f 6d 62 69 6e 65 lags;.. combine
21be1 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b d_flags = f1|f2;
21be2 0d 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d .. assert( (com
21be3 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 bined_flags & ME
21be4 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0d M_RowSet)==0 );.
21be5 0a 20 0d 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 . .. /* If one
21be6 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 value is NULL, i
21be7 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 t is less than t
21be8 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 he other. If bot
21be9 68 20 76 61 6c 75 65 73 0d 0a 20 20 2a 2a 20 61 h values.. ** a
21bea 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 re NULL, return
21beb 30 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 66 28 20 0... */.. if(
21bec 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d combined_flags&M
21bed 45 4d 5f 4e 75 6c 6c 20 29 7b 0d 0a 20 20 20 20 EM_Null ){..
21bee 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e return (f2&MEM_N
21bef 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e ull) - (f1&MEM_N
21bf0 75 6c 6c 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 ull);.. }....
21bf1 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 /* If one value
21bf2 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 is a number and
21bf3 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 the other is not
21bf4 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 , the number is
21bf5 6c 65 73 73 2e 0d 0a 20 20 2a 2a 20 49 66 20 62 less... ** If b
21bf6 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c oth are numbers,
21bf7 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c compare as real
21bf8 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 s if one is a re
21bf9 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 al, or as intege
21bfa 72 73 0d 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 rs.. ** if both
21bfb 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 values are inte
21bfc 67 65 72 73 2e 0d 0a 20 20 2a 2f 0d 0a 20 20 69 gers... */.. i
21bfd 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 f( combined_flag
21bfe 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 s&(MEM_Int|MEM_R
21bff 65 61 6c 29 20 29 7b 0d 0a 20 20 20 20 69 66 28 eal) ){.. if(
21c00 20 21 28 66 31 26 28 4d 45 4d 5f 49 6e 74 7c 4d !(f1&(MEM_Int|M
21c01 45 4d 5f 52 65 61 6c 29 29 20 29 7b 0d 0a 20 20 EM_Real)) ){..
21c02 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 return 1;..
21c03 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 21 28 }.. if( !(
21c04 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f f2&(MEM_Int|MEM_
21c05 52 65 61 6c 29 29 20 29 7b 0d 0a 20 20 20 20 20 Real)) ){..
21c06 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a 20 20 20 return -1;..
21c07 20 7d 0d 0a 20 20 20 20 69 66 28 20 28 66 31 20 }.. if( (f1
21c08 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 3d & f2 & MEM_Int)=
21c09 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 64 6f 75 =0 ){.. dou
21c0a 62 6c 65 20 72 31 2c 20 72 32 3b 0d 0a 20 20 20 ble r1, r2;..
21c0b 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 if( (f1&MEM_R
21c0c 65 61 6c 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 eal)==0 ){..
21c0d 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 r1 = (double
21c0e 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0d 0a 20 20 )pMem1->u.i;..
21c0f 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
21c10 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e r1 = pMem1->
21c11 72 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 r;.. }..
21c12 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 if( (f2&MEM_R
21c13 65 61 6c 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 eal)==0 ){..
21c14 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 r2 = (double
21c15 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0d 0a 20 20 )pMem2->u.i;..
21c16 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 }else{..
21c17 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e r2 = pMem2->
21c18 72 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 r;.. }..
21c19 20 20 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 if( r1<r2 ) r
21c1a 65 74 75 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 20 eturn -1;..
21c1b 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74 if( r1>r2 ) ret
21c1c 75 72 6e 20 31 3b 0d 0a 20 20 20 20 20 20 72 65 urn 1;.. re
21c1d 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 65 6c turn 0;.. }el
21c1e 73 65 7b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 se{.. asser
21c1f 74 28 20 66 31 26 4d 45 4d 5f 49 6e 74 20 29 3b t( f1&MEM_Int );
21c20 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
21c21 66 32 26 4d 45 4d 5f 49 6e 74 20 29 3b 0d 0a 20 f2&MEM_Int );..
21c22 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e if( pMem1->
21c23 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 u.i < pMem2->u.i
21c24 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a 20 ) return -1;..
21c25 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e if( pMem1->
21c26 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 u.i > pMem2->u.i
21c27 20 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 ) return 1;..
21c28 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 return 0;..
21c29 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f }.. }.... /
21c2a 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 * If one value i
21c2b 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 s a string and t
21c2c 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c he other is a bl
21c2d 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 ob, the string i
21c2e 73 20 6c 65 73 73 2e 0d 0a 20 20 2a 2a 20 49 66 s less... ** If
21c2f 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 both are string
21c30 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 s, compare using
21c31 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 the collating f
21c32 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 2a 2f 0d unctions... */.
21c33 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f . if( combined_
21c34 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b flags&MEM_Str ){
21c35 0d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 .. if( (f1 &
21c36 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0d 0a MEM_Str)==0 ){..
21c37 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d return 1;.
21c38 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 . }.. if(
21c39 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d (f2 & MEM_Str)==
21c3a 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 0 ){.. retu
21c3b 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 7d 0d 0a 0d rn -1;.. }...
21c3c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 . assert( pMe
21c3d 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e m1->enc==pMem2->
21c3e 65 6e 63 20 29 3b 0d 0a 20 20 20 20 61 73 73 65 enc );.. asse
21c3f 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d rt( pMem1->enc==
21c40 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0d SQLITE_UTF8 || .
21c41 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 . pMe
21c42 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f m1->enc==SQLITE_
21c43 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 UTF16LE || pMem1
21c44 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 ->enc==SQLITE_UT
21c45 46 31 36 42 45 20 29 3b 0d 0a 0d 0a 20 20 20 20 F16BE );....
21c46 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e /* The collation
21c47 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 sequence must b
21c48 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 e defined at thi
21c49 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 s point, even if
21c4a 0d 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 .. ** the use
21c4b 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f r deletes the co
21c4c 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 llation sequence
21c4d 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 after the vdbe
21c4e 70 72 6f 67 72 61 6d 20 69 73 0d 0a 20 20 20 20 program is..
21c4f 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 ** compiled (thi
21c50 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 s was not always
21c51 20 74 68 65 20 63 61 73 65 29 2e 0d 0a 20 20 20 the case)...
21c52 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74 28 */.. assert(
21c53 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c !pColl || pColl
21c54 2d 3e 78 43 6d 70 20 29 3b 0d 0a 0d 0a 20 20 20 ->xCmp );....
21c55 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0d 0a 20 if( pColl ){..
21c56 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e if( pMem1->
21c57 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 enc==pColl->enc
21c58 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 ){.. /* T
21c59 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 he strings are a
21c5a 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f lready in the co
21c5b 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 rrect encoding.
21c5c 20 43 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 Call the..
21c5d 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e ** comparison
21c5e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 function direct
21c5f 6c 79 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 ly */.. r
21c60 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d eturn pColl->xCm
21c61 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 p(pColl->pUser,p
21c62 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a Mem1->n,pMem1->z
21c63 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d ,pMem2->n,pMem2-
21c64 3e 7a 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 >z);.. }els
21c65 65 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 e{.. cons
21c66 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b t void *v1, *v2;
21c67 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 31 .. int n1
21c68 2c 20 6e 32 3b 0d 0a 20 20 20 20 20 20 20 20 4d , n2;.. M
21c69 65 6d 20 63 31 3b 0d 0a 20 20 20 20 20 20 20 20 em c1;..
21c6a 4d 65 6d 20 63 32 3b 0d 0a 20 20 20 20 20 20 20 Mem c2;..
21c6b 20 6d 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 memset(&c1, 0,
21c6c 73 69 7a 65 6f 66 28 63 31 29 29 3b 0d 0a 20 20 sizeof(c1));..
21c6d 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 63 32 memset(&c2
21c6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 32 29 29 , 0, sizeof(c2))
21c6f 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ;.. sqlit
21c70 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 e3VdbeMemShallow
21c71 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c Copy(&c1, pMem1,
21c72 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0d 0a 20 20 MEM_Ephem);..
21c73 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
21c74 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 eMemShallowCopy(
21c75 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f &c2, pMem2, MEM_
21c76 45 70 68 65 6d 29 3b 0d 0a 20 20 20 20 20 20 20 Ephem);..
21c77 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c v1 = sqlite3Val
21c78 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f ueText((sqlite3_
21c79 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c value*)&c1, pCol
21c7a 6c 2d 3e 65 6e 63 29 3b 0d 0a 20 20 20 20 20 20 l->enc);..
21c7b 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 n1 = v1==0 ? 0
21c7c 20 3a 20 63 31 2e 6e 3b 0d 0a 20 20 20 20 20 20 : c1.n;..
21c7d 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 v2 = sqlite3Va
21c7e 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 lueText((sqlite3
21c7f 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f _value*)&c2, pCo
21c80 6c 6c 2d 3e 65 6e 63 29 3b 0d 0a 20 20 20 20 20 ll->enc);..
21c81 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 n2 = v2==0 ?
21c82 30 20 3a 20 63 32 2e 6e 3b 0d 0a 20 20 20 20 20 0 : c2.n;..
21c83 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 rc = pColl->x
21c84 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 Cmp(pColl->pUser
21c85 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 , n1, v1, n2, v2
21c86 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 );.. sqli
21c87 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
21c88 65 28 26 63 31 29 3b 0d 0a 20 20 20 20 20 20 20 e(&c1);..
21c89 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
21c8a 65 6c 65 61 73 65 28 26 63 32 29 3b 0d 0a 20 20 elease(&c2);..
21c8b 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b return rc;
21c8c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d .. }.. }
21c8d 0d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 .. /* If a NU
21c8e 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 LL pointer was p
21c8f 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c assed as the col
21c90 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 late function, f
21c91 61 6c 6c 20 74 68 72 6f 75 67 68 0d 0a 20 20 20 all through..
21c92 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 ** to the blob
21c93 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d case and use mem
21c94 63 6d 70 28 29 2e 20 20 2a 2f 0d 0a 20 20 7d 0d cmp(). */.. }.
21c95 0a 20 0d 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 . .. /* Both va
21c96 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f lues must be blo
21c97 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 bs. Compare usi
21c98 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f ng memcmp(). */
21c99 0d 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 .. rc = memcmp(
21c9a 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32 2d pMem1->z, pMem2-
21c9b 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70 4d >z, (pMem1->n>pM
21c9c 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e 6e em2->n)?pMem2->n
21c9d 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0d 0a 20 20 69 :pMem1->n);.. i
21c9e 66 28 20 72 63 3d 3d 30 20 29 7b 0d 0a 20 20 20 f( rc==0 ){..
21c9f 20 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d rc = pMem1->n -
21ca0 20 70 4d 65 6d 32 2d 3e 6e 3b 0d 0a 20 20 7d 0d pMem2->n;.. }.
21ca1 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d . return rc;..}
21ca2 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 ..../*..** Move
21ca3 64 61 74 61 20 6f 75 74 20 6f 66 20 61 20 62 74 data out of a bt
21ca4 72 65 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 ree key or data
21ca5 66 69 65 6c 64 20 61 6e 64 20 69 6e 74 6f 20 61 field and into a
21ca6 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e 0d Mem structure..
21ca7 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 6f 72 20 .** The data or
21ca8 6b 65 79 20 69 73 20 74 61 6b 65 6e 20 66 72 6f key is taken fro
21ca9 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 m the entry that
21caa 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 pCur is current
21cab 6c 79 20 70 6f 69 6e 74 69 6e 67 0d 0a 2a 2a 20 ly pointing..**
21cac 74 6f 2e 20 20 6f 66 66 73 65 74 20 61 6e 64 20 to. offset and
21cad 61 6d 74 20 64 65 74 65 72 6d 69 6e 65 20 77 68 amt determine wh
21cae 61 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 at portion of th
21caf 65 20 64 61 74 61 20 6f 72 20 6b 65 79 20 74 6f e data or key to
21cb0 20 72 65 74 72 69 65 76 65 2e 0d 0a 2a 2a 20 6b retrieve...** k
21cb1 65 79 20 69 73 20 74 72 75 65 20 74 6f 20 67 65 ey is true to ge
21cb2 74 20 74 68 65 20 6b 65 79 20 6f 72 20 66 61 6c t the key or fal
21cb3 73 65 20 74 6f 20 67 65 74 20 64 61 74 61 2e 20 se to get data.
21cb4 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 77 The result is w
21cb5 72 69 74 74 65 6e 0d 0a 2a 2a 20 69 6e 74 6f 20 ritten..** into
21cb6 74 68 65 20 70 4d 65 6d 20 65 6c 65 6d 65 6e 74 the pMem element
21cb7 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 70 4d ...**..** The pM
21cb8 65 6d 20 73 74 72 75 63 74 75 72 65 20 69 73 20 em structure is
21cb9 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 75 6e assumed to be un
21cba 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 41 6e initialized. An
21cbb 79 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e 74 0d y prior content.
21cbc 0a 2a 2a 20 69 73 20 6f 76 65 72 77 72 69 74 74 .** is overwritt
21cbd 65 6e 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67 en without being
21cbe 20 66 72 65 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 freed...**..**
21cbf 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 If this routine
21cc0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 fails for any re
21cc1 61 73 6f 6e 20 28 6d 61 6c 6c 6f 63 20 72 65 74 ason (malloc ret
21cc2 75 72 6e 73 20 4e 55 4c 4c 20 6f 72 20 75 6e 61 urns NULL or una
21cc3 62 6c 65 0d 0a 2a 2a 20 74 6f 20 72 65 61 64 20 ble..** to read
21cc4 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 29 20 74 from the disk) t
21cc5 68 65 6e 20 74 68 65 20 70 4d 65 6d 20 69 73 20 hen the pMem is
21cc6 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e left in an incon
21cc7 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0d 0a sistent state...
21cc8 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 */..SQLITE_PRIVA
21cc9 54 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 TE int sqlite3Vd
21cca 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 0d beMemFromBtree(.
21ccb 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 . BtCursor *pCu
21ccc 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 r, /* Cursor p
21ccd 6f 69 6e 74 69 6e 67 20 61 74 20 72 65 63 6f 72 ointing at recor
21cce 64 20 74 6f 20 72 65 74 72 69 65 76 65 2e 20 2a d to retrieve. *
21ccf 2f 0d 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c /.. int offset,
21cd0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 /* Offset
21cd1 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 from the start
21cd2 6f 66 20 64 61 74 61 20 74 6f 20 72 65 74 75 72 of data to retur
21cd3 6e 20 62 79 74 65 73 20 66 72 6f 6d 2e 20 2a 2f n bytes from. */
21cd4 0d 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 .. int amt,
21cd5 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
21cd6 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 of bytes to retu
21cd7 72 6e 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6b 65 rn. */.. int ke
21cd8 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 y, /* I
21cd9 66 20 74 72 75 65 2c 20 72 65 74 72 69 65 76 65 f true, retrieve
21cda 20 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 from the btree
21cdb 6b 65 79 2c 20 6e 6f 74 20 64 61 74 61 2e 20 2a key, not data. *
21cdc 2f 0d 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 /.. Mem *pMem
21cdd 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 /* OUT: R
21cde 65 74 75 72 6e 20 64 61 74 61 20 69 6e 20 74 68 eturn data in th
21cdf 69 73 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 is Mem structure
21ce0 2e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 68 61 72 . */..){.. char
21ce1 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 20 *zData;
21ce2 2f 2a 20 44 61 74 61 20 66 72 6f 6d 20 74 68 65 /* Data from the
21ce3 20 62 74 72 65 65 20 6c 61 79 65 72 20 2a 2f 0d btree layer */.
21ce4 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 . int available
21ce5 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 = 0; /* Number
21ce6 20 6f 66 20 62 79 74 65 73 20 61 76 61 69 6c 61 of bytes availa
21ce7 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c ble on the local
21ce8 20 62 74 72 65 65 20 70 61 67 65 20 2a 2f 0d 0a btree page */..
21ce9 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
21cea 45 5f 4f 4b 3b 20 2f 2a 20 52 65 74 75 72 6e 20 E_OK; /* Return
21ceb 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 code */.... ass
21cec 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 ert( sqlite3Btre
21ced 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 eCursorIsValid(p
21cee 43 75 72 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 Cur) );.... /*
21cef 4e 6f 74 65 3a 20 74 68 65 20 63 61 6c 6c 73 20 Note: the calls
21cf0 74 6f 20 42 74 72 65 65 4b 65 79 46 65 74 63 68 to BtreeKeyFetch
21cf1 28 29 20 61 6e 64 20 44 61 74 61 46 65 74 63 68 () and DataFetch
21cf2 28 29 20 62 65 6c 6f 77 20 61 73 73 65 72 74 28 () below assert(
21cf3 29 20 0d 0a 20 20 2a 2a 20 74 68 61 74 20 62 6f ) .. ** that bo
21cf4 74 68 20 74 68 65 20 42 74 53 68 61 72 65 64 20 th the BtShared
21cf5 61 6e 64 20 64 61 74 61 62 61 73 65 20 68 61 6e and database han
21cf6 64 6c 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 dle mutexes are
21cf7 68 65 6c 64 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 held. */.. asse
21cf8 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 rt( (pMem->flags
21cf9 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d & MEM_RowSet)==
21cfa 30 20 29 3b 0d 0a 20 20 69 66 28 20 6b 65 79 20 0 );.. if( key
21cfb 29 7b 0d 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 ){.. zData =
21cfc 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 42 (char *)sqlite3B
21cfd 74 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 75 treeKeyFetch(pCu
21cfe 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 29 3b 0d r, &available);.
21cff 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 7a . }else{.. z
21d00 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 Data = (char *)s
21d01 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 qlite3BtreeDataF
21d02 65 74 63 68 28 70 43 75 72 2c 20 26 61 76 61 69 etch(pCur, &avai
21d03 6c 61 62 6c 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 lable);.. }..
21d04 61 73 73 65 72 74 28 20 7a 44 61 74 61 21 3d 30 assert( zData!=0
21d05 20 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 6f 66 66 );.... if( off
21d06 73 65 74 2b 61 6d 74 3c 3d 61 76 61 69 6c 61 62 set+amt<=availab
21d07 6c 65 20 26 26 20 28 70 4d 65 6d 2d 3e 66 6c 61 le && (pMem->fla
21d08 67 73 26 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 gs&MEM_Dyn)==0 )
21d09 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 {.. sqlite3Vd
21d0a 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 beMemRelease(pMe
21d0b 6d 29 3b 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a m);.. pMem->z
21d0c 20 3d 20 26 7a 44 61 74 61 5b 6f 66 66 73 65 74 = &zData[offset
21d0d 5d 3b 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c ];.. pMem->fl
21d0e 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d ags = MEM_Blob|M
21d0f 45 4d 5f 45 70 68 65 6d 3b 0d 0a 20 20 7d 65 6c EM_Ephem;.. }el
21d10 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b se if( SQLITE_OK
21d11 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 ==(rc = sqlite3V
21d12 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c dbeMemGrow(pMem,
21d13 20 61 6d 74 2b 32 2c 20 30 29 29 20 29 7b 0d 0a amt+2, 0)) ){..
21d14 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
21d15 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 = MEM_Blob|MEM_D
21d16 79 6e 7c 4d 45 4d 5f 54 65 72 6d 3b 0d 0a 20 20 yn|MEM_Term;..
21d17 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 30 3b pMem->enc = 0;
21d18 0d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 .. pMem->type
21d19 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0d = SQLITE_BLOB;.
21d1a 0a 20 20 20 20 69 66 28 20 6b 65 79 20 29 7b 0d . if( key ){.
21d1b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 . rc = sqli
21d1c 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 te3BtreeKey(pCur
21d1d 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 , offset, amt, p
21d1e 4d 65 6d 2d 3e 7a 29 3b 0d 0a 20 20 20 20 7d 65 Mem->z);.. }e
21d1f 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d lse{.. rc =
21d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 sqlite3BtreeDat
21d21 61 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 a(pCur, offset,
21d22 61 6d 74 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0d 0a amt, pMem->z);..
21d23 20 20 20 20 7d 0d 0a 20 20 20 20 70 4d 65 6d 2d }.. pMem-
21d24 3e 7a 5b 61 6d 74 5d 20 3d 20 30 3b 0d 0a 20 20 >z[amt] = 0;..
21d25 20 20 70 4d 65 6d 2d 3e 7a 5b 61 6d 74 2b 31 5d pMem->z[amt+1]
21d26 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 72 = 0;.. if( r
21d27 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d c!=SQLITE_OK ){.
21d28 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 . sqlite3Vd
21d29 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 beMemRelease(pMe
21d2a 6d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d m);.. }.. }.
21d2b 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 61 6d 74 . pMem->n = amt
21d2c 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 ;.... return rc
21d2d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 54 68 69 73 20 ;..}..../* This
21d2e 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 function is only
21d2f 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 74 65 72 available inter
21d30 6e 61 6c 6c 79 2c 20 69 74 20 69 73 20 6e 6f 74 nally, it is not
21d31 20 70 61 72 74 20 6f 66 20 74 68 65 0d 0a 2a 2a part of the..**
21d32 20 65 78 74 65 72 6e 61 6c 20 41 50 49 2e 20 49 external API. I
21d33 74 20 77 6f 72 6b 73 20 69 6e 20 61 20 73 69 6d t works in a sim
21d34 69 6c 61 72 20 77 61 79 20 74 6f 20 73 71 6c 69 ilar way to sqli
21d35 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 te3_value_text()
21d36 2c 0d 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 65 ,..** except the
21d37 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 data returned i
21d38 73 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e s in the encodin
21d39 67 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 g specified by t
21d3a 68 65 20 73 65 63 6f 6e 64 0d 0a 2a 2a 20 70 61 he second..** pa
21d3b 72 61 6d 65 74 65 72 2c 20 77 68 69 63 68 20 6d rameter, which m
21d3c 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 ust be one of SQ
21d3d 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 LITE_UTF16BE, SQ
21d3e 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 0d LITE_UTF16LE or.
21d3f 0a 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 38 2e .** SQLITE_UTF8.
21d40 0d 0a 2a 2a 0d 0a 2a 2a 20 28 32 30 30 36 2d 30 ..**..** (2006-0
21d41 32 2d 31 36 3a 29 20 20 54 68 65 20 65 6e 63 20 2-16:) The enc
21d42 76 61 6c 75 65 20 63 61 6e 20 62 65 20 6f 72 2d value can be or-
21d43 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 55 ed with SQLITE_U
21d44 54 46 31 36 5f 41 4c 49 47 4e 45 44 2e 0d 0a 2a TF16_ALIGNED...*
21d45 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 * If that is the
21d46 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 case, then the
21d47 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 result must be a
21d48 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 65 76 65 ligned on an eve
21d49 6e 20 62 79 74 65 0d 0a 2a 2a 20 62 6f 75 6e 64 n byte..** bound
21d4a 61 72 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 ary...*/..SQLITE
21d4b 5f 50 52 49 56 41 54 45 20 63 6f 6e 73 74 20 76 _PRIVATE const v
21d4c 6f 69 64 20 2a 73 71 6c 69 74 65 33 56 61 6c 75 oid *sqlite3Valu
21d4d 65 54 65 78 74 28 73 71 6c 69 74 65 33 5f 76 61 eText(sqlite3_va
21d4e 6c 75 65 2a 20 70 56 61 6c 2c 20 75 38 20 65 6e lue* pVal, u8 en
21d4f 63 29 7b 0d 0a 20 20 69 66 28 20 21 70 56 61 6c c){.. if( !pVal
21d50 20 29 20 72 65 74 75 72 6e 20 30 3b 0d 0a 0d 0a ) return 0;....
21d51 20 20 61 73 73 65 72 74 28 20 70 56 61 6c 2d 3e assert( pVal->
21d52 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 db==0 || sqlite3
21d53 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 56 61 6c _mutex_held(pVal
21d54 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0d ->db->mutex) );.
21d55 0a 20 20 61 73 73 65 72 74 28 20 28 65 6e 63 26 . assert( (enc&
21d56 33 29 3d 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45 3)==(enc&~SQLITE
21d57 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 _UTF16_ALIGNED)
21d58 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 28 70 );.. assert( (p
21d59 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Val->flags & MEM
21d5a 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0d 0a _RowSet)==0 );..
21d5b 0d 0a 20 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c .. if( pVal->fl
21d5c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0d ags&MEM_Null ){.
21d5d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a . return 0;..
21d5e 20 20 7d 0d 0a 20 20 61 73 73 65 72 74 28 20 28 }.. assert( (
21d5f 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 3d 3d 20 MEM_Blob>>3) ==
21d60 4d 45 4d 5f 53 74 72 20 29 3b 0d 0a 20 20 70 56 MEM_Str );.. pV
21d61 61 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 56 al->flags |= (pV
21d62 61 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f al->flags & MEM_
21d63 42 6c 6f 62 29 3e 3e 33 3b 0d 0a 20 20 45 78 70 Blob)>>3;.. Exp
21d64 61 6e 64 42 6c 6f 62 28 70 56 61 6c 29 3b 0d 0a andBlob(pVal);..
21d65 20 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 if( pVal->flag
21d66 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0d 0a 20 20 s&MEM_Str ){..
21d67 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 sqlite3VdbeCha
21d68 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 56 61 6c ngeEncoding(pVal
21d69 2c 20 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f , enc & ~SQLITE_
21d6a 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3b 0d UTF16_ALIGNED);.
21d6b 0a 20 20 20 20 69 66 28 20 28 65 6e 63 20 26 20 . if( (enc &
21d6c 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 SQLITE_UTF16_ALI
21d6d 47 4e 45 44 29 21 3d 30 20 26 26 20 31 3d 3d 28 GNED)!=0 && 1==(
21d6e 31 26 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 1&SQLITE_PTR_TO_
21d6f 49 4e 54 28 70 56 61 6c 2d 3e 7a 29 29 20 29 7b INT(pVal->z)) ){
21d70 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
21d71 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 (pVal->flags & (
21d72 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 MEM_Ephem|MEM_St
21d73 61 74 69 63 29 29 21 3d 30 20 29 3b 0d 0a 20 20 atic))!=0 );..
21d74 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 if( sqlite3V
21d75 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 dbeMemMakeWritea
21d76 62 6c 65 28 70 56 61 6c 29 21 3d 53 51 4c 49 54 ble(pVal)!=SQLIT
21d77 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 20 E_OK ){..
21d78 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 return 0;..
21d79 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 }.. }..
21d7a 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 sqlite3VdbeMemNu
21d7b 6c 54 65 72 6d 69 6e 61 74 65 28 70 56 61 6c 29 lTerminate(pVal)
21d7c 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 31 32 37 ; /* IMP: R-3127
21d7d 35 2d 34 34 30 36 30 20 2a 2f 0d 0a 20 20 7d 65 5-44060 */.. }e
21d7e 6c 73 65 7b 0d 0a 20 20 20 20 61 73 73 65 72 74 lse{.. assert
21d7f 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 26 4d ( (pVal->flags&M
21d80 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 29 3b 0d 0a EM_Blob)==0 );..
21d81 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
21d82 65 6d 53 74 72 69 6e 67 69 66 79 28 70 56 61 6c emStringify(pVal
21d83 2c 20 65 6e 63 29 3b 0d 0a 20 20 20 20 61 73 73 , enc);.. ass
21d84 65 72 74 28 20 30 3d 3d 28 31 26 53 51 4c 49 54 ert( 0==(1&SQLIT
21d85 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 61 E_PTR_TO_INT(pVa
21d86 6c 2d 3e 7a 29 29 20 29 3b 0d 0a 20 20 7d 0d 0a l->z)) );.. }..
21d87 20 20 61 73 73 65 72 74 28 70 56 61 6c 2d 3e 65 assert(pVal->e
21d88 6e 63 3d 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49 nc==(enc & ~SQLI
21d89 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 TE_UTF16_ALIGNED
21d8a 29 20 7c 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 ) || pVal->db==0
21d8b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
21d8c 7c 7c 20 70 56 61 6c 2d 3e 64 62 2d 3e 6d 61 6c || pVal->db->mal
21d8d 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0d 0a 20 20 locFailed );..
21d8e 69 66 28 20 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28 if( pVal->enc==(
21d8f 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 enc & ~SQLITE_UT
21d90 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 7b 0d F16_ALIGNED) ){.
21d91 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 61 6c . return pVal
21d92 2d 3e 7a 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a ->z;.. }else{..
21d93 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 return 0;..
21d94 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 }..}..../*..**
21d95 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 71 6c Create a new sql
21d96 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 ite3_value objec
21d97 74 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50 t...*/..SQLITE_P
21d98 52 49 56 41 54 45 20 73 71 6c 69 74 65 33 5f 76 RIVATE sqlite3_v
21d99 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 61 6c alue *sqlite3Val
21d9a 75 65 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 64 ueNew(sqlite3 *d
21d9b 62 29 7b 0d 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 b){.. Mem *p =
21d9c 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a sqlite3DbMallocZ
21d9d 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a ero(db, sizeof(*
21d9e 70 29 29 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b p));.. if( p ){
21d9f 0d 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d .. p->flags =
21da0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0d 0a 20 20 20 20 MEM_Null;..
21da1 70 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 p->type = SQLITE
21da2 5f 4e 55 4c 4c 3b 0d 0a 20 20 20 20 70 2d 3e 64 _NULL;.. p->d
21da3 62 20 3d 20 64 62 3b 0d 0a 20 20 7d 0d 0a 20 20 b = db;.. }..
21da4 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a return p;..}....
21da5 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 /*..** Create a
21da6 6e 65 77 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 new sqlite3_valu
21da7 65 20 6f 62 6a 65 63 74 2c 20 63 6f 6e 74 61 69 e object, contai
21da8 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f ning the value o
21da9 66 20 70 45 78 70 72 2e 0d 0a 2a 2a 0d 0a 2a 2a f pExpr...**..**
21daa 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 This only works
21dab 20 66 6f 72 20 76 65 72 79 20 73 69 6d 70 6c 65 for very simple
21dac 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 expressions tha
21dad 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 6f 6e 65 t consist of one
21dae 20 63 6f 6e 73 74 61 6e 74 0d 0a 2a 2a 20 74 6f constant..** to
21daf 6b 65 6e 20 28 69 2e 65 2e 20 22 35 22 2c 20 22 ken (i.e. "5", "
21db0 35 2e 31 22 2c 20 22 27 61 20 73 74 72 69 6e 67 5.1", "'a string
21db1 27 22 29 2e 20 49 66 20 74 68 65 20 65 78 70 72 '"). If the expr
21db2 65 73 73 69 6f 6e 20 63 61 6e 0d 0a 2a 2a 20 62 ession can..** b
21db3 65 20 63 6f 6e 76 65 72 74 65 64 20 64 69 72 65 e converted dire
21db4 63 74 6c 79 20 69 6e 74 6f 20 61 20 76 61 6c 75 ctly into a valu
21db5 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 e, then the valu
21db6 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 e is allocated a
21db7 6e 64 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 nd..** a pointer
21db8 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 56 written to *ppV
21db9 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 al. The caller i
21dba 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f s responsible fo
21dbb 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 0d 0a r deallocating..
21dbc 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 62 79 20 ** the value by
21dbd 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 73 71 passing it to sq
21dbe 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 lite3ValueFree()
21dbf 20 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20 74 68 later on. If th
21dc0 65 20 65 78 70 72 65 73 73 69 6f 6e 0d 0a 2a 2a e expression..**
21dc1 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 cannot be conve
21dc2 72 74 65 64 20 74 6f 20 61 20 76 61 6c 75 65 2c rted to a value,
21dc3 20 74 68 65 6e 20 2a 70 70 56 61 6c 20 69 73 20 then *ppVal is
21dc4 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0d 0a 2a 2f set to NULL...*/
21dc5 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 ..SQLITE_PRIVATE
21dc6 20 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75 int sqlite3Valu
21dc7 65 46 72 6f 6d 45 78 70 72 28 0d 0a 20 20 73 71 eFromExpr(.. sq
21dc8 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 lite3 *db,
21dc9 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 /* The d
21dca 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
21dcb 6f 6e 20 2a 2f 0d 0a 20 20 45 78 70 72 20 2a 70 on */.. Expr *p
21dcc 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 Expr,
21dcd 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 /* The expres
21dce 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 sion to evaluate
21dcf 20 2a 2f 0d 0a 20 20 75 38 20 65 6e 63 2c 20 20 */.. u8 enc,
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21dd1 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 /* Encoding to
21dd2 75 73 65 20 2a 2f 0d 0a 20 20 75 38 20 61 66 66 use */.. u8 aff
21dd3 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20 20 inity,
21dd4 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 /* Affinity
21dd5 74 6f 20 75 73 65 20 2a 2f 0d 0a 20 20 73 71 6c to use */.. sql
21dd6 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 ite3_value **ppV
21dd7 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 al /* Write
21dd8 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 68 65 the new value he
21dd9 72 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 re */..){.. int
21dda 20 6f 70 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 56 op;.. char *zV
21ddb 61 6c 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74 al = 0;.. sqlit
21ddc 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d e3_value *pVal =
21ddd 20 30 3b 0d 0a 20 20 69 6e 74 20 6e 65 67 49 6e 0;.. int negIn
21dde 74 20 3d 20 31 3b 0d 0a 20 20 63 6f 6e 73 74 20 t = 1;.. const
21ddf 63 68 61 72 20 2a 7a 4e 65 67 20 3d 20 22 22 3b char *zNeg = "";
21de0 0d 0a 0d 0a 20 20 69 66 28 20 21 70 45 78 70 72 .... if( !pExpr
21de1 20 29 7b 0d 0a 20 20 20 20 2a 70 70 56 61 6c 20 ){.. *ppVal
21de2 3d 20 30 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e = 0;.. return
21de3 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d SQLITE_OK;.. }
21de4 0d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e .. op = pExpr->
21de5 6f 70 3b 0d 0a 0d 0a 20 20 2f 2a 20 6f 70 20 63 op;.... /* op c
21de6 61 6e 20 6f 6e 6c 79 20 62 65 20 54 4b 5f 52 45 an only be TK_RE
21de7 47 49 53 54 45 52 20 69 66 20 77 65 20 68 61 76 GISTER if we hav
21de8 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 e compiled with
21de9 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 SQLITE_ENABLE_ST
21dea 41 54 33 2e 0d 0a 20 20 2a 2a 20 54 68 65 20 69 AT3... ** The i
21deb 66 64 65 66 20 68 65 72 65 20 69 73 20 74 6f 20 fdef here is to
21dec 65 6e 61 62 6c 65 20 75 73 20 74 6f 20 61 63 68 enable us to ach
21ded 69 65 76 65 20 31 30 30 25 20 62 72 61 6e 63 68 ieve 100% branch
21dee 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 65 test coverage e
21def 76 65 6e 0d 0a 20 20 2a 2a 20 77 68 65 6e 20 53 ven.. ** when S
21df0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 QLITE_ENABLE_STA
21df1 54 33 20 69 73 20 6f 6d 69 74 74 65 64 2e 0d 0a T3 is omitted...
21df2 20 20 2a 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c */..#ifdef SQL
21df3 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 ITE_ENABLE_STAT3
21df4 0d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 .. if( op==TK_R
21df5 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 EGISTER ) op = p
21df6 45 78 70 72 2d 3e 6f 70 32 3b 0d 0a 23 65 6c 73 Expr->op2;..#els
21df7 65 0d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f e.. if( NEVER(o
21df8 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 p==TK_REGISTER)
21df9 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 ) op = pExpr->op
21dfa 32 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2;..#endif....
21dfb 2f 2a 20 48 61 6e 64 6c 65 20 6e 65 67 61 74 69 /* Handle negati
21dfc 76 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 ve integers in a
21dfd 20 73 69 6e 67 6c 65 20 73 74 65 70 2e 20 20 54 single step. T
21dfe 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 69 6e his is needed in
21dff 20 74 68 65 0d 0a 20 20 2a 2a 20 63 61 73 65 20 the.. ** case
21e00 77 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 when the value i
21e01 73 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 s -9223372036854
21e02 37 37 35 38 30 38 2e 0d 0a 20 20 2a 2f 0d 0a 20 775808... */..
21e03 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 55 4d 49 4e if( op==TK_UMIN
21e04 55 53 0d 0a 20 20 20 26 26 20 28 70 45 78 70 72 US.. && (pExpr
21e05 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f ->pLeft->op==TK_
21e06 49 4e 54 45 47 45 52 20 7c 7c 20 70 45 78 70 72 INTEGER || pExpr
21e07 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f ->pLeft->op==TK_
21e08 46 4c 4f 41 54 29 20 29 7b 0d 0a 20 20 20 20 70 FLOAT) ){.. p
21e09 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c Expr = pExpr->pL
21e0a 65 66 74 3b 0d 0a 20 20 20 20 6f 70 20 3d 20 70 eft;.. op = p
21e0b 45 78 70 72 2d 3e 6f 70 3b 0d 0a 20 20 20 20 6e Expr->op;.. n
21e0c 65 67 49 6e 74 20 3d 20 2d 31 3b 0d 0a 20 20 20 egInt = -1;..
21e0d 20 7a 4e 65 67 20 3d 20 22 2d 22 3b 0d 0a 20 20 zNeg = "-";..
21e0e 7d 0d 0a 0d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 }.... if( op==T
21e0f 4b 5f 53 54 52 49 4e 47 20 7c 7c 20 6f 70 3d 3d K_STRING || op==
21e10 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 6f 70 3d 3d TK_FLOAT || op==
21e11 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0d 0a 20 TK_INTEGER ){..
21e12 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 pVal = sqlite
21e13 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0d 0a 3ValueNew(db);..
21e14 20 20 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 if( pVal==0
21e15 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0d 0a ) goto no_mem;..
21e16 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 if( ExprHasP
21e17 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 roperty(pExpr, E
21e18 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0d 0a P_IntValue) ){..
21e19 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
21e1a 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 56 61 eMemSetInt64(pVa
21e1b 6c 2c 20 28 69 36 34 29 70 45 78 70 72 2d 3e 75 l, (i64)pExpr->u
21e1c 2e 69 56 61 6c 75 65 2a 6e 65 67 49 6e 74 29 3b .iValue*negInt);
21e1d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 .. }else{..
21e1e 20 20 20 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74 zVal = sqlit
21e1f 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 e3MPrintf(db, "%
21e20 73 25 73 22 2c 20 7a 4e 65 67 2c 20 70 45 78 70 s%s", zNeg, pExp
21e21 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0d 0a 20 r->u.zToken);..
21e22 20 20 20 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30 if( zVal==0
21e23 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0d ) goto no_mem;.
21e24 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 . sqlite3Va
21e25 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 lueSetStr(pVal,
21e26 2d 31 2c 20 7a 56 61 6c 2c 20 53 51 4c 49 54 45 -1, zVal, SQLITE
21e27 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 44 59 _UTF8, SQLITE_DY
21e28 4e 41 4d 49 43 29 3b 0d 0a 20 20 20 20 20 20 69 NAMIC);.. i
21e29 66 28 20 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 f( op==TK_FLOAT
21e2a 29 20 70 56 61 6c 2d 3e 74 79 70 65 20 3d 20 53 ) pVal->type = S
21e2b 51 4c 49 54 45 5f 46 4c 4f 41 54 3b 0d 0a 20 20 QLITE_FLOAT;..
21e2c 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 28 6f 70 }.. if( (op
21e2d 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 ==TK_INTEGER ||
21e2e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 26 op==TK_FLOAT ) &
21e2f 26 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 & affinity==SQLI
21e30 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0d 0a TE_AFF_NONE ){..
21e31 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c sqlite3Val
21e32 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 ueApplyAffinity(
21e33 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 pVal, SQLITE_AFF
21e34 5f 4e 55 4d 45 52 49 43 2c 20 53 51 4c 49 54 45 _NUMERIC, SQLITE
21e35 5f 55 54 46 38 29 3b 0d 0a 20 20 20 20 7d 65 6c _UTF8);.. }el
21e36 73 65 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 se{.. sqlit
21e37 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 e3ValueApplyAffi
21e38 6e 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e nity(pVal, affin
21e39 69 74 79 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 ity, SQLITE_UTF8
21e3a 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 );.. }.. i
21e3b 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 f( pVal->flags &
21e3c 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 (MEM_Int|MEM_Re
21e3d 61 6c 29 20 29 20 70 56 61 6c 2d 3e 66 6c 61 67 al) ) pVal->flag
21e3e 73 20 26 3d 20 7e 4d 45 4d 5f 53 74 72 3b 0d 0a s &= ~MEM_Str;..
21e3f 20 20 20 20 69 66 28 20 65 6e 63 21 3d 53 51 4c if( enc!=SQL
21e40 49 54 45 5f 55 54 46 38 20 29 7b 0d 0a 20 20 20 ITE_UTF8 ){..
21e41 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 sqlite3VdbeCh
21e42 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 56 61 angeEncoding(pVa
21e43 6c 2c 20 65 6e 63 29 3b 0d 0a 20 20 20 20 7d 0d l, enc);.. }.
21e44 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d . }else if( op=
21e45 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 20 7b 0d 0a =TK_UMINUS ) {..
21e46 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e /* This bran
21e47 63 68 20 68 61 70 70 65 6e 73 20 66 6f 72 20 6d ch happens for m
21e48 75 6c 74 69 70 6c 65 20 6e 65 67 61 74 69 76 65 ultiple negative
21e49 20 73 69 67 6e 73 2e 20 20 45 78 3a 20 2d 28 2d signs. Ex: -(-
21e4a 35 29 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 53 5) */.. if( S
21e4b 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 QLITE_OK==sqlite
21e4c 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 3ValueFromExpr(d
21e4d 62 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 65 b,pExpr->pLeft,e
21e4e 6e 63 2c 61 66 66 69 6e 69 74 79 2c 26 70 56 61 nc,affinity,&pVa
21e4f 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c l) ){.. sql
21e50 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 ite3VdbeMemNumer
21e51 69 66 79 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20 ify(pVal);..
21e52 20 20 69 66 28 20 70 56 61 6c 2d 3e 75 2e 69 3d if( pVal->u.i=
21e53 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 =SMALLEST_INT64
21e54 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 56 61 6c ){.. pVal
21e55 2d 3e 66 6c 61 67 73 20 26 3d 20 4d 45 4d 5f 49 ->flags &= MEM_I
21e56 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 70 56 61 nt;.. pVa
21e57 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f l->flags |= MEM_
21e58 52 65 61 6c 3b 0d 0a 20 20 20 20 20 20 20 20 70 Real;.. p
21e59 56 61 6c 2d 3e 72 20 3d 20 28 64 6f 75 62 6c 65 Val->r = (double
21e5a 29 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0d )LARGEST_INT64;.
21e5b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 . }else{..
21e5c 20 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 69 pVal->u.i
21e5d 20 3d 20 2d 70 56 61 6c 2d 3e 75 2e 69 3b 0d 0a = -pVal->u.i;..
21e5e 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 }.. p
21e5f 56 61 6c 2d 3e 72 20 3d 20 2d 70 56 61 6c 2d 3e Val->r = -pVal->
21e60 72 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 r;.. sqlite
21e61 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 3ValueApplyAffin
21e62 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69 ity(pVal, affini
21e63 74 79 2c 20 65 6e 63 29 3b 0d 0a 20 20 20 20 7d ty, enc);.. }
21e64 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 .. }else if( op
21e65 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0d 0a 20 20 ==TK_NULL ){..
21e66 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 pVal = sqlite3
21e67 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0d 0a 20 ValueNew(db);..
21e68 20 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 if( pVal==0 )
21e69 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0d 0a 20 goto no_mem;..
21e6a 20 7d 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 }..#ifndef SQLI
21e6b 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 TE_OMIT_BLOB_LIT
21e6c 45 52 41 4c 0d 0a 20 20 65 6c 73 65 20 69 66 28 ERAL.. else if(
21e6d 20 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 7b 0d op==TK_BLOB ){.
21e6e 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 0d 0a . int nVal;..
21e6f 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 assert( pExp
21e70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d r->u.zToken[0]==
21e71 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 'x' || pExpr->u.
21e72 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 zToken[0]=='X' )
21e73 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ;.. assert( p
21e74 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 Expr->u.zToken[1
21e75 5d 3d 3d 27 5c 27 27 20 29 3b 0d 0a 20 20 20 20 ]=='\'' );..
21e76 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 pVal = sqlite3Va
21e77 6c 75 65 4e 65 77 28 64 62 29 3b 0d 0a 20 20 20 lueNew(db);..
21e78 20 69 66 28 20 21 70 56 61 6c 20 29 20 67 6f 74 if( !pVal ) got
21e79 6f 20 6e 6f 5f 6d 65 6d 3b 0d 0a 20 20 20 20 7a o no_mem;.. z
21e7a 56 61 6c 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e Val = &pExpr->u.
21e7b 7a 54 6f 6b 65 6e 5b 32 5d 3b 0d 0a 20 20 20 20 zToken[2];..
21e7c 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 nVal = sqlite3St
21e7d 72 6c 65 6e 33 30 28 7a 56 61 6c 29 2d 31 3b 0d rlen30(zVal)-1;.
21e7e 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 56 61 . assert( zVa
21e7f 6c 5b 6e 56 61 6c 5d 3d 3d 27 5c 27 27 20 29 3b l[nVal]=='\''